From 5cf8d9c6ba270302adeab3e99bff7b369b8e7386 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Wed, 18 Jan 2023 14:26:56 +0100 Subject: [PATCH 001/388] wip: prototyping a spec for the bank --- examples/cosmos-bank/bank.qnt | 345 ++++++++++++++++++++++++++++++++++ 1 file changed, 345 insertions(+) create mode 100644 examples/cosmos-bank/bank.qnt diff --git a/examples/cosmos-bank/bank.qnt b/examples/cosmos-bank/bank.qnt new file mode 100644 index 000000000..11f900ad8 --- /dev/null +++ b/examples/cosmos-bank/bank.qnt @@ -0,0 +1,345 @@ +/** + * This is a work-in-progress protocol specification of the bank module + * that includes: + * + * 1. External behavior (via messages), and + * 2. Internal behavior (via Keeper calls). + * + * The main goal of this specification is to highlight the essential behavior + * of the bank module, while keeping the specification faithful to the + * implementation. Since it would not make a lot of sense to duplicate + * the implementation in the specification language, we naturally omit + * low-level implementation details: + * + * - All errors are replaced with a Boolean value, e.g., `false` or `true`. + * The actual error code is less important for understanding the protocol. + * + * - Low-level panics are ommitted, unless they are related to the logic + * of the bank module. In the latter case, they are replaced with Boolean + * error flags. + * + * WARNING: This spec is work in progress. It is by no means complete or correct. + * + * Igor Konnov, Informal Systems, 2023 + */ +module bank { + // TODO: these type definitions should be defined in a general Cosmos module + type Addr = str + // TODO: specify 64-bit and 256-bit integers later, in separate modules + type Int64 = int + type Int256 = int + /// the maximum amount value in the SDK (note 256 instead of 255!) + val MAX_INT256 = 2^256 - 1 + // the range of 256-bit integers in the SDK + pure def isInt256(i: int): bool = -2^256 <= i and i < 2^256 + // a coin with denominations attached + type Coin = { denom: str, amount: Int256 } + // Cosmos SDK coins are bags that are implemented via sorted arrays. + // We are simply using maps in Quint. + type Coins = str -> Int256 + // Account balances + type Balance = { address: Addr, coins: Coins } + + /// Parameters of the bank module + type Params = { + // whether coin send is enabled for specific denominations + sendEnabled: Set[{ denom: str, enabled: bool }], + // whether coin send is enabled by default + defaultSendEnabled: bool, + } + + // TODO: introduce constants, when #528 is done: + // https://github.com/informalsystems/quint/issues/528 + // all possible addresses + //const ADDR: Set[Addr] + // blocked addresses + //const BLOCKED: Set[Addr] + + /// All possible addresses. + // Fixed to a constant value for now, until #528 is closed. + val ADDR = Set("alice", "bob", "charlie", "eve", "null") + /// Blocked addresses, set directly in code. + // Fixed to a constant value for now, until #528 is closed. + val BLOCKED = Set("eve") + + // The part of the key-value store read by the bank or wrote by the bank. + // In contrast to the Golang version, we encapsulate the view of the context + // available to the bank in this special record. + type BankCtx = { + // block time (needed by vesting accounts) + blockTime: Int64, + // accessed via AccountKeeper + accounts: Set[Addr], + // the balances are the essential part of the bank module + balances: Addr -> Coins, + // module parameters + params: Params, + } + + // an output produced by stateful computations + type BankOut = { + isError: bool, + ctx: BankCtx, + } + + // TODO: introduce a separate module, when the modules are fixed: + // https://github.com/informalsystems/quint/issues/523 + // we isolate the keeper interface in a separate namespace + //module keeper { + + // module ViewKeeper { + /// `GetAllBalances` returns all the account balances for the given account address. + /// SDK: `func (k BaseViewKeeper) GetAllBalances(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins` + pure def getAllBalances(ctx: BankCtx, addr: Addr): Coins = { + if (ctx.balances.keys().contains(addr)) { + ctx.balances.get(addr) + } else { + Map() + } + } + + /// `ValidateBalance` should only be called upon genesis state. + /// SDK `ValidateBalance(ctx sdk.Context, addr sdk.AccAddress) error` + pure def validateBalance(ctx: BankCtx, addr: Addr): bool = and { + ctx.accounts.contains(addr), + val coins = getAllBalances(ctx, addr) + // SKIPPED: Coins.IsValid does more tests, including the denominations format + coins.keys().forall(denom => coins.get(denom) > 0), + // SKIPPED: logic of vesting accounts that are initialized in genesis + } + + /// `GetBalance` returns the balance of a specific denomination + /// for a given account by address. + /// SDK: `func (k BaseViewKeeper) GetBalance(ctx sdk.Context, addr sdk.AccAddress, denom string) sdk.Coin` + pure def getBalance(ctx: BankCtx, addr: Addr, denom: str): Int256 = { + if (ctx.balances.keys().contains(addr) + and ctx.balances.get(addr).keys().contains(denom)) { + ctx.balances.get(addr).get(denom) + } else { + 0 + } + } + + /// `HasBalance` returns whether or not an account has at least amt balance. + /// SDK: `func (k BaseViewKeeper) HasBalance(ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coin) bool` + pure def hasBalance(ctx: BankCtx, addr: Addr, coin: Coin): bool = { + getBalance(ctx, addr, coin.denom) >= coin.amount + } + + /// `GetAccountsBalances` returns all the accounts balances from the store. + /// SDK: `func (k BaseViewKeeper) GetAccountsBalances(ctx sdk.Context) []types.Balance` + pure def getAccountsBalances(ctx: BankCtx): Set[Balance] = { + ctx.balances.keys().map(a => { address: a, coins: ctx.balances.get(a) }) + } + + // SKIPPED: not dealing with vesting accounts + // LockedCoins(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins + + // SKIPPED: not dealing with vesting accounts + // SpendableCoins(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins + + // SKIPPED: It is simply another version of `getAllBalances` that uses an iterator. + // SDK: func (k BaseViewKeeper) + // IterateAccountBalances(ctx sdk.Context, addr sdk.AccAddress, cb func(sdk.Coin) bool) + + // SKIPPED: It is simply another version of `getAccountBalances` that uses an iterator. + // IterateAllBalances iterates over all the balances of all accounts and + // denominations that are provided to a callback. If true is returned from the + // callback, iteration is halted. + // } // ViewKeeper + + // module SendKeeper { + /// `SendCoins` transfers amt coins from a sending account to a receiving account. + /// An error is returned upon failure. + /// + /// In our specification, + /// `sendCoins` does not update the context in place, but it returns a new context. + /// The value `false` is returned in case of error or panic. + /// SDK `SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error` + pure def sendCoins(ctx: BankCtx, + fromAddr: Addr, toAddr: Addr, amt: Coins): BankOut = { + // NOTE on SDK: if Coins are constructed with NewCoins, they must be positive. + // However, if they are constructed some other way, there is no precondition. + // SKIPPED: checking LockedCoins that deal with vested coins. + // Safely subtract the coins from `fromAddr` and add them to `toAddr`. + val fromCoins = getAllBalances(ctx, fromAddr) + if (amt.keys().exists(d => + not(d.in(fromCoins.keys())) or fromCoins.get(d) < amt.get(d))) { + // some denominations do not exist on `fromAddr`, or there is not enough funds + { isError: true, ctx: ctx } + } else { + // x/bank invariants prohibit persistence of zero balances + // clean zero balances + def getOr0(coins: Coins, d: str): int = if (d.in(coins.keys())) coins.get(d) else 0 + val positiveDenoms = fromCoins.keys().filter(d => fromCoins.get(d) > getOr0(amt, d)) + val subCoins = positiveDenoms.mapBy(d => fromCoins.get(d) - getOr0(amt, d)) + // add coins to toAddr: the tricky part is that the denominations may differ + val toCoins = getAllBalances(ctx, toAddr) + // extend the toCoins and amt with zeroes over the joint denominations + val jointDenoms = toCoins.keys().union(amt.keys()) + // since toCoins and amt held positive values, their sums must be positive too + val addCoins = jointDenoms.mapBy(d => getOr0(toCoins, d) + getOr0(amt, d)) + if (addCoins.keys().exists(d => addCoins.get(d) > MAX_INT256)) { + // overflow, SDK panics + { isError: true, ctx: ctx } + } else { + // add `toAddr` to the accounts, if it did not exist + val newAccounts = ctx.accounts.union(Set(toAddr)) + val newBalances = + if (fromAddr == toAddr) { + ctx.balances + } else { + // Update the balance of `fromAddr` with subCoins. + val newBalancesSub = ctx.balances.set(fromAddr, subCoins) + // Since `toAddr` may be a new account, extend the map, if needed + newBalancesSub.put(toAddr, addCoins) + } + { + isError: false, + ctx: ctx.with("balances", newBalances).with("accounts", newAccounts), + } + } + } + } + + /// `GetParams` returns the total set of bank parameters. + /// SDK: `GetParams(ctx sdk.Context) types.Params` + pure def getParams(ctx: BankCtx): Params = ctx.params + + /// `SetParams` sets the total set of bank parameters. + /// In our specification, + /// `setParams` does not update the context in place, but returns a new context. + /// SDK: SetParams(ctx sdk.Context, params types.Params) + pure def setParams(ctx: BankCtx, params: Params): BankCtx = { + ctx.with("params", params) + } + + /// IsSendEnabledCoin returns the current SendEnabled status of the provided coin's denom + /// SDK: `IsSendEnabledCoin(ctx sdk.Context, coin sdk.Coin) bool` + pure def isSendEnabledCoin(ctx: BankCtx, coin: Coin): bool = { + ctx.params.sendEnabled.exists(p => p.enabled and coin.denom == p.denom) + } + + /// `IsSendEnabledCoins` checks the coins provide and returns an `ErrSendDisabled` if + /// any of the coins are not configured for sending. Returns `nil` if sending is enabled + /// for all provided coin. + /// SDK: `IsSendEnabledCoins(ctx sdk.Context, coins ...sdk.Coin) error` + pure def isSendEnabledCoins(ctx: BankCtx, coins: Set[Coin]): bool = { + coins.forall(c => isSendEnabledCoin(ctx, c)) + } + + /// `BlockedAddr` checks if a given address is restricted from receiving funds. + /// SDK: `BlockedAddr(addr sdk.AccAddress) bool` + pure def blockedAddr(addr: Addr): bool = { + addr.in(BLOCKED) + } + + // } // SendKeeper + + // module BankKeeper { + // } // BankKeeper + + // TODO: types.QueryServer + + // THE STATE MACHINE + // TODO: we should introduce the state machine in a separate module, maybe in a separate file + // module machine { + // An interesting point here. Although we specify the state machine + // of the bank module here, we could enrich its behavior by having + // more state variables. The minimal required state is encapsulated in BankCtx. + // + // managed by the account keeper + var accounts: Set[Addr] + // managed by the bank keeper + var balances: Addr -> Coins + + // A helper function. It indicates the user's intent to write a precondition. + def when(cond) = cond + + // TODO: introduce constants for balances, accounts, and params + // when #528 is done: + // https://github.com/informalsystems/quint/issues/528 + val PARAMS = { + sendEnabled: Set( + { denom: "atom", enabled: true }, + { denom: "proton", enabled: true } + ), + defaultSendEnabled: false + } + + // when #528 is done, this will be gone + val DENOMS = Set("atom", "proton", "photon") + + // Until #528 is closed, this initializer is a mock. + action init = { + val accs = ADDR.exclude(Set("null")) + val bals = Map( + "alice" -> Map("atom" -> 30, "proton" -> 20, "photon" -> 2000), + "bob" -> Map("atom" -> 1) + ) + // validate the balances at the genesis time + val bankIn = { blockTime: 0, accounts: accs, balances: bals, params: PARAMS } + all { + when(accs.forall(a => validateBalance(bankIn, a))), + // set the initial state + accounts' = accs, + balances' = bals, + } + } + + action send(fromAddr: Addr, toAddr: Addr, coins: Coins): bool = { + val oldCtx = { + blockTime: 0, accounts: accounts, balances: balances, params: PARAMS + } + // send the coins via the keeper + // TODO: add the validation that is done by the message handler + val result = sendCoins(oldCtx, fromAddr, toAddr, coins) + all { + when(not(result.isError)), + balances' = result.ctx.balances, + accounts' = result.ctx.accounts + } + } + + action step = { + // at the moment, we execute only one action, so no "any" is used + // TODO: make a call for more than one denomination + nondet denom = oneOf(DENOMS) + nondet amount = oneOf((-(2^256)).to(2^256 - 1)) + nondet fromAddr = oneOf(ADDR) + nondet toAddr = oneOf(ADDR) + send(fromAddr, toAddr, Map(denom -> amount)) + } + // } + + // UNIT TESTS + // TODO: the tests should be done in a separate module, maybe in a separate file + + // all addresses but "null" have an associated account in the key/value store + // TODO: this definition is used by tests and it should be used there + val ACCOUNTS = ADDR.exclude(Set("null")) + // a simple context for testing + val CONTEXT = { + blockTime: 10, + accounts: ACCOUNTS, + balances: Map( + "alice" -> Map("atom" -> 1, "nonatom" -> 2), + "bob" -> Map("atom" -> 0) + ), + params: { + sendEnabled: Set( + { denom: "atom", enabled: true }, + { denom: "proton", enabled: true } + ), + defaultSendEnabled: false + } + } + + // test that validateBalance is working as expected + run validateBalanceTest = { + assert(validateBalance(CONTEXT, "alice")) + .then(assert(not(validateBalance(CONTEXT, "null")))) + } + + // TODO: SDK does not contain test for GetBalance +} \ No newline at end of file From d096ce9e8c0fe35dfe4aac95fc469e0711aaccec Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Wed, 18 Jan 2023 22:57:28 +0100 Subject: [PATCH 002/388] add validation and require --- examples/cosmos-bank/bank.qnt | 37 ++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/examples/cosmos-bank/bank.qnt b/examples/cosmos-bank/bank.qnt index 11f900ad8..0fc8aae40 100644 --- a/examples/cosmos-bank/bank.qnt +++ b/examples/cosmos-bank/bank.qnt @@ -224,8 +224,13 @@ module bank { /// any of the coins are not configured for sending. Returns `nil` if sending is enabled /// for all provided coin. /// SDK: `IsSendEnabledCoins(ctx sdk.Context, coins ...sdk.Coin) error` - pure def isSendEnabledCoins(ctx: BankCtx, coins: Set[Coin]): bool = { - coins.forall(c => isSendEnabledCoin(ctx, c)) + pure def isSendEnabledCoins(ctx: BankCtx, coins: Coins): str = { + val asRecords = coins.keys().map(d => { denom: d, amount: coins.get(d) }) + if (asRecords.forall(c => isSendEnabledCoin(ctx, c))) { + "" + } else { + "ErrSendDisabled" + } } /// `BlockedAddr` checks if a given address is restricted from receiving funds. @@ -253,8 +258,10 @@ module bank { // managed by the bank keeper var balances: Addr -> Coins - // A helper function. It indicates the user's intent to write a precondition. - def when(cond) = cond + // A helper function. + // It indicates the user's intent to write a precondition, + // which should hold true, whenever an action is called. + def require(cond) = cond // TODO: introduce constants for balances, accounts, and params // when #528 is done: @@ -280,7 +287,7 @@ module bank { // validate the balances at the genesis time val bankIn = { blockTime: 0, accounts: accs, balances: bals, params: PARAMS } all { - when(accs.forall(a => validateBalance(bankIn, a))), + require(accs.forall(a => validateBalance(bankIn, a))), // set the initial state accounts' = accs, balances' = bals, @@ -291,13 +298,21 @@ module bank { val oldCtx = { blockTime: 0, accounts: accounts, balances: balances, params: PARAMS } - // send the coins via the keeper - // TODO: add the validation that is done by the message handler - val result = sendCoins(oldCtx, fromAddr, toAddr, coins) + // Send the coins via the keeper. + // The message handler does validation and fails a transaction, + // if it does not pass validation. For the moment, we simply require + // the parameters to pass validation, for the action to succeed. + // In the future, we may want to save failed transactions. all { - when(not(result.isError)), - balances' = result.ctx.balances, - accounts' = result.ctx.accounts + require(coins.keys().forall(d => coins.get(d) > 0)), + require(isSendEnabledCoins(oldCtx, coins) == ""), + require(blockedAddr(toAddr)), + val result = sendCoins(oldCtx, fromAddr, toAddr, coins) + all { + require(not(result.isError)), + balances' = result.ctx.balances, + accounts' = result.ctx.accounts + } } } From 326b5a49073aa7c2d7be75c5f979d531d7a1acc9 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Thu, 19 Jan 2023 09:05:28 +0100 Subject: [PATCH 003/388] add a few comments --- examples/cosmos-bank/bank.qnt | 63 ++++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 27 deletions(-) diff --git a/examples/cosmos-bank/bank.qnt b/examples/cosmos-bank/bank.qnt index 0fc8aae40..dad1c4178 100644 --- a/examples/cosmos-bank/bank.qnt +++ b/examples/cosmos-bank/bank.qnt @@ -24,19 +24,22 @@ */ module bank { // TODO: these type definitions should be defined in a general Cosmos module - type Addr = str - // TODO: specify 64-bit and 256-bit integers later, in separate modules - type Int64 = int - type Int256 = int - /// the maximum amount value in the SDK (note 256 instead of 255!) - val MAX_INT256 = 2^256 - 1 - // the range of 256-bit integers in the SDK - pure def isInt256(i: int): bool = -2^256 <= i and i < 2^256 - // a coin with denominations attached - type Coin = { denom: str, amount: Int256 } - // Cosmos SDK coins are bags that are implemented via sorted arrays. - // We are simply using maps in Quint. - type Coins = str -> Int256 + // module cosmobits { + type Addr = str + // TODO: specify 64-bit and 256-bit integers later, in separate modules + type Int64 = int + type Int256 = int + /// the maximum amount value in the SDK (note 256 instead of 255!) + val MAX_INT256 = 2^256 - 1 + // the range of 256-bit integers in the SDK + pure def isInt256(i: int): bool = -2^256 <= i and i < 2^256 + // a coin with denominations attached + type Coin = { denom: str, amount: Int256 } + // Cosmos SDK coins are bags that are implemented via sorted arrays. + // We are simply using maps in Quint. + type Coins = str -> Int256 + // } + // Account balances type Balance = { address: Addr, coins: Coins } @@ -62,9 +65,9 @@ module bank { // Fixed to a constant value for now, until #528 is closed. val BLOCKED = Set("eve") - // The part of the key-value store read by the bank or wrote by the bank. - // In contrast to the Golang version, we encapsulate the view of the context - // available to the bank in this special record. + // The part of the key-value store read by the bank or written by the bank. + // In contrast to the Cosmos SDK in Go, we encapsulate the view of the + // context available to the bank in this special record. type BankCtx = { // block time (needed by vesting accounts) blockTime: Int64, @@ -76,7 +79,10 @@ module bank { params: Params, } - // an output produced by stateful computations + // An output produced by stateful computations. + // This looks very much like Either[L, R] or Result[T, E] in Rust, + // which we should use in the future. See: + // https://github.com/informalsystems/quint/issues/539 type BankOut = { isError: bool, ctx: BankCtx, @@ -84,8 +90,6 @@ module bank { // TODO: introduce a separate module, when the modules are fixed: // https://github.com/informalsystems/quint/issues/523 - // we isolate the keeper interface in a separate namespace - //module keeper { // module ViewKeeper { /// `GetAllBalances` returns all the account balances for the given account address. @@ -217,16 +221,20 @@ module bank { /// IsSendEnabledCoin returns the current SendEnabled status of the provided coin's denom /// SDK: `IsSendEnabledCoin(ctx sdk.Context, coin sdk.Coin) bool` pure def isSendEnabledCoin(ctx: BankCtx, coin: Coin): bool = { - ctx.params.sendEnabled.exists(p => p.enabled and coin.denom == p.denom) + val found = ctx.params.sendEnabled.filter(p => coin.denom == p.denom) + if (found != Set()) { + found.exists(p => p.enabled) + } else { + ctx.params.defaultSendEnabled + } } /// `IsSendEnabledCoins` checks the coins provide and returns an `ErrSendDisabled` if /// any of the coins are not configured for sending. Returns `nil` if sending is enabled /// for all provided coin. /// SDK: `IsSendEnabledCoins(ctx sdk.Context, coins ...sdk.Coin) error` - pure def isSendEnabledCoins(ctx: BankCtx, coins: Coins): str = { - val asRecords = coins.keys().map(d => { denom: d, amount: coins.get(d) }) - if (asRecords.forall(c => isSendEnabledCoin(ctx, c))) { + pure def isSendEnabledCoins(ctx: BankCtx, coins: Set[Coin]): str = { + if (coins.forall(c => isSendEnabledCoin(ctx, c))) { "" } else { "ErrSendDisabled" @@ -305,13 +313,14 @@ module bank { // In the future, we may want to save failed transactions. all { require(coins.keys().forall(d => coins.get(d) > 0)), - require(isSendEnabledCoins(oldCtx, coins) == ""), - require(blockedAddr(toAddr)), + require(isSendEnabledCoins(oldCtx, + coins.keys().map(d => { denom: d, amount: coins.get(d) })) == ""), + require(not(blockedAddr(toAddr))), val result = sendCoins(oldCtx, fromAddr, toAddr, coins) all { require(not(result.isError)), balances' = result.ctx.balances, - accounts' = result.ctx.accounts + accounts' = result.ctx.accounts, } } } @@ -357,4 +366,4 @@ module bank { } // TODO: SDK does not contain test for GetBalance -} \ No newline at end of file +} From 4709725f374dc41b89d27a1dd79bbaabd0d8d148 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Thu, 19 Jan 2023 12:45:01 +0100 Subject: [PATCH 004/388] add tests --- examples/cosmos-bank/bank.qnt | 111 ++++++++++++++++++++++++++++++++-- 1 file changed, 105 insertions(+), 6 deletions(-) diff --git a/examples/cosmos-bank/bank.qnt b/examples/cosmos-bank/bank.qnt index dad1c4178..bb4e23d7f 100644 --- a/examples/cosmos-bank/bank.qnt +++ b/examples/cosmos-bank/bank.qnt @@ -282,10 +282,14 @@ module bank { defaultSendEnabled: false } - // when #528 is done, this will be gone + // When #528 is done, this will be gone. + // Tests will instantiate module constants with fixed values. val DENOMS = Set("atom", "proton", "photon") + // Initialize the state machine // Until #528 is closed, this initializer is a mock. + // When #528 is closed, we will use constants to initializes the genesis, + // and specific tests will initialize these constants to the values they need. action init = { val accs = ADDR.exclude(Set("null")) val bals = Map( @@ -296,12 +300,14 @@ module bank { val bankIn = { blockTime: 0, accounts: accs, balances: bals, params: PARAMS } all { require(accs.forall(a => validateBalance(bankIn, a))), - // set the initial state + // initialize the state accounts' = accs, balances' = bals, } } + // handler of MsgSend of x/bank + // https://docs.cosmos.network/v0.45/modules/bank/03_messages.html action send(fromAddr: Addr, toAddr: Addr, coins: Coins): bool = { val oldCtx = { blockTime: 0, accounts: accounts, balances: balances, params: PARAMS @@ -327,8 +333,11 @@ module bank { action step = { // at the moment, we execute only one action, so no "any" is used - // TODO: make a call for more than one denomination + // TODO: make a case for more than one denomination nondet denom = oneOf(DENOMS) + // Note that the probability of randomly picking an amount that + // will not fail in `send` is quite small. + // Hence, we need more targeted tests (see below). nondet amount = oneOf((-(2^256)).to(2^256 - 1)) nondet fromAddr = oneOf(ADDR) nondet toAddr = oneOf(ADDR) @@ -347,9 +356,9 @@ module bank { blockTime: 10, accounts: ACCOUNTS, balances: Map( - "alice" -> Map("atom" -> 1, "nonatom" -> 2), + "alice" -> Map("atom" -> 17, "nonatom" -> 2), "bob" -> Map("atom" -> 0) - ), + ), params: { sendEnabled: Set( { denom: "atom", enabled: true }, @@ -365,5 +374,95 @@ module bank { .then(assert(not(validateBalance(CONTEXT, "null")))) } - // TODO: SDK does not contain test for GetBalance + // An auxilliary action that keeps all variables unchanged. + // In the future, such change would be computed automatically: + // https://github.com/informalsystems/quint/discussions/70 + action keepVars = all { + balances' = balances, + accounts' = accounts, + } + + // test that a simple `send` goes through + run sendOkTest = { + init + .then(send("alice", "bob", Map("atom" -> 3))) + .then(all { + assert(balances.get("alice").get("atom") == 27), + assert(balances.get("bob").get("atom") == 4), + keepVars, + }) + } + + // test that `send` fails when sending a token with send disabled + run sendNotEnabledErrTest = { + init + .then(send("alice", "bob", Map("photon" -> 3))) + //.fail() + // TODO: if `send` above passes, the run should fail. + // If `send` fails, the test should pass. + // We need an operator that flips the expected behavior. + } + + // test that multiple denominations can be sent at once + run sendTwoOkTest = { + init + .then(send("alice", "bob", Map("atom" -> 3, "proton" -> 11))) + .then(all { + assert(balances.get("alice").get("atom") == 27), + assert(balances.get("alice").get("proton") == 9), + assert(balances.get("bob").get("atom") == 4), + assert(balances.get("bob").get("proton") == 11), + keepVars, + }) + } + + // a test similar to property-based testing that randomly probes send + // custom initializer that picks some balances for several denominations + action initBoxed = all { + nondet amts1 = Set("atom").setOfMaps(to(0, 15)).oneOf() + nondet amts2 = Set("proton").setOfMaps(to(0, 15)).oneOf() + nondet amts3 = Set("atom", "proton").setOfMaps(to(0, 15)).oneOf() + nondet amts4 = Set("atom", "photon").setOfMaps(to(0, 15)).oneOf() + nondet bals = ADDR.setOfMaps(Set(amts1, amts2, amts3, amts4)).oneOf() + all { + balances' = bals, + accounts' = bals.keys().exclude(Set("null")), + } + } + // custom send that picks some randomly picks some tokens to transfer + action sendBoxed = { + // pick some denominations + nondet denoms = DENOMS.powerset().oneOf() + // Since denoms may be empty, oneOf() may complain. Redefine the empty set. + nondet someDenoms = if (denoms == Set()) Set("atom") else denoms + // pick some amounts + nondet coins = someDenoms.setOfMaps(to(-5, 5)).oneOf() + // pick the addresses + nondet addrFrom = ADDR.oneOf() + nondet addrTo = ADDR.oneOf() + send(addrFrom, addrTo, coins) + } + + // this is one of the basic invariants of the bank module + val nonNegativeSupplyInv = + balances.keys().forall(a => + val coins = balances.get(a) + coins.keys().forall(d => coins.get(d) >= 0) + ) + + // a single point random test + run sendRandomTest = { + initBoxed + .then(sendBoxed) + .then(all { + assert(nonNegativeSupplyInv), + keepVars + }) + } + + // If you'd like to run this test for multiple data points, + // you can do it in REPL as follows: + // .load bank.qnt + // import bank.* + // _test(10000, 3, "initBoxed", "sendBoxed", "nonNegativeSupplyInv") } From 1a06f51261f6a19ac9ab02cc1fd6a9a3527aa566 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Fri, 20 Jan 2023 09:58:45 +0100 Subject: [PATCH 005/388] use fail --- examples/cosmos-bank/bank.qnt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/examples/cosmos-bank/bank.qnt b/examples/cosmos-bank/bank.qnt index bb4e23d7f..08d450d6d 100644 --- a/examples/cosmos-bank/bank.qnt +++ b/examples/cosmos-bank/bank.qnt @@ -397,10 +397,7 @@ module bank { run sendNotEnabledErrTest = { init .then(send("alice", "bob", Map("photon" -> 3))) - //.fail() - // TODO: if `send` above passes, the run should fail. - // If `send` fails, the test should pass. - // We need an operator that flips the expected behavior. + .fail() } // test that multiple denominations can be sent at once From ef15729d27ec356bbae11a069ceac84525f85dce Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Mon, 23 Jan 2023 20:57:42 +0100 Subject: [PATCH 006/388] prepare a minimal version of the bank demo --- examples/cosmos-bank/bank-mini.qnt | 352 +++++++++++++++++++++++++++++ 1 file changed, 352 insertions(+) create mode 100644 examples/cosmos-bank/bank-mini.qnt diff --git a/examples/cosmos-bank/bank-mini.qnt b/examples/cosmos-bank/bank-mini.qnt new file mode 100644 index 000000000..a1af89a63 --- /dev/null +++ b/examples/cosmos-bank/bank-mini.qnt @@ -0,0 +1,352 @@ +/** + * This is a minimized protocol specification of the bank module + * that is tuned for an efficient presentation. For a more detailed version, + * see bank.qnt. + * + * Igor Konnov, Informal Systems, 2023 + */ +module bank { + // namespace bits { + type Addr = str + type Int64 = int + type Int256 = int + /// the maximum amount value in the SDK (note 256 instead of 255!) + val MAX_INT256 = 2^256 - 1 + // the range of 256-bit integers in the SDK + pure def isInt256(i: int): bool = -2^256 <= i and i < 2^256 + // a coin with denominations attached + type Coin = { denom: str, amount: Int256 } + // Cosmos SDK coins are sorted arrays. We simply use Quint maps. + type Coins = str -> Int256 + // } + + // Account balances + type Balance = { address: Addr, coins: Coins } + + /// Parameters of the bank module + type Params = { + // whether coin send is enabled for specific denominations + sendEnabled: Set[{ denom: str, enabled: bool }], + // whether coin send is enabled by default + defaultSendEnabled: bool, + } + + /// All possible addresses, a small set for testing. + /// In Q1, it will be a parameter! + val ADDR = Set("alice", "bob", "charlie", "eve", "null") + /// Blocked addresses, a small set for testing (a parameter in a full spec). + /// In Q1, it will be a parameter! + val BLOCKED = Set("eve") + + // The part of the key-value store read by the bank or written by the bank. + // In contrast to the Cosmos SDK in Go, we encapsulate the view of the + // context available to the bank in this special record. + type BankCtx = { + // accessed via AccountKeeper + accounts: Set[Addr], + // the balances are the essential part of the bank module + balances: Addr -> Coins, + // module parameters + params: Params, + } + + // An output produced by Keeper computations. + type BankOut = { + isError: bool, + ctx: BankCtx, + } + + // ViewKeeper { + /// `GetAllBalances` returns all the account balances for the given account address. + /// SDK: `func (k BaseViewKeeper) GetAllBalances(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins` + pure def getAllBalances(ctx: BankCtx, addr: Addr): Coins = { + if (ctx.balances.keys().contains(addr)) { + ctx.balances.get(addr) + } else { + Map() + } + } + + /// `ValidateBalance` should only be called upon genesis state. + /// SDK `ValidateBalance(ctx sdk.Context, addr sdk.AccAddress) error` + pure def validateBalance(ctx: BankCtx, addr: Addr): bool = and { + ctx.accounts.contains(addr), + val coins = getAllBalances(ctx, addr) + coins.keys().forall(denom => coins.get(denom) > 0), + // SKIPPED: logic of vesting accounts that are initialized in genesis + } + // } // ViewKeeper + + // SendKeeper { + /// `SendCoins` transfers amt coins from a sending account to a receiving account. + /// An error is returned upon failure. + /// + /// In our specification, `sendCoins` does not update the context in place, + /// but it returns a new context. + /// `isError == true` on error or panic. + /// SDK `SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error` + pure def sendCoins(ctx: BankCtx, + fromAddr: Addr, toAddr: Addr, amt: Coins): BankOut = { + // NOTE on SDK: if Coins are constructed with NewCoins, they must be positive. + // However, if they are constructed another way, there is no precondition. + // Safely subtract the coins from `fromAddr` and add them to `toAddr`. + val fromCoins = getAllBalances(ctx, fromAddr) + if (amt.keys().exists(d => + not(d.in(fromCoins.keys())) or fromCoins.get(d) < amt.get(d))) { + // some denominations do not exist on `fromAddr`, or there is not enough funds + { isError: true, ctx: ctx } + } else { + // x/bank invariants prohibit persistence of zero balances + // clean zero balances + pure def getOr0(coins: Coins, d: str): int = { + if (d.in(coins.keys())) coins.get(d) else 0 + } + val positiveDenoms = fromCoins.keys().filter(d => fromCoins.get(d) > getOr0(amt, d)) + val subCoins = positiveDenoms.mapBy(d => fromCoins.get(d) - getOr0(amt, d)) + // add coins to toAddr: the tricky part is that the denominations may differ + val toCoins = getAllBalances(ctx, toAddr) + // extend the toCoins and amt with zeroes over the joint denominations + val jointDenoms = toCoins.keys().union(amt.keys()) + // since toCoins and amt held positive values, their sums must be positive too + val addCoins = jointDenoms.mapBy(d => getOr0(toCoins, d) + getOr0(amt, d)) + if (addCoins.keys().exists(d => addCoins.get(d) > MAX_INT256)) { + // overflow, SDK panics + { isError: true, ctx: ctx } + } else { + // add `toAddr` to the accounts, if it did not exist + val newAccounts = ctx.accounts.union(Set(toAddr)) + val newBalances = + if (fromAddr == toAddr) { + ctx.balances + } else { + // Update the balance of `fromAddr` with subCoins. + val newBalancesSub = ctx.balances.set(fromAddr, subCoins) + // Since `toAddr` may be a new account, extend the map, if needed + newBalancesSub.put(toAddr, addCoins) + } + // return the result + { + isError: false, + ctx: ctx.with("balances", newBalances).with("accounts", newAccounts), + } + } + } + } + + /// IsSendEnabledCoin returns the current SendEnabled status of the provided coin's denom + /// SDK: `IsSendEnabledCoin(ctx sdk.Context, coin sdk.Coin) bool` + pure def isSendEnabledCoin(ctx: BankCtx, coin: Coin): bool = { + val found = ctx.params.sendEnabled.filter(p => coin.denom == p.denom) + if (found != Set()) { + found.exists(p => p.enabled) + } else { + ctx.params.defaultSendEnabled + } + } + + /// `IsSendEnabledCoins` checks the coins provide and returns an `ErrSendDisabled` if + /// any of the coins are not configured for sending. Returns `nil` if sending is enabled + /// for all provided coin. + /// SDK: `IsSendEnabledCoins(ctx sdk.Context, coins ...sdk.Coin) error` + pure def isSendEnabledCoins(ctx: BankCtx, coins: Set[Coin]): str = { + if (coins.forall(c => isSendEnabledCoin(ctx, c))) { + "" + } else { + "ErrSendDisabled" + } + } + // } // SendKeeper + + // THE STATE MACHINE + // machine { + // managed by the account keeper + var accounts: Set[Addr] + // managed by the bank keeper + var balances: Addr -> Coins + + // A helper function: It indicates the user's intent to write a precondition, + // which should hold true, whenever an action is called. + def require(cond) = cond + + // Tests instantiate parameters with fixed values (later, parameterized). + val PARAMS = { + sendEnabled: Set( + { denom: "atom", enabled: true }, + { denom: "proton", enabled: true } + ), + defaultSendEnabled: false + } + + // Tests instantiate denominations with fixed values (later, parameterized). + val DENOMS = Set("atom", "proton", "photon") + + // Initialize the state machine. Atm, the initializer is a mock. + action init = { + val accs = ADDR.exclude(Set("null")) + val bals = Map( + "alice" -> Map("atom" -> 30, "proton" -> 20, "photon" -> 2000), + "bob" -> Map("atom" -> 1) + ) + // validate the balances at the genesis time + val bankIn = { accounts: accs, balances: bals, params: PARAMS } + all { + require(accs.forall(a => validateBalance(bankIn, a))), + // initialize the state + accounts' = accs, + balances' = bals, + } + } + + // handler of MsgSend of x/bank + // https://docs.cosmos.network/v0.45/modules/bank/03_messages.html + action send(fromAddr: Addr, toAddr: Addr, coins: Coins): bool = { + val oldCtx = { + accounts: accounts, balances: balances, params: PARAMS + } + // Send the coins via the keeper. + // The message handler does validation and fails a transaction, + // if it does not pass validation. For the moment, we simply require + // the parameters to pass validation, for the action to succeed. + // In the future, we may want to save failed transactions. + all { + require(coins.keys().forall(d => coins.get(d) > 0)), + require(isSendEnabledCoins(oldCtx, + coins.keys().map(d => { denom: d, amount: coins.get(d) })) == ""), + require(not(BLOCKED.contains(toAddr))), + val result = sendCoins(oldCtx, fromAddr, toAddr, coins) + all { + require(not(result.isError)), + balances' = result.ctx.balances, + accounts' = result.ctx.accounts, + } + } + } + + action step = { + // at the moment, we execute only one action, so no "any" is used + // TODO: make a case for more than one denomination + nondet denom = oneOf(DENOMS) + // Note that the probability of randomly picking an amount that + // will not fail in `send` is quite small. + // Hence, we need more targeted tests (see below). + nondet amount = oneOf((-(2^256)).to(2^256 - 1)) + nondet fromAddr = oneOf(ADDR) + nondet toAddr = oneOf(ADDR) + send(fromAddr, toAddr, Map(denom -> amount)) + } + // } + + // UNIT TESTS + + // all addresses but "null" have an associated account in the key/value store + val ACCOUNTS = ADDR.exclude(Set("null")) + + // a simple context for testing + val CONTEXT = { + accounts: ACCOUNTS, + balances: Map( + "alice" -> Map("atom" -> 17, "nonatom" -> 2), + "bob" -> Map("atom" -> 0) + ), + params: { + sendEnabled: Set( + { denom: "atom", enabled: true }, + { denom: "proton", enabled: true } + ), + defaultSendEnabled: false + } + } + + // test that validateBalance is working as expected + run validateBalanceTest = { + assert(validateBalance(CONTEXT, "alice")) + .then(assert(not(validateBalance(CONTEXT, "null")))) + } + + // An auxilliary action that keeps all variables unchanged. + // In the future, such a change would be computed automatically. + action keepVars = all { + balances' = balances, + accounts' = accounts, + } + + // test that a simple `send` goes through + run sendOkTest = { + init + .then(send("alice", "bob", Map("atom" -> 3))) + .then(all { + assert(balances.get("alice").get("atom") == 27), + assert(balances.get("bob").get("atom") == 4), + keepVars, + }) + } + + // test that `send` fails when sending a token with send disabled + run sendNotEnabledErrTest = { + init + .then(send("alice", "bob", Map("photon" -> 3))) + .fail() + } + + // test that multiple denominations can be sent at once + run sendTwoOkTest = { + init + .then(send("alice", "bob", Map("atom" -> 3, "proton" -> 11))) + .then(all { + assert(balances.get("alice").get("atom") == 27), + assert(balances.get("alice").get("proton") == 9), + assert(balances.get("bob").get("atom") == 4), + assert(balances.get("bob").get("proton") == 11), + keepVars, + }) + } + + // a test similar to property-based testing that randomly probes send + // custom initializer that picks some balances for several denominations + action initBoxed = all { + nondet amts1 = Set("atom").setOfMaps(to(0, 15)).oneOf() + nondet amts2 = Set("proton").setOfMaps(to(0, 15)).oneOf() + nondet amts3 = Set("atom", "proton").setOfMaps(to(0, 15)).oneOf() + nondet amts4 = Set("atom", "photon").setOfMaps(to(0, 15)).oneOf() + nondet bals = ADDR.setOfMaps(Set(amts1, amts2, amts3, amts4)).oneOf() + all { + balances' = bals, + accounts' = bals.keys().exclude(Set("null")), + } + } + // custom send that picks some randomly picks some tokens to transfer + action sendBoxed = { + // pick some denominations + nondet denoms = DENOMS.powerset().oneOf() + // Since denoms may be empty, oneOf() may complain. Redefine the empty set. + nondet someDenoms = if (denoms == Set()) Set("atom") else denoms + // pick some amounts + nondet coins = someDenoms.setOfMaps(to(-5, 5)).oneOf() + // pick the addresses + nondet addrFrom = ADDR.oneOf() + nondet addrTo = ADDR.oneOf() + send(addrFrom, addrTo, coins) + } + + // this is one of the basic invariants of the bank module + val nonNegativeSupplyInv = + balances.keys().forall(a => + val coins = balances.get(a) + coins.keys().forall(d => coins.get(d) >= 0) + ) + + // a single point random test + run sendRandomTest = { + initBoxed + .then(sendBoxed) + .then(all { + assert(nonNegativeSupplyInv), + keepVars + }) + } + + // If you'd like to run this test for multiple data points, + // you can do it in REPL as follows: + // .load bank-mini.qnt::bank + // _test(10000, 3, "initBoxed", "sendBoxed", "nonNegativeSupplyInv") +} From dd2345ebe3c9139f9a350d5bd26f634f1b24b2ca Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Tue, 24 Jan 2023 09:59:44 +0100 Subject: [PATCH 007/388] fix the example for the presentation --- examples/cosmos-bank/bank-mini.qnt | 36 +++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/examples/cosmos-bank/bank-mini.qnt b/examples/cosmos-bank/bank-mini.qnt index a1af89a63..5b4d2a236 100644 --- a/examples/cosmos-bank/bank-mini.qnt +++ b/examples/cosmos-bank/bank-mini.qnt @@ -50,16 +50,20 @@ module bank { params: Params, } - // An output produced by Keeper computations. + // An output produced by Keeper computations type BankOut = { isError: bool, ctx: BankCtx, } + // FUNCTIONAL LAYER + // ViewKeeper { /// `GetAllBalances` returns all the account balances for the given account address. /// SDK: `func (k BaseViewKeeper) GetAllBalances(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins` pure def getAllBalances(ctx: BankCtx, addr: Addr): Coins = { + // SDK: >= 18 function calls, >= 5 files, >= 171 lines of code + // Cognitive overload? if (ctx.balances.keys().contains(addr)) { ctx.balances.get(addr) } else { @@ -157,7 +161,13 @@ module bank { } // } // SendKeeper - // THE STATE MACHINE + // END OF THE FUNCTIONAL LAYER + + // STATE MACHINE + /* + ---> init (balances, accounts) [-- send -->] (balances', accounts') [-- send -->] ... + */ + // machine { // managed by the account keeper var accounts: Set[Addr] @@ -229,14 +239,16 @@ module bank { // Note that the probability of randomly picking an amount that // will not fail in `send` is quite small. // Hence, we need more targeted tests (see below). - nondet amount = oneOf((-(2^256)).to(2^256 - 1)) + nondet amount = (-(2^256)).to(2^256 - 1).oneOf() nondet fromAddr = oneOf(ADDR) nondet toAddr = oneOf(ADDR) send(fromAddr, toAddr, Map(denom -> amount)) } // } - // UNIT TESTS + // END OF THE STATE MACHINE + + // UNIT TESTS + PBT TESTS // all addresses but "null" have an associated account in the key/value store val ACCOUNTS = ADDR.exclude(Set("null")) @@ -257,12 +269,6 @@ module bank { } } - // test that validateBalance is working as expected - run validateBalanceTest = { - assert(validateBalance(CONTEXT, "alice")) - .then(assert(not(validateBalance(CONTEXT, "null")))) - } - // An auxilliary action that keeps all variables unchanged. // In the future, such a change would be computed automatically. action keepVars = all { @@ -270,6 +276,16 @@ module bank { accounts' = accounts, } + // test that validateBalance is working as expected + run validateBalanceTest = { + init + .then(all { + assert(validateBalance(CONTEXT, "alice")), + assert(not(validateBalance(CONTEXT, "null"))), + keepVars, + }) + } + // test that a simple `send` goes through run sendOkTest = { init From 5fbeef5ad21a1d409d8217ea6e278530f4674b3d Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Tue, 24 Jan 2023 15:38:56 +0100 Subject: [PATCH 008/388] update the spec after the dry run --- examples/cosmos-bank/bank-mini-sdk.qnt | 368 +++++++++++++++++++++++++ examples/cosmos-bank/bank-mini.qnt | 11 +- 2 files changed, 370 insertions(+), 9 deletions(-) create mode 100644 examples/cosmos-bank/bank-mini-sdk.qnt diff --git a/examples/cosmos-bank/bank-mini-sdk.qnt b/examples/cosmos-bank/bank-mini-sdk.qnt new file mode 100644 index 000000000..5b4d2a236 --- /dev/null +++ b/examples/cosmos-bank/bank-mini-sdk.qnt @@ -0,0 +1,368 @@ +/** + * This is a minimized protocol specification of the bank module + * that is tuned for an efficient presentation. For a more detailed version, + * see bank.qnt. + * + * Igor Konnov, Informal Systems, 2023 + */ +module bank { + // namespace bits { + type Addr = str + type Int64 = int + type Int256 = int + /// the maximum amount value in the SDK (note 256 instead of 255!) + val MAX_INT256 = 2^256 - 1 + // the range of 256-bit integers in the SDK + pure def isInt256(i: int): bool = -2^256 <= i and i < 2^256 + // a coin with denominations attached + type Coin = { denom: str, amount: Int256 } + // Cosmos SDK coins are sorted arrays. We simply use Quint maps. + type Coins = str -> Int256 + // } + + // Account balances + type Balance = { address: Addr, coins: Coins } + + /// Parameters of the bank module + type Params = { + // whether coin send is enabled for specific denominations + sendEnabled: Set[{ denom: str, enabled: bool }], + // whether coin send is enabled by default + defaultSendEnabled: bool, + } + + /// All possible addresses, a small set for testing. + /// In Q1, it will be a parameter! + val ADDR = Set("alice", "bob", "charlie", "eve", "null") + /// Blocked addresses, a small set for testing (a parameter in a full spec). + /// In Q1, it will be a parameter! + val BLOCKED = Set("eve") + + // The part of the key-value store read by the bank or written by the bank. + // In contrast to the Cosmos SDK in Go, we encapsulate the view of the + // context available to the bank in this special record. + type BankCtx = { + // accessed via AccountKeeper + accounts: Set[Addr], + // the balances are the essential part of the bank module + balances: Addr -> Coins, + // module parameters + params: Params, + } + + // An output produced by Keeper computations + type BankOut = { + isError: bool, + ctx: BankCtx, + } + + // FUNCTIONAL LAYER + + // ViewKeeper { + /// `GetAllBalances` returns all the account balances for the given account address. + /// SDK: `func (k BaseViewKeeper) GetAllBalances(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins` + pure def getAllBalances(ctx: BankCtx, addr: Addr): Coins = { + // SDK: >= 18 function calls, >= 5 files, >= 171 lines of code + // Cognitive overload? + if (ctx.balances.keys().contains(addr)) { + ctx.balances.get(addr) + } else { + Map() + } + } + + /// `ValidateBalance` should only be called upon genesis state. + /// SDK `ValidateBalance(ctx sdk.Context, addr sdk.AccAddress) error` + pure def validateBalance(ctx: BankCtx, addr: Addr): bool = and { + ctx.accounts.contains(addr), + val coins = getAllBalances(ctx, addr) + coins.keys().forall(denom => coins.get(denom) > 0), + // SKIPPED: logic of vesting accounts that are initialized in genesis + } + // } // ViewKeeper + + // SendKeeper { + /// `SendCoins` transfers amt coins from a sending account to a receiving account. + /// An error is returned upon failure. + /// + /// In our specification, `sendCoins` does not update the context in place, + /// but it returns a new context. + /// `isError == true` on error or panic. + /// SDK `SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error` + pure def sendCoins(ctx: BankCtx, + fromAddr: Addr, toAddr: Addr, amt: Coins): BankOut = { + // NOTE on SDK: if Coins are constructed with NewCoins, they must be positive. + // However, if they are constructed another way, there is no precondition. + // Safely subtract the coins from `fromAddr` and add them to `toAddr`. + val fromCoins = getAllBalances(ctx, fromAddr) + if (amt.keys().exists(d => + not(d.in(fromCoins.keys())) or fromCoins.get(d) < amt.get(d))) { + // some denominations do not exist on `fromAddr`, or there is not enough funds + { isError: true, ctx: ctx } + } else { + // x/bank invariants prohibit persistence of zero balances + // clean zero balances + pure def getOr0(coins: Coins, d: str): int = { + if (d.in(coins.keys())) coins.get(d) else 0 + } + val positiveDenoms = fromCoins.keys().filter(d => fromCoins.get(d) > getOr0(amt, d)) + val subCoins = positiveDenoms.mapBy(d => fromCoins.get(d) - getOr0(amt, d)) + // add coins to toAddr: the tricky part is that the denominations may differ + val toCoins = getAllBalances(ctx, toAddr) + // extend the toCoins and amt with zeroes over the joint denominations + val jointDenoms = toCoins.keys().union(amt.keys()) + // since toCoins and amt held positive values, their sums must be positive too + val addCoins = jointDenoms.mapBy(d => getOr0(toCoins, d) + getOr0(amt, d)) + if (addCoins.keys().exists(d => addCoins.get(d) > MAX_INT256)) { + // overflow, SDK panics + { isError: true, ctx: ctx } + } else { + // add `toAddr` to the accounts, if it did not exist + val newAccounts = ctx.accounts.union(Set(toAddr)) + val newBalances = + if (fromAddr == toAddr) { + ctx.balances + } else { + // Update the balance of `fromAddr` with subCoins. + val newBalancesSub = ctx.balances.set(fromAddr, subCoins) + // Since `toAddr` may be a new account, extend the map, if needed + newBalancesSub.put(toAddr, addCoins) + } + // return the result + { + isError: false, + ctx: ctx.with("balances", newBalances).with("accounts", newAccounts), + } + } + } + } + + /// IsSendEnabledCoin returns the current SendEnabled status of the provided coin's denom + /// SDK: `IsSendEnabledCoin(ctx sdk.Context, coin sdk.Coin) bool` + pure def isSendEnabledCoin(ctx: BankCtx, coin: Coin): bool = { + val found = ctx.params.sendEnabled.filter(p => coin.denom == p.denom) + if (found != Set()) { + found.exists(p => p.enabled) + } else { + ctx.params.defaultSendEnabled + } + } + + /// `IsSendEnabledCoins` checks the coins provide and returns an `ErrSendDisabled` if + /// any of the coins are not configured for sending. Returns `nil` if sending is enabled + /// for all provided coin. + /// SDK: `IsSendEnabledCoins(ctx sdk.Context, coins ...sdk.Coin) error` + pure def isSendEnabledCoins(ctx: BankCtx, coins: Set[Coin]): str = { + if (coins.forall(c => isSendEnabledCoin(ctx, c))) { + "" + } else { + "ErrSendDisabled" + } + } + // } // SendKeeper + + // END OF THE FUNCTIONAL LAYER + + // STATE MACHINE + /* + ---> init (balances, accounts) [-- send -->] (balances', accounts') [-- send -->] ... + */ + + // machine { + // managed by the account keeper + var accounts: Set[Addr] + // managed by the bank keeper + var balances: Addr -> Coins + + // A helper function: It indicates the user's intent to write a precondition, + // which should hold true, whenever an action is called. + def require(cond) = cond + + // Tests instantiate parameters with fixed values (later, parameterized). + val PARAMS = { + sendEnabled: Set( + { denom: "atom", enabled: true }, + { denom: "proton", enabled: true } + ), + defaultSendEnabled: false + } + + // Tests instantiate denominations with fixed values (later, parameterized). + val DENOMS = Set("atom", "proton", "photon") + + // Initialize the state machine. Atm, the initializer is a mock. + action init = { + val accs = ADDR.exclude(Set("null")) + val bals = Map( + "alice" -> Map("atom" -> 30, "proton" -> 20, "photon" -> 2000), + "bob" -> Map("atom" -> 1) + ) + // validate the balances at the genesis time + val bankIn = { accounts: accs, balances: bals, params: PARAMS } + all { + require(accs.forall(a => validateBalance(bankIn, a))), + // initialize the state + accounts' = accs, + balances' = bals, + } + } + + // handler of MsgSend of x/bank + // https://docs.cosmos.network/v0.45/modules/bank/03_messages.html + action send(fromAddr: Addr, toAddr: Addr, coins: Coins): bool = { + val oldCtx = { + accounts: accounts, balances: balances, params: PARAMS + } + // Send the coins via the keeper. + // The message handler does validation and fails a transaction, + // if it does not pass validation. For the moment, we simply require + // the parameters to pass validation, for the action to succeed. + // In the future, we may want to save failed transactions. + all { + require(coins.keys().forall(d => coins.get(d) > 0)), + require(isSendEnabledCoins(oldCtx, + coins.keys().map(d => { denom: d, amount: coins.get(d) })) == ""), + require(not(BLOCKED.contains(toAddr))), + val result = sendCoins(oldCtx, fromAddr, toAddr, coins) + all { + require(not(result.isError)), + balances' = result.ctx.balances, + accounts' = result.ctx.accounts, + } + } + } + + action step = { + // at the moment, we execute only one action, so no "any" is used + // TODO: make a case for more than one denomination + nondet denom = oneOf(DENOMS) + // Note that the probability of randomly picking an amount that + // will not fail in `send` is quite small. + // Hence, we need more targeted tests (see below). + nondet amount = (-(2^256)).to(2^256 - 1).oneOf() + nondet fromAddr = oneOf(ADDR) + nondet toAddr = oneOf(ADDR) + send(fromAddr, toAddr, Map(denom -> amount)) + } + // } + + // END OF THE STATE MACHINE + + // UNIT TESTS + PBT TESTS + + // all addresses but "null" have an associated account in the key/value store + val ACCOUNTS = ADDR.exclude(Set("null")) + + // a simple context for testing + val CONTEXT = { + accounts: ACCOUNTS, + balances: Map( + "alice" -> Map("atom" -> 17, "nonatom" -> 2), + "bob" -> Map("atom" -> 0) + ), + params: { + sendEnabled: Set( + { denom: "atom", enabled: true }, + { denom: "proton", enabled: true } + ), + defaultSendEnabled: false + } + } + + // An auxilliary action that keeps all variables unchanged. + // In the future, such a change would be computed automatically. + action keepVars = all { + balances' = balances, + accounts' = accounts, + } + + // test that validateBalance is working as expected + run validateBalanceTest = { + init + .then(all { + assert(validateBalance(CONTEXT, "alice")), + assert(not(validateBalance(CONTEXT, "null"))), + keepVars, + }) + } + + // test that a simple `send` goes through + run sendOkTest = { + init + .then(send("alice", "bob", Map("atom" -> 3))) + .then(all { + assert(balances.get("alice").get("atom") == 27), + assert(balances.get("bob").get("atom") == 4), + keepVars, + }) + } + + // test that `send` fails when sending a token with send disabled + run sendNotEnabledErrTest = { + init + .then(send("alice", "bob", Map("photon" -> 3))) + .fail() + } + + // test that multiple denominations can be sent at once + run sendTwoOkTest = { + init + .then(send("alice", "bob", Map("atom" -> 3, "proton" -> 11))) + .then(all { + assert(balances.get("alice").get("atom") == 27), + assert(balances.get("alice").get("proton") == 9), + assert(balances.get("bob").get("atom") == 4), + assert(balances.get("bob").get("proton") == 11), + keepVars, + }) + } + + // a test similar to property-based testing that randomly probes send + // custom initializer that picks some balances for several denominations + action initBoxed = all { + nondet amts1 = Set("atom").setOfMaps(to(0, 15)).oneOf() + nondet amts2 = Set("proton").setOfMaps(to(0, 15)).oneOf() + nondet amts3 = Set("atom", "proton").setOfMaps(to(0, 15)).oneOf() + nondet amts4 = Set("atom", "photon").setOfMaps(to(0, 15)).oneOf() + nondet bals = ADDR.setOfMaps(Set(amts1, amts2, amts3, amts4)).oneOf() + all { + balances' = bals, + accounts' = bals.keys().exclude(Set("null")), + } + } + // custom send that picks some randomly picks some tokens to transfer + action sendBoxed = { + // pick some denominations + nondet denoms = DENOMS.powerset().oneOf() + // Since denoms may be empty, oneOf() may complain. Redefine the empty set. + nondet someDenoms = if (denoms == Set()) Set("atom") else denoms + // pick some amounts + nondet coins = someDenoms.setOfMaps(to(-5, 5)).oneOf() + // pick the addresses + nondet addrFrom = ADDR.oneOf() + nondet addrTo = ADDR.oneOf() + send(addrFrom, addrTo, coins) + } + + // this is one of the basic invariants of the bank module + val nonNegativeSupplyInv = + balances.keys().forall(a => + val coins = balances.get(a) + coins.keys().forall(d => coins.get(d) >= 0) + ) + + // a single point random test + run sendRandomTest = { + initBoxed + .then(sendBoxed) + .then(all { + assert(nonNegativeSupplyInv), + keepVars + }) + } + + // If you'd like to run this test for multiple data points, + // you can do it in REPL as follows: + // .load bank-mini.qnt::bank + // _test(10000, 3, "initBoxed", "sendBoxed", "nonNegativeSupplyInv") +} diff --git a/examples/cosmos-bank/bank-mini.qnt b/examples/cosmos-bank/bank-mini.qnt index 5b4d2a236..7b8a6921a 100644 --- a/examples/cosmos-bank/bank-mini.qnt +++ b/examples/cosmos-bank/bank-mini.qnt @@ -62,8 +62,6 @@ module bank { /// `GetAllBalances` returns all the account balances for the given account address. /// SDK: `func (k BaseViewKeeper) GetAllBalances(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins` pure def getAllBalances(ctx: BankCtx, addr: Addr): Coins = { - // SDK: >= 18 function calls, >= 5 files, >= 171 lines of code - // Cognitive overload? if (ctx.balances.keys().contains(addr)) { ctx.balances.get(addr) } else { @@ -86,8 +84,7 @@ module bank { /// An error is returned upon failure. /// /// In our specification, `sendCoins` does not update the context in place, - /// but it returns a new context. - /// `isError == true` on error or panic. + /// but it returns a new context. `isError == true` on error or panic. /// SDK `SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error` pure def sendCoins(ctx: BankCtx, fromAddr: Addr, toAddr: Addr, amt: Coins): BankOut = { @@ -164,11 +161,8 @@ module bank { // END OF THE FUNCTIONAL LAYER // STATE MACHINE - /* - ---> init (balances, accounts) [-- send -->] (balances', accounts') [-- send -->] ... - */ + // ---> init (balances, accounts) [-- send -->] (balances', accounts') [-- send -->] ... - // machine { // managed by the account keeper var accounts: Set[Addr] // managed by the bank keeper @@ -244,7 +238,6 @@ module bank { nondet toAddr = oneOf(ADDR) send(fromAddr, toAddr, Map(denom -> amount)) } - // } // END OF THE STATE MACHINE From b889ea545cf1434e19a7831da7f285efee1b6b42 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Tue, 14 Feb 2023 18:42:24 +0100 Subject: [PATCH 009/388] add code screenshots for comparison and update the roadmap --- README.md | 57 +++++++++++++++++++++----------- doc/img/validate-quint.png | Bin 0 -> 102116 bytes doc/img/validate-tla-vscode.png | Bin 0 -> 99527 bytes doc/img/validate-tla.png | Bin 0 -> 246016 bytes 4 files changed, 37 insertions(+), 20 deletions(-) create mode 100644 doc/img/validate-quint.png create mode 100644 doc/img/validate-tla-vscode.png create mode 100644 doc/img/validate-tla.png diff --git a/README.md b/README.md index 84530cd5b..e95911308 100644 --- a/README.md +++ b/README.md @@ -10,10 +10,25 @@ distributed systems and blockchain protocols. It combines the robust theoretical basis of the [Temporal Logic of Actions][TLA] (TLA) with state-of-the-art static analysis and development tooling. +This is how a typical Quint code looks like in the [Quint VSCode Plugin][]: + +

+ +

+ +If you would to see the same code in TLA+, here is how it looks like +in the [TLA+ VSCode Plugin][]: + +

+ Code snippet in TLA+ +

+ Quint is inspired by [TLA+][] but provides an alternative surface syntax for -specifying systems in TLA. The most important feature of our syntax is that it -is minimal and regular, making Quint an easy target for advanced developer -tooling and static analysis (see our [Design Principles][]). +specifying systems in the logic TLA. The most important feature of our syntax +is that it is minimal and regular, making Quint an easy target for advanced +developer tooling and static analysis (see our [Design Principles][]). The syntax also aims to be familiar to engineers: @@ -26,7 +41,7 @@ The syntax also aims to be familiar to engineers: clearly. Notably, Quint comes with formal semantics built-in, thanks to its foundation in -TLA and it is aligned with TLA+: it will soon be supported in the [Apalache][] +TLA and it is aligned with TLA+: it will soon be supported in the [Apalache][] model checker. ## Name origin @@ -50,7 +65,7 @@ documentation for built-in operators](./doc/builtin.md). ### Examples :musical_score: We have written [examples](./examples) of several specifications in Quint. -Some of them accompany a TLA+ version for comparison and learning purposes. +Some of them accompany a TLA+ version for comparison and learning purposes. To simplify reading, use [syntax highlighting](./editor-plugins) for your editor (currently, VSCode, Emacs and Vim are supported). @@ -97,34 +112,34 @@ completely implementing every pass. | :--------------- | :----: | :-------------: | :-----: | :----------: | :-------: | :---------: | :-------: | | [Booleans][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | | [Integers][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | -| [if-then-else][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | -| [Operator definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | -| [Modes][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: [234][] | :x: | :x: | +| [if-then-else][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | +| [Operator definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | +| [Modes][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | | [Sets][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark:/:x: [238][] | :x: | :x: | -| [Guess][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | +| [Nondet][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | | [Maps][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | | [Lists][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | | [Records][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | | [Discriminated unions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: [244][] | :x: [233][] | :x: | :x: | | [Tuples][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | | [Imports][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :question: | :x: | :x: | -| [Module definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | +| [Module definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | | [Module instances][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: [237][] | :x: | :x: | | [Multiple files][] | :x: [8][] | :x: | :x: | :x: | :x: | :x: | :x: | -| [Constant declarations][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: [236][] | :x: | :x: | -| [Variable definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | +| [Constant declarations][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: [236][] | :x: | :white_check_mark: | +| [Variable definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | | [Assumptions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: [235][] | :x: | :x: | -| [Lambdas][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | -| [Multiline disjunctions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | -| [Multiline conjunctions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | -| [Delayed assignment][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | -| Invariant checking | - | - | | | :white_check_mark: | :x: | :x: | +| [Lambdas][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | +| [Multiline disjunctions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | +| [Multiline conjunctions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | +| [Delayed assignment][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | +| Invariant checking | - | - | | | :white_check_mark: | :x: | :white_check_mark: | | [Higher-order definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: [221][] | :x: | :x: | -| [Runs][] | :white_check_mark: | :white_check_mark: | :x: | :x: | :white_check_mark: | :x: | :x: | +| [Runs][] | :white_check_mark: | :white_check_mark: | :x: | :x: | :white_check_mark: | :x: | :white_check_mark: | | [Temporal operators][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | *non-goal* | :x: | :x: | | [Fairness][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | *non-goal* | :x: | :x: | | [Unbounded quantifiers][] | :white_check_mark: | :white_check_mark: | :x: | :x: | *non-goal* | :x: | :x: | -| [String literals][], see #118 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | +| [String literals][], see #118 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | | ~~uninterpreted types~~, see #118 | :white_check_mark: | :white_check_mark: | :x: | :x: | :x: | :x: | :x: | @@ -146,7 +161,7 @@ completely implementing every pass. [Multiline disjunctions]: ./doc/lang.md#multiline-disjunctions [Multiline conjunctions]: ./doc/lang.md#multiline-conjunctions [if-then-else]: ./doc/lang.md#condition -[Guess]: ./doc/lang.md#existential-quantifier-and-non-deterministic-choice +[Nondet]: ./doc/lang.md#existential-quantifier-and-non-deterministic-choice [Maps]: ./doc/lang.md#maps-aka-functions [Records]: ./doc/lang.md#records [Discriminated unions]: ./doc/lang.md#discriminated-unions @@ -176,4 +191,6 @@ completely implementing every pass. [TLA+]: https://lamport.azurewebsites.net/tla/tla.html [TLA]: https://en.wikipedia.org/wiki/Temporal_logic_of_actions [Visual Studio Code Marketplace]: https://marketplace.visualstudio.com/items?itemName=informal.quint-vscode +[Quint VSCode Plugin]: https://marketplace.visualstudio.com/items?itemName=informal.quint-vscode +[TLA+ VSCode Plugin]: https://marketplace.visualstudio.com/items?itemName=alygin.vscode-tlaplus [Tutorials]: ./tutorials/README.md diff --git a/doc/img/validate-quint.png b/doc/img/validate-quint.png new file mode 100644 index 0000000000000000000000000000000000000000..691f35b690f0c9a8db4ad0368ef2c6a4a599ac86 GIT binary patch literal 102116 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ß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 z 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 Date: Tue, 14 Feb 2023 18:48:42 +0100 Subject: [PATCH 010/388] Revert "add code screenshots for comparison and update the roadmap" This reverts commit b889ea545cf1434e19a7831da7f285efee1b6b42. --- README.md | 57 +++++++++++--------------------- doc/img/validate-quint.png | Bin 102116 -> 0 bytes doc/img/validate-tla-vscode.png | Bin 99527 -> 0 bytes doc/img/validate-tla.png | Bin 246016 -> 0 bytes 4 files changed, 20 insertions(+), 37 deletions(-) delete mode 100644 doc/img/validate-quint.png delete mode 100644 doc/img/validate-tla-vscode.png delete mode 100644 doc/img/validate-tla.png diff --git a/README.md b/README.md index e95911308..84530cd5b 100644 --- a/README.md +++ b/README.md @@ -10,25 +10,10 @@ distributed systems and blockchain protocols. It combines the robust theoretical basis of the [Temporal Logic of Actions][TLA] (TLA) with state-of-the-art static analysis and development tooling. -This is how a typical Quint code looks like in the [Quint VSCode Plugin][]: - -

- -

- -If you would to see the same code in TLA+, here is how it looks like -in the [TLA+ VSCode Plugin][]: - -

- Code snippet in TLA+ -

- Quint is inspired by [TLA+][] but provides an alternative surface syntax for -specifying systems in the logic TLA. The most important feature of our syntax -is that it is minimal and regular, making Quint an easy target for advanced -developer tooling and static analysis (see our [Design Principles][]). +specifying systems in TLA. The most important feature of our syntax is that it +is minimal and regular, making Quint an easy target for advanced developer +tooling and static analysis (see our [Design Principles][]). The syntax also aims to be familiar to engineers: @@ -41,7 +26,7 @@ The syntax also aims to be familiar to engineers: clearly. Notably, Quint comes with formal semantics built-in, thanks to its foundation in -TLA and it is aligned with TLA+: it will soon be supported in the [Apalache][] +TLA and it is aligned with TLA+: it will soon be supported in the [Apalache][] model checker. ## Name origin @@ -65,7 +50,7 @@ documentation for built-in operators](./doc/builtin.md). ### Examples :musical_score: We have written [examples](./examples) of several specifications in Quint. -Some of them accompany a TLA+ version for comparison and learning purposes. +Some of them accompany a TLA+ version for comparison and learning purposes. To simplify reading, use [syntax highlighting](./editor-plugins) for your editor (currently, VSCode, Emacs and Vim are supported). @@ -112,34 +97,34 @@ completely implementing every pass. | :--------------- | :----: | :-------------: | :-----: | :----------: | :-------: | :---------: | :-------: | | [Booleans][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | | [Integers][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | -| [if-then-else][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | -| [Operator definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | -| [Modes][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | +| [if-then-else][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | +| [Operator definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | +| [Modes][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: [234][] | :x: | :x: | | [Sets][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark:/:x: [238][] | :x: | :x: | -| [Nondet][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | +| [Guess][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | | [Maps][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | | [Lists][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | | [Records][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | | [Discriminated unions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: [244][] | :x: [233][] | :x: | :x: | | [Tuples][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | | [Imports][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :question: | :x: | :x: | -| [Module definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | +| [Module definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | | [Module instances][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: [237][] | :x: | :x: | | [Multiple files][] | :x: [8][] | :x: | :x: | :x: | :x: | :x: | :x: | -| [Constant declarations][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: [236][] | :x: | :white_check_mark: | -| [Variable definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | +| [Constant declarations][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: [236][] | :x: | :x: | +| [Variable definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | | [Assumptions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: [235][] | :x: | :x: | -| [Lambdas][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | -| [Multiline disjunctions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | -| [Multiline conjunctions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | -| [Delayed assignment][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | -| Invariant checking | - | - | | | :white_check_mark: | :x: | :white_check_mark: | +| [Lambdas][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | +| [Multiline disjunctions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | +| [Multiline conjunctions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | +| [Delayed assignment][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | +| Invariant checking | - | - | | | :white_check_mark: | :x: | :x: | | [Higher-order definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: [221][] | :x: | :x: | -| [Runs][] | :white_check_mark: | :white_check_mark: | :x: | :x: | :white_check_mark: | :x: | :white_check_mark: | +| [Runs][] | :white_check_mark: | :white_check_mark: | :x: | :x: | :white_check_mark: | :x: | :x: | | [Temporal operators][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | *non-goal* | :x: | :x: | | [Fairness][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | *non-goal* | :x: | :x: | | [Unbounded quantifiers][] | :white_check_mark: | :white_check_mark: | :x: | :x: | *non-goal* | :x: | :x: | -| [String literals][], see #118 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | +| [String literals][], see #118 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | | ~~uninterpreted types~~, see #118 | :white_check_mark: | :white_check_mark: | :x: | :x: | :x: | :x: | :x: | @@ -161,7 +146,7 @@ completely implementing every pass. [Multiline disjunctions]: ./doc/lang.md#multiline-disjunctions [Multiline conjunctions]: ./doc/lang.md#multiline-conjunctions [if-then-else]: ./doc/lang.md#condition -[Nondet]: ./doc/lang.md#existential-quantifier-and-non-deterministic-choice +[Guess]: ./doc/lang.md#existential-quantifier-and-non-deterministic-choice [Maps]: ./doc/lang.md#maps-aka-functions [Records]: ./doc/lang.md#records [Discriminated unions]: ./doc/lang.md#discriminated-unions @@ -191,6 +176,4 @@ completely implementing every pass. [TLA+]: https://lamport.azurewebsites.net/tla/tla.html [TLA]: https://en.wikipedia.org/wiki/Temporal_logic_of_actions [Visual Studio Code Marketplace]: https://marketplace.visualstudio.com/items?itemName=informal.quint-vscode -[Quint VSCode Plugin]: https://marketplace.visualstudio.com/items?itemName=informal.quint-vscode -[TLA+ VSCode Plugin]: https://marketplace.visualstudio.com/items?itemName=alygin.vscode-tlaplus [Tutorials]: ./tutorials/README.md diff --git a/doc/img/validate-quint.png b/doc/img/validate-quint.png deleted file mode 100644 index 691f35b690f0c9a8db4ad0368ef2c6a4a599ac86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102116 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ßpt4E+$~?J3E+p1ypHZf$_Wc17rI+VaYFqo3>I9UD-6Xs1eU$ho>>qv z0b~y9p79DQ)GElHV{%3}SEm@xB#^G#QFmCkugyptX!_C!}n;uy((LP)FfIJKBMVXKJRha3l!zP94*q9M~*_L zm$P3yWq?61h&nd}th9AnYddGJw)OGf02pyFT%3^}2+Ob^A;F@OK|0|v{SShS&y$kB<-p|ZW1Z6f7S9RCOGUSZ z13=!WQaVs>o{!#-7EFVa(ne|P-59Q$m{#cYw|bLusLY8&S`d)TUy(lH*T)peFlXOP zb!;l}ZG9B03!IAJ$P0~j(-maf=U_)&E7yJU+%y=<#Ih9cCQroJ|OxmO<@nS<$( zF3a%o!%swu3*NU935B2&Y*)eT$IO{gIZ2FPvzR9BB$n%S`;Ig3%OGX;V!quZC|PRQ8H zKFmw|d&0rwd(RC4;$p-E{W~b3V&k6ne!^e%5o=MyNkmlPzGf5NeQ9;hNM3HjaT&8u z^O}t8#JM@Epij?bmbuay>MBm(4lauaw+$=l8_U}9Jwpxo?E5yh*DDd)^6cn+nc7Ei z(XC;|!t2piV_H{WT!ZKewVd~X=|>SV3BJ( zbGi8duQ|u|9aqvFTZL!=7>yNOn*f+?Fo*g(7un1hss(N(33G6QBaKJ+vq?F)R1#K} z3iB&JPe@s<6c&ox;|s8JaqIeI+IGr2xad|}E}w~)N&(p;^FQ^KvilC)2Le`3Lb8VJ z#b>xGUqHREwuG|L7%6cY>r=0vZ4W&(ntxHrx?`7QV#$mg`(!5jmMkR`Y>`*dtG#Kx z$f~9Gz8xK+U^iDK_4uF_Qyi(ZGvQ6-IW^s@`Mk4yyHOdqxa?V#7x?60a|(#4AnGRr zC*T*K?(cU3NmZ?nkTTZLW*Umyw!&FCj(Uz{m6x~nJBzD=sSf*!tBLta1~8LD0OGgK zb(X0e(sY+@GTfa!*36&bll4uGRl~Oqt@6yESBl5BG52cv#!g#IZIa;EDxwfy& zEjzd?5l%OGTN8%#DCirvvdihDnd>PtCMX62Ju(AF?$@^<**{J1@*67&mW|NF<_L8| z@Q~i7Nn+|br^sc_6dGs|^<2`IKsA5*_%ML2cyMPCTFgYazjT>?!)JjtpyG5$GYN>} zNE^LT3r!bIV{Ux7Z;tJoiV}4Dh!M@SGzG>5{ z>I{dS1q{xjn7~BOi8E;0=1T8;`7|7*N>1w#SZ*&UV6v#ZMcxkXVBIN!(h!n!GBNIJ zdHg=Av(`{&>Sn*{C|7b+p?O6nv^Uc6xBdteB0%f{GQL;t^kza}0u>77p0MSG9NHcN zyZFcF;nf&we95tEqazf@D~I8jixXlikW9`~|xC`@(Pu0nzlZ>vH`4TNjRkoPD*+aPL%6WP8Bj_HC~xnG4i-KQCQ z_DhjH_rQ>&J8#^v0D=@CSn2o0JHL$HXFp0TMeD+HRs=T7wlBq|6$mfCGr?y<0JOD4{3&}yW0HrhX> z)k4b=X43fpZwm|4d-}tDF?YymcJtTV`-_@)LLKD=QO&K_>o||w%_&8ziFY)x0L=d7 z`!7;g@pi~hX zi-pZUk{e{g;rB(sO;`-6WtX?R2tM+O5KBvCR9x$iJ#@!Bt^JrFK4jNp@qJP-Lz}
BMbMRuF{I*9JzFxGykcycSd4= z??~*dH={F*3_DZr@-~g0-G)x%{+H&UpxDRH3frQ6&}^FGW#EmCGR`y$pg;FVZEN&G z;TR5OX>*~=2g-9dA$f`aE%>({iU_$FQSq!gtYZ61&PORBc&dtRqBcDj0`3s#5&iY0Zqmht7k}M0`(+if;m6|pfIJR{MQK&`^OGII*HkE30d5q zm0}3iNxMurEf)+p$-f@yDQcyP!nW=1zR%yk0Yr}eeP7f@`#bznQ#7-Ia{Lc7jGZlO zv`E3jO^4?N2g&c(th>HTOnR&8d5TB{r>KmQEY6JlWEIMjizNhjNeHAt5g!`0ZvoEa z`B~eQ{q3&)`OZ<2La^q%8CsrvGR=(pyRzC}a+;k4fC{E#DB;TgdIAjKKk(Ba5?tWb zWlPj|NECw0Mkyu!^j!-ftgsg? z+xVZGYmM$4!W+mMTh0XJ?up1qYMEBxq)p2Tx#iy#6OloDDFNxzv(gvkV?Is;S@p)Z z&GOGU@I;LK-$#`|04X;xKrGSeKo3^t-y8VI1PC4-P>65*edE6$-8r^D7m=PQAoNCj z+u%SVQS7C_<%@PNsEHV}6N>tmG^ZOK2s*lW)HMQmcp^CJfHY*Fl{|8E8%M|M_los( z18!$`Cj1t!5B4CvTk1&bfEr7Dc#|XwsVM$!dIX+;;JVQ_eoLRA>d{-mKUDv(Y^>V5 zmS&?Fy|Ifw$Yjx{L@28Jc zCu2(fe|4U)fF%@t%vS#A-u~kWokM{F{UIdx>J+8zY2S>*O_EtBRM^Y^c`Qe%jFpcah@_1?Y#>vf_mQ58c^LNKhob)xgHJ z{@nI-gi;!qzaHcNlF7a2_ZLk9Gu$S6A?%- zJ-Wb`d&n@bot}dJLe6NIsB?eUMC}{(wpe z?N_MiT|)m|+XhrvSXiOi*|O33ARd|7aw@OVW{Gn!ji=@|ic(L&X&2s8Pf(=VWN7{h zH4|KwvO2%;o1YMhhNBx|DSx}9;_m^} zt4Nf8$^0P~t3m}~BC|jG!_eq{MQQNHCw?=(;{`D4%Rkh{CVmP)+?+E~Z5A&9oVnH_tZs zZp$fWowAuHVSI^W+vYvF39eOX4~Oa$iJy=NJ*x9{xbN_JFEK)5-oR61-Wu|?Pokd> zy1V3ONk85UZ!GwI<0Y_)yv`6c934qwN{5u#7z#t9N(*5_&C>7iVYXlY*jIM4SQjXj zKuI&M=^jfZPsr`_-1r^*)OI*Spv75+kkk)+vEBv_kIQxj!uaj=C6-o|R@ab5VV=11 z;aV%X&Mqg1nVei{JqwJ~0LH&axd8UeoaHh@z_Yv3u%}n_kpk2(Mo^M>$J02u7 zn(u0Y3}1Q&74k_J4!-*h@>^cDg%+Fzn3~VDNf|?SF1#qtFimNa8ldX-P3+Mu>$g!%y9#m(B}a;WFxsB+xb@+ zs8e{i*lGz-suPzqy`zrsVR-9}wW9`cD3QrN!MoiYCYC=raAaeYi-n<9nokgl&uG?| zK`ieWCv8E9OT-Wcx4K^~Ci3TRk%1r16oJvH)2fE^4D-SgI_(Va?6amL8G|G0A_m3z zUaNl(4-$jLcm4=YPsZ$VZL$BSEETj|Ldr7i2?=+)1gn+0 zS#ezx&Jha(pY=VME(lf1muBHexOElVe%O2gW}L!)v!J?NKBCkntE;oxM((jvjKhk4 zktP1>1Ra?68QkS$5rRx2+Sv^WmI#$x@&gPSCHm{{a{brmhZil=V&EW&1ik#~zRZE% zn#yGgmNnl~x}Glk`Q8(ZCNX99H0Q&KbwY!r^m2)ext@02ja(m0W8g%iQiPwchWRxw z*x1kX&yeW**n>2)ayUDx^L`e$(C*d|F5~ynKTpV#^ks<4k`$tYwG;x;M?*(=%VpB> zzRu)<%j0NVQbomOXfg{ zQ?U%DKA2KA<)c3+giiBZap&9X6B9m;M(U%Xv|Qp?HelS;AmRsG>{c_lVs>zAEkq zFv2LeVU%)d(4wJ;7%s>MWtII=cs;QsqQp}1CS61AU*uR zGeBBW)v34EoNxE`EEFN+w*TPsd@-P~SH>-DGs-gC7i!*9ycK}~@~Dmnv5>H*mUdMD z_AZ2c()pqf(X#wZAfHiv(I-})qP1%w5eEUAQ7c`EXtrq~D7g5EGR36vIK+KdGy z4Z4e+-;j6?INxVPW)-_YK8My792E4S5q8&89YatRpYf$<9;aRKS{n*LpE-=Y`}V9~ zxx{e%btqiKg>DVWM@C)7VH^u_JVO9(q1rT|I)z4=@_sMV7ZCiO7w!C(B{_-%I}Zj1 z2I7kIkWizo5F|3QJC@pWxif-boWW(6QHk8G3EujWFPF~S1*ClGE1%|GzI~A03|$%S z5B8+SS95Y{hbxRKn(g%6Ylrj=u7|_xS=npI`v~Y+2179X0eyYU1wEMLAu9TiW$cNn4l!lbOu!dQNHzfF9C`Olqb0i>Rv3uVTDg8=~<-s=VwLF%k#LEYW;THQ#FZCjja zOj;^ie^AP2lrpO^b^x#lD!RKU!+dJ!1R#>#W{I)Bl@v=*^)Q7VpoamqkcyI^B-&yx z^n4zOjt3J?j$ZHK21rWy4kywT4ED5n-UZ!JoU(2Zgsj!uq|P1pZeN-ARiy)D9HK-T zWk`FL4`)gRatIt>{-C@3-n3n#Q!nofhQsiyTd~VI;RLshJa5|xJCUaLOx!db|A%e^^1yl)0AFM3$m2-N`I6C zpM^xr_{&ca|H$>Zmd9rezBH2p=L$~)c?WZ!l4UU zs(ueu%5?&#BrMz&Tb*oOC)WGn-h+iU^&{dD$M(t&nee3IU@BL|oNByIWx&rXQ{l;h z7$Q{!FXN?DAz#7kqdBITUff0B*fY2DU$DRpxn@HI+!tJ2$YhrAs;h;(8qX^WcOdUM z9oaou4IF8KS_!AHYu`;+aWY5T@NBiMxGI|%)HN-uS*=Oba57gShS<^MWM$#f(`&)5 zAPf2go57MIwOIJZPWy-Rd|M znjB5%Yb_IcKy!Fa_>MCa@tiaurXchn2u>-r7Cq2_Hn1@47877YP5RRS1dvJ6w=VeZ zCtom}(apf4lVJ7ujWr9C8o~fdacq{PT;Q{h==%xHl|zZ9pppdS%uoIl$YFbJl3hy0 zrGg2UR4_5~R8bb#1H#a+2(;Y32rMk5;5B{U7Ys_7odcMP!j$crki- zzPZ9iBdotF8x#x_gDQ!HH;ts!sBFA$=LY-J1u<^a&*hpmkj3g1<=j|mNXMw?*@_Ri z99GoKIb|Qw@w2To%n@xwa%?1P+Y06YN6$p_h9Hq}Z&-7xNYS7}z_pmu;|kS&CO(%d zfrKsS)#zriz*NVwXF=5N@quCYk0Q9WdNtnn;bY%=LMeqj3&;>eUIWKSaONjcL*vhoH7n!r zjgUQ2SrzB!EFWv_K$Hq#{jLwXajF%s_EGvV;9XByw5h8=iQTI|NDe29M_ODen>sin z5kdB-Qku9A4kvJa{a_+Vgh)DwS(;2i{dftHYC`_#?2GLE~EjN;2Hw<)H0U7xRsA3ddFGE~F%Gjw)zeA8-w^_xiDHs+b z;N|J=^T0U2{!bRRnX~8#*m@A1*>q+@5y?2x;Pd5k{`9_ruPau>*c|G zuBRV%LDa_!q!Yuv?M#U99}pm)@7smRPVPhbh^O*DQ`K_RB|bprgd)id9E_!Mfh>_c zRv{Q`@19gPq24{Tm}k!w>ti%r7qQ|y=8qO|oA-gV+f@oGoM6|V0g)DNG)LUYjtUJX zytI&EZi^it37WGh=7@EB%E>r%`homzu+zWzeE?9*SOm%DLoS{oX}`C>+-h$;rIAaa z23sk;628tO3Zuv^Zq`t$lY}1P$fxr{#F2_`)|f1^z=X?)T3U&@2r@D0w+EG|SHP}G z9`~3G#Y40|?BW&io5^hY8iENv|1#jcPw%adI?+9*G9)zWkEF>DBdoDW@-Yka83nuL zt9lDtV?VYt=;$eZ^~?F7=i|ru`*5~|Y6sPoBxlj=0g?20!r<*wDHTm+1fiAjZf%u5 z7FS>v)g1X_(PqB?#m%1N!0V<1C3UkC6?XXwbO@DvAc^qv2g$D8thQe%JSj<60X&E z_%*{T1ZhH0l=~L~jaIcJvVc1|G*(wy^WJB|XC7?5)n{nCGv9y-yN>P#DKg$d^eBe4Q2A%h{n3^`H!;9uX~nbj}uC`$$w%| z-tu!Xx=Pf$!abF?JxVZi8vnSiOY{jCHJ$6xC+suZj)LX+;uTvPY4%l)`>eIXAZGBt zDBB;GB5oR4Iv>5Ta8vJ>)D-f2ys(vw=hMBGP{sK_bJ-2Kc9qP%sP74(dl#&`Y$wB) zM=LEiU8x$7#^|3){Fr~$Yj=)WnEj%U@zCqmwgQAG`s9P`q*t@ClpUoXT(-;9D-jo! zvxO;lKmsS|HkBvUHTnqz4X(!Y81Xf^_@_br6n(O6y;Xm~-sW^c>0W<+?w+8z;k<#G zq6?42>I7uic+Pa|IAmJa$PWgzsjZQK0SGuucr&{4U~b2~@iOW&!0B^r^+%}vfkU$@ zble>2VoM-WFHsw_#F+tYHDr?EWWgAP%!H*hTAUxBhy8Th4zJXrdxMX69U2~SLal^A zC&c5tuh8e6Ol5w`m|)G8e%ghA%MRV&8vda6Wa>g0AfLg1KrgL3_w&L{Tx--PxcsRW zbU_i*>+Rb~NRfDawbS`}*LtSUqm&{gkEq$8K(cI_^oH)uIv-F?vmh?v{0g3+*bS2% zZN_awCOoPKl6%Avzq1c!ROHFB_f7b3o1!&=bTLe%FSBVXwD%+GbL}hym}k67{o$$(0p|AqBx>%xKez0b}S zmr*Zt!5yHrdRA9sKG8gDM$l(->t4?%u81X*{(~KY%qfVhD*ffvJaq_gY4h%DpIEE!AGr2eYjf&z8R zbkhp;vy8mY`#y5BWm!LMb^>l9t_TCJe=pMx%xx5$r%N;h9_0{Wsf9l>!?h+E(?`Fm zBL9zmw-W}f3bY{b*~~R$MZoQxc9UTZ#XV7$=<4yjpuWk`AsIFGR+hhRYJeV{0G_ve z_3+|chC0t++=UGGOw24*(%}_Id_%6JZRkyOY_M~V`=hATrCvm;V(u?$t}deKVO5#h z8>$Gl8auIc`WDZCuRFlwe7j>^<~as1WLr9AJo(&E}L{mn^T;K^!& zpx*k8?;FYZe#uD9Wl&x&6HsmE@nINFh-;G+wi?;d15?zF~kC603sqQHvu(h=;?X zK&W_}wQv5X-8340P`>uH9R}R?$*1Bz zrL**_0#5_*eY2dCUB{yG@+eHL5o*q3OXhOq;8I{RPNLCY^!+IR;*3NbJFIlf@rP{l} zFAVxEGs%H=$Bw2JI*FN&Ht`^W1OE3F`Sh?eR9VejHdpmFSFJ~O3&1zi99*!FG!I4) zxL`l5JQ+NHw&@AkMw`#9VAjX?&}HcoHJhNhIj{bGw$ROZg3D%`q^w8#cDL&KqaogQDf?<;O8j1udAb;KB zlNmBsF%g|SES@W!OwE=6{c=8lbjA!)l;=ZE!6VWYAGIAp9pJc7N1(u*kI}?B zt{&9*J@~a3$yUG?U-A2yPZttMo1kU4LM#hp9mZtBO}n-(W_dgPvZL9%Eo>48dCu4CzdQmlZ~gE-MqI|V(~3?O>r z_d$u1O-_5ipJx#wjd=^!`NN+BK~cyv^cbh|H2H}cHbH}^B)6?42&PfRu?Kj~ zG?Gy$9(-c5tz+vv(wkjQ4rMd=7ZT_;qmDfA1>i3~t5b*8QPC&{Rf(-VQDa?w(r|aK zk^^e+p5lZ@-gc;)+X5J{HSX*)weMF`pP9rdpSBa^LBE12Dr)8-PegPpX+e9)rm(}T z+u$J)YqJy_-06hnSWf?f*fkd*5_s;0W5PCF*Gp5l)S8g@=97#tE#U1<6hGT)Nnix^ zyj?ICFwiChKa(V2iggJe&0pi1a%6W%aEm;l{DwXrCR|HCU+La$;82tUDHn4u=T4-Yeqs&7_T^r7_Hsc zUL&`C_Gwr&am%<78{SwUPF9M;#n7+2Zg^OY2kVMUhEbR%!)`~TG=$&qV3jSY*UcPZ`1mvj$da_}5T zU>#){5r?s>B3=~T8O z4Ub@6P+2>e!pxFEe>lUj@OfG7_UdG$-7ZT;ohb2;T9<*v1D z9`M>2cxpd<+W67LHFyZ?L8mc#xO1r2UIG%w%fBK-P^};y=;GoLa$0K?vl_OcQCWtO z7PALZD5ohvIAIH3H-BDLG~G)9zIZ;^A|e`0?P1Dg|IWscnm!&Houl4Mr(CLmu1ehh zJWw_2vyTUUEgs!3U6Z|Xf}cnVbwzBxALv|@iW~k=Cwd!V^ats?!$)G4UAcb!R7$gY2G;xc>?)9t7UYa#VLn40P&JuYmW6`=RaVCT`3 zF#AG-CeEn>>wB_b~$Neow%=GqYM5dtH#d>we+c^+V zN^B{2d<0BUrR7DuA0OY$TZK9z2NhnM$6-%gI(h{^hwyckhG)&)w%$URCj>y&SGn|8dWb>3WkX;`OnW6SjrM zi;jc|iJ`WT?RMT+8s*R8SL!a$XVJ)K&*n@Qmw0@Azr&`Q3Q-U4E-I*0QJ{ujf>v>> zT6A4?nhN&My&C21=?8_LW6V}!O?yV}(0yA>kQ^eH2Vhp~KE=>r#5gbNLa83-Oq2|H z!(VQhD*FyO zf2w*mIA?U|>!?2%dOlA;C<%9(C?`eaE$qF!vl@brtw)B|{`$P8L z*&E7^_T%E03XCc5m@_6FTFu_3y^N!?s(=@cZ7Uo9vA7*1A{Mvvb(wbPL5z8kl%j&g z7HWM@bg3k2NL!C!yOtBqmzlMS5AE{_!?`hnw0U?4WIt78V2i1za$13R3D+%&!Mw1S0PXiwPeS4UM-N+KyASbi`? zP#K`a-@aqx#7WA_&P2LB^FwmE??|Ex^ggx_oT^KT-G*;FcFu?q2#1~gQP>2PN@=|1 za=a1T2HJkV3FmM%#`T1KnDs$<>3(vHm|jZ!V#4<|K@W4E$`XM@j_-t>Uh#IX%wek^ zXM!rj@Hjj01vUp9kFUXMcKBO>`>j6|A#y>6M{!3I^zNy;zPIWik{DTrP8UNSAOBX$ ziOIzx#HPO843}+P=~X=U#qWg3FAEux>O4N_H?9bm;Fzu}Uz0kMduqb=z6^h-0X@Sy z&|^@x-s+F)yP6Qn|>0{?5YIqH@s zmK5o?X?Y>tj_rx3c_(?_)3|!$f#^^CNodC#1!r5r)7J5byH!+jRZ=Me;pet5SDA0t z><~`%?I_I-SH4t$J2HGDli~Mrk z`!$BNRhg-288C!E*H?+;K`&QU}FWoh$mY8+Qz%JkVmWPe?X$|HuSis1+tD*Bt zMca?2pe9tO8rjN$RPte)2GF_6JN(7aO5Ohm))u+_M9Nab#>aJ$$eeEvS(->U!>dZb(}zw*^8kL%!wbZCPTd zg(A)CY6Vpi-y^)N1MK*{jxbt&3-GdV>ACMD`qWjql6$*utoU9IQSos^3~1aM)5BUE z>xX&MC#HF9YVN`{V8g=I> zU3|*aHR?5CTMY|ULrD;f_!9?#OU(3rPawRzzqBm9{>#0~+?`QPAI(hNO-+6HtNO%k z1mB~)5JqTvOU3=dg=d&IVi9d#1W%Rej$GAc>X?yZjH=O-T9alXrTMb^H|~e}z&g6y z^>aSV@L;l?9)mbhxmAfYw-x`*Eal=bA|f?a>*N;MNKe})4OThZ`1~P=vS{>KCXPFl z8QZ5WyTx*3G*f}E50k5^y_T-eI{40qf;o%+p5Yt`4c|<2xx#S3{u}_$Ze*>LWJ_%% z4U5+A?nnIeIIlPa*npB;=ToJca(fhGp6<~mPl~+3sygG;n1~Rn zS`q^*l$xhN4kCmxnK+ja;B%JS5D3f~a>8q<7i)*$G#s;q%*N{3HeR40M-JvG78j`! z>*6^Df4g9fu{>Gz0`O72EEb&`>Xi4M#}%45BD`ta`I zp05vJDEi-icCeT4RpP2mfEkw3!m~{RRjviG;8d?BdUm_%BvY-8#!ebs_ETdPQ}=US zw*;qd6XD)2W05$D&Y2>Yv^^U7PPz1kAGdu0>Yg6>NtPR@#qW=%3HOo=4hHVYW#~B! z=wN9*W9rG`q-vAX?DkUVR6w`7`Wi<s1u!E!YQiA{ZD;m|jYv><@A7q@LN$x#E zX9=QW_%}_4mD$ zdV`TmeX2;Aip=i2=$_9~D=vrKUa@UovV40c)@Uf_mj-68j(Iv%r#wMHkk0b9$2PAEk}VJub8CaF0NoA?KU+D1t-CMd%mX*53gcUu?Ucq` zPdyR4Pm=8yD(iitTbhu{L>+B=8U-+o+K&ovpYY%sik`FJWnV$y}0X&P45V>^IaS}Cd4X42sk z_JkpJRruq_p^v_eImg^pO)9WtWR`kU-En%=8Pft{S@sc5QQ$k@qd{(iza=p3MY0Nt z2&3C99h`QPGWsqz#NiXe>-cbIk68{TdZCJ2B=SV95zeJ3(PTT7l_89){|{qd9Tw%*y{&|l0z)g^LxTti($0{Q(wzd*Al)V1 z-7s`GfYL234I&^ZLxXhp_i%o1ob$csy{`8!E@0+)_Fj9fz4lt`UiS{A4cj=wy!0gH z6^+96%pPlmLU86_kk~BZEDqgbJbkU6tvch*+M8+>H~TIRt2NXR(cXt^Zp?O9L4=DqSsz5ITgfXL|PiH@vRJ1((qyxkHnQM$HO-TPi!5LRsy5KWD)P65N-<62w zwoy|Xd8Pk!&*)Kjc}gTWjnCZ6BvJCtBUEY9ERtBFhjPjx6-2o*a`|)YBZ#H-Ryd}R zBot<9N$g>~?zvR+^f-a*3~}Zbev6~Z4nvRE$!PvDpwe!PP@Uwjt?q^p7&^5($1@&o z!`lQasr6D69Z;{X>e0PQ2s`zl)8W##XHfOVnjm;(2p}!l{m>$5G>r#=dm6a8Urc}g zlMCRL`_0-=I76~Iuj5)8(OV0>{1+qQncr_-SN=3f5Ut7+-nD~V>R=_|3tcNV5!gn+i9TG}^K0+eyXJl_){hnHG) zzsvML+-tqswfZuw?Jh&0)Z8(A5V52=I2FD9VvkFPAUBFVTy(<|R7a^spoF3<(^!WU z@k%`oo&3oFgxqEGlFjx;fqR%yDe$vFgYb+H^UNs*$ z*JCSxWtrc6ddXF7dYIsP^GPO}79TnmPW+)fjOltZ_3dMa?jVg^$XFeRgf?1k3-_X? zWde8o!kiSzrJi7Ch{#HkTkOG)q5IU|ctbVdy;hYL70^Afy?CzL79w@w$F~RL`Vkju zJLD0@E%M18N9x0$bRc7CJO};frUU-*JMCgitR7q-D6fkdi(1N#-!^x8f{eK+@5Tx= zgD18>Sbl42QMnd>LPxrBV@LF5`F!bYtczSw+bFp1q3t` z(k=A!wz~mE-rtmZ8N1OYO01mq>4mP}ForIoQ&8nlz|*=o)l=Y@^osOo%2?tv*) zn-P7Oa60b`&XFy;F=MaY69x`4N*O#qtMP9|oWC9Hg(|#LBQRv*P}w1%XHdpsXYx+Q zVk7D>c&qT7(YwnC-PQr2`uX^9g-=K>76csmj-cN@c|}eDaq72Ma%8wV?q0agPQl56 zVA!M?2_JmCHU0w0sR}ZF#6ALvwMKn)DpVCZC;IbzEPzs!9aB?V?~(_68Os+!eyx;@ z#2!W_Btpm@4FRyFH^KBBaEJ_$;q^R`ojEP>E|5I0D{^Zrmx2g?So8ZRaDtQ$xBetbgu z%oGAjuJ$RZxO*u}*Qix()7v)2`b9vpZR?zdmG5SlSs}R#&@n|E8H&+b#GDg_g9S07 zz5mgXZmSf*lzV;G7p5I+k|15=Z~i~Vf6A~g7*|*5hSJC+6jF!f*ad~Z4122_hyGGI zsQh#NHzMQY<3Ao&&zi5Xxn8+ziXllgyN;UVEUeS}oN zG$yxwFz5$=!Wvbu4(nqJuYQCeV1Gh!xmR&r5po+z1X9ZgdknXqwdw7=XuP>jQL0};7`@%$m~Qz?T4HlhP$=9)g5KH>$F}JGgJ7~ zzhBeAss3lmY`n#(G^}>y=W?l(gRN23qJ{QEiO=!cu5pHBrYG-b6&*#NGLUKCfJbOJ z$6RN9(u&FNdS!bxa_$i(%3ZcoyFQ1TN7Ta&&Mq@~IIN(fUNu=|Px)nMZ?_`zT;+)P(Wkc%-S0$-dXQbom&KF;{}`eY>OoGq)GBSg1`gr7sUjaB#rFttu)laRbptoR`jyJdG zyqs}FWI)aTsk>S#XOHE{)(`G=bSXY9qly;i5$+9^2EL$}Niy*`MHo=)knqg-#ou^3 zV~IRvO&pUwH}JYIu~?iLqYFTyUN>9YpIB~;c%99wx2+HeFGp|(s)W5mAkA`*2y#1S z$x&rn=Nil4LH*3KCvP^3vWeoZzv(1FV$Fd>3y?apX}x%NuvJ#^j$Jl;TU?94bl4G8 ze|#QpcfG>DeCz8W%rpFjKi1<{ z=yJ5kLZ3KXo|stoL##d96r<}dkTI)%Q>*L;=A>MCy+JZQ5VH#ptd1JvP%YgDjz9GI z9=&hU3l0^euvP~7ksN&J?`}BMm%~A{66Z%H6k>5zNX8O)+?T7PcC8D>i{4kCL~jyv zgh|Zo9hQQKF&m!o;LG7b#kJ5(hAncOwkO54E=<^E%eW{h2k#nxkv?25lOeo1tE5oJ zS#CMnZQ6Us&SO4GHOiQp&X1kb>JVM`25zoBTWig|-hf%IRU-r7p*qj8-@3`Np!l%2 zyF3fu=juN>d$~3fFE8-Tmv~RQnPYhcNGK7xMl;0{IU@k%t9nsSY?P^mJ)`jD1}$yW zjtP*gGitjz<+h=}(A~dS&khGNcZ*W`A!lhy2K+BACW>P>0PtpEVccW9NK(GxjO~Ym zcju>*ro$Qh;*Cp_9Ht$DJuWWTdf`PEK1WrI%{ zF`sC$t~DK}RunL!6!X3f3yqiQE>XAPK@45yr@e%Kym<99 zWWOyw2usNR7`4esp3@ z^Pg;MOueLwwh)yf65E6y7poLm$r`xguRDmNi6kelrPt<&G`My>xX#zyQniCKnxpHF zt*_=pzN~8to=RBI%%!PLIh9ckZGA8DGj^cU(6!trLej!R6Fa5PA&FF#L2RM3v{H2 zp_FyQ571OFP&%F}lRFx^qQE{o(tJz=wR^gb(0+kwUO$!RS|E(0*^R5}&AwOT+M}Zy z+cnM@3I)x7XX4Rwu#&iNt1*0=#TGV7vE|J&I1h4qmE7eOtYYV3mq^R_smmwv8*Jkn zWA=-EX``B$9#}E!Wl+>Z^>C)yFTs`*NReyVD`aZGEizxgVMm`LRTCS_P*s!bg+Amz z?+hTN+0uJm5dBIf$U=jgreeJlR*Y+%>sqftAT2)UI*DKntE7z8lW%c9p{aV~7>}q( zPJS^5VDbByBQp7BG}tiTp2=x{k0jL=n+^||bepNRs4eDiQ3Hq5s60y&npmZriSTCS zU}MZG=bG(G7*HrBZ%VL`S_85YJ>&W*|q`pG8eR zkx*oQ|HSh^P94mY00qq;6YKN-Ml3W1b->C8zO5e_&2~z%KeK!9fEP|P$mmWv040<+ zU73NQFPg9ZsENThV4_)Sk!tf;)>%Th6fI;|KF7qTFgEO4IdxxO;s8$fPa3C&tRJpY z)m0Ngd4(2wBE>AT4LbuaTc42nA6O}Vbt3!WHQ2&_ z3CQ1Rx7w8OxnBFWXF==Q+*?2j3U5nvM{Zi+(gZxsEORSWBq12o2i8ty18S- zVz8s<3}Mei40i7v58ZY-Qs^LKa&@VzbRAN0uidY~Q+~DHta}j9_2TzvcPr)!ET>n& z=XRk88pY3}*C&)H=*zuCa}B=~;56LcoGJ`3^wv2is~o!ziTMyE&6Ds2;lMBSVR}9{ zPRQJ8K5>o_-#MjU6Hs&1f6G}Gd0#;UhFa*4^ZJUaj9^6_dspE?gWh9V`(zkBy@^Wz z!(Og;TH{|P*3$3r^V&tnr4AH5lX-v(#hMxnmxrvCdHGn8;T^D$6LeE)H4rBezN(y=;P1NQu^vbBU+&%>MMX(@qgZ@XAJAbL2nhlkSCJDPBTVkUEY zj?nOc>+B{dTZ@j(h>rA9_DQf_Gt^CGyWfG9Ne^1H>Q-xg9b&Y#VCH?JR1ZyN`I<&N zzPd^qj5(>JpLtHn6OelqHte|#@a{rDr*z{3{Kp@fNLwo1lg(fo+ZAo6pD*GkqYWzw zj@>thm2HpPl1b>W=z|vo9K)vWKBq4Dwv8O#ZQKCW=pMl@gXW#>S~lT|51ieo!w4Q8 zcMpz4T-50m4WxoU3-M6t9b;f7(Hbf%g}}U#{W-A71L&6Mhy)Gm-#OkKFb*c7GiIez z!ZxxB8)(DeZS)xt)rLw7p)}PPVQ4qBH=&GKoN1S*v$mvX1z4bE?`aHzS{3OihstrH z$1hK%V3;_YGhe}F&q2@+iv-ss&V(}TQd5q((gUCMkL^F&0r6Q)NZth_fAr^HGC+KU zpOXVSiGfd--@I1ury=(?2aW>s>cY#twd^m8+=#K1REldyPuBy$u&c;+@#j-UU*vPG z9ff*bL*sw|`zd8EFk_Bu0cL5KM`c!yQ=&~S-fAp^19d3PrXJ&{#E*BsSza$%Tg<%G z`<_o9HmWBR6$si6a*s|VR6^ehvt02-wGtn-=-O8uH6;iVDj%@6o!J_)hFJ3Gx3BJQc=>e4q* zsxUBrfa-Xo4p1fP!NRu*(m@Ht_e!m`T@-%K^hwr~CTyb+URmvs2pERuDHb`-Pdq3u zv3jMB)DarJc#6quf+u7zIrquh$3rl6Lov!Ll^jS)0*||82nav3eR#7P04{x76g3v? za7Q@frI|h8MHKPe;9<-=GTNb9>jNwbxP?#E0kwe1A)02Lm?_XRN0-O8L2K2RVar6I zw1PN1Tus&=c5w{ny|W6TX;6sfau!XP&R5*4`b-x#YSZjtHTjWBKMp-hL_po>t2}i+ zE(Ej?lwgv-(_Lrn_ESn|>P9(a-4tj-@#A7Rqjq{Pg9qCPV}Wz_H=ImrXZ9Pw`Y;M7 zV)sA2PcPeW+;E`aZ95>5ofitlTbN#DUcRc_o36tzs6dYeAUGA)EB$8C$GGe zrRs3EJPsb)ZVOx)sV4ex;X&WJm-F_OxeUA9$!RWx&}b0dEElwqI97h7DjF(=#X^4tqp%8!#lqX|mN-EANfxtYsYaa?k@nfz^#Ia%T2VP8Md5M$ri z2B09?XA(p1b=e^f?%MY#K1`Ira1~`92eluBo)C2@DdcV51WzbrF|6trkZ0yrN*D@T z{9}c~g_CfHlfa)pQ8_y~;qeijT>Zp_^784(Cb5ovIqR&P_M+N;L>&=pEdW+% zMuN>$43o!dnsfBs)D8b(q-^fd$VV`YU1PI@@JEt(OK(4bY4KoulY&d)=vwH0vQ_ZQ zPCz+XH)RTw8i;f^D56RDJ_tW}XSb>Tv;e>^?RY#6m(ZcZ0QU9J(d4a>AE;!2=!Ig1 zqpX*bw(|0OD}`6Nl3IOq-m+^5jhyoac3;dT?v|bD4ltd%CKx>37pr#Aty%xtJJda3 zxZt%mg0pqiN@mRHp|Y@bK2%qD3%cal$g^_TCg1!<5%#dwU5e%n0evS6MlHMj`V%eN z7#6Aswa94wYW)bvSh=tzvh~lZpF3_$(GaDbQ)1IK!$2mn{9zV0r5Ea-w-UN8tW3^* za{zbH8yas!7gmX@(bp1mT-$b+J3GJxZwYF>yD0t@&f5Q6szM(RX8wEXtAiT6x{dSX zxdRA}4guNa*o-8IxRmZ&jKPBNt$0zL=N@hM)j!9F0{v!#*T98or7)eoP4Xoff<&jb zV&@X$`{dcSVgVbgs{#2Wz&6fhZPbhR5^Vu8sMVRt@IdKq5UME90W;@)Mk8audBOncS>o zHtqZ-*T{CUm+zyw$SZ)841gFQ2ltw0nZl$b1kVhB`%Gp4%-+}Pq`|irA)U<-u_wATCvSyvl#xt@5Ld;)kOY+ zm#9uq_m6E1oXvfd{B7D{YA}q&|;r#VXx1(owfm=6Qp(3pRQo)3^xe&cS{j` zA~|arBT^s7I#1?IN>x2 zXCsdouI|nnPm|xM%!e&elm{OZKknF=difPAqLDm;CPilT3`@_`U32FZy+>;I52oMV zQ0lPC&8%Bw93qKIG8j8WW!eCg*JjRqCAe8vEkXSq4E+jq!^@X*E~pE`o67j4Jc~EN zfO*?HH-8w2yAf%`9@%jAAQ;zF+!H003O%7b+ffDHGC`SBpy$!6YN(RQH_Q*rY@&T^ zA8jWbLIY+s=T}r)RkmU=74uw?CHkam;2Gi%zO=jc;Ah!|H|;*>?EHfBoIV@L^wWZZ z^qfoM#CD>(9@n9y=H)Ap2SjJXBzcT^NHb3j!#(BAJQ!S4TJBRbe=vVO657iV|@?SDh-gly# zU6<)6H&Y_~Z*n6i8Lq6s~i<3!*n8uGsSoIL=(K&g$hjfH8sR|g@`e3n z_~UV0D7P6Zaf9S$-up#^I2kyF{cy3x?h-{!+vy6^*X{{qv~CX3x}Dq?UJ}m{c>o4b z^Km9j`qF88^-%+&u|ffG5S0|;x*OCHUP*}j50WKlE*|b$#AT)Rp5N!DKKUd-V|HGe zj-eQ1x1N1^lo$?1!l$68!YoEmKK4pzzKLpJnxo{1jA}EHE^#?dWoUQ+qYec?vRfjf zR#;nvwbHtAmq}2a`sME!WaaK54kBoWnRupBlu&|PT_9cmjVIxYxzeqAy9xmeo#ghk zu8qeVVkrLIN9F6C2VO2qf2XH>nc%^g>vAODGgFwnMb~K_vd!@!lgd}q*3Hir)--pPL2S;zk0v-iH6`X{CWFl(CLN*X* z#K~<;yD0r~+MVN%@tLug@73e&-w>}2LTtkxcy5&xJ)X-s4#y9}>34EsTe}QMVSaIB z9qZszF&h~@)?<64Pxg5DEVn+-E556=kC3}X-0p|eKt!6zNwvKpY3vlRPNL7>+Xr5n z7+XJ(eLBOC5m3#1pV1c^lb@X_kR`U{#yX*30U{jH55K3md_k@FI%f|ofqWB{5K;a# z5y!M|uVd(0)aU7{?%b(;;mIq)BP}=zeC4>Ai+$r2E+mZtZK?9CQnm$bn6sXV6aFq) zpc_D`08u8^CUD@7D%U&PokzX_%1l3rR1Fs*@mQ5}_SBEH@p5mnYyoE)S={pz0J+Dj zG*Q`aa)0D!+Po$Ep!B1gSl{Z?t7tA3R{n;Urr#jT>9|-S4D6R*3B6{JHeRVj8ehwU z-{nF;L^-b|3F*&-tQs=|Zr^WJ??Zrk<{a#yo&(IJql@YQncO@v#f3tKGY3Er^7^ScJ;%S4i*?b@@N_4YrbR^9y+W_ zk9Yxq$?-7;f4MtGo)?=XTs0_PfFs@Qs$w7QFgwG{SB?#P1g}l*f|-ex0zTT# z+50PLZ$0)T75w+NLtQTyfAgPyGhgZ$_w5doA?6qVHslF{QuSAsivIW}B7;C)g?rqZ#hU5$Xy!0URCh=%y_b1acD2J<`4EK z#s6XBgaRTc?8=2xsHA~`yvJ1mpqUa^ipgMmB_djE`kYbXb0tc8MU#N*5B3L1Kn0}5 zy$0}hukt>X+Ws;cW#A>|SAujojtH3zQF{XhlZUabkoCKvd?;EMlBr;<_+s#E1$+=h-q*ar%=bR)+ z+2D3-1IKCVTFhv+kEfm_%%Ru!ApC=C;ennM^9NP#9-|ZkJ*P}#PW58%UeL*x0^Mr! zSP+hV)iXgk?fuq?fr-wP=YDX(ZZ140s;xSC9a*i9$ap*O_WR+gKRJ)+XT2|t~GSpyU)o&HVA0hI6uF+yS z#^<ijyz1S+zlDU*Tv-fS~QkT2$0ePA{r4Lg-`SOQVnT*u1A}#POi|UMGn)t;HU~ zN3XZC!r@x~xhPT8CF2o~KJa5IY^*Q;tk{UxWovq=s zc5F9ps}|>^r@*9yqDyeP5nI7nHhrw?(;}cn$@s(w8EaXr&!EjAU348HwEK%}RtM~vTR==!v4HD*F>ai8#UI5BhcN&j&vYlCT+N|viVA|aJQ6TJhxJCM^IUN4NKK#p! z%-fhCUOb2y5E5IVMYy?V!PXuTm(+7I% z2jxmV#s^CklM=23QGV2bqIXjz1S?KMygVgAP{3KV2OWc-=}yRTaDMH8Fj97Gp=Pm+L46*kRw8d_?5bU({on7lp$_ zTczm-mp%l<`I)Imk^K^x<#%p-y9UbARXZ{ciA{BmMkLK`j7XP6im|-w@2cKrpcVDX z%g@2!AgEQewRDH7H(qP>#fIM0IaT+?uu zv$d@rJVF#}YxzbVyraY^>b_6bo+gAJ`dZG(d`M7W8&&KDvrwo1kW4^`lt~DpWoZ>2XTf?gj#=uvp+;2AkRM$e3=#XHo5{*?a_R zFa0??u2K2g&0nFjN0`leJQ?8%DS9d9wdwMtKiG5}I2L;15iS~2g&y2?2(ea&;Qh9h z`eXtl0&XnvkLv^X2I=ITn2+a&I_V*MTM(?gxbw^)-f|P0w^rLFVM$r%(yLT_VDsx4 zpAA`j>VYp}8gsfl}(_L_*K=Dy|T+a5F zO%C0;KCuzCWvkB*bZb%Bw?AUfGPRM)+_V{Xx@fgr8Z6rJTNmMNuyOCinbOSt{Nr%X=wY}!N%JoztkM{P4)7X?!#>=jitdW(Ku+DyZh{A=E8)! zy0$bSE=%Qc=;yhIAAo?>%4S8eZOMgoe{y&lk+{ox;w-K1SjK35`jIz-awf~D4!m`s z$!N^JdjXB^mnIksrTy(Ws8RQGa{+A!zb3mPi0qJ2&Oyi~3*Ey$@JEa7-SHrQxlYGn zWDEN&y;DDwnpdQ#>f~;50MhM99VROCBc4Mjkztc-NKcV46x?BuTZa9k*FBBUsuHCG zhbb}GyDOO1`}Zj2Wyouv!R2QJn9`_SVS4XWNK7R@IjEaTdhJWBRxEA5A&yTIm5IvZE3^IDeTwT;jqeQKa+5J7_$gx z&+|k^V}&EN$-(1RZa=pIEba3pb7#c2lNDg-GC7rr->NBU9W^GpF?7^E4yD%$Zq~dc z&aU>XC-f5+z1zNZlYGW@(h&I~$0~=gxXBvG_UcR5^#;DF%mC0EXfiYMo(_ zD~1Pv#;nRd#jj*n)c-u?Uo!^l<=tn9fXLbxizsn=j?8GTA*OqJo9>&Zt%rAIN@oG< z1TkFlVWoW0Me)&#K+gSdbp(KdzanDSNpZzi zJ1+s$I?!R?x){+!#wB4cxPnh#YZkGVn_WaLWwi=ySX6=G(i;oD?a1K=bB`~?B?|$?UlKWLZ5KvpQlYwA#RNjwemQXMM)=lb`OWVokO!K zm*u;H@4AMwsOk@MO=;82TQ>P?ky3euZeF&-?9$Ap`30}@>GO5$i>(gUa25>c--wc& zTz0;|xgug3pmy?Hzuxq-yt#e;eYTcMr%DGMhVE5ovf|>`SmNG95uOQtFH{`FMT|os zlH&k^N;5z>=ix{a8N1d5yidOhrB8&T&dqfv1|^~xy3N4NUK8Z9*WQF#t!_+-Ci%95 z8FD?OHctwch+qBQr?9q(^9EoXGvUOK%Q@;!5f)(aB(J~irAwsri-W}MJ-B&rIw@Y;r)u<6KJ+Nw_D!#!nI1`V-^xJT4gJL za=Z<+{Ty-(c>5i4Ges#n)Q4EN(U22sldu#otE~Y8GfX@R0nzG|?%ma6Ya7~@z3Rb3 zmv5YT_1@G;1!^T@uia4pDEYk-5>$-(A9}YFgvHf}hW`m!DA<21h*-}~%Paahuhn!+ zieh&LMmP^RCSK;gqC;6g65 zW$KESp+sG04(N|6#kTvlC4gpZh{bB+#Ht%YgX?LCrF`6sE1~=AG`SI1_2kJbqinJ? z^$9n42&@>2gd=ior{OfPB2W%-dIPUVgiW0IqCF7e2<$Acc8w_b$RD$R&?*;U+pe|q z-kpV)6{}0u@$1^@+Y|eYrtdFSSDBvx;HD+x@035`JYFhk`*gS)@Lj982v+y&P!rP} z0V->qlYDdHkaSKySB$iEkAtculP03NA&EE#{#_jOh}$zfGY8WTNAwHB)&&b)@+^@r zsFDoE@EL$ayrS^jdPAJ}TYc>vukX$cptk8yn56rn@nEn1@H5SZ5Sn`1fD*cS9l2~y zgVL0D4jl{@Pxdggt&|va68ydf`$kR;+$_C6zmpDy(LvNTN;qx39(Q3>d5>>LdbpNs z!cRL6S<1HUiilVBu&-FW4pwo>hy>cKT4Mk(%@5v$pq7}&5h00qdP#P&Xf7Wt3Sc0p zqEQLXOQ$XzR^o0Al8@(o(N|n($saD!XbHj_DZOs=H24jt4wgB8OSZhH^)7C-dL)WeT}?%j$$mdT{o*2cTd)P&9s=sW*WW7;*zZ{2J7*8MH*ROQ6rP`@NWEXU zvhptqwJ>pv4H`HE)Pr_f=&Sws_XXq`BXmfpggQgrODIMU;0Zcgkbz)TOkRm1kId0iqrn=R z`58A;5jM2-Sr?l#n_cI~14DP?gTNhR5iWuY_IAV} zX9$252%nE>@g9@eU}K=briVBM!!XCqvb`oTup)G4T|zD036R1cqz_2&y!!!KmUr1% zRT0C(F#Xxbrurx<<*2eK-P#WwKIZaj!3(Y?mO^aqo{)M>S_iN-`I(VkG~#|hiSy4| zyK);N4cLoo+G~B~8^2{4QA8o+elDGJtUhJ`fjTS(7t2(1c%zN@*b}#>&Sosu*)Fm=4EZPrfa3&s(QCbY;mmL9P>8MV@{-gldBhX49 z$th>1=uui}AAA@v&!jmvw$__lYWn#7`#bzw&k6Xi+ieJk`g*o@%O`|25|41A<7Zm=5sv*nn>5AqCm6>lvqlpDSFeug$%^@z z1Lb7uvSBnsUqqH=ghN;+*nL0K=c(gie$ZkPzmf_P)oSlsz5JEwA&FMY9#woaGDU=b zd?PZKp>hd;PsiP!@__Yl(Ib+3)j`4Jr=4E3hW_{sjAbc2lD9+bgxh@R_8S~BT?f61 zA>8s6G%}wD1jN`JNSy|VsNW4U6Jim2AYIWX_fx!DI>$TM#`kG2Yp%9j@KosYDnW_5 z+S8}uJd_t|fMo0sFgKvSS$mY+%WWpxO!qE)l}J$Jr+Ns!LNN^&%fY~~n_q?@7|DTK zn>z7U98N?OcMd|MaLw@?#=!^Frgqx4?WTM)Us>!;+6(DE)tt#IIPq$y? zia~e)wty6w_xTbc5MLhm>i3suOEuJJM#3|3t!8vGpux)LqS;j({`_n^GrT{+v`uO? zVv)UCp)uv~YAMAy3iP8)omi66tGZaL=KU4}jco*vG}(oZa_oxnX_@{_Kcx#jRM-%9 z+m1RCL08%p?Q?B>5UzhME;asE3N@UN_##iUFR=lUeRo|{toA95Cu$qo;1Uo`dAVvP za+T_7n{>W93E*;koOO=Gnm^mf#x*iTvZ$|K9bxXr!J|Fr6a+Tu{OpN%E9lvfjY*6} z8?`~oW1G?XD;$JfnrB~12M{$_T`jhJxU(+S>d9TyB0?(FE%5MZm%Z$Fa8uHD9YN!s z#}Au1^|#Go7&M7dgwB!}C%mHkQB-vKBfllkwuh9Ilc^!;(IGEoTejab5@j zR*i3#>6BEgOwZSLwXYX@HF~j3yt*_Ca?ICJq^BFxE1$>J=4d`!^)?jOdV00jCvtZ& z!r#eSyYE2Y*Q?Pu{7k?p#{5p2h4#R$t(_10Xo#bJfUA!meewP%6s+?V~cq&a%vrYNL0nl;6jyPD8C@DV5Rl>wUth#u4mnT@S^(LIdqE5vw6D=Hl#WVae5DS4Q|pW>%?KK3n;#WD8WfPF1U~)9?-U< zbN=5Cy4MDiVHSw5E_(z`GOHC0chbUrG>LqaPajJ7g22(}WDb4Q;#$(rRM9|@-3qLK ze3jr8QfDDH(T=c%h04)!o;PEf?hj@5oNrJ3EKP9f4Q-KsDeVfJ_jr)`JCK19p@$1wi!V+GmImN<%VXwmY$$xb}W5{+){UMuT0`xwi`mRX61@merpkj=O;2!3L zA7K13pze?DE8WZ8d0wQXKLid&7eg4|*ARKA4-K2v#4`PJ&L+5a^kFduJ%=T*lU}yx z78W^^n@-(}@(p33G?x79b3O9Ugi?jVZEn72BKC^()&zbA}MDZX$8Xy5+5!FyyXB(B~jwU}D4KXxaL?$>!zgk?3H;-m+ zn5X=#F*|Z%bT6wMR$M7@f?V(K$qJyGHaE#ZO&)GVU4}5En0?egUh>D&0I~XsQ$093 z3wB?mXMa_Ybl$7UM*x#z54e}OA50<#V4O4Booh%HINhF70IGQ`j>GrEFhB`=>IcL% zp$tN#VImZFX7&TwyWq7_hxtFATa1fNM<1q=$7eH7)iXrOre>wX4#3=KIeqk95&GRf zd2aiNpqO;R&;KHoe`!yU#65i@B7`=ok05*>$W3%*d8Cm(Hlwk-fAc>_4op&+HYN!i zhGc!65}G=jtm7cfkg+Wq%1A$zT6zui+n4*_+7H#gNBAPkL|A%u{6!!BWite%NB|E7 zF_4KFQrYJ4xd<-?3O#EX$bYsgU}U~g5AdM^&$LJ&WB0&aMoJ~<#LH4h^Te8@QMOk# zI+@9z2KLus{`I$<48T~Fq|iFlN&=sRh>tD}{C{uylRf`SBEUx!LAVC6Vwz)`I={aN z;jd5s^KX6x=$uLkNH667%gq1$^gqNQ3KjJYg@uiV&prB!j{M(>|6A^VdWkX>Fd59z zm;Yxe|HDiOA3kIVV;1LdApP6t{mmbx`~b-_i7wOq4^RK&BPu8;Dd1A{mOkr0E6bk- z{U0x(LPdH*Q1Bo!{y#+W-xp&P=pCqDzXxYZ)_P~rXC*YR4nO^?ng92vDSib3i|Oye z$rt^T%A`Ri8rFV+8#@ril^!veRRJM8|ivIgGq zhJes|%C7rAg!*3u-p2uaW0hEcIP-s7B#csPH3JS@4}CB4v*Mh&m*y{_y0L@!E9`V$@<<6B!aG$J~xaa7oi(7 zHD$%xb#PF$!W)!U?Ix|}iH*_+(jQ!=9wK74dedVEHh;pP;avb1d^bpvj2ipZZ%!qE z(lw*5E8gQa;u(+3@47{AL?3N50f6@N86N0^ew?lK(3G4k-xn!2K2)KD(LXIIJ{+nYyf_nBu5JEeRW5j zG?bd;hmr-btAr0_mBJeYGFF`b#teT`<{OYUL<^d(H!+vh3Zl{Aa0Ahft-NHizv zXM+(T`10&M%#N9VYdOph05ehbm0w}_m#TM1v;&_cbkFzP=oSxu}{3Z2p$@Rvr3g( z`gZr7pz&G)Om z?#jUa{Gg2st{RBX5ca#J-uj4P>~yW|nGIT5wr62|-c1v%pTc7X|3LNMdhq9!prXIu zgHhm$-*{~oSd-XwnSXUsE)B3Zl`BFW`2oYg^=}7QxVjPD;Wz7tIRV&sZCCSq;zoz2 z5>(_!g!a3(03gbIzOm*UfNgdGTpo;oKGP5LuV;LCp!!P%tH_&WX5P7AtfOuIG^W_? zwat9hQ`Ced41DO)FOHPMNOPYnRf)hbL86F{hkxtMM8)nUlViuoVuk1mMNGU^7^1s8 zsqkSde3Kf-zka^~5m5L=k-rM_x!KlF^#=kWy|G&B+54lLpB1RM&++bbXBKsCh}?PF z@Mnh#_4mE$TGi^?b?8UJZ)0s2pU%~Tg$XCa0z+XNxz`6Q*4>O1tp!Q@e*VZ2qN&urk&}DPN5gL}-Vm7P`~q65e>I3m ziY9ehwO-~FZOk8v<*nhI+*4RUoR+nq0){YfBcIF8G_{_&U4sU%nHB@0#HaPm+%)X% ze;$hdvFVD|-kUg^zuTLU{tiL^0Zncsrh7+1ZNLJP*G-)c+Rs&!4 z5ufoJf^MAUpzl55&QI=aAmtkj!eRsY^{W1axdH4Rv}8{dtw5ldp#MA+K2y&HOFKcOUf-y@{=8^}3nt`7Hi ztnBA%*&2aq#Tuv&DCYJ53!Ru5YgwKJ25tX}dXF6ycDQ^msRtwbO>YpMhu)TuU(q4%oY? zjm_diH^o-~rS**&#Sz06PV?v^L5@|;!!Zs43ZNi_4=^zuS9R)yt~&sILf`Y~uw8sM zh`3JLUUP3o@t?3BR3u*lo841UePi#gCOqR`fVhs<69I0e86UHE+>+z&06(wNU@CX7 z4?CAj=7(`<;N*Pz4KjeL6lg}iCz%j%#;J3H(0)^c?38n}?50mjuz*^F`S3ISDZVuB2T3l#LOPIp>lIa(%Wa4>tbuU8lsMl+O}R4G7_5RUIfm^pcI_} z-pjR5atRV`j?5`fgCl&N!=?8ToBUb&HGp#D8J~0C{uFCLXSkLL?8T`sD1EN0C@Ehy z-<;0s4W;pXvKGJZ3EP%lQdrJ<@PP4H8X~4rpl5Ph{}Ui6e{;L#mUm7i;xyt6X^O*~ zIRx@qoj$@AZZ9QM*E1ZWrizvFy1e46*&9N#0s11ZTOf7h>T}*nS?+~Bn2(s=9?J`6 z46TF6H6p@Tp5NRP2)-LPx~%{lk+~a5+crSb*oA{d@P1eFB2MaTQBpzh0J1WN+Pr@& z-n`d#CtSXjI|bYtk^Ob>^v%Z9BOD5{G=+&s&oeAG(jzFqP;W(`7HUGW_GTJ7oA#n5pZVxxd%k)uH=Zt=%zm=Z-nR6SlxE%Y_)h=!ka#cMwpCgy z5ae^bF?M@}aWN($7_A_3Q!TApd|+&WMf!7PQRvjF%{V{4qXZ-84FOn+e!S7+Gy zDDUwEqkI~Vx1RHM*Hk`>3|Zx<&cE}P?dV-JxOcMr zyy5-CV(^Y9s^TmK4}>O5-uA{PJ;^mV*`0rt)0N}al?mML!2iO>2|1r|2+c$-;T}Vi z6W9P8ES^B6RW3ajJnnAJkau!-zGMb~rC64Gqt6nHYdt&RLbvD3t+4)@H(>hv@fKUR z-R#)5jELOL)u8JelBns=I)Ni~SNmBiUTj5qhs6W9rKc96*HDav6nCMffAB;yDjshe z8YXjj0t8pjOaoU5oyeUW5&?Q_cPbLt;g@;jhnUJ$B=n0TSZm8*{}2Rf91Vt=yF2dd zjl6r_%M(x^QB0MRa&ZHtQ$0Y%kg@ft?&(S|W40&WkHB`J7?3-K($f8PHRDY>qep|1 zZ5vK0z`Y1h|(b)v?b8StGA|8c~qvUFk!_}h&4{r5%+g2bq3FV#@5Lza~b>Shm7_J zQG)g1hoIV~3^B)+b1Fq{pzI79voI@e940{_v)4FnxxNkx%emMB{g8gQ3$>}9`(}a4 z#UjwL$}YDLG=g{Z+egR+1q@V~jbz2{d_z^D(=~u5<=XiBKB)SoY^zOHt*gHZKV%y) z1_*vMq}rc<{U|xX19mnv{YB$0oN^`Bw>5?6sO$@m6Cb{@xI#7_=sr}b`7#Po6264i ztPXIry_s12AlSY&4HfoSHw}2;n)`K?{Tp7lw0QB>j&G1TUX_>e#zl7!PzqG{XDBVN z=Y@j)08J?%H4XlxDsrT!bh0##h=OUmy*!zC zd*g+1{6aaD;l6Pk2n@_Z0P=3E-;rFvPl<;%?XTx`NNI`+hX|c_jjT?KJsVX>SBk z@&|bAcWS1dP4yq5IJp7Ht{Wi?I!&r!p)(ynFCy%hzaCJlD_y;mAvO|keEGZ-L(tD} zdjZP*ZV;C-%M})jCQtW}4nQFbP!skc?lbQq!uf=uF*fk)7D^R=@0&{u=?5j>NAs$| zpkfZf5<8-{yPLfmXBp+Ml*XMOpWsshCw2zrEnoZUDLoHU_?WMX9mZyDgx+ayT8BLI zFI2?M)#4p?*Y<2(Mg8Sg8S>N#mb$J}A_=E~=vo|IMc@a*ME*L|Q4yc3*~RB|oLL2l zNJyGP_dv3XlcN=-p zUH?ZhxBgn|*kt(R!R6P2k=REXvQzKe9sCYh=Lar4SPZQUIY1>;C%q*5aVvHV-T+J) zrAMktiaIM9P?b57JM$)$k60E5wD){}040IPxnt!AD40&#NHk#m^d5gYFDtcUZ$x*y zh;gZl_YhJ3W%zJiUeJSY(eq22LMR2LN0EUoYdV3$ZZ8FM3UL+X(ET}jKO)ona`V;bt~rrPBC8(e~%6UMXA@u)rj!bo6KjDzYhx9hzp>x(Yc^+OLV0a4I9KN zV&0UOFQsL5@+4dtD%x)UA7Nh|R@JulD_u$>C?E}s22r|MbS_W{X#_+Rq&o%a2I*R~ zAl==Kq|z;2(hYa8&v(ANJjXu&zi-R?0j zT<>>bByEZn4)3x6);!My0s1vPaSQS)dJOtGwC7G^Z||e)=wdP)d7iAO{va^iLi`7v zmt~8{^@j2d7k$r2zg^9OsLW|~{NZ~ejWuq$vLAX$LF8_>HrL)KEClCEZ0}plyS9M0bJ+-`E2MmLYc(cR-Xl_@=ENzeF8* zh7pah<(KPLSX`?4&Gk!fZ@1wPc5M-U0ZOa(PgzOlW;rx~pD1|K+X|OCelUd=3+48* z^9#%gl|9u@|EVz{!9*;sp3MW8=G?FIf=@GB=Wm(m&EWueF!qw_g5WUf0}l1}fYFvq zHFGe*bEPAilpc;Cs7Bs~72an$W&EDC84@@O_R7d&#s z49Tr8$aPj}suen_Lgg|-C(3&1Cz^16axVNAybb|o>X{KKa=YX zgdoZiN?uK*7}cl>er5D>IS0ZZru>b?c=h?BVy_hdfz6lcT~>^C!IqF@E>nTn_l|(T z{7^@Fu}U9|3vZ?-;D3VuaMoF9-lnNS#Tw6tl#ZR#;|=pUbs&h^LE-#?U~Hie%Mu-I zp~~__ALYHzM~=d;bIatyIP*INL*rgABmc@vL0tr?7`~^EW~4_>b;$sE+AVk#?QN_ zR_wtwURjL$@TT0A8B0uGtmZ4TVA_3e_^62$a+ao3EI2ej-iaxUO-g_U;6Uhfco-d+ zM5Rg%Znnz?Yv~;V(Xb#5P3c4SFxL?`eGqvQXg=xaGoGiFGwe8i(9sw3LPC%nX}qD~ z#V0IDLOMF)7uSJ{GM6IbgIFgrqnEggyz)2;hGo!j3u+pwjFsyCPdqapKf#*7_CZ~G z-BX)%K%!oj%^@|1=y$HSfx5MmR%?Y0J?Qp_5Wl%s!>K z%*%NP(2EhAYKFcTmv7yu#0&HdAxeZQ9&)d6wzR50{+0mR?eH zk%U?8;(8$w))Jc5P$<(vo%zs_4Vz6GuQq5@Tqz$0ac;M9qPZ#EYZ;23lyu z%q7DRgSF*11ziJ#>3YJ4H#PJf@;l^ip|nO|ThT^w34pw}s^7>?q>kFO!n3EMg|w*Z z`csEDy(?_TYY(5hIZz^`+acC?t!k*bI9zNXu?Nm~A+-H8Xb)>9w*yBXATCU&*U%8l zz|wQ#j9%OpY1fRbyOayO!}bn(;Tyu=>OCk4l(z3wcVVGhb0J{a5Ow~H(TJz-_PGf% z(>mg(Ghb~I!>J@n$eJiX!@{p;`cJtPedHvNr|CvuDj<0oh-0Tv%U2`8=>-ActhD!eUgE> zlO#9~X+Km2NAnCEaE{!YVS=0yrSR(7PZ~#<9ap2*;YunC9Y@2Y04ZvsC?6zNolRf+$euKZVxAP|(M2=V&(2qkL`5f_2vn5NUJYcRT{ms@|Cy-ZvR5XQ(@Y^7EEz$&!lp=_+_!h?w z&(u6FUQHJ{x1p1RD}*2uOZAks?hS^2$QJ2^Big z$Y5WNZhw0U4pgR@=R1}ji8j1xuGvQSna6Ax0hQ-LbOf!3Ruf32_|lugA%u@}NHy|w zfmf%f$FOiSA7K_{T%aW8e!U8oKdsAW17&J*>3$3tyi2kg5b8jw;*B@esdp2sFo6If0C<08k50v?iEbGg2Fl z)w=;{v82RO6zj&6Gff`1)o%iJr%yty?9!`%Vvy)Hyg)M!A~*ItJz`j7VhySA+j}FO zkVhI5`bfuy;b19xv6$ShxJ;ldXb`-@yQFSV5V{frdCY0(Gi>qWNj1gg#a5A!Mxsi3 z;S?Z&XBr{#L=>O-Omq2W?D#j7i*nS+%>N7{K^7gS=c%T(36)^AQqc?d{%BldyD=gv z1hbsV2A}5_cSx8+@tw$6?sJ1EdJ7*dz)cn2`SF8brbf%M*#Dn&x}(A zb=2K=TA0{ti!R~IDFk1b{^RqP=w3??E!xs1a@@RZ!eu)s!90QBVJK*4!7`*!-D8Zy zs5L}~tPX#u>q)kDLSeLmH;Um5ls0WLG#XSj-Em@jkCB_X>~0n!`x!$+XnihQAm)pi z(BW#UWyEE3fPzpumKP_~vFad_;wv1yW8q#@nOg)$@uXJwVHkz}mp!TduI@%Aejxm6 zQw@c5W_aZ_rWoNJ71gU!Y!NB{QNutnulGw?P7FH{qMYB7v!l3@01?Age2?wC7?Kg! z=Bv(T3_@uy`*y~_m**e%bHdPk*81Z!EYLz`E zF&}=CMP|!7a();H8QJn*`+^^oJ33Wie*D%LpRN6H1Q=sx;Ap3~p`el{R?S!k)fx+J zx`ljnDu-y5z6tOmo?0|y?1e_y$@u8H-kh%?@pfqzU_SRJffTGoj6 zTm3_pA1tk28er`R^zA<6VaaxRJ_8(8uo=sOA}zrrWEoccW{`#Cwc=eEEXGT0;TO&` zWA=bTcxJv0fmGjeF3FX~BoQC$%YCcJ&yWO=d%70{{Czu#V$OtT!KmDe&O~`X-zX%? z*6bD;1X6@;&G%?gE+`dppQZ%BIWkA|Jnr~p!Yy2w`6cDvA!~XrJJ0t380fb)>%e!G4$s}Dwr(I=XJTv}cz+%2-(<8`~WeJV<#u#~+YmuD@7%t>hr{aMW~V^Ty| zv~2UKrcByVyrM%qui#&Bd6hS(urJNl?W8AsgJl4&zhTUIV=0LJJ1VOA)LrUs>Y4Q~ z8S|NP;&jR}D;u31cThMZ*;txMf&s=xF0U9_gN4;AYGY&A7^rGyq!bp0Els5!3D4+l zI#LM&lZDL5GpHlTrXV@BU>d|~x1>k`T^)rKK|Ymvkj18~{95T&yENmk8jK}IxZ=Fq zRh_o;(aD1oMktVph_~=A)bPXfEn~QfuH#xwHY%RywduOBOQo&V_&RXK`T12gfO^bp z_tUR;I})>IQg{m7%x{VN=&D;XuJQd6-6?{!j*bdHj2?D#&r}U$be`QSiQ73#bLmYF zVOyq|uKeiyPZdY6B?+)TcL{q@i>u>PCIP;%aR>7^OzpOzrv@QWSS6Y?`af#eG`!?l z^YmBnE52$dE4L+bf4~ffes!Y^imVLz`GBnjj_fAd!>JB$ucU~~e~DK>qD{El{Bkip zlyVPL{vQ4)=ogCRJOL{$TCZn*3nX36e2lel$C3L5=|@)}$Da}SI~O0@EbzxMnO%h6 zzz-X$;`VrcyRSB{DhHOuQs{^v#>b5#ZN)RPG5NfRYNrb^rrPrEyso_2QmS1o_b&6tvz&RpjIxX_%N>H3e@ zmNZ1_@azM}9+2H<8AIBk$+t z|54Atm*)F2hdJ0}C>19r$UyZUPd(;k0ZMsy6VFzxTxB%jL3 zVTWhlC|HQEqGiHrAg>vfp?J|NZ+TJ_HSj+V7+^*Ly8!l0_ zRh=CUNIM?Y3HPJcQe4<@DK?f_0zX_58k9&(xXS<%an%7}cL&UJ#qMFT^LT<-`i=t`?@x6AFCO&a5#y>90fe*dj zG(`thKJv|r8~8!su40tMbmHvw`Z+{yVJ;VB2^uAR3X?pUt1`t|xx(j>a0C}xF79FC zLZV@8y`K<8ER0!YSgRFBw@`fFM0>|GorFJpMI_r%X{}Ktog|6NTBMlBEhP|6ycrlW zZRdrbTH8L{N6w+|`9$cMf=))B-~u)9s(1RTA7tDab)2lYOG%yAtKFjEYnpBKPkx71myW^u;0fKqq&!8NOMXv7n*({Yt zBz&lNru7DIoj@=n?o*1>YW%%Pw0FNh3(}%GJR}pqf-*lf>$1kKc zls#RM3(rWo-^V$OD)OK#wUDb5_7qKJAH3`Wv0zQgC8u&8cP`B;qgxoSKITDUr{^3~|!GpOjz2vaXH7giJz+P4_d$F&4E?u~-b=J|eNCBom|bn&~jS7Y!T=N%TsT zmY2y6-{Hsa|1d=m*WV;=i+qFUe+j}Ilqv7MFC|7@kFEACNEj~JGjuc?>L*eQA`Y>kWxHV8LS|l zzxNsyg8GU_VmYRzY?xR+wt`0=lUybXu-5MX^Z3E`I@9ZwR9`9mhRXsyq8OEJQwgWV zgD@=-)|6wbM1IB~{P|3n#SM-uXDLULrX)MFPw4@9Z#H?sck)DrS|vq7Gh;2iRRude zlzaQVoC@Szr@azZ!^E}gZ>@ujsrtHM`9S@YQz`>FP&gcu$vu*$Kt~%H^F{cp%K8lr zRjXX;IzYiHr=Si0TGfa5LAT;v3{ma-OVSk@56M4z zE;ZtZ9=j$VyyU`TX+e$T>hK6>2~H6QbFF#Gpkm^I>|^tzw*hU%xFtWx-NM#dq;gfn z$u>YqomBG#;F-#tJ<@}D;pjv_*)+aFsFHgr;RA~_H*_x3Wyg2rTcJ^lOd*}#GQx2= z>too57IBn^|G1&``rZL0FG$&B-pipKBTd`;^rZw4Fl0k^(7fqnoeXxp-jg=B8OI0N zZvA9Uiw5e8q4FaNWE!Hr6`-gQvl9>HM9@&HiDdFe+oFbSnL3Q87hwK6O%wxEBCrXXwJ+f+r zg#+Uuh}hf?O0XR$X&dsTSBokKliP%l#=91BU9A$$)x1(&$3@@rNt2P4OQ)84xm44a z9@BV%RvNU`m;*H9KF}9JqJ>+7$ltJpa1t+HK9cRm!Syfxes*;@h_sCV$^xc}=TBXZ zvpZRQO4KpALI#zJ&axnM2Oz)u8sYUfdr~l2!@UnP)x)2NlI3Ud(Dq#G891_!p0Vw@ zX++nAzQ$E9R{hcU5hQfdd?NImb+-vd(evFG5b1x!3qrI&fF?Kje1ZnK_dbL?uT)f|E6}i7yXTeY(}}Bt zEn_c;rz*EXge;M+O5x{@tYhES?$t)tca{$m(7uaptDxY2UnUHztRH(`?Gm6y(n3eh zZK{q~s_gJOYhKL?9$GBrY4_km&>TfIT2?~-3L+~GTmPK{p{KPxJCZ?p1~5%ZzvLQr zJ+|4#l4NyydowYO!L~PouAQ~`D9!1s4TQ}uh`T{K5?`{=MQW(wYg(`}b1`aQX}6dF z&^p<;t6JOZF^nO+Ve?PTwaO|+61Mt6&bHH9Hk&5)NtB}HF?#QWw#;2glc$wVkI*7+ zZvjq#c}NTY{YpBPFKRb+3}CitB_CVaaGq{GT8eLvd$E%)t&eVw=tl9hpFJ?Rjq5Q3 zu$$w^k;eGuAbg1e1y!qi!M|Bpf!f5^O{G(Mw;PxzCCTBUfRb4owLusiKR07&T$Ej` zEhUy+={iXJWA)8dhuXq|@P6-P&K!7YjBG6exI0I`4yEbQ>E{%jR!1~u2V2Ulqf04Y zRt7e=!Zl*!fe$^xCnE<=Tu4S~mRr(>qjUkD4OK_nl)-$I@0+@4oouxKab6wxieh|a z_8=+Ego-jTwF3_+pBMKr@`7=#M@_)V@&OeQ@zNcg$Yr}kx;JU3=jXTA44GI|RO5Xy986{wY@>GthLHE_+sDBeI(n@I;zDVMIsZaE;4dtbA0hK z;6_wX@d(zuGU(;I`rXz6)L*yPQWfVq!XNImI3l@|csNS!v%D(Oo%P_x;a^W{{}Eky z=|lVS+DVeBxkK6GLXGP5^!I+`ZdyB)A6ev~Df!_9z>!?>Z2@#i#+@S?{>W$f-1ry z!Q2X~Z$Q z$N>l~64(ht64-$YEniXV;m1`*?6ksV#rtz;s`*9kNSVcw~l4De8F- z0TCJf?jOw|?39q&{VomPfBh{wfUJt{wi`pd)Ysv_>@pWxoLeduavRf(L);iNDov5^ z1HHtaAsAF>A{KDiG23d)_T+Wr{WV4B>pgw#* zbBmg@^w>Lp5#YSsrLA55UbnoFcV7K1r)tM{U~sT&ef_O*oxHsK@cg{q#^~Q4anDN- zJi{rtj0xkfujZA2`To6jK*vUu)y?*6W8k~88$wf*8q&#{DB@9+ZEVso?LjzrXx?~X z=(^wHx)CnkoI^h!np_7AMzrba=?(4eD=T(dT3QbH?7m?$|Lc?gPhW(`c&0(}7hkdb z>r1JqdkqfOKhkqMa3>S4z~$MiX(%+F*keUjrF7g~G1{MI7wL*(Z+NI9@c8xB%1Pbj z#f71rT}4H@N!g>ewzhATME}#n|GIs*yr@d_xMTj8fA>74k=OC@@%qm7*4FmO#nhCR zt-ZZT0o?ZQSN&q8g!H;xy;S~pmxf0)_x8#uC@NMkJ$d{%Fd`!2)imb6htgkn{>1<; zvFv}T@b63hHrD?2Xb1|jBt7CE7yW%iQmP?{!LpHx-v7NJfB%7}XIeMeAD#5az1}c^ z2G}mdDE`+5;1b3o{qg1h-b612(7br;`qF=O_#e0apH_HN+x*viQ-^z(Unf{(ZnKgj-zY83Zndf`d6a4)RX?^bnz%#?&2>!=?u+R%G4dT~Ff6c?U8!rP;*&FDw1%I7t%J{mI$c&7U~fa<;k+YHN?^BG)6E)KB>1Mpx)m2*qcA{P%fKbD(7- zVFT$8{OLgM$#}t4pHa!Sl#CAHm6O4F1uj$YYZ9trn@jHDjK!w*z;nHco73rAN-N9Q zbohvwDXDJ`!=K$0PKZbw7%3jPkL$%ktuL!aXtUZM@sN?l3YeeY-W6|9 zsILEyAu>z`DRv`KXdSrM;Bc|MuuF z8btXucP8DhdOAIiW#G5ABrLt;j^Wm+#L%=MT%iA07Wdrz3-85xhGa(|Q3nDVS$GV! z>wX8ZAwcTdKfVLA9$1(BsDux|^~(6g8G<$)Twapt9eWonw8{kh@8Gz5SwQy-peB#N zcNKawp|r13M=nLTecj)<^yRS&>3LSpHuVr(5^EToa_Ay}Bc+XYvPw*U+lZR(z00nsw;<;!eZ)- zepUUpkv8C6_3A1vmMr|J_)YE=R3GGlmuj~PZMYozSgZVjG3$>8rOjX9^h2ELdJsTL z{_F@8mo|0R`ebndsbqe7X(H--ckKJ86n~5wIubCL=&G%c;m4b0YR}%*=``)Q%;xPk z!eui`8wVY^s?fDTS;G)mx5~lqylk5>W%Ue_i<=hF_pwl;XJ>me)r_6(JAL zRm)MjgD!gEHkYgTViIlN!lcRR*cy&htwv-SP%hX*(Q3ZNE zsV*UT_BK2@7Eo6L*mP?B4_5k!UFPBtsKb@fJ*zcqtg|!#DnfDTMgA*R=E=)D*q|h_ zPBi{0kjiG81KF(TOEDhMcveuEU@cbuwA&d%YARy0YYK-UtG(kg*~a4+uv*fnve4Pf z`jEmv5CV7EYfwMhnN|b^|~1FCOtm zq5h(rG{3=12HuGTSg*4vMGWm6Gm`QEN+Aq>NaTUmu)M|0s$h{LVz~p zNl@^o=D|;mviZ&@t>1*&W&F;WjU3)B3$!8zAKn67XFD)O*`4XFGb-Gq+r#{Re+Aj= zhkO$O`EIqi>{hAAIPs5N5A7Ot2r;EQkHyToi37md-*L=ri=0$z??$EWEy1P3!zfhy zmx9m9d0{VjZwUW28vnN7iK>F}B8S<780H6sd8t#DDI?4AAx@NS0sN&ktotDhx%A{t zEW6NjN-fd5wKjw-7zxJ%MDdAAp9;vhD(m)cftm^Howw&uvFfkGIAv`JHbH zH#=HBb&dEod%WhxPgQhoV?Bb!DC6RsQn2^#)}^`>g)4zMo$)3X8i6RC*96)-hiu=o zUuxd4)e#o7TKDAERr9%(bf50-bLBs`ZqdlQHscQ>VA=j&Nc95%w(p9nzmGt5V%FE3SJ+LHWHly27x~)gJ4Gg*!rqo z#0ETrmK$Pt*1$BYXXN0D_QHtqr?V_TpGS6GIcl|aW*k=xSg% zL2bqO+M^aNF@Gkg)NLWu)o;C;WEo`C$OV%E$H10-B+Ghr<^tv2R?rWOK&_uC~?2J z&t8Qwk!b6urs45p`GSbs2Z=rqj~9<%=haV_AWmZ}&TpcVBV`E1sza{D^{F?zC_Ktf z8+iBI2?)x(iUdpvjKKIVRR3QSZWl4qV*B5!M1K&nbxV%0}N=h06=!qftTuV8r?)a~(EQs!y zOifn@LE8>L{lTVy`PSX>G+wlnQX!2Mzw5(9af=ex-u*eexQ}hOo=DjK1R+K9V0eH= z)?d5x#%t8sf2#(YItsFGDCyHT{(xj(X%qjGQ{4w@MId<(&17APPjc4gj#je-irLRQ zv9B?vm@iz%FfMKbiI_2u&eyvlt!r{)wPPf^koV|r*3pUwe}Z%ci#wRcTXQ3gpC?-Y zlDp+e6zBJaS&>B_f_5=9@@V@cXVJ0ikt}(X&PUs8e%zi`d_A0xe$kKIa|(4FW}r+i zHSXJ--~gQ*+%9#`30SprAX_Q-T=TYQJeh4#t28>!8BX&KgBzIwRd?p#;~@V)~drq zZZxg{)60sDOIUpLu?D)V7O31j4fW^^e`4sGYA+}FA%}&~_;gaerVH!u zn+VtgI1#O_<%zwU`>yRZh`w4_-P-NVKU@+x9>x*bwr`_Okz2DUaldhL_}X>bRA#+m zVgB30L8EHEVE~`Oq68W<;C0JvIrVPf{Jpxqw$&5CgLZqmWF_`pe*(dxD>m)wA?LG2 zKh|^Wvl~#d)tASl{FW}^rxm#!knC`d_f`lDw1-O=a?8LwstO?ei3N5+=gve@Y)W~Y zM^Fg3%id@lNX&-l6)sgR-@^vA;4(I#U@`wRy#Rzjm6@I__6e$#2I<;&It`R2ki!Q& zGy2CHqg|2Sz7u8~qOQooSHC6lm6G`zkIBah8%|-S^w=NFffV>p0755@`w7A-i-9D* zQCj}#Fj`+0*?ZMHBu@LQ1AI6xvHZ5{`bjCvcpLmy%l_`jyI`kywL5P+s;CrR9tMo9 z)Rx*WBOW+_kd}Ev#z0G|XDnY`IY2owAYxw@Q49m={V;_upN|-+`))z!IC>(ba^%}eAk(o( z+7$Kq8PD5sQx!6UQ&^FZ^HK5Eqx}t!V7)tBFdfEz@muj!R*mB3T2RDexpv#nM!9eP z^1HV_Q*A4UO~nbi+OYE?-CC8ym~G=o8#=}`^{Lp=Q|JAb8k_k&e{S3r5Pikt zqs{d|{LbTqP0GR4XVM683Oyy`1+fq0w~*B)rVaF{X`?@ky!m(GqMOyy(UW0{<#^iM zg8k(#X7|jER}6vOG^-hHemGUrpLpEYuHZpzr66Yb(3LSLLJK2&EK+=6o>9$X`kjpD z{fj5z#CZnW7s{t^b^__-<~Xp8QBD2#5er4XyH$=QF-OcY${`km|sCo_qWIOJbrxYs{M{iwHS+_^IL}u z=n}4U5Us&}L4o;{TI;&i`uKVfy<);Iv`_mD@5kiXdPly!=0Rac|9%JLSiaFrc>S!i zdmmlwB^BVP&TGrz|${9!MOb271ae~hYX!sdGlWIC# zicVf4wRVD&egKj$0l)Ruksv7=L_3&)OPMfBt5afmrCl^C`UnhcVqGkVl_!^E^_ z2iL;g6qe_T-#P8swaOv(!=kJ4?O`=3V+yaX67VHe1txV}-$Y_R4Bdb_62iu^6-nvz z=4@4jdHX#SE_kB&LNK~#ck5&~XtJ-Wa%4F!sQx_Jmw>I75P=w-M5hexu}Jo=cYYAz zLC%M+opiBV>#R+YV9Enw^OHA@_2~hN#tD(laj}olHi(#|MtSZ}}IO(4$nTIqM@Hh_|wv3C(wi z5uRhjXKhF{ZP%WPp2d|j%;HS(`8U|=aBtEP8xIFizun)Mfa-KneOyrY(1S0X3dd%1 z(B!WJBZLqg)J!j5^la=YuQ}HaA-{+4fUR2%9ZB>n`#o;@7Q@S)pV}D5M8u@CO&hI` zb+AzOp8*msZV}v%Q@((szS`dORUDaQo+j>gPF6Ha4jH6xVf^^;N15rOz1zn%8(^%Y2&n=b8 zpWu7&yR%!_o;?Fg1jZe{jRz8lAc!QUnNG49fxx>yX; z%hFS*r^vb3uCRkr<~i0rV0Vtz+!s_zfR)2rzR2yE^G_=sP<=(29H$Up=ZMFu-ab&qvZ6Rq=L~N z1*Na@5+GXvZ}rNTCs$(k@-`?f>i4DS3QiF(a~G12`N#0)q`T6u8vwWSyKyfJGxM*? zh_%T2=f*JX3&JCY&?x5cm?N)z+MuMalCYWyEVTGuKcPUdI%ORtu4f2?RZ^ut^OaA7 z2lmPL$SG39W6g?pFYDMlQ*bA2u#Rak%&96&qpN|RqS4z*^U2qO*x79znw_2f3mzgTBmA)V=8DDs0nq(0BlI?5h^z%-R{)(a71-Hm- zLEmQ*dHTNhNTw5bET04rTs$zfSUYAJP{K5e9Nr};rodmtvu=qv_%3j>zbl77SaT#K zeEus64v@9ITt}>N)B5vNN2Vkq9OJRH=}Ut(&2^6}rSVo%zgK$+)&FJ_z`myZILg_= zORG3D>6WuhEPdXw)1Yv9mBI7bpEEhdwr#KKR&2@lHqR*WGMwR$WDJy22U)wKjZf^Zb5a!tDT?nLFdmR{eRNQ*Dmeg-ab_sZ_-L zSHtsklG=HM6A7QWN6e5RSY)T-RM#98CM)W zatLJ`RWe!#XIx1T$P5+{PJKoltq7wvBiWpHngGn~=IriIcJJUUp7AkIebIZRwkvzU zHquTp@_Va|_E7?UYEQ`fAM%xbaC1UFw-#~-Af4%lT8?fTLiv_Bj#pNOc@J~MdxL#@ zZ*6UeJ&l}FD6X67X>k@7m$A~LkL_n9sXI z7nHfTMPfd6y{u${T1s8QvbocsCjpLpL5LZ4xvjT(_K)bATTK`L|B&8Z@IJ76-x z?y}5QZWA0aAf8qVo)d_0HO|*OV`0voIW#LU#e93fKx7!A7R)%Y*+ir>r zWf8xI$$IzXLr4g{j@<-lHH;h8lfrJ%QF;bhWjCuK9H@*+`aF~y98_sm*h|!kIv`jssvEG(r!?E zz$J-~guqrq?p3D7N9A5~75CI0rmvGJ`lec-m@`aL2U2Qd5cJCLghZEizg*DT9h0x& z*TJAs|DFFtywFxm*?&AqP|h1NBI}#SUFDi?<=JaP|?DSfkG105#+e%Sv<%Iy|TJSZ1?P8^A2DJS7!R z4G_5)1$ny3%;FU8DH8OMOmd${=h;kiXD0Pyd>^q|<9(XIVs*{9Pw}v|hAzClx6y~B z?E3Ufa-t!QRN>F@mL$5j28h2)hdd@qcwTNUq(EqvzGr?%N*j7skFy+XG#yl#iSF5S zc_d+J`zUqIu<%!GPj%d72cGR7(78~~Q_Exg<$Ri0*Fl9o<1aTEFkekkvG!z+uA$Ii z?rDFz@=!oM1in5jO`#~u@HQeUs&d{{P)T4YfZCF8Sb9CExgI(UPALm-XqK0k*iEvI z2qY7^-;lA>{4KY0mo?S}g$k!(bUw@BcXa?D?xa?2KNLt*M|3+RuGJ(gt_Y!ZYm(M; zkNNtNc7?^PMw~8?vf$Xge32}1h<@Yov$tuPUSXml1L#7EZ=X3Hnv{BLhPAnT!x~ZS z;jkp**YzKzeIm4zd#z*ZayIlkkcRhgwWfMd9ut;XbP$_89Gv!JOZe@NMuK=Y8EMD& z?}}SRbPLb_TM32J!MaEc`I!160Hz4!@Tdy8R#726}x_N&m&Wnxe4=_+M4b$YTrE?G4A@y4ugF(LZWdv?;kFkvKsYL)u!}y@?qPRpV1-85 zxLf(mMyTxBUxBdtR^uXU1*kX{CdozK1rO@zAmt5g$ z-DK_EY)qqObs9_S1u;5gk0N_(#L8EWaKi^#ct$^xmJ!W>!>3i(KpL>AgW+AhuPk|g zvC44}KPArZiyAl}QO$=WLvgF0Tgde-B&{``~F#mFYW!90H?~Ku>%@1N#c(!8VXF3Cs zPo3#iv&(|LEJ;d*Pz-k(u5_p0qccGx^wx04>*Mj51APTd8^^*}3N1=?Mz&^P%R^~{;T79`o{gjzQ^9_JPiLhaQG$f7 zluoLZY=n4k{S3R~^Fj;z-5rdtvqvO7OuAyo*H?!YmrW*$Uw^8afd# zik6C38&$VD-J751?Q$lauN+9yAEbw6o^pxpP`QLK-h8mH<(S3@ml&mbKQX=Vr7aC?lY5_1y z^gb89THaR6Hps8TB`nVAkQ|RAmmbckO~w{04ALss}2BKbYA0F>ZIl5j#*NdeI8Uxo@*hVIZukJm~TO z!4@PdS>L8)Z*kuwG2Ody7b~5zyAX&t(q_!v)-CvG!8Cyr$i9AaCvUEyOnJP1Lg~p# z=EmM1FMcSU`g+su^A-dy6V_%cQp5{|?aei)ZBC43T8#j({amV0g^4CJ@qjW_VB}B1 zqwFr5zbEOuMgl-8m*n_nIqWe4?LgxyiwmO+n2mbcT^%w%$U_4SGQZ6V|@Ep8~ydnZ-1^BwbJ}jwlRHXed86wV??v`a9 zw;s3f7*Sw5_MReb?Kb5-v9Fdur3FH}`(T2}=KFOa;t>%0L4X!S zOeA)R|i4_ap_x4f!H?NAk6T_sD-N@ElT}& znba-s6y79DQDeNo@6W$w9B`S=F{CrNk-BshoRdwgAA|_2#j?WJfhH)d*GI9AD*FD# z<*~ehcxBqb2BKBL&G*lJl^Zo+b7PEZ^uwG2Y+1|S3oUXDXBAwyLmHf6O@*)sWhlVS zM`8iz&xsO7y9034Njzfg6D7bBh_?Eb{Y?AcxJ%z2y&2iwGpk zI>Qu@*`Z7040J;3n7sv|%3urtaQ*o^26*W5+icXBjPSir5Fe8qUE(?O1s}eIQ9b9> zMZx#?FE?^hRhPJR2#Ne4BLizoLR@wrGLVgvem+pQyf+$P1P0F9qp&~LA1Eaw2zol8 z))V=vL6Yxwd2g`_*;EZRDiwb4d-w3FIqX+3Vfa47ZMIV@*e`QB}AS#IT?=~pFX=I_UV zVG(T5hYCYRFiN^YJ@*Y~D`frvjY#Fz0%!m?gS!pbvO!1 z41R*Tdq5K#$y*}D zM^mFt(fgctvp`|<%rpq{Rj;YhGS%}aABeYotq2tTxpnM${_D;m&R||a#3r(~W|0Hl zZOL8+v{$%tWg(|vx4ke#4A;soq{WpSl{$i5_Yx38Znqisw@%dyGAio4b1R3F6Ht&yKy3vOMdHs!FCl2!%MH4x6U5kB zCI)QSFds+Te!u&V@EuHX-5x^!1a@7(o4KLXPP65g9xO+vS%nw z4D-!ImqORW56^m6XkgKOrN6xIEC}u7W}C@$BC%aQtsevbzzfakJ{#CZ1m+feg>|l(bEMtzd&RqyNuwg?JE)LSGmU04KCkkdZ z95G+V#o}a@(Ne3S5g-g?3k{GU6dToMmyiBZrj{bk5NN+QWt^`3`vi|7?7B!z@X4RR z8Bs&@XfXxrB}HN+FWJ3aeD(3^)z7>+y}E`cbt~H6vVZm!eJ|?uE?{Hed_X zY_5JVJczB+W`E8$^*Z=5{uBE(C8`rXs~}QT2GS-$Q8L?b>%MjPWRw83Yf(VEDf#gp zbHX#GE#0-P9-!r9$qCG)d0bSBS!o|F>zX=Kt0M&gID+puGgvE=S@kmJpqstx50Tr=p~++vJFTr&`W0wJb(+%+ zIge5n)=aXWGJDh!@nYe%Wy4FE#R$^mnGBgb2}#5q*+}~(U?fLK#Pk9e0DYByB>=FoZs0cmsUSmOxNBFbG!#0>zs17i%t%6{=W$)(LVgO}t)mPTJdmM_ z8zaL72#zXi_I1R)TOf@(+ZFQoIX)2Ig1eC09h^*C1_7C!xnueOYAWB|T{~5VJE_0$ z%u3SaXR&m53R|cAy8(nlm`4$zQ6^#SAT-?3Mtw4jM&`VpE=R#I;1U2NCz%a0!`1FG zz`a6wJ=97f*S0Gu?)xCi>z|Y2+}psaIEXP5v=vzptNleXA%^hnr_d;<*E+~-+iZY* zu=kzHBP=C745D6`WIb3TO8$S?d&{V(-nM;MLJ1XyM(GZTL6Po|ZWU3wQ2~dPZt0Nj z4rxK88-|i@kdOgs80m)h8h`im{O|kze}30`KfE7Z&SLgl``Xt&&*MBI8yRKlZLcK% zEi@ZYc~I*aT}3KK3G*LS9bWvn7^gfY&)>-Vf-ORDm7M7#$k~Jg)2H0IgND=d*R_ai1)|&196CVa`M#OCM0Jud>has;iIV7mKo4iq&n_Dk~pH2R35Lze%WF4Bd~ z_)IV^J1DakBb=uDkTPPJa&u1QsW87`)Y;qNZ(MN~J0Fk5Tu&?3NiN4(D@%X~A+H4L zUs%jI&sj5G0Eoipxr+0!5g?Txy=fuEUn|wWXlhq zzGY1D4pT8W3Ux{e4bNcG$c^QU(0M2hxpV(vZfBrJDx%hDXO?ZL0`V~aOj*xrj5XS{ z#FuQgkTF>ESF|sj*b7=t{Ci&`hc&^hH{cn;=B-uqCXagyUNPsvMdHWFQz{ux4 zfNvy|Odkx48x0YZceVC7^;%7=0=Pz7)nmcf~R(+;3sAu9^W74itcQjx;yk=#}z&H@S$!pR16Hm1Ex0) z5qL^0Zk}gwcfuQF!;3L{{>AF2k1d+czjP7@&`7Sb$9>!eMxD>jj`}RE7 zy|t~g571n~DorcBT7R|qX^kd|x;a^1)(=0ViPyAe;8h-%*83Gb1VZ2AeH17m@q@rpoaT8QH8`$2(J^Uv=I-hPeRW zVtV%-mu-HU&&j%OA~LBeG&2SScf?^6Y?H^OvIJTE)EB=wH|nAdREKR{E-Dman9p27 zJ%)xbv&N&8g5};aKiWt+BxC#h(MEnJEA|vpz=pOQ%+6APap#`;eyEG-cp^TbY=-T# z@VlDJx(Zl{^41{cv|Z#|x+=Mbf6pNdeW|0%rC-+3_<_qK#%#;(V{6iLbZ!k^$5-X* z@6V$C9c=K%&J6_(7w_kkgBh*>*8R5_OPBG&IlRKxgpDB!8Te%y$5+b<#3%voz3NU0@mD^_?LquR$mAy%`(b|kVz#TlccwaTZJfZ zJd2m;x7eD(V{Ah&&hgL_{I-5z6KhJ8G(FUM7D+8S8*T2&f&DE9Q^|EVw-?HEKR1xK z9np6295~=y%quv@xRh)k$EzgIk9=FzXW*8Uva*!;xZEcAA!zH+QzCikNd!8wCOwc* zds+Cw$WsY0BSDHNZjlGFN>O=>j0JeH@*fB8+j|x_bOZ&NjWTnb(@`mf5p2{lZZUz! zltcrwt;E2?m!s<&?OGKERKcA8#j|4d{ z<-X(VVc-}^VBQ|!gs!$nUUP#DaNIe9tAN>V`QsB}F@dv6@(D&zG`@-@LhwybY!ccJ0iW*j20Gl- z#=BwMW@@{zqW5-&mwTKqA)Bz!??^qCs;vY-`mgQEnNd;bP6o3;2H3;s z&<5=b^PIl0Ma9Bi?9{vws#sgW@UTm)s|0O*-pYeyB|t2L9bj2Mi%OHUqAmT}JR07! z#@OrH`$ES~mKcpIid|LDHIm$Rc;OG8lzP}6Zn7&mP2;tM{PWtoMh1 zGZl~n^5RUED}3_qf$R3N1=^2aX#Vo`Bnu_|6XECH_DbAgUH$H?P-2bb1zZ1yIU|7u zgwE%q>+yDyX2OPLUA8D)X{Hx(68X#g_o5i_u3iD}!YCFhupQCvXJ%GPE(T6kn69#CV%K5&lwY1q zE6{l+CGzWmL+?{;!mF3QSb5(+EVU1BZ^>w=i%6bGGG|hE%z;7`1BS-q@A=%;?fmIz zcay-;(hA!@8$*E@jU}v5((%0=O)Y3S(OVg93U>XD?_s$3G!OEY(Rytp>iFf~I;Po6 zPTCyHt)?H3Y-ieb0rNc9*+k(D8AFKv;MLbX8cgryAwgpT=|pMKt$b?&(!2JEdawiO zq!C?7);Az7`ZcaOtN6KiSi-tJ6-QbQO@~N(7lcbvc&O7T;Cn`EFGYqYUW^nFAMgh+OyO6}U&^D2Qmwt_ zm%O8bww7ccHXGB=&#=#o87l-Mv9NdReDlqGAofz=Y&25i(VpM_28;W|vQru0+>;Q8 zdx-00W23*aObM_ebRjx^BDu1nAuc6<2^z2I9YwEWU_RiI^HfZ&Qr}J^UKc3|e0*A4%oNMq*7dzkXxCHmI^8$HSM^61faws^SPEwbo#W-tPwD z)^DzwK9p5VW6j!?zNvZH7vkJD)RwJxgvt3iRFfqP9T2l(xuqI{tv!Ld3S z^2f|7ESz>a^KLux!DA_RdKk+U>S;WuOQU2>7Uq)7H{-31cY7_aPQ>l@Zw=%R&hIPb z^sqrO?*NXZQiVae*YpwwN%7|j^v7j>XI0P`Qu({)&}=c8tI>%7TGwWkGNZmnJsS^Y zp|{Nu4hJ8M^4C&Ny*ZV`5~G|U(-N!%X0x5aDcz)&WyP2+C~HC|?B61jiJX#& z)Z!Y;DKo+vrH}AyJ&)7YSD;Hh6p>Po!{OWkN?Tw{Anv`^$rl`J|JUBG3 zS=03Id_=}%5%HAFp2;>zLIltsRX5%=9r@Xh69hR#VR_=2^B+N>CT}-09~1@3r6UBw zZl4SL2)G@t6R;#3?}eWHuoZEJN>X%7QFR-Ioe(PL&+a95XO&%kkb12uDx5FXbgdjr zze2#g*uIKL)DmFUag6EFI5?=4(MTjs^|MG_E@HZ?xo|T=l@UaA`wEDvCt@Tr2Z z`l;I?R1++)iAiwiPVNxiC4FtY@mPuSqc;TbvkBHxzb6PBPd{$1iwot0zgcz;7W)1p z$@v=xPYmNR1U*dzg;|JK0T*<2IZ|vbH%66k-2{4V zao)^uV`)L&4dL&ChFyH*{}aJ@gqLk7Ty0I_kvvJN)SUP`-oE7upAi4pQ!n;rSz)({ zQMFQ3dw-R{kx{{l?rHtD*ec+=f8A;U9Ps1IUZls-C+=PQDjxs=2{KWTzZ*7KZIE7M zIhm;JCKyMfJXh)u&BGB|-2QPJ8v!WIq$of}bn?`7zm6@KmhNP?YKtN=ulloIw_Sz* z<+I*D4DgurvGflj+h04r-Wuh)yKp7tP@KR?+(g|d`~Lhl3;#u&s_>h+DaXX=n$%13 z-2Xz0bx=Y((l)bk6zJ*WE^(_}u(0Bn`E6f1Y}I7}e>A#HfjZcC6g59h>0eMDtt4g$ zpEX33Vv<;#D;e4KHb$1ag|1IqaHOd_W{wW};g^I4P!KUm7FxwrMoI0p-laDTYE3o^ zl^Mc%$IdwNSAlX!&WU%bcTM#96FisyKb{Z~Fu&2D*2eqx4E5N^qoa9{IDj72ziQ8x z^6ATUDQS$^TM;qL)Nt#X`BmM0`F|cR9EPuZYu^!h=M(VyxF7S03Z!-FE0>sz1U>ZS ze#{J2LK{I6%-E-&Wl&-*k#Xme(|H0pGs34G|M`5PnSimy18Ld6(+r<>nOo)yjpi^z zE-N5)=*mwtA53M-ZSu;+B#eN^p7`v`kIe;K&gu>(pVNxk+h-r#(-46e6RWu@5NE30G2%?1j) zPom-{k;r%c>6>z&BOMUkF=VCIWAeO_KKI;?32`Oe=i663l;h@(4-<8Zvm?+_7 zF1^mZzrUXtUHtkq=dVmp(9Se=Ds~N}@WdDS6?>jB`T+?vl+i z%>jH?7H~^CfgDxcSE)Z62#f#qv46fweHOLGvu{&>Goj05jx*e{7mQ(1Bc*ZwHMOo#%kBWSx=+221g+)N&60alQZjk600~-QyaC%!2=3mld6% z4yj6CUH~P=e_zGFU6N0`EO`YQtWd&>XkHTYjY@&Eth z|Fy6F`#wSbUt4oGiw>Iq@d7}7>;G$C^#AQYu1@gkq~kH{lqYUH#Y&gNdY0DTEEpyA z4d~om&=tIb&#Ag7%FI5>}T2-8{epAKO37w_@=zO zaO16QFzav~DIO^`{!zXKzv9LtlB0HRlw@@UatjGL!;48y8jVyRdY=O?a$vsNoqN>S0iamza3VVB&v(v9ML?%PwC%kqN zE6D58IwSg}OgsxFnkP%3cZb~HJB5jQXm16D`GPGm8h(qHR3CXBhI%8A1IVn~MeH>d} zWt+zg7@s?9lE~C|oNzOUt-D1DWIcWwYNvzGL|57^OcIP&ZtEO6+Olz-t$O4!|1LdN z7xOet*KRAG36wLmUZ`socl=ByI8$w%athi6ILPgCg8>K4HQDq;9QvpsY{Pb;)1>q2 zE?@o($DfBp1$yq^PvS?;fEfY&2mT^gygQH5o|oE%4@qq z#UJWYoXg&GBMgzH!55H!Uf5H;W7wYa0G-qAJqc%^t(Hj3hc!<`h1(CdlaCtvkYCPr zy~SGbL15W0rNJ?KJ)uzX+Y%-7pL}CWLcwoSb?{+CmMj>k9<)(`mhkw3(fB_={M!k% z)o_q$&y5Pcgn_qYJRdf0QR6VBpQSK_4`elC>2{dgeIYcMuzGQ&HbH@uP;bi~{1qXdY#*~Z2>OPrIxcCjDevy|w zuEO}2p%lcIJ{Hrb%aBb^pcp_zN#hZK33JuOUI}wg57_anFl>%D)yldaM-#?vzPFub zP`2KCgTlxlAh#&(jElR?euiD5XA%5p_h&4q){*v60)>iB3iJ`ZOy4|u3*$fL|9m;J z`ZSJX^Hq7OrEZ{IXtd6jo8pVt%`qpji6}n{h|e4f;;s3(=J=M(z`f!WWa7n%L{JK9 zj+f|Y)pdt%(+&eUz#f>W)_&%Jphvu?)l&_??GZq2j*te!Av<7^-4Z7Xh>o zcIvqUt_kpiF5cojwVr+MuszL#+AO|ZaGB3{W%bjQ*T?i5g;$uEY!yDs zsOEac7-Bc2+;f+s^gM(`)c6V=Z%!!jS`N1g41p+Y5`59as0uGvW!YQF*|b+Gb0GJN z9yK{8Di6u{mpcRl6u2PXF+nIQFd~dmVWiH>uS1yixfJM4)yNc=sO8O2ZW2M>Z0Op$ zuz8e+C(N9*xjJ=(lk&PNvW`A5cA@%Nn~@I`+)BmVf|k+{XN#k|5%L^#_S|ANw^ zzE9!~Sd+e6jnSls@o#Jh0OpshSpv8YYL~!jUTb%cUKsWNcx5v|j!UVLE7vUFW53+Y zthm68j)ddf6m;MJtWWHWj0nGP$7LKBt`X~=Hv=}V0(HC1 ztBC#C)nq}%U&giM0v|F_k-pK7k0srJwivF!lE#Q9dZ@k!dihYW0yAzoAn9IN*X!yC z9sNmtKg3(7_Q4bL(`VUJ3iS_V8=R4(fNM)S?X2hwM7-ZJ1W&$YX;ir{SY-e7;1^Vw z?nZo+1M6DkO$L5at`Dl@mjxe$gZaevFvtcb)T?)>I6*2g2!Tb$MYlAVzUv6^hhwQ! z(C@0bq<6x%>l!)@kc+u8FDNg%KPbN}%IwrHSu_kTs<9@1tMa(mPk9ClhUctiLnrl0fo;kY-{>YUtkM{*pl>==8YG*Oc-j1F` z9owk4l}4Fv9eOXUw}&}6yZuWyL1{|R4AHZ?qyVd8xf@}SAZqGzqR*$we2nB^zQ0{0 zGw<*V6yc{@v2JIsJ}R|<^|xk@?^_O-lnqm!EVMMov!TUkS6>x27eK@`}CjpSc+atX5!nT3wpGoTknG+8Koshzy%NAN;<{8f*79Ne(+^f7}VL%A#j~qL03bKaWjq0+a zGBOkp@$6>pM-k3;Xe`nO@O#-h4*);A6C^ArAa%I+&K}{&jP%1g;O};*wKj{+{%jzE zOddTtv4crwJ?Bz4e+a%79FtLa=s=SV0lUt@&)kpo;pM6m%sG%AjNsh)FAX*FjCaYd zQQIJ^(|{NGiczS!VxH3iF5MSoYjBe`ouKQ7x^b*}alY?6*z04J-Yx!}{gavJMHZuNRf;ITbW)wzUYMA#> zS_SOqJgyWIS#_r$x1s!4Ea}d{wKWG`^IPvTI5KYP)}6`~6-g2#L{xPoabJ|_&fG^I zi*LC;2lSw$I-EU5LLU?*OX*^5$L69TTje<=^BQF)TdZBwFP=rn$IHELcrZ&kE3j3N zRvB7a7`*&TO6E5us)GZ1E9W z6HW+CoGcK^QQ6g!A7#Gfk=}zWXREiwm=J%~|63;uN`m4?)zF+?hV~)Y3?t+u1(El~ zOF{ZqvD2J=p2`ZRbHh(=l6Tr1PPTf_m$@{WU`i)KG-{;W`WzAB*B|-cp(1syDHfaB zVvMCThl8{0kZQyj8D9#1os55ZfEdn+(AfRG=_^&JOE=(vpoJQ>W5VVgr)DI-^6LUh zHyn^&sabH(!D&c~j+Xf23Y8iSm|AAY@}N3=<%XA~MYu`~*}a>~V1aDae$v^vz75s< zl$V1?+8saC#7FSBjYp?2L=(36Wt@F;dxTx+V7;kxn*i&_ZNf7xcaAyBpVg&lS#G;^ z-D2VZ)ZAzBfVw3uXfbLJ(=c~2$ zjiANejo28YzlHQ)vn=%W-6-ZP&(kF=HrVM#0|NCV_&jcv`cezSX> z=u)YAmali_(U+VE_VpK8t++HADAYpWPbt?tXc9QDXi_?#Ju9egFqom(?He1JB>2YQpd3;Q_;})d{xm5c#kk}lK*6sJ=;&( zq2u*173ZmLQ0!@h!qTUa-lhxoS`PX5Ht4!etO`Eb3Y%rIHmG@)#vhnN6J#`CCkevN zyHywOs+zz&d3O2MId#bj|GX_uJM&>AV4ISH@iGCb1m@={e_j|pk4#YbV6g!9_Z{Ar zH~kkMDu2!uU7oq`wJPPzZRM%~W|G+y5@f<-DzgI@s6r=$jd6u&DYnkYYx1kdgFL(1 zC9g&nq@f#jbYi&yH(;d9c>O0(JP3u%R#XkA6Y#GpPTxR&w~7bvnE~bv0#M~hft?m% zK`MZcE|r|8w|)bRt74H&L~cfTQBJf>s^QsE)a7;9BuDLHN)Ktu2o{4Rm2TH$Hr_&QN1B|Muhu z%1}jAbtp|(8~DUx9e>;j-vRrQl=DrIy&TfM<>38b_cs;d`Qskaz1eOzWhFgFR~??L z6CY2w@(OkL%Ap}gugQM5!8Re8_*Vrq^JhrEPM3nUkA56XSZ-Wm7u!!zT??{~ZphFo z3*d9rUFA2RJz;Fe^j6pNAI!>CKs>;lvjWjQW9Qud_YN7r-6%9F*i^ic8?NUITE- z9SZ)@*cjZcv$c$xTv{HdOJMmC%+wpxa{~~23Sk?}D4O+2z`EJ!5{DsVgsBCyY5<|Z zT+j3Dck^$lq?P=lc;f0VRc%~fjykDssToM5K~rYG9fM=BT83CWaU)!nAq5Rseq^rb z;KJx*VrWX@b*Z)y+v6J`s)fFz9b?nvU$!9yxjXP(@H(skz^)Z>#-)07u6ox1{@`!9 zDvehkqot^~%Dt|NDX4$*cz6wWy`3zvDnJgj*hldB)Pf)?+kq7RApy0B?(4{j@4%L0 z~O!6vWEWR8lxRuH@@j?erlP+Jq*jxo0lLznJCc)L` z7-z~6ES4pwow?8ZT<({XUm3GigBeOZH4IP=M$PA&kCc+1Kks|^0?CHcOY!9=DomG& z8cX`{43&DsL{@lu`=p8AW#2T9N=dR{2mklm#pWiaV9dqCKV^#6#ESwsHj3!oAl5Y@ zKp?eoORk>>$OBDJt~B=UKjiJ<>;URXTQ?ezaM~x#qQJEU5Y*}n6J-=gu6X|C8^}rJ zWbY;1a|gAQ&ocdHmqT;ZkRb3teSNfBW?S>Q#)W((9*HTnlh?n2zZzwXFw^FX=CvA$K)dcE#EkJ`z z*2+#RXHMJn5T=>YK8597dtbJ05d>!*XRs{Olz1gmoid zkeKwW*I*n<0pIzEOEmX!%p1x}g(aE5PYrpJcq*ZeY@%`SoOq!PKTni9qoc$P8A6Id zy$$&yzH(A=D0g%MF(~v8(XQmHB@#odJbd4gDlu;we?~}sKpmj&2)A zsjbz@>R()IHD)VYJ#r9#s-B3-00HlT)>96$?Vhu445acHCuDE-E%hI?=aNrAG-yGvZ zpr0p*Hw|`S{!a6r{wF@mTt_x@A(PgJ-?BH0xe77ELX$tj#B9$GH@eK=A{vnl+vmU? z;7J4p^>V*~#CfMW(m3C%&)nN?Wb~H{l33jBcygQ+VvVnC1-gx)0h_W zfjW1j{%C3O{>C_7x2X{~ak!tJ6-A7}`itBuxEJ3nF;-d01zc(fivDnMPQyOC#A1}z zr*6?JLF%&P{HP{C-t|x6fqA_rx2@Kcs55rXP=Z$umcoTl1~?zNh%x?|IRt^8D$&qy z8_fm5pTt)e7%Z6>V;;j{`6010@8SWEvCOOSzHfjGajK5{S~Mr2qmGY>{1Ve%m6Ev| zCDv-oujN8OWN9B|RpccM#WMP;i={bn@Gpezd4^fYGST_zb_mmNi0!J#$q~bb|BX&Dx8S?GZviB z;dzVFSCXM@eH$_wLI?N8;2;=>#<@|h?hl^-=T7}>`EI)Tci0ZfQ! zpLsoIgT9}`I=f7xtl>CR`}?rtfyx{%LFG#+z9b~}@aw(_$cmZ-254`?A3W*ebIiWG z52_Q&q~y5*=HDHdGz@7%j+NqKU(X!@FUO}iVz12zVd#mGuXA_<%)oMTBlq){4@tt# zyGi>6mrQUU9n)?Hx?s*nD$KqLCi+$Su}tPb_nt8VjYr z>u8MQ0`C@Op0txTx;raxhs1UJE%IkVg}R+1I{3o0omH0h{y+f2fu>pPRqqgycA94D zjK-)9VAv~OZCSH!o`cLQb;P~;9$By8xV3fry>3OA?ZU`p*2Gd%;5C-@p9tYy^<8O0 zqSawi0{n9~Y`lsP4`AyTKeyF$4zy~VmU5U@DXsV3)|W*EXA^MqYApDn4aAU~3+F?d zjzaCjcF4a$0so7#XM{G3{xYQ&7~?;;;>HfVhQM;DG7X-2eW~F;^?N28I~GjuZ+~rR zZ?}l+*6*+IGLij&!7O_gx_@i5Pt64CBRZk;&+c?*^kec6rHovKS zBp|^f*7oWU=q+*&1yx&ot?{7TKjfwy5rzTVg+GxBi|FWQp?uo=^8Kk(AMyBxhsA0naNYU-VFK;-+Z zQ12oMGq{ofKO0VPYHaK84r7)f@c-bsicnUdkDVZpciVd4ODsO{(9jV?;ILVvue^TM zcBXL~FPpg-<36-AJZneyB#vYJ~C7tL5><_rQ(vV=c_lQro(op*MrOD9em! z8i=-rIhuW39b*tZk-a*6#2|a; zy^sXV1~yJ{o>pX2FSqdD4-?fG92%z>J+`Oazv_B|{p%`KmDp$9J9BdDP!{qhC*}E= zN;PT0nNFCbe%P33pp%(y;BlVGrV7o)+1dB-+6~hV@t~)+`ml)lI|Sq_nP{7qLB@0n ziPBB$);OWJe3d7Cdf@i9=}__DobaUt8qq<<%9CVLsUYl=@l<^0#0p9}N9{*DO+1|;%#>auD&1Q-eaOx?!UplP*ia7|<_rPoVAcXN;x z^mzILus@{yGC71uVJ{`S3%&FLuJW+n`mb{S#3%FOc@)6PK5JU7tx$b%r;Yxc7D@9c zzsd2oPx?unr_DaybIPkcRbrPPnBkCeaA+htDE1kBuj98qEZwM=Vh*XFDlcoqx^ZI? z4D%_7xR2Q~T#IAx>93sVB{HVsW8@=0E__RK^yi)Is*uZllJ5^66#r@~BSbb4@dj?iGB~2co88sC#;$#^C(3s16t9xKp6p6NvgF>- zy!6`5bs@VJ;*Kg?7R zY|7|zBa-F7%qzXCkE@V_o$O(GF?a(UneLE0IreC}_U5VjolRNA+jvDj*pW(8_ZZMU zztSE*v4nmEPDurag7--4WxgkYS5e%gO!a9Z)?Pvy?;*G--dI5Ulr*7!Lt*KRE6oU!%G!G z7{8~rrkd8&%O^UFIo(T5lUocp+1Rk;&YS|h*Q?9*N7#pC%&Of#B6E+sVv5gd`BhRa zVpxT8y6(tAZ~E5%1dzBcw1XS|#))S8uy^pYiQR|dLihP{MK?-8vF26l58E>yzM_MN zf`A4qV4S5!?2|T6c};qe=0UC9lb(*mQ&XsZ8JS;}K}WMYL-BQJd}{83HpFJ@OkQ!? z!IpT|*{=S#sQ_s6gCwdU*a?QFk0#K=v==QYA9=?(K>e1|ZvCRH&QnR{I`l65>X63e zt=xA=DSwNoAm%odn{f5=n9r9_304Nd`(Zo%4V<9)N|(oZK}v*l)*fRktk(1_E$8~` zv@7kDFZs7<28=ES*LP@)a+IIadw9S}$~s1Ie%MccqvNFh5HJE!G_j3EIHXM7l&oO6 zysrD84>M=u-N_B6Z)#d8YPm-ra@kK_3e282#&W9uNTH2WpMTEX*!}*p2S}_|?d0hx zD-vF5sv5kA;Hw5wgr4yBKAz=O$P`t2#Q-?aY2YfMI0mCYx&d7YJ0 z#gG!owCxTBcU3NfvQfgd-fuL_!!M8Giv@z|V+qhtm2a3CKSdNQK2>&Y_pczMK??TQ zkkpKkVH-6=%<}nE)3Yjahk)z$m*B0LZw0oaIuyKvW`o zR%Uaq_06^(+Gjz-7r)3R&h#Y^l~3hT_M~g)7hfbd-INxoJg@Rlqq-NLOVBQGvpN4z zaKzl5qYAkacDEn$)s%Kx zb=SAj_l<`))01K9M~(gb8q7z97`+{+IwMhHWRU9+u;wZj_}x{WKt6Kww04)NV2Wb0 z^u;~~-C1O4%YYR%f-#;~+ViDP*_lM4u_`tEZ+K4F#p!0eOCKES|=Soct#O z+4^_`N=|%R!4G1V!?aDcY*$T-r~1HRT2b=g*PUbA@hzewbn7LA(|Pkt*usOD#*2YR zDxBC73|h87pry%WV{3YKj3J6!?v&;tO^!ig@Xn1DL?Ta7>+?v4gaerEEHL$PxF0b> z6f^egSK|Ab)t^n)L~E2WO{H%{%U^3Tg+z~k(9-JLB_X9SB=8lZ&b-cYd7fH^!W^=( z{D)dk7S$`4Czu}|`kddJl?7|M3>p-6qbGH&;La)c^?gOnEqvYsPo17yFIpzHPJ>iO zH;7IIOoxEAX>8;}Wy(=UxC-&c>O^)BeXN#2TcKL^9?vIyajpBM4i!ImQMC%Dk5i(4 zx`P6JN%X|BFBGr+eM}1%Z+qV|G*Bhu=+IZp(xEL#6Pig&UWJ~z& zEEOW*Sv9t6^}K|#JMRp@`xhDc@YmS+Xv6Io4ZLcB^^Ymt$%yHRWjP zmmoz;bG9;L@(T^(M?9wzPD<~b7TLYkXjb;p1K9ldK7i@ z{+>_SoIN>TKyN@OLlxFz6+e?ovv(|;%N*S+zvA=W)i#N-2_hZ~Ol*s`)l}%;fVG|9 z+c&|T!LYZB82cVv{r-_1^^Dv+IQ#N)b+bHJSYFt4Nu#<)d0d~v2LZWu>bLezt<{CS zt}kWm%YJr#O0FnO5pl8W>qKiWa?qtClx1bvlqcieh+)%R_QNku4gEPDW-t$I0}QU| zc!y7<_CkLk(=#5>weTt<&u}&xH>4O;$<|w$8+KooyvnLF@DDaAx=o{SuGo?JxOGKc z$hQnNZYGd-E_H6w4@=eOPQ3B~)v_!wM_b{=hY>0zv$B_6YqEq4ugTy7!T2y zuM!O|xWZ*dl<>#Z7yN1rY~JBI=ZbGHEyHIVUbyIH%TKNE=RY{1bnC~g0~3(-z@y8q zjdzYa0f0eLKpY^Wfy<~)3-#9cvEGWb;zUYr8Os`(S$a{3Vue+ zr@BO!@4{~7*s%u%Szi_~3UtP*?a&Dv*CP$L>emsE?`*$%52c@MAo|8+%Hka#9$iM7&{Iua&Vu3DgZs)ofRcKV=B2gpWjq z5_zPDp8fh>Ci(^#LlCzx#j&a-%zhVAO%Q*E^A=MS$$ktmm+WX{OkwtuP#1>6a z2qtU5kYWr`kCMuW+`1yzG&=n=t}@F*hMX!lP;_fE zj)xWu1*cX=?~a&??XIw-$c&^#TEFx^xSy_MgGSW7@=->^iY6wZd@ip_79yK5w7AiD z=eB*S04%%w!K*`(SC*JWNAL~mhojHv-1NyWD$~;N$@*c)o2vk!_%antHS2}Vt#hA^ zI;=a@iY2T8$7!jr+8z-69kJ5^u;#(7jhgxoAf@#V-9VEFa47E!yn~Id#qYTJoQZ=O zf1?b_W}4j-O2*s#y2i#@ExTQ;G5aNs>vI2bohnG1e>$6#vB6ft5wdluY~pW3bkuJf z^FdS%)a{Yh9&veGvF8A8IkGg?GxU%w_Lt6A7nbpf2%P*-3aTDCdS_H^UqL3ayBaG|%KG9P>16*|XM*v!H;3|j7c7fZ zlL@nE)tX=`xu}qd5ZCL`5dldTMO=-QQi{aQ_4$Sxq?`fY=4gsjs=atN_EG|uUb1of z{j;uaeabb9%GcZh?8BxJWkOFUireO=2tu)o?gfqBGWh@o+_+`07)C$sR-8 zN#zkI*=J}GIcewaWs{6$(z z{JAJ47nYNGM+PX(Dn}=XQ$SERTcU|s<#Oi8@6t#I-n`V>>kiT@5vPI=;O4HY3F^D8dL30tbV}uec^&aUBGLOH^g`_Rgley z=Q?le(8YjmTfycE6V59eL25TF~v(Jp=cG;dzojXT9=rRTGvYb&HUP-X59 z88sktM#;`^72KpJ<&v#f?5#bCbEoB2!0smF(zQg*6DQH3dZJXZa#xf~>E6wXJ`j^084Y4%6VF6wfKs+{nBTv!T5vn*uYdXBvttN|Ehs-FP>%LaqPy}NHZ|kf|E0{B zY69?WmFUAGtMEU)HyJ;fhsxyqXjn1fqEKk@&J|5F%%SY=AAkB{9>4! z1~Q4#u_)@@BD1XTBoI4?@67#ES3ahYAvmW&x*1jqrOSLCtK`_4s2+$tLA!7?+ZPky zk;WK#!!3{jyw(l`{?vZlL&SdYN&k%@9*t?DGz#t}fpX(!V$$~7>A02}+tOEPcR8LC zyGE>oULZU$fWS3ldHlgDH_*u*z{NNQb;U6%R##>O+uv(PtFqug19@Q62IIX%5&5gu zeu&AnM5bU?siXr(u`;4-kc5F1*X?dxHzH-*WREc3OJ$87mo zepfK%2sPrkNuIMKg`ycjh-_#)Q_c+OoYa_`@9nU2V^fQJZS7gg$_e=iIj32>UcYCE zN3l#bB6~Z~89MZz;br+Ri(X~m9a5Y~jxP4f-vA~2i*uFn&%GzF=NiYv|CT8RfV^({ ziUG#j22H&30g+TC%$THF8@z^PaY5D+IBgVNR&ZYORBL% zCA*Ab?0c3hgOYvAo@EAYico2gb?p0)-3+D@LiS~1jHzT9LKrhKmhW-i_dW0Te&;w} ze|~>_^Vj^IndiQ*`&#bny6*d0=EH#8cd|MsuZ9pr{~N!fO_%ffEa|s z!ay9t;A|B8Nw9_phtbjd%$bjkjy^tRbNJ|osVypQE0CBT6i7-Zc6&{9duPnR1Dz() zU-==Vm6BE=GkUcb8vC1&s>Ta~=Vb+D5~~n3?XITWcc))DN0(I_l6pe5LrpKc)}%I? zBdq(^Zk8E7)zlqvQX9I^BgsiqNIyJEYAfak^XAf*3sp_AQjC(k!&3IM-HjDI=k(7g0keKjQP6 z)u=4H5A+o+NsCZ5j=_ouMpQDn`D8u5Ms=!LoILa9wGHTLEQr!EPf*58N2Amy?yPpp z;fdchL$ZHVC)})Niq0N3`=*3RV2ywN2*~celWaNUB&qm~iQmneKf6`0|CF^oNg~1z z$gW`T(xgBIq)Y@|KZr|2M>tePeXh^CLg`cM+N!7<+`MuxsYb;(RE+-ObKw)a+mDwl zSd4`YPuKjguCRY=L?s@0o-YgwB!;X92Rs~bZmu&$(S3t3!!Bo*g3D488-Lh{$H;CP z)E@9(K+I|2-ClqB-r~kzl73`M-p)yg8}o&8|A5u%@p!L&d~85jHfqIE`=y2EJ1PV# zDvMpvthTDJ{lRqkP=grHvhVce#-KahKn*OZ;HluFH_oS&2MJWw zqfsgoJcF@sWrE2SlfJo?4~G|0(r6i_3N(p@wlDaafcK$j@fqZIXMdjKxc>gjjg=nc zKHHhi!HUm@jZt8w&DW-1mLqnQ(Tmv7jDSylUAlH1h?+7oayf0Y$PixqWji{$`~c9X z_i#4AXOT@QcuzB%&pEPpD0YIx*7s_+86~pMYAKrzP3%*T9M@6<4Gc?iPWJ0-QSNVj za)?KgB01SF1jA+8gC?impJp?@FE@}(OJd7?f8Te4cFQ(rpScIb`Z1qI*R8Q_07VeBHn)bl#7P=Js9oiP?G>ut<|@A*Nk z!!>zbshO9s%DFg@1jn0#3f1qN7yO#D?;?wfFf#~8050#P<$8^eTi?FB+yD(=8t4!C z(#F~=Q5ju}qi-%{@{Xhw@)3Ht9}O=i9bW>ZlL7i1ZJQ>QlL+_6gThBiE@^nNoszIP z3cV|2noFxSq>8Bh=q9!92Dbd`)&VH1pYVB~g<_cD)Aoil_jvj}KfQa%+6A*q1A-XU z+WGzTWY^CdIBa})Jd4x(d?Pe_CwdE##2U!rIgRZdzZVm=#I zi*59^o?|0!t|~psu-vp!;J8e)ps_W%PhV_lrVV4Q<{1zosmQgo&DZg8k5Ajh-*E=m zBmq&wZJ=*RXsIP|k|_`wqo$PU(=y`m_*w^8#KW0bHevs5c+tx_v>T&1 z-+JE_WL2B6IOdqG5vZibSmB0G5Qrap2#xYM?7K zx}8lDp^2&)qEVdISE6eCt>8m5y5?yoOSjcs7LZw7;@8anv8-E7K&+sQ$BFA<-CNe# zgY<~{OmEru!Dqx0Ovj_c+Fp;%JqtoeRhIqq+MMQPTWpUZ#YZ{T(i?>7B4R(GeR;?% zA=>0oMzI%}_2`&F*Kw4H%n*UhLOA z%t>QL@Y1I1%>K?J?4#qYr)TZf*)*VEX9WYR*>^(Lp5DBQ(vkCzRe?~EewY^v$aVf_ z7OuIKOB!M&WS!~K2Y`Bob8vv&e!GGZ>J&d*Y;$=_{2%lv}Qxcw@J9c!>;; z1O5InaCGB)tkepIvrD=-o#$bB|3P?_*KZD6v5%PFUsgPDYx~8SR;(qM7aUy;Ra}Wf z&Q{*ZrO853QY_i-Fb!VdWE@B^bbUYIk5IlXYZcC)0F44_c}@!L+-(Vv9W(z30eVvs zyvA^0>y=rnkT6wP-*oj>pg;(@6=~tVu*io-6Ktz*hum4DMZcIr>;V0J!qi%%5X&(Q zU7+-aN?>b>L&BS%UK@65H=%|vFh*ya`{eL^bjAw}F82w|pgne`ml>#mk6fBw)}=QF z_g~5-egQJ+Jc5OU^TP;*X?@oT;oE412Nsltu`{#c`hzOJ}p~VT!bs**C7s)s)gHohb{?2wuTOF?l&$09!(Fk;ZY<*xJ)ahe!D z?3L4h*PnCT=c9T_qf09{Z5xTJ&wPq-S+8j15 zhHPRSoyE>zhn-0rmz)+Wi>AI>?p3pE!YUEFp;U9KpRb1lP)V-^z2g%;-m|4%+N%m^ z6Em2-o=Aninv2VIlz&xW@Xtj-XP*qwCh@GWo-v@~^Xo9yG*<+g?ICjcEQr={YYAiJ&b9Mv*Svu@nCYo+Eq z+C4qZyBYq)l1#UN-Kg7AGgN>yEep^`y4{_H(X_mvvAj=Gc|me{GI$$lq#&qkX3Hd^ zB;8CFcDASeby@v31hBPS0dLIE$3T)xC9p9w)vLa1Ck)8Z=%OpF9BrR_|Ae!Pb^$2= zA(`on3ASDI9Vqj9dB_wYwM;15boz==Mo1IucVbo@()cECNSYnjUB<>w%J;-C(=Tso z+XrBU;_0&kN^ldhKu!2Ha4ZrNtPAjhHL=l&v#C)i-v7N!J;eaO;v<0nCU4g+6Rty6 zkj`*WYFfbSJ|PvR%Ff@YS9g?tGsNLIME#og?TF~aiJAg>(5Fde85dJ4|oR4 za5rpQKe;SiBx~{*>Jbbqa};~EmY4)LiKoeOtl>!+h%c|?`*ZQ7b;c=;%hTjFYyYM7 zN{il(l$2>1NVkuuN?F>0bI8UP0GV0V<6La}+AbYcFFl-xzS@P9 z7aJ@gIFnzb#VJk3lkcV47IlTx-Gc^*%e=Na^o{8W!{_!SJw5MFSyj=P60UFHZV#!< zgsPdflQGeT&~o;imsXXBIBu{pF-DuWq)T=&Zk*yM3kACMBUGR(6O2l)7J+T$Nu~~(e zCLV+ye1+J-NoeCI%)%vzihk)7DvargqP+lD40S_c9SFMSH!oV72wl?0ey{8*{P98y zV3q3Az(V6v9GN*>EKdr)06O=6@`Wtau)`Jf0!R-wc-3uo@&bGx)Xz%VNL$N;#~^xq&C$iby-szp+yoedO$ z!soou9`}KmzCeu%+I@?hq+KTPcO=PD9{o|hgtChA%7_JAv(q(m{-ciS`% z+-Fxw_QGvZDf4za7_V2!^+2)rL7<$wtjG48%4DOstwEKyt<_v@aC&wBfqUvD^yNOU zZ7JL~^74F%RDruwX~J3W*BaQ8*W+N&?3CY%EWzV?5CR9d!UI^+)}nFY*$x067nmxl zFhHCnqKbk>0Qp}NltL+w{?K=ve zO#LlMzcY`S=I12brelhNpOeg0;M_h)@pHs)#e*8a>lX?c7@+qt&Qmd}LQFt1ZCZ9o z98e|x;sTIYLk6<=XqQMTi|nbpu>L-u3+yDuxOr{Fx@#%tvE($jq)jrn#0?|ctK*Yi z4O5A(E8jYHHJVhAZV-@(ns>MT`L50U4?y3zaB+Zn%R&t>|3(q80F*O>nwlEs<@~E! zpy1g*C!&}DcupFth5mEie?9*Lw;VSfG6EZHR{AN?e~kXeH2?k*X$zom&4f_2E%NX$f8HIsPj`Q0wyhh1`@g;RpHtd%9peC7Jq&!5`)~06C%_@1 zz$T*WNf7=QCjaLjm`kq#q$ug@c?S9?zWxl6suZA9LW(@C|8xHThNDO`E&Go^4(ub$ zE1)QKLqTc@UoE=mdcl!Y=L37fAED|4Eb*&T;-6spV?Bo-0C-aUuCc44{|wjfPe433 ziXyYi>N0JVp$fXn8+{JL4Va7)ljEoMe8pb`K+4g~hyTG3|1o}!g(}L0vZy4w%gBGd z0DqASPKB5Ks~>%Q2N-6$0X=*{TU~Q^&z+`qV{w?DK=qg6$z4|8Yk)DHS#8wpgHg@g zGvyN6^Ko`^WpaqE>K3PR!|>IaC9Tvl98_172kiEwBWdqp9x{d;11rw0s0~DCO|=}O zrUc08w=buzQh@?r=jj?!)-=U>y3KkuDkK=O84D8=|hW-A`y+FJN`HPrMdg61A0@{3KQn4z~lb(M5^S*XA9nGEmYyDSfCo!o}9%! ztBZ132XuR8xqNQQ>>57frBfqKcbNSBv8u88`^$SH#4oZLIGX8dm<>T+(i^>-O6h?2 z6zUzJgTTBRxAvA~l*8_OyZ9#qgs{=y>`5S{#Ubd2es#)4xW5<1rKe$dXsKqBR6sM> zvJX&H5;l6tby0tB*$oHZGvD~0p-mY8%_${8a{OB60iGLt^#Hn&6V zB|TU9f!8!Gs5;F6wLChw7ys;w>|xqC2FC2vL9}Ox)KRxNJg=Mze3~ddn0tuNd}jC; zSOQqEbCQJ4&UQ_FK9^coNyB6N{$}qm!;nGq>w_hDVy+@YgE4we{vWpaUlJN446NNa zceA;DNx!NYa$1gam$l9|x?LOdN)Q;h7@7t)dRcP&>|egTD;g;2$Y!Q!;Zb%K1qgBF z4V&vWC#0*pbvj{NB7GxXnlaip;G@W1%*pJ3wy#dLe}$`S5a}nS9i(!p0L_XS`~JU4 zgT<~i#31f?VQ6xGQBzI}CP{t?a^s5n{5ab&$IjG2JAFh9H?-yD$3GGK4@vn4)msdA zgyD<%gL5X3;2eBD87uIrcKnVGaWlEzdtwV{Ym%>D634f<_TX@_+vU4p+_o|1XVi?@ z^`^HE*alzGGgI4QVO5Idzq0Eb0>PKwrVb3RN|sF9(>!TfgQO7CU*&kd@IctcG;n2f zeJ2BUL_c(=74oaRx3Mkdt!+VsyUMH`{2q2^1Dj4Q`$d-bCr#4wElHWi`dfkoL*0Y8 zsULIxz*@oLw^H^{k$@4?plZhejh70!oQ`NYS6sBy1tBQFDFQ;}zc?%9oo;UdCoaTP zX3g58!c5VT)NB5Wa>lEpM*gr95-zjGiMNu2e?i5R42~X+%r1TGy7v}8!vH@7f>uIS zknDih*ks!Mwsp|iqWxDSn;X0l@16DxICki8JCY4Gu9oQJV~k!g{doF+k%f=eDhYyN zz6hDMb4#HHW4`x0hRI_9pjK>?dv7I+%#`y+{{8Gd`ZS$99HaYOFm9@Bm16=%f1`|acH4~XlxXkX`f624 z4A7&;Q!s0G1%SvSNBFT$gNKWcV_sM@TmeKC*enJ<$+YEbbINMXmtPU}#CA~0 zYpJ+XvDOYYx=*-&#YPi*nVlxZ3YtPC@9kU68UfyinraN^o?Dnk31APq5d8-JMl1dw z8sr~7fufBj@hcD^Y#0zSzi`f?UFk$HC9AzS#xPy6M$v2cmg}!+riy|C{sDDCVsExM zJ`6Z7IUzJ{<-Zvu63Gj8gILBU4XxQY@a^oqvxAOufW@+>em?;COPP(_4|rU>sB}^B zJs<{LYheb5M>=ZHnZlCxUYPv_z==HI0O@4f8|(@o-r?pY)<2ZjpS~PW1ALSV)Et{X r{ql$X%EAhi|36#x|A72o#K=>WmqH4VXoySq2;)&vL+!QCymL$K+5_ulv3 zn%|l=Z_VFx7Dd%5J+*7s_6}E7mO)2(hXMlwgDxj4sSX2!U<(5Sn~Q`1ttp9-y@7#2 zsj!xiP?eLApip&o09xBx!obLeC#4{&CM*&Rp56H!(lmTUl11*6bAT=UI{AiP7EujZ zE>Kk*?Ja(LUCSG$hzKMt*H0gNKQYvmexq-a601Ez(3MPdt2L3>_3Ob}@w-~f@Bogl z7%PuIue+SB2)c;C&<`8b@{wvGP)H=QAYa`9fBYC=KZk>PgQSXp(UUncf>SRp5dv$Y zvAursOv(jl)KA{ldwqEg;KuKwh(v_Ji*TkAjZ6u;WSB8N{}FEs^WD#C#YC>jGjmz3 zSZ?x-S{Lv5P=XNGcsOnpEG|E`scoV)4AxJBY8qk~4!CGeXV0Nhj73yS0Jbr`xNcOP zjI=Z@`R+D-Mn1n)lu-4A;*&DngF||_v(g7%-SGsUG`8SaHigV_!`lF|!PllJ*Tb22 z1EmQXG_a-zr4iYSoeiTD{E;~Op^CNNMdL(!8GZ%+WZ1K;-7Zd@xIvDeP|5)a^~;Hi z#u(6L;Ij7zGq0aBBwK_I&CADwbu~tl6l<82A`=HS-jcNX+sjK{?u2G>3L4N zV(62l$oB2rph~{1O&|Rky33BcS@j2zJggiieuH^fYn_HRRa%c#5_#GA2F0GaDi;bF zXP&SaD`b)}P7oG8j%@4lZ(g=89)L2l0gR%3n)W6KcyK&F-yW7Kz`(sN==O#ANx(ct zwvHsI(VBNxuENmg-@RNCWNXHA5@&cS=zM%5ABeyeh`|O^+=H_KOSgg05y*=4 zmXhMlk6=(BqWVV!y$2ldn@aeHTr69JWikE*RE$9C4I)0+cVeh~m>+_^Y|tLSVg{jI zhoqPgbs!dCz1^flkpyv382&`63p}Qv-GO}&?^PwjLw)~o=sQxpI8*M8Dy8O|B#Fm7 z#sk6wE?2U)H*R8gc}7-P-f(`Q*r{mKCUy%%O`&OQs2IW28}N=C9Yo`xs|_VbVgqDy z5Mbl#oVx`vxtDbl`z-|u66ur#Gd3+mTKqd74RRbs#rHRbcx93{alk^jR?yGylsmWx zVR>dmL<&&=S{U5$O;ZAMEz=0L-BjvS1VzC;f?`6>sE5!ZlSVLsjy5wQAVg{4L+_rs zLTwoMW+8Hc%vSVP7$dA;ThVd61;&8+1Aa4!_Sfa;ioV9JHb=h}Y$39mpyrJa;|DmXZ}D>xD&1fK_a2jT#2qom+_ zA%??6RP+Z=zEu&z#zXC6WLJ|ofMU*BafQooFt#5%($xhPMww!z*L{qI$V*+l&HeA{)tR2uY95WYpF#k zUYTZvftpu!gf_R<&8OXpy)rV@&fFy#sZs<@o+KGV6=B&<*^`n@D_SlLmLx4%LFuDH z^op`_{!*zjmQNL`f(5h%)UM_NVcE*8#W}g_c>&pZ!XexeZ06fhOT??3BBc|Wcj|&2)h6M-G#BG{m-?R-8mUGu)ZxEfDa)c@Xy0 zH|s>RhQ89igOJ*Ar-loJZRzcO+TXM!2?h!85@d?;G*qVhi<63*#~gu*^<4Fqo|+BCJyVxoBU56^^xQp0WlunV2cb zE%9b}c|d>5@a#G0WY}oP{zlCA$q&U>!0(eEwcm(e&i&!z`^VXP^hd!ztalFRJqT~% zZIN3>ruNSHK4orx-0w*WIuYB+JvLVTzBcYX!NiY1XY|vt8719w>Nhm8y4MqU@CaD_91=}w!^>>Q|MR@q+pYU%e zm+0DP^a#vJ>pAxHDuI=3O$-?1g!mrx_7+`dPbXK8+oao9+h@#dx?tDdBv3l)G-0-G zVZ*of1B*92lmdAIo2a~B^@m91c4$uJN%m^J1U*?FjGpYC#Ddy$CE333K*{8_(4w%{ zmrIj~&+^v8-@mgk6Lu-1%dTepp=6;saa_{zcJ($yproeUZjk+yNNY1OGh~py_`V5i zKhiSNkkG+ch#5JaWH`8vz=GRydUD{PZASA?NCWR6bqUq}c6{l3x|DKee3s6xQQyS@ zOSo45R#DbL=6x0i{k&$glZdsX%A`kau?igR#ws42tmd|W=+|`WFLGa|=U$q|frdkE z9!CZ9y!+PsRYOOQy{}>EzWu&(FRSSGfZLaE4{G=3`_hlmg1r7r8-xZd4GhdIPwGFI z+WsV*s91_d+sQA@=pJi!eCD*Tx4Oz=$<~iaEKS@=zP8J%Z!`s%>-RQ!EEC#wtN&JQ z^FXu?a}BFxZmF~`*&H7e>`p96ywmj5o;mro)aW!Hw)(WX>eF#Mb2_`G-*R^)vf1VH z_X8XAvqZ@$d zR!>tIgT67`vwCxvi0l=u z6S@0&+_Er)R_BiA3|=c{Yr^!e^%%!Xvlv7a1Ts9_j}1;+95S#j)| za-H4ze>YUUZ0TG!1G9trE_}8N2ipBXo2eEasXv?VR@K&5tNv6PD47&HQ=X-20 zi8?T)yi+fxFBYQ0rjt9oJ#T|vem0@+bk z*98WK;QikOE2mC#4xNAAT2seWM@dn@+`;aHsfB}?cgoCps1;Nbk3m7SlTpOuY+m4kx?+JnW#%ih)0lf~YJ`d^d$ zXC6sQ7jtK8M^|eHdy2pFnwmMdxe8NJ{axt4o_~F(rKk0OuVnA??`=Uh$ojX1mHh)7 z>wnD+9V+y*|1nbMzelq3aB=<5q5q@l z|337Si>0%KgB^5DSCRiduYV8zpN;<>D8%}A>;D53|AO;BwNOBdpa`-4*P)4^FcyBF zhn^#ewWNwBG>2l@KhGreKRq=4&7tWhn!!bl7Yxit7&%EXO;6b4EclLD9>N~XDD;$G zN1_iQ=%MX>j-P)*|Gsacc@T5BvaMM1^%;it5uKi%+Wt(L_B;9F@};@vB*_DEHpQis zkQv|u;2)A}!5oFi&0Pxc^np|9|5DI@13i6#rjAasCA~)~gTz`HJ30p&ubM z`8#9$y5WCwW2mqa-#)3EUTyXvmI`-q8Fct42fnD?$C?~ zTS#4NxZa`^v2MD$Cw9TVi8T@m#N~YnzDDMRe4g6YmkqL~{Ch!LRA7#d1`;Yh2B(JS zed&kAqIPD!Llxu4`9Cf$gb$WPqVw*U$3i|Gohkt5ebh9?MfgV(+;asGI#rcm9!X}q zpM1VPZ-9%QCG`~B*~9(`fL@e}Rmkf>r-eZ!U3{|slIaO_38Fq#*P_a^Eku4UO9^40mEq{;{<*FQd`hh6|$7NIGQE-E2GNn zbW{IHPS@$dxQxlTTY8vqsagz$+1KpAbw*pT#)>--PEP!3!}i$yZN6j_BPeb#wTJZx zp|3-@n}O=r;G-zXDq%yY=!AndcuF8`$_$?7k-2Eja%3~sSR`0oqRwZfyWyEf%xlZ3 zHz;t7?j?{6by=3-vs^YREl)aKRzesOMNq%b=iaYMeM-Gn#=q%Gzjua~wcs&0B5w@$ zIQL!kwBMcKiTh?TBVJeWpll5)mLg$B(xJX)!gg1Z)37`1Qy; z&ue&FDSJMjF-gFxc{SIW|9mv{3}JrL`1lec_Dr*=AZ7$5x=+bHG1D2jR~>s1m;F&V zk-CfmNShFl#@A_NC`g0EdK~b1zSRt{uJM-4X*sP-0Kfa}h=B_(O?m`F@bc*hDu^0i_4B0`S+x$BcmErtjD#mp4- zI<{N}8{Ft0|D*yh^{pTolf9U5Hm8KvBx7{c#^Akvfw$S;HO*>}j)lA7{4=K|)un$r z4D=q)t-FHKz21c$DnlIf1A^9@V&WzfAKEys%gs(bXjbv0gjd>J+ zkwR3lB#*1$+c=RJ5+c{A9W9TkqS3^A4Em0z#bqpcHh7o3nI-ih5e0bEfCUp_wYCIkT@DVE&Y{Pb zag?*I__`_u&y-7kF4h0oI-}AiOJ?|{1$J@9&fN6sf}89@dM547!!*GS66PKZSFh7K zB&VDz#)$VL_UQ}?VANtPu4vR^{G(}3o>g2v9OGoyn4wBscLH6|40dm4D)c_n`rxevv&|%gq@na zUyai7b&)i+)ja;1T?I#wnAyIaUooRD>9OkJ=Ckwn_8Ms%`k#idmTP<$Z6j!^< zBMnzX&0+rNncBer!`^R55g%?KrV}3&eSeup<+k9F@Z=4@5@=~?aufI7EKbgpIu6N) z>?zq!v=Nrpff$}o4rUd6<_`)!j0_VdQZ!RvSh!kPtxlMgS3&`BGmeMZ2{pa*{$R~y zDTx9=25msW884$Fs<8~1E{90RTI$%`!OM%voq0`hL&*pPBPd|~1r9TNJ>+dIP8ez4 zv!=Q~_wjG#fInII`1J?Das>4pj}k)N+6x;SDi7FR_?+$m%+t%W_((73xta8Re;LT# zvkRs6@29}W4k-2={835En&EAM?cWlKqX;_amTpz-Qr)M3y2n z&n{{%`wo%LA!4w-e)!s0Q3$Sm4M&t09r7PykouP_ii94t(y7j1k7)r?VjIf$r1$sV zxeW|STPm$gI;szBjUI6 zGBl}pJk&?Zpbl#kA0e|$?E2dS4x(=BRLBn^Xx~I7a2{sY9c!pyvB--~fY(qG*4kjPzZLtpO;I2#$%5!L% zT7Fq7?RUo1xR(icp&7KeNDtrb3v`QhHAoe@T(-!-@D}y!Qrs<&31Kc2&rKMMhIq2$ zzB%p1<@NT}zw^Hc>!ob}Y1ViAJ4C^8_eJX4y%WvP@AL@}k`z+XI67AHzUO_9G`SkV z^MePtyr~o+dz<^G`otz~m{lmQZLGL8)lA+zYA6uci zc$`)mdu$E3^ggYsF0{Ol%-k2`(cSpf>Ed`b<>vXY$4?WU zfTrHBfT*(%D`%G5N(b7~Co>Uh}ario2KiRVo4azB|4#U-;B?t+~sGYTDKB|}+P z%#F;RCmPxn2_ZxEbaTUS0G1wpuKdpLL}Il`=gTxqLN8dZM%POqi@4M5#R-R<|3ym@y?@R;mpGQla; z!S$V4S^nF(+S`zlih#7gXAeby<^{p%bt2mgzkzIF|B>UTm*qvRUnw(L70R02(Lz+Uj4tf-&QKcX-&~$Rwee9f}Q@5x)kK#E$#oVxhpvQqfj~CF|7Aefc*fiv%$9)g@^YcO;^&;932E6p4T~4 z!ku`Mq(|?EETVHqGUjQ%zBRs`fyFso0%0UQHs&+!S}wZ<(dPo{78aYaMoucs*@lAA zobrz!1WPt=L~9lnKB3$TDWiP5cCyevZ_C?ptnk|mWu|g{*Nr6y^EL{ychcUhYGdVY z`rU}xzh;;^S21~btBiV3x?78Yk(d4A0)1b+39q$(n$07#(}iPngzPo}s(%?jSD|LZ1q0vtG?qYg29`VBYtPA2Re-6K!M)>V zV?G09|11qbqxm@>Ndi7=WwX72_h8{{d8!;ZxMO|puZgm?G5JHO4>X+79kbt(gO*M^ z5-*gpWI4;mgpvVA=pm6oe1muRyk=jK%cuT!SUJ=GLtQ1F5gi_n{m;vhwqEe%xwsg? zvBkGDVGMhvRRMygY=aV=T^f{V^wwVPL5cGF!ygniF$>^7+dt3P{2o2W?$ER~E#;DN zmlBVQA4eNG1{_ZQ$|19x{pD)s%^Fbc#Z63?$4=)9DPR4NbMC?Z0z%i7#4n-aG#Yp+k7eVcKk2< zxAM=p5L_>m)u;bnoq9NgVU_JZv*fS-f?qcmNG|V|Fg`1EFIau=;(v(a-#k@V)jS?9 zpvw%Gj2&=>dZ&D6Wp3hCYd2K{fswsD+*dUN*ZFP!0Ir#}R+7aUi@xc$e+RDZ`Ch6HzC)CTrR2c;=jDkcGQ1#>I4aBRbM(m%oW@Z&I}(KE%X1{ShIkriVeTC>3mL zG#dAj4kofy;i1hYkItJp(~CNjG_$ww{YMQsyf@Ikmx3EMSu)XX4K7Bty&V~YD zK81*W2KNTP#N+Wv*!IV^D`N7<@_KJR_%C@tVs$&<10;>#k5OfZwo+?h`1!x8QQoyx zBXZ+^i1>E=7T}S<^U4f=l;#CV>$MC`BgZ4e?Z;Pz`x4bSgN#4zXy%Bd-7<6EzjB+|%+2Ksm7{CYoHN+{)ozH5D}?>3tz6Y=d;v@Efc)|ElD zXXb7&0)ha*zJHEuM_`cE{tfH7X~jY?Wn46H-`cC8{lH9GUwsT~%7M90v^xGx4R(YbGv2CwKq=;P8y zt%aT1Zu=kS#_0!^0KiONAgQv!!RrZ8o^Z?E6Gq?ig&=45jesl`Q?03iNN^Skz+Z}e z&yovU+$eh}L#DUkWV?`pB=HBjh2P=M4N-D|!>ro*x3OZfPWwR9T2*A>nj5_uV4vWk z76&sJ4m-0vVg9ud$NP0{?FfgLc?Kn&@Mz=4ZwtLQ7woi6>e7}&BZ5g6Yt#K4pT=|m z914INyMDNLc>O7$k+;193>@~R{;Y*fQH)!8lS-enDw8QWWo_>Ql-ds7Ev)q)a0(+! zO4K5~e;aGW4in}&>-brZ)cu}|(Qedd(3z3OtWe;3@rDNwP? zD4RhM^6)m8nf5~k3lCepIPSA~+8Tt}jx&F&i)0H;Dax2PfYa(miEvE6BKpJdsF%T1 zN3~m?@0B^62>z~$l(YP% zjIX*z-cIN5svWI(D}wUf#KvMQw2FriiiUSFPn2BD{mRPfdYYiIEo zX$7b)Y@h^T)B~)moi|5VM9;KLDKsr`v7$14KfxlY+WAYY=*ql)22K zqDMaw>!62M22u4uzfW*0*>>83lYdGYUtf5x4Q`KPAo238XSA_!Aa1N+;t9GMwKVRi zc{=-Z!_g>EOm5$?2eO{8W>ME{TdETDM*t=hEi4SmQOe=dZO2tkMx{W3_C z+B1qDjv@F?Vc7v!rBft7loUYDXOg$qHvUT1l(j@*sCVCoFpK}jst)~gy2T$Mz}t4O zv{O{QzT|{2?`ioYJftJ>f3+qfo>*y<>B>4SS^>95NpaJ>%CR9`r2HCtAuHA>DDG3+ z^_^d`JN+45GkH1SK~Kct#8G9UaE>r@5ia7UA#mCwm>*PG#>s$2P$}fw_-_=zibU~> zD)uz#8v95m9-aLXlu zw#tMNin3VlA}ORY#bcj!kqyVD^O`uSsixB!4rfPrnhD};RtB%{%lChDo*3>!U$^!* z(O{OU5{jnKA6^lsd;Akp0Y2IB?&l@h&J%ak4I@qG4Exa#d|1k(6UI4ygl|QeDiTe~ zf|1)=Ib!R!^ZwQ##y})j^&l+`xu1!D=Si|&a#3R!TZ?Zqigu;lW_MHS(h7otl$n{o z5B6sm(Gt02l5z%n<0{1$DyPP{tr+*#GKHDE~4Y)#vhp zNP2{IHTNfBGtwk}U7jXy4j~f0ZvFeJ%q}kj{OE3aTUxt6x@dM{$R{;g3a1(`|q z0al2!LSV&;X|cD@_MQFAP<|3ZrS@grx@;4k7v z5^=h$V;9KM!dOp2THA%kcDDIQW9AR}o0kafe{M;yztP^t z55b|<0VU)tnl^7mVE)k~YWc{ilvFp1^^Wv%%)hoT9PV>|A3}rGFId4RnHsXdT||PO z;_V7h(4n&Bqxh`B?~tEn?}Ge)M0B5wBA~Fp9CS>8&Ds5yJu#OzOJSy6_;f;jx^r8z z9XBD?(o%vkH?)b`2E6Tm#GIyIRWel?`(${`6KS^)!E$qP3S;+ddKE9LVw6Z zvU94>@`Iq$wO1jw6fbc-G=xwovgyj|=ho;whRZvq)I6d4mu5x~+$9wtp^Ix^_$ z7W&y2i_)TJuHco*{Lu%}(j2mM+?3*Agygf5>vs;Rl(673iM<%Xn5ZJ6=*PG|@aEJ6 z1RTBU^^P{ue-1ULtMTtW6CNh7geBeQ`h>>3Ve$+i=lRVu;N-GuJcl0qOz4j6qrHJ} z>K&u){LRUUqS2vI4f3&#h?eZ}Wet1o1)qb$4rqq5RJVV}1QE7L$9oV{)DjT!^vC?` z%#hG!@9cM8bwFcPpkT6n;j2UY!*WE=E{3W6Cbj35LGws<(_i~uewq_Z4N+Ymj_Zkw{goBkKrOgjGTCrHb*U@p|~ zWm{Pmi!(02@(EegbhI)*Ol9!YrOLa~xN+)SiPo~6=<4Nh$#nCMl@(D$hO4z)i!l5G zdPl>(`2Ac9l%pvCn4&R=C7Eu3E=pS&tuBJwlLmt)3wFN=SSl z^oSpr?{e$!|0HEkv|R(>uf?u4)U)qSC!JZlAtvfBg2f&D{Z1~r&L!=_pVx8 z`+oR*h_u~a;1mVg2T>WHhRa!DAU+SUbxXS9hL#Z#oyT3UQh>fVr5Gx%`G%=kGmU5W zJVhs3>eMC@WlA~4PB8+EOf|yBHU?&u^L_4aNskuRu}0x9nV8rxFbX&88>Sa;48V%Y z47Q`gUp^6Z)ki)MSEX)h8v+&L00Z@6M#3dPrcUQuJ&5$4_uVG9uMD;Cb#1j7-nP;T zUvL#n#y6uO;<5Bsw<}pO2AZ`%bXnuGL5k%5Xli3R;v7DuPfPL?NONL=vTu@VCV0R3{TE=wZ1#&xw{IA zPfxC9c>UM`)K&vJU5t&N!pBvcKe|W>72vkx^XODV;JVb&3^t==48rsGy8znqwZCU0 zn7t46JBzhqiPKs&I8pO?7ml>_hZx};&RhzVZ<`dWiswTmQf}p&Kbd5-Z%a=>ImxHL zoaEt)=+N?K=7IfyNAGUai|ol$(~!fB<^b=jUC3KecEgvS8L^V^6EQ|~4_3dtphz5_ z%j0z))v&5frpSjIQ23)#a!_!25^5 zxyi=A9gpXQA~M}q3nE>43a4-zrl<&!)2r97=1EFi6v@#uduq44)>l=aZZLIkWX=2z z8eomevH!?uJACynNr}{o|EO;ge7NF1UI*r{wh<)flL~K3h_ddGs&6JBK?3o{O_RNSnymzkz z>v}m-qUkLf#_hL+x={F_>|Ux!y>&M$x)?7pbF4qUMHAV({#gI?$RXSbv`nn_T#eZewtmnv4Y34M zp{_4hCD(s&Wu8Y&n0CE#e?{o7#3Ytv=Nw6&KwPhHG`t0z66fn8C80j?qK;|0(oZYA z2g+h$d_QN>8aqwFiI?B_b071KcsHZ@*Ja3)m5r182zT2J4x@%V+Hn3)6hr~X9*MCs zzsE5l8UJGTt`tF^oLe1T`n{nMoKmP`CxHl<=;nShNPXFGL|=_ZIL%q#Mr60X%`0&l zl}O+#Gd615$HV!X{mP2crzWj&f`ygPSS8FIgkCKCEv-4R#;kvRw`1;TXOZ#A2ClQ~ zz?BK*<`uWgpWWPDYwV>pJ3b`hqpt*0EjdgMZ-ckVa7XU+q|Eo)+rWChZ$du62^BfPBMN-a-S--2-KChtMVmQ&{lg%AYGOLp(vj86J^;PUI}w}bvULSK4a^WjayXIYQ0GlvoxtW zPH!d`Rbo2ZicId*aifd)=-z)+i+gdilAhl&ABmA-*Is{OJAE%=Y0Rc{VSVJd%h@J@ zgqByA=D443LjPJnPU_^jxsI`aTtL^ZVD1y?-P7l8Jv^;ls}yENIeiR>-?-y$*ou;^ z5P2QV2m_}2%@ygND7miCveE0}B})jg^)F_*RHzNC2gJYbs`H)pz8VoXXQWU zGTN?q4&DnrmE~CMX4PIUH~-qNzdX^-z?$G zf$s@Mz5>TEwJZ`?Zgw70)%>)n|dnV!rF`9AmZhMucZvF2ZY&9{;bRun*2?{brcM`=<`t){XtW_P~%=NgUl zJ=c5R>tCPR=Q^wqt#ot(_7a!;d{c2J;IGa>kO2(cN>}#>>DV|3aCzuv(oIaEzu;p% zydLl?9=1~UIVW*6-nUDOhtB@d%F(!W@}K@)5)8w^A(Pw-C`IbF)P@CqEI)i2Vzd%T z));N?)5?Irg~;7qz`8fjSk=#b9=_ku;3<_zf0IXyYHVyIc|=VSBK~#@_Tj;dBOA_v zJ8)7z5Quh3iyhqscxpG3Htn0Rx+VmnbL=fEdP99NE8w>7Z@d$8wgyZ$M8(mxIfN%! z43;4kiVcdamv%(LTI#{Ccb?N)TW4-tE71arimgsC7mG)9=P%Dblz)OyeRB8Xn|@W9 zDw%E%2oAjN`7Nr%ley9hY56~D{qfc6dZyRv^(V$Frpq9(MvRVZxcJV;JY!BK9>xJP zDCl^ZdvLvEZgI|qEmdbmA%4_LV z;E?A@&q(LaVEZISfPcXZUshE;_!WGj@m|J`KA|Y$R3tl@!;<&ntOOT{Irnk>HE1a=Goja3Bi7+>E?%kRG3i=?pVHGMumtz~k9gP7D*fKR)QTPd@l7Uf!sub)v1#;;6nl>I>&tW}LJ}-!qa1+B12V z$_?F3L=4O$R5H~-Omm(Z!I$?3cZeW#Eufb-6Yt0m1cy1iJ;g@u96brsi~y*;n@fA{ zf>e!5I034hA&(&5!+7MZgeu&P_rB*b_g*eT|HVC}A>d+ppzBpy7R1*vShXMQ^*2C6 zo`5N9wR7JCrrHWCD-IHxlNNnvXQ=>onm}tO>F#Axrnzst5Z4$wv#9r`tL?Ov42y8p zEDeJXd#v3&W^Wy$HL@q+>eG$HubYR-3_7i<&)+%MGVSBd9Xn>A8}1Fr_?Ior1B;a@ zM$4jBVW?LHt5!e^5q^s|i<{$+Q5>v5z%DEp(*c>4J*1jQIHTX>7Pfr%nw_S$a9$kt zEN9x6qV%Omq>0-pSNpW`xR0)TUAa5S8|`Y)eR=YeC_}{M=k+VB4+eZvsTp?fr3Nsv zpgz+pDH+a`5#lqb!qW$h_1N5ue2loICMTchi-!zUd5mg5(=_gXkx5Nj?@AKMNpcV! z9#omDOe>*mV5)lBGwA@U#^zUN~|GUmdq#pn^Dq`PvU|IMH==3f}bLR|Irs<`)_ z3+!NY9~oacp}jgI@Al%~=<>4Kq;I+ne1zCTC4cdg=nFJdD-b#c+BPGgHDk_~!9td# zF0J_~o!4J;$u+e~WO^+M-P_?3Wv0buBx@F-s>GfYRih~;`3IL^0kT6+>||zEg6ULO zTEzQSbu)x)a6b6qZ!A-8jk=c=unB#u{+H+A`0Ql}Dm0=C*)hXSq|@ys7p%q!*sLPC zyr0%*p3h9{#f*rl6vV$QW?=3%-0XHe6KeP@51U-tW@u`;Q+2b$yfF9A``) zgx=lSyv7W)u_ul>M+7(;do`aoB!KJs0a4tR%{Q=foI3&n?YO$6V0uFZ1tSxYLxSi>hEL4 zzA#Yk^)42&Qw=5t?~H`7vsFTcgX3T6+=Bad+oS-$Rl+7MLwG6?B-_;fZzKxopgvK; z0M&(!KvImA#og<~eki8_D_Z@oc_~B*Y|4@fGvIX-Ef>%^uGkN@+-6#tbX{Q=ZnmiX zwRodtI_+RBbH9DSfv4bjVMYV9VmzRHx1C7~emvIFkLUW`vlt&vP8Bz_rj}6Bf&sq;L`EC z>K`IxS^^2>eXlNZ)I3@63+q$bZV(i$R5%-6vLl!4k_Ib^EE=@JWw9-?&9yPb>etIh z#23mVF_yX4zjPH87q6(&3@CRHt8Sj*Pdo%AqlI(!HtbQZYqDo2QNJ3MDYU`c5$sucg=p z$nPb0AFt*o3V(${gNOiUsTt2Shm-=xP#Nm3X(EhD=izqSPbrPx_KEac^*P~s&v!lC zevLySg5T_NIvGM%IAnAzBZK9RfnHWsa)BqFt$jgbu?he-ad#m}7TRH1T6 zP1AY~RWKo47t~705J?iL;fLx)21Pu4p46}!3$+B+2Gdw$A&Z0BHh>YN4i-#b1Hj7U`MB|3d-pCzdaUg zd@RYTzKh352A-EE^;(&$Hu?lJpe2D2Kb*ieEO&%Fzcc_%HZ6jTe@|Q=5M41tDc8*J zIy>Q5A75>D*5d|3K&o!s$>bTWSl;z}JX1Zo*+D$S%%b-K!n>es$y7f&dt;M|mXrB5gEL zT~J))cvox>V2b#ub-UzBeWRyy zZLpbj*s=^klzn=<0~Pg#h_#+{-zMP$o8bx-g&iac!i$gu{psy;wJL%+2`BAL!!2v? zW2c++o?cal`I;hoRMir{zZM!XnM11AEX52G^r_lIs*?{JpJsDm1y4= z1F-K(7OHk8M`I8tIxj^h*ffE~c$d44==po+3rdxOJ2y=M&-Xx1X3rLj)KMDx;|$HfxH&ufvu(tP-vds zAELcj6o9Sc&PjnL_^*TM7o8?!SA)e?Ux7>vEHv14KLq4bfda^cRkta1E}r?fQy1^y z{<76X>{#>feM%btAX;kH5QaX!k=DXs!A5k1UKO2%k2xEe;B*w$lewxA| zdy&uBYgUXj;PH5hzMh=vG+}Cve9~sIjs3O+d{+iFp^{l)MY!)!_WhHC_9}h zFj-9%q}%E3<1njp%NqXiLD@MbA!2Bm)A3if-PQw;>v<&~cC&ESNS5N=^$+GlTpQ2H zUFcOFb`Wk!Mphu9jtvD1Pn%x1!K&jZry3^UU>1;(EcD-jj0GI7$2Jh9cI{AD5^dbl zvLT_bU0n1FIC^;6_RJMYgzNWnfSx+4NJDuHK{~Z_I|6@8FacA$#gzQI{QcSEUe7sq zCw}v92E!ffhyBANV(?|%(6e&7WS{T-?26$qX5cXY%d%A~>9PVw_d`D5cC|*8&Cls# zhBZd(H#_tF2EMRKe;!uCFYk%g9ermKIu#ea1<_dqiQF=yhNB5F*FL zOeQ+5_eDZ6jXt^KDUfkVd@Q3FY^pa{Lmot%kW^v)NAsCj-mTp2Ol^s{uGBUIWp&lxU5ZKNX2R60XBPhBy-`th#(UqC$5U&m(A9^8zOH zN6+!t+MreHFI=Hk-&7+3{Hiqrh z9l~7y^xc1^DB*>1fXmpi zJBL-)%AChU8vok@v0RL7Yy8n3I#s`X0Kf*j4#F60cPlVnFPnVJ6x5+c7r}Zwl4UZF zZFuR=Emg~(Tt@=hXF8v9H}kGPUiD1s9ORCAZLWZnWBJch0!qI4X@?=R!s0Z9_^+_0 ztOfR1>+buV)`YhvM>+exS8Dh3&A5&w{+2G*8w2fX1te%TrP2i!#x5+E2Z`{zJ&Ye} zrY0aaZW1!KDhyoy61AC|Cq@?3ko7S6s`tGULw)FGw}xy^-W0zxi zXa%qBOL=oQDN`a}R4wG7a5`MM%V0AWc_?~sqolkhtk%i&`9JNL{Hu^%Y?}AxN94#c z7KP6rIS}xBe-(aWq3-Oqpy*QEoO30Ww;X~wV{xW2EBmlYjgZ){;ORjYI@>B^9}FtT zOEBmu+>H1JD&N9xy`V5Vus??wc}Q!mC+ll%(m#!{%<*C>z!R?H#`v z+iHl5at(3tf9IP>9WDeD5F zzuB=HgBK}VLRugLMeN5D^T=Q1x$aPQ=gCvkYsIg&#smZ+8uUP5)AMt=GguM7Q)$7V zziDV4_qZi&+qhkvpvQEJ@G*9}=h7|MYSXvFbPDM2 zK$WS^4R{C588ZKj?vS@veKZ4QGmo!ZsL(oe9Dq}^B@nyyO}yh_2CAZcSUH=$OOg15 zBJg2^bN6VW7i!(-5q>CZ^60dy3eO+I#;o)4b3svc+Fz;FPt2U*1Z;We?4b;&s5ToT zm(@L}vOAkn+>>col%KY(@JnYUG*f}p7Hmj1*1J7)gn8Cp5pq# z9tV7Gmqos0ZTT7*@p6YC30|5N+2cd6fXBZnFW1T1y;Grs*Bjmp>Ve`&60MVSnh#6s zuuv=S;FZ`MyovO_expbG*w4Y3KPMu}d-tKMXTf5YcD%k!pd`S^6}!+})X>;GtGw~9 zezKe^vqCGhLgFW=W_LV-_Tu6AEN>BN1uXA;yF55d4RnstLV4g8+2bH~*(p*Jd?V*- zVfwzMsDSbF)be-Gu(+?QUrfYjjZSSe)RuudKD4@mp$avToRITtOlqaj8sG4_Y)_4a zXK9}9^gL^nBS^A!PFG=2xW+vN|h zsS?8arB6zvJy~ZTKTn_Z=C8UBuKcEOOvUBfrO22Yn?_nnQqy`H_vsBs&Y+NW%k<%8 z`1!4U*Cd3@(djuVR}?ulq!%A~ZT;ntyaUa-D%UIglBe!$VGtgbK*N|8fc_55dEdH? zg?}J=%yyO=1|TFoFrB)vIDWB!*w)QE_K(e>TIUiT9(q4c4i?&dmKL&Ll5iHIne2DJ zAQ9N4tuJ)(S?sLV#@N{@JC6il3xeU@nrOz~x4!iH&J>=At5RTwIj->=dOc^H`|56?Ka{$@{J8grX30p)b4UcRO1R#hUqz zMQ9Hck9R?cnYs;O)SbL_CmJ*9_>m$SYiQtm1t(Ehu_^2JJh}IZrYHHLiRB!^nb^&A^2UGc&jOBS(Lv~WA^-{c;C_F-Jj4@65MQz$kvwB2! z+xb~(^Znp|w5b*Z`IaFJR#I~W&MJM&>-oX9EO7&% zWMDP-8uj2xwhB~(hUKFfcX=uqlX)sUvDU>^=6L;{Wbk#*v=yBebSW-Ty{iqh0u_ef zK-eQZwm%fqOps3-4vXiWdo-s}vBv``k@GxF>R!QTBgo&rmPI-w#btjn78IrPd-OG; zP&^T4`K*{7{afGB;q7boju(CGU3R;p%)QxmxkDzc;Y@Zcio;~@ym2ZUzdSD5PdSRy zTdW)R)iGKxjwLB?%`9%WR=G-!8s1lQJT-s%g5IiSl~otYA@Rxrj^AMW^5P+yH|{1X z|H4_OzR*lXk6>}?s(V0~VNWfLYvV(oNtW-cMupclJ7(7ZF;A^A4oFn3mzXrvO$jVD z!|}M>-IDe6;b%g4IUaPVP+j4~%BQoYG4v8TnHl36t%3%$3m{4oczI-675*drGi9vZ za%`w3XjsokFQ@uc0(Xu>dgP`?63AX)+PL?v%K%`}H(hBzdOb}=j;UG`vK)RuQoC#q z%Jkh6UG{0S#XR!t{RIYGIncHUczl5b(k{=$k#Xf_Rfsxk=xTU+A2kTv${1l_%_&Q~ z4gtud;Z`AX1ZPs+d;mSV@Xa?>of*zQtW8`;ymgYTR#%{Yu*!r;9RuKymK9`wx4<}L&d4@K2WffJ+wi84Yiih?s1ig|!1q*hqb6f%#Ur+xei8O+zr z>K;Z{AhE04D3O||BBbOyM2t$0B8(pA;&$(r1~1Tl%PhHsYxJ|{Z-w2r&++FgM{Yfy zfuf?y%n~R)Vf~{6>ZP%9DAb(WX+cvYs9k(^OT!YpBaGt}_IK_#{OyLSY7V*wG6Pt% zHa&UYZl6F|g>U+zF+ROUrC#GU=w{L}s9CKpv@(m_T5ET+E;_++6z;F^gE&Y0grPS~^j!MvA>b!8uxbJa%7RQ7umNfql%uNr>C5 z7vtDR+=OQ7gs-F5_i{Pt1H=Ua&01I>i3N(1Jz1bO0899yt09)@sC^cR(lcep`g8?u z=mp?$7C%8kyW?X=7Hlk9#b|wt$v~e4HEHNI+}vl*%>Z?Uh&#={j6<2NVC3#+gl1-R zXjX@t+41QN!=0thi1lzvX#9#H;;waizb42EgTrB$h@D@~pIOud%;b`zd;$fG%Z8sr z@MQ3PU+~*4flAlHPbuO4r^j%d_tf6mTU_=bZ~eSx7u{IomwIF-(-BT;W^2Xij|1r_ z=7d%QKx`CFVSmoW8)m;;aH@Wp^OxJb9|?RMn3y*<>aIqp?2}>NlU9e=5{qG|r+YTA z%|j2x2vf}8wg)BuOp&aW*tfz5OpDbWH~OAQ7O&;B1bZyMo}%+n+m#{t^_d%0YhcQA z&}NzE`y1049RS^%YqA$%mEzp1@V0N>-hzwREj{2X2He@QEA}#$O}tTS5Z0pD8OUW? zxy{17O#&}ySgn}4S^m63Cjru+G zJ9rnt`6(({?28+)%)PWa!I&Lq?ws=*zu-~)I;gnsWex1WM{QYj>67H<)Ev|fJ#K8h z%jgBl1!=9SGz8xBPRwvDT*~{X2dSe+Jg)xN3F`QI`3s@VK7X?#=|hORLZ9%7t(Aqft<2SPS95MqglZFpygCu@48XM{(#&&niiDL9|wheabY4J zB~4<4(2n{>p|8&I?bX2>dA|c z{*1-YKt;7I#ciM2+hRi`FQ>guUMHaR#Vzmg zY1nzl*Q9y?63-tZygR&Bf#3pb@Aw(sSM#)kOI$@x-o8es?h9c`)%sNQ*T7CIgs!GX zj;rZn$BjQ_gAoouorL0G2f6IwXZ%y$tcW7Ka>7IeZE1KYGg4ApGi(^gq8Yg+%ZP!@ zV8vT>paOPjmysrtn;fc#7t)33S8GnkAfO*JT$OfynD%w=)UCCmZ-4))McIYf&OtW~ zB&GhqXS58S6{v!k-0|`=`l_YfVtOv8Q1yKuf}W4v%Ez$cHkBe>ffZXuy-oj=qj!+Q z3LJj^--j=!PhZkP(!znQFY|}JGBtfePB|1|8#hl`i?=MuF#5fLjcmEbh zTyG}dTvJF1+UcQIWg`3Zo~;u37@?wSq4Y;)L3?fzejn_&*)8eA)M&#Q9YH%V4uz_# z=cclVrB4dAI6yC77!@rwrJ1XVAr00T?O@V=)N`IX0?a82L8Ysm2?yq><7dObJNI6A z=;>c7cnEqC<1*V>O&PRnWv;a8xvUwgw=5gqzIu2G%TyY?xAU4vXdUIBotjqqSlZuT z4QRShnSHB;ZgS7WIu~f{-sdn^Bc8a}-N7#w=t>1V6iC&|5C~0GpzNBD-GU>Sl-UqG zt}YRAzz+ocI;$!!&W6fTa(NvL3fw?H4s>fK0MFO4s*_;UnLsywFmGU3ea~-Pmmh^Y z9)aCinqtJ_k>_>BJ(mFBps%I;t;lu#q5|LJakiNO(LStcK-$ID$3J#SP-#nT;{eb$ zS=aU^AzP+7-ohzCw2=EK6`?X)sRDh%Bfl z7Q>BjpPSDYtbVuT(-C}Jkn8Ct@pJL!3#m&JuQ;|ZZ8lSzJO9A7sJ3l>Fd^#ad+nXOhVwmTgKh9Btw-rr-QsjVtf*^SrPw>Y;(1L9 zB=-Lyp>EcauQH~_IYMlpoy58T%ThFWjlK4f3EX(xWUm`i%iDvkVQxIf&{!FW4SCFV zbAxSMo-kD*YZR30YU^rP2Gn+=ikey=PBy#lOR^IR9lJ zc@Wor`@O25Re=^7zh*+*Yhfsyb7Mb+huHb?%!?&q-QOrUoYZmK*w?aaF^$dYtHO2! zJ1K=dR)MP~Om8;}D+^(|R4<}rkq3yZK=!}-rqjWPx<8-bq3BM@DeddG3cjU4VYAd} zi{YFt=2my7c{F`I2alu@e#8L>R#f)vG=znoG0F3?Hy$37-$YPv+89!fwWp(8^$d;8-hE)#g1eHfa_4Bg z=B>2$l+{yPnLxbUl{FdO{!ZJx(#HA_ve~v5)hpE6P17p5?)0qpm^?c?{}CJAj?SCl z&gX-0-cEI$+<+6wAy8FgxkUcV%Hvq1`6g)j_pnZ?@)Faj~({ZDgi}0@AXe`goq97PLrq3iKfW zY&kNhhgQBxsf&^XTDz{?I(jji_E_qMIV~>2j12jv^pMLSpkdT(PcTB8IveOvmJY7j zBriHJ!S%-PY;CGk!hE1_R&-y%e32dc$=$X-B{y~IraH(s#bz(M>SjpsQD;uo1u`TR zLyO2_VhKxaDI+yx^_ag#N3P4*?kYh|A5}q2P?I{9?y`r)H_^Gw zk`uv=KAVZO8fHZg7^$InK+O-yqF%fdr}jIq9jA^V7ts3F&04-RBI1En&7jQn;3lk% z^_1(fFp$|JqcmaGML-wYg@>E-88tv`UGA@XgXnlK=o}7r+7c*%^*4RY>9z;?g3DB| zg<5)`2s{HN(b1)SD{P$T{XB+Fwcjl)2rd_YI?Xf=yhFwlkU9drP&vT-F`Z6EpHx4y} zIw(1CQ#bUHCn+F}V6ing^f6s;i8Cy8;sMI*go8jQxTq>e(21Rg zl5N=>BIcF}Y`za<`g9zs;8rMhQ64(P9yw7A_Tl^(01_&CUL5;{J1q?Rkpo+uN1rX3 zDS(a#rtapvLpqDF!$5h>Lf}K4$7Wq~pKlHaz8>n)mRKaFu6xXMpFAQ!n!%nSlM38; z>!Jhhl@?@kIV7+vr#}pOc)Kv5FUR);+~xI5WN3`vWjs%ygKXxu84*Z&^bi(!MU}Q{ z!ZKpUFMG%3>vz7|JRqW7n&t$q%-&0uDNvm&hF>tyEnd{4iNU$J~ z2!EIoB-5#KJ{1g5Ro#p_%JZ~n&l$G;YK#qqj3Ch5ToWCvdV;iH6zt!3RE9ZL+c6om zXZ^J-_4viPR8EWx36`pmipMPk`R=|RImoUslE_v=&n6rJT}6X(kz z52+jL37=wKdkuR^Yl3nB1`$74+ZPGi(5z#ACRtwYr|3-yhfbRD znl3;xnMdBPy98%YBje?5M*aiLR?UaH9Pg_Sq>(8~m}S3~b5y+D%5l$q+HN*#&nh}c zZhE7y9MN)ZlUZGzB(N!3=CvhmYkdrxXq~d{qVx?2wtfb$1`M};lw_`{V7*vi7Nbrf ztAGBkx^U*DyYc2Q#4fZW+wqguPiFyuAnjksC!b{vb_kvfCfCxGh&s|dXjet>U#Wxu z7QA1|3lMRsZ%JTJqFf?1QIU0>*gaUemj&j^KkwSUVp=9aNBw2Z{&Ih_3I0TXCsbA~ zKo@>YkOmYW8LBLX}X_rG`x|GuyP2FX{NxY8FT9YbtGpsLf;N!(3ACn@qu;>jrf z6^(t5vjyGy`J{x=?1_-7P0dFCM=NBy^u8E=`C(}^{g1F4ueOQ+bO<2MLHdg|@ax0} zh=v}si5A;mhOWllyzlJF7r!f%F|S z3<+Qi6KQ&`N{SWmQDhF@JMt1KLH!plL;tTtUmv_|OuP=@btcgrP*o>$v36T3o?))n z5RE*YNniH@g8G#|bUvY%FT%=+9Mqaf@FuBter7e}<6-kUcp?~JaHED8iRDCi2WNxXfTZST{nIO@m%#PR70ycZz&$ zP}z8o>eGNpQous%>pVTj6dVmdibJ;hf?k;_ z?jf~>0opm0Z3V)=CwmM1y7q%#zAODLP5+x4c7xI1mSX-hP&gwJ8WT|Yl7#>$08u5RLjLKy z{$=Rvh1#p8QggM&{EtSnzY3@L`Fbj{(YB`-uk`T7C#RZ z6@!aN8%OJL9hcKFY$C1xFt=3xZl`aTuKXYYN8o)Kw5Y!l z))XQl&SwYV_=>EQLnb)I2?QE%l-hQ`^9g1Qu#|Z zZxp6lA)8j2*R42{f46+o6}*L~M+vLW+bdq}ZKD!~7Kg?T%LoubzDpGBIam zLM;D;+{zl650i)b_X+^B{r{_Sw=iH!x-UrKcW%!%`5vd**jJjJw8F5S^J2a`b=bw0 zIj9Em9Jf7goVd6AufOco@D2`&&-pDyqW&0n+#8>r0D;-jPg z5GON@diOC40@ojrfd6NuZX2Q5SZXY*rPA%yv^-wi=2C;T!}WoxL_FySQmI53{^y04 z1Cx+psUd(qfSX7}pzdJ7VV zkdv}wN4WFW8G9;MVaHZ7<)o4DsiQWL4yPLwXNt@r+(Q#X%7{X(77e9ZXSlN*KJizG z8yl@R)}Lb7AoCvG@QBQFM+&!;@;3+_wjOyX?|s6sSQ8@>*}BhdBqLs6czy0w6z0Ns ze~8B*V45`@&Q;)i#9|haa(%o#|5a-${bxm=S4%3x5|89_hm;9ENIx4jDexbR*U_s` zdT|~UGFv*JHoM=)+TosWf%yuBBkDE#m6xN-_G5zZ4$Zvs=dF*(!!Ssq#hX#zw)YfD zw1_F(FSE;;h+0B1`d5?{rKv5Tl`Wu2shxMd9e6WvIxpJg`@n~0@rYZ=cV|C=4YXxh zKi1IbtQiR@)iqW)8mPxhv^cW29=llv_9En2%yY@r_Asl<94R`+WbV3?>6^owf zHkV`EOo0Y{wj$Lp;*>pEKznOic`6^;^GYk`T9?=0SS48?HN2-_DT5Q`h1&(G0vdbs z`o#1gcyqD?=j`lRRw9|3r7t|CPm;BZJyY#g!^dIc00tctx+I=&U&wg(vKPHGX5zOITG_0!BIiPzxh!2I{XR9+tr3zti4%>vhGMkH3&1?eI79E z*4jVJSLui1aM%gnUF;GmkuHhwA!TRbn34uZvF{Gb3kW7_O`w$>QJY1+krop-y-vCD zaSr|mAqo@x4zSlp#pKNVyeZfi?&VRUdd-=U+pj3A9YRJ;*=hN);oEk(8w540z&})sw z@LgFOD4 z7Y$(A+4+6nWiLV}^b}6U7!&yvKH>{+NtN}s&Hp5b9H5l>X4q$6+8DHjp6lrr+K^=L?zY<&bFKiT{Rtd} z38DC-KZt+33E0&gU=-k^yNz5-|DIgl{#(vVyo1?`nkns3r|3KI?xMxn? z<^3F#rrAdE$me&jz*vGIpa>h5LD*8UH@or|nC5}IcHg%-{V%vE zq;jTz@M4Q-z%Q5gWV{A{jPYNXA+yfBQ-|AOkjDhfJv`fAo*uwwzn^8B{r0Kb-ESmr z&9=O7S=fD9Dx$u3`amO<{6ZB~3&a))7?&lc?#bj7@;F&(dH<@x+D&#snVgPd;#B&>XkbFqbUq^d{=8yyJ1)?X2l8X5A!@j>jy2wSppQIfw=lmCkH&iuin6a zI>UzXuVnL$PfYI{%QLC@64CzD3isX^ztVo@K{pww#2hHqpAq;#WQEX%7Ec;W8ahpE zhc<2Q#2q_q{ZeaoxF_6rQ<^ND%1WnV`3o<;V7wf?-?T?&pOjQ6Qsd@Li*$ z{Vlb)V+Uo(Jbfnjn^7|alteb~9SbI-&vWgjxiZ&{)y{iw7P@>|&!d&E-7xLO@${8)klE$I1-4P1THOkwK@|tAP|e**fAm|$%}(4LK`A|-|FoC*mDp_ z+d|I}8o64Wp)U&oSl2RnY7h%QTIWhsjh?B>I3|i9lM8q}9YAJsHNwf^uE7>XpO{F6 zq+E=``hC;L5jvLw5vgxdCqtj~L;Tg?o@t8yZY`x6~lD#7JqaVRS zIlu!tg2N%iT)b??Nh%TlN*Z~4a@^(M0H$7OH;UNv3ZW@I!=us8>o{SVAHnQu$ViqC zdCw#4yL{1%oHo^{um}}f7T+3#u|>?mz& zjG$8;5)K0mjk36X6CIm?KPdHCNm2{B-tAOR&~&WPb{TEcJzyjk5a!SO<5{`p6WMxH zHVWs;r7BeJPxlStt-5Wl=(k~?u13B(-h)pO1)i=FFjuGI{!9~o-Zgi4etY@2{}AZO6L4ANl(Kk5As7Jx18T<5-?`lu!}QiGpGTm=Fl&Gnaz3e`B^G8p!Jh3b)l zrcxM8D3eevR_Y36ebAzy)=*r~;q`$bhqwD7(Kr!gi$rE6BbxeXBDjoV!v^y4h|Lvn zUFrMvd(aUnrsAOb03dH_CK_$_z1}zo?t-j2&%(M|_PsUUv{rWu(U zK_k}lsDNBlB!jvgF}NaH`ax=DNYOY{+yjfB_whW-YQ8dyI2|h(en2Q~ti4w>5(9k= z#PwxQ;tsQ-da=$Nac49|K7s*UZ?~$YAZDl$gU@I1>$}j!DE@O44u>b`7YQ;3qs5f< zZ#IfP6Qh0`n(TK4>6D)Tv~hsU+(x{bx#y>Swkw-B{hFx)rB(Xa6wnm=c1WEM zm%~l#Z`eAlwdRq}qwvQ%Z}C@J3SBf=c*VP=zLu$!zY>|9k&m~V8st}ZUjZD!xj+pW zHcamGtU5;Vx!|<9@x$D?mSiH4HIcpBi1wVEGx-Q-!a07jI*t+g5EK!UiSsVYrjy=3}@v`2Mem)c-Twfkw;)U{p% zv2c~z9Quxua3-{@;bugl>1eW}`dC(_P7BIN3d1QfmaKIyRp~EI9kS^%b%tJ2yOrj* z`rhZkM!RCsxLj|b7bj+pDI!wHJ%GmAAvmrHLA^JV*8|02 zHVP}0=KIAS$XZG>FDV+1t6A5wta4OuC>B#7fyTpeYBZ{x;3_0Ds4;&l6*IXPPH!wt7-KX-W zAq?NlZ3l$E0T`Z}s&WFS{f?DDKJy_S5lP5u>I=96^;l+4QZC=tQ$!hct)?$NnJ8kAPq+oA5SJt&O5Q(WDhritKR-S zKDVhcq zsKi|7_m#BNm&g^N5}^*SSCaZ*OBoy=ODdglBbsrOFIplZs$x-8Z=Fjj8X06U-+9V+ z`ndNp&dUN$<1!z=9OIhclJ9zWx*F$W0pEA*k8S(C?6uO@muYSMgwzH?$K75;0oFsJ zIxnzY%Vr3U&3wF5t>v;P)!f1fyJO@YdyN9bDtQRYxXa<(Fc9$fmY^tL$OJyoPx9YO z%8g`jRIT_v91mLtxJZ75koeb+H!;$50DPw)0nhgq+fv<7x>(vJGlS}Shds zxtu6v$q0k@o4N9%R_vS5@IXwTf?qXY^Z3G2O^vnGAS7sm$q*nbRX!S)Juxb<%$_>! z-fAgNrFr6b$y0F=ZnSJVIdCPjK6dVefn;%>e3`#FbUxM zd1;yXF0Esz!({xXYn6$`fm``A7wmyY-*mC2qfz-0WgYsEquR%Ixh}xt3Kt;FuwnmA zg!-WyYE{gW-Y!74e^4)0JlmU2u>GqGVL3#_hm(lwqeYO`_C`@xP7;F}sQ1dN@M=p-6pWZDs=n3BG*{e0QXa&MtDrF$IDp=D+KDGky z;k%%GXhv>>?Rrt5vc1b|Bvx)Ui>D~PfB5tGLp1UV-qu>&!3)wF$EKc#tdCFV5x&{w zemh2h7miv?`(PatqIDvPCdH9QbFe7KSF2Da&B*%w9EaMxO`doRfZm*|H|!006Nz*9 zG?N}0_I8s{o867$E0T0Nhdn*gT)E}L&G9=&3XODrpH@Jx2Gt;XVCRNPmV%?11P&sVCi6%sYQS1Tg{fDIHBn52z@gnev3l*uOA7IcT98(2A4I~b+C<5-PjY2aj>c{VAC!f{@ExskomII zUFk$KI^x59JlD2qB?j%91ecQ@10M9UF*GJv7;jqL3?Z+Pj8V9m!fCo5E3PgX4Dyns-)RW;h9o9I0pb{`5e%1Uv!=#r{>i*^J&4!g{n z`!;-Dgzrc4g`Zo8=Yz)t=-;qd#PmG>kZI%0q4uelYSjEVUX-siFs_eTM+(Y#yt~9n zc?XeUaLGjDF{IN>8Nb=x_fjdCWPfj-96EXr&OT%OI8W>g!yfsGVQzk;0#yJ4MeYS~J-ni5`#$c7fk>$a@oA7cx zH%{b;KBrtLt~_A0xA|E#fyDc(3j1=vzI&j`B|OL=FG9y)?ylo5yfHE75}^%EJmk#%l3rj137pps7Rgro1~IH72U#D zF{Qm9uHkgaHSQ+hYYB58ac)gHsr?W7F^yyk$#oYDDi%CRhIC+1_G)l=#+1BV*Wv zo$jbB=~Bp@BuXBrf#*>eN{kB(5>%YZ#ov(%{>vwY!9VqrO{Pw)3qH4g?XH6>L7m{2 zQ1k6Yp{|F&Sg>@XnEG2*n+)GN|S=UIA&K^`u;=JFb2R*4ZQ(-`4D`B@UiAyC` z;yd4mrCl#Vj#dO!VPR5&J>zWPL-PF11uGgO!g~Nr+)hJ#PG)fpz*4@k?WSJX4MZ5o=tYE`QkD7 zW_&izy*`-HaWZijHjFob0|Z-6`we0=`uXW$lx2ccE5j(e>-pYVqDfB-C*?uWM{lFG z-0gI&QiEJJofOcx`c-kA%)`pIaaUQs59-y!DGWIpbbbbOkYyzbR44)PTS8HIJnY{O zlj*c!jouPWB8v6RlMtKNHASk(9bce zk+W8UG;lvLWKL)Jcex*ubJOe52Y@C&KU`f`UtD2tlc5C2lFk7?qp0(F*S;t5o`w04 zOpMH=tJ87ce|u1zDs)-;UyiAjkaB+!8vts>@U7)suw!@IR?swGFaM-?lzV3sf^v+M`1g8L<#_+4fPJm=u883i($6XHpbty!+wW^XrZ}ZnA`id+U`2Alf`U|5)u}TF(mG2o9{Y$ zG-NeA0JNZnRd9|v?njcaiiPuUhu-U@KMZOZT(?+5dJDb1kmahm)*EbyrqlVx5D&bQ zubzI*)Fv`ebpgpO`Qc25^J6LcYCbgL2q#H-q2O?~lZb|LHoq1a_O|E6@_rJ@M`4_g z>5cPS*(=E0Cz4JO85Wh1>jCgOi}ltvP3fhx)meKe<@wjhPN0~hS&{Kfe#5m>&K;a# z$EZ58Z`2Da^W`+KE1pf796~5NzjI$q)=#=j)++^UnUuZ>SErVOl@KKp29^hI*R}nU z2{8Pqpl=@YUi9Q}1#G_fnblkK4U`(7mb8$HR^L6%Co$V?Sd%v@1b{B?a)!s`p;LF` z{;+ul>m(5+9BVnr?aAU0!I_i!^5qa2V_2>&;!g}zJVhNQ!ye##5axz(X>#6B2++~L zOg+A7b=1uNef->V5>W7dYY?*p2v6A~akg962Q6UOFYOT{ogpx>xMgy z{Q6a@T9)tpXR47sOYRZF<`>0%v}^0hrm@qRbHL(p{YhHBYm)OG7t4RD4k?m6#FlWi zW9@;%QoSDI_UE*hS!nVX6jOpEs47xlc)K-+p-g@ko#e4QjhK`#YF|7s>{@joGU#yB zhQtH47S8HDz%;{I6j$@LlE^knM!LZ5;e3Ba?fX&GIE=?uHdD!v+L$=yxj!5xQahcmqk5suJuW|Ge$|QNj^zj2Zg7k2` z<*{ur?2H|b471!1vIT>%s;=kOj|BX@2KCSgxUrdBU!ZilR_M!hT9n*oO`{IClY}U{ z#iGuqnjMX?1bn@R_Iia8=`u(WQohUb~R8W zb;VlfjE>TDlG8h7SG-s?dik+r!JyL(bxm(k`E0-j8Hqz;Sl2Z;WEwq(l|ru@FG;e* zt+lUlNb;-0upsYQ&q%a7eC~C9y_pIl%XRseHQw=6e%uBVq;Dy&UfNC89A_k5eF)aCiJ+*IXw z;Q3L!I*sc~;Y_LO=p2SoIw84a@lKOLoy8=vzXUp{-gttHN@4zl+wpjTR;m3gX%aWY zTHo*SJQP%sZQV`CfpjU3o>I{-pUFuClph-OV0m(A)aiw2Ny-0XbNmx2kT`%yaqq>+ zn;}7?^3XoH@u@Ilzm%t5MzdBLj4VC&(9OIcGg#Qlmg~El&LBDYP%6=Q)B=ICAQs?7 z--ljPI4WALxNY@SXxmiW=@vFWre5w>{dLQQ+YC4 zHx#_>qel$}LqSpnNPWqV67sZp!WEu^h2lD8cU`tocknb%rl3`+(21|*ehG(kRrO_g zgB2G3;5JbfDFVHlT-o#-`RGYs`G0FfIjJa z6I~z9yWs-9bqkPsqZ0~D<580#`;K&KhIcujB!1wy6m+od@`WB{p;At2DVu^uVAR*jV3Jg08{dz;%lV5Bj0jGB5aFV+C`Rdi=#p-;X3@xIXpB{eMOR~pFa`*h! zt<_5U*)Es{ZyOnzxG<~wBW?a9`Ye&+2M5V z5=7mI$rfgO;rfD=Zs8VH(RodZ0hwVjPKF%-+FB$S=1>kzTOip)u^rz(wX~b(XL@L6 zdcjNo9sfIIs(q6vf!&r{9FE?4cJDMZ8L^AUT+g#?PnG%X_}iX`6AO^guJd`~cRkYR z4)MuXW`)Se;&FowSRoMbU2)-_;Jy6j4IB}bVCBmwXnc3U&X+Yix*H$}mnu;@IbY~O zx3QWlr>ZjpF*9u~_OM`3138Cs-8Qw8j``=eAGS`>D3O+AErE?PW8i0KXd`W{0i~V8 zF7gOu+;A|X?fzZ?f3DVScdt^;%qe{=pklBze`YFhW;YqhidG z1Jo+1BrVx%DA1EOB7$>Ch-I63NEc;}pG_Yn3qvpe(j9Zs}xq0~cn}D*X zUFo#AIrr{x=tZWL{?xNcyf;pU7`)jNB3x z9v|c-IgCc7B*JdHWTIxf+S>3DH(8%mrwV0pwr9>UD-AAt;24Gm|3CKLx~-~j>mNqg zBAwC*NOwr5ph%Z=cXvp4gMdg&i-3sKrn^g8BsSflAl>~;&biNh;_L4|Z{WEu|3KZF zwdR_0jyc9B#v=E(tyy>1#1P) zdK`~RuBSV+a5Q!Z*GUW{(8YSPFrO+=SbcziF9;}kLlh$c=}K@~CZp18d*>Qm&oND%}M5>leJ( z0twBC{{$_i+6dsCXr@Hze_hM)r{}{nTTPaJpg}c{<_H}3sEJYia#`$2#ynP_=F0Ev zSf-U{deOW7E5$o)Qz3Og3;F<)yC#}g@mnNOX$<+{XWLt|R8PSV-$5Wd6x$mbGloJLEWU&v>Q9eyCIuceVUhom#g?Y18l8{1z8oS+KvfHa~@cw z2^V)HUzuuJ?{0MtH%G|7rWIVZ-khdCX3-v3$N!XQq*dvAbqeRM1=zh5K)QuI*0+n% zR-hmjI_SdXd5TnPGU2s3>(GifIGu*^MBwqWEXBGYbe>T)4R!rugMA@Up(@(z(>djQ znIs5@XY|@c{APZNe!SCa579(d(RUM7r7OKE%QzEVirl8f-e0K011j^l^Eo*;CD~?4 zI`%TF?i#kSf0?rY$R`PkQV5As>a)_u>nhtYbImGw(O|$`D!y^SZe5;?%nh@9fMcGDPP}OZ`3am zsYN@!Rl)f>LZt0@goi3pi-*7ob&*{hNvEz9seGh^K|7VV)*v^b>sKrYfDx9+7} z@cPjzmvpa*QXd*8i6f27HlvBUwFT$G^n{(`N$x0u1ztb=EWpJo9 zRf3I1g$`xw_{DSFq))FbP@nK?WH(=NrP#T0!|bG`LCmazkR)N&30=IfsBc|Kc#7Q~ zgO8R!w?ajPE=M*mJz0`rlYx>ISbH_Zz8aaz>(d{7d0kvZ=+|S5&cS$_nyL0I4~CdN z_-3UmGNA1+;;O=aUZ8&K>v!WVK-9j_mgPe)H|>i*JQ|7o#2yr{QK;NqXsHPUghWxV z;WX4JSZlAmmn;ELD(RcwzTorK@pv6uTFq23R2UWLH+xBgyq0tu(7a63lY;Ni=~h?B z{jZHpxX%8kpcil=f9nP3`D*@7kXTDx5 ziv+XsJ8S#Poekeib{?4pA@c}(9ly7q|Gg*HRa3u7*0^N9V*})pfaSs6&acC@C9dM9 zQSs+<7+#L_9_vp$``t8@KKLFE`9J@NW?)4Kwr^zHkw93B=9Jq7cN0MN_tQ;q=~7qT zL+cYV`{ek>d>OTS7W|~FxjuS>-JIo&ebwWJ%0#EFi}PQPcFb-tj|LB4?G-Vj>xi?4 z1(65EsF0FCG91Rvn0lw4KQGIm%8uQ&9UlD#!L?O()>CK6pfphQfDwK+f0*0N?WGuH zvqlLI`0b~nQ|wGS&$c9Z?b`)%oMTdSTWue0rzTtuyldr=2^VvrHrcRE#z&}JM&faF zs5KgbzX0iRx@NFCxkp|O07ukBANkwsQ{`UG@VW-q&(9nWC|`I;eX^m=ZGTksoGo?& zv&nwWUGVn!1}*hjO`|6XzR1p_Vd?mMWf1;Z+BbgY_#WD)_u8%y8VcVyV=`#9g!K)j z1u7k_u2{hnIE6+f5p-#wBxBsxs$5oA*M@5H3<*RhWz=Wt87}h%ElxDCNh0~3VNQ5( zXcE+T_bSp#<;?W1f84nJCWSj=k!V4N$?}D8J@`raXbif8%~$o3G@sjx&3GzFjBPVc zOs1qPVeftbM7l2L19E>un2iXD%A|){JG5iQWOq&+Th6Yth<&`p*ZUW2q{Z)^MgYYA z$Rza)lTJ->u~ub|+mja(buMBEj%H8Zck39hhQmU|GoVUfLmF)G$>%9X#J z7E|tmZ{JJ^S?q)KWOa9?yPav)MFkSt)|;wt>XUq8a`9elEvpR&_K7O7vaP8UE+XW{ zjk+cc<4>t);gLM>hVV#4X7`)d$r3oGSop;C$Z3I*`=$n{;Rg z&-j)Q`GCcqNqdHmJ9fIPMd5IMWq0H*SB%AU0P*TG4$sK4NU>u%inG~Fm9ybuYlY!u zc!j;1aTBBxfdzCslkRh!Zgp=&v()GnPz|I|JF2hcX8N=e&o7I??`&E2d%j#=oh6NN zmZxO0q#{U*FsFR1;GOIUFBt}w9s2=9ye_JF}#svm_L-*TU}f< zyJ%9hE1g;R&7lQoz^R|l*2+h|aQ<-pp;bv*Y&$96Pw81I+pM9u|(79 zjLqd|A>&pGr5k|dnx1S;@bD@_joT2tfo^Z`Ahcf;?U`;Ok(rU_Xt{}`aDY&;x7%+Z zhL0x{bSqw9GyV=DayLDhqj+)jBXXbbZcpGLAxH&~sCaDj$(!&_f`^lW7i_4jHQ5)xwXs15P$dpFSa&A1s3;g-x^B(N8 z;j+5@?8XGVyMw}uNS!C!C-{1F-{c=gX|qiqel;{{{Iv}Eq_mp6C!5B#OR{X!lFh2p z+k*R@*w5bzEWP65ivDt{N494NIs)E3WHxa4vJPk2%a%!IMa3Cy%`@aA{;H({*^|~& z3jJz@dp;_S#3l9OD$sUQx_6dEkxi(&n@@ftPJZ3AY$Pm7?mZH;|8A276D#p|$uU0E zPEi~mDBYBNMvc2KLXQzwF+Kd`1wMhnr=ura52cVSb1EG8E{9v`mY~DBPgp{|!e25X1fVB!4 z&ph;Q#BhGWlWsq=Fqw0B^z)1&eLG^uX!F@Z`kDoyZ#a(aQV-_tbrWp_HxRFb7i+uJ zFQ<82CDX2GkDYaL%BD7U;u4pfq|*HbXP^kwdt*F0U-yn(M+$&8eA zYMG2q<;{(O#U3=#NUNbg|90JN=qP(vc_{R;aloe*mc8u^OCZST#gh= zRGtsH33$;0?k7!voVvWC(Rru4RT6L%5+ZweLbunCnI>56sH`O~T68I12@P$aDPogK zQm3=ii?K?2t?$u64zt7(G+Z~1VKLbrT!uI)A!3lyb6Zd8b@4w&uY*KAf!MiMenI;3 zQBO3QxL`^khL}4(5*OEB=S!p60Dk?=>1<{iM_KzrjnPl9)&W@itn4WQB8^NUR1eh+ zo(V^jxR4TIi&V%%skDA0&2U2HH(5wc7&?j9R;zBk^E0#l$AS4{2$({KMMv9Zt^IoL z^Jb0a!huupHfhV9!8%f(FuI5%bOD-MU7re=nUAc@ZH6@KRTy;+@*q=8+061*Ftjqw zQv!TLabPg)F><^4SWT32aXEMwGb{QJ*;-hWPMznI=L2znNbzK_B4pbUKO)wYQ8}uZ z%MS^>OVF`*$E>hnDcUF(YqcDfe0Dbwx5aWKBssjDFIKtmxu~l1(b>-fezehzU!R5Z zP3yacFe^WW58gK4eXDX3hOETsGyq1$vu>D4`FBhB{M(6A5GTLji+X^F5dI3%H$jXdlQV8JV~=fli)-cF}^7rF<(Wx{&RD0Db?*9bj2 zt$)s31Wr~;*-bwj!)7!1AJ4F?$x3hD&gBYgXn3&G>{Ct|%2!yHb~@|2G%uw#w65T$ zG1cgl%zO3U-IG~FWAkc!V$Wm8edntj+qD&lFKQT$snra-mnb%TbGx%qXz|;E3T)TC z()hj$t@%(26R1Hwb0)5wB@a-RGJq~))BT{%4Ms= zb9u{#P-_J(hJFU}Vnn+!ZT!+YMvYS2<~0VMsFENzFG%fs866Zb z!%M(e>X0RP67_*70^tEnR>NvNApv7&k;dEIF5yOdE)9U(eRwl>dL?!)yV`C!WHE*l{&hYt-H!G)U!_g?5TwMk1SqRIvxCYRnOxt zQh(ZzP7OonmAynuZC0TANLu{(boW{%RtJIC1&h)UFDS;Pn4f3Ng#VXqmFBDS=HFxI z6lSdgDZ1IU?`_bi2eIMd#e=pTm=lYCWeWLeMx7mnPu>~C?|wydKDg$;Ig95!i)l!2 za3ogzRUg7R={S%zHa8kLwv6CiWnq`1`y;E7q-yH9=MlkVXrtq-3uA0`n*ask*wdX% zq}n)7`vyG%1Wt?QnL?Q<*l>pYdjW^6_&vWy!^u}d=`^{|2A({;xdE_9iyoFOS?TA~ zo!J71PbMy8>fFm+MI4Wasa-CQtpcN1H67Y!9`4owwJ`+%gHiyv#IN;9>Ak&gv+KMo z>|xz%5E4AoCl4ts0Ye5zQ~@rX0@8-dm^`m^p>jUyg+ZNT`y2kV?=LYuvnc0^fsaaS z-{%PstUHi=!eTbT;_WL7sd*}~?AdXI;)E4MzJWU^pJi}!HILDiR-m0#)m_r=;NSg$ zS()Dd@Q$Q&@1R2XFLVarniwCT@JQ42di|Z>drjwf>=7h%`Spg$+jfriNv0Oc;!2q% z?nz&_RXCP_ee;BU{v#*U2V2dWh&{im_y%`yKWd(1St- zLO&&r%+>hxZ%5^Rc$@zt+`N7!I@7TQS@Yn>c5;tjkH~#s7t8X$_0(xy?Tv-a+fTC| zhCn)~muM%MiPE(CQ{+g@ZI~7QO`Y-gdoEWD2$KI@hAk=exBvWzHPyTqKkm7mS3GY- zU{~Xpq*h^Zf-fs$6<;7t9iS-!h;2@r&TfLaZ)SrZga~rXg9mkMApa=K)9-@XQ}c}( z-g5KM3;q3m|CPR$;s!&>OUqvqzn2g$9a1{3X$En52y%QLDvH$wNR|1x@f%%zQf03i zAX!WRd1hMY&xPj3H`|j#LKb0=cp1a~xuZk5Y!$B)pXsvqscD)j$8HT`vW$w8RDVe% zB7ET=+Zy}F@V)r^)DghnlZZ!T1vHtb?KcsnsnjfI&U#X>HV%PRX6~SRG4hO(f4UAPxXy}6CZEjzERhI)_ zsYYiQ`a=%85C5T={NKNJ(22Iw`j{7s{bO!EVt)W^++ddQtm(n!c9|?Vn1@`<|M&C% z@k0~tN5j=jJlXiao{#_WFQVc|O3+9obsm|2T0fu;Z-D=N{D1kLG8MS-LMJtTy8re(0_!Nj$}3Hd z3jVKCClzzQZF|(#Gyd!KSKflBQK!v{k^JB8m4X}RqhSKEMv}`PP?mq+%MncX8_c?% zPxHSHYFrA0GizP7;mH4b{nGpWkgzV`cU_mrW}r{ZWl1rV#+?AlB}nu&FfbhgEU6z9 zKW5!;@!pxiGakSrcTofa`S!p^v0zi+WqAhp3PRGS;o|?-hPnl#TxA=HsOIt5H?#tL z)q>w-v6dM?W|cuoSlJ4&^`FKVAy4vvh)60NN~;rCIGbQdta`5@Qc z@Z{nI{~do1u*Oloq6UVp(cfvlf5?mfvF~-w!K`()2W1Pm%G{r#cQO&U3-r{H1$OLLkuqt_FC`yV|W+nJrCF70Pb)BtIMZ}cnET> z1fPq;UqScEc4l`KiyHsC+aEwj;NpBw64bkFrfrV)A8$>_HoW;|><0U)#x%dx+th~k zf9;`jFkdmT>{Juu-{Pp&t6}<_>ETKU?Go}yOd83rqVQ8wjFQHHSNyd`;XON-*Z_ItmlE1f|`F_XwW_$9tghOQn5=rX=--+zzBTyOest-UEv?*k zDQw8P-CQZ_UT*Q_btm6?-2b&oeW*m+dw3J$tSkX~dH6$?Ej4D*ebKkV>%Zd+>CopM`yX|^cdBa?mdHvq%Z+Pn;sp5pZ=39;O0*laGuu36a$WCgSX85Z121eHbF=ARe{IOLG~)arcjlQM!q0s)|`?-~|= z0?jELy7i{LoM%NE*|7I`Sp4CMLUdlK{1g*M1P2kQqRCIla?TueydWTkObtw zshM+bvvw80zFB|R&opFXp9)lQ(jdV&Ih06^#HH(Z84m$YaSE)Ocips+G=Zjw?e>)#oowURF(Vc%iJ|a-TFEDmY&48o;3Rw=Hd4t7gOZCO~_*7kU|s;PSaxencsbA&aPgO`s+!( z5)KX+Lfs;*N^@!O-Jv*|?)=mQS?&lvMd6dgY5OKK3ezV5ufUpx?7qhuf#*=LZ@Dn9 z-)-3TiQ#bmJ;f17^9Y_HH@0!NK^EW_rj$pr&~~BQ%WXDa5ulz)1f1slMnfr3QUS1w zxN`A6OzyVc`Q1~kU6v0XhhoLlC>#Ao^7aC!VIVYZ3w1dtYca8blvN%taLww>M= zROihrp0o8X1;FzC0`RMBwF_QFJD{n$Qy4LVU#>?Mdn|adnAC6v|HH{Zzpnee`?lrg z78E*WfXTk}GL%=y7Aa|^J9yXLAWoU1sM&3Fb5JVrn@*@#tHSi4x)B(>xA)AOvJbLe zkb98l0f}XbAG=$V3401?G4j(c*LQmn&OqR;F;#&=W<0=Oez|n)J#HOskRXQ45LT((nC$m$}1gh^FQqIwLg zViH5Hb{pBmye$X)$$gJs$2UyQeN46c*bMAXG`dY59MX3As`>Mc?sSG^X@a#OfXtcM zFfj}90hSS*_^Ux+onp)ZpM7^@d3%BDb+()N(N2c8%3*Oq-5lsMvaqev6_69?6cxUQ z@ad5B`1Aum%RboNTRVj#L9|nl9gEZ7(_W31IyV+(xYlTd1353lgHG{=(%D+hKgFm4 zQI+qu{_HWjVSWYYu=nxLxIDkB<6kDHubaJGE79enW!iL|H;3)gvk#b6zbHL50$(t{ z&>XTPX}=VTb}Ev*b~|VUXPxpl_xH5MX~k%}d|&Of_X;lrT(?5Rxq)Lkz;FKwIf)CF zh&*FnTVmhpck@Cms^2#n-T(PPbYWBRrY0r}nJRpi@ADtv7{{$Tw=VUyrgVg#GzB?@ z^e)C;E|6}~d}P_yE%t0;^FIBZ`Z4mt=*;DCtq(Hf%w~DDbP2XN&C*^K?07=MU^)x0 z3H1d{^x~!5swZj^khmC4K0u%{vdi+^Akr}Rs3qff?xNrI8t+OC*j(se_@>iave9`V zXoY49!U;0rs_@y|s=%XbyHbNzzm6u)qiAcPKV;aVb2#rcN$Q_YE?LeSzN>bUuojwf zWakla?AjOyoN&VUJUHv&d9t~-GpVbSaFQ@c`3y~r)^V5@!8(NO*c?K`qS5OB!|S=V zmlIC*<017nVUxYMRk9%RR7mZl>wpOrImzqEDSsIMNe;vTOfn(9K9fo2*Fw#*#WyB)`{}53R;*&3X(W@TfPlW-84JUYBPuxQEJ1dc znWKgKaOXwk_mlDD(a&Q};P4l_f-ZE0V`Kfym_c?!_csV`HYoOGSNuaNSuRC!%qp5F z>06J=vt>@vaxSkx3@9VJP6PvrUKM3e$n2N$1shnYp5~Y;i+Qn~XP-B=Ek$CT)}F^N z1haUmDKt_(_6L+?EnTNS3^d_#l?c_pQMa&%Zr;?e144FMF=Ct+FgoZ`0LA46q z*M)CJqobkq6qr=fU>!qXLM37kf;1T0;$F$~o3ll;zId8X zzSSkY>90|3f?~j7EzxW%xCe3_OLe>&n;D55%k%*+UE)C}Ad9GQTz)ai6K1y_ouI^F z%j2-XoTfwFTxb52Y6kXOLd|OQQz%)s1a85g%{NN}>L}W^$kY7horcpFm6-*{eE@`K zOw)Nj%g)6VY1+Hm=5h=&+u0dz1t@-+S-cZtT4;EM24>)0_d#?EU>}1# zUPbhN)WZEW5^t_%!W8Q?UZMkYW1&&x;(hh0-Uf{@sOEs_zRkmsfLvAC^}R*ml2h1X zn6$FECY6~&RpYS{9Ii;=q&1&ec->zQ?9|vSvTYGmlrS%f~I-|P#zidv2 zco(O7-nwHhkm#GtF73$xE%GZD4KtfZdz{x2z-U|8YjnAp?SFhCd0hnzE+5Pmy|!71 z0I~}drK593G9Yb)w_kO5urLkc2Cs;~Xz%Tq;`8Z+bV5|)VhV*Qoel@`1BYUN^4IFP z;jVt}b57xw9eGQhZ64fl{gdM)4oy#AhGSIgsVG*(DnZtx^CG1_MQ-*Ku41n$XYVNO znQ-?cR2vQ5WLmOrAG@QiATQUR0cGG%|K}y^`)6DZ3r#>PLdM~%G?KP2m>Yv2T2XTFWDr-FB*BTjecKG7rQ9ckGe3ar^FjQEV;j z3ZB&eUg7>NnLVe(vSA!sw>8SOQ<`c~pX7<~(aHi4!0b%uzxz!epa$X(D(99Z^H~?9vPh|3weKs#4Hl(PXv3*xs?P<67>h`qZah2 zB-S9d~a)nyRV!QKt`T)x2EgoKI*OM;S)&u-j;O(_nXM1~= z{JC}^GncQXS@jyk-;^$Ml_G0BSRLcB3GSi4IOrwEjdst#=Mu`;J+4r<|3)<#LoPi_ zis|?SSysG>q!_uhso11#Z@nuLcaoAJD_o~YskDS$stc!L_@SrnQQCf^%JypJ@+7Zr zUpo!e0>8(imy=e#!=i}f0D&fdJx$kIU_Mfhd0oI8rl@V`50%XaQG^AMTK9a}6b$+@ z>-LYS3ONS$2O%zM5h4c)V!E`N zvYyoohbG0g!GEZ`u4zS6Ed6lhjlGfF9Olp4KEM2ej#8%A?utEASyQHUaWN>gq|A=)@;i?#v}C>xmb{caE$ykT99CW7j(OuR5bWuq zZ~0mf#N$=&FHI>HgA5Yd05J$sc(9UnS^Jn{EGRz_$Ch28789ObA1Qv)U1Sp5|7E9i z9FFb&S>L7Y={9WS2&$Sh;qnUqPs@|=DMzT<;Fw>_2Cu52_B`C^@xb{s~6nwfLrxvXWtAw zJ{8um5xT{3lt~^-V>G|y;TMtFv_?k7`9gSzhp6r;r`YxDQ0&$_b20YnQiemQEozc> zjjdHtxKl^aH^LrT&ys2kj;38VH^kaSJ#q8QJkzhmM5 z3f%#z0yUNw0Y!YXV3jX_gZS7=@)VB+^uZdUVtD1n-i#yKd;m>cgB4!C zjP!hj-Ne_V0wSRK=6hHTTS@iUq63DvjqSy9hq_9RbIjUqC9xg*3k7fy#aJXoaqTY!&_jBQ|PI*BE7-4HFPq+LH|fzCuTESQ(_15 z0k3k}NUqqm8q6~dL|M{iP3ljIz*ArJ9e3DcqTI;meEur+o*S6GehTrHRv<@Qa;Vdh zVQAl2Y7e%5`K+vH#I5dyX&xjU5W6#zh})P<>Erv2oXeaq|B#Ka0#Ku)hh>L$^p)`Ed6ZaFXc4j|dWuH^3wIYIxc z0KX=Co-39qiqGvJoqVzxagM1S;BjM6+zaRNGbh|u?hz*0Z@z*xeL3lNiTSE`c)%gF z8aOmzNqthgb;A32cq*efeB3X%J{6^)%rYgENzez$u!&90{XHQ5niSQ@z{z&x%Lv$m znv>wOYq+)1fhK(m`^=bPG@&TYrP)d(gojL^QsPPyhe68-@c{u9s^WxmH`JBmKp%Y>kKWy~#8x`nx}B1{UGXFv}k&e^vRQ(ZCI55Xuw z2%gdWmJ9;meo+;E< zKjn6Kl>z^1G{H@L*#g*q9K(E^0pxU;bu?a5`fNQxJ7T%@_+>h;!|4;`l?lx&&y7?I zpPf|zDAk;f!shB-gwJwXy!X%ASb%k(3iq;sxOd=EPV)$lNqzibtyIKmj$|LsUkh03 zB{l$C+#aG8RRa(T(U$nt3?3d2e+kKxZ=LAs%(UlAphcDIZ>;CQQe%FrviAtr7E4ls zWsloUi4PcQ+cmF%;~17V{5+%X<&;OwY1DNpr$v+7lcRM2Lt3PhXFY7)lx*+0C0yby z6j5<3!HdZ|B>@`@9DMKa8K4St&ED=@pVRV03|R`bmA(#A_>k<$PHgo=0n>|Q^$;lL z>8zUC8I7VR{XiQmf?|)Uvwio;8IeQ%5~fitVDYg%0Zn$)U>r(Nr&p`LdVs(TXTfW` z1Ts;fsP{Z$)nR)$Q&6~i;Kd(?j#YFI-Y@mHHK(|aJur}vq%t}JuV1V(Rtgd1_2IU8 zLU-sGdO9je{)?mli@LZ^`Xf+Eec^cVy+yi09TUSuo;j?3)6o0;zLJ;DGB`6v%ut4?q0YXGMH@rHWc9Bf(J zqrh#Y)`W&qz(*g?g<5BJ5%PR0BhW>bU~0!R;2r8Nx)kYXSaB%M_J8z=o9^^aAr`=3 zw4qtS_$=B}Jb9oU2iZhiTX%$O=N5oI-dW$}2&h~v6-_Jc_5*uS2E64<`os7RY+J0s znSNr=vX)bZDTo0&q(FT&MlOwu!6To27i1bC`G){_bv4XE(tYj!5`-h5&PJWO4&@sI zwM@Wb8B9|HyKQNTni;di#}N53Bh4%511g*6-(GT^2p0Nhca+N<3*b-4m@Ksg>K7rh ze_%HXveDC?s{3@X-UC2o_*=xKdNexPI5q?$sy{5kC0sB~B7tZHM4CUor0eUm2zLCU z)13Cdy`VEh1MPM&)oH$-0WYmN33*E$M$-Mj<^<6R*(p?cFK>Vcq|WIzY}SUE7=BrawIU->o(KsLK${kWVu({9tVB0hmocglp!ShN+yw9Hj~Vz2Fv&XN}o&5 zK>kHy&nY$l18Du^qbwV?KIxy5*A%sRC_E8X_>514y~cTXph!uo`i=<%j6m}_FsXR9 zJO5IxeEts1mhDNdm66Glh=hrKP(N9)bO`-n33s6fes6?(orN-2M|c-x7bNbf+2R(? z_M;@731HR-)xKphM!7)T1f(|eHWLvkDxoNB1_y$6x`(r+Wj@4idG!{353b4d03|W4YORwy`H?CM8i*Vl148su5MzkWiDwu+(XYG) zksuxER^Y&0h2JoB#r?A(k>6nWda6}fa=fSjPi`V7!v4@}OCPvU{05}|VudHd32 z5UcuHuF-w3<|ObIKzBP91jwL1L;2Y$E0hJI(d?F3oAN4x)}yZ|Jm<66jLQfZOeSkD zX{vpI9}JLKvpq!b8b_3lkk48esoj2le>z92ne~UP+&D<|r(OU(<`|ZZqg+hT5U5k^ zNJytlBgN6+*akL^^VwTeV?xIP_)k(mm+kXx4VuBTgaI<_sw|b?;ng-U#FF5))2$6n z_IAXWLb0#qeMEyS#4V-{_lof6k8Lwj5D(~zZQu!H+Ie1Q>L54Cw9~$iRB3bb(eelA zVp|7>1_hLcW*$J}HQX33 zbP72cint|+@6(*ujd9T3QC@M-aJwal>(kWm>F7sqw*Re_ch+~2m6(UJSWV?3J=)8J z*1G`btV!yXgm1^WMJ$5nxf7kiM?U$paVU!LxeD3Q4W z774q`pkPSbR;00eAQd$HF?kMJ_^2thO|>n^tF{SzAu-}BFkEfQ02JUDg1k;D0Nw}c z9SJoUruaIyz=_p%gv=Y(4pG+ZYD>c+Sy11`+a!Z8qa03l^)1pUBh&om+&%DFxId9q zZ)TD;1ht?cBFSin+_Q;kNtGM5kL#8y%((|0WP*e9e89;v zTW2TuBEk`8r^bHXnyDb``g}F^fp6UnOYki3#Md8$DKn*B_KBSD?)9OF-1u0xZjCh8 z%`TUAS_7-o>{)C=upALfG4B!KGhMh<&!Y{kbhAG#&y_GhN6@q4@hC+PJzga&y&`E1 zZ?qcw9Kdn$goKj8#BF9RXrc==FtZ(6X0n>7PH)EtZ_u#+6fydqQ9Fn1vLg($VudMI!o+yj=+T2)^)rK6eCb$6h-PE(! zJ$rRnh+~O-V5TQ|4C*G1;=zi|E#sclxq$&Go=$p%cTRHqh4Ii9g{CsESHemKij#^l zjgiVk9|~MD8C1KoGJKI%H$R3gR(Z3bjRJ{i6O&}A-IIaE@ z=y|WndheUf$_r+h;LdB0d|PdfJm+*gLwt?V8q*&9i0%t8ADyLdxtJUWyNigk90#5e zLJk1(Hfw$ZZ}eTBkb`!8%?r&}^thc9Ee>%{3hCr4G~5~BUYu#p!Yk8UJ$9rA*E%c_ z%Wu)u^}e3G1J_gP)5gEB1TGGL|8o3u7NG2k-Fz_e;1+R(cRP8%Ry`&zw0?;{VD?2Z zvN->>o&;%&qR53f0o+7=E;-w$kF$IpnSY2v%JF}TLb0seI#b6#M>}hrf`=|Or9i;1 zj41*nS~+_$#I zDGs86XuB0{zj;EbYArqWQ3Y7SW|<4lsTGQY^g1PMpoudOl0m$Vuzo>8suQx1BuAVO z4cAozI~C!*$&z#%0xZdiLntXqGDYzVK9y}2gBBsp>HzQi{K~R(W&;!%@LP~ZxEy@r z$ZB+|*fZ+MKC2SdZKUx)8)-J=ZHwc$M5?ZMCFJxQg{J1yM@7X-(s*9YHRw$5m4ZHw z))Lna&x9vPAq=pbG>j(Cj?T~?j^fyUj~%Pbf7k2PV%QGfYbE+dZ55`q?K$M_xhIGb zK=4t~X5*YR%o|O5eT#=#c7|ftf575pHCjB|+mZ zq}l88LSn|(P~=zNZbarn+O^w$O*=OtK4^~$jZ-PJKM~N*yH8?*s!1Hn1T`#)6 zuh0xzutfG-4%5E3&R!wH6f*_Zs~IXu7gqIohhJk%@<4wpZTsxEKQd3xc^1LB!h>1M z-G0SSI-pz}N$k*DVz(;L134g0Ce&Bv+cP^3*A3;czJ<6ePx^r#AwgOcKM^7-@51F(T}|Eqd%Kv$a=2me(5<2L zjc=%PPFRiVQ|@HlPgJuAs2n8O?9_8_Le3>rrDn{euU;fTsi&?G~L&fVj1&E(DX7 zzt3_VeJ!KA`BsD@`Mro{0}&n_SEHTi=GYYvBr>Q3^(e_~HEI6QX)3>j^5)A8=E4W* z8N?ude7j&}nM8V{tX><5S@C2N`#Q0zGV>t@%k*I78e6R+p?pqo)FlJ2%pz%6jT1dk zO(cRo%&9QtXSsGLQTVtot3Eue@V#>D%iyon1^o9XyYYycoK-$9`2g%890|~`gBrxj zH_WSVUeD6U171mwD@8c|=}W}XmhUMqLQ(E@t)M$Nmx5aS8+p`@(h=m|qOum^l|oDV zm^ILvMp4p-F9=2Yh>BlR10n}doA2YuQ)AP(x{=@iLEyWmE7 ztWOr>vxQeP4X?xYb%qid5+2hliQZGyyo)}SdB9mWvP=0Rc>`WX9k}GQnK^E1%Oa~U zh2m#Z%|{DcnLwClOoO8W@}+SY{N6c`$_Vn5)z{(5GvlxXG_Kw#5pZtq#16)*WNMP1)5`T$hVR_q4@Gb<6xc zLKUWc9}u*M;ou%sNsEiA8jGl$3p#e=X@rdFifR=<>WOVNGYq-osRJ!CPFl_S>;ykn zKCXlFI~O*7x0C{UkleUOE>hpB)0w?H_l`d0%8}#}ll@Vk$d<-l_T0eo9*JULS8mG8=J{WY{~XmiNTd*nJBDAWg!Fcm$6n zaRgf2;!1H3P^VK6VID0J{vjg%L$Alm1~4VcrUhtP08PXOPtR{@mvCwTVsMR^&>$3L z1F|^1GcXCgCHZ7~z_QZFT#BLtQl%*Znzcz*60nek_#AW-{JE{r|ALlSHurJF=+(wx zD%E|HDjL~jq`4+5F{j+`Ha{A^s20YHD6lL9SeC=(0hmhKCZbx3;vurAWe6&n=B(v| zfmczF;uzW$^YRI{ZHh=GP)lK+SJT7XtMCe{|fkvYxLh03i)(XZD1I8vd4)E z;Rdk3^`N!qc(>wdPb&C_0_cD6C(*5YMafACgT!AMshx-3N)IY6Mrx#1# z$|1ga{1tlGbW|JcAXqiw)H%L3-Mf`_UOlmDQa9rN2N)hWkO4N)!1aTrgfi&-lu6}ftTY`I9i`ohYR8bKfQJa639ulvh*;DJmAXoJ zwhXKNTj*R82YOH3B*LbDD0D?C0N~gUu-kl~VcC!ZO+<2|__5sH1GN_w=)%RmcTbF9 zi3F||jPz%FV@lo5!KB^|5_LKRaQ|~`ZGmm^69joOMF};6YP(I!pD_oRiGHX+%LA8@ zk-HcI$*6{u_?v_dvb&VH3;MZEt}EXu>$kIKW*kWwzzz+nCLDOqhpynMDm0#U^r(r2f;0 z5txT{?$r5;0d^fy!q}Bo`0|IGJtJ-MExxbEfIC=Dosw4EDYW=R~fp-XSaCdi2 z_1Y=_=;iY}^P$IM4T7-e6fYdz-3#gjAG^D=VRX;uE73nLs8gBCuX{QA!pR*I<0-QA zE&rImxrMofyG6qM5aRI8%gqHrjm7Et-^09{8B$MQ1d-%}Wa(QGgL*L`5KB>|w893# zqDxKg{93JM_7AWqYaNadtaOVWfPM&oxo5S_%%?J&%&unK1t}7-D^qI`?PY=YR zwDrFVu(Ch6zcn~qLwLCWByr>Ro@N82+uK{IBu2dZ_7ZGwMzVzI4O*IXlb-?ROg#0O zSso=0jZ6pt=P0$SES;ZNfGO1gTT|E{Ybt4a~DsJ zWK>nlj3fJ*o!c9d^0^gH8@i3_9~kbXnbnixA~36c_`IP+4OahHA`QKiy*QS=X~ICs zk)YR~b|i&-dW~Z^jOQ3BalWJQ0Oj^QBuv_ZS7Hd1Y|@VzRlhAC@fnNCej1u|8da*# zE1>$k#PL4^LS_$ih=4=ovG?O3VAc$9+nMPrVpjSH2l@cfq*SK@2!9oTkIpBclh0_q zi$y&tHYc9-1r_~N)!~Io^Ly43lWbAa=L}elm`t=B@)mr&Mjz-<)?$mT7famXSQoi& z=ruCYUglWW)Bl|Bq(Y-|)UbiHps>|lCM2)y&^=eH+zFn2n#OzgMOkba9``&93G(Ps zR5HhdTLaZbM*VVRl;q<4ua)YKN$g89?dGrsqB`e=xdx4urS&IxDi#F@Xe4UVv zKrrsh@6uHlR#O(t0$B9C5qr4E1nNDa@gZA_@127khp*?@;0Ve>cWQsX*C(Ub5qP_+ zu)ByUwr&5weADZCEii53_)03qVG&vEDqG%H7C$-~`{lWNT32|iT)_R*VwEF94Oe?$ zZ0zh<0P^kxt-sgQ>}PAx0f3Y=Ff#}`V!bXmepR1VY)dBO0q5Z0P|y0wj57bKSo^S> z<#ilqxJm1H%{2p@>{*(hXb~-!rY7$+iK|Uvt0sQw{zLyojC8C#Uf+4+*HC+{uIA5P z-p;iRR2sX6yIHLV-_BU#dtyS>%??+4$)7dOKJyfoTWX}h+F$2fI2Y;OPKm`{+6$ix zmGj>uMP8arQu!d56FmJsGNC|n&uM#bi$x9Sw^xsshxX4j?ruJv-et{1dGp@IHHLL} zgz5UsH+;Rr>Yc<(SmUS1RYy(lR`KsiatT*8nPKdT%!WLag^86rqc7tMCzos}Jm34e zy>cA055bOaD^9xoDI&{)NS;ZA5b9FYDku>$jN7eDe zGlrF-Ehxt9o5Nx_h2knEBU5AAg%EW2>}SMUSc6>}ykFfO2~WHE1jK>sYuO#Y`?@uI zg@&3xD^9bI71ipX$aXdZ!5zB9ZrbOTY81c`CS6}m9Tvro{C!i4ic^B$PGV3345_&Q zWjsW2S?>=8w20*SGmDE^(opLD?B~zFg_k9MlPQo-=TYY9ctZ8o@Mz@omv5P}EY$q6 z&|kA%xUKJ&=^`?2j6c&Y>o;8mh?ko*tjE$@?19(P!0(DKEoaJp5czRj%PvvuLCE8q zt&&`0-j0-k9fIG?Wx8eG^)^9iFHz6+?)rv6eVCZy3^~e>3iDF}(QGBoLbD%hHZo?r zM4FIWQ`gU@UEd?InOaoW-6S>i2x@2f*uK#~N*D3$Wq9sBrrB7UIH2tr--P9T4JN?@ z!ro9!a=ELgupwmJu$!aNn3`|0$OsScZHqevJ+_$o&o1+GEdQ4IcD82-!@1KH$3xH-7ma+Iv8j~{0@M=-wPmeZVuysWj;*V|d9Q8&rO|sZ#wM+JMrS=_v4ii<>`X5?B=)(K##U@VYsFOlog>65Ds>SP@DX(aN5PhoSPGKPK6~(A(6bhA9P*y z=A8DLXg6^!pR4X5G8puK<7=X(ZJOV^Eq+Qk6W*%{Ja^qjrU6KCnr5tY__#u5z6eD1s%U8eK=&svV{o3z;`6*| zagoOy%rGWGLgm4ECGzZVr$$??RKP6nzDbp0x>}07M3jZ^RPmFE_fJUp{>) za_+J*$WW8AmBOMEW{Q#prK}xO%9u4Gn?_X!pe`mU(}2?Rv3-ira|XX zl$h7KTF>>!cv&;sN~^~XelDm@T#OSr=L~$O`6}SfP`A}kH{j>_q?F3>&guW7>Mg^n z-2N`yt%4FFxJc>lknZm8PU$Y`6r{UBknV1f7NomDy1TnMlfD1%xz72nB5Td(nZLNl z7@x;knbfmK2YZaW_%gNX+9sN;YKbN!8yztzK$TH*f3a;h$HWHxe#e!Xb#faaG328?WbKoS(R zXIIUt^yx)rpF+~!JL$i{Y^O1D)1@)RWucl@$>{5l*MeTpzNh?0oeRV(36GMCrmhmj=@z7kV;e+vlwslHIPGln%@ zJ51EgvjmbJF{|<`-{SIe-8U=Ow{Liw&$|ZluTNI4NIVdj7R7RCx+Rma-;i2WTh!~m zd2_ON`{t(AC5VpzkB*huQq@YQ-CH*44OI!B{s?v*F?WiB4i$y%z#UH_oa z%*fFOlCD#J!Ec7f(ihYpiX$-BDRq|?oL(S#pPfB($k{%G*`RTMa)l}&;Oh@O{E5Y* zahK$+ZV;KdLRYAkp)38hYS9ntJaxGs%PAMFkvOc;ziGcC$&w!&OPk>~l3uW%-)$lj zSdTNxPfEoQW+RQJ-U<5r>hsI|4#*PVuL^jPd}dv}*@-_zUMd!fl05hw)tUqEv^ zmEB7c5>Z%|4fDvY3JvwPag) zEU~yR&_dz^lcF!UPaFRDD98GDOZ;!rl91m(+y832Os$4W!TT!OZtW8qXP*}o78-cT z`(3>vn*22SfA4PLmv{GHWfHu*3t`3E&95Mx+!QDv7pb&cJ=kAzMy|8zCO}*qdfJ@b zVE9*8Ju(xu3Ofe9ckiE>$uUIBmfH6W&}|=2;TJzDc1C{Z+KtIp?`zKL&6@8OAZej{ zYQ6o3>O=aU+;<}mnz=F<=;0yH->TRdI|lyTAmTv8-Ka+q8Ol-%?9-@CbvV-N=8Ro) zD~_y8%0mtnNQ1t^4i$&on)vS2tZuZ;eqDXLv!hwfR1n#+J6IaH_Om|y zb}jl?v-)VPnLCw%@d-@PdcO!>&dH6Z6Dv&({)5JPi&MGj&BRie39I=H)SY8dTXkE zgg-m#h&@W$2B(;+@?HLy6t{9}6<-3ob9wro&FXiyw-5ZI2o92cn!nW3+guP%-2yMW zTNukisjlpA7x+ukIF&>uk7uNPF_3kU@OZyGPeZePHDu&z^`=QrWaup8Z;I|!&uCUM zx<2iSZJMojy7ZAYBjp(k8dk=(`g9-nI^D^L`hok&O4*8 z9`AOWER-A`NvnX9Zzs?VRe)fmX!_u<36RGR#NB{Ce}8Gy4%#U_@Cd0@==uC*qEN`; z1G1e{V05zvl%FE;l*$|bYj*C^k?pgeO?>^@urAy%xLhj8r%gxDsZ`zrB1j;W!%?qX z@BCy{5X9ra>b81}eW0o`TW)R9l3g45?eoU&WQD&$=Eo;)Hzwc|mQ_;4NoQKrt8)Lw z`Zjqj^=X=i(yhj!HN)aspBd*T$*k1DQ82-IYlrSC<S){yWj;lCXs ztcN0a<=a&ci0l5^9Vm<28K8SS$s)@+koNKMSwmLtr#m)mQ3QVW?tySKSJbn9R9-2u zvG|{DZ$FH2bQ-TevzihF;Ua`SelvZWb?9|+-jjjKNe#z5#~uqe%@wPmf?g_CvwhJo zyWA`qOF?xZ^J8j?;wSQA5ejQ@y)wPwCM|Z8ld7eNK;N{F)#>)wc~bqgjiz?jc}=>< zuGKPEes`zEur67}`hxfC=uB8Yk$AB%%J`Abtl8`KoHLLNteU3jA()9A;wq+Hwht5& zn-y#y7K3zoit%Vu|JqcBp9zh}{TQ_y^|%oVEi7RfNav}7wb+hiDz4AZvj2WWt~k{i zh+Rkhj4FCv5|dBhY)Z`3;&qF$eqZox9P!f;hG)#6&+2f9O%P*L^E)RDOHG*<&3Qq> zO!K}_F=6|jtDxQ04vR9LCN!d~4bveP?%(r-x~a)ER}(FC)dQoEJl+bEb!=B%-pD89 z5xnK@Iq2;7uyrJqEP|J$Et^jw42BJr#!sJra@H-1eXW!}a0!+#ANp)KtUf81e(lRV zRYG6dd7Tmc!M}e}I5purv^;rC^p<`Ke7+OB{>*2=pE>;EJB0kdY=7JZ2<@m-J&t)M z>~7hPy_dIjsWfU=PbOm$Z5)#p=mIfH2+kuZtaM(_kIujzK%gE`eT!H!LF)SFm_$fl z0~j$B5A|UZ0|9FmiT~th`7EI|n+y#43)ivz3Ly4ob2>^fA8WXYi zO)jTd+M2|#tid^7vk`LVFkiIN+>>n6-sKmBFy$C3RotGeekUIXY7e13^V3;CeZKH? zMMpR)tDxt^Wg62oSs3w-vv7hh9P2!z+&;gY!1L5$0t z)yETHgwMj^bbzs^JdP}P0hJmDB<|mU&Q-h%#?G+4+mmkM?|kH_N#C>_&1dbk8@16~ zpQ+YXJf7_9HJV?~XW>&$bFp?=_j>mGm||3FQL_?dXqKkjsP-n1Qgh2vX%5+G@z5q_ zAr!1>JL2h@)P`=_Q>ozB6f=VoU`vYQBZZcAap(Ur#M*O$Dhmqc1OlN94=eNWA?f+CQFU)NGUz@v8*9Bc1 zj5$=o+x4Vk8_8T|V$^_WBr?bqWJ*un6hjaiO`_;tbcaC^#Vpzenv zW!j`ge(69$J&MNVjkac~=2D9t%awIwlz)aV2;TOG<0a%GbgYKGjUy^pJ7g|Ye9LWCZEoVQc2%0XM$_KtA z&!SYX$Y^`hQF~(Fd3#I{`DF(#G=H1_Y9#5RZ_-MJq zEQO|=K&=rrh>F%8u$AX21EO07=Ok^8fT{@}*aNub9~Avx%ei-c%V+80T2!=9wnE*W zr>iLYK-^i>4i#c-1d zdw6qybJOd1W!$^L2{Lnw$fkG9a)6q4Y$>y&lpCI9HDGD46H&KCIMghUY&^G{xHE1f z{^KWTRZaRVxAn}Gi2bF|8Q-oR=J@&Yv2dzPm+2Y>)MZ~_$V#bDI zF?_bWNU(;h)z@p%Q7$=BH4zP|dw)^bdG6ooJ-5}zX>UIK<&3mF8MkUUfPu$yt#~#u z<*kL^j$Uzb|sfc`5uXU3!hU1cG{1}`*3w@H4TFr(=ms|U*z-4E$-+S zbkr0;vML57&T0X+V!AC@e^7X{#J6FyFo?JvWvpZB%6|HRX=>m3c=(abcQiuB04@8} z+QDRKBHOJKV`XHBU%!&gcO_qC85BfWE_Vlbva3>Nc((LIxu=dR}1s8Hq&W-mPLtF4Mji?_(ezIR5B zlA6H0akH>{*DhkwAe6PZLeX@QKs6JMRoQ+BA6iz}i+~zzb1_FeK-UNc#Ld66-BoQ} zwiy^zbq)K3(MZSlwQ(o;x)MeStcC4l+3?!oPC|4!DAO=Vm5AZ{@?I(}$n*_o&)@-Tm8 zLd7#O@K|7@!PxP-T^51*Sl8OrBo83__~`v}LWrKIz>}ax#}#BOn|f9O)s^M4byWl* z6;>73$<@`g6Z!x!Wq93nDwhW=2&h7n7)>I&l5l}UT@;ilN{2M4Kn6`5k;~Pq+F2Pp7 zA|f|az_Zz&3Z_A$aFJ98d4bf}Hfz39j!tE4Ox;&{I~g~Ly$c>pm*LxveK$UtTwDtz zelYimhQ|7Y_%cEVv!N9%;+J`ywh~0Xw^>7C!~I3Cm=Kc56N6{LaGn5Z;AR84PD&2< zMDQ#}&cWn)QgrQSo9RumN}Z%}2ruKCc{`wB#(ceN z!u?FH&N?h+p2bJ+du@M}9yMrh8 zOds{f35w;8O{W=wQ-32g5h|5$Z~V=i#0c&pighwsoq4$MSL&3poVil}@6o$BKqVwZ8)W zW1E80KaRsf6a!=y-&oLxM;vR0OH1}hYIhRBdiE(8sZ3G88~TWrZSS0y7)4S9EFQa} zc;{okwFnRvOvS^w-{In3kt@?;pW<@(no?pFf<{wRln7^NC40)c4Ggqa#9SYsM& zSABa2CnnDJL-ZG;s6OZ3GeI25^Fm97PW5X}qsZ$9zy@Wgm2v#LFY%h?Qi)f=p9H=0 zn^S{Px47VbfNVj-ew`D_3Qyx?(DV&=`Uw_`1=Mcj!;zgqorI8o`s~9MfaAN8?+Tbh z@FBkQXKuMb;2%#uR{rzz-&uf={8WQxJ9vUZ&v4ZkX5g_{-ep?Ldb`f=A`5qy#+vU7 zp;;Po{rvL3iCfgm#LZrQ7oL>+6&cB0jF{|^+SxpHEu%d#@>hG443Dai64&12uR>yA zda$g_;c&|$QnFO4fziclrYQ3q5MGt(y`n0gaT1i(dYWY^c$;oq{%0tkZgbC)0@*;M zY0jAU!{%FofQ4!b8Y@V5h!3-8GF8fKymOwO!GON;+4LXES4Eb??=duVAB8IH89Qso zO)rrH8RutS*)hiWeisx9B_Xm(UF??k4R32}o4U~j1zT97n;mI&;>eMK{X{gz&0`-ai43l!YOSqZNOdWmp0NCbXM0$c@4O--Ah)IP>k8gPqK&j*O&whd zRe<;yfM5KIsBEy;o>T_Aw!p+t#{`yz=^FSa4C(KUhJUTf$jsU17+S)*T;p5*``qh~ zt`1E#0oIvFR0*3&mUOzUC^VXJp1_)eu=}_CG{rfJV7$4h?MF0S zi1P;=RHorxWpg--3FR3+nW@vA>cDm zxPS~e1>B3xDf!^nQCA?z8#h8~%lTMk*)~zOQJs_v3d==AK;b*$?hx*#fAW;TGm26Z z?JKp4^I|DaLr&TEScbP0>LJ`7R0~?9Na39?2%tYm{)) z8NTnwqidHIQZoBzs~+p`P}Vl33TtB#hWn_oBxiPJfmRA^+_H^+ymnLUcjO$_?&_3& zw`o5-DNbKndY9Miq0qYn%hF;ICs6y4S^rrf;<%p+p5XwV^)GkX)K9OYES`mlU>e7(6-^yy~rn%c|uM51MjjGZxM(7lD z*(3e&-yCOr^|@8Zn?`LG;$Y-U2DJ5=_Hu9sP}8niPGyOU$O>qM*BrRcWbDS*^J1ThCTg%6}g< z(LaB6pqe_9RJQgh3U@2o>rfcgd2>gNMfeLhdnT$jCtOs}`hq+mKDWkhm(F)UB-Zh5 z%W=;jx3yYOB~w}5)87HToB}KRzrx#eG~qtfy8_Rt@|-=Ow&AB8it8&VrZU2FKOaW1 zG^Kg-_C1n8F!_wI3I;K)+yYWA^l;EeBECv3w!fr&4{?Yme<5tsW!j-{5hl}74G)Fr zZA(Z>3&2SP##r27EJcK<4i>CYR6Lr6dhNb!o_941gVSCc0na095X)YH0>IuCZArjm zRq18l$V5nJ%mf#|6%~B!KYG+01t&2zOTNPE*8AvFV8r{*BoZHntvn;H3J;&%dQ#9E zWB&hp<6i|EDePdtbSAM=h|3@!i8KET(W{}_|Gg(WD7YH5b;oJmZ=UVhezZK8-3-xf z9?SW%btv?!6vgh!OgX(GMS6;k4@mEYU%*FNK{cC#Dt`E1^U5!6z)iBg0 zYssipx?n?)7eyU{Rj4I3EEX5e7JT01?c>csCr~Q)?;)^-d_7L%*@v6Q^PfMNOb@3 zMd&)8t^aHIBO%`umFY;YiYqEXn4Xi|DUe|dL5I!;&nP~#`6|z$zvl0l6J&(6Pg*f|+Ikmeg5$`PzC_RT(gxgys0#kM%DxOp z+$ZlI>@73eWH1sdxVTVgN|9$7Eer3ATV?$4n@mH>sQU9Jy7aD3@iTTpPlb^-5%Xks z4#6wqg@@R2v+DKewgmXfW-rC5Sonqj-f)q@*;D1qFBDpBSYZc4Q@%sl;q=kOUp6Y< z7w;7#aLBe1h|OkXGsad!WAXCx${k=;!9_!0-(9dezqkmZ_G-_84BwJQ-gvC9B4J$u z%{hitWoDpu2UE*kPTq$1MCg`vG2Ffgo`@4(k>kix7h4VidV;4JTO;W3rJ0Kbw;2uVXbdoTrGHaclI+ zWVG7IP~|CP(JsohMQG<^VZlyKt0_8^mEzM!OXEY1h}xbZZ!z@VD21TSSX5}nJm1Jf zciu{}!^FsL*q^+WZ;H2)s0}O^OX5V*cqEFj}M zZ^;^T7-M=n0;sKW3_BS_&G)6+jXl!MT^`RWnNT$@A8`J9k&`6mN{!C&y?-hU>OWM7 z9bP{b%nVUL{v!%ra7To*VtPB5<9pl7r5bi(R;4%;Z$p<&8ewq>S>|iKNS}BrbdDg= zP*|b|Buu^t4Y*k2nMs3T40TXghwfcz*KOv6RQ{PA$#G@xikXj~ArE0WudL3Bm(thK zV9*3{?^wB(0X;$2Qj~-sNvO2Sa2c&@i|~WcYPM9-W)WT_!Pp#xlHVnXCCu7^e_fHZ z_%#Ky%@Q_Hsl=H%R>*#a_)Ycp^Wo5LRanYujmi1By;F2z5TssD6BaRe~qVEcli^n>u08hd~`Rb z`{P%w-gMAJs^N6w6qA(L&{(R;cl~4lkom9Y!ha3XYbX6lHwQH5gRLm7ZkKSU>pjjl z{X3zg+&}V|{K@vy0J6sBK`Z(JgVr~E1yX9|Ik-7dhEelnEZI z^b-Eib!PO6rBwIe3**B`o9#_V2XhDF5BdxlbwR<0x=p0IRC?}cbubxu7$1D-4vTK@ zP^`GUeo}PMtq|AA``ErUB+4tl(Qv+?dXzsDWvWOj>V`6sj7Fbz7Kurd9;7zih@H*- z{%7+WyLGbKMx4?qc<8G#wfyQXo{0d~b}(nyJXg0z6^swy-l(b_jF?iiJIvZGT)I09 z$mR>ym~QOd1`iw9bNa!0N(+2mEFmfWB+2Sp`&tz&Ek`wA>a1<xEl8Nm|O_5dcul}>XkAq94xOTz>d zd`j7@8EV@74YKFkf#sVWa0OXt^VY4wS9#i+(5#~YUn6`iEHY^Za4~ZeEZjTzXbBQf z5FHL?<)@zaRSA}IPgwt|*w^R@mM!&erW7l#!5yy_2TfI33o%Vn9xoxPHAqzatzd_7 zbWeUdA`3@`jU2v#LA&@}yWifc@dKQ{HXT=<|Cl>l1i-6k{rS5_eL=i%wn?f=4p@39 z^$s?w=ya2+m1u>>yGvz$f?PLej(|Wt#-bLofDaBs=$k>Lvn3q%xL>c6(zb}5jppCg zf8CMHn|}!Zb+Ph;%QzO|I@&7mrNNS>dgHelHIE)#+D~>@!ogj+84dK%ZNg+dK`dCL zti-3vdnlHl4>N16Imkv|jroN6-xGZdRO}={Lb*T{^=q^Hw=kLLS@Ev%Li1Jxb zW9I~4S0>gq;7?T=M6z4t7jPluHT$+#t&3J35Ds8vM5EC{ZqR_CozL7(3P3j<9doKk zAa}?RhMzxncL%ElgYIvBA{2j-@w&(UH5vo4%~WO-wCrA|i2Pyp=3ktTH+IOi0MQH7 zGv?6XB7MV6vt4p=wkbJ^{>7-#y}A~h{r9??>oiKAo?dB(L*y%wX`@2vE;nttvc}4kkYR`= z=~cNu=ynGrOJ$oBqS=cYC@G5rE;!u1P8>(XWXKjhu!acwFff3;Z#>yp2t|hUku9q5xUaH zTdz{!XkUE|>>$ZFQy^@LrhjuT!v!hNT^%fpD7=rKC8Ey4*+9B^AwKe5>$z>#)>Luf^;6w z*In@PZ*%hL$wfwh`aGJc&{0yseLGa_P`qLvB-sI#jDg+XP6|LrRaJ-{wZ`=&>#gta zQ+2|LXIKK7)hPp{C^@t#1$EkwZS+nn3!jz=PEeB_^uUuPqfmHmok=l{im){R5y z{-UyKgs$zum;d{u3Tgkj$eH0s@r3Br)E$a>*ET08Zu&AQc~5jDOllpfA^{Tvc_|wZ#+52 z%^rR_Yu-j-Z1mI}+4AD`LSoq*rZT1j>$>A*$4Ba9OP%z~z!+a)FfW%$TcYmehK|g~ zKU1(rZ|_!ixAWIS#yElgK3^;xB7)P6ZzJCW`)1?FS}GE5-01yzCFmA9Of=p$b-Ui3 zydB0}3;=uA^~L>dw0jksxpyR9Ojr0~Wo~%3o9Y!@(>90MS)!6Xzld^gh*2a3e}KqY zKL8t27XOTKj@J{U9WfqBD{XoQ$paGeyG4z^VYu9w!0lhLlE5bq)J3L1Uk226AKYAo ze}HT39fTyuP`cvw;g&H=6bOk?BZ18gxCImNETb^zflDJEkJe^)Bvd0jx)fr7xWOJy z8+7~DLp(mp&2F~2yYqCXP?4c8kmt#ip;#U*An@PWlYR-P;9}n*YQFZ#5thCLL#a`BHY?AV%PR~iMv|QKN6Q4(x$~}{B|H4R7;(fxK&quQSGgGbqOZ62cOU^ zu?HASvaPs1KgHJLCIs3ANY)TgIR~%#GKt4GtB=*Im=&5{vKh^Pi5ex$J*Ef1&*XJlxBD=URCpB%dL{PcP}q552gm%yMhT?Z&%J$K(PG> z)vevaTkU<5m6fZmfc(poi?`~*hJDHl#_1G-n7-Dg62S`upBybnFQX%Ldk=^!U zPy4-gtz>P1^cxK#C#Fk9kD|9uXrxv=eupOIy)6eHwQKZcH=ET*%T;z3usq<=SQvz) zw>nzLFlzJze{>Bc_*fxL^w7&bo98iUfo=R}%IW|tw8*Z$HvsFdMI~n1K+$qlwwXh( zTr1E{Go6>%gpO@2Sc^s>SBJlx|BxuddARew-S}+ft;f*3x?tkaW~3pM4@J>)ma=z2-j}VXTXCQUJNNwho3Cb;Tb_<8GpC zg>Og%BgUACTT`12&N&jya8bk<&l^2^RN=Mvu#mas7Y(cc!0A$3O`MbU0Gwnxn&D$E z4ubWBfXAqkPB)=CEb|)Yd4q7&-+Z<-1&cep_?bFM6WYzGa@1K4VDJY==nqpHKf4rZ;cFw~G7$ z{S@><8To;6!5)l?)KIFq09nF+*+=j8?ulyVnl?t#6)YjOjR}kO_(k^!g zO*JW7lH-1Ch=xC|0S+;r=`w*>Bgk@-`RnDL@>F=)s8kY(B-$tfqqEq%I=YTw0IcOk zSriPihpuc++{4_g1@;Qq?y1=!6Iwsyh$XV)adCyK{}Ow1wDcL?opmHOBx{t>a1XcP zpd>6CItB6AgTB$-b;>?8!NT;iHp|juYe&W7l+m;M0bebYX{-`W{z`tUjkTSWm>A>D zJerca$p(c6bU0_2vVMDMasFp#k9W$c(Z5fRfM1esUsPlzJ z3U5rxVV*oZwp_@O$&yuqGGIPh=MR{ME341tNTefc2h!9wGk1(5IQ*)y7vU+rQng~N zF8_uZrKej3yeNQUA-P1H9PfpmkVh7?kVE@cwJwalvP*eKLq#N_#$?s;{SWhh&{4H$ zW}#pLLMqR0+I96va}TSVhzi zDpvmUFkS-JJKn9qLDXr!+vJc^)Hi+<9?igyt(-d6QBOO|h0yQEpF#|AMMYd12snFO{a*3{_r2}3l%HpEwC)IxLQ5Of>U=2E6|^#S>@?z&~zNM~h_kCwtW=i>*kxRkB2*ANBTHefBy}a9)pf?UXOnm%=4oi>*-JCG&dHp*!zIZ!>g?9Y+B5n%H>+x;5|Z(32WC)u z@+48|q;NJc>P;_f1p)S_G=T?#M7l!foxT?C8Jh6#ha3X2jaV#ccxv_ztL`t`%paPp zx%MKB(X%ws^SEsJy&pYMg{&iWIjtSMh)`iPV_bU z7zmc%2>mAyXv)^+Im5Euz$x%fKT8f;^=mp=n-Vm8>}B@9YDe za?<*G>zwZ2(zAH+J4S640Tl)u#B879_se3M+9cYAotM)?3mc4huz9acErjKv)p;itKMR%$ViMT=vF`gKO|v{_bA1%$Tj-#+Z(h&a%e?y-mD z=virTzsmA#WA9B`Y^1_8ld}4JH+u>(IEm99Hw(n6rB_OJ!i`+;rwnj=_&@0Csf&t9 zB;0t~Cd%vd-fx#Ed2O@$-k!Jr0;3kLPtinviW^`ovF~P7ryQ|b-&0Je*F||;Z~3#e zGVnymt11@-`}q=;hf-ayQMLz^ZB|5>f5d;$A#b+JOjqZa?fsmNB;W zT2Y8}JzCL!oYK5uKcj21ioq}OiE(Kg#P+-KC6FJ&^AiNQ9@UwQ z;KtFF*J;Jc&P9*iTM5uE^-iTQn9$VmSHBaew+BPJ!>W)S?njqBgZ%h^=*8+ErphVoyr>xK3M zXdpf!q`$}@fpP=pg~~$LtpPql1~2(2CBPe_9r!nHR24IBFsj`e)q^JlpV8e}0@TG5 zQ#Up=<-A@Z=Y>>5Yw2O;N*_t8awoJu!!qB~Ep{v{lF4&fU^<{{#j8uEJhl22&P($y z6X7; z_lyv!Y~e_nUrdrgIfV?L8vjxvcpTk0J>2#n6_VpJf+fh7Hkk&B9J${05kj@y*$RgP zW(|@<_QVoXjUfGvH$At%Mx(iflG&)XGX{i4&@YAk!l9ML^X^2&)=Ei4dC}rP185ug zl}(C)nh7>ulgV9+RsQpNB{x-J-VWy%WC&@cHGjdLUPguf)jwKnw}}f3CO-BZj&Poq z@a|Apjc-xT4c24qjP<2sP(F=W9ALU?D+IirQ`B=e>W^-t)^K1{C#D*?ZFM15(_vO@ zD9kz+S2PwFp*M$@HsY0Z71cpkJ?c{SMX;Oyb%FkKHow)Wv+2*bhKv!c79st`y7;!$ zyWI5-NA>TWeHU#+VxFpx^cdTb$5A0`r#&xxp&Mr?qFdDEa>8cY+G^?m#?8FbjZkFn zUO7#P_Gd^wq77t5t9(dq18L1wT@pYXox`;g%F=L&g@GKUZ;SV+QF%Pz_yaWXR*G#m z|C<_|S50=6-2t7j0U*4KcnoRI0LnusgY5}#VEQ3+l#Q+FTHy;OqCcv;f#a5#>nzP%tOO6))g$zoO0(2`?(DSH@R0rPuGQ zm^}b_a$?C$gXcD@*>6j^oFnziPr!0#oe3A+lLU?0;8lh>=czc%@*ISm!Qwvsp^ zdPQVL>XUoW+`OBoDUE%BY_Uoy-?WMwqDwUMRA(@$1(&%j1vq6f-bB zT)YwefsMna#O`EzrqNDn64D!l^QSc*^3Lg+FJ5Ac^*HCU=3fb@SA0l892s2EvuQ)i zf?RYk7ApjkwW1u+(dIvW*cR^JVdOt=8=eu)xzVll7VbRZUOxk47WF9)^=OHTvy2p{ z4X6F1^O@P}W9fLd&k9J+5*kR(ra9&O?OFe1qN0d>D~uzn#x~iUo=}~oDKVP4wJ54J zlu3iB_Abi47nJ=Q)tS#Z;t{WG|8#TdK1&WGsz6AU&cShN%jJjlhc~Cz@(0WR0CY@| z8kDTcl3ed&Ug2x#lnqjL1(Nm)r`pXbhV%9jywq)LxrV~ft;1jq=&$&mAdxMF4OgK% z@;l#Zz)taXx~))!fQI`Tp;(Q4UI?#Y_cx9`GK%EWp)56M%AttASs}fo9;>l93d@A%KxJ#WaSkEh+KDG7_kj6sJoq8O! zE}W^1kdE=)7Q5X+FJXkJHbd#Sn@ZR#d@73WYq!I8C|LdmZYe&+`-`j7|k!j_3bZGdX3wUIE%O1Ah zUzd+Ihu#j+8JU#o3AzvKHV0I}K0NTOJf)ig0B2lHU+2t1e zs~pcu-g!5d8FVR3);C9`xil^oO-dC5dz)0bw*IF{b!~fhReNBN=ePhd*q2!4ll1zQ zM|;I)9yh=$Z#U_qsO=211=TFCHwVx+Kn@0g4drUZ^I?n zcsiVjo4)Au?$IxaUSndBLR>Abo>6ZQAikVSxI zK9oRk5)n!b^44?>7-MGxSAZhsmr$`yN-4*2f%cghbXbU59rXt~Ss1hgDwS9xR97K6 zI3mM%0YZ%zZD*S>h$v_u&y_qqAK~5qAbRQz%pt7CV*EMepA%>_i|!`0HkO*c{0YFn zb}83sfj|q`PvvRFPWC0}8Hi(KsrhZ-hIpPSoBpm<#H=Qos_rR6 zWXh)ggoSAl|6d_6A;-%i#s#|8>)Wp6P5=Uy*00x(g*yXR$;^3Vq`>Fi{3<8SOLk_` z96DumkfXF5z0tAip)*FM0(J=dKM*a!MnDadF$<2RCcSVTcve%yW_&S=bh`xp55JRn zhAw6L99h$vg+_!^hNxXP-l8$Q=mX5>HN=eYoe&!2h*ZtLh!aOx;w=oXApwfzi0fMT zxJz>g3L_MLoSolYZBF~wEe>PyuzFbt4AfGy+iUyzY?RkwWhs6s35#Sz`-mh~P6U!r zRhDv%nN@$q$G)W{(CKEkWOX}Tt>4dJ%oKmiXc?sj zU?rK4=@P?@d)+o7Pk9TIov~~F*=5*Po>HeAm0khdvnEGrQN80EjVU#Gd~}s{D9JQB zFFe%RgzAmC2tQg$ajIE0bCW_Im7h>It{3J}V#X9L9!`kJ_xtb@#7NQilyi}1%rfQL zMnAgq8q@Dam_4|2F4@i+UnXZLmO;qDcGW$#)%z{vr@01)Xm8|mwB8uSt3ORoDP|N|iXZ3rvGI)6D1jJB0n`wNFEzWnJ- zxpX@$q!mMI>AOS=mhKngKM)V9Aj_3a*Fl9B{(B9Arn1O0OTGracu~oE9r~l{kBGsb2tr=9r_v(J{eF*s<^L9U3vfdV#iTCT z@}7@@n1`sAViuwCJ+cv+*;hQ*h($(G%yM8|v!++T!I8NF({6n3U^7`z^eh|=l0~F<=zgZ{GiYW{p_M3U#0?`t zR4hr{yI>%`c{PPT8>bhG)u!9`XkfoSVeoMa7t+Fsv-Bu(>Pq0}v z4XdrqYa7q>VC#b3M>$h#rzf?1XR!c_4O{%;C4eDur8ia9T(C+>Qwfg`)0^ z_K#A#vWKrQlKGb`&2*&})Nc0PE@ZX%Q?4fhQNmFz!D$ybXNvMu()$9r`x(~znE`>x z+;ydTKDNVh?o~^{dj@T~?wILY^f3|-vnW$3SCz9&HNFVyh^Vxhc)66U=+qXL-sNnq z*Rt(y#=c#S_@D52ygIcr_%e zIp0pr?BJ4pbGS9rw2pWLM^{Rp$?g{O9XZKT^NAk4ND|Ef zW2>UFza_pg+w59RDO2&eh5720NSPHl&SsFu9$ zU0KZU)ooD*lO%!!6-T2sL+yo+dA&dO=-O@k>^c>HFw-DJEZP`&n>=7@@23|lV9Q!p z5;(^kWbak#KNL63T-qp?-C7ULYK0OjA~CI%C2qCja@=J>jlOpK^Ox5MAypx_b|i~{ z7QQ`R&+a@SpDb@1nwDR*1w+3i1sj{#FY#TfPE^-#jDf5vUFexko@ACNYlS({jcQym zrgo>3)(7(pctDs}HydF+sn8r)H8nST2q(=+4o#xlW*XK%6jO&Vq^e~bFY=YLl>LPQ z;;E&p%}*%@D}^ZS9*7K{dsedt;!HRHP!nM+xZM3a-_MkHDV z;jHvV_;9GEk5(-9H{CB8u9gGerqVoMd1OQ5_}dEZ;qiAYOE_7>Mdbnq?FY3cgCyQR z0S`~m>od1hiIJhcSUHxyoW!EU_K|gV>msMdEQ`%`aXTUoVB9kX@?KrsFrSBWa3Z0S zz=1CES~s1K!sq*13o@}-RX#vh9{;V*FTzqELZLC&c8TSP8lW!S9QK1n=ChLtBfaAk zM*!^|BS@z-cwvQ|qEyv0uTywjzctm-=iSHv5$ z62v7#shp}c9^>{|t>ccQvIvH&f@R}5P9o4)n1N8DRb^EhS0x}#G>O3oZbxi?cQo^j zBXVpuG*;ClVJMAgZlnNLaR?62>ajcjS(N{{P`i&mJrsdrnSF5>5mXA8lhQPjdf$A8 zDwMeGbFbTkgkvr>VEJBbN_plCmr}Xuty;1|Q_#fxZ$0}P>OEkRy73Dtn6mW}P)Zc; z#w85?o(mFFf5keKl#N8CR1&k6(QVun=f0~N3WmiXS;4zOC0>&I8JBnrRS$rp6(!hp ze8&!#4|cVv_-vkeNo;gWp1;rQpSe>-R0x9CJCO`(T-?~U0s_Y#8^1Q;ujZ|n=68hO zUgMoE9m8k2yZhXbgkr&quXhP7?2P$gX&yDd(Mh3#`3ZS#Q;z)FmP)a(pGH^`!zi_s zt1Hs=^1+83BL6;i_7s^&y=YL3u+tz~KXMlHPuh7pPcv{`a6Z+#xxU&|>FBUM{4aYc5Y4b@*lcw&$nv3xW$!eNn`&0dnd@yQS$RglXKZ zB(_a-P@0kcVjbRg{#c8_F?pzK5e4h}yO)TO990>At-FlEE14d-3T+#3fw(*gFJX@Yvg32wze$`uD}b zm=!;U8}YE|EG&MQrCp!&+j~{*p=_h zJar!g<(hg-4jK$Y9{El!KMV&)ljD;}TrMYkVI=1dw_oYEU}2dJTl5F) zg)#r^jE#&Sf^-|`u0n!Ue6X<*OJSh_N}}(Rh0pVz4b$u+4eqcfQqO{gLF4Y zJv1mOAR-}M(%oH;Ac%B#Dc#*E-QC?G-TlD38E4L!neUwW`~mN82Hf|)cdWhEwXSt7 zZ{lTQzr|=)g0r< z!RkeYbS*0 zrWp#;@mXO6I`u&Ap-nZSZSxm~b{Fp+nv8qSJxT`=^sCYIm##~m7qnNoGHBe<^q!X@xtkrxV zIO2`?_LbMC1OauPS;?*R0V1-J*LG_=*jNfbR$Mf1r5WkRLyBq|*z9j@0IktQONoM$oL+f$mS@*vn@b@i6 z8HCLS-|U~q{hEg#4sZ$FNW$BRd<$CwrTSJ{0&klGI(Wt7MP{9sfi$sC-nUd{P%7IN zLD#AkA__Zehbw{mRbYGn!-x}wh{#WO+R=<}=5D{LRKZii0)XDP&gIyd zl*>+cDLE8L&!;k!%}i}6zJl!6=Xv1V%@t>UOgNXfOUt-dT`F{&d7;sL_FPk7T9$Q_ z+n#7pyE8d!>E5p&XHWPsbxNc^-G?@mCPQ|c=eSSw1eF34`P(=HnvqC!yA5k)!D=&H zqnJidz$+H)Q$<{Iovk%FQUR6%PmhD zVp@JEk<+zw8zdal>Qm(2BkExN`%WY1TiIRc~8iLpZ^P+^AyNhSQ7;S1g~Q|D`Hk#RD=+`#6p zvxC1@=OuaBPXKhP7S91hNus+2r|BFECn}x%sw3u20w>~-*6$mgQ&eBJ?_L*Pox!?D~9~R+{ zhy8Ar$e+uB*LZ{zp8krQ{^wJF{oX6ATPmLLr|I~=zVq)-{rz)3lKpU(P(ZMR{(0j5 z=PUmIHSl@6!5e@d9lX0$|A9k5Y1jF^!sMUU^uP1_kpxWX_?Zh^tzyBsDLt!M*#ET> zziA&X+~Fa9*WoT9SYueD`+u#*S4v=wflw87+!**3cJ(_6ze~jZuT2ER;|y+1%~0f+ zMXXjss|BqC>HqZ-jeAPqSMXX1Nz2>>!+%+M1+2vT2UHe}T z{{K6^1rcya_p}JU>*_X;^Q+RU{iZwjZ)ZaAB^Z`q0V0N4mrbe0;Wf;uJDv;E7lW=5 zlzu#?co(-f$=TNhF1;IsTj{5I*a;3kuk%-+7|4kEuiyN;w!u||mu0F(F_5QcF`dRD z;B|f;47B#10j~2^#Qwo-)Tb#_ELKCbFGvLR`G@NR$&_+AQ7X1NtAI*bVZLzhR+t+)8XQQV1Z}b}vEKs(&PEVy1koxofm{m;$U$07&vOs53C#b&oq);asbF*2 zZUuGab%I{N4?v^W@bt}*>`47%5_$7m)mQTQRXE$7X>WiXb|R$(oz;SpcY7zN>hn$q zhd+$vpVn&L7)&{P>>e9a9SuAVKcIVXY|YiHr?LG#<>k<=4 z-qg@i;Fgo%cPPS@m<|9&-p@e=$nuw5usFI?Q-F<}C7*99*N2`*wzu)&5kB{m*GKEG zVupj^jqZ;1_7yX_eSJkpNcd_jBn><@ip4-$aQt5W?{Z#$nwuYRaktr5ibhz(7u!+| zfvpnBZ=jbwAn)7RB8-0fMhIFDVK>@>9HZlrP?$O!B1@UWlxGW4b zadMzSn8m4we((N$A@LZHl*&l6zq#gVw^=-m`Ca6+YAO%~`%N$@igfx{53~*vB8Q?k zZz3TmOnNBqJQzJa?!=Zo__)~pDz1V8?VcypCyeDCsVo%=yugJcu|&)pALfW+RmTVO z8z#r>7Fu^VBbDW$`glXDF045ATN;vRRNBt@jUs%8tov;ge8=zclpVjlo}t_jyPtY^ z1DAYS@ajGt9h+#xOOyzPy`piABL+8ib7BP>-m>}E)-z0If`x_4!CLn%*3D$*9O|8j zTsXDH#8`(9kNU*rEcQvWrXV8=N_fkivN&U47H#l?5;`CW_E zp;lYxaK7RG428^!@Uu>kvQuIE<_KIEA-=O- zSQ|n1eYvQZ83$tg<5p8@sr4!7;qVM}78C(iB913lIS~4rG$~AT?1fBQpvSYP-2Iug z4;LRb`qciMKG(P!rnsZG8)JH+jFT+FgXD*^K&Bw7WJIR0iniC}q7D|BXNTbEb(UvFo^bL7L>93nBmkjNWIt_{R$SNLU0^ELSJ>y{^45jK>x{83b)dl~ z&^Q)q#fwo5G5#6IDgu`(8fpt$@b^K_*{wBYh8nY*Za96kl3ngJP?;Zm+adHBj$WV#+NZ!Q5+G}v(CBBtv%J9t#wC~=V}-6->V}eSh?t-E1?a4#1SW(T z)XCJ*jFo;qm6WV4z8Mkf*?9=%vue;i7BtJopzk=iSoo=Y=xXI<|J?-#sSDMx_XrR7 zt7!HSon}Jf5i;-PcJ+7s1a}F4eyIY7aGPLnpy!47qooB<3BOuYf`szMVzdM2KNxaz zd0?a}Hp4B7Z9Kg+1RhaB;9EL^Pw&QFzI*WgBKlsW#{T{;iPdK8ZJnxh z0w%HY%f+u@@3y~4D``b4;YTql&e4q@t`WVF7F=rDy1}EcJrzt$G}-ly3H2>M<2zgE zd1$rZ)ysgj;|Xy$VsRSmkZFkGoSHuHYCSs)s;YZ`(f%g35%=w)$B*6mjotXxLhX+N zYxsEkuPqzU6H-Cqn~X`N@1Jg9Lg!oJ8}Bs9bPmv(1v1Yhpuh-Z>wLNaUjTg8;S+q=8?41m{&kEfic3*k_be77^-1Zo9w$U?m4VkS5Ga>p2KK96)cxhDBg~r2#>+}0s-@2*7kGVXImKlrAFmg{ZPQhQ^?LUrOB63 zYwZVIqt|U9(!|r)^Fj@fr;~ovpna1U1FGRD@Ntx7NmSx^Tinm^IMK8~@tc!GA}=0L z4h`)J13EFRi>?0IS-u&7QcAoLjyPvCs*}K4=2-w!);RBJv|cgCv)d@J>|u zI!)EP=S(q2dj)}ntv{8uak*DO$tJEP-Q zgMM+Hc}wK;rCM1w)Cc4`}XYp;?@V zHuY)x#^w478`MBSiuD;c=NEl|972rZ@bi2C6;#=i^~Ux_=QE1rO{xK@W~YI{e0^qq zx;G_x>u#RK$M69tAFeEpVyIs6RH{xD_9}lRA@$FI4*NP3yZW$g49hA{aN9q3A5N8U zf9n0T(;hOV=a4K$W%(w*Ri(J4K)&nuBZw9@xV+`b z579hAg8;oPYm|-=t@+`8oOu(Cp!sf^AxVXEu@RLuo`-?}5&UDc_x>b3LT%&{F<1Gu z%x=|2oToQFSeyoc9xGHDmUMc-V)`^U`$KA0X2>c7Cc3+!sFXl3A@M4e{u6{uN=sB? z&9Bm|LZlvFeI6r|275dTc_T~wdF$o^Z)R=AXxpWCLeFu|rT09qZ>=<))pcz4viV|r z&B0wS!67Zjk)dim=|?MVCrs#4+tYm>G`W5Tnbc2iJ~z%$gHX%3uBUM4}I25N@kt4c$D=GWpTeO$XWJ~7*0opO=_A}Cq5S0wKp_5{Y& zqX->DLQk>-<1MrFW@}i_Hy3)1^7Fk{aBRjl_AEQLZTS>-!fsX?2--TY4$16r>v;`5 zWzzaMXtZ>A%SHs-T+bLyqf=}(!^cr&)UBtk6JfmDb3xxBdy*d8435p0@v`bMR?52@ zOqE*JjtK)7PPjY03#9_nyhZ_tsp_yvI+|ySZ-J1`qbj>ywY}P$xf0O-79Mov&B?fA zsM+J!P|d~2QLjfBJ%AKwI!zpJvSki)y&X%gw_0I2XeS9|KUS6^m%nO4;(J10y;U^5 z>wDvrq{UcFU>r6i%exCg49lA@;|A&RkC}#cCmS9T;Bp`J3!Gby?5xivUcg`qNW2L5 zo`1RnM|kJ%qgQvpA76!{6uh=A4(BfvR)&k+>XrZ^p;O52{uouI70*?zvAArFd+r)6 zuuXp15g?<(7wI#C0xB)5S-l*3zzbIDQT6&8P7ImNd%YdXy-C3s`LyFu)ae>d+b*vg6-uC!iDvgBhlv$w$`xi@l@|(a`sAcS zw_O5140oV;W+5B5N}78<_C_tgp373mZZfqHy0fBOL^@NP(@9^Uol4>yWfD1|H)*n( zDQc>oSKnY_HC7v04Zk%|96G}Ut?Z#YY)VX59>+8PK2`sE4BDx&GhOliLvMu^UO-$% zq{iV+^*(Q3OgOi^BBt??RD+t+cKC(rH#>Km?=RM2!Q?;fRzN>bhHO`t<@fInZnjbC z%CB+-&&3A6z5X0`E#6;oI_re!Iy_%aLqu&-gz>Hc_{8xiR~I1xWJ>-7e7q*ih0dey z6em*cEtu+Y7jvkEk2&uCzD~a{8DSILb7LlM4#f>6pt7a8zs7enp-37eB$6A7@ixi# zsnRQ?&>ON$!C+c)1jPZyu)W!oX)+5SdTYFP-b0rmFhh-x=ek zR77Rj!szTsziYSh$!ydFxp_uFMz}<3#7o!eV-#aj%HxZ8BZFbHSJRxLunr(RV)u%y zo^hf2INok{KbWiS;T;tGSG>$T1LL`^9hDAHMWeBTi1;$y;t->r%&Z{iSzlv z_(QIb)u7;wrkwLY;C6@qceA&1--V0qmXv~UM!`1--wf?kH)N$|KgE%0R;(D%bYeLl z#e0Zn{r8SSOh`P7o%9VSL*0I6`1M(fB^!-O zdn2xp&K-|Ca?$#tp9;m(JWNFuNJj6-BByq4pHX1xXi++MnH-7JAQuH=QjJ z6||W@QLMTdB2nGkhC-JQlTWLb<3y28`q?Nx!~14ALnsRzgp(SO>?jLbev-?ZmA@HUoONMF;-ulH34+tqt`3Un-fz+?6T2e z2|Ur!k)`f19AQYGWA`Qpa>|HDyGSm}NzR5tH|_kp+hQTKR#&!7TD9q-e_nd93u655 zxJwlG=*PE)g4Gu|#H?7+O_uu^B2I6C0q-0s@9K<0ho#-Y6V6Ub*L<`+#WrB_6{9&s zFqp-?2L!cva+(&PQ6PCMddSO#@??epz5~ASQ}RIuRQmpQ3TViRpXQW@Lu2lAExNc* z{Su<2(sSD7Dj`IVD*Vy>+}0vv#e<{*hH*-AX_kCJZ++Ft$i0+GgisaGq0hr2ym3=; z{GyPom*;f4%69W&Gv6+1Sg9a$g-1^Q`AuGpQbVg95BUJ8VO$z4BPaz3)8-b@$jKw6?cQyog^=n;^gBBQ&Q|I;T*m3FR+L%o=J4x zfL4xe8}gN)_MJ=z$+Yf#Rl!xUNH)~DuzJ+pA1+kL7o(*rV@^{2$&kps)DVK=w>4-K z=?ae9rDN_u2yw-gOLPc zC2dFxYw0d*!{2=Q{>PH0XyGG%xrH*>=eqEv&kny#DVx=@7GeX*44++;QDoClcO|c} zk`M8U;-H~&T$7*`-S<4TOc3$r?iM;SejQZ?t%7!8c{;vu-kyk4D(>x?Y8yCp5^u4sJ~spe>q zNqoLp)S1gdrg-83YhQf$Bs?J0@^5E>{~iD%5XyuQw1oE3L%^fR3tME|Z4YxhT0FS6^I+(t-fyS;vp4$w_cPdsJ%95_l2S zG7K7_U$L{`)0vLajEEOxw(-a@JQ#4yMmNTXHrgPN2a}WxzURuX#m9V|5WnT~V&EEW z5;$jh1%%&;Vzehv(DimMH`9Gr7AR?D)NRuw-FlhZCf$#lUDq_Qm%8nzvZ0%6e z3F%^cWw!G+Gx zYgjY3tFoFNzoL|>Emg4Z=_XBpjOH0?Zv&m|q#$4^EyT%;l@!OtXtkG0$>boArN>@@^>Sg&dYpS74E$b@_Yl0+YoNom*2 zpeDJ}Nt&Gujuq}b!EIGzBYA_%RCyZKxi-hCM>9NADmn31YO&A1SFjG)I%kKdEI@D8 z>Q4=`1$6LTwq$}SV?-_wT35!nPTZDjTqpS3zznBx&q3@8D@%=&_+>`naJ*}-ohswz zqWE)?*FtlohN`v>_;x5si$tbqO6G#y{Z(Qw;=~akc5^OvIer`cyVEvfs`4-E-hbbh zw^Xy3L(`+|xK|Z&L3#hLmYL8Oc$`J-G}v3WFLA-!V7R_y)Em@1f~{oFYVy0^g#VNh z!3!_TtXe&ENI7Ou570;!LV*UaMJSshEUS_AB<_9@c1r}42^R~hg1KNcx!?nG?@ zBN6s9@7%CU9vlWUN6QbJJCJtop-6N_X@8odPVZQA*vs`WQpHmACD8E}D}4X#FMj5y zS6!$XS2rx19y>8cc?ga5Vwm%r!=({<5F>Yg@?_}Eb#J4aO1NyuRSOORQ_CQ5gyL<* z5x846vPM`HuLUtBN*IX9B&bCSL@kpS%awZzce432XWjjCGOp@2HfLBwP4}*f7T43| zP>oq!=i-B#!<8uDa3b}=apuul+Nqm$t?qGO%`NBtnEaK@XNviB-HXpoYoJ|7i3Mg4 zJ-xtTp1OGM4^3ugmgN5F^Trpme8pdB_DxVQVR%>`_EwcrD4`7P3`gsdEdM-}Tx8xk ze_^izwA!*sDNt<2Bsf8CoC|!fFT)=hpak#u1mFKsd&9wxlyrD0G zUrK(0rox9Yi6L+v zDUdE?<5~M9e+4cn+m)TJ&eZo=KvEv`_+W3rz$>Ll-nYhSEcIS74wK_dPhc9T4~7V{9W$wCd7UWd4gKS zS7Z1l_dGVFjN|m7yS03ZkEEt!^?Cg}>Mjtk=~S>V^O7QX46Eao4>LS6CuzvWX_e4+ z%X8AgT%GvKfI*@5t>Y`Hx8Gk>Q8zkHM3v+oFi4KW;sBjRz>GmH2R?`z$~FjVxty;= zehz)dNrmySH<1f(w`AxYI&+o>jn01p_+OU|3nvI|gcBQVH=r2sI8Se*H**Y0F~zpC ziscX*1Gn$fR&DrBIqEjm_!Q^K^&k+HIsT5@KrTv36ZwJV1^@?-PYS^fW1!7YH<+;# z{q!|J;8OISBF$rnWo$Zp6=fnQ&_It{6Qd^_uNclkH?AUBeT=K@Y8E~9iO1(L&Sd0> zaHVJj7_U$3po9ks`1c+!v;BM`yTIyHSu6T#l=-x|F#;w7$+uM;U`*ivtfpbtM$YX8~3e0p3qWhy=rZwZG(*L$|DUns2pO8$T%@yt`Y7CttGA$90t zW(;$L_o3!^Nl(g6c#S6J$iexm0t2nwT0=M-9{0K+Vm3wBgPHJf8rkkd0?aq$+$+2{ z1MI9Q?{iKfB{$NcJZOro)0;~D?ITL|5>uoWKU-rL<%9;9GEZ}rOT^S++f?J+tR1K| z#`WkA*8}yG>|!FM&c+59jgQQp-ppj3>6gBhS9d8L`r`4WL^LAI^@dbhJ|yOK!G0Uv zsSWJ%G_VB=joBh^W%tt@r0wq~%JVkx>DG>K3kFVpQ-pHB`n^uZHr&vdR^H34r7-_d z8PKk&X1hIwK_S@%A3!o$J7FZ_8T|F}q+KDhPb1r9%^Gx1wkDo26gsU&>xmt040ZYB zqwD0lRQevu&?t?6b@QlLA8*k++gspG@CigVRh>5Kcu%*v?y@h zu7WzK%csu|9bryH#*uV?_Y?^GML!qZpoT|l-~X|8srgwxmR_}LIdI}9`#px*Bk8(* z3CKjVamB)y^QC}UKzIz8umJwppwubRt&*jY_TN-5$OG3Uli5swK=o2NQbDZqTN58AWit=XEab z=mqkQL{QwBLiLN7eAnabRR9QfCzfHzud>yjOI%m<2drKLw6I&f3`0)$R&*Z3VZDh% zy>@kncv>#7wO*<|;D^R2Jdt$z_IlO1y^anIo^i^+J$IW2=rDU-TLbw#bZ zp<}J|7>!jB&GSFx+o)>vgRY>i9VAgDvf>!`cW|(|HoiDaZkmBy^IG#1_el=cGMsLg zHD0+GDs%B&_w}w8UXFH^7dlrmCSLXyUF|>Ev}5v3bA>>2;&IHBOkC|2#MY+M)OWOJ zU1xjj7E-gjC)jd2*SMAnY`V$Tazpv#+Vk_bHF5k>tO8WpW@Cd1e2)J#^P{U?&? zOVzn1dDs=E!6+S(b){2ntNwOl%M7y?=Z8aR=M8C1GF;yaA)BVEm3PO;%If=n4R zr)QL!GC|Lp2;!`8f5UbE6oY&cAvDSgg%R`-UJc1_r5HbNFY@$%MD@k5w)7Bcd$*jl zLfN#EEKyx&d(pLnY2XP6A~R*w)F(T26hujq7~n zS>EXDm6n2842WUV$h%et8}_HN9EAgJ;%d#^vbTfu8rlN2T+_!Nw__ z+76cL#IBc_1IvoT*oeybsgSQqYZ3XyjCbB;ML=1Bl=|@{o{QN!Ob>qF9P5MGF&Cao zdKO(v6HWNAmwtT-bV!0NoLX+rky&}%<8#1uowxj4olBFrj)}aI74PN8H#>6%7pgp4 z1x@!Z@4iyB3BvxH|Cjvy2bofGx9r1H=1q71#nCfFDjzc$T1BI$>D|ChQlxd-iorm< zf&h*bR@aysMUIU`4&T9uI;|+$F=n0^xC-fwK!!vnC)y{k)Jwx^Gq=1o3SdK4LYKFF zT@<20D{}G(1DyupSI&(6t`eq8Ar(8>C=KE4-Wp5ysO1Z!xT8ohb(DT2vS#mHJ-G^{ zv8KF<*YfdwV(CQKjnq=je^q zrNg>Zp2p$f&Dx2`5;aBbm6!_q!P0(8W_~R^&hgK7Emb$+Lu6Q&y9UW=(zRJOZ|9rX z!Ddm8jf~_t$Pt%5-CG~XN4g*JOdH86&<`=d0aUCo|G3wTDw%?xSE}Z}Klo5Fob+bN zXYcyCz~3%!H(e4C%^5Q*rSEI277P?P9dE4AK2wlag*PB|q2dAvqx(6c>id_+<_oW; zG)*wFlI7M)->jU9xP<%&3L~{V*YrP#L@|~f>!3*7@>5tT2V}*hdw06{#G0>7>FU#d8vlX3f`)E+R{w8NYV3;6upA z(~oE_lcP0T>a=UOba1sLZ(>8H7~O53TkvM(LpIANLeRW!$vkeZs3C&_NIYnpfr5#K z(j*9wMeJVhYyX!ZnUW+hRxfhoM9`~Rf!<~rs@dha0?V}#l{d9n_WF}`0DlZ}xYt}z zcylU3EkW4DXxup4^{`fz5DCdjx#hwB((roYcKMv?GmhmTXSHyk%cFG7zTK;+7q3GP zGJMXq)$Ar{GU+lDY}W$30`Yb^EnhhnzmmksAue;Gubs|-5JN$#HF363AE$Aa#G$b*oOVhq<^- z&B`Y-b(x4!4T?zC2s3J*^4$_lod!^hSa%r36V-C_E6VK?Ji(^zi@HW#kl{BuE4%gPV;*qfuI&&Qcn*{meO!A1Jqg6rZ$ zU5CChm+oDF<_@j%Lh;E=Vm@biad%OLNwcArKymY62UJN%PGOt&t;kMw*#rmCiJuEz zbkj2`ZZ-q0agXh@LaWBZNn7hDu>}l1L*ZyL!i?%@#bUd`ebDQ}N_NYOZP&8}FaO0t zPbvu&nwEwGt)&b#7({7+;?(S6OSHpsu!x`QCM*Su&ZivMGR8TD?6789A2+*ci?)^g ziNJ?`rDEL#B6dfyS^MOvj%@`}Dny$nLw;C{jRx22$$=2Qvj!x~!pS2u%33q@&n7@0 zrPAJ24$bOdDiFu=rk9%ST>t?Rol<5LS&NJB>PLdV8Pz7__Lvm3*8G78EXYK3yl_DQ zGToesaJ?%Gg$R_C&zx%>PFwX!bjxon4@vTE4{NF4aZ~l9|Bz!krZZ45rsmXgk>Z*P z6W98fd{=)<6ob=X%3;A1)5lUD2@%KUmE7yBN5Q6d?l6#v3ci+=TNdk~;N(?&fi9kF z`jG^3!8BE_S>&7DQm~RoH7gNjLv~rk=bL&`)#h{j9b+tn)|lVdn`Me0gURzEV)+G~ z1Q!U76!&JGI!0-=2+VUe19sw#OXV^o2M+5>-?8BL0`LNZ4`@-(F$tTHDQ0nVahSpw zFHG%J4A{>dw0mS|Q~f`pj#|t-AJb7OsijpI_kiK@I@^EPy+iZW;{%!L%A&aG3mS*= z6#q6>==GJ)#_6SOcT$V1%6y5%MrJyB0Gp#U#!FWm&zul#8*R@V1=o7#%q5mxm_9)h zOe$Fz-B`K4kn~p)_&?^LNBB;peh(zs=7nVPBM8dfE1~;*3j4R1rGr=t9hJw2247gq zy4dFp48!E$B>Okj9`#O;f3DV0~ZIeHIP8vQenF?ik^*&BEepB zt8VWSpNDrX&PpucZo{gK;Fzjie3M+BjTjkRthC2uo;>Ne!kBKYq!RL5C@Vcv$%u;m zZU~KBt4gvE<~0nqyHm++f7qj4D4gq8(S#0p$60F$-~q4XC=N04$SMoV;kFJLYMgqP z<2B8F!8Qls`iiqqp$75}Iu-T+S_DW8bIV(*)22@@r!#DCaHa%rcnd~pdM~Li5+oN$JX*xFOg&Vr;5lwbCO`b#Zm`PINH>-^j*##(? zBwjA|_~C*Fhbz@(gxk&8I2ac!rMvf>A(&oaAaJB!e8?GVyKca%*1Uh7iQ(?woTr(o zf`~I>vs`F8*L10~nuCJ+A&11KN>?@Z0qCXW&=Gi_6iyz6M2N9Hho*?|qAsBBu*pSH z_Lk+8BQ+{k5Uejnd5!@Att}|SSfOeJRDw`>mR5cY$T`1lTa|22%ZB*j_b-|V9h_+j z)8F-HT24d)aIr5{BUlSvmEZh5=JmhBXuNfk8X|_O?|}tbphP3k0z2+0lD}%$%fr>4 zt`@V7MB`vQn)WC#xQXrB%GNV!gc;EAUT27vA@5RXAD-n|%j+Udfq>Z7LxP)q0#>tpbn2ReP8xrk zkx+sx*yGu&Z8K;WLGe%p-1RYo))s%ggO;3zZasDs!(!V@-7H z_WjMGOv)x&ozJ_}^RljWX>!;F^6Rgw3iDQs{nA)jBu?FT}; z35o$!T*7eI$U9v5Y8di%RJsFMzUk1I=nrnmf6U5ni_`A|fMg|$Q5r0(WCRG{ys+FH z^4)|IWabzH=~0zq%!>2J6K;3lI?2uVTQFmp`?#6a^F#viR|B|q+JAf3-vgW5=ex-P zkY}i~SiN-|N1|Y$f0_PPcdPZHlr25pHf93Af?ZgQibQwZlu(28sUw|>ihhDh;6g^C zx1f8J;mnic*MH>*{6QD^MuY$olFKEf&~zNBf?%i(PSEK1kMeCKKMe3N!Fzzj)869o z-tYe39M}IEhkoHZ4Qc-HPC}1Zk~Czr*;U;CIv;iUuvbi1UzXSa10B$Gu zjpUsMa-QsnUT=+|!J)qS|FM#{zxb^eJa^+sg<_USfk8yHHtxTSAxH>}S1~U9$q7OO z`R7pn$iIP?e_q#b2Dgde9@$Yl!bgzf74hwVd2avY?YB8y%LL*#kh4-V@&EHu{`%L> zTQCq(G)fD$OUz+!#=m`=3m8KQ(%Kg@_=dEF^q{+c9^l{J@#+iMC))OwMZ>Icv9vu8 zT)+T>5s&y|MQ`@Ye5X=7yYAAE&n4(F58+P z)?ZHXUpK^LAlPS@g{JEf&y8O=UaWKf%Y(J!z|Xc)P}0l@6m)dH?MM2zJt+*v(8Hc> zgN5oYf%i?C>|dVyYJLuURRy{<@~Z+-Pw%(?vcz}Xe85`BdgLBICK@l9jbqmQw=wX6 zF>JS0eOKl$Fj)VYeE2U94zd70i=Fr_#~P`DoQC-|-;4MkStG68vGwF5FF9?PR&iqU z!>Jjf37?~!X&7i=Fd#HGB~9g<_IEh%Bc2G8{Il7xW(P3*vqbmSbue>U-Ke$Qyl#qC zV^Jp0&R^Py$V;9{Z`5dee0qfIa>8WQRq-KH;|bSx@#^0FQHk)#|1l58WMJc}*Gb5L z4m3k=b!HwG=?@Sy+ib`l#_u|}8J7$Q+nD7KyZ~@?3ARzq^$E9DG&TovL)yM>0RGj4aS|Xcjm30TW zFzw;U-zu8Sss-UTt#+)*$2LHfqY2RH2M#F5|M8^Zy#rRaDg7HGCphO=hr_|OaW6l* zPiO`5XsTB1)?IdAU+xlc&1F$IH>~av(gd$N-ltQtn% zXpf)9P?c4p?J`iy>r@=90o1N{!JzCn26U*N;~49F2#zfGB_5wGTx>x6{g$&AoYonY z`>i-VK#4*to@4#n=Wa9CL!85*#A_B?f7E}NcNRV{@2iPRF@Db*(#Wx5>q0@W~L`F0WLjrT}HfYlNt0< z*=pp2{0gmENS@W-vYNkLx2v~V_P9f(Ln)&1VO)bDIV?E0TZH`lVyxbj6JS#%OF7mW zk09Y8$trZ<=nlJUp4)H(HFG z7*<||L5}zBMZCWZ`O*K}coG`2{J`XLyF5^F^i7bIb3T}x*wxz8S!Pfa$O7s`Y&q?3 zod-~)!@kD;SIhUCRsQC1`?THZQETl-5Y`q^9lE#Rb)FP__XW(*8dgDWknQGbjn9f6 zqkhkmLHm=+ifWKi`z;8XIe&H7$EKI)Qf9RiD#^>}h3}Yw&1x8C<=Ws5ubb=-vFx?@ ze{a-JudGnO$?SE=Jpa28DtUovw&zZ~#}Y<#H50md!dE6_3a%M}zEtxkj`l{ne)WP3H(~HP-BfOG|AF zhVt??WL)F3WmbpmEGQm~Wt+8c>W*dW(|4XbYh~*OV6#jy;S3P>Wy`NUiHYWMDm&kh zuaAih1v!%x!w1`R8kItd=H?i+fNo8-@aiy5;-Ugig1+80zDE z4@n_&upPVj^Y;Xx{LvsyA~vGBy#Ay#KN=))qK-$E8Mf3uOaWD0kQh;quHLPi!cL#| zdisKe5)-GZGHCxZP}htFLa&^)SM#5dx+Ck3$kyVX9p&8eHwzDo@*KcMHMBHqqh5pi zhwV8*ta0B%k6P8LhxPT@DcBNvS!TJ@*qbrrk8X1EVRFJ!#f4Ks6F;h82*!jPKkCp? zZpvnCr{)2U_cW(p+P2#EE>8sjsXpJ5LkmqyE1RBi!LiLbTWPd-7j2X;N^8KU%0frc z-z(a9Mc-2Bonc_RtJ`x%u^P#lA9PSWv_)pNP;uHS6uAZYoUbiy@g3K{&wu;;>~S-X z!Mjm)C`{uv00&-k#Si+bNEsX6-ENLVxOlr8!W+BgXo8je5yLj0dkvt+xz$xj>vyNc zyy~4!*0njPTme-!j#=%ooOvs@9_fMf)F?l3#mS`6XJD_=^2U5#Hh_mlB|>|ALw0^5 zlL*5(ZI{YxI>jW?ttN z%z&zYk3U~zrq9i^W1r7eZTjUNhErVWEfuW!932&BjjWH_2=;D65@ej>3fEoKC=CK& z4oHFO_6wf;E$si`zP>_5eyNBf4tVRn8lmwM2rVy6kd3nvG3n|Ih`3bz#EZAb^3@Bp zJ3?grl{Y^p@%zsuV1$ENI+nGe2`wFeGjj@ZSVT6p1AZsI7tT0JU&n}R1aa$kJp%}U z&D6IMI?WY&V}3LslAgz9JX8gt_KoF~GHU=DNP^h~fh}byb)@8ihah1(Z9OFMZbF~u zx^CyRgg<5$HgEtAkCsO6m8GWQk@I&L;Qyx6S|sE5`IbJnXx#&VC0Cp49GN573NAv2 zPw=@b)?MOOHAw&v;04#hpOmvR;f+d>hHdJ#8vH23PTo4t#5ty!S8?+NMIxUqLh#?w zo7>AFCh-paz?RtKOqRPUN#VL-kT#M)Zp|%s%gL>Gyhb(}Y474U;tr9Pi48%jy|+^J zARnD8Vk%yQz-9Pq4SKCtXk2MD+DW!nl&dWq+wd5|AunujAbf~xKkwG6gtIK!k=t)l zJ`=%5U#gXhV`-Y2v{N6_N!jXA(OIfQ)gROVK29Ht3VJY>!EE76`p++5()0bJ`a}pk&F4QR09?d`kh5#A>hMVPw0` z+uDRkr=7|+>&?+z?aLMI_uQD3?{dgl-Nj4Ho#mWa09f!6Xp>8FC>!N!-ZH)v{IDow z9^xx(7OOl-(8pY6GVh`*_e<#9PP7?SY<)af2_p$$Z@f+Iwkn~5o@cKouFm_Qz5f_q z{?&AUJ_2mV9{8aXqfia=b|SB3jLh5IZ7jHCu^7vDIxQ`pHeP|e1XbmuD_`}i#;fCe z=u_Y2vQhYm0pf3qI=6Y^nzKdU)~X1m(Z?+v>8@|1naD6?nmV+RN`ee$D$moc+E84! zPjt&?oWy*G}tiYNf8wTSN;Za8|)&X&G~Gc-dHB(7l-A15ldg-CDBe3gvp0 z6_hbZEfED6Zz>%ez{~*|8J>vzHYFY`I^1-LV>II=-@1=b(h&UtWeWq+P6Jm~5m1T# zw3vO0#od30VMfojYTg~O8@vrRt$7Gqqx&gPX*jcpeg!NHJ)c>vIt^671iyw|;%s8{ zTmeAej(*m+IXF3hv$KP|;a#6{rfmLNYLG^9<$FJjmbCK*B-bF{rlr$?D&+1JsRGBD zB`HQJi||{t|6E9#fGq^{h!8t%+I2nUq8OF7mpCooDOA6?7>oAZKLF{W+e{bpmZ7Op zuBqnY4oH6|RueS(<<}heNKLFe3GH%w$N%Hjk9#%h_to4xq7?hQgs(y{+f{8Dzm0yD z!_;hRlWZLbF*aZ^LCzdB=&&tKZP3<|WF0}8UGta#*iY}{e5F!qOac*?uh$(gS=J8v z1kU4;Mlz)m=;HUfOVL7;r1KI6Hp|qI-I$#ytpKVIqy@g29OYV;JZTPe6eC?^F{;CX z{`FBfOh!M^yBKs+Rg!)t97QW4lNa#w6F+Ft-d{@%Gh&z{Q&Lddx82gT)#UPdin5AW zPT(TT&HJ7w5p#|#<|5@JDHAm5DdhFqcWiXFRK^StQJ!%cNfEa2UJaC@NA`Mxjbg=! zQ8Z9p+F!dcHlo%hXKuIpE{`H~a6&IJzAyc>Gz4m<^pQG~a_t|YP<uNsr$x%QIMq3}wH9cgpa7Tg~+RFssnA|-wpOWC4e13hkmKDyjw zm{g8bSV(Qotq^X@bAkUN8B2{|s?N}`dNd>%=$|@#uWa$t*%AZUxQgrfN+FY3-MOxm zwog5>Nt==-dQT$h_?sLm@*fJm_~}ne*-R!&lD3Br9rodGX`ig4k-$$F{dss>4c2AV zf-cYQkhAiRR+59_#fJifHhtA`crQHLs3uZJGsVs9q*GA^NhjlnPhTt_$=u6NL_?*Y zgtiz;7t!B|KkWP;ev!5*{2jzt<5_C}*!Fb+PjsI4$4_4aoXeC8pBq(y5YLvqg(mUQ zT?SgCk1thNXcgIs1Zn{%s5wFm()ziH-N21SNhCzWs_7}4VDYeXy_&m!-E1KJ)edkn zGB45Mb2egMPlb^$!3=e;kPOVyx7Rc&XuHH-bQ$Ytpha@-em2w{@3z zbZS$CM`W=oq{Yqj5Jp&AHt4&G6pEoipw4=VGJsO+0(j#z|c~5 z?5Z~S2;xc*67}YlUjRZwnhA9zgF1d3^!of+A|;Jtg|)U%6{k!+P)A+0Zfni6xZnj* z#FY(fRk$q)25L^%@^5j*zklIhjB}PiR(>t4r5up6<>fQwl?u(1Oxi~jCrf~%#iavs z$3Q8GR$b&V1c~pefH?pdJqA*bC&#Q;ptcCx86>?58Re{!fZD+=6Vt-z35XL-vrHpM z#(&FQi7d)ZE?3`B>qg6DY9yaOTa%p9beE`2#Dt42u@gQ%N8=OiGqT<(g#xchR^0)e z6%>z*{geUaxbc(PtXL=Kz&EqZ>*!>x!7#<7Q(9hL_#1}wE3mpvcspAuMIsZ8%X*F6 zgs35!w=7!74#r^IZ}Q|Z31naVIy`c9QeJP<30mB++9>jAfiH5M_5$@OpxhDlECO39 zU~$)bSDIaqG@0hlw*_w#9unC&!XHC` z7Z*8H|Hmg?S(kMM(89ykDnP%R+f+s+LGtd1Cn6^2n023sOo%v(B3kf2*%s4V0Enla z6$j5)dt0hcPy_2OqHmS>KSN%B6Ya};3j4qrL|)|+0bYg-@p z;oG-41GQtId*TOq)fH}r|F69(4TpMd<0;M|B}pVX>O@&{oW?TKVeGOeDN43Mc492a zQiB|!l#V64Y8dM<<32|C1(U2v(y!Ui2*L&*B<^A}6Ilhb!Gynhd+|Tpe z&wc-X_hMR5@7toH6lOH}av3VdJXrqx2{|?Gy@kc@nFi>|b@cS#&%A>a{j5U_|UM;s0O{m~)GMTK&K zQGdE!)Tor91VgT7Zme5w->E4A+om6sW5Nez=9d%{%b*#g_V_6I&wkRm7B%jBG-~I_ zqe6s$j0LZNL3t5GmNX-Wl|!}&UTMcR)Otap@Cl+tb|BjHfXf{9{xR2WlseIXBIZul zAe~uRfMPK0d>9A4L~JdiayWwmcK`7ZP4li#;7FlXxV4i;mQGGSy?Jv&gP3*>MNn;K zfs(cE0=={wlYy#90yS(zfz+xUg5&uGowBkOC>pi#&UMuuXqhnb;N3Of7djYOe#yi@ zf)IP^$m5emr*|5rDa-S=NDO$_CV%2BI@nhdW&5t$x(8yCo(}1IhP=s1w)K53o}|15 zn<-IjA|6JySB5wbvx#9qa^Dx7GQ9%k8oQ6IfNB`6hiH-_L2t(*{9UE*Xfp^i_w=f|*G(5*peIZnkd zg(m}K=E6-I`By{H5J-Uo=b)lW$JOezeaS#e9-TZ8y0p`scD)qae_?oMQzOSeR3kV6 zQGhW_H#wfw#o3yPSXT~D3XZ#q*ib6U;;Z+{?n=~$9CjXu8`~KJ3f)#_`4*J1mr!4- z^^Q)Qk41DZ}r2|X)_wQ%}#}5^=+n?>n2v24j_H%NhCK0^M{4u|AHzyF*D(5Zu?3SKio^QzA8H< z>Fq~=+~sZ57f|it;fYdQcj{T5ROh$)=dc#Sfjx#=4L!MF?5sGVARLZ2s&x_0|RmskN5k+C0 z3!9)(OBq6DaU%^}&GZ#$q z<&bV&GQ$_R21LrP8tD71+y^K@*>NWACJW`^ycLv3k$j8!bv_E-HRAFk0h6m?J^;k* zEVSZIf`U9PvNEFJs&h<73OX=&4{=^O!=)XG^Jco;rOOon8d;px?gb*ysW~kra|hS< zd-k-3m89Basb=t!?OabnK8j~G<38QWHM^pfh07hX6AR8$q1**-Ew&D zONt}yzpOQf5mh3}?k*r>3JH z8<<(7jYq&>d{&bd@lSpwYXKGqF_6~fsKu#RPPt9aE9R(yMpZw+@#Jz~WK)q0=?1bK z546Ipa@GaVNJ#q5;>FpILcc*yJyKmGC&FG;%<`0THX=^^`m=+T#|;(}i2R52U8SWn z?*>ENg+N;A9`DC&#wv5K18iu^Rm!2ufw{380|fQo{#i|E$9Xebxmv1z$Vd|YIa=N) z+@Gc`NbS4q5_~!qd;6?COEk%I;;xK#JQ^na(ww;gSG5jsOOpS%-A;! zke=aZsUU6XK!_RM82z*A@Nw=|2DG`KhFec^nBYB~;r)cG*|%`XY=X$aE$~1{_`SsQ zxEvWFaeIA47l{y1o6$K!+I6j3{feFv3yLd`4K9z}YVMIzfJQ1cKD;=0P4>k?3^wwb zWA-sA$zOt@Q${xG>GV~j9POtFy(gv?#cf547BZb@h$$#P*PIPz&4Gw3%oJ?;FZSJ| z;`F@iyMbDRvAP%9AzmcvDpf$T6EA>=z!*OFj;J6NP-s-A2lEQld#}#di}+6L;u7}J zq>tz&#@x%`Uag8~hK|UH#numK7EqfbuNqNu(@E)b+C&25<3US_`53=1rG~I2 zHlvkmY;0yMG+M!JNDPX92@MO0r?;p;eTYWuqdTi1C=QXVa?#(_$*vC4BwaPT)M=Hn z_tDS|@lS{Z^PkGy?%r`trgXWC+OxSN9Y6*MD+|t&+Kiv&ckhS}`VB_Tk*n0n5nT^a zW|lN%LxR+cV|b<&)pB~?P|QQz;^CLYF`-eFvn+UsEEU+1>G=$A$NuxpqP5LwTamfP2(33&jTdIyTe?}iZYWRGfONf>dSI0 z6m($3^G&}7WG-uZT=e~_XKDT2+5K6=o{)Lymr*%F$_Y3I@m9C>^IXwYOW%luvKTJdj$hZEDuAo`;weK%4so&9s*EB!C$@? z3I}%6_f9&23OTG88utpIw1R@ZMChP?-S=}#%HjGE6Bj^o5KNTdWkv0Z2dO`3Y_NG! z6yq+#h0zv047WGQ`;EplRW4M%-V5So6}uD?UO{-fQLb@%zJ`L^_-@k6eWF8S%FDWA z$##OFhr+BH(=AC(DNKOdxtj8W@X;)#*~XQ=n(i`@&T`TrvYNSsv8g5_Vu#-5r(GPg#FS!t?`GeG+j}lm156Q zssI!0Rv0TJ882aRCs`=whCOf~n~d}nk3d=amlv{6#pym4boZw_$hLo8ay!U#*LT=> z2$!Im5Ez%hE1{*9(^Np}60;7SEH`P|WOiz}WFP&#DUpSPw1FMPq;I24)G=6~IOK<- zt(`J2$F^OY<-|A%jJD;uQJ{hIb&WawXn1_QzZ@GB`w4l$gH zTag}ER5+M$zbZ=_bwTXbfz)GHSiD}X5l*j53Zd9D3(UO9I|z1-jlTWXm{4p}Et5%= zeRMxjXf;WW|K(F{&Utp@8rw>tB`k_Nwei|&A<`LbkDuRy{4SIBuhEF8!)W&BDcPpN zXp~*B-^E^kb3N?70wQ>7XkPEnPr+jr+EFaj%o?SJP=b{h${4sE$3ww8Nf0>KVbS;U zg15Fq^GUQAT&sE~l)sA!`_{k9+X@fv@pfN44GwweRiVA>32zYs%B1WXc27a^AgtRu3?|o$uNh=?d^|ilUAS#A4`n-j}w%+89{SH!t z%@6=eOj(%~jrQLOb};EIqw|Vhj^O<8|U6)WVs( zS!=Z0gy()bS?PRF_%{o?CWEgO-{q4)wzlh&&QdJ^`M;!Vx{lB;sd0hS#5bH@FoVxN zu61O#;qoGQi3HJJe7+C`PrxToSO|8F@>8n=VL7;KjPR_py72oVU6}jlp|tHRsQI;L z!A#@jVRS;Nyj3iY*53r7HpcX0A0p2^TW=n0oDQ)d`MLuUvtL1i2^jkG~yvNTTqoAPRDJsZlqM%?VqoAOQ zVPif}`f3<~shvi$@$5&0Vl68le1~RE$b!O7r zLETT6gDzIHeXK{9P1Q!>YaS=dq8<_`uYMTU3DM|cK9^2q$GNz%?(ZMuK1D}C!+wj2 z-~DA|gs5IhItNx9aHU4o_;s3W}-ylL67Hk_Z=?7 zU%<7ZA~by^Wf1pGUQX^M-S+0I>;hriII-$66_^_Hol916Vehb4tmz23kMURBBjNV^fE;9#OXjJ1fat zlI&s^?x?xx8v2fV;v3OsDD-Vz;mROZrw*aRH@QhyE5Q-ecgshqA5rdBTc;jam3F@> zDg2xQLlRFs)r!PSzd+bcmA}xw9wRThAK5ez-Z*bv*o*j*OZ6Jir|oREM}jW!{n37z zG79>mLU16;cQUqLv}@R+S{*73Dr&>lwd3S3&0J-~Dh!^8Qi%qj46Yq+dHE`Xe50Pi z4?G>kaZr3F=I8ZCJlXbmQA#gSo)4E;yj($fRd9niC(G4N=B3Q`Rn~ulrt|@m?*l#; zN=Y}-JSy`#X2%Ck>__y^(fUIpK459S!8E)hszs~BxXXL$h`A&wJdcb2fpMKe2=$pH zt`Gr7h{O8JJye2_CzoLvW)vM*g-;)C&_9-m;CpWJ9sApdqvtQTQ17IA-cpd@zIZeI z2|HPeHSg*zy*65!^nL#8J@P$1Puey#FUgzyceYRc(SsrhKR=l=bDF1Uip=D~#Sdj% z$8hE8pcsv~SXXtWG{&Kepjy8;Lm(s^oBW^g|2xF*Y;<|&zLHrJ7gu~ym5Dt z#b%AQWcqq+SX5!EgB(3O7Rq%|wO8}8^R$kDYjOOj!c7&|(H0bAHV)EeYQ6BK_=>*9 z-)*izErepUH6hL2?VHl4#(@G7bYNm22@roR{$vQq^y;Z6j`t&g6t$#`zWl2f+Qg$o zZ8+%R8U;KPANQ1=(4R+-d>rTx>$m=m_a5MuS|r6o-<9EN>h8i^7fhL%hyz_^=Yj? zDpFZf)mhhcXf^V`&VLOrvn(Si*RC+u@T-o|;mblsPYaQ#Ts6)TP~KWTFgIU3 zj9;3|Vl!@$a)no-Y)tz`le~<)Y_9yK3^;3Mduv~0=Qv?I?OPc=!8iA%v{l9nu66F`yEnMAJadny46D7~9JbAVY)WVXH|YnIUSmM$Y1$Gp)V_`iQrJHsW6aSQw6%G1Xt$5Cr+9UJ=yec(ki92=P%~9C1$2DFWA==R z(vjDemqK8g|BFRSZ|&e|2;sy>yVUm$ePw-nVRg}N4QH5}a+|v^4_;EI7^gf-kuM?9 zQlAC`c|V6whL08{j(+EFK1qC(7(~mX zF0Ni}Q@pFiiO$(IM_+@QPRW|)m3sAKY0&7m$q76J^5fmG^Oa;EEa-8dNRUntW6($t z=yw19#r@1J-n}T4^Tq|Q8}ku{BTmc6#LlUZ&XwVpj`5m~rX9a0SDShG`VHn2wdGck28^eL3&m z!JJ@{A?8vjk6YBG(FvowTd+%cQF-X!%3$85&DhHlHY1-d~mOAS{oYHAUMQW z%CNhcT=s%F<0~5}duP|rz=c68^w!{30Ot_fF1w3Se)D@s%xYR?+P$7+1(9B3m4JRu za~m)onZ@X!=rA>lXd1OP8E*4AESwYEwcD*4KD_TiMr8#K1S%p{@SLfx5g+d~ZY_4@ z?&C!TgIU+fjoBMm*w|s3{j6=!6o|SNAl^x7aoXTWyTgXpx!(37hdtLQA+;=ZEB(?b zr@qmg%EG9p$!Ce&39NbWw#^62F3K~ilC7oEu5@Gcmnb;3H1$T?S8p0Jx!CA77qtRg zSqbR4o<5#gHEOxJkl5%7xQE{eYCqFUr|qWsE_`}qHrm@g#N zGD37lb#!J7X9oCP;~T6`ZDAAHLxBnWGlsLrHHCAev{*yML#D9g(~%rvN#;d09`)H= z9+Ae1Ttm}w6n-`b3TG9&RQ>@0uN-`_mD!_NV`RllO_b54;p@?|92N;>k!&CDBje-N zBwe?|@w=^yAg9U=z}-hk=U7W?cxnXRd9=;C zuAKS9T@t`EJ|bQM%dTA$o>SY_9&<<4^((n6yDoRjZJya4_l9H3xz(acKF2HZVAl2_ z@C_^&3ZElzr;U>^zQDdOTdzCcoMbjse+?A8?^N4i5}i7n3V_?)PDKTEbY%c7;b+Bw z6UuFa{SU`)W<1(=*~5av1WkVeCy<&jch6Ty^)!G_Cr^;q0cQ=knqcV34LH4nHbCoA zcN4PVgMYFpCncZTG3E<^=C2nH4l#m0gG40cfwUAR=NQQ1ql$&O9T&+p+IXwD_~=%m zV;R;DdHBpPP)~QbP*U|#$^<76<_JrGxcT^&VE3aCWPghIO}H@X+gSWfC&G5p51VCF zHIj`QbS}{h9Vm`2oHymGJ_YJ@g4ED~Z(|l;{HO06x&e;gqL9_czyven8B~}DjC`3I zvnlX#Cc(q%HQh>I(OOj%<@G}z8wCTE2nGEihx+hCL4AgT@mC%NMG2Ma-}9QNul|-n zLqUnMLwWSKjN!xc&-Llyen9{IL{E-H!FqTjdbq>$(Ed#tGdU0a-}0zp4?Gk}Eonu? zho_c>yOou*hpmgJun_nU0moIrzyk$^?8ToORZ)}a6a@us-cDQJQ(sj@#KOgi!`#y4 zy%mSAlj|QnC}O@M4_PNGPxI%#PL9qVBEI4be@Tcu*?t#!pZ65Kp z!^y+L{vg5b;pgmW?#u4%!T2vF|E5RA%EQ9l&ehY-#rgRkz2@&-ygbDj82%Xg_v>Hf zwDPt44@=G-e^=|Ff}DRioZK8-oc|rn)6V*Tfc@e83-(vN{$)<=k1~B$L;D0jzEATIy2LEA`ms{YU zCjY_t2l7uHL^Q2DTpYdr_)y2$&Qs!{r2ifHzoHEO117=E$M-krpVa?~(Eo1{|D^s` zgu1)kgCETQ6itHrZwvpV{VgxX`KRsw5exqcw7;kiktXq2jPu{4R^o92YR(o4${Q3# z8A)wl)FTtDJX+bt+-y05M`+>CuseN8r0fsofuD3!Vvx8md3OaX{7Va+;5k{!4jCTWYPcpD(PB36(*2D< z^KzqW(GMCS7Vas{EhGQ*L%;KSrAvk_g;C;eOI5&}ciENcd?X2aid#jUZ<5QtfwL3P zTG{J9jP?M*-1x+W#|!BIVWjdnI2(%ZYfo_hlH>A?G1QlCBrnFYHCOKjFsU{fSJB`M z{6;YfU7mr|jAM9djv;?Q%kJq;Y%F5WB+{D-il#@#eV>#a1B-KtC>5FMS(`;;?o%n5&3zS`s~twgXh)fG(IJBh8YJ=Gu4gNeTTxO`}B zAqeJVmlMe>H#`}8aK+SBJ559vRKF;`@;ufdyF*Fp#n(_Jhfhh&GY@SrcWqO};X*Du zQvdcZmSHo%_Kk>L-eHIZLTA9-8DoMFq?Hhm>QtMCB zhtGII{;j%nPx-w6vFi)NRJ%XA;p!{M=|4$r-}n27jtaZadZ^VhI>vT*Jm*Di$nty8 zUrA(;$}G-yklaKo35wHsQgH(&rJv^CNY7>DO-jk#2wS2Fa z3D}Eq4QDw=rCsyZG!!nx@0Z?pe6R2KM@Uz_A=i+P2>$FCt;A|m`&Kc->)r!n1~SG^&$#hokt|F$ z_r)xP^L3dsP+P{D?&E_G@>2>n-g3*fNnOEeXo1Ub9s-3wzobW59KobR(pElXni)xg zW+Fqyaw*+jCsUlpTQtT{jtl3^ZJ8`?P9UtI+ieup68lU8l>7rVcd090_?>_QxA-2fdz&tWmS;9 zOJQDDlb-8`t9`X@LzQx$1Bc77FT~*ky}AFLBz6)QlZlira}Z36!#n9FLd5I zHNqSDb6>K&$bK!mNM@UollpGSR1;%HcgfUf(=J)_TlxPZaRI6YQ%;?)6av*cX-{7N zFqYI7k72QC^(~0fw?myCe~|~X&@3`v;MO5jF5j0f)Q*_eI0W1KPCWZn?OFv%{93jI z%8H|sw+Bq9e0p~SsHXO2_d-@2&s0f00EX!173~2HnYMyfoC0iPRrhq|YzJlIrYlGV z^l{}CWSiSG+~rTh*2Fhm!9o5QEPZ^MV}LwDyb@~RvYdIBba6aZd`Sw@XfD}1?8r-h znA`SWQ82xkc-3@uTlh}$2Uq;`CIMeTPrrP|gM6nyj3rVx{NPOQC9zXcEl5hy0|qN> z^vW{C_j)QgAiIyN?kC$YlCS9}w^z9))$Q)Zj`~MGh1Z?6e=eQhH0E{rn~XWtd};u|#uw7j2O)DzttflX zwO@~6n>YbWq81UBPrfB3=gVAmJ0u&Ucs_ldW)oiB1elU`0{*Y6b7*~EUkLfwA`_33 zxjB^S+r=anEW>m5DTEJ~%=S*Dy4Y_4t(N_3RxpKtv-a&qF_>$m7XK}wGP~F-m}QNH zbj`cY#RIky68owv(?4OJb!{RmZMT&EXGBIGp4F_J0p~v_ZA4`Zov}3K6=Sgxs?Fbj z9&axe)I2yV{nLLRl12O)rHAQYM^N|g`7hCXmrm6`&C%em+3;WUXVxXjUtB&1>MK}9 zE^y|e#(UQ^NE2z`Bx5gjd^MQ#2^yuCjW zd9Uxs^&R#AE=Vr3Rg6M>RL1Q7fwb>t+D`p%Ux^TK^NMi(NPZ{4jnbWn$=Yyvkkjv(yFCYSNvJ>`e*+5+J;Bu~Q5`uFHq^GhX~@Tz$R*3-Y$`SAMzkvj z|FCBNn2*UZ)mJ%<2+%~lz+@xC92I=Ne6Q*B6yC-Qz!w69k?&SBqnTbpv+!v9wnKbuhEjl4C8Zz`7- zSlS5v>@c(3?sGD(oP&1Qvbzt|go3oUvBzmk%mb5At*%Tx7j==iqxEm}UArOFCqduko)-XLxkcDUYWMn z=fGE5^Jo=WXAvF1oDitq(hK$kU@vYv%M<2_lf))b6sP9=Y*Z-D+K?DREk{K5#@_!H z{qFu$BL2o9Nit?{qrV<&2j%YYj^MQhXUC4+KAY-yziq@^lr%c+AeuwtQNzq?z!gl;x2t-;aKmR1>eZ8P<*3* zQA1K(D03mfFGS_)m)Z7ew~Ht)WNv7L{*!1nbCA$opKHItP`FJb*sKuyW&0Ong!vw4 zZ)s%ZuI#!I3+G`l+N&3qN&l0Ee;DgXpb+IbayuUvVy^FzHapnB2{ENs6)+55IV}xS zSJJ28QpqK;$ldF*VP4}ATY}%4`ZG}j7dWp33|QYWYzA1`1mE50JDMyiiJ0|Hbza^8 zt{gVDCu%6Yzk~Y>jUtI}B*@O@2d=o_OuEr(WW)cfn*O7l|H&z{T!BYrwY$Sur3iUc zI(kN~F@qhv(@0zO(gN``Hxv&R`dG^z>r2_Ojb)$pEu%=AcGKa62{u7o5l3N`L9vM- zEVV8x-=_PtBZ^<{^?7~iDer$0ul%>7aBSE{QS`y#71)Tax_S^rV58q;qj@}V_k(YP#&S{?*SO+N0^l2F#O#j`-~^CFWtS<-czVZ{Ug*YjKG^f(s9LsSY6Q)>9v_*x2&W>bfX)2YscdMH_7BonU4S9i@gzk+-GFM%VcjyJ3e z+*#Y!l2Po;1D~1OPP&JipNx5flW7VKoXI@r{}z1$6oPD|=9eRf4^461*`%Y|=54== zY^XP2Rpi8&V1HfK7TfV$5gb3V{}ZYIQ=Bz?rxEt{yoIq~z2Ndz96IsyoVUwy8mWEP z57+KR{}cHE)fE%J|7rMtQO5r)N+aMcGk>@xUHRkmZ9230)1QMC`p-v^fnB?J!xOD1 zLfJFOQ*Opy+P#sW;b_}d^JKS;?|UvSXgldx8}HaB)mlioV$|l~kF=D&GZ>7Uk0^5Q zL?4T~p0oGWuhdu$*`{Y>-1N1a9T?TTxZ`&Yq+hKN{&J5~hsE~5zgf11a+XqgwmSat z^S={$a{gaM+y5dk|GyGFS-1gz^r~f5iwWp(RJj|`Q^OzO=+MqabQlZ#=_>O7+1LNK zq4WQrD1li=5=p63?p|=ec5bP`&)F5!vH@RagWH6Zc5a~m_DOI5FmaOIRL?d!O`M>u zZ#|LQ)$^cTaW!dN%qb38HNOBg#Bm8gea)}erRy@qbv_eGEEiAZ^jd}=c6*-Ednf;e zkSr7U!O}CcEj#!t@AGsu(K4h#h{ReqA>Hq^LA;?y81l;>9+Gg{IF0()Ne^8`-X3_qONq^=WXb%}*$>v4d-$ z31BsLBKXYn8?XBj{B0d5C2dt1lI}vr(Y`lno{6d)X@&V-iqypVu|nPa5DUNuQ86PE zu-)6s2b&-dP_T)$@URfc8L9e6^xizYv!=kn-|vplS2qRZ81w}SO4}csaydR-f^$p2 zx0lSP!zU&%4V?l-zEOaF(}dgKrWhkr>h6J$X&HtGxe;&8k5WAJmVic1sf%=%)^I{T zSt~0z!TobD*0wy*POKkV-N%%qaEZ887 zq+ngUBOk7K478hzf(ak~2H3}1%s=u7 zh1q47hu1}&r%trj1|n=qX-EWSbndRY*WyNw#{FHUEF!wpKD(k>zVh%0h1=0~3rjW> zD^kcW7aUy6tN!(+EO3mn6MlWNVqhQ@`|B72?2XdL3ZOeQv+aAQcM^1)>*X@L-Fj>H zq%mAr8o}qQgf5`>Q936+z@XSh^3B}&6u!03J&5=atj?oNaQj3f{g=H3rlF5OPyKz= z0i^r}WtHDGxwbeZmvBQ0HUxS$Eb^R&j*@iG5S+Wxawzw6s! zmCd7zAY~T;8J!7hrwpE;Ha>c*)Wg*kTV%h>=#`68WV>ZfmvqtV?BUCt`b=qnfGAN4 zy?_fa5Id+xJR?d`>-U6uS^F=&J5PP9Xwp(JBHu9y@+c_G67p91)yx3mq>G&PF+s=W znzmRzDhI7o|H}FBL>|0^@Ctm8T(K@xi{AH=)k$dOlGqtTlYOif#-~n;p%}N!uC$`h zcA(()61_Ki`{Z4XaAI;^v(CT&J9zrf5u-Q<@NPDu_IF5bbb*d@pB~CSR@VpPdjChgt z%OdO74E|+n1oOwAC8WE>wO9pqi%5q0D)_|ZvkAeG%J(k|%hmT^2i4hAzYG}=-IvcF zC`75kVSXmtdYo5dgtlH1_!4l&D@DW2Wix_wI|P@|K_C|2kcLQ)TEt99X5hg9g&t_o zIe!1(YJRw9;8f)p2#CHO+RWp;9kUw9qG|vyyrzoM$zAVa#3z**&{qU$VM&LDQGgAU;TzPe}c6+I*FFCrEDZWo&;MjT^ z8+-;o=bZMdG=T+b}Y z?dwNk2QQ!_v55iDrxd>RkBmOK?V%AJrx@PMgUG5EFfDn{C3f^jUGCalsL zLdhZ<{2(Q!@;B9m*Ec=##C;$asAw7|v+oy-mLJI!CI2@c@1tc-aM-eMalQJ>fbF*|i81;aZ3iD(ETA#&T!J=UtoJ>4*9lR6syP z0l87TGI#BT2=e_ggso|Z(<5p3sgTLCnvvtqmn!{6Ez>oCsa(oy7cWd&zNVBacVwdN z(OCB{=6S>esA{rUraWi@5o^{JwaH+x`3*;N5&?}@S%Ii?y)_N3t zSrgc&3IAfGqTyoF2w1J432$;(6HGZP9BU~?_DU~2eH}Y-1LSOk=iUFGI(+jC-uF26xqtMnYzCt zJz)zZ1rxWKlp^cak%$p*K)}R_MVlw7bZXHQ$)~_peLr-YdGc~k^xif}jcQXjLWiiv z=EuO+?PV@^v4l2Mrn=SJe)f&SC0Yv1Yr5}?s@oBQNvfzX)H#FtaPHh6ZK+bWJYR=V zRTgvehrM3M*dp)yy=~%r<3vbM>-af3FJEdBYEl0%*TA>ZMXEGjKa6ukiGc7U8ASf$=2`8pY$4?hhnged=x^EH7rx|&_=8>Ak zo_U!^c9{FbIZHKDULbg45*rjKHKqdHI!T#Ej;aRCU$37BiV75Cz3aXWCnowle5RK+ z)prF5*awM(I2Waqfh>EHi`?sUr*q+B@6N-PY*`K7Fnlf|J+t8CVICRVw6C}jp9_WR zEdzQi`M}%oCnl>%12ibuI3!#TlLNa2p>TNWgrAUE&hV%_pfPE0r1N?7&mQQUk-`K8 z1Yg6x%vgo88Zg&>e+3hK7JDqqGef`d>s2#AlBr$^^#$|olX#2rtHf)(&X$$dhYh2K ztVP6YIB@BTfXc;A=2p>(C67$68Bm_@&Ryl{g4D`EQVuWZBKa68w7U?4tqRFlsB<7D zRqG5iCAHI-y8+G4j+=mEU@{aep{-cWr205^mMuP0sqnpta`i}MhdS8`vjXVd!@@Be zLaEk;@H`@Hc$~v$<=%3-%G%c~aj#>(uLwQJWROlqAy3gLvT=a6JJ(t~>~&cR-6zCW z61h>&CvqZngicPU`g$)oNif2@J<4G3!khulKF3DE9(S?s+~JMT<0j-XBHhGup?2k& zQ7C3Rt*&xStuIpcVXof3WTCUoO13{1vf9pA|1|t6@2l5F@(&ZeIA** zReH(W2-kYQNJ6^ytjWmXuol*BRfS;39ST;(KIyno^MybJ`;>2Ai4I&)3J(Nt%?$OH z3nIk>J))$OLc$FU5JF7Z4TBup)%SGvGFhL8ugS{?@smpUc_F~&D*#nwJSFXD>miXM zfK)F*eV5kF5SmLT%m?9mL_`06MpIQxkr`Fjx9{`$i z0z$@pMB04lQ702d!_?-2Mk22UA1!cm=nlPW3%5@%2eLPYx-==QB3&&qm%l6{-*mUZ zCupt8hu^T1O&vhhAq%8@%uUD+y{xGN;Ayv2Z<9kH<_tMI4Qb15Xl%L2!=_Qg?;VGk**fKixz;R;Xp zeq6;8nGYkMnUFlOZD?Xy@*I)(+Iqc+w-YStWbq4rqt{j6T$FUvB7lu+4u^QSO@mFzq4#I>xz8XX zYxsmFZq4BIvv570aX=nIkCu-K=D3Dr|5>G4whKvwy8AiJ8I8(}O_heK4hfqOkYDPM zSE38`F#d#QDFu)3>10KD?gVyi}ygmVGrhBnucOD1ULIk`B}@ zG|fe7vp=tIJgx=gm(JoXR8|ACk#apj2zpTH$9v(gNS&)x4$u*_G{=xLr0uu}ZZsFE z`7BQPM_kfz9gs#@t?86kRF*>Qn|SO@ze`%waX#PzLgyu!x&8_j=;<*D8)EuVW6}&3 zZbsyj>-d+Xv>_bsqk2la%mg6F2K=Tmg7ZkazRappgqUS}5$zo3<_Nnrkk3_Rkl z$XsU7~s2g#tY65e_1JbY*_gf1Wh#E{hjY^;ekMlgIl_q_XCQ1@^ zjz!hy@2A?M>YYV7cN)WQn1d;*yEC`3Tv|;rO$TjSMn1;s@9t|o{_Rf@Yv3d1LC_l* zRHG*pxRh_6+q#o!cgee-r4r1GjlC#*XViNZ5Ga_EuQ7gBvUnf|omh>DvFq+;Qv%_x z{HF5X0Em1p%2zuCUMHEh-}&AQT%*)vkU=jFvb?sKGrXrh#+cERU)YRz&0SrC6z4Xt z$52P8{RYo;K5n^$mXlS!rsk>)vj7L*4bVm8+fY-k-k)|d0es$y0nWE;ufJ7{O`eZ5 zFyTEagehWG-$|{@osV#IQv7)4DaG(p)^WBP$eqmrGP~0-A38bf)X(sO2NZsKd9-e= zkMsVTQ@k}lyXkSPjX&XoUp+3y3Xn5-%-e%q10>X1D(x&dF~_uU^2^5gXAb%;#N0ML z_c;CS@xdH=lBX#OU=d_A=i8R^;>)6Z^*jVifZ?k*{m0F*v_oveGdeeboI{|BgSFmp zTcrz2fkt_~-o1K|c4}W@lLszKU`EAL{d|VSeAtof0^{L#%LrTGsyt)9V+kQBfL9IN zy_HYf1pLIZf|NnUi|hL#BKupKWz!cCj4N=dq;|o%J7(I z@->Tlk{_j`$_f@ia!WlzI*@D1wjomav~CnGu)_LtrWus~$WeWQc@@hPQ6qt^-dCV) z+D(Nv(vPJ$>ZU#^xF47NwNl?Hm*sp6|B`uQbKWHp$lL)(w2arNuhous;I0ck|2b7- zYECm{4%DsbAcO9zdUP1+zK$PTN5Qn&c<3N~0}hg=K2il+)E`%;P6NgNDr?=Iv%8$9|}XzlaO;K6s{#WnX>cE-DJ98Fr6 z7tNi^p=H21)%t7j^an}v5gh^iISK#ReYPLS<&Wf-&!d0)$RZL?xwo26<-Uua7z7wT zh1hM}kx7aFicsRNVoJp(VWIUtu3E)jiVJ?7{YLAD=QPj*N~fAjV)cx8M~a4B=tOFd z5n7m-2bp*{Oo^#*>#f-4p91#OWpLlE!Cj>&gpaFECsGy7PZ^Y>5aWz)vaG6}Y+M$X zYoOa;ii@6Gu8lAsS&MP0u<>+q86kJ(%a&<3+XL zSqM1m<_`0PUF#Ktj8v-8=6+sIaaue#Y5rx5*e|Z(z6pwJCFa`s%_1_i9D>V6bU0y` z^8SeVt&KK~iO)Fm&T$#=e6vxxnt5|?--iqN?51l0{U_@63f=WMD35U7b0Oz)Z6F#0 zmVUq#XE5^nHs!bpd;pWb0Hl;L0acP4Ng8*b9SGl*Yt%p6?Cy0I7gq;GDz|UpSvwoZ zEmRY02o`dm)OWpKt<^`$K5lm%c;QqM{wiZZMIM5b{@EjBN*~|Vc^|$_Zi0V<)`<)G zNZL1(b1ffN;<35ZyHbI?k?<#g*h^6))@4km>)X1~NINg)xIqO3{aNEA?`JxwFH%vn zPTZU=MGDv0;RH~zAobXvOJ>$F**(xih5o8$aCeoyhT?LqBHLsohiE#u zeFwRnb@_P$B;u5{I@uJ^_(32%pb>*?wlnKY(MxV5;R2Y#@`Lg0$=s1O@}1y{IS}>< zY8ywsDd9^HG!8q6-2r7YFRK9I?TB)_NM_ZX@YZwRhJ`xw)!>WX$3}g z%Wa8;1^W69FDFam6DRb)BRX94gX?4T6Zoa`V8mk{d$XC4&`g^haVc}ZoHcYGg zc7#$5Lp7rnVH4hEaT0^5xH2sUSS@N#kL{g~w(B!@w@owPKIztPG22_2T-wU)fu4K} z?istB1K8=aXGgx8vc1G}v8YNs+(GAde)8Gnjo~hDR`svYu+e$bzB{@hy1e~z=v<%` z+HC2(b>nKRSHE9f!pBDH%~m!r6OnXIGhpb=9f{mT?jG>5Q}b`(A(?rallVM>w5H^mRfMFjSS zB&C{Peh(>w2%Ll6e$n-A*`+`*iC|T&Kka?HZ|=TZ>~8I%b%UHmh=tx;M1ZfdjMmwv z*;R%CTx%W#NVy3ye)At_E^M+ujI7sRl9y|v=IjaB}J zG5!=w1wb`FYriVdg@X8f?F{Cs|tsKfyi)G z-BqrmZ==_~*cMkZYE%bw)GNqI=?yx9wMVmgs-c892tXE(#sEb=LLUJ_b}FtBp7YIt z>&z|zV8p0-A?a-6H$|&o`^2u(x6OSz1SV973mCe0C3PA(q(HFitO-^y5}uZ>Pw)8n zekr)Bs-I5si$q@>soT@*;K(br6>Q98E{?7*!keoWkBr}U6GeB8Ko5*uu%%@fYx0I( zjeT&!QwN^~woqMpB5`fiZ-bxF$$dwZX~Wv#RkgS7Wu@`G9EVO(I5%e2nY`ZNV~?EH z5Sqf{)-x}dL%g_+fA#}ywgj!?2%A6;ErrP=jxh4Xj*h_(^sDk}|(e+KwvJ4}xp_kR>@a@@Y)!{S(1n#w;I4yMt#|>bP2^?s>eYD`!=e4?Bj^XV;5J09`A$*!7}T66Th% z>)Gjc6~RZ_ERs80ytb?LKh+Mmhcc zL#7Bdh*KUaQ%;lp!9wFCgQP#g<5Kyg{iWE4U%u`Ox9wts31jcyHJp?LMEW%(l^tH* znIR6aYVdBvZl14p4c->XS%hBqphLI0b~%6bbj#3l3TL_9sd5<0&XNjkLXn({Q}Kyw z)$wsIUAzT+Nai(CT@&1@rM6_YYM|Q%kb-G#R4=8;6r)zs9L~L# zpT*FR&pPSVffeIqf)`MMXA$C_@xh5dktx)JRNK2PZfC&i!HKS$NP?H0E?2}}_3MGS zdCpC^_bzQd`XmH4UXdZ%O7M(N#a~&sa=7oJYwNGZu!fmUfpVW?urSnsK7kc}?3I+h z#!u4qWS=sIx=w0$W(mPF!i+DSN!p}9+0S6BaN#(rJE**i zShpcQm8R}Hv>W~w&gEc8Rn{nw$otba!>J-tY+$FBs71#i^^mvdVFG{29xxYrCq&YZ2|z`Ro4m5rM4WQO6}DmCtA=i*CN;A7~b5_Phi z2HmH@yBL_@0g!I+Cc{ttVp3swYF+f#l&kuu*W{sBy=%P}1lUw;VDI_&GpfCV!Ro|m zI^&E?J1@|0(X>qpaahJ)5>qEedQ4tdRWa_w8o2L^a zvxP$@d-8FP!ckr%>rx9FT$ERPEW1PvvyS;vPlg+?$nASf`Y!Krwgm-%2P1 zKOF|-WSjJ;oGjl+|W!0X+R z(TSljCV4{KmoLScZMe=!#a~O1j-}>X%Hux8`FIN=fV5|9YImL3Ep-rwAnKS1`DXhCSMI=AtM^ZjeJ|MR)&~( zZYpClI0)S6)H6G8bPx(`mp&?)nRyr~M)p~M;!;u23{Tz0*go-AL+BfpUG6M}A)l%- z&}Y7DIUh`Pc*GFF*^Ko%;+HIhO1R@Otiuj0Lqf6gv`@gksD&<3)mf+431WS(c%p&bb-6|D%?9 z@rrPXE+&WAquf58(HDOL z$9ABWo|eg~3?-zjT*%>rUSAfk9-GXD@OegN=3yQ4PG@aV5Zvw(x~CqK~_OEg6`_H*W#O3PQcTkk`!y(Y|v>ZB(Ij}@LMB?+byM|^MS z?LOmJy>8h*TY4&`w3P|h1+8}Wx{<@5K&dUR|k1QS>!`}|&A8HP_ZsJ=PDA=kLQvks25!L>_1y~e(b zgI^B8Dj*ltFMjuTwuyQuLrhlyOKmSS;j-~^ed^-XcLniuGRABF6j(g_Zo!DN% zff&s6|30r0Og}tGHv>q8_EU|8TW~-XDPnUzCevM=T&ojP@;j#nCw9PmZ->bf!XQrA zEd>eM6(wSfJ!1Xro%~|Fushe^X<&kyJOZ=UEo>4R^R<3yBMGinGy<)gp|GUBW~#?x zN87*nzanwy5(xAFp5p6Y%&?_vaV)E><`ga!wK}llryOU{mU6~cO0^AX=$Ha21wTLR zWhZ^S0q%Y1$#@}9z-c1m9RvG`&_G-oJ$#$*WLs2+w0#jk#LJs{5e{}yO(X;-c&r<+ z23`opBR>NtNpErQM2l*Y2a1yr#Ln`phTG7Z10*FI0(SXzEiz-xU!0!vHVn27YWTCS z&(V7F`sW5Rq7|0AXG$Q)=o*k$w4*)CsPHT?iUS#ZK067s!DADZyPsE(dY7>+58u83T1-&J6Ajra2G0~|>?F-6c3xZh;!%lWD=igm z3M$6psg2hb#&gAGzk6~~;R3eHKH#Z3W1PNz%F>+p6CqRH;%N{}0{IH}fZfi35hT^U z(oPkO7vCdpfHiT!;$PejTU(OAEMHpY>O#Dhl3>-QT`PBbaq85Ecj@h44waH-xhOYN z#*j6@BWv+#5$|S~2tPMVe@!~HYWJ!7{NFn8sLePf4=6_HXQCvMyQv!BsJvR&2J-T> z$`+~H{F@~KEYJjIpd4$1gx2B-tOWsYkcuuhxJ^&x=|`_P-T+dMLEX)DYQY9$9JRlY z?}Bk}>z;Z|067Q(+?^X%@>_tvm+2on7Hc+4ou^PSezt!um&rIs17*gaDH7XsmVU;QoNPO0gw1Z^HZ znTkC=O#`x&TM)W11D=YM1-{z2l#Pewueh^yJh}2p8|>}uoog1I-~r8XQKTq2K!OCA@jW-Bd9I05Fsn{ z&K;V1hIAGd{Sq)&++vfvSb{W14#jU~Ec;-1x*7@Df$6ZEC#eK5Z!X-ceA|z5Y9Icc zI`r8`*6KdCdw!3H67-`5Zs+~G5H5;^2N5%kNgJ&5?`_`(`0 z+w+B?;N*SbZ@d=fpNGKsV!ffjVjrPvqUjX1AUg+OV42lTI5G|5C+-K&&NTc*c4aiK zZb843NVh?6tY+GVIT!f7Jb-_>X61vH@^R1LoA`)*yaZd(1hQ{B``{1vh_!bC&yMYK z-&CWA7XGvyUgMi*2D=2H&tA6>hPq&xo>%eqB`@#&NRD_KxBWT%fZkE06&3*{kPm zTSmYLm003JM09(_CDpLHn5Pb$xTzbo50*m8{_up9Z-8q6R^Psn^!#5morPCa-TU?> zlCxEc^4IVHNRYqZ}qn^qhp!EE_Y|Uqm8xiDg*<=CDVr z`4xbEbdU_AD^@MFVJ1$!Parhs)AkCYpBh!$AyVYD0k#FB0rJ0nYz>GIyf36(*3EroTA3@rLxQ1TyD*W;jNFHCqbXfPYa{Ib~ zGoPs`5_y}f-<;#JTbGM)1^pE$`P=jPis?t{`kC}zy@{<1sk5+|+6%gHArv3wf#9oM z3pYT)8a(tCzJDa5dmT0Qk-~o={@EU_b>L6gyhie8xE1ZSQIu&X^iQ6)n=H9~cUA5q zZhG8V7aRK((ym_~^hFUlO)B^nYh2Cwtqy(#(Qoz8t!(;z2nm1n5|Z!> z2&Pv@sz%DhX7x?H5~df*v47t}KiR0MjG-O}bh<)@xr#D4H8K!0sN0P}Eilicr@s1as-(?V16!y`OJ z-L3#hi~b(;LFeickdR0wX+oo0uMC_^6%FC$5=|{&1~i#at|zJPTV@e|L)FX!B3O-- zC+6&dhuQPIiYa#qeZ4z%@PSP!UstjfO!}>FJ_UX5il2F)CQCZOFIfs(z}yZ^ri104 z5Fu?wBkCd_Hbh#iCcr*X^|`Wr(mz{~Pb4Jx z0R4uIJ<nHH%7#JHIdiV%1FNKbhd zr%r_$`ViiGJ64zOx+#9wMxB*kj9F|*Ydff%ij9WJ-r#NO2{Zc-VyYb0_qFrlN(tmj zEN1{BE(=n%d$i+n(IQv5lQI}PkNA0+XuN6L#9i7Hu7Z6RunDfYD0y zJ9(FG_9l$?*KgrFFmyd^QGdHlYyaGg#N+Nc~vMFwOtXFQO|O&s^9Y+rMUo zt;+}|j+9MMAE-g6z!!o1&^zVY1)U ze~_>Tc(8M<>JUMoY7s)NEj8(2Ag7cg!+%*RRY`@M1aKE;^vmY1wT z7awMc+dyv8vd48WQnD=)+p+g8;KR1}Ko)H1di9LNI_1RYheDH)x#vs>*=5kEs9Y?I z{f*^YzVvrM>>b}k@~!0X&E)V}+@*yL`78rHxUlDpnmG}#tOIusZk&EfjiwEqPLgkw z51SEZO!uJMzd_uC-tu0DflnaM@V48-+w!^ry1J}V#|Md(l`jbK7)09N5Fg1&I~g@6 zG3N9rZo=R$HNgSQatB&SFhdabjDG0Atd68cB%jprtF0Y_F#+58(%DW%i&^98_ZVM>5gnHUCzw<)tQ&99!gr;b1pPziJ zoD;Zn)&;WiZ?#g5jzWOyrvLQ{ypH)N4AyN!?oz zqwZ|t(FX!Oh~E258S{L?s;We@FvYZcN&CKTKJzA&RLRSu<+PTZ1hwBvweFr`Pi|Od|;unj-sXb=_zl}$NZPBlTtDN7R zzD2jGL6!)el$X^%=$f*HAe3%@tUO(y@I-_-9C(**>ee=R*m{(r-0J{mVUW67&(D6$ z&$kev^=1y4nny(N#fXL~qtlQ9X)hvN{u~KB(kFt)U&uE9``x4a!!b*mOsd>R{1q_L zlu82Y-UvAMpx;B`3b`I6rYvm^-U=?!HQ^FS*-A~Y@{tYB1WV=Pzb*7cCfgO0mAEQ{ zGBS-l{)i*|%^aMkt&O!Eu5R3kfBus#0S@Kd9X)ulPg9UlLFq`^6k>-9!MJ~M>ffdG z^9vNGa4l$bI`Fo$RYPxZ?M;$E+vO7Shzr|IDd0A@}(@|SszMNc;hzzp))REn=- zhnN1&h?qN#E}RYF3DaX1U^gxXWRKDNL^^R&TY3O4HFOB-A}|MP;z`ZZV16!h0O>49 z9sG*lGd{lyZ}?AsL9hO&G7CZS44u=(RW$qm&jP^TIGMWADK-f+WR4y@RXE?zHvnjL z8UFd*oj|o|k`GndZA<$2jpM8l*}vJn@^bfUUh=x@iKRPz1pAc|ie*_p!$gsCgw@#^ zc7^7+h%SJ&0qd@Y^CRbFwK)C|vX7qJhDU&GSK!c_rX$E;hj*Eeo9OHsMjG5f-l><= zQN=Wq@v4AdpHt}CXyjP{{iJw(4Pun##DU!J%~Ls#gK0eXx0YyD;xI?2T?{?`6t2v2+r))G2;205o!Nu7Ma=W8QA}qI za3X?&K@srlR$OvQK5!OP)Td3pN2sNDqov_4>`y&=4;vQ;V+%+?*waouBSu(Z5%86M z7u~7`zm{TiNp%R33+1#%&tdZXdb{fteyS%rc`2vOz|&cdZ+N|gt==$*DVboq62jvLEW9M}OUTt-v-giZF%b*z<9+Ov)l>2vDqZ3LHJ z1fkdrEb(I5@kOO5%lnDBUGw$D_jW6#51nEt+!V(XFXE!B#P7`&yDU7+BU z>Sq-h^w+*bO^sJx*G&r2++S8@?%L*DGNr6hj-c{X@`@S#aK_UvXB>U* ziKMwulP{t`|8LSFfQfp#zGrk8++mAWS3r5x(~ThcM8mo#CHV0{WghrvQDL&`1KQsP zYEj}(Ye#Jdr`L#t2O@vj_pjaVnID3=ICHi`PNf3oH17js-%5D}e(USFH?Tl8_*jD; zd`$)KdI|KGqp5@9DR|T1CD;T4(tFKn&`LO<4dhgw66V5E=LGgk0=`LkINf~GIFy6z zte!yBvgQK8hWONaJ1B@YQia`u@JeD4+RudRL;P2Rlv+DPu&D!MX#R5NV)&&|s6C3n zz1B^{#`xg!)`T@bXBBkdf$4QOxIas<5&BSPTpKQ?|S1Bw-!sH(`WWs8G)gT-dRB7huB+5=zQe!Ap}8b7LOY z8fmZdG|q<3+~;1sAh`6R>OBT4c2USlEh@yZ&-x<+%T}VLPx=YV7#rR;uXtYwj$!sU zb3N;5uZA`2z&!+m?y4d&4Puq27toZp?UbQ_ZKfKkmIO2foJ<61y2ehxFRr}d61|Sv z_}$lQ9m;ImhMH}!>_xZC@pTU5pBWumVv~2|2^~Yppt}Y$&|gvbxk-vrgqo*l7+?`| z_d-7I`wH8ECB%ZQ^Juur{~OrehzdBN}|zbJz7%j~*4kFJ#= z6Jf0vdcx5(>L%fJnh>HRd9@5C6*gsukd3|I*kZ`CsP;4=N?6UH!RI22y1M&f;b`+_ zDR4~XBPqYbT8Q70-_=u>;ixtcHX+-5*9@|uHF?E}9oho-^FTc(F z2a$G-?b*Ir&(QfZ`gM*wgW4}bn7YvMtVBL?CmTVwvPC3)xZ{oApf4Hf(SS5!-n{NS znj|OY_)S0+@tAbjRiJ3sgQFl(idfohB%XhAarj0$>=s$tS6Td;_03?axgtq-VZhaC zL#L~>}mWR zzFGhDMyEciNmz*M%N8AjkJcfeT>!iP%*OMP5X(_W7Tvp0^&AJUL6| zt9R{}9eC5RT200|Sjx;(}MQF9QtQq!6{BU#_;Z-v=2sQW>5J1Vlk&@_maNS?j~LI`CeLCVw@Ed;I)6X%-S+C%=l%uHME55^b z>JwydHY(j2I4)`(?%r9?%{rMe?@Z4YmLhqDyFdDjLZ;2SIB?)PwmO-fmRqgUksCPu zp}<0v%FoPHJm;{AIyAyN4AzmKOlxm{eImge?E}+D-7x9AY{~pk`&@kN^aVFjhWqd{ zPO_efwznKi8(rwj-qnWA5Pewh_HUfOcaF}B@*(EZCpq2-^8Q`8&;wv|o+HaI%S=OI z`SV4wXqDfNlrYjTPLr88(m_MX1dH&4^kBdN2db{;@~0p59-1t*5QUO_-48$iKK!^N zK#A@EipQduaC&DJf%lZGq^S09l0m%Etz4|oKO2l{>#&6e4Psero?Ea&KRO@VbpK5Ayuur2aGA*AOOW{O>N zjWSek=W#vzFUTq+uSxiTE1Z*^A+UOSYFFy}2fY=L`Ra9@-QI@rJQacT6mdZ?oM$$W zGyV~sT3A|YhlyhVCAx3w2j+W<3x{Mb?7^EL)nH(Lhe#xB^Xf~>6BygOFg~)}Xm7_L ztz4K>4Bow608ZNXj5f)c1*GZ88VJTQ;qY(3F`{ z$1i7UF3DmQeQMBW=A9?Lc7zhwj45yLWE>SzkQ(b4x6nN|7M7;lSDs2L*fc(0X83f* z`UkDmjN}|-EAyJx1$5rm{T*(kwBa$SD%)N$zRWt?~m0?w$uEq5bj_UND{B<3D#=;dG0U{ zYobhEO77q*^1uqTd9wREkIBC6ktiaD`<^FvT&&=O7sPTUKIU04&oo{Fxv6;exl(WX zadCBvgE0TU5MMK4e+u{spg&$08+QGxp0a1RD%$XucG2_4ws%Le+d!SaSyeL6I?$qK znZQByXsf@qTQT~Mui#(`ZzT-ap_Gqy*Yt8jh)Kd2QnwV%QadQ%yZ2UY{k&hy(;@GM zNR=+IznV!MLL@aP^>*UeiXL)q%q25P1GV<2l914GFzNaic33r_HWcE$Y2iw?R`We7 zSVCC!@>YG}p&cGj;9>y;-cd~kq$mAI;&*V^bzi{9*#bXSP5xGZxe8pyt-qo8jwWp> zQm{=`hJs8Dat z@X}qQdWDVdD_M-fanfm+NOWmGKI(9_Zj_Z3jAj_!xb|mS;89Bg2@8h@JwN`n{0s9h z0L9wXfl~i^rxV5$bMwi0lS7@2Ia^EZZZ2rxJG=@;ZeympWpN_E1hYQ)TJq?}65FXc ziJr6bR^IkN;V=2Lh~sv~$p-}TIfP@gceQ6CxLWR)no ze24?IYIc4e0@SKckdS*D;aPIU+36-IG!+;k2fWxn79 zr`bNdW;pX&BpGU^Ca>(wsJd|5^1KH#;>$NyD*u=`;r4*O69;y8_&D42dvmQ6n^Y6y?3|O52;yt&5ix>qAoh+a_U><6n-@;Eq2G@ z0S1h0ww;%J1qeYUT{IH2B5IuP5|=sB?tYaJaKZY<+C*KK$?2}wl`8zD5P#Rb-m;Uoqz>tC2r9~{^qUV zg;F8>`(RfpOKrAzu zxl!hcYbR=N4IfRtwVC^KU!gmGt7JjD8`5c0SKJ%FGjfV_`?${J3+nr{_w^aTrSMOlI-g4~{xb zj716&GnS;zTlnl)_VEh2M>Pu5F{E5%FoNaXwo|3> z#H$_a_PyRmpI4ljS}O7=`ZRl$f&ZE3jtp^CoiSwd^AQ;B3#mQMs&*6sE5AGE)KXd< z+)dqo+7Mxkee(z{S3ms*Wi(vT@4lh5IsLT9L|&OwO)o60-q$-MB>&2vq9=LaS}Kn0 zbBQzW!*S0x6kv210h5qX`%bnP%$2y;7x<01*N^=CN$+*Ht>@gPIQlrN_M>3XR;+>O zz|Fr445YPTinlYG>ROSMj3md9iG$Sb?S@J4P%m^r&8*yFt3OpO`0VSOQ5EE0>hF^S z9*v;gcu4C>YCx6>XIkXG4~@b&MJQhtH$@BeV^1a7NC7<0lZMhM`4n)BX%8V+;ba$f zY)U_W!)E;|oNLPG!^KeHA+sG%EZgp0XPXIh_t4s>yV8hcP(Krazd9t^ zCZ1kQcuQXi$4YFs>SaQ;o9WWK_vf^;10KER0sVZ}pmpHn?%=OA*>DMDyP)@lQt%QX z%vA=bwM}eK;uYoUP#)RP{=WG0r6k3f7hk}L!N>^9Q=s(Bey#R!Ep*ed_d`Ww|G|HQ zkF&baTKx@XA>zWB&z~rDu%NOc8qc0I*#XP43A`xH#<&CG&7J`Dvm>+)zUALTb_Hb{to2pW@TZQ< z10gy=c-koa8NF3${+FHX=2fP7KN!%Q;(hJ0vlOu}J)8^x!>$|Krj@1uoXn6w03_<; zGlm7~-%Dee4bm1}0>(6m2`a5atsYDel9Xk5$kA_mY@YW{s<2aMZpV+{`@Pi;OOV#h zKMZ-iI=tV+^U+Z91HeaS-P?iE|8E{B^q2bQ?7_{*a-b2s6YFV?|4%aI#g3;r-1x4z zsFmegth(T1lOk;o*_D4QReW>#2VR1EO>LWH1iNHYryA@`=HWyw$`ZWue~2qofACy2_@4(|;R1 zbf*pvZ2ruJxgJ)(g}DA%SpEFS`bYKE5F;b<5|fH@0L}ODsYJEqSt+={5W)ctfgK6= zi8i61`ZASgKt#FFt*cSxK;Hsq+gvIMe3d!!!-Olc__TZ!8lh7E=*KUXp3 z|7sUu=F*8o91R> zvGh@miEX}vBCjb+>Aj3&8<$5`@!^`6k85fec4nX40=NZZxK0gI1yVYN5P|+rx1YJn zCG5Z6OgBnT7cN()OqvznCoJ%t%xPbE?rgQyTp<`9sW7siTvB;PQJ-=2&|*CfS~8*X zVrAg4{xzf?qI;A_q%&<=-anKQ7a6HwulYi=b7kgk5X4#`MeJBxt4HeMBOhVq%XXWm zo1XZ_JR8IjkBEM^pzV@>ly(32HPEyaJ*H|sWP1U-A7Eiw0Gj$Oe+dQk8!TKwm&YJO zHuGKi>>KH?4*Pa;&bkXzi7Q#X-Yt3k`F)lEny9C`V2dUw3-w4InICjA-bNf+Mw&E3 zC#U(~;syYJK}%Yd_!!nA0g_P7vvjsdmXFH^t+x&AeF8 z^5@{I)T8znbWQ?U*dow2aE(_vtr)ieZyvQ!Wj6|M{-(Y^i7c({JxMEk)xt*4#uJWk zaz5tT8>(4#S#4A(Q~2Cwz%)9A`QiH|8MJ^&z_=S9ORqlIvTNN6$wQ~%4RUz56yIM? z{JkEKcuPjZVpC`K@a2haUJXhRrYT&9%P_Ocj*|v#-a*UWo=T9h{YreOrRPH91psGhV^T=RZz`X?&^L zX3&(K^`@XvEt|P*TYXZ0X(;(@Isxq|J{)c$Mge>EO5sV@sIB{NCX3F5Z;08Xuq?|E zJ06FZfc#HWvcTT|ZUBFfKbs=2{5rnD;po*A2GaR$_ay{nSqpGl>xZbXQ>R}_*%!M1-}rVOr^YJ z5@Q6XV~G>V(}a7|i!AUMH$V+N?nl!DE@!1B@3#HJCUi3&I(@5M2 zl8co(qu_4mAXrjEVU^v7=3%3x$FW-{v*?$2H!@y&@iceaOaLF-+1%Mp9a_n~@F}5*&5Hl&>M2E$q)U1U@oo9d=SAkO7hm)y6VgXHgk?^EYuGntni*fkJ(a`#3 z4*xy^=}Fs^;Ye3EzmZi~sHj3x>5XO1_xBxfFUF>lKW+!SpxsggOzcOqeMC2}()I^S z7>Q&ah!8e3EO4o|v_miI(rcE&S|MCD4m>L^E{VR7HXwxA z2l==(V&DYpvan~+X77Pcra6_ltJq0rv(ijP+Z@D}sMA7n6Mees)A;+EwokeBvmn>Qzn{QXkxVA3`^K%gwfw2r z+e58um;iaM6CII^`nYt~XCDn1*!KTNpbTlf!I%infnc|?%kaC zgmlf8e^UJghkWwSe%_p(pu+t}rg$@e-lPRoRKFqUC*1~0WGdeEJYL#dWu<&_ruZEP z$)ZCeI@c)(wh4jPc3=jAW zSf<^d47XJ1H{{!EbQLcVsa=grq{BR!TgKB-1)m3(s{*#@VUGkmNv}lZ8qeG8bRHg< z!ia1!60xnkYH$OGq=g`UsI4%!mhdft;PoN={B#e^&DC?)K1tuz2PwaZbeE49ITOvp z=`GFhy1U@*OmkZ;}>;}fbB=GXE z%j0biw};f&eSesqsryTpI9N)6l&N*8-vM2huSJ+oalA3^Kuw5+rm%_}7ubK=5^MPB z15HX^HS_?tl*$HpD~Ay>+6Y;^_mn(432Jl|OJn=l;x4l5(a^toIJJ|> z$iyY^(btGL+uQbZ26yv$@LIV`tz8!)3nRcAuX5K^t;@YYfE*5$R=hW6g9+_GYAm5= zrkYPCByzyJN}3ql<0_M-eVS;-Inj&6H1%z-^KRoT1dNPonyUUtQ)-*EC|yscF{10Q)Dndk ziPFd;{{GC{>2527)@dmFb0iu|=?Cx$P!n9o{0rU03K71(+vEwM&)Okmoa7GOE*%lt zhwBm(4PogebzLeABqWMDIC9qYw|{nXjDDpe`vyY9;{y0B0D@H-TqvIEm3e6P31R5g z_9{4Q^bTC%S+ZWxlZ7SrDi4GFh0yrAUGY+&{Y4sBLl|*$lxPcjM(@o>WW8QQ4q~p$ z*iD>+f6xf2iOeK>XykUc-|#N~e&*4k-|+;|ac83JNs~lqg0`HHa*XF1n$5`7ZcQAzZ zd0nhOM%gf&P5#8M(C|hPa6d6vPycV}uk_EQJGOW%nDi|A-X5g~kcKC0Y7dDXggZvL{0BVvE&akS)9ltTs!$C%e}|->Cch89V(<%B z!436ON!W=9iZ=$k{$p!1?L>ZNa5M;Z){bfTz*4qDL?+TE?~6yv$d`=*3O#&2iFT!b zDTpt36h}Q-l|W`v6q{^g=vLx`#2)TafIS{|7A&Gie4cUmd#28-^r3X_*85I;?WxP; znd$8VP9r!v6|2U#(OV-aNKwXuMDphC31j21AD`w+IR^XuK2DVx+cUgn8h2klnMoz* zdAa!eM7ksnW?%fU_xG;tKL7aIc>jMK-4il-LA7VmEkVyzXaY~hp<;Wxk}z9^CY{!f z^m@M;jHxPF%I9G?=;KpE)~D+<$gf8*HOeuqB=by&%EyI!2w4`}py%r?@f47^bx-?) zDZbSi%qS)1m)BFG%29Czt{C51@kJWa4puB;l1nT%gV98uch_pgxD;?UqgcH!323JR z|%FlY~ddaae zZf1js@$Eu19}e-rs9*=W3B77!^6OdIMf=W$zN}kG3m!ScV=4{&yq|+(U&~IvENOm| z=#mIOGIZUYO8C}gST>f>DFk%T(i5C0yvx2uBwz^l>dLWC+6BGGDwD&~DCs;3)% z)&I>o%hJAS+>I&3==tvT@Ku~@O2DyW7<=ML>g>UX7-8Lqa?z{?qfc$De(8-SN)-`) z+%Ap5$1}YM*54}rRB{xjcsl2W?7)a=!M^zr@4*rAuq()aA4~38W*`xPW#=E3Ad&~% z9~G<;5k-L(l|c6xOs00GDn-6G!!2DS&(15A3 zLmRYnaJB2Q~l3KzT#8(rF5v(19u)ySAmU(fiM=ee4x_!C8+j1IqhwX zy!+6RrCmj2nCT~Wa#HyFZVuhxEw?7`3pp#CW$5)Rx|fvbF<={lCMMa zGmG2nNGB^s=MhQ$z}waw5dz>YA)WUA^5z5Dv8-tzKMFm}ez;;w*1oS&ShjdIQ9%xU z`tx`DPzp55Vjr$%xt6~??-^;&$7O@CFb|}5wl$veG0|q81WUKFym^^U0F7r5$&O`? z0}alIUkGlfcLlrs)l-Uufw-(Zp^LfworM2IN(hrD%9N(#p3wIg29>l;?44XQe&|s8n23W`>m|r22@uB6>l3$zb5`i1G)d*21f>S^WZOV7$S*f*()tA+f?Mh<#Zz8g z93Bp3@B2I1x)M(}lJHn}RFI2iLB313FKNZ@@dMGpfyi{rCeOntf~UQ%UAW`wIH<>J z6RA8qm$T18!(}rL(qM@R7sS(+gu}BP_ZGwO?YOLruS!UCr^0+<8}tEfCg{Ag4))R7 zfeYPTo4>@)M=z_=|BLmhW}+wU&!(spe`n!oXokvY8K-@lbS8^}?53(r4J zK7`I=O3^gYa;CtH-`7z{-oGf!Z&r_T5dpC9+5{&1R5j{3*YG(>p36N}%9NGy-+Ov* zrqNTCH!-$uOsMqm$yvHinRh$`8hkr+WsVo`My5KV{HHW46+9Mg4a2gh_UBmr%FUW1 z^G4HBKE6C4&T{;nuCoZ<$#?gDTFj-wNv!azMqT-p&M=)l3ar7@W0Nm3rc?A6bJbnJ z9l0$ucRGS;&nzIy-C2f17dMw?cQWoZDGY8Gxd5Zq8-Q7Dsb}X=3Fi;x!=%Y=TA?52 zS&$_z)&G(t&8_rDE|kcdmw~6!WKg^or^kY-;wVUeBzMk3%~oe!RN^b^+9>AQqhp4c zg?+qK-%&zI2jTh#GL7hjo)1K>VJw)@jI^T_git!3b#50`OC>vrEVleHe{Pa}qB_gx zNYj6YA^jq`5LxB~u1<+oB5yntLz zHRyIL!#=75Hu8s{tHOm;`gPJn=nBB=R-zm8WsIZd5G-u-f_5+_C)s$Ve)=U9(!cNK zdf-h3SZ=7c;hw9VAsbs6bw6}Qy2c-I;l)$h%58ys=9_{gm=G4fw2V>PxKr_JXnzz? zJu-FfFX4i}9Z3^wOi@X9aQWg%*tTK72tNk46_dbw!SviLdLmSnaU9ZLqaGdBp~vU= z73aN%<~FQV`nnE`LBEe6a>~d2I65);0?xy5fl2mLhueEk2`aBsvF}+kV4aD$_N$zx+1Z|+-#!*?hjhNxk zxL}DM0yW3+)+_w3e8I(Vv?mvFYLWho;{&+R(`;PPUQ_fZ|E zh!GybVFY8F9HXKN$O8`43Y}8uIUkIep5txUJSE$}8QePTP;&dMM=4acrt({F=%g7PAS=R*BD z2>g`gl0ahWb=M>KW6Z`SEPJIgR?$)h(;p5Rj#XhJsocUZc0iPo&08TFd9F;7O2x0wBFH;8`sLTaMjgiajHOlpX;D9$_jn^Z9_YKQuKWeqsr!TR1a5>`(w8X5u znzh878c29;aV#QmtSKa)F!wZdcYnpYsJ}zd&zd6x!$rgd0^wuZjMQ@|#3jb(dr6C^k}A6(84Zt?<%6cIjREbL zISr~|-moh}Lc6qV3<3uJ3sgFxvuk_eHY;Wl|4G3@#s8iyxiS{NAen;=ActGVw7Yg3 z^6svu76_(`F;iPS)N&^4uUNXne}1`@JR*QoAv{0q%#1EP&&uY&jg(c2%T%kgmrB2|&fD@5_@p?}wGkgct@lpqdTOAzO_N<&Y;K)2!7=w%$TmoJ z>=%h^q&Tm6!WFm0K;kw|gUP{OjeAmE#M#Bv>t2Nn*=XzTY#R^kb#GqtK-;Bg_^7r1mL9RV3jG<%o4E_oi!4X4CC$+Msre-ECIT5oWL zq*D(V8GLB8v9|93kXYVhj?QTmnBZ%x1~<=GMYUEDiA8 zXSk|+ac0UU`jO`SKBSmp`O%!zD)Qs4{O*K^g}hI^!t==T3`Jf5p6i=AO;Ij6f_6`) zs42;uLt}0EMgt5J!1rqo5l-onLcs$qXl)YWmHB6X7?Mbw{j@D zI^(HrqAiDpy!M_)WFJ!i!hbBRkk570FX>JIRTKEfKw;_HM?d*z3Bq_)t%c~ylg%fM zy_7cXv=%KFz8%rsJlrIZz^A>M`MMaqmpVbQe{aM0#lkT%hTL5__ER|Q5OuRZ-i{{+ z$2BV@i578ctFRgX;}4=13yB;pl8-W@v;rPMvMp3QU2d#QXT=guwGLio)jGQ$LFXYM z2bC@#N2WYbWh@}{vUHji8=d0mjr2z3l-9lHp^%@!JNh`=pRc|(WDaQ*oq@g-I3GKG z$HC`A8W4IKMMX$AC#l-pLRs!46P(@gRGMS2E7^3(wqM6L*2{bfOtILN+mGl178ALb zM2o=uHz=Vqp(J6K4```@d81F3rrr++vs?=mLxcf9eDX2DyO4e>+Gnby<_|-{Yc^^SV3OSn#WA2-xdFBX->WDlYNq7DR!-4bifj1 ziddMuq)IyA^1XDrIKedit%Jh%_~25N21z%XGzu$~tT&KNN)mp0%+#?-Fkgb5u2!il z@z(u^n493B%=sS%DaB4mC;+uT*7zv0ytGZdJ^^CsG46x>_{z-y( zN6@NV5;eU7^8V$X<(pzL&iJ0Sw7R@x>D9khGeGhS=Dh+4GQYc$p!0$K_TgDQ2MGRq zR#Ve;Td{!^K?**YapgvIv5?lWjQ7XV-^{rS@1IOba93@LV@=$qK0oh!t2<#67n)-8 z-KOj8s~7{Ccx?Fnc9RFx22WF<^niv~exv)Pl?Uk1Ua_Vy?g%0j@%#cj-}wVv#4LOH zUj4}?`2KKzS8BL7*1QtiC!5Fk$AM1Qcs=h$qI-%Co?DZ{N{EEw+%279R!copL&UUc z{V9Uaj5Hlq23jThte^W1Jgq`8{*8sJDRpMTs5E1IQ&q7qzdOU$j*~SD;wL0;{j~Hp;_TZ1&h=~Ynz4f|!s4-f4|7*~t z!u76|uEvm*7fD>-Y)&M31J@wrPN^9J3d+g2mmLn66rz21ZScv$LXwC#W#m@`@ z!%a`0SLCluen2#&F%WT`ttY(mhNkhYrcY(qV#kMFt2Na=-3m;crco@Wu}Q^Aq$S|~ zf1h>w9pl@R!EKrfe)OKP^@VA^5D5Ce}Y844Tu?^o3*i4lqfw8#Qr`oT~eBa`( zkmNCLeKiTmC37;|m%;FwEFB3?NQ4s6cFLjmnp#8>4u6Xdu=T#NQ^&tR`nGASS!1TM zudXwzh*W{&%Hj~C+st0eCuBEF#hDv34Yy_teGMtMgA1!BAFS!=ev}qO*GegReih6J znru+OcqI%|yc6xynCt{DA@ZCfN35hgx(WWU_)zp>Q zPRa-<+@Xj{He(W#Afdy9CQB&Xruc^X@AOWkw%XQ%K|##$OatGLLLGLZ%V#<$ecGWy zzQy=2k-4_Db%N|t>=9zmna-TAPG9J~xYjh14;WMo;A}&HwRISK)H1Zusq_XZmf4Ns zp%el3FSBnSM!ka^y^kHoQPi2rkX4F^%Fofv*=7bwk}8@M?CgWQ=d5$pjhY2O0k89| zZc)E|)e(%;k_T7+|7bePu&BDP53974gmj2>OA7)+gLFuDgAxy210x_UEgeIL(%s!P zbPGs#=fKQ)`G0u7&xg6LefBwfuXV5cXCB?#ixumQbfHDwVJ^EH178$|ac}UyK7|4D zkCprdwI@?i1yYde_u*8-eC}hJRKwM5{cgd!$NiHd$v5jn2tK{H!`0av&LQ!YO1=1N zJvpIv5SBrfHgB3}waPM{0!8X@p^EmSe2(K z5WF-c89E`?F&K=KK!5n<=}mi`A{|)|;eL*gu*+mLA`GA6w8P>Dv7sqLd^}HiYS(b; zmn#s{yYSgO68zOg`dEzyy7XoGVtT?5H-ljoUj4;1mLQaU_K0`xt+$Qrh=-b%GDzO# z=rq-j6v=P*N;t2KBh+{?v?3-MZ_#FAXMm+rK@33>bktlWj)SA}G)&{i^@P;-O3@Lc zN|37OQ%synJpFGqixPx6s=58xySNjl&x(yIAuz#)I-pM9&T{l!>gzv@;`>;+a4&E} zCr$bG5SSgTly^Q+AUQ9_Gq>EH$`scU|D(h2ZHMBfuU7ZRNE1E^Q}(y_vr4A4{O1hC zv9-w3M61`Ui>-Yw$aouzH<1 zE^#{^Bfv=djiT7xw?dn9o*g#h+8S+!!Pjg`*sF`A${EMBA(G#2#!<1atEhsw@_mhi zbE*;J9`l5>XsLJsQ^+Iz#&{iXa{gdW9&euOha95y6IjYJT2g;^)SVY?-XHEoR~T#3 zCRrHf$H<=1N8B9jA4EJOll$s8i}DIT(k>X51^P zK)&rAw@g(4bjQZd01oRh3=V^x5-SJZL2ZN%Re%|6(C!?X$Cgeyu9VmX%PC|%BTzEe zgyYt#_x_{10-xrg+HGvxPb4N;y@=@;4M(p!2>7o^Q|D5W=HwE+q8m(3(ZibsZtN2I zsf6FnhkGdvA=#AZ)!0YTCo|QptX(zGQ}Yrl2Zk%Fu9dfL7?}RAIi3|twNq?INOW~o?YEG*(9ZAH zu_K7`*S-JEe6JpWOi_uW2%&T=ydJ{o=M7Sn=eoNq<=(5bpY^_`=Y84zM2m61=fMoE zRF+_(!zJ+--iK~J*N}6*i}nqn%~Uu2{)NtPxxMkwN8MdTnnvof%dwsN4an%yw;mdk z&V+KO+|s*lG16!SYvOc%TdA?fi z^V(GjONG%nEVdxm`&ahj_Yf>%SIcgj1h}N=C;L|TVAp9!8j7eAN)wKIR(1lLfRCTX z2WBn&Ntqa>x^@-5ffLe>7dN5E!8c?g=h4$~jy}m`7umCb)Yo(MgqlBeHF9z-Evo|y z_!Q@+5R7~^7WrHd?HBCAD7*6yh_HWjHs(0HoBO@5p)ZV~z}aS0EJWli%)8qBrr@fs zD}|y);J$|1CGCV0JQqIE!yn;xZY?cZg>L)_y!2y0cIbvym!=>s3l(cD((r9`-ESnb zayQy{M(oEUz0dQ=>sf$hkKZ3x;xhr&^Wz-gTMowlAxQCCE;P6Wfnm-womiFgU=E?M zUyxT<2Pm`K1gJZDCGF8V&EG(h(P?h>>|#DbQ+vP@)JB7(Mk(+s@a7kPghTkt*F#eL zY2G?I0@^61?k}Rjl+oS!BS@ws4OHr@m3qjOoM^}tyRV)E-Jt;-!i*f$FsS_iSDyLR z@`F*Fvb72MOne;Cg;D6omB-Tv+Wsy~lXJpiP?X?)ijWL@idmD_IQ1xVXpCsQf_QES9<0AwACJn6E1m8vzQJdDZF59&EANz#Bo~zT4TBx1 zs4gP*-8W@HmCLjnA;7rgAz2xAzQA+|+o2mS7x8dmpmkm+Lb?VVKnjOh)2AZsfYo~Q8^ zk(wauHOxNTA*9s$rUWv1^VcBy*q&I9Ql=xo$B zKl@%PB3B-sSgxq?Ey@~Yd+4bew6qgHJQ-p{?z;(KUm^j4`sy;5<*Xi9|HA93VUs3S zRz2q;yqFI|(peV@Ziyqn#qoeN^XNtPJ_z)rCRmK1`(Q0eTqDthNoPi9?`^$xRav@F z20E}7Vhek-2bqcbxLrR3aWTp_%?PTDxR8HbF%S@8@8j#MOQDmK_E|*Y3=;cV$Ni13 zXt$Lyx|6fP!jkR~9AbL2UrMrk^4DNfYHQfcnX_TpIU=rM|1HUfWnA%;5}7eHH< zi=Lb~vm*fd4Q*V1JSBcGKU=k@mRY(ELPv=K7stxF zeY${H{I2Jq^~ejCSQkfXSEK%cr^s$JpXi3GERV!E8qB5K-j_VqywL~nP$0^ZDbir zewFL}cvo$!dZeyN{QEm?bQOl&b(Y7YY^ui;UnT(Oh0W4s%NZGc;kA92gM`_!jDbA zDR$i1I4yckmi%|tG|_Od{Rc_JZM$0%z;dHv>7<3CJ@PO#n$O?KUcVKqvpMUX^!JUn z-8_VZgi;*Y1GQN0-m`+RJBuhmmfjaWnA)sF?iL=w`hgs18w?8lMMLjLn5 zrB53h*ahm$^eY*WW5RqhUfl3%llQV|am?q#S#DkUJwxUZTsE|Y&jH%$vOWpyX55JO z2{QSFLrn%Y<9!&oh+HgR@crn)udO!GHDA*Eri=cTH_^9y51nMY?m7rteO%I>9SLx9 zJ?E{0nLjU%v3r#)MT13(Pae)DlNjc3ti!#0L$)+kMdD?1eWT)YqD$;YUcb{Yx0%E( z=s;9~wM(BSNt3PE1=tsz+vumhLgd&hsA*?ab{>ay8XWnBIs*viCSt_C!`XFK{yl7; zmX<<0f6>n|sW6p>B(`8$4nMQNZ7sfdmDt2Y>XRn=4|3h!9krYyNu0HpSWi$9a^y_% zEfC+=FQR<9hm{epO$VMBLnZy&PCCx$M!STJEeH^R6NY9L$=%=A?ti2*m0$R zu^C4)(_jgZ8-=I++U(=leMUzlOZ*6JRa{~o3ufk0d0Oo@=V?6TIZTMA)d;eUOfuoNTF2#qB?O_wIlRO@y8l=Im z70FqhPefh1;_}~i6ebZD0St50ThE6`i|RmWnYEJV)0#O-*mC%%ksq2*Dm~W{<V@no6c;)qqTI#hjB z`Pih`!ZneS$p#err=F38vUd{#Sbr1lN%4h|5_O7&#%D;I=_ zg`L*X`YXNsH1bOn$+P%2QU7xFFTE$-;DI(F4H%WU=-P?^-qp58L&Ev z078tu4BRV+lz13LqV(re;)_Xmj2>*g-0A<2v@&XMYc0COyflh;Gs46Id1M(I31}RD0St%E~nnrpX%; z+5LhIvtn1anTIAy%~q{x-}d9n1*O5`CtQx~`Ud(t9H?tcPRE%6Wa``2M=o3IakMBH zhDc0J+t$Hjo5pAR>qTasJX;F`O)c>>Q6W)Ji~>2TY=FRFcuKBypw5#HoB;sfcUo?c&@-Wf;uy4j*v7|Wm#Grs@r z@As(nL};p~kZ;m0CBjC(7%8#iy9aFGkVGR>Tw1zlMdR>8;&7$HkVY$`R^<#6J?y2^ zP;M%jll!6wcKKYg*Wiu~e^*gCR~7=W9v+1K-%)$J;3Kbi(wZK9-0_YKHSp^QrY<)1 zH6aO1*P8oXa1d+6Ot|6d<4d;>PdPL8R90-pgQQS&#KB4-vfyDZ03;QLzgz8$i6%5E z8FX+K_L1ud)F$1`hO@g$3fJ8!|F6_||1G?-Wp?Bv#+kqeTlhfheN7kUSESeO328A; zrRa{&#)$+wt|{F~?E~qI&HWc&)}O?+QT%D2CFG`A7xJ=CI|+FbcGV_?x^gau zV<4Tr))-lPr=ZlGLS} ztU2L;WNgCpP^P`MOb7}F$JgZ`?fdng`unK1c9WfNkw2GaJYcp3o`8_|_wjOW8m1EL zF?i*DC~&Y77j9|kEAVe-KLoLt=V-GZjbtKeFdKg4mUn--yg~X!XKi2ciQB?)&h4y) z?Ay}^{4X2+HzgU5gYffv^0LJbjyr5os~j>qd*$TTmb zRGPt@_j5VVs6W!c{yvgScw&!vHO2DZUN_@j~8J5f)_B@s`eal-!iT>AvN&;9t`oG;Bwcvc*l-Mr{-DTUw_)Of<& zx94YF@dl*QlATuGcVmBn^Hpj+MP?+K=@-SL2n((OKiuC(^ehW)(i3oOJ(0Ex#^h5A ziiX{fnmeTj?k$wPT=H({UeehPzf7A&_0*UA^x}v~pMZVrULupe5J=o}U+mblVH{eR z&J3=8aWb|F5ZpnY@+2hDTIScQKA(JCuD6H8r64-1qKBU9XJduAAhm$ICN9J0-J$_>sio%~Nh_~71*U(Nq!K)W9ieM;-2k@Yt(LeV!Px4= zv3A(t-q)`_)s!ERlgYf-Cn)wc9#okTqKZeQs@VM^*Le}4&!E)m?;4nf3Gjg>(L3aNVXY_hC8>6PHaQGSzCN06R7cd=Rt_z8UUb47QMhI@#OBB=J<33u=Aa^pl#kGJkS3x5E4(_ z7n9y-yp`B7&ARRlBl$*mRqw;^>!ki*LxP;6&BtbrQeLmuEI*j)5>k?L0M#=w`~;`_ZAgzsoBH z`JN(UBu%6y3-|S_apls8VPs+*gdWL7=>$EMVQ%1x;umSV-R1GJk9V1NO)pu2c2IVZ zX~I}~wvg^W)T@6rXIteKw98XM>mtkz6kS3G$NN&dQ0WmQn$W9qrDIo&!7 z%`f{2$$3+}zIxb278!95itaazzAr=QBH>ehsq9@IRm1|5s!G*_nzra=teobK78P z9gj~dK5A%+9ns$!e6_Ajse`=|XgnKzCe0flR!_X}H!ZTBUi3nMGx_;*L*?rT>DW$M z^W0Pb&Rv#%G|3{gzJ*R_i)I(Yo$~=e2Rz}2WORpL4)(i2eNNDnfpd3XvOB{3!RYP< zw>IZ^b9<2=%?HwL4k8cBS~CY>hQZN@Td5zY$Glf{>SX-R}y&-IrnBqbnj-}k{NN;DN?X+Ghd+CNBWFqPKyr3?+$ zSb7w}Vy5`B+LKAv0tHS;ca&-$wR#S^{A~=$)E`IcRAd3%QJ#9!@%SsKsL{S-WOTZG zNI$+}`$OZ$ywC?G7_&c;^V95Zcna_GmDRU>^^ALF=+Qa7gBb++&MzN4b>mgcrWr)Bp@g3}=nrHeb!zjd^&M+9MnPTPm z1lr!nwrZ={`G!IG8kOpchwT9xXW;khH*zW*A*2+|R0+C$W;_$77PriV9g*`3N4uYs zrEcHZ7|Tl3ef%0hTcF=SbExJ|e@)y8yhl0rxcG0}4Yphm5LAni`-#IwC}IPP&bNlz9v(=K0@?nwbhn?>ikrC@Lsx`S)QkA`t0oTz2a23M~X( zD1le7T5ZD}KI^`0-kBx@ zHh~y%u3VI4Pg5dpG8=fZXL3j%6NI;>v?@h2Xnv^1ntu@OB#U|E*2Y&q2xc~Q`zmr% z1xf6n({Vn}cc{qVI(F73eXDr~y2Jt>_IdC>)Y`)K1hU}4+~Sel3~F#3W*3A2rR(^8 zVx>6l%{63rIA@4|V-@&~+ABo3B?;9S{*UIEUa_StfB#okbVv{2P4f3Ul9f^NdleuF zwFbRE)y@2q^|Jf>F&zf@w7#(&61k^Qj=;8-s*q}VK3i{ngm3+zO@iW1uOapGq#$^c zHdx_(oXG#iHyktwUV{}=7_sA57CUps;2280!{AghvY(M9L(!t^dzrBWkoYR=(jVt` zjHn%mpA$oI!3T`(`@aUrP(~<-KJ_(t?x&X$#_^y!?{?N4kj}{7nQ%!Jsrdt0?sNN; z(xsEP4&(77*bX*a{}Y+uJy%JGY(bb@hE4C-NX187P)ec^K2H$tAhXbU+hX}we(%pK)RmPj>Ki0J#R&F{h9U#sA)Yq0+o|YH{sMUp#}Twaql{AO z2WAp~O@M;pMo?i8;ZO+L`bQ&jZoc*DbODZF`?wE5XDIIct}5A>aw~Klq?+V?y4xyv zI}%d+v@^=do7H-s9%0xW5tjGbA-Zt(_3_J20*J;e5vkM8nVI{V%l0`0DXF{TtOqgOqlc4BuhI+HjCb=l|5AMQA&6GW z647}xA;Y67g5{3f8p1{otqH=ye={Qb@}1;P>Pv$|7*vW9JnC)|(~MJ`-AAjW$Tifb z`g_`hWAI6x`+P1U=I#cl>=G0_+jZSrDeH$QZvYU z-4~3*TLVT*q`9^Oiv}17)1P9Ovi1Q2xsl{s+nKSri<7EC1m(?wu+#<^A#db5|B$wi zKI`~+b`KtYI# zAdK#w9T9#!+WfyZekGs5o?gH-k#lv`nZ;L7dcP%A8^4!fFg2>{)EO2Dvel%>Uft># zt$c(}_804XyD)enkK(sILsqiyxc4INpRW4=pS36&@lwIr7g?>NnXv{(ozJDll$~Sh zD)uu|dwdhWA~QDD5T|SCHP?YUN#p>68_(L9JF+*NTq$iOkL_FETa|JV(Prjb=5Lq# zQRG%6-E{?SRU6H(2!&;z?{C%K;2p>W@#QagYMBQjO;De2jLhLP?3WzaIRCkS4JY1Z zxi-~-&E7n6FLm}FRo2Ju0vAsL7A~U28H7w_qs8AyXRdBAg6`4EX9pwG z9ihu~9PB5tKvbi^x#&<+)KqBlX3;TR5AkM+>LfQX5D|8cR;$liOOh#SQwgd0R{d4;E4Dq2aN)x@W4NV9f5PvSv7V&!E#As9fO!(s@Ap0%gY9LH!2b+$wC-2s^7ktnc)OSQN%D;$?JL>u}6T$Ptr%#9^ z_vgn$>cIZGB<)uitm*>TTQTbDN+O_&MGE{@@%K()XlgZ_|FvzrG=#`PTQo<>3`YfG zE_*@NtkvYqe&_I0G|)VFN~9rrd(Ca;@3eJlvW=Q(T^dbUK&$Z9UzXUW?_05*u3-2K z0dui{d>MMtTXFffZZzYaW^6Bm>U)aGaI~`z=Cu&fO6H`DFWg=(b@rWgDwuN0$!m>R zsGr)84I>vpiwY|llJ@mSoLQW;bgZ|!; zp2Un)h_lDR@ZXK75k%~_fhrCSebWZjlqicIR}07wU&etKV~so7`v#DhSB*kP9OiKO ztY3m!6@*=|CAHL`5b6tc)866*9kl*L>oopAkLVf=po~92ZeoinQz-V&m!AXjd-(E} zE!KtfM;iGr6^?Ip(|*6>OFe3Pz#TB=I1}@n->j}ME*Sk*n5r*kpTul_c ziUmHOfL&QYs9meR4(OTsK(e_U_3rT1(oL*y&o7bk>sSkOi08CRw$0b91M}Rq!*%?u zq3I==sS-XO3?P!ZJAB{%2B)xdq!N!@f&_k6wbt;}mZP_EKn|ljR4ZfoeJh9Rt9f(% zSmod6Y0PXqW@T;&9|9pd_Q#{t(r#Ez4f1&GP1_@F*0Ys1x+WJpcJ#JVk(n##%7*_^ z=QgEqdYC^kR$km*3E?I=I@yqSA{>A@rwR$?=?>8f)TjbH?hzOL*ByqZx%S6$8#{^z zz|Yu>kGYb}zxDT*HX!`+)(I6S&JJDJqO0y!&(oX8;PV{2D8`gk|3Pgz!VVEkOl9`ugX`qGx{m4Ti{-f>P z`Uo^jv`b-wVUrbgAk)<0WELWL%1L64; zX)PrFXj{cPRekd+^#fwES;A--H*MVq_)GY+P{H6`-Mp#HDp@n0aPZ58gLoKymcDLm zi$?r6`E|R1WB8RwGdsG;=Nr6h(ib1+71H!JbbXQ+6(L)_u5vTs&U@cHknx=lA%WUt z6Qx~yn7a{V`ps$Z?dJbc)_pnOItM)AVUm7PozsMq(Q>tr z{y{StcVlL%`f3RCy)OYnj6?$B;pxj-3VU@SaMkhTfm35&*O~NAE6U?H2m`kS=P>RL z>U;%urD?zDWLbIL*-5g%6tmM2%uPWR8MFWn9W4LfO$TIZwD=%HD+mhc?-W0)KzgWg zGnPE(&;G`F)bTWDlG1jOHF<k_5 zEF^q!DrSBP7C6qY3oqhrZ?Psmg8qdMr)Z_o>c39~&mmHhBt=Gax;G2CZf@}}$t-8u zSqzftI_K|WzU-d`$%fuCR*G~aK1@_RyvdscF0d?rtxzM$+TNrbE~?{B8*(_v3ML_R zb@m){L6>V?V|WCLY1*1t8^?mbFNfy|lXPHjK6SkL@ws74PdkP@4f=o05M5bBMA57x( z?;OmYU8Q0(*EF>6F3DGj1V%?0o;b!p2n;hsmVaZH+j1lDom7qtb>TZmM1)_%jPBbab+{dQrNxUvVRA*S9)Y#@Lh?XZeDyN9b#LkG(z zKx@6cu-^pM8%oZu|5XKDU?Q@t|9W2O0fX6hz3x;2^e}{m$SL^vV(Y@?nY*L*Tf;x+ z+73AcyHbXzsPsv}d_!yg6wJdjvKK|1X^zsexGg#2(6;)k^H!_KOI_cT|JVr(n&SD| zW0s*G86Phz?I>Ro*KFVpUcmK|dCe9c%@a_m;zR!z-j}8LElf=Z!+eDPWwnb$PYZil z(gb|IvpBJXpBHzhCxXz3@_aW!Dp%@*6$%9Lc0t>A^3D^)i`xfY=wlv#uZMFX(Y9@| z`tjW%-6ti6@E~w>Ys1S#$1&x60y;r}=-9c&%6z6GbuH#HqrfJL652#fe_T}D3WZ4c z%tC+vS1r=2!6$NA0tBh@#Pe%uMB`I{Lb`=^J^23*+_{D9-1{dF*q8_8yV z@Ux+pG;IYU97AOx@%LOZ{F`A@m7-H0vlsIHbrUjhY9F#aWskV}_hY1)!a* z1c9-!<0%Lm{I8e5%=aAAzmdX{LYbi-1C+@%!PjaN|xEY7IU02`lSnM^NAc2*xpgXkAY0()YE14sd4w0zGk zEH2`tithlPLulLfcveYeWy%CCz9P9RoH<(=){N3%kr}mi7VWr@{~A zQ~y?|^{ybxrZbdpZ@9ChfhxZP2(QZGYm7+OnU?1ws;(@~`vxa~AS#!>&<^kkMm|G0 zvUA3WT6&}VjkgO>YnO_~OHe>{e{%&EC2}xq>vRIxI~QpFyPmF!Ud5wlyZe*4*7IA4aol|qK{?1V0Z}WO>AT>OhSe_tQ_%F3R?!MJz}?F++XE& z7UT#U+(VYafOl24bt|_MeKbAEl@8driG(}$d~I-{+?-yIV|evfkf%P~ z8Qdli<;^7#YB%h(^La9`_M<#HM#e*s^O&;gfE%Y(QbBn9^Q+_HNtSDCjRKnOw}s}y z5Ei7Q0({DDCY||c@mJvT_6P{iwR595Uvjd0p*x|Fp0HY!H`2$%Y>zsma&%iM`F^VU zgRp&uK1qUCKBT|a_MV-y*+>P_0I^+*kqrMaAud;~ETT9xNd)*|aQBWrLTU_NX8Dth zss5yV)$sEpaxQi)r&N&g48*p?TU~8wo;H3T8NK&kBh?vSKBgUWhb_v>)IlppdI-%; zEZ%q%^1M(+4F;e+YXeJ9HsPcv|BLKG&*+N$I}6l1n9iMR-*whm=OdoGRKI2BEb55{ z#V(#Tydy`7hozX?xDgrhDd4CUV4*Y2;TZ)quo084xrHMPzks~s35|HhX1K>2s; zZD;O3Q}vnUW+8<@KCNl`sGf+qx^s=HZlsQGXm?O$=arnV)v;wxsHpOMQ9Z)LnSo-m z<}Zq~YKpwd7x6zbdAobgMGdpiex;}8%-sAIAn)JG!5L#Y7#Avxi3|7ofv?Z-$7M3v zv03jeeEng}pF(2M0K)xKO81}ec(f8qmwOxiP!D=;;-Z_1sgdQ@Q?a9yKb#9pJt3Zf zNz6cRC|dg~PHr(8X|Pw3vIliPKQhe(Y?^Gqw`n*1*q4*0BIaV5!}`pal@>*$jc6&c z?Z{{J*h=K-%GBe_mC!Pvts;c3Z*`b1Gjy_sd>fLYjmWnny@9noIYv!)LA}nQKSDnmY%jw50h~6JTr}v7?N)-Y^3kY6ulC9YbG(t8#%f2ZbbZ?DkAm zhE)ll!vbAPw19^svC`##quvlMVUgJEvB2yU(Sj}1IteufOWR-Q?FbWubgDayyF zweT#$5bd8CJwTh2BDlBaNNpAv3_Y7px?PAW`2DhYl~|lO?x{N7#V!Stq_Ny#XZO!i zP#**9PusfgkR^sL5#g2ND3ovp@RlD^4A{ZRRM8%rf)_}O`$-rOQVUCy7;_*tM(Jlv zWA5+jCc^94MhIy)TF6Q*o-<#Y$#&PgzxgkLvXVU4|FaEWmCujX-FC;pw9s-HzgJGD zg;UbzfTeD^FNE}W`0R)2loTpUa-Z`$>Hmgc4Ctpqeg#&H%ULYodLHWm<|w3pR%nG3 zJn0p&r(?=*_F9x}|Kf76^QAZ&Jif9);l0Ev>8P-q_l7 zQ`NT-RQja(%1$v2Y6;^50MA5l_2L+@A+hqTW*~%I1onFGYc7%Z_`V9G;&58&+S_Ze zUGt1re0FR|;eGZ-QkE`g+XP$L#Gy2X_ZHvVGwo$Ie#zgUkeraJBWZNp_>^c?EdBPC zc(H!2Y04h(Q@?gb*vp8+iV&j%rFHDB=H7i1wc{ixT_SN#X6u3b{etwFZz=i=eMs6_-( zolStb#qLBza=jP7o07uzL-04vuf;Cjk%o$sjoWp|k36p>=YfsI>vBHl&Uafv%b=0? zhMvj^$ZiG_EpSm+frOs%72YE9BK8*gZHxD(51RT6gh-iA!fYEsu)iGr3J1YmnA;70Lb6=EcDi@Co_;sVB+P9VkXTt7H_) zk@mqKVnvLf3tm~h9L{s**4m&6CQ1#H6htiA7cWMM$)LaK2C@D3a*ua+VU?t^x;MaO zfy+U)i`wT`;$&Bft#6R?dcJc~zb7LCez2B@E{>+0cQTv$Gx-mtu+Th@zA-Iaoi%?6 z(|)wnBoDvXnYYlXQ7qpY^?X5IjfxTZE-%RcKYs}A!W}97N@_SW*4RcgvUA&_cZTl;d-H3$wW-ByosTcnEcPVWG~7>b0qp%TF0J^Lx<3wl5xX@@>a=M@wES zccJJ#0$`N#ER@qCVP<(9YI0lYskaaGt9Zso1kFA5oE<)$-NTiHwE^C??Y2XW4h2Df z&N+t0CdY>x?N!JRB-F$wD^eY9sNz&}7+QZsTZ|!ggxB_;j`8;gHtdn>6hAavs##k`cTl)zZ_su{Nq6+J+6VFaMb2hXUy)9Gc}JR)`~Z zm?l5@!u~7ZQ2vBbb`=t5m9+!fDGU;%Evo;|d3$#toA>s!uDEv=fx7vi*_W{7L~l;2 zazFa3=MS(bp!K1GK&Pn0AAr<-r$&;90U+sQ5OsX*?n=u325P4nVW^r&Gv%r)k z{Y;9iL(yDM@SwjeEM@DAaYp4Fs^K;YmDhXxVY*_k9=!r#l}$9gb+Apn=l@~vhj=U) zU+ic>7Gw$gp;u6*d^luljp;jm)hXPXgd7-MY(jL;6JQ=(M8?!anM_zMKnmmf{Ihmm zK~D%4bod{6m1fM; zWAP8U;6*1o!&1LYp*CoTUUIO036~C&v+Ec?tigp4D1YuKm^UA+29t5;uXT@>_*4NORx7{U zZ)a4+Fci1^3G&f32J~xf|8Ng#9wGNCG!?Apwf@F)Vhg|U*c8d~M3RdaXWThpO}z#Y zP4c4=;y*mKmNv?|0DS%vIIE^Uv`T?zFJdb5HAP`ex``!3z@O{JBkmpUN8pQ>2ihKc zhrNbDzsV>U&551$J1=>g`4@n->SMgCQYA0tnZEIK#tF09*Cn)!&dOx zt4!z9m4|hxleq4c-e9|O1ow%-MrFeoTLm>s8xlYc-S}cMx}(;r7J?S&{Qi)ou~;UA z9P1s}@hAz*==$iS8HM%A2Y(W$?HLeMcAgC9ZXOz0OiLvP6>fPVm_)oTE_2R1*=d_e z@KG(>Si;?WT!nrt<6Zt&-3v8EQW{!frm<}nh`xhhFVg=N7$-|!DFd*b+foBumpV88 zq?1K-_iV&wOi-VH{!ilLRb9Hsd3Y=c_H-tXpkoO)*r?6^D7DUDCYh*!9CQ`2YT+wC zQ^++NE&^U(Sm%yVbY7kHNW6ISTt~ThHbHSU*PgFldyS!uWq^A59Gp%T_mSRw%b4Zm zeN?>**&LAxeN{#ULB%fBzi1B5z{9O|ov9e2vaIJzfvtl@f^%%u$`#EAjk?felkAT) zvXWypY_v7a;T>By=jWj4FM}UhF>~H~#>t)Ds??2wUzkbYO;>u~Q#?1CSVNGio8NQL zt0N}|X+ML2mCmJKMH4Gt9EE0s9$+FSmMV<+1AF_vIN$i+C`wph`gdOPWoNu@O4-0Y zl{thtAX8O47v*W?Vkbo^S55hB)&#=43%ed{(uz9#aG6=K9Ek4Ie}k|8@bpY=RQ_wJ zeiN1vKT!#4-1??m?-$Zmh*)C%?=af-WpP3_HRq@DPUCF0P(sasn($lO;asKjaB@s< zte@NoPA_$S48S2Yj%$u;fAbywv7?WHo!)nUw;(NhYKozSb61kC#03}i&}LXQ$VcBZ z{T?pDDkQHD?WA6Mg5Ca8Vn+<0sWoPWeLJQ4Rk}q~$b26i8AipVvfVHb zvSYE*4i1I&I|;zmDdO1Y(PXLrdubY3W;)T!qfi1X70RMcQ^;p>bAjFqk8{)Bm?mMc zmQsVbBCbJ!fB3Ov`f>AyzV&fGsU@)}u6(D+2P8uzsRt~1&~9|#MB=Dhn=IOC=lb%zb)V!WD- zvRUN6*A=)olS=uQ4{H7-z2B?39qazY3vAGa9T9zU8}q~2Q(QHSp?Ulh|~_BymF_z|;Hoj#`WOc=5@(-1#n5w}^{c|AC|)JbDbMK2l&)FL=sk$x@>;0x+6%0G7g_Yv zgFyL>5BCw^gp*1Y9LW9;w#pqsYWm5sDeJAe>R$kFvz-84`oj=V-HB`3x;Tng`(G*O zz@4-0!hvDsx%hSVbO1YwV!)D-La%z4b zHQoI4D~P6rDZ0n^L)M|18whnNz@^{$+DLjk`8LHrEs7TL3++VVaZ%bkCE%W1bdcMh-z4NO^J66b6?jul4-)c(gSElL%T-lRrE5J5qtO9@4K@12Muy?3NUsVcp9qJVS>J@n9f z4<$g7`{jAp_x^f+Wv#pJy_vaZ&Y78W_UyfTb?XuGLF6xH3AVXq&r9-qYw`xQ`mvjJ z(1oQz>m1bqrjKXqPebYe1B*Ayzu!`iz9*W6K}%4bc(agYLbdAj6#nrMWsI*gG=xcu zA{2ORvoexesD3Af7^@!Q;ahhlwB7dio?c2iCU^`5Y8f6jJ`wk(QhGL{{<#xBvKz`U zlF-+1_wyQ)EE;TkfP`$TlA5Sm_D9KjVi?O_ zpqkKn#Jin*Eo7klJEf=_dEb5{!f18+f;+?>D4&{TJ)48@_r`S!YAuEikE6KCZ$12W zX$zHGenflOf{#>FC-gJTye%F7qn9?FBd|FZEiBcEOWz8v!A?cQY_YEHB_zUW=&%Jfy5iH5LF(5chLK_ z9T}P(8+8)FQ?dD6gSzLNEBzVs*Nt_DP}aP7g$t7HmR^@0){4oy zJ6584LxZkwertSo-!frLh)Clddy^R*>cirHKso-X1oTBS+x@ZK^ml;X(J3{Zai}t3 z$HKZTXmik{HS)(zcO4mi-0_sBr$X8l{DNp_8w)Fpsm7b+AU`nUA)BsZv@WAzuBQ!? zmtk5_|FXW_BwNH1kma^b1QEIXsDX#IE<3Oo{ka&bqq8e0X8q-;OrX#d#A4HlE)pxG zTEY(fqcwDqX>DV74(}57P@_1isrlY;Wv7$W0+qjA{o6zeNc z@4Zq=8&$c{ApB^raL1vmJsgm~sfg#qV9GNGZYUnKY2f%u*c$u2RG7~QMV7g3$nqrL z^XSCtfqFyNBOsh);(_p$%IvByBm$LtDBLUlF8td@?GZOCiR}D&9bC;rdMWZvyop0Z zuQRba9S<`7&V_HY;5jE=wu5Fx~%;VU*+hGdsX$nR`ZU=w}eZlX8}ivpKHc z%S5BY_m9^20zx4Xms&C0uS&UaP|DQ#!T|xW-a^q7d|G=PN$6GREyYp@5}Qug0NH|0huZ zt0sIACT`4;Hk4SklPqB2oQ6>5<$CLaxh2=@cRwF&_z;rfMyxs?eAo#hL`g~Hi%jVXjEaVpP4Kla{S*hwIwbK3)zCx9q2XRt);!8 zc)2LQ;nRv5@2crf&5HT1F-@FL*w-G>p*eS)c%pW}diWJpIi`+hvLoOp6OTf;1L^MJ z(w@_0eH;0hP}i4Ki@qxr;JQJwz2&Ld&F~N#P|D8kw@kedn9obXgq?AL3&LaVRoqVH zl?KaOA#oRVaS^M37eZM37Mjn<#mgIxdP+i97vq%*8SygLg{OOt!lFdmzipKe8CqdN zH@`nm1CE~zx@F`n^g|8(9NetJ&k?vb4T>zu`Q&+e9!xl|LsCl42fyF@! zB6FE|YAavTo`p0f_Y#-hM+C+aUL~-gNGyJb7PF@{=a+Ur;ESteJ@v4P-B0)~asWTJ zy#gt$%z2(G^xDTWsElHbq>2lgnaOx@j}2I$GQGlI9?N~3+8}-7t5;u8y+l!QkfeFl>fetM$AHU zb&}(@9%%&zjm0j}wu#)-O=1Ff*Y{mf!<;%PT%+&PrNnfh#wA@~U=qA}z}d8+_tlaT3B3QR`8+46L1Dl+uCn$d1N64C&UJ3rI~ zmJYT^QE0kPh7xusW}Y+e%=_%0ua~)S>i(PFaUa0e>i>#|FOoTy#EDuSYR8J1YrH05 z{1V}_Xi^!0NZBMs=~6*NIcfomE9C1{l6zx#ZhT3)@dL_W0lyLrqnN@@QM|7a^twh( zr>z>#@Q1fh&iSa>3%6ywu)I$*xcwKSpNsDG6nr=wJZNvn4wB}16AUP)xSD@lGD_*TC-Mq8cT?cE9n!OV;8aCwAYPrpZyM>UeeuIt(23N-NAb#6N$wx9lH5%88NE`xUOo76pYPn@N>&JxQ5jr>=f zZtBItL06vJ#9mxFZ*!ssWLeI-y}xu+9c)T^ccoqw7u$+P;H`cT@Q_sjG-0<_C5U|} zVo2QYk$2VHwvpV}C*WGg&VG=@OOXb}$67~VeusP>yE~*e5OMxCDu69=bQJ~(bhL_d z{@dUHr9k0-dv&cgVrJE5WVgpi06BNIs`}-NQo(i_`pts`zH|CcTH*&EULIT)C0r_PqfU**z5^gQoUa3-2G^cbtwcImExG@ilPx#`e_WuDz>q%EaC42oI_&XwGlec$ zVYma$5p>6mS2jWPebAOzrmw%)&i3E;3R!!_@XP{v99+9da}KtwOs{pl8nhze@aM~w zXE{~H=p?1E^R;8BO$w~fb}48D>1vG|ybu}4^#*NH>;ijp!mk>aN)yB77Ksa30YHH3%tKX zRVgWtH~L_DPmSy7Ixm7Wl`aMaH2)we7_3_2CdbtM+$>2Jx-WQk9g8xSt_w+l7|+hc zow=@&8HAJ*&Ftt1W#i7q>Xy8zZTHtG$`M?(4Wr!W_0_E-=9r9}S~pLA@(VEE%kv7W z6w=+1`U3qcOCIDEk{F`6 zGhF^}c!+O&4{s*fB0WoL}qlu&!>J0tUEnVVDPlgT4-Fw)kp9BM#g$PQ^c zOknu6X?OKt8uoD71i-wpGj?g%mBYe9kr>6Nl$zkW%d3vZ6`2-aOX*pZ`!Ok^-A1$Bip0@B>#n??|y*c(zBO&(T=@ynZJ%%pjYv-Nd~3?DnDw}0*Ki@ zTk*)JYR*=PB{IOghFTxo`ctOLvmI9HhiykynE!AA;1dT&D*@d}pp|=}l zPiW9B`t3@JS@))d^+8ghXoYNuV=2euDwQ}#G+{xeV!wqR#OJhJ8$&R%75h-C7db$X z`%#PlG{*5-rKO=#K1ju6cGE#2mXOfQHtSsao>gJMUHi(Y0m>?&+lqQ1dJyM^_O%YX9kOe0YBUkc*2%x^?cu0_iJZQ9sf)Dy+Kfbw$jwv}Mu1`liN?1NVkX z9Bxot9`4rt6bsoLA1nPR^xXEGcM5O3w|$ZRB*p^+7Xp_q&rc%BWbPpxp8AGb-<=8{ z0q6-UC+-h{HI!yQc8toaz$7aB=<6=Gh3SXxzn)+9JPwMJCc2kW8^W)nzX?k{a}W=X z90~4gi$t`z@H>$z`~=#i=1d{yCyJwC`?tU@?!i!;zd~0`I3{c*+p9Z7!?I(4^d`gUV%wa^vfzBmpkAM6r_t0iQrHFe(@C z5&%8-8ka_b{lj&-!?$IS3H-wPUY?J%r&0E3ypPC3i zjZFId)K-aSrj-ctPB;A5iyNlr;7?EW9r;Qvx$0{(Ytr)OW&uA?kB^hsLF4L`MwJE# z+qx}bd4FEK@{^+lc%k6r9`$y&<0G^9%!N>4>fJFthndUX)u?eE%h{?Jw|`A9#${^= z$hc*{;y=1Y=Uk<^t1(Ax+J!9xHX;k`QQJg<`ZDMUnZ&SRpjS{%ha&Y z7*~r9wlA}AzSEb(EtoOhfMdj&n^Z13l|Grfd!v?piT!LyPH5yTR7bBOEJQ=G-xt$8kHL%s}Q$L9yg}B9fQd=jznw)%e-un+zp&z_AmdTh2+NW#qHrGlmcEb(4iE z5)M#uD@=W&4Ab1Z_!|G`n@MRj&a;&N2;6v$W%k_o;Z zdLUsJrYQDdRH+8$MD+32ael|1r+{F!$bo?!MA0>Ak>9N%ufM5+>d@dRn(FY@<&!=p zvEqE;mp=RmuqXSLavWy&Nn$d>rL7mKTOuSu;s_$mB|d}b*7A|}cyr9Ud*GS9u5vCo z8%hCX_kSY_Pbyxz1IlfHC76S_xeAozJo-_^Y5%9Yj@c^{X}yaoc~`pV^Ganv9H;ao z@KY27I`ks%V4g3bdVd~hvsgqYt_nx3@J{1>9 z#Chb3k#1w4G}3S@Gs)d($}x4E*43Dr#1f;*;4>Zb-iXHRqbdcLF+UBjW?s0Q%65_0 z7-YSQT5;V%bj5cc(AP@%X_eHZ4LoqO>bacyJI7+fpj5`7+B0j2h>*SzU5S+Kr_KLH zo=O5F|D#BwW9e%+IB_h>m7X?ZtLIi+JuE2LP%&9r>7>ONS62J0!^n7^J*xgRNmRh9 za)}Psd`Ge)F=fj`I6r*{UMPT|Q|-Q)&2v3? zTQaDI6tD_%_X@}3mmrSqV(bsHiA+3A&cYa?g8D3~vZobW>~cS&qxhcK3cq+2dZYO% zQoyy%U(x8H!KQ!_?(rU{!i#rZjkI&@Vd!n<*I-fV&6~w?9{ z+rt3yIa_8(^#$cvR0fuIlZ<_-uN#-37y_R9&;nA_e8Dog^4!Yc3X-Pv9H+rwBrs*U zT9!Gk33b0|YOo1DCfB8o5hJw-UD8qfq(rJntMEBK$@b{vvur&YoK!HuoVl@;nHw)c zml>Jq80x2nU{;Z5;bVWK*6AgXfp%w=*R5DuO|E$+_|>Rj%|W9gmO&uUoOYGY{5Jl) z@+{^lTWoO{wUamQ@AoxMq0LtOc|62cU3E&S%Leo9ujua&B;~e=2=Ed#GAaGSYKI3; z%Sxa$j8G8@yS|!`t^wB3e5pUSAv5_z9mT+(xr2K$F6t>WQY}CX`;cvZL7&;sJ30Gb zyV3pOR!rI7f+enE3-&KN)B4@<$6pb`>g`WG3=wNZosS)YPA*I25xoZ~r%=T;x3>e3 zLpaTe*jpi|(d-_E+t^o>Uq3R9e4$ML4!DsUUZ!8)s`V6+lGUB8mgkhb=4`!%`%7jW z#k3D%63?|4ROal6jP3oC*|SAJ2~F20V}?=^O{`pt4=&a0HyJ9l{Fa$6Z<7!CV6ZFp z4DwGQp=ZUhl8^N$9FZ2m@$^9DiRR?2^2_I-8xi8(DEwWsZ$6WFw&pId<=V;HW7h~U73C2ab=~cCQ*|*!x%IEP$2X#+z_C|f)Q?N)J8gW|VG5n&5+BE`Y1{Ic}Jh$yVvn%85InO`F+D6br z$*8iEkrnW#6?>H?G>i&9v1|b4%Ncaa!Nrgm7bEzX&KT0w6u@-!>=I*aduNeFAx7dB z@6F)1vE^aTaucxePo|R0n-3V)dBnr)0L)&uXEa|jjeN6au4B2W7M6g0{w3J^ETRVA zAGup}WE=f9QE?l$4Z6!fB3n#Oes2YjO2m{klynS$BI5UIaI5BV*(23_uk_$9^0Z|; zs3+EE5#*1lWHZA<$Eqp~t&tY}j~z|iZ@1)4gO4IsixxFmoFatxTqM4?t#}6`{Rekj z3%0K!cI7(mj-BDy0LxF?k2B7Ggo#^kLC-1m55Q`Xy9lqg)TLAV9OlPCGi1q9o^N^& zg2Fn~ZOra0U#=y*D6VWd9k2(R+!JoTi2jOeZdhf^5tg^*5+ti?VU!M;x0JbUcFz|h zYr)m1!qxIpThqK-wQm!`YV5Hnl>_a3o;3m{p80Skw(=y43;8Z@W~5K;A$JY_i+j#( z3F7ynf2xz8EwjF8U1!cNT_KEr!{_gA; z&{qIV@ zs+)of)#|ToTjpTb2_iSb5cnVhqBNSsPt`P%?u_IP$y;<*xKbId<6;$P;Ob8zue<={ z5Gum+2flzNVcY_)A&T_1sZaQ2A~TPz&E2&*NZ7!iZ2?=eBF($b$J)d|sg>K(s2oU$ zTwrM~9If?}Cpw=AuK##IKT7g?^Mmjk>Q5!7A~$uSB#L==SBw+`JK`1ZyFxv18P3sk zuN*DyZ%jUj4~#}AHZF{8_9*=b)#6Fr{yYP+i?%v>ax5dD_uhD|!Cl7h86m9l7L4??7PHIV~#8i6zj~71{mbeE565aAw z4{~Vz_ceP(WlUd=j|z{8CLv$EIHj{He{ckabZaJ0SPze*<{jgQ`RIpyQtAP3{ErO2c~h0k0+);UJ)s~@D~ z{}|{FPrGxItbgPMJyT!hqo>RCO(Nw{(p3@_l6ia!@%|#czgFiN&xv7ZbB~s?^$5WP z=_3J$I(2~{QXJ_H049an&WqICl=QrFyI^5`wTcq;-19}C&Q>u#;uMq|(s1!AGvE0~ zbJh-9&N747{bmwO#u*~M7<3>?6C>x6e4NcT$h}PrmgA`+rew?<2A@pSO)}e&xBeDB z;}zN;p#d=+$o4gaCosHijcoCFM^$iIXmwQGri$Br==165<7f2YEMiDQthU?mnIf z^X@}4ce?m$I;M!GXEF9}h_Z;}IO1G}NQZ&K-U!eeB}>I0btxohWS3XFJL0URN5rcP z{}xvK+79m!<)%NpOem#!c5EQ$(2Mej{^`$8p zs^zzvf`9jU_}mfu4jRAr^zetyczP3+?;h~y+Y$I`5pf|yEqkBd$)5lgRnB?)RTgKL zusXIe5w)`nf#YrJ#N7>PA&C& z^LZ(JmO!6-5|*A0wbN6;#CpQM>06 zF^L`l2KT&iU93#f9BesIj-nZLo}%xvRZt^|Z*jtm-d4cD(Pn-~OAQ#!AH@F&q;w2F z_i!vkv0(*X|F!ZFn51zz2TzH8e@$LpuB(d z4^JXoqdLcr`QQ;0Djj9<=!8CRHh%0I{p;7V=*D zD1g3s3y#{Yxz?6G-+b={pFg~gg4_}QB-}WFhC3|H)`3T05SQMGj`E{RIznN>4P{I8 z#l&n@A%7j0pa2ej2?_g3C{+LXd3*OQH00QQF{z}ee5xCr^4oZ|_fk00Y!)gan<^&Cwo9z!2dsnX0L_}hkmo)K+_@61&~lO=HPLOkX6}_yFAY73q{ZZoM5g|PIMf? zLB6*J$X=R#=bAXVJLuumdIJj+elulaW2sQkBVq2&g(~CSlATaR$!oa>wDv7{^u6C; z_K=zdmLzwBb5}ipCOnq&Is1!Wg)wEnZO!639?xwm5<~NW=T)-s6|A z5I%rm*+p07%`UopJj>jF(sOq%-T@4dWD9j4z85xrGm#Bq5kg1OJs-&xTPy2s=Pl6v z=6V)mN2uYV7!c97+=bs7F~;(rbyt=_1E)&wGN1V>aj8b;dp5?Ke-PZOJl{G(6{V%W zukOW{%-*nr1XW8=Ie)mmikK+JYB?C04HLuPK|`oL$@1(cP^0;HW$3~6lMlB|XW%6W zkd6ObP2SFVuQp?Qq)!AwsSXatWH1{(yv%K18LoWI&sG>;Ni$hoiiYV5?m)iO2Iy9~ z06rIB;`e;zwg}~K5Aqal6;~){QaD^$PB$eJ5x#qe`xC%ZmJ!Me ztmbUcS)BDbPtYexz6~0QrIc9b2i`lhFai&l5nE?MRm|0<|F!LD^>oIMG7`Pq^My;; zr2E)I^@XlGA=vu3R|{MNrm9%Q%G2U^6QSJgTXOi2Hkq{WpU}Seg@2iSLd$fqK;Dd z!ASNKJ^E<`vcyy!QupxK;P?IgD}joXyx$q(b;K_}iB^&M;)W=qrCsthyL`%bpgK7p z0q;FXRp!ME^P>T3lx+2DnNkjOck0(dn({PpbIg9@Ar!^`Y96FMU;6I&J;acZs{DF4 zcd1lFJt@5)ia=JF;b#>rUaTD?rT|Q7Y+DCi^+~F!@hSw3gDCy?_rTADC(Svh!%K*v z9=y(dAF0Dw(|CGNa_^^)sV>|2VpN`$epvmy6>tbO{ux#<1s4RmqMjja5=1*=yC;wLENdJhtjQyck#LK?!WD&9xh)WW=q z9TuA+FU_6c!&3IUS{C;ymL!Q+Je}h;cc2z+vF`(>-MpvV$XcyO?9qH)FFc12zOZ0r zCBzs)HE$pNzBgOMiFgfdI(`yl;d|@dqdPT4%~FNymvvOd6sBOd2;mSfMf+J^8v&Jt)kpCPA?eA zD&Dl?mV@AduK1!;>l{ST%oKkr=JYrw;WDLow{6P|gE3xpzH9^?N8@#)y>tts$kKULeo0W%-2F*)^VLJH#OKLqphM5b=FoGvUAn)0nb;<|)%IVR zq~pK$wKo40TZcAYVUMliDFU6^V~hp@_lKPwvVd}8*cv@yppWds^#$|l#!>M7-sAkB z9u_SZ9arNzk$(jH+XPN#hUY3` zB-bMRO3~>NF8Al3Z}o3hb*z%QhoJhL)AnF{YDUAKMTCE#^SAFnTb`OE-~i)t@ad|O zpXIgqwdKDBca)oOhrna`*Fe2p*AqO~B~RG_KP_v@xsClr)V@7s$M5^a--R<=_Xpq1;)a`q$vG&R5Q>{1IA6?_# z>7x%pkOy;@P^~;b$GCC9t?UbY&9#0`hz$Ohr1{bYHU|a)-qn(){edtlig|m`Ui3$4 z=O&)d_b#_&GCj)XKwIh_c|!19ywh5ph8!M?>p#QE!4-JtPkuNny$Rj&IDpQ%UZuM+ zvlGt~Ykfh*M}&U)y(N2v<8$@?a5a9{c8K=5=E|n+UcqV(c{?+m7ukk!U5GAli9ApFj49J?))O>5)UR)U#5d$ID=ts@ zbS|(^*&}a^!a4(iZr3|vF>JVL&G4+5Pzp_4Gd(eJ)O%unw$23=#QG$t6`Ymj2KDwX z#gUc7@i=fo=6^aKPuWz$_-4##o<>Lo4+A(5z9SwYG!Kh|~1G#&6E}eq{@`U4&vqJi3*8g0v8uvU}rI^v~ta zU*{khR`{gm6=?%~tDs4!E2CEG;m54t7hcRz2=uxO>ciG99^~UY&5layx=i*&F1`bo zUt);>_5)^LND~Q)YxD5LA46}!3?2E_bt!Lo*rb5uJ<7K6#TFk=xM11f4&e6lKQ(IU zw*r-K@O@%~05wxJck0dVX~%h7!oW)(f_nGZqcZ08zoMF4r13&9q=6=@XDn8;mc98$ zs-xDV^!=&$&$kz-vOPW;b2a|7TEHhwkWkWTmWC%sAKhtlA3983jA$Ie6Xnt$wJvm) z`C}FE&T-{C{^GurdsOSPf~D9$(|H$VoLU);kq3-{pr9|vc^iws0h#IWG~|m>HYS~o z>4B%$`>%3#QwKNwm+L*+Gms@Al^QIMbM^Vnwep}R<5F$$P23fP{k62oOWM$Yr4sF{ z0q+-H<^&-f$F}?jKAkJx-Owf9hmBUbxE+)B;lX+yG$85DDG*KfIBjPYE>lr$a-0S0 zJ6jz*#MB2}=a{a-GG9?le7ZsN4BxQs{UW!qExr%+BUQ$_q` zo9RNuBfq(#Gq7Znx;MN3&kC@+VWoAwzN}0OPjQ`NNx49@Y?0J?@+Q+Dd8{Fk<3 z3|lGS~Tdw`e~T9vgs&qOQ0}VGiY-K89-*Sv?ak^!w=ft`6{FPe_C?u5LK=sPZK^43-C zE+50d83*=zKC+j6QFfy`b=05Dv-ks)L~a~FJB5RZ=Nf7T|+=Q_6XeEi2*V|Ns7u;mQ)PzHnf z`~XCO`17*qFB`n8;Vw9H>p@UWvb6YR3mAIp@IC<0fz@x+mr2h-T6Yva42LDuS-PH8 z>%hpyZM1sn6>C3~YAt4(gejnI`BCej#5>0y{jzy{k`(sXug-)^RO z`Sj(*%?8Z6kJ9+^Ztcc!56c{Gop@xap12F7+67wtl>PkbS>%Q8^)@%6z9HnlA;-sw zmfd(Qpbtnq9~6SkwFIqybv0;#9t|H-Lhwtrllzg>lBNdSlLbh@R%~809Px*j;EBSD zczILy4#UXc#Rv;I^^VIH$vne&D{iaw-BfdAMJ^t(%8JI9fJhOm(tk8CZ{<*8W_2GP zO_eNr;QuyNPZD#k^9}cDOb7O(xx^zl^gkL7sI|q*=v-hx$mo|P^6~Y!{v)xeh309o zB!;oeIw9AG$8mIuXXP5L{d@V?O>=<|@F)~~oJ}Q@d{FUr?>-X5S5H!kb`@oTG8Xub@_ZmnlP&wNR@B z9qM)KJ>yLGp(b|0&ciwjOmGiNnQ{4{t9sPUG-ZQzPj*bRwzXilG#3e_;mfJceK(iX z5Mw!8gn*^hBg;FHMUha>f8Y?36k`&!v;-VB=!$CT5kHPAxCM1<+7UD`VVMqH1s^5O zhyE}Q05&BHNsbcv&@+b8m|&@pt{CHfkAF+97v*jiUtI%|18wmox4HJ_fmeEL(n;SY z>kD>KbeE^jJKd5=#`DL43-^v$l2ED3hmvN#%k;BX&QCY@{NGg3u?>nc#gvZ~FSo&@ zNw;>f#T1pT6$vOYmQEKIOM_HQc5y~7REG_zqUX3Y7ZtPK8iy6^5-d^So%b`BpQUmg zL0>DfJlsqlHm!!A1mk*OC#ACg!Zd4-Hkd#`f8z||se2t3md_X7@0JEM`M`Z*r5-#? z7vrzA8lJ#ifhpk|wtS~o6N4w^%idMl6d=X)w#U005O@R;oIod3buS2Q~v zB*ALeZ!_s}VxWlw_`5RZU$AtJ&sGzLIS5LV6r*awm8kVw`(h~_ z$!v{-a#jEVoZAyy`>`3=;#oY###5c0PC<+DIXl!IX5EZW^>pMU;`$4u{{@=5{_%$R zFq8D>%^z~2Zf;zpzb~=`YVc`im5Sm)`hI4AGcX1rK-muz7+aC{q-ONac1kkG!=jB> zLk{KZ9RJo1rTi<@sVpjO$>=B^CSY&)1uDI)j&mECJ15C)lY|ZsFdj;ChUiAe5%6jKMtMV}0 z{-zDdnXv02dKfJRqzB`Fo}FzWp$-N~A{2k|UOj1}fXi=hdDGo0Q-%np6dS9MmrpcX z@4o#j0V!IG5X0AX4?M-wGYwo)k}t3Fnz1b?-h9Wl&&>^{1xmQ*Lplh5Jq1C3rE|jz z1nRD7l4XfW_;2ZFNcEm;b7XP53JZh24|}Q<PCGPq6 zQ`(-`jFqA{`xRl;?o*5F0TmL1LMUrHXgN~gEx-YefB4Z7TCI8vhS7^&V3yH~p4^Yo zs9R-24_TdfBxe%n+WGK-B=zvA-4(zkJ(B@2(807_m^dy=+dMpe$U2nrb+0#i1+cus zI$t_(W>YT)*nLy?&}c^aSG=e)J_d_^@uQ;Hcr_aC0@g2^KvRCry^ercWcVT@ze*jw zx$A~7B`B3t!7F^$RTvb2^T?qzPDN4DwE zYp1pY-4!hx)_^&(Nbr1k`5#w;3_#Gc!iguqOh#UcYlAGCFy_Q~o@M2_QsC^$HK5fj zA5T^Tb-Cbx2txL>?nxlv0k{8^IA%d@#3{cz{PBx*9ZVcboPPSk9k@I-)A=?UCNaiRnwj)IX^euTpHq=U%&6yZYeA8jVsRTc7G86i zd@_6fXpHU=EI2{xJCA@NzyY6zV?dnYs&Qg~z7tmPKi8yzs$=<%8_U4*I>NiIyJx<` zrJkL@yoX{(H6~J%4j=NT(j&xb=QrC$@%AY>u}fhdmtMVc!&Em)$B6Am49<8CQX$?b z@kAg4cfmWCewHAmyGjoT;5Wz1Y%AgBi|(^6n@lFyO5ZEgqfJ&2@p9|e>%*gtqtM2E z7AdBhB#ON5I9ezu=hO~!h{~a(mrlO{B9Y9gJ3PiH<^%|9n*OrIxh5*04S6@NoSAR$AFw>N|JfHZEc|j%)EpHQuVOcKIS{IOhi0KwRz% zP}J8On=H)&hq`t2ni2W^hY^&&@9)4hAG|zwQR&mN&}dEMQA&dBLC%o$nhtuJ8LVdC zbjwD+Pit&Ijsb~P8MU9f8_+C3u~HyjN%|*uiN=GDA?Q%i2a4K^Inuv0K)~NigD8M+ zW&D-S&u&246ASPv5ym)(;GQ5KllvHxBui#{4rcM|M4M1VEU<%?U zSB<4zMU4=;h8Z{A>7aIMi`wrjs}|8j%UKL1Uq}&JENp+rQ zJ3Tm`^`S&NWUn%Ai2?R8YsV6A`Oi9zGl-o0k5JyCExXgj`Sl*MdUdf-CSV1y@9|77 ze0TU2I95$YY)@z()Sh&`i*ZA$%Yo>C2#kh{aE)aWlWWVf?XXAkPen`J~-}KQ<0c0He7Ao`G${ zKYQKeblju}Y6#gOUs*!FF1bB=XRfX;J1mtBicGP zVIBpQvuxQDjMBc==N_cU*WQP@(kM~Fw(eeM14{xw8m8Pw>%9J~8UNEIO(rAM8gDD* zpSua{vO%M3pc)u0;j31+{skaYPc@L%_wwbRpYw(t0 zOYpC+oNdwzmb+D>-~0_DFssaTzP2`sf;SVsrB2o>vyV~wJ(!dP9@lB{GnJu#I>$h? z-*iHTE4b;o`&=HX+v5Y*m|Ppye)ZVg&V% zKi-f73|Z+TY;6@vHp@ofuJ90xt&iWE-ZnV+d{UYtWV%uZsOYM&_~UV84L4PPWH&9NGse@5>|T0Xcr^>VD#ZeqQ`15CcL-|d{vS)=pdNa1xB^(? z2}`jRX!PCkZwHZZ56+)-==2y5R_fNZsXDh59UmE?6;AV*V0{-plj#Y~8z)jK9oV&j zH#GZ(dxU7Jdi~-X2A0WD`|>oKdE`a1LF%Q!1}J2HU5I+&f9A4155v=hyQvs~;=VoV z%{TY$IQj+D2@_poH>w8z&_=?POK{iK2s(HrFwP;AMNJ4NmeE7(_2cn|PJ}xLE(w9< ze?m+_4m1^A*<{K1b{LF`-Gt2)5Xozgpq~)A@f1s%8R7nNaI=R!u8&jYdJt82^Mx5< z!v9+dn&4(HT)HiI@|VWuu4s;4=A9T^43KsiA(LcD81+8Xp-K7OkeG}s9>IIoxbJko z97!EdWVrs;;M38R?zes8ej(JN2%w!N>TX(V9N(^14xcry{_eXe2q0)Y4Bnz~56^^( zXlx$6Bc*A~x;ZKJZsmI!*yXmUiV<|+>Vd7g5tJ)cWYO;l-*E;{6uafQg+9TXZa&QH z3sw#N^{=p7*$6s+*D|^W-zI|uH76B5P_@-mG(Bpe+0^e%8L*{QBkegKlStqD%CivL zkI@%1kBvxNdb^e#Iw9de|5M#Z?=#Pw%Ii2y1Yb06Qqcyfp6+Cb)e?NW0h5VrQO$zZ zJrk@*#V8jPPJcfxn$aZ8Vw%=CZQ#cfc^|3NpvZJfeu5z&-eG<{CMyIhFfw%u&Pxwm zrC8e5z5b^)aHZkOw_ADj(g@1!qdSzik+|eWFow-T$+)jY^acZmps(DQ@x#KplY6== z!uz@_gj>0fQc+;9I46o%Ns{YVtzQY>H=9%BrC`N*`WZ=w!{QFhdNYIZaERwgpqa9U z=rWCN$%EGqWJ@2PSZpgCQIJL2F|>;*BIAM zeS%KlRTVMi?zW~Iq=wQ9nz7Ok!6-MDNI+)6^^%?ZrKhE_I@M6b3^>m66MqjfX}kJZ z>)iw0H3Pwi>Gon;`qivxVfR;W^;%SVc)avS@1HOTnNXP-*WK;J=o)gCRd0O#Ub){Z zoGj)}5KGEuS$IiI+KwFxOnUW}ug2+wM7z;op4>sa{3H6~w)nFR9x zk@#L4Z3$QcC)c(6^8+^O#$V%Y?6aWOIKf@vVogdDsG6s^(%Gx`8;~rh>)K^TL&G40 zdq6vPmhWSO4H)M-typi7fg0zl;ohu|Am4XG#`-S#w3nknfAJzJ|Am;9*gm5BwCwtf zS~Vj{4}Rfts9td6N8Y(mePYUC(ss}uuF5h^6InI`UBmpaq!zzF5?L&Ltnd1Wztx## z8zQh<@M-Mj;o}z59+=f8@uSQ?vSpS}f2zoI{Zd;05k`7(6$?!|R6f~g07?KHR~B%K z_>>YyP1$kXe%N9$0bS5uYOuz89<(UkwW-o{tj?Xt&#@?Yv)*0Sx&Ch-TKCSTWk}No zEX@%a4UGPuMn&Vq$E|(%@w|#F@i#fsE?;W7e6|IeXMpQ}fQ^lR=4N^sx)v^Cx zXUzQUh8$D-(lQc$1EN_9yHPYyaY)}Mf~b9tMQv05e{KDXI#s1Mx!E9fb$>!qE1j8!5e@j@h}buD}H^iNTL15465kR`)Q!$MM92{{qkbmOzwY zzHO_yciSVo)JiKG-ZNfLq*&Cxk$QuFa7KeIgN7AHG$( z_;eGZ4c0jW@K+gC$iR!}O~@@0a&j#WdUA+sQ*LZ~^%)XI-4XCr+b}347CMUJmG8;v zkFmxMVlzMm-1zn+B%B72U$Vyt98>x{-i68le7jI1VDL&f=D86NxN!mRNa}vp6{gY) z4OiC-QXe9HmJ*s|nBBv9V{HT91ar5nNWP1sAc{ z_KQV1a(0Qk(9c~D*Gh6cqGMfIhuG7#EOw+16!<&(5c|*OPKPi$11Gb<7baQQ(}WM2 zk3dh*wpByIKUsb?amFtNML!p>iiIno7ol(R}qpKn;;X{%L^kT&p;dOMF7f-!-{Rdxa9BE zq6XG=DDxs*^f1^}9+o3csDteoz#URn<0StddvDp*X7_iC-ZdztK!M^CoZ`iuw57Ne zcT(KlH7zYx+)IJdqD6vhk>KvdwP`e37z41{6)^NS1wYqIBaXp`r0BbCyESQz~w;HR0MnVgi)fD8)Kia zjpx;4)Idk5@Tl%dN`ST(;}@)g?j)_7!31srJo<1z_>1VfkK2tbM|+R$C?qY)0$*UL zG+sM5^U40(6$)&@NA9^-k5ZPuR2STN3TKXRRuzRCq+4W|)&67yl$D{HzS-4Mf` zX@N7E#P{4fy@cXV*%J)wqmlU%A)knPenA?an7XytQj0q2QNQ%~p?fWb6bK?(Z+w+c zDd#oHelIB~c-CDI`e{QYy8RJ1EA>aCbSHzg^TY>6S0qr(byd%C(>iIWoo`#wO?p*G zA8#t|)`JNZrfQ8Wj_muUb3k!o$fJe$OhYAksc9lQ(uY=m;>s2Pelajd-)x*g%%byK zm2>5H@ZPs<8flYI#4&ISL9=07ar(Poq&v2@!`mj==3QNK{QHMiS~~Hf-tDr63Ee)% zuyq>y98%0hCe%pX;WG%eNwp!2JqK7uHFb#Iu=*|U1g#NWq$U+YDXRJ?FiD8n|SETeSaa zJ-;|`P*%!k2`7!#FDGl(yN;4ZDRl#he)MDB99nE$Qj-LBZ-_%6Utw?aDWv z*gY=9ILM~eNH$wgP460dyBXUP{)n)mJpQHKsD`7r?5@ggV?pd*m-k*^JdK5 z;pNG_;xK(I>%HTA@tl9Q%66jULOdk4uCT<*?$FSB;^pfvhzVj=(E#6c)1`akN|3Gr z{N`B>$0M!!eoM!JJef4{pBDL0U*&7f_CJhXC_VRq7YqmQ&h2KvUEL8IYM{H6guFOA z){p~SU4qWNO;95;jd$l}pYNRWltJk_KbD`MiqGsvSp3H|=TYjGa~`L^OxEW8pyT(7 zfpti5M+YZ$zh_h8KQ$&TN0`J6n;Np-b=jK*)}y)!xs5qfcZ&8*USqP3GsJ}HVmpU0 zd0Uxb1z5~&sYfDu^Vk++-S$33B#0oat`h7Pn-7F}iGf)5UitSzH^H`;qOUza%y#oC zf3joJZgn@Ssze_@CH47H0XzYWV2}kBP+PQyvzswEl`m-IE|yN^>n_>l)r_(QeEPuv z;n02NNeU^2;%3L4-O&f!g2pfI0ma`$RQbpw^V@<-P|SzK871pf0v5btNzT0aPI+gS zd06O6>wfh;C3Xc@{i3KVSd)#873YENz)c)F-8p3=X}8@O1?pMm9RT>7)jtb8J*pe; zk1zZ)X+HXhrYdAIC=Z*JjqsH{FB92xM0sNiV$I;$>yd|*t#b51gUlOLK&*lhA%Gpm zvQD=PXmZ?KW{aib>wozbtuTeR`$wRAl*&$-Z91Sg+3AMAyv$Z}=-~S~_FJb(&7c5ItW-**9b2Olgb*Akl1n=xlJrJKAw*2Ti!jLZet*N&mKcXDc zs3>tcDm+Umu}j%{I4<3D?7w!eXYwCGa-)VL3v}jW$NP#+y<&q`Y%+Bv$LnnCzke9I z23g4U?c5l)h=e$!ckYvUyuEa^+1*a6&B>m9z;zUNa(w|#D8I^7HJT^_@eP1P>+s3| zQek5a^Plw%joHoo5IZKE1M`Mh(K#dGaZW!aSIBB>4ZxxD|H=Y59EV0pTQtiOlX_NV zqGeMk5Y)upGz{e~z4U2q_Pf|XnE9`9%Z}Q04DvIP*utwrgAb?^TJVLXzig=r(hlRU zi1)FqXy+v5)N5;-?515Dla46ag4(Ez32Z-|QLJl4uQSZNtzF1QpUMUw(J02z({N~h z{eky7N&q$V$ct4)|J9>#!&;`H3O3_&a6*jx34;j)#Kz8+(7|_8e>7j7N7H=Z8JB#7P&93^`PjKb~}0Q=Qb zk%~A)%$}7ks;{mcMw@vyR+k=zKI}TDvPMuBobBdd&q!mj_4t73=polXxKvP~zIC|; zNBGx*1mbnnoOppsWy{^cSx+67^J#bX_AH{r@9_9APrc+9(LVs|aGmwKEzovruIsZe zXy@;Ss0kU?u`#zes4Z??Gsmj8ts9JA$nDjX-sTx`EM4S88u2@^7Xe0uC5<;PbRYG3n|#o!?(NGD9-5$mn5M^` zPnr8u)07SPiiL|Mfv!$MhKdNQDxaTuPYg$=#_rr(j~h3*&0eU?MaFZzRFmae?|at~ zoz7$S;_Lde^*$ zMMB{M!@B>27LdT+cOw1M`SC#yK8c(}hV2JKGPG^Zr1zb$R`J*E;ty3VJX?2gJUB2x z+dU3=lv(Wd9cwfEl}o(bAmKK6Mq4SuJr|)7+*za*;Jeo5ab83frK{CP*~pHG%}%=} zsaw#bzd%%|MMl^Fu;su+U101t(-IN2~+gI)Qeqc7GqB9PC#y*TNl*EQVy6}z*>6ny|Jh_&@?i~Wl zYzqser-}ITk2FUsi){t-iGDR&7RfOYUjJg&DT0`fX8z{RS8Pog7SBb0R{&H{>WilT zjW2{g&2b*Gq}q9`_tGSQVE~vQ|ImtRs>#Kyu%vwgd-2aErmvF2S1)P>)B1O;VBNys zocc@C3=6}Dz^V?~{)EssBD3_1}_LkzrR} zHBc+6mC|IpaJ+EDyI-hTo;G6xlV*)12ZKLstg-NI-U?1)*nNTb2FanOQBMh3sNK>Kg^ zVbxzvUrt6)Vf2RCG0qjFc`6AHmTj)BN`Q+h*jPCX|%V4>&FGHe_)lHL7Y z+)RWN+ydJ3M}alrQCFithaBEUo@>d{6l>->U6!_^cFutfznyxU#LTco4PX&n{7d%}vpYtg zphzjcqq%c;_Pje8eDGhmOvX#i=%|*=*Y@{jD`lhs^#Gg{({$NF+$XALbV0ARNzkz)moj>kuxnB0Bvavt{i?koJAf`ic89>84f z3tCYn^E%9urelS6CK^mUmqp4%yI_=UR~o^ zzAO2ZbTlD(HKVH)!4*wPxH}Q+B+0xnVkd?cde?$a1=n%gCQIVxE$jxPcmc zVIcWR>9q-Y;zOxqAQ*#sN#iVS-R)eZogtBX@jMBCXCd_*K5Gc;snm+hs;5Q?{scP0#W-ZDA@p{hoKx36M=f_rJVbQ-UJ^n&u}JZoMefAGFwoJQm^OUq($NFPU!BJdwP z#fBt!a(jL+(%Vd2F75?*Q+g+mfekaRl{%6OwGc?F7@d=OA(-#xq2QwrZ3fv3$oq3) zQz;6#12~F||MTD7PqW9r4=Xp$SQDOcj8_RG>MTOIa?a!bOhsl2UNvoe#1CaUYCV-R z@VZgKY!9XOXh2)JP?(JMsB^7E65SGYA^|8$XiwLK&Xnc&?qsza310`&d(LcFwp;de zLFulVNGwMpi1FU7RgQ$0WWAZAz9|+)>u)_{3_9!bxEvGz#OUYn!4c#U{%k2(oH~uF z6d9?jiAa3uar{w-^I=eum*KWncSI2(e;boo@NvV&K7m#b=Ub<}#+tVf#2EO6A5|_9YFUZW&SDM5Wn}xJk1jDVjpEG+b z*Za$tJXiz&6G9@Db(*ZDbOGuinimK|#9E#^Hyc~$0&fW{e zgi$gE-6mJRzvq?_ZU+&af3oa~oja@aZ)42~yW6*1Wj_3tWJbpBJnW3Sx6Ext!X-FR zzxg_`DH3@K1&9v>SR4E)E3Y6ETlA@`p3N|g>`9d2r4L&mwY(Oci@r$@i%l|1X_~7X z%equ;M%9jV6P?B55U1=Y1%NY@^{F|DTnB3i%2m31faFQ=QB9PH-yyf*g?7*zDXcnP zd4w`oAZi(l&btzTW6k{+XBA!c`#~*@nZOg3g%j?DlSb2?2XNVEyNenR8V{R>%Pjwl ziG4g)j9?`O%FqYhT3QkdsMcz}xG3-L zE#b^M(Rq{`@oI@o>dE7>L((2!LcZKm_8+VxXU2>*DwM$hr0WN#LM4b(#>7{Tcp}~7{inD&uhm$&Cw zA*>oIRaAr|iHuD|C!j6q>lb+o(@g=$bQ>lXB1DHnQ<*zBdCm{A|Ds!ZL2r9xUfI>? z&eJKXYnaSg8-pEEYcbK{+n547(&cA1PKtFD&Y7~9zunrhJEETY5Vv@~}Gg z=Wg{hj4J3CX6@7uv4y=eoPMxbmLin_?s`Neg7v4lpGA3c#F23GF6l zBJ$FFJEDOcZJ$q_vei!kd6!%2-#-|)7-O{f+o}a!ZiBMI4zQ5zt?Si(L(Cymy+oaW zRuiLh(?t^cYsvlUd?N}lO}wMgz%l2If?n(hEK?UF0{UsNxw`kqvv|8gezT2nE)~RL znr@by#XC;79%iU*flKAfz&TnR*a!Fw&sFN1=IlpUrti(bE)+@_)=V0#sZd%zQim1& zR+qB1?wkOs&GL?ic}Q@yadXX|1-op>qk({hajaqj{ZznN7x*oK9Ir3M@(_48%bvFR zY-Ml03PgYTqADIsLL*do-Y0;ze<0p9>b31gR-W}&pfHhSBt&Ljsh|5#mAeCK-mpXG z@;pROy>KMest(oEjy_KJq!YBV(FNq{j&>Du52cmPa-&ls7fy_p68sN@8QzvW$9m-~ zoB*L;7x`7G$T1TnSkCL#cyt87(>E({ad$ltoHI}$B4LKL3f>Y8D%XzBgmsu5C#97c zSkC%Gk-0N#+g`G{@B1zWurNW; z!fUUG27aX84p4VpM$0I^ix}SqeP|JR-}%95)FaDS&gl?BhfNV}S`s(*9(!8pH|l&L z(0qpK|M2la3NQs6dn+Dv^{d}H5lwy=%t7d*WPjNDMWl;wJ1=lI>p<&FArYuX8%q~Z zj=QSnBR(6*nRy)@P!KQX^j=L(yM#ZV6_KW$2v)*ryn4*H zcB-^Bu1T7Ye3IS8$g(BO8oqoR@#H0K^b*ybj&}Xz!~LT?C9cDud^^E9raHYmD@D>QJWc?V>UlgRJ2NoeQ8;0o&HX zpDF2AJBxKaUs%xrp>q!B($x7t8 zGVvrd+LDK!8W{SxKU6O@Ls|s`PR)lMiOUp|rXGx4o*qlVTUgmm63!Zx>fo(CC zSlUIv$I4HVTA=j!QgaeuA6rK%B*!9}V9JA7 zGCi!bts%#oL7&b6-*C1OupLNwQlZ?(>G!T81U@Iqb0(593`c!fVDDU^^_urTCSwHC zFZ29dNk$Qnb8H+}uAbR-zb$euu;M|GtYBXS;IBFTzRi#AAzSVk-ysMU!&J(l!Mmeb z8~E$U*Ee%yrOucrTKGA*Byl3Z!pI2DB7M&bO{z12x@qbO-q_MDmT~q`qrzJBXMZ8t zf{d=XwGNu%bF|xXzPF$8pT#obs)v2DC-+TIj#Oa#F28kb7hHImUAH;p#`O0> zKgMOs7*#%En6BYzGeGaHE`e#@(r;b_^R89gjjH6u_*y;V(mw{D%EBY7z{iKG_LN(u zk%k~|S0n2&(Ta$ltP~&FpkHQF4h7h0KT@QWUGOBh1zcpDyRp70UuM!6t{sG4&jBNp zTI75^QRb}uvfq`q1@naw_8ajzTGsrYhpXfL;1zPM&+y|qt*?STjo=Y|xaQZj?>iS0 zn0vOlyoVnbM9CbvGJ$SK&D9efNXvwYBvOlvTe{YVH))+063D{b@*|wqMH~?+ZRYt^EHFO%1hhrjm(8&$5ah*qJR_wk8qGG+B)a0 z_3%8Clj+1eBX&mxX|&4Hz&8B&kASmddqR+%iH(q+T(&Pi*1ZXjkC ztRZ1R|+LzquuF(LQZjM69Gv{7iN$f@Y(a zJRuX3^}HlrtkXXgcQ|k_b%KFe=$=pKvy^L5OZg~M3wFc)Jm0f5g}1zMD7kbL9xZVX z$G5xhnO;b7yq!7|`c7KgamDeYxdA~IHnw_3;$i`v8W&82DXTlWEZg2}GlUdQ_ z3*W}L%%y3J3Z1e>G1)ju%u2N{lKCmEh_c&F8?R~i&Yt3bSi5l&F!i`3jQ+(vMu+7r ztVU;3#@gkYY)`p2D4B8RV)j{R_b#gv-Z)7ZEW-3`=WhNtrwlg+-|GBajbA?=a&I7m z!Hh^8(L~>%AMi+=KQ%G?p-ofI0PyN3NhI>b8^D=hJ^JZ`27V@Z;Ml*PE>*P%kKUvV9mW>hRsJIl7g};==RpVQCm3LY_8aWFkj{`==y;r?5$tJ03(AW_W zCdEbe5JJS$$CmE|c8$AX;s`bTBfWO5xhOZYqZN9S)d>j_Uk~xN{<-p-4E(EmdbmW6 z`{(tov>)wwL34y1|0h@Erq($5w@qM6t^6&?(ILYoImd)@P}?x51`D)A8N#)eSnMPotT>~~(|9dr{0*6EqgvpM{H_>}vuH3}DY zQUyoxTx<;GVEJ^;!K0hSx69q{_{xS+{!QGM;2kNf#<jvRN0}6VM zsZH3~hWW zM&}8$#kuX%CTy5SqlN#fFP->Wfb|xRSW6Zor0STvMVkAIHm=!aJJ`$v)6y8d?^eG29emWkZ6xanU_ZT{traSqs1{!`^o{c|!0@J?C@%#VGmB9LzFA z&bEU-E$?jLQS6mt;D7Q^4|CmJJ3o=gH4A0FID`SQfm`2$PaIdgn=q?rcq^{w9@bmk zmjW(1KGQ1k81&&Xb!pz#vKYhDdQ63>8hMYFcuSUTxT~c z^6vT@xAr-+OQ;bXc=KR=!)b*8&?_GIN?}XnB^9L@W7u|be`1)ArZs~L&Hm*Z2O%V3 z4Z}(I%BktO=XDW-|4NM~jA3`nCJ`!G2NN0ZqjYKB*PhDr3S*HwksV^EUU`EFgyqiL zc2_MPlV+rtiyfCLLZ>L#*c2&H0*cEF7!=5sa zi0ig+g0hRTm8b30W`9UOE1cXE9O7IrgK?l&tKmKMKT3P>N(ci75tdC<0rUFc!0AKL(Z zu2t_~GOMk$et&qT#b)5^hTMT@k<%HfIYy(z;AxSD$g@!R);H65tbFtCnuq)rh09of zukR=46S2nKyW8yx?&TpJE-X25(1MoDPxoDW7ogD`Jex^v9zM?$>m5Sp@-y>t!q&^V z)z6Pyg`ZB+tuZz%Fu3g(W8l`kbi58EoAW|De0BM&ly6yYX`Z$8mZ0@boR7eq)q9+u zEo{1@1qDPS#6%x|t>38&M{6|})_V>i53G~scdEBcVF!k$mdWij!GwKr_N^?iOH zxGwr67`{y$eW`#%#A2zi&Zi6v?{O8MOM%OKAI3_10W~Ty(Bmy-WAI-VS3}tU>-oUY z?JdWFiaMI;6Xh}k;~^ed|IM#F-BVcfnETSBd&sUYfE!$0F)x0p^xfzy`-YLq*8W%m z)RdG%?(6elBFLVW?6scR?W&<$7;i1zKN>DP6l$~!91xaIUICuzrEd<{tFBh0oe{xn zb-~*MfK`0Ebsy3c)z*rnkK?r_w(M2)IpRSVfUAIjvU7nD)>6e?UT0OV*#{&t?>4$( z1r8zN73Y&ZBqe_1q#DIQtW1Yzy*wn|f=TLbkCn$M2*|>!mlL$)NMy0_`@EQLI{q6+ zx07L_?9Em))3#h;ZP;f*g)tQxN$Cldfm7&Ugfx_z*fclvW^tH>Q>1v7nweI38E?auQ8|S zBg9iAF!&qU)+r{Fu*XWll@hmW_8Y;?lD&a-)Ku5jW#soa^cTuh2gEL+0CaWwY4UPP zWC&}F^+%|PSg40?6?hBYgkt`pPDUHAP{rqT)Bs;oOpMLjRch0&7z*0Ty;!M+4rrv` z-BvXolwCl$@9foS_AU_SOmGM)QbqIkLvfRJM1sHF-7mMiPl+Yjg=zVawqw>rIVZUj z?g_*%NZ#PCRXrqH=s_eu?z{4l7pYf3G^zWSGcwC$Lu>wvP&|JTz(wg@j z>ysRalzs&&^O>2b0kPn!VCfu||Hd;lF zb?R!#62VB3qHameFcLEAkADK)a!@keFuu?jaUmxg&v&+CV{=cYNf^YQuD7W0;V^m|lqnM&{)i~-Ks&z@CMZJl%OS&GEpW+QvDgk2OSPw8{&-?d-0^i~A z|EtaSNh|@q84zP|`Gq*{^V*;5znW~)^w)pY9lX2{3SXrQ2&VT@{Oj|blNgUHd|)ID zF~Wf`G!OKhW3f*8sQC_3n_?Jr(kp2Axj?q+C*;?{aMPI0nDRNWkFAo^ttZ61w7UiC ziC*;LY3+ItlQ}3p)5$809YSyh?C-c!?C`c@tl~K2`$(%6hF6((BQ=bZwM?5OWfN~o z^=u-Z`Ybu6r?*Xeb0)N~&>sg9x%NHH{-|mC|M=0bmco;c<@yE}suQ^qyI(x&VWRaE z!Y==xQ~Rm}^56FU_xVYK(Q2B#`v2M=n)KcZ5=)n~OJ8Wj9^^LuyJ@dhVyr81@2-Ws zsbG)Yk3R`n955x$P1(V?|)u|?|e=YZGVXFs~qIep=) z_Up9sdNXq|O5HE&rPqEWm4qF$OufcuFk)44W!?S&YoH9&Rw1)QE0PJ|p$*u4e zhscwriLjW?AA`bHI`M1D!vbwrQ*%ps67kO+Qv;zVEG3CbCipUmuH+sUL!6xGL3|AQ>b8XZ z&Z8dTNxtr zBvb|)mmpkrOxD>r{qWY{461q*J`N3cw0kj~@5{7IgB{BFwe0I~Iu*lL_?G!lwMpX&78KrypbJqTDHm4P|M zdcyk)jw}>U)o-%LCy?yvDJ4eNLR3-CH(xer)|2i+L9jENV4;JrEfm%iwd~fa5kP)@ z_4!=l_rqknRk07Mve++Fo5ucXS zNwGU_z>g%sE=R@7J0li^*#8zAH=~KeI;Eb}ovZAO9|@$b^$}kUWB@mgr7d$Xah_J0 zXX1?O(v!W!4yT8hdA7WR0nGjPb^L?kH?`)xbj@#vvE%+7W4y)p(DOy^eragd5P@TKp2aOR&yRN~fW#P*lRX*za_r84yF zKTgq_19@L~BSOfkq^UdLe(|I(n!@pb(~beRQoGTDu!>6A`k2r_#o!2{8pmxQ;r<*yVM5^x9k6!I~-TB^9(}0)Hszuv`gB; zy_pXL0|&*~?oXPz_}Px|w6k3s9VO1mIaPCKdJ$1})AM%NWgPH?G>FD#@z`7OY>_zf z&%AQ&w|GfYOL&nh1_!&~Q=i~WA0Nc^(isv^yK`&7?E;hY2{M~!w;C_FH65wWT9r)` z@p|QW^Fm&}WPHM0>4pX({la*KM#?k;;2=s7CCY#uT`4XrHJrXX&1 zgq1~Uh%K`nbs*h-GROBlmUH27UEFbxIR!Re04aW$zl)hH&0GY2d*RVtK zx>M^Rjd8%I$$d`#$(!J>FT`Lr!)XZ4E-#vSV7%0c8Ks}&x)AnXc_6-U*KVX%@_%aD zha@2%2p^Jj;{C0~ywy#+1YZ+MMleO!f606IE8U2Km76f*?2>Xe+*9P`zK+Sb5b0k= zgSNqd?J1?jc((dCvK=*Kn6m-Xp4a&Fj};+HZ~~kHtik`)1(Ep5%QpWi!5TNmZ6sIg z75_M4+FKviI9gE?H#Ti8ZfTq-{h!K_>3spn=S07Bv=7mv`8Q$wBc_hy)|?lC3Mzxu zytFGHG`x}ih1j&A)HBlHosBzy-@=CFnCQGt2g4u`bGzm7lR!L02;tUHIqWWu;h;C3 z2G8tiZ!`i|@q)`f+K>M2vu&#MVG(oY1GK%>ucxBiwz)~oSPPy=w^zbI-*=(TW^|j+ zqaSbG48YyG&#t3PL06kkC7&2Z>xR8hnWx)$0J#0JqU?nP-u{)>wkier9ACWF z2$gshu*G?{OA%NN-R=iI&sf4-de$LIOTJqGGx?P&@ zAYO(r2Kw3IvM6aB4$82l+iW11-=_T92saqgF!yBM!rONNVSf7L(jt(8!5ZcK**Xy@ z*G46H(1i~uT#g2x1*{MZ;D=C+=~ss=?i|Kn?ZBb7vtWgh0n?8gTFuFYVb5I{#Sejw z!_V7@DtE8Xfk)Ln-L#9}vhjX8VYd>cuMzNXhqShLxLzTD$NdpDAd##Osz4_twfyO zOWx(nhD&~Xt#M&L{c7$@=$dQxhkMRhw#w2KwBCfkqd0agP3Swos55F{H~G zRhnADl$THCKWThnV};pcO?*6hU*O$n9#Ct<&x{slI7k+@M=FA*n1vqJ4U)X#K{psC zb5AL8JbXTpSgIVZPNlX!dVI?E2LED^rn6T?_nj->BJmln%$zTCOug^ifKzU_3R!!j z1Y@ZN&0h4czjm}p)k5d>NuY6#m0pD^E=%ryhl{i!FJY~)r`*oTmxDcGnn}HKV*{zH zZqNjjz>qzOzS6WXpQRqWSBgvV)k~TPT`9|eC+^Gd)p)q*aB+g!V5+lw!R-$G<#;b& zKJ7B&>~^`l3RsD@dh_vSK-{mpH-@|?nv}Khw{ge8#8$lcI=$Zl2J$zyu^Z$q7o%xv z;eFk(QBenecGl(PQC$D*JFfm!4GX^MH5J|J3F?U|AAb9cubZWFDH;~?Zz$Vj>20=* zEw>xlh8?3XxvVArcB0(DRw0CHG+Q8K`yY%p;D)NmD8Y&~$%DfFTKek%nrUwoRYMK^N}#JJ`M{&Qwm%@(J00iO9`yp8{ZAC$cPytEfs`o;1_E-#;2a4@s|ACV3Ls&qZHT*sUo3f%qc%%CV(+ z+8{QY(7+@po9OE|wo#Qs>we3}-GMNSyTm>5M zDc|VP3$^8YboYMNf5BykW9yicmfA?=!j1;yp&h(ju?gEe+9xp<*73=KNP~+SSN0cW z7lx*xqWiHPEKk@Ei3mA(?`v`dUjKl!h4LWYtXrW9+WwQOgY#E28d)vGe0Xow=JC6t zu@?}(&W^F#-we7xZ+UVEF279N(<&6e8Bzd=Jc37WnPNpWw_Adek%`D$oHfrSBmEMZ zjw8zBGEeRnD_&qgbD+B@oa1j@{oI{mJSrrGY4@j@`P+IMUpMwF<)E{hu$n>dzI+Dm zGfUW62l}S3Z(vZds`*7K4~8qf+k}5SUYc> z!xw3u=e|lkyrYDUz#Amq9+3zo+430^wG?#kpX^8(<ebOT*ek^Hk^y%+YzJ8)-)4rSFVRE1M^}TrWy}!SH{lmegUDZjH zuOU7ql+D8`x%=`O6r9_j?cR_i96WAjiyIb3Np(#*KQTJt1xdeH(gS?rNk7*se4P{( zvgUO3&}B@G*01BXM|Ta>-lqrURVlQ78ZNP9h#HOiM!z^tIo)j%s0CSAmWN8*4v84- ze7NIe>^3!;uIE9Z1C22oaOop`&O4wavG~SUWqc&Dh5t*J0l~?_&<4h)8X#Auen(8q z#h({`d8mISnW&vAFcGxvO2^V^X;0#(;+omrY*qI+G=j3sx>ZX~lE9GOCoWw)@rp`| zAs+hf<^x(f1^bfG4sqfSO}ySOo9qmH=$jNaxtPW448xk`nY~UKrvKO(W8}>>pPf4E zaqDS#1c-tUwycB2Rma4JaB}Dui~TdH7q%W1P$6}R zUkTbFM?mM_rdSpLp1=*2Jr4%o@Wo|SFW@0cW*6oW16?$6R!i$8GVZY~r3k^WJF^gv z{KjNn?7Q zNhiFYa11@2`-U21DjqDTY0r%mp+5(Y^LY2*P*oZ!C&JJoETX<(s}4O^&_wLM>{z0? zb4l?21P#SacqC6%GnsgDZ9=KhneGS8RL=E`INufAElyA_)1j*c3UtBSdkdP*pC1qp z$LJhzrKSsN2gx>OkkId$=Pl?h)R_-la4yCdnqfD3=IX|6Ls?3eZb|4RURJaiV2d(< zfE#pE;)2A+Sbbk}Qr^hCoP48?IWq66R_>=&7tZ^m*IeolI$l?XSqhz*vU#hoQ|$aa zWARh1YX>$5o4$@Hfs3vB`uctNIs~8q(>+f$JfI|cB zNm#sTEhg0Pc+@9o8vSQPOiW z+;JvXP4m;*gyb68`j*~T|9IqpDiYRiykCeLP$ndAR0v&AttbARgw>%|YH~EC>8P-D zYyH+G<5aq{E}W(gLz`E-|D}NbvZM2$WH4cdLoItDD9<+ z`T7dxht(44OIQUpq3HPd)N9$y2|VXbt3@elPEj)MR|B3Vah?|npD*;lLXMeUh{AgU zww!2HNDi^+dwen*{f^SKBcNyZ=LH2=!xOiKvt1(c0X}6Uq8IXrrg%co!Npte6t8 zlXTfvcOH;^@Czq5o9}`zyd8CTCBilAykW{7M>=dkVE6Yp6IW=Q_EQ{H=TGOhB%>Ws z!G8sp+# ziFXryJx}QkIjpk8)*d!GGv_t4aV&xk$ii(JW-L0M)$)CA4IvGeI(AL>I zJYZ%^e()`%BiUxvAau%$dQF*ZiszMF@V8xkGNbJt?jd?7jyS!F?jKw^ie`L{h353& zBEOF0U>Y!W@j{-W2iWQ)EdLs36ioi|u~uh(v&v-t*km_PI>(45OMXlbRn-e7lHKI^ zuP6aroRW)Y60b2XL%cGG2N0!Prds-F1IuyvEq){T{u_*DJ zMLSxhl=@I1L$XOv;Q)is)=Sa77H$(Rj!@$J;jpzQ( zJ?Gr}T>hEoVXxV1tv%~o-`el@e((3DAQMz|&pym*5|qfZruKc+9$Z}TSP$dz;;iR< zEU|0(S)m1zjEC;WH;2&J-DtHunQkFaBFJXkl&r+(U@Tp1vC#eI0)eJkR7@B?b1R)O z=I?5LR&*G2LBklWbFw4QWw2U9*S9}qcG?anpmAu*SqU#00v6{WPdlzg-;}@L$9q(- z%B}iji)^>X*EskQCOo|Mtw<__Du+h`LT%Hrwq>r0{dX7ir_c&^%7(f?^P4a zSXuojq22kLz&!3kBRhlbQNNi2)p@@q$LUXuu4pzWjozx{e$rI)uBmvht7Ha=W9z8b z##W*#!Rd;<^1Mx64Cm5k+hJKOP6FYE_Q(piZH<7eYCJHNhDIGuA|-7$z|PhpOSHxn zKIj$}=MtRSk#cE`*BCh5uwfZRLeqKe6Z}!L2AJ!3kntDw)I3G;MPW-!o`9L0Og7xr z_A2F(=wAY%de_z$YQD8>_Unanc4ZY$H?Jke&HpY7Ngm+Mt=+uLK<`7V!hX(NL129} zT^J-}O~%r<7ELzkn#t9tw5VFH`ECK+es%VPh0{o!cdF=6<*X;`ySq~T@ul3{eaipT z0@!UREh}#kcIX$}k)L_!UQN$Cv+W;Kqq~SzaX&Ta#T+oQlGG-wG?MNMscL@3k(@U0 z!^X!wJ)0h^$t0xW(~AT9Kp3r`4VD-NPC0%p<3l{)jpVD`JLQ!5x%h?R6Oe{t=x-`Q zpFs^8I(_doJY2CKSq=A(CRrBN@ZaYrW$w6A(bVpjp96R4e-if@7p6eE^Z!_9_5Q1} zF$)EO>CqIwBv@eM0kWJk@5y^yGv0s9Qf_GdV1eIw9?eoMqhp0-X;Lf^D<$-?jv+jI z0ZmjM_w&b8HQceEk5FIQVmw!|G&^4uc(Km9_DXJ>SdMnz5pz9xw6KwbMXESPYH&9H zh+oj8`*9iD^?FR-*|n+4iH3aq{xO!(rkD5Op-zTKnrBMB?%k<)>9!uc zdQL||;h+VDCG3XLd1ccws8|Fm`-<$YiUI9&i`Mngh$sX3X-%V+O<+s+(wnQ;`Lf|= zm%a>|Pp{UO<;9MHh#toIY5ZdcPLSDzk^(kiq`(Fq*E*`PhoK&u##txz&jZ6pZn26k zf9EA*pQ^k30dwwak#pi+-5Xx)CHwH>{rc$r7@SJhbs%1jo{SrUQk>2u(j95qrr~i8yX53(W1{xWs6?W=_m?dvTmig>dl~P=8`)o>+>C;_i?h^zBXZc=yY- zZ-3*^1dyHm@T5z6VGp)n#P+b=!c(+9sSmgA_av)i)@A?HhM(0VpC<~M4Rz#8LgP1x zIC`-mgZ_Zqx_y$T&*|o~=#EPR=5$*K@r?_kEA~J*O9V4lyHh*mTP6Xp-oh_Rk2Wr+ zgt9ugubiI0C>_dr9fVU_pOHpYWq6tJ_+3h|VH=A|e)g3e&358fJE46gW$mENymt&h z6i-W?0{BX7hNFIXJ5es{b+B`0gw4>TH1hDqRHb7CR8V>lSN#-iXfdhPZ=z39J{qh| zO{Ux3OoKL)Mef%ak+znUQ zsdo?(?i#ll@bS*C;EV7|gJoRVgzIr7T5tr(Zxt*1e6-U#2#2}E9Y zOW`i%1YeManh%alIG!)O;k9FfUH8#c5Hld>`;&jkdBqtS9852}OzRkYt4;;Be9>2e z8-_@Wbwz)hSq*8qrXPfo^KR2R8-vxTRa)vYy%^Ha50^#n6sj|DhXpb5w(*tSI3jz? z?onkK?MZ#*^CoOq=FU~j-gCRB%D*dmurU*xyCVhvM3OtnvGr5lMZ8?^!?N53A8h{n zpV{LGdeTl(aG;Y-vXaeHNYUlhQK8g9N@-bSxyaM6*a={U@#M(qeFNg4<17 z`0bt)F>aQyCwpeij?AfH5QBYEu~r|VD6{lT=WWlcJWRX+g9FJooR12#vO!0UUUI#U z;wlE_Wc~O@qlxuA3W36OC(eZPZuha9nD4RMAOLmYW)|sa)Nz>|gK~w^6BC0_-!%+$ zg+9QTGV0%u@0Ffs1^J1}C@3;L^c)3l;oB5JZgS}?JqLBv{g1ViRe!NvL)7zJV8jZ@ zJmn(LDV&+dRM}7jh$2l^Fu2*r`8Di5Xfy>zoISTun*k3cap+Jce?P9I4?>Xe3BC^u z8DlG#_UsMPzJWsD6)Z8LGROJ$dEWANkH`95)k)pFeKx7x2x`3ayCk_ao&?=wa!duI z`{Tk+sWPMAs3{sh{a}12Ss^jVTN~_o$Es^ByIjKwe4DNQXg{e$bF0J*FFmapn$GB_KYv+{K);f(cwt6KyXzX~QK#D@k5 zJCCH1v1!$!Jx3|Z(w@DwI|b87{iw1+QRKv&Eqj0w-S_;g?as6Mg$u=Ae@)ahKd>~o zVPX5p?|x&GnkFn&R&Cz3TW6Y7P%!}6&GhFwU+b76@|n_WJl56`g&PO_K0Ua#{{7V; zWbjo%MKq|S^%FSJ+>Z6<@Ge*;s2coF5mE^oLd>#P)B`-MR1V8tHTli17x5V<%!o|5 z38<9(1_qz<8}=p`-%&{o_ErPNk(W%_?2(@dI5~fWi~Z@0>9 z5zXiqws{^lG!=WYhY1pX!BR)xW!nAhh3}^;_*MV%n=Vwb_uhN1-jRvMrlXbm7E?rd zz@k%UJANd|1!kW>;ERWg89g0CwM+@y4~&zNKWkEh!{Brw+;+VFa0l)v6@T(-ivBEa zA{*j}$qDr}^Fe(b{DhMwZ``Q|=f%H7_X$fSH5BN5M-kh7u_e%_g(`!XRNl*Bu;S#m zVkw`X^c^r6+aw`quOE`#2_7+|vdeg(2;a7)t)bS38i;#LG}*$NliylNh31){3aM$9 zFZZW@$-s+d7NWagZaR zC+JuJg(J*gID1P)Oy%p|x7J~V%;%}S#65_aCvGtN=oq79{`GN4e~+awrWA2az2X3` z$=Bjv|ELd`W9vH-Jc?ALbqI8>Q=J|=M=c@xp{CloW8Z^J*Cp<*JSM@noA|R<c1@Af`%d-h&Hz!IZZJw$Tp{=oEDj1Owqwxe^_Di)wo&} z8hFxdeUol$sdD@DSYQV8C)k5o!R5Jt60E16i>FUeB6C@9U)>VOcOH#9A4J3CD{t%Y*QWZj^I@?1hMDVq^Sm3XuNjnuT;(e=1ls1 zNvIX>NxkA2@2GzM`Ue!a$1af9BScgkw-~TJ1`@OSAlUUAz2dd@1qpMV- zx^bq*EMT)LuCx5U+}`t*uz<;JlQCQevBt`X?@)TMXwe(yFU z56w?*;6MUZq8p!yoKXFpXcS*fzp2=JFt^C|e1c>1>d5_-?$ZhrAV?wI)<>8zp8!cB zZqHFC@1ea|L|l(3Ot=}o?|HU+his-b2<^g*pXx^;it*pO3K8eXid3dSo#qw|hVO^6 zKcZJN1J91=aVj3X+b`SLbmpv+b*o%N!y6&J_Fk*FWQ>~(7yH=^rDn2KL{zUuRRtPs zSNc4U#*L$XLC|o6Up!;t_|?L1f;NAzw0iq!gd9#Zx1P~e-CT$lSF56T{%Y=M*6xDu z_knh1c=;X(#J1`3_$fxTaJIAg!GAAQkq%Egw&7zb#gTBxYX+Oyk1 z48y`iHi*rq;^M2xkzY`U6wUM*c_?i4gdXpN`!cwRg^!(%I_ltslCsP7XGSD9vjo)> z^uS3At~loIO_OuKULZ=(?9s8i0WBO$e>Tk;2|U{fJDI7r$ZrXS3t^Hr*RVnpFNIw% z^PqfF1y>LzsPj}|Ox`K~0)i&%fk5|pyKMzpx7oC29JcuKH)SudMnX-}iHFq?{OVhFm?>9`*HL zu;+;U$UVhH0lsB_6?qNE&7Pi32>t_2K!$?ah*kw=$dM3y5+@TlgWXH$XK z%SxmIg9l8v6|JYHVw04w!^eTwe^}+C)_}KrODT#>&{|8dwT#v={?i}bMi~F(_iWWL zttf^E6lXl_63w&XcM5b~a_Z%d@>kY7r;%`oIc%Z;=)QGROg&_Y(i`^_T3v}?gEP5I z3R07OTdCD0p7Taut=u9YtA2sl5BR#@A#)KQP*gKr2?=5t_}`3vuPiAKfmui(5QSAOy1i-=e4ZR;Y*&he&yA4hItm$tW0UImv&HP8Yg^S z++>#UAxlzI$FQm155AdZidSGeb@||fory4a#DIW@+H9{9Cra^SMcS zeGE+>w)W(qYY*4Bp6eSZrwfm^^ZN3=vy-w<-6mGYd&9^?YbX7yjxc3U!tKjh~-b@d%P3N4fuk+vmN~+Fbs*s=%7ESYOv zWg1!S3+S57pF6ydWb&ho1BF6o$tdRe8B&$~49_9P3eiujG^^jfkfAe_t#?uD%I0o6 zV``9NO{|MntS(<0{^x1z7Yx`;_5fIu*KP(YRt{znt_v^C2=A@5GxY z`p2C7gCHB5Bwh|uPPq(XelkKQhUJIrI~^Q>McbuZm6IQ;+G4Y06cJ>V9MF`8dUym- zAa=cV;3BbxIo}1j$G0qyB0bzo9S>&}P)Lf7rE45WNMiD)soaTDkGTV4d=qwkI2R{X zZwg&bM|{$wz*IdYz5XNw?~h|R{6=(8;omyc3=D?-qGCtksnh;Z}=(AWM=DN;iaNhd~N~XLFn#E6i@G5gdL6T zOE-@%ryqWCg-S~zRF6aXNtP-h^kV)k?=7S5NiT~5s7EI+R@QI@!(AH1^_%X1!keP( zZ$5L&^8|djKg$tWc0{JSB#jIv^F%66u*BeuN-us>@>my+&(AXgz&FELA0Z76E2Z^I zo`Qfh^W41DbWY6IFQjCpGK>7Z;;NClg)JT!86{ErDgfg|U|gaAV6##q{S)EuhSW2K zLwz(?v?`dXMNwHH4D9VfRDdhyoYk`U*pjE;uTT*w$KXGbcesqfqrcN!^83r>S75w4 z7Y-oy^6)XER1iF&%fw%@ykzDxo0YR6qYfZwW4+}^(0&EW3Oq6NF5NbX_n zp6CW8mx8+;{Qz5db#v8h48Yd7J}ImRgY{pA#y)csItBRx>TG6nHlmob7#7#(Fj_8d z%GWvNyhWQ2svT`i__*izFG)2vV)Kg<81qh}1J5f}n>SKSI*oP<-+3I2PXr!kR|*Vb zo*F!UFF4b(<-HtHWEH@>uNgPwCub?eMOz@IlZvC5x3$ZiLlz>~zT;*L~pg zU7DKTv0nQ%R!&>m%$=IC0$azv%(8Dbvr}-VG&5goC~IVAPjE2^nXJ$9-S!e3EP)P> z+`o|U9B`x8qFe(XzbG!L0ncdbwhEn&;ajL+ujwPD8kQ5b^|0w?{Z6}&EX-LNvc>(& zOk+{7xD_SDC)GW?ynXE(B8{c-j@ZD`UA8KDGE6*r4UM@*Al`MTzPHj=Xo(Kgk@Hl3 z#=%Onyq!YapZI|;(7uF0d{fS;>)tJbe?QkE5VgQ(*%wO%{g(zFBw(Bzc${F9$NXYm z%Akhx$NQvPA&bSw-j@?{%|aM~sF!zsdL1ved?6BlHxV4N|pdXY9+&afM+9y zLRA(yHz|5E7gCT{kXb;x&zxRTtr|EEBc4~AO}vyd?)AQ!(M^<(LHj}3P>st8;x!c! zc)KSpheT^J?;a$pA?FO0EE48=a7ggny1UQOT5qdmyXIU^o%G?5#D$+jH zN^23c$l6t4;;mJaozT%%;>MD*;2>b!Be+9!yEwPp75YdoE_SUor4YANwRl9 zJAbB8IHKwRk;d8l7443O{MKcBdbg(VDd_f$`Fhlu?qFvui$^736u^uDO>|!KnPHL? zm-cn(&dt47#?~vAD8UsUvdnkgenl(?p*!3q6eXH>H@{I26s*$QF>d!KTNcYLD3%W( zdZnjlpJ65mt5uO?Df^#+I?PGa;fIaj7t&a@LnoIxLwCo~!zbN{oT4Gjf_3I7GOm~c ziOqC~IBGW4iOITN7CO~ToM+3eo-NVMu@((ibKCvpOC-Qs;*v5>7B$|LJDqTA%OZ=} z;}rCdZTpe3P)uCI*-vP`G@g0CKvlr8?FWC9aL57086fkBvKe^-mS~M>>kPaqGjSE0 zH6*LMWFOV32%MlBFa8BMn0yjO;Dv`j+oMPYqCsXf6Tc%t3qTD(g5!%O!5+>NnX%z& zsPihAg%45iKB@=r5%h&}Up<*!lP&x91w$V*O2)Km1g6{e^7i}ZM5t;kNC zTsFF_#;hOPQXGzm61o5DEGMZn-*A*Bk;CPx+<22(Gsc-@T+JTiKavXWA(6WmQ)nB5 zUuy6T<9#qaaR?QR=0i_qVUo6o;gl~ws{IN$SBP0;%dpeEpoUtCybkR;bd3~f^^R-V z{^sJkai8+3`_2gdWW$RGrigg0ik)g!4M^Z#j!hJ=BfE}cz9_f;n8uF{{E>=BqapOu!z%d*~GCEb2 zC`145_C>c9qLFdcBeW{Ce3U&KxT`EkLN9wu8Xoham~#)2wrTKlL4EDCRK`vg0lx8pzSGiS?SJB2*d?;S(= z5lG#6AE-2^Nee=Lb%r>U#7Y{ZyA5_E|KZw?bXuv(RJ;IBgi^x%BK4UHjs=RSYZ&@0 zQNJvtLj$R&6xh12M-ampYm2WLrpr}PK1g`eyUG<<^L}MD7_kx7->|p4K8lCOz{Rni zYv&7~g=9`w?Q6ls3?!KLxqTy1I0D+>9}!5sdw&fG3O?Pg0yeHbbw(e|q9EWi+*wt> z8DP=d#zal@V~wS&jV|lcnz*%L@xS81a8(fcn*CEB!_VqryR3tXb~syf+#*|GlUWos zmsLF?E$v{yhrzYk`*hU|ZOZ^#9NL7j(N~uJtU_Y$htSpk6a<-D`~UfoD`fH_T2onc z(s#*XOiYO0mTa{ALxF`+ek|yuX-{eufZv`Qx2f8RM9o>miR-Tq{iDBm`W(G2^2ysxg@uc+bRq2Oq|2fDa=fAtrsn`Q6+of5^>HQ`7O;0xuj-oD0*}t`{*j@)*boThE(9FGn|iYNC{FU#CY-S)A0v zDmz(d2tVQ8tsnleN&T>dE#8Lppt4wPLW!q+8ohfBOvQ1$&6!(P11)+w?CMjL&x^x? zfUvbz4Ei=In-ey=(*c?@a_PKY(YT!rIj!(`XjMli==BSU-FCimPf{?DAa3U%C$oCq zbj%FM@eU(@!A&{lkK%4HkIrzClcU=Gl;QClsI2Y452-W9sP^Ssn#*26#!oG5SplQ~ zK)tnBL$#odY%1P%f}p+1gmYA>ydqmS3Ta$KSl}r~$FXznbZ!GVDAzM8XN%0UTe@3$ z5wV%>72ZGsx_gy>M5{kv$`AGwzG^!^=W;4@Y;@}-J*dYc_uE4%&^R@bES)xdY7D27 z#;gG%qsJZn^g4t#c1jrubuOKfjr;4P%QT6s_}!P@i7IbhMULwdX+(Xh4p+-t4cZ*4 z)89Ge(g+688o#-0^WQb{Wm4?Fx&&oo6sdVvq!-ukg1OWE%b(p~{~^6*gVSr*`f!Slv&{ zoLdMf*ROYLJ*tUXvMVd6-8cAl`b#;TZ?qjXH0(58tWHbWYy2f$(7WPrxxk$toBq)y z6yWnl(00;tIuGY9dB2L_!t`;~RIHQxIqYPG&Pk#b2JI7B&c^BiS>lJy#Nw$8MH#%?jzMUoKRBH zJu-*#Wh}pa^P9t~`H3G2m1%z4$thJ}vD4Kw%v0&!thFq`InRBEsF;C1NJ+dzacVCNiGjnm{(L*3f6z@E?_PGo|sf zZ5OgN6-`6j$GKgC{qDbbl*tmaC+4^VPas{e@2 zjvQbN{S- zUbhgPC1!Ut!{l-C&!Pl6Q;mi=;wefzTAw@DV~cF5JxR0+Ud(U>ge5W`f5~ncBQR%3 zHvOP0RTKG7#bYARI*#<)DqeS6K1S}s1P&DKN90Fdh3SgTMrU#3_j%qk=!`Z0XwSf~ z$la%!U-VA7i*e+84Eeo<_s7e)sk*T{B7hgq!ey`C~H#AY2vWUJ3GFI)g zK0@in05_Dz;X@xe=zdVR!|FyqV}g|NKah0aQ;K_qq>m}#57L)QI*K2vMUg2qWC@}# z`&eU4vg9>@{!uv%z4RXTi!XtfyQvm&`0k&M?bmRPJ^L6k<@pc>&@HH#zcd5!t;Z;< zU;AlJg#&O3d@ni)aeCbK7(X?>K7Bbe?Oa;!aW_+2yvxG+cbD!bc0 zknOU!#0(P*!4v%|@};0qHYke>26U%dw%;Ta%*P!=Qob+B)c4R%&h4D#Q+;5YU)8+d zVY%HVq@mt^_%Ca6;ZRD5gG2DY z*+Vq=bJrg!HCM?Ob75{88criB_20j}*U;bkMMMSM2@MX*-u$XqLA;%xznq$G_nh!c ze%*i&9UtZ{0WR_TUi@T3h9L!oW?sP=N$Lj*w(;)5mMC2E2lOG4WSq_7Nr?$=7EYz1 z{ErhRnRYz}5P0m5Mek9tX}JZmv%T2vTh@AH`;4VP=I{P@7_r(jpNE_uinngnJ}3^w zG?zS`d@Zl|??;FJKPT3G5CsaNJm8^Gi{-*Y^haO_ii(U_TuZ(^?qV6L=j6%F$z1R_ zgS@{o4`Xmk%`+Jy%L>Y|ooXZ!>Zx~HnyppNc>X15cHMCIuhFt2Li=RVzWjJ;FqxFI zN}=U#=%5ATb545%VR9Yk7&(DINWo( z7OTC0c%Jl83mHkM?T0jD|1FW4BYas6gO%yeER?vjUH8k;Zxnr!FE8#?7om8Z{r7^q z2e0pH=}nIQ@sihX=^coB%7+u8v?AkAnUdB%5}&lpvv&4>EIE0$9@RxnmpJio^nU#b zUz%q-=M&|Hmpcax)0AC-N{gw$mWm=4AC6DkF8-b{r~h-Kbx z9QR1#f?l~H=^C3??Ypn1x$h0Z!Y&m(H-x=T_MCb(=|!L=&XT-wdroS`Q2haU^9Z;_)YoFFQR>nW?xpOQ|nDi2%Yi$eYw!TdSV@wX6z1%sh2DoxTn^mjo?A6lqTmu zC1`vdWqHi}To7#FSK=vC;BX+KGb{%;AL?%%K&%R{~f7( z)}u~ADiw-r`>X-GW^Dp6GveiUh2uU(nct(*s!#GqZr>E4BVI55+%(3jdVrbXB`eHe zpJ~U2n@`hFmWVWcWZkY4uQWtJUIpbxM0aK908yVSv9LZm1+TLaG!MbwD9aw__X`=d()tn~~}CRs=9Hc-I%F63;@mkebK5<8iPHc4Uq zf}S?qcJG(R>rR^~RNP_(7H)YLyU-yK54-;R9nI5(^E}s8&Ry#uVel~Sj^g=6`H3<{)edJW_i?9a*qbyyZ7- z1u%am<^Ln0@jHC>K!W;Px%FGR8sI+rL&9DScP%%u11w4+flqD9$e|-`@5xBmJ^Ln| zXaT?>|N70mM2NGQ-g5zXn0=4%^>=cv+6|njg!DSDD{-kWA+ULMQBOJ|@w7rNj{XFDD%jHfOAGG8ciMwX-8>)@ zn6c-~Ep(x43w&kp=6Kd7E`sUt*WrHCemuNMj+h(vgm~s8+9jxf>9D-SS97AL9b_T8 zMq<0zj5^wm!M>q!Wd}uEVR$E3!bz7*KLh5P*eDDhlB}OM7rn5`ZsI=K%*-ttm-Tuz z!|$M^2@%PQ7;;O|Z|oC2uC1iOMpsY5yNSFJ^iijeY+YlkB2u_IAIjp8e2j-03I=!} zSCJ>%bC(&Oa6KpF@i$@7f-g~yZmtH%PTBF-BdQuX@aRwf@|iq%VuLzYB56!67a0|q zNVbPA*4pg_({PtaPI6_-2AMYw*uT^``T>zp7$b0(I$mSxn4-`7v5^si#po+fj^eVlZzKlad8LPv6Z9WsO`lDs6y1^l<@~`y|63hG1G$H@yk7*qI z^WJG|Al~V=&Nf_~jud&szBs+a&;*mfN^RS;$sT(lN)4xVNDh94%Mhs>wR&1H02BeJ zjGw2l!&dnQ%g51sU_(`$(xIg_>}g>oCyah5Mr_#V(gdK`mi#iHL6M(m`|lxH92uv- zi?2S!Ig(G6Ip|qac|d4+R7mPYhZ?Q^v}jT*vN_Ry-2&OH&#~4NrRIc%J7w!E%%K%W z1_ml_u*i5SuZ0geUw)S(Hdps#a+uq~ShEjg`sa=}G{)z+xL=Yc6O(b;(i@dB{g;AE zAniTo*jaT$An<#6XZD|8bUO|6=8sC$nbYvnhqJ)UY4Z`R7FkJ?zZUt*y#xdmy>rm` zyCij>i84aHd~=LJqa75!}rgc(#;#ae~Nf8S}Nn`5(@Ba#km$)Y%KGk|HjN%-w{VRYJVHtusw~Ggcyov;Q zq3EWcQdz#4(0RRsf1D!!kUr-pk%oKe`t+`eu^jV6nnqe8RUwvNvd|&N2+eA_r+6T0+v_%Gawc%q{Q336nS$oZVN4d9#}hxP z1{ge$55{g|XvqxRC-?cD1Y?VADpya7_A|su#DYqcvh)8Y>TF&0H?hC-Mc)TSNM}D* z?9w!u6#W;Oc@|6yo_Z0Sz@1sg)MJ8GfTM5j>V3!~ajsp{Q|qZ{e4^p}rw)I>Ve^iQb>06nwm=J8}5?%c+d1R@qQT^my#TWLXf3 z%MR!!7XQ=u3A1iYC(<{XDfUQwa_H({VQNBVIq-UkcRk=oJy0B-9 zKgF6|XV}V$M}WI^XILtmAtJ|j5e(oiFCJcg%Bm|*o;9qW+0p5mas$os5Ao zwdtbUgx9OBZ-Vnsd=Td~!ZX6?D;OkeiF&Qa<_p_dsXx2@s*?t$@X9(<}+}jhON1irTny8lQy4z1pR$~$k!Bd4Qo;>ZBk?EhEwI@== zdjvnv_6g?g6>i=|o}T()OCzL`E%_G+%uP)H$Cws8P>%Km0=ka%z8gQ*mqf-yFCKF< zf(}=Gcg5t^oDV+J)U^ARhdPH4y3ja_4mf@}1;$y`3RHd55(x_gu;u2d15i9p=UanK zB)9Y;4m5_ACXiFVvs1$52Q&_!Pv1C3q}$skwalNxRD;V^-mXkfG!CL-`_}pv87`hC z!oR=!p%c+}Jmnp=x6jqmjQJ~a+Hy_RN>srXV96ZdZDp~{U+D93^^LZ_UF{9rvGU(o zDi`&-_BdBE}LW~k9QsTSiSJ5>X7 zU(Q40uQ3Hg{blAqf%*1eoQ!(HZwD9a>Kf$xK@9$D3_;f-^VEl*{?R77>%8pYM;i^D zf_3l}UAUoLNg6-)`7~qu>=x{^0RwbS;<4`THsJm#53%*RrF9WIq#3w~W0%)mBTBXg%mSKmFk{d|aPMbA2;SLPhzIeUD}`T-k{VK037DouP4y<58u zM5gV8=pPG3{C%IMTVF%U<&7!-lv9hQhyh1t?|dzrOq<)Rpye{#|Clwmc5rjuI8v42 zuC#lj8&CsS115BpkP`4NS`H8%f$`i*#sV$kZm2OBP)iTEGUJ;N?QVUcwSK#*OhH%H+?6wZWdI&cZZTH5HS3tl`G&yH16*%sO^AeIH)!0oYoY(UmhsgS0 z;hNDWy(w6w;F_Dn6F_^0ZgHxr#qVod7u*pi>u^&d$;jH9b)eNAlLEeZy z-My94I)-R|NlRpzIEEhwaI%0w~4D<64F% z6kmFn-j}3#%SBxNehZ6am>7dw0#HNiFMlVrVcbx`#HPvjQXYO4{!n{9PTeyU4LP?H zIf*ox{I!r0TA*Ykm9-j_TR1Hw#>%3*P8l|m^u-1jPkLI}v!h3^fq^%Q9ba{b3fR*M zQIdZ7j<&W2pt3}9;^H}xi*Z##K0o-909C#Gx%Z+g@w^CI^*bg%)5lL8JOMkZ1w4pB zmsR)hPF#!uSMHhN&QAWmpGLliS(#q`LDP@ah>q=^`5FX(_p#Mh&)@211ZMhJqzLEq zz8i7?YmWkK5rF5Mk+l<(KvQ{`!*Q(8&XO<2S7U2E@0!y9$l5}MnH_}eidKR{znl$T zsIqS%Ai{m%G`$Z8XTE6MSXyA3Za~lt#f&Af48v6CaBgs4=ustXA2RTM@-h7U{Vd>K z1Wu+&_ZguZN?>3MF>Fs5{wF5aIuJf*LPJl zPOLwWSNy~&l;g{+Ar?&{&J1yWYYAX6qg$z1P(h5G#c$#gh4R@zqD|+y3Zs>)rq8H9 zxWs3(QeniPTZz4~PK0fCjpC6$40*uz8p8&QDYELV8Rz=>aQ8z`W6SOJAy01`fK(XX z1s$|=L9qZz`dd_>xNv&Uu*FJA(S$c2)cXLzBd*W-FQVt#G;-){RRM~*I`0&?gTg-o zE#o;0E>QwR)(;L&gfQEP6evT+!*$5-*ko5sJTyy=vEKw%)&}qr`2w&*$!?WZ@CBwd z?HEFM8NmWc!E&mWxNJ({f=M29_uflQPbWVsU~059mI<}8LQ(-oV85EOqV`W4zLOO{ zo0@VBRm4hDb=A%E{uhLXU3laQ4u;|JGVJ9d(C9bIGt8Br%!1hQDUO%CUC2z*_hwC; z+w-Zg`V@tIHUH2wwtsGoU39+5wCjGNfaeR@l4na=S|4@(MI5*OQ48-srlEZIIaNx< zC_&(B!TuKe^0hsEI@KXV!pTbUSc&rK{9BC9FVo5$-Jt+^2#^zGZ-yH9=5)lt%b z1aE&*8c>8(Ycn@)~6$!?l-$orOZ(JS5)C^#mQk9^q zZ-wO`qktP!x{ii8Ft`ie!h2ho`~5mAJmMSW&H%%s_~h%XHlSE=3oRGFULc7FGz!F5 ze@OKOuI~6oGl_pqk9cEyUqG>H%}BN-Al!nk~0|IX=} z9Gmn~!wWDun+U70Z#;2=CG?UyJzuKUw7$NDV76zC{mW^w3#l8UDZYhf`$r9_R!`QE zUj@JWz;6M>LyRco$gF&zUC;YXa1~kHQKK-yev=rQg4$(T@Do9*d+n@cBAOkTuqSo^ zW)K;NP*~Oz?NuTOYXfE_q@vq^9rSf=2e7Hh-xSqzXc8j9IN0s!{K8KtVo`mQRpC7X z{!x=I`nJlD+0;OHN+B^{jmtz+<#DYZpTg)l!oIVtTj8||K|P^e=^M-faDEH@O!fok zRXQ!$?u#7V2U5)hNyjf~2Y38d!8qji3?8AJQBAH+C&&vd{u_{4=s$PjwEib}ki`;p zKlYCE9WkWI=iE?Cf9mYJkDEaPl+x!nJZFPQp5P}&&yglkn_y$G%P(56&DHc(7PXJ$ z_}C$j#Kgm(Xvh8UrfKAgA?&kSczIa->wf3c594;cFWpI%6D9TdpeDGg|8eh-Wmcrg z@n%W4LI5Yn^xNVRqHODb@30P7vTsHa5gV)|Uu`M7Q1~-u;R^B~fJq^JzUFMcWa_+W&BMD^w`I&fFT~ z=fg6G#nSu*|D1)w^5^ytqRm&U*1r$$;gbx(<|_E_b5??)BAcSkrC#K6{3HCTZaz4o z@Oa`36Spv8lMh#m1$h;4s0m>{YV}x=({PfgaQriCQbE(o>@Pl1*HnkX?zVvQX&z8 zmtl&Fn!y@{Ya!wyO6P7l3cw%11P3x}y($4!nap&s=CF}mM0N5O zANS{9DNc2W^f{lk$Mq;>7YipYpZfPyg(0}u!GLJ;`qangU1>1uqk(Izr%xeyeSXV@ zl=;fu&%ogM-Ip_@mNs&$x7!V6cI1Xq4?D}m?$LL#T#|?6t32jEpp|hg1ELh2dPFkk zLKsqcU%+e)YtC40MYnT|l*AS~OyZ1Nedrtm^`^7T!69zYTYuN&niZKL~7g$G2nC5waNw=OVJh~JCoqRknvAdS5pk}-*T?|%IA^S8CN zMhnZ0va+W$Wl!I~(AAo)kRc-14=5b zad>VCX-6Bdg~p4Gzg}wtx(G|9r2lzCrF400BXlD-U-1BvM<_O5@p^EV;Rb~p8$Sj* zzrkD17M9++hzr2HH~81^0z2hwrY!JxsC=nMRsg2DB?DZSkg|BAp!)QVuY^Wa4W&dM z#%#Nt;O`!s@7^U;Nx)qH?$4eO3Wou>(w-%%78vAA+@|=EXXNLLzKeaub3=_HRae3L z9Bic-1H@1t-FYhxQ}t`M*th@ZWuJSn8RSw=RhBlWtI4V%=3p1#uuG zjvtNU5|5W=oa~x1G%P=7XS%v?Z$I?wBT*7*ny&uS!tiOz-{l)8{mf*_J1I?Wtx9p^G zQK$*!-QZ$zwR!=o4=?c)@kbB!$1ptqqw78hHx7<^V7A?VPG_z@6K(Q8h93!kT~h%q4o*urk|+OtbZr$^szm@af+Z^{+r-@^cX|99 z`Gl}{*|@B>ugn0G+;sNH*LdxChqZ3mJ5=L@9BSCKF4DWoN_|D52@8OSYl$2-FbO4o zMO3RZE#ro|QvZUb!*To=fu%4GA>;hQ-bMcyNlPH;Q&fl_`sYy3A40i=FhitRlOv`e z=P*~Uwp;~2%*7rwyu-U~27Aa$On)blm;77wVWM5w0$O0ph%Iz~7(paCZ{bJ2Q_wwi z>;Xrl$E?oMJW}hmj$)+NDi~|H^kxAsPC+%&;(16_E>9byJy@>Ds6*WsStSC!v$ihuOl? zOwMof3gWTcGRPJlHC?-^S|3tjSrfYvWcN7!AkkQ6kNfC5h;{rI#HR!|C@Eb<>>^dV z6OFYxCFU$JcKM#;#t^Ntv14t69=8)~e^~KMzqH=`Tf%Mq9HBPOEbtR^dF&U(Lfdge z+kgaS9t2UX72SHgY-;@olUrfkRMrJ_ zptgCMPgYtl0D<@{%*rY2j{?SaeRZS>mZ{XKbM0hzm`Dfg`l5l0pVrGe>BN1&=ne40 zz+t0MHN9bI#{?Zl_|=y9UMRQzXj7$ zu(Ic#QO^`uXM7s~?MaxewtVtEVK=bv7;<~gb;5?tn%X0E;xA47AUx>Uel;s<+?)05 z;&<&|FNVO&yFq%=f}1~@%NrNdtlnS_TsN8YH6T-lcEMHFRd^fYkKX;lRWXnMf#sC@KYpxc3(HDUUH(4UrfsLzvhh}^_7*v0JsdHB!+dIsJRNX|QYj{DjE8s~fk*s}gVd)uPXj0PdHk=MQ z@F#gQ9#>{Ia|e)tVto=3Ls#>-V0SY2t)?=8Z{H<77j+f)`HYvd+~>%G6~9ETS`uh% z-mI!#96|6V@%OXM&!RR6xtK@2Gj?_uAki=U1gP)h;t9U)%IyR~9Bkj~mzUgCsi7fX zPUfv?q{wYn+uINg!NhKdmnXyLG~hK{Ycm~u^hORLjZcPF?dp1mPjN%Y7051_pWpXY zdtfe!t9A}X#6)I*`$oO_J=MJY@7c160JFo*YLe#=B%mSDg*P(Q+2b;So=C5JafFM? zqVZ#mtz~vszYN=jg7Tb59v;S0mZ!(nuSwRKu|_dI7lsUjZ92vlsUXjSQKMQmBP;J~jgM@}3t4A)b%K^tQhQ*pi6Y ztYs&iozDX6`hWXe&c7UekitHug{ygI7j+C54%1_IBw5N=^@!bv6f!oHXjC#xuLhNqBRV_!py-j%c%EXx6(G8) zu}r?J4>SOiPxwPW1`$Xxn^yV>o_W4dLE^`_10u|f>_s^bOt7Ccn#X$<5z_6bO8b11 z*iJD$0on;^Vv!WdrSC5vdRQ8nk2lyZN#nm2@ImW%B8SlsUjx0nBlzkB``@LSPYr*n zt-?)@iRnJ`SLrhu*nX1UzM_^P$5OclyG1{7ot&`l!`Kq?r<;BT7I?`t>)GT<8{HPy z;COs%G^vj4HO3FktQ_IbA|B?Mz9s|=|Hpi5uPCG0f2w0=eaOV3Q~saQ15*W=5rwNM zyv{;kd3H0%oSUkx8epQ8s8aTQ_@9qW-hOMc8r>DkW;p4Zb4P3@kt&}0dh|P+;&Ur{ z`{cx{R2ELhh#uxYf-_WM+n!a@*YYuq6EAv3_qgtvKvzaNFfXn*VJ|@8m2h5F{gd)b}GWyMq z!xap}jU?ed36SBa!2XG;eA!`Ll5P40$`;lO#-X3LsM>Y#6m*WSRRX@ zPL&PHs)I{720!X=MOu$*9JnDL5MvPp=SR?_RiWXtkdYsk?2GA5<1`&v~BTQLL(y+<*3dP_Gu<<>E8M@*<^Qk#1w_3YV0~JF3!j`>L-pc@_c> z^Tm5@`e7#NiaPACIhAeBzpKVs1^Q~!q3JK6`G-v^y`b#gCpfe0@v%6aRX}pzl1g@OZyKi#BYHu1;MmpE7+j$z)X_I; z1)fpNkm9_9bMm3@(>d)Ci(TrUB*+r4V*sRTguZ=6oj+3^PkHOD$Vx#aDZOZ)v96Qp zxG9!R6|Ag#jj}(r1}%VIS^WhNS>%hcbuO`43mErtas`3{gLn^Dm{Q@Ov1SRbb~+>&XF^O~y!67={x2u24#1QW&uhlULKWH1eSrbE zH!UpyjDFdj1O;7O2J%QMb*hX?TvN19kO&Q5k!W)x)UNSY#|`)}zaZOi*gFMXi9-H9 z5OBH>m*h>zdxE%m%!VFe_N&BMXipyc?vKD+t+1=C;wbn`fM)d*wH?JQlxuCA+Saty5bP*57BtFBj68shj^EiYekStjrLhL;+{jC8 zfM>fRW8>ZawVfL_3R7dCD+Uvw;xSsgFS|I;c)fuwtwk(+f07b-EBAuHQQ=$Hd#2_~ z+N&4wYJSMMu~z#qNw-&TX}~MH=jc46^Zh08Gd&lQx{TIp^?qOVU$ z{Avtr2qsbmHv9z8&}c`Ywsq%(`+~3!@0fu$Qa{_IH&AT8eHVv0Ao;wj$ymi@q~?S9 z3sgU_a1-etA2Kb9<2KQ#td%O|eGo5s$=H+TTm-A@mjK79V`^7L%LH_tSku?5oPV`c@c;#I40_ z#g~S!xTcbRa6Fyo1sQZ>WR%&+`93fjNwNer`ZBDNDL(vSt*CKhOlJl;Nnx1G3GKwB zKi3_4IEWsFvRxET2kV=G*Sm141-@f=jpXXJGM?@32dhPkWD6T~-(0nmq||k{FCfnH zNS5s>jNN}(wOb47-HbD`P3IW%*g@)gJIG?j;A)JYlk|Um@gjq5GQ~MZy~uNp!Wp2X z1Dju$R7zs(K7U-`t;TP^7+G|hpiBO#pLW;NXA0>%#%<*9!*n8VPhu6%Zn=_|Ckm83 zo~=+$y7rz~CdR3x(6Q1jY%;+f+0j#ya#mKhV&FLDXAf^Xkv=CvaaGPrepmOZhHiJ~ zdDcOg2j`I@OOLyk3zXBt@Z%$2d!Ns#%gyRp^I{(_sd4R%WtmRp3vB!;+bD6ZhI;h# zMdNA{W@uELyy63yg=}Mx*PLm%GBf>QJXCr2<;j$$nmdp#iw{y&OQPU>??NI8|B3)C zIQZV?i=(t?&BE6GfSWVflSFy+8b>?2Ipc0eON2?yB@v>YD{%q1Oxz?+0f{;A9|qSs zQ>Ti$S#l;;8b;sAUJ#Cmdu0pS*9+r+(==-gVQYK?@-MPJv&v|8X7c(evEQ9+F#FQ* z=Yx0`c7)sfh*!jyx6d?p4;G8)SoVt@BnVbLOUpTNDh# zFD{rn%-@Zakv5kQEt&>#rCIub;fKj!VA2HhZf$)pxjtTOS=TXOcH6^fg24-hp4)gg zB3pn(UfX81Lf@-lpfGr8fRo5wp2;)czU7_%l)u{{a5+Yt=4^`q+kN}DFK<4*|0cR3 z1@8zxgE?p0Pj5PpAd??Xl#v~Tj`Mch1gII*H^n&IJJg1&xm`jj89F3Umy?Fp=Z_!} z(eIuc*P*F4ceZ>Qbz8j$K2YgDoHvL1$1GYcIxfpI1#F!(ZmQn=f?%fF0MAuxSGsJc*m)WPQD0h)y%Oq+r*1Jlyx{eB&@&djJ!FF$Cq1}z z(XO9Vn?-8Fu3oKKsD@|_VN8wc7|s&lsR4HaMwF|QHsXciu*S;%%&GQ+B*{2q4@60U zQl*)bO)mcj>P3zPQ!xL=;VJm08i8VsZ=5woP_N$m9u8M>TLO6$E2ob*QTvrSLmv=# zw|jg$Y!hzB4YND;S3XwjzH6hXitxjdhN;1^+ZH}*W(YghkX(B{5Mjj52=C$~_B>wj ziV)5)g=}EAMV)KR`Hajl$LRgJx$C?U4mwR-O~iN>!=w&Ab|);P_F?w&;+tCl1_TO5 z65qJr$n~Z~$n5sR(w@uA=_Jgd$ubt@hD01YgEzA}#n+k4J5`}XcTLG^VmMZ@UNnekQO3+@@82O|y>5N< z2*-wF;m7gPa+1x<%a<3%PZ?uBN5fbjolg=oNHkXfBEc}?Hkre2 zDZ;==ymm9ad{I*r3t~0A`zo^JvbjfqW8$;(S{MtR85a$RC?a54?mAxb;90|;v18Pf zLX}2Oq_W4W>qvS~Kv0WYw+o<P*Lw>E^BoJ?CnP7$6)!x?>Z_zew2yA;4!i9Orkl zsWM`DZ*Y6xCFGjdHV>g$$w}que#yE%5|d*n)nD9#D_8S#-{I1}^k5p2E;&*xgARu} zNlYiNdbFiS_G3IQD!5{4;cFZjd#!pdOUI)NLH!rUt1f?twq)U>Wl{U~l{8!?Lgq;4 zHq__9=qe*>ge9NH-WXo9Oxe%DT7JzxgDBBm%#6PCi!cYV5XNW4o$_ZN0)BWMPt*Yp z#xt{lBzEx$?7tm^!Q>-Xv&-shVOl{<^IVIo7Rf46I>!EWb8dfMP|O3_&b141w1U@_ zP{w+3&vyvXU9K1A3l?J>J>U4MsPwBVo_(>Xrc8avO=w5_qNT(4&dJb~~$P=KDH*F=Vo( zxfboMp8-9Jp#Vl?*~6UAv@68y*RU|r#fNK9otR0-*NxC!2#I#k{Ogd?g8;xaSN3xe`1+V-{E~n7NsJS$lf~nEeWbA#IfSLQ>$+N}6Se+P$B^<&Loy9A z`NFs^aR+ek#xiB-B_U_@ohrU#009l<#m?}>x6;-?j@qcdFI$E#HIGPW`11iDJx*aD zgwv@g)<4UN(ot(g>us8j!<9T$tYd#dMH2d>>8ERGrC|%zAEEYo7mPIoF6@`wM^ojv;v>`5XU1^+%N zk^63}t6exc`5Xc1qIeY>1B~uaKcoMBESyJ@z|ja3CHL=VUj6{~*UjL+qpLunoF=q1 zfdnB0x2;1}&v_n-j5gPfoE3pM<(kmuJhWXZS8$0X=bgqxIrJowbI_;7)mAR z|9&57qZoJ64LcUCyh=rSwF?(OF$K1w0f6-C@QaIvDsKOugXuErfUAHY!Wx=QV>&1~ z=mfqgDTg)XJ}SMN<-HL(%7(t&>Qd%~vO$Zj1iQTkUv_*Pl#_N|F$jMYM@(JCpsnLD zz(0)^!BX4$>2~l+zG?`l*uM3e+Te&`I(1neYeQuDpy>9srx&R6BFb7(WN@KNF1RHe z*E?3zM(ZTQSt6jzy8%ESw0w6^CS*Iv*u&(;1)yGtTa9Lg@*QmlgmaRKPS>b;3ZnM` ze8^jG?ww>KAoI*=HAysZyh*Ve;7dSC$laFn7RG?Rhh zM{Ap#Z*tZ(y3#s^eBsElERE2FyT{ITtlQR!ECJlVz1~;`Wpaa$b{rcf6J;l#S1heX zY(H=@+A2FmaN_!tORelSjtOFtKbPj)?m~XqKo_lfz4|h}&dStFJb{{XG-uk*P*&`E z9yrqV!-OD0viAIma`VA3c+Vb?Yw+H_zXp_FcDYvb@}#fbkmFyS$GF#1HhIOOf;KL! z48Ym`QOTua{O3pDdx5S4XzHchElwZQxQvFnU)C&BOZ0Pwa)wa(%x4fV0y_AZbjvcP zV-Tj}Isg;#RvJ*#_C#*eDLT+c3+JEvX_dPsQg+VOZgj8mSkh3+2{g$S5aLyYU7up6 zQN&Q2YaYX|a3IZYQ`}>3E*A#z+4=4*rELFv2mv?%Ue~(T_Ix`wQ&d$t zT@(tHtVZj3Pm@sllSM5JD@n7|t`D9Rh%8TY?8j=4+wY9@ssKdRX~oIuhgF{l>J`Xn z$KeB1{?Ip;1JY_$BE8MyMvmU~qxmwfQ%JzK;(qxfXH22_yYSWZgGu7Ce%@K>$KCA} zjhKIu-t||x61?b=N3?9^9m`tr>qkiYT0v5x;|91zNJ+$O%y`oCcaEzv zGLN9HtSL^FuFiSZNFh(I53|XHnR9Hv-RZnH49ZILXxRK{oYDxOBwL#r=iT7z@{Mn! zscXJ2w86sYmb2evBq*quNl{)0XVXBvcq&V4nHB^mF~1plW_bxwL5qH8JLJYCT{kKy zNH2Ijlv+E^_^Mwrq!6i64xr{9@Hzgt9EwR-F^Qpb!h_6t2+Uf=3XfG_u_FZAq(8<& zoN7;qB_>V6wTiP6fPe-$_ClA=V5zctJAdb*)iUaJZkqh*{r%siJ+)rK78wg;j1)v8AOm&u@Z@t znE?nlRkA?HQ%<$?@A7}i#a=uyWhVM_Xs%&3Y5INd#*BS`dIT-3?<^~VHPCPi3aBw^ z6>+z^*90KYka#`?vC|R9hks*Fd2Zxn96$!lwIW1k;sJcyxwY4BtwW+--ZwmNZ$JWcn*+Lz}zPFM;V>|=qo&)A2j zH;bB5bu{jLx?0yCe&%yUdLQd1C4)=-e{j-{!Z?3++)=z?Al$t=4i_dJ=NPib2A7b$ z@Nb#>u~~Kl1rkN?74byvzLVmCO-Gkpx{pffA3;~qro@)-EB9s!9&Om$#^ny=|H?ni z4sO?`z~B`2vrwDdcH zgR~H}I}1gtj6bLv%JV%*H{QKGnCL}1&(KGbO{g9%ecGM=oD-kb(U3CaC-gXjh%tut zxQ%*(#Z9t+b|$V8vylDT{*0P?0fF%C*$L_)WbctDa?)6PA! z+J*C}q2t|gqH2JDZl&gL-FJudhaYEZ%2$0aPUZXl^u)h96PNI<%PBYPf~qVE_neWj zMtwhBH;5*`NhbaqC3XrmMy}t)KgOkZxhLJrW=<#Z`FV8WPa1LpMMaCF@&EjzMSy=) zodF!A6k$WLV~M!`L#gX4d%mgqgMTCR|7d^f|3Bld(8^w*#S`w-+V=wq+>09qp0-Yp z3!ZE8=aV_plr#&9=zU1zqM3-8O^8Rs;s@S7Y3_ivon|Humb@HRaU6^)80U?7X_(^L z!yHa;rY9V%Rre#Kkn3*>p>21DN)~V^CF0~4@9LOtbH29iVB$nWycCDQtBL3j9?Z2y zxfvwaSQLgGxy~%Dzy@%$?=pMiJ z@l>szAR)b4=a3(2r7wru!p8I3;t|ooAu4CEB!`RGA5^8v?#6FLXec#DOhHQu+yk_Z z_+lB(Y(3G{8+1f(i&Pn+?zb2lqtDYd7dzIhK^WVq3P+Zr?UaLwB^xE( zLhPhFXH@E|u4JZ08cF(DquBECqOISyny!D|IAIS>W;~`;`H+@E#j8tS13TOv>I|r~;Vh7g&4afD1R2~L9l|B!$Tm=W8(3qtD|Nz8v89d5ro zHg=^znZo&(Bg)>F{@uN-DC<5A4DQyU455T`=03&z>VdPD81LMw8#7MDZdT_>A(HEx#u*$9n%&0L)k8 zN&m*|yH?Bme^*~ox6nd?b%p-}Fo1vO|9=N?LyVT;54sosGc@(z0mC3REyYqPOmO1` z>&Nt+cglnO?6S15w8Vd>VgJ9U`R`l*|GH?fpx8kzX2Z^n!Xc5=Ktj3gtDsN%(}7V7 z1T#hR==7mUMh{rX%g-uV{OpAFD=u=`xii(*vqkR6o>F1>TNn@>p{!#5pg@rGjk2=r zm-6BY6W2#O8H2AMvdl&OOq=g(_!tFXDg>HLnnqU;g?aez(kNGvJ0gGHa}QQH7P6$vSct~l zBw>?Gi@0pY68Lh5B?(V2oqx*SF=6+&#EG{5=FI(oCW2~S&7U61-&Zxlsp?lzSd=Td zK+wxV_KcO%yN=+|(h|~ z)N1xz)vSqVv8>LS&Zc4~ziYxWHMOq&zLa9^K1aqkKA~6IKnXXZRo>;UX+avyh(LBmdOBssD8_Akjfn%YMY60?1c*-2mE-`;$T6 ze^0Y@wfiO}LhD`QJx|LDM+Y_>gMUwMffPW;yuOT3A`vjMWasG+0Hm6DguyybACTFx za@v}XU;a)lAKjp(5;_kg?B4B?mj3WYB>8N&O-*K_HcWBoLPtEMLS?VY8=0#;AEw2K z^8S=$(4wxFQ66x;FM9;OyD)y`#L(m}PwyJCn0dYrE1A5QbpC)&wq`ph~RE&&TM&qB(~T8y)# zO#*^Nx>^;j!p|RmW?;m%ltMBCEKl{07`@j5KjD|U&sLsf7-Jq5-@!@D^jkQN2?BJS zju<`)x1-lU;x>8vxlG88ipbMbK`Z0#j8pK`NF0;^(;wYtKXS*()BxXPw{~j0gZG(0 z#V(loqT+5#@HLOWX%(6cqp{+M7|9bo}RdL`0!CR^rGu7i%bmQhJ za0ff;UH`(yN9hzCfLaFN>(9#9nw7LhF=MpLmE}~zbLLe9EfT4&Hu8uzSgXhfa+njzP}o zkjIaC#yt@Ec`z6*PYwx>JNnBd5CuK&Bq1z=$|ig7>z_0y!`!*-6?z1^JUhLm6Uyq* zT@66d8Y(}3_P zXUl{kT1GHWJ6=r$R3vY=IUOQyg2SK3_8aC%^8m~vkuOa6@|ap^>nK6R2mQv z=C6g5@mGBeGA*y@1@|0@SR>~Hes+qQ(_pF}ueAlK%W=Ye88D-0c|4j{tdjrAtN%P! zV|F?D(r?H(`0n~zguT_dy+%76kDjHS@S{2HT;3Twy3I3{ny-nXw+o;3sin%lk zMg45wh!VaDmbgs#V}Kw=2d~AhftOtS+$6*mH^lNqNY+QbJ}oh#`v?{Dsr@raxzen_ z@Odw%dYVy^tIWd(9S=f#r$zYX%0$}E+|w@b-_gH)*l@cOybN@-m^sqTA-@A?XPIu{ z#AmRtpfK;l7h9VG-Ud;nI|0>{-&1XjkhTX%ohR&C1*cjAhBhw7OP(SPP7rC9I9PxA z^ad1tcUTj%0Fh=8NqYL6bzD2QH%?V_J1^B{1^!l(7Sk6?_ZKyGCC?8OJMSB(ywp!S zAN!O)SMR zQofb@?N?XMGYn9@Lb^Q8^I?JYJv7K?(1Q1a1V)hfASbTTltx1@*J}T6QvBzKkZ!$_ zU#SBZKCf7^lUg=#Dg5us8xTujPfj$;8uLj8p*-)r+wNfhIT^90%2On4_LLlQ_JV>8p{4Y z7njwG{O3!%sQjlH2S)Baz$lS%cN2cZM*hZAXMD*)lzl?!KkwO!)IZ%0)927>R&;%& z#wf1j2-_My=R+9+tS7=EIW0E6eDZL&6eX$@=#(o?&`X?Rs?{HKJn@Ug*aD!IYgjY? z%^@zBbq%f`YkWJXv%J=MUUro#g#I-uO`LGG08%`ICK_8GZw)FSiBM?Dt@yzq($0s(u}|A5YMq zBC&JSrSPBliY{iRE(Ue_@!4KKXqyqS6HhTB9mM z3D*yiMn(>aA8X{b3jB?XC#dT%$6!!zo!vH5&K+SD)ZO*sYAu+gFvnf5np8SqSmh@W`TjwHL{lWQsU5fKf@QZ@=%dfTHj&S(X^pNh63CzSWF=ELtJ z_0Ps-D$YeG*|G=cm_Vj7Do6=zk%@xN!3+$nN~QQa*iT~k<`Dz=S*zgzTg?w=@Sw#J zLrSsK#OFn#p2?8o*31Q1w51q8Lw-3C!6Dz_>Dn(aW^VEXl(Um#xct?))?FH1~ zyG^c@LsROhgNaRO%<3wBu3kVhUUefnLY~jZ|7XE9qI|KhO+iGXt^Y{OJ?YjO!N@Sf zNw~^4S5zCM`1q1k(uhF>pWUkPy6rVPI%B;xYB(ozp=k|4-K=B8u-SgIJh}W?b|2r$ zP{Os9_)^ct?8}G`e!Yg zW(b#gmPAtca~s8Z!of)WluZ&E1Sq{oBve|FzMnS89W&x-7>z(yI47IV}fMLMx_DR;4Q`f&~cSXMarmq-BBvsA| z@XAj5%$JGh=Ip zRnFCKQ)9gI8SQ9`%NcYS9TBOcN_ADEKke-58)L+eyhowt>zjnU4}DOcXRwPAFT<%m zzKPOXYo|wjRchpOx4YY0yAc9a8GA~Itydfxw!v2j0!~qiSf#D!Xu}pSOR-Ysai5Ew z0hjzb`gCiE#PhozEUrJ`kAv?m)jv*doQA*}zl|!+tp2dSb}?-6xR!+2uIfdAY)dY| zZf*zsoHc3>l3<}4AIuf9mt+uq^j~5SKo4xospVL>7vfN>3+;yw6d*Q}m3bDWiK^U? zl1|_;zNF{BO8cr{SM6U;J(bg65^dI$+Sz;vy|3KMx*JsUnjs{?g=6DgQY=X7j9}tr z<^ZQ0$L~pwzcBED+BBSVf``)ID`Ic{SNP#X=(V^~r_z!BqaE-}xvtX*vgr-0r{}Wg zjOkUc%x|*i%E!%zm46-0L75rIUb;kivjO;@ubI|w?vt}IlWIkIJjQt}$0XG8W$J5C_C!!h(NmTC1(LQ(kJwWr&w5?WD(zp#zCyZ$jMjf0@AM?YK{zf)8)5OAZ*zB~q{#xU z;{+^|uEBB8Mgs55kNqGYR1U5iI?*EW!g&RAjy@&FDhTUEq56DM2!?C0`9CP#m(6wE zg~W{Ba_%w_B>x1vqla(Psj$$=txbiy#y*#U;S?fRv{@@BQ=Bq*J>FPnV}HFSlx&aa zHF7NyKT_lrRw$?X`rDVHXy9e1`ez%V-C+iM`KQMY(P~9(CpKZQh91aE2*6s}F~-^% z&U~a}>?tI3Fl&OxH|)4NNm4Yz%zw9N4G!{kaB6J`-^ zCm|lB_weq9Q$MWa0K?dsHrqFQ*fmN-YXGj)v~%36HVwt+6?|Y`2m3YHyRe(Mm=a1w zOUj;OXd^r$eZ8KNtVYIL`=0I_o!Js1I!08)#Gd^a*HRjdcP&g?&wFT0{}ftHQ~lB? zp)fB8rcop*Qc$E8!5Eh#8_vIlsGmS{#!_yoJ^z9@NZF|e zv#+GAdMEQ%PtF@XUmILCh*V>X-Ey@bU%KXrH?Bwwr{FE7!;+=*OR~W~`W3%3y9kr; z^`?j{wv|^g&E-8)AL8witni9#E#58qmM!~5&||LJM4m6y>a~av=KXi^7j*(2&l*b3 z{Pn-XH)j``V96VS>pKYz>wTxkRTNI*8u2oCe-@pgtSC({I4qp(o3vopXYO9GN$(*1 z!Qf5B1bm;9c4+enZh5dso6O>&dCITR;gBW%S{9B6X+{9OJ#5Y_5Aq`bJv)XAeQ-VO>`xJJ({gCS*H?c% zmM=S7U^oQsQsH0$t^2JuK8T5sR20b0Fh?#x9E_#j2#JfjdgpvcjgAb$id>T_t??P~ z0r-cxRiyd>F9C-dU?tk*W~04|7naSOh1_w)7PX>ZnJnE>SMZ7>X#o#i^S43&ZPWp)QO+;#z2RfGG3;2C`4{Yv{A0 z8TQ=ev?5J7nUcU*{EY{_9PI6b625PJ<A^zq?=8x~dOqK$v7q|_PKvaXi?E0SO!9`_ z_kL3$L=$X+pKp-e$(!WAMGXDBC|lSAjVZ57$ql73FAb{i8H?OH@8kqc*`Oos^hTr& z<7Sq!uj>Sc9ijRSPOp3?Rdm~iK>8L4iKFVaZ$#|{@7x!49;{%-!_>=$!3+V`yV~47z>tg{ika=Z!B;KBG~X%YyZlMm~kc!`{Y}dzVokFFrg0ucA>3&+g&~$H?}u zOKI=gwE>|jeu0(A&d^QF2|o9qR^*{dq4v_N;6`)S5YE(Vkgw*Kl(q+U2H)0N zo&l@XuExChAjkR@+CtS#mLZl-OU>itg!G(xCa@A`u4rXbFXW)g868Ox?*Lg&K*c*n z1S$uTp}N#JXP9c<0j{8aCLh!fAdGq9-rFj?T@GKXy%4&-k|tgFy0G=-hvQ*;~lsr?lxRg z%_Tvd%q+S?fnuxF2#kD(_MVMwmSq@cG|PCyy;P-C^ETX5`$tG8n4gVDrQm>#DyMYL zx)c3V%zf>LeN_^3=(?k@uORyFN`E6QLGoM9_uf@TkX67$BuHDt%rI#Fm(`z;4Ckm{ zV+1JhEv3%fTUEpR9?T9?&ydms&S+etOeDcjrU*6FO9Sj*RwG?t0aL0tdybWAv8&%O z<`b7j(Rvv+eDc3W_EnD3CbM~HaldUMrr0yg279!w&J-`nY16ZMxG|mM09o-ftHNpqdcJ=i$R>uMM(vhDXU~>PU;S~Y%|RAPjl&-$N4m2-KK2^N zY+sj+LibY`2fq0$7Amx6!Fd+q#WlX+KEK|d#iY1fESXt!`uPw&sXrr?4)QpvgF}D# zGd^56yZ*bm`dpdUjvjODwM6W-e1&)wC(059MG?P;lFiCXVa?bYq-BDGIas;jOo zcO+HZ!*l3mptr`i9y#7rRpn2(`0p(Iz8{Bkc?Jxk`|u*=&1Zq7PAhted+;_q*>8i) zKr1H3as(=daog~4O}c?J-abvaVTvVErs@RES&>t2?_zF|$xHd|nxebL=OI3wGK05V zyG(A03}P4?hfmemt0ozWT7ZbLt0?p1{ei@4ZWEsuqN0(SB!LBNnx9A2X$Ltpj)NM0 zz8A-9*;&90r|N9r2sW?D1(QO4N-`S%eftz3S0qPrbI*^ENiHR~28DsL1El~$1ah=GcN?TjC* z?|*#jV2LP&g#Iu^@8gFNiOfCK1v{&N!-utK!S0K@!%==6fiLrl;6-_2$7-4UL~+sw zHZy~Tq~`%(^!)BxA4qz{f@T3gePifWi)(}?$oZX`aJLq3>~;*N%1{C>|$Rxfnwj8 zK;$BM_HmgXgypwv*qi-Rpm^``lB~y0G@bREW4=c7w&Q(XHTT*J66w6f zyB=WN{~_Wf{nMAAjm3NWI741Bwb(p)0ycNy#y?)`??#2F?!6sFlkjOXnl!!#&{Ae8 zscA1q0i+Fj;8tXJ^&j(q`Xg44&r~w7+1o-ZoGZO`h z0qmyVlf<`TOO1v;xeHU@>3M8qaeh436+AuApOT-Xd|9M@t2Uer(#E zL)#AP?G$D?!{|8tc=5kk0A4FTxZ35PM$GL?ZmomOh%<|f9)}DmU&Mm{bZwWAsC|&#bl1oN6A?v$Ght|-G7Ha{H7ZU zk7|(#{hjAOSjF2aIJ* z`bFf?G<;?uw-E8m6N%IF1_)kZu}vIYAB+kdi!-|2A@&_?Xor14od1~gNDC_mVfV1A zqE>VKC2YbmTM3Ou?eq|XoCNU8|*_{1+LtCbHkX;FY!{Dk|jzV~a3LL%=2OdON3(`c_x_*R?OC%kTv{CRy!8 zv!znMx73wIEeVn4Aq$d*sB#=D*0? zY`TEcE+#0vhqruw;#!D6=G8YtoL1C8RXfK;y!-HE?0Z0Z^R*-P8%Cs1ML=w3G)IdO zd`Qwur&z4U8oLIFKcmMVZk(#L>r%1^8;BBroT7dxe}}tCp=iaqHn05^1#h|-L1#F( zF&nJE3pFIPd~Qp`BlzUmLdi^($&a$TqbjaL44fk1-tyVTQzPAm+oC7bU@ccw7a7M* zXCzWTg_5&~6imOO)p%QVg0X>YmlD=&_o|Js9@`=vCH)$2A)?w-FT&G}e80bT4;D1j z&A@y#{mna@wTYw%Z>_A2a+jh0VTK9W1V@OtoV^o?%c#p8e?TlrniX(o3?~plN@qkv zT{n9>5343)(-)3Ue{T|3_fY9~P?`6-pn6`kKRbTW9@6+?jdCbmg7Em-`C+Vl&&K$gSm^m>r>rd) zPtpnHRVbAKDV0MfV5~<|iXd_i2D)Jss>lBtHHmLwN{^#b#RK?RDpONSX{lcko*K0RFK81%*U0S&pOXTQNr0?DvHbm2vNk=sQo!!su7^~AL4th zMlnG#y1;bIQI+A_3$4B88OD^-gX@`sl6Ssg1;u})2G3*WG4yU?|Il+laRr#KvvJSS zEu|yii(7eVO#d#^ULb%iX8|hK6J)w3e)sh;?Hdu%q3whD@IJ4tV&d`ENWGiGyzY@7 zj*ypDhHm)nR?1a^Yu<>vd zyM8e!wyJJ(b7X;!`NnA$Xj${x^d^W~Q~a9~+d6Yv_k)I2pK$Cv!3R}>ttg=8Qp+}K z*x1qMTTSZ!Mo`ORa&QzBiX~O?8ut*7^ly@wHRd|90b%tPbyW!+%gOZ@p2tHh(0~F` zr<;usgIWbnz)H1lwZR!Ay5XX$X;vEB<4rjkQ@Px}#ls-cLi4EdP~cNGKJ>jP2KDJ1 z=3q1ax{k!6l?u_>+%LQkKp)Wn`k6(rF8e!a;$lRCm!JCSfwTL(^K8A;nAeXj(hB5n zh0a1};U08F!!iLBb?hA62nPq}$gb=8C9VH8ULhX=onjR=6SW&TNFOzv22@)NkcX>v z_Rf)HS-jau&#S-1z|DuMRGIe|pEzHt|3B=#XHXSS`}e6Jl0kCLAUR5qc$6FjBq#`y zRg&Z&C~ySHIims|q97T`K@K_R93^{Q;Sg;1w<@U3;QHRINoPLzFN)T1t!Tas5p!sI>8-srzjw z%1X~UTm$ST`?;s-}&pRVS}`3U7*W?ffU11ecD#|v;46zaDJ zxo-~q`hD|@&-XOUahHg$8Xk;iTfUi!g)9`{Up~k{>n_(r4v^HQM~&3BwtOuflOL|mt4FKsnz3TE*e zkF>N=wi^Uj5zhJvda7f_$o9pa<~JEc6p5h#Q2XEl4t7yx2@&K>6lX~YXpgk$sNFcAgg zh%S|)U`Fz4O9@KhGc7I7y*h-7iGTNX#GOr2gujnb^fpsg#+$xujEW z>)1vAKZ_K|i;HnmD59epSG(H64UHQkrzsV1$gplu{5yw*iZb(N>BBKwX#g-`kNGP{ zEHimmg5CyNkm=p-H5dE3;ZgQ7Al%(~E-XF|#Ohrb_CjP2pLox6V*vDG$SjBbo+pB) zM;}1^LJLYRzr49O`E(r&*coWcyO|a4=4vhZQnk{8JkmlfXDi{(zM_~9<6B^PXm`(B z!mex20@7zge zWQz=ov@Ug53L}Y849_#Nmh4hUe&FK|lrDex&R#3sG3MH&m& zYJGIr9{$t+Lit38;*6y!uCpD!GyM?wPU9OCLTe1lB!GLSY~dB4q@rlTIqZ-vRjTuW zJ)Ju#S6T*iQbHQ&HpUzK^z5TwR(OXyMg?-`cmu@`<}BYdFqQgh?x)>(B3#yx0nHH( z`cpyhbQm%wO|BsggsKET<2Wn-H6Q!SRxiK(W`)b3GW>RLz#mk&kH+zBASf4)udbF<+Cbu${D~wc|8`q^n$%nVvX?~K`26YcQVPI{sa#m+B)5^ z4U2ODx17l+oM@r&#tVIvc{?}Hr&KHk`}pOJuv=Y`8bao}(wmgl>q?u$zgAv~m)534 zdYu6IX=Vf-+li%xY4!Cr0GFHmKu3=l+^TFEyI1>+-<2E%IhUMXaL=EE47$K)0^*|QABHvPtvO7yYq(Z z(}i|Uz`(*w+3h_U_i5U&*{c=0ClSB%$39!w{8mSeB|Y!U2G_X(g8p(u=6xAuCwhS0 zVopIm!4q{VdcRje1vR!TORuov(i%~nLUk}f-0%zjOG>~jav3itR}rOmkomFP?Xp8C zN2yl7xh zm%m8^e-0eT`;DImCeA>FQaEL;WFO-355W}i#4#Rf|&SU$p zah15XSy;%Wfx9l2DSudAGTXb(UM=M9lbT1&r2RcbyAST=!xc)3Q~lg8#KgGhL8?LI z=UGYh+ok-o&yp()Z3PM_MJt`+u}q3932G`PQ4~G(r&0vAZ1r%^Zz*i@AZ_Qn3uXQ~^Q%@z9Mb@T%DY@m9Z-LQwYCy1k2`UX@mHLG~ACZUb zKIkh~ZweJtQGUyi_i;Lf2sh(DYiLvnjB5#7z3ibaxL!`Pkt0a{chxFd{w#f%D+s_? z_+LJIz*@p*X@?yyww)y1jPY}BWgrRU?x)YYHEq)qt9=khFFo!_0p^L1uh-Mz{ikV! zj2u7fZVd|((~iP=w$GP8-p1DSu_+grukJw*)Q^9${q|ySG+RE7)Pk7CcdBgqjUY}7 zfIjZ=A>D^=n|bqUe-Z1V9e4&l3GGobHAXg>j+pBh?ui8pEsk|~QO`|&w z!pgI1pgs6p=vimy6^K;U>|S3FStEr*HnnBZdSSL%FK5BHkO+AxX1~`ko2Z{rqVP5C z)}N;a5OEAh)FDWSmBEuuv$1|8LtQN_dKzD)ZJEr4WTZHhb%kw@q+6_Lr@z8=88n7U zU}lGxncr*`n!VoF6ulZHiH)(2BUyjOI;qAO5FBHHx|JV*zDfBOu=RyC7mI62OCa>A z)CgPbFQpz5F4XgHb?uUwQ{y2tdkUfcsw_kZIp_>Z^3sG^w1>c_D0e?95vHdGG(dHl~yky)9c-`QFFn82>In{TpR|9>2t zwUy-r=gZhg=Z8l)eWDySiFsBS@*l^IL1rrWT3+4mnq(9UcX_jF=!>5c{>QNwPE#a# z>R$9_GW-2nV*N*s63?@#|KoU{z?+IoV2W;lSLMmSjNYL{QSd*HsSfxw|MRt;{*I-4kl{e4#RCxSpM1&)-ELn5z1^)g+;bx2#?@@6rMjuJI=HSJ_$IKh(2Al>lIMWC1KwS zx;|gIfMwjKl#*)^QMS%?JTBM%#;%KVkDU=XT?9UQO`G9PaXe5sRXH^Z6K{@>T0Y#p zlV+JwS!M}P_!X6cKDd0tmo+mO>R9@Bl$tATizSmYJc9=W=Fcqd!1$goZbfEjh*kU0!&oIJ^r#*3YClZ3>`4$9077G$(gVHG4Zxx~ zaimIM?$*`CmcN`#8VxabG}+{tXA!rP{~XaEM5J2!MSSUDh_)0Hmm5tZ`)x|a-iOaT z@WDRcX4L^zW^kH?YFx%3J1Vl3EVrUxoS^cyIpI1TD9tsWLVSCTzU!JvN%9DM(wf3j zhEsdN_gDo!)lLi4HrBGS_|5o%lA0&O3$zsF&B3}93b<8oM#PZSl1*+;f=TS-UZNJo zSMS$yFwTBifmT)t&eLJ%s>Zfon&EcM=CR5YlgQS0xC9gCI03$X4ORV>`|}7bPg{mGto7#8 zOjrmZwHU)?sJi@n&oFQ*M57urPq{UePB@})&WJiZh9(_@p;sIQ;;PO;(rZ+MWFape z-(gW;8AI5k%|0ATh&cZq>nC?OWSjD=Zu1kTJ|8I}7Xa*Ti9s%Quj}{O=iYrx)EVR zsh^xQSCV2KLami6W?9-Bzr*HPJMwK9Q}?v@lzV{7On!cRUXT~}uSGsvVWnsKyPX?W z8Gjxp7?J@6gXiQR0&Cnb&KQE{8*|9o)sp9xa(~!NiUaECokWT2rJc zi@n&#bFNsRD14KUK1g%LS5Hf?XaE)`uWA~LVwb--{+!#R0yQ8VGuslqTat3IEXC)+ z^W0Hb&mXgEw5=58^wB?$|6{$%c#293eIc5n*Kte^$qhtOG@THf%LxFK#6xa6$p>Cx#hdq^=QizDWdv!9v zl`^?b+z>bRwDoG`)t!%>1oBSt?mJJZifh*LWBna4C@nT`P(iDEHn%bqF>zWnGVUD> zT-Qs!woE}DtF23K;L}ejHE^K7=;p`)VJ&o6zxpyiBAG5=K&TJmG+)cR2vVVz#5e&F4WMkeovi49Ds2eR=wIAaI}L$-%mGbm#rJAH)g?7v#nK^E3>RQzjLJC-&)9 z3`A8e&(5KufLj2Xdei8#bW%KaGAKsmmSR4+3umbzCLNx2Mxn8!aJgO4K~i@rAr7Q; zLtGTPnVCvv9cjcdLtj+x#6mFjJLm1Fh1o%& zs;VTJz~U!cluh{xyx5<6V^YdY z57e-)|C|k!i-bHANXCFG-yApD{Ws;}0ONWud@9v6g<6oH(sH^#(BUeiia_F^V`C#2 zn_(LKx^0GHe-{h0uF>g2qqrGoDK|I6_1+#9@_686PRQ82RolY-q_^Di^v z{%9EsxzqxGchvACONKtyjNfuE?PrXfn#X7TysnD|kv#HkWI=xowp9G%%i_O9cw^y# z4h`^)zYYz-mL2m%#{9&rGev{h#-*9Jf}}B%!r<@!tf+w=3)9AHRinAXEXcsM$Vbyy zj?o|FCH?zV+9nGIWIp!12|b}TWKVsczkNe&S$*oEMc7uit}P)TW~rkb+|xh|4Y^RCPI|i z!N~Cp(kG8tv9Q{>f1%~GwU+2~NA*Vz8c^7OLM#8?V4T)x?ln%E|zy>Q50`X5Nm z?u_`nigS|?MfQ)=I{9uy?Sd17XXHnN1LIhatW{+^8I9*;jq8hfWwxl91t z#m*A(d?Go@0y(1jWcZfqfO^*;4$aG3$fG)!FF>D&Mr9sNPl0{2oJ6XC$sOb>1xpmQ zFv0nKEQrji+R2d1QMO4ZYifjC?LwUkZr!>8J?bKfT(8S(#)9-BnSv?i3Vtlo-gRwj zR#IskZgmM8hR!%IuBN8D1Y*!g+}j&Azb0SVSaaY#ohmgo$~uNP{Yg3OKS-itvVKZi zG^y~T1$4SyX+9VJ7|W#iM8vk^>W9UJe_JgA#yCDQs(z4U;Znc)zW&~NmQ9aNr3a6q zzQC98f~!8A4}R{kr1x)V-dcHNqUe+u)LY?)qq%(p{a^0;wDHl|Z>x|)R$_e7k_f`rYIolf zrr+!BmPDYdkVkM*7*9U;M7x#yU6IGyJn54~qLYvF<`LS|bJ{FedywzxFR*EyP~U@Z z{bTAoPzn{%iLj6T4;BaMTkY1RxbEOR-vlR_a{(t`OMk7%DW^loo&us%znyR8#y|?= zH7oea17>895FbG#q?-YUq_Jxa|8@*ZEH9z#-z)zfR|Ipo6?nzMS85ocqDwrUqk`1B zcy=gP!xyu3U=iD?)IraDV`NJ`P&nnAh^SN5>`%^>K8lal!*cuEK}%tP)K%Xr>395X zpSdpVBiLgREk(fO8P!FBMGs+oM(ur9WFFCwA7c5;d|hXs5!&V`jj?Xl+sQH&_;zm; zv0C`E;=#wU?h!%3J6dOcQ{4};M^0I}$oTm_S;y#4Z9d#>WMwkZBHYCKCSge?j{gNg ztVk~v&S4z_QLn*5mbcu{|MobRuPmRf`PK4^rX}|5A=9HVLCwzEku1aAm*gFqUO9fF9gi zrb3-t6a~16e!k}xsQdvz2j}w;l7gf z*ma>Z!u3kpR%v_q;yvF+D`21Px%b5T)Q%N1O;-B56b>=*&b9~L{IRSTeo_9RSJtcs0B&xQgz>H2|5sq zj-Y#Bt4PzF{hEY$(7NF_1~Jh)Z1`}mH#e)tM7|=eJ@7Z0THnjau@)^a`5ZVl9+CZ5v6yx@A-8Y)ep&yTwmv? z@`Q;`Z+BWc9I)ED^Dn)<{jad7$N1OE zS85KR?oZtd3*1o=rjw-O?e+L1Yk2MK%8A!c(Q4tKoHwDda(OsBXy)vO1D7l8z2>@( zqm?3j6JcZIddG^4z0a=@!=Y>rJ-`vjG3vBvbM!?gd`eW3&)@$iA1L*`@_%`~nat_- z;DCYsII}jgV3lyr^X!|rdo^Y7cB#bP;B%QzBx<4TVW=!BU)pVO>wx)^oT+&I!RW26 zb3qdWO7ZCPI|X{J?;~OtPU-AE&J`R#deV9<-YKydDtrQtD9Rt2F+cJ0(Ik*nz$UhQ zzFZ_3;8#St(Ex?%_jzLRtg$PKl-K&3lXO0MUs`a) zUY|K4e#OsK_?%kr%+#@1FfQ4|Em~!I?U-`8BbE#q;Ah=3nt~?v_m1GeV;`sf;*--J zmUZp4+R*}C7EC|~bJOu%r-hIxr~B5oiqA_!4}_IXN##D)nt#A?8hX6wl_t^(>rDeL&>=%1jQtHYsXVR{AYhtYFyJv8Qr_sKlL z8nPncw}Jg>CN%G8G~KaPfIr=Ra67HacDTKuBJ~j*AvP4G^TRse!iEb(2f`9v0Bbp=mQw75c zz6Fqf^QAvDKJaRr-4F8)1tkwTM2>SZH8Y8Fb#oR5>2Fn?{#b&eF3V4@E_UtKvHj?a z9zecKv$))Gs+yXv7^+<`?A^_i+Y>RM3M3!=%(i?t;{wHrcy+{G0u>2>>=ZX01nD+9 zC)zng16@zn56eNsUNV$t*e>8r4$JO>DgX1yY|@4H(d>?st)-{4uCsSVu;BjBu3ZDf zMsHD{mL3389vJYWTgI0WJ>`ah9S-dEVMb0tbmr_Ly8CHu!=#qy@7R$?*k_ne%qL5| zphp7i?+kJ^V};_=Kq1!jzmq?Y)cy4@1A{?^Af7XAOnr)vn=xY>##lTV-{2YC){(z| zm$4q`F~@$TBzHi|^%rxqCZuQ2imS$*RfvuDG)c|7Dj_BV+(^Jli)<@6Ln{)XavYt67HY6%Pmkm_Zx*NgbDO#M zLxN2pac6IkDlTqKLFaP)9b-uZ_~31B4q=4fM=elgY=iCe%}~AY@|?%z3OZ)`yKF@+ z?#%TfPZ6x3nr{^lwY27qv+bK4mdj1`ujWigTU=1r@jo2Nm1C6u5&v|5TW{$A$f>J0 zYx4zfVn^fOWdbz6x(@$$O(2DY?+7{@xqeggefVDgpL?AH{%3E^bP1e3>tB+LMcMDX zYmV)Bgl!#1R}{*fGhR(SR?YP=zxqBBqHx;dx?3(xI8$0_>tlv#K{DelPmKl`u?!W_ z17}qHC!sU0KFGsecd2`@7pCtPy;i``=*}6~7=PBd!goO?+$mp-sR8PAaP}453U~DO z6Hx9#C)i-FdUMm{7$t1cLIe}1C7CFIQ*;y2u49XKFXM?G^<-DX8alQW2yW&#UV>px zp*H2kargW4@9Q^mZS0KR4U@F<&j$r%{GlJgj^2WA8y}$k*Ct z<-ab%pzGLq`M|xq^eYs1+ow)Czl)cuh&$oy@czT!fSIy^Ni;8p5iq? zKIBKx;`Bz~hlv_|?D~XRnZQ1+3{-y`?5$zm9`-PWDyTMj&fZ3T4(f-}dBaX=CfwH#svCa<{@_*#1yj4?JbLX{pN zMy{M@)+Cs#TKATrW}2YubVkCtFn4(~u=91w1WU=3o|{^vbO!}FP`E}tc=CJ+D&TOA z`9vsn4FAd|B9!ysp=5RDIlPRn)B{scsOMsr(Rr(X#-dYdi_HVfoS`e?YTf_X@9hRk zX&4XFdu?Q+>gX0-JE^->;fGmtID(8Sw5feAnN9`{A~^9G3Av-W_wLtlP==E6N4D`; zBiKzA^pWGr_nr#1sT7l){U$14R~5>s5v&o`zH@t%{AD#gTh8G1E0U7dV};SjQg%D* z8;ecvwri<>d@r0c6*^NE8Y3@NRlhVfD+|_$G!N9}8v61eOl_K4>&EW=vAO(d#{v^U zE|+Ku`QeyDaPV5cVJDtSb#4AtegtdQ%b=*|92*UEIx5jGl^snTEWYAl^>fwRNhp3x zUp4IP{h!aMnn2}6xelvne#MU}M9w=Zg|&xmrhI=lZQz(E*ri-dW}V)mt`e>PzqZu> z_4WAgEB>#shyQNJ|Bu_zo86CtH$eP}3v>SaU-qGySVy<&PW7FFxDCRyxZ`*DoaNPO zed7RL{#!mR@H3OAcjpJjl z;zq7P+@2qn!NZx3M}0__Hf~>l_dV-hmgNu>7}fbY0zbPpQUKP_ZJ9QW4|J~$mdDPn zxif7x&yW2unIrJmOo%Ei6Na6%czyY<4zSmSLATCFQe=TnqXmt7Zf38$uDyCi6e5*A zq)}Es#l|%X?Dou|D{(qWVXt_1FNvPL-KkF+C}CI zY*s~aN*1nGUZXxSCYA%;5E~GViuu^K(mMk{;Z-pRV95lTt6Ym!JC z;TXQqo1-wWU;f)x8VD9yV~waxI(Hd{r<#E%xgQcRVAeeG&+^$XiPlR!4cJi9v?_Cbv0fv(d~ z$>-&rYKcB)%MeO>XJWS`k?WhLdiL$*3e{1jkmh-lE0*Y~d!;uy>M?6i4dC{tj%KVL z560OIH*7TN=GcDvdsaJjY$;sEPpi5<%2Vl0pnLVN{{vNk2Z|~!W>daSzvyf-jqCg- zmx9C7EOCvI{hwLKkFTb`HGlLco$GoDi{?ik+>-|W+NAE(@3rTe&%R|qi#|l~zJ3+< z?`cZW7WLmNZJ-PmwVv>D$SQ+F8Sn%HiMsj}{SmXuMfJ0Rjv?XP zD5rHn?qr*2X{=tu_TtDRwhMKR!os{+$s>0~>F&=QAD{daDZfz^@KYg?5c7=YnRGTI z#T0$=jK$vqw$Z{GVyR4L7>g%4U9}BG8Bb$HxA0gE{tho8*C=in(3!WAWlhdo8&mUN zY5&|9Sd%9NBz*T1tQU+2@Hc5~VsD9U{;l8N2kgDX}(l`%8nzm>fwRRT9 zBlDYGlNZ`G+E!y(g*1PVK{{1*41a2{2Due+F3`*rLI(A2_hO{t)CE93uA&MJ?Tq2Z zWr5J&*_%ZS4osQ0Ad2T0vPORyCe3#X6zu(*5zUQHWoG%(08~Np()cUzn_Ib(gtzWV z2AbK+T#Ses4(l;wi!36)8Q{#$A&hnedxBh{e^GYDsr|^UGK4_*YPjPh%U0nn5VR`C zUYYy{#%bso=%%d#l2*BVf$O)2kTVC_uZyp6p7wr7c9b6dsb2bVZ+w1NL$7S}QI9!8 zVPmzoiT>Y|%9*=GLZz9hl$$0bV7O#pk(Oftmr6q_Hq!^EEbtWj|32lvTkQWegOTl} z&@JA!-EBG}p)?H~~ zd>#KEfA=o}n=#|@t*Li)HGB8t&^g0>*F9^T|75Vy*#En>Vnw=vN*BU^ySt`=|F_%T zm&&9CXI5nSY|2{ERxw!==5(W9gxSng`KMc+#t!FCtCl%|biFZb>Q{GZ z`K+HA>^eI2&VG#vbQTt_xx=FRqYn;2(K!QpH{Xt?kV+RhMqhc zhS;lHYJKA7y3{&<&V zOW&auhK8+=h^ZSJxq02=Du;MtHF9pltTVE79~!=FrY(Fl4Bv}r20E$o6u<%1Uy8Zu zVDaCq$MBsyo*IM9WWz{OmGCGUY${_flczf}KXBbE-eq47Xzk)g+-rkw|wt*H_ zt+?SlhWY}?l0)b+a!Irq^TCp2XX%$LYOS4+SHmi`|8ykQ(t;-$6t<)W#Hzlo8ZBZ5 zyr)VsDPAG>68}EPsghz*aHOEXfQ)ONkF`w;Vk}52zLmC$ziK}?n%AC3mIYDtfAkvp z*TvRVx~B3O`Am8?k==Ns!J8yi)^hmYYY3JQnX}evp508KmtIp+;FOgh+_+@QNr(&n>OYEZbu{wta@PTy0Bt^m#-;HX~{|_3gckK@a>!Pd3xc z5IZ!xd^Y6HwCiWj3i$m^Si||&W3xr~i@R6!z&4?X3~On^Xuj6=N|QS--2(l?0Q&Q7 zaJA(e0rTH_G3#C|*b#@NHCkz-_W9~YoVFRW!indB3h`(G70EFC_Hre06=L;2pOK$u zW)rDTKeJ)DAM;2n6OcRW<){GZG3r^lnaqxtAMFjy!*1_i#5KJmoG%}tDYgd1XS_&X z0o$nZ0yn`FXptIB_QT+HLDw1d3hD*E4l`ocy5>$j0oxbkC5BD!o;h+U~QjVy|rZ3l6xKU{`XkLHFbKf)R4hPh<}KI zjyx5$ka_elo5IH-sb$7k=`GsO8BYK%yDRUrHN5RAApS;vPLbB*+;O3j}7p$9a6l3Gx|@J#=a;IC;525$v# z+%cNBeux{jlUc7g4%>=2pVb0MzA@2BOE^%`Qh^>@xcfny1%AVG5#7|Wh+-^w&XZ>Tt=P~>ouH?4 zaA%3{%B6AlKB#TaolqxuMJF}S+VxYMlis1wT1XLUdNmX|5>-A75~?EsY#cD@L+3=ajb6@Q$F-ib0L+1dS)#cXX^ zx$CSxR}2(1mDR=VWey1+%d(X|awcraJ<ed!D_ib2*oa6i==Ty)N7xi=y^Z!MNF&qOyFU+ zKloK0QrS`a(m_28u^P4;8tZgdsjMhENMd607>1A0%mKysF*8|+roX}*yW{!IlDvmU z(dC|CM7gqY$yY&wp^wgc*FA~(uy#7zj6jxZ3)Y5@?uxxspTdX&C%WT$m`Ahwa;%Ug z;anSQcu__}5IxutWH2sdM0@HW&8~{L@tKa}xEc)w!t%9s@ekxN3+4nDF(D7NmQ8N& zgya=Ru8s!QI?cB)EzdCwcc15KtHs4Swoq-tD=2yc?%f>nGjNeI^0I|d#CiNEv|@ap zi62Z3RWrAjngTdS?vj6+3s{R?+527wh&*fSaBIO^wJ#nAU;#J0(WJg%@0HOHw>~U? zdW?;$Uw2?k(S7V89TW1cC@X!?TPXP9Wut|#c<gzWXwV7}l}UK=8F-=4|geZH_yueR;Vl^G0H4 zvNXw4(lfIgI764W6_e^x%cY&BY9e(GEu;J;!^#}r;U}MgjHyQM)d>|?_a)20vFk>y z566$V-A&AofedsrkQ+71qVTQLXf4kV^GUC02CMTKqrs9zuq8}1gy6!A+%@D)Eab}2 zaTqGOUAlA3!eS$hX=f*J97b-P*JI`lh9ko2IdZJYa}5oNm|?$~iKO)dE@oSW-Qo53w8S9{(b9a?l4v}p4`vHHsXgvQwLhF ztSvSMB@nQ@AJC)L?^lKzo|R?9bL?1s>p;yy!Rs9Avm4WA;0RmzN!@V%aIng)F>JB% zI~rn)!dN`%;i2``UwG7ScMxz8Y|D+n5k&q~MOzRgq&~xMDRSLKTEWT#M9VqaN-GF8 zZm>TDfu-&CxMc+(Xeti1ynK3pT(L@Rz&P#$22tS3@xy)}W**`#vy@?CrQ7^8*p$CRLhDZxC`JQ~N*%!jvl5bBvm8j{Le`4hM6dw432PWso;{Idt29qqRH!st6jcdwe{cZ$%jNl#3xBsw+JAMh%Dp_ChlP zZhc%d9TA@gHtjMoE@h|tv>qtrvrrFbq#^oT7?aDBmk|Zj_1;Vsy-3A}in zpJp%dT&*E@bH3xRI(MVWBYg!*%(_R#PFYGH8W5>!*6NBTqeslMa5O%K+Q&lA9+?BQ z_e%YN)rfXyhd0HE0QQRpJJ?F^_GdMO2RVRpX!4nX{eB#q^~n;|6M#Q#)%+B%`jx%C zA|hOM{N-28yxlyzA-TdZUGkt`BNgbsVlB^C=D3@JGs0|`p!AqAqt~cq^pQe^Xv@v( z{(Xb4v|i}ulu?^~0j#?`@I@6mZhbpg(>Y#6lj}NfQgviBA}rMW14@rQo+4mU=Y56t zb3~!F#Q_^`OPCt7XxtSJ!CGE8QnfMvxP-~g^MQt?VMoW0HigS%VpZg;7fARU(2V2z z9Zp9$%!t>w5$n5objc9$9b4x~Dw&@^7pXLchx(P%-8f@U^=QjJH)X?(34dKjG6%0y z;l-TTb@)^ThTe$<%4&J^nr*N$noKUOyW$K3OvwMql2s?Aw}G>UO9bko_jwT~pZ;W9 z0JncrSldUVbuwi;8X$o0EJQuDdTi`2Gw2YG;8sWxpp6g@Qjv0JA5BK&8kuK)Sn@4d zq)CRt{7`N_7fSEtsSn|HAu*P1cf0sfJSS}}{>UYAD10Rw7slOHm6O~JV=8&c-;T2+ zd(`;JLd|1euud%Mpi)eKT#4ON+zZ8Dg^_u8WZm)rIg7hDwZ78?I?F}BS6*BrAs|h? zBSKGT_Q&MGgT!4_m|M4iruyeseO7NZ?u19hK9k10ghiNOTNXX zjS1N@EB$0_a8|wyTuYRaXBFW)ej(&H$_3udyK&RXc+x(BVNx%TiyX^BOKZO~aGcup zBQ!L-r^k_`FZeL%p`{-C&W6q*;UlPc&6=Gw(2AyvcrT;~g`O{;<|UFq00C87=IX@u zS8gqj6*5+A?<+(}C7yIMOlW*&m7Y~N-@^#L=dr*iO?}MO^L>8G^k8~f0wXAxYoq=&{AsqYuA}1mn9LuReidmzToO2o;aqZ6!P0tr z+8M>-%cf4I`SrbY@6=Z@Wo7ZoB6R|Rc5SV2t&t)^{)$^z1?hC*?@1XxNu|KcC4!*I z-?bcA4SweA-)CG86vAVLJjdtWlwJ*mN9$=y4u$kQr-yq!m8H+0!ih}KBfF|h`%`gQe5;|9DDtYJM{*W9q)C(rR*zemitqqZ-F6SDSqt12)HXL)Dg;)1N9kDSRR zo_sLb{fcKe_kBS47LH_cOq#NKjr0C(q;v(auLUKBt<^Ci@GwkqQW3MIm(c(OIKM|* zf7H4IX)g4id!2Uvj!ix7$pHNhlo7YaN{Bf5X~q-epG)>0^&&*u9pw%mP!0?dXZ&bk(myXPZfavwvGF97K`g6S8l@( z@7vdQL>HuJmt~#bm$ZvqHGd%eNw>eO+QR&)-wb{ZY?KzcV^IM; zhHa=CB$N6Z^CBHIRat-GzYpo$>_G&fC8aVkH=?O(H;fJt}n=g{pFI zBJpiDBfGP#$ZuMHo*KdY-G}=};GUm{y{u7*69zqDsWH#z=P-LGz%wKBuJhc=soW2w zvmo<#5fx(JuA$G|UOfzl6I_Qi>5Nga3zdG>49W69mBu0*1u+)SuG4HvD}cHygzQGV z(yIi^k58io%$sS!XgrRNRI2cMBBfkF55qupt>}l{8#Q3Sp@(@QhJ|w!x_LT6OaB?g z)17IgOw7)&By0|4{d9KxWdSy!+(A42L**H=pVgr^k@<&zXRRWj1)IbbySoQv#Hpz^ z>jM;xzRO{D8svb+ASJ^MM9=GXomTSoPJJVD=vOQ8)6Qp{*DCYUfNO7|hd_WLiK?I0 z_VN{DJ$cKSmZhv-j*hyk0YEAEdGzr*-YmOl#n>gvwOq0jhr{^h+!9Fg^;rE{T)tZK zNGQi*Hk$bt@4;!Q%a84lEvBIsM{H1`F^C0}i5I~n8~DiVblP_hei5;1ze6kK{PJ`5 z3gRhFo#_-GdW75ZfcSu0_4co`IGL}E<5$i<2FWUL*d=yh&6+R5Jry*BX;9<=%2j_> z%zw59nNiVvn9WhpU*QO1F0lAuIkIv*+jrShg8Lx@L)?jLFSgPxy1l52$j#O?LQ?+u z6?Pd|N^+yWQt(P$#;%Ve*s}bw<2ha)#QK48C5gJMWmISD6yG)ssmZZ5rm>6L@1J(t z*V8S0oCK_I985lb8+P^xkA&cUP{WsX7j1K>6#*Ayz2t1ty|X~YqZ0sqh&!ZT2)(@J zxjT*%t8imi4-zs5F-oNJoiq;NTX80b9)o8X3Y}z$x0&u&f!(#@jL%wC=X!p{k}S2{ z$)Q$~*tVeLBn|*lG!zAjQ!nd=Bo|sikuqW%$%PDDc zxvhLIoCja5EXSELY6gN5vU6}S5zG|1&Hp5wgvjx+5!>As32T&iD(DA^Zzbe=bmz+X z)X+Miw#3X2&s^YeDCO9>;M|muPVU0_da*ARLrzzfuKVleppvzy%h`jQA ztX4^OXZA;~xG~YM?%1d$0XXKK-NW6HMKsod@3ix1nayg_TApYpzuQ7rqathB@O6RE z8>IN6l>*`UvdKDZOWR1+>&1k1wDB9f+;L;7mz9I(ux&^W)Evm5G2sDLiw`^7+{sO! zJRVOy?qp^0R!r1?-J)r%6Z9mUrq`flqy=4E-bfDyUiOrw!qYTe_kI*~4-qrz!vJ^~ zP04VN3xi)!dCkN+s2Ul_5hq7JUrP+%Fi^~P{)I{NN#y=iF_E3?nH2K~I!O=qC?qv* zmUxM#x7NXV^2H{J9(9pRAr@~t4KCBR1dhx^4Y$ScRYLRv$h4zwse36 zS*`SXS*6*0daGACVYrXbP%&Kix$km2AQ%IBm?}%v1YS;Ckj~dQ^>EmcAYno;uvpf5 z24%f>@D63YKQ19mLc5uVtl(T|-E5WR=P&AA$%sJRM~jlDE#J~RFgYrOR^25pMt?a< z?JUC~)sEcf9UAzVFDx+jBuH@l_DMXmX(RxXMphepD*WOnEr_osW|Hv)gOOk0&ev_% zE!6IygxhB^E1%{@@m(s2UaG;Dv-O@LQ4{l9cY3IHt%$4+?aD5J9tb)@zn)2U?GNtX zHK3J=HXjar(#S)QaoYy2MiYHFtVug9jrLE?_y2U6OC0d?xlzfNLK?e7w51wlVjiQm zIpECK*}}SK3Vb^Gu@7p;l5X%4{^Vc(28tbtI3#Jijuv94NNl1!+JbOI2yK251}qo4 zEH91zZ?wH-R8(L1_OF5Wn z8XA>d0F2N0(fMxXLADA8HQn3Zc&YP5cU5v|6ZagNP~VjaR$Kl--~CXQT*%q_W3@~a z@$Ak|GC`kcn#DE$->%CTQY$0+)}9fGF>Efo{NpLy&jOVC!A*7~z(J*d%ULVzHtg5w zg_Kp+l|v(N2L%`tYp)C7h%?E}g&zxpm%4^r>dJsPyZV$oP*?dgT zxy%F$J8%nfibj==r}v#?HTovd2)Vw>XGvnZfd(Aws(fIH{;4iJ*sWHT`oU(0Nbb-j zccaVSl6{7Ov+^}?+A-aY5vW|xiB6)0eFFG#O3sN zq~wM|AA4xs=84g5RIK^TKGrrZJ4D4wYE-;P1|GKHbKvl(_z8;%}*2nJ0b2Tq*}DTGBfI_>S5KQ;1wGjING+`K@0!KswYscgjO z*f*vc%dEi)Vz~vGv}5yjU28IYAdHGWUEH13rb@rzhhB2jV-;B_w~yNVw5pW)XhB4}bL=Z@M0 zhJ1hgZHP}g;}fpU&+q2Qk{_k}kg@p+c=zerx1ca!LU6i=6ltlJaO=}+b+Og^HUR!i z#P#Gc^|9rB!sk3a8~oy$VE}S}m4AQZ4nbdm%_uh>F|EA!nM>`KovpBxU&e=EjvkV~ zz2`OLM;Q$ravU@n;~$0qanq8{^KZCC$D@&$;2*6MnmHmgA{ud#9m`rpZjW0~=e&fy;9h>MEY}?*1BuySTXwO!wxnegwg`Bz; zbT8)e(d2%2y`Wd4MK6MT%qo}=*AdKrobs;wt}brZ&U@q;gUqBI*J=pS+nbCB3412p zx9^q_YnwwZ&CbVPcs0Cdp3qiK1|9tPnwx6BIXJp3MHV*-`4QSaJ924@*m;bfi(x?a zr$O%tYsx-sW0(LW>_z8m%x)Kf&>qKLnQI9V0=BkDaK1g(09KEDJ{(=GI@MZU!c430%c$bYJN0%|a6@6XR9Vw4av%m{|G>?!P$AWz|Adt^Ms$e3 zn{Ab!TFkxn3TRXtwX0Jyt6LO73{>aZ`yl%xh-^w?4uDbf70QA)YyQ$-#m`&BuR5Z*p&=e2&H; z=bg%y?fJvk`?M}S9YSo#Psw*`MD%kE{#%(tQov)>^nM>C|D1ra^lT$3 zotMa&no$5rKDN=o@trrOmTlezNZF))&tjAi(0i%SHIMEXM9LL~n5qsSxRFiuc_1eK+)HUxF;#gH}Ajrghl z5F|+6QtvazMs4*31tR*W*ArT(1#xcIJ=B&TLk%1v#zFfssan}-C*yhk{Ga`TNYC0_ zt`fkWHEY{fKCpHMNvho(w?-@X6+2%Y(;XF4pW-gASyZ}`WJ)X-vd_{&Y z*hj@<2AE9L-i0HT+79R^WUmf~lg;6wTFn-9RN&3aTT7a@*1luI=e$9yoJr`71je%@pzh|g-(*auc zuONn#w^$l{ zgTB0z<7bVK$I!&Ac?5%Q9~i%*brGKaQdq6nyn*B9Y_2R+Z7c0!C#_s1wH+terSnqm z@E8n;jqN&rER)A%HbeThYj2eFOunXh3DcxFEUsog!RS5sN;=XP^_rQ!IsglLVA;!8 z<@n9-2l3}IpM-T>dRe*QSc`JDKbo&7Rq1}4j8-BEpg{D8JF9;eI`nO(CKq;MI`-?BQudKmPPxq+&h4#k(Ixfy8@``2w zBOdJ67(r#kk76-(U#sCu?>XiR zBOkO7Dt{ogtvk^Ih#aCi5BPP`?{Xq|D%GveQ*Tq7-cB~GB27FzJrXeIY3uHbs56N> zB&Bj@K#{yc-ltJRTKV8a98(#-<<*!KGTnDo3e_rZ6``AUivQlST)(dJpC7G2dsqwQf)3@_()9J(BQBlme# z$C(3M9@D+%$d^_2#AyB}_E75(V0$k1sQOLKtvYukp+D?#k%crwIfzTQDoQa(8QVWb zPNk^4ynZNtxq~Ab$G`t2;jc`Y;^3}t&w`hUi8+E_odexkHa6$}cNkYvLFW3mmbod> zO;KAL+q<)~34Qnfmgl?7BJR$WQ2$d^qss1nmu=iItnrxqGxDGEjlq5;txKy$t=gaV z!WthG*Wmelg%)b2P`Y@;LW+cbX;&fS3HP)yWad+Af?eejM@IfmI9!>pOFM8gw6j(2^#Q@gTqY43%%G0gXW{Kw=#IvFgKuxh)kprZGv77Ao-&9}-Or`p{)z zch9RZ_jau|qx?Ks!YkXDsn?(?@SE^T$^)a#8TC|q7<#EgFUW%KY&n;&*ezmjt6&1JxYkZ2{&KhbZ>c03wxjS@W zqF3S3mQ<%6qsihbmLTY-;t;0iPdAGH)PPM{%(;HV-SnWIY*?SGb9Fb_Vce$KVAeiH zHvLK}Ay;I`aC?CvL)++m8YDyvvuPt_hHi@^SE!}uqvHp^@T%%@=u=Z1slaO9!i5L0tv4jYDdha z8f!YQRK5Ryd#NGR&>h#x$(}W8HX7SrhiVy*&JR?57S?~=vrMa@l@{+H#Y3@kX!f1y zJe2c61Yf*n`LH|dc&Ied2N6mgM^F%P1g1Jo{za+V-+n}SyMjGGxwFy!#_6auej=txrvvwb#>bxFLgm!uw38XqCr>uowz3eTxg z&W6$=HH$U7Md5rzG|@M|gkK0-HZHn|(mo2OFjD@*R-;oqSWPyRK!kd@>8~oSO)HqV z2YAylFw*gAt8_9WxlCo^e`qyi6d7B1al9BlZDW2_gPUh|`4j2;%Lr=K*P&9i5knVg zzkZ_SHIc8?a05!kIbA`C-W!3m6uMeC5Z3Pazf|KaAnL3`ZJK=W)XrFf4^%R@V3<> zKvNbSh>Z@GDA!;@qA!gN;qVaPy+|h}T9$@TMEOFi^jL$j`@0ZFPGlfEk@yyI)}BK& zC5mV$eHpYi(m_aVpt;>?wc9$=8`JFO9^*1_??Pme$yfQ353Umt z+Ym_T@!W^=SGaWF#z;ufBS|d%lty1P+yjfqXWzJsBAKMYFS4Ct5s}$$jQo{$2}HV5Gb`O z=+u*(6?;mu>#F8My$n}I3U=WK5v94%@#~}Ypu#sE0M|c(D}`eL?S}n-=(4@R-Sq*0 zc4$es;j;Prt?gXUyL&E!?%c+U%JIw{h`VYT01 zx!K<9Fx9zdrpAu+2+-AZ?-pkm=iJeHhDDQQmGiW+nRGHRA6>@$F5oiwS4Q(^hI`RH zXFW$?RyFtES*0N$PxLbvXujmjeJM}^r!LwZM}9!J#6|l_efgK^7Q;PR8S(lixVoPu zMkvt~Z??K+DNU1!?=PKP)s!MS8GvJ|7kx@8Z^tSq6 zzC$N1XZPbtrtZ3!+l_HD$+h@5$doNS4ZpJ;+c%5KufXlfH@68$GjfK8>mE}{Em^vS z5<+rmmU4cZ-=Sf36^96Y!${?hch4nlga!ag(EB#ldG`DOx)quC#MB-%xwkRDGH|CF zFD;A60nBEsFZuOx#75U`81FnA5r>+AWSn-R!V*y8fJj!RmXIF)6pb17~!REP}Ql zguLkQ!wB-|q_TKgwt@+ifL&5oW43tP_&W$GdN&_<=8yDDxFCHW`Xw#`OM_|Kg@V%9 zr-17)q!sA6)-RILAp2RpLQk5CT(2X%Q9tzE-v-Fv$qRt>_svWVjm%iRP5EU+codo;FKWr_vgK@QUq*LpvqP%K}X?zsqL_a&Sp zZxuG6cI#R;FvlRu4Gf4QoUsp|tLD}Ce>#0sCMmNdNpcs(x$W)kJt(%;>s;PX<>)K4 zuqeW{`xZN-@;+XW;x9!6!RJ|E{<#ZoT(eVFsks)c{o>s%J?+!%9~Lfs z!E+zq6OSu-4UDToH&Sn)k)fVfjDd;As>W@SfghC9%d`nyu}KyNCSqM_(w)sFbSwq8c%2FfBr`A7VfZPek@x0Kawa(c!t zWud=)+}MZ+?1kb6H$kG5r@i$DvTKle&hcvqZ~YBJdKNDs0Z(R4+X)0o|Mp9csYeC$ z4n!~8qe2~?d@0XWpdSv@LQrHxu!_2$DyF>P(!vH{l;T|NKZ@aK(tx0mhOY_L*5`6$ zIm|Qv7}_n%RL!@;C|{f>P&2$$=3Wq#eWgQ!N5$|qolmHdDIiwuVLbuD*y1(Cch zR{HrS>v5yAwdmVP`*G21hc)6&`*&WPGg0k(s9Nm5npwUGj9#%=<;BZ5M@h+QPlSit zHK0iyBew80x%9idCC9L*YRGJ6>i|!N#C5&G#1F~jH><#%EfAlf#x6%qQ3yBY?HE5Y z>C60W+1GS9XMsrAJAcZV^3<=2S`&{0xV(e?4eOXK2wkY^*?gk!(BP4=&`-_HB}TYQ zOJFdFine&vbqCdF)8;Ji1auORNYGwt_jVWrT3{idqyN!(IHQFAvy#lbg=WSuEM|Yn z$=7rzf&K%fGEV%n+z;LwUK9@9+M*Rt8X7NQ9Vd`4DZAqlKXyKr4?KSK)15}@1&-Jc zn?NPPw@^E|E*U?{6kThDYE*&Q;n;BvCan9Ij3b@l5yp2YDs*y@?Tmj1u8M)T0URKl z2Q6vofJzV2!|{pMN6OReXe#fh8i0N`-}CKDlPiel;GHje>4EWkp%>abpehdJ$5T%b zW6XDLsDVcJ^ZIwH;(2&gr%KAUv}+GN=WMLFtgR-{#<88SR6&Svx*LQhexL1a*5-8E z3Nz(xc;uEQ3r?);w3>l1OM?Hk%G*m6{2D-GRL>DzcPmD>-wHq+k^b|T zxGQY`S|?Wh(S$1~U@bF1WWh*1$a+ZH6bE6LnM+Jdu4)}cv*%`m{4VLq?wLXXIBmdK zsJ;0SHd6hSB!f&0$X8J5UaBn6(4RM`j`x?VU58nAu%XJ%ajtVQTqxX8I5PV3Z)unI zf4!C}EhFeQA2j_E%qK8P=Bp1nI_So{<&PI(S)QMgJ|j5(Dn=#T0R9*~<$oT|jth!< zw?Ca+3mvQ-dX0Rmh9mCgA#rO(9Z98rUb(XREO8#+F_n?EF|NI)KKzw?LI~zlIO(Es z6LyCok6&tp*KK3)UwB=0a?p6ua{E3s7}#$yhi)K>QNPC;q&clV)ygvjk^A$}<3~AR zaYhykM-0EITt+_?+ojTg_Yu;cop?;+=?C-9SL@<_YP>8xd3K`Z5h~dW}W z6_6Y!szGiN*`&TRL*Xy-e9bzuj*xAtH{wo=@m!wv3ga`vQWVX|?Bw49 z3l{ul{00yqqYccwEYHU`^kbVzyXOlNR}%*Qoe(>a?c3Z0)N@!T$_Q5XUALK4CEzAy zm|GQ_r+4WpTmY$Nt?Q4jgl_9LXz_$H@j*ikSi$2r8SbJUmUK3jv4cwsE@nh|Mqj#U zh?wqYrtVX-{5$U%sP`@(W1<@pw-3Pd6ut<97kADLecQnomLGaVG|-w~P+fFFYy zu}I%y|By8HxY61E+gUk6k3IkPSH_o5JOi))42uEpdCKDAH ze{M;X^GRN_fAee0pBu>{#Dn?oTR+C$t22yRAn6!Ivn-g{IKtZ6Q4wi>-pVHqNVSIX zHOc-;7HpHeweGk*axO5ZKBKf@A36-i)~&!Vlx)StoT$F|7rP-;CV_TcYmvDl^u!N2fywkHMT3$It_9m zNp0>M?{=9{JrBcxr^Ir;4$+vCu15Wfs>Sp$!REK{q~*16l$tTi-R4c=w=TX*64Lt< z;=1b+49Y#pv0Ok=gq9ECs%Bbl-G;Nn7aZ7i)`qC5Be~W1&c?^b?@)wP$k76=o73jhd%^RG{@mH7_>(h)AGlLCu&471AZDg+4*FOD$ z%dZ`EVrQl4`oRb?#Sq1b`h)8^eoBd3Jr^nSzwp(&)Rg|6WogAKDa-eZz!db+(r1zk zE8b>p-20ChFzT=VbC~R3taoRlV+g=|qjw_cm&6BLECl(g?%PD`4=@b{rl+M z515u&ZXoqkf7;DopO}wzEn*s)CdMo-gwyUPlTse5&^0kfTH8Lxur96pPa5`sUY`~2 zS5y!J9L{%IjgEQw9n@THX}@wyMe@p$K!6^lpo=ba3dyfw9Ezi6v{8kPTMYsh*BI6S zm@$;s$di%^FMozT(4w~BKmc=I0dV&qtBy<$aX3-C`bp0mZiOY$^Q(+7oc5@ENHcnK z`95Weg%MK1%2ksKITKEB+?~FAhyJzKI-Q-ljETG%z&2uEP@WlS23S;a7Hr|Eo3$4J)K^H?O+#3 z|DDU>{sLTv0xoSH83OK^_s0K4ln&pCei|#q=bZC)UgafTH1d|XU&D0yE?v(vFM0|P zVJ6p)2@fSCj@MSUjXU*|KGM|XF5aE`CyS^4#+Ufl%M7I+GQ2aloxq`%z!{&pkflRI zBO++9>IXibnkO}$*^)_XEhX$ zWa}mdFbX7Eubt001UW1%INiw%;y$ih(npvDad!E5Z|@IALmI)D8BnkDk`#>m*@SXuvhB&mL~Gdh~P9&WJ%dbp6_zUzx{8MkDMdla)Atd|TaB4#6%)M`VW z;Hun%Wxh?J*nKm%PS2xboOFk<1&`E34G~)2&ioZ@Nl%0So8?McxRfU-_x>y6r+Rr` z^u18_HYLL=`gO9ITnuX(W77r-hK4-N?gBlG6w{b)v_i+F<;2-3(xEQS_s0ZRgXe=uK#kFKEdOTnTB1n7~5ALa#EX+mc@oS zZc5k;1@fZ8djdYT!GO~!zTA6tF)^t}YfWF^nqhoOvW-euz^hJj=IZ4zZ2mU#IGnTwGSip;nBGMx+%2xT;C@lqXj7(o?RW|2Dt{V) z^-JN>1e1N8kUa-XNJTB9`N1DKi#nt|0=ToQx-}QVwr8Y?4C)3k2v@+f?VaCD~$5F%W&3$6cIMMGmeA7FD zBETLWSArk&VO7wA;#WM>Vr7*N2?S)_zr^86ynUA0S3sEXm%>MJ zfQlsU2Gl*jMiZC@>35s#%34~dNXPwt#HU%&{@-9IISek=I6BQfZ-zATJ1i~U9KQ!Q z>)vZHke0&L#CyGzg4mpmn#dThuVl@f^vISe8SyYva8P11&mWEHDG>Id6u5#42i0c* zLrXcQ=i=a`-#qk+j)Br+Z{ssg5vc`OoyX^1{wIDl&5Nr7l8gZ}pNQ3jCT@pj?V-!I zi~*mo0=Br{-3?EQ*q*hb-WQTsCmJ&Ty4(Zz7Z|H-XRNBd9k%Sdmkn~d%}m@;0IN$W z=Wd?fE}!O;1>ACNurOfK70vb5SuR*&XSd+XEnFC9qUAp(V(^#`2BHdld6>)p8eq*N zBg3JP2&5HC_wQ0OHW?b(V?@14{uU?S*!RR;JC~grC;x`ss!Di2uicTxh61*8vyN#) z;2_UYv`WB3l=-1``k=f^$fY~Ei0)8*gvhi7UTdEI;tK?_Vpg}-u#(~n6!B+Q6F5ed z;a^;;xr=z7v>LWLZ#kP^O$rOc>Tm=tbxjS%UWoopeEUo=7qPp?Y3t)y&H$n5d_$H! z`Ee&NVB5~I5VSK>_5;@$A*q@TQzv6!Fk{G`S z9hvmNu5eLtd~7U}{=;6%+;oe7N{xK>FbeEPx&qDkeCE2zPz6mG2_r{;8L!mTCjS@D zQ8;^%G0nyM@gP_V^~AF&%wsX`*8?Unzke~*%j&zh^Bp*hGz8`l!k}|;%&OCTrG^s? z1Yd&B4z4~WQ^|Ib{?Ig)YmQCYFBy5Edbp&L(ERdR?p2ORs*-EaEKs%u{;!ray85i2>A9Mw< z?nWDQPFIhU<4fVj(ekz|6|9RcU0)O6q>6`e5H?|b|D-Ezb58i*R zF$s^;eiSIY{ih!ndOY1=0gx3YD&cR-S@B2lh(Om)>j@S&evroZNwXQe7|$a40LobX zaQL@7d_WVq4JZVNE|a4#?jl08zk2u@=gGpWK03I)Y5tE0ukBg^xAX5}w-SEF&h^j& z9fGO!B{CG-!HPVp6rLhJryw_2Z5*vJ;?ALzGxkbe+p*1Q*yit05q3~hxU%N+;Q$RD zNl4_6NA~GdZ6f7JnWU6yLI50z8$`WSd*qraKqeq9~%4#C%Pty!W;4KkN%CEtx^ewngo9MgBt z&YCFqO##E|S&xV1N6J~Vz%{KSLa{Y?$v)?hTvFTA9^4c06W_1|taP)Qj_sM-PN@q7 zq-$X_KG@lbcH{AEQJn~5FJY!`>k8Z#xQpl^mb!bW=Looj&g_~+-`|(HHznIIt&Og@ z2AHGwja(>AnRWW0Ck@K|yFN(`m@w9HW!5o=F*G{kT1`-#5cymFX3!C{*VKC*&?{&e zfXtn{0yLKgXylrrh-R|~B1kig{S@_ohD_gilpAA6n77jERqlxc2hBfWr#z(jM-Q|s2@C*|#0}+ig7H!20nlu~< z`#s5>ZbZK_UpMvYTI}nL(j1J8fnca8!_><|78^Wr1O02!22g%*O9;#J1T}Bnj~3GXg!c>RMp)RJ=#8}T@R7QjP0%d5Pu^q=NyUg2 zzWZjn?@o;cSr?fYz%eO#DhlrYP%}IhKPGq4teT+9ljY(Hy>sjiAZME=#>LIEW#1|; z%vrSdp>fkQwYT;)7_nAb;~S$71lU!@WX^SH-xeu1P9QTc0n&WJUy z9%im#j8ki2uXt{2Y)|BljmV@itA9wuv?&N%0?0#P<-jwRwoh{xst&tCT?DbUD~Lq%Gp{ zB`pz@;s@lNv~jOAmuGb3v=E^2m;xXFt$`sjGGstQswzGC{to~+?=sTLu8kX>`kw*s zfQ&qeL*(VvhNZ;dNAL&0)2V*S_^4MzyS`RAoV-H&Fs^bD7|giumDoc~S(bj=jQuDc z8R9Dt?HWXhR7cgS#TP01F_DkkSLDUxLv`on}*LL4wW^WvNcc=D-9dRrwFy7{{3ObVJzO+R{=3u z&rpaPqNPpOE=uzFXti1b-WMLx=SYuz$a>Cb995c5R694t9K6yD(hPr){N`2p7Sy{p zlptILw;kE3XO=vw@`#c13m5LdB#!9#27H@*vCs@@zO6LV%tmp4T)c0V1ic@CzzZYl zR!%yktp2EU=Y8054X}<6c9;g@>f3%rXd*k#Zy6oXBmCH7ONob}!ARt$7v@#jq)la_ zi$7Ku)hbU6WmtFZCydLt@XV}L8bdM8-?sd`XG*5E>WK0jlb^1m#_lTUJbV6H=x1EEyUrPl-$z z;{~%q4Uj*t{kR7+a6hKn!5A}2+wrm+himJxRno}tM9NEu{md&0Dr>sMIxz&}qNi&Y zz9*-wjud$CcAB0;L9hZ9R?zGrRF2t_hztX1l)2P{{M;pquv&8#B- z=^8I}cdw>@C^NmS0KNCRn?f@k*on$FHIlAJ2?aidD@&B)5s?a-kRCu}rNSVKamoAF zpy*fu*6rKk;N>^PGHfMcq>ay%b1d)}CAZqoR*(CXxN2EvzsIQ2Yq}z>KzD0vcDr$Z z9liB#Lx?0FDcf+}FguzK(b4e^eh!gCC6JcvQGVlJv9OCgM<%hd8Ac~i;VJV{pmCR$ zdzZmem!K{8m?9qKWK^(Pn#sF<@H4)kggePf?($JjsV}$_3WhdWrPc-ptJ4?1mlGBa zR|}q>LJf!Gw=aBh%SxVCK1a)CJIzJ{vc@8Slz1#92k9uOFGlef z(?p^yBO&GZb$i5mycHY6)^m+g3-{xezEg`DzkwdM?mPS^llLKY@`c8;3E>^!Nu2F> z3_!?by>)saVIN}Hr>W$D9o=03Bgz!>_fFT8isq7I-`uUIu%59S1C_(A`1Dq39>^|&tS1$40;?1?< zmSZpC#7ZxPe{rnluxHrE2K(W>AeE2uWo~@8k(){U|FZxd1i293wysK_+A6t+cOmk3 z9Yqng7_*i^;@v2`)|5y;-Lw7z0s?4wa2Q1w9NPdra9~{Bg09iF7>X$I@P1fp()zzq z_re>sRXku_ew&^4}Fpk#(mo!6379(~00+PM<9UrMaH5$*s zIk6j)-Y$<>sXwF8xuFE5>?s!gapr=c53PSExa&C+O1<5E(ic^k<=p*{Hl(t)IeS~C8@B@PpO#R+g3viuLmPL8 z1zLYD0w>}{d_Fb1C8T_qOWV0Rf3MSjW*>56#-J%eiR!*LDmeOrx>U(!JG7`$Yrz>|4gNt->L%RL_KhKvav zQxr9FZnM@WAv&QMAahTwq9=!>>F7oAB`XM|6CE*!l|`R!mO4^V94$oFcASZ=fPc2# z#vF;1`~4BURYJ zTWXbL%*UEF&x6RBlU;iVumV0dirBbm5VTS5h>b`j4+TDCaWipA^~&qsR^T%Fy>(@L zK6SK8O~iUN!y2SYH%EASzWO!pq6F&sO+C=<+|x|P;N~_YIXbEE_m;a3vm$F+!_c1R z$a@0tp*%yXc$!6m`E%8fbO7O~>V2eDvcFJNC=*UYJ%8d!us#ykXCUQu^iD3Gveec&?x%=F!pZzyp>S#((niuiM z8;I&wV19Pw$&LB`DYp5YkcBwbU=!04f&a^!KqN`Ic90g7XfBrLzAzY>I|@}`-e-$t zI#VAUE)*Rxh(Hv(qd?7sjsu3Z*=%6pH^pqHwF z*jTtK>@q(S-LHftGx8Rx6lci%JUYE&>>`$JhT<8t+^3&}2VQ8pm^bO!ziG~Q#yFLH zdi(Lm9EHlk^1I%T?_ep93>!{D_6XNxbN-=W8?w_VGLa$nU3TnDJl}qyqHkj=>^!ZX zr&f=v$Zk)YYcErWy$efk^Y53ry6u`1ys-bb0jyk9Fm63odrUwK$HX z!LK~kqzsYK53>F1HP~-B7+CFsos}->)C~HrhY(KW3{Yz2wg%$TPKfV)e4$TLDACJE zzSrdf0c`*)2VhbD-{u>7Y7JF-&P|}*xHQ3)kW{sd)PScV_1%jy>0jaCE2w9P6z*jE z4Kff_|H5RpRx6_R29mQgO8+`2IUMt&n{+i`1WSD5TkM0zw4pZ2NDGaXdnWj7eMCL* zIiy~5>{@GooMkF*mP)G>Pv!n66HY2JOhlg#z8V#~u=u&!flv#gTQu-@z6v!IE4%gZ zILJqzl=;nte8@Wls}bp$y2;M)4gATjke#pnIgQ+bw6V*mnGwe&m4L6uU;SwQQHn}% zaWM&A{d^cuAECMa&Y^4WzbA@=FghG)*c`gHxF%A0OjB=e*1`RW;+&k49XZGdYuM;> zvj%^Sf%2)aHLIq9csp-or3e70aC`paFNXRO!ko5{ikdRQ1Nt?J<33w|X}@G!_VH!n z(gMcsce*JhQoW9=TeMB!Tpy*lIu%}8ACl|zv14kH&*DI_zZeUW^e@L(`TkR4LD5CT z(;qV@FKZ0}T(zy5J`0Qv|5@&2!nwcb6S%HM46K{YFmk+CQ*h?qwq$2g~8j z-ayngW{6V5?P7Cn|L&)?B8kZ8z{5?S^%{epO`bxC2KNrNpFtlseaI%N$S+efhk#tK z^-)t+`}-;v+tDBr#OabzrcrRMcr=gvWpPhmDszzB9(Guf!^IzvB$`8w4Bes|Z6^66 z%J1i{bb@$npxmM`sY~|5TP*Nh(DiR>@%63`#_Pb&Tem)$-??y1G9y33*=-`aejQ`h zzu(c1gKu8m&!Q%U!9;w# z*0Th)zA+3Qy>`+)LR+urT;3Je=ZCh~%~3C7LE`RRpW9%^4O6XbjKF$8oc7$ z{waYuJ@emYs=AX3~M z?QmfN8rI9hw9j&u8NhFtvSc#NUZ4cm3e;+2{cS;yx0`cDIiYKln)Qx;mFv(C$qSwc= zR8A;7X3%xnf!f09;cqss-6+Y6$eYY9I4)Oo_Li!4EfXrAqU6OysvC8e02N4|P>*fl zZnoU_xIGUm=phHS1-WKqwg;Lp1^1)2l61ri<*-3Y*a?o(&9C3aV^|`qgG`BI7p()r;S;u8^Dm1xy zXaM-@Z@LF3Vl`UoVS!4hcZeZ)0aRcg$~lzG2lz zoqt?O4H~a*!8iI+ud_@(j^$iu?#=BR?k45w$vEtke$hS#PfbBSHhkc1cs2JN;L0Z` z->#%B7Ayv*K(`&QfH$3?NgwYNS^}Hl z>O-6NCwxV6%_QN>*v*gbm%*yssCB(cb|1(kR$ zyW#pCScbhF{7PV6mg`Sx%ls&rcIr5$WPjH-{s|rY%FJsIUZQxPzFI5deqF}#d+1;y z8pZdMLrOa@fVz)$VXOv3U|uoJYa%utJ6oJ^uk$}j41U_ndQ+8$};5g znbISz*DJJrj@tjsCmK5!Ju!`zsrqR6A$c(-fK*`HnLBLEX*85E z?7J(mNJpx=9kXD!-|}_)iSv*F`DPHJdh`pYfMV!;i>;a6b4E;ub=Hqg zZ}9VSNz2hfCQ8}tmcXAD>(7s+^D&eQb$U)3Ez!?lXlc43=~BLsasxkN&|K#}UwPGH zNQ>dWUMgq0m^ZX5k+oKDq9_b^=(Dp>a`TG8~Qbjij zF*m%@vc^bu`EwT&sqm)Cjg42M!YDs~IRdzA*U>6FF`qxF!k=Jfc}ry}9GBknZ8`&l zZQcEt$D){i07vSVkyVoGorHIoEU{pDn~f*ue|a^u1hAQ)XtM%>BEC%5*mEl2Ypg7l zMQPjze#*%j5lRg;XL(lEk++tD-(J!Jvk~A5R0h~w6jpNp>|G{(;>Z(u`;cUj_z3`r z8=DQN&S?sk|BZ90UVr&}75V^?z0ciN7kj8jX_fy#DS`*i*V|GeBa`Xgdxf^mp>qZ^ z6QI|l4dc96PET`|;3|2**~rgRJt?TumEn)d7z0T;Qq z`1e)GuT_WR3uyLLWks7K2s$Eqj{(emilBQw>S-95DQ>UXic!Bm$@o1N^Hc+-2V7O- zhqORTvj)LOjQ4m--^srpLD-aRsG4#3m$dg;UyVubZ?p9OJod=q*W`awwEiOcDiJ12 zwb#IFeWq?b_9a|Y6tI#bjoXS7Vf}if z9icC+h4yY&g1g~_k+GP%4N`pjTT|`?l|<_Pxz=ZtbCV+#q~zRYmy#xzq_bFi#kBId zV6@r_(wD)&y0Vu6W`LFMP`_ktGv*p?)Eq{`(#dz}pe7x%eQ`@*My~+|%FE%jL@r52 zAqiIiWloHaocH?nv_JlX6W?+FdCO)HMtUiV_55Ra+I8g#q>R0|lA|;4+x$KP{HK=L z0lovWAKzhef!sm--t0D2_x;P<9vb@X^*deV^q5d5L9)(O{|O&I`?gr}9UyZo@D4-O zEd4|?pDeElW4eKSNv#s9lK;7^!7_)bq`cNts3g_ejFwSoidW}+_glK%CbaW4%4Mbi zx3|*$odbne{P=1GWgF1pz48Ayk$> zoKeO0`}8kq$4AsnLysb8s2IPXpbZAL5;8Ylq}Wo~!gObkYdTERS##exri&4LUNZ4^ z7O8OAtmD3o<05Q=Jj5O@LmFC60zVO@6_M%ld^8C|4+n~sY>2(sQ#bv3%T>CwMpGcm zR%i%>-~pm3cAKWq9v=yX3muX)UVFh=rH{oN5^O{>Y+^F!VAd=Xh%1n$Agk7vuKDaq zrI0}(Do&My>khizAMwdf4EV74mF;=(V=)Vli6cB40bCz4^pjNV}Kt1 z(u{qqZ~*K3sGZc3gCB2d`N?mG3~v6j=-oYH8fMx3`tjO`X;4prz!O}s=wNLc`hCAB zW()fn!)s6FH?285N{c#A*VbinoE5dWA(lDxKX{Lt%j zYrH8(JWP~fvKUk_#j3i`};8&@(YV-V9C~mW0?ei3rm7@dOn{c?`D=H;`cPVR6PNHE<*<&K%kuP+n+f z^zQ!TJj~WhO=9~kH!q(aVdThfYw&gUx|JhejbnWB!#r@ra5PfOa)OU1B>+r>A=z3_ zzHQ!kJrJYQPZNY)gp{Zr|G@_1`U1{xX2T6$N)|0G$2_(a0hNx$u;6iY>3ERHX@pIE zVe$St$|zaq^Ss+e=Fc=^Xqx_Hw-NaQVaW55vY4tDqjPViGRFSAw_&wwHFgFyujy-3-{mAmB;7)I&kH!^b+E2z>AG)=%l_ zHu(S!-M`(ONCAVTIv|kGsR)}-T&u}tnOx9{zi?9Ch)zNEr)GxyA$+_4pWfH3X3?OH zkO;fX`MAv#*^s4*;Q_{XZ$1H-m;Z@^fXqEltJc+^j-#PggJ%x>;=ao*QqF17oBi>l zDgD~&l3|MK7YE~2JiDU-AvOh} z7Hs&4j4BoEg0)plohED%I@x|~!O>uDAv|nu1!RkVHi9ic^9cOmHa>(Dm-gG6f#+*o z7sQ7_L_3j1+JS~94CIdMX2Nb1OcEE2(9XK(u+&`F#mYnQGjw`mkpvE`weSL&H01qV z?eGFm*Znao3W!a1li+}P`D_MTxH&|1g(3nLxv|YV)cblu`uFLSdHimkzIyOmjDQoX zdl~Ku8)(if;n1~S@KgY?B_2rZZAEwX(Jml3OJr#-^c^|7H&IkZ9?d=eYhu_y%`6YW>R+BSx)fq$N3 zm|~wI3$<=8JWCdTIM*zGLKQ5GMs`m?M&xYRj?<}?RQ0EW;N$uZM~ZDN zUp+(B33H_dh#SwTiB_oG^>x`!IUzgIv>#rT^CFDdW$T$-CU!>QCOaYj`&S0_+5drJul_NTKL(!gc^jKw-t2* z4KVyG;)f`$kG?T)k3O!KLIQ{#JF6dLJ)4H9g z4~dqbRF2?l7#DBy4mBr&$uu}Ij*&O*?IcUv&f|*-ES45=&uu1h-Y-GEB=j9yRDIxQ z$N^q9RBC+ZhbkR{(7Lns<1ka7<+S)7h?pbK67)ZM6S{>`^#d>X<&o0J-tVh##u%Z@ z_@Dr(dysC4pf_%Ehu~;*NYM(xT34tZ{_hiTPP9#KECt%Rn`So}?9I;%|95P#cQ0%> zb+Eb(IP{B(raF5dsNg8e2~R`9Y;G@f@1t?P7X%86dS1tHb8k)4*9iiL_**L3cg+?L z`N=@r;Sp{pX+4R00m?(AKTjSHy0Ri6b|}2pY&G{TA494*ua#>h#}wu-@oAl*xbsl{ z07mZ`Y#0jT;_~$=x3wREQYE@}-STc`*+Y~FRPfg4+_O;p0#uixkZr*b-`aqwV3zId zbchYR$+*F5Xzc-V@UF4%BW61MvH9gZA+`v0h#EVdB1}6w0o{<>HN#G04PW{5%hiQr z`~ts;_6Kay+RT%gmnvT0pwH96D?cUNjV!?BuP0)#^cW9O4eMk&7h|sfnX*Z?_?MG1 z;sLTF0uriWnLAKheoK4>V%@)3Yagb35vEx~J0J!B6Oz9_+2P<38il2c{YXJ&n!^1$ zDvXwC*zFa@yH5anR~SlhQk`KQMCBP-5`FQt4~y;BM`C4{nw*UkW)G>CVE4rihgx>F z2=>Yw_&s)7ftcqA#_WWi16YBg`G+;groCAlNvJ8~T2REbaa>r#qRav#p||@{2X;AO zJ%sVtP8<;E6483WQBy*JmEjD-d45`6VRt`wT2TbIv|>>_T~L5PWH%|bkg1$5A<{G@MaIKXwZkoMR0zwf+UzO{|n+<@C<)KsOuxmiwk(Wh5C^p5NXgA5G&CyL7NA&?UwZ@?_}Jeps^kzqC{#A6-VS z_@=Qj>l%*P@iz&JzIzH(6`FUWrC%v|L-7#nsfaV+?lLIhsk|&_G^O-y4^T72a0=j^ zLTF&9ZE|VAJ9HVLpX!^?CaU}Y0+A2^7iTQC-ZuoI{29<+Mtb!loi1v7#wVZ7uIoqW z$oj;Oy>S#QxtGwkkE1Is0@5g!%xV#PDzS3=Fc|7!5-uZFyR(6tkCMITt6iZua;xVP zKVED7m}lJw7BbU*K#c#smmY<6>?HSm*l@HWZP2%FM(z(gQTN0FC%jC*)&Dq6f_5We zCgKf70Wu^Oc{IW5dz=@bUN1C}oE@FOw%t#5g_l!qh=eo#22vL866&wJX&sfgKxdOs1eV@jSpDo7&kBVY|hKop<2Stwhj z3BZsHWG@3&T=OTj&8XruuE@BJrY%hRcM^E}y4{U(zc^VQD31djyb(z6V?KKoW&9OE z0_ym=@}v~-DMlX7%bT34+LTO#OB4~3{&Sveaz`R=p4F^R{`1zi`~(VvnuU4ABqbFA zlRE+|V9B`#PrF1V>Q3XnJ5YV#RenqR8?R*~Grr`z9G^+C22CM;n2!>G+(emU2N8Jn zw{B*et(}Nzwx1AhA}6dD_S)tHmpBZwX8eB>*ppw0(GT!7#}9V`9(GvcUm>Lgn~~*j z-;v8CZ?YIY<5W^~wDI`y5#~z!+X)vEVu^i?4WWD^0l>mMDNfLOB3OuD9ic|p@09Av z5Vd#uL$#I1MOPNxO?X@Cpa%n+N(I^wPpw2+{B0>ZitfRTgo%_q@Mk)G?LP7ZP$JWR z4vg$+c)vL*6oz>hkTw4FDJ|{S&`93>5GK7aD5cpX-8a<$0?~{Ad^tqCN5(h9D9o|d z@#$kJl&8WEuRdz{R9<|CU>- zqlw_{scCThKzlTjSlY~z=4-l8W7_ZEUza6{l!R@_TudRSgYx4i>naqzY3 zwF+6IM^0(njoL$Spc*Yd5vFd~QHKJs#}Ld?||{sS&(W|SkRk&@VqGG9|4f0S8G+q8u>y=yzIfSUhweu1!$Pk(d#AA z8~5qhc10%i2>jiPLomj^?mSB+$CJeTT=^iAJOX5tE~VARM2oqHG8eUd03@zY8v9Ww zB}8gqH>Lguiyg&YHp>qLNe(+3)AUSOgcXFXpsRe*64npx^3RUp zAL?~PPQWfpO?bKDKKSR00#-Ijfw(wZq^b#J4$sV+Ha}1v^&2@`a5q#9L%?U_DthaH zQ8d)SAG$|R*_|i+2A4{JrSoPB+P{tgqC&a>fPl)_vYQQTjNZT zJ?m447vH^wKt%UDmXo%9Gj^8)aC)0*+9Y&7lmGV@>hLegu4pv`+d(OVcf7Yy>n2jD zH=HqOCg{aJ^#981iQy!G9wPeJf*H-$cj7E$#z1R?ef>*;E+gV~%@y+|6%E*wCx+EP42zk7Ge<3zoUzEx(HGt~XwH86>QhvP z0Chk3ayNt4AW`&nZR1%x;TGd4VGwQ8^V{S|t*~ClCZ5amejmfQW~fu5&96`Uj^7fn z%_??1C25X&r>um=-V`$_!`0jHE?=nr=!1Zo_PR7i5mO}wYiDgBRFle&3v}6sZ-=0n zRg#enhP&CT=)x*E#SSGTKME8VYutJ}jYfSaQteD7;&6r?jZD)Lc-ncJ81BfQZ?Y%Px$7Asxpk;XKQa|27ZLMO zIe$DDD7BdPOVNu=#*Iw6km&^;j}JGa$7@4fTm!k@P1N8#!3#373l<)IEr5c5FYhz0 zQ5&~rZX@^CDYf%z!r-gR>QFEQ z#%C(6ybL|2HZ={U6!5#DgqK+P#k(0WZY}d^5S0aZGoP}w21xJ%J2F#s5NXW~}YXB@s z0w#1!xK*-1#jB`DEh0$T3ZI|y$?TWD%fPzW)xyp3C=y$SX5C*+iIIAve^1o7mk0d_ z=3wS{;ZmtDhRO`1@_rwJ`^M0bD?mZYj;Ta>d{!sIG^U`n+|aC`FMvv>oUue>(NgU~ zPVYv35y^0QAa=omUu5i#IMva|OyV4@-o?#!f&=B;{MJFmNLOfuyl%DDuFq+Ec)AjQ ztyFd2K4h^UMI8+CNvJ4>U8-cE!!a=|-F~bDwW5T`R9<1Wht5dUnhAuWLi2ea{HcJi z|3vVo2%iHcuF5yjqVGxAX*C9mn3z8xv}=?C%(&7Nm<^Z4>8iFk>b|cGp#)IpU{Y;W zfEnp&;Hsdrj|Of6Srs2 zhamU>1F_vHzUjm&fYGDjgV25s^Ex9+=t`u%oG?AlTr zwkq=PmHU^la^9UO5O5xibo+<25JaOcM>wN=vE+?};KD_eCr=^#fqwsJ_W#;+4v^qhzZdwPcq@LA@4Z0h z!;S)9+TV2~X@Zw#VlNdwmG=duxdpwEbt>BS3J65##>>e+U-Un3_SsOGoET46>6`>@ zA&8E&H7cLa!y`;Rq+!!Fx`w4OZCBd~59W^qK|4t@JKAPn zkZ;yq!s?9f)0%6u{w>1kV!a14NUJ~OQ`&}dCk1RH%qwEqJQ5Y03q(ga(#FMytp%^Ag$viF$iLp$u6F5J4W(Z^Dis(4P)2T~h_<`= zS^C|d^BUmrx2sIR(I$aMGGa#OkT2qn?SoZ2oq;M`X=Xlf0%XQbwrPM3zRGFzqT{NDutD zDb!D_h%}!BUVKM=ojy5d}aH7@)N2f285%nYt5!aaTR8ME;ij zmuvr0+(9Q)(;fFg4L$=wxNCxBpWXAJNm# z)PHiporpBFVdD0Z3koxb50;->E?2yYS@*$frJeWh9kgLm$iPqvx8m<_XhJw(lM?4W zvJ2_Wx0dIDqRjo$W?=V=-5Qs*oL=PH8tlvxg|_HSa%KQJ%B3gjqG z#5{w^)};-I8bctif~2z;!0&{m^|k@6+)5X4eS0vXbC2F*hsg3EQUBAOjE?dnWa6)t zOk}K%K0fsG@%+DGd#*&b@QjE~mV3J-30)=4=DXUgK-%~6E~O_ywX!^pKN`#(M%X^` z*-K+181DDW_ue6s`66J$$j61v=7pwpO@Y&KHv}j@%Hz5g6DmF1Ac1>W-{I*@d3h<}dcE+{4 zmZFWRXfikZ>wjGS-F6uwm^=~99<)=Y+2izxEUkY6Pj|?we?ehwPbpQe2G}Q5bZ?{Y zDq}+dH1nAdjloAvYj>ltBAq5ZN9y6N2a1?!;DkFb0%c$C*Q~D<^Gu+Z{MmTKRWT_O zU`2i^vfuRF9QWdj2hfi{vXy7XuX6+L<9%fCJc#(`MyF8h8f>Wan7ul#d@;Kpe$pPs zw{XInq)g~2$B~h`mHub$;*i}ZdhpF5m`A#cd-w;iiE*i14Gg+!&Zs->GrZH50IK}q z`*9#g#}4?|@MVun@!`n++#X)_f0p9*H_x)KqO`_3pIrrryBCe11-*wgUThpSpx`rt z2Uy5VQ&D)EWaEbs~ zO1woD(}v8Uh#K-Egyz3Hr!P06>NM6g;|X@`?fIR5qeY1Q0`qNKlw!_{Zz_=*uhxkJ z=17RC`}gfm+shi0Y}+Sv;bmdJq&*YOPaoI_VjMw~<>bI5=-i}=7o4!W2Z!&+K=>Ip z(U@+Z%{aq2pHxri>dwTEv3bVF9{{}*rH%dE;m@Bx|EZ=N=s2_5`ib!Rjq~5z8N3q8 zo!vNp%_2S0q9UXMk!H9J_mt;Oc38r?LXG&M_Ro!#=un8mTU{qW;GgpTiq|BL|5>v= z)3;wlU-?@X?Y>gFek0EB%mIv}%_ot?_4${aT-G6O;yHW#l-(;47p+!r!{fgr$~Jx} zs~-?2_Z55dpv!&EJ!*PptNf;sR5-v~7gm%g5Jrx=s5$6xasRAB3%^)SL7dCo6AGsz zMqF}6^J+lfxZ2twuHIW1x+k2CfwZ;w1>1_L=eT2H>ZV2hHqeVPBYn{rc@wwE8zXd= zF@VHKd9C&=>Jf}uf)|?)c1@9L{^rkScXR!>UgC262cJPh1tKiD1->em$`SlWiRDcO zQ-`~_XU5mgui}x`4JX{c6j=?>PE8}`lYJ8-=eE_m>1QAiF2rN~2R)?E&^|9sv9bwT zQxmUcdq{q2|GbBD4dEn!=*>Asru!Ra}{W*C7qjWbxYiqu?9>ki|&fZ&Iq zDM9&elPBoy7bAJyu+Tb`jyw(0N&ed6+Wo_K3lOkiV*SRFh?}iRbQtXZCu9@Hutaef zk8w1stZ|pM0O=c;S{<5uB%bv$ZJ{o=q7nSeY^@Dg^|^dBMuX@QSStOwG~d{TgiZi@ zOeZ`cNQxqqCgMv6FuSI;`?UVUd5|0PB zb=~#hsFQw$?nVfD{{9@Vq9_KZmuyM06*QehEob_d-MUETO~I1QbGEjy`e#?;i|e0N zv&G~sj=sCopOKt(@4Nmcjjt#>VBbwUtqol#=k-|H92C>{A+&h8n_RVfqA&C#0(8;x zeKP?J3u%z%Lzpj=^Zd{B@lV0!(!KWug#|+=3A5Dw)-S(pOd zXPvKSZTr|J$!I}95JCn*^5|f?)~j2UQZ6w-RBZKQ$OqrjhsuI$0V$pE7zKCeMZdB! zExe(foCLAX-R&E^J&WN@jpDpY$j9yG78@4-^8oWfZC=B>4V(-OBF{USMhI>0N=bhJ+?!@lc|JjJV8-|jI;&K{d{i0!$(W)Lpx~UB4 zM@4#})AUYNj@Ep@%I>oV-ryPE{==4w@-o{ZF-DC^oKP4a6Cq2quH{$%5WAmCV1bCMp?n@~4IwiNP_--?7ir|L?o`d=aV1pohZ2j)Uk;Lh=%P#7#_lD*{Slk&dtDZDZc1mteJT|Tg58ssqq z*4OH$+a@-J?e#s#xYxxMR%eV;KTmyn_%V z8F;C6~o6Y*>LePpcErza2+cBGf zWF_+beenI+>UIL!3#`o{8dq7ZVsh#^S;5DhZT0?s0?C}-zY#Ak-&<8TcW|WDbD;^w zZFAM@aB)ZwjWqKfPRq#|z2RC18I+mgK2|jSo~%J@pcmeMJONn zSu7PIDb?eFZa#tj+HxZnqgnx;Up$KWgDvl?$uh;aj?)HXSfW6V*#$eg?La0v9QD4m zswet5Y`xO!sd!?!;|0>K^`dXH6!hdcP+F#x@;XeS?vrIP5_ER$v6&RXKtydB&QyUB zUz4C?gLwm`^ZCdBm}+>pjp_YqFeXK?KBY7mhbI%pD&slF?N@LaQFnM2{ zYi(d?3i z;OQAa+oWVT##Z~C>VSdl$UODg(S*LWy9FP=SQ+IbAo|>&PM4 z#{$j^oQmPtttnLDO2Sov`wTNPx25uahh%SqIi!Y}boCSdhAxCkJ4^({*EU2Dv-gs! zzGglViqSZ;#*jKPbmBPiXi1OKi_Vt`4;KkIoCzjmmU)XfrrK=z-YSsIbtDV9)SRJ}#Od=y?*O^Na}Rj=W+Ss9<`vRnl|^1R4`@azBur;C zUr+hzq-@vT)EfaLBLCcL58(z9K!L~&h02lXw7nLodA~RstigswzCQjlD|4Pb>)!WP zf+W#Z{WcYykCKW(>@W&b?<8lg_SWGAR6K1UZnesgY~g+`;&bL){dxCO#rgy!1QMVn zj8IjB_`sH2*ZiD4DwDILM zGH%E8iLE|4QtxtGBgAOTC?}sFL0SD|=2KoK?_TL}D+K?VSP$5!-ds6L#qp)N!Li2~ z3fnYES*AqJ`CsgYFAhbH8U3-*>+u{H4(Gk=;7<5(PF&<5B?`><&?^nY#gC^ns^}>) znd9NC^AzglK;>FZU@r%%X)wnDt!|fE4#j3UL6RQME2M@Ygi9L=f%F(Fp2}a{GI{5= z@t?`1zdJr@v^gZ>E&7K}AkJP@w{pcfHkXtcar6Xw!A=^_!$u~c%dVd+d*G|De|0-Z z(d7zm!je^z?z_iS3qE|Ne1Xb_&*FPd<4O^Xlad)xfJl%UpuogEh%1TZ5w!Yu{Q=NM z2oyHjoN)`y;px>Fm=7U8A}KN%$`GY_o=)E1I*xrxk@$j$HI0nS>=h){EEEfqKENU~ z%$Do=XXm^2RIB8^$J^rw-qBlUmuS{qR*HLqe%~`{wP$bcK*Maa%jcbRYDfOWX82%S zthsxT;n2(t^9m~ACmOHG#l#6iiocCwq%Z*{mM`x9WdUE($D%oWf^1sqFMBGz&(R@o zp6HnK2G04+HE*kVS*XhIuFs2P`UY9X-#?{$cPSQW*tr$e2av%`h&=%GJKmFNd43$8U+-ayQ>TOM-&KU| z&5C}8wXT2h=d}8m)?jc7eXOXgdwc9`ly*Ei^j}n?qHfwgm@WIaoY|Gfc_y_X2Qj!Sg(n1yw7R|5`u1^(>Y>rwEFw`S<>U|$pNzF(D9zP6^PB)OOg*x;>Sn$capW4XY!kL+ z$zS+Id3-}qNAE+&xg!`pjGnacpI%uDaMe9#iDI6&-P5x+Bk#8%C-map2O3}C%#}R> z35fIh7z~leCm;bznK<#qi$76N>}2u2cYEqN%;di*Lg8P0Ije|ZKCd5>OvL2d+c4fQ zeY_9X5g+fyufDKYu=noMt7_rqi>Zz2fRTag$lA@uz^?CuG&3!~C4nXx#oC`ef5|ev z>gmyIz8UmW+>>EQ-lui^W&i7T)+L=UmiAc)h>4g`ZARK72A)XaRy7Z6wcvsof&=)1 z1kHWkLmHcF{mZtA#iUp)j{A>O!`QExoaKvc@we(VxD@IgkON>`khd9lm3}fSH-gSD zGr%&fO0C@21yBlndem?{)n|YejC)Ax5o{l*-DQ#y?*%?h?I~HYVV}DNYG~_5!?ZAW zSzlKlvgg@~T{S|5jti3VEUMuue4vBDB39V#fQI|@s|q4XZVkOsSddNCA?`Xm&B$|G zA`CHGS79l}oVjg-y;t-dQmin0h;K`GPCWw?3;1%K7h{se&+|f?N;JWTlp|f zWRV58&y!+(q6rg6&F)w31>yBK1i^bp0XG3VO?QTGj509K=b<(4k{j!DcJd?WiCs}i z66J#Yur1&3|I0el!VMNI(&4NZu)i^&3TxGPE`JVT#j_3;7)}2R`BR?5aT>$f-g60)`XF~P-eWbb_CUOE7+12hzqEg96J06Q*Bh`K$)PMBjIX}gXl%dfFE z6{X_+MwzoyS=)_G^XZS|O@D~#nc>bZy~OE+p!24lZ1 zqeeY+)Zz=DvDHBc?@!7L+ruEFhk=#HE!wX52ev=0t&4PO{wVu|)gfp0bSf<)M|S{h zH%TFU9WHNf_pew*cIKC8x3bbLBB9UcsI9O``^>ysQES~}Q2~!$kj+tlWlJqrJWOt| z#KG=YnlR#0J?;@AO!qKe*ypzTy5F*h>G~;;CHS_HE<4L^iMMK+a&2lr1tWRv-RC_+ z`|#b2g@ku20B<+U$^aa4+pi5f;0P-K>?dHab3B#~EmPt|@K)SD&8tX}HofX2%eOYA zOYcA8B69@|7o5?2Lb2yE^6y^Jo}mwFUGxcXU@S4{`z~> zCPg)WLH^esl2N4>>6FC7YITIMQfuNBXXdpUWacHZOv@{Xo$ml`vSWrR6o48hbst3n z!~*`gr|jS=73)~pP9D^IRnQb?tu~8xYZ#s8cbS}99g7w1)jDK9oW_)+=E(j z-sY5xh?LZX=@OL$(fd)Kig19zcYwFw{~Yg{M0sZ{A1h!%#d@ljHrnT9LgC+|B`9^k zjA+Gh{e*`k`FEq`;*^A1&TlN>wq0Jwp|aU%jjjcI@Xe*J+-unq&Q*ZEZXM|f99Hn{ zHF#k%1n`|P)>&l62n5IQo>8cY?UHH~BhOhXjK+MUFOg4N@epv){{ZQIjF?2j!x1}R z9;|?)(NZUEs+6)soVc+MnHi~;UO`ROOgubqF1V$)<^DtBsmRQF@Eqhxcv;K#a5$FGIiQu;e zgU}ot4n2c5{U1h5Y-zq@)_TfIw!Yi}M#kLIlUXrjD2#cG#4uf@l(&yx^>F=s;9_f( zywOHwAW=z|_zwgR`CH~+88hOy@o-!!GJYE+oO^Xr?Zv~+PWCCHJ5IZezrrj{&tih0 z1mjwuC$I|ZPnXA;lcWi260Zy+FnBouTdUGFr zRSSMLtO@DyY!%=}e1z>>J*Kw+RtAsTeKEY)m~>wg%ZmIkAB?<*bHCuCEK;myoYf5T zC`4;p(!Qr9d=rVCUb>O7M{nd$lmE)F3~}DHj^J4dHdMT-!<1qkqA+;voK3%MA>R|< z5EXbl@6uP6#Ju~RS%iQ7XW;iQ^r4H2sL`z6*-Mm+DmFs76nUnzs(=wd3l4}n@e_TN z{PZ>_pxW$dm8x`;@gKIPTWzT~58IbfRs`9C#pNu8(2~9?qs6a%>ZPeWTa9QdWug#( zZuW2_dC6QX0-ugJUUciC$HT!GR&z{UIli!QGmZ)y>>nYJ4?}|;-KqN4Nh@*O9L?dd z*l>RP+poFUJS?Bz8Cc`2vN&p5Wft36)UgFBL$P_gx)|FT(A^kB)nq6fpDw+pf6(pn{h1`ZE5_E=3=0CTX(Wmqe8meZ6gJW;2k1WE z)INh!0>asK`qC2lq~B9)7=H4yaLF}66R>& zPMHKl>b>J0S^P{3RfItafqFp+UFM=VzKpSw(Fs8qt76QRH8uFjIvA|&L4%rM4!BOB z`d|73<&+WEccA+muYR%pJj|@hurP9_^cNPA7~E2wJ`Y;f&s{N3*Daq;)1p2f;gcjY zWn@1=xy}q-e<3j}(Q<|+gP%!}{x7&fGw(S=eEm5uIzW84=I`b^`f$l+-TyyrdG_-0 z1SyGzJi)@UC8e?0iKL z?dcnOAKrp##^MquZ4iveYSzqux+H#+WFnR7af}NVY0XF9u)X=k4jj+$6xM8%kErGq z>l&W>r~ZTVU*Dooh$>?*NjdNa1*g2SB&nUX`l%TdpRp3)*#1Cnyiq)ZVVUc?`sc;5 zZPpBmuENzBnxG_wAiXETm{7dc0rn9IyqFj(ef17SH_A>Th~wH~H{cLhe8P9{igr3x zQvXKyGBo)=4jo3UpG>M6MgE$X`e>JaM9-gh>Wib@)_;H78&n%T^MT`I8qXUvmQXVp z;#X+I(%)E8Z#*R#ioIvo-kF&4qEWj1#?1M1OaG;j<+^rNZ~{zsnqX6#J%VJ{h9yy zL3`Pg$-|j7dp9p8J?ygw)waD9rNpeBSsZu=V&d@M)2zD&gbgLW5dU%$w%O9;{L`znIMj~ zeBHAEXgL8a^<(a9MRC7|A}}4l$gp*W7qbS+OUB}~=Nw?Bj%+1Bmr{;^;^WF{=n6pl zC9|qF!*s8^W$keF{3 zF!8)(ZJ3ul`?4OW-shf9iwfj)M-;N%{9#g1|8|pj59LA}q$p`JT$4B-)pVSn z2^+Xcc5PaQK2qhk`~&}ulr)-vu?+*$iq=Tm?L&m6q0yTF0n3cc2HReOHPAiW0M z^aJ5|{D>a7gQrmU1`1Hop>kJSqs1%es!vY`U(N`_U#$OvmB-3L8)RuDlf0k_z3NBbbkUy%uXmHacx2B~5go^NmX4wrmD1FwEw zXg{v)(yQqC>7p62-)GV6wjSh%DS9j)DbBsez*Y+e{5u2<7U-M8II%*(A8XRirHhf% zsR!m#Io!2>G>yBZ9&JHVVQ3Nu63BO0&+it&*UYKH14c3cO_gc4rN zAlQEkI$P@FX%F#gk=TThY{8yFb6I`-K(Gx(I-YotJedg71Vm&#E%sG!)&HESC zjLemKkfrHgbh;@1`_YnAJq21(MebiCPt2%+Wp%9u3uLkKb= z>P<~|nAXp(p3ncbf*wJs!J@9HR2mct^;SuvBh#tc5*SveT z+ivi?8wMdw-ZK>0I;8U34id^iF^1aG(Tm0ZQWQD>f2UQ5rR0|ejw-B7X5fXo((}D9 zI>vXb#wfZkF8i@1Dz&(eGEr+gE#8p-q_+!owt_}=CWkB>uG^!pj!#Ae}^CQ znZum8t=+E6)kozZ+KrdyIq-gQub=Pgy^!We;zzHx&b3J%mU6E3$VfrjvTsP;>jWf# zv&~X_hO_-VaC(S~_dLa;{k)rqQRk$@H!5`xijnVvtOvwS65TpLx%SRt+fa+%cOrUu z7}VGA@><5O!S;sZjW|l)tc117l2;>zeK6+`+aBKZ6=R>=Zt6xm1W1=>em!t%)wRe( zRQiKSUeJ-_{rZ*n?8Ck}p&yxo?i{tSpnH__7P?>3Kvl5E$O zpq|#}C+@y-#V^z&p3`4<&Y+536|C6oOp@K46-9{eIyNI(GA>=8_ldTPeZuB**}h`Ux0CNS&RD-tz>8xo87F z4C;PX3u^~Aw!N?F8h3=tbkIB{NY(3yc83VPnqx=sZlBxBjsgOJtz*weE9K(fxW?-J z+)1}ZRiO5zkBSYVVUizzCui5E|9*_|f^~n5!2Z-L^5N6V@C9D<%~$xe+soul_Fo-9 z4XL~|jp1d4Q>-O*@F&oAY~!N)DUa*UFkP1sC3e_&3jjgh#CsAuD`3?;|JS;0)mG_z zwKKZZw9ATgpl5seqg>Re3{Q6XR9(FrJ!A5qnJHH_m{;})o5889nu`!uv3zKqHu68S z&~G(*b7K{2c0k!niW{^Q(e~dOWQxXU%|>VI*;ls{JhuhDQxtEuoBN^n|7|!wA=#b@ z%ab|nK?V@PIK1xmIlkd*l4T(5z|W^<4kd2B$zTTN$KLPIJ-XLA&dkV9U z>rD#-paHr*obxX8gN8h5=81-lV9Gqda7Ot3xIo1PZ{{`mM2;RtG}~R(SA!_lLTN@m3tDySQ#W$o%&7X5Q$QS6m5K!{g>)|2E#~CLVFl>a*w8 zdV06U!)&k){-|p>ao&7ymQ<|j>rTkS9KyE=Vt)rFBM4YH>o_X zeGDPSZ3#qLB0=y-RNlaN*#VvJOKKPAt#yf*vFahvjowr5Uf+v6>Au0L`m3UqAsUxY z_>75Ge$=m4OKX_c3kT#vgmypcxZ4jJJ8v=6_IJQ$V(8*iG%^7_{T3&-Ay7-xH0Zcz z`ybE$E zuO9t;cLN#(XOwqT2P%=LSqj3$@^eiQZQz`y4vl!`$yBkJQuGSsH1{O59my<3wS>W540Q{;EY1|i1FxsC30#sgAfT`QdD_H1HUs;nA}0X-$4 z9HHFKNh_}!^cW0dH2w%bgj6lUYCEq!Ugef6uf`jgFS4xT|IqmUZ@MP9yf~!0;%0u? zHH~exg)d#4IQ5GYe0y%u7?+U@?WgTQhHpTS8oSem< z(%gG6H~iJtC?p5Y6RnU{x~$~i|Llatf0-TE90{*2GGs?q_|-fTkX>Dhj8B99R(*wF zOTl1*W|k&JNhhGC<#c!>b}_)89&1MhR?&l8rX!0!B9-5b!4te*+bJ1>`ExpE-kMT5-!)=w?B{eqO=Jo*K(44 za%Iw=q<$hH0nwdL65;c|vm}?LkSc4QguvwLj^(dEim_6H@2Sf@8qxbN&~*s|>2mjq zcL>y0oT(Y1JMk;7rf+ZBFCP|){n>EC$MT~eACG7Q#j$=czH+%*FXlRV*b4mC@TsNx zBL~Sp!=i0Ep+S^VdmWW)dnPQ5eU?wpc(8aZy%Q`)lOv5Y|-$!@%s|Bt=5 zjEeL5)Co47iwC682SX#TDYZR;3JoRDtcH# z1Evc@t(b<7zztq`col%5e%KS6AaF}U{ZX2^CG`8^H8vHr?>sfFA5KedFf^D^_p@TQ zzi*detKF;opyMpkVGlPOmf*1a@C=SU4tWjREL60eTl-2~%Xpe&BP~9Y<#P_=ubao> z>vqyGt?s?OTnQ=CO<$#mZ=-c;T$9Md^z&+FMM@d~3MLW6qNa*A`vX@7Uuu|l{NxbQ zg5WvBQiJU2>Isb}*M(EF*Yu%$22-bN*^z_xQbUFPHBLiph2>yChB!I!eei6I;$Uvj0M3HS^hEEmTwDV@YYbdBS$ z;AoO*ox7`Gd+_X>QmcOEKaBuk)P z;WeR9o^p7WodsrnrXu3oEW&I`AIl6?7~LO5w@I8>i0?i04wten_=3Mj$%A(Dl~jkA z(3#fjsBv0))7B@D#jjw)7#~z<|79L9p6!&Q7ucEkA+nxjR>?Tcjd3=|rozo((8g7r zpQ6~-?~R;Ky6=_VNu!f(fbR)cX^%vatY9fC+M#u&;baH0xJg}Jrhxbj2AGZZUgBNIXM1D`Qx3D?x(t76me1j0svFHY~%?gtJh(w(9g zmAhV*N5C5;fYh6QZsE$714ZAQKdfcjHM8qD+4R&GikNPY(^zV(plsicI~1KE5&Ox{ z_DG@{-VaaowKIa?5e{cpIhBw$}9CtdT47idQQcR*GqRc zr;@?r>)|TziMI*4DsQb`c`pM@&HH-dJKfbLvi%i|*EJ2h^7_s>>KLAh_#!Lh5cYZ) zcSQeK`8J@xu}iwJyP24GRW5$`8kKjb3iI<_0dI@>fyCh!PAI{VZ#c=(o^*_>GfHB^A=MtG)?%18#&x!}#L z(eov0J7Sv%#zl4`OBszDG{fyyziOAYNb(T5lac5Uk%mUU6ww2i^379!436C8>$^oE zu;a7FG`PZi2jwqeFl_PVb7-DQ6{l2l(R4Gn@zuTWrw*9TWJ;GGuNci9ez*xusM!GL zk~3?*#L$Q?e7RJBjNgD!&Q++80mfj*`{A#NKWLG0nzI2yqD(IyTIrS!Ji7t!Kz=`X zU)XB|5v}7%5O*FB%!r-m#i3l)vOkTJt$EjB)n^w_)>RavukI=IEusDm5_D|{h`!^7+gOrb)&2eVndn1G zc)Vz-m6tcF^hekV!4s{&($`?WU4{;&^EIg4fzgrXR?o25c?rw%V0buLz*g5Ndzw8D zhgrikoP}oiG|g&!ysbOl7)=fmQ9oD1;511F2q&B^1VUY3 zu?p~IYVN?!#ehjkn}Jh;09IpYAjpT|)3NKU};Uv-;4=<^|`^gCjV;mrFDrQnp5eh`ORfwmq0C zi?e#Q0h3lCF9yqbul1dlEi;}_>6(7ZCNS$fv2;#T_ zTg8~c0v*O8;^N00+5~!)$%CdC70TfWy5BZhpyF`Fw|Ju z@gVKEhDKW7SsRVy5SCLeKAf2((npQoaKnQHwtTp16or^I)HGJ+>GyVG=}bC5W<|HB z(CA5FxY-wof{1Dea;5r2u~Rbf3bbu88e|!RZ#F;3G1%J&4xxB?k4F0oDPqAQD?U7z z7E%-iHTHFl^D($k5JA4y19J=`MGa=>glu^iZBE-S;PqrN1jYVp#*tskp1iae(DW7= z6j73EZ7fhtY&&4Zc(s;qi&=XQO&Nx;5FW-<5X%P`QY3QFUUwoenTZa$DjCS6GQvN# z!AsUQXDlKNe?G^F(q7InmOkgo)7CVOWHhfA0Y=4l4R2Pb@z)W6=wZcX-{6DwgLf|> z6^Sb$$LHx+NO1b~#dUn7E*Y91!w#f(i z@`Ar(#&x4}Ub&UUyS3l8*2ZERqecDLDRd0f{3ox`64z~3r=jr6=krDGCS!BR3zu= zZI>kq7gqfHUF`X3f~Jb2MTTe6Q%A;&jN2{Yr6zTf$b@}H8#nU>zJ7o#*Zj}zuIBlt zqwaGGE(pYgCng?uFfxQ{i2Ix-yj(vvYm)Os$XeGNUHdcem>>msX))?{4~O`R!$9Ll z^%w}`HQ?hu(E0tD(GK)e|BDoW8(V>ijBx4s#n36Z$Mk_AjQ);&B<_% z=unL$A@!L5p|u*T^+hTKxfe)a68e=iwsp|G1p zC&bj9VjdS5W~zD4ANjDRst26=HIhGxgHd8{^VIwpNYL!yuPoQ^-e4SMpchii+8KXq zx$zNOfAt!nGa0@u3c!*IFBrTp1@N273}_%d^p$M~8-7^Q?OXrne@u|*Ta!?rCKKYv z`r!UpaKQALDsyAPE(}1!fP;6e4WEXy4VoR$bCR<%w#hXR*X-522Mlk4aDbIi36*?< z;>J$ZXd4GT;FB;9Htp{RWY`b0kNeM25Gl1CN|!3E|4j;!C`(t}FY2H;r}8kp$sYeC z&QHR>R7TQhD3T$7{kqgm%w8`ILl3?kJ#*y=6159Dy{$uCLY)goPnyW1++nv_r+O&1 zw#xRa)Hhv_@Y~6bTjry|KR&NE##|=*zF*P0zZ-x~LZaFv!{wepWOBDaIaR1KsHJkv zFZTQWT#s44C!;W@D^E^`+A4f#Fc44vnCJLI0| z6G|CjQfH@xVParZqTNIC2|*hYNc`C#^qZQ=9F_ATtVo1;5<-qJIYojRb88MEYTXlZ9yg+GrEe3JEY zmyuoJy{mmxvhdFp4QsQ;ba28PPRHzr;Mv}qXjT`1&QBxymv}i~)in|Ov zAf#%t(kwJT1KZWlpyZNxJtb_W)|SAEk>|g_4Ev#O%i5C;p%|Q#rE|r2^!B~^cAe8>xxjnoHzKkU1!!eY zqJyIE^fkFkA^FQb7s~byH&>D^4ra<)F_9CQ29Mbl%~8qd>z62VK=TS@j=jyHf>=3b z^Yt@WY0rBN&VRidMFv^Q*N~66T9)xRs_t(A57RPgkc+ptx|{V!I-`+rp)_Vgeau9I zTAq zK+A*==f{r+{@)I%_1~8)y^nQbSIVQJ8vgz5EhmPTc>lxiyW72YQ>${jn5)YCLZRw;^)zxOWulNH(`Mn01`857?kgWH++*@+D54!i0W^nz_NryqrFh<7nA6 zeM8*vFZ>aZ!SWT0@}bqa_<4RaIYXTx47P>gfBo3EuW_5>e7{tlbTPL7l9Q;KtDoV0 zLh$&W93NJ02JJ9XdhGKQzV_GyJz;0#nVeBpQhs97*kHzk@!hkzH;>fP2u#jz@Ct?E zG;V<}?$y2khEP-Wxo&qj52MQ};jyHhPBoZ{>b_KBn1qy)| z8is&W1=iD~NMrvR$$e2-24cv#U|64VYZu#e$rD;$4{LrR(|G-sTNufQwCR#p(Jhkek?IQg^EQ5}sBU;I~E+?>;FYeK~^O`9u{FwtkacQ)$9 z$FKwTS;&+ZJFNPB@*)4}I`p4*r2osX|1hVa*uIt_`w>|8;hu7SvuSSLP^inVkVmuE zY{MT?xrG%=(&cd@@R%}Y-fCJ^%s(r3Vy1h}94O>B_#$y9EHaLZWAYA*l)Qz|_`gV- zM1pJH|BJFoJtDz>k=ETz=J{7;F53U+o3?T!=fHx4*dyFEjUnCb66Q5&;@(lTf|fB$ zM`mfQ*!_Hy3Z0nw+>gCd;)Z_clfwG>uCJs_dDj2wdh*|&$bZBj{#VoglfyXmUPrQ8 z2YJV2hisgh?uc2&A@RAq^6=`Ny4mF)R2Xsg@0te&beoB_e|Fjlll;%8C)q}874I#-3 zr1T)R=Km&8ptSmU`;Vr^Yz>(N7}rw`&?WJFfg`0_>T35A*8`9_y>nM zI&$i+rj%lbR}8aY#)0s^St*OP5_>SgDDWlRP!&kM##ATzbH7vBHjMAJi{T zKZl8=3;eb2D*7LmPv5idQo}8lqOL1`MEyE0^d4!9VRLW}JDLnfi|f8@)TfQN_gQr+ zvWpa;fs%;?{;@1SUOl=qm}v9NdXnEnEnf;t{l-o#^VVsbCM@+*iTcBTsrj$5`LB8N zzsng2Qt3KX`KcBX8<+8(LH0*0$T;al%A&*Np9RV)*p2Ck)d+aAYoSAs-1*}_wGM9e zLp1W$;{EWIl`q2~L_xAD!ZUa;{M5KME7fC^Bf@%z<;u4h?j}5z4ZDaMPhhn-$5=fR z4EVJ9lCvk~>|X9~P~!_|ab(~c zCD;6C{5Lu~Srz#ET`^_Pf*bz(Z&>UYnZF>7Ihyy-K@T#FEVYqpdCtmRl8uc_9n0|l zyrbTp!1ebnIE2)kWiTS23}Vt#A3_G;)zPH0>W3P?y_e&~sWl6$!6d;O%b+dnd4$q6 zIn;|K&nHwa@6yE7VC3&lT4Dncf7gEA!^(eezv%yIA8Q*I7_#x*h30Y4CO0;eIxGt1Bv1%tV4KKFmr4XWjFda)vsOpNSy zMjX#>>C~pRdEz7m%=10e@ItU+_(Q$Wz^)F?&o31>waMGCvI22E?-yH$U6n9ex%n>2 ze>Aki`sK-9S{;f`^PW}8D($DP<(E-J$FhE&oOLZS*Z@Z+O$v1?>2cDtDE!VVKU8b% zfzt5i+k8u|(Rd>p_iwh?heCw(73c2rW7~~j6^L)BkX|7Jtm_gg@Qtw+Q!AKa&HLWM zhMBSCH2VKqfhwKQXkqu@IT74--RL^20S1i>5Qz%`tj{@hM60ev2VoF+euTXPgL&I$kmj?>uh| zqJ860_4l5#j`s<7)_T(Ld}`Sdgq3*klSL2NEZG9UmjeBzoF%x@e%57RKP%?^H=MH{ z!E;fGzHrzIU|Ct?4IW5sY_5O=;F36!gERJYME@Dx8Q?l(Fjb$0?8yFr9A`m<+j){F z(dOxP=9pexYVBEup6oJ^Il8(&`|l(*qJ%=5h?DW;D{zukQN7FGllQ zrbm~8{o2nvvX-SuQ9w+O-_JE;!d5z*FM~G_?Ct8xk^_|XsdC0u(%Q}!y=%Ew!>Hu5 z>5nfr7`|N(KYhL4L%#C+$4hB#`{wPWlRu|E9HR!YJcn?LAzFtPi%iei-CBS5RnLC- z;asv6os;jo1)vSSVPJoqb?Q!6H9us>jJy`;!?`ue7IQn;YH>T=(AKjtZ^X zx*D~(hHf_9pUtAeh_8zKjl`cUh-JB-s(9)wnqnq0M~zyW;K5g}27Xu|xHT->etX7y zfZ8#Vylw-S;b3o8*Ljm8T2sw4wR_WB@T(rDd|$$M?<(Qi?_;*3{do%KiGR2(0Y5e* zne8!EJh$OhF*9}Sc4U!n?+i$?pS7-Yh_v1~?<)DuivV=v#=N}t;q4;sX-93bYCA9y zSxfaU56k*jKvw+qnrc5m@O09%>}SW0kE!{LZP4xqixcSn=qsm;Pd=p>hUNoxk@bmC zQH&KJstfv|I)@-ddp!GOHY>Ro#wsS(}BKpyh=lMy6+}Ozwg3LiKuIK_ zg6u=t&|#v$@OAQ;+-$V{CH`;Wf~LMjOu6Lg*xRtVWYm`vlC4H(zRH{6 zulL-df)-@m=4~~7-~D#My~S5`soxHr$m?7BX&lwGPfdWpPOcVQz9-uYT|rN!DEwEp zr22?qi=(bb%T0jy2C{HDfQ+zc4i24LY>KH1PkoUaiRqLpGxol6b%%lJE&oKz1o#Rb zwl{u02x86e{FASTiKNAR^Zv7;F3Ig;{7T?}bV|63@99quxl8C=)rwJJqG+t0XpQgr z&hGM_SY|05Flr>$s_L`7Ss_mJ2N!0;IfiRaNPTyJLXf4>3xdkxgU$CH8PALZUR8lERz z=MW2DWh<3wd9(2GzR+U@y5*~gjXO5aq&@P83Jk!?hmQenDU>RWTMbc*YSKcjMJpJ6 zFxO?^wh2KPxz8EO)U^H0->dg!m_Z>lKOj>+nqzpUP}1KVmG9dR@74?hSJxoV`Ou=B zse*tsak-sihvyD#o)SOd3?!bq)rOyCaT^+V`xdYFXXh|@+aN!c1ywE=Ma&kIPKJho z%C)Xl!ijKa%)N3z6NCU?#)nqypUjvDmM7U;y?rM&aIG3ksJnY| z?k$3>sJ6R`E;PhkwU@5Ag4z_`2n|9`SM_-f9=4#?t!P|qN4;xThNC-d+s}^AwU$#z z&8QY2A8dzFv?8Vv_0<~;#D97ouQieKw@^0g%K`_6GI>PWjWu&}cvF~g0=~E^`o;M& zpcwMT?o$g+07M`U#NMmuirO8^*riAJlWW|eA1C3SL4z|OX%Ne{%3VoYkx$hOeX5N+ zrMzc4(m54;Z488ud_0128GM0B>6@|V_icmrLGcu7qU~Lg*wsMxEr-_=AP(?b=RO3d zQ-+z?C!qPGaUT{K7|0Eu;ckp0&lsWwT*7WV8#d@6daDUo0(@OFA1RMtH=k>2Fwg1t zhom!Q)i$+vz&23OFw!husnIW!SM@O3SibA^6AH0A<{mA|@y3p?he^d)(=FeYuj=m z8uoJEH2RD{%_ks(5Am~mrMmC}A#4~?Rl#OTA;1R*3r~J4mn4!g2j^nD1!W-zoB1Tw5}j-h7{3wsBFuSn3I`}^WzKoX2*D^$NaaT zaLWZiAx>Vl=RR3W8OX#f5pEHr2f37r+1!`>({mxDc(H&!Vw>RxMN0=`I>*PLkF zW4FE9fx8tUT&2Xq9VI%}-hg8&97$_0NZ1)NPfk8C5=2PVl7``Q>P!v>NCW}j?+@j1 z>w$;Gj?!76Fm!T--_JAP(e3Gcb$rLUfbx%h2UT|n3JS{6NtK!B8-`nq%LXj_fmgj<-VNI~!&dsZeg-y8x_(k{kc-?8TS)r@#44+dIq>8;if! zKejB^hYZ$3ni5W=J0;{5jv`rptwE~YDN$`;(O+Z>LWRqF1??~BiX_e^=>d@}x3n}A zilRPSr9Q*5^-_*M5U(3ks@f!bAvW+DE`S({m(y6wx)C|?r>aijuG9nSHRdfjXi?H{ zAXje?lLPq5=))kIVq(IvVNC_gw4`@iS)PK&f*869Fr;49n4oC@TUB=fn1^KT~Ux7TE5MG>qR$~Ik#aYjAFRXm&+ zQiD0>uNq7B{ZQTmYJOT1a??LRYwL~5uFUn1)DCyWz8_HC?|E-5G)v0>b71#n_7OlD zQYCd=^iPj($cuNquPC-%6S@kHAk_DXu)Dn^v_lG~IZ&#kaD&$JgE)a}>aL((OoQnI zm*lMPr4%H^{Qt>I%t+M^ah3KJqIo8+PQu-Hwleg#ZoL+Iy_?ZPNkgc_RzW#VEf!u` zqkbuUYJVS%0k-!LmQf)kG@%=&H(u3M*ggQEJ zwThIr^2}vL``S9YZ)@qaU^B;uj2wf0aaY7(nI!aYU2LUow5!l0d>!+t!FY@mboy1L zV{;J0K!4^fAz#-8447QnAyiOsmrJ}vBla;=g*>R({y~zfrqJA{di+ClSGIaG9zC(a<_%8zq3DT-z-z@7<5H9c3ksy*3N(SbxAyg zU4I9=Ia`d$6@Cu7WJ;fn9XmR?GW`Tf|@hz$bXP86FP=k7IV3@6HUuxL-=2O?mY?H zgItU>#t5A%VyWFt(A|rTJ2W=d&#=e@Wu9UwL6;N8&Iq$7yX0d5aS%M22;IN1m$QqW z0$Du>secU+%g9<9n3Kf#HXx6zum)({s=mJVOvHM>WljRTA9p~?OtN?@kys{$C z`MM^5#_=fP&r(TLmDz8f4axePLJqJ8POy~0N+cJC*7Qm}5;9k@vRvIyUy9#rV;;}0 z?2>Hg6?)$FnR5$9gkdK2bva$_rt`g=kkUV4wmWUwBo?umJ&OKv>@*JM8$DP^*BCE3Q!(aCB&;pi-)Na))rA!STe)R0zy zkg#sI9eg{x0^kt-Vx)7xEfPZ zt|z?YwVyH)c7t7a-#HP3faZ_=j&=>BjaQi7MdAQst7qwHsH0EvWtOcE9v3~npJD`t ziQuTlMtT2J*{E5n@4g)3m?^td2JDquv0_Z0K9fVpb3qci_>qWY7{d`< zl8Dk|v!|AtysLy_!=p)#gD~-Od1~x1uoDDqm|#=DjcgAFmQ6fTWR`&#oU#MF(lStl zk{%?6SsyDl%Mgl%Qk-u+J9J3r+PWN87&QmFmrK%XL!>Z z*!B8#(`4;~%r1}XKx{GN4K+E5fV z!+~|Vrza}F&A$EOrIql(i}Brb=cwDOMv_ET6})w4bA@OCK6iV{(i!x09-9p@Y7g^8 zxO&vwb(GZ}O@BRwJ{%QWrnie_5lh~JB+Gz!L~fS-s9hHIor}HhPbwt$S)8`A-#PkG0fzY%R6pH@ zt;24j#Ey4C?o)+O-dz9S*N9=~QP=Ojw@VcP59Q-TnGjzsRTqrZk>lmSWbGU*W;xA& z`H;W)`&R90jlteF?kYs^SL1tUf;yDEWChWJ1tH>w;V64V7F8IPwPPQrGbHXC{zg6U z6jgOLj#x<(H7TKW9(&c!m=_#BlK#Yb`2rE4we&GJOk#`mQ2~xm2~_Ml2XLViJCt#y zJ$XJ}-lzp~pO8%6zrM|-ouGiN0`b`NT~P*uevXKcj|ve|50{F_`Pmi3f}&l0%IX~d z7^juOtR{Cv`c)tMpT?hpmiO@1aed{AOI58pixRYFL6;D9jLF^hbdY=Yn_hU_lC6%P z>O->YZP}kL_-71tXhw9vGv4?t?-g+rqF+n(kPUq*QdhZj(KF`hN~~M9GC-;qk10IM zx*4@a{I<(oNdi-s`IUFho+R}^Xn-J7s&`9!SaQqh?3`!3hc_UzKJSwek<|o~leO8y z#>|~hwQ!yIfkrL=IuT`(;}ZL_#*0r`0`F#n?VYmQuu%&uezskG; zWkp%sOLxh+P8Q%f8=GYLT+gOB2$Ic1Uw{a|{D7Dg>d$8V8wv})S@}0WI>)Sb1sbe~ zSIAb|#p4LW+6@EuLLYX^y~3PHkxeR-^XSz%=KKTw`Q#tv!A}9?FN{Cq+j5kB3l^B+ zJJFTR#_{XXOg|`9KyqV1HD_SgM6DH4nD}G{6IHz0mlt1trwE)d%%Qq{k4wSz3A$aI zp!IG1lTeP#uObREuZj3xH}7V8H_^Gxcft*^Sv!b!_jjK?y}IEdP5h{SiD6&VL?H;Z z9(__$TIs~!ZVB5RzsPgy+BHk_{Y~dH(0THwo7i1k$LN7%LlY9i|FF&?+(Z3>M4;tp za(GKj190j79{oq4JJ4=oF3b*n7TsFjusVeP-ebS3dYYHr5Nh9XxC69#UMvrGtGInV z0GIh58o-X=ZM( zoLkY&=@DPKRraYX=5L8O*j(dF2YIFZW)Hi`^l7A@h!_b6c}f;_&KKC-|Aacpc@4 zKfa+t9N}BuJzC3GQl#q_9@cnnTQKU*$2NOVOIFvV8q7!vJ4e&@t)weP1ZMXVu?)@B z0W1k_K|39eZcGZ?dbjfs7>gZ8@7^~`lPV>ehgy%it9S{nxI`-n|1rO*EVBI~V;(Dz zsU_9ghI7PBMmFnyB zI_1YeXqwCuWX_&zDaMhKFsgF3*3yIoN;8u=_D&2<(0ACE;C7+XK^2{ zszR7=4Udzht$o(`W&JK9fB}UKRaw|H?m%bBvkmDm>j$@$m&r%{y z+?umd9O9>Y6|opBv|PJxnH`&t&fmfk^+w9r{JJs*QvcZZqhs~Kr6#1p)f)cB`M7@0 zO>?W5U3P0NfW(c;$Rk@&B!|i5JCGHj4S00Nm(@6X@;tq+JdGjIi=&q-oZTuWuav{@yg&E~f4Fne zFOl@cK(cr6va#@%JV)wRal!>FLV{(phTrM*^`JPCIWVptm)I73(iw=%RsNNihmH=* zi6M-m36^kPaz5FR#-#qK_HMKw0Xa{rT*;8-*RlPXWU2h3x^i77U&cfsS?`QcIoUPy zI}&vv(__BwuR2^A7^bI;3=AdE5MJ<&~sn-a8g?`~F^5QkR3-1>Tfyo$4PzJm8z&T?*q9KXN!J zPTS_>=5_i8RpOX?p~^?$wYV{Xy>w_Vxn0lYm=OY9?uF83IwjM&ng;+vI2G#>2$)!N zX*5)&YzGbY-jq1G_U^DaF<7dh$)3x2gLHL2semF_m}a+`1C1@?{YcO#%9FHRy7AN* zoP{7<@Qy4D<0B26iRnRv2xU-?Oj`-D98ELGt0Aw;Ze_^MPRB0)`R#T0paOz!b2i~s zU27FAFf{w$=Q=J$X z*N0j;{HC&Rim<-&8fRK_?9K7)er*F>9M3@R^H}P(*T944HeN^nR2OD?4H2!HehC=y zktgGlG(arlaAMtC>;KoiN%DESdKCZqr1JFA_en|58v1ij-{=_pI67#VzrUO zud?gjrRWao;V1qK^}1EVt|DdsYpclr?ad%g8@eh>%H~y12FM;zzb!uC%94u36=d{( z{MtCO0dMAxa4&?OEStK`aP5Y|uW181yJ*uaP5ip2Z^?aqT|IX>!yQu^_gSd`m@|rw z_tXBO;S@k5Toph1?X-Q@nCqiQ;rq-Z*{G-c^~n*yrv%$q`w`>bHcFT*=TZLUSUGx5 zs@Ttgy7^Zld5)P7jA!H0Noy;1LtgmFM-q_keRrJ&g7}MF|8!_(>2S_7mQjPRJwyoW z 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 Date: Fri, 24 Feb 2023 15:07:09 +0100 Subject: [PATCH 011/388] update the example --- examples/cosmos-bank/bank-mini.qnt | 37 ++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/examples/cosmos-bank/bank-mini.qnt b/examples/cosmos-bank/bank-mini.qnt index 7b8a6921a..7655280a7 100644 --- a/examples/cosmos-bank/bank-mini.qnt +++ b/examples/cosmos-bank/bank-mini.qnt @@ -182,7 +182,7 @@ module bank { } // Tests instantiate denominations with fixed values (later, parameterized). - val DENOMS = Set("atom", "proton", "photon") + val DENOMS = Set("atom", "proton", "photon", "foocoin") // Initialize the state machine. Atm, the initializer is a mock. action init = { @@ -326,15 +326,18 @@ module bank { // custom send that picks some randomly picks some tokens to transfer action sendBoxed = { // pick some denominations - nondet denoms = DENOMS.powerset().oneOf() - // Since denoms may be empty, oneOf() may complain. Redefine the empty set. - nondet someDenoms = if (denoms == Set()) Set("atom") else denoms - // pick some amounts - nondet coins = someDenoms.setOfMaps(to(-5, 5)).oneOf() - // pick the addresses - nondet addrFrom = ADDR.oneOf() - nondet addrTo = ADDR.oneOf() - send(addrFrom, addrTo, coins) + // FIXME: Sometimes, denoms is still empty: + // https://github.com/informalsystems/quint/issues/545 + nondet denoms = DENOMS.powerset().exclude(Set()).oneOf() + all { + denoms.size() > 0, + // pick some amounts + nondet coins = denoms.setOfMaps(to(-5, 5)).oneOf() + // pick the addresses + nondet addrFrom = ADDR.oneOf() + nondet addrTo = ADDR.oneOf() + send(addrFrom, addrTo, coins) + } } // this is one of the basic invariants of the bank module @@ -354,6 +357,20 @@ module bank { }) } + // The test sendNotEnoughBalanceTest from: + // https://github.com/cosmos/cosmos-sdk/blob/497dc2cb78bb8df597fd63555f97b2f98cc7f2d0/x/bank/app_test.go#LL135 + run sendNotEnoughBalanceTest = { + val addrs = Set("addr1") + action myInit = all { + accounts' = addrs, + balances' = addrs.mapBy(a => Map("foocoin" -> 67)), + } + + init + .then(send("addr1", "addr2", Map("foocoin" -> 100))) + .fail() + } + // If you'd like to run this test for multiple data points, // you can do it in REPL as follows: // .load bank-mini.qnt::bank From 260a0182f32ab01d7e9e885dfd28385250b8a97d Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Thu, 9 Mar 2023 11:40:51 +0100 Subject: [PATCH 012/388] describing the banking spec in the literate style --- examples/cosmos-bank/bank.qnt | 562 +++++++--------------------- examples/cosmos-bank/cosmos-bank.md | 520 +++++++++++++++++++++++++ 2 files changed, 652 insertions(+), 430 deletions(-) create mode 100644 examples/cosmos-bank/cosmos-bank.md diff --git a/examples/cosmos-bank/bank.qnt b/examples/cosmos-bank/bank.qnt index 08d450d6d..34042db2d 100644 --- a/examples/cosmos-bank/bank.qnt +++ b/examples/cosmos-bank/bank.qnt @@ -1,73 +1,31 @@ -/** - * This is a work-in-progress protocol specification of the bank module - * that includes: - * - * 1. External behavior (via messages), and - * 2. Internal behavior (via Keeper calls). - * - * The main goal of this specification is to highlight the essential behavior - * of the bank module, while keeping the specification faithful to the - * implementation. Since it would not make a lot of sense to duplicate - * the implementation in the specification language, we naturally omit - * low-level implementation details: - * - * - All errors are replaced with a Boolean value, e.g., `false` or `true`. - * The actual error code is less important for understanding the protocol. - * - * - Low-level panics are ommitted, unless they are related to the logic - * of the bank module. In the latter case, they are replaced with Boolean - * error flags. - * - * WARNING: This spec is work in progress. It is by no means complete or correct. - * - * Igor Konnov, Informal Systems, 2023 - */ +// An executable specification of the bank module module bank { - // TODO: these type definitions should be defined in a general Cosmos module - // module cosmobits { - type Addr = str - // TODO: specify 64-bit and 256-bit integers later, in separate modules - type Int64 = int - type Int256 = int - /// the maximum amount value in the SDK (note 256 instead of 255!) - val MAX_INT256 = 2^256 - 1 - // the range of 256-bit integers in the SDK - pure def isInt256(i: int): bool = -2^256 <= i and i < 2^256 - // a coin with denominations attached - type Coin = { denom: str, amount: Int256 } - // Cosmos SDK coins are bags that are implemented via sorted arrays. - // We are simply using maps in Quint. - type Coins = str -> Int256 - // } - + // TYPES + // Addresses are just strings. + type Addr = str + // Denominations are simply strings. + type Denom = str + // The module operates over 64-bit and 256-bit integers. + type Int64 = int + type Int256 = int + + // the maximum value for Int256 in Golang + pure val MAX_INT256 = 2^256 - 1 + + // A coin is a record that contains a denomination and an amount + type Coin = { denom: Denom, amount: Int256 } + // Coins is a map from denominations to amounts. + type Coins = Denom -> Int256 // Account balances type Balance = { address: Addr, coins: Coins } - - /// Parameters of the bank module - type Params = { - // whether coin send is enabled for specific denominations - sendEnabled: Set[{ denom: str, enabled: bool }], - // whether coin send is enabled by default - defaultSendEnabled: bool, + // An input of a multiparty transfer + type Input = { + address: str, + coins: Coins, } - - // TODO: introduce constants, when #528 is done: - // https://github.com/informalsystems/quint/issues/528 - // all possible addresses - //const ADDR: Set[Addr] - // blocked addresses - //const BLOCKED: Set[Addr] - - /// All possible addresses. - // Fixed to a constant value for now, until #528 is closed. - val ADDR = Set("alice", "bob", "charlie", "eve", "null") - /// Blocked addresses, set directly in code. - // Fixed to a constant value for now, until #528 is closed. - val BLOCKED = Set("eve") - - // The part of the key-value store read by the bank or written by the bank. - // In contrast to the Cosmos SDK in Go, we encapsulate the view of the - // context available to the bank in this special record. + // An input of a multiparty transfer + type Output = Input + // the portion of the context that is accessed by the bank module type BankCtx = { // block time (needed by vesting accounts) blockTime: Int64, @@ -79,387 +37,131 @@ module bank { params: Params, } - // An output produced by stateful computations. - // This looks very much like Either[L, R] or Result[T, E] in Rust, - // which we should use in the future. See: - // https://github.com/informalsystems/quint/issues/539 - type BankOut = { - isError: bool, - ctx: BankCtx, + // Parameters of the bank module + type Params = { + // whether coin send is enabled for specific denominations + sendEnabled: Set[{ denom: str, enabled: bool }], + // whether coin send is enabled by default + defaultSendEnabled: bool, } - // TODO: introduce a separate module, when the modules are fixed: - // https://github.com/informalsystems/quint/issues/523 - - // module ViewKeeper { - /// `GetAllBalances` returns all the account balances for the given account address. - /// SDK: `func (k BaseViewKeeper) GetAllBalances(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins` - pure def getAllBalances(ctx: BankCtx, addr: Addr): Coins = { - if (ctx.balances.keys().contains(addr)) { - ctx.balances.get(addr) - } else { - Map() - } - } - - /// `ValidateBalance` should only be called upon genesis state. - /// SDK `ValidateBalance(ctx sdk.Context, addr sdk.AccAddress) error` - pure def validateBalance(ctx: BankCtx, addr: Addr): bool = and { - ctx.accounts.contains(addr), - val coins = getAllBalances(ctx, addr) - // SKIPPED: Coins.IsValid does more tests, including the denominations format - coins.keys().forall(denom => coins.get(denom) > 0), - // SKIPPED: logic of vesting accounts that are initialized in genesis + // FUNCTIONAL LAYER, e.g., keepers + pure def ViewKeeper::GetAllBalances(ctx: BankCtx, addr: Addr): Coins = { + if (ctx.balances.keys().contains(addr)) { + ctx.balances.get(addr) + } else { + Map() } - - /// `GetBalance` returns the balance of a specific denomination - /// for a given account by address. - /// SDK: `func (k BaseViewKeeper) GetBalance(ctx sdk.Context, addr sdk.AccAddress, denom string) sdk.Coin` - pure def getBalance(ctx: BankCtx, addr: Addr, denom: str): Int256 = { - if (ctx.balances.keys().contains(addr) - and ctx.balances.get(addr).keys().contains(denom)) { - ctx.balances.get(addr).get(denom) + } + pure def ViewKeeper::ValidateBalance(ctx: BankCtx, addr: Addr): bool = and { + ctx.accounts.contains(addr), + val coins = ViewKeeper::GetAllBalances(ctx, addr) + // Implementation: Coins.IsValid also validates denominations + coins.keys().forall(denom => coins.get(denom) > 0), + // TODO: add validation logic for the vesting accounts + } + pure def ViewKeeper::GetBalance(ctx: BankCtx, addr: Addr, denom: str): Coin = { + if (ctx.balances.keys().contains(addr)) { + val accountBal = ctx.balances.get(addr) + if (accountBal.contains(denom)) { + { denom: denom, amount: accountBal.get(denom) } } else { - 0 + // Implementation: panic here? + { denom: denom, amount: 0 } } + } else { + // Implementation: panic here? + { denom: denom, amount: 0 } } + } + pure def ViewKeeper::HasBalance(ctx: BankCtx, addr: Addr, coin: Coin): bool = { + // Implementation: panic if the address or denomination are not stored? + ViewKeeper::GetBalance(ctx, addr, coin.denom).amount >= coin.amount + } + pure def ViewKeeper::GetAccountsBalances(ctx: BankCtx): Set[Balance] = { + ctx.balances.keys().map(a => { address: a, coins: ctx.balances.get(a) }) + } - /// `HasBalance` returns whether or not an account has at least amt balance. - /// SDK: `func (k BaseViewKeeper) HasBalance(ctx sdk.Context, addr sdk.AccAddress, amt sdk.Coin) bool` - pure def hasBalance(ctx: BankCtx, addr: Addr, coin: Coin): bool = { - getBalance(ctx, addr, coin.denom) >= coin.amount - } - - /// `GetAccountsBalances` returns all the accounts balances from the store. - /// SDK: `func (k BaseViewKeeper) GetAccountsBalances(ctx sdk.Context) []types.Balance` - pure def getAccountsBalances(ctx: BankCtx): Set[Balance] = { - ctx.balances.keys().map(a => { address: a, coins: ctx.balances.get(a) }) - } - - // SKIPPED: not dealing with vesting accounts - // LockedCoins(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins - - // SKIPPED: not dealing with vesting accounts - // SpendableCoins(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins - - // SKIPPED: It is simply another version of `getAllBalances` that uses an iterator. - // SDK: func (k BaseViewKeeper) - // IterateAccountBalances(ctx sdk.Context, addr sdk.AccAddress, cb func(sdk.Coin) bool) - - // SKIPPED: It is simply another version of `getAccountBalances` that uses an iterator. - // IterateAllBalances iterates over all the balances of all accounts and - // denominations that are provided to a callback. If true is returned from the - // callback, iteration is halted. - // } // ViewKeeper - - // module SendKeeper { - /// `SendCoins` transfers amt coins from a sending account to a receiving account. - /// An error is returned upon failure. - /// - /// In our specification, - /// `sendCoins` does not update the context in place, but it returns a new context. - /// The value `false` is returned in case of error or panic. - /// SDK `SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error` - pure def sendCoins(ctx: BankCtx, - fromAddr: Addr, toAddr: Addr, amt: Coins): BankOut = { - // NOTE on SDK: if Coins are constructed with NewCoins, they must be positive. - // However, if they are constructed some other way, there is no precondition. - // SKIPPED: checking LockedCoins that deal with vested coins. - // Safely subtract the coins from `fromAddr` and add them to `toAddr`. - val fromCoins = getAllBalances(ctx, fromAddr) - if (amt.keys().exists(d => - not(d.in(fromCoins.keys())) or fromCoins.get(d) < amt.get(d))) { - // some denominations do not exist on `fromAddr`, or there is not enough funds - { isError: true, ctx: ctx } + pure def SendKeeper::SendCoins(ctx: BankCtx, + fromAddr: Addr, toAddr: Addr, amt: Coins): (bool, BankCtx) = { + // Implementation: if Coins are constructed with NewCoins, they must be positive. + // However, if they are constructed some other way, there is no precondition. + // TODO: checking LockedCoins that deal with vested coins. + // Safely subtract the coins from fromAddr and add them to toAddr. + val fromCoins = ViewKeeper::GetAllBalances(ctx, fromAddr) + if (amt.keys().exists(d => + not(d.in(fromCoins.keys())) or fromCoins.get(d) < amt.get(d))) { + // some denominations do not exist on fromAddr, or there is not enough funds + (false, ctx) + } else { + // x/bank invariants prohibit persistence of zero balances + // clean zero balances + def getOr0(coins: Coins, d: str): int = if (d.in(coins.keys())) coins.get(d) else 0 + val positiveDenoms = fromCoins.keys().filter(d => fromCoins.get(d) > getOr0(amt, d)) + val subCoins = positiveDenoms.mapBy(d => fromCoins.get(d) - getOr0(amt, d)) + // add coins to toAddr: the tricky part is that the denominations may differ + val toCoins = ViewKeeper::GetAllBalances(ctx, toAddr) + // extend the toCoins and amt with zeroes over the joint denominations + val jointDenoms = toCoins.keys().union(amt.keys()) + // since toCoins and amt held positive values, their sums must be positive too + val addCoins = jointDenoms.mapBy(d => getOr0(toCoins, d) + getOr0(amt, d)) + if (addCoins.keys().exists(d => addCoins.get(d) > MAX_INT256)) { + // Implementation: panic! + (false, ctx) } else { - // x/bank invariants prohibit persistence of zero balances - // clean zero balances - def getOr0(coins: Coins, d: str): int = if (d.in(coins.keys())) coins.get(d) else 0 - val positiveDenoms = fromCoins.keys().filter(d => fromCoins.get(d) > getOr0(amt, d)) - val subCoins = positiveDenoms.mapBy(d => fromCoins.get(d) - getOr0(amt, d)) - // add coins to toAddr: the tricky part is that the denominations may differ - val toCoins = getAllBalances(ctx, toAddr) - // extend the toCoins and amt with zeroes over the joint denominations - val jointDenoms = toCoins.keys().union(amt.keys()) - // since toCoins and amt held positive values, their sums must be positive too - val addCoins = jointDenoms.mapBy(d => getOr0(toCoins, d) + getOr0(amt, d)) - if (addCoins.keys().exists(d => addCoins.get(d) > MAX_INT256)) { - // overflow, SDK panics - { isError: true, ctx: ctx } - } else { - // add `toAddr` to the accounts, if it did not exist - val newAccounts = ctx.accounts.union(Set(toAddr)) - val newBalances = - if (fromAddr == toAddr) { - ctx.balances - } else { - // Update the balance of `fromAddr` with subCoins. - val newBalancesSub = ctx.balances.set(fromAddr, subCoins) - // Since `toAddr` may be a new account, extend the map, if needed - newBalancesSub.put(toAddr, addCoins) - } - { - isError: false, - ctx: ctx.with("balances", newBalances).with("accounts", newAccounts), + // add toAddr to the accounts, if it did not exist + val newAccounts = ctx.accounts.union(Set(toAddr)) + val newBalances = + if (fromAddr == toAddr) { + ctx.balances + } else { + // Update the balance of fromAddr with subCoins. + val newBalancesSub = ctx.balances.set(fromAddr, subCoins) + // Since toAddr may be a new account, extend the map, if needed + newBalancesSub.put(toAddr, addCoins) } - } + // succeed with a new balance + (true, ctx.with("balances", newBalances).with("accounts", newAccounts)) } } - - /// `GetParams` returns the total set of bank parameters. - /// SDK: `GetParams(ctx sdk.Context) types.Params` - pure def getParams(ctx: BankCtx): Params = ctx.params - - /// `SetParams` sets the total set of bank parameters. - /// In our specification, - /// `setParams` does not update the context in place, but returns a new context. - /// SDK: SetParams(ctx sdk.Context, params types.Params) - pure def setParams(ctx: BankCtx, params: Params): BankCtx = { - ctx.with("params", params) - } - - /// IsSendEnabledCoin returns the current SendEnabled status of the provided coin's denom - /// SDK: `IsSendEnabledCoin(ctx sdk.Context, coin sdk.Coin) bool` - pure def isSendEnabledCoin(ctx: BankCtx, coin: Coin): bool = { - val found = ctx.params.sendEnabled.filter(p => coin.denom == p.denom) - if (found != Set()) { - found.exists(p => p.enabled) - } else { - ctx.params.defaultSendEnabled - } - } - - /// `IsSendEnabledCoins` checks the coins provide and returns an `ErrSendDisabled` if - /// any of the coins are not configured for sending. Returns `nil` if sending is enabled - /// for all provided coin. - /// SDK: `IsSendEnabledCoins(ctx sdk.Context, coins ...sdk.Coin) error` - pure def isSendEnabledCoins(ctx: BankCtx, coins: Set[Coin]): str = { - if (coins.forall(c => isSendEnabledCoin(ctx, c))) { - "" - } else { - "ErrSendDisabled" - } - } - - /// `BlockedAddr` checks if a given address is restricted from receiving funds. - /// SDK: `BlockedAddr(addr sdk.AccAddress) bool` - pure def blockedAddr(addr: Addr): bool = { - addr.in(BLOCKED) - } - - // } // SendKeeper - - // module BankKeeper { - // } // BankKeeper - - // TODO: types.QueryServer - - // THE STATE MACHINE - // TODO: we should introduce the state machine in a separate module, maybe in a separate file - // module machine { - // An interesting point here. Although we specify the state machine - // of the bank module here, we could enrich its behavior by having - // more state variables. The minimal required state is encapsulated in BankCtx. - // - // managed by the account keeper - var accounts: Set[Addr] - // managed by the bank keeper - var balances: Addr -> Coins - - // A helper function. - // It indicates the user's intent to write a precondition, - // which should hold true, whenever an action is called. - def require(cond) = cond - - // TODO: introduce constants for balances, accounts, and params - // when #528 is done: - // https://github.com/informalsystems/quint/issues/528 - val PARAMS = { - sendEnabled: Set( - { denom: "atom", enabled: true }, - { denom: "proton", enabled: true } - ), - defaultSendEnabled: false - } - - // When #528 is done, this will be gone. - // Tests will instantiate module constants with fixed values. - val DENOMS = Set("atom", "proton", "photon") - - // Initialize the state machine - // Until #528 is closed, this initializer is a mock. - // When #528 is closed, we will use constants to initializes the genesis, - // and specific tests will initialize these constants to the values they need. - action init = { - val accs = ADDR.exclude(Set("null")) - val bals = Map( - "alice" -> Map("atom" -> 30, "proton" -> 20, "photon" -> 2000), - "bob" -> Map("atom" -> 1) - ) - // validate the balances at the genesis time - val bankIn = { blockTime: 0, accounts: accs, balances: bals, params: PARAMS } - all { - require(accs.forall(a => validateBalance(bankIn, a))), - // initialize the state - accounts' = accs, - balances' = bals, - } - } - - // handler of MsgSend of x/bank - // https://docs.cosmos.network/v0.45/modules/bank/03_messages.html - action send(fromAddr: Addr, toAddr: Addr, coins: Coins): bool = { - val oldCtx = { - blockTime: 0, accounts: accounts, balances: balances, params: PARAMS - } - // Send the coins via the keeper. - // The message handler does validation and fails a transaction, - // if it does not pass validation. For the moment, we simply require - // the parameters to pass validation, for the action to succeed. - // In the future, we may want to save failed transactions. - all { - require(coins.keys().forall(d => coins.get(d) > 0)), - require(isSendEnabledCoins(oldCtx, - coins.keys().map(d => { denom: d, amount: coins.get(d) })) == ""), - require(not(blockedAddr(toAddr))), - val result = sendCoins(oldCtx, fromAddr, toAddr, coins) - all { - require(not(result.isError)), - balances' = result.ctx.balances, - accounts' = result.ctx.accounts, - } - } - } - - action step = { - // at the moment, we execute only one action, so no "any" is used - // TODO: make a case for more than one denomination - nondet denom = oneOf(DENOMS) - // Note that the probability of randomly picking an amount that - // will not fail in `send` is quite small. - // Hence, we need more targeted tests (see below). - nondet amount = oneOf((-(2^256)).to(2^256 - 1)) - nondet fromAddr = oneOf(ADDR) - nondet toAddr = oneOf(ADDR) - send(fromAddr, toAddr, Map(denom -> amount)) - } - // } - - // UNIT TESTS - // TODO: the tests should be done in a separate module, maybe in a separate file - - // all addresses but "null" have an associated account in the key/value store - // TODO: this definition is used by tests and it should be used there - val ACCOUNTS = ADDR.exclude(Set("null")) - // a simple context for testing - val CONTEXT = { - blockTime: 10, - accounts: ACCOUNTS, - balances: Map( - "alice" -> Map("atom" -> 17, "nonatom" -> 2), - "bob" -> Map("atom" -> 0) - ), - params: { - sendEnabled: Set( - { denom: "atom", enabled: true }, - { denom: "proton", enabled: true } - ), - defaultSendEnabled: false - } } - - // test that validateBalance is working as expected - run validateBalanceTest = { - assert(validateBalance(CONTEXT, "alice")) - .then(assert(not(validateBalance(CONTEXT, "null")))) - } - - // An auxilliary action that keeps all variables unchanged. - // In the future, such change would be computed automatically: - // https://github.com/informalsystems/quint/discussions/70 - action keepVars = all { - balances' = balances, - accounts' = accounts, + pure def SendKeeper::GetParams(ctx: BankCtx): Params = ctx.params + pure def SendKeeper::SetParams(ctx: BankCtx, params: Params): BankCtx = { + ctx.with("params", params) } - - // test that a simple `send` goes through - run sendOkTest = { - init - .then(send("alice", "bob", Map("atom" -> 3))) - .then(all { - assert(balances.get("alice").get("atom") == 27), - assert(balances.get("bob").get("atom") == 4), - keepVars, - }) - } - - // test that `send` fails when sending a token with send disabled - run sendNotEnabledErrTest = { - init - .then(send("alice", "bob", Map("photon" -> 3))) - .fail() - } - - // test that multiple denominations can be sent at once - run sendTwoOkTest = { - init - .then(send("alice", "bob", Map("atom" -> 3, "proton" -> 11))) - .then(all { - assert(balances.get("alice").get("atom") == 27), - assert(balances.get("alice").get("proton") == 9), - assert(balances.get("bob").get("atom") == 4), - assert(balances.get("bob").get("proton") == 11), - keepVars, - }) - } - - // a test similar to property-based testing that randomly probes send - // custom initializer that picks some balances for several denominations - action initBoxed = all { - nondet amts1 = Set("atom").setOfMaps(to(0, 15)).oneOf() - nondet amts2 = Set("proton").setOfMaps(to(0, 15)).oneOf() - nondet amts3 = Set("atom", "proton").setOfMaps(to(0, 15)).oneOf() - nondet amts4 = Set("atom", "photon").setOfMaps(to(0, 15)).oneOf() - nondet bals = ADDR.setOfMaps(Set(amts1, amts2, amts3, amts4)).oneOf() - all { - balances' = bals, - accounts' = bals.keys().exclude(Set("null")), + pure def SendKeeper::IsSendEnabledCoin(ctx: BankCtx, coin: Coin): bool = { + val found = ctx.params.sendEnabled.filter(p => coin.denom == p.denom) + if (found != Set()) { + found.exists(p => p.enabled) + } else { + ctx.params.defaultSendEnabled } } - // custom send that picks some randomly picks some tokens to transfer - action sendBoxed = { - // pick some denominations - nondet denoms = DENOMS.powerset().oneOf() - // Since denoms may be empty, oneOf() may complain. Redefine the empty set. - nondet someDenoms = if (denoms == Set()) Set("atom") else denoms - // pick some amounts - nondet coins = someDenoms.setOfMaps(to(-5, 5)).oneOf() - // pick the addresses - nondet addrFrom = ADDR.oneOf() - nondet addrTo = ADDR.oneOf() - send(addrFrom, addrTo, coins) + pure def SendKeeper::IsSendEnabledCoins(ctx: BankCtx, coins: Set[Coin]): bool = { + // Implementation: return the error ErrSendDisabled on false + coins.forall(c => SendKeeper::IsSendEnabledCoin(ctx, c)) } - // this is one of the basic invariants of the bank module - val nonNegativeSupplyInv = - balances.keys().forall(a => - val coins = balances.get(a) - coins.keys().forall(d => coins.get(d) >= 0) - ) - - // a single point random test - run sendRandomTest = { - initBoxed - .then(sendBoxed) - .then(all { - assert(nonNegativeSupplyInv), - keepVars - }) + // STATE + // Total supply of coins per denomination + var Supply: Denom -> Int256 + // Balances for each address + var Balances: Addr -> Coins + + // INVARIANTS + // sum up amounts over all balances for a given denomination + def SumForDenom(denom: Denom): Int256 = { + Balances.keys().fold(0, (sum, addr) => { + val coins = Balances.get(addr) + if (denom.in(coins.keys())) + sum + coins.get(denom) + else + sum + }) } - // If you'd like to run this test for multiple data points, - // you can do it in REPL as follows: - // .load bank.qnt - // import bank.* - // _test(10000, 3, "initBoxed", "sendBoxed", "nonNegativeSupplyInv") + // The total Supply of the network is equal to the sum of all coins from the account + val TotalSupplyInv = { + Supply.keys().forall(denom => (SumForDenom(denom) == Supply.get(denom))) + } } diff --git a/examples/cosmos-bank/cosmos-bank.md b/examples/cosmos-bank/cosmos-bank.md new file mode 100644 index 000000000..ab7ec2f72 --- /dev/null +++ b/examples/cosmos-bank/cosmos-bank.md @@ -0,0 +1,520 @@ +# Onboarding to the module `x/bank` of Cosmos SDK + +Written for Cosmos SDK [v0.46.10](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/). + +## Abstract + +This document shows how we could turn an inanimate piece of documentation into +an executable specification. We are using the [bank module][] of Cosmos SDK as +an example. In the following, all of the quoted text belongs to the original +description on the [bank module][] page, unless specified otherwise. To obtain +a Quint module, run [lmt][] against this document. We follow the same +order of exposition, as in the original document. + +Importantly, this description is tuned towards ease of exposition, not for +implementation or verification. Remember that we do not want to make protocols +as complex as their implementation! These are the most differences: + + - We use abstract data types whenever possible, e.g., big integers, sets, and maps. + + - We abstract error codes to `true` (no error) and `false` (error). The actual + error codes belong to the implementation details. They are written in comments. + +> The bank module is responsible for handling multi-asset coin transfers +> between accounts and tracking special-case pseudo-transfers which must work +> differently with particular kinds of accounts (notably +> delegating/undelegating for vesting accounts). It exposes several interfaces +> with varying capabilities for secure interaction with other modules which +> must alter user balances. +> +> In addition, the bank module tracks and provides query support for the total +> supply of all assets used in the application. + +From the protocol perspective, the bank module looks as follows: + +```bluespec bank.qnt += +// An executable specification of the bank module +module bank { + // TYPES + <<>> + + // FUNCTIONAL LAYER, e.g., keepers + <<>> + + // STATE + <<>> + + // INVARIANTS + <<>> +} +``` + +## Basic protocol types + +These are the types that we are using in the protocol specification. +The actual implementation uses different types. **This is not a bug, but a +feature!** By using more abstract types, we make the protocol description +much easier to read and understand. + +```bluespec "types" += +// Addresses are just strings. +type Addr = str +// Denominations are simply strings. +type Denom = str +// The module operates over 64-bit and 256-bit integers. +type Int64 = int +type Int256 = int + +// the maximum value for Int256 in Golang +pure val MAX_INT256 = 2^256 - 1 + +// A coin is a record that contains a denomination and an amount +type Coin = { denom: Denom, amount: Int256 } +// Coins is a map from denominations to amounts. +type Coins = Denom -> Int256 +// Account balances +type Balance = { address: Addr, coins: Coins } +``` + +**Implementation details.** There are a few important points to be made about +the implementation of the above types in Cosmos SDK: + + - The type `Addr` is implemented with `AccAddress` in + [address.go](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/types/address.go), which is `byte[]`. + It must be a + [bech32 address](https://docs.cosmos.network/main/spec/addresses/bech32). + + - The type `Denom` is implemented in + [denom.go](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/types/denom.go). It must match the regular expression `[a-zA-Z][a-zA-Z0-9/:._-]{2,127}`. + + - The type `Coin` is implemented in + [coin.go](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/types/coin.go). It must be non-negative. + + - The type `Coins` is implemented in + [coin.go](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/types/coin.go). + The implementation stores `Coins` as an array `[]Coin`. + Since an array is not a set, the implementation contains non-trivial + validation logic in [Coins.Validate](https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/types/coin.go#L229) to make sure that: + + - The amount assigned to every denomination is positive (that is, `amount > 0`). + - Coins are sorted in the order of their denominations. + - There are no duplicate denominations. + +## Supply + +> The supply functionality: +> +> passively tracks the total supply of coins within a chain, provides a pattern +> for modules to hold/interact with Coins, and introduces the invariant check to +> verify a chain's total supply. + +### Total Supply + +> The total Supply of the network is equal to the sum of all coins from the +> account. The total supply is updated every time a Coin is minted (eg: as part +> of the inflation mechanism) or burned (eg: due to slashing or if a governance +> proposal is vetoed). + +This is a perfect opportunity to define a state invariant: + +```bluespec "invariants" += +// sum up amounts over all balances for a given denomination +def SumForDenom(denom: Denom): Int256 = { + Balances.keys().fold(0, (sum, addr) => { + val coins = Balances.get(addr) + if (denom.in(coins.keys())) + sum + coins.get(denom) + else + sum + }) +} + +// The total Supply of the network is equal to the sum of all coins from the account +val TotalSupplyInv = { + Supply.keys().forall(denom => (SumForDenom(denom) == Supply.get(denom))) +} +``` + +## Module Accounts + +SKIPPED, see [Module +accounts](https://docs.cosmos.network/v0.45/modules/bank/#module-accounts). + +## State + +> The x/bank module keeps state of three primary objects, account balances, +> denom metadata and the total supply of all balances. + +The hex value represents the key in the key-value store, that is, +instead of using an ASCIIZ string, Cosmos SDK developers are using a single +byte as a key. + +> - Supply: `0x0 | byte(denom) -> byte(amount)` + +We represent this field as a map in the protocol specification: + +```bluespec "state" += +// Total supply of coins per denomination +var Supply: Denom -> Int256 +``` + +> - Denom Metadata: `0x1 | byte(denom) -> ProtocolBuffer(Metadata)` + +> - Balances: `0x2 | byte(address length) | []byte(address) | []byte(balance.Denom) -> ProtocolBuffer(balance)` + +We represent this field as a map in the protocol specification: + +```bluespec "state" += +// Balances for each address +var Balances: Addr -> Coins +``` + +## Keepers + +> The bank module provides these exported keeper interfaces that can be passed +> to other modules that read or update account > balances. Modules should use +> the least-permissive interface that provides the functionality they require. +> +> Best practices dictate careful review of bank module code to ensure that +> permissions are limited in the way that you expect. + +### Blocklisting Addresses + +> The x/bank module accepts a map of addresses that are considered blocklisted +> from directly and explicitly receiving funds through means such as MsgSend +> and MsgMultiSend and direct API calls like SendCoinsFromModuleToAccount. +> +> Typically, these addresses are module accounts. If these addresses receive +> funds outside the expected rules of the state machine, invariants are likely +> to be broken and could result in a halted network. +> +> By providing the x/bank module with a blocklisted set of addresses, an error +> occurs for the operation if a user or client attempts to directly or +> indirectly send funds to a blocklisted account, for example, by using IBC. + +**TODO: figure out how blocklisting should be described in the protocol** + +### Common Types + +#### Input + +> An input of a multiparty transfer + +The type in Quint: + +```bluespec "types" += +// An input of a multiparty transfer +type Input = { + address: str, + coins: Coins, +} +``` + +The type in protobuf: + +```protobuf +// Input models transaction input. +message Input { + string address = 1; + repeated cosmos.base.v1beta1.Coin coins = 2; +} +``` + +#### Output + +An output of a multiparty transfer. + +The type in Quint: + +```bluespec "types" += +// An input of a multiparty transfer +type Output = Input +``` + +The type in protobuf: + +```protobuf +// Output models transaction outputs. +message Output { + string address = 1; + repeated cosmos.base.v1beta1.Coin coins = 2; +} +``` + +### ViewKeeper, SendKeeper, and BaseKeeper + +> The base keeper provides full-permission access: the ability to arbitrary +> modify any account's balance and mint or burn coins. +> +> Restricted permission to mint per module could be achieved by using +> baseKeeper with WithMintCoinsRestriction to give specific restrictions to +> mint (e.g. only minting certain denom). + +`BaseKeeper` includes plenty of methods. It extends two other interfaces +as follows: + +```mermaid +classDiagram + direction LR + BaseKeeper <|-- SendKeeper + SendKeeper <|-- ViewKeeper +``` + +We define the part of the SDK context that is touched by the bank module: + +```bluespec "types" += +// the portion of the context that is accessed by the bank module +type BankCtx = { + // block time (needed by vesting accounts) + blockTime: Int64, + // accessed via AccountKeeper + accounts: Set[Addr], + // the balances are the essential part of the bank module + balances: Addr -> Coins, + // module parameters + params: Params, +} + +``` + +#### ViewKeeper + +`ViewKeeper` is extended by `SendKeeper`, extended by `BaseKeeper`. +Its code can be found in [view.go](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/x/bank/keeper/view.go). + + - `getAllBalances` returns all the account balances for the given account + address: + +```bluespec "functional" += +pure def ViewKeeper::GetAllBalances(ctx: BankCtx, addr: Addr): Coins = { + if (ctx.balances.keys().contains(addr)) { + ctx.balances.get(addr) + } else { + Map() + } +} +``` + + - `validateBalance` validates all balances for a given account address + returning an error if any balance is invalid. It checks for vesting + account types and validate the balances against the original vesting + balances. CONTRACT: ValidateBalance should only be called upon genesis + state. In the case of vesting accounts, balances may change in a valid + manner that would otherwise yield an error from this call. + +```bluespec "functional" += +pure def ViewKeeper::ValidateBalance(ctx: BankCtx, addr: Addr): bool = and { + ctx.accounts.contains(addr), + val coins = ViewKeeper::GetAllBalances(ctx, addr) + // Implementation: Coins.IsValid also validates denominations + coins.keys().forall(denom => coins.get(denom) > 0), + // TODO: add validation logic for the vesting accounts +} +``` + + - `getBalance` returns the balance of a specific denomination + for a given account by address: + +```bluespec "functional" += +pure def ViewKeeper::GetBalance(ctx: BankCtx, addr: Addr, denom: str): Coin = { + if (ctx.balances.keys().contains(addr)) { + val accountBal = ctx.balances.get(addr) + if (accountBal.contains(denom)) { + { denom: denom, amount: accountBal.get(denom) } + } else { + // Implementation: panic here? + { denom: denom, amount: 0 } + } + } else { + // Implementation: panic here? + { denom: denom, amount: 0 } + } +} +``` + + - `HasBalance` returns whether or not an account has at least amt balance: + +```bluespec "functional" += +pure def ViewKeeper::HasBalance(ctx: BankCtx, addr: Addr, coin: Coin): bool = { + // Implementation: panic if the address or denomination are not stored? + ViewKeeper::GetBalance(ctx, addr, coin.denom).amount >= coin.amount +} +``` + + - `GetAccountsBalances` returns all the accounts balances from the store: + +```bluespec "functional" += +pure def ViewKeeper::GetAccountsBalances(ctx: BankCtx): Set[Balance] = { + ctx.balances.keys().map(a => { address: a, coins: ctx.balances.get(a) }) +} + +``` + + - `LockedCoins` returns all the coins that are not spendable + (i.e. locked) for an account by address. For standard accounts, the + result will always be no coins. For vesting accounts, LockedCoins is + delegated to the concrete vesting account type. + + - `SpendableCoins` returns the total balances of spendable coins for an + account by address. If the account has no spendable coins, an empty + Coins slice is returned. + + - `IterateAccountBalances` iterates over the balances of a single account + and provides the token balance to a callback. If true is returned from + the callback, iteration is halted. + + - `IterateAllBalances` iterates over all the balances of all accounts and + denominations that are provided to a callback. If true is returned from + the callback, iteration is halted. + +#### SendKeeper + +`SendKeeper` extends `ViewKeeper` and is extended by `BaseKeeper`. +Its code can be found in +[send.go](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/x/bank/keeper/send.go). + + - `SendCoins` transfers amt coins from a sending account to a receiving account. + An error is returned upon failure. At the protocol level, `sendCoins` does not + update the context in place, but it returns a new context. + The value `false` is returned in case of error or panic. + +
+ Click to see how SendCoins works + +```bluespec "functional" += +pure def SendKeeper::SendCoins(ctx: BankCtx, + fromAddr: Addr, toAddr: Addr, amt: Coins): (bool, BankCtx) = { + // Implementation: if Coins are constructed with NewCoins, they must be positive. + // However, if they are constructed some other way, there is no precondition. + // TODO: checking LockedCoins that deal with vested coins. + // Safely subtract the coins from fromAddr and add them to toAddr. + val fromCoins = ViewKeeper::GetAllBalances(ctx, fromAddr) + if (amt.keys().exists(d => + not(d.in(fromCoins.keys())) or fromCoins.get(d) < amt.get(d))) { + // some denominations do not exist on fromAddr, or there is not enough funds + (false, ctx) + } else { + // x/bank invariants prohibit persistence of zero balances + // clean zero balances + def getOr0(coins: Coins, d: str): int = if (d.in(coins.keys())) coins.get(d) else 0 + val positiveDenoms = fromCoins.keys().filter(d => fromCoins.get(d) > getOr0(amt, d)) + val subCoins = positiveDenoms.mapBy(d => fromCoins.get(d) - getOr0(amt, d)) + // add coins to toAddr: the tricky part is that the denominations may differ + val toCoins = ViewKeeper::GetAllBalances(ctx, toAddr) + // extend the toCoins and amt with zeroes over the joint denominations + val jointDenoms = toCoins.keys().union(amt.keys()) + // since toCoins and amt held positive values, their sums must be positive too + val addCoins = jointDenoms.mapBy(d => getOr0(toCoins, d) + getOr0(amt, d)) + if (addCoins.keys().exists(d => addCoins.get(d) > MAX_INT256)) { + // Implementation: panic! + (false, ctx) + } else { + // add toAddr to the accounts, if it did not exist + val newAccounts = ctx.accounts.union(Set(toAddr)) + val newBalances = + if (fromAddr == toAddr) { + ctx.balances + } else { + // Update the balance of fromAddr with subCoins. + val newBalancesSub = ctx.balances.set(fromAddr, subCoins) + // Since toAddr may be a new account, extend the map, if needed + newBalancesSub.put(toAddr, addCoins) + } + // succeed with a new balance + (true, ctx.with("balances", newBalances).with("accounts", newAccounts)) + } + } +} +``` +
+ + - `InputOutputCoins` performs multi-send functionality. It accepts a series of + inputs that correspond to a series of outputs. It returns an error if the + inputs and outputs don't lineup or if any single transfer of tokens fails. + + - `GetParams` returns the total set of bank parameters. + +```bluespec "functional" += +pure def SendKeeper::GetParams(ctx: BankCtx): Params = ctx.params +``` + + - `SetParams` sets the total set of bank parameters. + +```bluespec "functional" += +pure def SendKeeper::SetParams(ctx: BankCtx, params: Params): BankCtx = { + ctx.with("params", params) +} +``` + + - `IsSendEnabledCoin` returns the current SendEnabled status of the provided + coin's denom. + +```bluespec "functional" += +pure def SendKeeper::IsSendEnabledCoin(ctx: BankCtx, coin: Coin): bool = { + val found = ctx.params.sendEnabled.filter(p => coin.denom == p.denom) + if (found != Set()) { + found.exists(p => p.enabled) + } else { + ctx.params.defaultSendEnabled + } +} +``` + + - `IsSendEnabledCoins` checks the coins provide and returns an `ErrSendDisabled` if + any of the coins are not configured for sending. Returns `nil` if sending is enabled + for all provided coin. + +```bluespec "functional" += +pure def SendKeeper::IsSendEnabledCoins(ctx: BankCtx, coins: Set[Coin]): bool = { + // Implementation: return the error ErrSendDisabled on false + coins.forall(c => SendKeeper::IsSendEnabledCoin(ctx, c)) +} +``` + + - `BlockedAddr` checks if a given address is restricted from receiving funds. + + +#### BaseKeeper + +`BaseKeeper` extends `SendKeeper`. Its code can be found in +[keeper.go](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/x/bank/keeper/keeper.go). + +**TODO: add the description** + +## Parameters + +> The bank module contains the following parameters: + +| Key | Type | Example | +| -------------------- | --------------- | ------------------------------------ | +| `SendEnabled` | `[]SendEnabled` | `[{denom: "stake", enabled: true }]` | +| `DefaultSendEnabled` | `bool` | `true` | + +### SendEnabled + +The send enabled parameter is an array of `SendEnabled` entries mapping coin +denominations to their send_enabled status. Entries in this list take precedence +over the `DefaultSendEnabled` setting. + +### DefaultSendEnabled + +The default send enabled value controls send transfer capability for all coin denominations unless specifically included in the array of SendEnabled parameters. + +### Parameters in Quint + +We pack `SendEnabled` and `DefaultSendEnabled` in the record `Params`: + +```bluespec "types" += +// Parameters of the bank module +type Params = { + // whether coin send is enabled for specific denominations + sendEnabled: Set[{ denom: str, enabled: bool }], + // whether coin send is enabled by default + defaultSendEnabled: bool, +} +``` + + + +[bank module]: https://docs.cosmos.network/v0.45/modules/bank/# +[lmt]: https://github.com/driusan/lmt \ No newline at end of file From 3bb7b4641c36ebe440c0d9f7b70ce86fedc98bf3 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Thu, 9 Mar 2023 11:43:24 +0100 Subject: [PATCH 013/388] add a link to the spec --- examples/cosmos-bank/cosmos-bank.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/cosmos-bank/cosmos-bank.md b/examples/cosmos-bank/cosmos-bank.md index ab7ec2f72..e7b31b287 100644 --- a/examples/cosmos-bank/cosmos-bank.md +++ b/examples/cosmos-bank/cosmos-bank.md @@ -8,8 +8,9 @@ This document shows how we could turn an inanimate piece of documentation into an executable specification. We are using the [bank module][] of Cosmos SDK as an example. In the following, all of the quoted text belongs to the original description on the [bank module][] page, unless specified otherwise. To obtain -a Quint module, run [lmt][] against this document. We follow the same -order of exposition, as in the original document. +a Quint module, run [lmt][] against this document. Check the executable +specification in [bank.qnt](./bank.qnt). We follow the same order of exposition, +as in the original document. Importantly, this description is tuned towards ease of exposition, not for implementation or verification. Remember that we do not want to make protocols @@ -33,6 +34,7 @@ as complex as their implementation! These are the most differences: From the protocol perspective, the bank module looks as follows: ```bluespec bank.qnt += +// -*- mode: Bluespec; -*- // An executable specification of the bank module module bank { // TYPES From b70d9a62860e2c496168eff3705b4d86b3e50a65 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Thu, 9 Mar 2023 11:43:50 +0100 Subject: [PATCH 014/388] update the generated spec --- examples/cosmos-bank/bank.qnt | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/cosmos-bank/bank.qnt b/examples/cosmos-bank/bank.qnt index 34042db2d..797e4959e 100644 --- a/examples/cosmos-bank/bank.qnt +++ b/examples/cosmos-bank/bank.qnt @@ -1,3 +1,4 @@ +// -*- mode: Bluespec; -*- // An executable specification of the bank module module bank { // TYPES From 0f321dec98bb95c7ef96907bb04df1d4c626ee92 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Thu, 9 Mar 2023 11:45:01 +0100 Subject: [PATCH 015/388] update the diagram --- examples/cosmos-bank/cosmos-bank.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/cosmos-bank/cosmos-bank.md b/examples/cosmos-bank/cosmos-bank.md index e7b31b287..3d97b2301 100644 --- a/examples/cosmos-bank/cosmos-bank.md +++ b/examples/cosmos-bank/cosmos-bank.md @@ -258,8 +258,8 @@ as follows: ```mermaid classDiagram direction LR - BaseKeeper <|-- SendKeeper - SendKeeper <|-- ViewKeeper + ViewKeeper <|-- SendKeeper + SendKeeper <|-- BaseKeeper ``` We define the part of the SDK context that is touched by the bank module: @@ -519,4 +519,4 @@ type Params = { [bank module]: https://docs.cosmos.network/v0.45/modules/bank/# -[lmt]: https://github.com/driusan/lmt \ No newline at end of file +[lmt]: https://github.com/driusan/lmt From 7b37cc6a64c3789e22bf610317686b5217947ad1 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Thu, 9 Mar 2023 12:05:53 +0100 Subject: [PATCH 016/388] fix a bug in GetBalance --- examples/cosmos-bank/bank.qnt | 2 +- examples/cosmos-bank/cosmos-bank.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/cosmos-bank/bank.qnt b/examples/cosmos-bank/bank.qnt index 797e4959e..53264b0ce 100644 --- a/examples/cosmos-bank/bank.qnt +++ b/examples/cosmos-bank/bank.qnt @@ -64,7 +64,7 @@ module bank { pure def ViewKeeper::GetBalance(ctx: BankCtx, addr: Addr, denom: str): Coin = { if (ctx.balances.keys().contains(addr)) { val accountBal = ctx.balances.get(addr) - if (accountBal.contains(denom)) { + if (accountBal.keys().contains(denom)) { { denom: denom, amount: accountBal.get(denom) } } else { // Implementation: panic here? diff --git a/examples/cosmos-bank/cosmos-bank.md b/examples/cosmos-bank/cosmos-bank.md index 3d97b2301..1a44b1cde 100644 --- a/examples/cosmos-bank/cosmos-bank.md +++ b/examples/cosmos-bank/cosmos-bank.md @@ -321,7 +321,7 @@ pure def ViewKeeper::ValidateBalance(ctx: BankCtx, addr: Addr): bool = and { pure def ViewKeeper::GetBalance(ctx: BankCtx, addr: Addr, denom: str): Coin = { if (ctx.balances.keys().contains(addr)) { val accountBal = ctx.balances.get(addr) - if (accountBal.contains(denom)) { + if (accountBal.keys().contains(denom)) { { denom: denom, amount: accountBal.get(denom) } } else { // Implementation: panic here? From 4b78634f942095d4a34be06baa14f2118ec0dd89 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Wed, 5 Apr 2023 14:18:02 +0200 Subject: [PATCH 017/388] the first version of ADR007 --- doc/adr007-foreign-calls.md | 223 ++++++++++++++++++++++++++++++++++++ 1 file changed, 223 insertions(+) create mode 100644 doc/adr007-foreign-calls.md diff --git a/doc/adr007-foreign-calls.md b/doc/adr007-foreign-calls.md new file mode 100644 index 000000000..f046954d9 --- /dev/null +++ b/doc/adr007-foreign-calls.md @@ -0,0 +1,223 @@ +# ADR007: Design of foreign calls in Quint + +| Revision | Date | Author | +| :------- | :--------- | :--------------- | +| 1 | 2023-04-05 | Igor Konnov | + +## 1. Summary + +In this ADR, we discuss potential solutions for integrating the Quint simulator +with other execution environments. This would enrich the simulator with +computations that cannot be expressed in Quint itself, e.g., rich string +manipulation and parsing. Additionally, it would give us another path for more +interactive integration of the Quint simulator with systems under test. + +## 2. Context + +Quint is a specification language with the following features that are important +in the context of this ADR: + + - Quint has a relatively small standard library, and + - Quint has formal semantics, thanks to its transpilation to TLA+. + +Thanks to these features, Quint is an easier target for static analysis and +verification tools than general-purpose programming languages. At the same time, +these nice features are somewhat in conflict with the expressivity and usability +of the language, from the systems engineer's point of view. Even though Quint is +obviously Turing-complete (for example, quantifiers over integers and integer +arithmetic make many properties undecidable), this does not mean that all of the +typical engineering tasks are easy to do in Quint. + +In the following, we introduce several examples that motivate the need for this +ADR. + +### Example 1: Strings + +From the systems engineer's point of view, the most glaring omission in the +language is the absence of string manipulation. From the verification engineer's +point of view strings are nothing else but lists of constants, which are +normally represented with bytes or sequences of bytes in programming languages. +While this is true, it is simply hard for humans to read expressions in this +representation. Compare the two expressions: + +```js +["I", " ", "a", "m", " ", "a" , " ", "s", "t", "r", "i", "n", "g"] +"I am a string" +``` + +Although, string operations are typically used to format the output and process +the input, they open a room for hard verification problems. We should not +introduce hard problems, if they are caused by non-functional features such as +the user interface. + +Yet, it would be nice to have a nice user interface in REPL, while keeping the +specifications amenable for verification. This shows a need for a clear +boundary between the "essential" computations and "non-essential" computations. + +One concrete example of this usability issue is the string representation of +[IBC denominations][]. For instance, IBC operates over strings such as +`transfer/channelToA/denom`. In a Quint specification, we would prefer to +operate over lists such as `["transfer", "channelToA", "denom"]`. How can we +make Quint consume and produce the human-readable form of denominations, while +operating over lists? This problem calls for a serialization solution, which +would be typically done via a standard interface such as `toString` and +`parseFrom` in programming languages. For instance, it would be quite easy to +write such functions in JavaScript. + +*Desired state: We would to input and output strings in a human-readable +form without impairing the verification tools.* + +### Example 2: Hashing and encryption + +Related to Example 1, blockchain projects heavily rely on the standard hashing +and encryption functions such as [SHA-2][] and ed25519, see [Cosmos Accounts][]. +Not only it would be hard to express these algorithms in Quint, it would also +introduce enormous complexity to the verification tasks. To perform functional +verification, we would usually need high-level properties of these algorithms. +Actually, assuming perfect hashing and perfect encryption is often sufficient to +reason about non-cryptographic properties of distributed algorithms. + +Again, while this is mostly irrelevant for verification, systems engineers +would like to call the actual hashing and encryption functions at some point, +for instance, to generate realistic data. + +*Desired state: We should be able to use the standard hashing/encryption +functions in the simulator. We do not have to verify these functions, assuming +that they are in the trusted core of our system.* + +### Example 3: Testing + +Testing is probably the most obvious example that would require an integration +between the simulator and the system under test. Our current approach to this +problem is to produce traces in the [ITF Format][]. For instance, the following +command would save a trace found by the simulator into `foo.itf.json`, see +the [Quint manual][] for details: + +```sh +quint run --out-itf=foo.itf.json foo.qnt +``` + +This approach assumes that the simulator (or a verification tool) is called +once, and its output is consumed by the system under test. However, this makes +it hard to integrate the simulator/verifier and the system under test into a +feedback loop. For example, see [Issue 2453][]. + +*Desired state: We should be able to call a system under test from a Quint +specification, in order to get interactive feedback from the system under test.* + +### Example 4: Interactive trace visualization + +Visualization is another example of where we could benefit from an integration +with non-Quint code. Whereas it should be easy to visualize ITF traces, we could +go further and visualize interactive computations, e.g., in Quint REPL. We have +discussed this approach once, and it was not clear to us, why should we call +foreign code from Quint to do that, see [Issue 143][]. So this is probably not +the strongest motivator for this ADR. + +*Desired state: We should be able to inform an external visualization tool +about a change in the system state, while running the simulator, or doing +interactive exploration in REPL. Visualization should not compromise the +formal specification.* + +## 3. Options + +We are discussing the choice of a good technology, given the following +constraints: + + - Ideally, the simulator should be able to integration with codebases + written in Rust and Golang, as these are the implementation languages + of the Cosmos ecosystem. + + - We emphasize ease of use over performance. + +### Option 1: Dynamic integration with JavaScript via eval + +The most obvious solution that first came to my mind is to introduce a special +Quint operator such as `unsafe { ... }` and place JavaScript code inside. We +could evaluate the JavaScript code with `eval`. + +Although this solution is quite simple, it has a very bad security smell: + + - Many execution environments disable `eval`, see [eval][]. + + - Security analysis tools may complain about Quint, if we place `eval` in its + code. + + - Ironically, placing `eval` into a formal spec may lead to vulnerabilities. + +It looks like poisoning formal specs with `eval` is a very bad idea. +Additionally, it limits the integration point to JavaScript. + +### Option 2: Node vm sandbox + +A slightly better option would be to use [NodeJS VM][]. + +Pros: + + - It would still interpret JavaScript code, but in a sandboxed environment. + +Cons: + + - We would depend on NodeJS, so transferring REPL to the web will be harder. + + - It limits the integration point to JavaScript and NodeJS. + +### Option 3: JSON-RPC + +We would like to execute the non-Quint code outside of the Quint tooling itself. +[JSON-RPC][] would allow us to implement such a loosely-coupled integration. + +Pros: + + - Quint is written in TypeScript and submitting JSON is no brainer, especially + given that we are using [ITF Format][] for serialization. + + - Language agnostic. Non-Quint code may be writte in JavaScript, Golang, and + Rust. + + - Relatively easy to implement in Quint. + + - Does not require `.proto` files, in contrast to gRPC. + +Cons: + + - Not the best performance. If we aim at high-performance integration loops, + e.g., when doing fuzzing, JSON-RPC may become a bottleneck. + +### Option 4: Compile-time integration + +Another option to explore is to link against dynamic libraries that are written +in other languages, e.g., Rust and Golang. + +Pros: + + - This would probably give us the best performance. + + - This may give us bonus points from the people who like low-level languages. + +Cons: + + - Serialization would be painful. + + - External libraries would have compilation-time dependencies. It would not + pose serious problems to use, but it would make integration harder. + +## 4. Solution + +Given the analysis, we opt for using JSON-RPC. We still have to figure out the +right interface on the Quint side. This is the subject of the follow up work on +this ADR. Since we are already serializing Quint data structures into [ITF +Format][], we could use the same approach to serialization/deserialization of +Quint values. + + +[IBC denominations]: https://github.com/cosmos/ibc/blob/main/spec/app/ics-020-fungible-token-transfer/README.md#data-structures +[SHA-2]: https://en.wikipedia.org/wiki/SHA-2 +[Cosmos Accounts]: https://docs.cosmos.network/v0.45/basics/accounts.html#signatures +[ITF Format]: https://apalache.informal.systems/docs/adr/015adr-trace.html +[Quint manual]: https://github.com/informalsystems/quint/blob/main/doc/quint.md +[Issue 2453]: https://github.com/informalsystems/apalache/issues/2453 +[Issue 143]: https://github.com/informalsystems/quint/issues/143 +[eval]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval +[NodeJS VM]: https://nodejs.org/api/vm.html +[JSON-RPC]: https://en.wikipedia.org/wiki/JSON-RPC#Implementations \ No newline at end of file From 0df6ea73074c0264988eb0979f0e4b6dc43671f1 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Thu, 6 Apr 2023 17:37:46 +0200 Subject: [PATCH 018/388] rename ADR to RFC --- ...foreign-calls.md => rfc007-foreign-calls.md} | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) rename doc/{adr007-foreign-calls.md => rfc007-foreign-calls.md} (94%) diff --git a/doc/adr007-foreign-calls.md b/doc/rfc007-foreign-calls.md similarity index 94% rename from doc/adr007-foreign-calls.md rename to doc/rfc007-foreign-calls.md index f046954d9..2b4d7470d 100644 --- a/doc/adr007-foreign-calls.md +++ b/doc/rfc007-foreign-calls.md @@ -1,4 +1,4 @@ -# ADR007: Design of foreign calls in Quint +# RFC007: Design space of foreign calls in Quint | Revision | Date | Author | | :------- | :--------- | :--------------- | @@ -6,7 +6,7 @@ ## 1. Summary -In this ADR, we discuss potential solutions for integrating the Quint simulator +In this RFC, we discuss potential solutions for integrating the Quint simulator with other execution environments. This would enrich the simulator with computations that cannot be expressed in Quint itself, e.g., rich string manipulation and parsing. Additionally, it would give us another path for more @@ -15,7 +15,7 @@ interactive integration of the Quint simulator with systems under test. ## 2. Context Quint is a specification language with the following features that are important -in the context of this ADR: +in the context of this RFC: - Quint has a relatively small standard library, and - Quint has formal semantics, thanks to its transpilation to TLA+. @@ -29,7 +29,7 @@ arithmetic make many properties undecidable), this does not mean that all of the typical engineering tasks are easy to do in Quint. In the following, we introduce several examples that motivate the need for this -ADR. +RFC. ### Example 1: Strings @@ -112,7 +112,7 @@ with non-Quint code. Whereas it should be easy to visualize ITF traces, we could go further and visualize interactive computations, e.g., in Quint REPL. We have discussed this approach once, and it was not clear to us, why should we call foreign code from Quint to do that, see [Issue 143][]. So this is probably not -the strongest motivator for this ADR. +the strongest motivator for this RFC. *Desired state: We should be able to inform an external visualization tool about a change in the system state, while running the simulator, or doing @@ -204,11 +204,8 @@ Cons: ## 4. Solution -Given the analysis, we opt for using JSON-RPC. We still have to figure out the -right interface on the Quint side. This is the subject of the follow up work on -this ADR. Since we are already serializing Quint data structures into [ITF -Format][], we could use the same approach to serialization/deserialization of -Quint values. +We have to figure out a good solution, or maybe several solutions. The problem +space outlined by the four examples is quite large. [IBC denominations]: https://github.com/cosmos/ibc/blob/main/spec/app/ics-020-fungible-token-transfer/README.md#data-structures From e003e0db83c2c08cd6f66830b23787a7564339f2 Mon Sep 17 00:00:00 2001 From: Philip Offtermatt <57488781+p-offtermatt@users.noreply.github.com> Date: Fri, 11 Aug 2023 14:12:11 +0200 Subject: [PATCH 019/388] Add toSet and toList spells --- examples/spells/rareSpells.qnt | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/examples/spells/rareSpells.qnt b/examples/spells/rareSpells.qnt index f5a829403..f00ebddf2 100644 --- a/examples/spells/rareSpells.qnt +++ b/examples/spells/rareSpells.qnt @@ -23,4 +23,30 @@ module rareSpells { assert(2.to(5).mapBy(i => i * 2).mapValuesSum() == 28), assert(Map(2 -> -4, 4 -> 2).mapValuesSum() == -2), } -} \ No newline at end of file + + //// Returns a list of all elements of a set. + //// The ordering will be arbitrary. + //// + //// - @param __set a set + //// - @returns a list of all elements of __set + pure def toList(__set: Set[a]): List[a] = { + __set.fold(List(), (__l, __e) => __l.append(__e)) + } + + //// Returns a set of the elements in the list. + //// + //// - @param __list a list + //// - @returns a set of the elements in __list + pure def toSet(__list: List[a]): Set[a] = { + __list.foldl(Set(), (__s, __e) => __s.union(Set(__e))) + } + + run toListAndSetTest = + all { + assert(Set(3, 2, 1).toList().toSet() == Set(1, 2, 3)), + assert(List(2,3,1).toSet() == Set(1, 2, 3)), + assert(List(2,3,1).toSet() == List(3,2,1).toSet()), + assert(toList(Set()) == List()), + assert(toSet(List()) == Set()) + } +} From e3e4bdcd15057600be3fe6b39e26d7da23fcb409 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Fri, 24 Nov 2023 10:46:04 +0100 Subject: [PATCH 020/388] Add `debug` utility function The `debug` function is a utility designed to aid in debugging specifications by allowing the spec developer to print out a contextual message while executing a specification, whether in a run or in a test, along with a formatted representation of a value. This can be useful when trying to understand the state of variables at specific points during the spec execution or while tracking down issues. The `debug` function has the following signature: ``` def debug(header: str, value: a) -> a ``` The `debug` function prints both header and the value on the same line, preceded by a `>` character, and then returns the given value, which makes it easy to debug nested expressions without having the extract them into a variable first. Example usage in the REPL: ``` >>> debug("a number:", 42) > a number: 42 42 >>> debug("a record:", { foo: 32, bar: true }) > a record: { bar: true, foo: 32 } { bar: true, foo: 32 } >>> debug("large record:", largeRecord) > large record: { hello: { world: { foo: { bar: { baz: 42 }, toto: { tata: { tutu: "Hello, World" } } } } } } { hello: { world: { foo: { bar: { baz: 42 }, toto: { tata: { tutu: "Hello, World" } } } } } } >>> if (a * debug("nested", a + b) == 10) true else false > nested 5 true ``` --- quint/src/effects/builtinSignatures.ts | 1 + quint/src/ir/quintIr.ts | 1 + quint/src/names/base.ts | 1 + quint/src/runtime/impl/compilerImpl.ts | 12 ++++++++++++ quint/src/types/builtinSignatures.ts | 1 + quint/test/runtime/compile.test.ts | 11 +++++++++++ 6 files changed, 27 insertions(+) diff --git a/quint/src/effects/builtinSignatures.ts b/quint/src/effects/builtinSignatures.ts index eab9e8d72..70f561b47 100644 --- a/quint/src/effects/builtinSignatures.ts +++ b/quint/src/effects/builtinSignatures.ts @@ -223,6 +223,7 @@ const otherOperators = [ { name: 'reps', effect: parseAndQuantify('(Pure, (Read[r1]) => Read[r2] & Update[u]) => Read[r1, r2] & Update[u]') }, { name: 'fail', effect: propagateComponents(['read', 'update'])(1) }, { name: 'assert', effect: propagateComponents(['read'])(1) }, + { name: 'debug', effect: propagateComponents(['read'])(2) }, { name: 'ite', effect: parseAndQuantify('(Read[r1], Read[r2] & Update[u], Read[r3] & Update[u]) => Read[r1, r2, r3] & Update[u]'), diff --git a/quint/src/ir/quintIr.ts b/quint/src/ir/quintIr.ts index 937804de2..c7ba00761 100644 --- a/quint/src/ir/quintIr.ts +++ b/quint/src/ir/quintIr.ts @@ -140,6 +140,7 @@ export const builtinOpCodes = [ 'chooseSome', 'concat', 'contains', + 'debug', 'enabled', 'eq', 'eventually', diff --git a/quint/src/names/base.ts b/quint/src/names/base.ts index 7d3c75f01..fc26943ef 100644 --- a/quint/src/names/base.ts +++ b/quint/src/names/base.ts @@ -196,6 +196,7 @@ export const builtinNames = [ 'reps', 'fail', 'assert', + 'debug', 'orKeep', 'mustChange', 'enabled', diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 3848e35c2..df9d625c1 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -36,7 +36,10 @@ import { RuntimeValue, RuntimeValueLambda, RuntimeValueVariant, rv } from './run import { ErrorCode, QuintError } from '../../quintError' import { inputDefName, lastTraceName } from '../compile' +import { prettyQuintEx, terminalWidth } from '../../graphics' +import { format } from '../../prettierimp' import { unreachable } from '../../util' +import { zerog } from '../../idGenerator' import { chunk } from 'lodash' // Internal names in the compiler, which have special treatment. @@ -914,6 +917,15 @@ export class CompilerVisitor implements IRVisitor { this.translateAllOrThen(app) break + case 'debug': + this.applyFun(app.id, 2, (header, value) => { + let columns = terminalWidth() + let valuePretty = format(columns, 0, prettyQuintEx(value.toQuintEx(zerog))) + console.log('>', header.toStr(), valuePretty.toString()) + return just(value) + }) + break + case 'fail': this.applyFun(app.id, 1, result => { return just(rv.mkBool(!result.toBool())) diff --git a/quint/src/types/builtinSignatures.ts b/quint/src/types/builtinSignatures.ts index 9ed5fb65d..37aa21e2f 100644 --- a/quint/src/types/builtinSignatures.ts +++ b/quint/src/types/builtinSignatures.ts @@ -125,6 +125,7 @@ const otherOperators = [ { name: 'reps', type: '(int, int => bool) => bool' }, { name: 'fail', type: '(bool) => bool' }, { name: 'assert', type: '(bool) => bool' }, + { name: 'debug', type: '(str, a) => a' }, ] function uniformArgsWithResult(argsType: string, resultType: string): Signature { diff --git a/quint/test/runtime/compile.test.ts b/quint/test/runtime/compile.test.ts index 28d9a2ebd..733d3fe4e 100644 --- a/quint/test/runtime/compile.test.ts +++ b/quint/test/runtime/compile.test.ts @@ -978,6 +978,17 @@ describe('compiling specs to runtime values', () => { evalVarAfterCall('n', 'run1', input).mapRight(m => assert.fail(`Expected an error, found: ${m}`)) }) + it('debug', () => { + // `debug(s, a)` returns `a` + const input = dedent( + `var n: int + |run run1 = (n' = 1).then(n' = debug("n plus one", n + 1)) + ` + ) + + assertVarAfterCall('n', '2', 'run1', input) + }) + it('unsupported operators', () => { assertResultAsString('allLists(1.to(3))', undefined) From 3a85316dbe9adb883ce246a9cc495f8167724741 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Fri, 24 Nov 2023 14:09:50 +0100 Subject: [PATCH 021/388] Add changelog entry --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 18f06b195..4155a30ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -- When an input file only one module, it will be inferred as the main module (#1260) +- When an input file only one module, it will be inferred as the main module (#1260) +- Add a `debug` built-in function for printing values to stdout (#1266) ### Changed ### Deprecated From f2aa734abbd1adba29ba9066b484bef669e269b6 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Fri, 24 Nov 2023 14:52:58 +0100 Subject: [PATCH 022/388] Add REPL test for `debug` --- quint/io-cli-tests.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/quint/io-cli-tests.md b/quint/io-cli-tests.md index 51a4e7759..22ca0d3f9 100644 --- a/quint/io-cli-tests.md +++ b/quint/io-cli-tests.md @@ -992,6 +992,22 @@ exit $exit_code >>> ``` +### Invoking `debug` in REPL prints values to stdout + + + +``` +echo 'debug("value:", { foo: 42, bar: "Hello, World!" })' | quint | tail -n +3 +``` + + +``` +>>> > value: { bar: "Hello, World!", foo: 42 } +{ bar: "Hello, World!", foo: 42 } +>>> +``` + + ### Errors are reported in the right file File `ImportFileWithError.qnt` has no error, but it imports a module from file `FileWithError.qnt`, which has a type error. The error should be reported only in `FileWithError.qnt`. From 5e57cb4e599acb66a4691273b8051dacda49dacf Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Fri, 24 Nov 2023 14:53:05 +0100 Subject: [PATCH 023/388] Rename `header` to `msg` --- quint/src/runtime/impl/compilerImpl.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index df9d625c1..4d0100add 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -918,10 +918,10 @@ export class CompilerVisitor implements IRVisitor { break case 'debug': - this.applyFun(app.id, 2, (header, value) => { + this.applyFun(app.id, 2, (msg, value) => { let columns = terminalWidth() let valuePretty = format(columns, 0, prettyQuintEx(value.toQuintEx(zerog))) - console.log('>', header.toStr(), valuePretty.toString()) + console.log('>', msg.toStr(), valuePretty.toString()) return just(value) }) break From b4557aa960309dc03f4f1b30ab2fc13a88508108 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Fri, 24 Nov 2023 14:53:15 +0100 Subject: [PATCH 024/388] Add documentation for `debug` built-in --- quint/src/builtin.qnt | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/quint/src/builtin.qnt b/quint/src/builtin.qnt index f11a0bfc4..e38fa4203 100644 --- a/quint/src/builtin.qnt +++ b/quint/src/builtin.qnt @@ -823,7 +823,7 @@ module builtin { /// /// ``` /// var x: int - /// run test = (x' = 0).then(3.times(x' = x + 1)).then(assert(x == 3)) + /// run test = (x' = 0).then(3.reps(x' = x + 1)).then(assert(x == 3)) /// ``` /// /// ``` @@ -835,6 +835,24 @@ module builtin { /// ``` action assert(p): (bool) => bool + /// `debug(msg, value)` prints the given message and value to the console, + /// separated by a space. + /// + /// It also returns the given value unchanged, + /// so that it can be used directly within expressions. + /// + /// ### Examples + /// + /// ``` + /// var x: int + /// >>> (x' = 0).then(3.reps(i => x' = debug("new x:", x + 1))) + /// > new x: 1 + /// > new x: 2 + /// > new x: 3 + /// true + /// ``` + pure def debug(msg, value): (str, a) => a + // /// `List(e0, ..., en)` is a list of values `e0`, ..., `en`. // /// // /// This is the list constructor. From 5877cdd9989731f35e47a16c837004f3ef9818e6 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Fri, 24 Nov 2023 14:57:34 +0100 Subject: [PATCH 025/388] Update generated documentation --- doc/builtin.md | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/doc/builtin.md b/doc/builtin.md index 4ed2c6eec..fbc2c3726 100644 --- a/doc/builtin.md +++ b/doc/builtin.md @@ -897,7 +897,7 @@ It does not change the state. ``` var x: int -run test = (x' = 0).then(3.times(x' = x + 1)).then(assert(x == 3)) +run test = (x' = 0).then(3.reps(x' = x + 1)).then(assert(x == 3)) ``` ``` @@ -907,3 +907,22 @@ action Next = x' = x + 1 run test = Init.then(all { Next, assert(x > 0) }) ``` + +## `pure def debug: (str, a) => a` + +`debug(msg, value)` prints the given message and value to the console, +separated by a space. + +It also returns the given value unchanged, +so that it can be used directly within expressions. + +### Examples + +``` +var x: int +>>> (x' = 0).then(3.reps(i => x' = debug("new x:", x + 1))) +> new x: 1 +> new x: 2 +> new x: 3 +true +``` From a7e8a0203854001532c070ecf7af23ce3e132267 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Mon, 27 Nov 2023 12:06:38 +0100 Subject: [PATCH 026/388] update the markdown description --- examples/cosmos-bank/bank.qnt | 36 +++------------- examples/cosmos-bank/bankTest.qnt | 27 ++++++++++++ examples/cosmos-bank/cosmos-bank.md | 67 ++++++++++++++++++++--------- 3 files changed, 80 insertions(+), 50 deletions(-) create mode 100644 examples/cosmos-bank/bankTest.qnt diff --git a/examples/cosmos-bank/bank.qnt b/examples/cosmos-bank/bank.qnt index 53264b0ce..d9b7f027c 100644 --- a/examples/cosmos-bank/bank.qnt +++ b/examples/cosmos-bank/bank.qnt @@ -1,12 +1,13 @@ // -*- mode: Bluespec; -*- // An executable specification of the bank module module bank { - // TYPES - // Addresses are just strings. + // type declarations + // Addresses are simply strings type Addr = str - // Denominations are simply strings. + // Denominations are simply strings too type Denom = str - // The module operates over 64-bit and 256-bit integers. + // 64-bit and 256-bit integers are a special case of big integers. + // We have to take care of the bit width where it matters. type Int64 = int type Int256 = int @@ -46,7 +47,7 @@ module bank { defaultSendEnabled: bool, } - // FUNCTIONAL LAYER, e.g., keepers + // the module logic, that is, the logic of keepers pure def ViewKeeper::GetAllBalances(ctx: BankCtx, addr: Addr): Coins = { if (ctx.balances.keys().contains(addr)) { ctx.balances.get(addr) @@ -86,7 +87,7 @@ module bank { pure def SendKeeper::SendCoins(ctx: BankCtx, fromAddr: Addr, toAddr: Addr, amt: Coins): (bool, BankCtx) = { // Implementation: if Coins are constructed with NewCoins, they must be positive. - // However, if they are constructed some other way, there is no precondition. + // However, if they are constructed another way, there is no precondition. // TODO: checking LockedCoins that deal with vested coins. // Safely subtract the coins from fromAddr and add them to toAddr. val fromCoins = ViewKeeper::GetAllBalances(ctx, fromAddr) @@ -142,27 +143,4 @@ module bank { // Implementation: return the error ErrSendDisabled on false coins.forall(c => SendKeeper::IsSendEnabledCoin(ctx, c)) } - - // STATE - // Total supply of coins per denomination - var Supply: Denom -> Int256 - // Balances for each address - var Balances: Addr -> Coins - - // INVARIANTS - // sum up amounts over all balances for a given denomination - def SumForDenom(denom: Denom): Int256 = { - Balances.keys().fold(0, (sum, addr) => { - val coins = Balances.get(addr) - if (denom.in(coins.keys())) - sum + coins.get(denom) - else - sum - }) - } - - // The total Supply of the network is equal to the sum of all coins from the account - val TotalSupplyInv = { - Supply.keys().forall(denom => (SumForDenom(denom) == Supply.get(denom))) - } } diff --git a/examples/cosmos-bank/bankTest.qnt b/examples/cosmos-bank/bankTest.qnt new file mode 100644 index 000000000..dbb256680 --- /dev/null +++ b/examples/cosmos-bank/bankTest.qnt @@ -0,0 +1,27 @@ +module bankTest { + import bank.* from "./bank" + + // the state of the machine that tests the logic + // Total supply of coins per denomination + var Supply: Denom -> Int256 + // Balances for each address + var Balances: Addr -> Coins + + // protocol invariants + // sum up amounts over all balances for a given denomination + def SumForDenom(denom: Denom): Int256 = { + Balances.keys().fold(0, (sum, addr) => { + val coins = Balances.get(addr) + if (denom.in(coins.keys())) { + sum + coins.get(denom) + } else { + sum + } + }) + } + + // The total Supply of the network is equal to the sum of all coins from the account + val TotalSupplyInv = { + Supply.keys().forall(denom => (SumForDenom(denom) == Supply.get(denom))) + } +} diff --git a/examples/cosmos-bank/cosmos-bank.md b/examples/cosmos-bank/cosmos-bank.md index 1a44b1cde..21a75cc98 100644 --- a/examples/cosmos-bank/cosmos-bank.md +++ b/examples/cosmos-bank/cosmos-bank.md @@ -1,6 +1,8 @@ # Onboarding to the module `x/bank` of Cosmos SDK -Written for Cosmos SDK [v0.46.10](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/). +**Author**: Igor Konnov, Informal Systems, 2023 + +**Version**: Cosmos SDK [v0.46.10](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/). ## Abstract @@ -14,7 +16,7 @@ as in the original document. Importantly, this description is tuned towards ease of exposition, not for implementation or verification. Remember that we do not want to make protocols -as complex as their implementation! These are the most differences: +as complex as their implementation! These are the most illuminating differences: - We use abstract data types whenever possible, e.g., big integers, sets, and maps. @@ -31,22 +33,31 @@ as complex as their implementation! These are the most differences: > In addition, the bank module tracks and provides query support for the total > supply of all assets used in the application. -From the protocol perspective, the bank module looks as follows: +From the engineer's perspective, the bank module looks as follows: ```bluespec bank.qnt += // -*- mode: Bluespec; -*- // An executable specification of the bank module module bank { - // TYPES + // type declarations <<>> - // FUNCTIONAL LAYER, e.g., keepers + // the module logic, that is, the logic of keepers <<>> +} +``` + +From the protocol designer's point of view, the bank module alone could be +tested by introducing the following non-deterministic state machine: - // STATE +```bluespec bankTest.qnt += +module bankTest { + import bank.* from "./bank" + + // the state of the machine that tests the logic <<>> - // INVARIANTS + // protocol invariants <<>> } ``` @@ -59,11 +70,12 @@ feature!** By using more abstract types, we make the protocol description much easier to read and understand. ```bluespec "types" += -// Addresses are just strings. +// Addresses are simply strings type Addr = str -// Denominations are simply strings. +// Denominations are simply strings too type Denom = str -// The module operates over 64-bit and 256-bit integers. +// 64-bit and 256-bit integers are a special case of big integers. +// We have to take care of the bit width where it matters. type Int64 = int type Int256 = int @@ -85,18 +97,24 @@ the implementation of the above types in Cosmos SDK: [address.go](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/types/address.go), which is `byte[]`. It must be a [bech32 address](https://docs.cosmos.network/main/spec/addresses/bech32). + We omit the validation logic in this specification, as it is not relevant + to the understanding of the banking module. - The type `Denom` is implemented in [denom.go](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/types/denom.go). It must match the regular expression `[a-zA-Z][a-zA-Z0-9/:._-]{2,127}`. + Again, we omit the validation logic in the Quint specification - The type `Coin` is implemented in - [coin.go](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/types/coin.go). It must be non-negative. + [coin.go](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/types/coin.go). + Coins must carry non-negative amounts. - The type `Coins` is implemented in [coin.go](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/types/coin.go). The implementation stores `Coins` as an array `[]Coin`. - Since an array is not a set, the implementation contains non-trivial - validation logic in [Coins.Validate](https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/types/coin.go#L229) to make sure that: + Since an array is not a set, the implementation contains additional + non-trivial validation logic in + [Coins.Validate](https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/types/coin.go#L229) + to make sure that: - The amount assigned to every denomination is positive (that is, `amount > 0`). - Coins are sorted in the order of their denominations. @@ -124,10 +142,11 @@ This is a perfect opportunity to define a state invariant: def SumForDenom(denom: Denom): Int256 = { Balances.keys().fold(0, (sum, addr) => { val coins = Balances.get(addr) - if (denom.in(coins.keys())) + if (denom.in(coins.keys())) { sum + coins.get(denom) - else + } else { sum + } }) } @@ -140,7 +159,7 @@ val TotalSupplyInv = { ## Module Accounts SKIPPED, see [Module -accounts](https://docs.cosmos.network/v0.45/modules/bank/#module-accounts). +accounts](https://docs.cosmos.network/v0.46/modules/bank/#module-accounts). ## State @@ -174,7 +193,7 @@ var Balances: Addr -> Coins ## Keepers > The bank module provides these exported keeper interfaces that can be passed -> to other modules that read or update account > balances. Modules should use +> to other modules that read or update account balances. Modules should use > the least-permissive interface that provides the functionality they require. > > Best practices dictate careful review of bank module code to ensure that @@ -357,18 +376,26 @@ pure def ViewKeeper::GetAccountsBalances(ctx: BankCtx): Set[Balance] = { result will always be no coins. For vesting accounts, LockedCoins is delegated to the concrete vesting account type. + **TODO** + - `SpendableCoins` returns the total balances of spendable coins for an account by address. If the account has no spendable coins, an empty Coins slice is returned. + **TODO** + - `IterateAccountBalances` iterates over the balances of a single account and provides the token balance to a callback. If true is returned from the callback, iteration is halted. + **TODO** + - `IterateAllBalances` iterates over all the balances of all accounts and denominations that are provided to a callback. If true is returned from the callback, iteration is halted. + **TODO** + #### SendKeeper `SendKeeper` extends `ViewKeeper` and is extended by `BaseKeeper`. @@ -387,7 +414,7 @@ Its code can be found in pure def SendKeeper::SendCoins(ctx: BankCtx, fromAddr: Addr, toAddr: Addr, amt: Coins): (bool, BankCtx) = { // Implementation: if Coins are constructed with NewCoins, they must be positive. - // However, if they are constructed some other way, there is no precondition. + // However, if they are constructed another way, there is no precondition. // TODO: checking LockedCoins that deal with vested coins. // Safely subtract the coins from fromAddr and add them to toAddr. val fromCoins = ViewKeeper::GetAllBalances(ctx, fromAddr) @@ -516,7 +543,5 @@ type Params = { } ``` - - -[bank module]: https://docs.cosmos.network/v0.45/modules/bank/# +[bank module]: https://docs.cosmos.network/v0.46/modules/bank/# [lmt]: https://github.com/driusan/lmt From 8ebaabb75d81bf7c6cf45fc463369ba65a0419a1 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Mon, 27 Nov 2023 12:07:35 +0100 Subject: [PATCH 027/388] move files around --- examples/{cosmos-bank => cosmos/bank}/bank-mini-sdk.qnt | 0 examples/{cosmos-bank => cosmos/bank}/bank-mini.qnt | 0 examples/{cosmos-bank => cosmos/bank}/bank.qnt | 0 examples/{cosmos-bank => cosmos/bank}/bankTest.qnt | 0 examples/{cosmos-bank => cosmos/bank}/cosmos-bank.md | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename examples/{cosmos-bank => cosmos/bank}/bank-mini-sdk.qnt (100%) rename examples/{cosmos-bank => cosmos/bank}/bank-mini.qnt (100%) rename examples/{cosmos-bank => cosmos/bank}/bank.qnt (100%) rename examples/{cosmos-bank => cosmos/bank}/bankTest.qnt (100%) rename examples/{cosmos-bank => cosmos/bank}/cosmos-bank.md (100%) diff --git a/examples/cosmos-bank/bank-mini-sdk.qnt b/examples/cosmos/bank/bank-mini-sdk.qnt similarity index 100% rename from examples/cosmos-bank/bank-mini-sdk.qnt rename to examples/cosmos/bank/bank-mini-sdk.qnt diff --git a/examples/cosmos-bank/bank-mini.qnt b/examples/cosmos/bank/bank-mini.qnt similarity index 100% rename from examples/cosmos-bank/bank-mini.qnt rename to examples/cosmos/bank/bank-mini.qnt diff --git a/examples/cosmos-bank/bank.qnt b/examples/cosmos/bank/bank.qnt similarity index 100% rename from examples/cosmos-bank/bank.qnt rename to examples/cosmos/bank/bank.qnt diff --git a/examples/cosmos-bank/bankTest.qnt b/examples/cosmos/bank/bankTest.qnt similarity index 100% rename from examples/cosmos-bank/bankTest.qnt rename to examples/cosmos/bank/bankTest.qnt diff --git a/examples/cosmos-bank/cosmos-bank.md b/examples/cosmos/bank/cosmos-bank.md similarity index 100% rename from examples/cosmos-bank/cosmos-bank.md rename to examples/cosmos/bank/cosmos-bank.md From e0d2c591c19788a9a445f28412e1807cdb0bc244 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Mon, 27 Nov 2023 14:55:33 +0100 Subject: [PATCH 028/388] update types and comments --- examples/cosmos/bank/bank.qnt | 88 ++++++++++++++++++++++------ examples/cosmos/bank/cosmos-bank.md | 90 +++++++++++++++++++++++------ 2 files changed, 144 insertions(+), 34 deletions(-) diff --git a/examples/cosmos/bank/bank.qnt b/examples/cosmos/bank/bank.qnt index d9b7f027c..124c8c379 100644 --- a/examples/cosmos/bank/bank.qnt +++ b/examples/cosmos/bank/bank.qnt @@ -1,7 +1,7 @@ // -*- mode: Bluespec; -*- // An executable specification of the bank module module bank { - // type declarations + //----------------------- type declarations ------------------------- // Addresses are simply strings type Addr = str // Denominations are simply strings too @@ -14,12 +14,31 @@ module bank { // the maximum value for Int256 in Golang pure val MAX_INT256 = 2^256 - 1 + // the range of 256-bit integers in the SDK + pure def isInt256(i: int): bool = -2^256 < i and i < 2^256 + // A coin is a record that contains a denomination and an amount type Coin = { denom: Denom, amount: Int256 } - // Coins is a map from denominations to amounts. + // Coins is a map from denominations to amounts type Coins = Denom -> Int256 // Account balances type Balance = { address: Addr, coins: Coins } + + // A result that is produced by the functions that update the context + type BankResult = + | BankErr(str) + | BankOk(BankCtx) + + // A result that is produced by the functions that return a coin or panic + type CoinResult = + | CoinErr(str) + | CoinOk(Coin) + + // A result that is produced by the functions that return a Boolean or panic + type BoolResult = + | BoolErr(str) + | BoolOk(bool) + // An input of a multiparty transfer type Input = { address: str, @@ -47,7 +66,10 @@ module bank { defaultSendEnabled: bool, } - // the module logic, that is, the logic of keepers + //------- the module logic, that is, the logic of keepers ----------- + + /// `GetAllBalances` returns all the account balances for the given account address. + /// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/view.go#L61 pure def ViewKeeper::GetAllBalances(ctx: BankCtx, addr: Addr): Coins = { if (ctx.balances.keys().contains(addr)) { ctx.balances.get(addr) @@ -55,6 +77,9 @@ module bank { Map() } } + + /// `ValidateBalance` should only be called upon genesis state. + /// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/view.go#L202 pure def ViewKeeper::ValidateBalance(ctx: BankCtx, addr: Addr): bool = and { ctx.accounts.contains(addr), val coins = ViewKeeper::GetAllBalances(ctx, addr) @@ -62,30 +87,45 @@ module bank { coins.keys().forall(denom => coins.get(denom) > 0), // TODO: add validation logic for the vesting accounts } - pure def ViewKeeper::GetBalance(ctx: BankCtx, addr: Addr, denom: str): Coin = { + + /// GetBalance returns the balance of a specific denomination for a given account by address. + /// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/view.go#L98 + pure def ViewKeeper::GetBalance(ctx: BankCtx, addr: Addr, denom: str): CoinResult = { if (ctx.balances.keys().contains(addr)) { val accountBal = ctx.balances.get(addr) if (accountBal.keys().contains(denom)) { - { denom: denom, amount: accountBal.get(denom) } + CoinOk({ denom: denom, amount: accountBal.get(denom) }) } else { - // Implementation: panic here? - { denom: denom, amount: 0 } + CoinErr("Unmarshal error") } } else { - // Implementation: panic here? - { denom: denom, amount: 0 } + CoinErr("Unmarshal error") } } - pure def ViewKeeper::HasBalance(ctx: BankCtx, addr: Addr, coin: Coin): bool = { + + /// HasBalance returns whether or not an account has at least amt balance.\ + /// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/view.go#L56 + pure def ViewKeeper::HasBalance(ctx: BankCtx, addr: Addr, coin: Coin): BoolResult = { // Implementation: panic if the address or denomination are not stored? - ViewKeeper::GetBalance(ctx, addr, coin.denom).amount >= coin.amount + match ViewKeeper::GetBalance(ctx, addr, coin.denom) { + | CoinOk(c) => BoolOk(c.amount >= coin.amount) + | CoinErr(msg) => BoolErr(msg) + } } + + /// GetAccountsBalances returns all the accounts balances from the store. + /// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/view.go#L72 pure def ViewKeeper::GetAccountsBalances(ctx: BankCtx): Set[Balance] = { + // The implementation may panic due to unmarshalling errors. + // Since these errors are not related to the parameters, we do not propagate them. ctx.balances.keys().map(a => { address: a, coins: ctx.balances.get(a) }) } + /// SendCoins transfers amt coins from a sending account to a receiving account. + /// An error is returned upon failure. + /// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/send.go#L135 pure def SendKeeper::SendCoins(ctx: BankCtx, - fromAddr: Addr, toAddr: Addr, amt: Coins): (bool, BankCtx) = { + fromAddr: Addr, toAddr: Addr, amt: Coins): BankResult = { // Implementation: if Coins are constructed with NewCoins, they must be positive. // However, if they are constructed another way, there is no precondition. // TODO: checking LockedCoins that deal with vested coins. @@ -94,7 +134,7 @@ module bank { if (amt.keys().exists(d => not(d.in(fromCoins.keys())) or fromCoins.get(d) < amt.get(d))) { // some denominations do not exist on fromAddr, or there is not enough funds - (false, ctx) + BankErr("invalid coins or insufficient funds") } else { // x/bank invariants prohibit persistence of zero balances // clean zero balances @@ -108,8 +148,7 @@ module bank { // since toCoins and amt held positive values, their sums must be positive too val addCoins = jointDenoms.mapBy(d => getOr0(toCoins, d) + getOr0(amt, d)) if (addCoins.keys().exists(d => addCoins.get(d) > MAX_INT256)) { - // Implementation: panic! - (false, ctx) + BankErr("overflow") } else { // add toAddr to the accounts, if it did not exist val newAccounts = ctx.accounts.union(Set(toAddr)) @@ -123,14 +162,23 @@ module bank { newBalancesSub.put(toAddr, addCoins) } // succeed with a new balance - (true, ctx.with("balances", newBalances).with("accounts", newAccounts)) + BankOk({ ...ctx, balances: newBalances, accounts: newAccounts }) } } } + + /// GetParams returns the total set of bank parameters. + /// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/send.go#L61 pure def SendKeeper::GetParams(ctx: BankCtx): Params = ctx.params + + /// SetParams sets the total set of bank parameters. + /// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/send.go#L67 pure def SendKeeper::SetParams(ctx: BankCtx, params: Params): BankCtx = { - ctx.with("params", params) + { ...ctx, params: params } } + + /// IsSendEnabledCoin returns the current SendEnabled status of the provided coin's denom. + /// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/send.go#L315 pure def SendKeeper::IsSendEnabledCoin(ctx: BankCtx, coin: Coin): bool = { val found = ctx.params.sendEnabled.filter(p => coin.denom == p.denom) if (found != Set()) { @@ -139,8 +187,14 @@ module bank { ctx.params.defaultSendEnabled } } + + /// IsSendEnabledCoins checks the coins provide and returns an ErrSendDisabled if + /// any of the coins are not configured for sending. Returns nil if sending is enabled + /// for all provided coin. + /// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/send.go#L306C28-L306C28 pure def SendKeeper::IsSendEnabledCoins(ctx: BankCtx, coins: Set[Coin]): bool = { // Implementation: return the error ErrSendDisabled on false coins.forall(c => SendKeeper::IsSendEnabledCoin(ctx, c)) } + } diff --git a/examples/cosmos/bank/cosmos-bank.md b/examples/cosmos/bank/cosmos-bank.md index 21a75cc98..382490b37 100644 --- a/examples/cosmos/bank/cosmos-bank.md +++ b/examples/cosmos/bank/cosmos-bank.md @@ -39,10 +39,11 @@ From the engineer's perspective, the bank module looks as follows: // -*- mode: Bluespec; -*- // An executable specification of the bank module module bank { - // type declarations + //----------------------- type declarations ------------------------- <<>> - // the module logic, that is, the logic of keepers + //------- the module logic, that is, the logic of keepers ----------- + <<>> } ``` @@ -82,12 +83,31 @@ type Int256 = int // the maximum value for Int256 in Golang pure val MAX_INT256 = 2^256 - 1 +// the range of 256-bit integers in the SDK +pure def isInt256(i: int): bool = -2^256 < i and i < 2^256 + // A coin is a record that contains a denomination and an amount type Coin = { denom: Denom, amount: Int256 } -// Coins is a map from denominations to amounts. +// Coins is a map from denominations to amounts type Coins = Denom -> Int256 // Account balances type Balance = { address: Addr, coins: Coins } + +// A result that is produced by the functions that update the context +type BankResult = + | BankErr(str) + | BankOk(BankCtx) + +// A result that is produced by the functions that return a coin or panic +type CoinResult = + | CoinErr(str) + | CoinOk(Coin) + +// A result that is produced by the functions that return a Boolean or panic +type BoolResult = + | BoolErr(str) + | BoolOk(bool) + ``` **Implementation details.** There are a few important points to be made about @@ -307,6 +327,8 @@ Its code can be found in [view.go](https://github.com/cosmos/cosmos-sdk/blob/v0. address: ```bluespec "functional" += +/// `GetAllBalances` returns all the account balances for the given account address. +/// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/view.go#L61 pure def ViewKeeper::GetAllBalances(ctx: BankCtx, addr: Addr): Coins = { if (ctx.balances.keys().contains(addr)) { ctx.balances.get(addr) @@ -314,6 +336,7 @@ pure def ViewKeeper::GetAllBalances(ctx: BankCtx, addr: Addr): Coins = { Map() } } + ``` - `validateBalance` validates all balances for a given account address @@ -324,6 +347,8 @@ pure def ViewKeeper::GetAllBalances(ctx: BankCtx, addr: Addr): Coins = { manner that would otherwise yield an error from this call. ```bluespec "functional" += +/// `ValidateBalance` should only be called upon genesis state. +/// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/view.go#L202 pure def ViewKeeper::ValidateBalance(ctx: BankCtx, addr: Addr): bool = and { ctx.accounts.contains(addr), val coins = ViewKeeper::GetAllBalances(ctx, addr) @@ -331,41 +356,53 @@ pure def ViewKeeper::ValidateBalance(ctx: BankCtx, addr: Addr): bool = and { coins.keys().forall(denom => coins.get(denom) > 0), // TODO: add validation logic for the vesting accounts } + ``` - `getBalance` returns the balance of a specific denomination for a given account by address: ```bluespec "functional" += -pure def ViewKeeper::GetBalance(ctx: BankCtx, addr: Addr, denom: str): Coin = { +/// GetBalance returns the balance of a specific denomination for a given account by address. +/// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/view.go#L98 +pure def ViewKeeper::GetBalance(ctx: BankCtx, addr: Addr, denom: str): CoinResult = { if (ctx.balances.keys().contains(addr)) { val accountBal = ctx.balances.get(addr) if (accountBal.keys().contains(denom)) { - { denom: denom, amount: accountBal.get(denom) } + CoinOk({ denom: denom, amount: accountBal.get(denom) }) } else { - // Implementation: panic here? - { denom: denom, amount: 0 } + CoinErr("Unmarshal error") } } else { - // Implementation: panic here? - { denom: denom, amount: 0 } + CoinErr("Unmarshal error") } } + ``` - `HasBalance` returns whether or not an account has at least amt balance: ```bluespec "functional" += -pure def ViewKeeper::HasBalance(ctx: BankCtx, addr: Addr, coin: Coin): bool = { +/// HasBalance returns whether or not an account has at least amt balance.\ +/// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/view.go#L56 +pure def ViewKeeper::HasBalance(ctx: BankCtx, addr: Addr, coin: Coin): BoolResult = { // Implementation: panic if the address or denomination are not stored? - ViewKeeper::GetBalance(ctx, addr, coin.denom).amount >= coin.amount + match ViewKeeper::GetBalance(ctx, addr, coin.denom) { + | CoinOk(c) => BoolOk(c.amount >= coin.amount) + | CoinErr(msg) => BoolErr(msg) + } } + ``` - `GetAccountsBalances` returns all the accounts balances from the store: ```bluespec "functional" += +/// GetAccountsBalances returns all the accounts balances from the store. +/// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/view.go#L72 pure def ViewKeeper::GetAccountsBalances(ctx: BankCtx): Set[Balance] = { + // The implementation may panic due to unmarshalling errors. + // Since these errors are not related to the parameters, we do not propagate them. ctx.balances.keys().map(a => { address: a, coins: ctx.balances.get(a) }) } @@ -411,8 +448,11 @@ Its code can be found in Click to see how SendCoins works ```bluespec "functional" += +/// SendCoins transfers amt coins from a sending account to a receiving account. +/// An error is returned upon failure. +/// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/send.go#L135 pure def SendKeeper::SendCoins(ctx: BankCtx, - fromAddr: Addr, toAddr: Addr, amt: Coins): (bool, BankCtx) = { + fromAddr: Addr, toAddr: Addr, amt: Coins): BankResult = { // Implementation: if Coins are constructed with NewCoins, they must be positive. // However, if they are constructed another way, there is no precondition. // TODO: checking LockedCoins that deal with vested coins. @@ -421,7 +461,7 @@ pure def SendKeeper::SendCoins(ctx: BankCtx, if (amt.keys().exists(d => not(d.in(fromCoins.keys())) or fromCoins.get(d) < amt.get(d))) { // some denominations do not exist on fromAddr, or there is not enough funds - (false, ctx) + BankErr("invalid coins or insufficient funds") } else { // x/bank invariants prohibit persistence of zero balances // clean zero balances @@ -435,8 +475,7 @@ pure def SendKeeper::SendCoins(ctx: BankCtx, // since toCoins and amt held positive values, their sums must be positive too val addCoins = jointDenoms.mapBy(d => getOr0(toCoins, d) + getOr0(amt, d)) if (addCoins.keys().exists(d => addCoins.get(d) > MAX_INT256)) { - // Implementation: panic! - (false, ctx) + BankErr("overflow") } else { // add toAddr to the accounts, if it did not exist val newAccounts = ctx.accounts.union(Set(toAddr)) @@ -450,10 +489,11 @@ pure def SendKeeper::SendCoins(ctx: BankCtx, newBalancesSub.put(toAddr, addCoins) } // succeed with a new balance - (true, ctx.with("balances", newBalances).with("accounts", newAccounts)) + BankOk({ ...ctx, balances: newBalances, accounts: newAccounts }) } } } + ``` @@ -461,24 +501,34 @@ pure def SendKeeper::SendCoins(ctx: BankCtx, inputs that correspond to a series of outputs. It returns an error if the inputs and outputs don't lineup or if any single transfer of tokens fails. + **TODO** + - `GetParams` returns the total set of bank parameters. ```bluespec "functional" += +/// GetParams returns the total set of bank parameters. +/// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/send.go#L61 pure def SendKeeper::GetParams(ctx: BankCtx): Params = ctx.params + ``` - `SetParams` sets the total set of bank parameters. ```bluespec "functional" += +/// SetParams sets the total set of bank parameters. +/// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/send.go#L67 pure def SendKeeper::SetParams(ctx: BankCtx, params: Params): BankCtx = { - ctx.with("params", params) + { ...ctx, params: params } } + ``` - `IsSendEnabledCoin` returns the current SendEnabled status of the provided coin's denom. ```bluespec "functional" += +/// IsSendEnabledCoin returns the current SendEnabled status of the provided coin's denom. +/// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/send.go#L315 pure def SendKeeper::IsSendEnabledCoin(ctx: BankCtx, coin: Coin): bool = { val found = ctx.params.sendEnabled.filter(p => coin.denom == p.denom) if (found != Set()) { @@ -487,6 +537,7 @@ pure def SendKeeper::IsSendEnabledCoin(ctx: BankCtx, coin: Coin): bool = { ctx.params.defaultSendEnabled } } + ``` - `IsSendEnabledCoins` checks the coins provide and returns an `ErrSendDisabled` if @@ -494,10 +545,15 @@ pure def SendKeeper::IsSendEnabledCoin(ctx: BankCtx, coin: Coin): bool = { for all provided coin. ```bluespec "functional" += +/// IsSendEnabledCoins checks the coins provide and returns an ErrSendDisabled if +/// any of the coins are not configured for sending. Returns nil if sending is enabled +/// for all provided coin. +/// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/send.go#L306C28-L306C28 pure def SendKeeper::IsSendEnabledCoins(ctx: BankCtx, coins: Set[Coin]): bool = { // Implementation: return the error ErrSendDisabled on false coins.forall(c => SendKeeper::IsSendEnabledCoin(ctx, c)) } + ``` - `BlockedAddr` checks if a given address is restricted from receiving funds. From c581ec71a6131c5eda58a93b2649470e9f7f241f Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 27 Nov 2023 14:53:11 -0300 Subject: [PATCH 029/388] Add two phase commit example --- .../TwoPhaseCommit/two_phase_commit.qnt | 135 ++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt diff --git a/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt new file mode 100644 index 000000000..5f7f0d18c --- /dev/null +++ b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt @@ -0,0 +1,135 @@ +module two_phase_commit { + /// "working", "prepared", "committed" or "aborted" + type ResourceManagerState = str + var resourceManagerStates: str -> ResourceManagerState + + /// "init" or "done" + type TransactionManagerState = str + var transactionManagerState: TransactionManagerState + + var preparedResourceManagers: Set[str] + + /// kind "commit", "abort" or "prepared" + type Message = { kind: str, resourceManager: str } + var messages: Set[Message] + + const resourceManagers: Set[str] + + action init = all { + resourceManagerStates' = resourceManagers.mapBy(r => "working"), + transactionManagerState' = "init", + preparedResourceManagers' = Set(), + messages' = Set(), + } + + /* Transaction Manager actions */ + + action addPreparedResourceManager(resourceManager: str): bool = all { + transactionManagerState == "init", + messages.contains({ kind: "prepared", resourceManager: resourceManager }), + preparedResourceManagers' = preparedResourceManagers.union(Set(resourceManager)) + } + + action decideOnCommit = all { + transactionManagerState == "init", + preparedResourceManagers == resourceManagers, + transactionManagerState' = "done", + messages' = messages.union(Set({ kind: "commit", resourceManager: "" })) + } + + action decideOnAbort = all { + transactionManagerState == "init", + transactionManagerState' = "done", + messages' = messages.union(Set({ kind: "abort", resourceManager: "" })) + } + + /* Resource Manager actions */ + + action prepare(resourceManager: str): bool = all { + resourceManagerStates.get(resourceManager) == "working", + resourceManagerStates' = resourceManagerStates.set(resourceManager, "prepared"), + messages' = messages.union(Set({ kind: "prepared", resourceManager: resourceManager })) + } + + action abort(resourceManager: str): bool = all { + or { + // Resource manager chooses to abort + resourceManagerStates.get(resourceManager) == "working", + // Resource manager receives an abort message from the transaction manager + messages.contains({ kind: "abort", resourceManager: "" }), + }, + resourceManagerStates' = resourceManagerStates.set(resourceManager, "aborted"), + // There is no need to let others know that this resource manager aborted + messages' = messages + } + + action commit(resourceManager: str): bool = all { + messages.contains({ kind: "commit", resourceManager: "" }), + resourceManagerStates' = resourceManagerStates.set(resourceManager, "commited"), + messages' = messages.union(Set({ kind: "commited", resourceManager: resourceManager })) + } + + action step = any { + all { + nondet rm = resourceManagers.oneOf() + any { prepare(rm), abort(rm), commit(rm) }, + transactionManagerState' = transactionManagerState, + preparedResourceManagers' = preparedResourceManagers, + }, + all { + any { decideOnCommit, decideOnAbort }, + preparedResourceManagers' = preparedResourceManagers, + resourceManagerStates' = resourceManagerStates, + }, + all { + nondet rm = resourceManagers.oneOf() + addPreparedResourceManager(rm), + transactionManagerState' = transactionManagerState, + resourceManagerStates' = resourceManagerStates, + messages' = messages, + } + } + + action consistencyInv = tuples(resourceManagers, resourceManagers).forall(((r1, r2)) => + not(resourceManagerStates.get(r1) == "commited" and resourceManagerStates.get(r2) == "aborted") + ) +} + +module two_phase_commit_3 { + import two_phase_commit(resourceManagers = Set("rm1", "rm2", "rm3")).* + + run preparation(rm) = (all { + prepare(rm), + transactionManagerState' = transactionManagerState, + preparedResourceManagers' = preparedResourceManagers, + }).then(all { + addPreparedResourceManager(rm), + transactionManagerState' = transactionManagerState, + resourceManagerStates' = resourceManagerStates, + messages' = messages, + }) + + run commitment = (all { + decideOnCommit, + preparedResourceManagers' = preparedResourceManagers, + resourceManagerStates' = resourceManagerStates, + }).then(all { + commit("rm1"), + transactionManagerState' = transactionManagerState, + preparedResourceManagers' = preparedResourceManagers, + }).then(all { + commit("rm2"), + transactionManagerState' = transactionManagerState, + preparedResourceManagers' = preparedResourceManagers, + }).then(all { + commit("rm3"), + transactionManagerState' = transactionManagerState, + preparedResourceManagers' = preparedResourceManagers, + }) + + run successTest = init + .then(preparation("rm1")) + .then(preparation("rm2")) + .then(preparation("rm3")) + .then(commitment) +} From a6f5f52ab0ca362d3aad63e2c04b3b9c90decfba Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 27 Nov 2023 15:32:48 -0300 Subject: [PATCH 030/388] Use sum types --- .../TwoPhaseCommit/two_phase_commit.qnt | 54 ++++++++++--------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt index 5f7f0d18c..9c805a4c1 100644 --- a/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt +++ b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt @@ -1,23 +1,25 @@ module two_phase_commit { - /// "working", "prepared", "committed" or "aborted" - type ResourceManagerState = str + type ResourceManagerState = Working | Prepared | Committed | Aborted var resourceManagerStates: str -> ResourceManagerState - /// "init" or "done" - type TransactionManagerState = str + type TransactionManagerState = Init | Done var transactionManagerState: TransactionManagerState var preparedResourceManagers: Set[str] - /// kind "commit", "abort" or "prepared" - type Message = { kind: str, resourceManager: str } + type Message = + | Abort + | Commit + | RMPrepared(str) + | RMCommitted(str) + var messages: Set[Message] const resourceManagers: Set[str] action init = all { - resourceManagerStates' = resourceManagers.mapBy(r => "working"), - transactionManagerState' = "init", + resourceManagerStates' = resourceManagers.mapBy(r => Working), + transactionManagerState' = Init, preparedResourceManagers' = Set(), messages' = Set(), } @@ -25,48 +27,48 @@ module two_phase_commit { /* Transaction Manager actions */ action addPreparedResourceManager(resourceManager: str): bool = all { - transactionManagerState == "init", - messages.contains({ kind: "prepared", resourceManager: resourceManager }), + transactionManagerState == Init, + messages.contains(RMPrepared(resourceManager)), preparedResourceManagers' = preparedResourceManagers.union(Set(resourceManager)) } action decideOnCommit = all { - transactionManagerState == "init", + transactionManagerState == Init, preparedResourceManagers == resourceManagers, - transactionManagerState' = "done", - messages' = messages.union(Set({ kind: "commit", resourceManager: "" })) + transactionManagerState' = Done, + messages' = messages.union(Set(Commit)) } action decideOnAbort = all { - transactionManagerState == "init", - transactionManagerState' = "done", - messages' = messages.union(Set({ kind: "abort", resourceManager: "" })) + transactionManagerState == Init, + transactionManagerState' = Done, + messages' = messages.union(Set(Abort)) } /* Resource Manager actions */ action prepare(resourceManager: str): bool = all { - resourceManagerStates.get(resourceManager) == "working", - resourceManagerStates' = resourceManagerStates.set(resourceManager, "prepared"), - messages' = messages.union(Set({ kind: "prepared", resourceManager: resourceManager })) + resourceManagerStates.get(resourceManager) == Working, + resourceManagerStates' = resourceManagerStates.set(resourceManager, Prepared), + messages' = messages.union(Set(RMPrepared(resourceManager))) } action abort(resourceManager: str): bool = all { or { // Resource manager chooses to abort - resourceManagerStates.get(resourceManager) == "working", + resourceManagerStates.get(resourceManager) == Working, // Resource manager receives an abort message from the transaction manager - messages.contains({ kind: "abort", resourceManager: "" }), + messages.contains(Abort), }, - resourceManagerStates' = resourceManagerStates.set(resourceManager, "aborted"), + resourceManagerStates' = resourceManagerStates.set(resourceManager, Aborted), // There is no need to let others know that this resource manager aborted messages' = messages } action commit(resourceManager: str): bool = all { - messages.contains({ kind: "commit", resourceManager: "" }), - resourceManagerStates' = resourceManagerStates.set(resourceManager, "commited"), - messages' = messages.union(Set({ kind: "commited", resourceManager: resourceManager })) + messages.contains(Commit), + resourceManagerStates' = resourceManagerStates.set(resourceManager, Committed), + messages' = messages.union(Set(RMCommitted(resourceManager))) } action step = any { @@ -91,7 +93,7 @@ module two_phase_commit { } action consistencyInv = tuples(resourceManagers, resourceManagers).forall(((r1, r2)) => - not(resourceManagerStates.get(r1) == "commited" and resourceManagerStates.get(r2) == "aborted") + not(resourceManagerStates.get(r1) == Committed and resourceManagerStates.get(r2) == Aborted) ) } From 0ff004fa8d6da8fb189aa2f06d2c89ad847f500b Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 27 Nov 2023 15:33:08 -0300 Subject: [PATCH 031/388] Update examples dashboard --- examples/.scripts/run-example.sh | 15 +++++++++++---- examples/README.md | 5 +++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/examples/.scripts/run-example.sh b/examples/.scripts/run-example.sh index debf9d86c..8d0b2aa51 100755 --- a/examples/.scripts/run-example.sh +++ b/examples/.scripts/run-example.sh @@ -15,6 +15,7 @@ result () { # Skip tests for parameterized modules if [[ "$cmd" == "test" && ( + "$file" == "classic/distributed/Paxos/Voting.qnt" || "$file" == "cosmos/tendermint/Tendermint.qnt" || "$file" == "cosmos/tendermint/TendermintTest.qnt" || "$file" == "cosmos/lightclient/Blockchain.qnt" || @@ -46,10 +47,12 @@ result () { fi # Print additional explanations - if [[ "$file" == "classic/distributed/Paxos/Paxos.qnt" && ( "$cmd" == "test" || "$cmd" == "verify" )]] ; then - printf "https://github.com/informalsystems/quint/issues/244" - elif [[ "$file" == "classic/distributed/Paxos/Voting.qnt" && ( "$cmd" == "test" || "$cmd" == "verify" )]] ; then - printf "https://github.com/informalsystems/quint/issues/244" + if [[ "$file" == "classic/distributed/Paxos/Paxos.qnt" && "$cmd" == verify ]] ; then + printf "https://github.com/informalsystems/quint/issues/1034" + elif [[ "$file" == "classic/distributed/Paxos/Voting.qnt" && "$cmd" == verify ]] ; then + printf "https://github.com/informalsystems/quint/issues/1034" + elif [[ "$file" == "classic/distributed/TwoPhaseCommit/two_phase_commit.qnt" && "$cmd" == verify ]] ; then + printf "https://github.com/informalsystems/quint/issues/1034" elif [[ "$file" == "language-features/option.qnt" && "$cmd" == verify ]] ; then printf "https://github.com/informalsystems/quint/issues/244" elif [[ "$file" == "solidity/icse23-fig7/lottery.qnt" && "$cmd" == "verify" ]] ; then @@ -66,6 +69,10 @@ get_main () { main="--main=ReadersWriters_5" elif [[ "$file" == "classic/distributed/ewd840/ewd840.qnt" ]] ; then main="--main=ewd840_3" + elif [[ "$file" == "classic/distributed/TwoPhaseCommit/two_phase_commit.qnt" ]] ; then + main="--main=two_phase_commit_3" + elif [[ "$file" == "classic/distributed/Paxos/Paxos.qnt" ]] ; then + main="--main=Paxos_val2_accept3_quorum2" elif [[ "$file" == "classic/sequential/BinSearch/BinSearch.qnt" ]] ; then main="--main=BinSearch10" elif [[ "$file" == "cosmos/ics20/bank.qnt" ]] ; then diff --git a/examples/README.md b/examples/README.md index e1326368e..821137730 100644 --- a/examples/README.md +++ b/examples/README.md @@ -51,9 +51,10 @@ listed without any additional command line arguments. | [classic/distributed/ClockSync/clockSync3.qnt](./classic/distributed/ClockSync/clockSync3.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [classic/distributed/ewd840/ewd840.qnt](./classic/distributed/ewd840/ewd840.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [classic/distributed/LamportMutex/LamportMutex.qnt](./classic/distributed/LamportMutex/LamportMutex.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [classic/distributed/Paxos/Paxos.qnt](./classic/distributed/Paxos/Paxos.qnt) | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/244 | :x:https://github.com/informalsystems/quint/issues/244 | -| [classic/distributed/Paxos/Voting.qnt](./classic/distributed/Paxos/Voting.qnt) | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/244 | :x:https://github.com/informalsystems/quint/issues/244 | +| [classic/distributed/Paxos/Paxos.qnt](./classic/distributed/Paxos/Paxos.qnt) | :white_check_mark: | :white_check_mark: | :x: | :x:https://github.com/informalsystems/quint/issues/1034 | +| [classic/distributed/Paxos/Voting.qnt](./classic/distributed/Paxos/Voting.qnt) | :white_check_mark: | :white_check_mark: | N/A[^parameterized] | :x:https://github.com/informalsystems/quint/issues/1034 | | [classic/distributed/ReadersWriters/ReadersWriters.qnt](./classic/distributed/ReadersWriters/ReadersWriters.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [classic/distributed/TwoPhaseCommit/two_phase_commit.qnt](./classic/distributed/TwoPhaseCommit/two_phase_commit.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1034 | | [classic/sequential/BinSearch/BinSearch.qnt](./classic/sequential/BinSearch/BinSearch.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [cosmos/ics20/bank.qnt](./cosmos/ics20/bank.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [cosmos/ics20/base.qnt](./cosmos/ics20/base.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | N/A[^nostatemachine] | From 33199d118923aae43ff848c4cb99397c9187fbb0 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 27 Nov 2023 15:34:09 -0300 Subject: [PATCH 032/388] Fix invariant mode --- .../classic/distributed/TwoPhaseCommit/two_phase_commit.qnt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt index 9c805a4c1..bfbf76d8d 100644 --- a/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt +++ b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt @@ -92,7 +92,7 @@ module two_phase_commit { } } - action consistencyInv = tuples(resourceManagers, resourceManagers).forall(((r1, r2)) => + val consistencyInv = tuples(resourceManagers, resourceManagers).forall(((r1, r2)) => not(resourceManagerStates.get(r1) == Committed and resourceManagerStates.get(r2) == Aborted) ) } From 6389fd30bc68b670ce6ce9b79a6d98ebff0f67db Mon Sep 17 00:00:00 2001 From: Gabriela Moreira Date: Tue, 28 Nov 2023 10:36:43 -0300 Subject: [PATCH 033/388] Apply suggestions from code review Co-authored-by: Thomas Pani Co-authored-by: Igor Konnov --- examples/.scripts/run-example.sh | 2 +- .../classic/distributed/TwoPhaseCommit/two_phase_commit.qnt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/.scripts/run-example.sh b/examples/.scripts/run-example.sh index 8d0b2aa51..6472d58a8 100755 --- a/examples/.scripts/run-example.sh +++ b/examples/.scripts/run-example.sh @@ -54,7 +54,7 @@ result () { elif [[ "$file" == "classic/distributed/TwoPhaseCommit/two_phase_commit.qnt" && "$cmd" == verify ]] ; then printf "https://github.com/informalsystems/quint/issues/1034" elif [[ "$file" == "language-features/option.qnt" && "$cmd" == verify ]] ; then - printf "https://github.com/informalsystems/quint/issues/244" + printf "https://github.com/informalsystems/quint/issues/1034" elif [[ "$file" == "solidity/icse23-fig7/lottery.qnt" && "$cmd" == "verify" ]] ; then printf "https://github.com/informalsystems/quint/issues/1019" fi diff --git a/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt index bfbf76d8d..6a111a302 100644 --- a/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt +++ b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt @@ -1,3 +1,4 @@ +// -*- mode: Bluespec; -*- module two_phase_commit { type ResourceManagerState = Working | Prepared | Committed | Aborted var resourceManagerStates: str -> ResourceManagerState From 839974aa0c20e181e2b01e0f53ac7a5597795d4c Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 28 Nov 2023 10:55:42 -0300 Subject: [PATCH 034/388] Add comments --- .../TwoPhaseCommit/two_phase_commit.qnt | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt index 6a111a302..4d2bf1076 100644 --- a/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt +++ b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt @@ -1,4 +1,10 @@ // -*- mode: Bluespec; -*- + +/* This specification stems from the specification of the two phase protocol + by Leslie Lamport: + + https://github.com/tlaplus/Examples/blob/master/specifications/transaction_commit/TwoPhase.tla */ + module two_phase_commit { type ResourceManagerState = Working | Prepared | Committed | Aborted var resourceManagerStates: str -> ResourceManagerState @@ -6,6 +12,8 @@ module two_phase_commit { type TransactionManagerState = Init | Done var transactionManagerState: TransactionManagerState + /// The set of resource managers from which the transaction manager has + /// received RMPrepared messages var preparedResourceManagers: Set[str] type Message = @@ -27,12 +35,16 @@ module two_phase_commit { /* Transaction Manager actions */ + /// The transaction manager receives a RMPrepared(rm) message from the resource manager rm action addPreparedResourceManager(resourceManager: str): bool = all { transactionManagerState == Init, messages.contains(RMPrepared(resourceManager)), preparedResourceManagers' = preparedResourceManagers.union(Set(resourceManager)) } + /// The transaction manager commits the transaction; enabled iff the + /// transaction manager is in its initial state and every resource manager has + /// sent an RMPrepared message. action decideOnCommit = all { transactionManagerState == Init, preparedResourceManagers == resourceManagers, @@ -40,6 +52,7 @@ module two_phase_commit { messages' = messages.union(Set(Commit)) } + /// The transaction manager spontaneously aborts the transaction action decideOnAbort = all { transactionManagerState == Init, transactionManagerState' = Done, @@ -48,12 +61,14 @@ module two_phase_commit { /* Resource Manager actions */ + /// A resource manager prepares action prepare(resourceManager: str): bool = all { resourceManagerStates.get(resourceManager) == Working, resourceManagerStates' = resourceManagerStates.set(resourceManager, Prepared), messages' = messages.union(Set(RMPrepared(resourceManager))) } + /// A resource manager aborts, either spontaneously or because of an Abort message action abort(resourceManager: str): bool = all { or { // Resource manager chooses to abort @@ -66,6 +81,7 @@ module two_phase_commit { messages' = messages } + // A resource manager commits due to a Commit message action commit(resourceManager: str): bool = all { messages.contains(Commit), resourceManagerStates' = resourceManagerStates.set(resourceManager, Committed), @@ -73,17 +89,20 @@ module two_phase_commit { } action step = any { + // Resource manager actions all { nondet rm = resourceManagers.oneOf() any { prepare(rm), abort(rm), commit(rm) }, transactionManagerState' = transactionManagerState, preparedResourceManagers' = preparedResourceManagers, }, + // Transaction manager decisions (commit or abort) all { any { decideOnCommit, decideOnAbort }, preparedResourceManagers' = preparedResourceManagers, resourceManagerStates' = resourceManagerStates, }, + // Transaction managers message consumption all { nondet rm = resourceManagers.oneOf() addPreparedResourceManager(rm), @@ -93,6 +112,7 @@ module two_phase_commit { } } + /// Two resource managers have not arrived at conflicting decisions val consistencyInv = tuples(resourceManagers, resourceManagers).forall(((r1, r2)) => not(resourceManagerStates.get(r1) == Committed and resourceManagerStates.get(r2) == Aborted) ) @@ -101,6 +121,8 @@ module two_phase_commit { module two_phase_commit_3 { import two_phase_commit(resourceManagers = Set("rm1", "rm2", "rm3")).* + /// Compose two actions: send an RMPrepare message and consume it in the + /// transaction manager run preparation(rm) = (all { prepare(rm), transactionManagerState' = transactionManagerState, @@ -112,6 +134,8 @@ module two_phase_commit_3 { messages' = messages, }) + /// Compose several actions: The transaction manager decides to commit and + /// each resource manager consumes its Commit message run commitment = (all { decideOnCommit, preparedResourceManagers' = preparedResourceManagers, From dcc3a6283a2600aed6b41960d2a53b848c8ac78a Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 28 Nov 2023 10:57:58 -0300 Subject: [PATCH 035/388] Update examples dashboard --- examples/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/README.md b/examples/README.md index 821137730..24b904b71 100644 --- a/examples/README.md +++ b/examples/README.md @@ -81,7 +81,7 @@ listed without any additional command line arguments. | [language-features/lists.qnt](./language-features/lists.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/maps.qnt](./language-features/maps.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/nondetEx.qnt](./language-features/nondetEx.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [language-features/option.qnt](./language-features/option.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/244 | +| [language-features/option.qnt](./language-features/option.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1034 | | [language-features/records.qnt](./language-features/records.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/sets.qnt](./language-features/sets.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/tuples.qnt](./language-features/tuples.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | From 87bdb10b9100c2c655c9bd52e6c67e8afdaed4fa Mon Sep 17 00:00:00 2001 From: Gabriela Moreira Date: Wed, 29 Nov 2023 15:16:37 -0300 Subject: [PATCH 036/388] Apply suggestions from code review Co-authored-by: Shon Feder --- CHANGELOG.md | 2 +- quint/src/ir/IRprinting.ts | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a61543d89..6b4f1b35a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,7 +21,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Topological sorting of modules (#1268) - The effect checker will now check for consistency of updates across different cases inside `match` (#1272) -- Fix problems in the integration of sum types in `run` and `test` commands (#1276) +- Fix problems in the integration of sum types in `run`, `test`, and `verify` commands (#1276) - Fix some corner cases with the usage of complex expressions inside `assume` and `import (...)` (#1276) diff --git a/quint/src/ir/IRprinting.ts b/quint/src/ir/IRprinting.ts index f90012752..5319d77f4 100644 --- a/quint/src/ir/IRprinting.ts +++ b/quint/src/ir/IRprinting.ts @@ -222,6 +222,8 @@ function sumFieldsToString(r: ConcreteRow): string { return `${f.fieldName}(${typeToString(f.fieldType)})` } }) + // We are not exposing open rows in sum types currently + // So we do not show show row variables. .concat(r.other.kind === 'row' ? [sumFieldsToString(r.other)] : []) .join(' | ') } From f45cf156843e0c721683365bfd16ecb99ef6bf68 Mon Sep 17 00:00:00 2001 From: bugarela Date: Thu, 30 Nov 2023 08:48:25 -0300 Subject: [PATCH 037/388] Reference issue #1279 on definitionDepth initializations --- quint/src/effects/inferrer.ts | 2 ++ quint/src/ir/IRprinting.ts | 26 ++++++++++++++------------ quint/src/names/collector.ts | 4 ++++ quint/src/names/resolver.ts | 4 ++++ quint/src/runtime/impl/compilerImpl.ts | 2 ++ 5 files changed, 26 insertions(+), 12 deletions(-) diff --git a/quint/src/effects/inferrer.ts b/quint/src/effects/inferrer.ts index 0338a593e..b176087fe 100644 --- a/quint/src/effects/inferrer.ts +++ b/quint/src/effects/inferrer.ts @@ -87,6 +87,8 @@ export class EffectInferrer implements IRVisitor { private freeNames: { effectVariables: Set; entityVariables: Set }[] = [] // the current depth of operator definitions: top-level defs are depth 0 + // FIXME(#1279): The walk* functions update this value, but they need to be + // initialized to -1 here for that to work on all scenarios. definitionDepth: number = -1 enterExpr(e: QuintEx) { diff --git a/quint/src/ir/IRprinting.ts b/quint/src/ir/IRprinting.ts index 5319d77f4..f2ea096f6 100644 --- a/quint/src/ir/IRprinting.ts +++ b/quint/src/ir/IRprinting.ts @@ -214,18 +214,20 @@ export function sumToString(s: QuintSumType): string { } function sumFieldsToString(r: ConcreteRow): string { - return r.fields - .map((f: RowField) => { - if (isUnitType(f.fieldType)) { - return `${f.fieldName}` - } else { - return `${f.fieldName}(${typeToString(f.fieldType)})` - } - }) - // We are not exposing open rows in sum types currently - // So we do not show show row variables. - .concat(r.other.kind === 'row' ? [sumFieldsToString(r.other)] : []) - .join(' | ') + return ( + r.fields + .map((f: RowField) => { + if (isUnitType(f.fieldType)) { + return `${f.fieldName}` + } else { + return `${f.fieldName}(${typeToString(f.fieldType)})` + } + }) + // We are not exposing open rows in sum types currently + // So we do not show show row variables. + .concat(r.other.kind === 'row' ? [sumFieldsToString(r.other)] : []) + .join(' | ') + ) } /** diff --git a/quint/src/names/collector.ts b/quint/src/names/collector.ts index bb1708f72..52e8dc054 100644 --- a/quint/src/names/collector.ts +++ b/quint/src/names/collector.ts @@ -54,6 +54,10 @@ export class NameCollector implements IRVisitor { definitionsByModule: DefinitionsByModule = new Map() errors: QuintError[] = [] table: LookupTable = new Map() + + // the current depth of operator definitions: top-level defs are depth 0 + // FIXME(#1279): The walk* functions update this value, but they need to be + // initialized to -1 here for that to work on all scenarios. definitionDepth: number = -1 private currentModuleName: string = '' diff --git a/quint/src/names/resolver.ts b/quint/src/names/resolver.ts index 3d0bf3397..826c51efe 100644 --- a/quint/src/names/resolver.ts +++ b/quint/src/names/resolver.ts @@ -43,6 +43,10 @@ class NameResolver implements IRVisitor { collector: NameCollector errors: QuintError[] = [] table: LookupTable = new Map() + + // the current depth of operator definitions: top-level defs are depth 0 + // FIXME(#1279): The walk* functions update this value, but they need to be + // initialized to -1 here for that to work on all scenarios. definitionDepth: number = -1 constructor() { diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 5acb5886c..13ca70d79 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -161,6 +161,8 @@ export class CompilerVisitor implements IRVisitor { // execution listener private execListener: ExecutionListener // the current depth of operator definitions: top-level defs are depth 0 + // FIXME(#1279): The walk* functions update this value, but they need to be + // initialized to -1 here for that to work on all scenarios. definitionDepth: number = -1 constructor( From e981b914daa4311d505f0db00f8405ad68d618cc Mon Sep 17 00:00:00 2001 From: bugarela Date: Thu, 30 Nov 2023 08:51:22 -0300 Subject: [PATCH 038/388] Explain the reason for the -1 initialization --- quint/src/ir/IRVisitor.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/quint/src/ir/IRVisitor.ts b/quint/src/ir/IRVisitor.ts index 2cc9245a6..609b62105 100644 --- a/quint/src/ir/IRVisitor.ts +++ b/quint/src/ir/IRVisitor.ts @@ -23,7 +23,10 @@ import { unreachable } from '../util' */ export interface IRVisitor { /* Keeps track of the depth of the current definition, to be updated by the - * walk* functions and used by implementations of the interface */ + * walk* functions and used by implementations of the interface. Should be + * initialized to -1, so if `walkDefinition` is called from a different place + * than `walkDeclaration` (which does set this to -1), the increments and + * decrements work as expected. */ definitionDepth?: number enterModule?: (_module: ir.QuintModule) => void From b0024f49b20c6f24820d4fbdb47c8266f6b7aa78 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 28 Nov 2023 22:18:13 -0500 Subject: [PATCH 039/388] Add regression test for 1275 --- quint/test/types/inferrer.test.ts | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/quint/test/types/inferrer.test.ts b/quint/test/types/inferrer.test.ts index 9a79b415c..7cd903bc6 100644 --- a/quint/test/types/inferrer.test.ts +++ b/quint/test/types/inferrer.test.ts @@ -2,16 +2,20 @@ import { describe, it } from 'mocha' import { assert } from 'chai' import { TypeInferenceResult, TypeInferrer } from '../../src/types/inferrer' import { typeSchemeToString } from '../../src/types/printing' -import { errorTreeToString } from '../../src/errorTree' +import { ErrorTree, errorTreeToString } from '../../src/errorTree' import { parseMockedModule } from '../util' describe('inferTypes', () => { - function inferTypesForDefs(defs: string[]): TypeInferenceResult { - const text = `module wrapper { ${defs.join('\n')} }` + function inferTypesForModules(text: string): TypeInferenceResult { const { modules, table } = parseMockedModule(text) const inferrer = new TypeInferrer(table) - return inferrer.inferTypes(modules[0].declarations) + return inferrer.inferTypes(modules.flatMap(m => m.declarations)) + } + + function inferTypesForDefs(defs: string[]): TypeInferenceResult { + const text = `module wrapper { ${defs.join('\n')} }` + return inferTypesForModules(text) } it('infers types for basic expressions', () => { @@ -159,6 +163,21 @@ describe('inferTypes', () => { ]) }) + it('infers types for different sum type declarations with the same label but different values', () => { + const text = ` +module A { + type T1 = | A(int) +} + +module B { + type T2 = | A(bool) +} +` + + const [errors, _] = inferTypesForModules(text) + assert.deepEqual([...errors.entries()], []) + }) + it('infers types for match expression', () => { const defs = ['type T = A(int) | B', 'val a = variant("A", 3)', 'val nine = match a { A(n) => n * n | B => 9 }'] From bedd361341edbb23da90c37bccc0551c8b2fa267 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 29 Nov 2023 10:10:05 -0500 Subject: [PATCH 040/388] Improve comments --- quint/src/parsing/ToIrListener.ts | 4 ++-- quint/src/types/constraintSolver.ts | 1 - quint/test/types/inferrer.test.ts | 1 + 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index f758bd424..e684c355e 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -414,8 +414,8 @@ export class ToIrListener implements QuintListener { // We will generate // // ``` - // def A(__AParam) = variant("A", __AParam) - // val B = {} + // def A(__AParam: int) : T = variant("A", __AParam) + // val B : T = {} // ``` // // Allowing users to write: diff --git a/quint/src/types/constraintSolver.ts b/quint/src/types/constraintSolver.ts index 9e4258f07..2fe22f661 100644 --- a/quint/src/types/constraintSolver.ts +++ b/quint/src/types/constraintSolver.ts @@ -66,7 +66,6 @@ export function solveConstraint( const subst = unify(table, def.type, constraint.type) if (subst.isRight()) { // We found a defined type unifying with the given schema - // (unwrap the vaule since the left of `unify` doesn't match our needs and isn't relevent) return right(subst.unwrap()) } } diff --git a/quint/test/types/inferrer.test.ts b/quint/test/types/inferrer.test.ts index 7cd903bc6..1e90e27f1 100644 --- a/quint/test/types/inferrer.test.ts +++ b/quint/test/types/inferrer.test.ts @@ -164,6 +164,7 @@ describe('inferTypes', () => { }) it('infers types for different sum type declarations with the same label but different values', () => { + // See https://github.com/informalsystems/quint/issues/1275 const text = ` module A { type T1 = | A(int) From 3158e29802fc7916bb48cbe9776ecd6255cb4d5e Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 29 Nov 2023 12:22:49 -0500 Subject: [PATCH 041/388] Fix variant constructor IDs Our parser and IR has the convention that the declaration def f(x) = y Gets represented as def f = (x) => y And in the IR, we expect both the representation of the declaration and the representation of the lambda to have the same source ID. We had not been following this convention in the generation of variant constructors, and that is corrected here. --- quint/src/parsing/ToIrListener.ts | 8 ++++++-- quint/testFixture/SuperSpec.json | 2 +- quint/testFixture/SuperSpec.map.json | 2 +- quint/testFixture/_1043sumTypeDecl.json | 2 +- quint/testFixture/_1043sumTypeDecl.map.json | 2 +- quint/testFixture/_1044matchExpression.json | 2 +- quint/testFixture/_1044matchExpression.map.json | 2 +- 7 files changed, 12 insertions(+), 8 deletions(-) diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index e684c355e..7247a067d 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -430,6 +430,10 @@ export class ToIrListener implements QuintListener { // This shouldn't be visible to users const paramName = `__${fieldName}Param` + // def declarations and the lambdas they are associated with should share + // the same ID + const declarationId = this.getId(variantCtx) + let qualifier: OpQualifier let expr: QuintEx let typeAnnotation: QuintType @@ -476,10 +480,10 @@ export class ToIrListener implements QuintListener { } typeAnnotation = { kind: 'oper', args: [fieldType], res: typeName } - expr = { id: this.getId(variantCtx), kind: 'lambda', params, qualifier, expr: variant } + expr = { id: declarationId, kind: 'lambda', params, qualifier, expr: variant } } - return { id: this.getId(variantCtx), kind: 'def', name: fieldName, qualifier, typeAnnotation, expr } + return { id: declarationId, kind: 'def', name: fieldName, qualifier, typeAnnotation, expr } } ) diff --git a/quint/testFixture/SuperSpec.json b/quint/testFixture/SuperSpec.json index e8ae27239..4e367b3c5 100644 --- a/quint/testFixture/SuperSpec.json +++ b/quint/testFixture/SuperSpec.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":510,"name":"withConsts","declarations":[{"id":100,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":99,"kind":"app","opcode":"isub","args":[{"id":97,"kind":"int","value":1},{"id":98,"kind":"int","value":2}]}},{"id":104,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":103,"kind":"app","opcode":"imul","args":[{"id":101,"kind":"int","value":2},{"id":102,"kind":"int","value":3}]}},{"id":108,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":107,"kind":"app","opcode":"idiv","args":[{"id":105,"kind":"int","value":2},{"id":106,"kind":"int","value":3}]}},{"id":112,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":111,"kind":"app","opcode":"imod","args":[{"id":109,"kind":"int","value":2},{"id":110,"kind":"int","value":3}]}},{"id":116,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":115,"kind":"app","opcode":"ipow","args":[{"id":113,"kind":"int","value":2},{"id":114,"kind":"int","value":3}]}},{"id":119,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":118,"kind":"app","opcode":"iuminus","args":[{"id":117,"kind":"int","value":100}]}},{"id":123,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":122,"kind":"app","opcode":"igt","args":[{"id":120,"kind":"int","value":2},{"id":121,"kind":"int","value":3}]}},{"id":127,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":126,"kind":"app","opcode":"igte","args":[{"id":124,"kind":"int","value":2},{"id":125,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},{"id":131,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":130,"kind":"app","opcode":"ilt","args":[{"id":128,"kind":"int","value":2},{"id":129,"kind":"int","value":3}]}},{"id":135,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":134,"kind":"app","opcode":"ilte","args":[{"id":132,"kind":"int","value":2},{"id":133,"kind":"int","value":3}]}},{"id":139,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":138,"kind":"app","opcode":"eq","args":[{"id":136,"kind":"int","value":2},{"id":137,"kind":"int","value":3}]}},{"id":143,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":142,"kind":"app","opcode":"neq","args":[{"id":140,"kind":"int","value":2},{"id":141,"kind":"int","value":3}]}},{"id":149,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":148,"kind":"app","opcode":"eq","args":[{"id":146,"kind":"app","opcode":"iadd","args":[{"id":144,"kind":"int","value":2},{"id":145,"kind":"int","value":2}]},{"id":147,"kind":"int","value":4}]}},{"id":153,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":152,"kind":"app","opcode":"in","args":[{"id":150,"kind":"int","value":1},{"id":151,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},{"id":165,"kind":"def","name":"withType","qualifier":"val","expr":{"id":164,"kind":"app","opcode":"Set","args":[{"id":162,"kind":"int","value":1},{"id":163,"kind":"int","value":2}]},"typeAnnotation":{"id":161,"kind":"set","elem":{"id":160,"kind":"int"}}},{"id":166,"kind":"typedef","name":"PROC"},{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},{"id":174,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":173,"kind":"int","value":42}},{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},{"kind":"var","name":"k","typeAnnotation":{"id":211,"kind":"int"},"id":212},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22},{"id":233,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":232,"kind":"app","opcode":"and","args":[{"id":230,"kind":"bool","value":false},{"id":231,"kind":"bool","value":true}]}},{"id":237,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":236,"kind":"app","opcode":"or","args":[{"id":234,"kind":"bool","value":false},{"id":235,"kind":"bool","value":true}]}},{"id":241,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":240,"kind":"app","opcode":"implies","args":[{"id":238,"kind":"bool","value":false},{"id":239,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26},{"id":270,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":269,"kind":"app","opcode":"and","args":[{"id":266,"kind":"bool","value":false},{"id":267,"kind":"bool","value":true},{"id":268,"kind":"bool","value":false}]}},{"id":275,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":274,"kind":"app","opcode":"actionAll","args":[{"id":271,"kind":"bool","value":false},{"id":272,"kind":"bool","value":true},{"id":273,"kind":"bool","value":false}]}},{"id":280,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":279,"kind":"app","opcode":"or","args":[{"id":276,"kind":"bool","value":false},{"id":277,"kind":"bool","value":true},{"id":278,"kind":"bool","value":false}]}},{"id":285,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":284,"kind":"app","opcode":"actionAny","args":[{"id":281,"kind":"bool","value":false},{"id":282,"kind":"bool","value":true},{"id":283,"kind":"bool","value":false}]}},{"id":290,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":289,"kind":"app","opcode":"ite","args":[{"id":286,"kind":"bool","value":true},{"id":287,"kind":"int","value":1},{"id":288,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":306,"kind":"fun","arg":{"id":304,"kind":"str"},"res":{"id":305,"kind":"int"}},"id":307},{"id":315,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":315,"kind":"lambda","params":[{"id":312,"name":"a"},{"id":313,"name":"b"}],"qualifier":"def","expr":{"id":314,"kind":"int","value":1}}},{"kind":"const","name":"MyFunFun","typeAnnotation":{"id":31,"kind":"fun","arg":{"id":29,"kind":"fun","arg":{"id":27,"kind":"int"},"res":{"id":28,"kind":"str"}},"res":{"id":30,"kind":"bool"}},"id":32},{"id":327,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":326,"kind":"app","opcode":"in","args":[{"id":324,"kind":"int","value":1},{"id":325,"kind":"app","opcode":"Set","args":[]}]}},{"kind":"const","name":"MyOperator","typeAnnotation":{"id":36,"kind":"oper","args":[{"id":33,"kind":"int"},{"id":34,"kind":"str"}],"res":{"id":35,"kind":"bool"}},"id":37},{"id":392,"kind":"def","name":"one","qualifier":"val","expr":{"id":391,"kind":"app","opcode":"head","args":[{"id":390,"kind":"app","opcode":"List","args":[{"id":388,"kind":"int","value":1},{"id":389,"kind":"int","value":2}]}]}},{"id":397,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":396,"kind":"app","opcode":"Tup","args":[{"id":393,"kind":"int","value":1},{"id":394,"kind":"int","value":2},{"id":395,"kind":"int","value":3}]}},{"id":402,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":401,"kind":"app","opcode":"Tup","args":[{"id":398,"kind":"int","value":1},{"id":399,"kind":"int","value":2},{"id":400,"kind":"int","value":3}]}},{"id":406,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":405,"kind":"app","opcode":"Tup","args":[{"id":403,"kind":"int","value":4},{"id":404,"kind":"int","value":5}]}},{"id":411,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":410,"kind":"app","opcode":"List","args":[{"id":407,"kind":"int","value":1},{"id":408,"kind":"int","value":2},{"id":409,"kind":"int","value":3}]}},{"id":416,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":415,"kind":"app","opcode":"List","args":[{"id":412,"kind":"int","value":1},{"id":413,"kind":"int","value":2},{"id":414,"kind":"int","value":3}]}},{"kind":"const","name":"MyOperatorWithComma","typeAnnotation":{"id":41,"kind":"oper","args":[{"id":38,"kind":"int"},{"id":39,"kind":"str"}],"res":{"id":40,"kind":"bool"}},"id":42},{"id":423,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":422,"kind":"app","opcode":"nth","args":[{"id":420,"kind":"app","opcode":"List","args":[{"id":417,"kind":"int","value":2},{"id":418,"kind":"int","value":3},{"id":419,"kind":"int","value":4}]},{"id":421,"kind":"int","value":2}]}},{"id":429,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"Rec","args":[{"id":425,"kind":"str","value":"name"},{"id":424,"kind":"str","value":"igor"},{"id":427,"kind":"str","value":"year"},{"id":426,"kind":"int","value":1981}]}},{"id":435,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":434,"kind":"app","opcode":"Rec","args":[{"id":430,"kind":"str","value":"name"},{"id":431,"kind":"str","value":"igor"},{"id":432,"kind":"str","value":"year"},{"id":433,"kind":"int","value":1981}]}},{"id":448,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Set","args":[{"id":444,"kind":"int","value":1},{"id":445,"kind":"int","value":2},{"id":446,"kind":"int","value":3}]}},{"kind":"const","name":"MyTuple","typeAnnotation":{"id":46,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":43,"kind":"int"}},{"fieldName":"1","fieldType":{"id":44,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":45,"kind":"str"}}],"other":{"kind":"empty"}}},"id":47},{"id":477,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":476,"kind":"app","opcode":"in","args":[{"id":474,"kind":"int","value":2},{"id":475,"kind":"app","opcode":"Set","args":[]}]}},{"id":481,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":480,"kind":"app","opcode":"subseteq","args":[{"id":478,"kind":"app","opcode":"Set","args":[]},{"id":479,"kind":"app","opcode":"Set","args":[]}]}},{"id":490,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":489,"kind":"app","opcode":"in","args":[{"id":483,"kind":"app","opcode":"Set","args":[{"id":482,"kind":"int","value":1}]},{"id":488,"kind":"app","opcode":"powerset","args":[{"id":487,"kind":"app","opcode":"Set","args":[{"id":484,"kind":"int","value":1},{"id":485,"kind":"int","value":2},{"id":486,"kind":"int","value":3}]}]}]}},{"id":503,"kind":"typedef","name":"INT_SET","type":{"id":502,"kind":"set","elem":{"id":501,"kind":"int"}}},{"id":504,"kind":"typedef","name":"UNINTERPRETED_TYPE"},{"kind":"const","name":"MyTupleWithComma","typeAnnotation":{"id":51,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":48,"kind":"int"}},{"fieldName":"1","fieldType":{"id":49,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":50,"kind":"str"}}],"other":{"kind":"empty"}}},"id":52},{"kind":"const","name":"MyRecord","typeAnnotation":{"id":56,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":53,"kind":"int"}},{"fieldName":"b","fieldType":{"id":54,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":55,"kind":"str"}}],"other":{"kind":"empty"}}},"id":57},{"kind":"const","name":"MyRecordWithComma","typeAnnotation":{"id":61,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":58,"kind":"int"}},{"fieldName":"b","fieldType":{"id":59,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":60,"kind":"str"}}],"other":{"kind":"empty"}}},"id":62},{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},{"kind":"var","name":"i","typeAnnotation":{"id":89,"kind":"int"},"id":90},{"kind":"var","name":"j","typeAnnotation":{"id":91,"kind":"bool"},"id":92},{"id":96,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":95,"kind":"app","opcode":"iadd","args":[{"id":93,"kind":"int","value":1},{"id":94,"kind":"int","value":2}]}},{"id":159,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":158,"kind":"app","opcode":"exists","args":[{"id":154,"kind":"name","name":"Bool"},{"id":157,"kind":"lambda","params":[{"id":155,"name":"x"}],"qualifier":"def","expr":{"id":156,"kind":"name","name":"x"}}]}},{"id":170,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":169,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":168,"kind":"set","elem":{"id":167,"kind":"const","name":"PROC"}}},{"id":180,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":180,"kind":"lambda","params":[{"id":175,"name":"x"},{"id":176,"name":"y"}],"qualifier":"puredef","expr":{"id":179,"kind":"app","opcode":"iadd","args":[{"id":177,"kind":"name","name":"x"},{"id":178,"kind":"name","name":"y"}]}}},{"id":185,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":185,"kind":"lambda","params":[{"id":181,"name":"factor"}],"qualifier":"def","expr":{"id":184,"kind":"app","opcode":"imul","args":[{"id":182,"kind":"name","name":"factor"},{"id":183,"kind":"name","name":"n"}]}}},{"id":190,"kind":"def","name":"A","qualifier":"action","expr":{"id":190,"kind":"lambda","params":[{"id":186,"name":"x"}],"qualifier":"action","expr":{"id":189,"kind":"app","opcode":"assign","args":[{"id":188,"kind":"name","name":"n"},{"id":187,"kind":"name","name":"x"}]}}},{"id":194,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":194,"kind":"lambda","params":[{"id":191,"name":"x"}],"qualifier":"puredef","expr":{"id":193,"kind":"app","opcode":"not","args":[{"id":192,"kind":"name","name":"x"}]}}},{"id":204,"kind":"def","name":"H","qualifier":"def","expr":{"id":204,"kind":"lambda","params":[{"id":195,"name":"x"},{"id":196,"name":"y"}],"qualifier":"def","expr":{"id":203,"kind":"app","opcode":"iadd","args":[{"id":201,"kind":"name","name":"x"},{"id":202,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":200,"kind":"oper","args":[{"id":197,"kind":"int"},{"id":198,"kind":"int"}],"res":{"id":199,"kind":"int"}}},{"id":210,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":210,"kind":"lambda","params":[{"id":205,"name":"x"}],"qualifier":"def","expr":{"id":209,"kind":"name","name":"x"}},"typeAnnotation":{"id":208,"kind":"oper","args":[{"id":206,"kind":"var","name":"a"}],"res":{"id":207,"kind":"var","name":"a"}}},{"id":216,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":215,"kind":"app","opcode":"assign","args":[{"id":214,"kind":"name","name":"k"},{"id":213,"kind":"int","value":3}]}},{"id":229,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":229,"kind":"lambda","params":[{"id":217,"name":"x"},{"id":219,"name":"y"}],"qualifier":"puredef","expr":{"id":227,"kind":"app","opcode":"ite","args":[{"id":224,"kind":"app","opcode":"ilt","args":[{"id":222,"kind":"name","name":"x"},{"id":223,"kind":"name","name":"y"}]},{"id":225,"kind":"name","name":"x"},{"id":226,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":228,"kind":"oper","args":[{"id":218,"kind":"int"},{"id":220,"kind":"int"}],"res":{"id":221,"kind":"int"}}},{"id":244,"kind":"def","name":"F","qualifier":"def","expr":{"id":244,"kind":"lambda","params":[{"id":242,"name":"x"}],"qualifier":"def","expr":{"id":243,"kind":"name","name":"x"}}},{"id":303,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":303,"kind":"lambda","params":[{"id":291,"name":"x"},{"id":292,"name":"y"}],"qualifier":"def","expr":{"id":302,"kind":"app","opcode":"ite","args":[{"id":295,"kind":"app","opcode":"ilt","args":[{"id":293,"kind":"name","name":"x"},{"id":294,"kind":"int","value":10}]},{"id":298,"kind":"app","opcode":"iadd","args":[{"id":296,"kind":"name","name":"y"},{"id":297,"kind":"int","value":5}]},{"id":301,"kind":"app","opcode":"imod","args":[{"id":299,"kind":"name","name":"y"},{"id":300,"kind":"int","value":5}]}]}}},{"id":311,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":310,"kind":"app","opcode":"get","args":[{"id":308,"kind":"name","name":"f1"},{"id":309,"kind":"str","value":"a"}]}},{"id":319,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":318,"kind":"app","opcode":"MyOper","args":[{"id":316,"kind":"str","value":"a"},{"id":317,"kind":"int","value":42}]}},{"id":323,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"MyOper","args":[{"id":320,"kind":"str","value":"a"},{"id":321,"kind":"int","value":42}]}},{"id":335,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":334,"kind":"app","opcode":"filter","args":[{"id":328,"kind":"name","name":"S"},{"id":333,"kind":"lambda","params":[{"id":329,"name":"x"}],"qualifier":"def","expr":{"id":332,"kind":"app","opcode":"igt","args":[{"id":330,"kind":"name","name":"x"},{"id":331,"kind":"int","value":10}]}}]}},{"id":373,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":372,"kind":"app","opcode":"filter","args":[{"id":368,"kind":"name","name":"S"},{"id":371,"kind":"lambda","params":[{"id":369,"name":"_"}],"qualifier":"def","expr":{"id":370,"kind":"bool","value":true}}]}},{"id":381,"kind":"def","name":"f","qualifier":"val","expr":{"id":380,"kind":"app","opcode":"mapBy","args":[{"id":374,"kind":"name","name":"S"},{"id":379,"kind":"lambda","params":[{"id":375,"name":"x"}],"qualifier":"def","expr":{"id":378,"kind":"app","opcode":"iadd","args":[{"id":376,"kind":"name","name":"x"},{"id":377,"kind":"int","value":1}]}}]}},{"id":387,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":386,"kind":"app","opcode":"exclude","args":[{"id":382,"kind":"name","name":"S"},{"id":385,"kind":"app","opcode":"Set","args":[{"id":383,"kind":"int","value":3},{"id":384,"kind":"int","value":4}]}]}},{"id":443,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":442,"kind":"app","opcode":"with","args":[{"id":441,"kind":"app","opcode":"with","args":[{"id":440,"kind":"name","name":"test_record"},{"id":437,"kind":"str","value":"name"},{"id":436,"kind":"str","value":"quint"}]},{"id":439,"kind":"str","value":"year"},{"id":438,"kind":"int","value":2023}]}},{"id":459,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":458,"kind":"let","opdef":{"id":454,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":453,"kind":"app","opcode":"Rec","args":[{"id":450,"kind":"str","value":"a"},{"id":449,"kind":"int","value":1},{"id":452,"kind":"str","value":"b"},{"id":451,"kind":"str","value":"foo"}]}},"expr":{"id":457,"kind":"app","opcode":"field","args":[{"id":455,"kind":"name","name":"my_rec"},{"id":456,"kind":"str","value":"a"}]}}},{"id":468,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":467,"kind":"let","opdef":{"id":463,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":462,"kind":"app","opcode":"Tup","args":[{"id":460,"kind":"str","value":"a"},{"id":461,"kind":"int","value":3}]}},"expr":{"id":466,"kind":"app","opcode":"item","args":[{"id":464,"kind":"name","name":"my_tup"},{"id":465,"kind":"int","value":2}]}}},{"id":473,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":473,"kind":"lambda","params":[{"id":469,"name":"s"}],"qualifier":"def","expr":{"id":472,"kind":"app","opcode":"eq","args":[{"id":470,"kind":"name","name":"s"},{"id":471,"kind":"app","opcode":"List","args":[]}]}}},{"id":494,"kind":"assume","name":"positive","assumption":{"id":493,"kind":"app","opcode":"igt","args":[{"id":491,"kind":"name","name":"N"},{"id":492,"kind":"int","value":0}]}},{"id":498,"kind":"assume","name":"_","assumption":{"id":497,"kind":"app","opcode":"neq","args":[{"id":495,"kind":"name","name":"N"},{"id":496,"kind":"int","value":0}]}},{"id":499,"kind":"import","defName":"foo","protoName":"M1"},{"id":500,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":505,"kind":"const","name":"INT_SET"},"id":506},{"id":509,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":508,"name":"N"},{"id":507,"kind":"name","name":"N"}]],"identityOverride":false},{"id":74,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":73,"kind":"lambda","params":[{"id":70,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":72,"kind":"app","opcode":"variant","args":[{"id":69,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":71}]}}},{"id":80,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":79,"kind":"lambda","params":[{"id":76,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":78,"kind":"app","opcode":"variant","args":[{"id":75,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":77}]}}},{"id":86,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":85,"kind":"lambda","params":[{"id":82,"name":"__DogParam"}],"qualifier":"def","expr":{"id":84,"kind":"app","opcode":"variant","args":[{"id":81,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":83}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":87,"kind":"const","name":"MyUnionType"},"id":88},{"id":251,"kind":"def","name":"G","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":245,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"app","opcode":"and","args":[{"id":247,"kind":"app","opcode":"F","args":[{"id":246,"kind":"name","name":"x"}]},{"id":249,"kind":"app","opcode":"not","args":[{"id":248,"kind":"name","name":"x"}]}]}}},{"id":258,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":258,"kind":"lambda","params":[{"id":252,"name":"x"}],"qualifier":"def","expr":{"id":257,"kind":"app","opcode":"and","args":[{"id":254,"kind":"app","opcode":"F","args":[{"id":253,"kind":"name","name":"x"}]},{"id":256,"kind":"app","opcode":"not","args":[{"id":255,"kind":"name","name":"x"}]}]}}},{"id":265,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":265,"kind":"lambda","params":[{"id":259,"name":"x"}],"qualifier":"def","expr":{"id":264,"kind":"app","opcode":"or","args":[{"id":261,"kind":"app","opcode":"F","args":[{"id":260,"kind":"name","name":"x"}]},{"id":263,"kind":"app","opcode":"not","args":[{"id":262,"kind":"name","name":"x"}]}]}}},{"id":355,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":354,"kind":"app","opcode":"map","args":[{"id":338,"kind":"app","opcode":"tuples","args":[{"id":336,"kind":"name","name":"S"},{"id":337,"kind":"name","name":"MySet"}]},{"id":353,"kind":"lambda","params":[{"id":344,"name":"quintTupledLambdaParam344"}],"qualifier":"def","expr":{"id":349,"kind":"let","opdef":{"id":340,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":350,"kind":"app","opcode":"item","args":[{"id":351,"kind":"name","name":"quintTupledLambdaParam344"},{"id":352,"kind":"int","value":2}]}},"expr":{"id":345,"kind":"let","opdef":{"id":339,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":346,"kind":"app","opcode":"item","args":[{"id":347,"kind":"name","name":"quintTupledLambdaParam344"},{"id":348,"kind":"int","value":1}]}},"expr":{"id":343,"kind":"app","opcode":"iadd","args":[{"id":341,"kind":"name","name":"s"},{"id":342,"kind":"name","name":"mys"}]}}}}]}},{"id":367,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":366,"kind":"let","opdef":{"id":358,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":357,"kind":"app","opcode":"oneOf","args":[{"id":356,"kind":"name","name":"S"}]}},"expr":{"id":365,"kind":"app","opcode":"actionAll","args":[{"id":361,"kind":"app","opcode":"igt","args":[{"id":359,"kind":"name","name":"x"},{"id":360,"kind":"int","value":10}]},{"id":364,"kind":"app","opcode":"assign","args":[{"id":363,"kind":"name","name":"k"},{"id":362,"kind":"name","name":"x"}]}]}}}]}],"table":{"68":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"71":{"id":70,"name":"__CircleParam","kind":"param"},"77":{"id":76,"name":"__RectangleParam","kind":"param"},"83":{"id":82,"name":"__DogParam","kind":"param"},"87":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"156":{"id":155,"name":"x","kind":"param"},"167":{"id":166,"kind":"typedef","name":"PROC"},"177":{"id":175,"name":"x","kind":"param"},"178":{"id":176,"name":"y","kind":"param"},"182":{"id":181,"name":"factor","kind":"param"},"183":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"187":{"id":186,"name":"x","kind":"param"},"188":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"192":{"id":191,"name":"x","kind":"param"},"201":{"id":195,"name":"x","kind":"param"},"202":{"id":196,"name":"y","kind":"param"},"209":{"id":205,"name":"x","kind":"param"},"214":{"kind":"var","name":"k","typeAnnotation":{"id":211,"kind":"int"},"id":212},"222":{"id":217,"name":"x","kind":"param"},"223":{"id":219,"name":"y","kind":"param"},"225":{"id":217,"name":"x","kind":"param"},"226":{"id":219,"name":"y","kind":"param"},"243":{"id":242,"name":"x","kind":"param"},"246":{"id":245,"name":"x","kind":"param"},"247":{"id":244,"kind":"def","name":"F","qualifier":"def","expr":{"id":244,"kind":"lambda","params":[{"id":242,"name":"x"}],"qualifier":"def","expr":{"id":243,"kind":"name","name":"x"}},"depth":0},"248":{"id":245,"name":"x","kind":"param"},"253":{"id":252,"name":"x","kind":"param"},"254":{"id":244,"kind":"def","name":"F","qualifier":"def","expr":{"id":244,"kind":"lambda","params":[{"id":242,"name":"x"}],"qualifier":"def","expr":{"id":243,"kind":"name","name":"x"}},"depth":0},"255":{"id":252,"name":"x","kind":"param"},"260":{"id":259,"name":"x","kind":"param"},"261":{"id":244,"kind":"def","name":"F","qualifier":"def","expr":{"id":244,"kind":"lambda","params":[{"id":242,"name":"x"}],"qualifier":"def","expr":{"id":243,"kind":"name","name":"x"}},"depth":0},"262":{"id":259,"name":"x","kind":"param"},"293":{"id":291,"name":"x","kind":"param"},"296":{"id":292,"name":"y","kind":"param"},"299":{"id":292,"name":"y","kind":"param"},"308":{"kind":"var","name":"f1","typeAnnotation":{"id":306,"kind":"fun","arg":{"id":304,"kind":"str"},"res":{"id":305,"kind":"int"}},"id":307},"318":{"id":315,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":315,"kind":"lambda","params":[{"id":312,"name":"a"},{"id":313,"name":"b"}],"qualifier":"def","expr":{"id":314,"kind":"int","value":1}},"depth":0},"322":{"id":315,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":315,"kind":"lambda","params":[{"id":312,"name":"a"},{"id":313,"name":"b"}],"qualifier":"def","expr":{"id":314,"kind":"int","value":1}},"depth":0},"328":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"330":{"id":329,"name":"x","kind":"param"},"336":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"337":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},"341":{"id":339,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":346,"kind":"app","opcode":"item","args":[{"id":347,"kind":"name","name":"quintTupledLambdaParam344"},{"id":348,"kind":"int","value":1}]},"depth":1},"342":{"id":340,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":350,"kind":"app","opcode":"item","args":[{"id":351,"kind":"name","name":"quintTupledLambdaParam344"},{"id":352,"kind":"int","value":2}]},"depth":1},"347":{"id":344,"name":"quintTupledLambdaParam344","kind":"param"},"351":{"id":344,"name":"quintTupledLambdaParam344","kind":"param"},"356":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"359":{"id":358,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":357,"kind":"app","opcode":"oneOf","args":[{"id":356,"kind":"name","name":"S"}]},"depth":1},"362":{"id":358,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":357,"kind":"app","opcode":"oneOf","args":[{"id":356,"kind":"name","name":"S"}]},"depth":1},"363":{"kind":"var","name":"k","typeAnnotation":{"id":211,"kind":"int"},"id":212},"368":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"374":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"376":{"id":375,"name":"x","kind":"param"},"382":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"440":{"id":429,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"Rec","args":[{"id":425,"kind":"str","value":"name"},{"id":424,"kind":"str","value":"igor"},{"id":427,"kind":"str","value":"year"},{"id":426,"kind":"int","value":1981}]},"depth":0},"455":{"id":454,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":453,"kind":"app","opcode":"Rec","args":[{"id":450,"kind":"str","value":"a"},{"id":449,"kind":"int","value":1},{"id":452,"kind":"str","value":"b"},{"id":451,"kind":"str","value":"foo"}]},"depth":1},"464":{"id":463,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":462,"kind":"app","opcode":"Tup","args":[{"id":460,"kind":"str","value":"a"},{"id":461,"kind":"int","value":3}]},"depth":1},"470":{"id":469,"name":"s","kind":"param"},"491":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"495":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"505":{"id":503,"kind":"typedef","name":"INT_SET","type":{"id":502,"kind":"set","elem":{"id":501,"kind":"int"}}},"507":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"508":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":507,"importedFrom":{"id":509,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":508,"name":"N"},{"id":507,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":507,"name":"withConsts","declarations":[{"id":101,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":100,"kind":"app","opcode":"imul","args":[{"id":98,"kind":"int","value":2},{"id":99,"kind":"int","value":3}]}},{"id":105,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":104,"kind":"app","opcode":"idiv","args":[{"id":102,"kind":"int","value":2},{"id":103,"kind":"int","value":3}]}},{"id":109,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":108,"kind":"app","opcode":"imod","args":[{"id":106,"kind":"int","value":2},{"id":107,"kind":"int","value":3}]}},{"id":113,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":112,"kind":"app","opcode":"ipow","args":[{"id":110,"kind":"int","value":2},{"id":111,"kind":"int","value":3}]}},{"id":116,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":115,"kind":"app","opcode":"iuminus","args":[{"id":114,"kind":"int","value":100}]}},{"id":120,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":119,"kind":"app","opcode":"igt","args":[{"id":117,"kind":"int","value":2},{"id":118,"kind":"int","value":3}]}},{"id":124,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":123,"kind":"app","opcode":"igte","args":[{"id":121,"kind":"int","value":2},{"id":122,"kind":"int","value":3}]}},{"id":128,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":127,"kind":"app","opcode":"ilt","args":[{"id":125,"kind":"int","value":2},{"id":126,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},{"id":132,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":131,"kind":"app","opcode":"ilte","args":[{"id":129,"kind":"int","value":2},{"id":130,"kind":"int","value":3}]}},{"id":136,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":135,"kind":"app","opcode":"eq","args":[{"id":133,"kind":"int","value":2},{"id":134,"kind":"int","value":3}]}},{"id":140,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":139,"kind":"app","opcode":"neq","args":[{"id":137,"kind":"int","value":2},{"id":138,"kind":"int","value":3}]}},{"id":146,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":145,"kind":"app","opcode":"eq","args":[{"id":143,"kind":"app","opcode":"iadd","args":[{"id":141,"kind":"int","value":2},{"id":142,"kind":"int","value":2}]},{"id":144,"kind":"int","value":4}]}},{"id":150,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":149,"kind":"app","opcode":"in","args":[{"id":147,"kind":"int","value":1},{"id":148,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},{"id":162,"kind":"def","name":"withType","qualifier":"val","expr":{"id":161,"kind":"app","opcode":"Set","args":[{"id":159,"kind":"int","value":1},{"id":160,"kind":"int","value":2}]},"typeAnnotation":{"id":158,"kind":"set","elem":{"id":157,"kind":"int"}}},{"id":163,"kind":"typedef","name":"PROC"},{"kind":"var","name":"n","typeAnnotation":{"id":168,"kind":"int"},"id":169},{"id":171,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":170,"kind":"int","value":42}},{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},{"kind":"var","name":"k","typeAnnotation":{"id":208,"kind":"int"},"id":209},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22},{"id":230,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":229,"kind":"app","opcode":"and","args":[{"id":227,"kind":"bool","value":false},{"id":228,"kind":"bool","value":true}]}},{"id":234,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":233,"kind":"app","opcode":"or","args":[{"id":231,"kind":"bool","value":false},{"id":232,"kind":"bool","value":true}]}},{"id":238,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":237,"kind":"app","opcode":"implies","args":[{"id":235,"kind":"bool","value":false},{"id":236,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26},{"id":267,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":266,"kind":"app","opcode":"and","args":[{"id":263,"kind":"bool","value":false},{"id":264,"kind":"bool","value":true},{"id":265,"kind":"bool","value":false}]}},{"id":272,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":271,"kind":"app","opcode":"actionAll","args":[{"id":268,"kind":"bool","value":false},{"id":269,"kind":"bool","value":true},{"id":270,"kind":"bool","value":false}]}},{"id":277,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":276,"kind":"app","opcode":"or","args":[{"id":273,"kind":"bool","value":false},{"id":274,"kind":"bool","value":true},{"id":275,"kind":"bool","value":false}]}},{"id":282,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":281,"kind":"app","opcode":"actionAny","args":[{"id":278,"kind":"bool","value":false},{"id":279,"kind":"bool","value":true},{"id":280,"kind":"bool","value":false}]}},{"id":287,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":286,"kind":"app","opcode":"ite","args":[{"id":283,"kind":"bool","value":true},{"id":284,"kind":"int","value":1},{"id":285,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":303,"kind":"fun","arg":{"id":301,"kind":"str"},"res":{"id":302,"kind":"int"}},"id":304},{"id":312,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":312,"kind":"lambda","params":[{"id":309,"name":"a"},{"id":310,"name":"b"}],"qualifier":"def","expr":{"id":311,"kind":"int","value":1}}},{"kind":"const","name":"MyFunFun","typeAnnotation":{"id":31,"kind":"fun","arg":{"id":29,"kind":"fun","arg":{"id":27,"kind":"int"},"res":{"id":28,"kind":"str"}},"res":{"id":30,"kind":"bool"}},"id":32},{"id":324,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":323,"kind":"app","opcode":"in","args":[{"id":321,"kind":"int","value":1},{"id":322,"kind":"app","opcode":"Set","args":[]}]}},{"kind":"const","name":"MyOperator","typeAnnotation":{"id":36,"kind":"oper","args":[{"id":33,"kind":"int"},{"id":34,"kind":"str"}],"res":{"id":35,"kind":"bool"}},"id":37},{"id":389,"kind":"def","name":"one","qualifier":"val","expr":{"id":388,"kind":"app","opcode":"head","args":[{"id":387,"kind":"app","opcode":"List","args":[{"id":385,"kind":"int","value":1},{"id":386,"kind":"int","value":2}]}]}},{"id":394,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":393,"kind":"app","opcode":"Tup","args":[{"id":390,"kind":"int","value":1},{"id":391,"kind":"int","value":2},{"id":392,"kind":"int","value":3}]}},{"id":399,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":398,"kind":"app","opcode":"Tup","args":[{"id":395,"kind":"int","value":1},{"id":396,"kind":"int","value":2},{"id":397,"kind":"int","value":3}]}},{"id":403,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":402,"kind":"app","opcode":"Tup","args":[{"id":400,"kind":"int","value":4},{"id":401,"kind":"int","value":5}]}},{"id":408,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":407,"kind":"app","opcode":"List","args":[{"id":404,"kind":"int","value":1},{"id":405,"kind":"int","value":2},{"id":406,"kind":"int","value":3}]}},{"id":413,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":412,"kind":"app","opcode":"List","args":[{"id":409,"kind":"int","value":1},{"id":410,"kind":"int","value":2},{"id":411,"kind":"int","value":3}]}},{"kind":"const","name":"MyOperatorWithComma","typeAnnotation":{"id":41,"kind":"oper","args":[{"id":38,"kind":"int"},{"id":39,"kind":"str"}],"res":{"id":40,"kind":"bool"}},"id":42},{"id":420,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":419,"kind":"app","opcode":"nth","args":[{"id":417,"kind":"app","opcode":"List","args":[{"id":414,"kind":"int","value":2},{"id":415,"kind":"int","value":3},{"id":416,"kind":"int","value":4}]},{"id":418,"kind":"int","value":2}]}},{"id":426,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":425,"kind":"app","opcode":"Rec","args":[{"id":422,"kind":"str","value":"name"},{"id":421,"kind":"str","value":"igor"},{"id":424,"kind":"str","value":"year"},{"id":423,"kind":"int","value":1981}]}},{"id":432,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":431,"kind":"app","opcode":"Rec","args":[{"id":427,"kind":"str","value":"name"},{"id":428,"kind":"str","value":"igor"},{"id":429,"kind":"str","value":"year"},{"id":430,"kind":"int","value":1981}]}},{"id":445,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":444,"kind":"app","opcode":"Set","args":[{"id":441,"kind":"int","value":1},{"id":442,"kind":"int","value":2},{"id":443,"kind":"int","value":3}]}},{"kind":"const","name":"MyTuple","typeAnnotation":{"id":46,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":43,"kind":"int"}},{"fieldName":"1","fieldType":{"id":44,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":45,"kind":"str"}}],"other":{"kind":"empty"}}},"id":47},{"id":474,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":473,"kind":"app","opcode":"in","args":[{"id":471,"kind":"int","value":2},{"id":472,"kind":"app","opcode":"Set","args":[]}]}},{"id":478,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":477,"kind":"app","opcode":"subseteq","args":[{"id":475,"kind":"app","opcode":"Set","args":[]},{"id":476,"kind":"app","opcode":"Set","args":[]}]}},{"id":487,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":486,"kind":"app","opcode":"in","args":[{"id":480,"kind":"app","opcode":"Set","args":[{"id":479,"kind":"int","value":1}]},{"id":485,"kind":"app","opcode":"powerset","args":[{"id":484,"kind":"app","opcode":"Set","args":[{"id":481,"kind":"int","value":1},{"id":482,"kind":"int","value":2},{"id":483,"kind":"int","value":3}]}]}]}},{"id":500,"kind":"typedef","name":"INT_SET","type":{"id":499,"kind":"set","elem":{"id":498,"kind":"int"}}},{"id":501,"kind":"typedef","name":"UNINTERPRETED_TYPE"},{"kind":"const","name":"MyTupleWithComma","typeAnnotation":{"id":51,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":48,"kind":"int"}},{"fieldName":"1","fieldType":{"id":49,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":50,"kind":"str"}}],"other":{"kind":"empty"}}},"id":52},{"kind":"const","name":"MyRecord","typeAnnotation":{"id":56,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":53,"kind":"int"}},{"fieldName":"b","fieldType":{"id":54,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":55,"kind":"str"}}],"other":{"kind":"empty"}}},"id":57},{"kind":"const","name":"MyRecordWithComma","typeAnnotation":{"id":61,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":58,"kind":"int"}},{"fieldName":"b","fieldType":{"id":59,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":60,"kind":"str"}}],"other":{"kind":"empty"}}},"id":62},{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},{"kind":"var","name":"i","typeAnnotation":{"id":86,"kind":"int"},"id":87},{"kind":"var","name":"j","typeAnnotation":{"id":88,"kind":"bool"},"id":89},{"id":93,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":92,"kind":"app","opcode":"iadd","args":[{"id":90,"kind":"int","value":1},{"id":91,"kind":"int","value":2}]}},{"id":97,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":96,"kind":"app","opcode":"isub","args":[{"id":94,"kind":"int","value":1},{"id":95,"kind":"int","value":2}]}},{"id":156,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":155,"kind":"app","opcode":"exists","args":[{"id":151,"kind":"name","name":"Bool"},{"id":154,"kind":"lambda","params":[{"id":152,"name":"x"}],"qualifier":"def","expr":{"id":153,"kind":"name","name":"x"}}]}},{"id":167,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":166,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":165,"kind":"set","elem":{"id":164,"kind":"const","name":"PROC"}}},{"id":177,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":177,"kind":"lambda","params":[{"id":172,"name":"x"},{"id":173,"name":"y"}],"qualifier":"puredef","expr":{"id":176,"kind":"app","opcode":"iadd","args":[{"id":174,"kind":"name","name":"x"},{"id":175,"kind":"name","name":"y"}]}}},{"id":182,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":182,"kind":"lambda","params":[{"id":178,"name":"factor"}],"qualifier":"def","expr":{"id":181,"kind":"app","opcode":"imul","args":[{"id":179,"kind":"name","name":"factor"},{"id":180,"kind":"name","name":"n"}]}}},{"id":187,"kind":"def","name":"A","qualifier":"action","expr":{"id":187,"kind":"lambda","params":[{"id":183,"name":"x"}],"qualifier":"action","expr":{"id":186,"kind":"app","opcode":"assign","args":[{"id":185,"kind":"name","name":"n"},{"id":184,"kind":"name","name":"x"}]}}},{"id":191,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":191,"kind":"lambda","params":[{"id":188,"name":"x"}],"qualifier":"puredef","expr":{"id":190,"kind":"app","opcode":"not","args":[{"id":189,"kind":"name","name":"x"}]}}},{"id":201,"kind":"def","name":"H","qualifier":"def","expr":{"id":201,"kind":"lambda","params":[{"id":192,"name":"x"},{"id":193,"name":"y"}],"qualifier":"def","expr":{"id":200,"kind":"app","opcode":"iadd","args":[{"id":198,"kind":"name","name":"x"},{"id":199,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":197,"kind":"oper","args":[{"id":194,"kind":"int"},{"id":195,"kind":"int"}],"res":{"id":196,"kind":"int"}}},{"id":207,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":207,"kind":"lambda","params":[{"id":202,"name":"x"}],"qualifier":"def","expr":{"id":206,"kind":"name","name":"x"}},"typeAnnotation":{"id":205,"kind":"oper","args":[{"id":203,"kind":"var","name":"a"}],"res":{"id":204,"kind":"var","name":"a"}}},{"id":213,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":212,"kind":"app","opcode":"assign","args":[{"id":211,"kind":"name","name":"k"},{"id":210,"kind":"int","value":3}]}},{"id":226,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":226,"kind":"lambda","params":[{"id":214,"name":"x"},{"id":216,"name":"y"}],"qualifier":"puredef","expr":{"id":224,"kind":"app","opcode":"ite","args":[{"id":221,"kind":"app","opcode":"ilt","args":[{"id":219,"kind":"name","name":"x"},{"id":220,"kind":"name","name":"y"}]},{"id":222,"kind":"name","name":"x"},{"id":223,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":225,"kind":"oper","args":[{"id":215,"kind":"int"},{"id":217,"kind":"int"}],"res":{"id":218,"kind":"int"}}},{"id":241,"kind":"def","name":"F","qualifier":"def","expr":{"id":241,"kind":"lambda","params":[{"id":239,"name":"x"}],"qualifier":"def","expr":{"id":240,"kind":"name","name":"x"}}},{"id":300,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":300,"kind":"lambda","params":[{"id":288,"name":"x"},{"id":289,"name":"y"}],"qualifier":"def","expr":{"id":299,"kind":"app","opcode":"ite","args":[{"id":292,"kind":"app","opcode":"ilt","args":[{"id":290,"kind":"name","name":"x"},{"id":291,"kind":"int","value":10}]},{"id":295,"kind":"app","opcode":"iadd","args":[{"id":293,"kind":"name","name":"y"},{"id":294,"kind":"int","value":5}]},{"id":298,"kind":"app","opcode":"imod","args":[{"id":296,"kind":"name","name":"y"},{"id":297,"kind":"int","value":5}]}]}}},{"id":308,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":307,"kind":"app","opcode":"get","args":[{"id":305,"kind":"name","name":"f1"},{"id":306,"kind":"str","value":"a"}]}},{"id":316,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":315,"kind":"app","opcode":"MyOper","args":[{"id":313,"kind":"str","value":"a"},{"id":314,"kind":"int","value":42}]}},{"id":320,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":319,"kind":"app","opcode":"MyOper","args":[{"id":317,"kind":"str","value":"a"},{"id":318,"kind":"int","value":42}]}},{"id":332,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":331,"kind":"app","opcode":"filter","args":[{"id":325,"kind":"name","name":"S"},{"id":330,"kind":"lambda","params":[{"id":326,"name":"x"}],"qualifier":"def","expr":{"id":329,"kind":"app","opcode":"igt","args":[{"id":327,"kind":"name","name":"x"},{"id":328,"kind":"int","value":10}]}}]}},{"id":370,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":369,"kind":"app","opcode":"filter","args":[{"id":365,"kind":"name","name":"S"},{"id":368,"kind":"lambda","params":[{"id":366,"name":"_"}],"qualifier":"def","expr":{"id":367,"kind":"bool","value":true}}]}},{"id":378,"kind":"def","name":"f","qualifier":"val","expr":{"id":377,"kind":"app","opcode":"mapBy","args":[{"id":371,"kind":"name","name":"S"},{"id":376,"kind":"lambda","params":[{"id":372,"name":"x"}],"qualifier":"def","expr":{"id":375,"kind":"app","opcode":"iadd","args":[{"id":373,"kind":"name","name":"x"},{"id":374,"kind":"int","value":1}]}}]}},{"id":384,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":383,"kind":"app","opcode":"exclude","args":[{"id":379,"kind":"name","name":"S"},{"id":382,"kind":"app","opcode":"Set","args":[{"id":380,"kind":"int","value":3},{"id":381,"kind":"int","value":4}]}]}},{"id":440,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":439,"kind":"app","opcode":"with","args":[{"id":438,"kind":"app","opcode":"with","args":[{"id":437,"kind":"name","name":"test_record"},{"id":434,"kind":"str","value":"name"},{"id":433,"kind":"str","value":"quint"}]},{"id":436,"kind":"str","value":"year"},{"id":435,"kind":"int","value":2023}]}},{"id":456,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":455,"kind":"let","opdef":{"id":451,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":450,"kind":"app","opcode":"Rec","args":[{"id":447,"kind":"str","value":"a"},{"id":446,"kind":"int","value":1},{"id":449,"kind":"str","value":"b"},{"id":448,"kind":"str","value":"foo"}]}},"expr":{"id":454,"kind":"app","opcode":"field","args":[{"id":452,"kind":"name","name":"my_rec"},{"id":453,"kind":"str","value":"a"}]}}},{"id":465,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":464,"kind":"let","opdef":{"id":460,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":459,"kind":"app","opcode":"Tup","args":[{"id":457,"kind":"str","value":"a"},{"id":458,"kind":"int","value":3}]}},"expr":{"id":463,"kind":"app","opcode":"item","args":[{"id":461,"kind":"name","name":"my_tup"},{"id":462,"kind":"int","value":2}]}}},{"id":470,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":470,"kind":"lambda","params":[{"id":466,"name":"s"}],"qualifier":"def","expr":{"id":469,"kind":"app","opcode":"eq","args":[{"id":467,"kind":"name","name":"s"},{"id":468,"kind":"app","opcode":"List","args":[]}]}}},{"id":491,"kind":"assume","name":"positive","assumption":{"id":490,"kind":"app","opcode":"igt","args":[{"id":488,"kind":"name","name":"N"},{"id":489,"kind":"int","value":0}]}},{"id":495,"kind":"assume","name":"_","assumption":{"id":494,"kind":"app","opcode":"neq","args":[{"id":492,"kind":"name","name":"N"},{"id":493,"kind":"int","value":0}]}},{"id":496,"kind":"import","defName":"foo","protoName":"M1"},{"id":497,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":502,"kind":"const","name":"INT_SET"},"id":503},{"id":506,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":505,"name":"N"},{"id":504,"kind":"name","name":"N"}]],"identityOverride":false},{"id":69,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":69,"kind":"lambda","params":[{"id":71,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":73,"kind":"app","opcode":"variant","args":[{"id":70,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":72}]}}},{"id":74,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":74,"kind":"lambda","params":[{"id":76,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":78,"kind":"app","opcode":"variant","args":[{"id":75,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":77}]}}},{"id":79,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":79,"kind":"lambda","params":[{"id":81,"name":"__DogParam"}],"qualifier":"def","expr":{"id":83,"kind":"app","opcode":"variant","args":[{"id":80,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":82}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":84,"kind":"const","name":"MyUnionType"},"id":85},{"id":248,"kind":"def","name":"G","qualifier":"def","expr":{"id":248,"kind":"lambda","params":[{"id":242,"name":"x"}],"qualifier":"def","expr":{"id":247,"kind":"app","opcode":"and","args":[{"id":244,"kind":"app","opcode":"F","args":[{"id":243,"kind":"name","name":"x"}]},{"id":246,"kind":"app","opcode":"not","args":[{"id":245,"kind":"name","name":"x"}]}]}}},{"id":255,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":255,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":254,"kind":"app","opcode":"and","args":[{"id":251,"kind":"app","opcode":"F","args":[{"id":250,"kind":"name","name":"x"}]},{"id":253,"kind":"app","opcode":"not","args":[{"id":252,"kind":"name","name":"x"}]}]}}},{"id":262,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":262,"kind":"lambda","params":[{"id":256,"name":"x"}],"qualifier":"def","expr":{"id":261,"kind":"app","opcode":"or","args":[{"id":258,"kind":"app","opcode":"F","args":[{"id":257,"kind":"name","name":"x"}]},{"id":260,"kind":"app","opcode":"not","args":[{"id":259,"kind":"name","name":"x"}]}]}}},{"id":352,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":351,"kind":"app","opcode":"map","args":[{"id":335,"kind":"app","opcode":"tuples","args":[{"id":333,"kind":"name","name":"S"},{"id":334,"kind":"name","name":"MySet"}]},{"id":350,"kind":"lambda","params":[{"id":341,"name":"quintTupledLambdaParam341"}],"qualifier":"def","expr":{"id":346,"kind":"let","opdef":{"id":337,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":347,"kind":"app","opcode":"item","args":[{"id":348,"kind":"name","name":"quintTupledLambdaParam341"},{"id":349,"kind":"int","value":2}]}},"expr":{"id":342,"kind":"let","opdef":{"id":336,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":343,"kind":"app","opcode":"item","args":[{"id":344,"kind":"name","name":"quintTupledLambdaParam341"},{"id":345,"kind":"int","value":1}]}},"expr":{"id":340,"kind":"app","opcode":"iadd","args":[{"id":338,"kind":"name","name":"s"},{"id":339,"kind":"name","name":"mys"}]}}}}]}},{"id":364,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":363,"kind":"let","opdef":{"id":355,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":354,"kind":"app","opcode":"oneOf","args":[{"id":353,"kind":"name","name":"S"}]}},"expr":{"id":362,"kind":"app","opcode":"actionAll","args":[{"id":358,"kind":"app","opcode":"igt","args":[{"id":356,"kind":"name","name":"x"},{"id":357,"kind":"int","value":10}]},{"id":361,"kind":"app","opcode":"assign","args":[{"id":360,"kind":"name","name":"k"},{"id":359,"kind":"name","name":"x"}]}]}}}]}],"table":{"68":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"72":{"id":71,"name":"__CircleParam","kind":"param"},"77":{"id":76,"name":"__RectangleParam","kind":"param"},"82":{"id":81,"name":"__DogParam","kind":"param"},"84":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"153":{"id":152,"name":"x","kind":"param"},"164":{"id":163,"kind":"typedef","name":"PROC"},"174":{"id":172,"name":"x","kind":"param"},"175":{"id":173,"name":"y","kind":"param"},"179":{"id":178,"name":"factor","kind":"param"},"180":{"kind":"var","name":"n","typeAnnotation":{"id":168,"kind":"int"},"id":169},"184":{"id":183,"name":"x","kind":"param"},"185":{"kind":"var","name":"n","typeAnnotation":{"id":168,"kind":"int"},"id":169},"189":{"id":188,"name":"x","kind":"param"},"198":{"id":192,"name":"x","kind":"param"},"199":{"id":193,"name":"y","kind":"param"},"206":{"id":202,"name":"x","kind":"param"},"211":{"kind":"var","name":"k","typeAnnotation":{"id":208,"kind":"int"},"id":209},"219":{"id":214,"name":"x","kind":"param"},"220":{"id":216,"name":"y","kind":"param"},"222":{"id":214,"name":"x","kind":"param"},"223":{"id":216,"name":"y","kind":"param"},"240":{"id":239,"name":"x","kind":"param"},"243":{"id":242,"name":"x","kind":"param"},"244":{"id":241,"kind":"def","name":"F","qualifier":"def","expr":{"id":241,"kind":"lambda","params":[{"id":239,"name":"x"}],"qualifier":"def","expr":{"id":240,"kind":"name","name":"x"}},"depth":0},"245":{"id":242,"name":"x","kind":"param"},"250":{"id":249,"name":"x","kind":"param"},"251":{"id":241,"kind":"def","name":"F","qualifier":"def","expr":{"id":241,"kind":"lambda","params":[{"id":239,"name":"x"}],"qualifier":"def","expr":{"id":240,"kind":"name","name":"x"}},"depth":0},"252":{"id":249,"name":"x","kind":"param"},"257":{"id":256,"name":"x","kind":"param"},"258":{"id":241,"kind":"def","name":"F","qualifier":"def","expr":{"id":241,"kind":"lambda","params":[{"id":239,"name":"x"}],"qualifier":"def","expr":{"id":240,"kind":"name","name":"x"}},"depth":0},"259":{"id":256,"name":"x","kind":"param"},"290":{"id":288,"name":"x","kind":"param"},"293":{"id":289,"name":"y","kind":"param"},"296":{"id":289,"name":"y","kind":"param"},"305":{"kind":"var","name":"f1","typeAnnotation":{"id":303,"kind":"fun","arg":{"id":301,"kind":"str"},"res":{"id":302,"kind":"int"}},"id":304},"315":{"id":312,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":312,"kind":"lambda","params":[{"id":309,"name":"a"},{"id":310,"name":"b"}],"qualifier":"def","expr":{"id":311,"kind":"int","value":1}},"depth":0},"319":{"id":312,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":312,"kind":"lambda","params":[{"id":309,"name":"a"},{"id":310,"name":"b"}],"qualifier":"def","expr":{"id":311,"kind":"int","value":1}},"depth":0},"325":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"327":{"id":326,"name":"x","kind":"param"},"333":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"334":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},"338":{"id":336,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":343,"kind":"app","opcode":"item","args":[{"id":344,"kind":"name","name":"quintTupledLambdaParam341"},{"id":345,"kind":"int","value":1}]},"depth":1},"339":{"id":337,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":347,"kind":"app","opcode":"item","args":[{"id":348,"kind":"name","name":"quintTupledLambdaParam341"},{"id":349,"kind":"int","value":2}]},"depth":1},"344":{"id":341,"name":"quintTupledLambdaParam341","kind":"param"},"348":{"id":341,"name":"quintTupledLambdaParam341","kind":"param"},"353":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"356":{"id":355,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":354,"kind":"app","opcode":"oneOf","args":[{"id":353,"kind":"name","name":"S"}]},"depth":1},"359":{"id":355,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":354,"kind":"app","opcode":"oneOf","args":[{"id":353,"kind":"name","name":"S"}]},"depth":1},"360":{"kind":"var","name":"k","typeAnnotation":{"id":208,"kind":"int"},"id":209},"365":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"371":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"373":{"id":372,"name":"x","kind":"param"},"379":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"437":{"id":426,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":425,"kind":"app","opcode":"Rec","args":[{"id":422,"kind":"str","value":"name"},{"id":421,"kind":"str","value":"igor"},{"id":424,"kind":"str","value":"year"},{"id":423,"kind":"int","value":1981}]},"depth":0},"452":{"id":451,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":450,"kind":"app","opcode":"Rec","args":[{"id":447,"kind":"str","value":"a"},{"id":446,"kind":"int","value":1},{"id":449,"kind":"str","value":"b"},{"id":448,"kind":"str","value":"foo"}]},"depth":1},"461":{"id":460,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":459,"kind":"app","opcode":"Tup","args":[{"id":457,"kind":"str","value":"a"},{"id":458,"kind":"int","value":3}]},"depth":1},"467":{"id":466,"name":"s","kind":"param"},"488":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"492":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"502":{"id":500,"kind":"typedef","name":"INT_SET","type":{"id":499,"kind":"set","elem":{"id":498,"kind":"int"}}},"504":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"505":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":504,"importedFrom":{"id":506,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":505,"name":"N"},{"id":504,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/SuperSpec.map.json b/quint/testFixture/SuperSpec.map.json index 54d6d710d..659e2c8fa 100644 --- a/quint/testFixture/SuperSpec.map.json +++ b/quint/testFixture/SuperSpec.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/SuperSpec.qnt"},"map":{"1":[0,{"line":1,"col":12,"index":24},{"line":1,"col":12,"index":24}],"2":[0,{"line":1,"col":2,"index":14},{"line":1,"col":12,"index":24}],"3":[0,{"line":0,"col":0,"index":0},{"line":2,"col":26,"index":26}],"4":[0,{"line":5,"col":12,"index":53},{"line":5,"col":12,"index":53}],"5":[0,{"line":5,"col":2,"index":43},{"line":5,"col":12,"index":53}],"6":[0,{"line":4,"col":0,"index":29},{"line":6,"col":26,"index":55}],"7":[0,{"line":9,"col":11,"index":84},{"line":9,"col":13,"index":86}],"8":[0,{"line":9,"col":2,"index":75},{"line":9,"col":13,"index":86}],"9":[0,{"line":10,"col":9,"index":97},{"line":10,"col":11,"index":99}],"10":[0,{"line":10,"col":2,"index":90},{"line":10,"col":11,"index":99}],"11":[0,{"line":8,"col":0,"index":58},{"line":11,"col":43,"index":101}],"12":[0,{"line":16,"col":11,"index":186},{"line":16,"col":13,"index":188}],"13":[0,{"line":16,"col":2,"index":177},{"line":16,"col":13,"index":188}],"14":[0,{"line":17,"col":15,"index":205},{"line":17,"col":17,"index":207}],"15":[0,{"line":17,"col":11,"index":201},{"line":17,"col":18,"index":208}],"16":[0,{"line":17,"col":2,"index":192},{"line":17,"col":18,"index":208}],"17":[0,{"line":18,"col":19,"index":229},{"line":18,"col":21,"index":231}],"18":[0,{"line":18,"col":15,"index":225},{"line":18,"col":22,"index":232}],"19":[0,{"line":18,"col":2,"index":212},{"line":18,"col":22,"index":232}],"20":[0,{"line":19,"col":20,"index":254},{"line":19,"col":23,"index":257}],"21":[0,{"line":19,"col":15,"index":249},{"line":19,"col":24,"index":258}],"22":[0,{"line":19,"col":2,"index":236},{"line":19,"col":24,"index":258}],"23":[0,{"line":20,"col":15,"index":275},{"line":20,"col":17,"index":277}],"24":[0,{"line":20,"col":22,"index":282},{"line":20,"col":24,"index":284}],"25":[0,{"line":20,"col":15,"index":275},{"line":20,"col":24,"index":284}],"26":[0,{"line":20,"col":2,"index":262},{"line":20,"col":24,"index":284}],"27":[0,{"line":21,"col":19,"index":305},{"line":21,"col":21,"index":307}],"28":[0,{"line":21,"col":26,"index":312},{"line":21,"col":28,"index":314}],"29":[0,{"line":21,"col":19,"index":305},{"line":21,"col":28,"index":314}],"30":[0,{"line":21,"col":34,"index":320},{"line":21,"col":37,"index":323}],"31":[0,{"line":21,"col":18,"index":304},{"line":21,"col":37,"index":323}],"32":[0,{"line":21,"col":2,"index":288},{"line":21,"col":37,"index":323}],"33":[0,{"line":22,"col":21,"index":346},{"line":22,"col":23,"index":348}],"34":[0,{"line":22,"col":26,"index":351},{"line":22,"col":28,"index":353}],"35":[0,{"line":22,"col":34,"index":359},{"line":22,"col":37,"index":362}],"36":[0,{"line":22,"col":20,"index":345},{"line":22,"col":37,"index":362}],"37":[0,{"line":22,"col":2,"index":327},{"line":22,"col":37,"index":362}],"38":[0,{"line":23,"col":30,"index":394},{"line":23,"col":32,"index":396}],"39":[0,{"line":23,"col":35,"index":399},{"line":23,"col":37,"index":401}],"40":[0,{"line":23,"col":45,"index":409},{"line":23,"col":48,"index":412}],"41":[0,{"line":23,"col":29,"index":393},{"line":23,"col":48,"index":412}],"42":[0,{"line":23,"col":2,"index":366},{"line":23,"col":48,"index":412}],"43":[0,{"line":24,"col":18,"index":432},{"line":24,"col":20,"index":434}],"44":[0,{"line":24,"col":23,"index":437},{"line":24,"col":26,"index":440}],"45":[0,{"line":24,"col":29,"index":443},{"line":24,"col":31,"index":445}],"46":[0,{"line":24,"col":17,"index":431},{"line":24,"col":32,"index":446}],"47":[0,{"line":24,"col":2,"index":416},{"line":24,"col":32,"index":446}],"48":[0,{"line":25,"col":27,"index":475},{"line":25,"col":29,"index":477}],"49":[0,{"line":25,"col":32,"index":480},{"line":25,"col":35,"index":483}],"50":[0,{"line":25,"col":38,"index":486},{"line":25,"col":40,"index":488}],"51":[0,{"line":25,"col":26,"index":474},{"line":25,"col":43,"index":491}],"52":[0,{"line":25,"col":2,"index":450},{"line":25,"col":43,"index":491}],"53":[0,{"line":28,"col":23,"index":580},{"line":28,"col":25,"index":582}],"54":[0,{"line":28,"col":31,"index":588},{"line":28,"col":34,"index":591}],"55":[0,{"line":28,"col":40,"index":597},{"line":28,"col":42,"index":599}],"56":[0,{"line":28,"col":18,"index":575},{"line":28,"col":44,"index":601}],"57":[0,{"line":28,"col":2,"index":559},{"line":28,"col":44,"index":601}],"58":[0,{"line":29,"col":32,"index":635},{"line":29,"col":34,"index":637}],"59":[0,{"line":29,"col":40,"index":643},{"line":29,"col":43,"index":646}],"60":[0,{"line":29,"col":49,"index":652},{"line":29,"col":51,"index":654}],"61":[0,{"line":29,"col":27,"index":630},{"line":29,"col":54,"index":657}],"62":[0,{"line":29,"col":2,"index":605},{"line":29,"col":54,"index":657}],"63":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"64":[0,{"line":34,"col":26,"index":777},{"line":34,"col":28,"index":779}],"65":[0,{"line":34,"col":39,"index":790},{"line":34,"col":41,"index":792}],"66":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"67":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"68":[0,{"line":32,"col":2,"index":712},{"line":35,"col":102,"index":812}],"69":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"70":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"71":[0,{"line":33,"col":8,"index":739},{"line":33,"col":13,"index":744}],"72":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"73":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"74":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"75":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"76":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"77":[0,{"line":34,"col":8,"index":759},{"line":34,"col":16,"index":767}],"78":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"79":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"80":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"81":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"82":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"83":[0,{"line":35,"col":8,"index":805},{"line":35,"col":10,"index":807}],"84":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"85":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"86":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"87":[0,{"line":36,"col":17,"index":831},{"line":36,"col":27,"index":841}],"88":[0,{"line":36,"col":2,"index":816},{"line":36,"col":27,"index":841}],"89":[0,{"line":41,"col":9,"index":955},{"line":41,"col":11,"index":957}],"90":[0,{"line":41,"col":2,"index":948},{"line":41,"col":11,"index":957}],"91":[0,{"line":42,"col":9,"index":968},{"line":42,"col":12,"index":971}],"92":[0,{"line":42,"col":2,"index":961},{"line":42,"col":12,"index":971}],"93":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":19,"index":1140}],"94":[0,{"line":47,"col":23,"index":1144},{"line":47,"col":23,"index":1144}],"95":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":23,"index":1144}],"96":[0,{"line":47,"col":2,"index":1123},{"line":47,"col":23,"index":1144}],"97":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":19,"index":1165}],"98":[0,{"line":48,"col":23,"index":1169},{"line":48,"col":23,"index":1169}],"99":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":23,"index":1169}],"100":[0,{"line":48,"col":2,"index":1148},{"line":48,"col":23,"index":1169}],"101":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":19,"index":1190}],"102":[0,{"line":49,"col":23,"index":1194},{"line":49,"col":23,"index":1194}],"103":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":23,"index":1194}],"104":[0,{"line":49,"col":2,"index":1173},{"line":49,"col":23,"index":1194}],"105":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":19,"index":1215}],"106":[0,{"line":50,"col":23,"index":1219},{"line":50,"col":23,"index":1219}],"107":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":23,"index":1219}],"108":[0,{"line":50,"col":2,"index":1198},{"line":50,"col":23,"index":1219}],"109":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":19,"index":1240}],"110":[0,{"line":51,"col":23,"index":1244},{"line":51,"col":23,"index":1244}],"111":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":23,"index":1244}],"112":[0,{"line":51,"col":2,"index":1223},{"line":51,"col":23,"index":1244}],"113":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":19,"index":1265}],"114":[0,{"line":52,"col":21,"index":1267},{"line":52,"col":21,"index":1267}],"115":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":21,"index":1267}],"116":[0,{"line":52,"col":2,"index":1248},{"line":52,"col":21,"index":1267}],"117":[0,{"line":53,"col":16,"index":1285},{"line":53,"col":18,"index":1287}],"118":[0,{"line":53,"col":15,"index":1284},{"line":53,"col":18,"index":1287}],"119":[0,{"line":53,"col":2,"index":1271},{"line":53,"col":18,"index":1287}],"120":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":18,"index":1307}],"121":[0,{"line":54,"col":22,"index":1311},{"line":54,"col":22,"index":1311}],"122":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":22,"index":1311}],"123":[0,{"line":54,"col":2,"index":1291},{"line":54,"col":22,"index":1311}],"124":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":18,"index":1331}],"125":[0,{"line":55,"col":23,"index":1336},{"line":55,"col":23,"index":1336}],"126":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":23,"index":1336}],"127":[0,{"line":55,"col":2,"index":1315},{"line":55,"col":23,"index":1336}],"128":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":18,"index":1356}],"129":[0,{"line":56,"col":22,"index":1360},{"line":56,"col":22,"index":1360}],"130":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":22,"index":1360}],"131":[0,{"line":56,"col":2,"index":1340},{"line":56,"col":22,"index":1360}],"132":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":18,"index":1380}],"133":[0,{"line":57,"col":23,"index":1385},{"line":57,"col":23,"index":1385}],"134":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":23,"index":1385}],"135":[0,{"line":57,"col":2,"index":1364},{"line":57,"col":23,"index":1385}],"136":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":20,"index":1407}],"137":[0,{"line":58,"col":25,"index":1412},{"line":58,"col":25,"index":1412}],"138":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":25,"index":1412}],"139":[0,{"line":58,"col":2,"index":1389},{"line":58,"col":25,"index":1412}],"140":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":18,"index":1432}],"141":[0,{"line":59,"col":23,"index":1437},{"line":59,"col":23,"index":1437}],"142":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":23,"index":1437}],"143":[0,{"line":59,"col":2,"index":1416},{"line":59,"col":23,"index":1437}],"144":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":6,"index":1464}],"145":[0,{"line":61,"col":10,"index":1468},{"line":61,"col":10,"index":1468}],"146":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":10,"index":1468}],"147":[0,{"line":61,"col":15,"index":1473},{"line":61,"col":15,"index":1473}],"148":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":15,"index":1473}],"149":[0,{"line":60,"col":2,"index":1441},{"line":62,"col":38,"index":1477}],"150":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":25,"index":1504}],"151":[0,{"line":63,"col":30,"index":1509},{"line":63,"col":32,"index":1511}],"152":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":33,"index":1512}],"153":[0,{"line":63,"col":2,"index":1481},{"line":63,"col":33,"index":1512}],"154":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":26,"index":1540}],"155":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":35,"index":1549}],"156":[0,{"line":64,"col":40,"index":1554},{"line":64,"col":40,"index":1554}],"157":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":40,"index":1554}],"158":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":41,"index":1555}],"159":[0,{"line":64,"col":2,"index":1516},{"line":64,"col":41,"index":1555}],"160":[0,{"line":67,"col":20,"index":1594},{"line":67,"col":22,"index":1596}],"161":[0,{"line":67,"col":16,"index":1590},{"line":67,"col":23,"index":1597}],"162":[0,{"line":67,"col":31,"index":1605},{"line":67,"col":31,"index":1605}],"163":[0,{"line":67,"col":34,"index":1608},{"line":67,"col":34,"index":1608}],"164":[0,{"line":67,"col":27,"index":1601},{"line":67,"col":35,"index":1609}],"165":[0,{"line":67,"col":2,"index":1576},{"line":67,"col":35,"index":1609}],"166":[0,{"line":69,"col":2,"index":1648},{"line":69,"col":10,"index":1656}],"167":[0,{"line":70,"col":33,"index":1691},{"line":70,"col":36,"index":1694}],"168":[0,{"line":70,"col":29,"index":1687},{"line":70,"col":37,"index":1695}],"169":[0,{"line":70,"col":41,"index":1699},{"line":70,"col":45,"index":1703}],"170":[0,{"line":70,"col":2,"index":1660},{"line":70,"col":45,"index":1703}],"171":[0,{"line":73,"col":9,"index":1741},{"line":73,"col":11,"index":1743}],"172":[0,{"line":73,"col":2,"index":1734},{"line":73,"col":11,"index":1743}],"173":[0,{"line":74,"col":25,"index":1770},{"line":74,"col":26,"index":1771}],"174":[0,{"line":74,"col":2,"index":1747},{"line":74,"col":26,"index":1771}],"175":[0,{"line":75,"col":15,"index":1788},{"line":75,"col":15,"index":1788}],"176":[0,{"line":75,"col":18,"index":1791},{"line":75,"col":18,"index":1791}],"177":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":23,"index":1796}],"178":[0,{"line":75,"col":27,"index":1800},{"line":75,"col":27,"index":1800}],"179":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":27,"index":1800}],"180":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"181":[0,{"line":76,"col":10,"index":1812},{"line":76,"col":15,"index":1817}],"182":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":25,"index":1827}],"183":[0,{"line":76,"col":29,"index":1831},{"line":76,"col":29,"index":1831}],"184":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":29,"index":1831}],"185":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"186":[0,{"line":77,"col":11,"index":1844},{"line":77,"col":11,"index":1844}],"187":[0,{"line":77,"col":21,"index":1854},{"line":77,"col":21,"index":1854}],"188":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"189":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"190":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"191":[0,{"line":78,"col":13,"index":1869},{"line":78,"col":13,"index":1869}],"192":[0,{"line":78,"col":22,"index":1878},{"line":78,"col":22,"index":1878}],"193":[0,{"line":78,"col":18,"index":1874},{"line":78,"col":23,"index":1879}],"194":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"195":[0,{"line":81,"col":8,"index":1911},{"line":81,"col":8,"index":1911}],"196":[0,{"line":81,"col":11,"index":1914},{"line":81,"col":11,"index":1914}],"197":[0,{"line":81,"col":16,"index":1919},{"line":81,"col":18,"index":1921}],"198":[0,{"line":81,"col":21,"index":1924},{"line":81,"col":23,"index":1926}],"199":[0,{"line":81,"col":29,"index":1932},{"line":81,"col":31,"index":1934}],"200":[0,{"line":81,"col":15,"index":1918},{"line":81,"col":31,"index":1934}],"201":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":6,"index":1946}],"202":[0,{"line":82,"col":10,"index":1950},{"line":82,"col":10,"index":1950}],"203":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":10,"index":1950}],"204":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"205":[0,{"line":85,"col":10,"index":1997},{"line":85,"col":10,"index":1997}],"206":[0,{"line":85,"col":15,"index":2002},{"line":85,"col":15,"index":2002}],"207":[0,{"line":85,"col":21,"index":2008},{"line":85,"col":21,"index":2008}],"208":[0,{"line":85,"col":14,"index":2001},{"line":85,"col":21,"index":2008}],"209":[0,{"line":86,"col":6,"index":2020},{"line":86,"col":6,"index":2020}],"210":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"211":[0,{"line":89,"col":9,"index":2036},{"line":89,"col":11,"index":2038}],"212":[0,{"line":89,"col":2,"index":2029},{"line":89,"col":11,"index":2038}],"213":[0,{"line":90,"col":21,"index":2061},{"line":90,"col":21,"index":2061}],"214":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"215":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"216":[0,{"line":90,"col":2,"index":2042},{"line":90,"col":21,"index":2061}],"217":[0,{"line":93,"col":15,"index":2113},{"line":93,"col":15,"index":2113}],"218":[0,{"line":93,"col":18,"index":2116},{"line":93,"col":20,"index":2118}],"219":[0,{"line":93,"col":23,"index":2121},{"line":93,"col":23,"index":2121}],"220":[0,{"line":93,"col":26,"index":2124},{"line":93,"col":28,"index":2126}],"221":[0,{"line":93,"col":32,"index":2130},{"line":93,"col":34,"index":2132}],"222":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":8,"index":2146}],"223":[0,{"line":94,"col":12,"index":2150},{"line":94,"col":12,"index":2150}],"224":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":12,"index":2150}],"225":[0,{"line":95,"col":4,"index":2157},{"line":95,"col":4,"index":2157}],"226":[0,{"line":96,"col":9,"index":2168},{"line":96,"col":9,"index":2168}],"227":[0,{"line":94,"col":4,"index":2142},{"line":96,"col":30,"index":2168}],"228":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"229":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"230":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":21,"index":2220}],"231":[0,{"line":101,"col":27,"index":2226},{"line":101,"col":30,"index":2229}],"232":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":30,"index":2229}],"233":[0,{"line":101,"col":2,"index":2201},{"line":101,"col":30,"index":2229}],"234":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":20,"index":2251}],"235":[0,{"line":102,"col":25,"index":2256},{"line":102,"col":28,"index":2259}],"236":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":28,"index":2259}],"237":[0,{"line":102,"col":2,"index":2233},{"line":102,"col":28,"index":2259}],"238":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":25,"index":2286}],"239":[0,{"line":103,"col":35,"index":2296},{"line":103,"col":38,"index":2299}],"240":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":38,"index":2299}],"241":[0,{"line":103,"col":2,"index":2263},{"line":103,"col":38,"index":2299}],"242":[0,{"line":104,"col":8,"index":2309},{"line":104,"col":8,"index":2309}],"243":[0,{"line":104,"col":13,"index":2314},{"line":104,"col":13,"index":2314}],"244":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"245":[0,{"line":105,"col":8,"index":2324},{"line":105,"col":8,"index":2324}],"246":[0,{"line":105,"col":15,"index":2331},{"line":105,"col":15,"index":2331}],"247":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":16,"index":2332}],"248":[0,{"line":105,"col":26,"index":2342},{"line":105,"col":26,"index":2342}],"249":[0,{"line":105,"col":22,"index":2338},{"line":105,"col":27,"index":2343}],"250":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":27,"index":2343}],"251":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"252":[0,{"line":106,"col":19,"index":2364},{"line":106,"col":19,"index":2364}],"253":[0,{"line":106,"col":26,"index":2371},{"line":106,"col":26,"index":2371}],"254":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":27,"index":2372}],"255":[0,{"line":106,"col":37,"index":2382},{"line":106,"col":37,"index":2382}],"256":[0,{"line":106,"col":33,"index":2378},{"line":106,"col":38,"index":2383}],"257":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":38,"index":2383}],"258":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"259":[0,{"line":107,"col":18,"index":2403},{"line":107,"col":18,"index":2403}],"260":[0,{"line":107,"col":25,"index":2410},{"line":107,"col":25,"index":2410}],"261":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":26,"index":2411}],"262":[0,{"line":107,"col":35,"index":2420},{"line":107,"col":35,"index":2420}],"263":[0,{"line":107,"col":31,"index":2416},{"line":107,"col":36,"index":2421}],"264":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":36,"index":2421}],"265":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"266":[0,{"line":110,"col":6,"index":2459},{"line":110,"col":10,"index":2463}],"267":[0,{"line":111,"col":6,"index":2472},{"line":111,"col":9,"index":2475}],"268":[0,{"line":112,"col":6,"index":2484},{"line":112,"col":10,"index":2488}],"269":[0,{"line":109,"col":23,"index":2447},{"line":113,"col":68,"index":2492}],"270":[0,{"line":109,"col":2,"index":2426},{"line":113,"col":68,"index":2492}],"271":[0,{"line":116,"col":6,"index":2534},{"line":116,"col":10,"index":2538}],"272":[0,{"line":117,"col":6,"index":2547},{"line":117,"col":9,"index":2550}],"273":[0,{"line":118,"col":6,"index":2559},{"line":118,"col":10,"index":2563}],"274":[0,{"line":115,"col":27,"index":2522},{"line":119,"col":72,"index":2567}],"275":[0,{"line":115,"col":2,"index":2497},{"line":119,"col":72,"index":2567}],"276":[0,{"line":122,"col":6,"index":2603},{"line":122,"col":10,"index":2607}],"277":[0,{"line":123,"col":6,"index":2616},{"line":123,"col":9,"index":2619}],"278":[0,{"line":124,"col":6,"index":2628},{"line":124,"col":10,"index":2632}],"279":[0,{"line":121,"col":22,"index":2592},{"line":125,"col":66,"index":2636}],"280":[0,{"line":121,"col":2,"index":2572},{"line":125,"col":66,"index":2636}],"281":[0,{"line":128,"col":6,"index":2677},{"line":128,"col":10,"index":2681}],"282":[0,{"line":129,"col":6,"index":2690},{"line":129,"col":9,"index":2693}],"283":[0,{"line":130,"col":6,"index":2702},{"line":130,"col":10,"index":2706}],"284":[0,{"line":127,"col":26,"index":2665},{"line":131,"col":71,"index":2710}],"285":[0,{"line":127,"col":2,"index":2641},{"line":131,"col":71,"index":2710}],"286":[0,{"line":133,"col":21,"index":2734},{"line":133,"col":24,"index":2737}],"287":[0,{"line":133,"col":27,"index":2740},{"line":133,"col":27,"index":2740}],"288":[0,{"line":133,"col":34,"index":2747},{"line":133,"col":34,"index":2747}],"289":[0,{"line":133,"col":17,"index":2730},{"line":133,"col":34,"index":2747}],"290":[0,{"line":133,"col":2,"index":2715},{"line":133,"col":34,"index":2747}],"291":[0,{"line":134,"col":16,"index":2765},{"line":134,"col":16,"index":2765}],"292":[0,{"line":134,"col":19,"index":2768},{"line":134,"col":19,"index":2768}],"293":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":28,"index":2777}],"294":[0,{"line":134,"col":32,"index":2781},{"line":134,"col":33,"index":2782}],"295":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":33,"index":2782}],"296":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":36,"index":2785}],"297":[0,{"line":134,"col":40,"index":2789},{"line":134,"col":40,"index":2789}],"298":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":40,"index":2789}],"299":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":47,"index":2796}],"300":[0,{"line":134,"col":51,"index":2800},{"line":134,"col":51,"index":2800}],"301":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":51,"index":2800}],"302":[0,{"line":134,"col":24,"index":2773},{"line":134,"col":51,"index":2800}],"303":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"304":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":12,"index":2841}],"305":[0,{"line":137,"col":17,"index":2846},{"line":137,"col":19,"index":2848}],"306":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":19,"index":2848}],"307":[0,{"line":137,"col":2,"index":2831},{"line":137,"col":19,"index":2848}],"308":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":16,"index":2866}],"309":[0,{"line":138,"col":22,"index":2872},{"line":138,"col":24,"index":2874}],"310":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":25,"index":2875}],"311":[0,{"line":138,"col":2,"index":2852},{"line":138,"col":25,"index":2875}],"312":[0,{"line":141,"col":13,"index":2939},{"line":141,"col":13,"index":2939}],"313":[0,{"line":141,"col":16,"index":2942},{"line":141,"col":16,"index":2942}],"314":[0,{"line":141,"col":21,"index":2947},{"line":141,"col":21,"index":2947}],"315":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"316":[0,{"line":142,"col":31,"index":2980},{"line":142,"col":33,"index":2982}],"317":[0,{"line":142,"col":36,"index":2985},{"line":142,"col":37,"index":2986}],"318":[0,{"line":142,"col":24,"index":2973},{"line":142,"col":38,"index":2987}],"319":[0,{"line":142,"col":2,"index":2951},{"line":142,"col":38,"index":2987}],"320":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":24,"index":3013}],"321":[0,{"line":143,"col":33,"index":3022},{"line":143,"col":34,"index":3023}],"322":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":35,"index":3024}],"323":[0,{"line":143,"col":2,"index":2991},{"line":143,"col":35,"index":3024}],"324":[0,{"line":145,"col":19,"index":3102},{"line":145,"col":19,"index":3102}],"325":[0,{"line":145,"col":22,"index":3105},{"line":145,"col":26,"index":3109}],"326":[0,{"line":145,"col":16,"index":3099},{"line":145,"col":27,"index":3110}],"327":[0,{"line":145,"col":2,"index":3085},{"line":145,"col":27,"index":3110}],"328":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":22,"index":3279}],"329":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":31,"index":3288}],"330":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":36,"index":3293}],"331":[0,{"line":150,"col":40,"index":3297},{"line":150,"col":41,"index":3298}],"332":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":41,"index":3298}],"333":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":41,"index":3298}],"334":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":42,"index":3299}],"335":[0,{"line":150,"col":2,"index":3259},{"line":150,"col":42,"index":3299}],"336":[0,{"line":152,"col":25,"index":3356},{"line":152,"col":25,"index":3356}],"337":[0,{"line":152,"col":28,"index":3359},{"line":152,"col":32,"index":3363}],"338":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":33,"index":3364}],"339":[0,{"line":152,"col":42,"index":3373},{"line":152,"col":42,"index":3373}],"340":[0,{"line":152,"col":45,"index":3376},{"line":152,"col":47,"index":3378}],"341":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":54,"index":3385}],"342":[0,{"line":152,"col":58,"index":3389},{"line":152,"col":60,"index":3391}],"343":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":60,"index":3391}],"344":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"345":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"346":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"347":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"348":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"349":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"350":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"351":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"352":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"353":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"354":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":62,"index":3393}],"355":[0,{"line":152,"col":2,"index":3333},{"line":152,"col":62,"index":3393}],"356":[0,{"line":155,"col":21,"index":3458},{"line":155,"col":21,"index":3458}],"357":[0,{"line":155,"col":15,"index":3452},{"line":155,"col":22,"index":3459}],"358":[0,{"line":155,"col":4,"index":3441},{"line":155,"col":22,"index":3459}],"359":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":6,"index":3477}],"360":[0,{"line":157,"col":10,"index":3481},{"line":157,"col":11,"index":3482}],"361":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":11,"index":3482}],"362":[0,{"line":158,"col":11,"index":3496},{"line":158,"col":11,"index":3496}],"363":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"364":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"365":[0,{"line":156,"col":4,"index":3465},{"line":159,"col":41,"index":3502}],"366":[0,{"line":155,"col":4,"index":3441},{"line":159,"col":65,"index":3502}],"367":[0,{"line":154,"col":2,"index":3414},{"line":160,"col":94,"index":3506}],"368":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":22,"index":3545}],"369":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":31,"index":3554}],"370":[0,{"line":162,"col":36,"index":3559},{"line":162,"col":39,"index":3562}],"371":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":39,"index":3562}],"372":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":40,"index":3563}],"373":[0,{"line":162,"col":2,"index":3525},{"line":162,"col":40,"index":3563}],"374":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":10,"index":3576}],"375":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":18,"index":3584}],"376":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":23,"index":3589}],"377":[0,{"line":164,"col":27,"index":3593},{"line":164,"col":27,"index":3593}],"378":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":27,"index":3593}],"379":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":27,"index":3593}],"380":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":28,"index":3594}],"381":[0,{"line":164,"col":2,"index":3568},{"line":164,"col":28,"index":3594}],"382":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":23,"index":3620}],"383":[0,{"line":166,"col":37,"index":3634},{"line":166,"col":37,"index":3634}],"384":[0,{"line":166,"col":40,"index":3637},{"line":166,"col":40,"index":3637}],"385":[0,{"line":166,"col":33,"index":3630},{"line":166,"col":41,"index":3638}],"386":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":42,"index":3639}],"387":[0,{"line":166,"col":2,"index":3599},{"line":166,"col":42,"index":3639}],"388":[0,{"line":169,"col":17,"index":3698},{"line":169,"col":17,"index":3698}],"389":[0,{"line":169,"col":20,"index":3701},{"line":169,"col":20,"index":3701}],"390":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":21,"index":3702}],"391":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":28,"index":3709}],"392":[0,{"line":169,"col":2,"index":3683},{"line":169,"col":28,"index":3709}],"393":[0,{"line":172,"col":20,"index":3753},{"line":172,"col":20,"index":3753}],"394":[0,{"line":172,"col":23,"index":3756},{"line":172,"col":23,"index":3756}],"395":[0,{"line":172,"col":26,"index":3759},{"line":172,"col":26,"index":3759}],"396":[0,{"line":172,"col":19,"index":3752},{"line":172,"col":27,"index":3760}],"397":[0,{"line":172,"col":2,"index":3735},{"line":172,"col":27,"index":3760}],"398":[0,{"line":173,"col":24,"index":3786},{"line":173,"col":24,"index":3786}],"399":[0,{"line":173,"col":27,"index":3789},{"line":173,"col":27,"index":3789}],"400":[0,{"line":173,"col":30,"index":3792},{"line":173,"col":30,"index":3792}],"401":[0,{"line":173,"col":20,"index":3782},{"line":173,"col":31,"index":3793}],"402":[0,{"line":173,"col":2,"index":3764},{"line":173,"col":31,"index":3793}],"403":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":18,"index":3813}],"404":[0,{"line":174,"col":23,"index":3818},{"line":174,"col":23,"index":3818}],"405":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":23,"index":3818}],"406":[0,{"line":174,"col":2,"index":3797},{"line":174,"col":23,"index":3818}],"407":[0,{"line":175,"col":19,"index":3839},{"line":175,"col":19,"index":3839}],"408":[0,{"line":175,"col":22,"index":3842},{"line":175,"col":22,"index":3842}],"409":[0,{"line":175,"col":25,"index":3845},{"line":175,"col":25,"index":3845}],"410":[0,{"line":175,"col":18,"index":3838},{"line":175,"col":26,"index":3846}],"411":[0,{"line":175,"col":2,"index":3822},{"line":175,"col":26,"index":3846}],"412":[0,{"line":176,"col":24,"index":3872},{"line":176,"col":24,"index":3872}],"413":[0,{"line":176,"col":27,"index":3875},{"line":176,"col":27,"index":3875}],"414":[0,{"line":176,"col":30,"index":3878},{"line":176,"col":30,"index":3878}],"415":[0,{"line":176,"col":19,"index":3867},{"line":176,"col":31,"index":3879}],"416":[0,{"line":176,"col":2,"index":3850},{"line":176,"col":31,"index":3879}],"417":[0,{"line":177,"col":23,"index":3904},{"line":177,"col":23,"index":3904}],"418":[0,{"line":177,"col":26,"index":3907},{"line":177,"col":26,"index":3907}],"419":[0,{"line":177,"col":29,"index":3910},{"line":177,"col":29,"index":3910}],"420":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":30,"index":3911}],"421":[0,{"line":177,"col":32,"index":3913},{"line":177,"col":32,"index":3913}],"422":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":33,"index":3914}],"423":[0,{"line":177,"col":2,"index":3883},{"line":177,"col":33,"index":3914}],"424":[0,{"line":178,"col":28,"index":3944},{"line":178,"col":33,"index":3949}],"425":[0,{"line":178,"col":22,"index":3938},{"line":178,"col":33,"index":3949}],"426":[0,{"line":178,"col":42,"index":3958},{"line":178,"col":45,"index":3961}],"427":[0,{"line":178,"col":36,"index":3952},{"line":178,"col":45,"index":3961}],"428":[0,{"line":178,"col":20,"index":3936},{"line":178,"col":47,"index":3963}],"429":[0,{"line":178,"col":2,"index":3918},{"line":178,"col":47,"index":3963}],"430":[0,{"line":179,"col":25,"index":3990},{"line":179,"col":30,"index":3995}],"431":[0,{"line":179,"col":33,"index":3998},{"line":179,"col":38,"index":4003}],"432":[0,{"line":179,"col":41,"index":4006},{"line":179,"col":46,"index":4011}],"433":[0,{"line":179,"col":49,"index":4014},{"line":179,"col":52,"index":4017}],"434":[0,{"line":179,"col":21,"index":3986},{"line":179,"col":53,"index":4018}],"435":[0,{"line":179,"col":2,"index":3967},{"line":179,"col":53,"index":4018}],"436":[0,{"line":180,"col":29,"index":4049},{"line":180,"col":35,"index":4055}],"437":[0,{"line":180,"col":23,"index":4043},{"line":180,"col":35,"index":4055}],"438":[0,{"line":180,"col":44,"index":4064},{"line":180,"col":47,"index":4067}],"439":[0,{"line":180,"col":38,"index":4058},{"line":180,"col":47,"index":4067}],"440":[0,{"line":180,"col":53,"index":4073},{"line":180,"col":63,"index":4083}],"441":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"442":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"443":[0,{"line":180,"col":2,"index":4022},{"line":180,"col":65,"index":4085}],"444":[0,{"line":181,"col":21,"index":4108},{"line":181,"col":21,"index":4108}],"445":[0,{"line":181,"col":24,"index":4111},{"line":181,"col":24,"index":4111}],"446":[0,{"line":181,"col":27,"index":4114},{"line":181,"col":27,"index":4114}],"447":[0,{"line":181,"col":17,"index":4104},{"line":181,"col":28,"index":4115}],"448":[0,{"line":181,"col":2,"index":4089},{"line":181,"col":28,"index":4115}],"449":[0,{"line":185,"col":22,"index":4187},{"line":185,"col":22,"index":4187}],"450":[0,{"line":185,"col":19,"index":4184},{"line":185,"col":22,"index":4187}],"451":[0,{"line":185,"col":28,"index":4193},{"line":185,"col":32,"index":4197}],"452":[0,{"line":185,"col":25,"index":4190},{"line":185,"col":32,"index":4197}],"453":[0,{"line":185,"col":17,"index":4182},{"line":185,"col":34,"index":4199}],"454":[0,{"line":185,"col":4,"index":4169},{"line":185,"col":34,"index":4199}],"455":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":9,"index":4210}],"456":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"457":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"458":[0,{"line":185,"col":4,"index":4169},{"line":186,"col":47,"index":4212}],"459":[0,{"line":184,"col":2,"index":4149},{"line":186,"col":65,"index":4212}],"460":[0,{"line":189,"col":21,"index":4253},{"line":189,"col":23,"index":4255}],"461":[0,{"line":189,"col":26,"index":4258},{"line":189,"col":26,"index":4258}],"462":[0,{"line":189,"col":17,"index":4249},{"line":189,"col":27,"index":4259}],"463":[0,{"line":189,"col":4,"index":4236},{"line":189,"col":27,"index":4259}],"464":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":9,"index":4270}],"465":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"466":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"467":[0,{"line":189,"col":4,"index":4236},{"line":190,"col":41,"index":4273}],"468":[0,{"line":188,"col":2,"index":4217},{"line":190,"col":58,"index":4273}],"469":[0,{"line":192,"col":14,"index":4290},{"line":192,"col":14,"index":4290}],"470":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":19,"index":4295}],"471":[0,{"line":192,"col":24,"index":4300},{"line":192,"col":25,"index":4301}],"472":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":25,"index":4301}],"473":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"474":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":19,"index":4349}],"475":[0,{"line":195,"col":24,"index":4354},{"line":195,"col":28,"index":4358}],"476":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":29,"index":4359}],"477":[0,{"line":195,"col":2,"index":4332},{"line":195,"col":29,"index":4359}],"478":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":27,"index":4388}],"479":[0,{"line":196,"col":38,"index":4399},{"line":196,"col":42,"index":4403}],"480":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":43,"index":4404}],"481":[0,{"line":196,"col":2,"index":4363},{"line":196,"col":43,"index":4404}],"482":[0,{"line":197,"col":22,"index":4428},{"line":197,"col":22,"index":4428}],"483":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":23,"index":4429}],"484":[0,{"line":197,"col":41,"index":4447},{"line":197,"col":41,"index":4447}],"485":[0,{"line":197,"col":43,"index":4449},{"line":197,"col":43,"index":4449}],"486":[0,{"line":197,"col":45,"index":4451},{"line":197,"col":45,"index":4451}],"487":[0,{"line":197,"col":37,"index":4443},{"line":197,"col":46,"index":4452}],"488":[0,{"line":197,"col":28,"index":4434},{"line":197,"col":47,"index":4453}],"489":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":48,"index":4454}],"490":[0,{"line":197,"col":2,"index":4408},{"line":197,"col":48,"index":4454}],"491":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":20,"index":4501}],"492":[0,{"line":200,"col":24,"index":4505},{"line":200,"col":24,"index":4505}],"493":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":24,"index":4505}],"494":[0,{"line":200,"col":2,"index":4483},{"line":200,"col":24,"index":4505}],"495":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":13,"index":4549}],"496":[0,{"line":202,"col":18,"index":4554},{"line":202,"col":18,"index":4554}],"497":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":18,"index":4554}],"498":[0,{"line":202,"col":2,"index":4538},{"line":202,"col":18,"index":4554}],"499":[0,{"line":205,"col":2,"index":4572},{"line":205,"col":14,"index":4584}],"500":[0,{"line":206,"col":2,"index":4588},{"line":206,"col":12,"index":4598}],"501":[0,{"line":209,"col":21,"index":4636},{"line":209,"col":23,"index":4638}],"502":[0,{"line":209,"col":17,"index":4632},{"line":209,"col":24,"index":4639}],"503":[0,{"line":209,"col":2,"index":4617},{"line":209,"col":24,"index":4639}],"504":[0,{"line":211,"col":2,"index":4644},{"line":211,"col":24,"index":4666}],"505":[0,{"line":213,"col":10,"index":4679},{"line":213,"col":16,"index":4685}],"506":[0,{"line":213,"col":2,"index":4671},{"line":213,"col":16,"index":4685}],"507":[0,{"line":221,"col":19,"index":4906},{"line":221,"col":19,"index":4906}],"508":[0,{"line":221,"col":15,"index":4902},{"line":221,"col":15,"index":4902}],"509":[0,{"line":221,"col":2,"index":4889},{"line":221,"col":29,"index":4916}],"510":[0,{"line":14,"col":0,"index":140},{"line":225,"col":4855,"index":4995}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/SuperSpec.qnt"},"map":{"1":[0,{"line":1,"col":12,"index":24},{"line":1,"col":12,"index":24}],"2":[0,{"line":1,"col":2,"index":14},{"line":1,"col":12,"index":24}],"3":[0,{"line":0,"col":0,"index":0},{"line":2,"col":26,"index":26}],"4":[0,{"line":5,"col":12,"index":53},{"line":5,"col":12,"index":53}],"5":[0,{"line":5,"col":2,"index":43},{"line":5,"col":12,"index":53}],"6":[0,{"line":4,"col":0,"index":29},{"line":6,"col":26,"index":55}],"7":[0,{"line":9,"col":11,"index":84},{"line":9,"col":13,"index":86}],"8":[0,{"line":9,"col":2,"index":75},{"line":9,"col":13,"index":86}],"9":[0,{"line":10,"col":9,"index":97},{"line":10,"col":11,"index":99}],"10":[0,{"line":10,"col":2,"index":90},{"line":10,"col":11,"index":99}],"11":[0,{"line":8,"col":0,"index":58},{"line":11,"col":43,"index":101}],"12":[0,{"line":16,"col":11,"index":186},{"line":16,"col":13,"index":188}],"13":[0,{"line":16,"col":2,"index":177},{"line":16,"col":13,"index":188}],"14":[0,{"line":17,"col":15,"index":205},{"line":17,"col":17,"index":207}],"15":[0,{"line":17,"col":11,"index":201},{"line":17,"col":18,"index":208}],"16":[0,{"line":17,"col":2,"index":192},{"line":17,"col":18,"index":208}],"17":[0,{"line":18,"col":19,"index":229},{"line":18,"col":21,"index":231}],"18":[0,{"line":18,"col":15,"index":225},{"line":18,"col":22,"index":232}],"19":[0,{"line":18,"col":2,"index":212},{"line":18,"col":22,"index":232}],"20":[0,{"line":19,"col":20,"index":254},{"line":19,"col":23,"index":257}],"21":[0,{"line":19,"col":15,"index":249},{"line":19,"col":24,"index":258}],"22":[0,{"line":19,"col":2,"index":236},{"line":19,"col":24,"index":258}],"23":[0,{"line":20,"col":15,"index":275},{"line":20,"col":17,"index":277}],"24":[0,{"line":20,"col":22,"index":282},{"line":20,"col":24,"index":284}],"25":[0,{"line":20,"col":15,"index":275},{"line":20,"col":24,"index":284}],"26":[0,{"line":20,"col":2,"index":262},{"line":20,"col":24,"index":284}],"27":[0,{"line":21,"col":19,"index":305},{"line":21,"col":21,"index":307}],"28":[0,{"line":21,"col":26,"index":312},{"line":21,"col":28,"index":314}],"29":[0,{"line":21,"col":19,"index":305},{"line":21,"col":28,"index":314}],"30":[0,{"line":21,"col":34,"index":320},{"line":21,"col":37,"index":323}],"31":[0,{"line":21,"col":18,"index":304},{"line":21,"col":37,"index":323}],"32":[0,{"line":21,"col":2,"index":288},{"line":21,"col":37,"index":323}],"33":[0,{"line":22,"col":21,"index":346},{"line":22,"col":23,"index":348}],"34":[0,{"line":22,"col":26,"index":351},{"line":22,"col":28,"index":353}],"35":[0,{"line":22,"col":34,"index":359},{"line":22,"col":37,"index":362}],"36":[0,{"line":22,"col":20,"index":345},{"line":22,"col":37,"index":362}],"37":[0,{"line":22,"col":2,"index":327},{"line":22,"col":37,"index":362}],"38":[0,{"line":23,"col":30,"index":394},{"line":23,"col":32,"index":396}],"39":[0,{"line":23,"col":35,"index":399},{"line":23,"col":37,"index":401}],"40":[0,{"line":23,"col":45,"index":409},{"line":23,"col":48,"index":412}],"41":[0,{"line":23,"col":29,"index":393},{"line":23,"col":48,"index":412}],"42":[0,{"line":23,"col":2,"index":366},{"line":23,"col":48,"index":412}],"43":[0,{"line":24,"col":18,"index":432},{"line":24,"col":20,"index":434}],"44":[0,{"line":24,"col":23,"index":437},{"line":24,"col":26,"index":440}],"45":[0,{"line":24,"col":29,"index":443},{"line":24,"col":31,"index":445}],"46":[0,{"line":24,"col":17,"index":431},{"line":24,"col":32,"index":446}],"47":[0,{"line":24,"col":2,"index":416},{"line":24,"col":32,"index":446}],"48":[0,{"line":25,"col":27,"index":475},{"line":25,"col":29,"index":477}],"49":[0,{"line":25,"col":32,"index":480},{"line":25,"col":35,"index":483}],"50":[0,{"line":25,"col":38,"index":486},{"line":25,"col":40,"index":488}],"51":[0,{"line":25,"col":26,"index":474},{"line":25,"col":43,"index":491}],"52":[0,{"line":25,"col":2,"index":450},{"line":25,"col":43,"index":491}],"53":[0,{"line":28,"col":23,"index":580},{"line":28,"col":25,"index":582}],"54":[0,{"line":28,"col":31,"index":588},{"line":28,"col":34,"index":591}],"55":[0,{"line":28,"col":40,"index":597},{"line":28,"col":42,"index":599}],"56":[0,{"line":28,"col":18,"index":575},{"line":28,"col":44,"index":601}],"57":[0,{"line":28,"col":2,"index":559},{"line":28,"col":44,"index":601}],"58":[0,{"line":29,"col":32,"index":635},{"line":29,"col":34,"index":637}],"59":[0,{"line":29,"col":40,"index":643},{"line":29,"col":43,"index":646}],"60":[0,{"line":29,"col":49,"index":652},{"line":29,"col":51,"index":654}],"61":[0,{"line":29,"col":27,"index":630},{"line":29,"col":54,"index":657}],"62":[0,{"line":29,"col":2,"index":605},{"line":29,"col":54,"index":657}],"63":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"64":[0,{"line":34,"col":26,"index":777},{"line":34,"col":28,"index":779}],"65":[0,{"line":34,"col":39,"index":790},{"line":34,"col":41,"index":792}],"66":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"67":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"68":[0,{"line":32,"col":2,"index":712},{"line":35,"col":102,"index":812}],"69":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"70":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"71":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"72":[0,{"line":33,"col":8,"index":739},{"line":33,"col":13,"index":744}],"73":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"74":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"75":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"76":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"77":[0,{"line":34,"col":8,"index":759},{"line":34,"col":16,"index":767}],"78":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"79":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"80":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"81":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"82":[0,{"line":35,"col":8,"index":805},{"line":35,"col":10,"index":807}],"83":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"84":[0,{"line":36,"col":17,"index":831},{"line":36,"col":27,"index":841}],"85":[0,{"line":36,"col":2,"index":816},{"line":36,"col":27,"index":841}],"86":[0,{"line":41,"col":9,"index":955},{"line":41,"col":11,"index":957}],"87":[0,{"line":41,"col":2,"index":948},{"line":41,"col":11,"index":957}],"88":[0,{"line":42,"col":9,"index":968},{"line":42,"col":12,"index":971}],"89":[0,{"line":42,"col":2,"index":961},{"line":42,"col":12,"index":971}],"90":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":19,"index":1140}],"91":[0,{"line":47,"col":23,"index":1144},{"line":47,"col":23,"index":1144}],"92":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":23,"index":1144}],"93":[0,{"line":47,"col":2,"index":1123},{"line":47,"col":23,"index":1144}],"94":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":19,"index":1165}],"95":[0,{"line":48,"col":23,"index":1169},{"line":48,"col":23,"index":1169}],"96":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":23,"index":1169}],"97":[0,{"line":48,"col":2,"index":1148},{"line":48,"col":23,"index":1169}],"98":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":19,"index":1190}],"99":[0,{"line":49,"col":23,"index":1194},{"line":49,"col":23,"index":1194}],"100":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":23,"index":1194}],"101":[0,{"line":49,"col":2,"index":1173},{"line":49,"col":23,"index":1194}],"102":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":19,"index":1215}],"103":[0,{"line":50,"col":23,"index":1219},{"line":50,"col":23,"index":1219}],"104":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":23,"index":1219}],"105":[0,{"line":50,"col":2,"index":1198},{"line":50,"col":23,"index":1219}],"106":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":19,"index":1240}],"107":[0,{"line":51,"col":23,"index":1244},{"line":51,"col":23,"index":1244}],"108":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":23,"index":1244}],"109":[0,{"line":51,"col":2,"index":1223},{"line":51,"col":23,"index":1244}],"110":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":19,"index":1265}],"111":[0,{"line":52,"col":21,"index":1267},{"line":52,"col":21,"index":1267}],"112":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":21,"index":1267}],"113":[0,{"line":52,"col":2,"index":1248},{"line":52,"col":21,"index":1267}],"114":[0,{"line":53,"col":16,"index":1285},{"line":53,"col":18,"index":1287}],"115":[0,{"line":53,"col":15,"index":1284},{"line":53,"col":18,"index":1287}],"116":[0,{"line":53,"col":2,"index":1271},{"line":53,"col":18,"index":1287}],"117":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":18,"index":1307}],"118":[0,{"line":54,"col":22,"index":1311},{"line":54,"col":22,"index":1311}],"119":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":22,"index":1311}],"120":[0,{"line":54,"col":2,"index":1291},{"line":54,"col":22,"index":1311}],"121":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":18,"index":1331}],"122":[0,{"line":55,"col":23,"index":1336},{"line":55,"col":23,"index":1336}],"123":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":23,"index":1336}],"124":[0,{"line":55,"col":2,"index":1315},{"line":55,"col":23,"index":1336}],"125":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":18,"index":1356}],"126":[0,{"line":56,"col":22,"index":1360},{"line":56,"col":22,"index":1360}],"127":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":22,"index":1360}],"128":[0,{"line":56,"col":2,"index":1340},{"line":56,"col":22,"index":1360}],"129":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":18,"index":1380}],"130":[0,{"line":57,"col":23,"index":1385},{"line":57,"col":23,"index":1385}],"131":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":23,"index":1385}],"132":[0,{"line":57,"col":2,"index":1364},{"line":57,"col":23,"index":1385}],"133":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":20,"index":1407}],"134":[0,{"line":58,"col":25,"index":1412},{"line":58,"col":25,"index":1412}],"135":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":25,"index":1412}],"136":[0,{"line":58,"col":2,"index":1389},{"line":58,"col":25,"index":1412}],"137":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":18,"index":1432}],"138":[0,{"line":59,"col":23,"index":1437},{"line":59,"col":23,"index":1437}],"139":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":23,"index":1437}],"140":[0,{"line":59,"col":2,"index":1416},{"line":59,"col":23,"index":1437}],"141":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":6,"index":1464}],"142":[0,{"line":61,"col":10,"index":1468},{"line":61,"col":10,"index":1468}],"143":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":10,"index":1468}],"144":[0,{"line":61,"col":15,"index":1473},{"line":61,"col":15,"index":1473}],"145":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":15,"index":1473}],"146":[0,{"line":60,"col":2,"index":1441},{"line":62,"col":38,"index":1477}],"147":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":25,"index":1504}],"148":[0,{"line":63,"col":30,"index":1509},{"line":63,"col":32,"index":1511}],"149":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":33,"index":1512}],"150":[0,{"line":63,"col":2,"index":1481},{"line":63,"col":33,"index":1512}],"151":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":26,"index":1540}],"152":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":35,"index":1549}],"153":[0,{"line":64,"col":40,"index":1554},{"line":64,"col":40,"index":1554}],"154":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":40,"index":1554}],"155":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":41,"index":1555}],"156":[0,{"line":64,"col":2,"index":1516},{"line":64,"col":41,"index":1555}],"157":[0,{"line":67,"col":20,"index":1594},{"line":67,"col":22,"index":1596}],"158":[0,{"line":67,"col":16,"index":1590},{"line":67,"col":23,"index":1597}],"159":[0,{"line":67,"col":31,"index":1605},{"line":67,"col":31,"index":1605}],"160":[0,{"line":67,"col":34,"index":1608},{"line":67,"col":34,"index":1608}],"161":[0,{"line":67,"col":27,"index":1601},{"line":67,"col":35,"index":1609}],"162":[0,{"line":67,"col":2,"index":1576},{"line":67,"col":35,"index":1609}],"163":[0,{"line":69,"col":2,"index":1648},{"line":69,"col":10,"index":1656}],"164":[0,{"line":70,"col":33,"index":1691},{"line":70,"col":36,"index":1694}],"165":[0,{"line":70,"col":29,"index":1687},{"line":70,"col":37,"index":1695}],"166":[0,{"line":70,"col":41,"index":1699},{"line":70,"col":45,"index":1703}],"167":[0,{"line":70,"col":2,"index":1660},{"line":70,"col":45,"index":1703}],"168":[0,{"line":73,"col":9,"index":1741},{"line":73,"col":11,"index":1743}],"169":[0,{"line":73,"col":2,"index":1734},{"line":73,"col":11,"index":1743}],"170":[0,{"line":74,"col":25,"index":1770},{"line":74,"col":26,"index":1771}],"171":[0,{"line":74,"col":2,"index":1747},{"line":74,"col":26,"index":1771}],"172":[0,{"line":75,"col":15,"index":1788},{"line":75,"col":15,"index":1788}],"173":[0,{"line":75,"col":18,"index":1791},{"line":75,"col":18,"index":1791}],"174":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":23,"index":1796}],"175":[0,{"line":75,"col":27,"index":1800},{"line":75,"col":27,"index":1800}],"176":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":27,"index":1800}],"177":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"178":[0,{"line":76,"col":10,"index":1812},{"line":76,"col":15,"index":1817}],"179":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":25,"index":1827}],"180":[0,{"line":76,"col":29,"index":1831},{"line":76,"col":29,"index":1831}],"181":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":29,"index":1831}],"182":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"183":[0,{"line":77,"col":11,"index":1844},{"line":77,"col":11,"index":1844}],"184":[0,{"line":77,"col":21,"index":1854},{"line":77,"col":21,"index":1854}],"185":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"186":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"187":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"188":[0,{"line":78,"col":13,"index":1869},{"line":78,"col":13,"index":1869}],"189":[0,{"line":78,"col":22,"index":1878},{"line":78,"col":22,"index":1878}],"190":[0,{"line":78,"col":18,"index":1874},{"line":78,"col":23,"index":1879}],"191":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"192":[0,{"line":81,"col":8,"index":1911},{"line":81,"col":8,"index":1911}],"193":[0,{"line":81,"col":11,"index":1914},{"line":81,"col":11,"index":1914}],"194":[0,{"line":81,"col":16,"index":1919},{"line":81,"col":18,"index":1921}],"195":[0,{"line":81,"col":21,"index":1924},{"line":81,"col":23,"index":1926}],"196":[0,{"line":81,"col":29,"index":1932},{"line":81,"col":31,"index":1934}],"197":[0,{"line":81,"col":15,"index":1918},{"line":81,"col":31,"index":1934}],"198":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":6,"index":1946}],"199":[0,{"line":82,"col":10,"index":1950},{"line":82,"col":10,"index":1950}],"200":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":10,"index":1950}],"201":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"202":[0,{"line":85,"col":10,"index":1997},{"line":85,"col":10,"index":1997}],"203":[0,{"line":85,"col":15,"index":2002},{"line":85,"col":15,"index":2002}],"204":[0,{"line":85,"col":21,"index":2008},{"line":85,"col":21,"index":2008}],"205":[0,{"line":85,"col":14,"index":2001},{"line":85,"col":21,"index":2008}],"206":[0,{"line":86,"col":6,"index":2020},{"line":86,"col":6,"index":2020}],"207":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"208":[0,{"line":89,"col":9,"index":2036},{"line":89,"col":11,"index":2038}],"209":[0,{"line":89,"col":2,"index":2029},{"line":89,"col":11,"index":2038}],"210":[0,{"line":90,"col":21,"index":2061},{"line":90,"col":21,"index":2061}],"211":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"212":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"213":[0,{"line":90,"col":2,"index":2042},{"line":90,"col":21,"index":2061}],"214":[0,{"line":93,"col":15,"index":2113},{"line":93,"col":15,"index":2113}],"215":[0,{"line":93,"col":18,"index":2116},{"line":93,"col":20,"index":2118}],"216":[0,{"line":93,"col":23,"index":2121},{"line":93,"col":23,"index":2121}],"217":[0,{"line":93,"col":26,"index":2124},{"line":93,"col":28,"index":2126}],"218":[0,{"line":93,"col":32,"index":2130},{"line":93,"col":34,"index":2132}],"219":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":8,"index":2146}],"220":[0,{"line":94,"col":12,"index":2150},{"line":94,"col":12,"index":2150}],"221":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":12,"index":2150}],"222":[0,{"line":95,"col":4,"index":2157},{"line":95,"col":4,"index":2157}],"223":[0,{"line":96,"col":9,"index":2168},{"line":96,"col":9,"index":2168}],"224":[0,{"line":94,"col":4,"index":2142},{"line":96,"col":30,"index":2168}],"225":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"226":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"227":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":21,"index":2220}],"228":[0,{"line":101,"col":27,"index":2226},{"line":101,"col":30,"index":2229}],"229":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":30,"index":2229}],"230":[0,{"line":101,"col":2,"index":2201},{"line":101,"col":30,"index":2229}],"231":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":20,"index":2251}],"232":[0,{"line":102,"col":25,"index":2256},{"line":102,"col":28,"index":2259}],"233":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":28,"index":2259}],"234":[0,{"line":102,"col":2,"index":2233},{"line":102,"col":28,"index":2259}],"235":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":25,"index":2286}],"236":[0,{"line":103,"col":35,"index":2296},{"line":103,"col":38,"index":2299}],"237":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":38,"index":2299}],"238":[0,{"line":103,"col":2,"index":2263},{"line":103,"col":38,"index":2299}],"239":[0,{"line":104,"col":8,"index":2309},{"line":104,"col":8,"index":2309}],"240":[0,{"line":104,"col":13,"index":2314},{"line":104,"col":13,"index":2314}],"241":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"242":[0,{"line":105,"col":8,"index":2324},{"line":105,"col":8,"index":2324}],"243":[0,{"line":105,"col":15,"index":2331},{"line":105,"col":15,"index":2331}],"244":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":16,"index":2332}],"245":[0,{"line":105,"col":26,"index":2342},{"line":105,"col":26,"index":2342}],"246":[0,{"line":105,"col":22,"index":2338},{"line":105,"col":27,"index":2343}],"247":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":27,"index":2343}],"248":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"249":[0,{"line":106,"col":19,"index":2364},{"line":106,"col":19,"index":2364}],"250":[0,{"line":106,"col":26,"index":2371},{"line":106,"col":26,"index":2371}],"251":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":27,"index":2372}],"252":[0,{"line":106,"col":37,"index":2382},{"line":106,"col":37,"index":2382}],"253":[0,{"line":106,"col":33,"index":2378},{"line":106,"col":38,"index":2383}],"254":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":38,"index":2383}],"255":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"256":[0,{"line":107,"col":18,"index":2403},{"line":107,"col":18,"index":2403}],"257":[0,{"line":107,"col":25,"index":2410},{"line":107,"col":25,"index":2410}],"258":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":26,"index":2411}],"259":[0,{"line":107,"col":35,"index":2420},{"line":107,"col":35,"index":2420}],"260":[0,{"line":107,"col":31,"index":2416},{"line":107,"col":36,"index":2421}],"261":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":36,"index":2421}],"262":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"263":[0,{"line":110,"col":6,"index":2459},{"line":110,"col":10,"index":2463}],"264":[0,{"line":111,"col":6,"index":2472},{"line":111,"col":9,"index":2475}],"265":[0,{"line":112,"col":6,"index":2484},{"line":112,"col":10,"index":2488}],"266":[0,{"line":109,"col":23,"index":2447},{"line":113,"col":68,"index":2492}],"267":[0,{"line":109,"col":2,"index":2426},{"line":113,"col":68,"index":2492}],"268":[0,{"line":116,"col":6,"index":2534},{"line":116,"col":10,"index":2538}],"269":[0,{"line":117,"col":6,"index":2547},{"line":117,"col":9,"index":2550}],"270":[0,{"line":118,"col":6,"index":2559},{"line":118,"col":10,"index":2563}],"271":[0,{"line":115,"col":27,"index":2522},{"line":119,"col":72,"index":2567}],"272":[0,{"line":115,"col":2,"index":2497},{"line":119,"col":72,"index":2567}],"273":[0,{"line":122,"col":6,"index":2603},{"line":122,"col":10,"index":2607}],"274":[0,{"line":123,"col":6,"index":2616},{"line":123,"col":9,"index":2619}],"275":[0,{"line":124,"col":6,"index":2628},{"line":124,"col":10,"index":2632}],"276":[0,{"line":121,"col":22,"index":2592},{"line":125,"col":66,"index":2636}],"277":[0,{"line":121,"col":2,"index":2572},{"line":125,"col":66,"index":2636}],"278":[0,{"line":128,"col":6,"index":2677},{"line":128,"col":10,"index":2681}],"279":[0,{"line":129,"col":6,"index":2690},{"line":129,"col":9,"index":2693}],"280":[0,{"line":130,"col":6,"index":2702},{"line":130,"col":10,"index":2706}],"281":[0,{"line":127,"col":26,"index":2665},{"line":131,"col":71,"index":2710}],"282":[0,{"line":127,"col":2,"index":2641},{"line":131,"col":71,"index":2710}],"283":[0,{"line":133,"col":21,"index":2734},{"line":133,"col":24,"index":2737}],"284":[0,{"line":133,"col":27,"index":2740},{"line":133,"col":27,"index":2740}],"285":[0,{"line":133,"col":34,"index":2747},{"line":133,"col":34,"index":2747}],"286":[0,{"line":133,"col":17,"index":2730},{"line":133,"col":34,"index":2747}],"287":[0,{"line":133,"col":2,"index":2715},{"line":133,"col":34,"index":2747}],"288":[0,{"line":134,"col":16,"index":2765},{"line":134,"col":16,"index":2765}],"289":[0,{"line":134,"col":19,"index":2768},{"line":134,"col":19,"index":2768}],"290":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":28,"index":2777}],"291":[0,{"line":134,"col":32,"index":2781},{"line":134,"col":33,"index":2782}],"292":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":33,"index":2782}],"293":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":36,"index":2785}],"294":[0,{"line":134,"col":40,"index":2789},{"line":134,"col":40,"index":2789}],"295":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":40,"index":2789}],"296":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":47,"index":2796}],"297":[0,{"line":134,"col":51,"index":2800},{"line":134,"col":51,"index":2800}],"298":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":51,"index":2800}],"299":[0,{"line":134,"col":24,"index":2773},{"line":134,"col":51,"index":2800}],"300":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"301":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":12,"index":2841}],"302":[0,{"line":137,"col":17,"index":2846},{"line":137,"col":19,"index":2848}],"303":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":19,"index":2848}],"304":[0,{"line":137,"col":2,"index":2831},{"line":137,"col":19,"index":2848}],"305":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":16,"index":2866}],"306":[0,{"line":138,"col":22,"index":2872},{"line":138,"col":24,"index":2874}],"307":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":25,"index":2875}],"308":[0,{"line":138,"col":2,"index":2852},{"line":138,"col":25,"index":2875}],"309":[0,{"line":141,"col":13,"index":2939},{"line":141,"col":13,"index":2939}],"310":[0,{"line":141,"col":16,"index":2942},{"line":141,"col":16,"index":2942}],"311":[0,{"line":141,"col":21,"index":2947},{"line":141,"col":21,"index":2947}],"312":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"313":[0,{"line":142,"col":31,"index":2980},{"line":142,"col":33,"index":2982}],"314":[0,{"line":142,"col":36,"index":2985},{"line":142,"col":37,"index":2986}],"315":[0,{"line":142,"col":24,"index":2973},{"line":142,"col":38,"index":2987}],"316":[0,{"line":142,"col":2,"index":2951},{"line":142,"col":38,"index":2987}],"317":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":24,"index":3013}],"318":[0,{"line":143,"col":33,"index":3022},{"line":143,"col":34,"index":3023}],"319":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":35,"index":3024}],"320":[0,{"line":143,"col":2,"index":2991},{"line":143,"col":35,"index":3024}],"321":[0,{"line":145,"col":19,"index":3102},{"line":145,"col":19,"index":3102}],"322":[0,{"line":145,"col":22,"index":3105},{"line":145,"col":26,"index":3109}],"323":[0,{"line":145,"col":16,"index":3099},{"line":145,"col":27,"index":3110}],"324":[0,{"line":145,"col":2,"index":3085},{"line":145,"col":27,"index":3110}],"325":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":22,"index":3279}],"326":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":31,"index":3288}],"327":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":36,"index":3293}],"328":[0,{"line":150,"col":40,"index":3297},{"line":150,"col":41,"index":3298}],"329":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":41,"index":3298}],"330":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":41,"index":3298}],"331":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":42,"index":3299}],"332":[0,{"line":150,"col":2,"index":3259},{"line":150,"col":42,"index":3299}],"333":[0,{"line":152,"col":25,"index":3356},{"line":152,"col":25,"index":3356}],"334":[0,{"line":152,"col":28,"index":3359},{"line":152,"col":32,"index":3363}],"335":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":33,"index":3364}],"336":[0,{"line":152,"col":42,"index":3373},{"line":152,"col":42,"index":3373}],"337":[0,{"line":152,"col":45,"index":3376},{"line":152,"col":47,"index":3378}],"338":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":54,"index":3385}],"339":[0,{"line":152,"col":58,"index":3389},{"line":152,"col":60,"index":3391}],"340":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":60,"index":3391}],"341":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"342":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"343":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"344":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"345":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"346":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"347":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"348":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"349":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"350":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"351":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":62,"index":3393}],"352":[0,{"line":152,"col":2,"index":3333},{"line":152,"col":62,"index":3393}],"353":[0,{"line":155,"col":21,"index":3458},{"line":155,"col":21,"index":3458}],"354":[0,{"line":155,"col":15,"index":3452},{"line":155,"col":22,"index":3459}],"355":[0,{"line":155,"col":4,"index":3441},{"line":155,"col":22,"index":3459}],"356":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":6,"index":3477}],"357":[0,{"line":157,"col":10,"index":3481},{"line":157,"col":11,"index":3482}],"358":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":11,"index":3482}],"359":[0,{"line":158,"col":11,"index":3496},{"line":158,"col":11,"index":3496}],"360":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"361":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"362":[0,{"line":156,"col":4,"index":3465},{"line":159,"col":41,"index":3502}],"363":[0,{"line":155,"col":4,"index":3441},{"line":159,"col":65,"index":3502}],"364":[0,{"line":154,"col":2,"index":3414},{"line":160,"col":94,"index":3506}],"365":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":22,"index":3545}],"366":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":31,"index":3554}],"367":[0,{"line":162,"col":36,"index":3559},{"line":162,"col":39,"index":3562}],"368":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":39,"index":3562}],"369":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":40,"index":3563}],"370":[0,{"line":162,"col":2,"index":3525},{"line":162,"col":40,"index":3563}],"371":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":10,"index":3576}],"372":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":18,"index":3584}],"373":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":23,"index":3589}],"374":[0,{"line":164,"col":27,"index":3593},{"line":164,"col":27,"index":3593}],"375":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":27,"index":3593}],"376":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":27,"index":3593}],"377":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":28,"index":3594}],"378":[0,{"line":164,"col":2,"index":3568},{"line":164,"col":28,"index":3594}],"379":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":23,"index":3620}],"380":[0,{"line":166,"col":37,"index":3634},{"line":166,"col":37,"index":3634}],"381":[0,{"line":166,"col":40,"index":3637},{"line":166,"col":40,"index":3637}],"382":[0,{"line":166,"col":33,"index":3630},{"line":166,"col":41,"index":3638}],"383":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":42,"index":3639}],"384":[0,{"line":166,"col":2,"index":3599},{"line":166,"col":42,"index":3639}],"385":[0,{"line":169,"col":17,"index":3698},{"line":169,"col":17,"index":3698}],"386":[0,{"line":169,"col":20,"index":3701},{"line":169,"col":20,"index":3701}],"387":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":21,"index":3702}],"388":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":28,"index":3709}],"389":[0,{"line":169,"col":2,"index":3683},{"line":169,"col":28,"index":3709}],"390":[0,{"line":172,"col":20,"index":3753},{"line":172,"col":20,"index":3753}],"391":[0,{"line":172,"col":23,"index":3756},{"line":172,"col":23,"index":3756}],"392":[0,{"line":172,"col":26,"index":3759},{"line":172,"col":26,"index":3759}],"393":[0,{"line":172,"col":19,"index":3752},{"line":172,"col":27,"index":3760}],"394":[0,{"line":172,"col":2,"index":3735},{"line":172,"col":27,"index":3760}],"395":[0,{"line":173,"col":24,"index":3786},{"line":173,"col":24,"index":3786}],"396":[0,{"line":173,"col":27,"index":3789},{"line":173,"col":27,"index":3789}],"397":[0,{"line":173,"col":30,"index":3792},{"line":173,"col":30,"index":3792}],"398":[0,{"line":173,"col":20,"index":3782},{"line":173,"col":31,"index":3793}],"399":[0,{"line":173,"col":2,"index":3764},{"line":173,"col":31,"index":3793}],"400":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":18,"index":3813}],"401":[0,{"line":174,"col":23,"index":3818},{"line":174,"col":23,"index":3818}],"402":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":23,"index":3818}],"403":[0,{"line":174,"col":2,"index":3797},{"line":174,"col":23,"index":3818}],"404":[0,{"line":175,"col":19,"index":3839},{"line":175,"col":19,"index":3839}],"405":[0,{"line":175,"col":22,"index":3842},{"line":175,"col":22,"index":3842}],"406":[0,{"line":175,"col":25,"index":3845},{"line":175,"col":25,"index":3845}],"407":[0,{"line":175,"col":18,"index":3838},{"line":175,"col":26,"index":3846}],"408":[0,{"line":175,"col":2,"index":3822},{"line":175,"col":26,"index":3846}],"409":[0,{"line":176,"col":24,"index":3872},{"line":176,"col":24,"index":3872}],"410":[0,{"line":176,"col":27,"index":3875},{"line":176,"col":27,"index":3875}],"411":[0,{"line":176,"col":30,"index":3878},{"line":176,"col":30,"index":3878}],"412":[0,{"line":176,"col":19,"index":3867},{"line":176,"col":31,"index":3879}],"413":[0,{"line":176,"col":2,"index":3850},{"line":176,"col":31,"index":3879}],"414":[0,{"line":177,"col":23,"index":3904},{"line":177,"col":23,"index":3904}],"415":[0,{"line":177,"col":26,"index":3907},{"line":177,"col":26,"index":3907}],"416":[0,{"line":177,"col":29,"index":3910},{"line":177,"col":29,"index":3910}],"417":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":30,"index":3911}],"418":[0,{"line":177,"col":32,"index":3913},{"line":177,"col":32,"index":3913}],"419":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":33,"index":3914}],"420":[0,{"line":177,"col":2,"index":3883},{"line":177,"col":33,"index":3914}],"421":[0,{"line":178,"col":28,"index":3944},{"line":178,"col":33,"index":3949}],"422":[0,{"line":178,"col":22,"index":3938},{"line":178,"col":33,"index":3949}],"423":[0,{"line":178,"col":42,"index":3958},{"line":178,"col":45,"index":3961}],"424":[0,{"line":178,"col":36,"index":3952},{"line":178,"col":45,"index":3961}],"425":[0,{"line":178,"col":20,"index":3936},{"line":178,"col":47,"index":3963}],"426":[0,{"line":178,"col":2,"index":3918},{"line":178,"col":47,"index":3963}],"427":[0,{"line":179,"col":25,"index":3990},{"line":179,"col":30,"index":3995}],"428":[0,{"line":179,"col":33,"index":3998},{"line":179,"col":38,"index":4003}],"429":[0,{"line":179,"col":41,"index":4006},{"line":179,"col":46,"index":4011}],"430":[0,{"line":179,"col":49,"index":4014},{"line":179,"col":52,"index":4017}],"431":[0,{"line":179,"col":21,"index":3986},{"line":179,"col":53,"index":4018}],"432":[0,{"line":179,"col":2,"index":3967},{"line":179,"col":53,"index":4018}],"433":[0,{"line":180,"col":29,"index":4049},{"line":180,"col":35,"index":4055}],"434":[0,{"line":180,"col":23,"index":4043},{"line":180,"col":35,"index":4055}],"435":[0,{"line":180,"col":44,"index":4064},{"line":180,"col":47,"index":4067}],"436":[0,{"line":180,"col":38,"index":4058},{"line":180,"col":47,"index":4067}],"437":[0,{"line":180,"col":53,"index":4073},{"line":180,"col":63,"index":4083}],"438":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"439":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"440":[0,{"line":180,"col":2,"index":4022},{"line":180,"col":65,"index":4085}],"441":[0,{"line":181,"col":21,"index":4108},{"line":181,"col":21,"index":4108}],"442":[0,{"line":181,"col":24,"index":4111},{"line":181,"col":24,"index":4111}],"443":[0,{"line":181,"col":27,"index":4114},{"line":181,"col":27,"index":4114}],"444":[0,{"line":181,"col":17,"index":4104},{"line":181,"col":28,"index":4115}],"445":[0,{"line":181,"col":2,"index":4089},{"line":181,"col":28,"index":4115}],"446":[0,{"line":185,"col":22,"index":4187},{"line":185,"col":22,"index":4187}],"447":[0,{"line":185,"col":19,"index":4184},{"line":185,"col":22,"index":4187}],"448":[0,{"line":185,"col":28,"index":4193},{"line":185,"col":32,"index":4197}],"449":[0,{"line":185,"col":25,"index":4190},{"line":185,"col":32,"index":4197}],"450":[0,{"line":185,"col":17,"index":4182},{"line":185,"col":34,"index":4199}],"451":[0,{"line":185,"col":4,"index":4169},{"line":185,"col":34,"index":4199}],"452":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":9,"index":4210}],"453":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"454":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"455":[0,{"line":185,"col":4,"index":4169},{"line":186,"col":47,"index":4212}],"456":[0,{"line":184,"col":2,"index":4149},{"line":186,"col":65,"index":4212}],"457":[0,{"line":189,"col":21,"index":4253},{"line":189,"col":23,"index":4255}],"458":[0,{"line":189,"col":26,"index":4258},{"line":189,"col":26,"index":4258}],"459":[0,{"line":189,"col":17,"index":4249},{"line":189,"col":27,"index":4259}],"460":[0,{"line":189,"col":4,"index":4236},{"line":189,"col":27,"index":4259}],"461":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":9,"index":4270}],"462":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"463":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"464":[0,{"line":189,"col":4,"index":4236},{"line":190,"col":41,"index":4273}],"465":[0,{"line":188,"col":2,"index":4217},{"line":190,"col":58,"index":4273}],"466":[0,{"line":192,"col":14,"index":4290},{"line":192,"col":14,"index":4290}],"467":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":19,"index":4295}],"468":[0,{"line":192,"col":24,"index":4300},{"line":192,"col":25,"index":4301}],"469":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":25,"index":4301}],"470":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"471":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":19,"index":4349}],"472":[0,{"line":195,"col":24,"index":4354},{"line":195,"col":28,"index":4358}],"473":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":29,"index":4359}],"474":[0,{"line":195,"col":2,"index":4332},{"line":195,"col":29,"index":4359}],"475":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":27,"index":4388}],"476":[0,{"line":196,"col":38,"index":4399},{"line":196,"col":42,"index":4403}],"477":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":43,"index":4404}],"478":[0,{"line":196,"col":2,"index":4363},{"line":196,"col":43,"index":4404}],"479":[0,{"line":197,"col":22,"index":4428},{"line":197,"col":22,"index":4428}],"480":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":23,"index":4429}],"481":[0,{"line":197,"col":41,"index":4447},{"line":197,"col":41,"index":4447}],"482":[0,{"line":197,"col":43,"index":4449},{"line":197,"col":43,"index":4449}],"483":[0,{"line":197,"col":45,"index":4451},{"line":197,"col":45,"index":4451}],"484":[0,{"line":197,"col":37,"index":4443},{"line":197,"col":46,"index":4452}],"485":[0,{"line":197,"col":28,"index":4434},{"line":197,"col":47,"index":4453}],"486":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":48,"index":4454}],"487":[0,{"line":197,"col":2,"index":4408},{"line":197,"col":48,"index":4454}],"488":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":20,"index":4501}],"489":[0,{"line":200,"col":24,"index":4505},{"line":200,"col":24,"index":4505}],"490":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":24,"index":4505}],"491":[0,{"line":200,"col":2,"index":4483},{"line":200,"col":24,"index":4505}],"492":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":13,"index":4549}],"493":[0,{"line":202,"col":18,"index":4554},{"line":202,"col":18,"index":4554}],"494":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":18,"index":4554}],"495":[0,{"line":202,"col":2,"index":4538},{"line":202,"col":18,"index":4554}],"496":[0,{"line":205,"col":2,"index":4572},{"line":205,"col":14,"index":4584}],"497":[0,{"line":206,"col":2,"index":4588},{"line":206,"col":12,"index":4598}],"498":[0,{"line":209,"col":21,"index":4636},{"line":209,"col":23,"index":4638}],"499":[0,{"line":209,"col":17,"index":4632},{"line":209,"col":24,"index":4639}],"500":[0,{"line":209,"col":2,"index":4617},{"line":209,"col":24,"index":4639}],"501":[0,{"line":211,"col":2,"index":4644},{"line":211,"col":24,"index":4666}],"502":[0,{"line":213,"col":10,"index":4679},{"line":213,"col":16,"index":4685}],"503":[0,{"line":213,"col":2,"index":4671},{"line":213,"col":16,"index":4685}],"504":[0,{"line":221,"col":19,"index":4906},{"line":221,"col":19,"index":4906}],"505":[0,{"line":221,"col":15,"index":4902},{"line":221,"col":15,"index":4902}],"506":[0,{"line":221,"col":2,"index":4889},{"line":221,"col":29,"index":4916}],"507":[0,{"line":14,"col":0,"index":140},{"line":225,"col":4855,"index":4995}]}} \ No newline at end of file diff --git a/quint/testFixture/_1043sumTypeDecl.json b/quint/testFixture/_1043sumTypeDecl.json index 67982899d..cbab0c26f 100644 --- a/quint/testFixture/_1043sumTypeDecl.json +++ b/quint/testFixture/_1043sumTypeDecl.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":21,"name":"SumTypes","declarations":[{"id":3,"name":"T","kind":"typedef","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},{"id":13,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":3,"kind":"const","name":"T"}},"expr":{"id":12,"kind":"lambda","params":[{"id":9,"name":"__BParam"}],"qualifier":"def","expr":{"id":11,"kind":"app","opcode":"variant","args":[{"id":8,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":10}]}}},{"id":7,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":3,"kind":"const","name":"T"},"expr":{"id":6,"kind":"app","opcode":"variant","args":[{"id":4,"kind":"str","value":"A"},{"id":5,"kind":"app","opcode":"Rec","args":[]}]}},{"id":20,"kind":"def","name":"canConstructVariants","qualifier":"val","expr":{"id":19,"kind":"app","opcode":"List","args":[{"id":16,"kind":"name","name":"A"},{"id":18,"kind":"app","opcode":"B","args":[{"id":17,"kind":"int","value":2}]}]},"typeAnnotation":{"id":15,"kind":"list","elem":{"id":14,"kind":"const","name":"T"}}}]}],"table":{"3":{"id":3,"name":"T","kind":"typedef","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"10":{"id":9,"name":"__BParam","kind":"param"},"14":{"id":3,"name":"T","kind":"typedef","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"16":{"id":7,"kind":"def","name":"A","qualifier":"val","expr":{"id":6,"kind":"app","opcode":"variant","args":[{"id":4,"kind":"str","value":"A"},{"id":5,"kind":"app","opcode":"Rec","args":[]}]},"depth":0},"18":{"id":13,"kind":"def","name":"B","qualifier":"def","expr":{"id":12,"kind":"lambda","params":[{"id":9,"name":"__BParam"}],"qualifier":"def","expr":{"id":11,"kind":"app","opcode":"variant","args":[{"id":8,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":10}]}},"depth":0}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":20,"name":"SumTypes","declarations":[{"id":3,"name":"T","kind":"typedef","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},{"id":4,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":3,"kind":"const","name":"T"},"expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]}},{"id":8,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":3,"kind":"const","name":"T"}},"expr":{"id":8,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}}},{"id":19,"kind":"def","name":"canConstructVariants","qualifier":"val","expr":{"id":18,"kind":"app","opcode":"List","args":[{"id":15,"kind":"name","name":"A"},{"id":17,"kind":"app","opcode":"B","args":[{"id":16,"kind":"int","value":2}]}]},"typeAnnotation":{"id":14,"kind":"list","elem":{"id":13,"kind":"const","name":"T"}}}]}],"table":{"3":{"id":3,"name":"T","kind":"typedef","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"11":{"id":10,"name":"__BParam","kind":"param"},"13":{"id":3,"name":"T","kind":"typedef","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"15":{"id":4,"kind":"def","name":"A","qualifier":"val","expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]},"depth":0},"17":{"id":8,"kind":"def","name":"B","qualifier":"def","expr":{"id":8,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1043sumTypeDecl.map.json b/quint/testFixture/_1043sumTypeDecl.map.json index 9d2b689b9..566d834ed 100644 --- a/quint/testFixture/_1043sumTypeDecl.map.json +++ b/quint/testFixture/_1043sumTypeDecl.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1043sumTypeDecl.qnt"},"map":{"1":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"2":[0,{"line":3,"col":8,"index":45},{"line":3,"col":10,"index":47}],"3":[0,{"line":1,"col":2,"index":20},{"line":3,"col":30,"index":48}],"4":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"5":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"6":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"7":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"8":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"9":[0,{"line":3,"col":8,"index":45},{"line":3,"col":10,"index":47}],"10":[0,{"line":3,"col":6,"index":43},{"line":3,"col":6,"index":43}],"11":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"12":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"13":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"14":[0,{"line":5,"col":34,"index":85},{"line":5,"col":34,"index":85}],"15":[0,{"line":5,"col":29,"index":80},{"line":5,"col":35,"index":86}],"16":[0,{"line":5,"col":44,"index":95},{"line":5,"col":44,"index":95}],"17":[0,{"line":5,"col":49,"index":100},{"line":5,"col":49,"index":100}],"18":[0,{"line":5,"col":47,"index":98},{"line":5,"col":50,"index":101}],"19":[0,{"line":5,"col":39,"index":90},{"line":5,"col":51,"index":102}],"20":[0,{"line":5,"col":2,"index":53},{"line":5,"col":51,"index":102}],"21":[0,{"line":0,"col":0,"index":0},{"line":6,"col":104,"index":104}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1043sumTypeDecl.qnt"},"map":{"1":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"2":[0,{"line":3,"col":8,"index":45},{"line":3,"col":10,"index":47}],"3":[0,{"line":1,"col":2,"index":20},{"line":3,"col":30,"index":48}],"4":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"5":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"6":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"7":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"8":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"9":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"10":[0,{"line":3,"col":8,"index":45},{"line":3,"col":10,"index":47}],"11":[0,{"line":3,"col":6,"index":43},{"line":3,"col":6,"index":43}],"12":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"13":[0,{"line":5,"col":34,"index":85},{"line":5,"col":34,"index":85}],"14":[0,{"line":5,"col":29,"index":80},{"line":5,"col":35,"index":86}],"15":[0,{"line":5,"col":44,"index":95},{"line":5,"col":44,"index":95}],"16":[0,{"line":5,"col":49,"index":100},{"line":5,"col":49,"index":100}],"17":[0,{"line":5,"col":47,"index":98},{"line":5,"col":50,"index":101}],"18":[0,{"line":5,"col":39,"index":90},{"line":5,"col":51,"index":102}],"19":[0,{"line":5,"col":2,"index":53},{"line":5,"col":51,"index":102}],"20":[0,{"line":0,"col":0,"index":0},{"line":6,"col":104,"index":104}]}} \ No newline at end of file diff --git a/quint/testFixture/_1044matchExpression.json b/quint/testFixture/_1044matchExpression.json index 6ceb3f033..7236d240c 100644 --- a/quint/testFixture/_1044matchExpression.json +++ b/quint/testFixture/_1044matchExpression.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":40,"name":"SumTypes","declarations":[{"id":4,"name":"T","kind":"typedef","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},{"id":14,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}}},{"id":20,"kind":"def","name":"C","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"str"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":19,"kind":"lambda","params":[{"id":16,"name":"__CParam"}],"qualifier":"def","expr":{"id":18,"kind":"app","opcode":"variant","args":[{"id":15,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":17}]}}},{"id":8,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":4,"kind":"const","name":"T"},"expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]}},{"id":23,"kind":"def","name":"c","qualifier":"val","expr":{"id":22,"kind":"app","opcode":"C","args":[{"id":21,"kind":"str","value":"Foo"}]}},{"id":39,"kind":"def","name":"ex","qualifier":"val","expr":{"id":29,"kind":"app","opcode":"matchVariant","args":[{"id":24,"kind":"name","name":"c"},{"id":30,"kind":"str","value":"A"},{"id":31,"kind":"lambda","qualifier":"def","expr":{"id":25,"kind":"int","value":0},"params":[{"name":"_","id":32}]},{"id":33,"kind":"str","value":"B"},{"id":34,"kind":"lambda","qualifier":"def","expr":{"id":26,"kind":"name","name":"n"},"params":[{"name":"n","id":35}]},{"id":36,"kind":"str","value":"_"},{"id":37,"kind":"lambda","qualifier":"def","expr":{"id":28,"kind":"app","opcode":"iuminus","args":[{"id":27,"kind":"int","value":1}]},"params":[{"name":"_","id":38}]}]}}]}],"table":{"4":{"id":4,"name":"T","kind":"typedef","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},"11":{"id":10,"name":"__BParam","kind":"param"},"17":{"id":16,"name":"__CParam","kind":"param"},"22":{"id":20,"kind":"def","name":"C","qualifier":"def","expr":{"id":19,"kind":"lambda","params":[{"id":16,"name":"__CParam"}],"qualifier":"def","expr":{"id":18,"kind":"app","opcode":"variant","args":[{"id":15,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":17}]}},"depth":0},"24":{"id":23,"kind":"def","name":"c","qualifier":"val","expr":{"id":22,"kind":"app","opcode":"C","args":[{"id":21,"kind":"str","value":"Foo"}]},"depth":0},"26":{"name":"n","id":35,"kind":"param"}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":38,"name":"SumTypes","declarations":[{"id":4,"name":"T","kind":"typedef","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},{"id":14,"kind":"def","name":"C","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"str"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":14,"kind":"lambda","params":[{"id":16,"name":"__CParam"}],"qualifier":"def","expr":{"id":18,"kind":"app","opcode":"variant","args":[{"id":15,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":17}]}}},{"id":5,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":4,"kind":"const","name":"T"},"expr":{"id":8,"kind":"app","opcode":"variant","args":[{"id":6,"kind":"str","value":"A"},{"id":7,"kind":"app","opcode":"Rec","args":[]}]}},{"id":9,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":9,"kind":"lambda","params":[{"id":11,"name":"__BParam"}],"qualifier":"def","expr":{"id":13,"kind":"app","opcode":"variant","args":[{"id":10,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":12}]}}},{"id":21,"kind":"def","name":"c","qualifier":"val","expr":{"id":20,"kind":"app","opcode":"C","args":[{"id":19,"kind":"str","value":"Foo"}]}},{"id":37,"kind":"def","name":"ex","qualifier":"val","expr":{"id":27,"kind":"app","opcode":"matchVariant","args":[{"id":22,"kind":"name","name":"c"},{"id":28,"kind":"str","value":"A"},{"id":29,"kind":"lambda","qualifier":"def","expr":{"id":23,"kind":"int","value":0},"params":[{"name":"_","id":30}]},{"id":31,"kind":"str","value":"B"},{"id":32,"kind":"lambda","qualifier":"def","expr":{"id":24,"kind":"name","name":"n"},"params":[{"name":"n","id":33}]},{"id":34,"kind":"str","value":"_"},{"id":35,"kind":"lambda","qualifier":"def","expr":{"id":26,"kind":"app","opcode":"iuminus","args":[{"id":25,"kind":"int","value":1}]},"params":[{"name":"_","id":36}]}]}}]}],"table":{"4":{"id":4,"name":"T","kind":"typedef","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},"12":{"id":11,"name":"__BParam","kind":"param"},"17":{"id":16,"name":"__CParam","kind":"param"},"20":{"id":14,"kind":"def","name":"C","qualifier":"def","expr":{"id":14,"kind":"lambda","params":[{"id":16,"name":"__CParam"}],"qualifier":"def","expr":{"id":18,"kind":"app","opcode":"variant","args":[{"id":15,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":17}]}},"depth":0},"22":{"id":21,"kind":"def","name":"c","qualifier":"val","expr":{"id":20,"kind":"app","opcode":"C","args":[{"id":19,"kind":"str","value":"Foo"}]},"depth":0},"24":{"name":"n","id":33,"kind":"param"}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1044matchExpression.map.json b/quint/testFixture/_1044matchExpression.map.json index 5a444ca1c..c365ead8e 100644 --- a/quint/testFixture/_1044matchExpression.map.json +++ b/quint/testFixture/_1044matchExpression.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1044matchExpression.qnt"},"map":{"1":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"2":[0,{"line":1,"col":17,"index":35},{"line":1,"col":19,"index":37}],"3":[0,{"line":1,"col":26,"index":44},{"line":1,"col":28,"index":46}],"4":[0,{"line":1,"col":2,"index":20},{"line":1,"col":29,"index":47}],"5":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"6":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"7":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"8":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"9":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"10":[0,{"line":1,"col":17,"index":35},{"line":1,"col":19,"index":37}],"11":[0,{"line":1,"col":15,"index":33},{"line":1,"col":15,"index":33}],"12":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"13":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"14":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"15":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"16":[0,{"line":1,"col":26,"index":44},{"line":1,"col":28,"index":46}],"17":[0,{"line":1,"col":24,"index":42},{"line":1,"col":24,"index":42}],"18":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"19":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"20":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"21":[0,{"line":3,"col":12,"index":62},{"line":3,"col":16,"index":66}],"22":[0,{"line":3,"col":10,"index":60},{"line":3,"col":17,"index":67}],"23":[0,{"line":3,"col":2,"index":52},{"line":3,"col":17,"index":67}],"24":[0,{"line":5,"col":17,"index":87},{"line":5,"col":17,"index":87}],"25":[0,{"line":6,"col":14,"index":105},{"line":6,"col":14,"index":105}],"26":[0,{"line":7,"col":14,"index":121},{"line":7,"col":14,"index":121}],"27":[0,{"line":8,"col":15,"index":138},{"line":8,"col":15,"index":138}],"28":[0,{"line":8,"col":14,"index":137},{"line":8,"col":15,"index":138}],"29":[0,{"line":5,"col":11,"index":81},{"line":9,"col":72,"index":142}],"30":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"31":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"32":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"33":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"34":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"35":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"36":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"37":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"38":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"39":[0,{"line":5,"col":2,"index":72},{"line":9,"col":72,"index":142}],"40":[0,{"line":0,"col":0,"index":0},{"line":10,"col":144,"index":144}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1044matchExpression.qnt"},"map":{"1":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"2":[0,{"line":1,"col":17,"index":35},{"line":1,"col":19,"index":37}],"3":[0,{"line":1,"col":26,"index":44},{"line":1,"col":28,"index":46}],"4":[0,{"line":1,"col":2,"index":20},{"line":1,"col":29,"index":47}],"5":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"6":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"7":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"8":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"9":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"10":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"11":[0,{"line":1,"col":17,"index":35},{"line":1,"col":19,"index":37}],"12":[0,{"line":1,"col":15,"index":33},{"line":1,"col":15,"index":33}],"13":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"14":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"15":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"16":[0,{"line":1,"col":26,"index":44},{"line":1,"col":28,"index":46}],"17":[0,{"line":1,"col":24,"index":42},{"line":1,"col":24,"index":42}],"18":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"19":[0,{"line":3,"col":12,"index":62},{"line":3,"col":16,"index":66}],"20":[0,{"line":3,"col":10,"index":60},{"line":3,"col":17,"index":67}],"21":[0,{"line":3,"col":2,"index":52},{"line":3,"col":17,"index":67}],"22":[0,{"line":5,"col":17,"index":87},{"line":5,"col":17,"index":87}],"23":[0,{"line":6,"col":14,"index":105},{"line":6,"col":14,"index":105}],"24":[0,{"line":7,"col":14,"index":121},{"line":7,"col":14,"index":121}],"25":[0,{"line":8,"col":15,"index":138},{"line":8,"col":15,"index":138}],"26":[0,{"line":8,"col":14,"index":137},{"line":8,"col":15,"index":138}],"27":[0,{"line":5,"col":11,"index":81},{"line":9,"col":72,"index":142}],"28":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"29":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"30":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"31":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"32":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"33":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"34":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"35":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"36":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"37":[0,{"line":5,"col":2,"index":72},{"line":9,"col":72,"index":142}],"38":[0,{"line":0,"col":0,"index":0},{"line":10,"col":144,"index":144}]}} \ No newline at end of file From 0c0a0df2dcca7593f37dc186c509954d3aa5fd95 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 29 Nov 2023 17:22:06 -0500 Subject: [PATCH 042/388] Sort constraints to solve by order of "generality" Closes #1275 Since we don't do any backtracking in our constraint solving, the order in which the are solved is important. In particular, if we solve `isDefined` constraints before solving equality constraints, we can end up unifying a free variable with a variable in the first discovered defined type, rather than finding the most specific type that can unify with the given schema. This change defines an order over constraints, based on their kind, and uses that to sort the constraints before they are solved. --- quint/src/types/base.ts | 21 +++++++++++++++++++++ quint/src/types/constraintSolver.ts | 13 ++++++++----- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/quint/src/types/base.ts b/quint/src/types/base.ts index 3f66d009f..9f2899557 100644 --- a/quint/src/types/base.ts +++ b/quint/src/types/base.ts @@ -1,3 +1,4 @@ +import { number } from 'yargs'; import { QuintType } from '../ir/quintTypes' /* @@ -13,6 +14,14 @@ export type Constraint = /// the empty constraint (always satisfied) | { kind: 'empty' } +/** The constraint kinds, in order of "generality" + * + * Constraint solving is order dependent, and we need the most general constraints + * to be solved first. "More general" is here understood to mean "requires less + * information to solve correctly". + */ +const constraintKinds = ['empty', 'eq', 'conjunction', 'isDefined'] as const + export interface TypeScheme { type: QuintType typeVariables: Set @@ -24,3 +33,15 @@ export type Signature = (_arity: number) => TypeScheme export function toScheme(type: QuintType): TypeScheme { return { typeVariables: new Set([]), rowVariables: new Set([]), type } } + +/** compares two constraints based on the order of generality of their kind + * + * @returns a negative value if the kind of the first constraint is more general than the second, + * a positive value if the kind of the first constraint is more specific than the second, + * and 0 if the two constraints are the same kind. + */ +export function compareConstraints(a: Constraint, b: Constraint): number { + const aIdx : number = constraintKinds.findIndex(s => s === a.kind) + const bIdx : number = constraintKinds.findIndex(s => s === b.kind) + return aIdx - bIdx +} diff --git a/quint/src/types/constraintSolver.ts b/quint/src/types/constraintSolver.ts index 2fe22f661..2e2518ba7 100644 --- a/quint/src/types/constraintSolver.ts +++ b/quint/src/types/constraintSolver.ts @@ -14,13 +14,14 @@ import { Either, left, right } from '@sweet-monads/either' import { Error, ErrorTree, buildErrorLeaf, buildErrorTree } from '../errorTree' -import { rowToString, typeToString } from '../ir/IRprinting' +import { declarationToString, rowToString, typeToString } from '../ir/IRprinting' import { QuintConstType, QuintType, Row, rowNames, typeNames } from '../ir/quintTypes' -import { Constraint } from './base' +import { compareConstraints, Constraint } from './base' import { Substitutions, applySubstitution, applySubstitutionToConstraint, compose } from './substitutions' import { unzip } from 'lodash' import { LookupTable } from '../names/base' import { simplifyRow } from './simplification' +import { constraintToString, substitutionsToString } from './printing' /* * Try to solve a constraint by unifying all pairs of types in equality @@ -38,6 +39,8 @@ export function solveConstraint( ): Either, Substitutions> { const errors: Map = new Map() switch (constraint.kind) { + case 'empty': + return right([]) case 'eq': return unify(table, constraint.types[0], constraint.types[1]).mapLeft(e => { errors.set(constraint.sourceId, e) @@ -45,7 +48,9 @@ export function solveConstraint( }) case 'conjunction': { // Chain solving of inner constraints, collecting all errors (even after the first failure) - return constraint.constraints.reduce((result: Either, Substitutions>, con) => { + return constraint.constraints + .sort(compareConstraints) + .reduce((result: Either, Substitutions>, con) => { // If previous result is a failure, try to solve the original constraint // to gather all errors instead of just propagating the first one let newCons = con @@ -79,8 +84,6 @@ export function solveConstraint( ) return left(errors) } - case 'empty': - return right([]) } } From f14793ef7fa655a33dbc424caa50246b83188d15 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 29 Nov 2023 17:29:15 -0500 Subject: [PATCH 043/388] Fix formatting --- quint/src/types/base.ts | 5 ++--- quint/src/types/constraintSolver.ts | 29 ++++++++++++++--------------- quint/test/types/inferrer.test.ts | 2 +- 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/quint/src/types/base.ts b/quint/src/types/base.ts index 9f2899557..1414556a0 100644 --- a/quint/src/types/base.ts +++ b/quint/src/types/base.ts @@ -1,4 +1,3 @@ -import { number } from 'yargs'; import { QuintType } from '../ir/quintTypes' /* @@ -41,7 +40,7 @@ export function toScheme(type: QuintType): TypeScheme { * and 0 if the two constraints are the same kind. */ export function compareConstraints(a: Constraint, b: Constraint): number { - const aIdx : number = constraintKinds.findIndex(s => s === a.kind) - const bIdx : number = constraintKinds.findIndex(s => s === b.kind) + const aIdx: number = constraintKinds.findIndex(s => s === a.kind) + const bIdx: number = constraintKinds.findIndex(s => s === b.kind) return aIdx - bIdx } diff --git a/quint/src/types/constraintSolver.ts b/quint/src/types/constraintSolver.ts index 2e2518ba7..d2da613b3 100644 --- a/quint/src/types/constraintSolver.ts +++ b/quint/src/types/constraintSolver.ts @@ -14,14 +14,13 @@ import { Either, left, right } from '@sweet-monads/either' import { Error, ErrorTree, buildErrorLeaf, buildErrorTree } from '../errorTree' -import { declarationToString, rowToString, typeToString } from '../ir/IRprinting' +import { rowToString, typeToString } from '../ir/IRprinting' import { QuintConstType, QuintType, Row, rowNames, typeNames } from '../ir/quintTypes' -import { compareConstraints, Constraint } from './base' +import { Constraint, compareConstraints } from './base' import { Substitutions, applySubstitution, applySubstitutionToConstraint, compose } from './substitutions' import { unzip } from 'lodash' import { LookupTable } from '../names/base' import { simplifyRow } from './simplification' -import { constraintToString, substitutionsToString } from './printing' /* * Try to solve a constraint by unifying all pairs of types in equality @@ -51,19 +50,19 @@ export function solveConstraint( return constraint.constraints .sort(compareConstraints) .reduce((result: Either, Substitutions>, con) => { - // If previous result is a failure, try to solve the original constraint - // to gather all errors instead of just propagating the first one - let newCons = con - result.map(s => { - newCons = applySubstitutionToConstraint(table, s, con) - }) - return solveConstraint(table, newCons) - .mapLeft(e => { - e.forEach((error, id) => errors.set(id, error)) - return errors + // If previous result is a failure, try to solve the original constraint + // to gather all errors instead of just propagating the first one + let newCons = con + result.map(s => { + newCons = applySubstitutionToConstraint(table, s, con) }) - .chain(newSubs => result.map(s => compose(table, newSubs, s))) - }, right([])) + return solveConstraint(table, newCons) + .mapLeft(e => { + e.forEach((error, id) => errors.set(id, error)) + return errors + }) + .chain(newSubs => result.map(s => compose(table, newSubs, s))) + }, right([])) } case 'isDefined': { for (const def of table.values()) { diff --git a/quint/test/types/inferrer.test.ts b/quint/test/types/inferrer.test.ts index 1e90e27f1..8c496f164 100644 --- a/quint/test/types/inferrer.test.ts +++ b/quint/test/types/inferrer.test.ts @@ -2,7 +2,7 @@ import { describe, it } from 'mocha' import { assert } from 'chai' import { TypeInferenceResult, TypeInferrer } from '../../src/types/inferrer' import { typeSchemeToString } from '../../src/types/printing' -import { ErrorTree, errorTreeToString } from '../../src/errorTree' +import { errorTreeToString } from '../../src/errorTree' import { parseMockedModule } from '../util' describe('inferTypes', () => { From dc4eb2af173221dfffb54acb4b6f7abb3c3371d8 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 29 Nov 2023 18:02:17 -0500 Subject: [PATCH 044/388] Update tests --- quint/test/types/aliasInliner.test.ts | 2 +- quint/test/types/inferrer.test.ts | 68 +++++++++++++++------------ 2 files changed, 39 insertions(+), 31 deletions(-) diff --git a/quint/test/types/aliasInliner.test.ts b/quint/test/types/aliasInliner.test.ts index 3d57494d1..d381a681d 100644 --- a/quint/test/types/aliasInliner.test.ts +++ b/quint/test/types/aliasInliner.test.ts @@ -71,9 +71,9 @@ describe('inlineAliases', () => { const expectedModule = dedent(`module A { | type T1 = (B({}) | C({})) - | val C: (B({}) | C({})) = variant("C", Rec()) | type T2 = (Some((B({}) | C({}))) | None({})) | val B: (B({}) | C({})) = variant("B", Rec()) + | val C: (B({}) | C({})) = variant("C", Rec()) | def Some: ((B({}) | C({}))) => (Some((B({}) | C({}))) | None({})) = ((__SomeParam) => variant("Some", __SomeParam)) | val None: (Some((B({}) | C({}))) | None({})) = variant("None", Rec()) | var x: (Some((B({}) | C({}))) | None({})) diff --git a/quint/test/types/inferrer.test.ts b/quint/test/types/inferrer.test.ts index 8c496f164..83566cd7c 100644 --- a/quint/test/types/inferrer.test.ts +++ b/quint/test/types/inferrer.test.ts @@ -5,6 +5,15 @@ import { typeSchemeToString } from '../../src/types/printing' import { errorTreeToString } from '../../src/errorTree' import { parseMockedModule } from '../util' +// Utility used to print update `stringType` values to make +// updating the expected values in the following tests less +// painful. +function _printUpdatedStringTypes(stringTypes: (string | bigint)[][]) { + console.log('[') + stringTypes.forEach(([n, t]) => console.log(`[${n}n, '${t}'],`)) + console.log(']') +} + describe('inferTypes', () => { function inferTypesForModules(text: string): TypeInferenceResult { const { modules, table } = parseMockedModule(text) @@ -146,20 +155,19 @@ describe('inferTypes', () => { const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) assert.sameDeepMembers(stringTypes, [ - [14n, 'str'], - [15n, 'int'], + [13n, 'str'], + [14n, 'int'], + [15n, '(A(int) | B({}))'], [16n, '(A(int) | B({}))'], - [17n, '(A(int) | B({}))'], + [6n, 'int'], + [5n, 'str'], + [7n, 'int'], + [8n, '(A(int) | B({}))'], + [4n, '(int) => (A(int) | B({}))'], [10n, 'str'], [11n, '{}'], [12n, '(B({}) | A(int))'], - [13n, '(B({}) | A(int))'], - [5n, 'int'], - [4n, 'str'], - [6n, 'int'], - [7n, '(A(int) | B({}))'], - [8n, '(int) => (A(int) | B({}))'], - [9n, '(int) => (A(int) | B({}))'], + [9n, '(B({}) | A(int))'], ]) }) @@ -186,34 +194,34 @@ module B { assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) + // _printUpdatedStringTypes(stringTypes) assert.sameDeepMembers(stringTypes, [ - [14n, 'str'], - [15n, 'int'], + [13n, 'str'], + [14n, 'int'], + [15n, '(A(int) | B({}))'], [16n, '(A(int) | B({}))'], [17n, '(A(int) | B({}))'], - [10n, 'str'], - [11n, '{}'], - [12n, '(B({}) | A(int))'], - [13n, '(B({}) | A(int))'], - [18n, '(A(int) | B({}))'], - [24n, 'str'], - [26n, 'int'], + [23n, 'str'], + [25n, 'int'], + [18n, 'int'], [19n, 'int'], [20n, 'int'], + [24n, '(int) => int'], + [26n, 'str'], + [28n, '{}'], [21n, 'int'], - [25n, '(int) => int'], - [27n, 'str'], - [29n, '{}'], + [27n, '({}) => int'], [22n, 'int'], - [28n, '({}) => int'], - [23n, 'int'], - [30n, 'int'], - [5n, 'int'], - [4n, 'str'], + [29n, 'int'], [6n, 'int'], - [7n, '(A(int) | B({}))'], - [8n, '(int) => (A(int) | B({}))'], - [9n, '(int) => (A(int) | B({}))'], + [5n, 'str'], + [7n, 'int'], + [8n, '(A(int) | B({}))'], + [4n, '(int) => (A(int) | B({}))'], + [10n, 'str'], + [11n, '{}'], + [12n, '(B({}) | A(int))'], + [9n, '(B({}) | A(int))'], ]) }) From 978c42ffc733c44bbcc70f300b7dadb3fb6b08d4 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 29 Nov 2023 18:14:36 -0500 Subject: [PATCH 045/388] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b4f1b35a..b1b1c8d34 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix problems in the integration of sum types in `run`, `test`, and `verify` commands (#1276) - Fix some corner cases with the usage of complex expressions inside `assume` and `import (...)` (#1276) +- Fix incorrect type checking failure from interference between sum types + sharing variant labels (#1275) ### Security From dc00be20c12e7dd3ad1f3cd8c1e1728619adb04d Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 30 Nov 2023 09:54:58 -0500 Subject: [PATCH 046/388] Revert "Fix variant constructor IDs" This reverts commit 3158e29802fc7916bb48cbe9776ecd6255cb4d5e. Apparently the example in the IR I was following is incorrect :) --- quint/src/parsing/ToIrListener.ts | 8 ++------ quint/testFixture/SuperSpec.json | 2 +- quint/testFixture/SuperSpec.map.json | 2 +- quint/testFixture/_1043sumTypeDecl.json | 2 +- quint/testFixture/_1043sumTypeDecl.map.json | 2 +- quint/testFixture/_1044matchExpression.json | 2 +- quint/testFixture/_1044matchExpression.map.json | 2 +- 7 files changed, 8 insertions(+), 12 deletions(-) diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index 7247a067d..e684c355e 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -430,10 +430,6 @@ export class ToIrListener implements QuintListener { // This shouldn't be visible to users const paramName = `__${fieldName}Param` - // def declarations and the lambdas they are associated with should share - // the same ID - const declarationId = this.getId(variantCtx) - let qualifier: OpQualifier let expr: QuintEx let typeAnnotation: QuintType @@ -480,10 +476,10 @@ export class ToIrListener implements QuintListener { } typeAnnotation = { kind: 'oper', args: [fieldType], res: typeName } - expr = { id: declarationId, kind: 'lambda', params, qualifier, expr: variant } + expr = { id: this.getId(variantCtx), kind: 'lambda', params, qualifier, expr: variant } } - return { id: declarationId, kind: 'def', name: fieldName, qualifier, typeAnnotation, expr } + return { id: this.getId(variantCtx), kind: 'def', name: fieldName, qualifier, typeAnnotation, expr } } ) diff --git a/quint/testFixture/SuperSpec.json b/quint/testFixture/SuperSpec.json index 4e367b3c5..e8ae27239 100644 --- a/quint/testFixture/SuperSpec.json +++ b/quint/testFixture/SuperSpec.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":507,"name":"withConsts","declarations":[{"id":101,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":100,"kind":"app","opcode":"imul","args":[{"id":98,"kind":"int","value":2},{"id":99,"kind":"int","value":3}]}},{"id":105,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":104,"kind":"app","opcode":"idiv","args":[{"id":102,"kind":"int","value":2},{"id":103,"kind":"int","value":3}]}},{"id":109,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":108,"kind":"app","opcode":"imod","args":[{"id":106,"kind":"int","value":2},{"id":107,"kind":"int","value":3}]}},{"id":113,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":112,"kind":"app","opcode":"ipow","args":[{"id":110,"kind":"int","value":2},{"id":111,"kind":"int","value":3}]}},{"id":116,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":115,"kind":"app","opcode":"iuminus","args":[{"id":114,"kind":"int","value":100}]}},{"id":120,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":119,"kind":"app","opcode":"igt","args":[{"id":117,"kind":"int","value":2},{"id":118,"kind":"int","value":3}]}},{"id":124,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":123,"kind":"app","opcode":"igte","args":[{"id":121,"kind":"int","value":2},{"id":122,"kind":"int","value":3}]}},{"id":128,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":127,"kind":"app","opcode":"ilt","args":[{"id":125,"kind":"int","value":2},{"id":126,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},{"id":132,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":131,"kind":"app","opcode":"ilte","args":[{"id":129,"kind":"int","value":2},{"id":130,"kind":"int","value":3}]}},{"id":136,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":135,"kind":"app","opcode":"eq","args":[{"id":133,"kind":"int","value":2},{"id":134,"kind":"int","value":3}]}},{"id":140,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":139,"kind":"app","opcode":"neq","args":[{"id":137,"kind":"int","value":2},{"id":138,"kind":"int","value":3}]}},{"id":146,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":145,"kind":"app","opcode":"eq","args":[{"id":143,"kind":"app","opcode":"iadd","args":[{"id":141,"kind":"int","value":2},{"id":142,"kind":"int","value":2}]},{"id":144,"kind":"int","value":4}]}},{"id":150,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":149,"kind":"app","opcode":"in","args":[{"id":147,"kind":"int","value":1},{"id":148,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},{"id":162,"kind":"def","name":"withType","qualifier":"val","expr":{"id":161,"kind":"app","opcode":"Set","args":[{"id":159,"kind":"int","value":1},{"id":160,"kind":"int","value":2}]},"typeAnnotation":{"id":158,"kind":"set","elem":{"id":157,"kind":"int"}}},{"id":163,"kind":"typedef","name":"PROC"},{"kind":"var","name":"n","typeAnnotation":{"id":168,"kind":"int"},"id":169},{"id":171,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":170,"kind":"int","value":42}},{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},{"kind":"var","name":"k","typeAnnotation":{"id":208,"kind":"int"},"id":209},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22},{"id":230,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":229,"kind":"app","opcode":"and","args":[{"id":227,"kind":"bool","value":false},{"id":228,"kind":"bool","value":true}]}},{"id":234,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":233,"kind":"app","opcode":"or","args":[{"id":231,"kind":"bool","value":false},{"id":232,"kind":"bool","value":true}]}},{"id":238,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":237,"kind":"app","opcode":"implies","args":[{"id":235,"kind":"bool","value":false},{"id":236,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26},{"id":267,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":266,"kind":"app","opcode":"and","args":[{"id":263,"kind":"bool","value":false},{"id":264,"kind":"bool","value":true},{"id":265,"kind":"bool","value":false}]}},{"id":272,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":271,"kind":"app","opcode":"actionAll","args":[{"id":268,"kind":"bool","value":false},{"id":269,"kind":"bool","value":true},{"id":270,"kind":"bool","value":false}]}},{"id":277,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":276,"kind":"app","opcode":"or","args":[{"id":273,"kind":"bool","value":false},{"id":274,"kind":"bool","value":true},{"id":275,"kind":"bool","value":false}]}},{"id":282,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":281,"kind":"app","opcode":"actionAny","args":[{"id":278,"kind":"bool","value":false},{"id":279,"kind":"bool","value":true},{"id":280,"kind":"bool","value":false}]}},{"id":287,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":286,"kind":"app","opcode":"ite","args":[{"id":283,"kind":"bool","value":true},{"id":284,"kind":"int","value":1},{"id":285,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":303,"kind":"fun","arg":{"id":301,"kind":"str"},"res":{"id":302,"kind":"int"}},"id":304},{"id":312,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":312,"kind":"lambda","params":[{"id":309,"name":"a"},{"id":310,"name":"b"}],"qualifier":"def","expr":{"id":311,"kind":"int","value":1}}},{"kind":"const","name":"MyFunFun","typeAnnotation":{"id":31,"kind":"fun","arg":{"id":29,"kind":"fun","arg":{"id":27,"kind":"int"},"res":{"id":28,"kind":"str"}},"res":{"id":30,"kind":"bool"}},"id":32},{"id":324,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":323,"kind":"app","opcode":"in","args":[{"id":321,"kind":"int","value":1},{"id":322,"kind":"app","opcode":"Set","args":[]}]}},{"kind":"const","name":"MyOperator","typeAnnotation":{"id":36,"kind":"oper","args":[{"id":33,"kind":"int"},{"id":34,"kind":"str"}],"res":{"id":35,"kind":"bool"}},"id":37},{"id":389,"kind":"def","name":"one","qualifier":"val","expr":{"id":388,"kind":"app","opcode":"head","args":[{"id":387,"kind":"app","opcode":"List","args":[{"id":385,"kind":"int","value":1},{"id":386,"kind":"int","value":2}]}]}},{"id":394,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":393,"kind":"app","opcode":"Tup","args":[{"id":390,"kind":"int","value":1},{"id":391,"kind":"int","value":2},{"id":392,"kind":"int","value":3}]}},{"id":399,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":398,"kind":"app","opcode":"Tup","args":[{"id":395,"kind":"int","value":1},{"id":396,"kind":"int","value":2},{"id":397,"kind":"int","value":3}]}},{"id":403,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":402,"kind":"app","opcode":"Tup","args":[{"id":400,"kind":"int","value":4},{"id":401,"kind":"int","value":5}]}},{"id":408,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":407,"kind":"app","opcode":"List","args":[{"id":404,"kind":"int","value":1},{"id":405,"kind":"int","value":2},{"id":406,"kind":"int","value":3}]}},{"id":413,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":412,"kind":"app","opcode":"List","args":[{"id":409,"kind":"int","value":1},{"id":410,"kind":"int","value":2},{"id":411,"kind":"int","value":3}]}},{"kind":"const","name":"MyOperatorWithComma","typeAnnotation":{"id":41,"kind":"oper","args":[{"id":38,"kind":"int"},{"id":39,"kind":"str"}],"res":{"id":40,"kind":"bool"}},"id":42},{"id":420,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":419,"kind":"app","opcode":"nth","args":[{"id":417,"kind":"app","opcode":"List","args":[{"id":414,"kind":"int","value":2},{"id":415,"kind":"int","value":3},{"id":416,"kind":"int","value":4}]},{"id":418,"kind":"int","value":2}]}},{"id":426,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":425,"kind":"app","opcode":"Rec","args":[{"id":422,"kind":"str","value":"name"},{"id":421,"kind":"str","value":"igor"},{"id":424,"kind":"str","value":"year"},{"id":423,"kind":"int","value":1981}]}},{"id":432,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":431,"kind":"app","opcode":"Rec","args":[{"id":427,"kind":"str","value":"name"},{"id":428,"kind":"str","value":"igor"},{"id":429,"kind":"str","value":"year"},{"id":430,"kind":"int","value":1981}]}},{"id":445,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":444,"kind":"app","opcode":"Set","args":[{"id":441,"kind":"int","value":1},{"id":442,"kind":"int","value":2},{"id":443,"kind":"int","value":3}]}},{"kind":"const","name":"MyTuple","typeAnnotation":{"id":46,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":43,"kind":"int"}},{"fieldName":"1","fieldType":{"id":44,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":45,"kind":"str"}}],"other":{"kind":"empty"}}},"id":47},{"id":474,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":473,"kind":"app","opcode":"in","args":[{"id":471,"kind":"int","value":2},{"id":472,"kind":"app","opcode":"Set","args":[]}]}},{"id":478,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":477,"kind":"app","opcode":"subseteq","args":[{"id":475,"kind":"app","opcode":"Set","args":[]},{"id":476,"kind":"app","opcode":"Set","args":[]}]}},{"id":487,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":486,"kind":"app","opcode":"in","args":[{"id":480,"kind":"app","opcode":"Set","args":[{"id":479,"kind":"int","value":1}]},{"id":485,"kind":"app","opcode":"powerset","args":[{"id":484,"kind":"app","opcode":"Set","args":[{"id":481,"kind":"int","value":1},{"id":482,"kind":"int","value":2},{"id":483,"kind":"int","value":3}]}]}]}},{"id":500,"kind":"typedef","name":"INT_SET","type":{"id":499,"kind":"set","elem":{"id":498,"kind":"int"}}},{"id":501,"kind":"typedef","name":"UNINTERPRETED_TYPE"},{"kind":"const","name":"MyTupleWithComma","typeAnnotation":{"id":51,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":48,"kind":"int"}},{"fieldName":"1","fieldType":{"id":49,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":50,"kind":"str"}}],"other":{"kind":"empty"}}},"id":52},{"kind":"const","name":"MyRecord","typeAnnotation":{"id":56,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":53,"kind":"int"}},{"fieldName":"b","fieldType":{"id":54,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":55,"kind":"str"}}],"other":{"kind":"empty"}}},"id":57},{"kind":"const","name":"MyRecordWithComma","typeAnnotation":{"id":61,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":58,"kind":"int"}},{"fieldName":"b","fieldType":{"id":59,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":60,"kind":"str"}}],"other":{"kind":"empty"}}},"id":62},{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},{"kind":"var","name":"i","typeAnnotation":{"id":86,"kind":"int"},"id":87},{"kind":"var","name":"j","typeAnnotation":{"id":88,"kind":"bool"},"id":89},{"id":93,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":92,"kind":"app","opcode":"iadd","args":[{"id":90,"kind":"int","value":1},{"id":91,"kind":"int","value":2}]}},{"id":97,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":96,"kind":"app","opcode":"isub","args":[{"id":94,"kind":"int","value":1},{"id":95,"kind":"int","value":2}]}},{"id":156,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":155,"kind":"app","opcode":"exists","args":[{"id":151,"kind":"name","name":"Bool"},{"id":154,"kind":"lambda","params":[{"id":152,"name":"x"}],"qualifier":"def","expr":{"id":153,"kind":"name","name":"x"}}]}},{"id":167,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":166,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":165,"kind":"set","elem":{"id":164,"kind":"const","name":"PROC"}}},{"id":177,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":177,"kind":"lambda","params":[{"id":172,"name":"x"},{"id":173,"name":"y"}],"qualifier":"puredef","expr":{"id":176,"kind":"app","opcode":"iadd","args":[{"id":174,"kind":"name","name":"x"},{"id":175,"kind":"name","name":"y"}]}}},{"id":182,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":182,"kind":"lambda","params":[{"id":178,"name":"factor"}],"qualifier":"def","expr":{"id":181,"kind":"app","opcode":"imul","args":[{"id":179,"kind":"name","name":"factor"},{"id":180,"kind":"name","name":"n"}]}}},{"id":187,"kind":"def","name":"A","qualifier":"action","expr":{"id":187,"kind":"lambda","params":[{"id":183,"name":"x"}],"qualifier":"action","expr":{"id":186,"kind":"app","opcode":"assign","args":[{"id":185,"kind":"name","name":"n"},{"id":184,"kind":"name","name":"x"}]}}},{"id":191,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":191,"kind":"lambda","params":[{"id":188,"name":"x"}],"qualifier":"puredef","expr":{"id":190,"kind":"app","opcode":"not","args":[{"id":189,"kind":"name","name":"x"}]}}},{"id":201,"kind":"def","name":"H","qualifier":"def","expr":{"id":201,"kind":"lambda","params":[{"id":192,"name":"x"},{"id":193,"name":"y"}],"qualifier":"def","expr":{"id":200,"kind":"app","opcode":"iadd","args":[{"id":198,"kind":"name","name":"x"},{"id":199,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":197,"kind":"oper","args":[{"id":194,"kind":"int"},{"id":195,"kind":"int"}],"res":{"id":196,"kind":"int"}}},{"id":207,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":207,"kind":"lambda","params":[{"id":202,"name":"x"}],"qualifier":"def","expr":{"id":206,"kind":"name","name":"x"}},"typeAnnotation":{"id":205,"kind":"oper","args":[{"id":203,"kind":"var","name":"a"}],"res":{"id":204,"kind":"var","name":"a"}}},{"id":213,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":212,"kind":"app","opcode":"assign","args":[{"id":211,"kind":"name","name":"k"},{"id":210,"kind":"int","value":3}]}},{"id":226,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":226,"kind":"lambda","params":[{"id":214,"name":"x"},{"id":216,"name":"y"}],"qualifier":"puredef","expr":{"id":224,"kind":"app","opcode":"ite","args":[{"id":221,"kind":"app","opcode":"ilt","args":[{"id":219,"kind":"name","name":"x"},{"id":220,"kind":"name","name":"y"}]},{"id":222,"kind":"name","name":"x"},{"id":223,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":225,"kind":"oper","args":[{"id":215,"kind":"int"},{"id":217,"kind":"int"}],"res":{"id":218,"kind":"int"}}},{"id":241,"kind":"def","name":"F","qualifier":"def","expr":{"id":241,"kind":"lambda","params":[{"id":239,"name":"x"}],"qualifier":"def","expr":{"id":240,"kind":"name","name":"x"}}},{"id":300,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":300,"kind":"lambda","params":[{"id":288,"name":"x"},{"id":289,"name":"y"}],"qualifier":"def","expr":{"id":299,"kind":"app","opcode":"ite","args":[{"id":292,"kind":"app","opcode":"ilt","args":[{"id":290,"kind":"name","name":"x"},{"id":291,"kind":"int","value":10}]},{"id":295,"kind":"app","opcode":"iadd","args":[{"id":293,"kind":"name","name":"y"},{"id":294,"kind":"int","value":5}]},{"id":298,"kind":"app","opcode":"imod","args":[{"id":296,"kind":"name","name":"y"},{"id":297,"kind":"int","value":5}]}]}}},{"id":308,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":307,"kind":"app","opcode":"get","args":[{"id":305,"kind":"name","name":"f1"},{"id":306,"kind":"str","value":"a"}]}},{"id":316,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":315,"kind":"app","opcode":"MyOper","args":[{"id":313,"kind":"str","value":"a"},{"id":314,"kind":"int","value":42}]}},{"id":320,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":319,"kind":"app","opcode":"MyOper","args":[{"id":317,"kind":"str","value":"a"},{"id":318,"kind":"int","value":42}]}},{"id":332,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":331,"kind":"app","opcode":"filter","args":[{"id":325,"kind":"name","name":"S"},{"id":330,"kind":"lambda","params":[{"id":326,"name":"x"}],"qualifier":"def","expr":{"id":329,"kind":"app","opcode":"igt","args":[{"id":327,"kind":"name","name":"x"},{"id":328,"kind":"int","value":10}]}}]}},{"id":370,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":369,"kind":"app","opcode":"filter","args":[{"id":365,"kind":"name","name":"S"},{"id":368,"kind":"lambda","params":[{"id":366,"name":"_"}],"qualifier":"def","expr":{"id":367,"kind":"bool","value":true}}]}},{"id":378,"kind":"def","name":"f","qualifier":"val","expr":{"id":377,"kind":"app","opcode":"mapBy","args":[{"id":371,"kind":"name","name":"S"},{"id":376,"kind":"lambda","params":[{"id":372,"name":"x"}],"qualifier":"def","expr":{"id":375,"kind":"app","opcode":"iadd","args":[{"id":373,"kind":"name","name":"x"},{"id":374,"kind":"int","value":1}]}}]}},{"id":384,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":383,"kind":"app","opcode":"exclude","args":[{"id":379,"kind":"name","name":"S"},{"id":382,"kind":"app","opcode":"Set","args":[{"id":380,"kind":"int","value":3},{"id":381,"kind":"int","value":4}]}]}},{"id":440,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":439,"kind":"app","opcode":"with","args":[{"id":438,"kind":"app","opcode":"with","args":[{"id":437,"kind":"name","name":"test_record"},{"id":434,"kind":"str","value":"name"},{"id":433,"kind":"str","value":"quint"}]},{"id":436,"kind":"str","value":"year"},{"id":435,"kind":"int","value":2023}]}},{"id":456,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":455,"kind":"let","opdef":{"id":451,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":450,"kind":"app","opcode":"Rec","args":[{"id":447,"kind":"str","value":"a"},{"id":446,"kind":"int","value":1},{"id":449,"kind":"str","value":"b"},{"id":448,"kind":"str","value":"foo"}]}},"expr":{"id":454,"kind":"app","opcode":"field","args":[{"id":452,"kind":"name","name":"my_rec"},{"id":453,"kind":"str","value":"a"}]}}},{"id":465,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":464,"kind":"let","opdef":{"id":460,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":459,"kind":"app","opcode":"Tup","args":[{"id":457,"kind":"str","value":"a"},{"id":458,"kind":"int","value":3}]}},"expr":{"id":463,"kind":"app","opcode":"item","args":[{"id":461,"kind":"name","name":"my_tup"},{"id":462,"kind":"int","value":2}]}}},{"id":470,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":470,"kind":"lambda","params":[{"id":466,"name":"s"}],"qualifier":"def","expr":{"id":469,"kind":"app","opcode":"eq","args":[{"id":467,"kind":"name","name":"s"},{"id":468,"kind":"app","opcode":"List","args":[]}]}}},{"id":491,"kind":"assume","name":"positive","assumption":{"id":490,"kind":"app","opcode":"igt","args":[{"id":488,"kind":"name","name":"N"},{"id":489,"kind":"int","value":0}]}},{"id":495,"kind":"assume","name":"_","assumption":{"id":494,"kind":"app","opcode":"neq","args":[{"id":492,"kind":"name","name":"N"},{"id":493,"kind":"int","value":0}]}},{"id":496,"kind":"import","defName":"foo","protoName":"M1"},{"id":497,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":502,"kind":"const","name":"INT_SET"},"id":503},{"id":506,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":505,"name":"N"},{"id":504,"kind":"name","name":"N"}]],"identityOverride":false},{"id":69,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":69,"kind":"lambda","params":[{"id":71,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":73,"kind":"app","opcode":"variant","args":[{"id":70,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":72}]}}},{"id":74,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":74,"kind":"lambda","params":[{"id":76,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":78,"kind":"app","opcode":"variant","args":[{"id":75,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":77}]}}},{"id":79,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":79,"kind":"lambda","params":[{"id":81,"name":"__DogParam"}],"qualifier":"def","expr":{"id":83,"kind":"app","opcode":"variant","args":[{"id":80,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":82}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":84,"kind":"const","name":"MyUnionType"},"id":85},{"id":248,"kind":"def","name":"G","qualifier":"def","expr":{"id":248,"kind":"lambda","params":[{"id":242,"name":"x"}],"qualifier":"def","expr":{"id":247,"kind":"app","opcode":"and","args":[{"id":244,"kind":"app","opcode":"F","args":[{"id":243,"kind":"name","name":"x"}]},{"id":246,"kind":"app","opcode":"not","args":[{"id":245,"kind":"name","name":"x"}]}]}}},{"id":255,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":255,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":254,"kind":"app","opcode":"and","args":[{"id":251,"kind":"app","opcode":"F","args":[{"id":250,"kind":"name","name":"x"}]},{"id":253,"kind":"app","opcode":"not","args":[{"id":252,"kind":"name","name":"x"}]}]}}},{"id":262,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":262,"kind":"lambda","params":[{"id":256,"name":"x"}],"qualifier":"def","expr":{"id":261,"kind":"app","opcode":"or","args":[{"id":258,"kind":"app","opcode":"F","args":[{"id":257,"kind":"name","name":"x"}]},{"id":260,"kind":"app","opcode":"not","args":[{"id":259,"kind":"name","name":"x"}]}]}}},{"id":352,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":351,"kind":"app","opcode":"map","args":[{"id":335,"kind":"app","opcode":"tuples","args":[{"id":333,"kind":"name","name":"S"},{"id":334,"kind":"name","name":"MySet"}]},{"id":350,"kind":"lambda","params":[{"id":341,"name":"quintTupledLambdaParam341"}],"qualifier":"def","expr":{"id":346,"kind":"let","opdef":{"id":337,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":347,"kind":"app","opcode":"item","args":[{"id":348,"kind":"name","name":"quintTupledLambdaParam341"},{"id":349,"kind":"int","value":2}]}},"expr":{"id":342,"kind":"let","opdef":{"id":336,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":343,"kind":"app","opcode":"item","args":[{"id":344,"kind":"name","name":"quintTupledLambdaParam341"},{"id":345,"kind":"int","value":1}]}},"expr":{"id":340,"kind":"app","opcode":"iadd","args":[{"id":338,"kind":"name","name":"s"},{"id":339,"kind":"name","name":"mys"}]}}}}]}},{"id":364,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":363,"kind":"let","opdef":{"id":355,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":354,"kind":"app","opcode":"oneOf","args":[{"id":353,"kind":"name","name":"S"}]}},"expr":{"id":362,"kind":"app","opcode":"actionAll","args":[{"id":358,"kind":"app","opcode":"igt","args":[{"id":356,"kind":"name","name":"x"},{"id":357,"kind":"int","value":10}]},{"id":361,"kind":"app","opcode":"assign","args":[{"id":360,"kind":"name","name":"k"},{"id":359,"kind":"name","name":"x"}]}]}}}]}],"table":{"68":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"72":{"id":71,"name":"__CircleParam","kind":"param"},"77":{"id":76,"name":"__RectangleParam","kind":"param"},"82":{"id":81,"name":"__DogParam","kind":"param"},"84":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"153":{"id":152,"name":"x","kind":"param"},"164":{"id":163,"kind":"typedef","name":"PROC"},"174":{"id":172,"name":"x","kind":"param"},"175":{"id":173,"name":"y","kind":"param"},"179":{"id":178,"name":"factor","kind":"param"},"180":{"kind":"var","name":"n","typeAnnotation":{"id":168,"kind":"int"},"id":169},"184":{"id":183,"name":"x","kind":"param"},"185":{"kind":"var","name":"n","typeAnnotation":{"id":168,"kind":"int"},"id":169},"189":{"id":188,"name":"x","kind":"param"},"198":{"id":192,"name":"x","kind":"param"},"199":{"id":193,"name":"y","kind":"param"},"206":{"id":202,"name":"x","kind":"param"},"211":{"kind":"var","name":"k","typeAnnotation":{"id":208,"kind":"int"},"id":209},"219":{"id":214,"name":"x","kind":"param"},"220":{"id":216,"name":"y","kind":"param"},"222":{"id":214,"name":"x","kind":"param"},"223":{"id":216,"name":"y","kind":"param"},"240":{"id":239,"name":"x","kind":"param"},"243":{"id":242,"name":"x","kind":"param"},"244":{"id":241,"kind":"def","name":"F","qualifier":"def","expr":{"id":241,"kind":"lambda","params":[{"id":239,"name":"x"}],"qualifier":"def","expr":{"id":240,"kind":"name","name":"x"}},"depth":0},"245":{"id":242,"name":"x","kind":"param"},"250":{"id":249,"name":"x","kind":"param"},"251":{"id":241,"kind":"def","name":"F","qualifier":"def","expr":{"id":241,"kind":"lambda","params":[{"id":239,"name":"x"}],"qualifier":"def","expr":{"id":240,"kind":"name","name":"x"}},"depth":0},"252":{"id":249,"name":"x","kind":"param"},"257":{"id":256,"name":"x","kind":"param"},"258":{"id":241,"kind":"def","name":"F","qualifier":"def","expr":{"id":241,"kind":"lambda","params":[{"id":239,"name":"x"}],"qualifier":"def","expr":{"id":240,"kind":"name","name":"x"}},"depth":0},"259":{"id":256,"name":"x","kind":"param"},"290":{"id":288,"name":"x","kind":"param"},"293":{"id":289,"name":"y","kind":"param"},"296":{"id":289,"name":"y","kind":"param"},"305":{"kind":"var","name":"f1","typeAnnotation":{"id":303,"kind":"fun","arg":{"id":301,"kind":"str"},"res":{"id":302,"kind":"int"}},"id":304},"315":{"id":312,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":312,"kind":"lambda","params":[{"id":309,"name":"a"},{"id":310,"name":"b"}],"qualifier":"def","expr":{"id":311,"kind":"int","value":1}},"depth":0},"319":{"id":312,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":312,"kind":"lambda","params":[{"id":309,"name":"a"},{"id":310,"name":"b"}],"qualifier":"def","expr":{"id":311,"kind":"int","value":1}},"depth":0},"325":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"327":{"id":326,"name":"x","kind":"param"},"333":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"334":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},"338":{"id":336,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":343,"kind":"app","opcode":"item","args":[{"id":344,"kind":"name","name":"quintTupledLambdaParam341"},{"id":345,"kind":"int","value":1}]},"depth":1},"339":{"id":337,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":347,"kind":"app","opcode":"item","args":[{"id":348,"kind":"name","name":"quintTupledLambdaParam341"},{"id":349,"kind":"int","value":2}]},"depth":1},"344":{"id":341,"name":"quintTupledLambdaParam341","kind":"param"},"348":{"id":341,"name":"quintTupledLambdaParam341","kind":"param"},"353":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"356":{"id":355,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":354,"kind":"app","opcode":"oneOf","args":[{"id":353,"kind":"name","name":"S"}]},"depth":1},"359":{"id":355,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":354,"kind":"app","opcode":"oneOf","args":[{"id":353,"kind":"name","name":"S"}]},"depth":1},"360":{"kind":"var","name":"k","typeAnnotation":{"id":208,"kind":"int"},"id":209},"365":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"371":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"373":{"id":372,"name":"x","kind":"param"},"379":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"437":{"id":426,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":425,"kind":"app","opcode":"Rec","args":[{"id":422,"kind":"str","value":"name"},{"id":421,"kind":"str","value":"igor"},{"id":424,"kind":"str","value":"year"},{"id":423,"kind":"int","value":1981}]},"depth":0},"452":{"id":451,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":450,"kind":"app","opcode":"Rec","args":[{"id":447,"kind":"str","value":"a"},{"id":446,"kind":"int","value":1},{"id":449,"kind":"str","value":"b"},{"id":448,"kind":"str","value":"foo"}]},"depth":1},"461":{"id":460,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":459,"kind":"app","opcode":"Tup","args":[{"id":457,"kind":"str","value":"a"},{"id":458,"kind":"int","value":3}]},"depth":1},"467":{"id":466,"name":"s","kind":"param"},"488":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"492":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"502":{"id":500,"kind":"typedef","name":"INT_SET","type":{"id":499,"kind":"set","elem":{"id":498,"kind":"int"}}},"504":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"505":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":504,"importedFrom":{"id":506,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":505,"name":"N"},{"id":504,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":510,"name":"withConsts","declarations":[{"id":100,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":99,"kind":"app","opcode":"isub","args":[{"id":97,"kind":"int","value":1},{"id":98,"kind":"int","value":2}]}},{"id":104,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":103,"kind":"app","opcode":"imul","args":[{"id":101,"kind":"int","value":2},{"id":102,"kind":"int","value":3}]}},{"id":108,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":107,"kind":"app","opcode":"idiv","args":[{"id":105,"kind":"int","value":2},{"id":106,"kind":"int","value":3}]}},{"id":112,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":111,"kind":"app","opcode":"imod","args":[{"id":109,"kind":"int","value":2},{"id":110,"kind":"int","value":3}]}},{"id":116,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":115,"kind":"app","opcode":"ipow","args":[{"id":113,"kind":"int","value":2},{"id":114,"kind":"int","value":3}]}},{"id":119,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":118,"kind":"app","opcode":"iuminus","args":[{"id":117,"kind":"int","value":100}]}},{"id":123,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":122,"kind":"app","opcode":"igt","args":[{"id":120,"kind":"int","value":2},{"id":121,"kind":"int","value":3}]}},{"id":127,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":126,"kind":"app","opcode":"igte","args":[{"id":124,"kind":"int","value":2},{"id":125,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},{"id":131,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":130,"kind":"app","opcode":"ilt","args":[{"id":128,"kind":"int","value":2},{"id":129,"kind":"int","value":3}]}},{"id":135,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":134,"kind":"app","opcode":"ilte","args":[{"id":132,"kind":"int","value":2},{"id":133,"kind":"int","value":3}]}},{"id":139,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":138,"kind":"app","opcode":"eq","args":[{"id":136,"kind":"int","value":2},{"id":137,"kind":"int","value":3}]}},{"id":143,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":142,"kind":"app","opcode":"neq","args":[{"id":140,"kind":"int","value":2},{"id":141,"kind":"int","value":3}]}},{"id":149,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":148,"kind":"app","opcode":"eq","args":[{"id":146,"kind":"app","opcode":"iadd","args":[{"id":144,"kind":"int","value":2},{"id":145,"kind":"int","value":2}]},{"id":147,"kind":"int","value":4}]}},{"id":153,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":152,"kind":"app","opcode":"in","args":[{"id":150,"kind":"int","value":1},{"id":151,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},{"id":165,"kind":"def","name":"withType","qualifier":"val","expr":{"id":164,"kind":"app","opcode":"Set","args":[{"id":162,"kind":"int","value":1},{"id":163,"kind":"int","value":2}]},"typeAnnotation":{"id":161,"kind":"set","elem":{"id":160,"kind":"int"}}},{"id":166,"kind":"typedef","name":"PROC"},{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},{"id":174,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":173,"kind":"int","value":42}},{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},{"kind":"var","name":"k","typeAnnotation":{"id":211,"kind":"int"},"id":212},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22},{"id":233,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":232,"kind":"app","opcode":"and","args":[{"id":230,"kind":"bool","value":false},{"id":231,"kind":"bool","value":true}]}},{"id":237,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":236,"kind":"app","opcode":"or","args":[{"id":234,"kind":"bool","value":false},{"id":235,"kind":"bool","value":true}]}},{"id":241,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":240,"kind":"app","opcode":"implies","args":[{"id":238,"kind":"bool","value":false},{"id":239,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26},{"id":270,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":269,"kind":"app","opcode":"and","args":[{"id":266,"kind":"bool","value":false},{"id":267,"kind":"bool","value":true},{"id":268,"kind":"bool","value":false}]}},{"id":275,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":274,"kind":"app","opcode":"actionAll","args":[{"id":271,"kind":"bool","value":false},{"id":272,"kind":"bool","value":true},{"id":273,"kind":"bool","value":false}]}},{"id":280,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":279,"kind":"app","opcode":"or","args":[{"id":276,"kind":"bool","value":false},{"id":277,"kind":"bool","value":true},{"id":278,"kind":"bool","value":false}]}},{"id":285,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":284,"kind":"app","opcode":"actionAny","args":[{"id":281,"kind":"bool","value":false},{"id":282,"kind":"bool","value":true},{"id":283,"kind":"bool","value":false}]}},{"id":290,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":289,"kind":"app","opcode":"ite","args":[{"id":286,"kind":"bool","value":true},{"id":287,"kind":"int","value":1},{"id":288,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":306,"kind":"fun","arg":{"id":304,"kind":"str"},"res":{"id":305,"kind":"int"}},"id":307},{"id":315,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":315,"kind":"lambda","params":[{"id":312,"name":"a"},{"id":313,"name":"b"}],"qualifier":"def","expr":{"id":314,"kind":"int","value":1}}},{"kind":"const","name":"MyFunFun","typeAnnotation":{"id":31,"kind":"fun","arg":{"id":29,"kind":"fun","arg":{"id":27,"kind":"int"},"res":{"id":28,"kind":"str"}},"res":{"id":30,"kind":"bool"}},"id":32},{"id":327,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":326,"kind":"app","opcode":"in","args":[{"id":324,"kind":"int","value":1},{"id":325,"kind":"app","opcode":"Set","args":[]}]}},{"kind":"const","name":"MyOperator","typeAnnotation":{"id":36,"kind":"oper","args":[{"id":33,"kind":"int"},{"id":34,"kind":"str"}],"res":{"id":35,"kind":"bool"}},"id":37},{"id":392,"kind":"def","name":"one","qualifier":"val","expr":{"id":391,"kind":"app","opcode":"head","args":[{"id":390,"kind":"app","opcode":"List","args":[{"id":388,"kind":"int","value":1},{"id":389,"kind":"int","value":2}]}]}},{"id":397,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":396,"kind":"app","opcode":"Tup","args":[{"id":393,"kind":"int","value":1},{"id":394,"kind":"int","value":2},{"id":395,"kind":"int","value":3}]}},{"id":402,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":401,"kind":"app","opcode":"Tup","args":[{"id":398,"kind":"int","value":1},{"id":399,"kind":"int","value":2},{"id":400,"kind":"int","value":3}]}},{"id":406,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":405,"kind":"app","opcode":"Tup","args":[{"id":403,"kind":"int","value":4},{"id":404,"kind":"int","value":5}]}},{"id":411,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":410,"kind":"app","opcode":"List","args":[{"id":407,"kind":"int","value":1},{"id":408,"kind":"int","value":2},{"id":409,"kind":"int","value":3}]}},{"id":416,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":415,"kind":"app","opcode":"List","args":[{"id":412,"kind":"int","value":1},{"id":413,"kind":"int","value":2},{"id":414,"kind":"int","value":3}]}},{"kind":"const","name":"MyOperatorWithComma","typeAnnotation":{"id":41,"kind":"oper","args":[{"id":38,"kind":"int"},{"id":39,"kind":"str"}],"res":{"id":40,"kind":"bool"}},"id":42},{"id":423,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":422,"kind":"app","opcode":"nth","args":[{"id":420,"kind":"app","opcode":"List","args":[{"id":417,"kind":"int","value":2},{"id":418,"kind":"int","value":3},{"id":419,"kind":"int","value":4}]},{"id":421,"kind":"int","value":2}]}},{"id":429,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"Rec","args":[{"id":425,"kind":"str","value":"name"},{"id":424,"kind":"str","value":"igor"},{"id":427,"kind":"str","value":"year"},{"id":426,"kind":"int","value":1981}]}},{"id":435,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":434,"kind":"app","opcode":"Rec","args":[{"id":430,"kind":"str","value":"name"},{"id":431,"kind":"str","value":"igor"},{"id":432,"kind":"str","value":"year"},{"id":433,"kind":"int","value":1981}]}},{"id":448,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Set","args":[{"id":444,"kind":"int","value":1},{"id":445,"kind":"int","value":2},{"id":446,"kind":"int","value":3}]}},{"kind":"const","name":"MyTuple","typeAnnotation":{"id":46,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":43,"kind":"int"}},{"fieldName":"1","fieldType":{"id":44,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":45,"kind":"str"}}],"other":{"kind":"empty"}}},"id":47},{"id":477,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":476,"kind":"app","opcode":"in","args":[{"id":474,"kind":"int","value":2},{"id":475,"kind":"app","opcode":"Set","args":[]}]}},{"id":481,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":480,"kind":"app","opcode":"subseteq","args":[{"id":478,"kind":"app","opcode":"Set","args":[]},{"id":479,"kind":"app","opcode":"Set","args":[]}]}},{"id":490,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":489,"kind":"app","opcode":"in","args":[{"id":483,"kind":"app","opcode":"Set","args":[{"id":482,"kind":"int","value":1}]},{"id":488,"kind":"app","opcode":"powerset","args":[{"id":487,"kind":"app","opcode":"Set","args":[{"id":484,"kind":"int","value":1},{"id":485,"kind":"int","value":2},{"id":486,"kind":"int","value":3}]}]}]}},{"id":503,"kind":"typedef","name":"INT_SET","type":{"id":502,"kind":"set","elem":{"id":501,"kind":"int"}}},{"id":504,"kind":"typedef","name":"UNINTERPRETED_TYPE"},{"kind":"const","name":"MyTupleWithComma","typeAnnotation":{"id":51,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":48,"kind":"int"}},{"fieldName":"1","fieldType":{"id":49,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":50,"kind":"str"}}],"other":{"kind":"empty"}}},"id":52},{"kind":"const","name":"MyRecord","typeAnnotation":{"id":56,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":53,"kind":"int"}},{"fieldName":"b","fieldType":{"id":54,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":55,"kind":"str"}}],"other":{"kind":"empty"}}},"id":57},{"kind":"const","name":"MyRecordWithComma","typeAnnotation":{"id":61,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":58,"kind":"int"}},{"fieldName":"b","fieldType":{"id":59,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":60,"kind":"str"}}],"other":{"kind":"empty"}}},"id":62},{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},{"kind":"var","name":"i","typeAnnotation":{"id":89,"kind":"int"},"id":90},{"kind":"var","name":"j","typeAnnotation":{"id":91,"kind":"bool"},"id":92},{"id":96,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":95,"kind":"app","opcode":"iadd","args":[{"id":93,"kind":"int","value":1},{"id":94,"kind":"int","value":2}]}},{"id":159,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":158,"kind":"app","opcode":"exists","args":[{"id":154,"kind":"name","name":"Bool"},{"id":157,"kind":"lambda","params":[{"id":155,"name":"x"}],"qualifier":"def","expr":{"id":156,"kind":"name","name":"x"}}]}},{"id":170,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":169,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":168,"kind":"set","elem":{"id":167,"kind":"const","name":"PROC"}}},{"id":180,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":180,"kind":"lambda","params":[{"id":175,"name":"x"},{"id":176,"name":"y"}],"qualifier":"puredef","expr":{"id":179,"kind":"app","opcode":"iadd","args":[{"id":177,"kind":"name","name":"x"},{"id":178,"kind":"name","name":"y"}]}}},{"id":185,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":185,"kind":"lambda","params":[{"id":181,"name":"factor"}],"qualifier":"def","expr":{"id":184,"kind":"app","opcode":"imul","args":[{"id":182,"kind":"name","name":"factor"},{"id":183,"kind":"name","name":"n"}]}}},{"id":190,"kind":"def","name":"A","qualifier":"action","expr":{"id":190,"kind":"lambda","params":[{"id":186,"name":"x"}],"qualifier":"action","expr":{"id":189,"kind":"app","opcode":"assign","args":[{"id":188,"kind":"name","name":"n"},{"id":187,"kind":"name","name":"x"}]}}},{"id":194,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":194,"kind":"lambda","params":[{"id":191,"name":"x"}],"qualifier":"puredef","expr":{"id":193,"kind":"app","opcode":"not","args":[{"id":192,"kind":"name","name":"x"}]}}},{"id":204,"kind":"def","name":"H","qualifier":"def","expr":{"id":204,"kind":"lambda","params":[{"id":195,"name":"x"},{"id":196,"name":"y"}],"qualifier":"def","expr":{"id":203,"kind":"app","opcode":"iadd","args":[{"id":201,"kind":"name","name":"x"},{"id":202,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":200,"kind":"oper","args":[{"id":197,"kind":"int"},{"id":198,"kind":"int"}],"res":{"id":199,"kind":"int"}}},{"id":210,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":210,"kind":"lambda","params":[{"id":205,"name":"x"}],"qualifier":"def","expr":{"id":209,"kind":"name","name":"x"}},"typeAnnotation":{"id":208,"kind":"oper","args":[{"id":206,"kind":"var","name":"a"}],"res":{"id":207,"kind":"var","name":"a"}}},{"id":216,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":215,"kind":"app","opcode":"assign","args":[{"id":214,"kind":"name","name":"k"},{"id":213,"kind":"int","value":3}]}},{"id":229,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":229,"kind":"lambda","params":[{"id":217,"name":"x"},{"id":219,"name":"y"}],"qualifier":"puredef","expr":{"id":227,"kind":"app","opcode":"ite","args":[{"id":224,"kind":"app","opcode":"ilt","args":[{"id":222,"kind":"name","name":"x"},{"id":223,"kind":"name","name":"y"}]},{"id":225,"kind":"name","name":"x"},{"id":226,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":228,"kind":"oper","args":[{"id":218,"kind":"int"},{"id":220,"kind":"int"}],"res":{"id":221,"kind":"int"}}},{"id":244,"kind":"def","name":"F","qualifier":"def","expr":{"id":244,"kind":"lambda","params":[{"id":242,"name":"x"}],"qualifier":"def","expr":{"id":243,"kind":"name","name":"x"}}},{"id":303,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":303,"kind":"lambda","params":[{"id":291,"name":"x"},{"id":292,"name":"y"}],"qualifier":"def","expr":{"id":302,"kind":"app","opcode":"ite","args":[{"id":295,"kind":"app","opcode":"ilt","args":[{"id":293,"kind":"name","name":"x"},{"id":294,"kind":"int","value":10}]},{"id":298,"kind":"app","opcode":"iadd","args":[{"id":296,"kind":"name","name":"y"},{"id":297,"kind":"int","value":5}]},{"id":301,"kind":"app","opcode":"imod","args":[{"id":299,"kind":"name","name":"y"},{"id":300,"kind":"int","value":5}]}]}}},{"id":311,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":310,"kind":"app","opcode":"get","args":[{"id":308,"kind":"name","name":"f1"},{"id":309,"kind":"str","value":"a"}]}},{"id":319,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":318,"kind":"app","opcode":"MyOper","args":[{"id":316,"kind":"str","value":"a"},{"id":317,"kind":"int","value":42}]}},{"id":323,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"MyOper","args":[{"id":320,"kind":"str","value":"a"},{"id":321,"kind":"int","value":42}]}},{"id":335,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":334,"kind":"app","opcode":"filter","args":[{"id":328,"kind":"name","name":"S"},{"id":333,"kind":"lambda","params":[{"id":329,"name":"x"}],"qualifier":"def","expr":{"id":332,"kind":"app","opcode":"igt","args":[{"id":330,"kind":"name","name":"x"},{"id":331,"kind":"int","value":10}]}}]}},{"id":373,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":372,"kind":"app","opcode":"filter","args":[{"id":368,"kind":"name","name":"S"},{"id":371,"kind":"lambda","params":[{"id":369,"name":"_"}],"qualifier":"def","expr":{"id":370,"kind":"bool","value":true}}]}},{"id":381,"kind":"def","name":"f","qualifier":"val","expr":{"id":380,"kind":"app","opcode":"mapBy","args":[{"id":374,"kind":"name","name":"S"},{"id":379,"kind":"lambda","params":[{"id":375,"name":"x"}],"qualifier":"def","expr":{"id":378,"kind":"app","opcode":"iadd","args":[{"id":376,"kind":"name","name":"x"},{"id":377,"kind":"int","value":1}]}}]}},{"id":387,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":386,"kind":"app","opcode":"exclude","args":[{"id":382,"kind":"name","name":"S"},{"id":385,"kind":"app","opcode":"Set","args":[{"id":383,"kind":"int","value":3},{"id":384,"kind":"int","value":4}]}]}},{"id":443,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":442,"kind":"app","opcode":"with","args":[{"id":441,"kind":"app","opcode":"with","args":[{"id":440,"kind":"name","name":"test_record"},{"id":437,"kind":"str","value":"name"},{"id":436,"kind":"str","value":"quint"}]},{"id":439,"kind":"str","value":"year"},{"id":438,"kind":"int","value":2023}]}},{"id":459,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":458,"kind":"let","opdef":{"id":454,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":453,"kind":"app","opcode":"Rec","args":[{"id":450,"kind":"str","value":"a"},{"id":449,"kind":"int","value":1},{"id":452,"kind":"str","value":"b"},{"id":451,"kind":"str","value":"foo"}]}},"expr":{"id":457,"kind":"app","opcode":"field","args":[{"id":455,"kind":"name","name":"my_rec"},{"id":456,"kind":"str","value":"a"}]}}},{"id":468,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":467,"kind":"let","opdef":{"id":463,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":462,"kind":"app","opcode":"Tup","args":[{"id":460,"kind":"str","value":"a"},{"id":461,"kind":"int","value":3}]}},"expr":{"id":466,"kind":"app","opcode":"item","args":[{"id":464,"kind":"name","name":"my_tup"},{"id":465,"kind":"int","value":2}]}}},{"id":473,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":473,"kind":"lambda","params":[{"id":469,"name":"s"}],"qualifier":"def","expr":{"id":472,"kind":"app","opcode":"eq","args":[{"id":470,"kind":"name","name":"s"},{"id":471,"kind":"app","opcode":"List","args":[]}]}}},{"id":494,"kind":"assume","name":"positive","assumption":{"id":493,"kind":"app","opcode":"igt","args":[{"id":491,"kind":"name","name":"N"},{"id":492,"kind":"int","value":0}]}},{"id":498,"kind":"assume","name":"_","assumption":{"id":497,"kind":"app","opcode":"neq","args":[{"id":495,"kind":"name","name":"N"},{"id":496,"kind":"int","value":0}]}},{"id":499,"kind":"import","defName":"foo","protoName":"M1"},{"id":500,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":505,"kind":"const","name":"INT_SET"},"id":506},{"id":509,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":508,"name":"N"},{"id":507,"kind":"name","name":"N"}]],"identityOverride":false},{"id":74,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":73,"kind":"lambda","params":[{"id":70,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":72,"kind":"app","opcode":"variant","args":[{"id":69,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":71}]}}},{"id":80,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":79,"kind":"lambda","params":[{"id":76,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":78,"kind":"app","opcode":"variant","args":[{"id":75,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":77}]}}},{"id":86,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":85,"kind":"lambda","params":[{"id":82,"name":"__DogParam"}],"qualifier":"def","expr":{"id":84,"kind":"app","opcode":"variant","args":[{"id":81,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":83}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":87,"kind":"const","name":"MyUnionType"},"id":88},{"id":251,"kind":"def","name":"G","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":245,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"app","opcode":"and","args":[{"id":247,"kind":"app","opcode":"F","args":[{"id":246,"kind":"name","name":"x"}]},{"id":249,"kind":"app","opcode":"not","args":[{"id":248,"kind":"name","name":"x"}]}]}}},{"id":258,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":258,"kind":"lambda","params":[{"id":252,"name":"x"}],"qualifier":"def","expr":{"id":257,"kind":"app","opcode":"and","args":[{"id":254,"kind":"app","opcode":"F","args":[{"id":253,"kind":"name","name":"x"}]},{"id":256,"kind":"app","opcode":"not","args":[{"id":255,"kind":"name","name":"x"}]}]}}},{"id":265,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":265,"kind":"lambda","params":[{"id":259,"name":"x"}],"qualifier":"def","expr":{"id":264,"kind":"app","opcode":"or","args":[{"id":261,"kind":"app","opcode":"F","args":[{"id":260,"kind":"name","name":"x"}]},{"id":263,"kind":"app","opcode":"not","args":[{"id":262,"kind":"name","name":"x"}]}]}}},{"id":355,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":354,"kind":"app","opcode":"map","args":[{"id":338,"kind":"app","opcode":"tuples","args":[{"id":336,"kind":"name","name":"S"},{"id":337,"kind":"name","name":"MySet"}]},{"id":353,"kind":"lambda","params":[{"id":344,"name":"quintTupledLambdaParam344"}],"qualifier":"def","expr":{"id":349,"kind":"let","opdef":{"id":340,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":350,"kind":"app","opcode":"item","args":[{"id":351,"kind":"name","name":"quintTupledLambdaParam344"},{"id":352,"kind":"int","value":2}]}},"expr":{"id":345,"kind":"let","opdef":{"id":339,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":346,"kind":"app","opcode":"item","args":[{"id":347,"kind":"name","name":"quintTupledLambdaParam344"},{"id":348,"kind":"int","value":1}]}},"expr":{"id":343,"kind":"app","opcode":"iadd","args":[{"id":341,"kind":"name","name":"s"},{"id":342,"kind":"name","name":"mys"}]}}}}]}},{"id":367,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":366,"kind":"let","opdef":{"id":358,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":357,"kind":"app","opcode":"oneOf","args":[{"id":356,"kind":"name","name":"S"}]}},"expr":{"id":365,"kind":"app","opcode":"actionAll","args":[{"id":361,"kind":"app","opcode":"igt","args":[{"id":359,"kind":"name","name":"x"},{"id":360,"kind":"int","value":10}]},{"id":364,"kind":"app","opcode":"assign","args":[{"id":363,"kind":"name","name":"k"},{"id":362,"kind":"name","name":"x"}]}]}}}]}],"table":{"68":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"71":{"id":70,"name":"__CircleParam","kind":"param"},"77":{"id":76,"name":"__RectangleParam","kind":"param"},"83":{"id":82,"name":"__DogParam","kind":"param"},"87":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"156":{"id":155,"name":"x","kind":"param"},"167":{"id":166,"kind":"typedef","name":"PROC"},"177":{"id":175,"name":"x","kind":"param"},"178":{"id":176,"name":"y","kind":"param"},"182":{"id":181,"name":"factor","kind":"param"},"183":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"187":{"id":186,"name":"x","kind":"param"},"188":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"192":{"id":191,"name":"x","kind":"param"},"201":{"id":195,"name":"x","kind":"param"},"202":{"id":196,"name":"y","kind":"param"},"209":{"id":205,"name":"x","kind":"param"},"214":{"kind":"var","name":"k","typeAnnotation":{"id":211,"kind":"int"},"id":212},"222":{"id":217,"name":"x","kind":"param"},"223":{"id":219,"name":"y","kind":"param"},"225":{"id":217,"name":"x","kind":"param"},"226":{"id":219,"name":"y","kind":"param"},"243":{"id":242,"name":"x","kind":"param"},"246":{"id":245,"name":"x","kind":"param"},"247":{"id":244,"kind":"def","name":"F","qualifier":"def","expr":{"id":244,"kind":"lambda","params":[{"id":242,"name":"x"}],"qualifier":"def","expr":{"id":243,"kind":"name","name":"x"}},"depth":0},"248":{"id":245,"name":"x","kind":"param"},"253":{"id":252,"name":"x","kind":"param"},"254":{"id":244,"kind":"def","name":"F","qualifier":"def","expr":{"id":244,"kind":"lambda","params":[{"id":242,"name":"x"}],"qualifier":"def","expr":{"id":243,"kind":"name","name":"x"}},"depth":0},"255":{"id":252,"name":"x","kind":"param"},"260":{"id":259,"name":"x","kind":"param"},"261":{"id":244,"kind":"def","name":"F","qualifier":"def","expr":{"id":244,"kind":"lambda","params":[{"id":242,"name":"x"}],"qualifier":"def","expr":{"id":243,"kind":"name","name":"x"}},"depth":0},"262":{"id":259,"name":"x","kind":"param"},"293":{"id":291,"name":"x","kind":"param"},"296":{"id":292,"name":"y","kind":"param"},"299":{"id":292,"name":"y","kind":"param"},"308":{"kind":"var","name":"f1","typeAnnotation":{"id":306,"kind":"fun","arg":{"id":304,"kind":"str"},"res":{"id":305,"kind":"int"}},"id":307},"318":{"id":315,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":315,"kind":"lambda","params":[{"id":312,"name":"a"},{"id":313,"name":"b"}],"qualifier":"def","expr":{"id":314,"kind":"int","value":1}},"depth":0},"322":{"id":315,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":315,"kind":"lambda","params":[{"id":312,"name":"a"},{"id":313,"name":"b"}],"qualifier":"def","expr":{"id":314,"kind":"int","value":1}},"depth":0},"328":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"330":{"id":329,"name":"x","kind":"param"},"336":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"337":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},"341":{"id":339,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":346,"kind":"app","opcode":"item","args":[{"id":347,"kind":"name","name":"quintTupledLambdaParam344"},{"id":348,"kind":"int","value":1}]},"depth":1},"342":{"id":340,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":350,"kind":"app","opcode":"item","args":[{"id":351,"kind":"name","name":"quintTupledLambdaParam344"},{"id":352,"kind":"int","value":2}]},"depth":1},"347":{"id":344,"name":"quintTupledLambdaParam344","kind":"param"},"351":{"id":344,"name":"quintTupledLambdaParam344","kind":"param"},"356":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"359":{"id":358,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":357,"kind":"app","opcode":"oneOf","args":[{"id":356,"kind":"name","name":"S"}]},"depth":1},"362":{"id":358,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":357,"kind":"app","opcode":"oneOf","args":[{"id":356,"kind":"name","name":"S"}]},"depth":1},"363":{"kind":"var","name":"k","typeAnnotation":{"id":211,"kind":"int"},"id":212},"368":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"374":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"376":{"id":375,"name":"x","kind":"param"},"382":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"440":{"id":429,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"Rec","args":[{"id":425,"kind":"str","value":"name"},{"id":424,"kind":"str","value":"igor"},{"id":427,"kind":"str","value":"year"},{"id":426,"kind":"int","value":1981}]},"depth":0},"455":{"id":454,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":453,"kind":"app","opcode":"Rec","args":[{"id":450,"kind":"str","value":"a"},{"id":449,"kind":"int","value":1},{"id":452,"kind":"str","value":"b"},{"id":451,"kind":"str","value":"foo"}]},"depth":1},"464":{"id":463,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":462,"kind":"app","opcode":"Tup","args":[{"id":460,"kind":"str","value":"a"},{"id":461,"kind":"int","value":3}]},"depth":1},"470":{"id":469,"name":"s","kind":"param"},"491":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"495":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"505":{"id":503,"kind":"typedef","name":"INT_SET","type":{"id":502,"kind":"set","elem":{"id":501,"kind":"int"}}},"507":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"508":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":507,"importedFrom":{"id":509,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":508,"name":"N"},{"id":507,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/SuperSpec.map.json b/quint/testFixture/SuperSpec.map.json index 659e2c8fa..54d6d710d 100644 --- a/quint/testFixture/SuperSpec.map.json +++ b/quint/testFixture/SuperSpec.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/SuperSpec.qnt"},"map":{"1":[0,{"line":1,"col":12,"index":24},{"line":1,"col":12,"index":24}],"2":[0,{"line":1,"col":2,"index":14},{"line":1,"col":12,"index":24}],"3":[0,{"line":0,"col":0,"index":0},{"line":2,"col":26,"index":26}],"4":[0,{"line":5,"col":12,"index":53},{"line":5,"col":12,"index":53}],"5":[0,{"line":5,"col":2,"index":43},{"line":5,"col":12,"index":53}],"6":[0,{"line":4,"col":0,"index":29},{"line":6,"col":26,"index":55}],"7":[0,{"line":9,"col":11,"index":84},{"line":9,"col":13,"index":86}],"8":[0,{"line":9,"col":2,"index":75},{"line":9,"col":13,"index":86}],"9":[0,{"line":10,"col":9,"index":97},{"line":10,"col":11,"index":99}],"10":[0,{"line":10,"col":2,"index":90},{"line":10,"col":11,"index":99}],"11":[0,{"line":8,"col":0,"index":58},{"line":11,"col":43,"index":101}],"12":[0,{"line":16,"col":11,"index":186},{"line":16,"col":13,"index":188}],"13":[0,{"line":16,"col":2,"index":177},{"line":16,"col":13,"index":188}],"14":[0,{"line":17,"col":15,"index":205},{"line":17,"col":17,"index":207}],"15":[0,{"line":17,"col":11,"index":201},{"line":17,"col":18,"index":208}],"16":[0,{"line":17,"col":2,"index":192},{"line":17,"col":18,"index":208}],"17":[0,{"line":18,"col":19,"index":229},{"line":18,"col":21,"index":231}],"18":[0,{"line":18,"col":15,"index":225},{"line":18,"col":22,"index":232}],"19":[0,{"line":18,"col":2,"index":212},{"line":18,"col":22,"index":232}],"20":[0,{"line":19,"col":20,"index":254},{"line":19,"col":23,"index":257}],"21":[0,{"line":19,"col":15,"index":249},{"line":19,"col":24,"index":258}],"22":[0,{"line":19,"col":2,"index":236},{"line":19,"col":24,"index":258}],"23":[0,{"line":20,"col":15,"index":275},{"line":20,"col":17,"index":277}],"24":[0,{"line":20,"col":22,"index":282},{"line":20,"col":24,"index":284}],"25":[0,{"line":20,"col":15,"index":275},{"line":20,"col":24,"index":284}],"26":[0,{"line":20,"col":2,"index":262},{"line":20,"col":24,"index":284}],"27":[0,{"line":21,"col":19,"index":305},{"line":21,"col":21,"index":307}],"28":[0,{"line":21,"col":26,"index":312},{"line":21,"col":28,"index":314}],"29":[0,{"line":21,"col":19,"index":305},{"line":21,"col":28,"index":314}],"30":[0,{"line":21,"col":34,"index":320},{"line":21,"col":37,"index":323}],"31":[0,{"line":21,"col":18,"index":304},{"line":21,"col":37,"index":323}],"32":[0,{"line":21,"col":2,"index":288},{"line":21,"col":37,"index":323}],"33":[0,{"line":22,"col":21,"index":346},{"line":22,"col":23,"index":348}],"34":[0,{"line":22,"col":26,"index":351},{"line":22,"col":28,"index":353}],"35":[0,{"line":22,"col":34,"index":359},{"line":22,"col":37,"index":362}],"36":[0,{"line":22,"col":20,"index":345},{"line":22,"col":37,"index":362}],"37":[0,{"line":22,"col":2,"index":327},{"line":22,"col":37,"index":362}],"38":[0,{"line":23,"col":30,"index":394},{"line":23,"col":32,"index":396}],"39":[0,{"line":23,"col":35,"index":399},{"line":23,"col":37,"index":401}],"40":[0,{"line":23,"col":45,"index":409},{"line":23,"col":48,"index":412}],"41":[0,{"line":23,"col":29,"index":393},{"line":23,"col":48,"index":412}],"42":[0,{"line":23,"col":2,"index":366},{"line":23,"col":48,"index":412}],"43":[0,{"line":24,"col":18,"index":432},{"line":24,"col":20,"index":434}],"44":[0,{"line":24,"col":23,"index":437},{"line":24,"col":26,"index":440}],"45":[0,{"line":24,"col":29,"index":443},{"line":24,"col":31,"index":445}],"46":[0,{"line":24,"col":17,"index":431},{"line":24,"col":32,"index":446}],"47":[0,{"line":24,"col":2,"index":416},{"line":24,"col":32,"index":446}],"48":[0,{"line":25,"col":27,"index":475},{"line":25,"col":29,"index":477}],"49":[0,{"line":25,"col":32,"index":480},{"line":25,"col":35,"index":483}],"50":[0,{"line":25,"col":38,"index":486},{"line":25,"col":40,"index":488}],"51":[0,{"line":25,"col":26,"index":474},{"line":25,"col":43,"index":491}],"52":[0,{"line":25,"col":2,"index":450},{"line":25,"col":43,"index":491}],"53":[0,{"line":28,"col":23,"index":580},{"line":28,"col":25,"index":582}],"54":[0,{"line":28,"col":31,"index":588},{"line":28,"col":34,"index":591}],"55":[0,{"line":28,"col":40,"index":597},{"line":28,"col":42,"index":599}],"56":[0,{"line":28,"col":18,"index":575},{"line":28,"col":44,"index":601}],"57":[0,{"line":28,"col":2,"index":559},{"line":28,"col":44,"index":601}],"58":[0,{"line":29,"col":32,"index":635},{"line":29,"col":34,"index":637}],"59":[0,{"line":29,"col":40,"index":643},{"line":29,"col":43,"index":646}],"60":[0,{"line":29,"col":49,"index":652},{"line":29,"col":51,"index":654}],"61":[0,{"line":29,"col":27,"index":630},{"line":29,"col":54,"index":657}],"62":[0,{"line":29,"col":2,"index":605},{"line":29,"col":54,"index":657}],"63":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"64":[0,{"line":34,"col":26,"index":777},{"line":34,"col":28,"index":779}],"65":[0,{"line":34,"col":39,"index":790},{"line":34,"col":41,"index":792}],"66":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"67":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"68":[0,{"line":32,"col":2,"index":712},{"line":35,"col":102,"index":812}],"69":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"70":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"71":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"72":[0,{"line":33,"col":8,"index":739},{"line":33,"col":13,"index":744}],"73":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"74":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"75":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"76":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"77":[0,{"line":34,"col":8,"index":759},{"line":34,"col":16,"index":767}],"78":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"79":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"80":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"81":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"82":[0,{"line":35,"col":8,"index":805},{"line":35,"col":10,"index":807}],"83":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"84":[0,{"line":36,"col":17,"index":831},{"line":36,"col":27,"index":841}],"85":[0,{"line":36,"col":2,"index":816},{"line":36,"col":27,"index":841}],"86":[0,{"line":41,"col":9,"index":955},{"line":41,"col":11,"index":957}],"87":[0,{"line":41,"col":2,"index":948},{"line":41,"col":11,"index":957}],"88":[0,{"line":42,"col":9,"index":968},{"line":42,"col":12,"index":971}],"89":[0,{"line":42,"col":2,"index":961},{"line":42,"col":12,"index":971}],"90":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":19,"index":1140}],"91":[0,{"line":47,"col":23,"index":1144},{"line":47,"col":23,"index":1144}],"92":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":23,"index":1144}],"93":[0,{"line":47,"col":2,"index":1123},{"line":47,"col":23,"index":1144}],"94":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":19,"index":1165}],"95":[0,{"line":48,"col":23,"index":1169},{"line":48,"col":23,"index":1169}],"96":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":23,"index":1169}],"97":[0,{"line":48,"col":2,"index":1148},{"line":48,"col":23,"index":1169}],"98":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":19,"index":1190}],"99":[0,{"line":49,"col":23,"index":1194},{"line":49,"col":23,"index":1194}],"100":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":23,"index":1194}],"101":[0,{"line":49,"col":2,"index":1173},{"line":49,"col":23,"index":1194}],"102":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":19,"index":1215}],"103":[0,{"line":50,"col":23,"index":1219},{"line":50,"col":23,"index":1219}],"104":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":23,"index":1219}],"105":[0,{"line":50,"col":2,"index":1198},{"line":50,"col":23,"index":1219}],"106":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":19,"index":1240}],"107":[0,{"line":51,"col":23,"index":1244},{"line":51,"col":23,"index":1244}],"108":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":23,"index":1244}],"109":[0,{"line":51,"col":2,"index":1223},{"line":51,"col":23,"index":1244}],"110":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":19,"index":1265}],"111":[0,{"line":52,"col":21,"index":1267},{"line":52,"col":21,"index":1267}],"112":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":21,"index":1267}],"113":[0,{"line":52,"col":2,"index":1248},{"line":52,"col":21,"index":1267}],"114":[0,{"line":53,"col":16,"index":1285},{"line":53,"col":18,"index":1287}],"115":[0,{"line":53,"col":15,"index":1284},{"line":53,"col":18,"index":1287}],"116":[0,{"line":53,"col":2,"index":1271},{"line":53,"col":18,"index":1287}],"117":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":18,"index":1307}],"118":[0,{"line":54,"col":22,"index":1311},{"line":54,"col":22,"index":1311}],"119":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":22,"index":1311}],"120":[0,{"line":54,"col":2,"index":1291},{"line":54,"col":22,"index":1311}],"121":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":18,"index":1331}],"122":[0,{"line":55,"col":23,"index":1336},{"line":55,"col":23,"index":1336}],"123":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":23,"index":1336}],"124":[0,{"line":55,"col":2,"index":1315},{"line":55,"col":23,"index":1336}],"125":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":18,"index":1356}],"126":[0,{"line":56,"col":22,"index":1360},{"line":56,"col":22,"index":1360}],"127":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":22,"index":1360}],"128":[0,{"line":56,"col":2,"index":1340},{"line":56,"col":22,"index":1360}],"129":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":18,"index":1380}],"130":[0,{"line":57,"col":23,"index":1385},{"line":57,"col":23,"index":1385}],"131":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":23,"index":1385}],"132":[0,{"line":57,"col":2,"index":1364},{"line":57,"col":23,"index":1385}],"133":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":20,"index":1407}],"134":[0,{"line":58,"col":25,"index":1412},{"line":58,"col":25,"index":1412}],"135":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":25,"index":1412}],"136":[0,{"line":58,"col":2,"index":1389},{"line":58,"col":25,"index":1412}],"137":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":18,"index":1432}],"138":[0,{"line":59,"col":23,"index":1437},{"line":59,"col":23,"index":1437}],"139":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":23,"index":1437}],"140":[0,{"line":59,"col":2,"index":1416},{"line":59,"col":23,"index":1437}],"141":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":6,"index":1464}],"142":[0,{"line":61,"col":10,"index":1468},{"line":61,"col":10,"index":1468}],"143":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":10,"index":1468}],"144":[0,{"line":61,"col":15,"index":1473},{"line":61,"col":15,"index":1473}],"145":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":15,"index":1473}],"146":[0,{"line":60,"col":2,"index":1441},{"line":62,"col":38,"index":1477}],"147":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":25,"index":1504}],"148":[0,{"line":63,"col":30,"index":1509},{"line":63,"col":32,"index":1511}],"149":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":33,"index":1512}],"150":[0,{"line":63,"col":2,"index":1481},{"line":63,"col":33,"index":1512}],"151":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":26,"index":1540}],"152":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":35,"index":1549}],"153":[0,{"line":64,"col":40,"index":1554},{"line":64,"col":40,"index":1554}],"154":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":40,"index":1554}],"155":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":41,"index":1555}],"156":[0,{"line":64,"col":2,"index":1516},{"line":64,"col":41,"index":1555}],"157":[0,{"line":67,"col":20,"index":1594},{"line":67,"col":22,"index":1596}],"158":[0,{"line":67,"col":16,"index":1590},{"line":67,"col":23,"index":1597}],"159":[0,{"line":67,"col":31,"index":1605},{"line":67,"col":31,"index":1605}],"160":[0,{"line":67,"col":34,"index":1608},{"line":67,"col":34,"index":1608}],"161":[0,{"line":67,"col":27,"index":1601},{"line":67,"col":35,"index":1609}],"162":[0,{"line":67,"col":2,"index":1576},{"line":67,"col":35,"index":1609}],"163":[0,{"line":69,"col":2,"index":1648},{"line":69,"col":10,"index":1656}],"164":[0,{"line":70,"col":33,"index":1691},{"line":70,"col":36,"index":1694}],"165":[0,{"line":70,"col":29,"index":1687},{"line":70,"col":37,"index":1695}],"166":[0,{"line":70,"col":41,"index":1699},{"line":70,"col":45,"index":1703}],"167":[0,{"line":70,"col":2,"index":1660},{"line":70,"col":45,"index":1703}],"168":[0,{"line":73,"col":9,"index":1741},{"line":73,"col":11,"index":1743}],"169":[0,{"line":73,"col":2,"index":1734},{"line":73,"col":11,"index":1743}],"170":[0,{"line":74,"col":25,"index":1770},{"line":74,"col":26,"index":1771}],"171":[0,{"line":74,"col":2,"index":1747},{"line":74,"col":26,"index":1771}],"172":[0,{"line":75,"col":15,"index":1788},{"line":75,"col":15,"index":1788}],"173":[0,{"line":75,"col":18,"index":1791},{"line":75,"col":18,"index":1791}],"174":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":23,"index":1796}],"175":[0,{"line":75,"col":27,"index":1800},{"line":75,"col":27,"index":1800}],"176":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":27,"index":1800}],"177":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"178":[0,{"line":76,"col":10,"index":1812},{"line":76,"col":15,"index":1817}],"179":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":25,"index":1827}],"180":[0,{"line":76,"col":29,"index":1831},{"line":76,"col":29,"index":1831}],"181":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":29,"index":1831}],"182":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"183":[0,{"line":77,"col":11,"index":1844},{"line":77,"col":11,"index":1844}],"184":[0,{"line":77,"col":21,"index":1854},{"line":77,"col":21,"index":1854}],"185":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"186":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"187":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"188":[0,{"line":78,"col":13,"index":1869},{"line":78,"col":13,"index":1869}],"189":[0,{"line":78,"col":22,"index":1878},{"line":78,"col":22,"index":1878}],"190":[0,{"line":78,"col":18,"index":1874},{"line":78,"col":23,"index":1879}],"191":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"192":[0,{"line":81,"col":8,"index":1911},{"line":81,"col":8,"index":1911}],"193":[0,{"line":81,"col":11,"index":1914},{"line":81,"col":11,"index":1914}],"194":[0,{"line":81,"col":16,"index":1919},{"line":81,"col":18,"index":1921}],"195":[0,{"line":81,"col":21,"index":1924},{"line":81,"col":23,"index":1926}],"196":[0,{"line":81,"col":29,"index":1932},{"line":81,"col":31,"index":1934}],"197":[0,{"line":81,"col":15,"index":1918},{"line":81,"col":31,"index":1934}],"198":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":6,"index":1946}],"199":[0,{"line":82,"col":10,"index":1950},{"line":82,"col":10,"index":1950}],"200":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":10,"index":1950}],"201":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"202":[0,{"line":85,"col":10,"index":1997},{"line":85,"col":10,"index":1997}],"203":[0,{"line":85,"col":15,"index":2002},{"line":85,"col":15,"index":2002}],"204":[0,{"line":85,"col":21,"index":2008},{"line":85,"col":21,"index":2008}],"205":[0,{"line":85,"col":14,"index":2001},{"line":85,"col":21,"index":2008}],"206":[0,{"line":86,"col":6,"index":2020},{"line":86,"col":6,"index":2020}],"207":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"208":[0,{"line":89,"col":9,"index":2036},{"line":89,"col":11,"index":2038}],"209":[0,{"line":89,"col":2,"index":2029},{"line":89,"col":11,"index":2038}],"210":[0,{"line":90,"col":21,"index":2061},{"line":90,"col":21,"index":2061}],"211":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"212":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"213":[0,{"line":90,"col":2,"index":2042},{"line":90,"col":21,"index":2061}],"214":[0,{"line":93,"col":15,"index":2113},{"line":93,"col":15,"index":2113}],"215":[0,{"line":93,"col":18,"index":2116},{"line":93,"col":20,"index":2118}],"216":[0,{"line":93,"col":23,"index":2121},{"line":93,"col":23,"index":2121}],"217":[0,{"line":93,"col":26,"index":2124},{"line":93,"col":28,"index":2126}],"218":[0,{"line":93,"col":32,"index":2130},{"line":93,"col":34,"index":2132}],"219":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":8,"index":2146}],"220":[0,{"line":94,"col":12,"index":2150},{"line":94,"col":12,"index":2150}],"221":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":12,"index":2150}],"222":[0,{"line":95,"col":4,"index":2157},{"line":95,"col":4,"index":2157}],"223":[0,{"line":96,"col":9,"index":2168},{"line":96,"col":9,"index":2168}],"224":[0,{"line":94,"col":4,"index":2142},{"line":96,"col":30,"index":2168}],"225":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"226":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"227":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":21,"index":2220}],"228":[0,{"line":101,"col":27,"index":2226},{"line":101,"col":30,"index":2229}],"229":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":30,"index":2229}],"230":[0,{"line":101,"col":2,"index":2201},{"line":101,"col":30,"index":2229}],"231":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":20,"index":2251}],"232":[0,{"line":102,"col":25,"index":2256},{"line":102,"col":28,"index":2259}],"233":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":28,"index":2259}],"234":[0,{"line":102,"col":2,"index":2233},{"line":102,"col":28,"index":2259}],"235":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":25,"index":2286}],"236":[0,{"line":103,"col":35,"index":2296},{"line":103,"col":38,"index":2299}],"237":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":38,"index":2299}],"238":[0,{"line":103,"col":2,"index":2263},{"line":103,"col":38,"index":2299}],"239":[0,{"line":104,"col":8,"index":2309},{"line":104,"col":8,"index":2309}],"240":[0,{"line":104,"col":13,"index":2314},{"line":104,"col":13,"index":2314}],"241":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"242":[0,{"line":105,"col":8,"index":2324},{"line":105,"col":8,"index":2324}],"243":[0,{"line":105,"col":15,"index":2331},{"line":105,"col":15,"index":2331}],"244":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":16,"index":2332}],"245":[0,{"line":105,"col":26,"index":2342},{"line":105,"col":26,"index":2342}],"246":[0,{"line":105,"col":22,"index":2338},{"line":105,"col":27,"index":2343}],"247":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":27,"index":2343}],"248":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"249":[0,{"line":106,"col":19,"index":2364},{"line":106,"col":19,"index":2364}],"250":[0,{"line":106,"col":26,"index":2371},{"line":106,"col":26,"index":2371}],"251":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":27,"index":2372}],"252":[0,{"line":106,"col":37,"index":2382},{"line":106,"col":37,"index":2382}],"253":[0,{"line":106,"col":33,"index":2378},{"line":106,"col":38,"index":2383}],"254":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":38,"index":2383}],"255":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"256":[0,{"line":107,"col":18,"index":2403},{"line":107,"col":18,"index":2403}],"257":[0,{"line":107,"col":25,"index":2410},{"line":107,"col":25,"index":2410}],"258":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":26,"index":2411}],"259":[0,{"line":107,"col":35,"index":2420},{"line":107,"col":35,"index":2420}],"260":[0,{"line":107,"col":31,"index":2416},{"line":107,"col":36,"index":2421}],"261":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":36,"index":2421}],"262":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"263":[0,{"line":110,"col":6,"index":2459},{"line":110,"col":10,"index":2463}],"264":[0,{"line":111,"col":6,"index":2472},{"line":111,"col":9,"index":2475}],"265":[0,{"line":112,"col":6,"index":2484},{"line":112,"col":10,"index":2488}],"266":[0,{"line":109,"col":23,"index":2447},{"line":113,"col":68,"index":2492}],"267":[0,{"line":109,"col":2,"index":2426},{"line":113,"col":68,"index":2492}],"268":[0,{"line":116,"col":6,"index":2534},{"line":116,"col":10,"index":2538}],"269":[0,{"line":117,"col":6,"index":2547},{"line":117,"col":9,"index":2550}],"270":[0,{"line":118,"col":6,"index":2559},{"line":118,"col":10,"index":2563}],"271":[0,{"line":115,"col":27,"index":2522},{"line":119,"col":72,"index":2567}],"272":[0,{"line":115,"col":2,"index":2497},{"line":119,"col":72,"index":2567}],"273":[0,{"line":122,"col":6,"index":2603},{"line":122,"col":10,"index":2607}],"274":[0,{"line":123,"col":6,"index":2616},{"line":123,"col":9,"index":2619}],"275":[0,{"line":124,"col":6,"index":2628},{"line":124,"col":10,"index":2632}],"276":[0,{"line":121,"col":22,"index":2592},{"line":125,"col":66,"index":2636}],"277":[0,{"line":121,"col":2,"index":2572},{"line":125,"col":66,"index":2636}],"278":[0,{"line":128,"col":6,"index":2677},{"line":128,"col":10,"index":2681}],"279":[0,{"line":129,"col":6,"index":2690},{"line":129,"col":9,"index":2693}],"280":[0,{"line":130,"col":6,"index":2702},{"line":130,"col":10,"index":2706}],"281":[0,{"line":127,"col":26,"index":2665},{"line":131,"col":71,"index":2710}],"282":[0,{"line":127,"col":2,"index":2641},{"line":131,"col":71,"index":2710}],"283":[0,{"line":133,"col":21,"index":2734},{"line":133,"col":24,"index":2737}],"284":[0,{"line":133,"col":27,"index":2740},{"line":133,"col":27,"index":2740}],"285":[0,{"line":133,"col":34,"index":2747},{"line":133,"col":34,"index":2747}],"286":[0,{"line":133,"col":17,"index":2730},{"line":133,"col":34,"index":2747}],"287":[0,{"line":133,"col":2,"index":2715},{"line":133,"col":34,"index":2747}],"288":[0,{"line":134,"col":16,"index":2765},{"line":134,"col":16,"index":2765}],"289":[0,{"line":134,"col":19,"index":2768},{"line":134,"col":19,"index":2768}],"290":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":28,"index":2777}],"291":[0,{"line":134,"col":32,"index":2781},{"line":134,"col":33,"index":2782}],"292":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":33,"index":2782}],"293":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":36,"index":2785}],"294":[0,{"line":134,"col":40,"index":2789},{"line":134,"col":40,"index":2789}],"295":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":40,"index":2789}],"296":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":47,"index":2796}],"297":[0,{"line":134,"col":51,"index":2800},{"line":134,"col":51,"index":2800}],"298":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":51,"index":2800}],"299":[0,{"line":134,"col":24,"index":2773},{"line":134,"col":51,"index":2800}],"300":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"301":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":12,"index":2841}],"302":[0,{"line":137,"col":17,"index":2846},{"line":137,"col":19,"index":2848}],"303":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":19,"index":2848}],"304":[0,{"line":137,"col":2,"index":2831},{"line":137,"col":19,"index":2848}],"305":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":16,"index":2866}],"306":[0,{"line":138,"col":22,"index":2872},{"line":138,"col":24,"index":2874}],"307":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":25,"index":2875}],"308":[0,{"line":138,"col":2,"index":2852},{"line":138,"col":25,"index":2875}],"309":[0,{"line":141,"col":13,"index":2939},{"line":141,"col":13,"index":2939}],"310":[0,{"line":141,"col":16,"index":2942},{"line":141,"col":16,"index":2942}],"311":[0,{"line":141,"col":21,"index":2947},{"line":141,"col":21,"index":2947}],"312":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"313":[0,{"line":142,"col":31,"index":2980},{"line":142,"col":33,"index":2982}],"314":[0,{"line":142,"col":36,"index":2985},{"line":142,"col":37,"index":2986}],"315":[0,{"line":142,"col":24,"index":2973},{"line":142,"col":38,"index":2987}],"316":[0,{"line":142,"col":2,"index":2951},{"line":142,"col":38,"index":2987}],"317":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":24,"index":3013}],"318":[0,{"line":143,"col":33,"index":3022},{"line":143,"col":34,"index":3023}],"319":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":35,"index":3024}],"320":[0,{"line":143,"col":2,"index":2991},{"line":143,"col":35,"index":3024}],"321":[0,{"line":145,"col":19,"index":3102},{"line":145,"col":19,"index":3102}],"322":[0,{"line":145,"col":22,"index":3105},{"line":145,"col":26,"index":3109}],"323":[0,{"line":145,"col":16,"index":3099},{"line":145,"col":27,"index":3110}],"324":[0,{"line":145,"col":2,"index":3085},{"line":145,"col":27,"index":3110}],"325":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":22,"index":3279}],"326":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":31,"index":3288}],"327":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":36,"index":3293}],"328":[0,{"line":150,"col":40,"index":3297},{"line":150,"col":41,"index":3298}],"329":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":41,"index":3298}],"330":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":41,"index":3298}],"331":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":42,"index":3299}],"332":[0,{"line":150,"col":2,"index":3259},{"line":150,"col":42,"index":3299}],"333":[0,{"line":152,"col":25,"index":3356},{"line":152,"col":25,"index":3356}],"334":[0,{"line":152,"col":28,"index":3359},{"line":152,"col":32,"index":3363}],"335":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":33,"index":3364}],"336":[0,{"line":152,"col":42,"index":3373},{"line":152,"col":42,"index":3373}],"337":[0,{"line":152,"col":45,"index":3376},{"line":152,"col":47,"index":3378}],"338":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":54,"index":3385}],"339":[0,{"line":152,"col":58,"index":3389},{"line":152,"col":60,"index":3391}],"340":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":60,"index":3391}],"341":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"342":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"343":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"344":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"345":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"346":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"347":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"348":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"349":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"350":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"351":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":62,"index":3393}],"352":[0,{"line":152,"col":2,"index":3333},{"line":152,"col":62,"index":3393}],"353":[0,{"line":155,"col":21,"index":3458},{"line":155,"col":21,"index":3458}],"354":[0,{"line":155,"col":15,"index":3452},{"line":155,"col":22,"index":3459}],"355":[0,{"line":155,"col":4,"index":3441},{"line":155,"col":22,"index":3459}],"356":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":6,"index":3477}],"357":[0,{"line":157,"col":10,"index":3481},{"line":157,"col":11,"index":3482}],"358":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":11,"index":3482}],"359":[0,{"line":158,"col":11,"index":3496},{"line":158,"col":11,"index":3496}],"360":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"361":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"362":[0,{"line":156,"col":4,"index":3465},{"line":159,"col":41,"index":3502}],"363":[0,{"line":155,"col":4,"index":3441},{"line":159,"col":65,"index":3502}],"364":[0,{"line":154,"col":2,"index":3414},{"line":160,"col":94,"index":3506}],"365":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":22,"index":3545}],"366":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":31,"index":3554}],"367":[0,{"line":162,"col":36,"index":3559},{"line":162,"col":39,"index":3562}],"368":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":39,"index":3562}],"369":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":40,"index":3563}],"370":[0,{"line":162,"col":2,"index":3525},{"line":162,"col":40,"index":3563}],"371":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":10,"index":3576}],"372":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":18,"index":3584}],"373":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":23,"index":3589}],"374":[0,{"line":164,"col":27,"index":3593},{"line":164,"col":27,"index":3593}],"375":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":27,"index":3593}],"376":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":27,"index":3593}],"377":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":28,"index":3594}],"378":[0,{"line":164,"col":2,"index":3568},{"line":164,"col":28,"index":3594}],"379":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":23,"index":3620}],"380":[0,{"line":166,"col":37,"index":3634},{"line":166,"col":37,"index":3634}],"381":[0,{"line":166,"col":40,"index":3637},{"line":166,"col":40,"index":3637}],"382":[0,{"line":166,"col":33,"index":3630},{"line":166,"col":41,"index":3638}],"383":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":42,"index":3639}],"384":[0,{"line":166,"col":2,"index":3599},{"line":166,"col":42,"index":3639}],"385":[0,{"line":169,"col":17,"index":3698},{"line":169,"col":17,"index":3698}],"386":[0,{"line":169,"col":20,"index":3701},{"line":169,"col":20,"index":3701}],"387":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":21,"index":3702}],"388":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":28,"index":3709}],"389":[0,{"line":169,"col":2,"index":3683},{"line":169,"col":28,"index":3709}],"390":[0,{"line":172,"col":20,"index":3753},{"line":172,"col":20,"index":3753}],"391":[0,{"line":172,"col":23,"index":3756},{"line":172,"col":23,"index":3756}],"392":[0,{"line":172,"col":26,"index":3759},{"line":172,"col":26,"index":3759}],"393":[0,{"line":172,"col":19,"index":3752},{"line":172,"col":27,"index":3760}],"394":[0,{"line":172,"col":2,"index":3735},{"line":172,"col":27,"index":3760}],"395":[0,{"line":173,"col":24,"index":3786},{"line":173,"col":24,"index":3786}],"396":[0,{"line":173,"col":27,"index":3789},{"line":173,"col":27,"index":3789}],"397":[0,{"line":173,"col":30,"index":3792},{"line":173,"col":30,"index":3792}],"398":[0,{"line":173,"col":20,"index":3782},{"line":173,"col":31,"index":3793}],"399":[0,{"line":173,"col":2,"index":3764},{"line":173,"col":31,"index":3793}],"400":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":18,"index":3813}],"401":[0,{"line":174,"col":23,"index":3818},{"line":174,"col":23,"index":3818}],"402":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":23,"index":3818}],"403":[0,{"line":174,"col":2,"index":3797},{"line":174,"col":23,"index":3818}],"404":[0,{"line":175,"col":19,"index":3839},{"line":175,"col":19,"index":3839}],"405":[0,{"line":175,"col":22,"index":3842},{"line":175,"col":22,"index":3842}],"406":[0,{"line":175,"col":25,"index":3845},{"line":175,"col":25,"index":3845}],"407":[0,{"line":175,"col":18,"index":3838},{"line":175,"col":26,"index":3846}],"408":[0,{"line":175,"col":2,"index":3822},{"line":175,"col":26,"index":3846}],"409":[0,{"line":176,"col":24,"index":3872},{"line":176,"col":24,"index":3872}],"410":[0,{"line":176,"col":27,"index":3875},{"line":176,"col":27,"index":3875}],"411":[0,{"line":176,"col":30,"index":3878},{"line":176,"col":30,"index":3878}],"412":[0,{"line":176,"col":19,"index":3867},{"line":176,"col":31,"index":3879}],"413":[0,{"line":176,"col":2,"index":3850},{"line":176,"col":31,"index":3879}],"414":[0,{"line":177,"col":23,"index":3904},{"line":177,"col":23,"index":3904}],"415":[0,{"line":177,"col":26,"index":3907},{"line":177,"col":26,"index":3907}],"416":[0,{"line":177,"col":29,"index":3910},{"line":177,"col":29,"index":3910}],"417":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":30,"index":3911}],"418":[0,{"line":177,"col":32,"index":3913},{"line":177,"col":32,"index":3913}],"419":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":33,"index":3914}],"420":[0,{"line":177,"col":2,"index":3883},{"line":177,"col":33,"index":3914}],"421":[0,{"line":178,"col":28,"index":3944},{"line":178,"col":33,"index":3949}],"422":[0,{"line":178,"col":22,"index":3938},{"line":178,"col":33,"index":3949}],"423":[0,{"line":178,"col":42,"index":3958},{"line":178,"col":45,"index":3961}],"424":[0,{"line":178,"col":36,"index":3952},{"line":178,"col":45,"index":3961}],"425":[0,{"line":178,"col":20,"index":3936},{"line":178,"col":47,"index":3963}],"426":[0,{"line":178,"col":2,"index":3918},{"line":178,"col":47,"index":3963}],"427":[0,{"line":179,"col":25,"index":3990},{"line":179,"col":30,"index":3995}],"428":[0,{"line":179,"col":33,"index":3998},{"line":179,"col":38,"index":4003}],"429":[0,{"line":179,"col":41,"index":4006},{"line":179,"col":46,"index":4011}],"430":[0,{"line":179,"col":49,"index":4014},{"line":179,"col":52,"index":4017}],"431":[0,{"line":179,"col":21,"index":3986},{"line":179,"col":53,"index":4018}],"432":[0,{"line":179,"col":2,"index":3967},{"line":179,"col":53,"index":4018}],"433":[0,{"line":180,"col":29,"index":4049},{"line":180,"col":35,"index":4055}],"434":[0,{"line":180,"col":23,"index":4043},{"line":180,"col":35,"index":4055}],"435":[0,{"line":180,"col":44,"index":4064},{"line":180,"col":47,"index":4067}],"436":[0,{"line":180,"col":38,"index":4058},{"line":180,"col":47,"index":4067}],"437":[0,{"line":180,"col":53,"index":4073},{"line":180,"col":63,"index":4083}],"438":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"439":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"440":[0,{"line":180,"col":2,"index":4022},{"line":180,"col":65,"index":4085}],"441":[0,{"line":181,"col":21,"index":4108},{"line":181,"col":21,"index":4108}],"442":[0,{"line":181,"col":24,"index":4111},{"line":181,"col":24,"index":4111}],"443":[0,{"line":181,"col":27,"index":4114},{"line":181,"col":27,"index":4114}],"444":[0,{"line":181,"col":17,"index":4104},{"line":181,"col":28,"index":4115}],"445":[0,{"line":181,"col":2,"index":4089},{"line":181,"col":28,"index":4115}],"446":[0,{"line":185,"col":22,"index":4187},{"line":185,"col":22,"index":4187}],"447":[0,{"line":185,"col":19,"index":4184},{"line":185,"col":22,"index":4187}],"448":[0,{"line":185,"col":28,"index":4193},{"line":185,"col":32,"index":4197}],"449":[0,{"line":185,"col":25,"index":4190},{"line":185,"col":32,"index":4197}],"450":[0,{"line":185,"col":17,"index":4182},{"line":185,"col":34,"index":4199}],"451":[0,{"line":185,"col":4,"index":4169},{"line":185,"col":34,"index":4199}],"452":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":9,"index":4210}],"453":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"454":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"455":[0,{"line":185,"col":4,"index":4169},{"line":186,"col":47,"index":4212}],"456":[0,{"line":184,"col":2,"index":4149},{"line":186,"col":65,"index":4212}],"457":[0,{"line":189,"col":21,"index":4253},{"line":189,"col":23,"index":4255}],"458":[0,{"line":189,"col":26,"index":4258},{"line":189,"col":26,"index":4258}],"459":[0,{"line":189,"col":17,"index":4249},{"line":189,"col":27,"index":4259}],"460":[0,{"line":189,"col":4,"index":4236},{"line":189,"col":27,"index":4259}],"461":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":9,"index":4270}],"462":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"463":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"464":[0,{"line":189,"col":4,"index":4236},{"line":190,"col":41,"index":4273}],"465":[0,{"line":188,"col":2,"index":4217},{"line":190,"col":58,"index":4273}],"466":[0,{"line":192,"col":14,"index":4290},{"line":192,"col":14,"index":4290}],"467":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":19,"index":4295}],"468":[0,{"line":192,"col":24,"index":4300},{"line":192,"col":25,"index":4301}],"469":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":25,"index":4301}],"470":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"471":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":19,"index":4349}],"472":[0,{"line":195,"col":24,"index":4354},{"line":195,"col":28,"index":4358}],"473":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":29,"index":4359}],"474":[0,{"line":195,"col":2,"index":4332},{"line":195,"col":29,"index":4359}],"475":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":27,"index":4388}],"476":[0,{"line":196,"col":38,"index":4399},{"line":196,"col":42,"index":4403}],"477":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":43,"index":4404}],"478":[0,{"line":196,"col":2,"index":4363},{"line":196,"col":43,"index":4404}],"479":[0,{"line":197,"col":22,"index":4428},{"line":197,"col":22,"index":4428}],"480":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":23,"index":4429}],"481":[0,{"line":197,"col":41,"index":4447},{"line":197,"col":41,"index":4447}],"482":[0,{"line":197,"col":43,"index":4449},{"line":197,"col":43,"index":4449}],"483":[0,{"line":197,"col":45,"index":4451},{"line":197,"col":45,"index":4451}],"484":[0,{"line":197,"col":37,"index":4443},{"line":197,"col":46,"index":4452}],"485":[0,{"line":197,"col":28,"index":4434},{"line":197,"col":47,"index":4453}],"486":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":48,"index":4454}],"487":[0,{"line":197,"col":2,"index":4408},{"line":197,"col":48,"index":4454}],"488":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":20,"index":4501}],"489":[0,{"line":200,"col":24,"index":4505},{"line":200,"col":24,"index":4505}],"490":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":24,"index":4505}],"491":[0,{"line":200,"col":2,"index":4483},{"line":200,"col":24,"index":4505}],"492":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":13,"index":4549}],"493":[0,{"line":202,"col":18,"index":4554},{"line":202,"col":18,"index":4554}],"494":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":18,"index":4554}],"495":[0,{"line":202,"col":2,"index":4538},{"line":202,"col":18,"index":4554}],"496":[0,{"line":205,"col":2,"index":4572},{"line":205,"col":14,"index":4584}],"497":[0,{"line":206,"col":2,"index":4588},{"line":206,"col":12,"index":4598}],"498":[0,{"line":209,"col":21,"index":4636},{"line":209,"col":23,"index":4638}],"499":[0,{"line":209,"col":17,"index":4632},{"line":209,"col":24,"index":4639}],"500":[0,{"line":209,"col":2,"index":4617},{"line":209,"col":24,"index":4639}],"501":[0,{"line":211,"col":2,"index":4644},{"line":211,"col":24,"index":4666}],"502":[0,{"line":213,"col":10,"index":4679},{"line":213,"col":16,"index":4685}],"503":[0,{"line":213,"col":2,"index":4671},{"line":213,"col":16,"index":4685}],"504":[0,{"line":221,"col":19,"index":4906},{"line":221,"col":19,"index":4906}],"505":[0,{"line":221,"col":15,"index":4902},{"line":221,"col":15,"index":4902}],"506":[0,{"line":221,"col":2,"index":4889},{"line":221,"col":29,"index":4916}],"507":[0,{"line":14,"col":0,"index":140},{"line":225,"col":4855,"index":4995}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/SuperSpec.qnt"},"map":{"1":[0,{"line":1,"col":12,"index":24},{"line":1,"col":12,"index":24}],"2":[0,{"line":1,"col":2,"index":14},{"line":1,"col":12,"index":24}],"3":[0,{"line":0,"col":0,"index":0},{"line":2,"col":26,"index":26}],"4":[0,{"line":5,"col":12,"index":53},{"line":5,"col":12,"index":53}],"5":[0,{"line":5,"col":2,"index":43},{"line":5,"col":12,"index":53}],"6":[0,{"line":4,"col":0,"index":29},{"line":6,"col":26,"index":55}],"7":[0,{"line":9,"col":11,"index":84},{"line":9,"col":13,"index":86}],"8":[0,{"line":9,"col":2,"index":75},{"line":9,"col":13,"index":86}],"9":[0,{"line":10,"col":9,"index":97},{"line":10,"col":11,"index":99}],"10":[0,{"line":10,"col":2,"index":90},{"line":10,"col":11,"index":99}],"11":[0,{"line":8,"col":0,"index":58},{"line":11,"col":43,"index":101}],"12":[0,{"line":16,"col":11,"index":186},{"line":16,"col":13,"index":188}],"13":[0,{"line":16,"col":2,"index":177},{"line":16,"col":13,"index":188}],"14":[0,{"line":17,"col":15,"index":205},{"line":17,"col":17,"index":207}],"15":[0,{"line":17,"col":11,"index":201},{"line":17,"col":18,"index":208}],"16":[0,{"line":17,"col":2,"index":192},{"line":17,"col":18,"index":208}],"17":[0,{"line":18,"col":19,"index":229},{"line":18,"col":21,"index":231}],"18":[0,{"line":18,"col":15,"index":225},{"line":18,"col":22,"index":232}],"19":[0,{"line":18,"col":2,"index":212},{"line":18,"col":22,"index":232}],"20":[0,{"line":19,"col":20,"index":254},{"line":19,"col":23,"index":257}],"21":[0,{"line":19,"col":15,"index":249},{"line":19,"col":24,"index":258}],"22":[0,{"line":19,"col":2,"index":236},{"line":19,"col":24,"index":258}],"23":[0,{"line":20,"col":15,"index":275},{"line":20,"col":17,"index":277}],"24":[0,{"line":20,"col":22,"index":282},{"line":20,"col":24,"index":284}],"25":[0,{"line":20,"col":15,"index":275},{"line":20,"col":24,"index":284}],"26":[0,{"line":20,"col":2,"index":262},{"line":20,"col":24,"index":284}],"27":[0,{"line":21,"col":19,"index":305},{"line":21,"col":21,"index":307}],"28":[0,{"line":21,"col":26,"index":312},{"line":21,"col":28,"index":314}],"29":[0,{"line":21,"col":19,"index":305},{"line":21,"col":28,"index":314}],"30":[0,{"line":21,"col":34,"index":320},{"line":21,"col":37,"index":323}],"31":[0,{"line":21,"col":18,"index":304},{"line":21,"col":37,"index":323}],"32":[0,{"line":21,"col":2,"index":288},{"line":21,"col":37,"index":323}],"33":[0,{"line":22,"col":21,"index":346},{"line":22,"col":23,"index":348}],"34":[0,{"line":22,"col":26,"index":351},{"line":22,"col":28,"index":353}],"35":[0,{"line":22,"col":34,"index":359},{"line":22,"col":37,"index":362}],"36":[0,{"line":22,"col":20,"index":345},{"line":22,"col":37,"index":362}],"37":[0,{"line":22,"col":2,"index":327},{"line":22,"col":37,"index":362}],"38":[0,{"line":23,"col":30,"index":394},{"line":23,"col":32,"index":396}],"39":[0,{"line":23,"col":35,"index":399},{"line":23,"col":37,"index":401}],"40":[0,{"line":23,"col":45,"index":409},{"line":23,"col":48,"index":412}],"41":[0,{"line":23,"col":29,"index":393},{"line":23,"col":48,"index":412}],"42":[0,{"line":23,"col":2,"index":366},{"line":23,"col":48,"index":412}],"43":[0,{"line":24,"col":18,"index":432},{"line":24,"col":20,"index":434}],"44":[0,{"line":24,"col":23,"index":437},{"line":24,"col":26,"index":440}],"45":[0,{"line":24,"col":29,"index":443},{"line":24,"col":31,"index":445}],"46":[0,{"line":24,"col":17,"index":431},{"line":24,"col":32,"index":446}],"47":[0,{"line":24,"col":2,"index":416},{"line":24,"col":32,"index":446}],"48":[0,{"line":25,"col":27,"index":475},{"line":25,"col":29,"index":477}],"49":[0,{"line":25,"col":32,"index":480},{"line":25,"col":35,"index":483}],"50":[0,{"line":25,"col":38,"index":486},{"line":25,"col":40,"index":488}],"51":[0,{"line":25,"col":26,"index":474},{"line":25,"col":43,"index":491}],"52":[0,{"line":25,"col":2,"index":450},{"line":25,"col":43,"index":491}],"53":[0,{"line":28,"col":23,"index":580},{"line":28,"col":25,"index":582}],"54":[0,{"line":28,"col":31,"index":588},{"line":28,"col":34,"index":591}],"55":[0,{"line":28,"col":40,"index":597},{"line":28,"col":42,"index":599}],"56":[0,{"line":28,"col":18,"index":575},{"line":28,"col":44,"index":601}],"57":[0,{"line":28,"col":2,"index":559},{"line":28,"col":44,"index":601}],"58":[0,{"line":29,"col":32,"index":635},{"line":29,"col":34,"index":637}],"59":[0,{"line":29,"col":40,"index":643},{"line":29,"col":43,"index":646}],"60":[0,{"line":29,"col":49,"index":652},{"line":29,"col":51,"index":654}],"61":[0,{"line":29,"col":27,"index":630},{"line":29,"col":54,"index":657}],"62":[0,{"line":29,"col":2,"index":605},{"line":29,"col":54,"index":657}],"63":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"64":[0,{"line":34,"col":26,"index":777},{"line":34,"col":28,"index":779}],"65":[0,{"line":34,"col":39,"index":790},{"line":34,"col":41,"index":792}],"66":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"67":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"68":[0,{"line":32,"col":2,"index":712},{"line":35,"col":102,"index":812}],"69":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"70":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"71":[0,{"line":33,"col":8,"index":739},{"line":33,"col":13,"index":744}],"72":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"73":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"74":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"75":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"76":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"77":[0,{"line":34,"col":8,"index":759},{"line":34,"col":16,"index":767}],"78":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"79":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"80":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"81":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"82":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"83":[0,{"line":35,"col":8,"index":805},{"line":35,"col":10,"index":807}],"84":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"85":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"86":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"87":[0,{"line":36,"col":17,"index":831},{"line":36,"col":27,"index":841}],"88":[0,{"line":36,"col":2,"index":816},{"line":36,"col":27,"index":841}],"89":[0,{"line":41,"col":9,"index":955},{"line":41,"col":11,"index":957}],"90":[0,{"line":41,"col":2,"index":948},{"line":41,"col":11,"index":957}],"91":[0,{"line":42,"col":9,"index":968},{"line":42,"col":12,"index":971}],"92":[0,{"line":42,"col":2,"index":961},{"line":42,"col":12,"index":971}],"93":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":19,"index":1140}],"94":[0,{"line":47,"col":23,"index":1144},{"line":47,"col":23,"index":1144}],"95":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":23,"index":1144}],"96":[0,{"line":47,"col":2,"index":1123},{"line":47,"col":23,"index":1144}],"97":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":19,"index":1165}],"98":[0,{"line":48,"col":23,"index":1169},{"line":48,"col":23,"index":1169}],"99":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":23,"index":1169}],"100":[0,{"line":48,"col":2,"index":1148},{"line":48,"col":23,"index":1169}],"101":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":19,"index":1190}],"102":[0,{"line":49,"col":23,"index":1194},{"line":49,"col":23,"index":1194}],"103":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":23,"index":1194}],"104":[0,{"line":49,"col":2,"index":1173},{"line":49,"col":23,"index":1194}],"105":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":19,"index":1215}],"106":[0,{"line":50,"col":23,"index":1219},{"line":50,"col":23,"index":1219}],"107":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":23,"index":1219}],"108":[0,{"line":50,"col":2,"index":1198},{"line":50,"col":23,"index":1219}],"109":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":19,"index":1240}],"110":[0,{"line":51,"col":23,"index":1244},{"line":51,"col":23,"index":1244}],"111":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":23,"index":1244}],"112":[0,{"line":51,"col":2,"index":1223},{"line":51,"col":23,"index":1244}],"113":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":19,"index":1265}],"114":[0,{"line":52,"col":21,"index":1267},{"line":52,"col":21,"index":1267}],"115":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":21,"index":1267}],"116":[0,{"line":52,"col":2,"index":1248},{"line":52,"col":21,"index":1267}],"117":[0,{"line":53,"col":16,"index":1285},{"line":53,"col":18,"index":1287}],"118":[0,{"line":53,"col":15,"index":1284},{"line":53,"col":18,"index":1287}],"119":[0,{"line":53,"col":2,"index":1271},{"line":53,"col":18,"index":1287}],"120":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":18,"index":1307}],"121":[0,{"line":54,"col":22,"index":1311},{"line":54,"col":22,"index":1311}],"122":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":22,"index":1311}],"123":[0,{"line":54,"col":2,"index":1291},{"line":54,"col":22,"index":1311}],"124":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":18,"index":1331}],"125":[0,{"line":55,"col":23,"index":1336},{"line":55,"col":23,"index":1336}],"126":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":23,"index":1336}],"127":[0,{"line":55,"col":2,"index":1315},{"line":55,"col":23,"index":1336}],"128":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":18,"index":1356}],"129":[0,{"line":56,"col":22,"index":1360},{"line":56,"col":22,"index":1360}],"130":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":22,"index":1360}],"131":[0,{"line":56,"col":2,"index":1340},{"line":56,"col":22,"index":1360}],"132":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":18,"index":1380}],"133":[0,{"line":57,"col":23,"index":1385},{"line":57,"col":23,"index":1385}],"134":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":23,"index":1385}],"135":[0,{"line":57,"col":2,"index":1364},{"line":57,"col":23,"index":1385}],"136":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":20,"index":1407}],"137":[0,{"line":58,"col":25,"index":1412},{"line":58,"col":25,"index":1412}],"138":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":25,"index":1412}],"139":[0,{"line":58,"col":2,"index":1389},{"line":58,"col":25,"index":1412}],"140":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":18,"index":1432}],"141":[0,{"line":59,"col":23,"index":1437},{"line":59,"col":23,"index":1437}],"142":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":23,"index":1437}],"143":[0,{"line":59,"col":2,"index":1416},{"line":59,"col":23,"index":1437}],"144":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":6,"index":1464}],"145":[0,{"line":61,"col":10,"index":1468},{"line":61,"col":10,"index":1468}],"146":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":10,"index":1468}],"147":[0,{"line":61,"col":15,"index":1473},{"line":61,"col":15,"index":1473}],"148":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":15,"index":1473}],"149":[0,{"line":60,"col":2,"index":1441},{"line":62,"col":38,"index":1477}],"150":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":25,"index":1504}],"151":[0,{"line":63,"col":30,"index":1509},{"line":63,"col":32,"index":1511}],"152":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":33,"index":1512}],"153":[0,{"line":63,"col":2,"index":1481},{"line":63,"col":33,"index":1512}],"154":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":26,"index":1540}],"155":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":35,"index":1549}],"156":[0,{"line":64,"col":40,"index":1554},{"line":64,"col":40,"index":1554}],"157":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":40,"index":1554}],"158":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":41,"index":1555}],"159":[0,{"line":64,"col":2,"index":1516},{"line":64,"col":41,"index":1555}],"160":[0,{"line":67,"col":20,"index":1594},{"line":67,"col":22,"index":1596}],"161":[0,{"line":67,"col":16,"index":1590},{"line":67,"col":23,"index":1597}],"162":[0,{"line":67,"col":31,"index":1605},{"line":67,"col":31,"index":1605}],"163":[0,{"line":67,"col":34,"index":1608},{"line":67,"col":34,"index":1608}],"164":[0,{"line":67,"col":27,"index":1601},{"line":67,"col":35,"index":1609}],"165":[0,{"line":67,"col":2,"index":1576},{"line":67,"col":35,"index":1609}],"166":[0,{"line":69,"col":2,"index":1648},{"line":69,"col":10,"index":1656}],"167":[0,{"line":70,"col":33,"index":1691},{"line":70,"col":36,"index":1694}],"168":[0,{"line":70,"col":29,"index":1687},{"line":70,"col":37,"index":1695}],"169":[0,{"line":70,"col":41,"index":1699},{"line":70,"col":45,"index":1703}],"170":[0,{"line":70,"col":2,"index":1660},{"line":70,"col":45,"index":1703}],"171":[0,{"line":73,"col":9,"index":1741},{"line":73,"col":11,"index":1743}],"172":[0,{"line":73,"col":2,"index":1734},{"line":73,"col":11,"index":1743}],"173":[0,{"line":74,"col":25,"index":1770},{"line":74,"col":26,"index":1771}],"174":[0,{"line":74,"col":2,"index":1747},{"line":74,"col":26,"index":1771}],"175":[0,{"line":75,"col":15,"index":1788},{"line":75,"col":15,"index":1788}],"176":[0,{"line":75,"col":18,"index":1791},{"line":75,"col":18,"index":1791}],"177":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":23,"index":1796}],"178":[0,{"line":75,"col":27,"index":1800},{"line":75,"col":27,"index":1800}],"179":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":27,"index":1800}],"180":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"181":[0,{"line":76,"col":10,"index":1812},{"line":76,"col":15,"index":1817}],"182":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":25,"index":1827}],"183":[0,{"line":76,"col":29,"index":1831},{"line":76,"col":29,"index":1831}],"184":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":29,"index":1831}],"185":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"186":[0,{"line":77,"col":11,"index":1844},{"line":77,"col":11,"index":1844}],"187":[0,{"line":77,"col":21,"index":1854},{"line":77,"col":21,"index":1854}],"188":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"189":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"190":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"191":[0,{"line":78,"col":13,"index":1869},{"line":78,"col":13,"index":1869}],"192":[0,{"line":78,"col":22,"index":1878},{"line":78,"col":22,"index":1878}],"193":[0,{"line":78,"col":18,"index":1874},{"line":78,"col":23,"index":1879}],"194":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"195":[0,{"line":81,"col":8,"index":1911},{"line":81,"col":8,"index":1911}],"196":[0,{"line":81,"col":11,"index":1914},{"line":81,"col":11,"index":1914}],"197":[0,{"line":81,"col":16,"index":1919},{"line":81,"col":18,"index":1921}],"198":[0,{"line":81,"col":21,"index":1924},{"line":81,"col":23,"index":1926}],"199":[0,{"line":81,"col":29,"index":1932},{"line":81,"col":31,"index":1934}],"200":[0,{"line":81,"col":15,"index":1918},{"line":81,"col":31,"index":1934}],"201":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":6,"index":1946}],"202":[0,{"line":82,"col":10,"index":1950},{"line":82,"col":10,"index":1950}],"203":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":10,"index":1950}],"204":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"205":[0,{"line":85,"col":10,"index":1997},{"line":85,"col":10,"index":1997}],"206":[0,{"line":85,"col":15,"index":2002},{"line":85,"col":15,"index":2002}],"207":[0,{"line":85,"col":21,"index":2008},{"line":85,"col":21,"index":2008}],"208":[0,{"line":85,"col":14,"index":2001},{"line":85,"col":21,"index":2008}],"209":[0,{"line":86,"col":6,"index":2020},{"line":86,"col":6,"index":2020}],"210":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"211":[0,{"line":89,"col":9,"index":2036},{"line":89,"col":11,"index":2038}],"212":[0,{"line":89,"col":2,"index":2029},{"line":89,"col":11,"index":2038}],"213":[0,{"line":90,"col":21,"index":2061},{"line":90,"col":21,"index":2061}],"214":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"215":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"216":[0,{"line":90,"col":2,"index":2042},{"line":90,"col":21,"index":2061}],"217":[0,{"line":93,"col":15,"index":2113},{"line":93,"col":15,"index":2113}],"218":[0,{"line":93,"col":18,"index":2116},{"line":93,"col":20,"index":2118}],"219":[0,{"line":93,"col":23,"index":2121},{"line":93,"col":23,"index":2121}],"220":[0,{"line":93,"col":26,"index":2124},{"line":93,"col":28,"index":2126}],"221":[0,{"line":93,"col":32,"index":2130},{"line":93,"col":34,"index":2132}],"222":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":8,"index":2146}],"223":[0,{"line":94,"col":12,"index":2150},{"line":94,"col":12,"index":2150}],"224":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":12,"index":2150}],"225":[0,{"line":95,"col":4,"index":2157},{"line":95,"col":4,"index":2157}],"226":[0,{"line":96,"col":9,"index":2168},{"line":96,"col":9,"index":2168}],"227":[0,{"line":94,"col":4,"index":2142},{"line":96,"col":30,"index":2168}],"228":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"229":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"230":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":21,"index":2220}],"231":[0,{"line":101,"col":27,"index":2226},{"line":101,"col":30,"index":2229}],"232":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":30,"index":2229}],"233":[0,{"line":101,"col":2,"index":2201},{"line":101,"col":30,"index":2229}],"234":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":20,"index":2251}],"235":[0,{"line":102,"col":25,"index":2256},{"line":102,"col":28,"index":2259}],"236":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":28,"index":2259}],"237":[0,{"line":102,"col":2,"index":2233},{"line":102,"col":28,"index":2259}],"238":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":25,"index":2286}],"239":[0,{"line":103,"col":35,"index":2296},{"line":103,"col":38,"index":2299}],"240":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":38,"index":2299}],"241":[0,{"line":103,"col":2,"index":2263},{"line":103,"col":38,"index":2299}],"242":[0,{"line":104,"col":8,"index":2309},{"line":104,"col":8,"index":2309}],"243":[0,{"line":104,"col":13,"index":2314},{"line":104,"col":13,"index":2314}],"244":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"245":[0,{"line":105,"col":8,"index":2324},{"line":105,"col":8,"index":2324}],"246":[0,{"line":105,"col":15,"index":2331},{"line":105,"col":15,"index":2331}],"247":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":16,"index":2332}],"248":[0,{"line":105,"col":26,"index":2342},{"line":105,"col":26,"index":2342}],"249":[0,{"line":105,"col":22,"index":2338},{"line":105,"col":27,"index":2343}],"250":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":27,"index":2343}],"251":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"252":[0,{"line":106,"col":19,"index":2364},{"line":106,"col":19,"index":2364}],"253":[0,{"line":106,"col":26,"index":2371},{"line":106,"col":26,"index":2371}],"254":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":27,"index":2372}],"255":[0,{"line":106,"col":37,"index":2382},{"line":106,"col":37,"index":2382}],"256":[0,{"line":106,"col":33,"index":2378},{"line":106,"col":38,"index":2383}],"257":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":38,"index":2383}],"258":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"259":[0,{"line":107,"col":18,"index":2403},{"line":107,"col":18,"index":2403}],"260":[0,{"line":107,"col":25,"index":2410},{"line":107,"col":25,"index":2410}],"261":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":26,"index":2411}],"262":[0,{"line":107,"col":35,"index":2420},{"line":107,"col":35,"index":2420}],"263":[0,{"line":107,"col":31,"index":2416},{"line":107,"col":36,"index":2421}],"264":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":36,"index":2421}],"265":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"266":[0,{"line":110,"col":6,"index":2459},{"line":110,"col":10,"index":2463}],"267":[0,{"line":111,"col":6,"index":2472},{"line":111,"col":9,"index":2475}],"268":[0,{"line":112,"col":6,"index":2484},{"line":112,"col":10,"index":2488}],"269":[0,{"line":109,"col":23,"index":2447},{"line":113,"col":68,"index":2492}],"270":[0,{"line":109,"col":2,"index":2426},{"line":113,"col":68,"index":2492}],"271":[0,{"line":116,"col":6,"index":2534},{"line":116,"col":10,"index":2538}],"272":[0,{"line":117,"col":6,"index":2547},{"line":117,"col":9,"index":2550}],"273":[0,{"line":118,"col":6,"index":2559},{"line":118,"col":10,"index":2563}],"274":[0,{"line":115,"col":27,"index":2522},{"line":119,"col":72,"index":2567}],"275":[0,{"line":115,"col":2,"index":2497},{"line":119,"col":72,"index":2567}],"276":[0,{"line":122,"col":6,"index":2603},{"line":122,"col":10,"index":2607}],"277":[0,{"line":123,"col":6,"index":2616},{"line":123,"col":9,"index":2619}],"278":[0,{"line":124,"col":6,"index":2628},{"line":124,"col":10,"index":2632}],"279":[0,{"line":121,"col":22,"index":2592},{"line":125,"col":66,"index":2636}],"280":[0,{"line":121,"col":2,"index":2572},{"line":125,"col":66,"index":2636}],"281":[0,{"line":128,"col":6,"index":2677},{"line":128,"col":10,"index":2681}],"282":[0,{"line":129,"col":6,"index":2690},{"line":129,"col":9,"index":2693}],"283":[0,{"line":130,"col":6,"index":2702},{"line":130,"col":10,"index":2706}],"284":[0,{"line":127,"col":26,"index":2665},{"line":131,"col":71,"index":2710}],"285":[0,{"line":127,"col":2,"index":2641},{"line":131,"col":71,"index":2710}],"286":[0,{"line":133,"col":21,"index":2734},{"line":133,"col":24,"index":2737}],"287":[0,{"line":133,"col":27,"index":2740},{"line":133,"col":27,"index":2740}],"288":[0,{"line":133,"col":34,"index":2747},{"line":133,"col":34,"index":2747}],"289":[0,{"line":133,"col":17,"index":2730},{"line":133,"col":34,"index":2747}],"290":[0,{"line":133,"col":2,"index":2715},{"line":133,"col":34,"index":2747}],"291":[0,{"line":134,"col":16,"index":2765},{"line":134,"col":16,"index":2765}],"292":[0,{"line":134,"col":19,"index":2768},{"line":134,"col":19,"index":2768}],"293":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":28,"index":2777}],"294":[0,{"line":134,"col":32,"index":2781},{"line":134,"col":33,"index":2782}],"295":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":33,"index":2782}],"296":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":36,"index":2785}],"297":[0,{"line":134,"col":40,"index":2789},{"line":134,"col":40,"index":2789}],"298":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":40,"index":2789}],"299":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":47,"index":2796}],"300":[0,{"line":134,"col":51,"index":2800},{"line":134,"col":51,"index":2800}],"301":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":51,"index":2800}],"302":[0,{"line":134,"col":24,"index":2773},{"line":134,"col":51,"index":2800}],"303":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"304":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":12,"index":2841}],"305":[0,{"line":137,"col":17,"index":2846},{"line":137,"col":19,"index":2848}],"306":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":19,"index":2848}],"307":[0,{"line":137,"col":2,"index":2831},{"line":137,"col":19,"index":2848}],"308":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":16,"index":2866}],"309":[0,{"line":138,"col":22,"index":2872},{"line":138,"col":24,"index":2874}],"310":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":25,"index":2875}],"311":[0,{"line":138,"col":2,"index":2852},{"line":138,"col":25,"index":2875}],"312":[0,{"line":141,"col":13,"index":2939},{"line":141,"col":13,"index":2939}],"313":[0,{"line":141,"col":16,"index":2942},{"line":141,"col":16,"index":2942}],"314":[0,{"line":141,"col":21,"index":2947},{"line":141,"col":21,"index":2947}],"315":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"316":[0,{"line":142,"col":31,"index":2980},{"line":142,"col":33,"index":2982}],"317":[0,{"line":142,"col":36,"index":2985},{"line":142,"col":37,"index":2986}],"318":[0,{"line":142,"col":24,"index":2973},{"line":142,"col":38,"index":2987}],"319":[0,{"line":142,"col":2,"index":2951},{"line":142,"col":38,"index":2987}],"320":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":24,"index":3013}],"321":[0,{"line":143,"col":33,"index":3022},{"line":143,"col":34,"index":3023}],"322":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":35,"index":3024}],"323":[0,{"line":143,"col":2,"index":2991},{"line":143,"col":35,"index":3024}],"324":[0,{"line":145,"col":19,"index":3102},{"line":145,"col":19,"index":3102}],"325":[0,{"line":145,"col":22,"index":3105},{"line":145,"col":26,"index":3109}],"326":[0,{"line":145,"col":16,"index":3099},{"line":145,"col":27,"index":3110}],"327":[0,{"line":145,"col":2,"index":3085},{"line":145,"col":27,"index":3110}],"328":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":22,"index":3279}],"329":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":31,"index":3288}],"330":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":36,"index":3293}],"331":[0,{"line":150,"col":40,"index":3297},{"line":150,"col":41,"index":3298}],"332":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":41,"index":3298}],"333":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":41,"index":3298}],"334":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":42,"index":3299}],"335":[0,{"line":150,"col":2,"index":3259},{"line":150,"col":42,"index":3299}],"336":[0,{"line":152,"col":25,"index":3356},{"line":152,"col":25,"index":3356}],"337":[0,{"line":152,"col":28,"index":3359},{"line":152,"col":32,"index":3363}],"338":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":33,"index":3364}],"339":[0,{"line":152,"col":42,"index":3373},{"line":152,"col":42,"index":3373}],"340":[0,{"line":152,"col":45,"index":3376},{"line":152,"col":47,"index":3378}],"341":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":54,"index":3385}],"342":[0,{"line":152,"col":58,"index":3389},{"line":152,"col":60,"index":3391}],"343":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":60,"index":3391}],"344":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"345":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"346":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"347":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"348":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"349":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"350":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"351":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"352":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"353":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"354":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":62,"index":3393}],"355":[0,{"line":152,"col":2,"index":3333},{"line":152,"col":62,"index":3393}],"356":[0,{"line":155,"col":21,"index":3458},{"line":155,"col":21,"index":3458}],"357":[0,{"line":155,"col":15,"index":3452},{"line":155,"col":22,"index":3459}],"358":[0,{"line":155,"col":4,"index":3441},{"line":155,"col":22,"index":3459}],"359":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":6,"index":3477}],"360":[0,{"line":157,"col":10,"index":3481},{"line":157,"col":11,"index":3482}],"361":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":11,"index":3482}],"362":[0,{"line":158,"col":11,"index":3496},{"line":158,"col":11,"index":3496}],"363":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"364":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"365":[0,{"line":156,"col":4,"index":3465},{"line":159,"col":41,"index":3502}],"366":[0,{"line":155,"col":4,"index":3441},{"line":159,"col":65,"index":3502}],"367":[0,{"line":154,"col":2,"index":3414},{"line":160,"col":94,"index":3506}],"368":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":22,"index":3545}],"369":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":31,"index":3554}],"370":[0,{"line":162,"col":36,"index":3559},{"line":162,"col":39,"index":3562}],"371":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":39,"index":3562}],"372":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":40,"index":3563}],"373":[0,{"line":162,"col":2,"index":3525},{"line":162,"col":40,"index":3563}],"374":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":10,"index":3576}],"375":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":18,"index":3584}],"376":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":23,"index":3589}],"377":[0,{"line":164,"col":27,"index":3593},{"line":164,"col":27,"index":3593}],"378":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":27,"index":3593}],"379":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":27,"index":3593}],"380":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":28,"index":3594}],"381":[0,{"line":164,"col":2,"index":3568},{"line":164,"col":28,"index":3594}],"382":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":23,"index":3620}],"383":[0,{"line":166,"col":37,"index":3634},{"line":166,"col":37,"index":3634}],"384":[0,{"line":166,"col":40,"index":3637},{"line":166,"col":40,"index":3637}],"385":[0,{"line":166,"col":33,"index":3630},{"line":166,"col":41,"index":3638}],"386":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":42,"index":3639}],"387":[0,{"line":166,"col":2,"index":3599},{"line":166,"col":42,"index":3639}],"388":[0,{"line":169,"col":17,"index":3698},{"line":169,"col":17,"index":3698}],"389":[0,{"line":169,"col":20,"index":3701},{"line":169,"col":20,"index":3701}],"390":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":21,"index":3702}],"391":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":28,"index":3709}],"392":[0,{"line":169,"col":2,"index":3683},{"line":169,"col":28,"index":3709}],"393":[0,{"line":172,"col":20,"index":3753},{"line":172,"col":20,"index":3753}],"394":[0,{"line":172,"col":23,"index":3756},{"line":172,"col":23,"index":3756}],"395":[0,{"line":172,"col":26,"index":3759},{"line":172,"col":26,"index":3759}],"396":[0,{"line":172,"col":19,"index":3752},{"line":172,"col":27,"index":3760}],"397":[0,{"line":172,"col":2,"index":3735},{"line":172,"col":27,"index":3760}],"398":[0,{"line":173,"col":24,"index":3786},{"line":173,"col":24,"index":3786}],"399":[0,{"line":173,"col":27,"index":3789},{"line":173,"col":27,"index":3789}],"400":[0,{"line":173,"col":30,"index":3792},{"line":173,"col":30,"index":3792}],"401":[0,{"line":173,"col":20,"index":3782},{"line":173,"col":31,"index":3793}],"402":[0,{"line":173,"col":2,"index":3764},{"line":173,"col":31,"index":3793}],"403":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":18,"index":3813}],"404":[0,{"line":174,"col":23,"index":3818},{"line":174,"col":23,"index":3818}],"405":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":23,"index":3818}],"406":[0,{"line":174,"col":2,"index":3797},{"line":174,"col":23,"index":3818}],"407":[0,{"line":175,"col":19,"index":3839},{"line":175,"col":19,"index":3839}],"408":[0,{"line":175,"col":22,"index":3842},{"line":175,"col":22,"index":3842}],"409":[0,{"line":175,"col":25,"index":3845},{"line":175,"col":25,"index":3845}],"410":[0,{"line":175,"col":18,"index":3838},{"line":175,"col":26,"index":3846}],"411":[0,{"line":175,"col":2,"index":3822},{"line":175,"col":26,"index":3846}],"412":[0,{"line":176,"col":24,"index":3872},{"line":176,"col":24,"index":3872}],"413":[0,{"line":176,"col":27,"index":3875},{"line":176,"col":27,"index":3875}],"414":[0,{"line":176,"col":30,"index":3878},{"line":176,"col":30,"index":3878}],"415":[0,{"line":176,"col":19,"index":3867},{"line":176,"col":31,"index":3879}],"416":[0,{"line":176,"col":2,"index":3850},{"line":176,"col":31,"index":3879}],"417":[0,{"line":177,"col":23,"index":3904},{"line":177,"col":23,"index":3904}],"418":[0,{"line":177,"col":26,"index":3907},{"line":177,"col":26,"index":3907}],"419":[0,{"line":177,"col":29,"index":3910},{"line":177,"col":29,"index":3910}],"420":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":30,"index":3911}],"421":[0,{"line":177,"col":32,"index":3913},{"line":177,"col":32,"index":3913}],"422":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":33,"index":3914}],"423":[0,{"line":177,"col":2,"index":3883},{"line":177,"col":33,"index":3914}],"424":[0,{"line":178,"col":28,"index":3944},{"line":178,"col":33,"index":3949}],"425":[0,{"line":178,"col":22,"index":3938},{"line":178,"col":33,"index":3949}],"426":[0,{"line":178,"col":42,"index":3958},{"line":178,"col":45,"index":3961}],"427":[0,{"line":178,"col":36,"index":3952},{"line":178,"col":45,"index":3961}],"428":[0,{"line":178,"col":20,"index":3936},{"line":178,"col":47,"index":3963}],"429":[0,{"line":178,"col":2,"index":3918},{"line":178,"col":47,"index":3963}],"430":[0,{"line":179,"col":25,"index":3990},{"line":179,"col":30,"index":3995}],"431":[0,{"line":179,"col":33,"index":3998},{"line":179,"col":38,"index":4003}],"432":[0,{"line":179,"col":41,"index":4006},{"line":179,"col":46,"index":4011}],"433":[0,{"line":179,"col":49,"index":4014},{"line":179,"col":52,"index":4017}],"434":[0,{"line":179,"col":21,"index":3986},{"line":179,"col":53,"index":4018}],"435":[0,{"line":179,"col":2,"index":3967},{"line":179,"col":53,"index":4018}],"436":[0,{"line":180,"col":29,"index":4049},{"line":180,"col":35,"index":4055}],"437":[0,{"line":180,"col":23,"index":4043},{"line":180,"col":35,"index":4055}],"438":[0,{"line":180,"col":44,"index":4064},{"line":180,"col":47,"index":4067}],"439":[0,{"line":180,"col":38,"index":4058},{"line":180,"col":47,"index":4067}],"440":[0,{"line":180,"col":53,"index":4073},{"line":180,"col":63,"index":4083}],"441":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"442":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"443":[0,{"line":180,"col":2,"index":4022},{"line":180,"col":65,"index":4085}],"444":[0,{"line":181,"col":21,"index":4108},{"line":181,"col":21,"index":4108}],"445":[0,{"line":181,"col":24,"index":4111},{"line":181,"col":24,"index":4111}],"446":[0,{"line":181,"col":27,"index":4114},{"line":181,"col":27,"index":4114}],"447":[0,{"line":181,"col":17,"index":4104},{"line":181,"col":28,"index":4115}],"448":[0,{"line":181,"col":2,"index":4089},{"line":181,"col":28,"index":4115}],"449":[0,{"line":185,"col":22,"index":4187},{"line":185,"col":22,"index":4187}],"450":[0,{"line":185,"col":19,"index":4184},{"line":185,"col":22,"index":4187}],"451":[0,{"line":185,"col":28,"index":4193},{"line":185,"col":32,"index":4197}],"452":[0,{"line":185,"col":25,"index":4190},{"line":185,"col":32,"index":4197}],"453":[0,{"line":185,"col":17,"index":4182},{"line":185,"col":34,"index":4199}],"454":[0,{"line":185,"col":4,"index":4169},{"line":185,"col":34,"index":4199}],"455":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":9,"index":4210}],"456":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"457":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"458":[0,{"line":185,"col":4,"index":4169},{"line":186,"col":47,"index":4212}],"459":[0,{"line":184,"col":2,"index":4149},{"line":186,"col":65,"index":4212}],"460":[0,{"line":189,"col":21,"index":4253},{"line":189,"col":23,"index":4255}],"461":[0,{"line":189,"col":26,"index":4258},{"line":189,"col":26,"index":4258}],"462":[0,{"line":189,"col":17,"index":4249},{"line":189,"col":27,"index":4259}],"463":[0,{"line":189,"col":4,"index":4236},{"line":189,"col":27,"index":4259}],"464":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":9,"index":4270}],"465":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"466":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"467":[0,{"line":189,"col":4,"index":4236},{"line":190,"col":41,"index":4273}],"468":[0,{"line":188,"col":2,"index":4217},{"line":190,"col":58,"index":4273}],"469":[0,{"line":192,"col":14,"index":4290},{"line":192,"col":14,"index":4290}],"470":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":19,"index":4295}],"471":[0,{"line":192,"col":24,"index":4300},{"line":192,"col":25,"index":4301}],"472":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":25,"index":4301}],"473":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"474":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":19,"index":4349}],"475":[0,{"line":195,"col":24,"index":4354},{"line":195,"col":28,"index":4358}],"476":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":29,"index":4359}],"477":[0,{"line":195,"col":2,"index":4332},{"line":195,"col":29,"index":4359}],"478":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":27,"index":4388}],"479":[0,{"line":196,"col":38,"index":4399},{"line":196,"col":42,"index":4403}],"480":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":43,"index":4404}],"481":[0,{"line":196,"col":2,"index":4363},{"line":196,"col":43,"index":4404}],"482":[0,{"line":197,"col":22,"index":4428},{"line":197,"col":22,"index":4428}],"483":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":23,"index":4429}],"484":[0,{"line":197,"col":41,"index":4447},{"line":197,"col":41,"index":4447}],"485":[0,{"line":197,"col":43,"index":4449},{"line":197,"col":43,"index":4449}],"486":[0,{"line":197,"col":45,"index":4451},{"line":197,"col":45,"index":4451}],"487":[0,{"line":197,"col":37,"index":4443},{"line":197,"col":46,"index":4452}],"488":[0,{"line":197,"col":28,"index":4434},{"line":197,"col":47,"index":4453}],"489":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":48,"index":4454}],"490":[0,{"line":197,"col":2,"index":4408},{"line":197,"col":48,"index":4454}],"491":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":20,"index":4501}],"492":[0,{"line":200,"col":24,"index":4505},{"line":200,"col":24,"index":4505}],"493":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":24,"index":4505}],"494":[0,{"line":200,"col":2,"index":4483},{"line":200,"col":24,"index":4505}],"495":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":13,"index":4549}],"496":[0,{"line":202,"col":18,"index":4554},{"line":202,"col":18,"index":4554}],"497":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":18,"index":4554}],"498":[0,{"line":202,"col":2,"index":4538},{"line":202,"col":18,"index":4554}],"499":[0,{"line":205,"col":2,"index":4572},{"line":205,"col":14,"index":4584}],"500":[0,{"line":206,"col":2,"index":4588},{"line":206,"col":12,"index":4598}],"501":[0,{"line":209,"col":21,"index":4636},{"line":209,"col":23,"index":4638}],"502":[0,{"line":209,"col":17,"index":4632},{"line":209,"col":24,"index":4639}],"503":[0,{"line":209,"col":2,"index":4617},{"line":209,"col":24,"index":4639}],"504":[0,{"line":211,"col":2,"index":4644},{"line":211,"col":24,"index":4666}],"505":[0,{"line":213,"col":10,"index":4679},{"line":213,"col":16,"index":4685}],"506":[0,{"line":213,"col":2,"index":4671},{"line":213,"col":16,"index":4685}],"507":[0,{"line":221,"col":19,"index":4906},{"line":221,"col":19,"index":4906}],"508":[0,{"line":221,"col":15,"index":4902},{"line":221,"col":15,"index":4902}],"509":[0,{"line":221,"col":2,"index":4889},{"line":221,"col":29,"index":4916}],"510":[0,{"line":14,"col":0,"index":140},{"line":225,"col":4855,"index":4995}]}} \ No newline at end of file diff --git a/quint/testFixture/_1043sumTypeDecl.json b/quint/testFixture/_1043sumTypeDecl.json index cbab0c26f..67982899d 100644 --- a/quint/testFixture/_1043sumTypeDecl.json +++ b/quint/testFixture/_1043sumTypeDecl.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":20,"name":"SumTypes","declarations":[{"id":3,"name":"T","kind":"typedef","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},{"id":4,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":3,"kind":"const","name":"T"},"expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]}},{"id":8,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":3,"kind":"const","name":"T"}},"expr":{"id":8,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}}},{"id":19,"kind":"def","name":"canConstructVariants","qualifier":"val","expr":{"id":18,"kind":"app","opcode":"List","args":[{"id":15,"kind":"name","name":"A"},{"id":17,"kind":"app","opcode":"B","args":[{"id":16,"kind":"int","value":2}]}]},"typeAnnotation":{"id":14,"kind":"list","elem":{"id":13,"kind":"const","name":"T"}}}]}],"table":{"3":{"id":3,"name":"T","kind":"typedef","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"11":{"id":10,"name":"__BParam","kind":"param"},"13":{"id":3,"name":"T","kind":"typedef","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"15":{"id":4,"kind":"def","name":"A","qualifier":"val","expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]},"depth":0},"17":{"id":8,"kind":"def","name":"B","qualifier":"def","expr":{"id":8,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}},"depth":0}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":21,"name":"SumTypes","declarations":[{"id":3,"name":"T","kind":"typedef","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},{"id":13,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":3,"kind":"const","name":"T"}},"expr":{"id":12,"kind":"lambda","params":[{"id":9,"name":"__BParam"}],"qualifier":"def","expr":{"id":11,"kind":"app","opcode":"variant","args":[{"id":8,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":10}]}}},{"id":7,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":3,"kind":"const","name":"T"},"expr":{"id":6,"kind":"app","opcode":"variant","args":[{"id":4,"kind":"str","value":"A"},{"id":5,"kind":"app","opcode":"Rec","args":[]}]}},{"id":20,"kind":"def","name":"canConstructVariants","qualifier":"val","expr":{"id":19,"kind":"app","opcode":"List","args":[{"id":16,"kind":"name","name":"A"},{"id":18,"kind":"app","opcode":"B","args":[{"id":17,"kind":"int","value":2}]}]},"typeAnnotation":{"id":15,"kind":"list","elem":{"id":14,"kind":"const","name":"T"}}}]}],"table":{"3":{"id":3,"name":"T","kind":"typedef","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"10":{"id":9,"name":"__BParam","kind":"param"},"14":{"id":3,"name":"T","kind":"typedef","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"16":{"id":7,"kind":"def","name":"A","qualifier":"val","expr":{"id":6,"kind":"app","opcode":"variant","args":[{"id":4,"kind":"str","value":"A"},{"id":5,"kind":"app","opcode":"Rec","args":[]}]},"depth":0},"18":{"id":13,"kind":"def","name":"B","qualifier":"def","expr":{"id":12,"kind":"lambda","params":[{"id":9,"name":"__BParam"}],"qualifier":"def","expr":{"id":11,"kind":"app","opcode":"variant","args":[{"id":8,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":10}]}},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1043sumTypeDecl.map.json b/quint/testFixture/_1043sumTypeDecl.map.json index 566d834ed..9d2b689b9 100644 --- a/quint/testFixture/_1043sumTypeDecl.map.json +++ b/quint/testFixture/_1043sumTypeDecl.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1043sumTypeDecl.qnt"},"map":{"1":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"2":[0,{"line":3,"col":8,"index":45},{"line":3,"col":10,"index":47}],"3":[0,{"line":1,"col":2,"index":20},{"line":3,"col":30,"index":48}],"4":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"5":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"6":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"7":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"8":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"9":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"10":[0,{"line":3,"col":8,"index":45},{"line":3,"col":10,"index":47}],"11":[0,{"line":3,"col":6,"index":43},{"line":3,"col":6,"index":43}],"12":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"13":[0,{"line":5,"col":34,"index":85},{"line":5,"col":34,"index":85}],"14":[0,{"line":5,"col":29,"index":80},{"line":5,"col":35,"index":86}],"15":[0,{"line":5,"col":44,"index":95},{"line":5,"col":44,"index":95}],"16":[0,{"line":5,"col":49,"index":100},{"line":5,"col":49,"index":100}],"17":[0,{"line":5,"col":47,"index":98},{"line":5,"col":50,"index":101}],"18":[0,{"line":5,"col":39,"index":90},{"line":5,"col":51,"index":102}],"19":[0,{"line":5,"col":2,"index":53},{"line":5,"col":51,"index":102}],"20":[0,{"line":0,"col":0,"index":0},{"line":6,"col":104,"index":104}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1043sumTypeDecl.qnt"},"map":{"1":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"2":[0,{"line":3,"col":8,"index":45},{"line":3,"col":10,"index":47}],"3":[0,{"line":1,"col":2,"index":20},{"line":3,"col":30,"index":48}],"4":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"5":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"6":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"7":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"8":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"9":[0,{"line":3,"col":8,"index":45},{"line":3,"col":10,"index":47}],"10":[0,{"line":3,"col":6,"index":43},{"line":3,"col":6,"index":43}],"11":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"12":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"13":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"14":[0,{"line":5,"col":34,"index":85},{"line":5,"col":34,"index":85}],"15":[0,{"line":5,"col":29,"index":80},{"line":5,"col":35,"index":86}],"16":[0,{"line":5,"col":44,"index":95},{"line":5,"col":44,"index":95}],"17":[0,{"line":5,"col":49,"index":100},{"line":5,"col":49,"index":100}],"18":[0,{"line":5,"col":47,"index":98},{"line":5,"col":50,"index":101}],"19":[0,{"line":5,"col":39,"index":90},{"line":5,"col":51,"index":102}],"20":[0,{"line":5,"col":2,"index":53},{"line":5,"col":51,"index":102}],"21":[0,{"line":0,"col":0,"index":0},{"line":6,"col":104,"index":104}]}} \ No newline at end of file diff --git a/quint/testFixture/_1044matchExpression.json b/quint/testFixture/_1044matchExpression.json index 7236d240c..6ceb3f033 100644 --- a/quint/testFixture/_1044matchExpression.json +++ b/quint/testFixture/_1044matchExpression.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":38,"name":"SumTypes","declarations":[{"id":4,"name":"T","kind":"typedef","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},{"id":14,"kind":"def","name":"C","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"str"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":14,"kind":"lambda","params":[{"id":16,"name":"__CParam"}],"qualifier":"def","expr":{"id":18,"kind":"app","opcode":"variant","args":[{"id":15,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":17}]}}},{"id":5,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":4,"kind":"const","name":"T"},"expr":{"id":8,"kind":"app","opcode":"variant","args":[{"id":6,"kind":"str","value":"A"},{"id":7,"kind":"app","opcode":"Rec","args":[]}]}},{"id":9,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":9,"kind":"lambda","params":[{"id":11,"name":"__BParam"}],"qualifier":"def","expr":{"id":13,"kind":"app","opcode":"variant","args":[{"id":10,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":12}]}}},{"id":21,"kind":"def","name":"c","qualifier":"val","expr":{"id":20,"kind":"app","opcode":"C","args":[{"id":19,"kind":"str","value":"Foo"}]}},{"id":37,"kind":"def","name":"ex","qualifier":"val","expr":{"id":27,"kind":"app","opcode":"matchVariant","args":[{"id":22,"kind":"name","name":"c"},{"id":28,"kind":"str","value":"A"},{"id":29,"kind":"lambda","qualifier":"def","expr":{"id":23,"kind":"int","value":0},"params":[{"name":"_","id":30}]},{"id":31,"kind":"str","value":"B"},{"id":32,"kind":"lambda","qualifier":"def","expr":{"id":24,"kind":"name","name":"n"},"params":[{"name":"n","id":33}]},{"id":34,"kind":"str","value":"_"},{"id":35,"kind":"lambda","qualifier":"def","expr":{"id":26,"kind":"app","opcode":"iuminus","args":[{"id":25,"kind":"int","value":1}]},"params":[{"name":"_","id":36}]}]}}]}],"table":{"4":{"id":4,"name":"T","kind":"typedef","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},"12":{"id":11,"name":"__BParam","kind":"param"},"17":{"id":16,"name":"__CParam","kind":"param"},"20":{"id":14,"kind":"def","name":"C","qualifier":"def","expr":{"id":14,"kind":"lambda","params":[{"id":16,"name":"__CParam"}],"qualifier":"def","expr":{"id":18,"kind":"app","opcode":"variant","args":[{"id":15,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":17}]}},"depth":0},"22":{"id":21,"kind":"def","name":"c","qualifier":"val","expr":{"id":20,"kind":"app","opcode":"C","args":[{"id":19,"kind":"str","value":"Foo"}]},"depth":0},"24":{"name":"n","id":33,"kind":"param"}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":40,"name":"SumTypes","declarations":[{"id":4,"name":"T","kind":"typedef","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},{"id":14,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}}},{"id":20,"kind":"def","name":"C","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"str"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":19,"kind":"lambda","params":[{"id":16,"name":"__CParam"}],"qualifier":"def","expr":{"id":18,"kind":"app","opcode":"variant","args":[{"id":15,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":17}]}}},{"id":8,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":4,"kind":"const","name":"T"},"expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]}},{"id":23,"kind":"def","name":"c","qualifier":"val","expr":{"id":22,"kind":"app","opcode":"C","args":[{"id":21,"kind":"str","value":"Foo"}]}},{"id":39,"kind":"def","name":"ex","qualifier":"val","expr":{"id":29,"kind":"app","opcode":"matchVariant","args":[{"id":24,"kind":"name","name":"c"},{"id":30,"kind":"str","value":"A"},{"id":31,"kind":"lambda","qualifier":"def","expr":{"id":25,"kind":"int","value":0},"params":[{"name":"_","id":32}]},{"id":33,"kind":"str","value":"B"},{"id":34,"kind":"lambda","qualifier":"def","expr":{"id":26,"kind":"name","name":"n"},"params":[{"name":"n","id":35}]},{"id":36,"kind":"str","value":"_"},{"id":37,"kind":"lambda","qualifier":"def","expr":{"id":28,"kind":"app","opcode":"iuminus","args":[{"id":27,"kind":"int","value":1}]},"params":[{"name":"_","id":38}]}]}}]}],"table":{"4":{"id":4,"name":"T","kind":"typedef","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},"11":{"id":10,"name":"__BParam","kind":"param"},"17":{"id":16,"name":"__CParam","kind":"param"},"22":{"id":20,"kind":"def","name":"C","qualifier":"def","expr":{"id":19,"kind":"lambda","params":[{"id":16,"name":"__CParam"}],"qualifier":"def","expr":{"id":18,"kind":"app","opcode":"variant","args":[{"id":15,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":17}]}},"depth":0},"24":{"id":23,"kind":"def","name":"c","qualifier":"val","expr":{"id":22,"kind":"app","opcode":"C","args":[{"id":21,"kind":"str","value":"Foo"}]},"depth":0},"26":{"name":"n","id":35,"kind":"param"}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1044matchExpression.map.json b/quint/testFixture/_1044matchExpression.map.json index c365ead8e..5a444ca1c 100644 --- a/quint/testFixture/_1044matchExpression.map.json +++ b/quint/testFixture/_1044matchExpression.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1044matchExpression.qnt"},"map":{"1":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"2":[0,{"line":1,"col":17,"index":35},{"line":1,"col":19,"index":37}],"3":[0,{"line":1,"col":26,"index":44},{"line":1,"col":28,"index":46}],"4":[0,{"line":1,"col":2,"index":20},{"line":1,"col":29,"index":47}],"5":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"6":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"7":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"8":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"9":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"10":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"11":[0,{"line":1,"col":17,"index":35},{"line":1,"col":19,"index":37}],"12":[0,{"line":1,"col":15,"index":33},{"line":1,"col":15,"index":33}],"13":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"14":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"15":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"16":[0,{"line":1,"col":26,"index":44},{"line":1,"col":28,"index":46}],"17":[0,{"line":1,"col":24,"index":42},{"line":1,"col":24,"index":42}],"18":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"19":[0,{"line":3,"col":12,"index":62},{"line":3,"col":16,"index":66}],"20":[0,{"line":3,"col":10,"index":60},{"line":3,"col":17,"index":67}],"21":[0,{"line":3,"col":2,"index":52},{"line":3,"col":17,"index":67}],"22":[0,{"line":5,"col":17,"index":87},{"line":5,"col":17,"index":87}],"23":[0,{"line":6,"col":14,"index":105},{"line":6,"col":14,"index":105}],"24":[0,{"line":7,"col":14,"index":121},{"line":7,"col":14,"index":121}],"25":[0,{"line":8,"col":15,"index":138},{"line":8,"col":15,"index":138}],"26":[0,{"line":8,"col":14,"index":137},{"line":8,"col":15,"index":138}],"27":[0,{"line":5,"col":11,"index":81},{"line":9,"col":72,"index":142}],"28":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"29":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"30":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"31":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"32":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"33":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"34":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"35":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"36":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"37":[0,{"line":5,"col":2,"index":72},{"line":9,"col":72,"index":142}],"38":[0,{"line":0,"col":0,"index":0},{"line":10,"col":144,"index":144}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1044matchExpression.qnt"},"map":{"1":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"2":[0,{"line":1,"col":17,"index":35},{"line":1,"col":19,"index":37}],"3":[0,{"line":1,"col":26,"index":44},{"line":1,"col":28,"index":46}],"4":[0,{"line":1,"col":2,"index":20},{"line":1,"col":29,"index":47}],"5":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"6":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"7":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"8":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"9":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"10":[0,{"line":1,"col":17,"index":35},{"line":1,"col":19,"index":37}],"11":[0,{"line":1,"col":15,"index":33},{"line":1,"col":15,"index":33}],"12":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"13":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"14":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"15":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"16":[0,{"line":1,"col":26,"index":44},{"line":1,"col":28,"index":46}],"17":[0,{"line":1,"col":24,"index":42},{"line":1,"col":24,"index":42}],"18":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"19":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"20":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"21":[0,{"line":3,"col":12,"index":62},{"line":3,"col":16,"index":66}],"22":[0,{"line":3,"col":10,"index":60},{"line":3,"col":17,"index":67}],"23":[0,{"line":3,"col":2,"index":52},{"line":3,"col":17,"index":67}],"24":[0,{"line":5,"col":17,"index":87},{"line":5,"col":17,"index":87}],"25":[0,{"line":6,"col":14,"index":105},{"line":6,"col":14,"index":105}],"26":[0,{"line":7,"col":14,"index":121},{"line":7,"col":14,"index":121}],"27":[0,{"line":8,"col":15,"index":138},{"line":8,"col":15,"index":138}],"28":[0,{"line":8,"col":14,"index":137},{"line":8,"col":15,"index":138}],"29":[0,{"line":5,"col":11,"index":81},{"line":9,"col":72,"index":142}],"30":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"31":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"32":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"33":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"34":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"35":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"36":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"37":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"38":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"39":[0,{"line":5,"col":2,"index":72},{"line":9,"col":72,"index":142}],"40":[0,{"line":0,"col":0,"index":0},{"line":10,"col":144,"index":144}]}} \ No newline at end of file From d95b2992ddbb92965595bfd0be3aa5f4e8bda8ca Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 30 Nov 2023 19:40:33 -0500 Subject: [PATCH 047/388] Revert "Update tests" This reverts commit dc4eb2af173221dfffb54acb4b6f7abb3c3371d8. --- quint/test/types/aliasInliner.test.ts | 2 +- quint/test/types/inferrer.test.ts | 68 ++++++++++++--------------- 2 files changed, 31 insertions(+), 39 deletions(-) diff --git a/quint/test/types/aliasInliner.test.ts b/quint/test/types/aliasInliner.test.ts index d381a681d..3d57494d1 100644 --- a/quint/test/types/aliasInliner.test.ts +++ b/quint/test/types/aliasInliner.test.ts @@ -71,9 +71,9 @@ describe('inlineAliases', () => { const expectedModule = dedent(`module A { | type T1 = (B({}) | C({})) + | val C: (B({}) | C({})) = variant("C", Rec()) | type T2 = (Some((B({}) | C({}))) | None({})) | val B: (B({}) | C({})) = variant("B", Rec()) - | val C: (B({}) | C({})) = variant("C", Rec()) | def Some: ((B({}) | C({}))) => (Some((B({}) | C({}))) | None({})) = ((__SomeParam) => variant("Some", __SomeParam)) | val None: (Some((B({}) | C({}))) | None({})) = variant("None", Rec()) | var x: (Some((B({}) | C({}))) | None({})) diff --git a/quint/test/types/inferrer.test.ts b/quint/test/types/inferrer.test.ts index 83566cd7c..8c496f164 100644 --- a/quint/test/types/inferrer.test.ts +++ b/quint/test/types/inferrer.test.ts @@ -5,15 +5,6 @@ import { typeSchemeToString } from '../../src/types/printing' import { errorTreeToString } from '../../src/errorTree' import { parseMockedModule } from '../util' -// Utility used to print update `stringType` values to make -// updating the expected values in the following tests less -// painful. -function _printUpdatedStringTypes(stringTypes: (string | bigint)[][]) { - console.log('[') - stringTypes.forEach(([n, t]) => console.log(`[${n}n, '${t}'],`)) - console.log(']') -} - describe('inferTypes', () => { function inferTypesForModules(text: string): TypeInferenceResult { const { modules, table } = parseMockedModule(text) @@ -155,19 +146,20 @@ describe('inferTypes', () => { const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) assert.sameDeepMembers(stringTypes, [ - [13n, 'str'], - [14n, 'int'], - [15n, '(A(int) | B({}))'], + [14n, 'str'], + [15n, 'int'], [16n, '(A(int) | B({}))'], - [6n, 'int'], - [5n, 'str'], - [7n, 'int'], - [8n, '(A(int) | B({}))'], - [4n, '(int) => (A(int) | B({}))'], + [17n, '(A(int) | B({}))'], [10n, 'str'], [11n, '{}'], [12n, '(B({}) | A(int))'], - [9n, '(B({}) | A(int))'], + [13n, '(B({}) | A(int))'], + [5n, 'int'], + [4n, 'str'], + [6n, 'int'], + [7n, '(A(int) | B({}))'], + [8n, '(int) => (A(int) | B({}))'], + [9n, '(int) => (A(int) | B({}))'], ]) }) @@ -194,34 +186,34 @@ module B { assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) - // _printUpdatedStringTypes(stringTypes) assert.sameDeepMembers(stringTypes, [ - [13n, 'str'], - [14n, 'int'], - [15n, '(A(int) | B({}))'], + [14n, 'str'], + [15n, 'int'], [16n, '(A(int) | B({}))'], [17n, '(A(int) | B({}))'], - [23n, 'str'], - [25n, 'int'], - [18n, 'int'], + [10n, 'str'], + [11n, '{}'], + [12n, '(B({}) | A(int))'], + [13n, '(B({}) | A(int))'], + [18n, '(A(int) | B({}))'], + [24n, 'str'], + [26n, 'int'], [19n, 'int'], [20n, 'int'], - [24n, '(int) => int'], - [26n, 'str'], - [28n, '{}'], [21n, 'int'], - [27n, '({}) => int'], + [25n, '(int) => int'], + [27n, 'str'], + [29n, '{}'], [22n, 'int'], - [29n, 'int'], + [28n, '({}) => int'], + [23n, 'int'], + [30n, 'int'], + [5n, 'int'], + [4n, 'str'], [6n, 'int'], - [5n, 'str'], - [7n, 'int'], - [8n, '(A(int) | B({}))'], - [4n, '(int) => (A(int) | B({}))'], - [10n, 'str'], - [11n, '{}'], - [12n, '(B({}) | A(int))'], - [9n, '(B({}) | A(int))'], + [7n, '(A(int) | B({}))'], + [8n, '(int) => (A(int) | B({}))'], + [9n, '(int) => (A(int) | B({}))'], ]) }) From 15586d36be6255adda446c506b06969d6df37ca8 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 30 Nov 2023 20:13:46 -0500 Subject: [PATCH 048/388] Fix id generation for def bodies The lambda's on the right side of operator definitions where getting assigned the same IDs as operator declaration itself, violating our expectation that every IR component will have a uniqe id. --- quint/src/parsing/ToIrListener.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index e684c355e..2186a87e5 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -245,12 +245,11 @@ export class ToIrListener implements QuintListener { } let body = expr - const id = this.getId(ctx) if (params.length > 0) { // if the definition has parameters, introduce a lambda body = { - id, + id: this.getId(ctx), kind: 'lambda', params, qualifier, @@ -258,7 +257,7 @@ export class ToIrListener implements QuintListener { } } const def: QuintOpDef = { - id, + id: this.getId(ctx), kind: 'def', name, qualifier, From 3b02aa9a0faab9813f320d08f5da0990ae4dc106 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 30 Nov 2023 20:15:10 -0500 Subject: [PATCH 049/388] Add generated updates --- quint/testFixture/SuperSpec.json | 2 +- quint/testFixture/SuperSpec.map.json | 2 +- quint/testFixture/_0099unorderedDefs.json | 2 +- quint/testFixture/_0099unorderedDefs.map.json | 2 +- quint/testFixture/_0100cyclicDefs.json | 2 +- quint/testFixture/_0100cyclicDefs.map.json | 2 +- quint/testFixture/_0101noRecursion.json | 2 +- quint/testFixture/_0101noRecursion.map.json | 2 +- quint/testFixture/_1011nameOutOfScope.json | 2 +- quint/testFixture/_1011nameOutOfScope.map.json | 2 +- quint/testFixture/_1014conflictingNames.json | 2 +- quint/testFixture/_1014conflictingNames.map.json | 2 +- quint/testFixture/_1030const.json | 2 +- quint/testFixture/_1030const.map.json | 2 +- quint/testFixture/_1031instance.json | 2 +- quint/testFixture/_1031instance.map.json | 2 +- quint/testFixture/modulesAndJunk.json | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) diff --git a/quint/testFixture/SuperSpec.json b/quint/testFixture/SuperSpec.json index e8ae27239..ae6f5ec08 100644 --- a/quint/testFixture/SuperSpec.json +++ b/quint/testFixture/SuperSpec.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":510,"name":"withConsts","declarations":[{"id":100,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":99,"kind":"app","opcode":"isub","args":[{"id":97,"kind":"int","value":1},{"id":98,"kind":"int","value":2}]}},{"id":104,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":103,"kind":"app","opcode":"imul","args":[{"id":101,"kind":"int","value":2},{"id":102,"kind":"int","value":3}]}},{"id":108,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":107,"kind":"app","opcode":"idiv","args":[{"id":105,"kind":"int","value":2},{"id":106,"kind":"int","value":3}]}},{"id":112,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":111,"kind":"app","opcode":"imod","args":[{"id":109,"kind":"int","value":2},{"id":110,"kind":"int","value":3}]}},{"id":116,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":115,"kind":"app","opcode":"ipow","args":[{"id":113,"kind":"int","value":2},{"id":114,"kind":"int","value":3}]}},{"id":119,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":118,"kind":"app","opcode":"iuminus","args":[{"id":117,"kind":"int","value":100}]}},{"id":123,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":122,"kind":"app","opcode":"igt","args":[{"id":120,"kind":"int","value":2},{"id":121,"kind":"int","value":3}]}},{"id":127,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":126,"kind":"app","opcode":"igte","args":[{"id":124,"kind":"int","value":2},{"id":125,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},{"id":131,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":130,"kind":"app","opcode":"ilt","args":[{"id":128,"kind":"int","value":2},{"id":129,"kind":"int","value":3}]}},{"id":135,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":134,"kind":"app","opcode":"ilte","args":[{"id":132,"kind":"int","value":2},{"id":133,"kind":"int","value":3}]}},{"id":139,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":138,"kind":"app","opcode":"eq","args":[{"id":136,"kind":"int","value":2},{"id":137,"kind":"int","value":3}]}},{"id":143,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":142,"kind":"app","opcode":"neq","args":[{"id":140,"kind":"int","value":2},{"id":141,"kind":"int","value":3}]}},{"id":149,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":148,"kind":"app","opcode":"eq","args":[{"id":146,"kind":"app","opcode":"iadd","args":[{"id":144,"kind":"int","value":2},{"id":145,"kind":"int","value":2}]},{"id":147,"kind":"int","value":4}]}},{"id":153,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":152,"kind":"app","opcode":"in","args":[{"id":150,"kind":"int","value":1},{"id":151,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},{"id":165,"kind":"def","name":"withType","qualifier":"val","expr":{"id":164,"kind":"app","opcode":"Set","args":[{"id":162,"kind":"int","value":1},{"id":163,"kind":"int","value":2}]},"typeAnnotation":{"id":161,"kind":"set","elem":{"id":160,"kind":"int"}}},{"id":166,"kind":"typedef","name":"PROC"},{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},{"id":174,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":173,"kind":"int","value":42}},{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},{"kind":"var","name":"k","typeAnnotation":{"id":211,"kind":"int"},"id":212},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22},{"id":233,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":232,"kind":"app","opcode":"and","args":[{"id":230,"kind":"bool","value":false},{"id":231,"kind":"bool","value":true}]}},{"id":237,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":236,"kind":"app","opcode":"or","args":[{"id":234,"kind":"bool","value":false},{"id":235,"kind":"bool","value":true}]}},{"id":241,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":240,"kind":"app","opcode":"implies","args":[{"id":238,"kind":"bool","value":false},{"id":239,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26},{"id":270,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":269,"kind":"app","opcode":"and","args":[{"id":266,"kind":"bool","value":false},{"id":267,"kind":"bool","value":true},{"id":268,"kind":"bool","value":false}]}},{"id":275,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":274,"kind":"app","opcode":"actionAll","args":[{"id":271,"kind":"bool","value":false},{"id":272,"kind":"bool","value":true},{"id":273,"kind":"bool","value":false}]}},{"id":280,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":279,"kind":"app","opcode":"or","args":[{"id":276,"kind":"bool","value":false},{"id":277,"kind":"bool","value":true},{"id":278,"kind":"bool","value":false}]}},{"id":285,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":284,"kind":"app","opcode":"actionAny","args":[{"id":281,"kind":"bool","value":false},{"id":282,"kind":"bool","value":true},{"id":283,"kind":"bool","value":false}]}},{"id":290,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":289,"kind":"app","opcode":"ite","args":[{"id":286,"kind":"bool","value":true},{"id":287,"kind":"int","value":1},{"id":288,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":306,"kind":"fun","arg":{"id":304,"kind":"str"},"res":{"id":305,"kind":"int"}},"id":307},{"id":315,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":315,"kind":"lambda","params":[{"id":312,"name":"a"},{"id":313,"name":"b"}],"qualifier":"def","expr":{"id":314,"kind":"int","value":1}}},{"kind":"const","name":"MyFunFun","typeAnnotation":{"id":31,"kind":"fun","arg":{"id":29,"kind":"fun","arg":{"id":27,"kind":"int"},"res":{"id":28,"kind":"str"}},"res":{"id":30,"kind":"bool"}},"id":32},{"id":327,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":326,"kind":"app","opcode":"in","args":[{"id":324,"kind":"int","value":1},{"id":325,"kind":"app","opcode":"Set","args":[]}]}},{"kind":"const","name":"MyOperator","typeAnnotation":{"id":36,"kind":"oper","args":[{"id":33,"kind":"int"},{"id":34,"kind":"str"}],"res":{"id":35,"kind":"bool"}},"id":37},{"id":392,"kind":"def","name":"one","qualifier":"val","expr":{"id":391,"kind":"app","opcode":"head","args":[{"id":390,"kind":"app","opcode":"List","args":[{"id":388,"kind":"int","value":1},{"id":389,"kind":"int","value":2}]}]}},{"id":397,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":396,"kind":"app","opcode":"Tup","args":[{"id":393,"kind":"int","value":1},{"id":394,"kind":"int","value":2},{"id":395,"kind":"int","value":3}]}},{"id":402,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":401,"kind":"app","opcode":"Tup","args":[{"id":398,"kind":"int","value":1},{"id":399,"kind":"int","value":2},{"id":400,"kind":"int","value":3}]}},{"id":406,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":405,"kind":"app","opcode":"Tup","args":[{"id":403,"kind":"int","value":4},{"id":404,"kind":"int","value":5}]}},{"id":411,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":410,"kind":"app","opcode":"List","args":[{"id":407,"kind":"int","value":1},{"id":408,"kind":"int","value":2},{"id":409,"kind":"int","value":3}]}},{"id":416,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":415,"kind":"app","opcode":"List","args":[{"id":412,"kind":"int","value":1},{"id":413,"kind":"int","value":2},{"id":414,"kind":"int","value":3}]}},{"kind":"const","name":"MyOperatorWithComma","typeAnnotation":{"id":41,"kind":"oper","args":[{"id":38,"kind":"int"},{"id":39,"kind":"str"}],"res":{"id":40,"kind":"bool"}},"id":42},{"id":423,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":422,"kind":"app","opcode":"nth","args":[{"id":420,"kind":"app","opcode":"List","args":[{"id":417,"kind":"int","value":2},{"id":418,"kind":"int","value":3},{"id":419,"kind":"int","value":4}]},{"id":421,"kind":"int","value":2}]}},{"id":429,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"Rec","args":[{"id":425,"kind":"str","value":"name"},{"id":424,"kind":"str","value":"igor"},{"id":427,"kind":"str","value":"year"},{"id":426,"kind":"int","value":1981}]}},{"id":435,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":434,"kind":"app","opcode":"Rec","args":[{"id":430,"kind":"str","value":"name"},{"id":431,"kind":"str","value":"igor"},{"id":432,"kind":"str","value":"year"},{"id":433,"kind":"int","value":1981}]}},{"id":448,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Set","args":[{"id":444,"kind":"int","value":1},{"id":445,"kind":"int","value":2},{"id":446,"kind":"int","value":3}]}},{"kind":"const","name":"MyTuple","typeAnnotation":{"id":46,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":43,"kind":"int"}},{"fieldName":"1","fieldType":{"id":44,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":45,"kind":"str"}}],"other":{"kind":"empty"}}},"id":47},{"id":477,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":476,"kind":"app","opcode":"in","args":[{"id":474,"kind":"int","value":2},{"id":475,"kind":"app","opcode":"Set","args":[]}]}},{"id":481,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":480,"kind":"app","opcode":"subseteq","args":[{"id":478,"kind":"app","opcode":"Set","args":[]},{"id":479,"kind":"app","opcode":"Set","args":[]}]}},{"id":490,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":489,"kind":"app","opcode":"in","args":[{"id":483,"kind":"app","opcode":"Set","args":[{"id":482,"kind":"int","value":1}]},{"id":488,"kind":"app","opcode":"powerset","args":[{"id":487,"kind":"app","opcode":"Set","args":[{"id":484,"kind":"int","value":1},{"id":485,"kind":"int","value":2},{"id":486,"kind":"int","value":3}]}]}]}},{"id":503,"kind":"typedef","name":"INT_SET","type":{"id":502,"kind":"set","elem":{"id":501,"kind":"int"}}},{"id":504,"kind":"typedef","name":"UNINTERPRETED_TYPE"},{"kind":"const","name":"MyTupleWithComma","typeAnnotation":{"id":51,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":48,"kind":"int"}},{"fieldName":"1","fieldType":{"id":49,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":50,"kind":"str"}}],"other":{"kind":"empty"}}},"id":52},{"kind":"const","name":"MyRecord","typeAnnotation":{"id":56,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":53,"kind":"int"}},{"fieldName":"b","fieldType":{"id":54,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":55,"kind":"str"}}],"other":{"kind":"empty"}}},"id":57},{"kind":"const","name":"MyRecordWithComma","typeAnnotation":{"id":61,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":58,"kind":"int"}},{"fieldName":"b","fieldType":{"id":59,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":60,"kind":"str"}}],"other":{"kind":"empty"}}},"id":62},{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},{"kind":"var","name":"i","typeAnnotation":{"id":89,"kind":"int"},"id":90},{"kind":"var","name":"j","typeAnnotation":{"id":91,"kind":"bool"},"id":92},{"id":96,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":95,"kind":"app","opcode":"iadd","args":[{"id":93,"kind":"int","value":1},{"id":94,"kind":"int","value":2}]}},{"id":159,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":158,"kind":"app","opcode":"exists","args":[{"id":154,"kind":"name","name":"Bool"},{"id":157,"kind":"lambda","params":[{"id":155,"name":"x"}],"qualifier":"def","expr":{"id":156,"kind":"name","name":"x"}}]}},{"id":170,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":169,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":168,"kind":"set","elem":{"id":167,"kind":"const","name":"PROC"}}},{"id":180,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":180,"kind":"lambda","params":[{"id":175,"name":"x"},{"id":176,"name":"y"}],"qualifier":"puredef","expr":{"id":179,"kind":"app","opcode":"iadd","args":[{"id":177,"kind":"name","name":"x"},{"id":178,"kind":"name","name":"y"}]}}},{"id":185,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":185,"kind":"lambda","params":[{"id":181,"name":"factor"}],"qualifier":"def","expr":{"id":184,"kind":"app","opcode":"imul","args":[{"id":182,"kind":"name","name":"factor"},{"id":183,"kind":"name","name":"n"}]}}},{"id":190,"kind":"def","name":"A","qualifier":"action","expr":{"id":190,"kind":"lambda","params":[{"id":186,"name":"x"}],"qualifier":"action","expr":{"id":189,"kind":"app","opcode":"assign","args":[{"id":188,"kind":"name","name":"n"},{"id":187,"kind":"name","name":"x"}]}}},{"id":194,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":194,"kind":"lambda","params":[{"id":191,"name":"x"}],"qualifier":"puredef","expr":{"id":193,"kind":"app","opcode":"not","args":[{"id":192,"kind":"name","name":"x"}]}}},{"id":204,"kind":"def","name":"H","qualifier":"def","expr":{"id":204,"kind":"lambda","params":[{"id":195,"name":"x"},{"id":196,"name":"y"}],"qualifier":"def","expr":{"id":203,"kind":"app","opcode":"iadd","args":[{"id":201,"kind":"name","name":"x"},{"id":202,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":200,"kind":"oper","args":[{"id":197,"kind":"int"},{"id":198,"kind":"int"}],"res":{"id":199,"kind":"int"}}},{"id":210,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":210,"kind":"lambda","params":[{"id":205,"name":"x"}],"qualifier":"def","expr":{"id":209,"kind":"name","name":"x"}},"typeAnnotation":{"id":208,"kind":"oper","args":[{"id":206,"kind":"var","name":"a"}],"res":{"id":207,"kind":"var","name":"a"}}},{"id":216,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":215,"kind":"app","opcode":"assign","args":[{"id":214,"kind":"name","name":"k"},{"id":213,"kind":"int","value":3}]}},{"id":229,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":229,"kind":"lambda","params":[{"id":217,"name":"x"},{"id":219,"name":"y"}],"qualifier":"puredef","expr":{"id":227,"kind":"app","opcode":"ite","args":[{"id":224,"kind":"app","opcode":"ilt","args":[{"id":222,"kind":"name","name":"x"},{"id":223,"kind":"name","name":"y"}]},{"id":225,"kind":"name","name":"x"},{"id":226,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":228,"kind":"oper","args":[{"id":218,"kind":"int"},{"id":220,"kind":"int"}],"res":{"id":221,"kind":"int"}}},{"id":244,"kind":"def","name":"F","qualifier":"def","expr":{"id":244,"kind":"lambda","params":[{"id":242,"name":"x"}],"qualifier":"def","expr":{"id":243,"kind":"name","name":"x"}}},{"id":303,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":303,"kind":"lambda","params":[{"id":291,"name":"x"},{"id":292,"name":"y"}],"qualifier":"def","expr":{"id":302,"kind":"app","opcode":"ite","args":[{"id":295,"kind":"app","opcode":"ilt","args":[{"id":293,"kind":"name","name":"x"},{"id":294,"kind":"int","value":10}]},{"id":298,"kind":"app","opcode":"iadd","args":[{"id":296,"kind":"name","name":"y"},{"id":297,"kind":"int","value":5}]},{"id":301,"kind":"app","opcode":"imod","args":[{"id":299,"kind":"name","name":"y"},{"id":300,"kind":"int","value":5}]}]}}},{"id":311,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":310,"kind":"app","opcode":"get","args":[{"id":308,"kind":"name","name":"f1"},{"id":309,"kind":"str","value":"a"}]}},{"id":319,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":318,"kind":"app","opcode":"MyOper","args":[{"id":316,"kind":"str","value":"a"},{"id":317,"kind":"int","value":42}]}},{"id":323,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"MyOper","args":[{"id":320,"kind":"str","value":"a"},{"id":321,"kind":"int","value":42}]}},{"id":335,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":334,"kind":"app","opcode":"filter","args":[{"id":328,"kind":"name","name":"S"},{"id":333,"kind":"lambda","params":[{"id":329,"name":"x"}],"qualifier":"def","expr":{"id":332,"kind":"app","opcode":"igt","args":[{"id":330,"kind":"name","name":"x"},{"id":331,"kind":"int","value":10}]}}]}},{"id":373,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":372,"kind":"app","opcode":"filter","args":[{"id":368,"kind":"name","name":"S"},{"id":371,"kind":"lambda","params":[{"id":369,"name":"_"}],"qualifier":"def","expr":{"id":370,"kind":"bool","value":true}}]}},{"id":381,"kind":"def","name":"f","qualifier":"val","expr":{"id":380,"kind":"app","opcode":"mapBy","args":[{"id":374,"kind":"name","name":"S"},{"id":379,"kind":"lambda","params":[{"id":375,"name":"x"}],"qualifier":"def","expr":{"id":378,"kind":"app","opcode":"iadd","args":[{"id":376,"kind":"name","name":"x"},{"id":377,"kind":"int","value":1}]}}]}},{"id":387,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":386,"kind":"app","opcode":"exclude","args":[{"id":382,"kind":"name","name":"S"},{"id":385,"kind":"app","opcode":"Set","args":[{"id":383,"kind":"int","value":3},{"id":384,"kind":"int","value":4}]}]}},{"id":443,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":442,"kind":"app","opcode":"with","args":[{"id":441,"kind":"app","opcode":"with","args":[{"id":440,"kind":"name","name":"test_record"},{"id":437,"kind":"str","value":"name"},{"id":436,"kind":"str","value":"quint"}]},{"id":439,"kind":"str","value":"year"},{"id":438,"kind":"int","value":2023}]}},{"id":459,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":458,"kind":"let","opdef":{"id":454,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":453,"kind":"app","opcode":"Rec","args":[{"id":450,"kind":"str","value":"a"},{"id":449,"kind":"int","value":1},{"id":452,"kind":"str","value":"b"},{"id":451,"kind":"str","value":"foo"}]}},"expr":{"id":457,"kind":"app","opcode":"field","args":[{"id":455,"kind":"name","name":"my_rec"},{"id":456,"kind":"str","value":"a"}]}}},{"id":468,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":467,"kind":"let","opdef":{"id":463,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":462,"kind":"app","opcode":"Tup","args":[{"id":460,"kind":"str","value":"a"},{"id":461,"kind":"int","value":3}]}},"expr":{"id":466,"kind":"app","opcode":"item","args":[{"id":464,"kind":"name","name":"my_tup"},{"id":465,"kind":"int","value":2}]}}},{"id":473,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":473,"kind":"lambda","params":[{"id":469,"name":"s"}],"qualifier":"def","expr":{"id":472,"kind":"app","opcode":"eq","args":[{"id":470,"kind":"name","name":"s"},{"id":471,"kind":"app","opcode":"List","args":[]}]}}},{"id":494,"kind":"assume","name":"positive","assumption":{"id":493,"kind":"app","opcode":"igt","args":[{"id":491,"kind":"name","name":"N"},{"id":492,"kind":"int","value":0}]}},{"id":498,"kind":"assume","name":"_","assumption":{"id":497,"kind":"app","opcode":"neq","args":[{"id":495,"kind":"name","name":"N"},{"id":496,"kind":"int","value":0}]}},{"id":499,"kind":"import","defName":"foo","protoName":"M1"},{"id":500,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":505,"kind":"const","name":"INT_SET"},"id":506},{"id":509,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":508,"name":"N"},{"id":507,"kind":"name","name":"N"}]],"identityOverride":false},{"id":74,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":73,"kind":"lambda","params":[{"id":70,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":72,"kind":"app","opcode":"variant","args":[{"id":69,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":71}]}}},{"id":80,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":79,"kind":"lambda","params":[{"id":76,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":78,"kind":"app","opcode":"variant","args":[{"id":75,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":77}]}}},{"id":86,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":85,"kind":"lambda","params":[{"id":82,"name":"__DogParam"}],"qualifier":"def","expr":{"id":84,"kind":"app","opcode":"variant","args":[{"id":81,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":83}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":87,"kind":"const","name":"MyUnionType"},"id":88},{"id":251,"kind":"def","name":"G","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":245,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"app","opcode":"and","args":[{"id":247,"kind":"app","opcode":"F","args":[{"id":246,"kind":"name","name":"x"}]},{"id":249,"kind":"app","opcode":"not","args":[{"id":248,"kind":"name","name":"x"}]}]}}},{"id":258,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":258,"kind":"lambda","params":[{"id":252,"name":"x"}],"qualifier":"def","expr":{"id":257,"kind":"app","opcode":"and","args":[{"id":254,"kind":"app","opcode":"F","args":[{"id":253,"kind":"name","name":"x"}]},{"id":256,"kind":"app","opcode":"not","args":[{"id":255,"kind":"name","name":"x"}]}]}}},{"id":265,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":265,"kind":"lambda","params":[{"id":259,"name":"x"}],"qualifier":"def","expr":{"id":264,"kind":"app","opcode":"or","args":[{"id":261,"kind":"app","opcode":"F","args":[{"id":260,"kind":"name","name":"x"}]},{"id":263,"kind":"app","opcode":"not","args":[{"id":262,"kind":"name","name":"x"}]}]}}},{"id":355,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":354,"kind":"app","opcode":"map","args":[{"id":338,"kind":"app","opcode":"tuples","args":[{"id":336,"kind":"name","name":"S"},{"id":337,"kind":"name","name":"MySet"}]},{"id":353,"kind":"lambda","params":[{"id":344,"name":"quintTupledLambdaParam344"}],"qualifier":"def","expr":{"id":349,"kind":"let","opdef":{"id":340,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":350,"kind":"app","opcode":"item","args":[{"id":351,"kind":"name","name":"quintTupledLambdaParam344"},{"id":352,"kind":"int","value":2}]}},"expr":{"id":345,"kind":"let","opdef":{"id":339,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":346,"kind":"app","opcode":"item","args":[{"id":347,"kind":"name","name":"quintTupledLambdaParam344"},{"id":348,"kind":"int","value":1}]}},"expr":{"id":343,"kind":"app","opcode":"iadd","args":[{"id":341,"kind":"name","name":"s"},{"id":342,"kind":"name","name":"mys"}]}}}}]}},{"id":367,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":366,"kind":"let","opdef":{"id":358,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":357,"kind":"app","opcode":"oneOf","args":[{"id":356,"kind":"name","name":"S"}]}},"expr":{"id":365,"kind":"app","opcode":"actionAll","args":[{"id":361,"kind":"app","opcode":"igt","args":[{"id":359,"kind":"name","name":"x"},{"id":360,"kind":"int","value":10}]},{"id":364,"kind":"app","opcode":"assign","args":[{"id":363,"kind":"name","name":"k"},{"id":362,"kind":"name","name":"x"}]}]}}}]}],"table":{"68":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"71":{"id":70,"name":"__CircleParam","kind":"param"},"77":{"id":76,"name":"__RectangleParam","kind":"param"},"83":{"id":82,"name":"__DogParam","kind":"param"},"87":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"156":{"id":155,"name":"x","kind":"param"},"167":{"id":166,"kind":"typedef","name":"PROC"},"177":{"id":175,"name":"x","kind":"param"},"178":{"id":176,"name":"y","kind":"param"},"182":{"id":181,"name":"factor","kind":"param"},"183":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"187":{"id":186,"name":"x","kind":"param"},"188":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"192":{"id":191,"name":"x","kind":"param"},"201":{"id":195,"name":"x","kind":"param"},"202":{"id":196,"name":"y","kind":"param"},"209":{"id":205,"name":"x","kind":"param"},"214":{"kind":"var","name":"k","typeAnnotation":{"id":211,"kind":"int"},"id":212},"222":{"id":217,"name":"x","kind":"param"},"223":{"id":219,"name":"y","kind":"param"},"225":{"id":217,"name":"x","kind":"param"},"226":{"id":219,"name":"y","kind":"param"},"243":{"id":242,"name":"x","kind":"param"},"246":{"id":245,"name":"x","kind":"param"},"247":{"id":244,"kind":"def","name":"F","qualifier":"def","expr":{"id":244,"kind":"lambda","params":[{"id":242,"name":"x"}],"qualifier":"def","expr":{"id":243,"kind":"name","name":"x"}},"depth":0},"248":{"id":245,"name":"x","kind":"param"},"253":{"id":252,"name":"x","kind":"param"},"254":{"id":244,"kind":"def","name":"F","qualifier":"def","expr":{"id":244,"kind":"lambda","params":[{"id":242,"name":"x"}],"qualifier":"def","expr":{"id":243,"kind":"name","name":"x"}},"depth":0},"255":{"id":252,"name":"x","kind":"param"},"260":{"id":259,"name":"x","kind":"param"},"261":{"id":244,"kind":"def","name":"F","qualifier":"def","expr":{"id":244,"kind":"lambda","params":[{"id":242,"name":"x"}],"qualifier":"def","expr":{"id":243,"kind":"name","name":"x"}},"depth":0},"262":{"id":259,"name":"x","kind":"param"},"293":{"id":291,"name":"x","kind":"param"},"296":{"id":292,"name":"y","kind":"param"},"299":{"id":292,"name":"y","kind":"param"},"308":{"kind":"var","name":"f1","typeAnnotation":{"id":306,"kind":"fun","arg":{"id":304,"kind":"str"},"res":{"id":305,"kind":"int"}},"id":307},"318":{"id":315,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":315,"kind":"lambda","params":[{"id":312,"name":"a"},{"id":313,"name":"b"}],"qualifier":"def","expr":{"id":314,"kind":"int","value":1}},"depth":0},"322":{"id":315,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":315,"kind":"lambda","params":[{"id":312,"name":"a"},{"id":313,"name":"b"}],"qualifier":"def","expr":{"id":314,"kind":"int","value":1}},"depth":0},"328":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"330":{"id":329,"name":"x","kind":"param"},"336":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"337":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},"341":{"id":339,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":346,"kind":"app","opcode":"item","args":[{"id":347,"kind":"name","name":"quintTupledLambdaParam344"},{"id":348,"kind":"int","value":1}]},"depth":1},"342":{"id":340,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":350,"kind":"app","opcode":"item","args":[{"id":351,"kind":"name","name":"quintTupledLambdaParam344"},{"id":352,"kind":"int","value":2}]},"depth":1},"347":{"id":344,"name":"quintTupledLambdaParam344","kind":"param"},"351":{"id":344,"name":"quintTupledLambdaParam344","kind":"param"},"356":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"359":{"id":358,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":357,"kind":"app","opcode":"oneOf","args":[{"id":356,"kind":"name","name":"S"}]},"depth":1},"362":{"id":358,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":357,"kind":"app","opcode":"oneOf","args":[{"id":356,"kind":"name","name":"S"}]},"depth":1},"363":{"kind":"var","name":"k","typeAnnotation":{"id":211,"kind":"int"},"id":212},"368":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"374":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"376":{"id":375,"name":"x","kind":"param"},"382":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"440":{"id":429,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"Rec","args":[{"id":425,"kind":"str","value":"name"},{"id":424,"kind":"str","value":"igor"},{"id":427,"kind":"str","value":"year"},{"id":426,"kind":"int","value":1981}]},"depth":0},"455":{"id":454,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":453,"kind":"app","opcode":"Rec","args":[{"id":450,"kind":"str","value":"a"},{"id":449,"kind":"int","value":1},{"id":452,"kind":"str","value":"b"},{"id":451,"kind":"str","value":"foo"}]},"depth":1},"464":{"id":463,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":462,"kind":"app","opcode":"Tup","args":[{"id":460,"kind":"str","value":"a"},{"id":461,"kind":"int","value":3}]},"depth":1},"470":{"id":469,"name":"s","kind":"param"},"491":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"495":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"505":{"id":503,"kind":"typedef","name":"INT_SET","type":{"id":502,"kind":"set","elem":{"id":501,"kind":"int"}}},"507":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"508":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":507,"importedFrom":{"id":509,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":508,"name":"N"},{"id":507,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":524,"name":"withConsts","declarations":[{"id":100,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":99,"kind":"app","opcode":"isub","args":[{"id":97,"kind":"int","value":1},{"id":98,"kind":"int","value":2}]}},{"id":104,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":103,"kind":"app","opcode":"imul","args":[{"id":101,"kind":"int","value":2},{"id":102,"kind":"int","value":3}]}},{"id":108,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":107,"kind":"app","opcode":"idiv","args":[{"id":105,"kind":"int","value":2},{"id":106,"kind":"int","value":3}]}},{"id":112,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":111,"kind":"app","opcode":"imod","args":[{"id":109,"kind":"int","value":2},{"id":110,"kind":"int","value":3}]}},{"id":116,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":115,"kind":"app","opcode":"ipow","args":[{"id":113,"kind":"int","value":2},{"id":114,"kind":"int","value":3}]}},{"id":119,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":118,"kind":"app","opcode":"iuminus","args":[{"id":117,"kind":"int","value":100}]}},{"id":123,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":122,"kind":"app","opcode":"igt","args":[{"id":120,"kind":"int","value":2},{"id":121,"kind":"int","value":3}]}},{"id":127,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":126,"kind":"app","opcode":"igte","args":[{"id":124,"kind":"int","value":2},{"id":125,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},{"id":131,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":130,"kind":"app","opcode":"ilt","args":[{"id":128,"kind":"int","value":2},{"id":129,"kind":"int","value":3}]}},{"id":135,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":134,"kind":"app","opcode":"ilte","args":[{"id":132,"kind":"int","value":2},{"id":133,"kind":"int","value":3}]}},{"id":139,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":138,"kind":"app","opcode":"eq","args":[{"id":136,"kind":"int","value":2},{"id":137,"kind":"int","value":3}]}},{"id":143,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":142,"kind":"app","opcode":"neq","args":[{"id":140,"kind":"int","value":2},{"id":141,"kind":"int","value":3}]}},{"id":149,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":148,"kind":"app","opcode":"eq","args":[{"id":146,"kind":"app","opcode":"iadd","args":[{"id":144,"kind":"int","value":2},{"id":145,"kind":"int","value":2}]},{"id":147,"kind":"int","value":4}]}},{"id":153,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":152,"kind":"app","opcode":"in","args":[{"id":150,"kind":"int","value":1},{"id":151,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},{"id":165,"kind":"def","name":"withType","qualifier":"val","expr":{"id":164,"kind":"app","opcode":"Set","args":[{"id":162,"kind":"int","value":1},{"id":163,"kind":"int","value":2}]},"typeAnnotation":{"id":161,"kind":"set","elem":{"id":160,"kind":"int"}}},{"id":166,"kind":"typedef","name":"PROC"},{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},{"id":174,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":173,"kind":"int","value":42}},{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},{"kind":"var","name":"k","typeAnnotation":{"id":217,"kind":"int"},"id":218},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22},{"id":240,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":239,"kind":"app","opcode":"and","args":[{"id":237,"kind":"bool","value":false},{"id":238,"kind":"bool","value":true}]}},{"id":244,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":243,"kind":"app","opcode":"or","args":[{"id":241,"kind":"bool","value":false},{"id":242,"kind":"bool","value":true}]}},{"id":248,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":247,"kind":"app","opcode":"implies","args":[{"id":245,"kind":"bool","value":false},{"id":246,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26},{"id":281,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":280,"kind":"app","opcode":"and","args":[{"id":277,"kind":"bool","value":false},{"id":278,"kind":"bool","value":true},{"id":279,"kind":"bool","value":false}]}},{"id":286,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":285,"kind":"app","opcode":"actionAll","args":[{"id":282,"kind":"bool","value":false},{"id":283,"kind":"bool","value":true},{"id":284,"kind":"bool","value":false}]}},{"id":291,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":290,"kind":"app","opcode":"or","args":[{"id":287,"kind":"bool","value":false},{"id":288,"kind":"bool","value":true},{"id":289,"kind":"bool","value":false}]}},{"id":296,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":295,"kind":"app","opcode":"actionAny","args":[{"id":292,"kind":"bool","value":false},{"id":293,"kind":"bool","value":true},{"id":294,"kind":"bool","value":false}]}},{"id":301,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":300,"kind":"app","opcode":"ite","args":[{"id":297,"kind":"bool","value":true},{"id":298,"kind":"int","value":1},{"id":299,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319},{"kind":"const","name":"MyFunFun","typeAnnotation":{"id":31,"kind":"fun","arg":{"id":29,"kind":"fun","arg":{"id":27,"kind":"int"},"res":{"id":28,"kind":"str"}},"res":{"id":30,"kind":"bool"}},"id":32},{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}}},{"id":340,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":339,"kind":"app","opcode":"in","args":[{"id":337,"kind":"int","value":1},{"id":338,"kind":"app","opcode":"Set","args":[]}]}},{"kind":"const","name":"MyOperator","typeAnnotation":{"id":36,"kind":"oper","args":[{"id":33,"kind":"int"},{"id":34,"kind":"str"}],"res":{"id":35,"kind":"bool"}},"id":37},{"id":405,"kind":"def","name":"one","qualifier":"val","expr":{"id":404,"kind":"app","opcode":"head","args":[{"id":403,"kind":"app","opcode":"List","args":[{"id":401,"kind":"int","value":1},{"id":402,"kind":"int","value":2}]}]}},{"id":410,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":409,"kind":"app","opcode":"Tup","args":[{"id":406,"kind":"int","value":1},{"id":407,"kind":"int","value":2},{"id":408,"kind":"int","value":3}]}},{"id":415,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":414,"kind":"app","opcode":"Tup","args":[{"id":411,"kind":"int","value":1},{"id":412,"kind":"int","value":2},{"id":413,"kind":"int","value":3}]}},{"id":419,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":418,"kind":"app","opcode":"Tup","args":[{"id":416,"kind":"int","value":4},{"id":417,"kind":"int","value":5}]}},{"kind":"const","name":"MyOperatorWithComma","typeAnnotation":{"id":41,"kind":"oper","args":[{"id":38,"kind":"int"},{"id":39,"kind":"str"}],"res":{"id":40,"kind":"bool"}},"id":42},{"id":424,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":423,"kind":"app","opcode":"List","args":[{"id":420,"kind":"int","value":1},{"id":421,"kind":"int","value":2},{"id":422,"kind":"int","value":3}]}},{"id":429,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"List","args":[{"id":425,"kind":"int","value":1},{"id":426,"kind":"int","value":2},{"id":427,"kind":"int","value":3}]}},{"id":436,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":435,"kind":"app","opcode":"nth","args":[{"id":433,"kind":"app","opcode":"List","args":[{"id":430,"kind":"int","value":2},{"id":431,"kind":"int","value":3},{"id":432,"kind":"int","value":4}]},{"id":434,"kind":"int","value":2}]}},{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]}},{"id":448,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Rec","args":[{"id":443,"kind":"str","value":"name"},{"id":444,"kind":"str","value":"igor"},{"id":445,"kind":"str","value":"year"},{"id":446,"kind":"int","value":1981}]}},{"id":461,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":460,"kind":"app","opcode":"Set","args":[{"id":457,"kind":"int","value":1},{"id":458,"kind":"int","value":2},{"id":459,"kind":"int","value":3}]}},{"kind":"const","name":"MyTuple","typeAnnotation":{"id":46,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":43,"kind":"int"}},{"fieldName":"1","fieldType":{"id":44,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":45,"kind":"str"}}],"other":{"kind":"empty"}}},"id":47},{"id":491,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":490,"kind":"app","opcode":"in","args":[{"id":488,"kind":"int","value":2},{"id":489,"kind":"app","opcode":"Set","args":[]}]}},{"id":495,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":494,"kind":"app","opcode":"subseteq","args":[{"id":492,"kind":"app","opcode":"Set","args":[]},{"id":493,"kind":"app","opcode":"Set","args":[]}]}},{"id":504,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":503,"kind":"app","opcode":"in","args":[{"id":497,"kind":"app","opcode":"Set","args":[{"id":496,"kind":"int","value":1}]},{"id":502,"kind":"app","opcode":"powerset","args":[{"id":501,"kind":"app","opcode":"Set","args":[{"id":498,"kind":"int","value":1},{"id":499,"kind":"int","value":2},{"id":500,"kind":"int","value":3}]}]}]}},{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}}},{"id":518,"kind":"typedef","name":"UNINTERPRETED_TYPE"},{"kind":"const","name":"MyTupleWithComma","typeAnnotation":{"id":51,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":48,"kind":"int"}},{"fieldName":"1","fieldType":{"id":49,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":50,"kind":"str"}}],"other":{"kind":"empty"}}},"id":52},{"kind":"const","name":"MyRecord","typeAnnotation":{"id":56,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":53,"kind":"int"}},{"fieldName":"b","fieldType":{"id":54,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":55,"kind":"str"}}],"other":{"kind":"empty"}}},"id":57},{"kind":"const","name":"MyRecordWithComma","typeAnnotation":{"id":61,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":58,"kind":"int"}},{"fieldName":"b","fieldType":{"id":59,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":60,"kind":"str"}}],"other":{"kind":"empty"}}},"id":62},{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},{"kind":"var","name":"i","typeAnnotation":{"id":89,"kind":"int"},"id":90},{"kind":"var","name":"j","typeAnnotation":{"id":91,"kind":"bool"},"id":92},{"id":96,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":95,"kind":"app","opcode":"iadd","args":[{"id":93,"kind":"int","value":1},{"id":94,"kind":"int","value":2}]}},{"id":159,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":158,"kind":"app","opcode":"exists","args":[{"id":154,"kind":"name","name":"Bool"},{"id":157,"kind":"lambda","params":[{"id":155,"name":"x"}],"qualifier":"def","expr":{"id":156,"kind":"name","name":"x"}}]}},{"id":170,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":169,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":168,"kind":"set","elem":{"id":167,"kind":"const","name":"PROC"}}},{"id":181,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":180,"kind":"lambda","params":[{"id":175,"name":"x"},{"id":176,"name":"y"}],"qualifier":"puredef","expr":{"id":179,"kind":"app","opcode":"iadd","args":[{"id":177,"kind":"name","name":"x"},{"id":178,"kind":"name","name":"y"}]}}},{"id":187,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":186,"kind":"lambda","params":[{"id":182,"name":"factor"}],"qualifier":"def","expr":{"id":185,"kind":"app","opcode":"imul","args":[{"id":183,"kind":"name","name":"factor"},{"id":184,"kind":"name","name":"n"}]}}},{"id":193,"kind":"def","name":"A","qualifier":"action","expr":{"id":192,"kind":"lambda","params":[{"id":188,"name":"x"}],"qualifier":"action","expr":{"id":191,"kind":"app","opcode":"assign","args":[{"id":190,"kind":"name","name":"n"},{"id":189,"kind":"name","name":"x"}]}}},{"id":198,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":197,"kind":"lambda","params":[{"id":194,"name":"x"}],"qualifier":"puredef","expr":{"id":196,"kind":"app","opcode":"not","args":[{"id":195,"kind":"name","name":"x"}]}}},{"id":209,"kind":"def","name":"H","qualifier":"def","expr":{"id":208,"kind":"lambda","params":[{"id":199,"name":"x"},{"id":200,"name":"y"}],"qualifier":"def","expr":{"id":207,"kind":"app","opcode":"iadd","args":[{"id":205,"kind":"name","name":"x"},{"id":206,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":204,"kind":"oper","args":[{"id":201,"kind":"int"},{"id":202,"kind":"int"}],"res":{"id":203,"kind":"int"}}},{"id":216,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":215,"kind":"lambda","params":[{"id":210,"name":"x"}],"qualifier":"def","expr":{"id":214,"kind":"name","name":"x"}},"typeAnnotation":{"id":213,"kind":"oper","args":[{"id":211,"kind":"var","name":"a"}],"res":{"id":212,"kind":"var","name":"a"}}},{"id":222,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":221,"kind":"app","opcode":"assign","args":[{"id":220,"kind":"name","name":"k"},{"id":219,"kind":"int","value":3}]}},{"id":236,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":235,"kind":"lambda","params":[{"id":223,"name":"x"},{"id":225,"name":"y"}],"qualifier":"puredef","expr":{"id":233,"kind":"app","opcode":"ite","args":[{"id":230,"kind":"app","opcode":"ilt","args":[{"id":228,"kind":"name","name":"x"},{"id":229,"kind":"name","name":"y"}]},{"id":231,"kind":"name","name":"x"},{"id":232,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":234,"kind":"oper","args":[{"id":224,"kind":"int"},{"id":226,"kind":"int"}],"res":{"id":227,"kind":"int"}}},{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}}},{"id":315,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":314,"kind":"lambda","params":[{"id":302,"name":"x"},{"id":303,"name":"y"}],"qualifier":"def","expr":{"id":313,"kind":"app","opcode":"ite","args":[{"id":306,"kind":"app","opcode":"ilt","args":[{"id":304,"kind":"name","name":"x"},{"id":305,"kind":"int","value":10}]},{"id":309,"kind":"app","opcode":"iadd","args":[{"id":307,"kind":"name","name":"y"},{"id":308,"kind":"int","value":5}]},{"id":312,"kind":"app","opcode":"imod","args":[{"id":310,"kind":"name","name":"y"},{"id":311,"kind":"int","value":5}]}]}}},{"id":323,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"get","args":[{"id":320,"kind":"name","name":"f1"},{"id":321,"kind":"str","value":"a"}]}},{"id":332,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":331,"kind":"app","opcode":"MyOper","args":[{"id":329,"kind":"str","value":"a"},{"id":330,"kind":"int","value":42}]}},{"id":336,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":335,"kind":"app","opcode":"MyOper","args":[{"id":333,"kind":"str","value":"a"},{"id":334,"kind":"int","value":42}]}},{"id":348,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":347,"kind":"app","opcode":"filter","args":[{"id":341,"kind":"name","name":"S"},{"id":346,"kind":"lambda","params":[{"id":342,"name":"x"}],"qualifier":"def","expr":{"id":345,"kind":"app","opcode":"igt","args":[{"id":343,"kind":"name","name":"x"},{"id":344,"kind":"int","value":10}]}}]}},{"id":386,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":385,"kind":"app","opcode":"filter","args":[{"id":381,"kind":"name","name":"S"},{"id":384,"kind":"lambda","params":[{"id":382,"name":"_"}],"qualifier":"def","expr":{"id":383,"kind":"bool","value":true}}]}},{"id":394,"kind":"def","name":"f","qualifier":"val","expr":{"id":393,"kind":"app","opcode":"mapBy","args":[{"id":387,"kind":"name","name":"S"},{"id":392,"kind":"lambda","params":[{"id":388,"name":"x"}],"qualifier":"def","expr":{"id":391,"kind":"app","opcode":"iadd","args":[{"id":389,"kind":"name","name":"x"},{"id":390,"kind":"int","value":1}]}}]}},{"id":400,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":399,"kind":"app","opcode":"exclude","args":[{"id":395,"kind":"name","name":"S"},{"id":398,"kind":"app","opcode":"Set","args":[{"id":396,"kind":"int","value":3},{"id":397,"kind":"int","value":4}]}]}},{"id":456,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":455,"kind":"app","opcode":"with","args":[{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"name","name":"test_record"},{"id":450,"kind":"str","value":"name"},{"id":449,"kind":"str","value":"quint"}]},{"id":452,"kind":"str","value":"year"},{"id":451,"kind":"int","value":2023}]}},{"id":472,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":471,"kind":"let","opdef":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]}},"expr":{"id":470,"kind":"app","opcode":"field","args":[{"id":468,"kind":"name","name":"my_rec"},{"id":469,"kind":"str","value":"a"}]}}},{"id":481,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":480,"kind":"let","opdef":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]}},"expr":{"id":479,"kind":"app","opcode":"item","args":[{"id":477,"kind":"name","name":"my_tup"},{"id":478,"kind":"int","value":2}]}}},{"id":487,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":486,"kind":"lambda","params":[{"id":482,"name":"s"}],"qualifier":"def","expr":{"id":485,"kind":"app","opcode":"eq","args":[{"id":483,"kind":"name","name":"s"},{"id":484,"kind":"app","opcode":"List","args":[]}]}}},{"id":508,"kind":"assume","name":"positive","assumption":{"id":507,"kind":"app","opcode":"igt","args":[{"id":505,"kind":"name","name":"N"},{"id":506,"kind":"int","value":0}]}},{"id":512,"kind":"assume","name":"_","assumption":{"id":511,"kind":"app","opcode":"neq","args":[{"id":509,"kind":"name","name":"N"},{"id":510,"kind":"int","value":0}]}},{"id":513,"kind":"import","defName":"foo","protoName":"M1"},{"id":514,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":519,"kind":"const","name":"INT_SET"},"id":520},{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},{"id":74,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":73,"kind":"lambda","params":[{"id":70,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":72,"kind":"app","opcode":"variant","args":[{"id":69,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":71}]}}},{"id":80,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":79,"kind":"lambda","params":[{"id":76,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":78,"kind":"app","opcode":"variant","args":[{"id":75,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":77}]}}},{"id":86,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":85,"kind":"lambda","params":[{"id":82,"name":"__DogParam"}],"qualifier":"def","expr":{"id":84,"kind":"app","opcode":"variant","args":[{"id":81,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":83}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":87,"kind":"const","name":"MyUnionType"},"id":88},{"id":260,"kind":"def","name":"G","qualifier":"def","expr":{"id":259,"kind":"lambda","params":[{"id":253,"name":"x"}],"qualifier":"def","expr":{"id":258,"kind":"app","opcode":"and","args":[{"id":255,"kind":"app","opcode":"F","args":[{"id":254,"kind":"name","name":"x"}]},{"id":257,"kind":"app","opcode":"not","args":[{"id":256,"kind":"name","name":"x"}]}]}}},{"id":268,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":267,"kind":"lambda","params":[{"id":261,"name":"x"}],"qualifier":"def","expr":{"id":266,"kind":"app","opcode":"and","args":[{"id":263,"kind":"app","opcode":"F","args":[{"id":262,"kind":"name","name":"x"}]},{"id":265,"kind":"app","opcode":"not","args":[{"id":264,"kind":"name","name":"x"}]}]}}},{"id":276,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":275,"kind":"lambda","params":[{"id":269,"name":"x"}],"qualifier":"def","expr":{"id":274,"kind":"app","opcode":"or","args":[{"id":271,"kind":"app","opcode":"F","args":[{"id":270,"kind":"name","name":"x"}]},{"id":273,"kind":"app","opcode":"not","args":[{"id":272,"kind":"name","name":"x"}]}]}}},{"id":368,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":367,"kind":"app","opcode":"map","args":[{"id":351,"kind":"app","opcode":"tuples","args":[{"id":349,"kind":"name","name":"S"},{"id":350,"kind":"name","name":"MySet"}]},{"id":366,"kind":"lambda","params":[{"id":357,"name":"quintTupledLambdaParam357"}],"qualifier":"def","expr":{"id":362,"kind":"let","opdef":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]}},"expr":{"id":358,"kind":"let","opdef":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]}},"expr":{"id":356,"kind":"app","opcode":"iadd","args":[{"id":354,"kind":"name","name":"s"},{"id":355,"kind":"name","name":"mys"}]}}}}]}},{"id":380,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":379,"kind":"let","opdef":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]}},"expr":{"id":378,"kind":"app","opcode":"actionAll","args":[{"id":374,"kind":"app","opcode":"igt","args":[{"id":372,"kind":"name","name":"x"},{"id":373,"kind":"int","value":10}]},{"id":377,"kind":"app","opcode":"assign","args":[{"id":376,"kind":"name","name":"k"},{"id":375,"kind":"name","name":"x"}]}]}}}]}],"table":{"68":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"71":{"id":70,"name":"__CircleParam","kind":"param"},"77":{"id":76,"name":"__RectangleParam","kind":"param"},"83":{"id":82,"name":"__DogParam","kind":"param"},"87":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"156":{"id":155,"name":"x","kind":"param"},"167":{"id":166,"kind":"typedef","name":"PROC"},"177":{"id":175,"name":"x","kind":"param"},"178":{"id":176,"name":"y","kind":"param"},"183":{"id":182,"name":"factor","kind":"param"},"184":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"189":{"id":188,"name":"x","kind":"param"},"190":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"195":{"id":194,"name":"x","kind":"param"},"205":{"id":199,"name":"x","kind":"param"},"206":{"id":200,"name":"y","kind":"param"},"214":{"id":210,"name":"x","kind":"param"},"220":{"kind":"var","name":"k","typeAnnotation":{"id":217,"kind":"int"},"id":218},"228":{"id":223,"name":"x","kind":"param"},"229":{"id":225,"name":"y","kind":"param"},"231":{"id":223,"name":"x","kind":"param"},"232":{"id":225,"name":"y","kind":"param"},"250":{"id":249,"name":"x","kind":"param"},"254":{"id":253,"name":"x","kind":"param"},"255":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"256":{"id":253,"name":"x","kind":"param"},"262":{"id":261,"name":"x","kind":"param"},"263":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"264":{"id":261,"name":"x","kind":"param"},"270":{"id":269,"name":"x","kind":"param"},"271":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"272":{"id":269,"name":"x","kind":"param"},"304":{"id":302,"name":"x","kind":"param"},"307":{"id":303,"name":"y","kind":"param"},"310":{"id":303,"name":"y","kind":"param"},"320":{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319},"331":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"335":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"341":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"343":{"id":342,"name":"x","kind":"param"},"349":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"350":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},"354":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]},"depth":1},"355":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]},"depth":1},"360":{"id":357,"name":"quintTupledLambdaParam357","kind":"param"},"364":{"id":357,"name":"quintTupledLambdaParam357","kind":"param"},"369":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"372":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"375":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"376":{"kind":"var","name":"k","typeAnnotation":{"id":217,"kind":"int"},"id":218},"381":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"387":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"389":{"id":388,"name":"x","kind":"param"},"395":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"453":{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]},"depth":0},"468":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]},"depth":1},"477":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]},"depth":1},"483":{"id":482,"name":"s","kind":"param"},"505":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"509":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"519":{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}}},"521":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"522":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":521,"importedFrom":{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/SuperSpec.map.json b/quint/testFixture/SuperSpec.map.json index 54d6d710d..221260965 100644 --- a/quint/testFixture/SuperSpec.map.json +++ b/quint/testFixture/SuperSpec.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/SuperSpec.qnt"},"map":{"1":[0,{"line":1,"col":12,"index":24},{"line":1,"col":12,"index":24}],"2":[0,{"line":1,"col":2,"index":14},{"line":1,"col":12,"index":24}],"3":[0,{"line":0,"col":0,"index":0},{"line":2,"col":26,"index":26}],"4":[0,{"line":5,"col":12,"index":53},{"line":5,"col":12,"index":53}],"5":[0,{"line":5,"col":2,"index":43},{"line":5,"col":12,"index":53}],"6":[0,{"line":4,"col":0,"index":29},{"line":6,"col":26,"index":55}],"7":[0,{"line":9,"col":11,"index":84},{"line":9,"col":13,"index":86}],"8":[0,{"line":9,"col":2,"index":75},{"line":9,"col":13,"index":86}],"9":[0,{"line":10,"col":9,"index":97},{"line":10,"col":11,"index":99}],"10":[0,{"line":10,"col":2,"index":90},{"line":10,"col":11,"index":99}],"11":[0,{"line":8,"col":0,"index":58},{"line":11,"col":43,"index":101}],"12":[0,{"line":16,"col":11,"index":186},{"line":16,"col":13,"index":188}],"13":[0,{"line":16,"col":2,"index":177},{"line":16,"col":13,"index":188}],"14":[0,{"line":17,"col":15,"index":205},{"line":17,"col":17,"index":207}],"15":[0,{"line":17,"col":11,"index":201},{"line":17,"col":18,"index":208}],"16":[0,{"line":17,"col":2,"index":192},{"line":17,"col":18,"index":208}],"17":[0,{"line":18,"col":19,"index":229},{"line":18,"col":21,"index":231}],"18":[0,{"line":18,"col":15,"index":225},{"line":18,"col":22,"index":232}],"19":[0,{"line":18,"col":2,"index":212},{"line":18,"col":22,"index":232}],"20":[0,{"line":19,"col":20,"index":254},{"line":19,"col":23,"index":257}],"21":[0,{"line":19,"col":15,"index":249},{"line":19,"col":24,"index":258}],"22":[0,{"line":19,"col":2,"index":236},{"line":19,"col":24,"index":258}],"23":[0,{"line":20,"col":15,"index":275},{"line":20,"col":17,"index":277}],"24":[0,{"line":20,"col":22,"index":282},{"line":20,"col":24,"index":284}],"25":[0,{"line":20,"col":15,"index":275},{"line":20,"col":24,"index":284}],"26":[0,{"line":20,"col":2,"index":262},{"line":20,"col":24,"index":284}],"27":[0,{"line":21,"col":19,"index":305},{"line":21,"col":21,"index":307}],"28":[0,{"line":21,"col":26,"index":312},{"line":21,"col":28,"index":314}],"29":[0,{"line":21,"col":19,"index":305},{"line":21,"col":28,"index":314}],"30":[0,{"line":21,"col":34,"index":320},{"line":21,"col":37,"index":323}],"31":[0,{"line":21,"col":18,"index":304},{"line":21,"col":37,"index":323}],"32":[0,{"line":21,"col":2,"index":288},{"line":21,"col":37,"index":323}],"33":[0,{"line":22,"col":21,"index":346},{"line":22,"col":23,"index":348}],"34":[0,{"line":22,"col":26,"index":351},{"line":22,"col":28,"index":353}],"35":[0,{"line":22,"col":34,"index":359},{"line":22,"col":37,"index":362}],"36":[0,{"line":22,"col":20,"index":345},{"line":22,"col":37,"index":362}],"37":[0,{"line":22,"col":2,"index":327},{"line":22,"col":37,"index":362}],"38":[0,{"line":23,"col":30,"index":394},{"line":23,"col":32,"index":396}],"39":[0,{"line":23,"col":35,"index":399},{"line":23,"col":37,"index":401}],"40":[0,{"line":23,"col":45,"index":409},{"line":23,"col":48,"index":412}],"41":[0,{"line":23,"col":29,"index":393},{"line":23,"col":48,"index":412}],"42":[0,{"line":23,"col":2,"index":366},{"line":23,"col":48,"index":412}],"43":[0,{"line":24,"col":18,"index":432},{"line":24,"col":20,"index":434}],"44":[0,{"line":24,"col":23,"index":437},{"line":24,"col":26,"index":440}],"45":[0,{"line":24,"col":29,"index":443},{"line":24,"col":31,"index":445}],"46":[0,{"line":24,"col":17,"index":431},{"line":24,"col":32,"index":446}],"47":[0,{"line":24,"col":2,"index":416},{"line":24,"col":32,"index":446}],"48":[0,{"line":25,"col":27,"index":475},{"line":25,"col":29,"index":477}],"49":[0,{"line":25,"col":32,"index":480},{"line":25,"col":35,"index":483}],"50":[0,{"line":25,"col":38,"index":486},{"line":25,"col":40,"index":488}],"51":[0,{"line":25,"col":26,"index":474},{"line":25,"col":43,"index":491}],"52":[0,{"line":25,"col":2,"index":450},{"line":25,"col":43,"index":491}],"53":[0,{"line":28,"col":23,"index":580},{"line":28,"col":25,"index":582}],"54":[0,{"line":28,"col":31,"index":588},{"line":28,"col":34,"index":591}],"55":[0,{"line":28,"col":40,"index":597},{"line":28,"col":42,"index":599}],"56":[0,{"line":28,"col":18,"index":575},{"line":28,"col":44,"index":601}],"57":[0,{"line":28,"col":2,"index":559},{"line":28,"col":44,"index":601}],"58":[0,{"line":29,"col":32,"index":635},{"line":29,"col":34,"index":637}],"59":[0,{"line":29,"col":40,"index":643},{"line":29,"col":43,"index":646}],"60":[0,{"line":29,"col":49,"index":652},{"line":29,"col":51,"index":654}],"61":[0,{"line":29,"col":27,"index":630},{"line":29,"col":54,"index":657}],"62":[0,{"line":29,"col":2,"index":605},{"line":29,"col":54,"index":657}],"63":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"64":[0,{"line":34,"col":26,"index":777},{"line":34,"col":28,"index":779}],"65":[0,{"line":34,"col":39,"index":790},{"line":34,"col":41,"index":792}],"66":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"67":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"68":[0,{"line":32,"col":2,"index":712},{"line":35,"col":102,"index":812}],"69":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"70":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"71":[0,{"line":33,"col":8,"index":739},{"line":33,"col":13,"index":744}],"72":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"73":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"74":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"75":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"76":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"77":[0,{"line":34,"col":8,"index":759},{"line":34,"col":16,"index":767}],"78":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"79":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"80":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"81":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"82":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"83":[0,{"line":35,"col":8,"index":805},{"line":35,"col":10,"index":807}],"84":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"85":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"86":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"87":[0,{"line":36,"col":17,"index":831},{"line":36,"col":27,"index":841}],"88":[0,{"line":36,"col":2,"index":816},{"line":36,"col":27,"index":841}],"89":[0,{"line":41,"col":9,"index":955},{"line":41,"col":11,"index":957}],"90":[0,{"line":41,"col":2,"index":948},{"line":41,"col":11,"index":957}],"91":[0,{"line":42,"col":9,"index":968},{"line":42,"col":12,"index":971}],"92":[0,{"line":42,"col":2,"index":961},{"line":42,"col":12,"index":971}],"93":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":19,"index":1140}],"94":[0,{"line":47,"col":23,"index":1144},{"line":47,"col":23,"index":1144}],"95":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":23,"index":1144}],"96":[0,{"line":47,"col":2,"index":1123},{"line":47,"col":23,"index":1144}],"97":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":19,"index":1165}],"98":[0,{"line":48,"col":23,"index":1169},{"line":48,"col":23,"index":1169}],"99":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":23,"index":1169}],"100":[0,{"line":48,"col":2,"index":1148},{"line":48,"col":23,"index":1169}],"101":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":19,"index":1190}],"102":[0,{"line":49,"col":23,"index":1194},{"line":49,"col":23,"index":1194}],"103":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":23,"index":1194}],"104":[0,{"line":49,"col":2,"index":1173},{"line":49,"col":23,"index":1194}],"105":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":19,"index":1215}],"106":[0,{"line":50,"col":23,"index":1219},{"line":50,"col":23,"index":1219}],"107":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":23,"index":1219}],"108":[0,{"line":50,"col":2,"index":1198},{"line":50,"col":23,"index":1219}],"109":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":19,"index":1240}],"110":[0,{"line":51,"col":23,"index":1244},{"line":51,"col":23,"index":1244}],"111":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":23,"index":1244}],"112":[0,{"line":51,"col":2,"index":1223},{"line":51,"col":23,"index":1244}],"113":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":19,"index":1265}],"114":[0,{"line":52,"col":21,"index":1267},{"line":52,"col":21,"index":1267}],"115":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":21,"index":1267}],"116":[0,{"line":52,"col":2,"index":1248},{"line":52,"col":21,"index":1267}],"117":[0,{"line":53,"col":16,"index":1285},{"line":53,"col":18,"index":1287}],"118":[0,{"line":53,"col":15,"index":1284},{"line":53,"col":18,"index":1287}],"119":[0,{"line":53,"col":2,"index":1271},{"line":53,"col":18,"index":1287}],"120":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":18,"index":1307}],"121":[0,{"line":54,"col":22,"index":1311},{"line":54,"col":22,"index":1311}],"122":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":22,"index":1311}],"123":[0,{"line":54,"col":2,"index":1291},{"line":54,"col":22,"index":1311}],"124":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":18,"index":1331}],"125":[0,{"line":55,"col":23,"index":1336},{"line":55,"col":23,"index":1336}],"126":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":23,"index":1336}],"127":[0,{"line":55,"col":2,"index":1315},{"line":55,"col":23,"index":1336}],"128":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":18,"index":1356}],"129":[0,{"line":56,"col":22,"index":1360},{"line":56,"col":22,"index":1360}],"130":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":22,"index":1360}],"131":[0,{"line":56,"col":2,"index":1340},{"line":56,"col":22,"index":1360}],"132":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":18,"index":1380}],"133":[0,{"line":57,"col":23,"index":1385},{"line":57,"col":23,"index":1385}],"134":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":23,"index":1385}],"135":[0,{"line":57,"col":2,"index":1364},{"line":57,"col":23,"index":1385}],"136":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":20,"index":1407}],"137":[0,{"line":58,"col":25,"index":1412},{"line":58,"col":25,"index":1412}],"138":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":25,"index":1412}],"139":[0,{"line":58,"col":2,"index":1389},{"line":58,"col":25,"index":1412}],"140":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":18,"index":1432}],"141":[0,{"line":59,"col":23,"index":1437},{"line":59,"col":23,"index":1437}],"142":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":23,"index":1437}],"143":[0,{"line":59,"col":2,"index":1416},{"line":59,"col":23,"index":1437}],"144":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":6,"index":1464}],"145":[0,{"line":61,"col":10,"index":1468},{"line":61,"col":10,"index":1468}],"146":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":10,"index":1468}],"147":[0,{"line":61,"col":15,"index":1473},{"line":61,"col":15,"index":1473}],"148":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":15,"index":1473}],"149":[0,{"line":60,"col":2,"index":1441},{"line":62,"col":38,"index":1477}],"150":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":25,"index":1504}],"151":[0,{"line":63,"col":30,"index":1509},{"line":63,"col":32,"index":1511}],"152":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":33,"index":1512}],"153":[0,{"line":63,"col":2,"index":1481},{"line":63,"col":33,"index":1512}],"154":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":26,"index":1540}],"155":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":35,"index":1549}],"156":[0,{"line":64,"col":40,"index":1554},{"line":64,"col":40,"index":1554}],"157":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":40,"index":1554}],"158":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":41,"index":1555}],"159":[0,{"line":64,"col":2,"index":1516},{"line":64,"col":41,"index":1555}],"160":[0,{"line":67,"col":20,"index":1594},{"line":67,"col":22,"index":1596}],"161":[0,{"line":67,"col":16,"index":1590},{"line":67,"col":23,"index":1597}],"162":[0,{"line":67,"col":31,"index":1605},{"line":67,"col":31,"index":1605}],"163":[0,{"line":67,"col":34,"index":1608},{"line":67,"col":34,"index":1608}],"164":[0,{"line":67,"col":27,"index":1601},{"line":67,"col":35,"index":1609}],"165":[0,{"line":67,"col":2,"index":1576},{"line":67,"col":35,"index":1609}],"166":[0,{"line":69,"col":2,"index":1648},{"line":69,"col":10,"index":1656}],"167":[0,{"line":70,"col":33,"index":1691},{"line":70,"col":36,"index":1694}],"168":[0,{"line":70,"col":29,"index":1687},{"line":70,"col":37,"index":1695}],"169":[0,{"line":70,"col":41,"index":1699},{"line":70,"col":45,"index":1703}],"170":[0,{"line":70,"col":2,"index":1660},{"line":70,"col":45,"index":1703}],"171":[0,{"line":73,"col":9,"index":1741},{"line":73,"col":11,"index":1743}],"172":[0,{"line":73,"col":2,"index":1734},{"line":73,"col":11,"index":1743}],"173":[0,{"line":74,"col":25,"index":1770},{"line":74,"col":26,"index":1771}],"174":[0,{"line":74,"col":2,"index":1747},{"line":74,"col":26,"index":1771}],"175":[0,{"line":75,"col":15,"index":1788},{"line":75,"col":15,"index":1788}],"176":[0,{"line":75,"col":18,"index":1791},{"line":75,"col":18,"index":1791}],"177":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":23,"index":1796}],"178":[0,{"line":75,"col":27,"index":1800},{"line":75,"col":27,"index":1800}],"179":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":27,"index":1800}],"180":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"181":[0,{"line":76,"col":10,"index":1812},{"line":76,"col":15,"index":1817}],"182":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":25,"index":1827}],"183":[0,{"line":76,"col":29,"index":1831},{"line":76,"col":29,"index":1831}],"184":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":29,"index":1831}],"185":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"186":[0,{"line":77,"col":11,"index":1844},{"line":77,"col":11,"index":1844}],"187":[0,{"line":77,"col":21,"index":1854},{"line":77,"col":21,"index":1854}],"188":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"189":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"190":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"191":[0,{"line":78,"col":13,"index":1869},{"line":78,"col":13,"index":1869}],"192":[0,{"line":78,"col":22,"index":1878},{"line":78,"col":22,"index":1878}],"193":[0,{"line":78,"col":18,"index":1874},{"line":78,"col":23,"index":1879}],"194":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"195":[0,{"line":81,"col":8,"index":1911},{"line":81,"col":8,"index":1911}],"196":[0,{"line":81,"col":11,"index":1914},{"line":81,"col":11,"index":1914}],"197":[0,{"line":81,"col":16,"index":1919},{"line":81,"col":18,"index":1921}],"198":[0,{"line":81,"col":21,"index":1924},{"line":81,"col":23,"index":1926}],"199":[0,{"line":81,"col":29,"index":1932},{"line":81,"col":31,"index":1934}],"200":[0,{"line":81,"col":15,"index":1918},{"line":81,"col":31,"index":1934}],"201":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":6,"index":1946}],"202":[0,{"line":82,"col":10,"index":1950},{"line":82,"col":10,"index":1950}],"203":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":10,"index":1950}],"204":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"205":[0,{"line":85,"col":10,"index":1997},{"line":85,"col":10,"index":1997}],"206":[0,{"line":85,"col":15,"index":2002},{"line":85,"col":15,"index":2002}],"207":[0,{"line":85,"col":21,"index":2008},{"line":85,"col":21,"index":2008}],"208":[0,{"line":85,"col":14,"index":2001},{"line":85,"col":21,"index":2008}],"209":[0,{"line":86,"col":6,"index":2020},{"line":86,"col":6,"index":2020}],"210":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"211":[0,{"line":89,"col":9,"index":2036},{"line":89,"col":11,"index":2038}],"212":[0,{"line":89,"col":2,"index":2029},{"line":89,"col":11,"index":2038}],"213":[0,{"line":90,"col":21,"index":2061},{"line":90,"col":21,"index":2061}],"214":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"215":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"216":[0,{"line":90,"col":2,"index":2042},{"line":90,"col":21,"index":2061}],"217":[0,{"line":93,"col":15,"index":2113},{"line":93,"col":15,"index":2113}],"218":[0,{"line":93,"col":18,"index":2116},{"line":93,"col":20,"index":2118}],"219":[0,{"line":93,"col":23,"index":2121},{"line":93,"col":23,"index":2121}],"220":[0,{"line":93,"col":26,"index":2124},{"line":93,"col":28,"index":2126}],"221":[0,{"line":93,"col":32,"index":2130},{"line":93,"col":34,"index":2132}],"222":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":8,"index":2146}],"223":[0,{"line":94,"col":12,"index":2150},{"line":94,"col":12,"index":2150}],"224":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":12,"index":2150}],"225":[0,{"line":95,"col":4,"index":2157},{"line":95,"col":4,"index":2157}],"226":[0,{"line":96,"col":9,"index":2168},{"line":96,"col":9,"index":2168}],"227":[0,{"line":94,"col":4,"index":2142},{"line":96,"col":30,"index":2168}],"228":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"229":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"230":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":21,"index":2220}],"231":[0,{"line":101,"col":27,"index":2226},{"line":101,"col":30,"index":2229}],"232":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":30,"index":2229}],"233":[0,{"line":101,"col":2,"index":2201},{"line":101,"col":30,"index":2229}],"234":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":20,"index":2251}],"235":[0,{"line":102,"col":25,"index":2256},{"line":102,"col":28,"index":2259}],"236":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":28,"index":2259}],"237":[0,{"line":102,"col":2,"index":2233},{"line":102,"col":28,"index":2259}],"238":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":25,"index":2286}],"239":[0,{"line":103,"col":35,"index":2296},{"line":103,"col":38,"index":2299}],"240":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":38,"index":2299}],"241":[0,{"line":103,"col":2,"index":2263},{"line":103,"col":38,"index":2299}],"242":[0,{"line":104,"col":8,"index":2309},{"line":104,"col":8,"index":2309}],"243":[0,{"line":104,"col":13,"index":2314},{"line":104,"col":13,"index":2314}],"244":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"245":[0,{"line":105,"col":8,"index":2324},{"line":105,"col":8,"index":2324}],"246":[0,{"line":105,"col":15,"index":2331},{"line":105,"col":15,"index":2331}],"247":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":16,"index":2332}],"248":[0,{"line":105,"col":26,"index":2342},{"line":105,"col":26,"index":2342}],"249":[0,{"line":105,"col":22,"index":2338},{"line":105,"col":27,"index":2343}],"250":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":27,"index":2343}],"251":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"252":[0,{"line":106,"col":19,"index":2364},{"line":106,"col":19,"index":2364}],"253":[0,{"line":106,"col":26,"index":2371},{"line":106,"col":26,"index":2371}],"254":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":27,"index":2372}],"255":[0,{"line":106,"col":37,"index":2382},{"line":106,"col":37,"index":2382}],"256":[0,{"line":106,"col":33,"index":2378},{"line":106,"col":38,"index":2383}],"257":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":38,"index":2383}],"258":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"259":[0,{"line":107,"col":18,"index":2403},{"line":107,"col":18,"index":2403}],"260":[0,{"line":107,"col":25,"index":2410},{"line":107,"col":25,"index":2410}],"261":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":26,"index":2411}],"262":[0,{"line":107,"col":35,"index":2420},{"line":107,"col":35,"index":2420}],"263":[0,{"line":107,"col":31,"index":2416},{"line":107,"col":36,"index":2421}],"264":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":36,"index":2421}],"265":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"266":[0,{"line":110,"col":6,"index":2459},{"line":110,"col":10,"index":2463}],"267":[0,{"line":111,"col":6,"index":2472},{"line":111,"col":9,"index":2475}],"268":[0,{"line":112,"col":6,"index":2484},{"line":112,"col":10,"index":2488}],"269":[0,{"line":109,"col":23,"index":2447},{"line":113,"col":68,"index":2492}],"270":[0,{"line":109,"col":2,"index":2426},{"line":113,"col":68,"index":2492}],"271":[0,{"line":116,"col":6,"index":2534},{"line":116,"col":10,"index":2538}],"272":[0,{"line":117,"col":6,"index":2547},{"line":117,"col":9,"index":2550}],"273":[0,{"line":118,"col":6,"index":2559},{"line":118,"col":10,"index":2563}],"274":[0,{"line":115,"col":27,"index":2522},{"line":119,"col":72,"index":2567}],"275":[0,{"line":115,"col":2,"index":2497},{"line":119,"col":72,"index":2567}],"276":[0,{"line":122,"col":6,"index":2603},{"line":122,"col":10,"index":2607}],"277":[0,{"line":123,"col":6,"index":2616},{"line":123,"col":9,"index":2619}],"278":[0,{"line":124,"col":6,"index":2628},{"line":124,"col":10,"index":2632}],"279":[0,{"line":121,"col":22,"index":2592},{"line":125,"col":66,"index":2636}],"280":[0,{"line":121,"col":2,"index":2572},{"line":125,"col":66,"index":2636}],"281":[0,{"line":128,"col":6,"index":2677},{"line":128,"col":10,"index":2681}],"282":[0,{"line":129,"col":6,"index":2690},{"line":129,"col":9,"index":2693}],"283":[0,{"line":130,"col":6,"index":2702},{"line":130,"col":10,"index":2706}],"284":[0,{"line":127,"col":26,"index":2665},{"line":131,"col":71,"index":2710}],"285":[0,{"line":127,"col":2,"index":2641},{"line":131,"col":71,"index":2710}],"286":[0,{"line":133,"col":21,"index":2734},{"line":133,"col":24,"index":2737}],"287":[0,{"line":133,"col":27,"index":2740},{"line":133,"col":27,"index":2740}],"288":[0,{"line":133,"col":34,"index":2747},{"line":133,"col":34,"index":2747}],"289":[0,{"line":133,"col":17,"index":2730},{"line":133,"col":34,"index":2747}],"290":[0,{"line":133,"col":2,"index":2715},{"line":133,"col":34,"index":2747}],"291":[0,{"line":134,"col":16,"index":2765},{"line":134,"col":16,"index":2765}],"292":[0,{"line":134,"col":19,"index":2768},{"line":134,"col":19,"index":2768}],"293":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":28,"index":2777}],"294":[0,{"line":134,"col":32,"index":2781},{"line":134,"col":33,"index":2782}],"295":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":33,"index":2782}],"296":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":36,"index":2785}],"297":[0,{"line":134,"col":40,"index":2789},{"line":134,"col":40,"index":2789}],"298":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":40,"index":2789}],"299":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":47,"index":2796}],"300":[0,{"line":134,"col":51,"index":2800},{"line":134,"col":51,"index":2800}],"301":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":51,"index":2800}],"302":[0,{"line":134,"col":24,"index":2773},{"line":134,"col":51,"index":2800}],"303":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"304":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":12,"index":2841}],"305":[0,{"line":137,"col":17,"index":2846},{"line":137,"col":19,"index":2848}],"306":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":19,"index":2848}],"307":[0,{"line":137,"col":2,"index":2831},{"line":137,"col":19,"index":2848}],"308":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":16,"index":2866}],"309":[0,{"line":138,"col":22,"index":2872},{"line":138,"col":24,"index":2874}],"310":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":25,"index":2875}],"311":[0,{"line":138,"col":2,"index":2852},{"line":138,"col":25,"index":2875}],"312":[0,{"line":141,"col":13,"index":2939},{"line":141,"col":13,"index":2939}],"313":[0,{"line":141,"col":16,"index":2942},{"line":141,"col":16,"index":2942}],"314":[0,{"line":141,"col":21,"index":2947},{"line":141,"col":21,"index":2947}],"315":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"316":[0,{"line":142,"col":31,"index":2980},{"line":142,"col":33,"index":2982}],"317":[0,{"line":142,"col":36,"index":2985},{"line":142,"col":37,"index":2986}],"318":[0,{"line":142,"col":24,"index":2973},{"line":142,"col":38,"index":2987}],"319":[0,{"line":142,"col":2,"index":2951},{"line":142,"col":38,"index":2987}],"320":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":24,"index":3013}],"321":[0,{"line":143,"col":33,"index":3022},{"line":143,"col":34,"index":3023}],"322":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":35,"index":3024}],"323":[0,{"line":143,"col":2,"index":2991},{"line":143,"col":35,"index":3024}],"324":[0,{"line":145,"col":19,"index":3102},{"line":145,"col":19,"index":3102}],"325":[0,{"line":145,"col":22,"index":3105},{"line":145,"col":26,"index":3109}],"326":[0,{"line":145,"col":16,"index":3099},{"line":145,"col":27,"index":3110}],"327":[0,{"line":145,"col":2,"index":3085},{"line":145,"col":27,"index":3110}],"328":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":22,"index":3279}],"329":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":31,"index":3288}],"330":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":36,"index":3293}],"331":[0,{"line":150,"col":40,"index":3297},{"line":150,"col":41,"index":3298}],"332":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":41,"index":3298}],"333":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":41,"index":3298}],"334":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":42,"index":3299}],"335":[0,{"line":150,"col":2,"index":3259},{"line":150,"col":42,"index":3299}],"336":[0,{"line":152,"col":25,"index":3356},{"line":152,"col":25,"index":3356}],"337":[0,{"line":152,"col":28,"index":3359},{"line":152,"col":32,"index":3363}],"338":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":33,"index":3364}],"339":[0,{"line":152,"col":42,"index":3373},{"line":152,"col":42,"index":3373}],"340":[0,{"line":152,"col":45,"index":3376},{"line":152,"col":47,"index":3378}],"341":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":54,"index":3385}],"342":[0,{"line":152,"col":58,"index":3389},{"line":152,"col":60,"index":3391}],"343":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":60,"index":3391}],"344":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"345":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"346":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"347":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"348":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"349":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"350":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"351":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"352":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"353":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"354":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":62,"index":3393}],"355":[0,{"line":152,"col":2,"index":3333},{"line":152,"col":62,"index":3393}],"356":[0,{"line":155,"col":21,"index":3458},{"line":155,"col":21,"index":3458}],"357":[0,{"line":155,"col":15,"index":3452},{"line":155,"col":22,"index":3459}],"358":[0,{"line":155,"col":4,"index":3441},{"line":155,"col":22,"index":3459}],"359":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":6,"index":3477}],"360":[0,{"line":157,"col":10,"index":3481},{"line":157,"col":11,"index":3482}],"361":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":11,"index":3482}],"362":[0,{"line":158,"col":11,"index":3496},{"line":158,"col":11,"index":3496}],"363":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"364":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"365":[0,{"line":156,"col":4,"index":3465},{"line":159,"col":41,"index":3502}],"366":[0,{"line":155,"col":4,"index":3441},{"line":159,"col":65,"index":3502}],"367":[0,{"line":154,"col":2,"index":3414},{"line":160,"col":94,"index":3506}],"368":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":22,"index":3545}],"369":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":31,"index":3554}],"370":[0,{"line":162,"col":36,"index":3559},{"line":162,"col":39,"index":3562}],"371":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":39,"index":3562}],"372":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":40,"index":3563}],"373":[0,{"line":162,"col":2,"index":3525},{"line":162,"col":40,"index":3563}],"374":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":10,"index":3576}],"375":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":18,"index":3584}],"376":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":23,"index":3589}],"377":[0,{"line":164,"col":27,"index":3593},{"line":164,"col":27,"index":3593}],"378":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":27,"index":3593}],"379":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":27,"index":3593}],"380":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":28,"index":3594}],"381":[0,{"line":164,"col":2,"index":3568},{"line":164,"col":28,"index":3594}],"382":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":23,"index":3620}],"383":[0,{"line":166,"col":37,"index":3634},{"line":166,"col":37,"index":3634}],"384":[0,{"line":166,"col":40,"index":3637},{"line":166,"col":40,"index":3637}],"385":[0,{"line":166,"col":33,"index":3630},{"line":166,"col":41,"index":3638}],"386":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":42,"index":3639}],"387":[0,{"line":166,"col":2,"index":3599},{"line":166,"col":42,"index":3639}],"388":[0,{"line":169,"col":17,"index":3698},{"line":169,"col":17,"index":3698}],"389":[0,{"line":169,"col":20,"index":3701},{"line":169,"col":20,"index":3701}],"390":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":21,"index":3702}],"391":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":28,"index":3709}],"392":[0,{"line":169,"col":2,"index":3683},{"line":169,"col":28,"index":3709}],"393":[0,{"line":172,"col":20,"index":3753},{"line":172,"col":20,"index":3753}],"394":[0,{"line":172,"col":23,"index":3756},{"line":172,"col":23,"index":3756}],"395":[0,{"line":172,"col":26,"index":3759},{"line":172,"col":26,"index":3759}],"396":[0,{"line":172,"col":19,"index":3752},{"line":172,"col":27,"index":3760}],"397":[0,{"line":172,"col":2,"index":3735},{"line":172,"col":27,"index":3760}],"398":[0,{"line":173,"col":24,"index":3786},{"line":173,"col":24,"index":3786}],"399":[0,{"line":173,"col":27,"index":3789},{"line":173,"col":27,"index":3789}],"400":[0,{"line":173,"col":30,"index":3792},{"line":173,"col":30,"index":3792}],"401":[0,{"line":173,"col":20,"index":3782},{"line":173,"col":31,"index":3793}],"402":[0,{"line":173,"col":2,"index":3764},{"line":173,"col":31,"index":3793}],"403":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":18,"index":3813}],"404":[0,{"line":174,"col":23,"index":3818},{"line":174,"col":23,"index":3818}],"405":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":23,"index":3818}],"406":[0,{"line":174,"col":2,"index":3797},{"line":174,"col":23,"index":3818}],"407":[0,{"line":175,"col":19,"index":3839},{"line":175,"col":19,"index":3839}],"408":[0,{"line":175,"col":22,"index":3842},{"line":175,"col":22,"index":3842}],"409":[0,{"line":175,"col":25,"index":3845},{"line":175,"col":25,"index":3845}],"410":[0,{"line":175,"col":18,"index":3838},{"line":175,"col":26,"index":3846}],"411":[0,{"line":175,"col":2,"index":3822},{"line":175,"col":26,"index":3846}],"412":[0,{"line":176,"col":24,"index":3872},{"line":176,"col":24,"index":3872}],"413":[0,{"line":176,"col":27,"index":3875},{"line":176,"col":27,"index":3875}],"414":[0,{"line":176,"col":30,"index":3878},{"line":176,"col":30,"index":3878}],"415":[0,{"line":176,"col":19,"index":3867},{"line":176,"col":31,"index":3879}],"416":[0,{"line":176,"col":2,"index":3850},{"line":176,"col":31,"index":3879}],"417":[0,{"line":177,"col":23,"index":3904},{"line":177,"col":23,"index":3904}],"418":[0,{"line":177,"col":26,"index":3907},{"line":177,"col":26,"index":3907}],"419":[0,{"line":177,"col":29,"index":3910},{"line":177,"col":29,"index":3910}],"420":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":30,"index":3911}],"421":[0,{"line":177,"col":32,"index":3913},{"line":177,"col":32,"index":3913}],"422":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":33,"index":3914}],"423":[0,{"line":177,"col":2,"index":3883},{"line":177,"col":33,"index":3914}],"424":[0,{"line":178,"col":28,"index":3944},{"line":178,"col":33,"index":3949}],"425":[0,{"line":178,"col":22,"index":3938},{"line":178,"col":33,"index":3949}],"426":[0,{"line":178,"col":42,"index":3958},{"line":178,"col":45,"index":3961}],"427":[0,{"line":178,"col":36,"index":3952},{"line":178,"col":45,"index":3961}],"428":[0,{"line":178,"col":20,"index":3936},{"line":178,"col":47,"index":3963}],"429":[0,{"line":178,"col":2,"index":3918},{"line":178,"col":47,"index":3963}],"430":[0,{"line":179,"col":25,"index":3990},{"line":179,"col":30,"index":3995}],"431":[0,{"line":179,"col":33,"index":3998},{"line":179,"col":38,"index":4003}],"432":[0,{"line":179,"col":41,"index":4006},{"line":179,"col":46,"index":4011}],"433":[0,{"line":179,"col":49,"index":4014},{"line":179,"col":52,"index":4017}],"434":[0,{"line":179,"col":21,"index":3986},{"line":179,"col":53,"index":4018}],"435":[0,{"line":179,"col":2,"index":3967},{"line":179,"col":53,"index":4018}],"436":[0,{"line":180,"col":29,"index":4049},{"line":180,"col":35,"index":4055}],"437":[0,{"line":180,"col":23,"index":4043},{"line":180,"col":35,"index":4055}],"438":[0,{"line":180,"col":44,"index":4064},{"line":180,"col":47,"index":4067}],"439":[0,{"line":180,"col":38,"index":4058},{"line":180,"col":47,"index":4067}],"440":[0,{"line":180,"col":53,"index":4073},{"line":180,"col":63,"index":4083}],"441":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"442":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"443":[0,{"line":180,"col":2,"index":4022},{"line":180,"col":65,"index":4085}],"444":[0,{"line":181,"col":21,"index":4108},{"line":181,"col":21,"index":4108}],"445":[0,{"line":181,"col":24,"index":4111},{"line":181,"col":24,"index":4111}],"446":[0,{"line":181,"col":27,"index":4114},{"line":181,"col":27,"index":4114}],"447":[0,{"line":181,"col":17,"index":4104},{"line":181,"col":28,"index":4115}],"448":[0,{"line":181,"col":2,"index":4089},{"line":181,"col":28,"index":4115}],"449":[0,{"line":185,"col":22,"index":4187},{"line":185,"col":22,"index":4187}],"450":[0,{"line":185,"col":19,"index":4184},{"line":185,"col":22,"index":4187}],"451":[0,{"line":185,"col":28,"index":4193},{"line":185,"col":32,"index":4197}],"452":[0,{"line":185,"col":25,"index":4190},{"line":185,"col":32,"index":4197}],"453":[0,{"line":185,"col":17,"index":4182},{"line":185,"col":34,"index":4199}],"454":[0,{"line":185,"col":4,"index":4169},{"line":185,"col":34,"index":4199}],"455":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":9,"index":4210}],"456":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"457":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"458":[0,{"line":185,"col":4,"index":4169},{"line":186,"col":47,"index":4212}],"459":[0,{"line":184,"col":2,"index":4149},{"line":186,"col":65,"index":4212}],"460":[0,{"line":189,"col":21,"index":4253},{"line":189,"col":23,"index":4255}],"461":[0,{"line":189,"col":26,"index":4258},{"line":189,"col":26,"index":4258}],"462":[0,{"line":189,"col":17,"index":4249},{"line":189,"col":27,"index":4259}],"463":[0,{"line":189,"col":4,"index":4236},{"line":189,"col":27,"index":4259}],"464":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":9,"index":4270}],"465":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"466":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"467":[0,{"line":189,"col":4,"index":4236},{"line":190,"col":41,"index":4273}],"468":[0,{"line":188,"col":2,"index":4217},{"line":190,"col":58,"index":4273}],"469":[0,{"line":192,"col":14,"index":4290},{"line":192,"col":14,"index":4290}],"470":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":19,"index":4295}],"471":[0,{"line":192,"col":24,"index":4300},{"line":192,"col":25,"index":4301}],"472":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":25,"index":4301}],"473":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"474":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":19,"index":4349}],"475":[0,{"line":195,"col":24,"index":4354},{"line":195,"col":28,"index":4358}],"476":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":29,"index":4359}],"477":[0,{"line":195,"col":2,"index":4332},{"line":195,"col":29,"index":4359}],"478":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":27,"index":4388}],"479":[0,{"line":196,"col":38,"index":4399},{"line":196,"col":42,"index":4403}],"480":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":43,"index":4404}],"481":[0,{"line":196,"col":2,"index":4363},{"line":196,"col":43,"index":4404}],"482":[0,{"line":197,"col":22,"index":4428},{"line":197,"col":22,"index":4428}],"483":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":23,"index":4429}],"484":[0,{"line":197,"col":41,"index":4447},{"line":197,"col":41,"index":4447}],"485":[0,{"line":197,"col":43,"index":4449},{"line":197,"col":43,"index":4449}],"486":[0,{"line":197,"col":45,"index":4451},{"line":197,"col":45,"index":4451}],"487":[0,{"line":197,"col":37,"index":4443},{"line":197,"col":46,"index":4452}],"488":[0,{"line":197,"col":28,"index":4434},{"line":197,"col":47,"index":4453}],"489":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":48,"index":4454}],"490":[0,{"line":197,"col":2,"index":4408},{"line":197,"col":48,"index":4454}],"491":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":20,"index":4501}],"492":[0,{"line":200,"col":24,"index":4505},{"line":200,"col":24,"index":4505}],"493":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":24,"index":4505}],"494":[0,{"line":200,"col":2,"index":4483},{"line":200,"col":24,"index":4505}],"495":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":13,"index":4549}],"496":[0,{"line":202,"col":18,"index":4554},{"line":202,"col":18,"index":4554}],"497":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":18,"index":4554}],"498":[0,{"line":202,"col":2,"index":4538},{"line":202,"col":18,"index":4554}],"499":[0,{"line":205,"col":2,"index":4572},{"line":205,"col":14,"index":4584}],"500":[0,{"line":206,"col":2,"index":4588},{"line":206,"col":12,"index":4598}],"501":[0,{"line":209,"col":21,"index":4636},{"line":209,"col":23,"index":4638}],"502":[0,{"line":209,"col":17,"index":4632},{"line":209,"col":24,"index":4639}],"503":[0,{"line":209,"col":2,"index":4617},{"line":209,"col":24,"index":4639}],"504":[0,{"line":211,"col":2,"index":4644},{"line":211,"col":24,"index":4666}],"505":[0,{"line":213,"col":10,"index":4679},{"line":213,"col":16,"index":4685}],"506":[0,{"line":213,"col":2,"index":4671},{"line":213,"col":16,"index":4685}],"507":[0,{"line":221,"col":19,"index":4906},{"line":221,"col":19,"index":4906}],"508":[0,{"line":221,"col":15,"index":4902},{"line":221,"col":15,"index":4902}],"509":[0,{"line":221,"col":2,"index":4889},{"line":221,"col":29,"index":4916}],"510":[0,{"line":14,"col":0,"index":140},{"line":225,"col":4855,"index":4995}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/SuperSpec.qnt"},"map":{"1":[0,{"line":1,"col":12,"index":24},{"line":1,"col":12,"index":24}],"2":[0,{"line":1,"col":2,"index":14},{"line":1,"col":12,"index":24}],"3":[0,{"line":0,"col":0,"index":0},{"line":2,"col":26,"index":26}],"4":[0,{"line":5,"col":12,"index":53},{"line":5,"col":12,"index":53}],"5":[0,{"line":5,"col":2,"index":43},{"line":5,"col":12,"index":53}],"6":[0,{"line":4,"col":0,"index":29},{"line":6,"col":26,"index":55}],"7":[0,{"line":9,"col":11,"index":84},{"line":9,"col":13,"index":86}],"8":[0,{"line":9,"col":2,"index":75},{"line":9,"col":13,"index":86}],"9":[0,{"line":10,"col":9,"index":97},{"line":10,"col":11,"index":99}],"10":[0,{"line":10,"col":2,"index":90},{"line":10,"col":11,"index":99}],"11":[0,{"line":8,"col":0,"index":58},{"line":11,"col":43,"index":101}],"12":[0,{"line":16,"col":11,"index":186},{"line":16,"col":13,"index":188}],"13":[0,{"line":16,"col":2,"index":177},{"line":16,"col":13,"index":188}],"14":[0,{"line":17,"col":15,"index":205},{"line":17,"col":17,"index":207}],"15":[0,{"line":17,"col":11,"index":201},{"line":17,"col":18,"index":208}],"16":[0,{"line":17,"col":2,"index":192},{"line":17,"col":18,"index":208}],"17":[0,{"line":18,"col":19,"index":229},{"line":18,"col":21,"index":231}],"18":[0,{"line":18,"col":15,"index":225},{"line":18,"col":22,"index":232}],"19":[0,{"line":18,"col":2,"index":212},{"line":18,"col":22,"index":232}],"20":[0,{"line":19,"col":20,"index":254},{"line":19,"col":23,"index":257}],"21":[0,{"line":19,"col":15,"index":249},{"line":19,"col":24,"index":258}],"22":[0,{"line":19,"col":2,"index":236},{"line":19,"col":24,"index":258}],"23":[0,{"line":20,"col":15,"index":275},{"line":20,"col":17,"index":277}],"24":[0,{"line":20,"col":22,"index":282},{"line":20,"col":24,"index":284}],"25":[0,{"line":20,"col":15,"index":275},{"line":20,"col":24,"index":284}],"26":[0,{"line":20,"col":2,"index":262},{"line":20,"col":24,"index":284}],"27":[0,{"line":21,"col":19,"index":305},{"line":21,"col":21,"index":307}],"28":[0,{"line":21,"col":26,"index":312},{"line":21,"col":28,"index":314}],"29":[0,{"line":21,"col":19,"index":305},{"line":21,"col":28,"index":314}],"30":[0,{"line":21,"col":34,"index":320},{"line":21,"col":37,"index":323}],"31":[0,{"line":21,"col":18,"index":304},{"line":21,"col":37,"index":323}],"32":[0,{"line":21,"col":2,"index":288},{"line":21,"col":37,"index":323}],"33":[0,{"line":22,"col":21,"index":346},{"line":22,"col":23,"index":348}],"34":[0,{"line":22,"col":26,"index":351},{"line":22,"col":28,"index":353}],"35":[0,{"line":22,"col":34,"index":359},{"line":22,"col":37,"index":362}],"36":[0,{"line":22,"col":20,"index":345},{"line":22,"col":37,"index":362}],"37":[0,{"line":22,"col":2,"index":327},{"line":22,"col":37,"index":362}],"38":[0,{"line":23,"col":30,"index":394},{"line":23,"col":32,"index":396}],"39":[0,{"line":23,"col":35,"index":399},{"line":23,"col":37,"index":401}],"40":[0,{"line":23,"col":45,"index":409},{"line":23,"col":48,"index":412}],"41":[0,{"line":23,"col":29,"index":393},{"line":23,"col":48,"index":412}],"42":[0,{"line":23,"col":2,"index":366},{"line":23,"col":48,"index":412}],"43":[0,{"line":24,"col":18,"index":432},{"line":24,"col":20,"index":434}],"44":[0,{"line":24,"col":23,"index":437},{"line":24,"col":26,"index":440}],"45":[0,{"line":24,"col":29,"index":443},{"line":24,"col":31,"index":445}],"46":[0,{"line":24,"col":17,"index":431},{"line":24,"col":32,"index":446}],"47":[0,{"line":24,"col":2,"index":416},{"line":24,"col":32,"index":446}],"48":[0,{"line":25,"col":27,"index":475},{"line":25,"col":29,"index":477}],"49":[0,{"line":25,"col":32,"index":480},{"line":25,"col":35,"index":483}],"50":[0,{"line":25,"col":38,"index":486},{"line":25,"col":40,"index":488}],"51":[0,{"line":25,"col":26,"index":474},{"line":25,"col":43,"index":491}],"52":[0,{"line":25,"col":2,"index":450},{"line":25,"col":43,"index":491}],"53":[0,{"line":28,"col":23,"index":580},{"line":28,"col":25,"index":582}],"54":[0,{"line":28,"col":31,"index":588},{"line":28,"col":34,"index":591}],"55":[0,{"line":28,"col":40,"index":597},{"line":28,"col":42,"index":599}],"56":[0,{"line":28,"col":18,"index":575},{"line":28,"col":44,"index":601}],"57":[0,{"line":28,"col":2,"index":559},{"line":28,"col":44,"index":601}],"58":[0,{"line":29,"col":32,"index":635},{"line":29,"col":34,"index":637}],"59":[0,{"line":29,"col":40,"index":643},{"line":29,"col":43,"index":646}],"60":[0,{"line":29,"col":49,"index":652},{"line":29,"col":51,"index":654}],"61":[0,{"line":29,"col":27,"index":630},{"line":29,"col":54,"index":657}],"62":[0,{"line":29,"col":2,"index":605},{"line":29,"col":54,"index":657}],"63":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"64":[0,{"line":34,"col":26,"index":777},{"line":34,"col":28,"index":779}],"65":[0,{"line":34,"col":39,"index":790},{"line":34,"col":41,"index":792}],"66":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"67":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"68":[0,{"line":32,"col":2,"index":712},{"line":35,"col":102,"index":812}],"69":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"70":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"71":[0,{"line":33,"col":8,"index":739},{"line":33,"col":13,"index":744}],"72":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"73":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"74":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"75":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"76":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"77":[0,{"line":34,"col":8,"index":759},{"line":34,"col":16,"index":767}],"78":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"79":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"80":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"81":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"82":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"83":[0,{"line":35,"col":8,"index":805},{"line":35,"col":10,"index":807}],"84":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"85":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"86":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"87":[0,{"line":36,"col":17,"index":831},{"line":36,"col":27,"index":841}],"88":[0,{"line":36,"col":2,"index":816},{"line":36,"col":27,"index":841}],"89":[0,{"line":41,"col":9,"index":955},{"line":41,"col":11,"index":957}],"90":[0,{"line":41,"col":2,"index":948},{"line":41,"col":11,"index":957}],"91":[0,{"line":42,"col":9,"index":968},{"line":42,"col":12,"index":971}],"92":[0,{"line":42,"col":2,"index":961},{"line":42,"col":12,"index":971}],"93":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":19,"index":1140}],"94":[0,{"line":47,"col":23,"index":1144},{"line":47,"col":23,"index":1144}],"95":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":23,"index":1144}],"96":[0,{"line":47,"col":2,"index":1123},{"line":47,"col":23,"index":1144}],"97":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":19,"index":1165}],"98":[0,{"line":48,"col":23,"index":1169},{"line":48,"col":23,"index":1169}],"99":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":23,"index":1169}],"100":[0,{"line":48,"col":2,"index":1148},{"line":48,"col":23,"index":1169}],"101":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":19,"index":1190}],"102":[0,{"line":49,"col":23,"index":1194},{"line":49,"col":23,"index":1194}],"103":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":23,"index":1194}],"104":[0,{"line":49,"col":2,"index":1173},{"line":49,"col":23,"index":1194}],"105":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":19,"index":1215}],"106":[0,{"line":50,"col":23,"index":1219},{"line":50,"col":23,"index":1219}],"107":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":23,"index":1219}],"108":[0,{"line":50,"col":2,"index":1198},{"line":50,"col":23,"index":1219}],"109":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":19,"index":1240}],"110":[0,{"line":51,"col":23,"index":1244},{"line":51,"col":23,"index":1244}],"111":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":23,"index":1244}],"112":[0,{"line":51,"col":2,"index":1223},{"line":51,"col":23,"index":1244}],"113":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":19,"index":1265}],"114":[0,{"line":52,"col":21,"index":1267},{"line":52,"col":21,"index":1267}],"115":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":21,"index":1267}],"116":[0,{"line":52,"col":2,"index":1248},{"line":52,"col":21,"index":1267}],"117":[0,{"line":53,"col":16,"index":1285},{"line":53,"col":18,"index":1287}],"118":[0,{"line":53,"col":15,"index":1284},{"line":53,"col":18,"index":1287}],"119":[0,{"line":53,"col":2,"index":1271},{"line":53,"col":18,"index":1287}],"120":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":18,"index":1307}],"121":[0,{"line":54,"col":22,"index":1311},{"line":54,"col":22,"index":1311}],"122":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":22,"index":1311}],"123":[0,{"line":54,"col":2,"index":1291},{"line":54,"col":22,"index":1311}],"124":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":18,"index":1331}],"125":[0,{"line":55,"col":23,"index":1336},{"line":55,"col":23,"index":1336}],"126":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":23,"index":1336}],"127":[0,{"line":55,"col":2,"index":1315},{"line":55,"col":23,"index":1336}],"128":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":18,"index":1356}],"129":[0,{"line":56,"col":22,"index":1360},{"line":56,"col":22,"index":1360}],"130":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":22,"index":1360}],"131":[0,{"line":56,"col":2,"index":1340},{"line":56,"col":22,"index":1360}],"132":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":18,"index":1380}],"133":[0,{"line":57,"col":23,"index":1385},{"line":57,"col":23,"index":1385}],"134":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":23,"index":1385}],"135":[0,{"line":57,"col":2,"index":1364},{"line":57,"col":23,"index":1385}],"136":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":20,"index":1407}],"137":[0,{"line":58,"col":25,"index":1412},{"line":58,"col":25,"index":1412}],"138":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":25,"index":1412}],"139":[0,{"line":58,"col":2,"index":1389},{"line":58,"col":25,"index":1412}],"140":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":18,"index":1432}],"141":[0,{"line":59,"col":23,"index":1437},{"line":59,"col":23,"index":1437}],"142":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":23,"index":1437}],"143":[0,{"line":59,"col":2,"index":1416},{"line":59,"col":23,"index":1437}],"144":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":6,"index":1464}],"145":[0,{"line":61,"col":10,"index":1468},{"line":61,"col":10,"index":1468}],"146":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":10,"index":1468}],"147":[0,{"line":61,"col":15,"index":1473},{"line":61,"col":15,"index":1473}],"148":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":15,"index":1473}],"149":[0,{"line":60,"col":2,"index":1441},{"line":62,"col":38,"index":1477}],"150":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":25,"index":1504}],"151":[0,{"line":63,"col":30,"index":1509},{"line":63,"col":32,"index":1511}],"152":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":33,"index":1512}],"153":[0,{"line":63,"col":2,"index":1481},{"line":63,"col":33,"index":1512}],"154":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":26,"index":1540}],"155":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":35,"index":1549}],"156":[0,{"line":64,"col":40,"index":1554},{"line":64,"col":40,"index":1554}],"157":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":40,"index":1554}],"158":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":41,"index":1555}],"159":[0,{"line":64,"col":2,"index":1516},{"line":64,"col":41,"index":1555}],"160":[0,{"line":67,"col":20,"index":1594},{"line":67,"col":22,"index":1596}],"161":[0,{"line":67,"col":16,"index":1590},{"line":67,"col":23,"index":1597}],"162":[0,{"line":67,"col":31,"index":1605},{"line":67,"col":31,"index":1605}],"163":[0,{"line":67,"col":34,"index":1608},{"line":67,"col":34,"index":1608}],"164":[0,{"line":67,"col":27,"index":1601},{"line":67,"col":35,"index":1609}],"165":[0,{"line":67,"col":2,"index":1576},{"line":67,"col":35,"index":1609}],"166":[0,{"line":69,"col":2,"index":1648},{"line":69,"col":10,"index":1656}],"167":[0,{"line":70,"col":33,"index":1691},{"line":70,"col":36,"index":1694}],"168":[0,{"line":70,"col":29,"index":1687},{"line":70,"col":37,"index":1695}],"169":[0,{"line":70,"col":41,"index":1699},{"line":70,"col":45,"index":1703}],"170":[0,{"line":70,"col":2,"index":1660},{"line":70,"col":45,"index":1703}],"171":[0,{"line":73,"col":9,"index":1741},{"line":73,"col":11,"index":1743}],"172":[0,{"line":73,"col":2,"index":1734},{"line":73,"col":11,"index":1743}],"173":[0,{"line":74,"col":25,"index":1770},{"line":74,"col":26,"index":1771}],"174":[0,{"line":74,"col":2,"index":1747},{"line":74,"col":26,"index":1771}],"175":[0,{"line":75,"col":15,"index":1788},{"line":75,"col":15,"index":1788}],"176":[0,{"line":75,"col":18,"index":1791},{"line":75,"col":18,"index":1791}],"177":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":23,"index":1796}],"178":[0,{"line":75,"col":27,"index":1800},{"line":75,"col":27,"index":1800}],"179":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":27,"index":1800}],"180":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"181":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"182":[0,{"line":76,"col":10,"index":1812},{"line":76,"col":15,"index":1817}],"183":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":25,"index":1827}],"184":[0,{"line":76,"col":29,"index":1831},{"line":76,"col":29,"index":1831}],"185":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":29,"index":1831}],"186":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"187":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"188":[0,{"line":77,"col":11,"index":1844},{"line":77,"col":11,"index":1844}],"189":[0,{"line":77,"col":21,"index":1854},{"line":77,"col":21,"index":1854}],"190":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"191":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"192":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"193":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"194":[0,{"line":78,"col":13,"index":1869},{"line":78,"col":13,"index":1869}],"195":[0,{"line":78,"col":22,"index":1878},{"line":78,"col":22,"index":1878}],"196":[0,{"line":78,"col":18,"index":1874},{"line":78,"col":23,"index":1879}],"197":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"198":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"199":[0,{"line":81,"col":8,"index":1911},{"line":81,"col":8,"index":1911}],"200":[0,{"line":81,"col":11,"index":1914},{"line":81,"col":11,"index":1914}],"201":[0,{"line":81,"col":16,"index":1919},{"line":81,"col":18,"index":1921}],"202":[0,{"line":81,"col":21,"index":1924},{"line":81,"col":23,"index":1926}],"203":[0,{"line":81,"col":29,"index":1932},{"line":81,"col":31,"index":1934}],"204":[0,{"line":81,"col":15,"index":1918},{"line":81,"col":31,"index":1934}],"205":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":6,"index":1946}],"206":[0,{"line":82,"col":10,"index":1950},{"line":82,"col":10,"index":1950}],"207":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":10,"index":1950}],"208":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"209":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"210":[0,{"line":85,"col":10,"index":1997},{"line":85,"col":10,"index":1997}],"211":[0,{"line":85,"col":15,"index":2002},{"line":85,"col":15,"index":2002}],"212":[0,{"line":85,"col":21,"index":2008},{"line":85,"col":21,"index":2008}],"213":[0,{"line":85,"col":14,"index":2001},{"line":85,"col":21,"index":2008}],"214":[0,{"line":86,"col":6,"index":2020},{"line":86,"col":6,"index":2020}],"215":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"216":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"217":[0,{"line":89,"col":9,"index":2036},{"line":89,"col":11,"index":2038}],"218":[0,{"line":89,"col":2,"index":2029},{"line":89,"col":11,"index":2038}],"219":[0,{"line":90,"col":21,"index":2061},{"line":90,"col":21,"index":2061}],"220":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"221":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"222":[0,{"line":90,"col":2,"index":2042},{"line":90,"col":21,"index":2061}],"223":[0,{"line":93,"col":15,"index":2113},{"line":93,"col":15,"index":2113}],"224":[0,{"line":93,"col":18,"index":2116},{"line":93,"col":20,"index":2118}],"225":[0,{"line":93,"col":23,"index":2121},{"line":93,"col":23,"index":2121}],"226":[0,{"line":93,"col":26,"index":2124},{"line":93,"col":28,"index":2126}],"227":[0,{"line":93,"col":32,"index":2130},{"line":93,"col":34,"index":2132}],"228":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":8,"index":2146}],"229":[0,{"line":94,"col":12,"index":2150},{"line":94,"col":12,"index":2150}],"230":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":12,"index":2150}],"231":[0,{"line":95,"col":4,"index":2157},{"line":95,"col":4,"index":2157}],"232":[0,{"line":96,"col":9,"index":2168},{"line":96,"col":9,"index":2168}],"233":[0,{"line":94,"col":4,"index":2142},{"line":96,"col":30,"index":2168}],"234":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"235":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"236":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"237":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":21,"index":2220}],"238":[0,{"line":101,"col":27,"index":2226},{"line":101,"col":30,"index":2229}],"239":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":30,"index":2229}],"240":[0,{"line":101,"col":2,"index":2201},{"line":101,"col":30,"index":2229}],"241":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":20,"index":2251}],"242":[0,{"line":102,"col":25,"index":2256},{"line":102,"col":28,"index":2259}],"243":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":28,"index":2259}],"244":[0,{"line":102,"col":2,"index":2233},{"line":102,"col":28,"index":2259}],"245":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":25,"index":2286}],"246":[0,{"line":103,"col":35,"index":2296},{"line":103,"col":38,"index":2299}],"247":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":38,"index":2299}],"248":[0,{"line":103,"col":2,"index":2263},{"line":103,"col":38,"index":2299}],"249":[0,{"line":104,"col":8,"index":2309},{"line":104,"col":8,"index":2309}],"250":[0,{"line":104,"col":13,"index":2314},{"line":104,"col":13,"index":2314}],"251":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"252":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"253":[0,{"line":105,"col":8,"index":2324},{"line":105,"col":8,"index":2324}],"254":[0,{"line":105,"col":15,"index":2331},{"line":105,"col":15,"index":2331}],"255":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":16,"index":2332}],"256":[0,{"line":105,"col":26,"index":2342},{"line":105,"col":26,"index":2342}],"257":[0,{"line":105,"col":22,"index":2338},{"line":105,"col":27,"index":2343}],"258":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":27,"index":2343}],"259":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"260":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"261":[0,{"line":106,"col":19,"index":2364},{"line":106,"col":19,"index":2364}],"262":[0,{"line":106,"col":26,"index":2371},{"line":106,"col":26,"index":2371}],"263":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":27,"index":2372}],"264":[0,{"line":106,"col":37,"index":2382},{"line":106,"col":37,"index":2382}],"265":[0,{"line":106,"col":33,"index":2378},{"line":106,"col":38,"index":2383}],"266":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":38,"index":2383}],"267":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"268":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"269":[0,{"line":107,"col":18,"index":2403},{"line":107,"col":18,"index":2403}],"270":[0,{"line":107,"col":25,"index":2410},{"line":107,"col":25,"index":2410}],"271":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":26,"index":2411}],"272":[0,{"line":107,"col":35,"index":2420},{"line":107,"col":35,"index":2420}],"273":[0,{"line":107,"col":31,"index":2416},{"line":107,"col":36,"index":2421}],"274":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":36,"index":2421}],"275":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"276":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"277":[0,{"line":110,"col":6,"index":2459},{"line":110,"col":10,"index":2463}],"278":[0,{"line":111,"col":6,"index":2472},{"line":111,"col":9,"index":2475}],"279":[0,{"line":112,"col":6,"index":2484},{"line":112,"col":10,"index":2488}],"280":[0,{"line":109,"col":23,"index":2447},{"line":113,"col":68,"index":2492}],"281":[0,{"line":109,"col":2,"index":2426},{"line":113,"col":68,"index":2492}],"282":[0,{"line":116,"col":6,"index":2534},{"line":116,"col":10,"index":2538}],"283":[0,{"line":117,"col":6,"index":2547},{"line":117,"col":9,"index":2550}],"284":[0,{"line":118,"col":6,"index":2559},{"line":118,"col":10,"index":2563}],"285":[0,{"line":115,"col":27,"index":2522},{"line":119,"col":72,"index":2567}],"286":[0,{"line":115,"col":2,"index":2497},{"line":119,"col":72,"index":2567}],"287":[0,{"line":122,"col":6,"index":2603},{"line":122,"col":10,"index":2607}],"288":[0,{"line":123,"col":6,"index":2616},{"line":123,"col":9,"index":2619}],"289":[0,{"line":124,"col":6,"index":2628},{"line":124,"col":10,"index":2632}],"290":[0,{"line":121,"col":22,"index":2592},{"line":125,"col":66,"index":2636}],"291":[0,{"line":121,"col":2,"index":2572},{"line":125,"col":66,"index":2636}],"292":[0,{"line":128,"col":6,"index":2677},{"line":128,"col":10,"index":2681}],"293":[0,{"line":129,"col":6,"index":2690},{"line":129,"col":9,"index":2693}],"294":[0,{"line":130,"col":6,"index":2702},{"line":130,"col":10,"index":2706}],"295":[0,{"line":127,"col":26,"index":2665},{"line":131,"col":71,"index":2710}],"296":[0,{"line":127,"col":2,"index":2641},{"line":131,"col":71,"index":2710}],"297":[0,{"line":133,"col":21,"index":2734},{"line":133,"col":24,"index":2737}],"298":[0,{"line":133,"col":27,"index":2740},{"line":133,"col":27,"index":2740}],"299":[0,{"line":133,"col":34,"index":2747},{"line":133,"col":34,"index":2747}],"300":[0,{"line":133,"col":17,"index":2730},{"line":133,"col":34,"index":2747}],"301":[0,{"line":133,"col":2,"index":2715},{"line":133,"col":34,"index":2747}],"302":[0,{"line":134,"col":16,"index":2765},{"line":134,"col":16,"index":2765}],"303":[0,{"line":134,"col":19,"index":2768},{"line":134,"col":19,"index":2768}],"304":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":28,"index":2777}],"305":[0,{"line":134,"col":32,"index":2781},{"line":134,"col":33,"index":2782}],"306":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":33,"index":2782}],"307":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":36,"index":2785}],"308":[0,{"line":134,"col":40,"index":2789},{"line":134,"col":40,"index":2789}],"309":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":40,"index":2789}],"310":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":47,"index":2796}],"311":[0,{"line":134,"col":51,"index":2800},{"line":134,"col":51,"index":2800}],"312":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":51,"index":2800}],"313":[0,{"line":134,"col":24,"index":2773},{"line":134,"col":51,"index":2800}],"314":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"315":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"316":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":12,"index":2841}],"317":[0,{"line":137,"col":17,"index":2846},{"line":137,"col":19,"index":2848}],"318":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":19,"index":2848}],"319":[0,{"line":137,"col":2,"index":2831},{"line":137,"col":19,"index":2848}],"320":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":16,"index":2866}],"321":[0,{"line":138,"col":22,"index":2872},{"line":138,"col":24,"index":2874}],"322":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":25,"index":2875}],"323":[0,{"line":138,"col":2,"index":2852},{"line":138,"col":25,"index":2875}],"324":[0,{"line":141,"col":13,"index":2939},{"line":141,"col":13,"index":2939}],"325":[0,{"line":141,"col":16,"index":2942},{"line":141,"col":16,"index":2942}],"326":[0,{"line":141,"col":21,"index":2947},{"line":141,"col":21,"index":2947}],"327":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"328":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"329":[0,{"line":142,"col":31,"index":2980},{"line":142,"col":33,"index":2982}],"330":[0,{"line":142,"col":36,"index":2985},{"line":142,"col":37,"index":2986}],"331":[0,{"line":142,"col":24,"index":2973},{"line":142,"col":38,"index":2987}],"332":[0,{"line":142,"col":2,"index":2951},{"line":142,"col":38,"index":2987}],"333":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":24,"index":3013}],"334":[0,{"line":143,"col":33,"index":3022},{"line":143,"col":34,"index":3023}],"335":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":35,"index":3024}],"336":[0,{"line":143,"col":2,"index":2991},{"line":143,"col":35,"index":3024}],"337":[0,{"line":145,"col":19,"index":3102},{"line":145,"col":19,"index":3102}],"338":[0,{"line":145,"col":22,"index":3105},{"line":145,"col":26,"index":3109}],"339":[0,{"line":145,"col":16,"index":3099},{"line":145,"col":27,"index":3110}],"340":[0,{"line":145,"col":2,"index":3085},{"line":145,"col":27,"index":3110}],"341":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":22,"index":3279}],"342":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":31,"index":3288}],"343":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":36,"index":3293}],"344":[0,{"line":150,"col":40,"index":3297},{"line":150,"col":41,"index":3298}],"345":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":41,"index":3298}],"346":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":41,"index":3298}],"347":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":42,"index":3299}],"348":[0,{"line":150,"col":2,"index":3259},{"line":150,"col":42,"index":3299}],"349":[0,{"line":152,"col":25,"index":3356},{"line":152,"col":25,"index":3356}],"350":[0,{"line":152,"col":28,"index":3359},{"line":152,"col":32,"index":3363}],"351":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":33,"index":3364}],"352":[0,{"line":152,"col":42,"index":3373},{"line":152,"col":42,"index":3373}],"353":[0,{"line":152,"col":45,"index":3376},{"line":152,"col":47,"index":3378}],"354":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":54,"index":3385}],"355":[0,{"line":152,"col":58,"index":3389},{"line":152,"col":60,"index":3391}],"356":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":60,"index":3391}],"357":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"358":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"359":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"360":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"361":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"362":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"363":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"364":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"365":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"366":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"367":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":62,"index":3393}],"368":[0,{"line":152,"col":2,"index":3333},{"line":152,"col":62,"index":3393}],"369":[0,{"line":155,"col":21,"index":3458},{"line":155,"col":21,"index":3458}],"370":[0,{"line":155,"col":15,"index":3452},{"line":155,"col":22,"index":3459}],"371":[0,{"line":155,"col":4,"index":3441},{"line":155,"col":22,"index":3459}],"372":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":6,"index":3477}],"373":[0,{"line":157,"col":10,"index":3481},{"line":157,"col":11,"index":3482}],"374":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":11,"index":3482}],"375":[0,{"line":158,"col":11,"index":3496},{"line":158,"col":11,"index":3496}],"376":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"377":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"378":[0,{"line":156,"col":4,"index":3465},{"line":159,"col":41,"index":3502}],"379":[0,{"line":155,"col":4,"index":3441},{"line":159,"col":65,"index":3502}],"380":[0,{"line":154,"col":2,"index":3414},{"line":160,"col":94,"index":3506}],"381":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":22,"index":3545}],"382":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":31,"index":3554}],"383":[0,{"line":162,"col":36,"index":3559},{"line":162,"col":39,"index":3562}],"384":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":39,"index":3562}],"385":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":40,"index":3563}],"386":[0,{"line":162,"col":2,"index":3525},{"line":162,"col":40,"index":3563}],"387":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":10,"index":3576}],"388":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":18,"index":3584}],"389":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":23,"index":3589}],"390":[0,{"line":164,"col":27,"index":3593},{"line":164,"col":27,"index":3593}],"391":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":27,"index":3593}],"392":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":27,"index":3593}],"393":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":28,"index":3594}],"394":[0,{"line":164,"col":2,"index":3568},{"line":164,"col":28,"index":3594}],"395":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":23,"index":3620}],"396":[0,{"line":166,"col":37,"index":3634},{"line":166,"col":37,"index":3634}],"397":[0,{"line":166,"col":40,"index":3637},{"line":166,"col":40,"index":3637}],"398":[0,{"line":166,"col":33,"index":3630},{"line":166,"col":41,"index":3638}],"399":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":42,"index":3639}],"400":[0,{"line":166,"col":2,"index":3599},{"line":166,"col":42,"index":3639}],"401":[0,{"line":169,"col":17,"index":3698},{"line":169,"col":17,"index":3698}],"402":[0,{"line":169,"col":20,"index":3701},{"line":169,"col":20,"index":3701}],"403":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":21,"index":3702}],"404":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":28,"index":3709}],"405":[0,{"line":169,"col":2,"index":3683},{"line":169,"col":28,"index":3709}],"406":[0,{"line":172,"col":20,"index":3753},{"line":172,"col":20,"index":3753}],"407":[0,{"line":172,"col":23,"index":3756},{"line":172,"col":23,"index":3756}],"408":[0,{"line":172,"col":26,"index":3759},{"line":172,"col":26,"index":3759}],"409":[0,{"line":172,"col":19,"index":3752},{"line":172,"col":27,"index":3760}],"410":[0,{"line":172,"col":2,"index":3735},{"line":172,"col":27,"index":3760}],"411":[0,{"line":173,"col":24,"index":3786},{"line":173,"col":24,"index":3786}],"412":[0,{"line":173,"col":27,"index":3789},{"line":173,"col":27,"index":3789}],"413":[0,{"line":173,"col":30,"index":3792},{"line":173,"col":30,"index":3792}],"414":[0,{"line":173,"col":20,"index":3782},{"line":173,"col":31,"index":3793}],"415":[0,{"line":173,"col":2,"index":3764},{"line":173,"col":31,"index":3793}],"416":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":18,"index":3813}],"417":[0,{"line":174,"col":23,"index":3818},{"line":174,"col":23,"index":3818}],"418":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":23,"index":3818}],"419":[0,{"line":174,"col":2,"index":3797},{"line":174,"col":23,"index":3818}],"420":[0,{"line":175,"col":19,"index":3839},{"line":175,"col":19,"index":3839}],"421":[0,{"line":175,"col":22,"index":3842},{"line":175,"col":22,"index":3842}],"422":[0,{"line":175,"col":25,"index":3845},{"line":175,"col":25,"index":3845}],"423":[0,{"line":175,"col":18,"index":3838},{"line":175,"col":26,"index":3846}],"424":[0,{"line":175,"col":2,"index":3822},{"line":175,"col":26,"index":3846}],"425":[0,{"line":176,"col":24,"index":3872},{"line":176,"col":24,"index":3872}],"426":[0,{"line":176,"col":27,"index":3875},{"line":176,"col":27,"index":3875}],"427":[0,{"line":176,"col":30,"index":3878},{"line":176,"col":30,"index":3878}],"428":[0,{"line":176,"col":19,"index":3867},{"line":176,"col":31,"index":3879}],"429":[0,{"line":176,"col":2,"index":3850},{"line":176,"col":31,"index":3879}],"430":[0,{"line":177,"col":23,"index":3904},{"line":177,"col":23,"index":3904}],"431":[0,{"line":177,"col":26,"index":3907},{"line":177,"col":26,"index":3907}],"432":[0,{"line":177,"col":29,"index":3910},{"line":177,"col":29,"index":3910}],"433":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":30,"index":3911}],"434":[0,{"line":177,"col":32,"index":3913},{"line":177,"col":32,"index":3913}],"435":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":33,"index":3914}],"436":[0,{"line":177,"col":2,"index":3883},{"line":177,"col":33,"index":3914}],"437":[0,{"line":178,"col":28,"index":3944},{"line":178,"col":33,"index":3949}],"438":[0,{"line":178,"col":22,"index":3938},{"line":178,"col":33,"index":3949}],"439":[0,{"line":178,"col":42,"index":3958},{"line":178,"col":45,"index":3961}],"440":[0,{"line":178,"col":36,"index":3952},{"line":178,"col":45,"index":3961}],"441":[0,{"line":178,"col":20,"index":3936},{"line":178,"col":47,"index":3963}],"442":[0,{"line":178,"col":2,"index":3918},{"line":178,"col":47,"index":3963}],"443":[0,{"line":179,"col":25,"index":3990},{"line":179,"col":30,"index":3995}],"444":[0,{"line":179,"col":33,"index":3998},{"line":179,"col":38,"index":4003}],"445":[0,{"line":179,"col":41,"index":4006},{"line":179,"col":46,"index":4011}],"446":[0,{"line":179,"col":49,"index":4014},{"line":179,"col":52,"index":4017}],"447":[0,{"line":179,"col":21,"index":3986},{"line":179,"col":53,"index":4018}],"448":[0,{"line":179,"col":2,"index":3967},{"line":179,"col":53,"index":4018}],"449":[0,{"line":180,"col":29,"index":4049},{"line":180,"col":35,"index":4055}],"450":[0,{"line":180,"col":23,"index":4043},{"line":180,"col":35,"index":4055}],"451":[0,{"line":180,"col":44,"index":4064},{"line":180,"col":47,"index":4067}],"452":[0,{"line":180,"col":38,"index":4058},{"line":180,"col":47,"index":4067}],"453":[0,{"line":180,"col":53,"index":4073},{"line":180,"col":63,"index":4083}],"454":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"455":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"456":[0,{"line":180,"col":2,"index":4022},{"line":180,"col":65,"index":4085}],"457":[0,{"line":181,"col":21,"index":4108},{"line":181,"col":21,"index":4108}],"458":[0,{"line":181,"col":24,"index":4111},{"line":181,"col":24,"index":4111}],"459":[0,{"line":181,"col":27,"index":4114},{"line":181,"col":27,"index":4114}],"460":[0,{"line":181,"col":17,"index":4104},{"line":181,"col":28,"index":4115}],"461":[0,{"line":181,"col":2,"index":4089},{"line":181,"col":28,"index":4115}],"462":[0,{"line":185,"col":22,"index":4187},{"line":185,"col":22,"index":4187}],"463":[0,{"line":185,"col":19,"index":4184},{"line":185,"col":22,"index":4187}],"464":[0,{"line":185,"col":28,"index":4193},{"line":185,"col":32,"index":4197}],"465":[0,{"line":185,"col":25,"index":4190},{"line":185,"col":32,"index":4197}],"466":[0,{"line":185,"col":17,"index":4182},{"line":185,"col":34,"index":4199}],"467":[0,{"line":185,"col":4,"index":4169},{"line":185,"col":34,"index":4199}],"468":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":9,"index":4210}],"469":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"470":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"471":[0,{"line":185,"col":4,"index":4169},{"line":186,"col":47,"index":4212}],"472":[0,{"line":184,"col":2,"index":4149},{"line":186,"col":65,"index":4212}],"473":[0,{"line":189,"col":21,"index":4253},{"line":189,"col":23,"index":4255}],"474":[0,{"line":189,"col":26,"index":4258},{"line":189,"col":26,"index":4258}],"475":[0,{"line":189,"col":17,"index":4249},{"line":189,"col":27,"index":4259}],"476":[0,{"line":189,"col":4,"index":4236},{"line":189,"col":27,"index":4259}],"477":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":9,"index":4270}],"478":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"479":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"480":[0,{"line":189,"col":4,"index":4236},{"line":190,"col":41,"index":4273}],"481":[0,{"line":188,"col":2,"index":4217},{"line":190,"col":58,"index":4273}],"482":[0,{"line":192,"col":14,"index":4290},{"line":192,"col":14,"index":4290}],"483":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":19,"index":4295}],"484":[0,{"line":192,"col":24,"index":4300},{"line":192,"col":25,"index":4301}],"485":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":25,"index":4301}],"486":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"487":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"488":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":19,"index":4349}],"489":[0,{"line":195,"col":24,"index":4354},{"line":195,"col":28,"index":4358}],"490":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":29,"index":4359}],"491":[0,{"line":195,"col":2,"index":4332},{"line":195,"col":29,"index":4359}],"492":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":27,"index":4388}],"493":[0,{"line":196,"col":38,"index":4399},{"line":196,"col":42,"index":4403}],"494":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":43,"index":4404}],"495":[0,{"line":196,"col":2,"index":4363},{"line":196,"col":43,"index":4404}],"496":[0,{"line":197,"col":22,"index":4428},{"line":197,"col":22,"index":4428}],"497":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":23,"index":4429}],"498":[0,{"line":197,"col":41,"index":4447},{"line":197,"col":41,"index":4447}],"499":[0,{"line":197,"col":43,"index":4449},{"line":197,"col":43,"index":4449}],"500":[0,{"line":197,"col":45,"index":4451},{"line":197,"col":45,"index":4451}],"501":[0,{"line":197,"col":37,"index":4443},{"line":197,"col":46,"index":4452}],"502":[0,{"line":197,"col":28,"index":4434},{"line":197,"col":47,"index":4453}],"503":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":48,"index":4454}],"504":[0,{"line":197,"col":2,"index":4408},{"line":197,"col":48,"index":4454}],"505":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":20,"index":4501}],"506":[0,{"line":200,"col":24,"index":4505},{"line":200,"col":24,"index":4505}],"507":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":24,"index":4505}],"508":[0,{"line":200,"col":2,"index":4483},{"line":200,"col":24,"index":4505}],"509":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":13,"index":4549}],"510":[0,{"line":202,"col":18,"index":4554},{"line":202,"col":18,"index":4554}],"511":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":18,"index":4554}],"512":[0,{"line":202,"col":2,"index":4538},{"line":202,"col":18,"index":4554}],"513":[0,{"line":205,"col":2,"index":4572},{"line":205,"col":14,"index":4584}],"514":[0,{"line":206,"col":2,"index":4588},{"line":206,"col":12,"index":4598}],"515":[0,{"line":209,"col":21,"index":4636},{"line":209,"col":23,"index":4638}],"516":[0,{"line":209,"col":17,"index":4632},{"line":209,"col":24,"index":4639}],"517":[0,{"line":209,"col":2,"index":4617},{"line":209,"col":24,"index":4639}],"518":[0,{"line":211,"col":2,"index":4644},{"line":211,"col":24,"index":4666}],"519":[0,{"line":213,"col":10,"index":4679},{"line":213,"col":16,"index":4685}],"520":[0,{"line":213,"col":2,"index":4671},{"line":213,"col":16,"index":4685}],"521":[0,{"line":221,"col":19,"index":4906},{"line":221,"col":19,"index":4906}],"522":[0,{"line":221,"col":15,"index":4902},{"line":221,"col":15,"index":4902}],"523":[0,{"line":221,"col":2,"index":4889},{"line":221,"col":29,"index":4916}],"524":[0,{"line":14,"col":0,"index":140},{"line":225,"col":4855,"index":4995}]}} \ No newline at end of file diff --git a/quint/testFixture/_0099unorderedDefs.json b/quint/testFixture/_0099unorderedDefs.json index 790ad267c..3cc68b30f 100644 --- a/quint/testFixture/_0099unorderedDefs.json +++ b/quint/testFixture/_0099unorderedDefs.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":12,"name":"unorderedDefs","declarations":[{"id":11,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":11,"kind":"lambda","params":[{"id":6,"name":"x"},{"id":7,"name":"y"}],"qualifier":"puredef","expr":{"id":10,"kind":"app","opcode":"iadd","args":[{"id":8,"kind":"name","name":"x"},{"id":9,"kind":"name","name":"y"}]}}},{"id":5,"kind":"def","name":"double","qualifier":"puredef","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":4,"kind":"app","opcode":"plus","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"name","name":"x"}]}}}]}],"table":{"2":{"id":1,"name":"x","kind":"param"},"3":{"id":1,"name":"x","kind":"param"},"4":{"id":11,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":11,"kind":"lambda","params":[{"id":6,"name":"x"},{"id":7,"name":"y"}],"qualifier":"puredef","expr":{"id":10,"kind":"app","opcode":"iadd","args":[{"id":8,"kind":"name","name":"x"},{"id":9,"kind":"name","name":"y"}]}},"depth":0},"8":{"id":6,"name":"x","kind":"param"},"9":{"id":7,"name":"y","kind":"param"}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":14,"name":"unorderedDefs","declarations":[{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}}},{"id":6,"kind":"def","name":"double","qualifier":"puredef","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":4,"kind":"app","opcode":"plus","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"name","name":"x"}]}}}]}],"table":{"2":{"id":1,"name":"x","kind":"param"},"3":{"id":1,"name":"x","kind":"param"},"4":{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}},"depth":0},"9":{"id":7,"name":"x","kind":"param"},"10":{"id":8,"name":"y","kind":"param"}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_0099unorderedDefs.map.json b/quint/testFixture/_0099unorderedDefs.map.json index 720b088e1..fb24899a8 100644 --- a/quint/testFixture/_0099unorderedDefs.map.json +++ b/quint/testFixture/_0099unorderedDefs.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_0099unorderedDefs.qnt"},"map":{"1":[0,{"line":2,"col":18,"index":93},{"line":2,"col":18,"index":93}],"2":[0,{"line":2,"col":28,"index":103},{"line":2,"col":28,"index":103}],"3":[0,{"line":2,"col":31,"index":106},{"line":2,"col":31,"index":106}],"4":[0,{"line":2,"col":23,"index":98},{"line":2,"col":32,"index":107}],"5":[0,{"line":2,"col":2,"index":77},{"line":2,"col":32,"index":107}],"6":[0,{"line":3,"col":16,"index":125},{"line":3,"col":16,"index":125}],"7":[0,{"line":3,"col":19,"index":128},{"line":3,"col":19,"index":128}],"8":[0,{"line":3,"col":24,"index":133},{"line":3,"col":24,"index":133}],"9":[0,{"line":3,"col":28,"index":137},{"line":3,"col":28,"index":137}],"10":[0,{"line":3,"col":24,"index":133},{"line":3,"col":28,"index":137}],"11":[0,{"line":3,"col":2,"index":111},{"line":3,"col":28,"index":137}],"12":[0,{"line":1,"col":0,"index":52},{"line":4,"col":87,"index":139}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_0099unorderedDefs.qnt"},"map":{"1":[0,{"line":2,"col":18,"index":93},{"line":2,"col":18,"index":93}],"2":[0,{"line":2,"col":28,"index":103},{"line":2,"col":28,"index":103}],"3":[0,{"line":2,"col":31,"index":106},{"line":2,"col":31,"index":106}],"4":[0,{"line":2,"col":23,"index":98},{"line":2,"col":32,"index":107}],"5":[0,{"line":2,"col":2,"index":77},{"line":2,"col":32,"index":107}],"6":[0,{"line":2,"col":2,"index":77},{"line":2,"col":32,"index":107}],"7":[0,{"line":3,"col":16,"index":125},{"line":3,"col":16,"index":125}],"8":[0,{"line":3,"col":19,"index":128},{"line":3,"col":19,"index":128}],"9":[0,{"line":3,"col":24,"index":133},{"line":3,"col":24,"index":133}],"10":[0,{"line":3,"col":28,"index":137},{"line":3,"col":28,"index":137}],"11":[0,{"line":3,"col":24,"index":133},{"line":3,"col":28,"index":137}],"12":[0,{"line":3,"col":2,"index":111},{"line":3,"col":28,"index":137}],"13":[0,{"line":3,"col":2,"index":111},{"line":3,"col":28,"index":137}],"14":[0,{"line":1,"col":0,"index":52},{"line":4,"col":87,"index":139}]}} \ No newline at end of file diff --git a/quint/testFixture/_0100cyclicDefs.json b/quint/testFixture/_0100cyclicDefs.json index e6c7b5d67..16815402e 100644 --- a/quint/testFixture/_0100cyclicDefs.json +++ b/quint/testFixture/_0100cyclicDefs.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":13,"name":"cyclicDefs","declarations":[]}],"table":{"2":{"id":1,"name":"x","kind":"param"},"3":{"id":8,"kind":"def","name":"bar","qualifier":"puredef","expr":{"id":8,"kind":"lambda","params":[{"id":5,"name":"x"}],"qualifier":"puredef","expr":{"id":7,"kind":"app","opcode":"baz","args":[{"id":6,"kind":"name","name":"x"}]}},"depth":0},"6":{"id":5,"name":"x","kind":"param"},"7":{"id":12,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":9,"name":"x"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"foo","args":[{"id":10,"kind":"name","name":"x"}]}},"depth":0},"10":{"id":9,"name":"x","kind":"param"},"11":{"id":4,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":4,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":3,"kind":"app","opcode":"bar","args":[{"id":2,"kind":"name","name":"x"}]}},"depth":0}},"errors":[{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":2,"col":2,"index":70},"end":{"line":2,"col":25,"index":93}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":3,"col":2,"index":97},"end":{"line":3,"col":25,"index":120}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":4,"col":2,"index":124},"end":{"line":4,"col":25,"index":147}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":16,"name":"cyclicDefs","declarations":[]}],"table":{"2":{"id":1,"name":"x","kind":"param"},"3":{"id":10,"kind":"def","name":"bar","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"baz","args":[{"id":7,"kind":"name","name":"x"}]}},"depth":0},"7":{"id":6,"name":"x","kind":"param"},"8":{"id":15,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"x"}],"qualifier":"puredef","expr":{"id":13,"kind":"app","opcode":"foo","args":[{"id":12,"kind":"name","name":"x"}]}},"depth":0},"12":{"id":11,"name":"x","kind":"param"},"13":{"id":5,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":4,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":3,"kind":"app","opcode":"bar","args":[{"id":2,"kind":"name","name":"x"}]}},"depth":0}},"errors":[{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":2,"col":2,"index":70},"end":{"line":2,"col":25,"index":93}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":3,"col":2,"index":97},"end":{"line":3,"col":25,"index":120}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":4,"col":2,"index":124},"end":{"line":4,"col":25,"index":147}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_0100cyclicDefs.map.json b/quint/testFixture/_0100cyclicDefs.map.json index 2e7b86aac..1c3c97576 100644 --- a/quint/testFixture/_0100cyclicDefs.map.json +++ b/quint/testFixture/_0100cyclicDefs.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_0100cyclicDefs.qnt"},"map":{"1":[0,{"line":2,"col":15,"index":83},{"line":2,"col":15,"index":83}],"2":[0,{"line":2,"col":24,"index":92},{"line":2,"col":24,"index":92}],"3":[0,{"line":2,"col":20,"index":88},{"line":2,"col":25,"index":93}],"4":[0,{"line":2,"col":2,"index":70},{"line":2,"col":25,"index":93}],"5":[0,{"line":3,"col":15,"index":110},{"line":3,"col":15,"index":110}],"6":[0,{"line":3,"col":24,"index":119},{"line":3,"col":24,"index":119}],"7":[0,{"line":3,"col":20,"index":115},{"line":3,"col":25,"index":120}],"8":[0,{"line":3,"col":2,"index":97},{"line":3,"col":25,"index":120}],"9":[0,{"line":4,"col":15,"index":137},{"line":4,"col":15,"index":137}],"10":[0,{"line":4,"col":24,"index":146},{"line":4,"col":24,"index":146}],"11":[0,{"line":4,"col":20,"index":142},{"line":4,"col":25,"index":147}],"12":[0,{"line":4,"col":2,"index":124},{"line":4,"col":25,"index":147}],"13":[0,{"line":1,"col":0,"index":48},{"line":5,"col":101,"index":149}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_0100cyclicDefs.qnt"},"map":{"1":[0,{"line":2,"col":15,"index":83},{"line":2,"col":15,"index":83}],"2":[0,{"line":2,"col":24,"index":92},{"line":2,"col":24,"index":92}],"3":[0,{"line":2,"col":20,"index":88},{"line":2,"col":25,"index":93}],"4":[0,{"line":2,"col":2,"index":70},{"line":2,"col":25,"index":93}],"5":[0,{"line":2,"col":2,"index":70},{"line":2,"col":25,"index":93}],"6":[0,{"line":3,"col":15,"index":110},{"line":3,"col":15,"index":110}],"7":[0,{"line":3,"col":24,"index":119},{"line":3,"col":24,"index":119}],"8":[0,{"line":3,"col":20,"index":115},{"line":3,"col":25,"index":120}],"9":[0,{"line":3,"col":2,"index":97},{"line":3,"col":25,"index":120}],"10":[0,{"line":3,"col":2,"index":97},{"line":3,"col":25,"index":120}],"11":[0,{"line":4,"col":15,"index":137},{"line":4,"col":15,"index":137}],"12":[0,{"line":4,"col":24,"index":146},{"line":4,"col":24,"index":146}],"13":[0,{"line":4,"col":20,"index":142},{"line":4,"col":25,"index":147}],"14":[0,{"line":4,"col":2,"index":124},{"line":4,"col":25,"index":147}],"15":[0,{"line":4,"col":2,"index":124},{"line":4,"col":25,"index":147}],"16":[0,{"line":1,"col":0,"index":48},{"line":5,"col":101,"index":149}]}} \ No newline at end of file diff --git a/quint/testFixture/_0101noRecursion.json b/quint/testFixture/_0101noRecursion.json index 708652a10..cc35ab29e 100644 --- a/quint/testFixture/_0101noRecursion.json +++ b/quint/testFixture/_0101noRecursion.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":7,"name":"noRecursion","declarations":[]}],"table":{"2":{"id":1,"name":"x","kind":"param"},"5":{"id":6,"kind":"def","name":"blackhole","qualifier":"puredef","expr":{"id":6,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"blackhole","args":[{"id":4,"kind":"app","opcode":"iadd","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"int","value":1}]}]}},"depth":0}},"errors":[{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0101noRecursion.qnt","start":{"line":3,"col":2,"index":131},"end":{"line":3,"col":41,"index":170}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":8,"name":"noRecursion","declarations":[]}],"table":{"2":{"id":1,"name":"x","kind":"param"},"5":{"id":7,"kind":"def","name":"blackhole","qualifier":"puredef","expr":{"id":6,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"blackhole","args":[{"id":4,"kind":"app","opcode":"iadd","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"int","value":1}]}]}},"depth":0}},"errors":[{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0101noRecursion.qnt","start":{"line":3,"col":2,"index":131},"end":{"line":3,"col":41,"index":170}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_0101noRecursion.map.json b/quint/testFixture/_0101noRecursion.map.json index 0b3104b5e..202f9fe24 100644 --- a/quint/testFixture/_0101noRecursion.map.json +++ b/quint/testFixture/_0101noRecursion.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_0101noRecursion.qnt"},"map":{"1":[0,{"line":3,"col":21,"index":150},{"line":3,"col":21,"index":150}],"2":[0,{"line":3,"col":36,"index":165},{"line":3,"col":36,"index":165}],"3":[0,{"line":3,"col":40,"index":169},{"line":3,"col":40,"index":169}],"4":[0,{"line":3,"col":36,"index":165},{"line":3,"col":40,"index":169}],"5":[0,{"line":3,"col":26,"index":155},{"line":3,"col":41,"index":170}],"6":[0,{"line":3,"col":2,"index":131},{"line":3,"col":41,"index":170}],"7":[0,{"line":1,"col":0,"index":56},{"line":4,"col":116,"index":172}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_0101noRecursion.qnt"},"map":{"1":[0,{"line":3,"col":21,"index":150},{"line":3,"col":21,"index":150}],"2":[0,{"line":3,"col":36,"index":165},{"line":3,"col":36,"index":165}],"3":[0,{"line":3,"col":40,"index":169},{"line":3,"col":40,"index":169}],"4":[0,{"line":3,"col":36,"index":165},{"line":3,"col":40,"index":169}],"5":[0,{"line":3,"col":26,"index":155},{"line":3,"col":41,"index":170}],"6":[0,{"line":3,"col":2,"index":131},{"line":3,"col":41,"index":170}],"7":[0,{"line":3,"col":2,"index":131},{"line":3,"col":41,"index":170}],"8":[0,{"line":1,"col":0,"index":56},{"line":4,"col":116,"index":172}]}} \ No newline at end of file diff --git a/quint/testFixture/_1011nameOutOfScope.json b/quint/testFixture/_1011nameOutOfScope.json index 91ca7950d..463c5237d 100644 --- a/quint/testFixture/_1011nameOutOfScope.json +++ b/quint/testFixture/_1011nameOutOfScope.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"nameOutOfScope","declarations":[{"id":9,"kind":"def","name":"A","qualifier":"val","expr":{"id":8,"kind":"app","opcode":"iadd","args":[{"id":6,"kind":"name","name":"x"},{"id":7,"kind":"int","value":1}]}},{"id":5,"kind":"def","name":"f","qualifier":"def","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"def","expr":{"id":4,"kind":"app","opcode":"igt","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"int","value":10}]}}}]}],"table":{"2":{"id":1,"name":"x","kind":"param"}},"errors":[{"explanation":"[QNT404] Name 'x' not found","locs":[{"source":"mocked_path/testFixture/_1011nameOutOfScope.qnt","start":{"line":4,"col":10,"index":188},"end":{"line":4,"col":10,"index":188}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"nameOutOfScope","declarations":[{"id":10,"kind":"def","name":"A","qualifier":"val","expr":{"id":9,"kind":"app","opcode":"iadd","args":[{"id":7,"kind":"name","name":"x"},{"id":8,"kind":"int","value":1}]}},{"id":6,"kind":"def","name":"f","qualifier":"def","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"def","expr":{"id":4,"kind":"app","opcode":"igt","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"int","value":10}]}}}]}],"table":{"2":{"id":1,"name":"x","kind":"param"}},"errors":[{"explanation":"[QNT404] Name 'x' not found","locs":[{"source":"mocked_path/testFixture/_1011nameOutOfScope.qnt","start":{"line":4,"col":10,"index":188},"end":{"line":4,"col":10,"index":188}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1011nameOutOfScope.map.json b/quint/testFixture/_1011nameOutOfScope.map.json index 519744a61..c3bd5741b 100644 --- a/quint/testFixture/_1011nameOutOfScope.map.json +++ b/quint/testFixture/_1011nameOutOfScope.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1011nameOutOfScope.qnt"},"map":{"1":[0,{"line":2,"col":8,"index":77},{"line":2,"col":8,"index":77}],"2":[0,{"line":2,"col":13,"index":82},{"line":2,"col":13,"index":82}],"3":[0,{"line":2,"col":17,"index":86},{"line":2,"col":18,"index":87}],"4":[0,{"line":2,"col":13,"index":82},{"line":2,"col":18,"index":87}],"5":[0,{"line":2,"col":2,"index":71},{"line":2,"col":18,"index":87}],"6":[0,{"line":4,"col":10,"index":188},{"line":4,"col":10,"index":188}],"7":[0,{"line":4,"col":14,"index":192},{"line":4,"col":14,"index":192}],"8":[0,{"line":4,"col":10,"index":188},{"line":4,"col":14,"index":192}],"9":[0,{"line":4,"col":2,"index":180},{"line":4,"col":14,"index":192}],"10":[0,{"line":0,"col":0,"index":0},{"line":5,"col":194,"index":194}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1011nameOutOfScope.qnt"},"map":{"1":[0,{"line":2,"col":8,"index":77},{"line":2,"col":8,"index":77}],"2":[0,{"line":2,"col":13,"index":82},{"line":2,"col":13,"index":82}],"3":[0,{"line":2,"col":17,"index":86},{"line":2,"col":18,"index":87}],"4":[0,{"line":2,"col":13,"index":82},{"line":2,"col":18,"index":87}],"5":[0,{"line":2,"col":2,"index":71},{"line":2,"col":18,"index":87}],"6":[0,{"line":2,"col":2,"index":71},{"line":2,"col":18,"index":87}],"7":[0,{"line":4,"col":10,"index":188},{"line":4,"col":10,"index":188}],"8":[0,{"line":4,"col":14,"index":192},{"line":4,"col":14,"index":192}],"9":[0,{"line":4,"col":10,"index":188},{"line":4,"col":14,"index":192}],"10":[0,{"line":4,"col":2,"index":180},{"line":4,"col":14,"index":192}],"11":[0,{"line":0,"col":0,"index":0},{"line":5,"col":194,"index":194}]}} \ No newline at end of file diff --git a/quint/testFixture/_1014conflictingNames.json b/quint/testFixture/_1014conflictingNames.json index 1fb83d48e..c4b48653f 100644 --- a/quint/testFixture/_1014conflictingNames.json +++ b/quint/testFixture/_1014conflictingNames.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":3,"name":"M","declarations":[{"id":2,"kind":"def","name":"b","qualifier":"def","expr":{"id":1,"kind":"int","value":2}}]},{"id":19,"name":"conflictingNames","declarations":[{"id":11,"kind":"def","name":"size","qualifier":"def","expr":{"id":11,"kind":"lambda","params":[{"id":9,"name":"x"}],"qualifier":"def","expr":{"id":10,"kind":"int","value":0}}},{"id":13,"kind":"typedef","name":"T","type":{"id":12,"kind":"int"}},{"id":15,"kind":"typedef","name":"T","type":{"id":14,"kind":"str"}},{"id":17,"kind":"def","name":"b","qualifier":"def","expr":{"id":16,"kind":"int","value":1}},{"kind":"var","name":"a","typeAnnotation":{"id":4,"kind":"int"},"id":5},{"id":18,"kind":"import","defName":"b","protoName":"M"},{"id":8,"kind":"def","name":"a","qualifier":"def","expr":{"id":8,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"def","expr":{"id":7,"kind":"name","name":"x"}}}]}],"table":{"7":{"id":6,"name":"x","kind":"param"}},"errors":[{"explanation":"[QNT101] Conflicting definitions found for name 'a' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":6,"col":2,"index":73},"end":{"line":6,"col":12,"index":83}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'a' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":7,"col":2,"index":87},"end":{"line":7,"col":13,"index":98}}]},{"explanation":"[QNT101] Built-in name 'size' is redefined in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":10,"col":2,"index":142},"end":{"line":10,"col":16,"index":156}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'T' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":13,"col":2,"index":186},"end":{"line":13,"col":13,"index":197}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'T' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":14,"col":2,"index":201},"end":{"line":14,"col":13,"index":212}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'b' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":16,"col":2,"index":217},"end":{"line":16,"col":10,"index":225}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'b' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":19,"col":2,"index":271},"end":{"line":19,"col":11,"index":280}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":3,"name":"M","declarations":[{"id":2,"kind":"def","name":"b","qualifier":"def","expr":{"id":1,"kind":"int","value":2}}]},{"id":21,"name":"conflictingNames","declarations":[{"id":13,"kind":"def","name":"size","qualifier":"def","expr":{"id":12,"kind":"lambda","params":[{"id":10,"name":"x"}],"qualifier":"def","expr":{"id":11,"kind":"int","value":0}}},{"id":15,"kind":"typedef","name":"T","type":{"id":14,"kind":"int"}},{"id":17,"kind":"typedef","name":"T","type":{"id":16,"kind":"str"}},{"id":19,"kind":"def","name":"b","qualifier":"def","expr":{"id":18,"kind":"int","value":1}},{"kind":"var","name":"a","typeAnnotation":{"id":4,"kind":"int"},"id":5},{"id":20,"kind":"import","defName":"b","protoName":"M"},{"id":9,"kind":"def","name":"a","qualifier":"def","expr":{"id":8,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"def","expr":{"id":7,"kind":"name","name":"x"}}}]}],"table":{"7":{"id":6,"name":"x","kind":"param"}},"errors":[{"explanation":"[QNT101] Conflicting definitions found for name 'a' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":6,"col":2,"index":73},"end":{"line":6,"col":12,"index":83}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'a' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":7,"col":2,"index":87},"end":{"line":7,"col":13,"index":98}}]},{"explanation":"[QNT101] Built-in name 'size' is redefined in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":10,"col":2,"index":142},"end":{"line":10,"col":16,"index":156}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'T' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":13,"col":2,"index":186},"end":{"line":13,"col":13,"index":197}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'T' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":14,"col":2,"index":201},"end":{"line":14,"col":13,"index":212}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'b' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":16,"col":2,"index":217},"end":{"line":16,"col":10,"index":225}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'b' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":19,"col":2,"index":271},"end":{"line":19,"col":11,"index":280}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1014conflictingNames.map.json b/quint/testFixture/_1014conflictingNames.map.json index 0b3e07c7f..fe6459bd3 100644 --- a/quint/testFixture/_1014conflictingNames.map.json +++ b/quint/testFixture/_1014conflictingNames.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1014conflictingNames.qnt"},"map":{"1":[0,{"line":1,"col":10,"index":21},{"line":1,"col":10,"index":21}],"2":[0,{"line":1,"col":2,"index":13},{"line":1,"col":10,"index":21}],"3":[0,{"line":0,"col":0,"index":0},{"line":2,"col":23,"index":23}],"4":[0,{"line":6,"col":10,"index":81},{"line":6,"col":12,"index":83}],"5":[0,{"line":6,"col":2,"index":73},{"line":6,"col":12,"index":83}],"6":[0,{"line":7,"col":8,"index":93},{"line":7,"col":8,"index":93}],"7":[0,{"line":7,"col":13,"index":98},{"line":7,"col":13,"index":98}],"8":[0,{"line":7,"col":2,"index":87},{"line":7,"col":13,"index":98}],"9":[0,{"line":10,"col":11,"index":151},{"line":10,"col":11,"index":151}],"10":[0,{"line":10,"col":16,"index":156},{"line":10,"col":16,"index":156}],"11":[0,{"line":10,"col":2,"index":142},{"line":10,"col":16,"index":156}],"12":[0,{"line":13,"col":11,"index":195},{"line":13,"col":13,"index":197}],"13":[0,{"line":13,"col":2,"index":186},{"line":13,"col":13,"index":197}],"14":[0,{"line":14,"col":11,"index":210},{"line":14,"col":13,"index":212}],"15":[0,{"line":14,"col":2,"index":201},{"line":14,"col":13,"index":212}],"16":[0,{"line":16,"col":10,"index":225},{"line":16,"col":10,"index":225}],"17":[0,{"line":16,"col":2,"index":217},{"line":16,"col":10,"index":225}],"18":[0,{"line":19,"col":2,"index":271},{"line":19,"col":11,"index":280}],"19":[0,{"line":4,"col":0,"index":26},{"line":20,"col":256,"index":282}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1014conflictingNames.qnt"},"map":{"1":[0,{"line":1,"col":10,"index":21},{"line":1,"col":10,"index":21}],"2":[0,{"line":1,"col":2,"index":13},{"line":1,"col":10,"index":21}],"3":[0,{"line":0,"col":0,"index":0},{"line":2,"col":23,"index":23}],"4":[0,{"line":6,"col":10,"index":81},{"line":6,"col":12,"index":83}],"5":[0,{"line":6,"col":2,"index":73},{"line":6,"col":12,"index":83}],"6":[0,{"line":7,"col":8,"index":93},{"line":7,"col":8,"index":93}],"7":[0,{"line":7,"col":13,"index":98},{"line":7,"col":13,"index":98}],"8":[0,{"line":7,"col":2,"index":87},{"line":7,"col":13,"index":98}],"9":[0,{"line":7,"col":2,"index":87},{"line":7,"col":13,"index":98}],"10":[0,{"line":10,"col":11,"index":151},{"line":10,"col":11,"index":151}],"11":[0,{"line":10,"col":16,"index":156},{"line":10,"col":16,"index":156}],"12":[0,{"line":10,"col":2,"index":142},{"line":10,"col":16,"index":156}],"13":[0,{"line":10,"col":2,"index":142},{"line":10,"col":16,"index":156}],"14":[0,{"line":13,"col":11,"index":195},{"line":13,"col":13,"index":197}],"15":[0,{"line":13,"col":2,"index":186},{"line":13,"col":13,"index":197}],"16":[0,{"line":14,"col":11,"index":210},{"line":14,"col":13,"index":212}],"17":[0,{"line":14,"col":2,"index":201},{"line":14,"col":13,"index":212}],"18":[0,{"line":16,"col":10,"index":225},{"line":16,"col":10,"index":225}],"19":[0,{"line":16,"col":2,"index":217},{"line":16,"col":10,"index":225}],"20":[0,{"line":19,"col":2,"index":271},{"line":19,"col":11,"index":280}],"21":[0,{"line":4,"col":0,"index":26},{"line":20,"col":256,"index":282}]}} \ No newline at end of file diff --git a/quint/testFixture/_1030const.json b/quint/testFixture/_1030const.json index b18d403e1..7bba23e4b 100644 --- a/quint/testFixture/_1030const.json +++ b/quint/testFixture/_1030const.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2},{"id":10,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":10,"kind":"lambda","params":[{"id":3,"name":"i"}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"iadd","args":[{"id":6,"kind":"name","name":"i"},{"id":7,"kind":"name","name":"N"}]}},"typeAnnotation":{"id":9,"kind":"oper","args":[{"id":4,"kind":"int"}],"res":{"id":5,"kind":"int"}}}]}],"table":{"6":{"id":3,"name":"i","kind":"param"},"7":{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":12,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2},{"id":11,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":10,"kind":"lambda","params":[{"id":3,"name":"i"}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"iadd","args":[{"id":6,"kind":"name","name":"i"},{"id":7,"kind":"name","name":"N"}]}},"typeAnnotation":{"id":9,"kind":"oper","args":[{"id":4,"kind":"int"}],"res":{"id":5,"kind":"int"}}}]}],"table":{"6":{"id":3,"name":"i","kind":"param"},"7":{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1030const.map.json b/quint/testFixture/_1030const.map.json index 889372b5d..b97f687e8 100644 --- a/quint/testFixture/_1030const.map.json +++ b/quint/testFixture/_1030const.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1030const.qnt"},"map":{"1":[0,{"line":1,"col":11,"index":22},{"line":1,"col":13,"index":24}],"2":[0,{"line":1,"col":2,"index":13},{"line":1,"col":13,"index":24}],"3":[0,{"line":3,"col":15,"index":42},{"line":3,"col":15,"index":42}],"4":[0,{"line":3,"col":18,"index":45},{"line":3,"col":20,"index":47}],"5":[0,{"line":3,"col":24,"index":51},{"line":3,"col":26,"index":53}],"6":[0,{"line":3,"col":30,"index":57},{"line":3,"col":30,"index":57}],"7":[0,{"line":3,"col":34,"index":61},{"line":3,"col":34,"index":61}],"8":[0,{"line":3,"col":30,"index":57},{"line":3,"col":34,"index":61}],"9":[0,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"10":[0,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"11":[0,{"line":0,"col":0,"index":0},{"line":4,"col":63,"index":63}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1030const.qnt"},"map":{"1":[0,{"line":1,"col":11,"index":22},{"line":1,"col":13,"index":24}],"2":[0,{"line":1,"col":2,"index":13},{"line":1,"col":13,"index":24}],"3":[0,{"line":3,"col":15,"index":42},{"line":3,"col":15,"index":42}],"4":[0,{"line":3,"col":18,"index":45},{"line":3,"col":20,"index":47}],"5":[0,{"line":3,"col":24,"index":51},{"line":3,"col":26,"index":53}],"6":[0,{"line":3,"col":30,"index":57},{"line":3,"col":30,"index":57}],"7":[0,{"line":3,"col":34,"index":61},{"line":3,"col":34,"index":61}],"8":[0,{"line":3,"col":30,"index":57},{"line":3,"col":34,"index":61}],"9":[0,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"10":[0,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"11":[0,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"12":[0,{"line":0,"col":0,"index":0},{"line":4,"col":63,"index":63}]}} \ No newline at end of file diff --git a/quint/testFixture/_1031instance.json b/quint/testFixture/_1031instance.json index 8816ad45f..14ad07a68 100644 --- a/quint/testFixture/_1031instance.json +++ b/quint/testFixture/_1031instance.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":18,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9},{"id":17,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":17,"kind":"lambda","params":[{"id":10,"name":"i"}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"typeAnnotation":{"id":16,"kind":"oper","args":[{"id":11,"kind":"int"}],"res":{"id":12,"kind":"int"}}}]},{"id":7,"name":"inst","declarations":[{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},{"id":6,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"foo","args":[{"id":4,"kind":"int","value":6}]}}]}],"table":{"2":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":1,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"5":{"id":17,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":17,"kind":"lambda","params":[{"id":10,"name":"i"}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"depth":0,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"13":{"id":10,"name":"i","kind":"param"},"14":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":19,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9},{"id":18,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":17,"kind":"lambda","params":[{"id":10,"name":"i"}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"typeAnnotation":{"id":16,"kind":"oper","args":[{"id":11,"kind":"int"}],"res":{"id":12,"kind":"int"}}}]},{"id":7,"name":"inst","declarations":[{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},{"id":6,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"foo","args":[{"id":4,"kind":"int","value":6}]}}]}],"table":{"2":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":1,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"5":{"id":18,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":17,"kind":"lambda","params":[{"id":10,"name":"i"}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"depth":0,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"13":{"id":10,"name":"i","kind":"param"},"14":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1031instance.map.json b/quint/testFixture/_1031instance.map.json index 257653256..d0f6ed830 100644 --- a/quint/testFixture/_1031instance.map.json +++ b/quint/testFixture/_1031instance.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1031instance.qnt","7":"mocked_path/testFixture/_1030const.qnt"},"map":{"1":[0,{"line":1,"col":15,"index":29},{"line":1,"col":15,"index":29}],"2":[0,{"line":1,"col":11,"index":25},{"line":1,"col":11,"index":25}],"3":[0,{"line":1,"col":2,"index":16},{"line":1,"col":38,"index":52}],"4":[0,{"line":3,"col":21,"index":76},{"line":3,"col":21,"index":76}],"5":[0,{"line":3,"col":17,"index":72},{"line":3,"col":22,"index":77}],"6":[0,{"line":3,"col":2,"index":57},{"line":3,"col":22,"index":77}],"7":[0,{"line":0,"col":0,"index":0},{"line":4,"col":79,"index":79}],"8":[7,{"line":1,"col":11,"index":22},{"line":1,"col":13,"index":24}],"9":[7,{"line":1,"col":2,"index":13},{"line":1,"col":13,"index":24}],"10":[7,{"line":3,"col":15,"index":42},{"line":3,"col":15,"index":42}],"11":[7,{"line":3,"col":18,"index":45},{"line":3,"col":20,"index":47}],"12":[7,{"line":3,"col":24,"index":51},{"line":3,"col":26,"index":53}],"13":[7,{"line":3,"col":30,"index":57},{"line":3,"col":30,"index":57}],"14":[7,{"line":3,"col":34,"index":61},{"line":3,"col":34,"index":61}],"15":[7,{"line":3,"col":30,"index":57},{"line":3,"col":34,"index":61}],"16":[7,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"17":[7,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"18":[7,{"line":0,"col":0,"index":0},{"line":4,"col":63,"index":63}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1031instance.qnt","7":"mocked_path/testFixture/_1030const.qnt"},"map":{"1":[0,{"line":1,"col":15,"index":29},{"line":1,"col":15,"index":29}],"2":[0,{"line":1,"col":11,"index":25},{"line":1,"col":11,"index":25}],"3":[0,{"line":1,"col":2,"index":16},{"line":1,"col":38,"index":52}],"4":[0,{"line":3,"col":21,"index":76},{"line":3,"col":21,"index":76}],"5":[0,{"line":3,"col":17,"index":72},{"line":3,"col":22,"index":77}],"6":[0,{"line":3,"col":2,"index":57},{"line":3,"col":22,"index":77}],"7":[0,{"line":0,"col":0,"index":0},{"line":4,"col":79,"index":79}],"8":[7,{"line":1,"col":11,"index":22},{"line":1,"col":13,"index":24}],"9":[7,{"line":1,"col":2,"index":13},{"line":1,"col":13,"index":24}],"10":[7,{"line":3,"col":15,"index":42},{"line":3,"col":15,"index":42}],"11":[7,{"line":3,"col":18,"index":45},{"line":3,"col":20,"index":47}],"12":[7,{"line":3,"col":24,"index":51},{"line":3,"col":26,"index":53}],"13":[7,{"line":3,"col":30,"index":57},{"line":3,"col":30,"index":57}],"14":[7,{"line":3,"col":34,"index":61},{"line":3,"col":34,"index":61}],"15":[7,{"line":3,"col":30,"index":57},{"line":3,"col":34,"index":61}],"16":[7,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"17":[7,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"18":[7,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"19":[7,{"line":0,"col":0,"index":0},{"line":4,"col":63,"index":63}]}} \ No newline at end of file diff --git a/quint/testFixture/modulesAndJunk.json b/quint/testFixture/modulesAndJunk.json index 93f7486b6..c36b97412 100644 --- a/quint/testFixture/modulesAndJunk.json +++ b/quint/testFixture/modulesAndJunk.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":13,"name":"bar","declarations":[{"id":12,"kind":"def","name":"baz","qualifier":"def","expr":{"id":12,"kind":"lambda","params":[{"id":5,"name":"x"}],"qualifier":"def","expr":{"id":10,"kind":"app","opcode":"iadd","args":[{"id":8,"kind":"name","name":"x"},{"id":9,"kind":"int","value":1}]}},"typeAnnotation":{"id":11,"kind":"oper","args":[{"id":6,"kind":"int"}],"res":{"id":7,"kind":"int"}}}]},{"id":4,"name":"foo","declarations":[{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":1}}]}],"table":{"8":{"id":5,"name":"x","kind":"param"}},"errors":[{"explanation":"[QNT000] extraneous input 'the' expecting {, 'module', DOCCOMMENT}","locs":[{"source":"mocked_path/testFixture/modulesAndJunk.qnt","start":{"line":8,"col":0,"index":75},"end":{"line":8,"col":2,"index":77}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":14,"name":"bar","declarations":[{"id":13,"kind":"def","name":"baz","qualifier":"def","expr":{"id":12,"kind":"lambda","params":[{"id":5,"name":"x"}],"qualifier":"def","expr":{"id":10,"kind":"app","opcode":"iadd","args":[{"id":8,"kind":"name","name":"x"},{"id":9,"kind":"int","value":1}]}},"typeAnnotation":{"id":11,"kind":"oper","args":[{"id":6,"kind":"int"}],"res":{"id":7,"kind":"int"}}}]},{"id":4,"name":"foo","declarations":[{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":1}}]}],"table":{"8":{"id":5,"name":"x","kind":"param"}},"errors":[{"explanation":"[QNT000] extraneous input 'the' expecting {, 'module', DOCCOMMENT}","locs":[{"source":"mocked_path/testFixture/modulesAndJunk.qnt","start":{"line":8,"col":0,"index":75},"end":{"line":8,"col":2,"index":77}}]}]} \ No newline at end of file From 49dc4b3d3367e575b5d74d2fb8d7074aed536c5b Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 30 Nov 2023 20:44:02 -0500 Subject: [PATCH 050/388] Update tests --- quint/test/effects/modeChecker.test.ts | 24 ++++++++++++------------ quint/test/names/unshadower.test.ts | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/quint/test/effects/modeChecker.test.ts b/quint/test/effects/modeChecker.test.ts index 750f7085f..365a0d7a9 100644 --- a/quint/test/effects/modeChecker.test.ts +++ b/quint/test/effects/modeChecker.test.ts @@ -34,12 +34,12 @@ describe('checkModes', () => { [...errors.entries()], [ [ - 12n, + 13n, { message: "def operators may only read state variables, but operator `a` updates variables 'x'. Use action instead.", code: 'QNT200', - reference: 12n, + reference: 13n, data: { fix: { kind: 'replace', original: 'def', replacement: 'action' } }, }, ], @@ -71,7 +71,7 @@ describe('checkModes', () => { const [errors, suggestions] = checkMockedDefs(defs) assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(quintErrorToString)}`) - assert.sameDeepMembers([...suggestions.entries()], [[12n, 'def']]) + assert.sameDeepMembers([...suggestions.entries()], [[13n, 'def']]) }) it('finds mode errors between pureval and val', () => { @@ -114,12 +114,12 @@ describe('checkModes', () => { [...errors.entries()], [ [ - 11n, + 12n, { message: "pure def operators may not interact with state variables, but operator `f` reads variables 'y'. Use def instead.", code: 'QNT200', - reference: 11n, + reference: 12n, data: { fix: { kind: 'replace', original: 'pure def', replacement: 'def' } }, }, ], @@ -133,7 +133,7 @@ describe('checkModes', () => { const [errors, suggestions] = checkMockedDefs(defs) assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(quintErrorToString)}`) - assert.sameDeepMembers([...suggestions.entries()], [[10n, 'puredef']]) + assert.sameDeepMembers([...suggestions.entries()], [[11n, 'puredef']]) }) it('finds mode errors between val and temporal', () => { @@ -245,12 +245,12 @@ describe('checkModes', () => { [...errors.entries()], [ [ - 12n, + 13n, { message: 'pure val operators may not have parameters, but operator `foo` has 1 parameter. Use pure def instead.', code: 'QNT200', - reference: 12n, + reference: 13n, data: { fix: { kind: 'replace', original: 'pure val', replacement: 'pure def' } }, }, ], @@ -267,11 +267,11 @@ describe('checkModes', () => { [...errors.entries()], [ [ - 12n, + 13n, { message: 'val operators may not have parameters, but operator `foo` has 1 parameter. Use def instead.', code: 'QNT200', - reference: 12n, + reference: 13n, data: { fix: { kind: 'replace', original: 'val', replacement: 'def' } }, }, ], @@ -288,12 +288,12 @@ describe('checkModes', () => { [...errors.entries()], [ [ - 12n, + 13n, { message: "pure val operators may not interact with state variables, but operator `foo` reads variables 'x'. Use def instead.", code: 'QNT200', - reference: 12n, + reference: 13n, data: { fix: { kind: 'replace', original: 'pure val', replacement: 'def' } }, }, ], diff --git a/quint/test/names/unshadower.test.ts b/quint/test/names/unshadower.test.ts index 9cf6ce65b..6d4c4f718 100644 --- a/quint/test/names/unshadower.test.ts +++ b/quint/test/names/unshadower.test.ts @@ -34,7 +34,7 @@ describe('unshadowNames', () => { assert.sameDeepMembers(unshadowedModules.map(moduleToString), [ dedent(`module A { - | val b = val a_9 = 1 { a_9 } + | val b = val a_10 = 1 { a_10 } | def f = ((a_5) => igt(a_5, 0)) |}`), dedent(`module B { From 554bb07fc07151fef0c46ca750fa5874318dd800 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 30 Nov 2023 20:55:58 -0500 Subject: [PATCH 051/388] Update tests with correct ids --- quint/test/types/inferrer.test.ts | 69 ++++++++++++++++++++----------- 1 file changed, 46 insertions(+), 23 deletions(-) diff --git a/quint/test/types/inferrer.test.ts b/quint/test/types/inferrer.test.ts index 8c496f164..6c7970584 100644 --- a/quint/test/types/inferrer.test.ts +++ b/quint/test/types/inferrer.test.ts @@ -5,6 +5,15 @@ import { typeSchemeToString } from '../../src/types/printing' import { errorTreeToString } from '../../src/errorTree' import { parseMockedModule } from '../util' +// Utility used to print update `stringType` values to make +// updating the expected values in the following tests less +// painful. +function _printUpdatedStringTypes(stringTypes: (string | bigint)[][]) { + console.log('[') + stringTypes.forEach(([n, t]) => console.log(`[${n}n, '${t}'],`)) + console.log(']') +} + describe('inferTypes', () => { function inferTypesForModules(text: string): TypeInferenceResult { const { modules, table } = parseMockedModule(text) @@ -25,6 +34,7 @@ describe('inferTypes', () => { assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) + // _printUpdatedStringTypes(stringTypes) assert.sameDeepMembers(stringTypes, [ [1n, 'int'], [2n, 'int'], @@ -36,20 +46,22 @@ describe('inferTypes', () => { [8n, 'int'], [9n, 'int'], [10n, '(int, int) => int'], - [11n, 'int'], + [11n, '(int, int) => int'], [12n, 'int'], [13n, 'int'], [14n, 'int'], [15n, 'int'], - [16n, 'Set[int]'], + [16n, 'int'], [17n, 'Set[int]'], - [18n, 'int'], + [18n, 'Set[int]'], [19n, 'int'], [20n, 'int'], [21n, 'int'], - [22n, '(int) => int'], - [23n, 'Set[int]'], - [24n, '(Set[int]) => Set[int]'], + [22n, 'int'], + [23n, '(int) => int'], + [24n, 'Set[int]'], + [25n, '(Set[int]) => Set[int]'], + [26n, '(Set[int]) => Set[int]'], ]) }) @@ -60,21 +72,24 @@ describe('inferTypes', () => { assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) + // _printUpdatedStringTypes(stringTypes) assert.sameDeepMembers(stringTypes, [ + [7n, '(bool) => int'], + [8n, 'bool'], + [9n, 'bool'], + [10n, 'int'], + [11n, 'bool'], + [12n, 'bool'], + [13n, 'int'], + [14n, 'int'], + [15n, '((bool) => int, bool) => int'], + [16n, '((bool) => int, bool) => int'], [1n, '∀ t0, t1 . (t0) => t1'], [2n, '∀ t0 . t0'], [3n, '∀ t0 . t0'], [4n, '∀ t0 . t0'], [5n, '∀ t0, t1 . ((t0) => t1, t0) => t1'], - [6n, '(bool) => int'], - [7n, 'bool'], - [8n, 'bool'], - [9n, 'int'], - [10n, 'bool'], - [11n, 'bool'], - [12n, 'int'], - [13n, 'int'], - [14n, '((bool) => int, bool) => int'], + [6n, '∀ t0, t1 . ((t0) => t1, t0) => t1'], ]) }) @@ -90,13 +105,14 @@ describe('inferTypes', () => { assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) + // _printUpdatedStringTypes(stringTypes) assert.sameDeepMembers(stringTypes, [ [4n, '{ f1: int, f2: bool }'], [5n, '{ f1: int, f2: bool }'], - [6n, 'int'], [7n, 'str'], - [8n, 'bool'], + [6n, 'int'], [9n, 'str'], + [8n, 'bool'], [10n, '{ f1: int, f2: bool }'], [11n, 'Set[{ f1: int, f2: bool }]'], [12n, 'Set[{ f1: int, f2: bool }]'], @@ -108,12 +124,13 @@ describe('inferTypes', () => { [18n, 'int'], [19n, '{ f1: int, f2: bool }'], [20n, '∀ r0 . ({ f1: int | r0 }) => { f1: int, f2: bool }'], - [21n, 'int'], - [22n, 'str'], - [23n, '{ f1: int }'], - [24n, '{ f1: int, f2: bool }'], - [25n, 'Set[str]'], + [21n, '∀ r0 . ({ f1: int | r0 }) => { f1: int, f2: bool }'], + [23n, 'str'], + [22n, 'int'], + [24n, '{ f1: int }'], + [25n, '{ f1: int, f2: bool }'], [26n, 'Set[str]'], + [27n, 'Set[str]'], ]) }) @@ -124,6 +141,7 @@ describe('inferTypes', () => { assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) + // _printUpdatedStringTypes(stringTypes) assert.sameDeepMembers(stringTypes, [ [1n, '∀ t0, r0 . (t0 | r0)'], [2n, '∀ t0, t1, r0 . (t0, t1 | r0)'], @@ -135,6 +153,7 @@ describe('inferTypes', () => { [8n, '∀ t0 . t0'], [9n, '∀ t0, t1 . (t0, t1)'], [10n, '∀ t0, t1, t2, r0, r1 . ((t0 | r0), (t1, t2 | r1)) => (t0, t2)'], + [11n, '∀ t0, t1, t2, r0, r1 . ((t0 | r0), (t1, t2 | r1)) => (t0, t2)'], ]) }) @@ -313,7 +332,7 @@ module B { assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) - assert.includeDeepMembers(stringTypes, [[14n, '(str) => bool']]) + assert.includeDeepMembers(stringTypes, [[15n, '(str) => bool']]) }) it('considers annotations', () => { @@ -323,10 +342,12 @@ module B { assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) + // _printUpdatedStringTypes(stringTypes) assert.sameDeepMembers(stringTypes, [ [1n, 'int'], [5n, 'int'], [6n, '(int) => int'], + [7n, '(int) => int'], ]) }) @@ -337,6 +358,7 @@ module B { assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) + // _printUpdatedStringTypes(stringTypes) assert.sameDeepMembers(stringTypes, [ [1n, '(int -> str)'], [6n, '(int -> str)'], @@ -345,6 +367,7 @@ module B { [9n, 'int'], [10n, 'int'], [12n, '((int -> str)) => int'], + [13n, '((int -> str)) => int'], ]) }) From d0bc358ac1f0718989b92af4687a095bbc7871f2 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 30 Nov 2023 21:01:03 -0500 Subject: [PATCH 052/388] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b1b1c8d34..63871c6ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 and `import (...)` (#1276) - Fix incorrect type checking failure from interference between sum types sharing variant labels (#1275) +- Fix the IDs generated for operator definition bodies (#1280) ### Security From d32f99b78e87a9923b814b90e1684c7b4a274f55 Mon Sep 17 00:00:00 2001 From: ivan-gavran Date: Fri, 1 Dec 2023 16:09:16 +0100 Subject: [PATCH 053/388] added defs to extract values of a map as a set and as a list --- examples/spells/commonSpells.qnt | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/examples/spells/commonSpells.qnt b/examples/spells/commonSpells.qnt index 7205ec954..49a8c5f42 100644 --- a/examples/spells/commonSpells.qnt +++ b/examples/spells/commonSpells.qnt @@ -17,4 +17,34 @@ module commonSpells { assert(setSum(2.to(4)) == 9), assert(setSum(Set(-4, 4, 5)) == 5), } + + /// Get the set of values of a map. + /// + /// - @param __map a map from type a to type b + /// - @returns the set of all values in the map + pure def mapValuesSet(__map: a -> b): Set[b] = { + __map.keys().map(k => __map.get(k)) + } + + run mapValuesSetTest = all { + assert(mapValuesSet(Map()) == Set()), + assert(mapValuesSet(Map(1 -> 2, 2 -> 3)) == Set(2, 3)), + assert(mapValuesSet(Map(1 -> 2, 2 -> 3, 3 -> 2)) == Set(2, 3)), + } + + /// Get the list of values from a map. + /// + /// - @param __map a map from type a to type b + /// - @returns the list of all values in the map + pure def mapValuesList(__map: a -> b): List[b] = { + __map.keys().fold([], (__list, __k) => __list.append(__map.get(__k))) + } + + run mapValuesListTest = all { + assert(mapValuesList(Map()) == []), + assert(mapValuesList(Map(1 -> 2, 2 -> 3)) == [2, 3]), + assert(mapValuesList(Map(1 -> 2, 2 -> 3, 3 -> 2)) == [2,3,2]), + } + + } \ No newline at end of file From 2e821ec617df4122e5351ab71c65c21e3a899350 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Dec 2023 10:39:45 -0500 Subject: [PATCH 054/388] Add support for variants in ITF Closes #1281 --- quint/io-cli-tests.md | 16 ++++++++++++++++ quint/src/itf.ts | 16 ++++++++++++++++ quint/test/itf.test.ts | 2 ++ 3 files changed, 34 insertions(+) diff --git a/quint/io-cli-tests.md b/quint/io-cli-tests.md index 994c74d23..2c3820387 100644 --- a/quint/io-cli-tests.md +++ b/quint/io-cli-tests.md @@ -1055,3 +1055,19 @@ rm firstTest.itf.json secondTest.itf.json [{"#meta":{"index":0},"x":{"#bigint":"0"}},{"#meta":{"index":1},"x":{"#bigint":"1"}}] [{"#meta":{"index":0},"x":{"#bigint":"0"}},{"#meta":{"index":1},"x":{"#bigint":"2"}}] ``` + +### Variants are supported in ITF + +See [#1281](https://github.com/informalsystems/quint/issues/1281) + + +``` +quint test --output {}.itf.json ./testFixture/_1054sumTypesInItf.qnt >/dev/null +cat xTest.itf.json | jq -c .states +rm xTest.itf.json +``` + + +``` +[{"#meta":{"index":0},"x":{"tag":"None","value":{}}},{"#meta":{"index":1},"x":{"tag":"Some","value":{"#bigint":"1"}}},{"#meta":{"index":2},"x":{"tag":"Some","value":{"#bigint":"2"}}}] +``` diff --git a/quint/src/itf.ts b/quint/src/itf.ts index 7cd3199a5..48b9d969b 100644 --- a/quint/src/itf.ts +++ b/quint/src/itf.ts @@ -14,6 +14,7 @@ import { chunk } from 'lodash' import { QuintApp, QuintStr } from './ir/quintIr' import { QuintEx } from './ir/quintIr' +import { unreachable } from './util' /** The type of IFT traces. * See https://github.com/informalsystems/apalache/blob/main/docs/src/adr/015adr-trace.md */ @@ -42,6 +43,7 @@ export type ItfValue = | ItfMap | ItfUnserializable | ItfRecord + | ItfVariant type ItfBigint = { '#bigint': string } type ItfTup = { '#tup': ItfValue[] } @@ -49,6 +51,7 @@ type ItfSet = { '#set': ItfValue[] } type ItfMap = { '#map': [ItfValue, ItfValue][] } type ItfUnserializable = { '#unserializable': string } type ItfRecord = { [index: string]: ItfValue } +type ItfVariant = { tag: ItfValue; value: ItfValue } // Type predicates to help with type narrowing function isBigint(v: ItfValue): v is ItfBigint { @@ -67,6 +70,10 @@ function isMap(v: ItfValue): v is ItfMap { return (v as ItfMap)['#map'] !== undefined } +function isVariant(v: ItfValue): v is ItfVariant { + return (v as ItfVariant)['tag'] !== undefined +} + function isUnserializable(v: ItfValue): v is ItfUnserializable { return (v as ItfUnserializable)['#unserializable'] !== undefined } @@ -140,11 +147,16 @@ export function toItf(vars: string[], states: QuintEx[]): Either ({ tag: label, value: value })) + default: + // TODO unreachable(ex) return left(`Unexpected operator type: ${ex.opcode}`) } default: + // TODO unreachable(ex) return left(`Unexpected expression kind: ${ex.kind}`) } } @@ -209,6 +221,10 @@ export function ofItf(itf: ItfTrace): QuintEx[] { opcode: 'Map', args, } + } else if (isVariant(value)) { + const l = ofItfValue(value.tag) + const v = ofItfValue(value.value) + return { id, kind: 'app', opcode: 'variant', args: [l, v] } } else if (typeof value === 'object') { // Any other object must represent a record // For each key/value pair in the object, form the quint expressions representing diff --git a/quint/test/itf.test.ts b/quint/test/itf.test.ts index 1f1a622f2..507e8a23a 100644 --- a/quint/test/itf.test.ts +++ b/quint/test/itf.test.ts @@ -47,6 +47,7 @@ describe('toItf', () => { g: Map(1 -> "a", 2 -> "b", 3 -> "c"), h: Map(), i: Map(1 -> "a"), + j: variant("A", 2) } ` const trace = [buildExpression(text)] @@ -74,6 +75,7 @@ describe('toItf', () => { }, h: { '#map': [] }, i: { '#map': [[{ '#bigint': '1' }, 'a']] }, + j: { tag: 'A', value: { '#bigint': '2' } }, }, ], } From 9ccabd0b6992fd2b0a39fcc9b3c1b8437339a254 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Dec 2023 10:41:30 -0500 Subject: [PATCH 055/388] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 63871c6ee..197872a08 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix incorrect type checking failure from interference between sum types sharing variant labels (#1275) - Fix the IDs generated for operator definition bodies (#1280) +- Fixed missing support for sum type variants in ITF traces (#1281) ### Security From e6074ede66a52b1150a5f6e5a09b4851280f8bed Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Dec 2023 10:43:05 -0500 Subject: [PATCH 056/388] Remove out of place TODOs --- quint/src/itf.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/quint/src/itf.ts b/quint/src/itf.ts index 48b9d969b..525d28989 100644 --- a/quint/src/itf.ts +++ b/quint/src/itf.ts @@ -14,7 +14,6 @@ import { chunk } from 'lodash' import { QuintApp, QuintStr } from './ir/quintIr' import { QuintEx } from './ir/quintIr' -import { unreachable } from './util' /** The type of IFT traces. * See https://github.com/informalsystems/apalache/blob/main/docs/src/adr/015adr-trace.md */ @@ -151,12 +150,10 @@ export function toItf(vars: string[], states: QuintEx[]): Either ({ tag: label, value: value })) default: - // TODO unreachable(ex) return left(`Unexpected operator type: ${ex.opcode}`) } default: - // TODO unreachable(ex) return left(`Unexpected expression kind: ${ex.kind}`) } } From 18065647bff0499e0bbee401f62b4547228cc9fe Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Dec 2023 14:59:32 -0500 Subject: [PATCH 057/388] Commit missing test fixcture --- quint/testFixture/_1054sumTypesInItf.qnt | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 quint/testFixture/_1054sumTypesInItf.qnt diff --git a/quint/testFixture/_1054sumTypesInItf.qnt b/quint/testFixture/_1054sumTypesInItf.qnt new file mode 100644 index 000000000..c5445f2a9 --- /dev/null +++ b/quint/testFixture/_1054sumTypesInItf.qnt @@ -0,0 +1,9 @@ +// Regression test for https://github.com/informalsystems/quint/issues/1281 +// ITF export did not have support for sum types +module sum { + type T = None | Some(int) + var x: T + action init = x' = None + action step = x' = match x { None => Some(1) | Some(n) => Some(n+1) } + run xTest = init.then(step).then(step).then(step) +} From d85ad63e011d72b0a4068007b3525fc8d1ac6538 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 24 Nov 2023 13:32:24 -0500 Subject: [PATCH 058/388] Use sum types for tictactoe example --- examples/puzzles/tictactoe/tictactoe.qnt | 72 ++++++++++++++---------- 1 file changed, 42 insertions(+), 30 deletions(-) diff --git a/examples/puzzles/tictactoe/tictactoe.qnt b/examples/puzzles/tictactoe/tictactoe.qnt index e609ec131..31aa6fdd4 100644 --- a/examples/puzzles/tictactoe/tictactoe.qnt +++ b/examples/puzzles/tictactoe/tictactoe.qnt @@ -12,10 +12,14 @@ * Gabriela Moreira, Informal Systems, 2022-2023 */ module tictactoe { + type Player = X | O + type Square = Occupied(Player) | Empty + /// A 3x3 tic-tac-toe board - var board: int -> (int -> str) + var board: int -> (int -> Square) + /// Who goes next - var nextTurn: str + var nextTurn: Player pure val boardCoordinates = tuples(1.to(3), 1.to(3)) @@ -40,33 +44,41 @@ module tictactoe { (3,3) ) - def hasValue(coordinate, player) = - board.get(coordinate._1).get(coordinate._2) == player + def square(coordinate: (int, int)): Square = + board.get(coordinate._1).get(coordinate._2) - def isEmpty(coordinate) = hasValue(coordinate, "_") + def hasPlayer(coordinate, player) = match square(coordinate) { + | Empty => false + | Occupied(p) => player == p + } + + def isEmpty(coordinate) = match square(coordinate) { + | Empty => true + | Occupied(_) => false + } val boardEmpty = boardCoordinates.forall(isEmpty) def won(player) = winningPatterns.exists(pattern => - pattern.forall(coordinate => hasValue(coordinate, player)) + pattern.forall(coordinate => hasPlayer(coordinate, player)) ) val boardFull = not(boardCoordinates.exists(isEmpty)) - val stalemate = boardFull and not(won("X")) and not(won("O")) - val gameOver = won("X") or won("O") or boardFull + val stalemate = boardFull and not(won(X)) and not(won(O)) + val gameOver = won(X) or won(O) or boardFull def canWinWithPattern(pattern) = and { - pattern.filter(coordinate => coordinate.hasValue("X")).size() == 2, + pattern.filter(coordinate => coordinate.hasPlayer(X)).size() == 2, pattern.filter(coordinate => coordinate.isEmpty()).size() == 1, } def canBlockWithPattern(pattern) = and { - pattern.filter(coordinate => coordinate.hasValue("O")).size() == 2, + pattern.filter(coordinate => coordinate.hasPlayer(O)).size() == 2, pattern.filter(coordinate => coordinate.isEmpty()).size() == 1, } def canSetupWinWithPattern(pattern) = and { - pattern.filter(coordinate => coordinate.hasValue("X")).size() == 1, + pattern.filter(coordinate => coordinate.hasPlayer(X)).size() == 1, pattern.filter(coordinate => coordinate.isEmpty()).size() == 2, } @@ -79,7 +91,7 @@ module tictactoe { isEmpty(coordinate), board' = board.setBy( coordinate._1, - row => row.set(coordinate._2, player) + row => row.set(coordinate._2, Occupied(player)) ), } @@ -87,22 +99,22 @@ module tictactoe { canWin, nondet pattern = winningPatterns.filter(canWinWithPattern).oneOf() nondet coordinate = pattern.filter(isEmpty).oneOf() - Move("X", coordinate), + Move(X, coordinate), } action Block = all { canBlock, nondet pattern = winningPatterns.filter(canBlockWithPattern).oneOf() nondet coordinate = pattern.filter(isEmpty).oneOf() - Move("X", coordinate), + Move(X, coordinate), } - action TakeCenter = Move("X", (2, 2)) + action TakeCenter = Move(X, (2, 2)) action SetupWin = all { nondet pattern = winningPatterns.filter(canSetupWinWithPattern).oneOf() nondet coordinate = pattern.filter(isEmpty).oneOf() - Move("X", coordinate), + Move(X, coordinate), } action MoveToEmpty(player) = @@ -111,32 +123,32 @@ module tictactoe { action StartInCorner = nondet corner = oneOf(corners) - Move("X", corner) + Move(X, corner) action MoveX = all { - nextTurn == "X", - not(won("O")), + nextTurn == X, + not(won(O)), if (boardEmpty) StartInCorner else if (canWin) Win else if (canBlock) Block else if (canTakeCenter) TakeCenter else if (canSetupWin) SetupWin else - MoveToEmpty("X"), - nextTurn' = "O", + MoveToEmpty(X), + nextTurn' = O, } action MoveO = all { - nextTurn == "O", - not(won("X")), - MoveToEmpty("O"), - nextTurn' = "X", + nextTurn == O, + not(won(X)), + MoveToEmpty(O), + nextTurn' = X, } action init = all { // X always goes first - nextTurn' = "X", + nextTurn' = X, // Every space in the board starts blank - board' = 1.to(3).mapBy(_ => 1.to(3).mapBy(_ => "_")), + board' = 1.to(3).mapBy(_ => 1.to(3).mapBy(_ => Empty)), } /// Either X or O will make a move, depending on the value of `nextTurn` @@ -150,10 +162,10 @@ module tictactoe { /* Invariants */ /// X has not won. This does not hold, as X wins most of the times. - val XHasNotWon = not(won("X")) + val XHasNotWon = not(won(X)) /// O has not won. This should hold, as O can only achieve a draw. - val OHasNotWon = not(won("O")) + val OHasNotWon = not(won(O)) /// It's not a stalemate if one player has won or the board is not filled /// Check with `quint run --invariant=NotStalemate tictactoe.qnt` @@ -166,5 +178,5 @@ module tictactoe { /// This is not always true, as if O picks the right moves, the game will /// result in a stalemate. - temporal XMustEventuallyWin = eventually(won("X")) + temporal XMustEventuallyWin = eventually(won(X)) } From f0f26b0fb17557733abd7a3250417ac56899371e Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Dec 2023 10:55:44 -0500 Subject: [PATCH 059/388] Update Apalache version --- quint/src/quintVerifier.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/quintVerifier.ts b/quint/src/quintVerifier.ts index 1f724ff16..d1e943206 100644 --- a/quint/src/quintVerifier.ts +++ b/quint/src/quintVerifier.ts @@ -39,7 +39,7 @@ import type { Buffer } from 'buffer' import type { PackageDefinition as ProtoPackageDefinition } from '@grpc/proto-loader' const APALACHE_SERVER_URI = 'localhost:8822' -const APALACHE_VERSION_TAG = '0.42.0' +const APALACHE_VERSION_TAG = '0.44.2' // TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 // const APALACHE_TGZ = 'apalache.tgz' From d8fdf128f1dcb81bce5203d9d42ca8449403590a Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Dec 2023 10:58:40 -0500 Subject: [PATCH 060/388] Update option.qnt for verification Use current conventions for operator names --- examples/language-features/option.qnt | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/examples/language-features/option.qnt b/examples/language-features/option.qnt index 1be3c5801..871eda916 100644 --- a/examples/language-features/option.qnt +++ b/examples/language-features/option.qnt @@ -2,41 +2,40 @@ module option { // A demonstration of sum types, specifying an option type. // An option type for int values. - // Polymorphic sum types are not yet supported: https://github.com/informalsystems/quint/issues/1073 - type Vote_option = + type VoteOption = | None | Some(int) - var votes: List[Vote_option] + var votes: List[VoteOption] var outcome: int - action Init = all { + action init = all { votes' = [], outcome' = 0 } - action Vote(v) = { + action vote(v) = { votes' = votes.append(Some(v)) } - action Unvote(i) = all { + action unvote(i) = all { votes[i] != None, votes' = votes.replaceAt(i, None), } - val SumVotes = - votes.foldl(0, (sum, vote) => match vote { - | Some(v) => sum + v + val sumVotes = + votes.foldl(0, (sum, v) => match v { + | Some(n) => sum + n | None => sum } ) - action Next = all { + action step = all { any { - nondet v = oneOf(Int); Vote(v), - nondet i = oneOf(votes.indices()); Unvote(i), + nondet v = oneOf(Int); vote(v), + nondet i = oneOf(votes.indices()); unvote(i), }, - outcome' = SumVotes + outcome' = sumVotes } run matchWithDefaultTest = { From a32a6310de265924a7f827e51c69f4e2b7803517 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Dec 2023 11:09:02 -0500 Subject: [PATCH 061/388] Update examples script --- examples/.scripts/run-example.sh | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/examples/.scripts/run-example.sh b/examples/.scripts/run-example.sh index 50458eeee..92dc211d8 100755 --- a/examples/.scripts/run-example.sh +++ b/examples/.scripts/run-example.sh @@ -40,20 +40,24 @@ result () { # Run the command and record success / failure local quint_cmd="quint $cmd $args $file" + local succeeded=false if ($quint_cmd &> /dev/null) then printf ":white_check_mark:" + succeeded=true else printf ":x:" + succeeded=false fi - # Print additional explanations - if [[ "$file" == "classic/distributed/Paxos/Paxos.qnt" && "$cmd" == "verify" ]] ; then - printf "https://github.com/informalsystems/quint/issues/1034" - elif [[ "$file" == "language-features/option.qnt" && "$cmd" == verify ]] ; then - printf "https://github.com/informalsystems/quint/issues/1034" - elif [[ "$file" == "solidity/icse23-fig7/lottery.qnt" && "$cmd" == "verify" ]] ; then - printf "https://github.com/informalsystems/quint/issues/1019" + # We only want to print additional info to annotate failing results + if [[ $succeeded == false ]]; then + # Print additional explanations + if [[ "$file" == "solidity/icse23-fig7/lottery.qnt" && "$cmd" == "verify" ]] ; then + printf "https://github.com/informalsystems/quint/issues/1285" + elif [[ "$file" == "classic/distributed/Paxos/Paxos.qnt" && "$cmd" == "verify" ]] ; then + printf "https://github.com/informalsystems/quint/issues/1284" + fi fi } @@ -118,6 +122,8 @@ get_verify_args () { args="--init=n4_f1::Init --step=n4_f1::Next --invariant=n4_f1::Agreement" elif [[ "$file" == "cosmos/ics23/ics23.qnt" ]] ; then args="--init=Init --step=Next" + elif [[ "$file" == "puzzles/tictactoe/tictactoe.qnt" ]] ; then + args="--max-steps=1" # pretty slow, and we just want to check that verification can run fi echo "${args}" } From f53a6c3d5bc966fc0e811dfee8285d4e813544a6 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Dec 2023 11:11:31 -0500 Subject: [PATCH 062/388] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 197872a08..6c590d35e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - When an input file only one module, it will be inferred as the main module (#1260) +- Sum types are now supported when running `verify` (#1034) ### Changed ### Deprecated From be9a510723dc2121ec05786c4ce5440d623cf9ae Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Dec 2023 17:54:17 -0500 Subject: [PATCH 063/388] Use a default case in the tictactoe example Ensure we can handle this construct in verification, and it also clarifies the meaning of the operator tweaked. --- examples/puzzles/tictactoe/tictactoe.qnt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/puzzles/tictactoe/tictactoe.qnt b/examples/puzzles/tictactoe/tictactoe.qnt index 31aa6fdd4..4c272e087 100644 --- a/examples/puzzles/tictactoe/tictactoe.qnt +++ b/examples/puzzles/tictactoe/tictactoe.qnt @@ -53,8 +53,8 @@ module tictactoe { } def isEmpty(coordinate) = match square(coordinate) { - | Empty => true - | Occupied(_) => false + | Empty => true + | _ => false } val boardEmpty = boardCoordinates.forall(isEmpty) From f0f0c3e87482e6e76d19509fbadaa4fc83d9dd67 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Dec 2023 18:29:09 -0500 Subject: [PATCH 064/388] Update examples dashboard --- examples/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/README.md b/examples/README.md index 2e536ee2b..ce21160a1 100644 --- a/examples/README.md +++ b/examples/README.md @@ -51,7 +51,7 @@ listed without any additional command line arguments. | [classic/distributed/ClockSync/clockSync3.qnt](./classic/distributed/ClockSync/clockSync3.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [classic/distributed/ewd840/ewd840.qnt](./classic/distributed/ewd840/ewd840.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [classic/distributed/LamportMutex/LamportMutex.qnt](./classic/distributed/LamportMutex/LamportMutex.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [classic/distributed/Paxos/Paxos.qnt](./classic/distributed/Paxos/Paxos.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1034 | +| [classic/distributed/Paxos/Paxos.qnt](./classic/distributed/Paxos/Paxos.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1284 | | [classic/distributed/Paxos/Voting.qnt](./classic/distributed/Paxos/Voting.qnt) | :white_check_mark: | :white_check_mark: | N/A[^parameterized] | N/A[^nostatemachine] | | [classic/distributed/ReadersWriters/ReadersWriters.qnt](./classic/distributed/ReadersWriters/ReadersWriters.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [classic/sequential/BinSearch/BinSearch.qnt](./classic/sequential/BinSearch/BinSearch.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | @@ -80,7 +80,7 @@ listed without any additional command line arguments. | [language-features/lists.qnt](./language-features/lists.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/maps.qnt](./language-features/maps.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/nondetEx.qnt](./language-features/nondetEx.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [language-features/option.qnt](./language-features/option.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1034 | +| [language-features/option.qnt](./language-features/option.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/records.qnt](./language-features/records.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/sets.qnt](./language-features/sets.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/tuples.qnt](./language-features/tuples.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | @@ -90,7 +90,7 @@ listed without any additional command line arguments. | [solidity/Coin/coin.qnt](./solidity/Coin/coin.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [solidity/ERC20/erc20.qnt](./solidity/ERC20/erc20.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [solidity/GradualPonzi/gradualPonzi.qnt](./solidity/GradualPonzi/gradualPonzi.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [solidity/icse23-fig7/lottery.qnt](./solidity/icse23-fig7/lottery.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1019 | +| [solidity/icse23-fig7/lottery.qnt](./solidity/icse23-fig7/lottery.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1285 | | [solidity/SimpleAuction/SimpleAuction.qnt](./solidity/SimpleAuction/SimpleAuction.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | N/A[^nostatemachine] | | [solidity/SimplePonzi/simplePonzi.qnt](./solidity/SimplePonzi/simplePonzi.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [spells/basicSpells.qnt](./spells/basicSpells.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | N/A[^nostatemachine] | From c53b2ca7a1d3dbc7657f0cc42be63b6c0ba5675a Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Dec 2023 18:30:49 -0500 Subject: [PATCH 065/388] Update feature table --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2deffd5cd..d163e4fd8 100644 --- a/README.md +++ b/README.md @@ -166,7 +166,7 @@ completely implementing every pass. | [Lists][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | | [Records][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | | [Tuples][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Sum types][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: [1034][] | :x: | +| [Sum types][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | | [Imports][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [Module definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [Module instances][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | From 9ffbcc1bc9b83e9ada3cf725a4fe9d7a499572b1 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 4 Dec 2023 10:25:06 -0300 Subject: [PATCH 066/388] Reorganize and rename --- .../TwoPhaseCommit/two_phase_commit.qnt | 124 +++++++++--------- 1 file changed, 60 insertions(+), 64 deletions(-) diff --git a/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt index 4d2bf1076..48410ce24 100644 --- a/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt +++ b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt @@ -6,115 +6,111 @@ https://github.com/tlaplus/Examples/blob/master/specifications/transaction_commit/TwoPhase.tla */ module two_phase_commit { - type ResourceManagerState = Working | Prepared | Committed | Aborted - var resourceManagerStates: str -> ResourceManagerState - - type TransactionManagerState = Init | Done - var transactionManagerState: TransactionManagerState - - /// The set of resource managers from which the transaction manager has - /// received RMPrepared messages - var preparedResourceManagers: Set[str] + const resourceManagers: Set[str] + type ResourceManagerState = Working | Prepared | Committed | Aborted + type TransactionManagerState = Init | TMCommitted | TMAborted type Message = | Abort | Commit | RMPrepared(str) - | RMCommitted(str) + var RM::states: str -> ResourceManagerState + var TM::state: TransactionManagerState + /// The set of resource managers from which the transaction manager has + /// received RMPrepared messages + var TM::preparedRMs: Set[str] var messages: Set[Message] - const resourceManagers: Set[str] - action init = all { - resourceManagerStates' = resourceManagers.mapBy(r => Working), - transactionManagerState' = Init, - preparedResourceManagers' = Set(), + RM::states' = resourceManagers.mapBy(r => Working), + TM::state' = Init, + TM::preparedRMs' = Set(), messages' = Set(), } - /* Transaction Manager actions */ + /* Transaction Manager (TM) actions */ /// The transaction manager receives a RMPrepared(rm) message from the resource manager rm - action addPreparedResourceManager(resourceManager: str): bool = all { - transactionManagerState == Init, + action TM::addPreparedResourceManager(resourceManager: str): bool = all { + TM::state == Init, messages.contains(RMPrepared(resourceManager)), - preparedResourceManagers' = preparedResourceManagers.union(Set(resourceManager)) + TM::preparedRMs' = TM::preparedRMs.union(Set(resourceManager)) } /// The transaction manager commits the transaction; enabled iff the /// transaction manager is in its initial state and every resource manager has /// sent an RMPrepared message. - action decideOnCommit = all { - transactionManagerState == Init, - preparedResourceManagers == resourceManagers, - transactionManagerState' = Done, + action TM::decideOnCommit = all { + TM::state == Init, + TM::preparedRMs == resourceManagers, + TM::state' = TMCommitted, messages' = messages.union(Set(Commit)) } /// The transaction manager spontaneously aborts the transaction - action decideOnAbort = all { - transactionManagerState == Init, - transactionManagerState' = Done, + action TM::decideOnAbort = all { + TM::state == Init, + TM::state' = TMAborted, messages' = messages.union(Set(Abort)) } - /* Resource Manager actions */ + /* Resource Manager (RM) actions */ /// A resource manager prepares - action prepare(resourceManager: str): bool = all { - resourceManagerStates.get(resourceManager) == Working, - resourceManagerStates' = resourceManagerStates.set(resourceManager, Prepared), + action RM::prepare(resourceManager: str): bool = all { + RM::states.get(resourceManager) == Working, + RM::states' = RM::states.set(resourceManager, Prepared), messages' = messages.union(Set(RMPrepared(resourceManager))) } /// A resource manager aborts, either spontaneously or because of an Abort message - action abort(resourceManager: str): bool = all { + action RM::abort(resourceManager: str): bool = all { or { // Resource manager chooses to abort - resourceManagerStates.get(resourceManager) == Working, + RM::states.get(resourceManager) == Working, // Resource manager receives an abort message from the transaction manager messages.contains(Abort), }, - resourceManagerStates' = resourceManagerStates.set(resourceManager, Aborted), + RM::states' = RM::states.set(resourceManager, Aborted), // There is no need to let others know that this resource manager aborted messages' = messages } // A resource manager commits due to a Commit message - action commit(resourceManager: str): bool = all { + action RM::commit(resourceManager: str): bool = all { messages.contains(Commit), - resourceManagerStates' = resourceManagerStates.set(resourceManager, Committed), - messages' = messages.union(Set(RMCommitted(resourceManager))) + RM::states' = RM::states.set(resourceManager, Committed), + messages' = messages } action step = any { // Resource manager actions all { nondet rm = resourceManagers.oneOf() - any { prepare(rm), abort(rm), commit(rm) }, - transactionManagerState' = transactionManagerState, - preparedResourceManagers' = preparedResourceManagers, + any { RM::prepare(rm), RM::abort(rm), RM::commit(rm) }, + TM::state' = TM::state, + TM::preparedRMs' = TM::preparedRMs, }, // Transaction manager decisions (commit or abort) all { - any { decideOnCommit, decideOnAbort }, - preparedResourceManagers' = preparedResourceManagers, - resourceManagerStates' = resourceManagerStates, + any { TM::decideOnCommit, TM::decideOnAbort }, + TM::preparedRMs' = TM::preparedRMs, + RM::states' = RM::states, }, // Transaction managers message consumption all { nondet rm = resourceManagers.oneOf() - addPreparedResourceManager(rm), - transactionManagerState' = transactionManagerState, - resourceManagerStates' = resourceManagerStates, + TM::addPreparedResourceManager(rm), + TM::state' = TM::state, + RM::states' = RM::states, messages' = messages, } } /// Two resource managers have not arrived at conflicting decisions val consistencyInv = tuples(resourceManagers, resourceManagers).forall(((r1, r2)) => - not(resourceManagerStates.get(r1) == Committed and resourceManagerStates.get(r2) == Aborted) + not(RM::states.get(r1) == Committed and RM::states.get(r2) == Aborted) ) } @@ -124,34 +120,34 @@ module two_phase_commit_3 { /// Compose two actions: send an RMPrepare message and consume it in the /// transaction manager run preparation(rm) = (all { - prepare(rm), - transactionManagerState' = transactionManagerState, - preparedResourceManagers' = preparedResourceManagers, + RM::prepare(rm), + TM::state' = TM::state, + TM::preparedRMs' = TM::preparedRMs, }).then(all { - addPreparedResourceManager(rm), - transactionManagerState' = transactionManagerState, - resourceManagerStates' = resourceManagerStates, + TM::addPreparedResourceManager(rm), + TM::state' = TM::state, + RM::states' = RM::states, messages' = messages, }) /// Compose several actions: The transaction manager decides to commit and /// each resource manager consumes its Commit message run commitment = (all { - decideOnCommit, - preparedResourceManagers' = preparedResourceManagers, - resourceManagerStates' = resourceManagerStates, + TM::decideOnCommit, + TM::preparedRMs' = TM::preparedRMs, + RM::states' = RM::states, }).then(all { - commit("rm1"), - transactionManagerState' = transactionManagerState, - preparedResourceManagers' = preparedResourceManagers, + RM::commit("rm1"), + TM::state' = TM::state, + TM::preparedRMs' = TM::preparedRMs, }).then(all { - commit("rm2"), - transactionManagerState' = transactionManagerState, - preparedResourceManagers' = preparedResourceManagers, + RM::commit("rm2"), + TM::state' = TM::state, + TM::preparedRMs' = TM::preparedRMs, }).then(all { - commit("rm3"), - transactionManagerState' = transactionManagerState, - preparedResourceManagers' = preparedResourceManagers, + RM::commit("rm3"), + TM::state' = TM::state, + TM::preparedRMs' = TM::preparedRMs, }) run successTest = init From 94b157ab390db0aa6ba4e3317658bd8fbebb9f1f Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 4 Dec 2023 08:27:29 -0500 Subject: [PATCH 067/388] Release v0.17.0 --- CHANGELOG.md | 9 +++++++++ quint/package-lock.json | 4 ++-- quint/package.json | 2 +- quint/src/version.ts | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c590d35e..02a05e100 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.17.0 -- 2023-12-04 + ### Added - When an input file only one module, it will be inferred as the main module (#1260) diff --git a/quint/package-lock.json b/quint/package-lock.json index ea6cc8d5b..d66e8796f 100644 --- a/quint/package-lock.json +++ b/quint/package-lock.json @@ -1,12 +1,12 @@ { "name": "@informalsystems/quint", - "version": "0.16.0", + "version": "0.17.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint", - "version": "0.16.0", + "version": "0.17.0", "license": "Apache 2.0", "dependencies": { "@grpc/grpc-js": "^1.8.14", diff --git a/quint/package.json b/quint/package.json index aa62d0ed6..7b842dc2c 100644 --- a/quint/package.json +++ b/quint/package.json @@ -1,6 +1,6 @@ { "name": "@informalsystems/quint", - "version": "0.16.0", + "version": "0.17.0", "description": "Core tool for the Quint specification language", "keywords": [ "temporal", diff --git a/quint/src/version.ts b/quint/src/version.ts index c65c1066d..284f13832 100644 --- a/quint/src/version.ts +++ b/quint/src/version.ts @@ -1,2 +1,2 @@ // Generated by genversion. -export const version = '0.16.0' +export const version = '0.17.0' From 5432659fd9428ea5810ca02bba6afc66434f9f10 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 4 Dec 2023 08:54:17 -0500 Subject: [PATCH 068/388] VSCode Release v0.12.0 --- vscode/quint-vscode/CHANGELOG.md | 9 +++++++++ vscode/quint-vscode/package-lock.json | 4 ++-- vscode/quint-vscode/package.json | 2 +- vscode/quint-vscode/server/package-lock.json | 18 +++++++++--------- vscode/quint-vscode/server/package.json | 4 ++-- 5 files changed, 23 insertions(+), 14 deletions(-) diff --git a/vscode/quint-vscode/CHANGELOG.md b/vscode/quint-vscode/CHANGELOG.md index 616b0a70b..97a588463 100644 --- a/vscode/quint-vscode/CHANGELOG.md +++ b/vscode/quint-vscode/CHANGELOG.md @@ -14,6 +14,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed ### Security +## v0.12.0 -- 2023-12-04 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + ## v0.11.0 -- 2023-11-20 ### Added diff --git a/vscode/quint-vscode/package-lock.json b/vscode/quint-vscode/package-lock.json index 595989342..c9bb1c311 100644 --- a/vscode/quint-vscode/package-lock.json +++ b/vscode/quint-vscode/package-lock.json @@ -1,12 +1,12 @@ { "name": "quint-vscode", - "version": "0.11.0", + "version": "0.12.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "quint-vscode", - "version": "0.11.0", + "version": "0.12.0", "hasInstallScript": true, "dependencies": { "vscode-languageclient": "^7.0.0" diff --git a/vscode/quint-vscode/package.json b/vscode/quint-vscode/package.json index f81ecb1a4..3e20a17c5 100644 --- a/vscode/quint-vscode/package.json +++ b/vscode/quint-vscode/package.json @@ -2,7 +2,7 @@ "name": "quint-vscode", "displayName": "Quint", "description": "Language support for Quint specifications", - "version": "0.11.0", + "version": "0.12.0", "publisher": "informal", "engines": { "vscode": "^1.52.0" diff --git a/vscode/quint-vscode/server/package-lock.json b/vscode/quint-vscode/server/package-lock.json index 61fca0374..2c19d25c0 100644 --- a/vscode/quint-vscode/server/package-lock.json +++ b/vscode/quint-vscode/server/package-lock.json @@ -1,15 +1,15 @@ { "name": "@informalsystems/quint-language-server", - "version": "0.11.0", + "version": "0.12.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint-language-server", - "version": "0.11.0", + "version": "0.12.0", "license": "Apache 2.0", "dependencies": { - "@informalsystems/quint": "^0.16.0", + "@informalsystems/quint": "^0.17.0", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" @@ -476,9 +476,9 @@ "dev": true }, "node_modules/@informalsystems/quint": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.16.0.tgz", - "integrity": "sha512-5581KQ7hKj8xMdNaJ7bssF4W3BrOO+tdFaTSueJwqHIE1UgTKqeC6CLCRLp1j+YDEk7w/LEUiY9rC4GiKjExtA==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.17.0.tgz", + "integrity": "sha512-R9o4Q64ktfCZlSm8fYOlpwN/V+vUvADKnSo6G+Qv6kut3DEbTUfgu4N+tyuRWa3M29FzXHidjB+eacOxMwLTrw==", "dependencies": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", @@ -7207,9 +7207,9 @@ "dev": true }, "@informalsystems/quint": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.16.0.tgz", - "integrity": "sha512-5581KQ7hKj8xMdNaJ7bssF4W3BrOO+tdFaTSueJwqHIE1UgTKqeC6CLCRLp1j+YDEk7w/LEUiY9rC4GiKjExtA==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.17.0.tgz", + "integrity": "sha512-R9o4Q64ktfCZlSm8fYOlpwN/V+vUvADKnSo6G+Qv6kut3DEbTUfgu4N+tyuRWa3M29FzXHidjB+eacOxMwLTrw==", "requires": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", diff --git a/vscode/quint-vscode/server/package.json b/vscode/quint-vscode/server/package.json index c7c1beaea..c8108aa0a 100644 --- a/vscode/quint-vscode/server/package.json +++ b/vscode/quint-vscode/server/package.json @@ -1,7 +1,7 @@ { "name": "@informalsystems/quint-language-server", "description": "Language Server for the Quint specification language", - "version": "0.11.0", + "version": "0.12.0", "author": "Informal Systems", "contributors": [ { @@ -43,7 +43,7 @@ "test/**/*.ts" ], "dependencies": { - "@informalsystems/quint": "^0.16.0", + "@informalsystems/quint": "^0.17.0", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" From 7af80227d819804b1fa05540258bd693f131adf6 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 4 Dec 2023 18:32:11 -0300 Subject: [PATCH 069/388] Add namespaces to effects referring to instantiated names --- quint/src/effects/inferrer.ts | 14 +++++- quint/src/effects/namespaces.ts | 63 +++++++++++++++++++++++++++ quint/test/effects/namespaces.test.ts | 16 +++++++ 3 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 quint/src/effects/namespaces.ts create mode 100644 quint/test/effects/namespaces.test.ts diff --git a/quint/src/effects/inferrer.ts b/quint/src/effects/inferrer.ts index 127620a49..37a8b99f0 100644 --- a/quint/src/effects/inferrer.ts +++ b/quint/src/effects/inferrer.ts @@ -38,6 +38,7 @@ import { getSignatures, standardPropagation } from './builtinSignatures' import { FreshVarGenerator } from '../FreshVarGenerator' import { effectToString } from './printing' import { zip } from 'lodash' +import { addNamespaces } from './namespaces' export type EffectInferenceResult = [Map, Map] @@ -366,7 +367,18 @@ export class EffectInferrer implements IRVisitor { } return this.fetchResult(id).map(e => { - return this.newInstance(e) + const effect = this.newInstance(e) + if (def.importedFrom?.kind === 'instance') { + // Names imported from instances might have effects that refer to + // names that are shared between multiple instances. To properly infer + // effects refering to those state variables, they need to be + // namespaced in a way that makes them different between different + // instances. For that, we use the namespaces attribute from lookup + // table definition, which contains the proper namespaces to identify + // unique names while flattening. + return addNamespaces(effect, def.namespaces ?? []) + } + return effect }) } } diff --git a/quint/src/effects/namespaces.ts b/quint/src/effects/namespaces.ts new file mode 100644 index 000000000..cc8cc6d97 --- /dev/null +++ b/quint/src/effects/namespaces.ts @@ -0,0 +1,63 @@ +/* ---------------------------------------------------------------------------------- + * Copyright 2023 Informal Systems + * Licensed under the Apache License, Version 2.0. + * See LICENSE in the project root for license information. + * --------------------------------------------------------------------------------- */ + +/** + * Updating effects with namespaces for state variables. To be used when a module with variables is instantiated. + * + * @author Gabriela Moreira + * + * @module + */ +import { Effect, Entity } from './base' + +/** + * Adds a namespace, in the format of the namespaces attribute in LookupDefinition, to all state variables in an effect. + * + * @param effect - The effect to add the namespaces to + * @param namespaces - The namespaces to add + * + * @return The effect with namespaces added to all state variables + */ +export function addNamespaces(effect: Effect, namespaces: string[]): Effect { + switch (effect.kind) { + case 'variable': { + return effect + } + case 'arrow': { + return { + ...effect, + params: effect.params.map(p => addNamespaces(p, namespaces)), + result: addNamespaces(effect.result, namespaces), + } + } + case 'concrete': { + return { + ...effect, + components: effect.components.map(c => ({ ...c, entity: addNamespacesToEntity(c.entity, namespaces) })), + } + } + } +} + +function addNamespacesToEntity(entity: Entity, namespaces: string[]): Entity { + switch (entity.kind) { + case 'variable': { + return entity + } + case 'union': { + return { ...entity, entities: entity.entities.map(p => addNamespacesToEntity(p, namespaces)) } + } + case 'concrete': { + return { + ...entity, + stateVariables: entity.stateVariables.map(v => ({ + ...v, + name: [...namespaces].reverse().concat(v.name).join('::'), + })), + } + } + } +} diff --git a/quint/test/effects/namespaces.test.ts b/quint/test/effects/namespaces.test.ts new file mode 100644 index 000000000..5bb508fc0 --- /dev/null +++ b/quint/test/effects/namespaces.test.ts @@ -0,0 +1,16 @@ +import { describe, it } from 'mocha' +import { assert } from 'chai' +import { effectToString } from '../../src/effects/printing' +import { parseEffectOrThrow } from '../../src/effects/parser' +import { addNamespaces } from '../../src/effects/namespaces' + +describe('addNamespace', () => { + it('adds namespaces to state variable names', () => { + const namespaces = ['Second', 'First'] + const effect = parseEffectOrThrow("Read['x'] & Update[e0, 'y']") + + const result = addNamespaces(effect, namespaces) + + assert.deepEqual(effectToString(result), "Read['First::Second::x'] & Update[e0, 'First::Second::y']") + }) +}) From 755fab6e2f7060a9420cfb9b8d7ccc3262cdbef6 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Tue, 5 Dec 2023 11:39:46 +0100 Subject: [PATCH 070/388] Move `debug` built-in to the `q::` namespace --- doc/builtin.md | 6 +++--- quint/io-cli-tests.md | 4 ++-- quint/src/builtin.qnt | 6 +++--- quint/src/effects/builtinSignatures.ts | 2 +- quint/src/ir/quintIr.ts | 2 +- quint/src/names/base.ts | 2 +- quint/src/runtime/impl/compilerImpl.ts | 19 ++++++++++--------- quint/test/runtime/compile.test.ts | 6 +++--- 8 files changed, 24 insertions(+), 23 deletions(-) diff --git a/doc/builtin.md b/doc/builtin.md index fbc2c3726..520baf810 100644 --- a/doc/builtin.md +++ b/doc/builtin.md @@ -908,9 +908,9 @@ action Next = x' = x + 1 run test = Init.then(all { Next, assert(x > 0) }) ``` -## `pure def debug: (str, a) => a` +## `pure def q::debug: (str, a) => a` -`debug(msg, value)` prints the given message and value to the console, +`q::debug(msg, value)` prints the given message and value to the console, separated by a space. It also returns the given value unchanged, @@ -920,7 +920,7 @@ so that it can be used directly within expressions. ``` var x: int ->>> (x' = 0).then(3.reps(i => x' = debug("new x:", x + 1))) +>>> (x' = 0).then(3.reps(i => x' = q::debug("new x:", x + 1))) > new x: 1 > new x: 2 > new x: 3 diff --git a/quint/io-cli-tests.md b/quint/io-cli-tests.md index 2d1662ad3..ab8fbe7aa 100644 --- a/quint/io-cli-tests.md +++ b/quint/io-cli-tests.md @@ -992,12 +992,12 @@ exit $exit_code >>> ``` -### Invoking `debug` in REPL prints values to stdout +### Invoking `q::debug` in REPL prints values to stdout ``` -echo 'debug("value:", { foo: 42, bar: "Hello, World!" })' | quint | tail -n +3 +echo 'q::debug("value:", { foo: 42, bar: "Hello, World!" })' | quint | tail -n +3 ``` diff --git a/quint/src/builtin.qnt b/quint/src/builtin.qnt index e38fa4203..0f39c3914 100644 --- a/quint/src/builtin.qnt +++ b/quint/src/builtin.qnt @@ -835,7 +835,7 @@ module builtin { /// ``` action assert(p): (bool) => bool - /// `debug(msg, value)` prints the given message and value to the console, + /// `q::debug(msg, value)` prints the given message and value to the console, /// separated by a space. /// /// It also returns the given value unchanged, @@ -845,13 +845,13 @@ module builtin { /// /// ``` /// var x: int - /// >>> (x' = 0).then(3.reps(i => x' = debug("new x:", x + 1))) + /// >>> (x' = 0).then(3.reps(i => x' = q::debug("new x:", x + 1))) /// > new x: 1 /// > new x: 2 /// > new x: 3 /// true /// ``` - pure def debug(msg, value): (str, a) => a + pure def q::debug(msg, value): (str, a) => a // /// `List(e0, ..., en)` is a list of values `e0`, ..., `en`. // /// diff --git a/quint/src/effects/builtinSignatures.ts b/quint/src/effects/builtinSignatures.ts index 0b87f6429..228e2d91d 100644 --- a/quint/src/effects/builtinSignatures.ts +++ b/quint/src/effects/builtinSignatures.ts @@ -222,7 +222,7 @@ const otherOperators = [ { name: 'reps', effect: parseAndQuantify('(Pure, (Read[r1]) => Read[r2] & Update[u]) => Read[r1, r2] & Update[u]') }, { name: 'fail', effect: propagateComponents(['read', 'update'])(1) }, { name: 'assert', effect: propagateComponents(['read'])(1) }, - { name: 'debug', effect: propagateComponents(['read'])(2) }, + { name: 'q::debug', effect: propagateComponents(['read'])(2) }, { name: 'ite', effect: parseAndQuantify('(Read[r1], Read[r2] & Update[u], Read[r3] & Update[u]) => Read[r1, r2, r3] & Update[u]'), diff --git a/quint/src/ir/quintIr.ts b/quint/src/ir/quintIr.ts index c7ba00761..b7f11cb0a 100644 --- a/quint/src/ir/quintIr.ts +++ b/quint/src/ir/quintIr.ts @@ -140,7 +140,6 @@ export const builtinOpCodes = [ 'chooseSome', 'concat', 'contains', - 'debug', 'enabled', 'eq', 'eventually', @@ -193,6 +192,7 @@ export const builtinOpCodes = [ 'put', 'q::test', 'q::testOnce', + 'q::debug', 'range', 'replaceAt', 'reps', diff --git a/quint/src/names/base.ts b/quint/src/names/base.ts index fc26943ef..144a8437f 100644 --- a/quint/src/names/base.ts +++ b/quint/src/names/base.ts @@ -196,7 +196,6 @@ export const builtinNames = [ 'reps', 'fail', 'assert', - 'debug', 'orKeep', 'mustChange', 'enabled', @@ -236,4 +235,5 @@ export const builtinNames = [ 'difference', 'matchVariant', 'variant', + 'q::debug', ] diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 496664b68..1be60b3b5 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -914,15 +914,6 @@ export class CompilerVisitor implements IRVisitor { this.translateAllOrThen(app) break - case 'debug': - this.applyFun(app.id, 2, (msg, value) => { - let columns = terminalWidth() - let valuePretty = format(columns, 0, prettyQuintEx(value.toQuintEx(zerog))) - console.log('>', msg.toStr(), valuePretty.toString()) - return just(value) - }) - break - case 'fail': this.applyFun(app.id, 1, result => { return just(rv.mkBool(!result.toBool())) @@ -953,6 +944,16 @@ export class CompilerVisitor implements IRVisitor { this.testOnce(app.id) break + case 'q::debug': + this.applyFun(app.id, 2, (msg, value) => { + let columns = terminalWidth() + let valuePretty = format(columns, 0, prettyQuintEx(value.toQuintEx(zerog))) + console.log('>', msg.toStr(), valuePretty.toString()) + return just(value) + }) + break + + // standard unary operators that are not handled by REPL case 'allLists': case 'chooseSome': diff --git a/quint/test/runtime/compile.test.ts b/quint/test/runtime/compile.test.ts index 733d3fe4e..1d86cafc3 100644 --- a/quint/test/runtime/compile.test.ts +++ b/quint/test/runtime/compile.test.ts @@ -978,11 +978,11 @@ describe('compiling specs to runtime values', () => { evalVarAfterCall('n', 'run1', input).mapRight(m => assert.fail(`Expected an error, found: ${m}`)) }) - it('debug', () => { - // `debug(s, a)` returns `a` + it('q::debug', () => { + // `q::debug(s, a)` returns `a` const input = dedent( `var n: int - |run run1 = (n' = 1).then(n' = debug("n plus one", n + 1)) + |run run1 = (n' = 1).then(n' = q::debug("n plus one", n + 1)) ` ) From db48556355eb246a473f7a62deec289288592d89 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Tue, 5 Dec 2023 11:43:32 +0100 Subject: [PATCH 071/388] Fix missing namespace in signature --- quint/src/types/builtinSignatures.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/types/builtinSignatures.ts b/quint/src/types/builtinSignatures.ts index 37aa21e2f..5e2b2499e 100644 --- a/quint/src/types/builtinSignatures.ts +++ b/quint/src/types/builtinSignatures.ts @@ -125,7 +125,7 @@ const otherOperators = [ { name: 'reps', type: '(int, int => bool) => bool' }, { name: 'fail', type: '(bool) => bool' }, { name: 'assert', type: '(bool) => bool' }, - { name: 'debug', type: '(str, a) => a' }, + { name: 'q::debug', type: '(str, a) => a' }, ] function uniformArgsWithResult(argsType: string, resultType: string): Signature { From a95e4956e5d3d090184fcb73e0e126d475f6198c Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Tue, 5 Dec 2023 11:45:30 +0100 Subject: [PATCH 072/388] Formatting --- quint/src/runtime/impl/compilerImpl.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 1be60b3b5..9f720e1d3 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -953,7 +953,6 @@ export class CompilerVisitor implements IRVisitor { }) break - // standard unary operators that are not handled by REPL case 'allLists': case 'chooseSome': From 23daf370b23123e99c388a32d4b73bb604849d28 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 5 Dec 2023 10:13:59 -0300 Subject: [PATCH 073/388] Add integration test using exisiting `intances.qnt` example --- examples/language-features/instances.qnt | 21 +++++++++++++++++++-- quint/cli-tests.md | 5 +++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/examples/language-features/instances.qnt b/examples/language-features/instances.qnt index e46043a44..34ce66d9d 100644 --- a/examples/language-features/instances.qnt +++ b/examples/language-features/instances.qnt @@ -7,6 +7,13 @@ module A { pure def g(b) = not(b) } +module withVar { + const N: int + var counter: int + + action init = counter' = 0 +} + module instances { pure val MyY = true pure val z = "world" @@ -24,6 +31,16 @@ module instances { // the above is equivalent to TLA+'s instance: // A2 == INSTANCE A WITH x <- 15, y <- MyY - action init = true - action step = true + // module withVar has state variables + import withVar(N=1) as V1 + import withVar(N=2) as V2 + + action init = all { V1::init, V2::init } + action step = all { + V1::counter' = V1::counter + 1, + V2::counter' = V2::counter + 2, + } + + // The two variables should increment independently + val inv = V1::counter == 0 or V2::counter > V1::counter } diff --git a/quint/cli-tests.md b/quint/cli-tests.md index a722e7ce2..d06b2c363 100644 --- a/quint/cli-tests.md +++ b/quint/cli-tests.md @@ -99,6 +99,11 @@ This example was pointing to Paxos. Now it does not typecheck. quint typecheck ../examples/language-features/instances.qnt +### OK on run instances + + + quint run ../examples/language-features/instances.qnt --invariant=inv + ### OK on parse instancesFrom From 8d37d1a9d01ee3e7afa735fa38f580896ec6c9a2 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 5 Dec 2023 10:15:24 -0300 Subject: [PATCH 074/388] Fix bug in `run` where some specs were incorrectly parsed after adding extra defs --- quint/src/simulation.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/simulation.ts b/quint/src/simulation.ts index 7282b6d2e..61e998c1d 100644 --- a/quint/src/simulation.ts +++ b/quint/src/simulation.ts @@ -97,7 +97,7 @@ export function compileAndRun( ] // Construct the modules' code, adding the extra definitions to the main module - const newMainModuleCode = code.slice(mainStart, mainEnd - 1) + extraDefs.join('\n') + const newMainModuleCode = code.slice(mainStart, mainEnd - 1) + '\n' + extraDefs.join('\n') const codeWithExtraDefs = code.slice(0, mainStart) + newMainModuleCode + code.slice(mainEnd) const recorder = newTraceRecorder(options.verbosity, options.rng) From d12f6c637359181f013de0850b1c32e6132b0205 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 5 Dec 2023 10:25:14 -0300 Subject: [PATCH 075/388] Add CHANGELOG entry --- CHANGELOG.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 723db2c8b..da964170b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,10 +8,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED ### Added + +- Add a `debug` built-in function for printing values to stdout (#1266) + ### Changed ### Deprecated ### Removed ### Fixed + +- The effect checker now distinguished variables from different instances (#1290) + ### Security ## v0.17.0 -- 2023-12-04 @@ -20,7 +26,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - When an input file only one module, it will be inferred as the main module (#1260) - Sum types are now supported when running `verify` (#1034) -- Add a `debug` built-in function for printing values to stdout (#1266) ### Changed ### Deprecated From 6f39212e0494d8611809ef6ea740e3a987e47d2e Mon Sep 17 00:00:00 2001 From: Gabriela Moreira Date: Tue, 5 Dec 2023 12:40:50 -0300 Subject: [PATCH 076/388] Apply suggestions from code review Co-authored-by: Shon Feder --- CHANGELOG.md | 2 +- quint/src/effects/namespaces.ts | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index da964170b..160e6defc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Removed ### Fixed -- The effect checker now distinguished variables from different instances (#1290) +- The effect checker now distinguishes variables from different instances (#1290) ### Security diff --git a/quint/src/effects/namespaces.ts b/quint/src/effects/namespaces.ts index cc8cc6d97..851d559f6 100644 --- a/quint/src/effects/namespaces.ts +++ b/quint/src/effects/namespaces.ts @@ -51,11 +51,12 @@ function addNamespacesToEntity(entity: Entity, namespaces: string[]): Entity { return { ...entity, entities: entity.entities.map(p => addNamespacesToEntity(p, namespaces)) } } case 'concrete': { + const pathPrefix = [...namespaces].reduce((a, b) => `${a}::${b}`) return { ...entity, stateVariables: entity.stateVariables.map(v => ({ ...v, - name: [...namespaces].reverse().concat(v.name).join('::'), + name: `${pathPrefix}::${v.name}`, })), } } From fb7ddafa71c308cf6f57df2a2c2efdb76cc7aa5b Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 5 Dec 2023 12:59:07 -0300 Subject: [PATCH 077/388] Fix reduce and add guard clauses --- quint/src/effects/namespaces.ts | 6 +++++- quint/src/flattening/flattener.ts | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/quint/src/effects/namespaces.ts b/quint/src/effects/namespaces.ts index 851d559f6..04086addd 100644 --- a/quint/src/effects/namespaces.ts +++ b/quint/src/effects/namespaces.ts @@ -51,7 +51,11 @@ function addNamespacesToEntity(entity: Entity, namespaces: string[]): Entity { return { ...entity, entities: entity.entities.map(p => addNamespacesToEntity(p, namespaces)) } } case 'concrete': { - const pathPrefix = [...namespaces].reduce((a, b) => `${a}::${b}`) + if (namespaces.length === 0) { + return entity + } + + const pathPrefix = namespaces.reduce((a, b) => `${b}::${a}`) return { ...entity, stateVariables: entity.stateVariables.map(v => ({ diff --git a/quint/src/flattening/flattener.ts b/quint/src/flattening/flattener.ts index af5a32da4..f644eb1af 100644 --- a/quint/src/flattening/flattener.ts +++ b/quint/src/flattening/flattener.ts @@ -207,9 +207,9 @@ class Flattener implements IRVisitor { } export function getNamespaceForDef(def: LookupDefinition): string | undefined { - if (!def.namespaces) { + if (!def.namespaces || def.namespaces.length === 0) { return } - return [...def.namespaces].reverse().join('::') + return def.namespaces.reduce((a, b) => `${b}::${a}`) } From f791cc60bb9eaae227fc6f18e350230839a0228d Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 5 Dec 2023 12:59:31 -0300 Subject: [PATCH 078/388] Add test to `effects/inferrer.test.ts` --- quint/test/effects/inferrer.test.ts | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/quint/test/effects/inferrer.test.ts b/quint/test/effects/inferrer.test.ts index cba870e1d..188e635cc 100644 --- a/quint/test/effects/inferrer.test.ts +++ b/quint/test/effects/inferrer.test.ts @@ -266,4 +266,28 @@ describe('inferEffects', () => { message: 'Expected [x] and [] to be the same', }) }) + + it('differentiates variables from different instances', () => { + const baseDefs = ['const N: int', 'const S: Set[int]', 'var x: int'] + + const text = ` + module base { ${baseDefs.join('\n')} } + module wrapper { + import base(N=1) as B1 + import base(N=2) as B2 + val a = B1::x + B2::x + }` + const { modules, table } = parseMockedModule(text) + + const inferrer = new EffectInferrer(table) + inferrer.inferEffects(modules[0].declarations) + const [errors, effects] = inferrer.inferEffects(modules[1].declarations) + assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) + + const def = modules[1].declarations.find(decl => isDef(decl) && decl.name === 'a')! + + const expectedEffect = "Read['wrapper::B1::x', 'wrapper::B2::x']" + + assert.deepEqual(effectSchemeToString(effects.get(def.id)!), expectedEffect) + }) }) From 69983ce3917b982b0df22a723b8c061ee76a1a0a Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 5 Dec 2023 13:12:51 -0300 Subject: [PATCH 079/388] Release v0.17.1 --- CHANGELOG.md | 11 ++++++++++- quint/package-lock.json | 4 ++-- quint/package.json | 2 +- quint/src/version.ts | 2 +- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 160e6defc..258dac21a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,9 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.17.1 -- 2023-12-05 + ### Added -- Add a `debug` built-in function for printing values to stdout (#1266) +- Add a `q::debug` built-in function for printing values to stdout (#1266) ### Changed ### Deprecated diff --git a/quint/package-lock.json b/quint/package-lock.json index d66e8796f..75108d964 100644 --- a/quint/package-lock.json +++ b/quint/package-lock.json @@ -1,12 +1,12 @@ { "name": "@informalsystems/quint", - "version": "0.17.0", + "version": "0.17.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint", - "version": "0.17.0", + "version": "0.17.1", "license": "Apache 2.0", "dependencies": { "@grpc/grpc-js": "^1.8.14", diff --git a/quint/package.json b/quint/package.json index 7b842dc2c..4e7543db0 100644 --- a/quint/package.json +++ b/quint/package.json @@ -1,6 +1,6 @@ { "name": "@informalsystems/quint", - "version": "0.17.0", + "version": "0.17.1", "description": "Core tool for the Quint specification language", "keywords": [ "temporal", diff --git a/quint/src/version.ts b/quint/src/version.ts index 284f13832..f84500743 100644 --- a/quint/src/version.ts +++ b/quint/src/version.ts @@ -1,2 +1,2 @@ // Generated by genversion. -export const version = '0.17.0' +export const version = '0.17.1' From c808554022466c4a7a315bdd39545449865e66bd Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 5 Dec 2023 15:52:06 -0300 Subject: [PATCH 080/388] VSCode Release v0.12.1 --- vscode/quint-vscode/CHANGELOG.md | 9 +++++++++ vscode/quint-vscode/package-lock.json | 4 ++-- vscode/quint-vscode/package.json | 2 +- vscode/quint-vscode/server/package-lock.json | 18 +++++++++--------- vscode/quint-vscode/server/package.json | 4 ++-- 5 files changed, 23 insertions(+), 14 deletions(-) diff --git a/vscode/quint-vscode/CHANGELOG.md b/vscode/quint-vscode/CHANGELOG.md index 97a588463..46e8d8863 100644 --- a/vscode/quint-vscode/CHANGELOG.md +++ b/vscode/quint-vscode/CHANGELOG.md @@ -14,6 +14,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed ### Security +## v0.12.1 -- 2023-12-05 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + ## v0.12.0 -- 2023-12-04 ### Added diff --git a/vscode/quint-vscode/package-lock.json b/vscode/quint-vscode/package-lock.json index c9bb1c311..8d8ba8568 100644 --- a/vscode/quint-vscode/package-lock.json +++ b/vscode/quint-vscode/package-lock.json @@ -1,12 +1,12 @@ { "name": "quint-vscode", - "version": "0.12.0", + "version": "0.12.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "quint-vscode", - "version": "0.12.0", + "version": "0.12.1", "hasInstallScript": true, "dependencies": { "vscode-languageclient": "^7.0.0" diff --git a/vscode/quint-vscode/package.json b/vscode/quint-vscode/package.json index 3e20a17c5..010dba7f2 100644 --- a/vscode/quint-vscode/package.json +++ b/vscode/quint-vscode/package.json @@ -2,7 +2,7 @@ "name": "quint-vscode", "displayName": "Quint", "description": "Language support for Quint specifications", - "version": "0.12.0", + "version": "0.12.1", "publisher": "informal", "engines": { "vscode": "^1.52.0" diff --git a/vscode/quint-vscode/server/package-lock.json b/vscode/quint-vscode/server/package-lock.json index 2c19d25c0..07a07d165 100644 --- a/vscode/quint-vscode/server/package-lock.json +++ b/vscode/quint-vscode/server/package-lock.json @@ -1,15 +1,15 @@ { "name": "@informalsystems/quint-language-server", - "version": "0.12.0", + "version": "0.12.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint-language-server", - "version": "0.12.0", + "version": "0.12.1", "license": "Apache 2.0", "dependencies": { - "@informalsystems/quint": "^0.17.0", + "@informalsystems/quint": "^0.17.1", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" @@ -476,9 +476,9 @@ "dev": true }, "node_modules/@informalsystems/quint": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.17.0.tgz", - "integrity": "sha512-R9o4Q64ktfCZlSm8fYOlpwN/V+vUvADKnSo6G+Qv6kut3DEbTUfgu4N+tyuRWa3M29FzXHidjB+eacOxMwLTrw==", + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.17.1.tgz", + "integrity": "sha512-cur9QRFl6pqQ05xODWKxiOS2CSN7pRQX48emz2g2kRb1XC//YGFSuE4BOXKmDQSl5Gey9tdXn0YPdP6Uw+ncLg==", "dependencies": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", @@ -7207,9 +7207,9 @@ "dev": true }, "@informalsystems/quint": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.17.0.tgz", - "integrity": "sha512-R9o4Q64ktfCZlSm8fYOlpwN/V+vUvADKnSo6G+Qv6kut3DEbTUfgu4N+tyuRWa3M29FzXHidjB+eacOxMwLTrw==", + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.17.1.tgz", + "integrity": "sha512-cur9QRFl6pqQ05xODWKxiOS2CSN7pRQX48emz2g2kRb1XC//YGFSuE4BOXKmDQSl5Gey9tdXn0YPdP6Uw+ncLg==", "requires": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", diff --git a/vscode/quint-vscode/server/package.json b/vscode/quint-vscode/server/package.json index c8108aa0a..cc9524a0d 100644 --- a/vscode/quint-vscode/server/package.json +++ b/vscode/quint-vscode/server/package.json @@ -1,7 +1,7 @@ { "name": "@informalsystems/quint-language-server", "description": "Language Server for the Quint specification language", - "version": "0.12.0", + "version": "0.12.1", "author": "Informal Systems", "contributors": [ { @@ -43,7 +43,7 @@ "test/**/*.ts" ], "dependencies": { - "@informalsystems/quint": "^0.17.0", + "@informalsystems/quint": "^0.17.1", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" From 29b013ceba79f93487dd00122580cc74bae59b9c Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 5 Dec 2023 22:47:49 -0500 Subject: [PATCH 081/388] Add a comparison operator to toList --- examples/spells/rareSpells.qnt | 65 +++++++++++++++++++++++++++++++--- 1 file changed, 60 insertions(+), 5 deletions(-) diff --git a/examples/spells/rareSpells.qnt b/examples/spells/rareSpells.qnt index f00ebddf2..b89a378e2 100644 --- a/examples/spells/rareSpells.qnt +++ b/examples/spells/rareSpells.qnt @@ -9,6 +9,23 @@ * so the others would see how to use it. */ module rareSpells { + + /// The type of orderings between comparable things + type Ordering = + | EQ + | LT + | GT + + /// Comparison of integers + pure def intCompare(__a: int, __b:int): Ordering = { + if (__a < __b) + { LT } + else if (__a > __b) + { GT } + else + { EQ } + } + /// /// Compute the sum of the values over all entries in a map. /// @@ -24,13 +41,50 @@ module rareSpells { assert(Map(2 -> -4, 4 -> 2).mapValuesSum() == -2), } + /// Assuming `__l` is sorted according to `__cmp`, returns a list with the element `__x` + /// insterted in order. + /// + /// If `__l` is not sorted, `__x` will be inserted after the first element less than + /// or equal to it. + /// + /// - @param __l a sorted list + /// - @param __x an element to be inserted + /// - @param __cmp an operator defining an `Ordering` of the elemnts of type `a` + /// - @returns a sorted list that includes `__x` + pure def sortedListInsert(__l: List[a], __x: a, __cmp: (a, a) => Ordering): List[a] = { + // We need to track whether __x has been inserted, and the accumulator for the new list + val __init = { is_inserted: false, acc: List() } + + val __result = __l.foldl(__init, (__state, __y) => + if (__state.is_inserted) + { ...__state, acc: __state.acc.append(__y) } + else + match __cmp(__x, __y) { + | GT => { ...__state, acc: __state.acc.append(__y) } + | _ => { is_inserted: true, acc: __state.acc.append(__x).append(__y) } + }) + + if (not(__result.is_inserted)) + // If __x was not inserted, it was GT than every other element, so it goes at the end + __result.acc.append(__x) + else + __result.acc + } + + run sortedListInsertTest = all { + assert(List().sortedListInsert(3, intCompare) == List(3)), + assert(List(1,2,4).sortedListInsert(3, intCompare) == List(1,2,3,4)), + assert(List(4,1,2).sortedListInsert(3, intCompare) == List(3,4,1,2)), + } + //// Returns a list of all elements of a set. //// The ordering will be arbitrary. //// //// - @param __set a set - //// - @returns a list of all elements of __set - pure def toList(__set: Set[a]): List[a] = { - __set.fold(List(), (__l, __e) => __l.append(__e)) + //// - @param __cmp an ordering over the elements of the set + //// - @returns a sorted list of all elements of __set + pure def toList(__set: Set[a], __cmp: (a, a) => Ordering): List[a] = { + __set.fold(List(), (__l, __e) => __l.sortedListInsert(__e, __cmp)) } //// Returns a set of the elements in the list. @@ -43,10 +97,11 @@ module rareSpells { run toListAndSetTest = all { - assert(Set(3, 2, 1).toList().toSet() == Set(1, 2, 3)), + assert(Set(3, 2, 1).toList(intCompare).toSet() == Set(1, 2, 3)), assert(List(2,3,1).toSet() == Set(1, 2, 3)), assert(List(2,3,1).toSet() == List(3,2,1).toSet()), - assert(toList(Set()) == List()), + assert(Set(2,3,1).toList(intCompare) == Set(3,1,2).toList(intCompare)), + assert(toList(Set(), intCompare) == List()), assert(toSet(List()) == Set()) } } From b484cab60ec2535f995ac404ff116e860e3d19ce Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 6 Dec 2023 14:10:43 -0500 Subject: [PATCH 082/388] Add comment about motives for Ordering --- examples/spells/rareSpells.qnt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/spells/rareSpells.qnt b/examples/spells/rareSpells.qnt index b89a378e2..9c54a8982 100644 --- a/examples/spells/rareSpells.qnt +++ b/examples/spells/rareSpells.qnt @@ -11,6 +11,9 @@ module rareSpells { /// The type of orderings between comparable things + // Follows https://hackage.haskell.org/package/base-4.19.0.0/docs/Data-Ord.html#t:Ordering + // and we think there are likely benefits to using 3 constant values rather than the more + // common integer range in Apalache. type Ordering = | EQ | LT From 53982b7d02df4f0c5bbe7beb40c4cfda045c2ef5 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 6 Dec 2023 17:07:23 -0500 Subject: [PATCH 083/388] Add `mapToSet` to commonSpells --- examples/spells/commonSpells.qnt | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/examples/spells/commonSpells.qnt b/examples/spells/commonSpells.qnt index 49a8c5f42..f89e33eb0 100644 --- a/examples/spells/commonSpells.qnt +++ b/examples/spells/commonSpells.qnt @@ -32,19 +32,27 @@ module commonSpells { assert(mapValuesSet(Map(1 -> 2, 2 -> 3, 3 -> 2)) == Set(2, 3)), } - /// Get the list of values from a map. + /// Convert a map into a set of pairs coordinating its keys and values /// - /// - @param __map a map from type a to type b - /// - @returns the list of all values in the map - pure def mapValuesList(__map: a -> b): List[b] = { - __map.keys().fold([], (__list, __k) => __list.append(__map.get(__k))) + /// - @param __map a map + /// - @returns the set of pairs coordinating the map's keys with its values + /// + /// ### Examples + /// + /// ``` + /// val accountValues: Map[str, int] = Map("a" -> 1, "b" -> 1, "c" -> "1") + /// val sumOfValues: int = accountValues.mapToSet().fold(0, (acc, kv) => acc + kv._2) + /// assert(sumOfValues == 3) + /// ``` + pure def mapToSet(__map: a -> b): Set[(a, b)] = { + __map.keys().fold(Set(), (__acc, __k) => __acc.union(Set((__k, __map.get(__k))))) } - run mapValuesListTest = all { - assert(mapValuesList(Map()) == []), - assert(mapValuesList(Map(1 -> 2, 2 -> 3)) == [2, 3]), - assert(mapValuesList(Map(1 -> 2, 2 -> 3, 3 -> 2)) == [2,3,2]), + run mapToSetTest = all { + assert(mapToSet(Map()) == Set()), + assert(mapToSet(Map(1 -> 2, 2 -> 3)) == Set((1, 2), (2, 3))), + assert(Map("a" -> 1, "b" -> 1, "c" -> 1).mapToSet().fold(0, (__acc, __kv) => __acc + __kv._2) == 3), } -} \ No newline at end of file +} From 197b43bc2a54456d930328ac857f633afa3c92aa Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 7 Dec 2023 08:00:11 -0500 Subject: [PATCH 084/388] Update examples/spells/commonSpells.qnt Co-authored-by: Gabriela Moreira --- examples/spells/commonSpells.qnt | 2 -- 1 file changed, 2 deletions(-) diff --git a/examples/spells/commonSpells.qnt b/examples/spells/commonSpells.qnt index f89e33eb0..e78c806da 100644 --- a/examples/spells/commonSpells.qnt +++ b/examples/spells/commonSpells.qnt @@ -53,6 +53,4 @@ module commonSpells { assert(mapToSet(Map(1 -> 2, 2 -> 3)) == Set((1, 2), (2, 3))), assert(Map("a" -> 1, "b" -> 1, "c" -> 1).mapToSet().fold(0, (__acc, __kv) => __acc + __kv._2) == 3), } - - } From 2d707dc76857f8bb9ab3c3ab6136c40bfb14b356 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 7 Dec 2023 15:47:38 -0500 Subject: [PATCH 085/388] Add module factored version of two phase --- .../two_phase_commit_modules.qnt | 208 ++++++++++++++++++ 1 file changed, 208 insertions(+) create mode 100644 examples/classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt diff --git a/examples/classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt new file mode 100644 index 000000000..a52fb9b69 --- /dev/null +++ b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt @@ -0,0 +1,208 @@ +// -*- mode: Bluespec; -*- + +/* This specification stems from the specification of the two phase protocol + by Leslie Lamport: + + https://github.com/tlaplus/Examples/blob/master/specifications/transaction_commit/TwoPhase.tla */ + +module message { + type T = + | Abort + | Commit + | Prepared(str) + + var channel: Set[T] + + action init: bool = { + channel' = Set() + } + + action stutter = all { + channel' = channel + } + + action send(m: T): bool = { + channel' = channel.union(Set(m)) + } + +} + +module resource_managers { + import message as msg + + type Status = | Working | Prepared | Committed | Aborted + var statuses : str -> Status + + action init(rms: Set[str]): bool = { + statuses' = rms.mapBy(r => Working) + } + + action stutter = all { + statuses' = statuses + } + + action prepare(resourceManager: str): bool = all { + statuses.get(resourceManager) == Working, + statuses' = statuses.set(resourceManager, Prepared), + msg::send(msg::Prepared(resourceManager)) + } + + action abort(resourceManager: str): bool = all { + or { + // Resource manager is working, and chooses to abort spontaneously + statuses.get(resourceManager) == Working, + // Resource manager receives an abort message from the transaction manager + msg::channel.contains(msg::Abort), + }, + statuses' = statuses.set(resourceManager, Aborted), + // There is no need to let others know that this resource manager aborted + msg::stutter, + } + + + // A resource manager commits due to a Commit message + action commit(resourceManager: str): bool = all { + msg::channel.contains(msg::Commit), + statuses' = statuses.set(resourceManager, Committed), + msg::stutter, + } + + + def consistencyInv(resourceManagers) = + tuples(resourceManagers, resourceManagers) + .forall(((r1, r2)) => + not( statuses.get(r1) == Committed + and + statuses.get(r2) == Aborted)) +} + +module transaction_manager { + import message as msg + + type Status = | TMInitiated | TMCommitted | TMAborted + + var status : Status + /// The set of resource managers from which the transaction manager has + /// received msg::Prepared messages + var preparedRMs : Set[str] + + action init: bool = all { + status' = TMInitiated, + preparedRMs' = Set(), + } + + action stutter = all { + status' = status, + preparedRMs' = preparedRMs, + } + + /// The transaction manager receives a RMPrepared(rm) message from the resource manager rm + action addPreparedResourceManager(resourceManager: str): bool = all { + status == TMInitiated, + msg::channel.contains(msg::Prepared(resourceManager)), + preparedRMs' = preparedRMs.union(Set(resourceManager)), + status' = status, + } + + /// The transaction manager commits the transaction; enabled iff the + /// transaction manager is in its initial state and every resource manager has + /// sent an RMPrepared message. + action decideOnCommit(resourceManagers) = all { + status == TMInitiated, + preparedRMs == resourceManagers, + status' = TMCommitted, + preparedRMs' = preparedRMs, + msg::send(msg::Commit) + } + + /// The transaction manager spontaneously aborts the transaction + action decideOnAbort = all { + status == TMInitiated, + status' = TMAborted, + preparedRMs' = preparedRMs, + msg::send(msg::Abort) + } +} + +module two_phase_commit { + const resourceManagers: Set[str] + + import resource_managers as RM + import transaction_manager as TM + import message as msg + + action step = any { + // Resource manager actions + all { + nondet rm = resourceManagers.oneOf() + any { RM::prepare(rm), + RM::abort(rm), + RM::commit(rm) }, + TM::stutter + }, + // Transaction manager decisions (commit or abort) + all { + any { TM::decideOnCommit(resourceManagers), + TM::decideOnAbort }, + RM::stutter, + }, + // Transaction managers message consumption + all { + nondet rm = resourceManagers.oneOf() + TM::addPreparedResourceManager(rm), + RM::stutter, + msg::stutter + } + } + + action init = all { + msg::init, + TM::init, + RM::init(resourceManagers), + } + + /// Two resource managers have not arrived at conflicting decisions + val inv = RM::consistencyInv(resourceManagers) +} + +module two_phase_commit_tests { + import two_phase_commit(resourceManagers = Set("rm1", "rm2", "rm3")).* + + import resource_managers as RM + import transaction_manager as TM + import message as msg + + /// Compose two actions: send an RMPrepare message and consume it in the + /// transaction manager + run preparation(rm) = (all { + RM::prepare(rm), + TM::stutter, + }).then(all { + TM::addPreparedResourceManager(rm), + RM::stutter, + msg::stutter, + }) + + /// Compose several actions: The transaction manager decides to commit and + /// each resource manager consumes its Commit message + run commitment = (all { + TM::decideOnCommit(resourceManagers), + RM::stutter + }).then(all { + RM::commit("rm1"), + TM::stutter + }).then(all { + RM::commit("rm2"), + TM::stutter + }).then(all { + RM::commit("rm3"), + TM::stutter + }) + + run successTest = init.then(step).then(step) + // run successTest = init + // .then(preparation("rm1")) + // .then(preparation("rm2")) + // .then(preparation("rm3")) + // .then(commitment) +} From bb56ba9a25a95cf8921ca532e050f36133032dcd Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Mon, 11 Dec 2023 12:04:33 +0100 Subject: [PATCH 086/388] remove the outdated examples --- examples/cosmos/bank/bank-mini-sdk.qnt | 368 ------------------------ examples/cosmos/bank/bank-mini.qnt | 378 ------------------------- 2 files changed, 746 deletions(-) delete mode 100644 examples/cosmos/bank/bank-mini-sdk.qnt delete mode 100644 examples/cosmos/bank/bank-mini.qnt diff --git a/examples/cosmos/bank/bank-mini-sdk.qnt b/examples/cosmos/bank/bank-mini-sdk.qnt deleted file mode 100644 index 5b4d2a236..000000000 --- a/examples/cosmos/bank/bank-mini-sdk.qnt +++ /dev/null @@ -1,368 +0,0 @@ -/** - * This is a minimized protocol specification of the bank module - * that is tuned for an efficient presentation. For a more detailed version, - * see bank.qnt. - * - * Igor Konnov, Informal Systems, 2023 - */ -module bank { - // namespace bits { - type Addr = str - type Int64 = int - type Int256 = int - /// the maximum amount value in the SDK (note 256 instead of 255!) - val MAX_INT256 = 2^256 - 1 - // the range of 256-bit integers in the SDK - pure def isInt256(i: int): bool = -2^256 <= i and i < 2^256 - // a coin with denominations attached - type Coin = { denom: str, amount: Int256 } - // Cosmos SDK coins are sorted arrays. We simply use Quint maps. - type Coins = str -> Int256 - // } - - // Account balances - type Balance = { address: Addr, coins: Coins } - - /// Parameters of the bank module - type Params = { - // whether coin send is enabled for specific denominations - sendEnabled: Set[{ denom: str, enabled: bool }], - // whether coin send is enabled by default - defaultSendEnabled: bool, - } - - /// All possible addresses, a small set for testing. - /// In Q1, it will be a parameter! - val ADDR = Set("alice", "bob", "charlie", "eve", "null") - /// Blocked addresses, a small set for testing (a parameter in a full spec). - /// In Q1, it will be a parameter! - val BLOCKED = Set("eve") - - // The part of the key-value store read by the bank or written by the bank. - // In contrast to the Cosmos SDK in Go, we encapsulate the view of the - // context available to the bank in this special record. - type BankCtx = { - // accessed via AccountKeeper - accounts: Set[Addr], - // the balances are the essential part of the bank module - balances: Addr -> Coins, - // module parameters - params: Params, - } - - // An output produced by Keeper computations - type BankOut = { - isError: bool, - ctx: BankCtx, - } - - // FUNCTIONAL LAYER - - // ViewKeeper { - /// `GetAllBalances` returns all the account balances for the given account address. - /// SDK: `func (k BaseViewKeeper) GetAllBalances(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins` - pure def getAllBalances(ctx: BankCtx, addr: Addr): Coins = { - // SDK: >= 18 function calls, >= 5 files, >= 171 lines of code - // Cognitive overload? - if (ctx.balances.keys().contains(addr)) { - ctx.balances.get(addr) - } else { - Map() - } - } - - /// `ValidateBalance` should only be called upon genesis state. - /// SDK `ValidateBalance(ctx sdk.Context, addr sdk.AccAddress) error` - pure def validateBalance(ctx: BankCtx, addr: Addr): bool = and { - ctx.accounts.contains(addr), - val coins = getAllBalances(ctx, addr) - coins.keys().forall(denom => coins.get(denom) > 0), - // SKIPPED: logic of vesting accounts that are initialized in genesis - } - // } // ViewKeeper - - // SendKeeper { - /// `SendCoins` transfers amt coins from a sending account to a receiving account. - /// An error is returned upon failure. - /// - /// In our specification, `sendCoins` does not update the context in place, - /// but it returns a new context. - /// `isError == true` on error or panic. - /// SDK `SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error` - pure def sendCoins(ctx: BankCtx, - fromAddr: Addr, toAddr: Addr, amt: Coins): BankOut = { - // NOTE on SDK: if Coins are constructed with NewCoins, they must be positive. - // However, if they are constructed another way, there is no precondition. - // Safely subtract the coins from `fromAddr` and add them to `toAddr`. - val fromCoins = getAllBalances(ctx, fromAddr) - if (amt.keys().exists(d => - not(d.in(fromCoins.keys())) or fromCoins.get(d) < amt.get(d))) { - // some denominations do not exist on `fromAddr`, or there is not enough funds - { isError: true, ctx: ctx } - } else { - // x/bank invariants prohibit persistence of zero balances - // clean zero balances - pure def getOr0(coins: Coins, d: str): int = { - if (d.in(coins.keys())) coins.get(d) else 0 - } - val positiveDenoms = fromCoins.keys().filter(d => fromCoins.get(d) > getOr0(amt, d)) - val subCoins = positiveDenoms.mapBy(d => fromCoins.get(d) - getOr0(amt, d)) - // add coins to toAddr: the tricky part is that the denominations may differ - val toCoins = getAllBalances(ctx, toAddr) - // extend the toCoins and amt with zeroes over the joint denominations - val jointDenoms = toCoins.keys().union(amt.keys()) - // since toCoins and amt held positive values, their sums must be positive too - val addCoins = jointDenoms.mapBy(d => getOr0(toCoins, d) + getOr0(amt, d)) - if (addCoins.keys().exists(d => addCoins.get(d) > MAX_INT256)) { - // overflow, SDK panics - { isError: true, ctx: ctx } - } else { - // add `toAddr` to the accounts, if it did not exist - val newAccounts = ctx.accounts.union(Set(toAddr)) - val newBalances = - if (fromAddr == toAddr) { - ctx.balances - } else { - // Update the balance of `fromAddr` with subCoins. - val newBalancesSub = ctx.balances.set(fromAddr, subCoins) - // Since `toAddr` may be a new account, extend the map, if needed - newBalancesSub.put(toAddr, addCoins) - } - // return the result - { - isError: false, - ctx: ctx.with("balances", newBalances).with("accounts", newAccounts), - } - } - } - } - - /// IsSendEnabledCoin returns the current SendEnabled status of the provided coin's denom - /// SDK: `IsSendEnabledCoin(ctx sdk.Context, coin sdk.Coin) bool` - pure def isSendEnabledCoin(ctx: BankCtx, coin: Coin): bool = { - val found = ctx.params.sendEnabled.filter(p => coin.denom == p.denom) - if (found != Set()) { - found.exists(p => p.enabled) - } else { - ctx.params.defaultSendEnabled - } - } - - /// `IsSendEnabledCoins` checks the coins provide and returns an `ErrSendDisabled` if - /// any of the coins are not configured for sending. Returns `nil` if sending is enabled - /// for all provided coin. - /// SDK: `IsSendEnabledCoins(ctx sdk.Context, coins ...sdk.Coin) error` - pure def isSendEnabledCoins(ctx: BankCtx, coins: Set[Coin]): str = { - if (coins.forall(c => isSendEnabledCoin(ctx, c))) { - "" - } else { - "ErrSendDisabled" - } - } - // } // SendKeeper - - // END OF THE FUNCTIONAL LAYER - - // STATE MACHINE - /* - ---> init (balances, accounts) [-- send -->] (balances', accounts') [-- send -->] ... - */ - - // machine { - // managed by the account keeper - var accounts: Set[Addr] - // managed by the bank keeper - var balances: Addr -> Coins - - // A helper function: It indicates the user's intent to write a precondition, - // which should hold true, whenever an action is called. - def require(cond) = cond - - // Tests instantiate parameters with fixed values (later, parameterized). - val PARAMS = { - sendEnabled: Set( - { denom: "atom", enabled: true }, - { denom: "proton", enabled: true } - ), - defaultSendEnabled: false - } - - // Tests instantiate denominations with fixed values (later, parameterized). - val DENOMS = Set("atom", "proton", "photon") - - // Initialize the state machine. Atm, the initializer is a mock. - action init = { - val accs = ADDR.exclude(Set("null")) - val bals = Map( - "alice" -> Map("atom" -> 30, "proton" -> 20, "photon" -> 2000), - "bob" -> Map("atom" -> 1) - ) - // validate the balances at the genesis time - val bankIn = { accounts: accs, balances: bals, params: PARAMS } - all { - require(accs.forall(a => validateBalance(bankIn, a))), - // initialize the state - accounts' = accs, - balances' = bals, - } - } - - // handler of MsgSend of x/bank - // https://docs.cosmos.network/v0.45/modules/bank/03_messages.html - action send(fromAddr: Addr, toAddr: Addr, coins: Coins): bool = { - val oldCtx = { - accounts: accounts, balances: balances, params: PARAMS - } - // Send the coins via the keeper. - // The message handler does validation and fails a transaction, - // if it does not pass validation. For the moment, we simply require - // the parameters to pass validation, for the action to succeed. - // In the future, we may want to save failed transactions. - all { - require(coins.keys().forall(d => coins.get(d) > 0)), - require(isSendEnabledCoins(oldCtx, - coins.keys().map(d => { denom: d, amount: coins.get(d) })) == ""), - require(not(BLOCKED.contains(toAddr))), - val result = sendCoins(oldCtx, fromAddr, toAddr, coins) - all { - require(not(result.isError)), - balances' = result.ctx.balances, - accounts' = result.ctx.accounts, - } - } - } - - action step = { - // at the moment, we execute only one action, so no "any" is used - // TODO: make a case for more than one denomination - nondet denom = oneOf(DENOMS) - // Note that the probability of randomly picking an amount that - // will not fail in `send` is quite small. - // Hence, we need more targeted tests (see below). - nondet amount = (-(2^256)).to(2^256 - 1).oneOf() - nondet fromAddr = oneOf(ADDR) - nondet toAddr = oneOf(ADDR) - send(fromAddr, toAddr, Map(denom -> amount)) - } - // } - - // END OF THE STATE MACHINE - - // UNIT TESTS + PBT TESTS - - // all addresses but "null" have an associated account in the key/value store - val ACCOUNTS = ADDR.exclude(Set("null")) - - // a simple context for testing - val CONTEXT = { - accounts: ACCOUNTS, - balances: Map( - "alice" -> Map("atom" -> 17, "nonatom" -> 2), - "bob" -> Map("atom" -> 0) - ), - params: { - sendEnabled: Set( - { denom: "atom", enabled: true }, - { denom: "proton", enabled: true } - ), - defaultSendEnabled: false - } - } - - // An auxilliary action that keeps all variables unchanged. - // In the future, such a change would be computed automatically. - action keepVars = all { - balances' = balances, - accounts' = accounts, - } - - // test that validateBalance is working as expected - run validateBalanceTest = { - init - .then(all { - assert(validateBalance(CONTEXT, "alice")), - assert(not(validateBalance(CONTEXT, "null"))), - keepVars, - }) - } - - // test that a simple `send` goes through - run sendOkTest = { - init - .then(send("alice", "bob", Map("atom" -> 3))) - .then(all { - assert(balances.get("alice").get("atom") == 27), - assert(balances.get("bob").get("atom") == 4), - keepVars, - }) - } - - // test that `send` fails when sending a token with send disabled - run sendNotEnabledErrTest = { - init - .then(send("alice", "bob", Map("photon" -> 3))) - .fail() - } - - // test that multiple denominations can be sent at once - run sendTwoOkTest = { - init - .then(send("alice", "bob", Map("atom" -> 3, "proton" -> 11))) - .then(all { - assert(balances.get("alice").get("atom") == 27), - assert(balances.get("alice").get("proton") == 9), - assert(balances.get("bob").get("atom") == 4), - assert(balances.get("bob").get("proton") == 11), - keepVars, - }) - } - - // a test similar to property-based testing that randomly probes send - // custom initializer that picks some balances for several denominations - action initBoxed = all { - nondet amts1 = Set("atom").setOfMaps(to(0, 15)).oneOf() - nondet amts2 = Set("proton").setOfMaps(to(0, 15)).oneOf() - nondet amts3 = Set("atom", "proton").setOfMaps(to(0, 15)).oneOf() - nondet amts4 = Set("atom", "photon").setOfMaps(to(0, 15)).oneOf() - nondet bals = ADDR.setOfMaps(Set(amts1, amts2, amts3, amts4)).oneOf() - all { - balances' = bals, - accounts' = bals.keys().exclude(Set("null")), - } - } - // custom send that picks some randomly picks some tokens to transfer - action sendBoxed = { - // pick some denominations - nondet denoms = DENOMS.powerset().oneOf() - // Since denoms may be empty, oneOf() may complain. Redefine the empty set. - nondet someDenoms = if (denoms == Set()) Set("atom") else denoms - // pick some amounts - nondet coins = someDenoms.setOfMaps(to(-5, 5)).oneOf() - // pick the addresses - nondet addrFrom = ADDR.oneOf() - nondet addrTo = ADDR.oneOf() - send(addrFrom, addrTo, coins) - } - - // this is one of the basic invariants of the bank module - val nonNegativeSupplyInv = - balances.keys().forall(a => - val coins = balances.get(a) - coins.keys().forall(d => coins.get(d) >= 0) - ) - - // a single point random test - run sendRandomTest = { - initBoxed - .then(sendBoxed) - .then(all { - assert(nonNegativeSupplyInv), - keepVars - }) - } - - // If you'd like to run this test for multiple data points, - // you can do it in REPL as follows: - // .load bank-mini.qnt::bank - // _test(10000, 3, "initBoxed", "sendBoxed", "nonNegativeSupplyInv") -} diff --git a/examples/cosmos/bank/bank-mini.qnt b/examples/cosmos/bank/bank-mini.qnt deleted file mode 100644 index 7655280a7..000000000 --- a/examples/cosmos/bank/bank-mini.qnt +++ /dev/null @@ -1,378 +0,0 @@ -/** - * This is a minimized protocol specification of the bank module - * that is tuned for an efficient presentation. For a more detailed version, - * see bank.qnt. - * - * Igor Konnov, Informal Systems, 2023 - */ -module bank { - // namespace bits { - type Addr = str - type Int64 = int - type Int256 = int - /// the maximum amount value in the SDK (note 256 instead of 255!) - val MAX_INT256 = 2^256 - 1 - // the range of 256-bit integers in the SDK - pure def isInt256(i: int): bool = -2^256 <= i and i < 2^256 - // a coin with denominations attached - type Coin = { denom: str, amount: Int256 } - // Cosmos SDK coins are sorted arrays. We simply use Quint maps. - type Coins = str -> Int256 - // } - - // Account balances - type Balance = { address: Addr, coins: Coins } - - /// Parameters of the bank module - type Params = { - // whether coin send is enabled for specific denominations - sendEnabled: Set[{ denom: str, enabled: bool }], - // whether coin send is enabled by default - defaultSendEnabled: bool, - } - - /// All possible addresses, a small set for testing. - /// In Q1, it will be a parameter! - val ADDR = Set("alice", "bob", "charlie", "eve", "null") - /// Blocked addresses, a small set for testing (a parameter in a full spec). - /// In Q1, it will be a parameter! - val BLOCKED = Set("eve") - - // The part of the key-value store read by the bank or written by the bank. - // In contrast to the Cosmos SDK in Go, we encapsulate the view of the - // context available to the bank in this special record. - type BankCtx = { - // accessed via AccountKeeper - accounts: Set[Addr], - // the balances are the essential part of the bank module - balances: Addr -> Coins, - // module parameters - params: Params, - } - - // An output produced by Keeper computations - type BankOut = { - isError: bool, - ctx: BankCtx, - } - - // FUNCTIONAL LAYER - - // ViewKeeper { - /// `GetAllBalances` returns all the account balances for the given account address. - /// SDK: `func (k BaseViewKeeper) GetAllBalances(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins` - pure def getAllBalances(ctx: BankCtx, addr: Addr): Coins = { - if (ctx.balances.keys().contains(addr)) { - ctx.balances.get(addr) - } else { - Map() - } - } - - /// `ValidateBalance` should only be called upon genesis state. - /// SDK `ValidateBalance(ctx sdk.Context, addr sdk.AccAddress) error` - pure def validateBalance(ctx: BankCtx, addr: Addr): bool = and { - ctx.accounts.contains(addr), - val coins = getAllBalances(ctx, addr) - coins.keys().forall(denom => coins.get(denom) > 0), - // SKIPPED: logic of vesting accounts that are initialized in genesis - } - // } // ViewKeeper - - // SendKeeper { - /// `SendCoins` transfers amt coins from a sending account to a receiving account. - /// An error is returned upon failure. - /// - /// In our specification, `sendCoins` does not update the context in place, - /// but it returns a new context. `isError == true` on error or panic. - /// SDK `SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error` - pure def sendCoins(ctx: BankCtx, - fromAddr: Addr, toAddr: Addr, amt: Coins): BankOut = { - // NOTE on SDK: if Coins are constructed with NewCoins, they must be positive. - // However, if they are constructed another way, there is no precondition. - // Safely subtract the coins from `fromAddr` and add them to `toAddr`. - val fromCoins = getAllBalances(ctx, fromAddr) - if (amt.keys().exists(d => - not(d.in(fromCoins.keys())) or fromCoins.get(d) < amt.get(d))) { - // some denominations do not exist on `fromAddr`, or there is not enough funds - { isError: true, ctx: ctx } - } else { - // x/bank invariants prohibit persistence of zero balances - // clean zero balances - pure def getOr0(coins: Coins, d: str): int = { - if (d.in(coins.keys())) coins.get(d) else 0 - } - val positiveDenoms = fromCoins.keys().filter(d => fromCoins.get(d) > getOr0(amt, d)) - val subCoins = positiveDenoms.mapBy(d => fromCoins.get(d) - getOr0(amt, d)) - // add coins to toAddr: the tricky part is that the denominations may differ - val toCoins = getAllBalances(ctx, toAddr) - // extend the toCoins and amt with zeroes over the joint denominations - val jointDenoms = toCoins.keys().union(amt.keys()) - // since toCoins and amt held positive values, their sums must be positive too - val addCoins = jointDenoms.mapBy(d => getOr0(toCoins, d) + getOr0(amt, d)) - if (addCoins.keys().exists(d => addCoins.get(d) > MAX_INT256)) { - // overflow, SDK panics - { isError: true, ctx: ctx } - } else { - // add `toAddr` to the accounts, if it did not exist - val newAccounts = ctx.accounts.union(Set(toAddr)) - val newBalances = - if (fromAddr == toAddr) { - ctx.balances - } else { - // Update the balance of `fromAddr` with subCoins. - val newBalancesSub = ctx.balances.set(fromAddr, subCoins) - // Since `toAddr` may be a new account, extend the map, if needed - newBalancesSub.put(toAddr, addCoins) - } - // return the result - { - isError: false, - ctx: ctx.with("balances", newBalances).with("accounts", newAccounts), - } - } - } - } - - /// IsSendEnabledCoin returns the current SendEnabled status of the provided coin's denom - /// SDK: `IsSendEnabledCoin(ctx sdk.Context, coin sdk.Coin) bool` - pure def isSendEnabledCoin(ctx: BankCtx, coin: Coin): bool = { - val found = ctx.params.sendEnabled.filter(p => coin.denom == p.denom) - if (found != Set()) { - found.exists(p => p.enabled) - } else { - ctx.params.defaultSendEnabled - } - } - - /// `IsSendEnabledCoins` checks the coins provide and returns an `ErrSendDisabled` if - /// any of the coins are not configured for sending. Returns `nil` if sending is enabled - /// for all provided coin. - /// SDK: `IsSendEnabledCoins(ctx sdk.Context, coins ...sdk.Coin) error` - pure def isSendEnabledCoins(ctx: BankCtx, coins: Set[Coin]): str = { - if (coins.forall(c => isSendEnabledCoin(ctx, c))) { - "" - } else { - "ErrSendDisabled" - } - } - // } // SendKeeper - - // END OF THE FUNCTIONAL LAYER - - // STATE MACHINE - // ---> init (balances, accounts) [-- send -->] (balances', accounts') [-- send -->] ... - - // managed by the account keeper - var accounts: Set[Addr] - // managed by the bank keeper - var balances: Addr -> Coins - - // A helper function: It indicates the user's intent to write a precondition, - // which should hold true, whenever an action is called. - def require(cond) = cond - - // Tests instantiate parameters with fixed values (later, parameterized). - val PARAMS = { - sendEnabled: Set( - { denom: "atom", enabled: true }, - { denom: "proton", enabled: true } - ), - defaultSendEnabled: false - } - - // Tests instantiate denominations with fixed values (later, parameterized). - val DENOMS = Set("atom", "proton", "photon", "foocoin") - - // Initialize the state machine. Atm, the initializer is a mock. - action init = { - val accs = ADDR.exclude(Set("null")) - val bals = Map( - "alice" -> Map("atom" -> 30, "proton" -> 20, "photon" -> 2000), - "bob" -> Map("atom" -> 1) - ) - // validate the balances at the genesis time - val bankIn = { accounts: accs, balances: bals, params: PARAMS } - all { - require(accs.forall(a => validateBalance(bankIn, a))), - // initialize the state - accounts' = accs, - balances' = bals, - } - } - - // handler of MsgSend of x/bank - // https://docs.cosmos.network/v0.45/modules/bank/03_messages.html - action send(fromAddr: Addr, toAddr: Addr, coins: Coins): bool = { - val oldCtx = { - accounts: accounts, balances: balances, params: PARAMS - } - // Send the coins via the keeper. - // The message handler does validation and fails a transaction, - // if it does not pass validation. For the moment, we simply require - // the parameters to pass validation, for the action to succeed. - // In the future, we may want to save failed transactions. - all { - require(coins.keys().forall(d => coins.get(d) > 0)), - require(isSendEnabledCoins(oldCtx, - coins.keys().map(d => { denom: d, amount: coins.get(d) })) == ""), - require(not(BLOCKED.contains(toAddr))), - val result = sendCoins(oldCtx, fromAddr, toAddr, coins) - all { - require(not(result.isError)), - balances' = result.ctx.balances, - accounts' = result.ctx.accounts, - } - } - } - - action step = { - // at the moment, we execute only one action, so no "any" is used - // TODO: make a case for more than one denomination - nondet denom = oneOf(DENOMS) - // Note that the probability of randomly picking an amount that - // will not fail in `send` is quite small. - // Hence, we need more targeted tests (see below). - nondet amount = (-(2^256)).to(2^256 - 1).oneOf() - nondet fromAddr = oneOf(ADDR) - nondet toAddr = oneOf(ADDR) - send(fromAddr, toAddr, Map(denom -> amount)) - } - - // END OF THE STATE MACHINE - - // UNIT TESTS + PBT TESTS - - // all addresses but "null" have an associated account in the key/value store - val ACCOUNTS = ADDR.exclude(Set("null")) - - // a simple context for testing - val CONTEXT = { - accounts: ACCOUNTS, - balances: Map( - "alice" -> Map("atom" -> 17, "nonatom" -> 2), - "bob" -> Map("atom" -> 0) - ), - params: { - sendEnabled: Set( - { denom: "atom", enabled: true }, - { denom: "proton", enabled: true } - ), - defaultSendEnabled: false - } - } - - // An auxilliary action that keeps all variables unchanged. - // In the future, such a change would be computed automatically. - action keepVars = all { - balances' = balances, - accounts' = accounts, - } - - // test that validateBalance is working as expected - run validateBalanceTest = { - init - .then(all { - assert(validateBalance(CONTEXT, "alice")), - assert(not(validateBalance(CONTEXT, "null"))), - keepVars, - }) - } - - // test that a simple `send` goes through - run sendOkTest = { - init - .then(send("alice", "bob", Map("atom" -> 3))) - .then(all { - assert(balances.get("alice").get("atom") == 27), - assert(balances.get("bob").get("atom") == 4), - keepVars, - }) - } - - // test that `send` fails when sending a token with send disabled - run sendNotEnabledErrTest = { - init - .then(send("alice", "bob", Map("photon" -> 3))) - .fail() - } - - // test that multiple denominations can be sent at once - run sendTwoOkTest = { - init - .then(send("alice", "bob", Map("atom" -> 3, "proton" -> 11))) - .then(all { - assert(balances.get("alice").get("atom") == 27), - assert(balances.get("alice").get("proton") == 9), - assert(balances.get("bob").get("atom") == 4), - assert(balances.get("bob").get("proton") == 11), - keepVars, - }) - } - - // a test similar to property-based testing that randomly probes send - // custom initializer that picks some balances for several denominations - action initBoxed = all { - nondet amts1 = Set("atom").setOfMaps(to(0, 15)).oneOf() - nondet amts2 = Set("proton").setOfMaps(to(0, 15)).oneOf() - nondet amts3 = Set("atom", "proton").setOfMaps(to(0, 15)).oneOf() - nondet amts4 = Set("atom", "photon").setOfMaps(to(0, 15)).oneOf() - nondet bals = ADDR.setOfMaps(Set(amts1, amts2, amts3, amts4)).oneOf() - all { - balances' = bals, - accounts' = bals.keys().exclude(Set("null")), - } - } - // custom send that picks some randomly picks some tokens to transfer - action sendBoxed = { - // pick some denominations - // FIXME: Sometimes, denoms is still empty: - // https://github.com/informalsystems/quint/issues/545 - nondet denoms = DENOMS.powerset().exclude(Set()).oneOf() - all { - denoms.size() > 0, - // pick some amounts - nondet coins = denoms.setOfMaps(to(-5, 5)).oneOf() - // pick the addresses - nondet addrFrom = ADDR.oneOf() - nondet addrTo = ADDR.oneOf() - send(addrFrom, addrTo, coins) - } - } - - // this is one of the basic invariants of the bank module - val nonNegativeSupplyInv = - balances.keys().forall(a => - val coins = balances.get(a) - coins.keys().forall(d => coins.get(d) >= 0) - ) - - // a single point random test - run sendRandomTest = { - initBoxed - .then(sendBoxed) - .then(all { - assert(nonNegativeSupplyInv), - keepVars - }) - } - - // The test sendNotEnoughBalanceTest from: - // https://github.com/cosmos/cosmos-sdk/blob/497dc2cb78bb8df597fd63555f97b2f98cc7f2d0/x/bank/app_test.go#LL135 - run sendNotEnoughBalanceTest = { - val addrs = Set("addr1") - action myInit = all { - accounts' = addrs, - balances' = addrs.mapBy(a => Map("foocoin" -> 67)), - } - - init - .then(send("addr1", "addr2", Map("foocoin" -> 100))) - .fail() - } - - // If you'd like to run this test for multiple data points, - // you can do it in REPL as follows: - // .load bank-mini.qnt::bank - // _test(10000, 3, "initBoxed", "sendBoxed", "nonNegativeSupplyInv") -} From ead3c898dc8e621fa44aee9eb12d1ecefb122145 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Mon, 11 Dec 2023 14:51:50 +0100 Subject: [PATCH 087/388] Detect import paths that only differ in capitalization (#1295) * detect different case filenames * update changelog * fix the comment * fix formatting * Update quint/src/parsing/quintParserFrontend.ts Co-authored-by: Thomas Pani * Update quint/cli-tests.md Co-authored-by: Gabriela Moreira * test the output more precisely --------- Co-authored-by: Thomas Pani Co-authored-by: Gabriela Moreira --- CHANGELOG.md | 3 ++ quint/io-cli-tests.md | 29 +++++++++++++++ quint/src/parsing/quintParserFrontend.ts | 46 +++++++++++++++++++----- quint/src/quintError.ts | 4 ++- quint/testFixture/_1060case.qnt | 4 +++ 5 files changed, 77 insertions(+), 9 deletions(-) create mode 100644 quint/testFixture/_1060case.qnt diff --git a/CHANGELOG.md b/CHANGELOG.md index 258dac21a..394c73199 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Deprecated ### Removed ### Fixed + +- Detect import paths that only differ in capitalization (#1295) + ### Security ## v0.17.1 -- 2023-12-05 diff --git a/quint/io-cli-tests.md b/quint/io-cli-tests.md index ab8fbe7aa..232a4653b 100644 --- a/quint/io-cli-tests.md +++ b/quint/io-cli-tests.md @@ -1087,3 +1087,32 @@ rm xTest.itf.json ``` [{"#meta":{"index":0},"x":{"tag":"None","value":{}}},{"#meta":{"index":1},"x":{"tag":"Some","value":{"#bigint":"1"}}},{"#meta":{"index":2},"x":{"tag":"Some","value":{"#bigint":"2"}}}] ``` + +### FAIL on parsing filenames with different casing + + + +``` +output=$(quint parse testFixture/_1060case.qnt 2>&1) +exit_code=$? +# assuming that our test setup does not introduce spaces in filenames +echo "$output" | sed -e 's#[^ ]*/\([^/]*\).qnt# HOME/\1.qnt#g' +exit $exit_code +``` + + +``` + HOME/_1060case.qnt:3:3 - error: [QNT408] Importing two files that only differ in case: HOME/_1022importee2.qnt vs. HOME/_1022IMPORTEE2.qnt. Choose one way. +3: import importee2 as I from "_1022IMPORTEE2" + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + HOME/_1060case.qnt:2:3 - error: [QNT405] Module 'importee2' not found +2: import importee2 as i from "_1022importee2" + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + HOME/_1060case.qnt:3:3 - error: [QNT405] Module 'importee2' not found +3: import importee2 as I from "_1022IMPORTEE2" + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: parsing failed +``` diff --git a/quint/src/parsing/quintParserFrontend.ts b/quint/src/parsing/quintParserFrontend.ts index 5d75fc28e..513b232ff 100644 --- a/quint/src/parsing/quintParserFrontend.ts +++ b/quint/src/parsing/quintParserFrontend.ts @@ -159,19 +159,29 @@ export function parsePhase2sourceResolution( mainPath: SourceLookupPath, mainPhase1Result: ParserPhase1 ): ParseResult { - // we accumulate the source map over all files here + // We accumulate the source map over all files here. let sourceMap = new Map(mainPhase1Result.sourceMap) - // The list of modules that have not been been processed yet. - // Each element of the list carries the module to be processed and the trail - // of sources that led to this module. - // The construction is similar to the worklist algorithm: + + // The list of modules that have not been been processed yet. Each element of + // the list carries the module to be processed and the trail of sources that + // led to this module. The construction is similar to the worklist algorithm: // https://en.wikipedia.org/wiki/Reaching_definition#Worklist_algorithm const worklist: [QuintModule, SourceLookupPath[]][] = mainPhase1Result.modules.map(m => [m, [mainPath]]) // Collect modules produced by every source. const sourceToModules = new Map() + // Collect visited paths, so we don't have to load the same file twice. + // Some filesystems are case-insensitive, whereas some are case sensitive. + // To prevent errors like #1194 from happening, we store both the + // original filename and its lower case version. If the user uses the same + // filename in different registers, we report an error. Otherwise, it would be + // quite hard to figure out tricky naming errors in the case-sensitive + // filesystems. We could also collect hashes of the files instead of + // lowercase filenames, but this looks a bit like overkill at the moment. + const visitedPaths = new Map() // Assign a rank to every module. The higher the rank, // the earlier the module should appear in the list of modules. sourceToModules.set(mainPath.normalizedPath, mainPhase1Result.modules) + visitedPaths.set(mainPath.normalizedPath.toLocaleLowerCase(), mainPath.normalizedPath) while (worklist.length > 0) { const [importer, pathTrail] = worklist.splice(0, 1)[0] for (const decl of importer.declarations) { @@ -179,9 +189,28 @@ export function parsePhase2sourceResolution( const importerPath = pathTrail[pathTrail.length - 1] const stemPath = sourceResolver.stempath(importerPath) const importeePath = sourceResolver.lookupPath(stemPath, decl.fromSource + '.qnt') - if (sourceToModules.has(importeePath.normalizedPath)) { - // The source has been parsed already. - continue + const importeeNormalized = importeePath.normalizedPath + const importeeLowerCase = importeeNormalized.toLowerCase() + if (visitedPaths.has(importeeLowerCase)) { + if (visitedPaths.get(importeeLowerCase) === importeeNormalized) { + // simply skip this import without parsing the same file twice + continue + } else { + // The source has been parsed already, but: + // - Either the same file is imported via paths in different cases, or + // - Two different files are imported via case-sensitive paths. + // Ask the user to disambiguate. + const original = + [...visitedPaths.values()].find( + name => name.toLowerCase() === importeeLowerCase && name !== importeeLowerCase + ) ?? importeeLowerCase + const err: QuintError = { + code: 'QNT408', + message: `Importing two files that only differ in case: ${original} vs. ${importeeNormalized}. Choose one way.`, + reference: decl.id, + } + return { ...mainPhase1Result, errors: mainPhase1Result.errors.concat([err]), sourceMap } + } } // try to load the source code const errorOrText = sourceResolver.load(importeePath) @@ -202,6 +231,7 @@ export function parsePhase2sourceResolution( worklist.push([m, pathTrail.concat([importeePath])]) }) sourceToModules.set(importeePath.normalizedPath, newModules) + visitedPaths.set(importeeLowerCase, importeeNormalized) sourceMap = new Map([...sourceMap, ...parseResult.sourceMap]) } } diff --git a/quint/src/quintError.ts b/quint/src/quintError.ts index 81a8edd41..1df66fad0 100644 --- a/quint/src/quintError.ts +++ b/quint/src/quintError.ts @@ -73,7 +73,9 @@ export type ErrorCode = | 'QNT406' /* QNT407: Cannot import self */ | 'QNT407' - /* QNT500: Unitialized constant */ + /* QNT408: Case-sensitive filenames */ + | 'QNT408' + /* QNT500: Uninitialized constant */ | 'QNT500' /* QNT501: Internal compiler error */ | 'QNT501' diff --git a/quint/testFixture/_1060case.qnt b/quint/testFixture/_1060case.qnt new file mode 100644 index 000000000..a88d15b2f --- /dev/null +++ b/quint/testFixture/_1060case.qnt @@ -0,0 +1,4 @@ +module caseSensitive { + import importee2 as i from "_1022importee2" + import importee2 as I from "_1022IMPORTEE2" +} From 4e5af37b19432c880f1ef4d926f21e2c260cfea7 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Mon, 11 Dec 2023 17:10:28 +0100 Subject: [PATCH 088/388] improve the spec a bit --- examples/cosmos/bank/bank.qnt | 8 ++- examples/cosmos/bank/bankTest.qnt | 55 ++++++++++++++--- examples/cosmos/bank/cosmos-bank.md | 91 ++++++++++++++++++++++++----- 3 files changed, 128 insertions(+), 26 deletions(-) diff --git a/examples/cosmos/bank/bank.qnt b/examples/cosmos/bank/bank.qnt index 124c8c379..59391d399 100644 --- a/examples/cosmos/bank/bank.qnt +++ b/examples/cosmos/bank/bank.qnt @@ -44,8 +44,11 @@ module bank { address: str, coins: Coins, } - // An input of a multiparty transfer - type Output = Input + // An output of a multiparty transfer + type Output = { + address: str, + coins: Coins, + } // the portion of the context that is accessed by the bank module type BankCtx = { // block time (needed by vesting accounts) @@ -77,7 +80,6 @@ module bank { Map() } } - /// `ValidateBalance` should only be called upon genesis state. /// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/view.go#L202 pure def ViewKeeper::ValidateBalance(ctx: BankCtx, addr: Addr): bool = and { diff --git a/examples/cosmos/bank/bankTest.qnt b/examples/cosmos/bank/bankTest.qnt index dbb256680..3a6b57464 100644 --- a/examples/cosmos/bank/bankTest.qnt +++ b/examples/cosmos/bank/bankTest.qnt @@ -3,15 +3,24 @@ module bankTest { // the state of the machine that tests the logic // Total supply of coins per denomination - var Supply: Denom -> Int256 + var supply: Denom -> Int256 // Balances for each address - var Balances: Addr -> Coins + var balances: Addr -> Coins + + // state transitions of the machine + // initialize the state machine + action init = all { + // limit the total supply of burgers and bananas to 10_000 + supply' = Set("banana", "burger").mapBy(d => 10_000), + // the king has it all + balances' = Set("king").mapBy(a => Set("banana", "burger").mapBy(d => 10_000)) + } // protocol invariants // sum up amounts over all balances for a given denomination - def SumForDenom(denom: Denom): Int256 = { - Balances.keys().fold(0, (sum, addr) => { - val coins = Balances.get(addr) + def sumForDenom(denom: Denom): Int256 = { + balances.keys().fold(0, (sum, addr) => { + val coins = balances.get(addr) if (denom.in(coins.keys())) { sum + coins.get(denom) } else { @@ -21,7 +30,39 @@ module bankTest { } // The total Supply of the network is equal to the sum of all coins from the account - val TotalSupplyInv = { - Supply.keys().forall(denom => (SumForDenom(denom) == Supply.get(denom))) + val totalSupplyInv = { + supply.keys().forall(denom => (sumForDenom(denom) == supply.get(denom))) + } + + // tests + run getAllBalancesTest = { + init + .then( + val ctx = stateToCtx(0) + val kings = ViewKeeper::GetAllBalances(ctx, "king") + val donkeys = ViewKeeper::GetAllBalances(ctx, "donkeykong") + all { + assert(kings.keys() == Set("banana", "burger")), + assert(kings.get("banana") == 10_000), + assert(kings.get("burger") == 10_000), + assert(donkeys.keys() == Set()), + // do not change the state + balances' = balances, + supply' = supply, + } + ) + } + + // a helper operator that produces a context from a state + def stateToCtx(time: int): BankCtx = { + { + blockTime: time, + accounts: balances.keys(), + balances: balances, + params: { + sendEnabled: Set(), + defaultSendEnabled: true + } + } } } diff --git a/examples/cosmos/bank/cosmos-bank.md b/examples/cosmos/bank/cosmos-bank.md index 382490b37..d0f1219b5 100644 --- a/examples/cosmos/bank/cosmos-bank.md +++ b/examples/cosmos/bank/cosmos-bank.md @@ -4,6 +4,9 @@ **Version**: Cosmos SDK [v0.46.10](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/). +**This page is still experimental. We believe that Cosmos documentation will +become executable one day.** + ## Abstract This document shows how we could turn an inanimate piece of documentation into @@ -11,8 +14,8 @@ an executable specification. We are using the [bank module][] of Cosmos SDK as an example. In the following, all of the quoted text belongs to the original description on the [bank module][] page, unless specified otherwise. To obtain a Quint module, run [lmt][] against this document. Check the executable -specification in [bank.qnt](./bank.qnt). We follow the same order of exposition, -as in the original document. +specification in [bank.qnt](./bank.qnt) and [bankTest.qnt](./bankTest.qnt). +We follow the same order of exposition, as in the original document. Importantly, this description is tuned towards ease of exposition, not for implementation or verification. Remember that we do not want to make protocols @@ -58,8 +61,14 @@ module bankTest { // the state of the machine that tests the logic <<>> + // state transitions of the machine + <<>> + // protocol invariants <<>> + + // tests + <<>> } ``` @@ -159,9 +168,9 @@ This is a perfect opportunity to define a state invariant: ```bluespec "invariants" += // sum up amounts over all balances for a given denomination -def SumForDenom(denom: Denom): Int256 = { - Balances.keys().fold(0, (sum, addr) => { - val coins = Balances.get(addr) +def sumForDenom(denom: Denom): Int256 = { + balances.keys().fold(0, (sum, addr) => { + val coins = balances.get(addr) if (denom.in(coins.keys())) { sum + coins.get(denom) } else { @@ -171,8 +180,8 @@ def SumForDenom(denom: Denom): Int256 = { } // The total Supply of the network is equal to the sum of all coins from the account -val TotalSupplyInv = { - Supply.keys().forall(denom => (SumForDenom(denom) == Supply.get(denom))) +val totalSupplyInv = { + supply.keys().forall(denom => (sumForDenom(denom) == supply.get(denom))) } ``` @@ -196,7 +205,7 @@ We represent this field as a map in the protocol specification: ```bluespec "state" += // Total supply of coins per denomination -var Supply: Denom -> Int256 +var supply: Denom -> Int256 ``` > - Denom Metadata: `0x1 | byte(denom) -> ProtocolBuffer(Metadata)` @@ -207,7 +216,20 @@ We represent this field as a map in the protocol specification: ```bluespec "state" += // Balances for each address -var Balances: Addr -> Coins +var balances: Addr -> Coins +``` + +We could initialize the state via `init`, which would be similar to executing +genesis transactions in Cosmos: + +```bluespec "transitions" += +// initialize the state machine +action init = all { + // limit the total supply of burgers and bananas to 10_000 + supply' = Set("banana", "burger").mapBy(d => 10_000), + // the king has it all + balances' = Set("king").mapBy(a => Set("banana", "burger").mapBy(d => 10_000)) +} ``` ## Keepers @@ -233,7 +255,7 @@ var Balances: Addr -> Coins > occurs for the operation if a user or client attempts to directly or > indirectly send funds to a blocklisted account, for example, by using IBC. -**TODO: figure out how blocklisting should be described in the protocol** +**TODO: we are skipping this feature in the spec for now** ### Common Types @@ -268,8 +290,11 @@ An output of a multiparty transfer. The type in Quint: ```bluespec "types" += -// An input of a multiparty transfer -type Output = Input +// An output of a multiparty transfer +type Output = { + address: str, + coins: Coins, +} ``` The type in protobuf: @@ -301,7 +326,7 @@ classDiagram SendKeeper <|-- BaseKeeper ``` -We define the part of the SDK context that is touched by the bank module: +We define the part of the SDK context that is accessed by the bank module: ```bluespec "types" += // the portion of the context that is accessed by the bank module @@ -336,10 +361,44 @@ pure def ViewKeeper::GetAllBalances(ctx: BankCtx, addr: Addr): Coins = { Map() } } +``` +For example, we expect the `GetAllBalances` to return balances in the genesis state as follows: + +```bluespec "tests" += +run getAllBalancesTest = { + init + .then( + val ctx = stateToCtx(0) + val kings = ViewKeeper::GetAllBalances(ctx, "king") + val donkeys = ViewKeeper::GetAllBalances(ctx, "donkeykong") + all { + assert(kings.keys() == Set("banana", "burger")), + assert(kings.get("banana") == 10_000), + assert(kings.get("burger") == 10_000), + assert(donkeys.keys() == Set()), + // do not change the state + balances' = balances, + supply' = supply, + } + ) +} + +// a helper operator that produces a context from a state +def stateToCtx(time: int): BankCtx = { + { + blockTime: time, + accounts: balances.keys(), + balances: balances, + params: { + sendEnabled: Set(), + defaultSendEnabled: true + } + } +} ``` - - `validateBalance` validates all balances for a given account address + - `ValidateBalance` validates all balances for a given account address returning an error if any balance is invalid. It checks for vesting account types and validate the balances against the original vesting balances. CONTRACT: ValidateBalance should only be called upon genesis @@ -413,13 +472,13 @@ pure def ViewKeeper::GetAccountsBalances(ctx: BankCtx): Set[Balance] = { result will always be no coins. For vesting accounts, LockedCoins is delegated to the concrete vesting account type. - **TODO** + **TODO:** This requires vesting accounts. - `SpendableCoins` returns the total balances of spendable coins for an account by address. If the account has no spendable coins, an empty Coins slice is returned. - **TODO** + **TODO:** This requires vesting accounts. - `IterateAccountBalances` iterates over the balances of a single account and provides the token balance to a callback. If true is returned from From abefb07c928018d5a7831d5bb78744e6eb800601 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 11 Dec 2023 12:01:52 -0500 Subject: [PATCH 089/388] Explain the modules spec in comment --- .../TwoPhaseCommit/two_phase_commit_modules.qnt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt index a52fb9b69..3bc33c343 100644 --- a/examples/classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt +++ b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt @@ -1,9 +1,9 @@ // -*- mode: Bluespec; -*- -/* This specification stems from the specification of the two phase protocol - by Leslie Lamport: - - https://github.com/tlaplus/Examples/blob/master/specifications/transaction_commit/TwoPhase.tla */ +/* This specification is a variation on ./two_phase_commit.qnt that experiments with + using modules to divides the state spaces to reflect possible state access in the + system. +*/ module message { type T = From 94459551c46d153c20d6e094f6cc5553443303eb Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 11 Dec 2023 14:49:27 -0500 Subject: [PATCH 090/388] Update examples dashboard --- examples/.scripts/run-example.sh | 4 ++-- examples/README.md | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/examples/.scripts/run-example.sh b/examples/.scripts/run-example.sh index 396950f99..6e0115a4a 100755 --- a/examples/.scripts/run-example.sh +++ b/examples/.scripts/run-example.sh @@ -55,10 +55,10 @@ result () { # Print additional explanations if [[ "$file" == "solidity/icse23-fig7/lottery.qnt" && "$cmd" == "verify" ]] ; then printf "https://github.com/informalsystems/quint/issues/1285" - elif [[ "$file" == "classic/distributed/TwoPhaseCommit/two_phase_commit.qnt" && "$cmd" == verify ]] ; then - printf "https://github.com/informalsystems/quint/issues/1034" elif [[ "$file" == "classic/distributed/Paxos/Paxos.qnt" && "$cmd" == "verify" ]] ; then printf "https://github.com/informalsystems/quint/issues/1284" + elif [[ "$file" == "classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt" && "$cmd" =~ (test|verify) ]] ; then + printf "https://github.com/informalsystems/quint/issues/1299" fi fi } diff --git a/examples/README.md b/examples/README.md index 2cdd1b48a..480e47aca 100644 --- a/examples/README.md +++ b/examples/README.md @@ -54,7 +54,8 @@ listed without any additional command line arguments. | [classic/distributed/Paxos/Paxos.qnt](./classic/distributed/Paxos/Paxos.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1284 | | [classic/distributed/Paxos/Voting.qnt](./classic/distributed/Paxos/Voting.qnt) | :white_check_mark: | :white_check_mark: | N/A[^parameterized] | N/A[^nostatemachine] | | [classic/distributed/ReadersWriters/ReadersWriters.qnt](./classic/distributed/ReadersWriters/ReadersWriters.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [classic/distributed/TwoPhaseCommit/two_phase_commit.qnt](./classic/distributed/TwoPhaseCommit/two_phase_commit.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1034 | +| [classic/distributed/TwoPhaseCommit/two_phase_commit.qnt](./classic/distributed/TwoPhaseCommit/two_phase_commit.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt](./classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt) | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1299 | :x:https://github.com/informalsystems/quint/issues/1299 | | [classic/sequential/BinSearch/BinSearch.qnt](./classic/sequential/BinSearch/BinSearch.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [cosmos/ics20/bank.qnt](./cosmos/ics20/bank.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [cosmos/ics20/base.qnt](./cosmos/ics20/base.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | N/A[^nostatemachine] | From e61c083c6b57ceeb352ad7241274f4151ac91c71 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Tue, 12 Dec 2023 18:37:39 +0100 Subject: [PATCH 091/388] Introduce a new run operator `expect` (#1303) * adding boilerplate for expect * implement the new operator "expect" * update changelog * npm run generate * fix formatting * update the builtins description * rollback the outdated fixture updates * update the docs * clarify rollback * fix the description * Update CHANGELOG.md Co-authored-by: Shon Feder --------- Co-authored-by: Shon Feder --- CHANGELOG.md | 3 ++ doc/builtin.md | 20 +++++++++ doc/lang.md | 37 +++++++++++++++- quint/src/builtin.qnt | 19 +++++++++ quint/src/effects/builtinSignatures.ts | 1 + quint/src/ir/quintIr.ts | 1 + quint/src/names/base.ts | 1 + quint/src/runtime/impl/compilerImpl.ts | 59 ++++++++++++++++++++++++++ quint/src/types/builtinSignatures.ts | 1 + quint/test/runtime/compile.test.ts | 40 +++++++++++++++++ 10 files changed, 181 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 394c73199..d0986792c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED ### Added + +- Add a run operator `A.expect(P)` to test the state predicate `P` in the state resulting from applying action `A` (#1303) + ### Changed ### Deprecated ### Removed diff --git a/doc/builtin.md b/doc/builtin.md index 520baf810..cb39cc040 100644 --- a/doc/builtin.md +++ b/doc/builtin.md @@ -860,6 +860,26 @@ var x: int run test = (x' = 1).then(x' = 2).then(x' = 3).then(assert(x == 3)) ``` +## `action expect: (bool, bool) => bool` + +`a.expect(b)` is true for a step from `s1` to `s2` if + + - `a` is true for a step from `s1` to `s2`, and + - `b` holds true in `s2`. + +If `a` evaluates to `false`, evaluation of `a.expect(b)` +fails with an error message. If `b` evaluates to `false`, +evaluation of `a.expect(b)` fails with an error message. + +### Examples + +``` +var n: int +run expectConditionOkTest = (n' = 0).then(n' = 3).expect(n == 3) +run expectConditionFailsTest = (n' = 0).then(n' = 3).expect(n == 4) +run expectRunFailsTest = (n' = 0).then(all { n == 2, n' = 3 }).expect(n == 4) +``` + ## `action reps: (int, (int) => bool) => bool` `n.reps(i => A(i))` or `n.reps(A)` the action `A`, `n` times. diff --git a/doc/lang.md b/doc/lang.md index 9dec39e9a..13981fc68 100644 --- a/doc/lang.md +++ b/doc/lang.md @@ -2,7 +2,7 @@ | Revision | Date | Author | |:---------|:-----------|:--------------------------------------------------------| -| 34 | 09.10.2023 | Igor Konnov, Shon Feder, Jure Kukovec, Gabriela Moreira, Thomas Pani | +| 35 | 12.12.2023 | Igor Konnov, Shon Feder, Jure Kukovec, Gabriela Moreira, Thomas Pani | This document presents language constructs in the same order as the [summary of TLA+](https://lamport.azurewebsites.net/tla/summary.pdf). @@ -64,6 +64,7 @@ Table of Contents * [Then](#then) * [Reps](#reps) * [Example](#example) + * [Expect](#expect) * [Fail](#fail) * [Temporal operators](#temporal-operators) * [Always](#always) @@ -1754,6 +1755,40 @@ to be disabled. *Mode:* Run. +#### Expect + +The operator `expect` has the following syntax: + +```scala +A.expect(P) +expect(A, P) +``` + +The left-hand side `A` must be an action or a run. The right-hand side `P` must +be a non-action Boolean expression. + +The semantics of this operator is as follows: + +- Evaluate action `A`: + - When `A`'s result is `false`, emit a runtime error. + - When `A`'s result is `true`: + - Commit the variable updates. + - Evaluate `P`: + - If `P` evaluates to `false`, emit a runtime error (similar to `assert`). + - If `P` evaluates to `true`, undo the updates back to the state where we + were after `A` was applied. + +##### Example + +```bluespec +var n: int +run expectConditionOkTest = (n' = 0).then(n' = 3).expect(n == 3) +run expectConditionFailsTest = (n' = 0).then(n' = 3).expect(n == 4) +run expectRunFailsTest = (n' = 0).then(all { n == 2, n' = 3 }).expect(n == 4) +``` + +*Mode:* Run. + ### Temporal operators Temporal operators describe infinite executions. diff --git a/quint/src/builtin.qnt b/quint/src/builtin.qnt index 0f39c3914..3ec048edc 100644 --- a/quint/src/builtin.qnt +++ b/quint/src/builtin.qnt @@ -790,6 +790,25 @@ module builtin { /// ``` action then(a, b): (bool, bool) => bool + /// `a.expect(b)` is true for a step from `s1` to `s2` if + /// + /// - `a` is true for a step from `s1` to `s2`, and + /// - `b` holds true in `s2`. + /// + /// If `a` evaluates to `false`, evaluation of `a.expect(b)` + /// fails with an error message. If `b` evaluates to `false`, + /// evaluation of `a.expect(b)` fails with an error message. + /// + /// ### Examples + /// + /// ``` + /// var n: int + /// run expectConditionOkTest = (n' = 0).then(n' = 3).expect(n == 3) + /// run expectConditionFailsTest = (n' = 0).then(n' = 3).expect(n == 4) + /// run expectRunFailsTest = (n' = 0).then(all { n == 2, n' = 3 }).expect(n == 4) + /// ``` + action expect(a, b): (bool, bool) => bool + /// `n.reps(i => A(i))` or `n.reps(A)` the action `A`, `n` times. /// The iteration number, starting with 0, is passed as an argument of `A`. /// As actions are usually not parameterized by the iteration number, diff --git a/quint/src/effects/builtinSignatures.ts b/quint/src/effects/builtinSignatures.ts index 228e2d91d..f9de7f532 100644 --- a/quint/src/effects/builtinSignatures.ts +++ b/quint/src/effects/builtinSignatures.ts @@ -219,6 +219,7 @@ const temporalOperators = [ const otherOperators = [ { name: 'assign', effect: parseAndQuantify('(Read[r1], Read[r2]) => Read[r2] & Update[r1]') }, { name: 'then', effect: parseAndQuantify('(Read[r1] & Update[u], Read[r2] & Update[u]) => Read[r] & Update[u]') }, + { name: 'expect', effect: parseAndQuantify('(Read[r1] & Update[u], Read[r2]) => Read[r1] & Update[u]') }, { name: 'reps', effect: parseAndQuantify('(Pure, (Read[r1]) => Read[r2] & Update[u]) => Read[r1, r2] & Update[u]') }, { name: 'fail', effect: propagateComponents(['read', 'update'])(1) }, { name: 'assert', effect: propagateComponents(['read'])(1) }, diff --git a/quint/src/ir/quintIr.ts b/quint/src/ir/quintIr.ts index b7f11cb0a..b9e148e52 100644 --- a/quint/src/ir/quintIr.ts +++ b/quint/src/ir/quintIr.ts @@ -136,6 +136,7 @@ export const builtinOpCodes = [ 'and', 'append', 'assert', + 'expect', 'assign', 'chooseSome', 'concat', diff --git a/quint/src/names/base.ts b/quint/src/names/base.ts index 144a8437f..6e8e2071e 100644 --- a/quint/src/names/base.ts +++ b/quint/src/names/base.ts @@ -193,6 +193,7 @@ export const builtinNames = [ 'eventually', 'next', 'then', + 'expect', 'reps', 'fail', 'assert', diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 9f720e1d3..ba06ae4fd 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -920,6 +920,10 @@ export class CompilerVisitor implements IRVisitor { }) break + case 'expect': + this.translateExpect(app) + break + case 'assert': this.applyFun(app.id, 1, cond => { if (!cond.toBool()) { @@ -1303,6 +1307,61 @@ export class CompilerVisitor implements IRVisitor { this.compStack.push(mkFunComputable(lazyCompute)) } + // Translate A.expect(P): + // - Evaluate A. + // - When A's result is 'false', emit a runtime error. + // - When A's result is 'true': + // - Commit the variable updates: Shift the primed variables to unprimed. + // - Evaluate `P`. + // - If `P` evaluates to `false`, emit a runtime error (similar to `assert`). + // - If `P` evaluates to `true`, rollback to the previous state and return `true`. + private translateExpect(app: ir.QuintApp): void { + // The code below is an adaption of chainAllOrThen. + // If someone finds how to nicely combine both, please refactor. + if (this.compStack.length !== 2) { + this.errorTracker.addCompileError(app.id, 'QNT501', `Not enough arguments on stack for "${app.opcode}"`) + return + } + const [action, pred] = this.compStack.splice(-2) + const lazyCompute = (): Maybe => { + const savedNextVars = this.snapshotNextVars() + const savedTrace = this.trace() + const actionResult = action.eval() + if (actionResult.isNone() || !(actionResult.value as RuntimeValue).toBool()) { + // 'A' evaluates to 'false', or produces an error. + // Restore the values of the next variables. + this.recoverNextVars(savedNextVars) + this.resetTrace(just(rv.mkList(savedTrace))) + // expect emits an error when the run could not finish + this.errorTracker.addRuntimeError(app.args[0].id, 'QNT508', 'Cannot continue to "expect"') + return none() + } else { + const savedVarsAfterAction = this.snapshotVars() + const savedNextVarsAfterAction = this.snapshotNextVars() + const savedTraceAfterAction = this.trace() + // Temporarily, switch to the next frame, to make a look-ahead evaluation. + // For example, if `x == 1` and `x' == 2`, we would have `x == 2` and `x'` would be undefined. + this.shiftVars() + // evaluate P + const predResult = pred.eval() + // Recover the assignments to unprimed and primed variables. + // E.g., we recover variables to `x == 1` and `x' == 2` in the above example. + // This lets us combine the result of `expect` with other actions via `then`. + // For example: `A.expect(P).then(B)`. + this.recoverVars(savedVarsAfterAction) + this.recoverNextVars(savedNextVarsAfterAction) + this.resetTrace(just(rv.mkList(savedTraceAfterAction))) + if (predResult.isNone() || !(predResult.value as RuntimeValue).toBool()) { + this.errorTracker.addRuntimeError(app.args[1].id, 'QNT508', 'Expect condition does not hold true') + return none() + } + return predResult + } + } + + this.compStack.push(mkFunComputable(lazyCompute)) + } + // translate n.reps(A) private translateReps(app: ir.QuintApp): void { if (this.compStack.length < 2) { diff --git a/quint/src/types/builtinSignatures.ts b/quint/src/types/builtinSignatures.ts index 5e2b2499e..9cd1ef4fb 100644 --- a/quint/src/types/builtinSignatures.ts +++ b/quint/src/types/builtinSignatures.ts @@ -122,6 +122,7 @@ const otherOperators = [ { name: 'assign', type: '(a, a) => bool' }, { name: 'ite', type: '(bool, a, a) => a' }, { name: 'then', type: '(bool, bool) => bool' }, + { name: 'expect', type: '(bool, bool) => bool' }, { name: 'reps', type: '(int, int => bool) => bool' }, { name: 'fail', type: '(bool) => bool' }, { name: 'assert', type: '(bool) => bool' }, diff --git a/quint/test/runtime/compile.test.ts b/quint/test/runtime/compile.test.ts index 1d86cafc3..a2a431736 100644 --- a/quint/test/runtime/compile.test.ts +++ b/quint/test/runtime/compile.test.ts @@ -978,6 +978,46 @@ describe('compiling specs to runtime values', () => { evalVarAfterCall('n', 'run1', input).mapRight(m => assert.fail(`Expected an error, found: ${m}`)) }) + it('expect fails', () => { + const input = dedent( + `var n: int + |run run1 = (n' = 0).then(n' = 3).expect(n < 3) + ` + ) + + evalVarAfterCall('n', 'run1', input).mapRight(m => assert.fail(`Expected the run to fail, found: ${m}`)) + }) + + it('expect ok', () => { + const input = dedent( + `var n: int + |run run1 = (n' = 0).then(n' = 3).expect(n == 3) + ` + ) + + assertVarAfterCall('n', '3', 'run1', input) + }) + + it('expect fails when left-hand side is false', () => { + const input = dedent( + `var n: int + |run run1 = (n' = 0).then(all { n == 1, n' = 3 }).expect(n < 3) + ` + ) + + evalVarAfterCall('n', 'run1', input).mapRight(m => assert.fail(`Expected the run to fail, found: ${m}`)) + }) + + it('expect and then expect fail', () => { + const input = dedent( + `var n: int + |run run1 = (n' = 0).then(n' = 3).expect(n == 3).then(n' = 4).expect(n == 3) + ` + ) + + evalVarAfterCall('n', 'run1', input).mapRight(m => assert.fail(`Expected the run to fail, found: ${m}`)) + }) + it('q::debug', () => { // `q::debug(s, a)` returns `a` const input = dedent( From aacd39204d9fed010be30edc7467ee3072f5fe62 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 12 Dec 2023 14:13:32 -0500 Subject: [PATCH 092/388] Move roadmap into separate file --- doc/roadmap.md | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 doc/roadmap.md diff --git a/doc/roadmap.md b/doc/roadmap.md new file mode 100644 index 000000000..a73f84af9 --- /dev/null +++ b/doc/roadmap.md @@ -0,0 +1,97 @@ +# Roadmap + +In the spirit of [Lessons from Writing a Compiler][], we have a roadmap, where +we are implementing various transpiler passes feature-by-feature, instead of +completely implementing every pass. + +- :white_check_mark: Completed +- :green_circle: Won't get in your way, but there's still work to be done +- :x: Not implemented yet + +| Language feature | Parser | Name resolution | Effects | Type checker | Simulator | To-Apalache | Tutorials | +|:----------------------------------|:------------------:|:------------------:|:------------------:|:------------------:|:------------------:|:------------------:|:------------------:| +| [Booleans][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Integers][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [if-then-else][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Operator definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Modes][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Sets][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [nondet][] | :white_check_mark: | :white_check_mark: | :green_circle: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Maps][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | +| [Lists][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | +| [Records][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | +| [Tuples][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Sum types][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | +| [Imports][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Module definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Module instances][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | +| [Multiple files][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Constant declarations][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | +| [Variable definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Assumptions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: [235][] | :white_check_mark: | :x: | +| [Lambdas][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Multiline disjunctions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Multiline conjunctions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Delayed assignment][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| Invariant checking | - | - | - | - | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Higher-order definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | +| [Runs][] | :white_check_mark: | :white_check_mark: | :green_circle: | :white_check_mark: | :white_check_mark: | *non-goal* | :white_check_mark: | +| [Temporal operators][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | *non-goal* | :white_check_mark: | :x: | +| [Fairness][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | *non-goal* | :white_check_mark: | :x: | +| [Unbounded quantifiers][] | :white_check_mark: | :white_check_mark: | :x: | :x: | *non-goal* | :x: | :x: | +| [String literals][], see #118 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| ~~uninterpreted types~~, see #118 | :white_check_mark: | :white_check_mark: | :x: | :x: | :x: | :x: | :x: | + +--- + +Quint is developed at [Informal Systems](https://informal.systems/). + +With additional funding from
[the Vienna Business Agency](https://viennabusinessagency.at/). + +[Design Principles]: ./doc/design-principles.md +[Apalache]: https://github.com/informalsystems/apalache +[Lessons from Writing a Compiler]: https://borretti.me/article/lessons-writing-compiler +[Imports]: ./doc/lang.md#imports-1 +[Module definitions]: ./doc/lang.md#module-definition +[Constant declarations]: ./doc/lang.md#constant-declarations +[Assumptions]: ./doc/lang.md#assumptions +[Variable definitions]: ./doc/lang.md#variable-definitions +[Operator definitions]: ./doc/lang.md#variable-definitions +[Module instances]: ./doc/lang.md#module-instances +[Lambdas]: ./doc/lang.md#lambdas-aka-anonymous-operators +[Booleans]: ./doc/lang.md#boolean-operators-and-equality +[Integers]: ./doc/lang.md#integers +[Sets]: ./doc/lang.md#sets +[Lists]: ./doc/lang.md#lists-aka-sequences +[Multiline disjunctions]: ./doc/lang.md#multiline-disjunctions +[Multiline conjunctions]: ./doc/lang.md#multiline-conjunctions +[if-then-else]: ./doc/lang.md#condition +[nondet]: ./doc/lang.md#existential-quantifier-and-non-deterministic-choice +[Maps]: ./doc/lang.md#maps-aka-functions +[Records]: ./doc/lang.md#records +[Tuples]: ./doc/lang.md#tuples +[Sum types]: ./doc/lang.md#sum-types +[Delayed assignment]: ./doc/lang.md#delayed-assignment +[Runs]: ./doc/lang.md#runs +[Temporal operators]: ./doc/lang.md#temporal-operators +[Fairness]: ./doc/lang.md#fairness +[Unbounded quantifiers]: ./doc/lang.md#unbounded-quantifiers +[Modes]: ./doc/lang.md#modes +[Spells]: ./examples/spells/README.md +[Contribute your spell]: ./examples/spells/contribute-your-spell.md +[539]: https://github.com/informalsystems/quint/issues/539 +[221]: https://github.com/informalsystems/quint/issues/221 +[235]: https://github.com/informalsystems/quint/issues/235 +[8]: https://github.com/informalsystems/quint/issues/8 +[1034]: https://github.com/informalsystems/quint/issues/1034 +[Higher-order definitions]: https://github.com/informalsystems/quint/blob/main/doc/lang.md#operator-definitions +[String literals]: https://github.com/informalsystems/quint/blob/main/doc/lang.md#identifiers-and-strings +[TLA+]: https://lamport.azurewebsites.net/tla/tla.html +[TLA]: https://en.wikipedia.org/wiki/Temporal_logic_of_actions +[Visual Studio Code Marketplace]: https://marketplace.visualstudio.com/items?itemName=informal.quint-vscode +[Tutorials]: ./tutorials/README.md +[Quint zulip stream]: https://informal-systems.zulipchat.com/#narrow/stream/378959-quint +[Quint discussions]: https://github.com/informalsystems/quint/discussions +[ITF traces]: https://apalache.informal.systems/docs/adr/015adr-trace.html +[ITF Trace Viewer]: https://marketplace.visualstudio.com/items?itemName=informal.itf-trace-viewer +[15 minute intro to Quint]: https://youtu.be/OZIX8rs-kOA From 832fea5fba78fbf8e64fa4870128f8520188e871 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 12 Dec 2023 14:16:17 -0500 Subject: [PATCH 093/388] Add dev docs to contributing --- CONTRIBUTING.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6c73bdd60..11684170e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,6 +5,23 @@ This project is part of the [Apalache][] ecosystem. Hence, we apply the same principles in Quint, see [Contributing to Apalache][]. +## Source code structure + + - [quint](./quint) is the package for the `quint` transpiler + - [vscode](./vscode) vscode plugin + +## Developer docs + + + - [roadmap](./doc/roadmap.md) + - [ADR001: Transpiler architecture](./doc/adr001-transpiler-architecture.md) + - [ADR002: Error codes](./doc/adr002-errors.md) + - [ADR003: Interface to visit Internal Representation + components](./doc/adr003-visiting-ir-components.md) + - [ADR004: An Effect System for Quint](./doc/adr004-effect-system.md) + - [ADR005: A Type System for Quint](./doc/adr005-type-system.md) + - [ADR006: Design of modules and lookup tables](./doc/adr006-modules.lit.md) + ## Coordinating work Development on Quint is distributed. As with any distributed system, establishing From 5a50078d025663de223859d51d029f1517f302d7 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 12 Dec 2023 14:21:32 -0500 Subject: [PATCH 094/388] Correct location of funding and links --- README.md | 62 +------------------------------------------------- doc/roadmap.md | 7 +----- 2 files changed, 2 insertions(+), 67 deletions(-) diff --git a/README.md b/README.md index d163e4fd8..6229730eb 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,7 @@ TLA and it is aligned with TLA+: it will soon be supported in the [Apalache][] model checker. ## Name origin - + Quint is short for Quintessence, from alchemy, which refers to the fifth element. A lot of alchemy is about transmutation and energy, and Quint makes it possible to transmute specifications into executable assets and empower ideas to @@ -126,66 +126,6 @@ editor (currently, VSCode, Emacs and Vim are supported). This is a technique for embedding formal quint formal specifications inside of markdown files. -## Development - -### Developer docs :guitar: - - - [ADR001: Transpiler architecture](./doc/adr001-transpiler-architecture.md) - - [ADR002: Error codes](./doc/adr002-errors.md) - - [ADR003: Interface to visit Internal Representation - components](./doc/adr003-visiting-ir-components.md) - - [ADR004: An Effect System for Quint](./doc/adr004-effect-system.md) - - [ADR005: A Type System for Quint](./doc/adr005-type-system.md) - - [ADR006: Design of modules and lookup tables](./doc/adr006-modules.lit.md) - -### Source code :hash: - - - [quint](./quint) is the package for the `quint` transpiler - - [vscode](./vscode) vscode plugin - -### Roadmap :white_check_mark: - -In the spirit of [Lessons from Writing a Compiler][], we have a roadmap, where -we are implementing various transpiler passes feature-by-feature, instead of -completely implementing every pass. - -- :white_check_mark: Completed -- :green_circle: Won't get in your way, but there's still work to be done -- :x: Not implemented yet - -| Language feature | Parser | Name resolution | Effects | Type checker | Simulator | To-Apalache | Tutorials | -|:----------------------------------|:------------------:|:------------------:|:------------------:|:------------------:|:------------------:|:------------------:|:------------------:| -| [Booleans][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Integers][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [if-then-else][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Operator definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Modes][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Sets][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [nondet][] | :white_check_mark: | :white_check_mark: | :green_circle: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Maps][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | -| [Lists][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | -| [Records][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | -| [Tuples][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Sum types][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | -| [Imports][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Module definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Module instances][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | -| [Multiple files][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Constant declarations][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | -| [Variable definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Assumptions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: [235][] | :white_check_mark: | :x: | -| [Lambdas][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Multiline disjunctions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Multiline conjunctions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Delayed assignment][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| Invariant checking | - | - | - | - | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Higher-order definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | -| [Runs][] | :white_check_mark: | :white_check_mark: | :green_circle: | :white_check_mark: | :white_check_mark: | *non-goal* | :white_check_mark: | -| [Temporal operators][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | *non-goal* | :white_check_mark: | :x: | -| [Fairness][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | *non-goal* | :white_check_mark: | :x: | -| [Unbounded quantifiers][] | :white_check_mark: | :white_check_mark: | :x: | :x: | *non-goal* | :x: | :x: | -| [String literals][], see #118 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| ~~uninterpreted types~~, see #118 | :white_check_mark: | :white_check_mark: | :x: | :x: | :x: | :x: | :x: | --- diff --git a/doc/roadmap.md b/doc/roadmap.md index a73f84af9..c66f9b757 100644 --- a/doc/roadmap.md +++ b/doc/roadmap.md @@ -42,12 +42,7 @@ completely implementing every pass. | [String literals][], see #118 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | ~~uninterpreted types~~, see #118 | :white_check_mark: | :white_check_mark: | :x: | :x: | :x: | :x: | :x: | ---- - -Quint is developed at [Informal Systems](https://informal.systems/). - -With additional funding from
[the Vienna Business Agency](https://viennabusinessagency.at/). - + [Design Principles]: ./doc/design-principles.md [Apalache]: https://github.com/informalsystems/apalache [Lessons from Writing a Compiler]: https://borretti.me/article/lessons-writing-compiler From 24d491c36ff200dbd95be380cd74be29fe824923 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 12 Dec 2023 20:38:13 -0500 Subject: [PATCH 095/388] Add Logos --- logos/quint-logo.png | Bin 0 -> 360413 bytes logos/quint-logo.svg | 68 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 logos/quint-logo.png create mode 100644 logos/quint-logo.svg diff --git a/logos/quint-logo.png b/logos/quint-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..25db008ec428b2bcf473282229c8f8a8b570dca8 GIT binary patch literal 360413 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�PR!xMI6cJOw_h)u$oCpL! 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

74rcosKM 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 NoxEX^HoClzYAvAm&8A*n^Idx&OaKx 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

4fY#%$3!sIZy^WVvi2j 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 + + + + + + From 764e76227d136d28bce41621ca9edc4d61c8a16d Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 12 Dec 2023 20:52:27 -0500 Subject: [PATCH 096/388] Format header and organize content --- README.md | 129 +++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 98 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 6229730eb..129ec8c8c 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,49 @@ -# Quint Lang - -[![build -badge](https://github.com/informalsystems/quint/actions/workflows/main.yml/badge.svg)](https://github.com/informalsystems/quint/actions) -[![Visual Studio Marketplace Version](https://img.shields.io/visual-studio-marketplace/v/informal.quint-vscode?color=10b0f2&label=VSCode)](https://marketplace.visualstudio.com/items?itemName=informal.quint-vscode) -[![npm (scoped)](https://img.shields.io/npm/v/@informalsystems/quint)](https://www.npmjs.com/package/@informalsystems/quint) - -Quint Lang (or just Quint) is a modern specification language that is a -particularly good fit for distributed systems and blockchain protocols. It -combines the robust theoretical basis of the [Temporal Logic of Actions][TLA] -(TLA) with state-of-the-art static analysis and development tooling. - -If you are impatient, here is a [15 minute intro to Quint][] at Gateway to -Cosmos 2023. +

+ + +## Overview + +Quint is a modern specification language that is a particularly good fit for +distributed systems, such as blockchain protocols, distributed databases, and +p2p protocols. Quint combines the robust theoretical basis of the [Temporal +Logic of Actions (TLA)][TLA] with state-of-the-art static analysis and +development tooling. This is how typical Quint code looks: + + ```scala // `validateBalance` should only be called upon genesis state. pure def validateBalance(ctx: BankCtx, addr: Addr): bool = and { @@ -24,6 +53,8 @@ This is how typical Quint code looks: } ``` + + If you would like to see the same code in TLA+, here is how it looks: ```tla @@ -35,8 +66,19 @@ validateBalance(ctx, addr) == coins[denom] > 0 ``` -Want a preview of the tools before reading any further? Check [Quick -previews](./doc/previews.md). +### Features + + + +- Simple, familiar syntax +- Expressive Type systems +- Effect system +- Simulation +- Symbolic model checking via Apalache +- IDE support via LSP +- REPL + +### Motivation Quint is inspired by [TLA+][] but provides an alternative surface syntax for specifying systems in TLA. The most important feature of our syntax is that it @@ -54,18 +96,33 @@ The syntax also aims to be familiar to engineers: clearly. Notably, Quint comes with formal semantics built-in, thanks to its foundation in -TLA and it is aligned with TLA+: it will soon be supported in the [Apalache][] -model checker. +TLA and it is aligned with TLA+ -## Name origin - -Quint is short for Quintessence, from alchemy, which refers to the fifth -element. A lot of alchemy is about transmutation and energy, and Quint makes it -possible to transmute specifications into executable assets and empower ideas to -become referenced artifacts. +- it is supported in the [Apalache][] model checker. + + +- [15 minute intro to Quint at Gateway to Cosmos 2023][] . +- [preview of the tools](./doc/previews.md). + + +## Installation + +Install the [latest published version from npm](https://www.npmjs.com/package/@informalsystems/quint): + +``` sh +npm i @informalsystems/quint -g +``` + +Install IDE support for your editor: + +- [VSCode](https://marketplace.visualstudio.com/items?itemName=informal.quint-vscode) +- [Emacs](./editor-plugins/emacs/README.md) +- [Vim](./editor-plugins/vim/README.md) ## Documentation + + ### Tutorials :teacher: Visit the [Tutorials][] page. @@ -84,13 +141,6 @@ Some of them accompany a TLA+ version for comparison and learning purposes. To simplify reading, use [syntax highlighting](./editor-plugins) for your editor (currently, VSCode, Emacs and Vim are supported). -## Community and help - -- Join the chat in the [Quint zulip stream][] :telephone: -- Join the [Quint discussions][] :bulb: -- [Contribute your spell][] to the collection of Quint spells :scroll: -- [Contribute](./CONTRIBUTING.md) to the development of Quint :construction_worker: - ### Tools :space_invader: [Quick previews](./doc/previews.md) of the tools. @@ -127,12 +177,29 @@ editor (currently, VSCode, Emacs and Vim are supported). of markdown files. +## Communty + + +- Join the chat in the [Quint zulip stream][] :telephone: +- Join the [Quint discussions][] :bulb: +- [Contribute your spell][] to the collection of Quint spells :scroll: +- [Contribute](./CONTRIBUTING.md) to the development of Quint :construction_worker: + +## Name origin + +Quint is short for Quintessence, from alchemy, which refers to the fifth +element. A lot of alchemy is about transmutation and energy, and Quint makes it +possible to transmute specifications into executable assets and empower ideas to +become referenced artifacts. + --- Quint is developed at [Informal Systems](https://informal.systems/). + With additional funding from
[the Vienna Business Agency](https://viennabusinessagency.at/). + [Design Principles]: ./doc/design-principles.md [Apalache]: https://github.com/informalsystems/apalache [Lessons from Writing a Compiler]: https://borretti.me/article/lessons-writing-compiler From 24aa7aca4db7a0866704293cbd2a775fe5a0ecd5 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 12 Dec 2023 21:25:20 -0500 Subject: [PATCH 097/388] Change example and put TLA in details --- README.md | 61 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 37 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 129ec8c8c..37b346799 100644 --- a/README.md +++ b/README.md @@ -40,32 +40,46 @@ p2p protocols. Quint combines the robust theoretical basis of the [Temporal Logic of Actions (TLA)][TLA] with state-of-the-art static analysis and development tooling. -This is how typical Quint code looks: +Here's some example code in Quint: - +```bluespec +type Status = Working | Prepared | Committed | Aborted -```scala - // `validateBalance` should only be called upon genesis state. - pure def validateBalance(ctx: BankCtx, addr: Addr): bool = and { - ctx.accounts.contains(addr), - val coins = getAllBalances(ctx, addr) - coins.keys().forall(denom => coins.get(denom) > 0), - } -``` +const ResourceManagers: Set[str] +var statuses: str -> Status + +action init = ResourceManagers.mapBy(_ => Working) + +val canCommit: bool = ResourceManagers.forall(rm => statuses.get(rm).in(Set(Prepared, Committed))) +val notCommitted: bool = ResourceManagers.forall(rm => statuses.get(rm) != Committed) - +action prepare(rm) = all { + statuses.get(rm) == Working, + statuses' = statuses.set(rm, Prepared) +} +``` -If you would like to see the same code in TLA+, here is how it looks: +
+The equivalent TLA+ code ```tla -\* `validateBalance` should only be called upon genesis state. -validateBalance(ctx, addr) == - /\ addr \in ctx.accounts - /\ LET coins == getAllBalances(ctx, addr) IN - \A denom \in DOMAIN coins: - coins[denom] > 0 +CONSTANT ResourceManagers +VARIABLE statuses + +TCTypeOK == statuses \in [ResourceManagers -> {"working", "prepared", "committed", "aborted"}] + +TCInit == statuses = [rm \in ResourceManagers |-> "working"] + +canCommit == \A rm \in ResourceManagers : statuses[rm] \in {"prepared", "committed"} + +notCommitted == \A rm \in ResourceManagers : statuses[rm] # "committed" + +Prepare(rm) == /\ statuses[rm] = "working" + /\ statuses' = [statuses EXCEPT ![rm] = "prepared"] ``` +
+ ### Features @@ -104,7 +118,6 @@ TLA and it is aligned with TLA+ - [15 minute intro to Quint at Gateway to Cosmos 2023][] . - [preview of the tools](./doc/previews.md). - ## Installation Install the [latest published version from npm](https://www.npmjs.com/package/@informalsystems/quint): @@ -185,9 +198,9 @@ editor (currently, VSCode, Emacs and Vim are supported). - [Contribute your spell][] to the collection of Quint spells :scroll: - [Contribute](./CONTRIBUTING.md) to the development of Quint :construction_worker: -## Name origin - -Quint is short for Quintessence, from alchemy, which refers to the fifth +## On "Quint" + +Quint is short for 'quintessence', from alchemy, which refers to the fifth element. A lot of alchemy is about transmutation and energy, and Quint makes it possible to transmute specifications into executable assets and empower ideas to become referenced artifacts. @@ -196,8 +209,8 @@ become referenced artifacts. Quint is developed at [Informal Systems](https://informal.systems/). - -With additional funding from
[the Vienna Business Agency](https://viennabusinessagency.at/). + +Supported by the Vienna Business Agency
[the Vienna Business Agency](https://viennabusinessagency.at/). [Design Principles]: ./doc/design-principles.md From aa44dcbb03df5617787f1916476d886801850e1d Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 12 Dec 2023 21:45:01 -0500 Subject: [PATCH 098/388] Flesh out features --- README.md | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 37b346799..98db9d72b 100644 --- a/README.md +++ b/README.md @@ -82,15 +82,13 @@ Prepare(rm) == /\ statuses[rm] = "working" ### Features - - -- Simple, familiar syntax -- Expressive Type systems -- Effect system -- Simulation -- Symbolic model checking via Apalache -- IDE support via LSP -- REPL +- A simple and familiar **syntax** to support engineers reading and writing specifications +- An expressive **type systems** to ensure the domain model is coherent +- A novel **effect system** to ensure state updates are coherent +- **IDE support** via LSP, giving real time feedback when writing specifications +- A **REPL** enabling interactive exploration of specifications +- A **simulator** enabling tests, trace generation, and exploration of your system +- **Symbolic model checking** to verify your specifications via [Apalache][apalache] ### Motivation From 2ccd58880731006b0b1d73b3fc998010126498fc Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 12 Dec 2023 21:45:17 -0500 Subject: [PATCH 099/388] Edit motivation --- README.md | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 98db9d72b..a556a5be0 100644 --- a/README.md +++ b/README.md @@ -100,19 +100,15 @@ tooling and static analysis (see our [Design Principles][]). The syntax also aims to be familiar to engineers: - At the lexical level, it borrows many principles from C-like languages. -- At the syntax level, it follows a few (but not all) principles that are - usually found in functional languages. +- At the syntax level, it follows many principles found in functional languages. - At the semantic level, Quint extends the standard programming paradigm with - non-determinism and temporal formulas, which allow designers to specify - protocol environments such as networks, faults, and time concisely and - clearly. + non-determinism and temporal formulas, which allow concise specification of + protocol environments such as networks, faults, and time. -Notably, Quint comes with formal semantics built-in, thanks to its foundation in -TLA and it is aligned with TLA+ +Thanks to its foundation in TLA and its alignment with TLA+, Quint comes with +formal semantics built-in. -- it is supported in the [Apalache][] model checker. - - + - [15 minute intro to Quint at Gateway to Cosmos 2023][] . - [preview of the tools](./doc/previews.md). From 89989ae4f2c6f4a8160ed667b3b7ea8a868d4fc3 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 12 Dec 2023 21:58:40 -0500 Subject: [PATCH 100/388] Try to tidy up the documentation section --- README.md | 98 ++++++++++++++++--------------------------------------- 1 file changed, 28 insertions(+), 70 deletions(-) diff --git a/README.md b/README.md index a556a5be0..71cebdaea 100644 --- a/README.md +++ b/README.md @@ -95,7 +95,8 @@ Prepare(rm) == /\ statuses[rm] = "working" Quint is inspired by [TLA+][] but provides an alternative surface syntax for specifying systems in TLA. The most important feature of our syntax is that it is minimal and regular, making Quint an easy target for advanced developer -tooling and static analysis (see our [Design Principles][]). +tooling and static analysis (see our [design principles][] and [previews of the +tooling](./doc/previews.md) of the tooling). The syntax also aims to be familiar to engineers: @@ -108,89 +109,48 @@ The syntax also aims to be familiar to engineers: Thanks to its foundation in TLA and its alignment with TLA+, Quint comes with formal semantics built-in. - -- [15 minute intro to Quint at Gateway to Cosmos 2023][] . -- [preview of the tools](./doc/previews.md). +To learn more about Quint's motivation and design philosophy, watch this [15 +minute presentation](https://youtu.be/OZIX8rs-kOA), delivered at Gateway to +Cosmos in 2023. ## Installation -Install the [latest published version from npm](https://www.npmjs.com/package/@informalsystems/quint): +1. Install the [latest published version from npm](https://www.npmjs.com/package/@informalsystems/quint): -``` sh -npm i @informalsystems/quint -g -``` - -Install IDE support for your editor: + ``` sh + npm i @informalsystems/quint -g + ``` -- [VSCode](https://marketplace.visualstudio.com/items?itemName=informal.quint-vscode) -- [Emacs](./editor-plugins/emacs/README.md) -- [Vim](./editor-plugins/vim/README.md) - -## Documentation +2. Install IDE support for your editor: - + - [VSCode](https://marketplace.visualstudio.com/items?itemName=informal.quint-vscode) + - [Emacs](./editor-plugins/emacs/README.md) + - [Vim](./editor-plugins/vim/README.md) -### Tutorials :teacher: +3. _Optionally_, you may also install the [VSCode plugin for visualizing + traces](https://marketplace.visualstudio.com/items?itemName=informal.itf-trace-viewer). -Visit the [Tutorials][] page. - -### Syntax :abcd: +## Documentation +- [Frequently asked questions](./doc/faq.md) +- [Tutorials][] +- [Examples](./examples) - [Cheatsheet](./doc/quint-cheatsheet.pdf) -- [Reference API documentation for built-in operators](./doc/builtin.md) - [Syntax documentation](./doc/lang.md) -- [Frequently asked questions](./doc/faq.md) - -### Examples :musical_score: - -We have written [examples](./examples) of several specifications in Quint. -Some of them accompany a TLA+ version for comparison and learning purposes. -To simplify reading, use [syntax highlighting](./editor-plugins) for your -editor (currently, VSCode, Emacs and Vim are supported). - -### Tools :space_invader: - -[Quick previews](./doc/previews.md) of the tools. - - - Quint's core tool `quint`: - - - [Installation](./quint/README.md) - +- [Reference API documentation for built-in operators](./doc/builtin.md) +- [Design Principles][] +- The `quint` CLI tool - [Manual](./doc/quint.md) - - [REPL](./tutorials/repl/repl.md) +- [Literate executable specifications](./doc/literate.md) -- Editor support: - - We strongly encourage you to configure your editor for Quint. Our language - server provides the quickest feedback loop for your specifications, reporting - informative errors as you type. These are instuctions for the currently - supported editors: - - - VSCode: Install the plugin from [Visual Studio Code - Marketplace][]. - - Emacs: Setup two custom packages from the [emacs folder](./editor-plugins/emacs). - - Vim/Neovim: Follow configuration instructions from the [vim folder](./editor-plugins/vim) - - - VSCode plugin for [ITF traces][] by @hvanz: - - This a plugin that visualizes traces that are produced by Quint and - [Apalache][]. Install the [ITF Trace Viewer][] from Visual Studio Code - Marketplace. - - - Writing [literate executable specifications](./doc/literate.md) - - This is a technique for embedding formal quint formal specifications inside - of markdown files. - - -## Communty +## Community -- Join the chat in the [Quint zulip stream][] :telephone: -- Join the [Quint discussions][] :bulb: -- [Contribute your spell][] to the collection of Quint spells :scroll: -- [Contribute](./CONTRIBUTING.md) to the development of Quint :construction_worker: +- Join the chat in the [Quint zulip stream][] +- Join the [Quint discussions][] +- [Contribute your spell][] to the collection of Quint spells +- [Contribute](./CONTRIBUTING.md) to the development of Quint ## On "Quint" @@ -252,5 +212,3 @@ Supported by the Vienna Business Agency
[the Vienna Business Agen
 [Quint zulip stream]: https://informal-systems.zulipchat.com/#narrow/stream/378959-quint
 [Quint discussions]: https://github.com/informalsystems/quint/discussions
 [ITF traces]: https://apalache.informal.systems/docs/adr/015adr-trace.html
-[ITF Trace Viewer]: https://marketplace.visualstudio.com/items?itemName=informal.itf-trace-viewer
-[15 minute intro to Quint]: https://youtu.be/OZIX8rs-kOA

From d547e1f848dbbfa8351b7cd36252dbc67779b435 Mon Sep 17 00:00:00 2001
From: Shon Feder <shon@informal.systems>
Date: Tue, 12 Dec 2023 21:59:46 -0500
Subject: [PATCH 101/388] Remove extra bullet

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 71cebdaea..f8c8156f7 100644
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@
 <p>
     <a href=Installation • Documentation • - Community • + Community

From db376a44ad2e7074a7f798d642deef8022984aed Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 12 Dec 2023 22:00:49 -0500 Subject: [PATCH 102/388] Fix community link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f8c8156f7..bd46a71f8 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@

Installation • Documentation • - Community + Community

From 3d4aaa68715f719e15708e92665777c76570c011 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 12 Dec 2023 22:03:44 -0500 Subject: [PATCH 103/388] A few small updates --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 11684170e..1ee9e770d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -30,7 +30,7 @@ attention. ## Project structure -Currently, the project consists of two npm packages (published locally): +Currently, the project consists of two npm packages: - [quint](./quint) is the transpiler package, see the [quint manual][]. - [vscode/quint](./vscode/quint) is the VSCode plugin for Quint, depends on `quint`. @@ -265,7 +265,7 @@ Between installing the plugin from different sources, you may end up with multip 4. Restart VSCode **twice**. The first time it will recreate the `extensions.json` file, the second time it will install the extensions. Reloading won't work, you need to actually close and reopen VSCode. [Apalache]: https://github.com/informalsystems/apalache -[Contributing to Apalache]: https://github.com/informalsystems/apalache/blob/unstable/CONTRIBUTING.md +[Contributing to Apalache]: https://github.com/informalsystems/apalache/blob/main/CONTRIBUTING.md [eslint]: https://eslint.org/ [quint manual]: ./doc/quint.md [Installing quint]: https://github.com/informalsystems/quint/blob/main/quint/README.md#how-to-install From cfc7c515e771d5e5bb88d06c7ce5b53edf8505d5 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 12 Dec 2023 22:11:35 -0500 Subject: [PATCH 104/388] Restructure docs section again --- README.md | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index bd46a71f8..b3488a23e 100644 --- a/README.md +++ b/README.md @@ -133,16 +133,22 @@ Cosmos in 2023. ## Documentation - [Frequently asked questions](./doc/faq.md) -- [Tutorials][] -- [Examples](./examples) -- [Cheatsheet](./doc/quint-cheatsheet.pdf) -- [Syntax documentation](./doc/lang.md) -- [Reference API documentation for built-in operators](./doc/builtin.md) + +- Quint by example: + - [Cheatsheet](./doc/quint-cheatsheet.pdf) + - [Language tutorials](./tutorials/README.md) + - [REPL tutorial](./tutorials/repl/repl.md) + - [Example specifications](./examples) + +- Language reference: + - [Syntax documentation](./doc/lang.md) + - [Reference API documentation for built-in operators](./doc/builtin.md) + +- Tooling manuals + - [CLI manual](./doc/quint.md) + - [Literate executable specifications](./doc/literate.md) + - [Design Principles][] -- The `quint` CLI tool - - [Manual](./doc/quint.md) - - [REPL](./tutorials/repl/repl.md) -- [Literate executable specifications](./doc/literate.md) ## Community From d12195ed6cb00f9032871ac07da200c1f3bc618c Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 12 Dec 2023 22:17:35 -0500 Subject: [PATCH 105/388] Fix example init --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b3488a23e..19a7232da 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,9 @@ type Status = Working | Prepared | Committed | Aborted const ResourceManagers: Set[str] var statuses: str -> Status -action init = ResourceManagers.mapBy(_ => Working) +action init = { + statuses' = ResourceManagers.mapBy(_ => Working) +} val canCommit: bool = ResourceManagers.forall(rm => statuses.get(rm).in(Set(Prepared, Committed))) val notCommitted: bool = ResourceManagers.forall(rm => statuses.get(rm) != Committed) From 42d0174da49d8889f06b116a8ac2e2bcb17b716f Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Wed, 13 Dec 2023 12:10:43 +0100 Subject: [PATCH 106/388] Change the runtime behavior of `then` (#1304) * fix the semantics of then * update the docs * update changelog * fix formatting * improve comments * add detailed docs * fix the throwing tests * Update quint/src/runtime/impl/compilerImpl.ts Co-authored-by: Shon Feder --------- Co-authored-by: Shon Feder --- CHANGELOG.md | 3 + doc/builtin.md | 4 +- doc/lang.md | 20 ++-- examples/language-features/counters.qnt | 4 +- quint/src/builtin.qnt | 4 +- quint/src/quintError.ts | 2 + quint/src/runtime/impl/compilerImpl.ts | 36 +++++- quint/test/runtime/compile.test.ts | 152 +++++++++++++++++------- 8 files changed, 164 insertions(+), 61 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d0986792c..43ca138e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add a run operator `A.expect(P)` to test the state predicate `P` in the state resulting from applying action `A` (#1303) ### Changed + +- Change in `A.then(B)`: If `A` returns `false`, `A.then(B)` fails (#1304) + ### Deprecated ### Removed ### Fixed diff --git a/doc/builtin.md b/doc/builtin.md index cb39cc040..16e39d655 100644 --- a/doc/builtin.md +++ b/doc/builtin.md @@ -851,7 +851,9 @@ run test = (x' = 0).then(a).then(assert(x == 3)) `a` is true for a step from `s1` to `t` and `b` is true for a step from `t` to `s2`. -This is the action composition operator. +This is the action composition operator. If `a` evaluates to `false`, then +`a.then(b)` reports an error. If `b` evaluates to `false` after `a`, then +`a.then(b)` returns `false`. ### Examples diff --git a/doc/lang.md b/doc/lang.md index 13981fc68..31c578b99 100644 --- a/doc/lang.md +++ b/doc/lang.md @@ -1658,13 +1658,19 @@ then(A, B) The semantics of this operator is as follows. When `A.then(B)` is applied to a state `s_1`, the operator computes a next state `s_2` of `s_1` by applying -action `A`, if such a state exists. If `A` returns `true`, then the operator -`A.then(B)` computes a next state `s_3` of `s_2` by applying action `B`, if -such a state exists. If `B` returns true, then the operator `A.then(B)` returns -`true`, the old state is equal to `s_1`, and the new state is equal to `s_3`. -In all other cases, the operator returns `false`. - -This operator is equivalent to `A \cdot B` of TLA+. +action `A`, if such a state exists. Depending on the result of `A`, two scenarios +are possible: + + - When `A` returns `true`, then the operator `A.then(B)` computes a next state + `s_3` of `s_2` by applying action `B`, if such a state exists. + If `B` returns true, then the operator `A.then(B)` returns + `true`, the old state is equal to `s_1`, and the new state is equal to `s_3`. + Otherwise, the operator `A.then(B)` returns `false`. + + - If `A` returns `false`, then it is impossible to continue. A runtime error + should be reported. + +This operator is equivalent to `A \cdot B` of TLA+ (except for the runtime errors). **Example.** Consider the specification `counters`: diff --git a/examples/language-features/counters.qnt b/examples/language-features/counters.qnt index 4dd254b7e..a316a9e05 100644 --- a/examples/language-features/counters.qnt +++ b/examples/language-features/counters.qnt @@ -80,10 +80,10 @@ module counters { // this tests for a failing condition run failingTest = { init - .then(10.reps(_ => all { + .then(all { n == 0, step, - })) + }) .fail() } diff --git a/quint/src/builtin.qnt b/quint/src/builtin.qnt index 3ec048edc..a1016e636 100644 --- a/quint/src/builtin.qnt +++ b/quint/src/builtin.qnt @@ -780,7 +780,9 @@ module builtin { /// /// `a` is true for a step from `s1` to `t` and `b` is true for a step from `t` to `s2`. /// - /// This is the action composition operator. + /// This is the action composition operator. If `a` evaluates to `false`, then + /// `a.then(b)` reports an error. If `b` evaluates to `false` after `a`, then + /// `a.then(b)` returns `false`. /// /// ### Examples /// diff --git a/quint/src/quintError.ts b/quint/src/quintError.ts index 1df66fad0..b67b9a1e2 100644 --- a/quint/src/quintError.ts +++ b/quint/src/quintError.ts @@ -101,6 +101,8 @@ export type ErrorCode = | 'QNT511' /* QNT512: Simulation failure */ | 'QNT512' + /* QNT513: Cannot continue in 'then' */ + | 'QNT513' /* Additional data for a Quint error */ export interface QuintErrorData { diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index ba06ae4fd..9c50081b8 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -1257,8 +1257,18 @@ export class CompilerVisitor implements IRVisitor { } } - // compute all { ... } or A.then(B)...then(E) for a chain of actions - private chainAllOrThen(actions: Computable[], kind: 'all' | 'then'): Maybe { + /** + * Compute all { ... } or A.then(B)...then(E) for a chain of actions. + * @param actions actions as computable to execute + * @param kind is it 'all { ... }' or 'A.then(B)'? + * @param actionId given the action index, return the id that produced this action + * @returns evaluation result + */ + private chainAllOrThen( + actions: Computable[], + kind: 'all' | 'then', + actionId: (idx: number) => bigint + ): Maybe { // save the values of the next variables, as actions may update them const savedValues = this.snapshotNextVars() const savedTrace = this.trace() @@ -1270,14 +1280,27 @@ export class CompilerVisitor implements IRVisitor { for (const action of actions) { nactionsLeft-- result = action.eval() - if (result.isNone() || !(result.value as RuntimeValue).toBool()) { + const isFalse = result.isJust() && !(result.value as RuntimeValue).toBool() + if (result.isNone() || isFalse) { // As soon as one of the arguments does not evaluate to true, // break out of the loop. // Restore the values of the next variables, // as evaluation was not successful. this.recoverNextVars(savedValues) this.resetTrace(just(rv.mkList(savedTrace))) - break + + if (kind === 'then' && nactionsLeft > 0 && isFalse) { + // Cannot extend a run. Emit an error message. + const actionNo = actions.length - (nactionsLeft + 1) + this.errorTracker.addRuntimeError( + actionId(actionNo), + 'QNT513', + `Cannot continue in A.then(B), A evaluates to 'false'` + ) + return none() + } else { + return result + } } // switch to the next frame, when implementing A.then(B) @@ -1302,7 +1325,7 @@ export class CompilerVisitor implements IRVisitor { const args = this.compStack.splice(-app.args.length) const kind = app.opcode === 'then' ? 'then' : 'all' - const lazyCompute = () => this.chainAllOrThen(args, kind) + const lazyCompute = () => this.chainAllOrThen(args, kind, idx => app.args[idx].id) this.compStack.push(mkFunComputable(lazyCompute)) } @@ -1384,7 +1407,8 @@ export class CompilerVisitor implements IRVisitor { }, } }) - return this.chainAllOrThen(actions, 'then') + // In case the case of reps, we have multiple copies of the same action. This is why all occurrences have the same id. + return this.chainAllOrThen(actions, 'then', _ => app.args[1].id) }) .join() } diff --git a/quint/test/runtime/compile.test.ts b/quint/test/runtime/compile.test.ts index a2a431736..fe326ff69 100644 --- a/quint/test/runtime/compile.test.ts +++ b/quint/test/runtime/compile.test.ts @@ -3,7 +3,7 @@ import { assert } from 'chai' import { Either, left, right } from '@sweet-monads/either' import { just } from '@sweet-monads/maybe' import { expressionToString } from '../../src/ir/IRprinting' -import { Computable, ComputableKind, fail, kindName } from '../../src/runtime/runtime' +import { Callable, Computable, ComputableKind, fail, kindName } from '../../src/runtime/runtime' import { noExecutionListener } from '../../src/runtime/trace' import { CompilationContext, @@ -80,56 +80,84 @@ function assertVarExists(kind: ComputableKind, name: string, input: string) { res.mapLeft(m => assert.fail(m)) } +// compile a computable for a run definition +function callableFromContext(ctx: CompilationContext, callee: string): Either { + let key = undefined + const lastModule = ctx.compilationState.modules[ctx.compilationState.modules.length - 1] + const def = lastModule.declarations.find(def => def.kind === 'def' && def.name === callee) + if (!def) { + return left(`${callee} definition not found`) + } + key = kindName('callable', def.id) + if (!key) { + return left(`${callee} not found`) + } + const run = ctx.evaluationState.context.get(key) as Callable + if (!run) { + return left(`${callee} not found via ${key}`) + } + + return right(run) +} + // Scan the context for a callable. If found, evaluate it and return the value of the given var. -// Assumes the input has a single callable -// `callee` is used for error reporting. -function evalVarAfterCall(varName: string, callee: string, input: string): Either { +// Assumes the input has a single definition whose name is stored in `callee`. +function evalVarAfterRun(varName: string, callee: string, input: string): Either { // use a combination of Maybe and Either. // Recall that left(...) is used for errors, // whereas right(...) is used for non-errors in sweet monads. const callback = (ctx: CompilationContext): Either => { - let key = undefined - const lastModule = ctx.compilationState.modules[ctx.compilationState.modules.length - 1] - const def = lastModule.declarations.find(def => def.kind === 'def' && def.name === callee) - if (!def) { - return left(`${callee} definition not found`) - } - key = kindName('callable', def.id) - if (!key) { - return left(`${callee} not found`) - } - const run = ctx.evaluationState.context.get(key) - if (!run) { - return left(`${callee} not found via ${key}`) - } + return callableFromContext(ctx, callee) + .mapRight(run => { + return run + .eval() + .map(res => { + if ((res as RuntimeValue).toBool() === true) { + // extract the value of the state variable + const nextVal = (ctx.evaluationState.context.get(kindName('nextvar', varName)) ?? fail).eval() + if (nextVal.isNone()) { + return left(`Value of the variable ${varName} is undefined`) + } else { + return right(expressionToString(nextVal.value.toQuintEx(idGen))) + } + } else { + const s = expressionToString(res.toQuintEx(idGen)) + const m = `Callable ${callee} was expected to evaluate to true, found: ${s}` + return left(m) + } + }) + .or(just(left(`Value of ${callee} is undefined`))) + .unwrap() + }) + .join() + } - return run - .eval() - .map(res => { - if ((res as RuntimeValue).toBool() === true) { - // extract the value of the state variable - const nextVal = (ctx.evaluationState.context.get(kindName('nextvar', varName)) ?? fail).eval() - // using if-else, as map-or-unwrap confuses the compiler a lot - if (nextVal.isNone()) { - return left(`Value of the variable ${varName} is undefined`) - } else { - return right(expressionToString(nextVal.value.toQuintEx(idGen))) - } - } else { - const s = expressionToString(res.toQuintEx(idGen)) - const m = `Callable ${callee} was expected to evaluate to true, found: ${s}` - return left(m) - } + return evalInContext(input, callback) +} + +// Evaluate a run and return the result. +function evalRun(callee: string, input: string): Either { + // Recall that left(...) is used for errors, + // whereas right(...) is used for non-errors in sweet monads. + const callback = (ctx: CompilationContext): Either => { + return callableFromContext(ctx, callee) + .mapRight(run => { + return run + .eval() + .map(res => { + return right(expressionToString(res.toQuintEx(idGen))) + }) + .or(just(left(`Value of ${callee} is undefined`))) + .unwrap() }) - .or(just(left(`Value of ${callee} is undefined`))) - .unwrap() + .join() } return evalInContext(input, callback) } function assertVarAfterCall(varName: string, expected: string, callee: string, input: string) { - evalVarAfterCall(varName, callee, input) + evalVarAfterRun(varName, callee, input) .mapLeft(m => assert.fail(m)) .mapRight(output => assert(expected === output, `Expected ${varName} == ${expected}, found ${output}`)) } @@ -933,7 +961,7 @@ describe('compiling specs to runtime values', () => { }) describe('compile runs', () => { - it('then', () => { + it('then ok', () => { const input = dedent( `var n: int |run run1 = (n' = 1).then(n' = n + 2).then(n' = n * 4) @@ -943,6 +971,30 @@ describe('compiling specs to runtime values', () => { assertVarAfterCall('n', '12', 'run1', input) }) + it('then fails when rhs is unreachable', () => { + const input = dedent( + `var n: int + |run run1 = (n' = 1).then(all { n == 0, n' = n + 2 }).then(n' = 3) + ` + ) + + evalRun('run1', input) + .mapRight(result => assert.fail(`Expected the run to fail, found: ${result}`)) + .mapLeft(m => assert.equal(m, 'Value of run1 is undefined')) + }) + + it('then returns false when rhs is false', () => { + const input = dedent( + `var n: int + |run run1 = (n' = 1).then(all { n == 0, n' = n + 2 }) + ` + ) + + evalRun('run1', input) + .mapRight(result => assert.equal(result, 'false')) + .mapLeft(m => assert.fail(`Expected the run to return false, found: ${m}`)) + }) + it('reps', () => { const input = dedent( `var n: int @@ -958,6 +1010,18 @@ describe('compiling specs to runtime values', () => { assertVarAfterCall('hist', 'List(0, 1, 2)', 'run2', input) }) + it('reps fails when action is false', () => { + const input = dedent( + `var n: int + |run run1 = (n' = 0).then(10.reps(i => all { n < 5, n' = n + 1 })) + ` + ) + + evalRun('run1', input) + .mapRight(result => assert.fail(`Expected the run to fail, found: ${result}`)) + .mapLeft(m => assert.equal(m, 'Value of run1 is undefined')) + }) + it('fail', () => { const input = dedent( `var n: int @@ -965,7 +1029,7 @@ describe('compiling specs to runtime values', () => { ` ) - evalVarAfterCall('n', 'run1', input).mapRight(m => assert.fail(`Expected the run to fail, found: ${m}`)) + evalVarAfterRun('n', 'run1', input).mapRight(m => assert.fail(`Expected the run to fail, found: ${m}`)) }) it('assert', () => { @@ -975,7 +1039,7 @@ describe('compiling specs to runtime values', () => { ` ) - evalVarAfterCall('n', 'run1', input).mapRight(m => assert.fail(`Expected an error, found: ${m}`)) + evalVarAfterRun('n', 'run1', input).mapRight(m => assert.fail(`Expected an error, found: ${m}`)) }) it('expect fails', () => { @@ -985,7 +1049,7 @@ describe('compiling specs to runtime values', () => { ` ) - evalVarAfterCall('n', 'run1', input).mapRight(m => assert.fail(`Expected the run to fail, found: ${m}`)) + evalVarAfterRun('n', 'run1', input).mapRight(m => assert.fail(`Expected the run to fail, found: ${m}`)) }) it('expect ok', () => { @@ -1005,7 +1069,7 @@ describe('compiling specs to runtime values', () => { ` ) - evalVarAfterCall('n', 'run1', input).mapRight(m => assert.fail(`Expected the run to fail, found: ${m}`)) + evalVarAfterRun('n', 'run1', input).mapRight(m => assert.fail(`Expected the run to fail, found: ${m}`)) }) it('expect and then expect fail', () => { @@ -1015,7 +1079,7 @@ describe('compiling specs to runtime values', () => { ` ) - evalVarAfterCall('n', 'run1', input).mapRight(m => assert.fail(`Expected the run to fail, found: ${m}`)) + evalVarAfterRun('n', 'run1', input).mapRight(m => assert.fail(`Expected the run to fail, found: ${m}`)) }) it('q::debug', () => { From bd19423b66a41bc255633670a2fa96457941db74 Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 13 Dec 2023 09:13:42 -0300 Subject: [PATCH 107/388] Clarify TLA+ vs TLA --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 19a7232da..b5a8554cf 100644 --- a/README.md +++ b/README.md @@ -94,11 +94,11 @@ Prepare(rm) == /\ statuses[rm] = "working" ### Motivation -Quint is inspired by [TLA+][] but provides an alternative surface syntax for -specifying systems in TLA. The most important feature of our syntax is that it -is minimal and regular, making Quint an easy target for advanced developer -tooling and static analysis (see our [design principles][] and [previews of the -tooling](./doc/previews.md) of the tooling). +Quint is inspired by [TLA+][] (the language) but provides an alternative surface +syntax for specifying systems in TLA (the logic). The most important feature of +our syntax is that it is minimal and regular, making Quint an easy target for +advanced developer tooling and static analysis (see our [design principles][] +and [previews](./doc/previews.md) of the tooling). The syntax also aims to be familiar to engineers: From b76c870ec8ac1dfaba72da82143d35169d4897a4 Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 13 Dec 2023 09:14:30 -0300 Subject: [PATCH 108/388] Replace Vienna Business Agency logo with the English version --- README.md | 3 +-- Wirtschaftsagentur_Wien_logo.jpg | Bin 826867 -> 0 bytes logos/vienna-business-agency.png | Bin 0 -> 3625 bytes 3 files changed, 1 insertion(+), 2 deletions(-) delete mode 100644 Wirtschaftsagentur_Wien_logo.jpg create mode 100644 logos/vienna-business-agency.png diff --git a/README.md b/README.md index b5a8554cf..da0f96ef4 100644 --- a/README.md +++ b/README.md @@ -171,8 +171,7 @@ become referenced artifacts. Quint is developed at [Informal Systems](https://informal.systems/). - -Supported by the Vienna Business Agency
[the Vienna Business Agency](https://viennabusinessagency.at/). +Supported by the Vienna Business Agency
[Vienna Business Agency](https://viennabusinessagency.at/). [Design Principles]: ./doc/design-principles.md diff --git a/Wirtschaftsagentur_Wien_logo.jpg b/Wirtschaftsagentur_Wien_logo.jpg deleted file mode 100644 index 5598fbeceb22ba596da71140bcbfc6cabf26faa7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 826867 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 z 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 z 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

e5AS~a;XkZI?6q2n3f5>- z?tlqp4Op=B0S7L5z(bUQt4`Rk^Cct4h@aR@Q0xu2`(&y<&x) z=kgJK_vQNx+?JmQcMaV7elT!b_U9zGUg7`nD#qba^!*;_Z-NiA20p}+)rkEDkbkib z@4xY#HR&7FC}ramN*b9(@gwtD%!n%&xzUFY-xwke*%&Pi+K{B^zadN6cSDiPYkjq< z$NEfHzJ zwqeBo8;SBa6D1)miXBySIrj2C}W z?er6o$t!~RWwt|q2>Q!Lunq@xf93%lKpz|>3Ok8)7^e{f!w;}RPKr6cJIL&sCYfHJ zLNl+M(v0g?H2pP4n)aF}ncN5>;~Oz#bTf?%Zx+*(TMab%)>4{uYXj-OzMtv6ewp-c zeL;FRe`b2G{Q(5-1?zF$E#CwWXvg0kQ2t?}WN3$%BYHd)%m5a^p6C}(5DHR2DZtI=7Yw*35PJflU$25U{-F{2CAj9& z(dUt9b8l$dLwojrkppsqL`qZ#ssAz zPz_o@H|PfgU_BEQH-k|U6vx0pZ~|PQzZ7rMABrE*Z;B7-vEncElcGRBDhc$1lE8jY z{=W!@@Ei<{VdnsSltp(A%3@D~rZ>tH&IGk&Cdl(ZC1?a4pckwHLtrD=#{QD;Vt>f@ zv#0W-^t=2l{VKmskL4fGkMjHUo%}I9lnd+u%%uAhs0r+wmk>zxnVeA`e-frdvp*-LvEK{|*b{>)_Ot#X_M?6W`$4~#JUi4%}82f2jB70<#%^n(;vTuxQ+1JJ`>`UV=_JwgD`^;z! z`_yQdeQdOuePpzg-8CL(?;D@s-Zj3+y>0v-?vBaV+%1!z`PZfiqHEIx@zrU9cJKfkP!30J`pteSJ+d{Uujkp)CpMn+flU~_ZJo&8u+HXg zS(R`%tg89zR*U$nmWxG~EtiTeS*{enYPnW?!E!`$&T@z3jODoGwB4 z&@HC`cFi%GU2;t2E;!`z=j_WwXY6aluh=z7PTF-ykK6T1kJ+wLIAS}jc-VG};z8Rz zO5?Uil=s_SP~L0%mhx`9`zkx^ewB^dVFcL=@~!_uu$RJz;*b-=(~s~0zVTF~FWuzy z?gAZp-QAR~df3sc9^UMXM;Ld~J%K;wmLWQ_pg?lawL&`XTBoqzrA2YCOPA6f=RW1# z&I2ktoj1xxop;E#IUSI1bv~`S+4+|0i1Sx!>s=nJ4`UPPbztaU2u@hO=T7v<2Qi;N z;(vem55Djpe31X(XF_NEt?7in8$0Y5$Q|&F7VY&(5%2NNmhSW_Rv7iHQrhO(puEMS zO=Yvk64{9R3e^qnLu$kBThxc#_iC(lKcO+;eob?=`=^>KJ$}+!;UQ=(2mPLc=F3c2 z%fERe-yQMyyST-_j$DN6AriV61pgsq3LOodOXHzVY%Ii=+Zh}t+8z`y*%FwpFcOfb zxWT_vdDyR7HsrfVKIpqxb&XH2`YN9_8Y_G@YWDl=(pu(oM7!7LlFm|}yE;pJzt`#V z{Syc}oqmG$%V4=9Jw*LK3`5)-g-i}d6+MFfd9 zghxx(g(WKthGr?P2`N-r8C)S>9#p5=7u2HO8`!PU6SzXFJ78G5GhkGAalk>n_JH$x zZGrFTw*-Ex*BtZ*5OkaVMhC}dAmx$13dUM@=wFYAegfv%@z`%K7JClF>Cle&8MGzd zhHZ>nzzxOviw0sMB&(w16_!V)DJ_f4RaqKQB3}}|P^~kpQDbpfhh|%7pLR>=THU75 zEqaY1`}G?_&luE&-Z7{RePB=<_Pc%!z9b�o@n;>WdtZaO}GfhnO=Nv41LJ4Lox9 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�Xu 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

9%1B-(u}Adzs- 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�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�O_SeNOq1ecu{_&uH?CCdi>|#_;Tj)d?3XLdE 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�PC@KfBP(GCl6s@Xr^>?l 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 z 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

j#n(+CU!`KvWg8Mgxg+#i5 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 Date: Wed, 13 Dec 2023 09:15:32 -0300 Subject: [PATCH 109/388] Fix image path --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index da0f96ef4..3fb785034 100644 --- a/README.md +++ b/README.md @@ -171,7 +171,7 @@ become referenced artifacts. Quint is developed at [Informal Systems](https://informal.systems/). -Supported by the Vienna Business Agency
[Vienna Business Agency](https://viennabusinessagency.at/). +Supported by the Vienna Business Agency
[Vienna Business Agency](https://viennabusinessagency.at/). [Design Principles]: ./doc/design-principles.md From 9bbe4092fc384ba36f521c32f50aa2d92ea374ac Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 13 Dec 2023 09:16:23 -0300 Subject: [PATCH 110/388] Reduce image size --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3fb785034..5287e846b 100644 --- a/README.md +++ b/README.md @@ -171,7 +171,7 @@ become referenced artifacts. Quint is developed at [Informal Systems](https://informal.systems/). -Supported by the Vienna Business Agency
[Vienna Business Agency](https://viennabusinessagency.at/). +Supported by the Vienna Business Agency.
[Vienna Business Agency](https://viennabusinessagency.at/) [Design Principles]: ./doc/design-principles.md From 0a2c80e416ff12b4c49c559ae5c1b5ffdbc7122a Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Wed, 13 Dec 2023 13:40:32 +0100 Subject: [PATCH 111/388] fix the test --- examples/cosmos/bank/bankTest.qnt | 7 ++----- examples/cosmos/bank/cosmos-bank.md | 7 ++----- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/examples/cosmos/bank/bankTest.qnt b/examples/cosmos/bank/bankTest.qnt index 3a6b57464..3f886b50f 100644 --- a/examples/cosmos/bank/bankTest.qnt +++ b/examples/cosmos/bank/bankTest.qnt @@ -37,18 +37,15 @@ module bankTest { // tests run getAllBalancesTest = { init - .then( + .expect( val ctx = stateToCtx(0) val kings = ViewKeeper::GetAllBalances(ctx, "king") val donkeys = ViewKeeper::GetAllBalances(ctx, "donkeykong") - all { + and { assert(kings.keys() == Set("banana", "burger")), assert(kings.get("banana") == 10_000), assert(kings.get("burger") == 10_000), assert(donkeys.keys() == Set()), - // do not change the state - balances' = balances, - supply' = supply, } ) } diff --git a/examples/cosmos/bank/cosmos-bank.md b/examples/cosmos/bank/cosmos-bank.md index d0f1219b5..11c0b1c25 100644 --- a/examples/cosmos/bank/cosmos-bank.md +++ b/examples/cosmos/bank/cosmos-bank.md @@ -368,18 +368,15 @@ For example, we expect the `GetAllBalances` to return balances in the genesis st ```bluespec "tests" += run getAllBalancesTest = { init - .then( + .expect( val ctx = stateToCtx(0) val kings = ViewKeeper::GetAllBalances(ctx, "king") val donkeys = ViewKeeper::GetAllBalances(ctx, "donkeykong") - all { + and { assert(kings.keys() == Set("banana", "burger")), assert(kings.get("banana") == 10_000), assert(kings.get("burger") == 10_000), assert(donkeys.keys() == Set()), - // do not change the state - balances' = balances, - supply' = supply, } ) } From 65ef33dcfde036718d134b89a965f14e5b6a7427 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Wed, 13 Dec 2023 14:38:46 +0100 Subject: [PATCH 112/388] add step --- examples/cosmos/bank/bankTest.qnt | 52 ++++++++++++++++++- examples/cosmos/bank/cosmos-bank.md | 80 ++++++++++++++++++++++++++++- 2 files changed, 130 insertions(+), 2 deletions(-) diff --git a/examples/cosmos/bank/bankTest.qnt b/examples/cosmos/bank/bankTest.qnt index 3f886b50f..68112aed1 100644 --- a/examples/cosmos/bank/bankTest.qnt +++ b/examples/cosmos/bank/bankTest.qnt @@ -6,6 +6,12 @@ module bankTest { var supply: Denom -> Int256 // Balances for each address var balances: Addr -> Coins + // if non-empty, then it stores the last error message + var _lastError: str + // all addresses we would like to work with + pure val ADDR = Set("king", "donkeykong", "peaches", "mario") + // all denominations + pure val DENOM = Set("banana", "burger") // state transitions of the machine // initialize the state machine @@ -13,7 +19,35 @@ module bankTest { // limit the total supply of burgers and bananas to 10_000 supply' = Set("banana", "burger").mapBy(d => 10_000), // the king has it all - balances' = Set("king").mapBy(a => Set("banana", "burger").mapBy(d => 10_000)) + balances' = Set("king").mapBy(a => Set("banana", "burger").mapBy(d => 10_000)), + _lastError' = "", + } + action send(fromAddr: Addr, toAddr: Addr, coins: Coins): bool = all { + val ctx = stateToCtx(0) + val result = SendKeeper::SendCoins(ctx, fromAddr, toAddr, coins) + match result { + | BankOk(newCtx) => all { + balances' = newCtx.balances, + supply' = supply, + _lastError' = "", + } + | BankErr(msg) => all { + // We could simply return 'false' here. + // But we prefer to store the error message instead. + _lastError' = msg, + balances' = balances, + supply' = supply, + } + } + } + + + action step = any { + nondet fromAddr = oneOf(ADDR) + nondet toAddr = oneOf(ADDR) + nondet denom = oneOf(DENOM) + nondet amt = (-10).to(supply.get(denom)).oneOf() + send(fromAddr, toAddr, Set(denom).mapBy(d => amt)) } // protocol invariants @@ -62,4 +96,20 @@ module bankTest { } } } + run sendTest = { + init + // the King has bananas and he can send it + .then(send("king", + "donkeykong", + Set("banana").mapBy(d => 2_000))) + .expect(and { + balances.get("king").get("banana") == 8_000, + balances.get("donkeykong").get("banana") == 2_000, + balances.get("king").get("burger") == 10_000, + balances.get("donkeykong").keys() == Set("banana"), + }) + // Donkeykong does not have any burgers, so this action must fail + .then(send("donkeykong", "peaches", Set("burger").mapBy(d => 1_000))) + .expect(_lastError == "invalid coins or insufficient funds") + } } diff --git a/examples/cosmos/bank/cosmos-bank.md b/examples/cosmos/bank/cosmos-bank.md index 11c0b1c25..b6012093b 100644 --- a/examples/cosmos/bank/cosmos-bank.md +++ b/examples/cosmos/bank/cosmos-bank.md @@ -219,6 +219,16 @@ We represent this field as a map in the protocol specification: var balances: Addr -> Coins ``` +For protocol debugging purposes, we introduce a state variable that keeps +the last error message. It makes it easier to write tests. To indicate that +this variable is not, strictly speaking, part of the protocol, we start its +name with underscore: + +```bluespec "state" += +// if non-empty, then it stores the last error message +var _lastError: str +``` + We could initialize the state via `init`, which would be similar to executing genesis transactions in Cosmos: @@ -228,7 +238,8 @@ action init = all { // limit the total supply of burgers and bananas to 10_000 supply' = Set("banana", "burger").mapBy(d => 10_000), // the king has it all - balances' = Set("king").mapBy(a => Set("banana", "burger").mapBy(d => 10_000)) + balances' = Set("king").mapBy(a => Set("banana", "burger").mapBy(d => 10_000)), + _lastError' = "", } ``` @@ -553,6 +564,48 @@ pure def SendKeeper::SendCoins(ctx: BankCtx, ``` +```bluespec "transitions" += +action send(fromAddr: Addr, toAddr: Addr, coins: Coins): bool = all { + val ctx = stateToCtx(0) + val result = SendKeeper::SendCoins(ctx, fromAddr, toAddr, coins) + match result { + | BankOk(newCtx) => all { + balances' = newCtx.balances, + supply' = supply, + _lastError' = "", + } + | BankErr(msg) => all { + // We could simply return 'false' here. + // But we prefer to store the error message instead. + _lastError' = msg, + balances' = balances, + supply' = supply, + } + } +} +``` + +Here is a basic test of `send`: + +```bluespec "tests" += +run sendTest = { + init + // the King has bananas and he can send it + .then(send("king", + "donkeykong", + Set("banana").mapBy(d => 2_000))) + .expect(and { + balances.get("king").get("banana") == 8_000, + balances.get("donkeykong").get("banana") == 2_000, + balances.get("king").get("burger") == 10_000, + balances.get("donkeykong").keys() == Set("banana"), + }) + // Donkeykong does not have any burgers, so this action must fail + .then(send("donkeykong", "peaches", Set("burger").mapBy(d => 1_000))) + .expect(_lastError == "invalid coins or insufficient funds") +} +``` + - `InputOutputCoins` performs multi-send functionality. It accepts a series of inputs that correspond to a series of outputs. It returns an error if the inputs and outputs don't lineup or if any single transfer of tokens fails. @@ -655,5 +708,30 @@ type Params = { } ``` +### Appendix + +This part contains technical parts of the specification that are not that +interesting. + +```bluespec "state" += +// all addresses we would like to work with +pure val ADDR = Set("king", "donkeykong", "peaches", "mario") +// all denominations +pure val DENOM = Set("banana", "burger") +``` + +```bluespec "transitions" += + + +action step = any { + nondet fromAddr = oneOf(ADDR) + nondet toAddr = oneOf(ADDR) + nondet denom = oneOf(DENOM) + nondet amt = (-10).to(supply.get(denom)).oneOf() + send(fromAddr, toAddr, Set(denom).mapBy(d => amt)) +} +``` + + [bank module]: https://docs.cosmos.network/v0.46/modules/bank/# [lmt]: https://github.com/driusan/lmt From aaa3b718093400b3063c27a6aecab601be6586d5 Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Wed, 13 Dec 2023 14:39:18 +0100 Subject: [PATCH 113/388] introduce type defences (#1306) --- quint/src/runtime/impl/runtimeValue.ts | 26 +++++++++++++++----------- quint/test/repl.test.ts | 6 +++++- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/quint/src/runtime/impl/runtimeValue.ts b/quint/src/runtime/impl/runtimeValue.ts index a7ecfde25..250e8350e 100644 --- a/quint/src/runtime/impl/runtimeValue.ts +++ b/quint/src/runtime/impl/runtimeValue.ts @@ -488,19 +488,23 @@ abstract class RuntimeValueBase implements RuntimeValue { } toSet(): Set { - // the default transformation to a set is done via iteration - let set = Set.of() - for (const e of this) { - set = set.add(e.normalForm()) + if (this.isSetLike) { + // the default transformation to a set is done via iteration + let set = Set.of() + for (const e of this) { + set = set.add(e.normalForm()) + } + return set + } else { + throw new Error('Expected a set-like value') } - return set } toList(): List { if (this instanceof RuntimeValueTupleOrList) { return this.list } else { - return List() + throw new Error('Expected a list value') } } @@ -508,7 +512,7 @@ abstract class RuntimeValueBase implements RuntimeValue { if (this instanceof RuntimeValueRecord) { return this.map } else { - return OrderedMap() + throw new Error('Expected a record value') } } @@ -516,7 +520,7 @@ abstract class RuntimeValueBase implements RuntimeValue { if (this instanceof RuntimeValueMap) { return this.map } else { - return Map() + throw new Error('Expected a map value') } } @@ -524,7 +528,7 @@ abstract class RuntimeValueBase implements RuntimeValue { if (this instanceof RuntimeValueBool) { return (this as RuntimeValueBool).value } else { - return false + throw new Error('Expected a Boolean value') } } @@ -532,7 +536,7 @@ abstract class RuntimeValueBase implements RuntimeValue { if (this instanceof RuntimeValueInt) { return (this as RuntimeValueInt).value } else { - return 0n + throw new Error('Expected an integer value') } } @@ -540,7 +544,7 @@ abstract class RuntimeValueBase implements RuntimeValue { if (this instanceof RuntimeValueStr) { return (this as RuntimeValueStr).value } else { - return '' + throw new Error('Expected a string value') } } diff --git a/quint/test/repl.test.ts b/quint/test/repl.test.ts index 8b9e3e357..128b7006b 100644 --- a/quint/test/repl.test.ts +++ b/quint/test/repl.test.ts @@ -148,7 +148,11 @@ describe('repl ok', () => { |^^^^^^^^^ | | - |1 + |runtime error: error: [QNT501] Expected an integer value + |1 + false + |^^^^^^^^^ + | + | |>>> ` ) await assertRepl(input, output) From 706d61c899a91f46edeaf664edbaabdfab401fa7 Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 13 Dec 2023 10:41:57 -0300 Subject: [PATCH 114/388] Format features differently --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 5287e846b..d0621af49 100644 --- a/README.md +++ b/README.md @@ -84,13 +84,13 @@ Prepare(rm) == /\ statuses[rm] = "working" ### Features -- A simple and familiar **syntax** to support engineers reading and writing specifications -- An expressive **type systems** to ensure the domain model is coherent -- A novel **effect system** to ensure state updates are coherent -- **IDE support** via LSP, giving real time feedback when writing specifications -- A **REPL** enabling interactive exploration of specifications -- A **simulator** enabling tests, trace generation, and exploration of your system -- **Symbolic model checking** to verify your specifications via [Apalache][apalache] +- A simple and familiar **syntax** :: to support engineers reading and writing specifications +- An expressive **type systems** :: to ensure the domain model is coherent +- A novel **effect system** :: to ensure state updates are coherent +- **IDE support** via LSP :: giving real time feedback when writing specifications +- A **REPL** :: enabling interactive exploration of specifications +- A **simulator** :: enabling tests, trace generation, and exploration of your system +- **Symbolic model checking** :: to verify your specifications via [Apalache][apalache] ### Motivation From 232f02cf9a898f62181540d4d94c6800406a3dcc Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 13 Dec 2023 10:57:58 -0300 Subject: [PATCH 115/388] Use definitions for features --- README.md | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index d0621af49..1091d2cb3 100644 --- a/README.md +++ b/README.md @@ -83,14 +83,28 @@ Prepare(rm) == /\ statuses[rm] = "working" ### Features +

+
A simple and familiar syntax
+
to support engineers reading and writing specifications
-- A simple and familiar **syntax** :: to support engineers reading and writing specifications -- An expressive **type systems** :: to ensure the domain model is coherent -- A novel **effect system** :: to ensure state updates are coherent -- **IDE support** via LSP :: giving real time feedback when writing specifications -- A **REPL** :: enabling interactive exploration of specifications -- A **simulator** :: enabling tests, trace generation, and exploration of your system -- **Symbolic model checking** :: to verify your specifications via [Apalache][apalache] +
An expressive **type systems**
+
to ensure the domain model is coherent
+ +
A novel **effect system**
+
to ensure state updates are coherent
+ +
**IDE support** via LSP
+
giving real time feedback when writing specifications
+ +
A **REPL**
+
enabling interactive exploration of specifications
+ +
A **simulator**
+
enabling tests, trace generation, and exploration of your system
+ +
**Symbolic model checking**
+
to verify your specifications via [Apalache][apalache]
+
### Motivation From fee1e156b264388e64f062b1eaec878170113e33 Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 13 Dec 2023 11:04:08 -0300 Subject: [PATCH 116/388] Add simpler example --- README.md | 43 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 1091d2cb3..014e5f667 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,45 @@ development tooling. Here's some example code in Quint: +``` bluespec +module tictactoe { + type Player = X | O + type Square = Occupied(Player) | Empty + + /// A 3x3 tic-tac-toe board + var board: int -> (int -> Square) + + /// Coordinates for board corners + pure val corners = Set((1,1), (3,1), (1,3), (3,3)) + + def square(coordinate: (int, int)): Square = + board.get(coordinate._1).get(coordinate._2) + + def isEmpty(coordinate) = match square(coordinate) { + | Empty => true + | _ => false + } + + /// A player makes a move on a board coordinate, if it is empty + action Move(player, coordinate) = all { + isEmpty(coordinate), + board' = board.setBy( + coordinate._1, + row => row.set(coordinate._2, Occupied(player)) + ), + } + + /// Nondeterministically pick a corner, and player X makes a move on that corner + action StartInCorner = + nondet corner = oneOf(corners) + Move(X, corner) +} +``` + +
+A comparisson between Quint and TLA+ code + +Quint: ```bluespec type Status = Working | Prepared | Committed | Aborted @@ -61,9 +100,7 @@ action prepare(rm) = all { } ``` -
-The equivalent TLA+ code - +TLA+: ```tla CONSTANT ResourceManagers VARIABLE statuses From a034e158214615f59759e9cb2f4def91a092d033 Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 13 Dec 2023 12:06:05 -0300 Subject: [PATCH 117/388] Fix bold inside HTML --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 014e5f667..e0f971652 100644 --- a/README.md +++ b/README.md @@ -124,22 +124,22 @@ Prepare(rm) == /\ statuses[rm] = "working"
A simple and familiar syntax
to support engineers reading and writing specifications
-
An expressive **type systems**
+
An expressive type systems
to ensure the domain model is coherent
-
A novel **effect system**
+
A novel effect system
to ensure state updates are coherent
-
**IDE support** via LSP
+
IDE support via LSP
giving real time feedback when writing specifications
-
A **REPL**
+
A REPL
enabling interactive exploration of specifications
-
A **simulator**
+
A simulator
enabling tests, trace generation, and exploration of your system
-
**Symbolic model checking**
+
Symbolic model checking
to verify your specifications via [Apalache][apalache]
From ce4a039c9965df16ae47669749baacb3239529ab Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 13 Dec 2023 12:07:19 -0300 Subject: [PATCH 118/388] Move comparisson to motivation section --- README.md | 83 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 42 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index e0f971652..61f7caa61 100644 --- a/README.md +++ b/README.md @@ -77,47 +77,6 @@ module tictactoe { } ``` -
-A comparisson between Quint and TLA+ code - -Quint: -```bluespec -type Status = Working | Prepared | Committed | Aborted - -const ResourceManagers: Set[str] -var statuses: str -> Status - -action init = { - statuses' = ResourceManagers.mapBy(_ => Working) -} - -val canCommit: bool = ResourceManagers.forall(rm => statuses.get(rm).in(Set(Prepared, Committed))) -val notCommitted: bool = ResourceManagers.forall(rm => statuses.get(rm) != Committed) - -action prepare(rm) = all { - statuses.get(rm) == Working, - statuses' = statuses.set(rm, Prepared) -} -``` - -TLA+: -```tla -CONSTANT ResourceManagers -VARIABLE statuses - -TCTypeOK == statuses \in [ResourceManagers -> {"working", "prepared", "committed", "aborted"}] - -TCInit == statuses = [rm \in ResourceManagers |-> "working"] - -canCommit == \A rm \in ResourceManagers : statuses[rm] \in {"prepared", "committed"} - -notCommitted == \A rm \in ResourceManagers : statuses[rm] # "committed" - -Prepare(rm) == /\ statuses[rm] = "working" - /\ statuses' = [statuses EXCEPT ![rm] = "prepared"] -``` - -
### Features
@@ -162,6 +121,48 @@ The syntax also aims to be familiar to engineers: Thanks to its foundation in TLA and its alignment with TLA+, Quint comes with formal semantics built-in. +
+A comparisson between Quint and TLA+ code + +Quint: +```bluespec +type Status = Working | Prepared | Committed | Aborted + +const ResourceManagers: Set[str] +var statuses: str -> Status + +action init = { + statuses' = ResourceManagers.mapBy(_ => Working) +} + +val canCommit: bool = ResourceManagers.forall(rm => statuses.get(rm).in(Set(Prepared, Committed))) +val notCommitted: bool = ResourceManagers.forall(rm => statuses.get(rm) != Committed) + +action prepare(rm) = all { + statuses.get(rm) == Working, + statuses' = statuses.set(rm, Prepared) +} +``` + +TLA+: +```tla +CONSTANT ResourceManagers +VARIABLE statuses + +TCTypeOK == statuses \in [ResourceManagers -> {"working", "prepared", "committed", "aborted"}] + +TCInit == statuses = [rm \in ResourceManagers |-> "working"] + +canCommit == \A rm \in ResourceManagers : statuses[rm] \in {"prepared", "committed"} + +notCommitted == \A rm \in ResourceManagers : statuses[rm] # "committed" + +Prepare(rm) == /\ statuses[rm] = "working" + /\ statuses' = [statuses EXCEPT ![rm] = "prepared"] +``` + +
+ To learn more about Quint's motivation and design philosophy, watch this [15 minute presentation](https://youtu.be/OZIX8rs-kOA), delivered at Gateway to Cosmos in 2023. From 40dd6edc6ec5da52372d92740405f9786f579d4a Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 13 Dec 2023 12:35:58 -0500 Subject: [PATCH 119/388] Add roadmap to documentation section --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 61f7caa61..d239a4228 100644 --- a/README.md +++ b/README.md @@ -202,8 +202,9 @@ Cosmos in 2023. - [CLI manual](./doc/quint.md) - [Literate executable specifications](./doc/literate.md) -- [Design Principles][] - +- Development plans: + - [Design Principles](./doc/design-principles.md) + - [Roadmap](./doc/roadmap.md) ## Community From 3b6911498582025a29266f7634ca5a1a335d2118 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 13 Dec 2023 12:44:48 -0500 Subject: [PATCH 120/388] Fix typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d239a4228..a429cc93f 100644 --- a/README.md +++ b/README.md @@ -122,7 +122,7 @@ Thanks to its foundation in TLA and its alignment with TLA+, Quint comes with formal semantics built-in.
-A comparisson between Quint and TLA+ code +A comparison between Quint and TLA+ code Quint: ```bluespec From 17e89663f952c018440706e6c09e51a77dd6ca7e Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 13 Dec 2023 17:54:19 -0300 Subject: [PATCH 121/388] Add secret santa example :santa: --- .../puzzles/secret-santa/secret_santa.qnt | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 examples/puzzles/secret-santa/secret_santa.qnt diff --git a/examples/puzzles/secret-santa/secret_santa.qnt b/examples/puzzles/secret-santa/secret_santa.qnt new file mode 100644 index 000000000..cbb036e9c --- /dev/null +++ b/examples/puzzles/secret-santa/secret_santa.qnt @@ -0,0 +1,34 @@ +module secret_santa { + const names: Set[str] + + /// giftees.get(A) == B if A is B's secret santa + var giftees: str -> str + + /// the bowl of names, containg a paper piece for each participant with their name + var bowl: Set[str] + + action init = all { + giftees' = Map(), + bowl' = names, + } + + action step = all { + bowl.size() > 0, + nondet picker = names.filter(name => not(giftees.keys().contains(name))).oneOf() + nondet giftee = bowl.oneOf() + all { + giftees' = giftees.put(picker, giftee), + bowl' = bowl.exclude(Set(giftee)), + } + } + + val everyone_gets_a_santa = bowl.size() == 0 implies (names == giftees.keys().map(k => giftees.get(k))) + + val no_person_gets_themself = names.forall(name => + giftees.keys().contains(name) implies giftees.get(name) != name + ) +} + +module quint_team_secret_santa { + import secret_santa(names = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* +} From ebfa66daa2d86776b8607d7720c1b236ac8b3724 Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 13 Dec 2023 18:13:46 -0300 Subject: [PATCH 122/388] Rename many things --- .../puzzles/secret-santa/secret_santa.qnt | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/examples/puzzles/secret-santa/secret_santa.qnt b/examples/puzzles/secret-santa/secret_santa.qnt index cbb036e9c..60d733a27 100644 --- a/examples/puzzles/secret-santa/secret_santa.qnt +++ b/examples/puzzles/secret-santa/secret_santa.qnt @@ -1,34 +1,40 @@ module secret_santa { - const names: Set[str] + import commonSpells.* from "../../spells/commonSpells" - /// giftees.get(A) == B if A is B's secret santa - var giftees: str -> str + const participants: Set[str] - /// the bowl of names, containg a paper piece for each participant with their name + /// person_to_gift.get(A) == B if A is B's secret santa + var person_to_gift: str -> str + + /// the bowl of participants, containg a paper piece for each participant with their participant var bowl: Set[str] action init = all { - giftees' = Map(), - bowl' = names, + person_to_gift' = Map(), + bowl' = participants, } - action step = all { - bowl.size() > 0, - nondet picker = names.filter(name => not(giftees.keys().contains(name))).oneOf() - nondet giftee = bowl.oneOf() + action draw_name(picker: str): bool = { + nondet drawed_name = bowl.oneOf() all { - giftees' = giftees.put(picker, giftee), - bowl' = bowl.exclude(Set(giftee)), + person_to_gift' = person_to_gift.put(picker, drawed_name), + bowl' = bowl.exclude(Set(drawed_name)), } } - val everyone_gets_a_santa = bowl.size() == 0 implies (names == giftees.keys().map(k => giftees.get(k))) + action step = all { + bowl.size() > 0, + nondet picker = participants.filter(participant => not(participant.in(person_to_gift.keys()))).oneOf() + draw_name(picker) + } + + val everyone_gets_a_santa = bowl.size() == 0 implies participants == person_to_gift.mapValuesSet() - val no_person_gets_themself = names.forall(name => - giftees.keys().contains(name) implies giftees.get(name) != name + val no_person_gets_themself = participants.forall(participant => + participant.in(person_to_gift.keys()) implies person_to_gift.get(participant) != participant ) } module quint_team_secret_santa { - import secret_santa(names = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* + import secret_santa(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* } From fcbe7e8548979e42334a15043bacbbee43365729 Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 13 Dec 2023 18:39:35 -0300 Subject: [PATCH 123/388] Draft exploration scenarios --- .../puzzles/secret-santa/secret_santa.qnt | 56 ++++++++++++++++++- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/examples/puzzles/secret-santa/secret_santa.qnt b/examples/puzzles/secret-santa/secret_santa.qnt index 60d733a27..9ed480a5e 100644 --- a/examples/puzzles/secret-santa/secret_santa.qnt +++ b/examples/puzzles/secret-santa/secret_santa.qnt @@ -30,11 +30,63 @@ module secret_santa { val everyone_gets_a_santa = bowl.size() == 0 implies participants == person_to_gift.mapValuesSet() - val no_person_gets_themself = participants.forall(participant => - participant.in(person_to_gift.keys()) implies person_to_gift.get(participant) != participant + val no_person_gets_themself = person_to_gift.keys().forall(participant => + person_to_gift.get(participant) != participant ) } module quint_team_secret_santa { import secret_santa(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* } + +// Below here, more complex things that might be interesting for a tutorial. +// This is not in the state I want it to be yet, which should be: +// 1. the version with redraw should show that, if the last person picks themself, theres's no solution +// - Additionally, it would be nice to show that you can find information about who is your secret santa in this method. +// That is, if you pick yourself and redraw, but there is only one person after you, you know that person will be your (non)secret santa. +// 2. the version with reset should show that, eventually, the game is valid (no one gets themselves) + +module secret_santa_with_redraw { + // When a participant draws themself, they put their name back and draw again + + import basicSpells.* from "../../spells/basicSpells" + import secret_santa.* + export secret_santa.* + + action step_with_redraw = + val participants_who_got_themselves = person_to_gift.keys().filter(participant => person_to_gift.get(participant) == participant) + if (participants_who_got_themselves.size() > 0) { + nondet participant = participants_who_got_themselves.oneOf() + all { + bowl' = bowl.union(Set(participant)), + person_to_gift' = person_to_gift.mapRemove(participant), + } + } else { + step + } + + val inv = bowl.size() == 0 implies no_person_gets_themself +} + +module secret_santa_with_reset { +// When a participant draws themself, everyone returns the papers and the process starts over + import secret_santa.* + export secret_santa.* + + action step_with_reset = + if (person_to_gift.keys().exists(participant => person_to_gift.get(participant) == participant)) { + init + } else { + step + } + + val inv = bowl.size() == 0 implies no_person_gets_themself +} + +// module quint_team_secret_santa { +// import secret_santa_with_redraw(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* +// } + +// module quint_team_secret_santa { +// import secret_santa_with_reset(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* +// } From 33259b6d8b3aa4c5dcca5087131688bdc576741b Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 13 Dec 2023 20:28:23 -0500 Subject: [PATCH 124/388] Clean up whitespace and move FAQ section --- README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index a429cc93f..6a2c5218e 100644 --- a/README.md +++ b/README.md @@ -14,18 +14,18 @@

- build badge - Visual Studio Marketplace Version - npm (scoped)

@@ -155,7 +155,7 @@ TCInit == statuses = [rm \in ResourceManagers |-> "working"] canCommit == \A rm \in ResourceManagers : statuses[rm] \in {"prepared", "committed"} -notCommitted == \A rm \in ResourceManagers : statuses[rm] # "committed" +notCommitted == \A rm \in ResourceManagers : statuses[rm] # "committed" Prepare(rm) == /\ statuses[rm] = "working" /\ statuses' = [statuses EXCEPT ![rm] = "prepared"] @@ -186,8 +186,6 @@ Cosmos in 2023. ## Documentation -- [Frequently asked questions](./doc/faq.md) - - Quint by example: - [Cheatsheet](./doc/quint-cheatsheet.pdf) - [Language tutorials](./tutorials/README.md) @@ -206,10 +204,13 @@ Cosmos in 2023. - [Design Principles](./doc/design-principles.md) - [Roadmap](./doc/roadmap.md) +- Miscellaneous + - [Frequently asked questions](./doc/faq.md) + ## Community - Join the chat in the [Quint zulip stream][] -- Join the [Quint discussions][] +- Join the [Quint discussions on GitHub](https://github.com/informalsystems/quint/discussions) - [Contribute your spell][] to the collection of Quint spells - [Contribute](./CONTRIBUTING.md) to the development of Quint @@ -270,5 +271,4 @@ Supported by the Vienna Business Agency.
[Vienna Business Agency Date: Thu, 14 Dec 2023 10:21:11 -0300 Subject: [PATCH 125/388] Add test and improve exploration scenarios --- .../puzzles/secret-santa/secret_santa.qnt | 52 +++++++++++++------ 1 file changed, 37 insertions(+), 15 deletions(-) diff --git a/examples/puzzles/secret-santa/secret_santa.qnt b/examples/puzzles/secret-santa/secret_santa.qnt index 9ed480a5e..2ba6db93c 100644 --- a/examples/puzzles/secret-santa/secret_santa.qnt +++ b/examples/puzzles/secret-santa/secret_santa.qnt @@ -14,12 +14,14 @@ module secret_santa { bowl' = participants, } + action assign_santa(p1: str, p2:str): bool = all { + person_to_gift' = person_to_gift.put(p1, p2), + bowl' = bowl.exclude(Set(p2)), + } + action draw_name(picker: str): bool = { nondet drawed_name = bowl.oneOf() - all { - person_to_gift' = person_to_gift.put(picker, drawed_name), - bowl' = bowl.exclude(Set(drawed_name)), - } + assign_santa(picker, drawed_name) } action step = all { @@ -30,14 +32,14 @@ module secret_santa { val everyone_gets_a_santa = bowl.size() == 0 implies participants == person_to_gift.mapValuesSet() - val no_person_gets_themself = person_to_gift.keys().forall(participant => + val no_person_gets_themself = person_to_gift.keys().forall(participant => person_to_gift.get(participant) != participant ) } -module quint_team_secret_santa { - import secret_santa(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* -} +// module quint_team_secret_santa { +// import secret_santa(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* +// } // Below here, more complex things that might be interesting for a tutorial. // This is not in the state I want it to be yet, which should be: @@ -53,19 +55,27 @@ module secret_santa_with_redraw { import secret_santa.* export secret_santa.* + action redraw(participant: str): bool = { + nondet new_name = bowl.oneOf() + all { + bowl' = bowl.exclude(Set(new_name)).union(Set(participant)), + person_to_gift' = person_to_gift.set(participant, new_name), + } + } + action step_with_redraw = val participants_who_got_themselves = person_to_gift.keys().filter(participant => person_to_gift.get(participant) == participant) if (participants_who_got_themselves.size() > 0) { nondet participant = participants_who_got_themselves.oneOf() - all { - bowl' = bowl.union(Set(participant)), - person_to_gift' = person_to_gift.mapRemove(participant), - } + redraw(participant) } else { step } val inv = bowl.size() == 0 implies no_person_gets_themself + + // We need fairness for this to work + temporal success = eventually(bowl.size() == 0 and everyone_gets_a_santa and no_person_gets_themself) } module secret_santa_with_reset { @@ -81,11 +91,23 @@ module secret_santa_with_reset { } val inv = bowl.size() == 0 implies no_person_gets_themself + + // We need fairness for this to work + temporal success = eventually(bowl.size() == 0 and everyone_gets_a_santa and no_person_gets_themself) } -// module quint_team_secret_santa { -// import secret_santa_with_redraw(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* -// } +module quint_team_secret_santa { + import secret_santa_with_redraw(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* + + run finding_out_my_santa_Test = init + .then(assign_santa("Igor", "Jure")) + .then(assign_santa("Thomas", "Shon")) + .then(assign_santa("Jure", "Igor")) + .then(assign_santa("Gabriela", "Gabriela")) + .then(redraw("Gabriela")) + .then(draw_name("Shon")) + .expect(person_to_gift.get("Shon") == "Gabriela") +} // module quint_team_secret_santa { // import secret_santa_with_reset(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* From 05c32299c88a7fac43fd3c74ab85b0b5ec62db4c Mon Sep 17 00:00:00 2001 From: bugarela Date: Thu, 14 Dec 2023 18:05:41 -0300 Subject: [PATCH 126/388] Add secret santa example to the README --- README.md | 88 ++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 65 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 6a2c5218e..0686d1a91 100644 --- a/README.md +++ b/README.md @@ -43,40 +43,82 @@ development tooling. Here's some example code in Quint: ``` bluespec -module tictactoe { - type Player = X | O - type Square = Occupied(Player) | Empty +module secret_santa { + import basicSpells.* from "../../spells/basicSpells" + import commonSpells.* from "../../spells/commonSpells" - /// A 3x3 tic-tac-toe board - var board: int -> (int -> Square) + const participants: Set[str] - /// Coordinates for board corners - pure val corners = Set((1,1), (3,1), (1,3), (3,3)) + /// santa_for.get(A) == B if A is B's secret santa + var santa_for: str -> str - def square(coordinate: (int, int)): Square = - board.get(coordinate._1).get(coordinate._2) + /// the bowl of participants, containig a paper piece for each participant name + var bowl: Set[str] - def isEmpty(coordinate) = match square(coordinate) { - | Empty => true - | _ => false + action init = all { + santa_for' = Map(), + bowl' = participants, } - /// A player makes a move on a board coordinate, if it is empty - action Move(player, coordinate) = all { - isEmpty(coordinate), - board' = board.setBy( - coordinate._1, - row => row.set(coordinate._2, Occupied(player)) - ), + action draw_name(picker: str): bool = { + nondet drawed_name = bowl.oneOf() + all { + santa_for' = santa_for.put(picker, drawed_name), + bowl' = bowl.setRemove(drawed_name), + } } - /// Nondeterministically pick a corner, and player X makes a move on that corner - action StartInCorner = - nondet corner = oneOf(corners) - Move(X, corner) + action step = all { + bowl.size() > 0, + nondet picker = participants.filter(participant => not(participant.in(santa_for.keys()))).oneOf() + draw_name(picker) + } + + val everyone_gets_a_santa = bowl.size() == 0 implies participants == santa_for.mapValuesSet() + + val no_person_gets_themself = santa_for.keys().forall(participant => + santa_for.get(participant) != participant + ) +} + +module quint_team_secret_santa { + import secret_santa(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* } ``` +
+Checking if everyone gets a santa +Quint (with the help of [Apalache][apalache]) can check if, when the bowl gets empty, every participant has a santa! No kids crying at revelation :gift:. +``` bluespec +quint verify secret_santa.qnt --invariant=everyone_gets_a_santa --main=quint_team_secret_santa --apalache-config=config.json +[ok] No violation found (2119ms). +You may increase --max-steps. +``` +
+ +
+Checking if no one gets themself +This specification has no safe guards agains people being their own santa! Quint (with the help of [Apalache][apalache]) can easily find a minimal example where this happens. +``` bluespec +quint verify secret_santa.qnt --invariant=no_person_gets_themself --main=quint_team_secret_santa +An example execution: + +[State 0] +{ + quint_team_secret_santa::secret_santa::bowl: Set("Gabriela", "Igor", "Jure", "Shon", "Thomas"), + quint_team_secret_santa::secret_santa::santa_for: Map() +} + +[State 1] +{ + quint_team_secret_santa::secret_santa::bowl: Set("Igor", "Jure", "Shon", "Thomas"), + quint_team_secret_santa::secret_santa::santa_for: Map("Gabriela" -> "Gabriela") +} + +[violation] Found an issue (2047ms). +error: found a counterexample +``` +
### Features
From 90ca9db0be4100d06925af0cf96cdfb568cf717f Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 14 Dec 2023 17:08:40 -0500 Subject: [PATCH 127/388] More santas in the santa spec --- README.md | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 0686d1a91..6145924da 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ p2p protocols. Quint combines the robust theoretical basis of the [Temporal Logic of Actions (TLA)][TLA] with state-of-the-art static analysis and development tooling. -Here's some example code in Quint: +Here's some example code in Quint :mrs_claus: :gift: :santa: : ``` bluespec module secret_santa { @@ -49,36 +49,42 @@ module secret_santa { const participants: Set[str] - /// santa_for.get(A) == B if A is B's secret santa - var santa_for: str -> str + /// get(recipient_for_santa, S) is the recipient for secret santa S + var recipient_for_santa: str -> str - /// the bowl of participants, containig a paper piece for each participant name + /// the bowl of participants, containig a paper piece for each participant name var bowl: Set[str] + val santas = recipient_for_santa.keys() + val recipients = recipient_for_santa.mapValuesSet() + + /// The initial state action init = all { - santa_for' = Map(), - bowl' = participants, + recipient_for_santa' = Map(), // No santas or recipients + bowl' = participants, // Every participant's name in the bowl } - action draw_name(picker: str): bool = { - nondet drawed_name = bowl.oneOf() + action draw_recipient(santa: str): bool = { + nondet recipient = bowl.oneOf() all { - santa_for' = santa_for.put(picker, drawed_name), - bowl' = bowl.setRemove(drawed_name), + recipient_for_santa' = put(recipient_for_santa, santa, recipient), + bowl' = bowl.setRemove(recipient), } } action step = all { bowl.size() > 0, - nondet picker = participants.filter(participant => not(participant.in(santa_for.keys()))).oneOf() - draw_name(picker) + nondet next_santa = participants.filter(p => not(p.in(santas))).oneOf() + draw_recipient(next_santa) } - val everyone_gets_a_santa = bowl.size() == 0 implies participants == santa_for.mapValuesSet() + val everyone_gets_a_santa = bowl.size() == 0 implies participants == recipients - val no_person_gets_themself = santa_for.keys().forall(participant => - santa_for.get(participant) != participant + val no_person_is_self_santa = santas.forall(person => + get(recipient_for_santa, person) != person ) + + val invariant = everyone_gets_a_santa and no_person_is_self_santa } module quint_team_secret_santa { From 001d3101ac51d6e6c3c5e7f37b45023f07d2ac52 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 14 Dec 2023 17:12:09 -0500 Subject: [PATCH 128/388] Update verification examples --- README.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 6145924da..360554922 100644 --- a/README.md +++ b/README.md @@ -94,7 +94,8 @@ module quint_team_secret_santa {
Checking if everyone gets a santa -Quint (with the help of [Apalache][apalache]) can check if, when the bowl gets empty, every participant has a santa! No kids crying at revelation :gift:. +Quint (with the help of [Apalache][apalache]) can check to ensure that after the bowl is +empty, every participant has a santa! No kids crying when the gifts are exchanged :gift:. ``` bluespec quint verify secret_santa.qnt --invariant=everyone_gets_a_santa --main=quint_team_secret_santa --apalache-config=config.json [ok] No violation found (2119ms). @@ -104,21 +105,23 @@ You may increase --max-steps.
Checking if no one gets themself -This specification has no safe guards agains people being their own santa! Quint (with the help of [Apalache][apalache]) can easily find a minimal example where this happens. +This specification has no safeguards against people being their own santa! Quint +(with the help of [Apalache][apalache]) can easily find a minimal example where +this happens. Sorry kids, I hope you don't mind buying your own present :cry:! ``` bluespec -quint verify secret_santa.qnt --invariant=no_person_gets_themself --main=quint_team_secret_santa +quint verify secret_santa.qnt --invariant=no_person_is_self_santa --main=quint_team_secret_santa An example execution: [State 0] { quint_team_secret_santa::secret_santa::bowl: Set("Gabriela", "Igor", "Jure", "Shon", "Thomas"), - quint_team_secret_santa::secret_santa::santa_for: Map() + quint_team_secret_santa::secret_santa::recipient_for_santa: Map() } [State 1] { quint_team_secret_santa::secret_santa::bowl: Set("Igor", "Jure", "Shon", "Thomas"), - quint_team_secret_santa::secret_santa::santa_for: Map("Gabriela" -> "Gabriela") + quint_team_secret_santa::secret_santa::recipient_for_santa: Map("Gabriela" -> "Gabriela") } [violation] Found an issue (2047ms). From d2a938b0d2c46498f368a9160b829c0a8e8e3a1d Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 14 Dec 2023 17:12:24 -0500 Subject: [PATCH 129/388] Fix link and use strong instaed of b See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/b > If you wish to indicate an element is of special importance, you > should use the element. --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 360554922..c6cf65fab 100644 --- a/README.md +++ b/README.md @@ -131,26 +131,26 @@ error: found a counterexample ### Features
-
A simple and familiar syntax
+
A simple and familiar syntax
to support engineers reading and writing specifications
-
An expressive type systems
+
An expressive type systems
to ensure the domain model is coherent
-
A novel effect system
+
A novel effect system
to ensure state updates are coherent
-
IDE support via LSP
+
IDE support via LSP
giving real time feedback when writing specifications
-
A REPL
+
A REPL
enabling interactive exploration of specifications
-
A simulator
+
A simulator
enabling tests, trace generation, and exploration of your system
-
Symbolic model checking
-
to verify your specifications via [Apalache][apalache]
+
Symbolic model checking
+
to verify your specifications via Apalache
### Motivation From 53b13316c46fe27c7532d56429ebe3bddfeb4a85 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 14 Dec 2023 17:32:44 -0500 Subject: [PATCH 130/388] Move documentation links into doc/README.md --- README.md | 25 +------------------------ doc/README.md | 20 ++++++++++++++++++++ tutorials/repl/repl.md | 2 +- 3 files changed, 22 insertions(+), 25 deletions(-) create mode 100644 doc/README.md diff --git a/README.md b/README.md index c6cf65fab..4907ec387 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@

Installation • - Documentation • + Documentation • Community

@@ -235,29 +235,6 @@ Cosmos in 2023. 3. _Optionally_, you may also install the [VSCode plugin for visualizing traces](https://marketplace.visualstudio.com/items?itemName=informal.itf-trace-viewer). -## Documentation - -- Quint by example: - - [Cheatsheet](./doc/quint-cheatsheet.pdf) - - [Language tutorials](./tutorials/README.md) - - [REPL tutorial](./tutorials/repl/repl.md) - - [Example specifications](./examples) - -- Language reference: - - [Syntax documentation](./doc/lang.md) - - [Reference API documentation for built-in operators](./doc/builtin.md) - -- Tooling manuals - - [CLI manual](./doc/quint.md) - - [Literate executable specifications](./doc/literate.md) - -- Development plans: - - [Design Principles](./doc/design-principles.md) - - [Roadmap](./doc/roadmap.md) - -- Miscellaneous - - [Frequently asked questions](./doc/faq.md) - ## Community - Join the chat in the [Quint zulip stream][] diff --git a/doc/README.md b/doc/README.md new file mode 100644 index 000000000..694a3f972 --- /dev/null +++ b/doc/README.md @@ -0,0 +1,20 @@ +# Documentation + +## Language + +- [Language tutorials](./tutorials/README.md) +- [Syntax specification](./doc/lang.md) +- [Cheatsheet](./doc/quint-cheatsheet.pdf) +- [API documentation for built-in operators](./doc/builtin.md) + +## Tooling + +- [REPL tutorial](./tutorials/repl/repl.md) +- [CLI manual](./doc/quint.md) +- [Literate executable specifications](./doc/literate.md) + +## Design and Development + +- [Design Principles](./doc/design-principles.md) +- [Roadmap](./doc/roadmap.md) +- [Frequently asked questions](./doc/faq.md) diff --git a/tutorials/repl/repl.md b/tutorials/repl/repl.md index 66757d574..54069bcf7 100644 --- a/tutorials/repl/repl.md +++ b/tutorials/repl/repl.md @@ -40,7 +40,7 @@ state machine that describes how it works from the user's point of view: ## 1. Installation -You have to install `quint` first. See [README](../quint/README.md). +You have to install `quint` first. See the [README](../../README.md#installation). ## 2. Running REPL From 913cbe64301951a4519be0f769673d57a808bdee Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 14 Dec 2023 17:33:52 -0500 Subject: [PATCH 131/388] Fix link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4907ec387..661a58b52 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@

Installation • - Documentation • + Documentation • Community

From 4b2915749e5500d749de2f56741191157ce9928e Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 14 Dec 2023 17:43:44 -0500 Subject: [PATCH 132/388] Fix the links --- README.md | 55 +++++++------------------------------------------------ 1 file changed, 7 insertions(+), 48 deletions(-) diff --git a/README.md b/README.md index 661a58b52..10db03201 100644 --- a/README.md +++ b/README.md @@ -129,6 +129,9 @@ error: found a counterexample ```
+[Apalache]: https://github.com/informalsystems/apalache +[TLA]: https://en.wikipedia.org/wiki/Temporal_logic_of_actions + ### Features
A simple and familiar syntax
@@ -218,6 +221,8 @@ To learn more about Quint's motivation and design philosophy, watch this [15 minute presentation](https://youtu.be/OZIX8rs-kOA), delivered at Gateway to Cosmos in 2023. +[TLA+]: https://lamport.azurewebsites.net/tla/tla.html + ## Installation 1. Install the [latest published version from npm](https://www.npmjs.com/package/@informalsystems/quint): @@ -237,9 +242,9 @@ Cosmos in 2023. ## Community -- Join the chat in the [Quint zulip stream][] +- Join the chat in the [Quint zulip stream](https://informal-systems.zulipchat.com/#narrow/stream/378959-quint) - Join the [Quint discussions on GitHub](https://github.com/informalsystems/quint/discussions) -- [Contribute your spell][] to the collection of Quint spells +- [Contribute your spell](./examples/spells/contribute-your-spell.md) to the collection of Quint spells - [Contribute](./CONTRIBUTING.md) to the development of Quint ## On "Quint" @@ -254,49 +259,3 @@ become referenced artifacts. Quint is developed at [Informal Systems](https://informal.systems/). Supported by the Vienna Business Agency.
[Vienna Business Agency](https://viennabusinessagency.at/) - - -[Design Principles]: ./doc/design-principles.md -[Apalache]: https://github.com/informalsystems/apalache -[Lessons from Writing a Compiler]: https://borretti.me/article/lessons-writing-compiler -[Imports]: ./doc/lang.md#imports-1 -[Module definitions]: ./doc/lang.md#module-definition -[Constant declarations]: ./doc/lang.md#constant-declarations -[Assumptions]: ./doc/lang.md#assumptions -[Variable definitions]: ./doc/lang.md#variable-definitions -[Operator definitions]: ./doc/lang.md#variable-definitions -[Module instances]: ./doc/lang.md#module-instances -[Lambdas]: ./doc/lang.md#lambdas-aka-anonymous-operators -[Booleans]: ./doc/lang.md#boolean-operators-and-equality -[Integers]: ./doc/lang.md#integers -[Sets]: ./doc/lang.md#sets -[Lists]: ./doc/lang.md#lists-aka-sequences -[Multiline disjunctions]: ./doc/lang.md#multiline-disjunctions -[Multiline conjunctions]: ./doc/lang.md#multiline-conjunctions -[if-then-else]: ./doc/lang.md#condition -[nondet]: ./doc/lang.md#existential-quantifier-and-non-deterministic-choice -[Maps]: ./doc/lang.md#maps-aka-functions -[Records]: ./doc/lang.md#records -[Tuples]: ./doc/lang.md#tuples -[Sum types]: ./doc/lang.md#sum-types -[Delayed assignment]: ./doc/lang.md#delayed-assignment -[Runs]: ./doc/lang.md#runs -[Temporal operators]: ./doc/lang.md#temporal-operators -[Fairness]: ./doc/lang.md#fairness -[Unbounded quantifiers]: ./doc/lang.md#unbounded-quantifiers -[Modes]: ./doc/lang.md#modes -[Spells]: ./examples/spells/README.md -[Contribute your spell]: ./examples/spells/contribute-your-spell.md -[539]: https://github.com/informalsystems/quint/issues/539 -[221]: https://github.com/informalsystems/quint/issues/221 -[235]: https://github.com/informalsystems/quint/issues/235 -[8]: https://github.com/informalsystems/quint/issues/8 -[1034]: https://github.com/informalsystems/quint/issues/1034 -[Higher-order definitions]: https://github.com/informalsystems/quint/blob/main/doc/lang.md#operator-definitions -[String literals]: https://github.com/informalsystems/quint/blob/main/doc/lang.md#identifiers-and-strings -[TLA+]: https://lamport.azurewebsites.net/tla/tla.html -[TLA]: https://en.wikipedia.org/wiki/Temporal_logic_of_actions -[Visual Studio Code Marketplace]: https://marketplace.visualstudio.com/items?itemName=informal.quint-vscode -[Tutorials]: ./tutorials/README.md -[Quint zulip stream]: https://informal-systems.zulipchat.com/#narrow/stream/378959-quint -[ITF traces]: https://apalache.informal.systems/docs/adr/015adr-trace.html From bc902e2d6fe0c830df6a1cb3ff48ab66dbe6bc64 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 14 Dec 2023 17:59:40 -0500 Subject: [PATCH 133/388] Add acknowledgment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 😢💜 --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 10db03201..4d401d9bd 100644 --- a/README.md +++ b/README.md @@ -254,6 +254,16 @@ element. A lot of alchemy is about transmutation and energy, and Quint makes it possible to transmute specifications into executable assets and empower ideas to become referenced artifacts. +## Acknowledgments + +Quint has been designed and developed by the [Apalache][] team: [Gabriela +Moreira](https://github.com/bugarela), [Igor Konnov](https://konnov.github.io/), +[Jure Kukovec](https://github.com/Kukovec), [Shon Feder](http://shonfeder.net), +and [Thomas Pani](https://thpani.net/). :heart: + +Thanks for notable contributions goes to @romac, @p-offtermatt, @ivan-gavran, +and, @rnbguy. + --- Quint is developed at [Informal Systems](https://informal.systems/). From 97789d585669eff6fbd3469625454b5895a07acb Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 14 Dec 2023 18:02:05 -0500 Subject: [PATCH 134/388] Add empty lines before closing detail tags Othewise it breaks the closing bracket fence --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 4d401d9bd..5ea8a96da 100644 --- a/README.md +++ b/README.md @@ -94,20 +94,25 @@ module quint_team_secret_santa {
Checking if everyone gets a santa + Quint (with the help of [Apalache][apalache]) can check to ensure that after the bowl is empty, every participant has a santa! No kids crying when the gifts are exchanged :gift:. + ``` bluespec quint verify secret_santa.qnt --invariant=everyone_gets_a_santa --main=quint_team_secret_santa --apalache-config=config.json [ok] No violation found (2119ms). You may increase --max-steps. ``` +
Checking if no one gets themself + This specification has no safeguards against people being their own santa! Quint (with the help of [Apalache][apalache]) can easily find a minimal example where this happens. Sorry kids, I hope you don't mind buying your own present :cry:! + ``` bluespec quint verify secret_santa.qnt --invariant=no_person_is_self_santa --main=quint_team_secret_santa An example execution: @@ -127,6 +132,7 @@ An example execution: [violation] Found an issue (2047ms). error: found a counterexample ``` +
[Apalache]: https://github.com/informalsystems/apalache From 9b65f3c39d751d8bb87dc9f02e2dd8385a614e5a Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 14 Dec 2023 18:03:12 -0500 Subject: [PATCH 135/388] Move to heading --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5ea8a96da..06e1904f6 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ p2p protocols. Quint combines the robust theoretical basis of the [Temporal Logic of Actions (TLA)][TLA] with state-of-the-art static analysis and development tooling. -Here's some example code in Quint :mrs_claus: :gift: :santa: : +### Example code in Quint :mrs_claus: :gift: :santa: ``` bluespec module secret_santa { From d22598b39725254eec885d469d2dc9f9bb143f33 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 14 Dec 2023 18:05:54 -0500 Subject: [PATCH 136/388] Use more explicit syntax `implies` isn't highlighted on github so the grouping isn't clear otherwise. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 06e1904f6..248b62df3 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,7 @@ module secret_santa { draw_recipient(next_santa) } - val everyone_gets_a_santa = bowl.size() == 0 implies participants == recipients + val everyone_gets_a_santa = (bowl.size() == 0).implies(participants == recipients) val no_person_is_self_santa = santas.forall(person => get(recipient_for_santa, person) != person From b63f4f52cb2343a4c7a8a76de5ca588e2db7db58 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 14 Dec 2023 18:12:33 -0500 Subject: [PATCH 137/388] Fix links --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 248b62df3..b981a07ce 100644 --- a/README.md +++ b/README.md @@ -267,8 +267,9 @@ Moreira](https://github.com/bugarela), [Igor Konnov](https://konnov.github.io/), [Jure Kukovec](https://github.com/Kukovec), [Shon Feder](http://shonfeder.net), and [Thomas Pani](https://thpani.net/). :heart: -Thanks for notable contributions goes to @romac, @p-offtermatt, @ivan-gavran, -and, @rnbguy. +Thanks for notable contributions goes to [Romain Ruetschi](https://romac.me/), +[Philip Offtermatt](https://p-offtermatt.github.io/), [Ivan Gavran](https://ivan-gavran.github.io/), +and, [Ranadeep Biswas](https://ranadeep.in/). --- From bd32d0c513ffd8e9d0980d41b108c6e70f0a4916 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 15 Dec 2023 10:46:11 -0500 Subject: [PATCH 138/388] Update README.md Co-authored-by: Igor Konnov --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b981a07ce..6de6a0cd2 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ module secret_santa { /// get(recipient_for_santa, S) is the recipient for secret santa S var recipient_for_santa: str -> str - /// the bowl of participants, containig a paper piece for each participant name + /// the bowl of participants, containing a paper piece for each participant name var bowl: Set[str] val santas = recipient_for_santa.keys() From ea3613aef78baa49b07ee65b46971dbf656f5a5f Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 15 Dec 2023 10:50:21 -0500 Subject: [PATCH 139/388] Update README.md Co-authored-by: Igor Konnov --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6de6a0cd2..a63077c95 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,7 @@ module secret_santa { } action draw_recipient(santa: str): bool = { - nondet recipient = bowl.oneOf() + nondet recipient = oneOf(bowl) all { recipient_for_santa' = put(recipient_for_santa, santa, recipient), bowl' = bowl.setRemove(recipient), From baf1848d08bc6d34055f589c92004ccc8c013872 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 15 Dec 2023 10:52:00 -0500 Subject: [PATCH 140/388] Update README.md Co-authored-by: Igor Konnov --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a63077c95..f6aa13a61 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ module secret_santa { action step = all { bowl.size() > 0, - nondet next_santa = participants.filter(p => not(p.in(santas))).oneOf() + nondet next_santa = participants.exclude(santas).oneOf() draw_recipient(next_santa) } From 252814c4289a63624ceea69b01d0a774d00f4371 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 15 Dec 2023 10:56:42 -0500 Subject: [PATCH 141/388] Update README.md Co-authored-by: Igor Konnov --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f6aa13a61..348c30d36 100644 --- a/README.md +++ b/README.md @@ -182,7 +182,7 @@ Thanks to its foundation in TLA and its alignment with TLA+, Quint comes with formal semantics built-in.
-A comparison between Quint and TLA+ code +An example that highlights differences between Quint and TLA+ Quint: ```bluespec From 83730cebf889961820b04751e5e132ab2166403f Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 15 Dec 2023 10:57:13 -0500 Subject: [PATCH 142/388] Two rephrasings --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 348c30d36..b63fd8291 100644 --- a/README.md +++ b/README.md @@ -143,7 +143,7 @@ error: found a counterexample
A simple and familiar syntax
to support engineers reading and writing specifications
-
An expressive type systems
+
An expressive type system
to ensure the domain model is coherent
A novel effect system
@@ -158,7 +158,7 @@ error: found a counterexample
A simulator
enabling tests, trace generation, and exploration of your system
-
Symbolic model checking
+
A symbolic model checker
to verify your specifications via Apalache
From adb0046e887e568498fdee251ebb9874402f1f98 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 15 Dec 2023 10:59:16 -0500 Subject: [PATCH 143/388] Fix missing link --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b63fd8291..f76c5362f 100644 --- a/README.md +++ b/README.md @@ -167,8 +167,9 @@ error: found a counterexample Quint is inspired by [TLA+][] (the language) but provides an alternative surface syntax for specifying systems in TLA (the logic). The most important feature of our syntax is that it is minimal and regular, making Quint an easy target for -advanced developer tooling and static analysis (see our [design principles][] -and [previews](./doc/previews.md) of the tooling). +advanced developer tooling and static analysis (see our [design +principles](./doc/design-principles.md) and [previews](./doc/previews.md) of the +tooling). The syntax also aims to be familiar to engineers: From 758f08a549e7bce9b734bd74bcdbacd2ce268370 Mon Sep 17 00:00:00 2001 From: bugarela Date: Fri, 15 Dec 2023 16:23:24 -0300 Subject: [PATCH 144/388] Remove `mapValuesSet` usage in example --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index b63fd8291..fcdd3fa58 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,6 @@ development tooling. ``` bluespec module secret_santa { import basicSpells.* from "../../spells/basicSpells" - import commonSpells.* from "../../spells/commonSpells" const participants: Set[str] @@ -56,7 +55,7 @@ module secret_santa { var bowl: Set[str] val santas = recipient_for_santa.keys() - val recipients = recipient_for_santa.mapValuesSet() + val recipients = participants.map(p => recipient_for_santa.get(p)) /// The initial state action init = all { From 4f241cd06d655433083ed0ba20cd069f9eee6073 Mon Sep 17 00:00:00 2001 From: bugarela Date: Fri, 15 Dec 2023 16:25:18 -0300 Subject: [PATCH 145/388] Remove padding from logo --- logos/quint-logo.png | Bin 360413 -> 212293 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/logos/quint-logo.png b/logos/quint-logo.png index 25db008ec428b2bcf473282229c8f8a8b570dca8..8331051c7813c0bb4a091e7dcbd75950b08309da 100644 GIT binary patch literal 212293 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�PR!xMI6cJOw_h)u$oCpL! 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

74rcosKM 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 NoxEX^HoClzYAvAm&8A*n^Idx&OaKx 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

4fY#%$3!sIZy^WVvi2j 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 Date: Fri, 15 Dec 2023 16:26:49 -0300 Subject: [PATCH 146/388] Reduce logo size --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fcdd3fa58..83defed78 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@

@@ -253,7 +258,7 @@ Cosmos in 2023. ## Community -- Join the chat in the [Quint zulip stream](https://informal-systems.zulipchat.com/#narrow/stream/378959-quint) +- Join the chat in the [Telegram group](https://t.me/quint_lang) or in the [Zulip stream](https://informal-systems.zulipchat.com/#narrow/stream/378959-quint) - Join the [Quint discussions on GitHub](https://github.com/informalsystems/quint/discussions) - [Contribute your spell](./examples/spells/contribute-your-spell.md) to the collection of Quint spells - [Contribute](./CONTRIBUTING.md) to the development of Quint From 43c257f2761a8bc509cbb77bfc30ecb8436bea80 Mon Sep 17 00:00:00 2001 From: bugarela Date: Fri, 5 Apr 2024 16:15:25 -0300 Subject: [PATCH 329/388] Update my website --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a20673bcd..ff6a1d059 100644 --- a/README.md +++ b/README.md @@ -285,7 +285,7 @@ become referenced artifacts. ## Acknowledgments Quint has been designed and developed by the [Apalache][] team: [Gabriela -Moreira](https://github.com/bugarela), [Igor Konnov](https://konnov.github.io/), +Moreira](https://bugarela.com), [Igor Konnov](https://konnov.github.io/), [Jure Kukovec](https://github.com/Kukovec), [Shon Feder](http://shonfeder.net), and [Thomas Pani](https://thpani.net/). :heart: From e5ee5863918b0b62d75228d93c73fc360ef5c5f5 Mon Sep 17 00:00:00 2001 From: bugarela Date: Fri, 5 Apr 2024 16:27:34 -0300 Subject: [PATCH 330/388] Update logo --- README.md | 8 +++-- logos/quint-logo-dark.png | Bin 0 -> 17315 bytes logos/quint-logo-dark.svg | 1 + logos/quint-logo-light.png | Bin 0 -> 16157 bytes logos/quint-logo-light.svg | 1 + logos/quint-logo.png | Bin 212293 -> 0 bytes logos/quint-logo.svg | 68 ------------------------------------- 7 files changed, 7 insertions(+), 71 deletions(-) create mode 100644 logos/quint-logo-dark.png create mode 100644 logos/quint-logo-dark.svg create mode 100644 logos/quint-logo-light.png create mode 100644 logos/quint-logo-light.svg delete mode 100644 logos/quint-logo.png delete mode 100644 logos/quint-logo.svg diff --git a/README.md b/README.md index ff6a1d059..5de7beac9 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,10 @@
-Quint Lang Logo -

Quint Lang

+ + + Quint Lang +

@@ -37,7 +39,7 @@

-## Overview +# The Quint specification language Quint is a modern specification language that is a particularly good fit for distributed systems, such as blockchain protocols, distributed databases, and diff --git a/logos/quint-logo-dark.png b/logos/quint-logo-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..68ecce9ba96de3ab75852825dfcc818b41ef05da GIT binary patch literal 17315 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

Y!!s6zs~eIF34IrNWQ*yLbqMDk4V>@p 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 Bj3@vA literal 0 HcmV?d00001 diff --git a/logos/quint-logo-dark.svg b/logos/quint-logo-dark.svg new file mode 100644 index 000000000..ce1ea6852 --- /dev/null +++ b/logos/quint-logo-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/logos/quint-logo-light.png b/logos/quint-logo-light.png new file mode 100644 index 0000000000000000000000000000000000000000..3346cdb9fc7ee186be33341f2e1daf57cb78b2e3 GIT binary patch literal 16157 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 literal 0 HcmV?d00001 diff --git a/logos/quint-logo-light.svg b/logos/quint-logo-light.svg new file mode 100644 index 000000000..199760f66 --- /dev/null +++ b/logos/quint-logo-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/logos/quint-logo.png b/logos/quint-logo.png deleted file mode 100644 index 8331051c7813c0bb4a091e7dcbd75950b08309da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212293 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 - - - - - - From 8868336289a57592d174b6082db6144090595a83 Mon Sep 17 00:00:00 2001 From: Gabriela Moreira Date: Fri, 5 Apr 2024 16:32:26 -0300 Subject: [PATCH 331/388] Adjust logo size --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5de7beac9..9b48a769c 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ - Quint Lang + Quint Lang From fd3f19bf0e2769812c70b5f7531414b5e33787e7 Mon Sep 17 00:00:00 2001 From: bugarela Date: Fri, 5 Apr 2024 16:40:23 -0300 Subject: [PATCH 332/388] Update logo on VSCode extension --- vscode/quint-vscode/CHANGELOG.md | 3 +++ vscode/quint-vscode/quint-logo-vscode.png | Bin 3292 -> 11953 bytes 2 files changed, 3 insertions(+) diff --git a/vscode/quint-vscode/CHANGELOG.md b/vscode/quint-vscode/CHANGELOG.md index fb5e62dec..01cbf258a 100644 --- a/vscode/quint-vscode/CHANGELOG.md +++ b/vscode/quint-vscode/CHANGELOG.md @@ -9,6 +9,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added ### Changed + +- Updated the logo + ### Deprecated ### Removed ### Fixed diff --git a/vscode/quint-vscode/quint-logo-vscode.png b/vscode/quint-vscode/quint-logo-vscode.png index d42c03f1f0824838fd6ba4e08a47f82847d79bbb..1864749aa116d35b5255a72a5c3c732f06afec1f 100644 GIT binary patch literal 11953 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 B0 Date: Mon, 8 Apr 2024 15:18:50 -0300 Subject: [PATCH 333/388] Update VSCode icons --- vscode/quint-vscode/icons/logo-dark.png | Bin 0 -> 15790 bytes vscode/quint-vscode/icons/logo-dark.svg | 1 + vscode/quint-vscode/icons/logo-light.png | Bin 0 -> 15038 bytes vscode/quint-vscode/icons/logo-light.svg | 1 + vscode/quint-vscode/icons/logo.png | Bin 0 -> 14962 bytes vscode/quint-vscode/package.json | 25 +++++++++------------- vscode/quint-vscode/quint-logo-vscode.png | Bin 11953 -> 0 bytes 7 files changed, 12 insertions(+), 15 deletions(-) create mode 100644 vscode/quint-vscode/icons/logo-dark.png create mode 100644 vscode/quint-vscode/icons/logo-dark.svg create mode 100644 vscode/quint-vscode/icons/logo-light.png create mode 100644 vscode/quint-vscode/icons/logo-light.svg create mode 100644 vscode/quint-vscode/icons/logo.png delete mode 100644 vscode/quint-vscode/quint-logo-vscode.png diff --git a/vscode/quint-vscode/icons/logo-dark.png b/vscode/quint-vscode/icons/logo-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..9cf93ffe94987f14c0bc640fd11ede3e25d924bf GIT binary patch literal 15790 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 ZJ$gIy0|rwMj;KQP^^8sw{^D@u{{X3*Fhl?V literal 0 HcmV?d00001 diff --git a/vscode/quint-vscode/icons/logo-dark.svg b/vscode/quint-vscode/icons/logo-dark.svg new file mode 100644 index 000000000..02dd4820d --- /dev/null +++ b/vscode/quint-vscode/icons/logo-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vscode/quint-vscode/icons/logo-light.png b/vscode/quint-vscode/icons/logo-light.png new file mode 100644 index 0000000000000000000000000000000000000000..ebe58ea30f970837a9b43fec6c3b14e4bab1522c GIT binary patch literal 15038 zcmeHuc|4Wh_wO0ZbD5KwgmBFBAwtMJWp;4LJdcrcN<@QXtc*p)(IHAAJfRdqA~PqI zkPMk+xcm4F-_Q4TfA@7?-`DHj|Gu2Zd7i!3UVE+gT6;Zvuf3(1n;J0E9ifB4V2p;R zPg%lX@Ky3fLj_7YKTW2BuU_m~LoY)^2^bA{0F-bF7#!TKfeWCgMebP59J2sboe-bWcY7>6K+t9slBj=E4MA zhtQ!Qe-oxKE+r&J2WiaE3|~@}8^s4N(0U%VFb!i9KjBV$_|)-pMHeMbwD}Ae%BC0Z zmLw;%EgOHed}{+2Zb$g`3aDRL(%KwVAFk+-$VNx=Q-to-@k`yN5yda z+;x2odk*xuyCRLl1MUV8NhvsFd>~Vk6iR&sJ%H7X6wxv%K1(stGjsPBv?SHrJiY#D zxP2CRvy|AU480OWx!jwNNQ>H7TVG$iZJMAZ#1Wc=wZ0$-Trk?l`fT`FlQU`_K>^Yj z&mecKbaX&4*|EkhaWavz#Z%D6R0V)*w8E_;Nz(&WT$9?G6~kjp7S{!8;Z4x zHMRDL_482m6w*S|X+*051_9V`j6igNe_)tew5HGjUo~(~E|w7zI3Nl4(-b-j+(EhDR{ zsw#t$laZ5?0u)kVF@fQjXsN(3VKR$9c$~t9d4&1|hx-Ht3XpkX+=C**HHCygy})1c z1q7Rz{LMZv>`xQ`9x~CGU>R9yluST?%s*R%h3iEECVvX_Keh<7jtR!fSYpG1B0@c| zdXd<`aN&Ql@bvh*eQ-pm|A9K59x_;eYycn)1HH=rTbJYk_je021l~RY!3V7X*#AZu z?&I|@u>MUpa?OD{{}co?|C{f>QU9g;0WqL5F;P1e7LEz@z>--3=F&cZ zkC&o?Cq`C9UP?(Gt16{{QSg#dl|`YXJUzUWJXEk)PdP=Ef3PqM^#NXq@&Bh(WLBPl zm6E%cs;q~qf|Q~s_@khJ#Y(wjRWVW+MMadmlB$Zl913&5%F{zlKPWT+1I+0Yfbqu4 z1P6K_RFDBzJ85pHDI_P2`d5j$KPKD@G|&_};}aMW{jUmZp8%{?IEIX-tg@_}qN%YRV6iQwV^@sRmb|yidK3*~ZH)`_W5zqkiz~rZW z!a)Bq2StC3C@XBpA5VWg`uiLVB>{nhL7|56_(O#-OeEIxKu*Bxk1CIIm_TnVh#r5s z>tE$Q|AQ-dVC20NJd_lrP>RZmQVR0&%D{dYc`12!B{@$y6*;V|yVAdN4-4`NkHUmv zPkI9!0an004_;6L#}5o8{_oUL=dffe0KlYB;G^;vU@CtCCiADlGUS-?m&O`0{~IP6 z2L%5JGN9cbWgvKgSSa&%F#HoUa@hI*`17YN{y+8rSpT<^{|Mjz!u4Oc{v!nbBjW#h z*MH&qj}Z8ei2v(d|Igr}``2;`8wh4WQDCtYo!WR9EVQWHjSWu0_Q}6RjSn+G32pFc z`!EpNPTF`&xzk<=Q-*257ks}ChZV?j&)n*d$LyJsj=6O??lgB(6r8xUtKoLbxq%_v zaP9`mm80%R^uExZT_LptLL|*xaDrxA69)X7-`B{fhnJndr~&gk%qcJo=d#%|7(`xYxtM0x zpx#A|Xg|cC%sjuuKS?D`WlEdK8P(a&ZhI!GgGs!6Gw>V+^D1B<9K zMK5Ktd~)5*_vz3iPmEFz-8=1^ZKW<{SQFhm9fRwY{f;nbT`=*t=6PrK>HGLXq+`@@ zv8LIM|H7(%fyom~x!%$V=3k$o3COU`p!Dk0bhTB&JNaRD44P$=YN=FOvyE@cfAiRq zUCym6y!4t&ZY45~Iv1LfQTe4yf>>IP_MB@@ih-dGoucA{bNClBs~xpoq7g+VvAAjnXEnLe-EgB;)XY-7DKPa;9(U@>Xh_Vq+9l ztl#>wwcA6MmPL)$-M;)v?H#JPFBHuCdQ(3N{mp^RJLL>1@1{xIp zJUY=GHRB&p{D?ftxI5v6hu2|R$Q!`-P7%rjNy1SPez|EBrUKm;TpH5$a`$1TQmHM? z)cI>MQ<7^>=P^R>Lrl|=B|o?8bWD}h zbqp#cVE8<)o$s~zj^c+MrQ5l;^J?+y`{_RDg`UMua@I@@ik~vi`2(tO-?5%Kgkxvh z)+utP+%H!~ckIotmEAa#J-Q*u#HDJR*#W>H?zW29JtmVjdZ-=eIG$|-NUd@!&%{{| zPhyy=q(TPd)*N!p=%9tREtZI_Ms9j1_)({cuG3WY68zJP5)D(d;q4#q!RB4rE?@0l zb;%k;n%)l*Q;xjx_WBdXH-((AJ;>8m>MT1JwpIwzA zB)XDe?MQ>0Z@iAK@Y3dS=mgjPYKi*p2pc@4tnlH-IQ9JS+ZqE6cDddxcVOciluTlc z>@5!v4M{8)JVZGqy4vB-5kV{dFMS>*+)MXnj+XE&k}O5J-l;2k>!MwrR=H2>pL zmD=P3nqNT7&kaW#r@_uE{+f3&yBvFUv3DQ`)5NwEKNUMG-h9=CTBYWt>W7Q1aj;;4 zstj+B;tI;Az=_`!&~eWg33l~RqHWTD_&ZKXBBh3IKp`oUbrBa!=+v z%n!-K+N`O?T$j9g8OPCm42pQ{b^hf;ovWP&3v-WA{6=FYKTv(!-EmKn=yzZ$ClXQZ zbImTmL^KS@Y?+{iTKEJ#L*=VyPf7*{q}mqy8@X@ci5F;Bw4HF@+K%kH^+*M|bg#y5 zJ5ueCsxM6=1?-&9umXn?klrv|KcyYcl)H6f-?FOAU-4b3 zA+^KLv+(z%$*4yqT-`Hc4vG1ydn87w^CP(x-Rd}w{>rG{rw{uG^+c9}W#6-3ar}Bt z^7~ehbmY%Ud1e(_m8Nv>6%AgX{UD}^a_Q=k=zuyP?NCDbWHayw&?eZPlwNa9lj3@URfN}qSu(W$EYmZ ze4^H1uhzA5y}UIf*H&9GE1pX|X1t^EUtP6YN#FI1%wAEe>dd&sDaL7$ZxaZ}& zbUe|85omiE67!ATU4^mYGdcyLI6@1Pwo72Ixu)jglHr7bP30e^Zol;l8t2Kwpz#oR zy;ZVoC|2GzY;*q7%_ykxbD($mM!ZI_`S6p$kis>D3jHQvKOL)g?qpmtQBM}Ga?i`7 zfYAx*&y?quyOE|}pve?>yRK_K0P8&WDUKI5|7AcxJzUBss);rPd4t_gVZIsOj<99$tI*fo7Y?~K=2?ko%uX9yv&Eoso2nmd6}f-4g7?OEhLwd+Z)+Z2VVy=ZYS`Z| z4x-AlMVH;2?|o*D;lrgJ@_xo#wi)~#W`{^lWI1NP`?Y>80{1b6=T$$(;?8a8;gOhi zd4demnVxmV5B3~Mu#J0Uh4;Ym*N-^%6{G1?5;sqkG2NxmgvS-7d$T@nVhC@v&y_KW z3u-cXoxIISaw9QCnGnuYEi%L<*CqN7?B1#yFTcw3E^5ZXEtlFYp}g_16LT=KDxT)^ z^Q4$kC%cI&dv`W>BeUYUw6Gbx^%Ek!lkhQ$6Lud2yD6LKKk%hgvUD-Kf<6vyu@HEL$Ldcy+(%cS=V*y z37Zd38foIx5`*<=UX6d4J2Y2=3xZK2WNe}zvEs%nq8qo~I#>Seo-~Q8bb9@)nxA@| zQE<$s^vA;ie`+`HDY0A+3AHY7{QDy@)4$rN>V5g9g|F0%h*<|mGsDlrnN_wPufJ+y z52mfMWZyr+s?4(elBcdeBW+A^GO&%i#%9IaEr+GWl`#y2F(tRCDdjO6|6a6SgzN2h zOwRNl@+(c9_+z)|BBvV?S@>!@wx65E%NJ2rSibta3m@uk{P?rirWwUgbCmYlj8`%IycxW2n!D+j98!;!&OGe!3r0YHLxfocGE` zK9)7JG@C>jD5-}Jh;$jSa88`9*J+Jq80tg~>O{^(A%DYVto_gNAgJvzNar=0740#D zZB6zgpFTop!9?ncDvnoc5WGz2hc@ZP zqA@kjT$|$J$J%3(F5vyP;9>oJCEFe<7EJUzLC6;9Ptb{@RIC(grGxO~=*OXWL$uJZ3ngO*6LSeAq)i3F?{Eny1#C3Yum^L+-0AtfbjOFEqwi1HC25%`!w=O zO$-6GvgYHq&(acRYa7op$9(9yOTIj}uENbk{u8f}?3Zqm9ea;fx`- zoY>c4T#P$*gyD7NNo_klf5r+&e8>)0T}NnnTEi+rg|e;;(MsFKOPx~U;2;!h}NO5B!gYh*fR2{fMA>&bcjk}xXRLF+<-fMVbxT4{Cxh`X98SQJQmApNPt3-&)xU=DCwY~Hh!$lt) zPmREhALf6fDwsIwU=jg>jjI?sX#kfmRf;D*ZP9>@B05Dht|eb7WHKD@Ej1IqASEZi zTzquqs|wQDhud-@<>7YOh{n{ZI!>w5`s4ix)N$&|mK^k>l@JPPUZxO8%TxCdSr@6j!33Jg3v zeF^70R`pujE-LCfvST6c^gZ3p5Sq_2wwAPYRM8rrzwEoUDDTPj`eE#+rVfdlM&Cx{ zdC+E^&e=l*`?lzE8RTh5BAuOm>D>lSrR{Q%P8vT-bV7_}%si2~?$^LGGiR!2!5~Cr z$Z-#Fg*S2Q9Iq%jEQj2r4H-{lGdZU?+8wFfJ8)SaxoEaJ6hyJ-OPh5o^v!wtXu%JH z{_qNaQJ`DlzQFtIoL+Fw-{UX(*a`%QD+OO)Asf!>BAv&-HPes{pw4T zKq6}RSDDTp(~kVBFD|Md9%xg=etUU+6>WDHKIS%SEi02T?Y~h>RgWhwEa892cp4Q@ z@KuGE-vTQ`QDSWF9hm>z#tc>cwuJ>7d`RS#ZgW~V=hV%KE`D4JE!B2x$yVt#hSiR< zhlT_|Z<>jy&R=C0onv|GBwy*e(sBh-GKQ}e+H{(mz3YSmvQ60|8BxklJY0%*45;eW z9>X|gBgI3(Ju~<4NR#j@hlz8u)*(IF`z2n&#@7QmZTwttm;x6wL7-ZEJWditxm49;4W_w+~pf>@&)xU-Jw`WnaI@ z5FRmPS)wdRWYqAUwMI4@F6FkTPYBrnd@(*#x2}tC@ywcV+~R1@fIL!oR|N97Ku4|> zCb9Bk3H&-UPr}RbcKGv$8CGph70z^dB%W{^8@57pN!|DA0D18 zHqIJ++s@u*cczB5^Kw?+Y#^vpIx`==Ppc6$Y%QE7!ZE`lHgbmJ*QxbKo&>%C9h_4Sfivb@NI?foZ!P(w}CZ%cFmJZrED4 z?C~`fuCpJj0mONSN}fIH(r~+jwPMuFA6jOj(05P*+z8`$QYg1iIQ_C&V_eO&H8_f> z@EZm&>cjL!BfDgViU|)2WP;9FZO3zalFNyalA@oAn>~|>cVhGEi037!GA16FC0%?d z;8PZFD|cztw(C}G>zTgTuY5S!?DyJs-+iC^y7O-Lv$QxFKRgn9dDZsx>WU@OnKyGp zofwmS#^?=Q0Rrh9TO+MkejkyWHzb?(%pX8z*U-OERQS}tJfx_3&gUkcs66G+X{k2m z>ICu|hH|~42Nzh88r}kVl3Sid#^kH9yHrH%Rtdi8O-1QF}O$&pOrE??j1 znKxIvtcsY9P%*43JWA3>wz8^Cyny5n6k8}7Em`A>S3tG&l_g~#d;C5#7Uy$N^D=K} z`G!%2ae8cLYMYpKSuUeS-~p%>6DJ?`7t7cs)myh~o6Xj|e^H`5`$>C)O@xrVIuXJs z+iUYh+w7e`$-dJI_yBLL?_w`?`o!}(%b>I3Prk(S<$93$NcTPz;hO1mR2wiPuShEL zhA_=%BWJ;MU$6(Za+rSg*$#)ZqWs~rny)6a?X$bJ?Whx3=%!9=WFq1PP!n@yUixr? zNcc<2C4~_8JizdD>f#IASE8aeGM%?3w&~53e^s>ik-f$n#|_5Gos#Ddo;?+@6>Bv6 zH0A@0Dt4LW0Zg7%eO?jw#MVqv4*f*C(7Ol(Wd5{ckuO{E&raN(Dp>?&yR>{Ozk#2-vs78Qw`=f5_mTT}*(?^_wJ4t2;%63tLV&v=LSW$0?MtAwK zc<&k6JU@AHaJ%uk#$E4Oz-Pjfl+|`4=0w%SQY%LP43g|57J#yrR#u{n$8x)A8b6ef z%!%7|b5GW!er}@JI}r2$X(k#y{u2bj5blui%b6OKXP$0!BCTBU< z|EMRF*P6{M*TNQF$M=FTNHDmv*k`q}*QUnhQ~dPK&u4fOfE6F9SigYXwihsuITEe% z>dOW7kg1#2ii_0Q#`C$ZFurQCOcpelBTH@FYcKv#Vmy=7arKWEmcG2Q!tt2sEW9lyhjt_N&`$2 zB$#*`(oEson{K=8Rg&4N0pk}9ynW}6tMV`Z2Q~`51Db(Gt98l9WJk1UAVrAj>D0QHCM1x;GVE2j6K|5?NXpNF%416DZx(#oER7zS)*h zv*sw664ir1BqN+FBK#g>=rUfaqlW(`SymZ+)Q4(m`8Ej9G-zp0@V8*oJ#qiA9LLaA1+ms~#-~!nc%rm5@y8w^ zF}X@Ggx^P;eLt;E=A>K03u7hJ5n!oxd*-uQTh9RSxyIkP z=3{X?qa1oq8nD)gb@&_6*!e-YjH3>iCp?A`McxlDz%Jo+uiiWR#ZMD3k=>_lr=vp?hTn&KiJ~)k@oDuTSL=(^wK&ddea2`oj6HQkcMp?=Sas~% zJH|WpMymbh!ZmlB)>`O7O4{dna=tW^s=jZ&&lN6Bgv>v^Hdvf%UI1(7h`uo#w&@|R z^YH^PjdechG%Xv^fIPoF%ZMuV zN%l?usn%TDypL~dVr=`h?OHm5`g*9n?A%l&k>5G>WZ!g@BSAJXSR$nOerA5!?*g8g z@-vSn%_1fW8*}QgrTsY=G~Fh=DsoEqHiOgGdZ0r2w-e=08v3+JkM13hDCU}|U6x!Y#qSRVSbK;OyAaW0?%*`B4GCVm$g*O2Zlf1(Ueq@xw=qG&SS zrhnh{oNnnpm>t*F&%IuVVVJ zAU!CRovYh(%1%(O*9J^0U54Y&5PGX3DVsoU%3QKSlxAfsgQP@!dovKWH`sAxro2`Q z7G>*yh8kwTrYHOMm#=I~9BO&xX}+Xf$#-0(5(w3EfGRQvO}$Askh_eYbR(T}OV}_Q z6avZT8`SI667^YL$e(8zVzN!Dr0~+3E`$psJOi3iY>C6rCJ&SNtHmKAMG30*O=CtIrKu5LejoV z*fVWnEZF3AXqun)IcR%>1UXxE<)B=It)S14Te@SyH zNy|o-XERo~$K}~ekR|obLBBYjYK7;wS)vNEpVF7E(V-c149HsS(qhazsmO67=J5*N z@o_b8{oGGW(p>6|fHT8o31HoX&#qs;QGPC03z0YF?Hf5$ZCq%__S&M&xy!bK#A0A2 z{mq{3wdyzT^W}ElXo^jV<*@hV@o-sY74{ZZ+Yu(`I|<1N90S|eem>KOO;VX2Pj%1z zMzqOI6Kayts=tU~3KkA_5$6By?Hdu)twDLG@_1@#2Y>Pg$i?KqTxkT))Xrrwuh`&^ z4wc^1&7<%K=BFm-v)2-$q6A+ej#8a@ylK8cNd!(1!C6!mp4*Jv6dkbdUYlHlO)7L@ zi+)_+Nv|WFDP45NF|!ov`v<&}RnNvRK88rH6A>*wdKCGh7<#+3`MpF>iI=ZKI z6}c8PNGzl&mX>frVO(yS#E&f-x9H2s+YD6^!aaLl1K4Dua#JTgMrlcu^!f-xlt2j8 zjviRtyRT(1tt>eN1? zxCd^E*!yZzq&!ukB6Y3d3hVVbj&rT}OE_0#p@i$nNBb>tT)h-~+GE?{p4XES1cQ_O zp8YW4L7Cw>Y%SQnBMQrABR(R>5J#!U_;qqWvw!#?ux~ci@GI(5)u9(WL&fRdGO>zp zwe5l^w?o@rpHQk?_KD`+WDm9ksffx{G}udnCnHAT_kE-3jv-igCcx};Td02!9*DFh zZk0vTZgPi6c2n!pT+r!1FNo$Ef~g>e@?*PPTyKg)6W28wJ`i+33yJ>c6b?{z0i%nE zDVIix6TRzI{;!vC*KrlfsI8vr@fc!@;w%)+qilufoP{G>^QD>(z)arSFq9HpDq z)IHP}_(oZpH1fuV!nyQ>yPA{^PT#zp9wL7auCi&+#;H&Y_Pe}gVTM#lm$Z>X9Im4; z7b@98tV-f}Vx}c7gX!k7IX{yVY+kPsEp~@~o?EA`gFw2Dh_l4G(=0o0s^ilRi@jiM zZJ(q6#YqwddGCI!;@6*rqojs;F*Ne2_f)vJ7|%Si$mRFTZN`WJbSP3yQZh!Bgrs@> zk;`xPsOG(LJDHrvd&|6`0qDFhYK(x3*QKc(!E+)znc@_x1eY+RUC03|w&0r?^i$kz zP`_aOM;TZw1k$bzT$%K;Q|;%69Ro@7a-Z*wY|D)sNl-&af-TaPB3lXK9R8wxKiyl} zQUv4}IOhm3yKJpho0Y>==V?A?Q?y2FZ*A;8`?1U{+!QH!inNf9AiX61a+ zy5}7$doOGpuX>0fy6pc1i<(L{y(dD;%fA~~n?Eg3MKTD!OrF|n1^*^sPCg58GgK4A z4I}7rTl@4}Gis8M?!6H$(Lb68-D{ffFBByr*4q=4ml=Y!=P*pYZ)?1-{7y03n49N} zf{*e{gN-8JM_P3AR69w7W^avN9i6HsX2mFsysf#La<{PVv%z;Z=sm=DUE_E1LtUzR zOQtpNE5`9Iw|g-gAaF`Qb~EgzkUq0SC25lbNdPnAQhD-$IMo? z#sBPSe{UK4kyX1U-Fq-rqTjGd*DfJ(`zVRJjd!Hr#{+5_$PRaR&O8}R%iA^@CSPsL zHb(4@A^q8D24mFvmnUt_@Y`#gRmYV?o4n_fO5GFa<~en8ogW?nf@5)#S9l2Lmb(O{ zHNwM%dyd7Z0l|sIP43)t>K_u!uJ19BH_wPS6hR`2fM{-w7~yPJAaz1pU>!3%3w*Rb zd7Fmx_E&Pqx#ay#r7Ay~&qTFBuxeU_Iq8q(>d}9{KZ z2)g*N6hF%7)@C;|xGTkl1u-A6z5SeNEgc%fA#oP*tL;14n~&mCy>}vtn~p614p$C| zX;f{aOl|^hk`N1&Gp6UCyMzk>M-C#ki#kV+B`!tvtRi&dt)>drJv4b>8uUjQohIJa za2GH|2=kYfonKVa&E?UlgKx4dXB17uzEovZ=|?44Z5(cXSNZ$*>M+!kve+Rb2i}0j z#vJoz@ZU&&DfJ(s&J^ExN}gGqY0tXay>qh;X3onFeQA50hW-Fvtc?==Yt2~&2+=i3 zM>fC1laCkQ-AkCTg-N+hvb3D&nRfI8X)!zj$NcHskX6Us+lvan=2a^Z+%uMwm$%)( z_JPCFk0(oJclao4=>#=C+dGw*C#VPW3?vkyk#(0;F75VQ*I4PK2K31n6atOz{nSG9Z0d|FInQ2_j#pXs zyQC?B$}5B3L82gBcFckO{Cb%o1DFXZ4BD)goK#I*y6FATPA8sm>hO~?8MT!YRbj$C z3s1^{F&7xuU={j#DpB4vpIv&4DwDRU@qUI0tU1XklR0Kj0g32+|tn9NyP9U#`~8u^yF<=O%GN3CGZx!)>aZoLQ1z4I^i6 z&4G|915ZX~u=01XOexRsINE>{EOSTZz~07sjN)?fHA-nOR9@9~}4obboK*R(y3 z6-7E*@?JK;>88}Yu~I^)+#m1{3N* zBN4Nj5Hs$o1k0Q*J_xq>qL0^bmS zG!fBiPrZ2oB%3f;G7$HF<795_-IIq8v8xRKv?UjLW`E=9 zvB0&c1GaOY%CzX`sn3){!P&^}KoE=_?8zQGV+PsbhuOJ0NAY3c2*UABkOQ!WXNJMuaFizF(~9(n~`{#J1T>`+<;sI9f9TG97~$>^zuClA9~^yHYU~AGuqnz4PgUj3nXp3*pR?ug~uMOha%YT7d+dI9f1U zZSUv+68x0oRY?XLUucfH-am#5(Ruqc$%xd-&fWJ7N&u;P8-gT&?HP#Jvu%ccGPP!nnKwBqEM2cq%;>(jB1`dpFA% zZE?Ch_R-|9Z*3YyE!=XlKmpdtI!S2uj}ZOuVaES60;|(|TKI(H+qw3`vf$_`%uvtt K6j8_R;{O6V4ofTm literal 0 HcmV?d00001 diff --git a/vscode/quint-vscode/icons/logo-light.svg b/vscode/quint-vscode/icons/logo-light.svg new file mode 100644 index 000000000..0e218eca8 --- /dev/null +++ b/vscode/quint-vscode/icons/logo-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vscode/quint-vscode/icons/logo.png b/vscode/quint-vscode/icons/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..563a196a67fcd5b3c4d037d8c5375964392286ed GIT binary patch literal 14962 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 literal 0 HcmV?d00001 diff --git a/vscode/quint-vscode/package.json b/vscode/quint-vscode/package.json index ee5f35fa2..b5bd72d62 100644 --- a/vscode/quint-vscode/package.json +++ b/vscode/quint-vscode/package.json @@ -2,15 +2,13 @@ "name": "quint-vscode", "displayName": "Quint", "description": "Language support for Quint specifications", - "icon": "quint-logo-vscode.png", + "icon": "./icons/logo.png", "version": "0.14.0", "publisher": "informal", "engines": { "vscode": "^1.52.0" }, - "categories": [ - "Programming Languages" - ], + "categories": ["Programming Languages"], "bugs": { "url": "https://github.com/informalsystems/quint/issues" }, @@ -18,22 +16,19 @@ "type": "git", "url": "https://github.com/informalsystems/quint.git" }, - "activationEvents": [ - "onLanguage:quint" - ], + "activationEvents": ["onLanguage:quint"], "main": "./client/out/extension", "contributes": { "languages": [ { "id": "quint", - "aliases": [ - "Quint", - "quint" - ], - "extensions": [ - ".qnt" - ], - "configuration": "./language-configuration.json" + "aliases": ["Quint", "quint"], + "extensions": [".qnt"], + "configuration": "./language-configuration.json", + "icon": { + "light": "./icons/logo-dark.png", + "dark": "./icons/logo-light.png" + } } ], "grammars": [ diff --git a/vscode/quint-vscode/quint-logo-vscode.png b/vscode/quint-vscode/quint-logo-vscode.png deleted file mode 100644 index 1864749aa116d35b5255a72a5c3c732f06afec1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11953 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 Date: Tue, 9 Apr 2024 14:05:05 -0300 Subject: [PATCH 334/388] Release v0.19.2 --- CHANGELOG.md | 9 +++++++++ quint/package-lock.json | 4 ++-- quint/package.json | 2 +- quint/src/version.ts | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 66f38e3ad..2e8bfec05 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.19.2 -- 2024-04-09 + ### Added ### Changed ### Deprecated diff --git a/quint/package-lock.json b/quint/package-lock.json index 7585f9ed7..7e9b8fb70 100644 --- a/quint/package-lock.json +++ b/quint/package-lock.json @@ -1,12 +1,12 @@ { "name": "@informalsystems/quint", - "version": "0.19.1", + "version": "0.19.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@informalsystems/quint", - "version": "0.19.1", + "version": "0.19.2", "license": "Apache 2.0", "dependencies": { "@grpc/grpc-js": "^1.8.14", diff --git a/quint/package.json b/quint/package.json index 118b36ce6..9ef9ff759 100644 --- a/quint/package.json +++ b/quint/package.json @@ -1,6 +1,6 @@ { "name": "@informalsystems/quint", - "version": "0.19.1", + "version": "0.19.2", "description": "Core tool for the Quint specification language", "keywords": [ "temporal", diff --git a/quint/src/version.ts b/quint/src/version.ts index b49c84d06..8e013601f 100644 --- a/quint/src/version.ts +++ b/quint/src/version.ts @@ -1,2 +1,2 @@ // Generated by genversion. -export const version = '0.19.1' +export const version = '0.19.2' From da7ef9815900c4575bd875c8c5e28b5d6e4ee661 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 9 Apr 2024 14:32:41 -0300 Subject: [PATCH 335/388] VSCode Release v0.14.1 --- vscode/quint-vscode/CHANGELOG.md | 9 +++++++++ vscode/quint-vscode/package-lock.json | 4 ++-- vscode/quint-vscode/package.json | 19 ++++++++++++++----- vscode/quint-vscode/server/package-lock.json | 18 +++++++++--------- vscode/quint-vscode/server/package.json | 4 ++-- 5 files changed, 36 insertions(+), 18 deletions(-) diff --git a/vscode/quint-vscode/CHANGELOG.md b/vscode/quint-vscode/CHANGELOG.md index 01cbf258a..2e94f2ad2 100644 --- a/vscode/quint-vscode/CHANGELOG.md +++ b/vscode/quint-vscode/CHANGELOG.md @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.14.1 -- 2024-04-09 + ### Added ### Changed diff --git a/vscode/quint-vscode/package-lock.json b/vscode/quint-vscode/package-lock.json index 900f52373..fd065d03f 100644 --- a/vscode/quint-vscode/package-lock.json +++ b/vscode/quint-vscode/package-lock.json @@ -1,12 +1,12 @@ { "name": "quint-vscode", - "version": "0.14.0", + "version": "0.14.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "quint-vscode", - "version": "0.14.0", + "version": "0.14.1", "hasInstallScript": true, "dependencies": { "vscode-languageclient": "^7.0.0" diff --git a/vscode/quint-vscode/package.json b/vscode/quint-vscode/package.json index b5bd72d62..b80840a9a 100644 --- a/vscode/quint-vscode/package.json +++ b/vscode/quint-vscode/package.json @@ -3,12 +3,14 @@ "displayName": "Quint", "description": "Language support for Quint specifications", "icon": "./icons/logo.png", - "version": "0.14.0", + "version": "0.14.1", "publisher": "informal", "engines": { "vscode": "^1.52.0" }, - "categories": ["Programming Languages"], + "categories": [ + "Programming Languages" + ], "bugs": { "url": "https://github.com/informalsystems/quint/issues" }, @@ -16,14 +18,21 @@ "type": "git", "url": "https://github.com/informalsystems/quint.git" }, - "activationEvents": ["onLanguage:quint"], + "activationEvents": [ + "onLanguage:quint" + ], "main": "./client/out/extension", "contributes": { "languages": [ { "id": "quint", - "aliases": ["Quint", "quint"], - "extensions": [".qnt"], + "aliases": [ + "Quint", + "quint" + ], + "extensions": [ + ".qnt" + ], "configuration": "./language-configuration.json", "icon": { "light": "./icons/logo-dark.png", diff --git a/vscode/quint-vscode/server/package-lock.json b/vscode/quint-vscode/server/package-lock.json index b9ff769fe..61531e915 100644 --- a/vscode/quint-vscode/server/package-lock.json +++ b/vscode/quint-vscode/server/package-lock.json @@ -1,15 +1,15 @@ { "name": "@informalsystems/quint-language-server", - "version": "0.14.0", + "version": "0.14.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint-language-server", - "version": "0.14.0", + "version": "0.14.1", "license": "Apache 2.0", "dependencies": { - "@informalsystems/quint": "^0.19.0", + "@informalsystems/quint": "^0.19.2", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" @@ -476,9 +476,9 @@ "dev": true }, "node_modules/@informalsystems/quint": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.19.0.tgz", - "integrity": "sha512-gyoyraa6C163gRFNB9LUzCHLpyUfcnyK7r0HKKzi0jsN9w9TJzxfXFc48X2l0qAf2Y9IJx3s7khqJtNX51xgsA==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.19.2.tgz", + "integrity": "sha512-U+KVbhr8dp9kp2q72MVwKYlGN411ORzUYECD4Fkcnck16BwLbGDUqbnvlzfBRmqNv7VJKgmAxVOxn/gRDcUrYQ==", "dependencies": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", @@ -7182,9 +7182,9 @@ "dev": true }, "@informalsystems/quint": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.19.0.tgz", - "integrity": "sha512-gyoyraa6C163gRFNB9LUzCHLpyUfcnyK7r0HKKzi0jsN9w9TJzxfXFc48X2l0qAf2Y9IJx3s7khqJtNX51xgsA==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.19.2.tgz", + "integrity": "sha512-U+KVbhr8dp9kp2q72MVwKYlGN411ORzUYECD4Fkcnck16BwLbGDUqbnvlzfBRmqNv7VJKgmAxVOxn/gRDcUrYQ==", "requires": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", diff --git a/vscode/quint-vscode/server/package.json b/vscode/quint-vscode/server/package.json index fbd39ff11..069a23dec 100644 --- a/vscode/quint-vscode/server/package.json +++ b/vscode/quint-vscode/server/package.json @@ -1,7 +1,7 @@ { "name": "@informalsystems/quint-language-server", "description": "Language Server for the Quint specification language", - "version": "0.14.0", + "version": "0.14.1", "author": "Informal Systems", "contributors": [ { @@ -43,7 +43,7 @@ "test/**/*.ts" ], "dependencies": { - "@informalsystems/quint": "^0.19.0", + "@informalsystems/quint": "^0.19.2", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" From 77ab9ba4a99cf05c5ce26fc99505d53789efe3a2 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 15 Apr 2024 14:50:24 -0300 Subject: [PATCH 336/388] Sketch solution to store chosen actions and nondet values --- quint/src/runtime/compile.ts | 1 + quint/src/runtime/impl/compilerImpl.ts | 68 ++++++++++++++++++++++++-- 2 files changed, 65 insertions(+), 4 deletions(-) diff --git a/quint/src/runtime/compile.ts b/quint/src/runtime/compile.ts index fbec5aeca..a3c49753b 100644 --- a/quint/src/runtime/compile.ts +++ b/quint/src/runtime/compile.ts @@ -27,6 +27,7 @@ import { QuintError } from '../quintError' * The name of the shadow variable that stores the last found trace. */ export const lastTraceName = 'q::lastTrace' +export const traceMetaName = 'q::traceMeta' /** * The name of a definition that wraps the user input, e.g., in REPL. diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 1e08509e2..078f39d4d 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -35,7 +35,7 @@ import * as ir from '../../ir/quintIr' import { RuntimeValue, RuntimeValueLambda, RuntimeValueVariant, rv } from './runtimeValue' import { ErrorCode, QuintError } from '../../quintError' -import { inputDefName, lastTraceName } from '../compile' +import { inputDefName, lastTraceName, traceMetaName } from '../compile' import { prettyQuintEx, terminalWidth } from '../../graphics' import { format } from '../../prettierimp' import { unreachable } from '../../util' @@ -119,8 +119,14 @@ export function newEvaluationState(listener: ExecutionListener): EvaluationState const lastTrace = mkRegister('shadow', lastTraceName, just(rv.mkList([])), () => state.errorTracker.addRuntimeError(0n, 'QNT501', 'q::lastTrace is not set') ) + const traceMeta = mkRegister('shadow', traceMetaName, just(rv.mkList([])), () => + state.errorTracker.addRuntimeError(0n, 'QNT501', 'q::traceMeta is not set') + ) + state.shadowVars.push(lastTrace) + state.shadowVars.push(traceMeta) state.context.set(kindName(lastTrace.kind, lastTrace.name), lastTrace) + state.context.set(kindName(traceMeta.kind, traceMeta.name), traceMeta) return state } @@ -163,6 +169,9 @@ export class CompilerVisitor implements IRVisitor { private rand // execution listener private execListener: ExecutionListener + + private actionTaken: Maybe = none() + private nondetPicks: Maybe = none() // the current depth of operator definitions: top-level defs are depth 0 // FIXME(#1279): The walk* functions update this value, but they need to be // initialized to -1 here for that to work on all scenarios. @@ -259,6 +268,11 @@ export class CompilerVisitor implements IRVisitor { const evalApp: ir.QuintApp = { id: 0n, kind: 'app', opcode: '_', args: [app] } boundValue = { eval: () => { + if (this.actionTaken.isNone() && this.nondetPicks.isNone()) { + this.actionTaken = just(rv.mkStr(opdef.name)) + this.nondetPicks = just(rv.mkRecord([])) + } + if (app.opcode === inputDefName) { this.execListener.onUserOperatorCall(evalApp) // do not call onUserOperatorReturn on '_' later, as it may span over multiple frames @@ -294,6 +308,20 @@ export class CompilerVisitor implements IRVisitor { // bind the callable under its name as well this.context.set(kindName('callable', opdef.name), boundValue) } + + if (opdef.qualifier === 'action' && opdef.expr.kind === 'lambda') { + const unwrappedValue = boundValue + boundValue = { + eval: () => { + if (this.actionTaken.isNone() && this.nondetPicks.isNone()) { + this.actionTaken = just(rv.mkStr(opdef.name)) + this.nondetPicks = just(rv.mkRecord([])) + } + + return unwrappedValue.eval() + }, + } + } } exitLet(letDef: ir.QuintLet) { @@ -327,13 +355,19 @@ export class CompilerVisitor implements IRVisitor { // a new random value may be produced later. const undecoratedEval = exprUnderLet.eval const boundValueEval = boundValue.eval - exprUnderLet.eval = function (): Maybe { + exprUnderLet.eval = () => { const cachedValue = boundValueEval() boundValue.eval = function () { return cachedValue } // compute the result and immediately reset the cache const result = undecoratedEval() + + if (result.isJust() && qualifier === 'nondet') { + this.nondetPicks = just( + rv.mkRecord(this.nondetPicks.value!.toOrderedMap().set(letDef.opdef.name, cachedValue.value as RuntimeValue)) + ) + } boundValue.eval = boundValueEval return result } @@ -1472,6 +1506,8 @@ export class CompilerVisitor implements IRVisitor { // we use a random number generator. This may change in the future. const lazyCompute = () => { // save the values of the next variables, as actions may update them + this.actionTaken = none() + this.nondetPicks = none() const valuesBefore = this.snapshotNextVars() // we store the potential successor values in this array const successors: Maybe[][] = [] @@ -1623,6 +1659,12 @@ export class CompilerVisitor implements IRVisitor { this.execListener.onUserOperatorCall(nextApp) const nextResult = next.eval() failure = nextResult.isNone() || failure + const r = this.context.get(kindName('shadow', traceMetaName))! as Register + r.registerValue.map(v => { + const s = prettyQuintEx(v.toQuintEx(zerog)) + console.log(format(80, 0, s)) + }) + if (isTrue(nextResult)) { this.shiftVars() this.extendTrace() @@ -1680,6 +1722,13 @@ export class CompilerVisitor implements IRVisitor { const extended = this.trace().push(this.varsToRecord()) trace.registerValue = just(rv.mkList(extended)) } + let meta = this.shadowVars.find(r => r.name === traceMetaName) + if (meta) { + meta.registerValue = just(this.metaVarsToRecord()) + // console.log('reseting') + this.actionTaken = none() + this.nondetPicks = none() + } } // convert the current variable values to a record @@ -1690,6 +1739,13 @@ export class CompilerVisitor implements IRVisitor { return rv.mkRecord(map) } + private metaVarsToRecord(): RuntimeValue { + return rv.mkRecord([ + ['action_taken', this.actionTaken.value!], + ['action_args', this.nondetPicks.value!], + ]) + } + private shiftVars() { this.recoverVars(this.snapshotNextVars()) this.nextVars.forEach(r => (r.registerValue = none())) @@ -1697,22 +1753,26 @@ export class CompilerVisitor implements IRVisitor { // save the values of the vars into an array private snapshotVars(): Maybe[] { - return this.vars.map(r => r.registerValue) + return this.vars.map(r => r.registerValue).concat([this.actionTaken, this.nondetPicks]) } // save the values of the next vars into an array private snapshotNextVars(): Maybe[] { - return this.nextVars.map(r => r.registerValue) + return this.nextVars.map(r => r.registerValue).concat([this.actionTaken, this.nondetPicks]) } // load the values of the variables from an array private recoverVars(values: Maybe[]) { this.vars.forEach((r, i) => (r.registerValue = values[i])) + this.actionTaken = values[this.vars.length] + this.nondetPicks = values[this.vars.length + 1] } // load the values of the next variables from an array private recoverNextVars(values: Maybe[]) { this.nextVars.forEach((r, i) => (r.registerValue = values[i])) + this.actionTaken = values[this.vars.length] + this.nondetPicks = values[this.vars.length + 1] } private contextGet(name: string | bigint, kinds: ComputableKind[]) { From 671b962b4405c4eaa14c80953fd1ee48f9586d00 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 15 Apr 2024 15:56:14 -0300 Subject: [PATCH 337/388] Add metadata to trace instead of separate variable --- quint/src/runtime/compile.ts | 1 - quint/src/runtime/impl/compilerImpl.ts | 31 +++++--------------------- 2 files changed, 6 insertions(+), 26 deletions(-) diff --git a/quint/src/runtime/compile.ts b/quint/src/runtime/compile.ts index a3c49753b..fbec5aeca 100644 --- a/quint/src/runtime/compile.ts +++ b/quint/src/runtime/compile.ts @@ -27,7 +27,6 @@ import { QuintError } from '../quintError' * The name of the shadow variable that stores the last found trace. */ export const lastTraceName = 'q::lastTrace' -export const traceMetaName = 'q::traceMeta' /** * The name of a definition that wraps the user input, e.g., in REPL. diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 078f39d4d..d72781ff2 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -35,7 +35,7 @@ import * as ir from '../../ir/quintIr' import { RuntimeValue, RuntimeValueLambda, RuntimeValueVariant, rv } from './runtimeValue' import { ErrorCode, QuintError } from '../../quintError' -import { inputDefName, lastTraceName, traceMetaName } from '../compile' +import { inputDefName, lastTraceName } from '../compile' import { prettyQuintEx, terminalWidth } from '../../graphics' import { format } from '../../prettierimp' import { unreachable } from '../../util' @@ -119,14 +119,9 @@ export function newEvaluationState(listener: ExecutionListener): EvaluationState const lastTrace = mkRegister('shadow', lastTraceName, just(rv.mkList([])), () => state.errorTracker.addRuntimeError(0n, 'QNT501', 'q::lastTrace is not set') ) - const traceMeta = mkRegister('shadow', traceMetaName, just(rv.mkList([])), () => - state.errorTracker.addRuntimeError(0n, 'QNT501', 'q::traceMeta is not set') - ) state.shadowVars.push(lastTrace) - state.shadowVars.push(traceMeta) state.context.set(kindName(lastTrace.kind, lastTrace.name), lastTrace) - state.context.set(kindName(traceMeta.kind, traceMeta.name), traceMeta) return state } @@ -1659,11 +1654,6 @@ export class CompilerVisitor implements IRVisitor { this.execListener.onUserOperatorCall(nextApp) const nextResult = next.eval() failure = nextResult.isNone() || failure - const r = this.context.get(kindName('shadow', traceMetaName))! as Register - r.registerValue.map(v => { - const s = prettyQuintEx(v.toQuintEx(zerog)) - console.log(format(80, 0, s)) - }) if (isTrue(nextResult)) { this.shiftVars() @@ -1722,13 +1712,6 @@ export class CompilerVisitor implements IRVisitor { const extended = this.trace().push(this.varsToRecord()) trace.registerValue = just(rv.mkList(extended)) } - let meta = this.shadowVars.find(r => r.name === traceMetaName) - if (meta) { - meta.registerValue = just(this.metaVarsToRecord()) - // console.log('reseting') - this.actionTaken = none() - this.nondetPicks = none() - } } // convert the current variable values to a record @@ -1736,14 +1719,12 @@ export class CompilerVisitor implements IRVisitor { const map: [string, RuntimeValue][] = this.vars .filter(r => r.registerValue.isJust()) .map(r => [r.name, r.registerValue.value as RuntimeValue]) - return rv.mkRecord(map) - } - private metaVarsToRecord(): RuntimeValue { - return rv.mkRecord([ - ['action_taken', this.actionTaken.value!], - ['action_args', this.nondetPicks.value!], - ]) + if (true) { + map.push(['action_taken', this.actionTaken.value!], ['nondet_picks', this.nondetPicks.value!]) + } + + return rv.mkRecord(map) } private shiftVars() { From 26e40bbde86d7fe5f2c19410c056bd937c1f45a3 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 16 Apr 2024 09:52:32 -0300 Subject: [PATCH 338/388] Add mbt flag and fix callable for lambdas --- quint/src/cli.ts | 5 +++ quint/src/cliCommands.ts | 1 + quint/src/repl.ts | 7 ++-- quint/src/runtime/compile.ts | 23 +++++++---- quint/src/runtime/impl/compilerImpl.ts | 55 +++++++++++++++----------- quint/src/runtime/testing.ts | 9 ++++- quint/src/simulation.ts | 11 +++++- quint/test/runtime/compile.test.ts | 31 +++++++++++---- 8 files changed, 99 insertions(+), 43 deletions(-) diff --git a/quint/src/cli.ts b/quint/src/cli.ts index 7bcf81866..c0fb17326 100755 --- a/quint/src/cli.ts +++ b/quint/src/cli.ts @@ -246,6 +246,11 @@ const runCmd = { desc: 'control how much output is produced (0 to 5)', type: 'number', default: verbosity.defaultLevel, + }) + .option('mbt', { + desc: 'whether to produce info to be used by model-based testing', + type: 'boolean', + default: false, }), // Timeouts are postponed for: // https://github.com/informalsystems/quint/issues/633 diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index e05438d9d..17182dbff 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -546,6 +546,7 @@ export async function runSimulator(prev: TypecheckedStage): Promise 0 || context.compileErrors.length > 0 || context.analysisErrors.length > 0) { printErrors(out, state, context, newInput) @@ -582,7 +583,7 @@ function tryEval(out: writer, state: ReplState, newInput: string): boolean { } if (parseResult.kind === 'declaration') { // compile the module and add it to history if everything worked - const context = compileDecls(state.compilationState, state.evaluationState, state.rng, parseResult.decls) + const context = compileDecls(state.compilationState, state.evaluationState, state.rng, false, parseResult.decls) if ( context.evaluationState.context.size === 0 || diff --git a/quint/src/runtime/compile.ts b/quint/src/runtime/compile.ts index fbec5aeca..0c22af170 100644 --- a/quint/src/runtime/compile.ts +++ b/quint/src/runtime/compile.ts @@ -140,11 +140,10 @@ export function compile( evaluationState: EvaluationState, lookupTable: LookupTable, rand: (bound: bigint) => bigint, + storeMetadata: boolean, defs: QuintDef[] ): CompilationContext { - const { analysisOutput } = compilationState - - const visitor = new CompilerVisitor(lookupTable, analysisOutput.types, rand, evaluationState) + const visitor = new CompilerVisitor(lookupTable, rand, evaluationState, storeMetadata) defs.forEach(def => walkDefinition(visitor, def)) @@ -177,6 +176,7 @@ export function compileExpr( state: CompilationState, evaluationState: EvaluationState, rng: Rng, + storeMetadata: boolean, expr: QuintEx ): CompilationContext { // Create a definition to encapsulate the parsed expression. @@ -184,7 +184,7 @@ export function compileExpr( // Hence, we have to compile it via an auxilliary definition. const def: QuintDef = { kind: 'def', qualifier: 'action', name: inputDefName, expr, id: state.idGen.nextId() } - return compileDecls(state, evaluationState, rng, [def]) + return compileDecls(state, evaluationState, rng, storeMetadata, [def]) } /** @@ -203,6 +203,7 @@ export function compileDecls( state: CompilationState, evaluationState: EvaluationState, rng: Rng, + storeMetadata: boolean, decls: QuintDeclaration[] ): CompilationContext { if (state.originalModules.length === 0 || state.modules.length === 0) { @@ -253,7 +254,7 @@ export function compileDecls( // Filter definitions that were not compiled yet const defsToCompile = flatDefinitions.filter(d => !mainModule.declarations.some(d2 => d2.id === d.id)) - const ctx = compile(newState, evaluationState, flattenedTable, rng.next, defsToCompile) + const ctx = compile(newState, evaluationState, flattenedTable, rng.next, storeMetadata, defsToCompile) return { ...ctx, analysisErrors } } @@ -276,7 +277,8 @@ export function compileFromCode( mainName: string, mainPath: SourceLookupPath, execListener: ExecutionListener, - rand: (bound: bigint) => bigint + rand: (bound: bigint) => bigint, + storeMetadata: boolean ): CompilationContext { // parse the module text // FIXME(#1052): We should build a proper sourceCode map from the files we previously loaded @@ -313,7 +315,14 @@ export function compileFromCode( }, ] const defsToCompile = main ? main.declarations : [] - const ctx = compile(compilationState, newEvaluationState(execListener), flattenedTable, rand, defsToCompile) + const ctx = compile( + compilationState, + newEvaluationState(execListener), + flattenedTable, + rand, + storeMetadata, + defsToCompile + ) return { ...ctx, diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index d72781ff2..ee8d2b1bc 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -141,8 +141,6 @@ export function newEvaluationState(listener: ExecutionListener): EvaluationState export class CompilerVisitor implements IRVisitor { // the lookup table to use for the module private lookupTable: LookupTable - // types assigned to expressions and definitions - private types: Map // the stack of computable values private compStack: Computable[] = [] // The map of identifiers (and sometimes, names) to their compiled values: @@ -165,6 +163,7 @@ export class CompilerVisitor implements IRVisitor { // execution listener private execListener: ExecutionListener + private storeMetadata: boolean private actionTaken: Maybe = none() private nondetPicks: Maybe = none() // the current depth of operator definitions: top-level defs are depth 0 @@ -174,13 +173,13 @@ export class CompilerVisitor implements IRVisitor { constructor( lookupTable: LookupTable, - types: Map, rand: (bound: bigint) => bigint, - evaluationState: EvaluationState + evaluationState: EvaluationState, + storeMetadata: boolean ) { this.lookupTable = lookupTable - this.types = types this.rand = rand + this.storeMetadata = storeMetadata this.context = evaluationState.context this.vars = evaluationState.vars @@ -242,7 +241,7 @@ export class CompilerVisitor implements IRVisitor { exitOpDef(opdef: ir.QuintOpDef) { // Either a runtime value, or a def, action, etc. // All of them are compiled to callables, which may have zero parameters. - let boundValue = this.compStack.pop() + let boundValue = this.compStack.pop() as Callable if (boundValue === undefined) { this.errorTracker.addCompileError(opdef.id, 'QNT501', `No expression for ${opdef.name} on compStack`) return @@ -278,6 +277,7 @@ export class CompilerVisitor implements IRVisitor { this.execListener.onUserOperatorReturn(app, [], r) return r }, + nparams: unwrappedValue.nparams, } } @@ -295,28 +295,30 @@ export class CompilerVisitor implements IRVisitor { } } - const kname = kindName('callable', opdef.id) - // bind the callable from the stack - this.context.set(kname, boundValue) - - if (specialNames.includes(opdef.name)) { - // bind the callable under its name as well - this.context.set(kindName('callable', opdef.name), boundValue) - } - if (opdef.qualifier === 'action' && opdef.expr.kind === 'lambda') { const unwrappedValue = boundValue boundValue = { - eval: () => { + eval: (args?: Maybe[]) => { if (this.actionTaken.isNone() && this.nondetPicks.isNone()) { this.actionTaken = just(rv.mkStr(opdef.name)) this.nondetPicks = just(rv.mkRecord([])) } - return unwrappedValue.eval() + const r: Maybe = unwrappedValue.eval(args) + return r }, + nparams: unwrappedValue.nparams, } } + + const kname = kindName('callable', opdef.id) + // bind the callable from the stack + this.context.set(kname, boundValue) + + if (specialNames.includes(opdef.name)) { + // bind the callable under its name as well + this.context.set(kindName('callable', opdef.name), boundValue) + } } exitLet(letDef: ir.QuintLet) { @@ -1038,7 +1040,7 @@ export class CompilerVisitor implements IRVisitor { // this function gives us access to the compiled operator later let callableRef: () => Maybe - if (lookupEntry === undefined || lookupEntry.kind !== 'param') { + if (lookupEntry.kind !== 'param') { // The common case: the operator has been defined elsewhere. // We simply look up for the operator and return it via callableRef. const callable = this.contextLookup(app.id, ['callable']) as Callable @@ -1720,8 +1722,13 @@ export class CompilerVisitor implements IRVisitor { .filter(r => r.registerValue.isJust()) .map(r => [r.name, r.registerValue.value as RuntimeValue]) - if (true) { - map.push(['action_taken', this.actionTaken.value!], ['nondet_picks', this.nondetPicks.value!]) + if (this.storeMetadata) { + if (this.actionTaken.isJust()) { + map.push(['action_taken', this.actionTaken.value!]) + } + if (this.nondetPicks.isJust()) { + map.push(['nondet_picks', this.nondetPicks.value!]) + } } return rv.mkRecord(map) @@ -1745,15 +1752,15 @@ export class CompilerVisitor implements IRVisitor { // load the values of the variables from an array private recoverVars(values: Maybe[]) { this.vars.forEach((r, i) => (r.registerValue = values[i])) - this.actionTaken = values[this.vars.length] - this.nondetPicks = values[this.vars.length + 1] + this.actionTaken = values[this.vars.length] ?? none() + this.nondetPicks = values[this.vars.length + 1] ?? none() } // load the values of the next variables from an array private recoverNextVars(values: Maybe[]) { this.nextVars.forEach((r, i) => (r.registerValue = values[i])) - this.actionTaken = values[this.vars.length] - this.nondetPicks = values[this.vars.length + 1] + this.actionTaken = values[this.vars.length] ?? none() + this.nondetPicks = values[this.vars.length + 1] ?? none() } private contextGet(name: string | bigint, kinds: ComputableKind[]) { diff --git a/quint/src/runtime/testing.ts b/quint/src/runtime/testing.ts index 291de5443..bf8c35157 100644 --- a/quint/src/runtime/testing.ts +++ b/quint/src/runtime/testing.ts @@ -90,7 +90,14 @@ export function compileAndTest( } const recorder = newTraceRecorder(options.verbosity, options.rng) - const ctx = compile(compilationState, newEvaluationState(recorder), lookupTable, options.rng.next, main.declarations) + const ctx = compile( + compilationState, + newEvaluationState(recorder), + lookupTable, + options.rng.next, + false, + main.declarations + ) const ctxErrors = ctx.syntaxErrors.concat(ctx.compileErrors, ctx.analysisErrors) if (ctxErrors.length > 0) { diff --git a/quint/src/simulation.ts b/quint/src/simulation.ts index 49ab3374e..63f207107 100644 --- a/quint/src/simulation.ts +++ b/quint/src/simulation.ts @@ -33,6 +33,7 @@ export interface SimulatorOptions { maxSteps: number rng: Rng verbosity: number + storeMetadata: boolean } /** The outcome of a simulation @@ -107,7 +108,15 @@ export function compileAndRun( const codeWithExtraDefs = code.slice(0, mainStart) + newMainModuleCode + code.slice(mainEnd) const recorder = newTraceRecorder(options.verbosity, options.rng) - const ctx = compileFromCode(idGen, codeWithExtraDefs, mainName, mainPath, recorder, options.rng.next) + const ctx = compileFromCode( + idGen, + codeWithExtraDefs, + mainName, + mainPath, + recorder, + options.rng.next, + options.storeMetadata + ) const compilationErrors = ctx.syntaxErrors.concat(ctx.analysisErrors).concat(ctx.compileErrors) if (compilationErrors.length > 0) { diff --git a/quint/test/runtime/compile.test.ts b/quint/test/runtime/compile.test.ts index 12deb53a5..5e5b2ddc3 100644 --- a/quint/test/runtime/compile.test.ts +++ b/quint/test/runtime/compile.test.ts @@ -36,7 +36,15 @@ const idGen = newIdGenerator() function assertResultAsString(input: string, expected: string | undefined, evalContext: string = '') { const moduleText = `module contextM { ${evalContext} } module __runtime { import contextM.*\n val ${inputDefName} = ${input} }` const mockLookupPath = stringSourceResolver(new Map()).lookupPath('/', './mock') - const context = compileFromCode(idGen, moduleText, '__runtime', mockLookupPath, noExecutionListener, newRng().next) + const context = compileFromCode( + idGen, + moduleText, + '__runtime', + mockLookupPath, + noExecutionListener, + newRng().next, + false + ) assert.isEmpty(context.syntaxErrors, `Syntax errors: ${context.syntaxErrors.map(quintErrorToString).join(', ')}`) assert.isEmpty(context.compileErrors, `Compile errors: ${context.compileErrors.map(quintErrorToString).join(', ')}`) @@ -65,7 +73,15 @@ function assertComputableAsString(computable: Computable, expected: string | und function evalInContext(input: string, callable: (ctx: CompilationContext) => Either) { const moduleText = `module __runtime { ${input} }` const mockLookupPath = stringSourceResolver(new Map()).lookupPath('/', './mock') - const context = compileFromCode(idGen, moduleText, '__runtime', mockLookupPath, noExecutionListener, newRng().next) + const context = compileFromCode( + idGen, + moduleText, + '__runtime', + mockLookupPath, + noExecutionListener, + newRng().next, + false + ) return callable(context) } @@ -1157,6 +1173,7 @@ describe('incremental compilation', () => { newEvaluationState(noExecutionListener), flattenedTable, dummyRng.next, + false, moduleToCompile.declarations ) } @@ -1172,7 +1189,7 @@ describe('incremental compilation', () => { compilationState.sourceMap ) const expr = parsed.kind === 'expr' ? parsed.expr : undefined - const context = compileExpr(compilationState, evaluationState, dummyRng, expr!) + const context = compileExpr(compilationState, evaluationState, dummyRng, false, expr!) assert.deepEqual(context.compilationState.analysisOutput.types.get(expr!.id)?.type, { kind: 'int', id: 3n }) @@ -1191,7 +1208,7 @@ describe('incremental compilation', () => { compilationState.sourceMap ) const defs = parsed.kind === 'declaration' ? parsed.decls : undefined - const context = compileDecls(compilationState, evaluationState, dummyRng, defs!) + const context = compileDecls(compilationState, evaluationState, dummyRng, false, defs!) assert.deepEqual(context.compilationState.analysisOutput.types.get(defs![0].id)?.type, { kind: 'int', id: 3n }) @@ -1212,7 +1229,7 @@ describe('incremental compilation', () => { compilationState.sourceMap ) const decls = parsed.kind === 'declaration' ? parsed.decls : [] - const context = compileDecls(compilationState, evaluationState, dummyRng, decls) + const context = compileDecls(compilationState, evaluationState, dummyRng, false, decls) assert.sameDeepMembers(context.syntaxErrors, [ { @@ -1233,7 +1250,7 @@ describe('incremental compilation', () => { compilationState.sourceMap ) const decls = parsed.kind === 'declaration' ? parsed.decls : [] - const context = compileDecls(compilationState, evaluationState, dummyRng, decls) + const context = compileDecls(compilationState, evaluationState, dummyRng, false, decls) const typeDecl = decls[0] assert(typeDecl.kind === 'typedef') @@ -1252,7 +1269,7 @@ describe('incremental compilation', () => { compilationState.sourceMap ) const decls = parsed.kind === 'declaration' ? parsed.decls : [] - const context = compileDecls(compilationState, evaluationState, dummyRng, decls) + const context = compileDecls(compilationState, evaluationState, dummyRng, false, decls) assert(decls.find(t => t.kind === 'typedef' && t.name === 'T')) // Sum type declarations are expanded to add an From 85c02e303c301da7d9ac62d9d4490dad3d738369 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 16 Apr 2024 10:18:08 -0300 Subject: [PATCH 339/388] Fix a nondet scenario --- quint/src/runtime/impl/compilerImpl.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index ee8d2b1bc..c3ef1a656 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -361,9 +361,15 @@ export class CompilerVisitor implements IRVisitor { const result = undecoratedEval() if (result.isJust() && qualifier === 'nondet') { - this.nondetPicks = just( - rv.mkRecord(this.nondetPicks.value!.toOrderedMap().set(letDef.opdef.name, cachedValue.value as RuntimeValue)) - ) + if (this.nondetPicks.isJust()) { + this.nondetPicks = just( + rv.mkRecord( + this.nondetPicks.value!.toOrderedMap().set(letDef.opdef.name, cachedValue.value as RuntimeValue) + ) + ) + } else { + this.nondetPicks = just(rv.mkRecord([[letDef.opdef.name, cachedValue.value as RuntimeValue]])) + } } boundValue.eval = boundValueEval return result From 30ce0e5c974a0e31a450e26dd30fec503b32db94 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 16 Apr 2024 10:26:01 -0300 Subject: [PATCH 340/388] Remove unused import --- quint/src/runtime/impl/compilerImpl.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index c3ef1a656..b8429cb33 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -15,7 +15,6 @@ import { List, OrderedMap, Set } from 'immutable' import { LookupTable } from '../../names/base' import { IRVisitor } from '../../ir/IRVisitor' -import { TypeScheme } from '../../types/base' import { Callable, Computable, From 0a83e68dc44c6653edc8f59c3048e3d260011f00 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 16 Apr 2024 18:57:34 -0300 Subject: [PATCH 341/388] Keep traces in an object instead of a shadow var We were only using shadow variables for this purpose, and it was a lot of additional complexity. --- quint/src/names/base.ts | 1 + quint/src/repl.ts | 2 - quint/src/runtime/compile.ts | 8 +- quint/src/runtime/impl/compilerImpl.ts | 380 ++++++++++++------------- quint/src/runtime/impl/trace.ts | 18 ++ quint/src/runtime/runtime.ts | 2 +- quint/src/runtime/testing.ts | 15 +- quint/src/simulation.ts | 3 +- 8 files changed, 209 insertions(+), 220 deletions(-) create mode 100644 quint/src/runtime/impl/trace.ts diff --git a/quint/src/names/base.ts b/quint/src/names/base.ts index 3a4f63908..2451fbcc7 100644 --- a/quint/src/names/base.ts +++ b/quint/src/names/base.ts @@ -246,4 +246,5 @@ export const builtinNames = [ 'matchVariant', 'variant', 'q::debug', + 'q::lastTrace', ] diff --git a/quint/src/repl.ts b/quint/src/repl.ts index c2bc6c355..5c3dc8e13 100644 --- a/quint/src/repl.ts +++ b/quint/src/repl.ts @@ -25,7 +25,6 @@ import { compileFromCode, contextNameLookup, inputDefName, - lastTraceName, newCompilationState, } from './runtime/compile' import { createFinders, formatError } from './errorReporter' @@ -482,7 +481,6 @@ function saveVars(vars: Register[], nextvars: Register[]): Maybe { // In the future, we will declare them in a separate module. function simulatorBuiltins(st: CompilationState): QuintDef[] { return [ - parseDefOrThrow(`val ${lastTraceName} = []`, st.idGen, st.sourceMap), parseDefOrThrow(`def q::test = (q::nruns, q::nsteps, q::init, q::next, q::inv) => false`, st.idGen, st.sourceMap), parseDefOrThrow(`def q::testOnce = (q::nsteps, q::init, q::next, q::inv) => false`, st.idGen, st.sourceMap), ] diff --git a/quint/src/runtime/compile.ts b/quint/src/runtime/compile.ts index fbec5aeca..0c4cd5a92 100644 --- a/quint/src/runtime/compile.ts +++ b/quint/src/runtime/compile.ts @@ -24,7 +24,7 @@ import { flattenModules } from '../flattening/fullFlattener' import { QuintError } from '../quintError' /** - * The name of the shadow variable that stores the last found trace. + * The name of the builtin name that returns the last found trace. */ export const lastTraceName = 'q::lastTrace' @@ -142,9 +142,7 @@ export function compile( rand: (bound: bigint) => bigint, defs: QuintDef[] ): CompilationContext { - const { analysisOutput } = compilationState - - const visitor = new CompilerVisitor(lookupTable, analysisOutput.types, rand, evaluationState) + const visitor = new CompilerVisitor(lookupTable, rand, evaluationState) defs.forEach(def => walkDefinition(visitor, def)) @@ -157,7 +155,7 @@ export function compile( return visitor.getRuntimeErrors().splice(0) }, compilationState, - evaluationState: visitor.getEvaluationState(), + evaluationState: visitor.evaluationState, } } diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 1e08509e2..c66b8d244 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -15,7 +15,6 @@ import { List, OrderedMap, Set } from 'immutable' import { LookupTable } from '../../names/base' import { IRVisitor } from '../../ir/IRVisitor' -import { TypeScheme } from '../../types/base' import { Callable, Computable, @@ -33,6 +32,7 @@ import { ExecutionListener } from '../trace' import * as ir from '../../ir/quintIr' import { RuntimeValue, RuntimeValueLambda, RuntimeValueVariant, rv } from './runtimeValue' +import { Trace } from './trace' import { ErrorCode, QuintError } from '../../quintError' import { inputDefName, lastTraceName } from '../compile' @@ -72,8 +72,8 @@ export interface EvaluationState { vars: Register[] // The list of variables in the next state. nextVars: Register[] - // The list of shadow variables. - shadowVars: Register[] + // The current trace of states + trace: Trace // The error tracker for the evaluation to store errors on callbacks. errorTracker: CompilerErrorTracker // The execution listener that the compiled code uses to report execution info. @@ -103,25 +103,18 @@ export class CompilerErrorTracker { /** * Creates a new EvaluationState object with the initial state of the evaluation. * - * @returns a new EvaluationState object with the lastTrace shadow variable register + * @returns a new EvaluationState object */ export function newEvaluationState(listener: ExecutionListener): EvaluationState { const state: EvaluationState = { context: builtinContext(), vars: [], nextVars: [], - shadowVars: [], + trace: new Trace(), errorTracker: new CompilerErrorTracker(), listener: listener, } - // Initialize compiler state - const lastTrace = mkRegister('shadow', lastTraceName, just(rv.mkList([])), () => - state.errorTracker.addRuntimeError(0n, 'QNT501', 'q::lastTrace is not set') - ) - state.shadowVars.push(lastTrace) - state.context.set(kindName(lastTrace.kind, lastTrace.name), lastTrace) - return state } @@ -141,98 +134,42 @@ export class CompilerVisitor implements IRVisitor { // the lookup table to use for the module private lookupTable: LookupTable // types assigned to expressions and definitions - private types: Map // the stack of computable values private compStack: Computable[] = [] - // The map of identifiers (and sometimes, names) to their compiled values: - // - wrappers around RuntimeValue - // - an instance of Register - // - an instance of Callable. - // The keys should be constructed via `kindName`. - private context: Map - - // all variables declared during compilation - private vars: Register[] - // the registers allocated for the next-state values of vars - private nextVars: Register[] - // shadow variables that are used by the simulator - private shadowVars: Register[] - // keeps errors in a state - private errorTracker: CompilerErrorTracker - // pre-initialized random number generator + private rand - // execution listener - private execListener: ExecutionListener // the current depth of operator definitions: top-level defs are depth 0 // FIXME(#1279): The walk* functions update this value, but they need to be // initialized to -1 here for that to work on all scenarios. definitionDepth: number = -1 + evaluationState: EvaluationState - constructor( - lookupTable: LookupTable, - types: Map, - rand: (bound: bigint) => bigint, - evaluationState: EvaluationState - ) { + constructor(lookupTable: LookupTable, rand: (bound: bigint) => bigint, evaluationState: EvaluationState) { this.lookupTable = lookupTable - this.types = types this.rand = rand - this.context = evaluationState.context - this.vars = evaluationState.vars - this.nextVars = evaluationState.nextVars - this.shadowVars = evaluationState.shadowVars - this.errorTracker = evaluationState.errorTracker - this.execListener = evaluationState.listener - } - - /** - * Get the compiler state. - */ - getEvaluationState(): EvaluationState { - return { - context: this.context, - vars: this.vars, - nextVars: this.nextVars, - shadowVars: this.shadowVars, - errorTracker: this.errorTracker, - listener: this.execListener, - } - } - - /** - * Get the compiled context. - */ - getContext(): Map { - return this.context + this.evaluationState = evaluationState } /** * Get the names of the compiled variables. */ getVars(): string[] { - return this.vars.map(r => r.name) - } - - /** - * Get the names of the shadow variables. - */ - getShadowVars(): string[] { - return this.shadowVars.map(r => r.name) + return this.evaluationState.vars.map(r => r.name) } /** * Get the array of compile errors, which changes as the code gets executed. */ getCompileErrors(): QuintError[] { - return this.errorTracker.compileErrors + return this.evaluationState.errorTracker.compileErrors } /** * Get the array of runtime errors, which changes as the code gets executed. */ getRuntimeErrors(): QuintError[] { - return this.errorTracker.runtimeErrors + return this.evaluationState.errorTracker.runtimeErrors } exitOpDef(opdef: ir.QuintOpDef) { @@ -240,7 +177,11 @@ export class CompilerVisitor implements IRVisitor { // All of them are compiled to callables, which may have zero parameters. let boundValue = this.compStack.pop() if (boundValue === undefined) { - this.errorTracker.addCompileError(opdef.id, 'QNT501', `No expression for ${opdef.name} on compStack`) + this.evaluationState.errorTracker.addCompileError( + opdef.id, + 'QNT501', + `No expression for ${opdef.name} on compStack` + ) return } @@ -260,13 +201,13 @@ export class CompilerVisitor implements IRVisitor { boundValue = { eval: () => { if (app.opcode === inputDefName) { - this.execListener.onUserOperatorCall(evalApp) + this.evaluationState.listener.onUserOperatorCall(evalApp) // do not call onUserOperatorReturn on '_' later, as it may span over multiple frames } else { - this.execListener.onUserOperatorCall(app) + this.evaluationState.listener.onUserOperatorCall(app) } const r: Maybe = unwrappedValue.eval() - this.execListener.onUserOperatorReturn(app, [], r) + this.evaluationState.listener.onUserOperatorReturn(app, [], r) return r }, } @@ -288,11 +229,11 @@ export class CompilerVisitor implements IRVisitor { const kname = kindName('callable', opdef.id) // bind the callable from the stack - this.context.set(kname, boundValue) + this.evaluationState.context.set(kname, boundValue) if (specialNames.includes(opdef.name)) { // bind the callable under its name as well - this.context.set(kindName('callable', opdef.name), boundValue) + this.evaluationState.context.set(kindName('callable', opdef.name), boundValue) } } @@ -311,7 +252,7 @@ export class CompilerVisitor implements IRVisitor { // get the expression that is evaluated in the context of let. const exprUnderLet = this.compStack.slice(-1).pop() if (exprUnderLet === undefined) { - this.errorTracker.addCompileError( + this.evaluationState.errorTracker.addCompileError( letDef.opdef.id, 'QNT501', `No expression for ${letDef.opdef.name} on compStack` @@ -320,7 +261,7 @@ export class CompilerVisitor implements IRVisitor { } const kname = kindName('callable', letDef.opdef.id) - const boundValue = this.context.get(kname) ?? fail + const boundValue = this.evaluationState.context.get(kname) ?? fail // Override the behavior of the expression under let: // It precomputes the bound value and uses it in the evaluation. // Once the evaluation is done, the value is reset, so that @@ -343,7 +284,7 @@ export class CompilerVisitor implements IRVisitor { // all constants should be instantiated before running the simulator const code: ErrorCode = 'QNT500' const msg = `Uninitialized const ${cdef.name}. Use: import (${cdef.name}=).*` - this.errorTracker.addCompileError(cdef.id, code, msg) + this.evaluationState.errorTracker.addCompileError(cdef.id, code, msg) } exitVar(vardef: ir.QuintVar) { @@ -353,13 +294,13 @@ export class CompilerVisitor implements IRVisitor { // definition. Don't overwrite the register if that happens. In some cases // (with instances), the variable can have a different ID, but the same // name. In that case, we assign the register with that name for the new ID. - if (this.context.has(kindName('var', varName))) { - const register = this.context.get(kindName('var', varName))! - this.context.set(kindName('var', vardef.id), register) + if (this.evaluationState.context.has(kindName('var', varName))) { + const register = this.evaluationState.context.get(kindName('var', varName))! + this.evaluationState.context.set(kindName('var', vardef.id), register) - if (this.context.has(kindName('nextvar', varName))) { - const register = this.context.get(kindName('nextvar', varName))! - this.context.set(kindName('nextvar', vardef.id), register) + if (this.evaluationState.context.has(kindName('nextvar', varName))) { + const register = this.evaluationState.context.get(kindName('nextvar', varName))! + this.evaluationState.context.set(kindName('nextvar', vardef.id), register) } return @@ -369,19 +310,19 @@ export class CompilerVisitor implements IRVisitor { // one for the variable, and // one for its next-state version const prevRegister = mkRegister('var', varName, none(), () => - this.errorTracker.addRuntimeError(vardef.id, 'QNT502', `Variable ${varName} is not set`) + this.evaluationState.errorTracker.addRuntimeError(vardef.id, 'QNT502', `Variable ${varName} is not set`) ) - this.vars.push(prevRegister) + this.evaluationState.vars.push(prevRegister) // at the moment, we have to refer to variables both via id and name - this.context.set(kindName('var', varName), prevRegister) - this.context.set(kindName('var', vardef.id), prevRegister) + this.evaluationState.context.set(kindName('var', varName), prevRegister) + this.evaluationState.context.set(kindName('var', vardef.id), prevRegister) const nextRegister = mkRegister('nextvar', varName, none(), () => - this.errorTracker.addRuntimeError(vardef.id, 'QNT502', `${varName}' is not set`) + this.evaluationState.errorTracker.addRuntimeError(vardef.id, 'QNT502', `${varName}' is not set`) ) - this.nextVars.push(nextRegister) + this.evaluationState.nextVars.push(nextRegister) // at the moment, we have to refer to variables both via id and name - this.context.set(kindName('nextvar', varName), nextRegister) - this.context.set(kindName('nextvar', vardef.id), nextRegister) + this.evaluationState.context.set(kindName('nextvar', varName), nextRegister) + this.evaluationState.context.set(kindName('nextvar', vardef.id), nextRegister) } enterLiteral(expr: ir.QuintBool | ir.QuintInt | ir.QuintStr) { @@ -404,11 +345,14 @@ export class CompilerVisitor implements IRVisitor { } enterName(name: ir.QuintName) { + if (name.name === lastTraceName) { + this.compStack.push(mkConstComputable(rv.mkList(this.evaluationState.trace.get()))) + return + } // The name belongs to one of the objects: // a shadow variable, a variable, an argument, a callable. // The order is important, as defines the name priority. const comp = - this.contextGet(name.name, ['shadow']) ?? this.contextLookup(name.id, ['arg', 'var', 'callable']) ?? // a backup case for Nat, Int, and Bool, and special names such as q::input this.contextGet(name.name, ['arg', 'callable']) @@ -417,7 +361,7 @@ export class CompilerVisitor implements IRVisitor { this.compStack.push(comp) } else { // this should not happen, due to the name resolver - this.errorTracker.addCompileError(name.id, 'QNT502', `Name ${name.name} not found`) + this.evaluationState.errorTracker.addCompileError(name.id, 'QNT502', `Name ${name.name} not found`) this.compStack.push(fail) } } @@ -435,7 +379,11 @@ export class CompilerVisitor implements IRVisitor { const nextvar = this.contextGet(name, ['nextvar']) this.compStack.push(nextvar ?? fail) } else { - this.errorTracker.addCompileError(app.id, 'QNT502', 'Operator next(...) needs one argument') + this.evaluationState.errorTracker.addCompileError( + app.id, + 'QNT502', + 'Operator next(...) needs one argument' + ) this.compStack.push(fail) } } @@ -512,7 +460,7 @@ export class CompilerVisitor implements IRVisitor { if (q.toInt() !== 0n) { return just(rv.mkInt(p.toInt() / q.toInt())) } else { - this.errorTracker.addRuntimeError(app.id, 'QNT503', 'Division by zero') + this.evaluationState.errorTracker.addRuntimeError(app.id, 'QNT503', 'Division by zero') return none() } }) @@ -525,9 +473,9 @@ export class CompilerVisitor implements IRVisitor { case 'ipow': this.applyFun(app.id, 2, (p, q) => { if (q.toInt() == 0n && p.toInt() == 0n) { - this.errorTracker.addRuntimeError(app.id, 'QNT503', '0^0 is undefined') + this.evaluationState.errorTracker.addRuntimeError(app.id, 'QNT503', '0^0 is undefined') } else if (q.toInt() < 0n) { - this.errorTracker.addRuntimeError(app.id, 'QNT503', 'i^j is undefined for j < 0') + this.evaluationState.errorTracker.addRuntimeError(app.id, 'QNT503', 'i^j is undefined for j < 0') } else { return just(rv.mkInt(p.toInt() ** q.toInt())) } @@ -581,7 +529,7 @@ export class CompilerVisitor implements IRVisitor { } return just(rv.mkList(arr)) } else { - this.errorTracker.addRuntimeError(app.id, 'QNT504', `range(${s}, ${e}) is out of bounds`) + this.evaluationState.errorTracker.addRuntimeError(app.id, 'QNT504', `range(${s}, ${e}) is out of bounds`) return none() } }) @@ -608,7 +556,7 @@ export class CompilerVisitor implements IRVisitor { if (l.size > 0) { return this.sliceList(app.id, l, 1, l.size) } else { - this.errorTracker.addRuntimeError(app.id, 'QNT505', 'Applied tail to an empty list') + this.evaluationState.errorTracker.addRuntimeError(app.id, 'QNT505', 'Applied tail to an empty list') return none() } }) @@ -620,7 +568,7 @@ export class CompilerVisitor implements IRVisitor { if (s >= 0 && s <= l.size && e <= l.size && e >= s) { return this.sliceList(app.id, l, s, e) } else { - this.errorTracker.addRuntimeError( + this.evaluationState.errorTracker.addRuntimeError( app.id, 'QNT506', `slice(..., ${s}, ${e}) applied to a list of size ${l.size}` @@ -666,7 +614,11 @@ export class CompilerVisitor implements IRVisitor { if (fieldValue) { return just(fieldValue) } else { - this.errorTracker.addRuntimeError(app.id, 'QNT501', `Accessing a missing record field ${name}`) + this.evaluationState.errorTracker.addRuntimeError( + app.id, + 'QNT501', + `Accessing a missing record field ${name}` + ) return none() } }) @@ -691,7 +643,11 @@ export class CompilerVisitor implements IRVisitor { const newMap = rec.toOrderedMap().set(key, fieldValue) return just(rv.mkRecord(newMap)) } else { - this.errorTracker.addRuntimeError(app.id, 'QNT501', `Called 'with' with a non-existent key ${key}`) + this.evaluationState.errorTracker.addRuntimeError( + app.id, + 'QNT501', + `Called 'with' with a non-existent key ${key}` + ) return none() } }) @@ -802,7 +758,11 @@ export class CompilerVisitor implements IRVisitor { return just(value) } else { // Should we print the key? It may be a complex expression. - this.errorTracker.addRuntimeError(app.id, 'QNT507', "Called 'get' with a non-existing key") + this.evaluationState.errorTracker.addRuntimeError( + app.id, + 'QNT507', + "Called 'get' with a non-existing key" + ) return none() } }) @@ -817,7 +777,11 @@ export class CompilerVisitor implements IRVisitor { const newMap = asMap.set(normalKey, newValue) return just(rv.fromMap(newMap)) } else { - this.errorTracker.addRuntimeError(app.id, 'QNT507', "Called 'set' with a non-existing key") + this.evaluationState.errorTracker.addRuntimeError( + app.id, + 'QNT507', + "Called 'set' with a non-existing key" + ) return none() } }) @@ -845,7 +809,11 @@ export class CompilerVisitor implements IRVisitor { return rv.fromMap(newMap) }) } else { - this.errorTracker.addRuntimeError(app.id, 'QNT507', "Called 'setBy' with a non-existing key") + this.evaluationState.errorTracker.addRuntimeError( + app.id, + 'QNT507', + "Called 'setBy' with a non-existing key" + ) return none() } }) @@ -927,7 +895,7 @@ export class CompilerVisitor implements IRVisitor { case 'assert': this.applyFun(app.id, 1, cond => { if (!cond.toBool()) { - this.errorTracker.addRuntimeError(app.id, 'QNT508', 'Assertion failed') + this.evaluationState.errorTracker.addRuntimeError(app.id, 'QNT508', 'Assertion failed') return none() } return just(cond) @@ -964,7 +932,7 @@ export class CompilerVisitor implements IRVisitor { case 'eventually': case 'enabled': this.applyFun(app.id, 1, _ => { - this.errorTracker.addRuntimeError( + this.evaluationState.errorTracker.addRuntimeError( app.id, 'QNT501', `Runtime does not support the built-in operator '${app.opcode}'` @@ -979,7 +947,7 @@ export class CompilerVisitor implements IRVisitor { case 'weakFair': case 'strongFair': this.applyFun(app.id, 2, _ => { - this.errorTracker.addRuntimeError( + this.evaluationState.errorTracker.addRuntimeError( app.id, 'QNT501', `Runtime does not support the built-in operator '${app.opcode}'` @@ -996,7 +964,7 @@ export class CompilerVisitor implements IRVisitor { private applyUserDefined(app: ir.QuintApp) { const onError = (sourceId: bigint, msg: string): void => { - this.errorTracker.addCompileError(sourceId, 'QNT501', msg) + this.evaluationState.errorTracker.addCompileError(sourceId, 'QNT501', msg) this.compStack.push(fail) } @@ -1041,18 +1009,18 @@ export class CompilerVisitor implements IRVisitor { // This code is similar to applyFun, but it calls the listener before const comp = { eval: (): Maybe => { - this.execListener.onUserOperatorCall(app) + this.evaluationState.listener.onUserOperatorCall(app) // compute the values of the arguments at this point const merged = merge(args.map(a => a.eval())) const callable = callableRef() if (merged.isNone() || callable.isNone()) { - this.execListener.onUserOperatorReturn(app, [], none()) + this.evaluationState.listener.onUserOperatorReturn(app, [], none()) return none() } return merged .map(values => { const result = callable.value.eval(values.map(just)) as Maybe - this.execListener.onUserOperatorReturn(app, values, result) + this.evaluationState.listener.onUserOperatorReturn(app, values, result) return result }) .join() @@ -1066,10 +1034,10 @@ export class CompilerVisitor implements IRVisitor { // introduce a register for every parameter lam.params.forEach(p => { const register = mkRegister('arg', p.name, none(), () => `Parameter ${p} is not set`) - this.context.set(kindName('arg', p.id), register) + this.evaluationState.context.set(kindName('arg', p.id), register) if (specialNames.includes(p.name)) { - this.context.set(kindName('arg', p.name), register) + this.evaluationState.context.set(kindName('arg', p.name), register) } }) // After this point, the body of the lambda gets compiled. @@ -1088,10 +1056,10 @@ export class CompilerVisitor implements IRVisitor { const register = this.contextGet(id, ['arg']) as Register if (register && register.registerValue) { - this.context.delete(key) + this.evaluationState.context.delete(key) registers.push(register) } else { - this.errorTracker.addCompileError(p.id, 'QNT501', `Parameter ${p.name} not found`) + this.evaluationState.errorTracker.addCompileError(p.id, 'QNT501', `Parameter ${p.name} not found`) } }) @@ -1099,19 +1067,19 @@ export class CompilerVisitor implements IRVisitor { if (lambdaBody) { this.compStack.push(mkCallable(registers, lambdaBody)) } else { - this.errorTracker.addCompileError(lam.id, 'QNT501', 'Compilation of lambda failed') + this.evaluationState.errorTracker.addCompileError(lam.id, 'QNT501', 'Compilation of lambda failed') } } private translateAssign(sourceId: bigint): void { if (this.compStack.length < 2) { - this.errorTracker.addCompileError(sourceId, 'QNT501', `Assignment '=' needs two arguments`) + this.evaluationState.errorTracker.addCompileError(sourceId, 'QNT501', `Assignment '=' needs two arguments`) return } const [register, rhs] = this.compStack.splice(-2) const name = (register as Register).name if (name === undefined) { - this.errorTracker.addCompileError(sourceId, 'QNT501', `Assignment '=' applied to a non-variable`) + this.evaluationState.errorTracker.addCompileError(sourceId, 'QNT501', `Assignment '=' applied to a non-variable`) this.compStack.push(fail) return } @@ -1124,7 +1092,7 @@ export class CompilerVisitor implements IRVisitor { return just(rv.mkBool(true)) }) } else { - this.errorTracker.addCompileError(sourceId, 'QNT502', `Undefined next variable in ${name} = ...`) + this.evaluationState.errorTracker.addCompileError(sourceId, 'QNT502', `Undefined next variable in ${name} = ...`) this.compStack.push(fail) } } @@ -1150,7 +1118,7 @@ export class CompilerVisitor implements IRVisitor { mapResultAndElems: (_array: Array<[RuntimeValue, RuntimeValue]>) => RuntimeValue ): void { if (this.compStack.length < 2) { - this.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments') + this.evaluationState.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments') return } // lambda translated to Callable @@ -1171,7 +1139,7 @@ export class CompilerVisitor implements IRVisitor { */ private applyFold(sourceId: bigint, order: 'fwd' | 'rev'): void { if (this.compStack.length < 3) { - this.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments for fold') + this.evaluationState.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments for fold') return } // extract two arguments from the call stack and keep the set @@ -1212,7 +1180,7 @@ export class CompilerVisitor implements IRVisitor { // push the combined computable value on the stack private applyFun(sourceId: bigint, nargs: number, fun: (..._args: RuntimeValue[]) => Maybe) { if (this.compStack.length < nargs) { - this.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments') + this.evaluationState.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments') } else { // pop nargs elements of the compStack const args = this.compStack.splice(-nargs, nargs) @@ -1228,7 +1196,7 @@ export class CompilerVisitor implements IRVisitor { .join() } catch (error) { const msg = error instanceof Error ? error.message : 'unknown error' - this.errorTracker.addRuntimeError(sourceId, 'QNT501', msg) + this.evaluationState.errorTracker.addRuntimeError(sourceId, 'QNT501', msg) return none() } }, @@ -1241,7 +1209,7 @@ export class CompilerVisitor implements IRVisitor { // as it should not evaluate both arms private translateIfThenElse(sourceId: bigint) { if (this.compStack.length < 3) { - this.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments') + this.evaluationState.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments') } else { // pop 3 elements of the compStack const [cond, thenArm, elseArm] = this.compStack.splice(-3, 3) @@ -1271,7 +1239,8 @@ export class CompilerVisitor implements IRVisitor { ): Maybe { // save the values of the next variables, as actions may update them const savedValues = this.snapshotNextVars() - const savedTrace = this.trace() + const savedTrace = this.evaluationState.trace.get() + let result: Maybe = just(rv.mkBool(true)) // Evaluate arguments iteratively. // Stop as soon as one of the arguments returns false. @@ -1287,12 +1256,12 @@ export class CompilerVisitor implements IRVisitor { // Restore the values of the next variables, // as evaluation was not successful. this.recoverNextVars(savedValues) - this.resetTrace(just(rv.mkList(savedTrace))) + this.evaluationState.trace.reset(savedTrace) if (kind === 'then' && nactionsLeft > 0 && isFalse) { // Cannot extend a run. Emit an error message. const actionNo = actions.length - (nactionsLeft + 1) - this.errorTracker.addRuntimeError( + this.evaluationState.errorTracker.addRuntimeError( actionId(actionNo), 'QNT513', `Cannot continue in A.then(B), A evaluates to 'false'` @@ -1307,9 +1276,9 @@ export class CompilerVisitor implements IRVisitor { if (kind === 'then' && nactionsLeft > 0) { const oldState: RuntimeValue = this.varsToRecord() this.shiftVars() - this.extendTrace() const newState: RuntimeValue = this.varsToRecord() - this.execListener.onNextState(oldState, newState) + this.evaluationState.trace.extend(newState) + this.evaluationState.listener.onNextState(oldState, newState) } } @@ -1319,7 +1288,11 @@ export class CompilerVisitor implements IRVisitor { // translate all { A, ..., C } or A.then(B) private translateAllOrThen(app: ir.QuintApp): void { if (this.compStack.length < app.args.length) { - this.errorTracker.addCompileError(app.id, 'QNT501', `Not enough arguments on stack for "${app.opcode}"`) + this.evaluationState.errorTracker.addCompileError( + app.id, + 'QNT501', + `Not enough arguments on stack for "${app.opcode}"` + ) return } const args = this.compStack.splice(-app.args.length) @@ -1342,26 +1315,30 @@ export class CompilerVisitor implements IRVisitor { // The code below is an adaption of chainAllOrThen. // If someone finds how to nicely combine both, please refactor. if (this.compStack.length !== 2) { - this.errorTracker.addCompileError(app.id, 'QNT501', `Not enough arguments on stack for "${app.opcode}"`) + this.evaluationState.errorTracker.addCompileError( + app.id, + 'QNT501', + `Not enough arguments on stack for "${app.opcode}"` + ) return } const [action, pred] = this.compStack.splice(-2) const lazyCompute = (): Maybe => { const savedNextVars = this.snapshotNextVars() - const savedTrace = this.trace() + const savedTrace = this.evaluationState.trace.get() const actionResult = action.eval() if (actionResult.isNone() || !(actionResult.value as RuntimeValue).toBool()) { // 'A' evaluates to 'false', or produces an error. // Restore the values of the next variables. this.recoverNextVars(savedNextVars) - this.resetTrace(just(rv.mkList(savedTrace))) + this.evaluationState.trace.reset(savedTrace) // expect emits an error when the run could not finish - this.errorTracker.addRuntimeError(app.args[0].id, 'QNT508', 'Cannot continue to "expect"') + this.evaluationState.errorTracker.addRuntimeError(app.args[0].id, 'QNT508', 'Cannot continue to "expect"') return none() } else { const savedVarsAfterAction = this.snapshotVars() const savedNextVarsAfterAction = this.snapshotNextVars() - const savedTraceAfterAction = this.trace() + const savedTraceAfterAction = this.evaluationState.trace.get() // Temporarily, switch to the next frame, to make a look-ahead evaluation. // For example, if `x == 1` and `x' == 2`, we would have `x == 2` and `x'` would be undefined. this.shiftVars() @@ -1373,9 +1350,13 @@ export class CompilerVisitor implements IRVisitor { // For example: `A.expect(P).then(B)`. this.recoverVars(savedVarsAfterAction) this.recoverNextVars(savedNextVarsAfterAction) - this.resetTrace(just(rv.mkList(savedTraceAfterAction))) + this.evaluationState.trace.reset(savedTraceAfterAction) if (predResult.isNone() || !(predResult.value as RuntimeValue).toBool()) { - this.errorTracker.addRuntimeError(app.args[1].id, 'QNT508', 'Expect condition does not hold true') + this.evaluationState.errorTracker.addRuntimeError( + app.args[1].id, + 'QNT508', + 'Expect condition does not hold true' + ) return none() } return predResult @@ -1388,7 +1369,11 @@ export class CompilerVisitor implements IRVisitor { // translate n.reps(A) private translateReps(app: ir.QuintApp): void { if (this.compStack.length < 2) { - this.errorTracker.addCompileError(app.id, 'QNT501', `Not enough arguments on stack for "${app.opcode}"`) + this.evaluationState.errorTracker.addCompileError( + app.id, + 'QNT501', + `Not enough arguments on stack for "${app.opcode}"` + ) return } const [niterations, action] = this.compStack.splice(-2) @@ -1427,7 +1412,11 @@ export class CompilerVisitor implements IRVisitor { shortCircuit: (no: number, r: boolean) => Maybe ): void { if (this.compStack.length < app.args.length) { - this.errorTracker.addCompileError(app.id, 'QNT501', `Not enough arguments on stack for "${app.opcode}"`) + this.evaluationState.errorTracker.addCompileError( + app.id, + 'QNT501', + `Not enough arguments on stack for "${app.opcode}"` + ) return } const args = this.compStack.splice(-app.args.length) @@ -1461,7 +1450,7 @@ export class CompilerVisitor implements IRVisitor { // translate any { A, ..., C } private translateOrAction(app: ir.QuintApp): void { if (this.compStack.length < app.args.length) { - this.errorTracker.addCompileError(app.id, 'QNT501', 'Not enough arguments on stack for "any"') + this.evaluationState.errorTracker.addCompileError(app.id, 'QNT501', 'Not enough arguments on stack for "any"') return } const args = this.compStack.splice(-app.args.length) @@ -1480,10 +1469,10 @@ export class CompilerVisitor implements IRVisitor { args.forEach((arg, i) => { this.recoverNextVars(valuesBefore) // either the argument is evaluated to false, or fails - this.execListener.onAnyOptionCall(app, i) + this.evaluationState.listener.onAnyOptionCall(app, i) const result = arg.eval().or(just(rv.mkBool(false))) const boolResult = (result.unwrap() as RuntimeValue).toBool() - this.execListener.onAnyOptionReturn(app, i) + this.evaluationState.listener.onAnyOptionReturn(app, i) // if this arm evaluates to true, save it in the candidates if (boolResult === true) { successors.push(this.snapshotNextVars()) @@ -1496,7 +1485,7 @@ export class CompilerVisitor implements IRVisitor { if (ncandidates === 0) { // no successor: restore the state and return false this.recoverNextVars(valuesBefore) - this.execListener.onAnyReturn(args.length, -1) + this.evaluationState.listener.onAnyReturn(args.length, -1) return just(rv.mkBool(false)) } else if (ncandidates === 1) { // There is exactly one successor, the execution is deterministic. @@ -1508,7 +1497,7 @@ export class CompilerVisitor implements IRVisitor { } this.recoverNextVars(successors[choice]) - this.execListener.onAnyReturn(args.length, successorIndices[choice]) + this.evaluationState.listener.onAnyReturn(args.length, successorIndices[choice]) return just(rv.mkBool(true)) } @@ -1524,7 +1513,7 @@ export class CompilerVisitor implements IRVisitor { b .map(sz => { if (sz === 0n) { - this.errorTracker.addRuntimeError(sourceId, 'QNT509', `Applied oneOf to an empty set`) + this.evaluationState.errorTracker.addRuntimeError(sourceId, 'QNT509', `Applied oneOf to an empty set`) } return this.rand(sz) }) @@ -1543,7 +1532,11 @@ export class CompilerVisitor implements IRVisitor { private test(sourceId: bigint) { if (this.compStack.length < 5) { - this.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments on stack for "q::test"') + this.evaluationState.errorTracker.addCompileError( + sourceId, + 'QNT501', + 'Not enough arguments on stack for "q::test"' + ) return } @@ -1553,7 +1546,11 @@ export class CompilerVisitor implements IRVisitor { private testOnce(sourceId: bigint) { if (this.compStack.length < 4) { - this.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments on stack for "q::testOnce"') + this.evaluationState.errorTracker.addCompileError( + sourceId, + 'QNT501', + 'Not enough arguments on stack for "q::testOnce"' + ) return } @@ -1590,23 +1587,23 @@ export class CompilerVisitor implements IRVisitor { // do multiple runs, stop at the first failing run const nruns = (nrunsRes as RuntimeValue).toInt() for (let runNo = 0; !errorFound && !failure && runNo < nruns; runNo++) { - this.execListener.onRunCall() - this.resetTrace() + this.evaluationState.listener.onRunCall() + this.evaluationState.trace.reset() // check Init() const initApp: ir.QuintApp = { id: 0n, kind: 'app', opcode: 'q::initAndInvariant', args: [] } - this.execListener.onUserOperatorCall(initApp) + this.evaluationState.listener.onUserOperatorCall(initApp) const initResult = init.eval() failure = initResult.isNone() || failure if (!isTrue(initResult)) { - this.execListener.onUserOperatorReturn(initApp, [], initResult) + this.evaluationState.listener.onUserOperatorReturn(initApp, [], initResult) } else { // The initial action evaluates to true. // Our guess of values was good. this.shiftVars() - this.extendTrace() + this.evaluationState.trace.extend(this.varsToRecord()) // check the invariant Inv const invResult = inv.eval() - this.execListener.onUserOperatorReturn(initApp, [], initResult) + this.evaluationState.listener.onUserOperatorReturn(initApp, [], initResult) failure = invResult.isNone() || failure if (!isTrue(invResult)) { errorFound = true @@ -1620,14 +1617,15 @@ export class CompilerVisitor implements IRVisitor { opcode: 'q::stepAndInvariant', args: [], } - this.execListener.onUserOperatorCall(nextApp) + this.evaluationState.listener.onUserOperatorCall(nextApp) + // next line is messing up the trace const nextResult = next.eval() failure = nextResult.isNone() || failure if (isTrue(nextResult)) { this.shiftVars() - this.extendTrace() + this.evaluationState.trace.extend(this.varsToRecord()) errorFound = !isTrue(inv.eval()) - this.execListener.onUserOperatorReturn(nextApp, [], nextResult) + this.evaluationState.listener.onUserOperatorReturn(nextApp, [], nextResult) } else { // Otherwise, the run cannot be extended. // In some cases, this may indicate a deadlock. @@ -1636,15 +1634,15 @@ export class CompilerVisitor implements IRVisitor { // the run. Hence, do not report an error here, but simply // drop the run. Otherwise, we would have a lot of false // positives, which look like deadlocks but they are not. - this.execListener.onUserOperatorReturn(nextApp, [], nextResult) - this.execListener.onRunReturn(just(rv.mkBool(true)), this.trace().toArray()) + this.evaluationState.listener.onUserOperatorReturn(nextApp, [], nextResult) + this.evaluationState.listener.onRunReturn(just(rv.mkBool(true)), this.evaluationState.trace.get()) break } } } } const outcome = !failure ? just(rv.mkBool(!errorFound)) : none() - this.execListener.onRunReturn(outcome, this.trace().toArray()) + this.evaluationState.listener.onRunReturn(outcome, this.evaluationState.trace.get()) // recover the state variables this.recoverVars(vars) this.recoverNextVars(nextVars) @@ -1658,33 +1656,9 @@ export class CompilerVisitor implements IRVisitor { this.compStack.push(mkFunComputable(doRun)) } - private trace(): List { - let trace = this.shadowVars.find(r => r.name === lastTraceName) - if (trace && trace.registerValue.isJust()) { - return trace.registerValue.value.toList() - } else { - return List() - } - } - - private resetTrace(value: Maybe = just(rv.mkList([]))) { - let trace = this.shadowVars.find(r => r.name === lastTraceName) - if (trace) { - trace.registerValue = value - } - } - - private extendTrace() { - let trace = this.shadowVars.find(r => r.name === lastTraceName) - if (trace) { - const extended = this.trace().push(this.varsToRecord()) - trace.registerValue = just(rv.mkList(extended)) - } - } - // convert the current variable values to a record private varsToRecord(): RuntimeValue { - const map: [string, RuntimeValue][] = this.vars + const map: [string, RuntimeValue][] = this.evaluationState.vars .filter(r => r.registerValue.isJust()) .map(r => [r.name, r.registerValue.value as RuntimeValue]) return rv.mkRecord(map) @@ -1692,32 +1666,32 @@ export class CompilerVisitor implements IRVisitor { private shiftVars() { this.recoverVars(this.snapshotNextVars()) - this.nextVars.forEach(r => (r.registerValue = none())) + this.evaluationState.nextVars.forEach(r => (r.registerValue = none())) } // save the values of the vars into an array private snapshotVars(): Maybe[] { - return this.vars.map(r => r.registerValue) + return this.evaluationState.vars.map(r => r.registerValue) } // save the values of the next vars into an array private snapshotNextVars(): Maybe[] { - return this.nextVars.map(r => r.registerValue) + return this.evaluationState.nextVars.map(r => r.registerValue) } // load the values of the variables from an array private recoverVars(values: Maybe[]) { - this.vars.forEach((r, i) => (r.registerValue = values[i])) + this.evaluationState.vars.forEach((r, i) => (r.registerValue = values[i])) } // load the values of the next variables from an array private recoverNextVars(values: Maybe[]) { - this.nextVars.forEach((r, i) => (r.registerValue = values[i])) + this.evaluationState.nextVars.forEach((r, i) => (r.registerValue = values[i])) } private contextGet(name: string | bigint, kinds: ComputableKind[]) { for (const k of kinds) { - const value = this.context.get(kindName(k, name)) + const value = this.evaluationState.context.get(kindName(k, name)) if (value) { return value } @@ -1731,7 +1705,7 @@ export class CompilerVisitor implements IRVisitor { if (vdef) { const refId = vdef.id! for (const k of kinds) { - const value = this.context.get(kindName(k, refId)) + const value = this.evaluationState.context.get(kindName(k, refId)) if (value) { return value } @@ -1747,7 +1721,7 @@ export class CompilerVisitor implements IRVisitor { const elem = list.get(Number(idx)) return elem ? just(elem) : none() } else { - this.errorTracker.addRuntimeError(sourceId, 'QNT510', `Out of bounds, nth(${idx})`) + this.evaluationState.errorTracker.addRuntimeError(sourceId, 'QNT510', `Out of bounds, nth(${idx})`) return none() } } @@ -1757,7 +1731,11 @@ export class CompilerVisitor implements IRVisitor { if (idx >= 0n && idx < list.size) { return just(rv.mkList(list.set(Number(idx), value))) } else { - this.errorTracker.addRuntimeError(sourceId, 'QNT510', `Out of bounds, replaceAt(..., ${idx}, ...)`) + this.evaluationState.errorTracker.addRuntimeError( + sourceId, + 'QNT510', + `Out of bounds, replaceAt(..., ${idx}, ...)` + ) return none() } } diff --git a/quint/src/runtime/impl/trace.ts b/quint/src/runtime/impl/trace.ts new file mode 100644 index 000000000..e957ac3ab --- /dev/null +++ b/quint/src/runtime/impl/trace.ts @@ -0,0 +1,18 @@ +import { List } from 'immutable' +import { RuntimeValue } from './runtimeValue' + +export class Trace { + private states: List = List() + + get(): RuntimeValue[] { + return [...this.states.toArray()] + } + + reset(values: RuntimeValue[] = []) { + this.states = List(values) + } + + extend(state: RuntimeValue) { + this.states = this.states.push(state) + } +} diff --git a/quint/src/runtime/runtime.ts b/quint/src/runtime/runtime.ts index 4bda5b356..0b4a51dbf 100644 --- a/quint/src/runtime/runtime.ts +++ b/quint/src/runtime/runtime.ts @@ -59,7 +59,7 @@ export interface Computable { /** * The kind of a computable. */ -export type ComputableKind = 'var' | 'nextvar' | 'arg' | 'callable' | 'shadow' +export type ComputableKind = 'var' | 'nextvar' | 'arg' | 'callable' /** * Create a key that encodes its name and kind. This is only useful for diff --git a/quint/src/runtime/testing.ts b/quint/src/runtime/testing.ts index 291de5443..6401678f2 100644 --- a/quint/src/runtime/testing.ts +++ b/quint/src/runtime/testing.ts @@ -9,17 +9,15 @@ */ import { Either, left, mergeInMany, right } from '@sweet-monads/either' -import { just } from '@sweet-monads/maybe' import { QuintEx, QuintOpDef } from '../ir/quintIr' -import { CompilationContext, CompilationState, compile, lastTraceName } from './compile' +import { CompilationContext, CompilationState, compile } from './compile' import { zerog } from './../idGenerator' import { LookupTable } from '../names/base' -import { Computable, Register, kindName } from './runtime' +import { Computable, kindName } from './runtime' import { ExecutionFrame, newTraceRecorder } from './trace' import { Rng } from '../rng' -import { RuntimeValue, rv } from './impl/runtimeValue' import { newEvaluationState } from './impl/compilerImpl' import { QuintError } from '../quintError' @@ -130,15 +128,14 @@ export function compileAndTest( seed = options.rng.getState() recorder.onRunCall() // reset the trace - const traceReg = ctx.evaluationState.context.get(kindName('shadow', lastTraceName)) as Register - traceReg.registerValue = just(rv.mkList([])) + ctx.evaluationState.trace.reset() // run the test const result = comp.eval() // extract the trace - const trace = traceReg.eval() + const trace = ctx.evaluationState.trace.get() - if (trace.isJust()) { - recorder.onRunReturn(result, [...(trace.value as RuntimeValue).toList()]) + if (trace.length > 0) { + recorder.onRunReturn(result, trace) } else { // Report a non-critical error console.error('Missing a trace') diff --git a/quint/src/simulation.ts b/quint/src/simulation.ts index 49ab3374e..bcb131b59 100644 --- a/quint/src/simulation.ts +++ b/quint/src/simulation.ts @@ -10,7 +10,7 @@ import { Either } from '@sweet-monads/either' -import { compileFromCode, contextNameLookup, lastTraceName } from './runtime/compile' +import { compileFromCode, contextNameLookup } from './runtime/compile' import { QuintEx } from './ir/quintIr' import { Computable } from './runtime/runtime' import { ExecutionFrame, newTraceRecorder } from './runtime/trace' @@ -94,7 +94,6 @@ export function compileAndRun( const o = options // Defs required by the simulator, to be added to the main module before compilation const extraDefs = [ - `val ${lastTraceName} = [];`, `def q::test(q::nrunsArg, q::nstepsArg, q::initArg, q::nextArg, q::invArg) = false`, `action q::init = { ${o.init} }`, `action q::step = { ${o.step} }`, From 453fa18cdeeaabcf78cf5781a2cd84d9b37eaa56 Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 24 Apr 2024 08:58:57 -0300 Subject: [PATCH 342/388] Go back to "delegated" attributes from evaluation state --- quint/src/runtime/compile.ts | 2 +- quint/src/runtime/impl/compilerImpl.ts | 311 ++++++++++++------------- 2 files changed, 144 insertions(+), 169 deletions(-) diff --git a/quint/src/runtime/compile.ts b/quint/src/runtime/compile.ts index 0c4cd5a92..7bc2d665b 100644 --- a/quint/src/runtime/compile.ts +++ b/quint/src/runtime/compile.ts @@ -155,7 +155,7 @@ export function compile( return visitor.getRuntimeErrors().splice(0) }, compilationState, - evaluationState: visitor.evaluationState, + evaluationState: visitor.getEvaluationState(), } } diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index c66b8d244..c01785c58 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -133,43 +133,78 @@ export function newEvaluationState(listener: ExecutionListener): EvaluationState export class CompilerVisitor implements IRVisitor { // the lookup table to use for the module private lookupTable: LookupTable - // types assigned to expressions and definitions // the stack of computable values private compStack: Computable[] = [] + // The map of identifiers (and sometimes, names) to their compiled values: + // - wrappers around RuntimeValue + // - an instance of Register + // - an instance of Callable. + // The keys should be constructed via `kindName`. + context: Map + // all variables declared during compilation + private vars: Register[] + // the registers allocated for the next-state values of vars + private nextVars: Register[] + // keeps errors in a state + private errorTracker: CompilerErrorTracker + // pre-initialized random number generator private rand + // execution listener + private execListener: ExecutionListener + // a tracker for the current execution trace + private trace: Trace + // the current depth of operator definitions: top-level defs are depth 0 // FIXME(#1279): The walk* functions update this value, but they need to be // initialized to -1 here for that to work on all scenarios. definitionDepth: number = -1 - evaluationState: EvaluationState constructor(lookupTable: LookupTable, rand: (bound: bigint) => bigint, evaluationState: EvaluationState) { this.lookupTable = lookupTable this.rand = rand - this.evaluationState = evaluationState + this.context = evaluationState.context + this.vars = evaluationState.vars + this.nextVars = evaluationState.nextVars + this.errorTracker = evaluationState.errorTracker + this.execListener = evaluationState.listener + this.trace = evaluationState.trace + } + + /** + * Get the compiler state. + */ + getEvaluationState(): EvaluationState { + return { + context: this.context, + vars: this.vars, + nextVars: this.nextVars, + errorTracker: this.errorTracker, + listener: this.execListener, + trace: this.trace, + } } /** * Get the names of the compiled variables. */ getVars(): string[] { - return this.evaluationState.vars.map(r => r.name) + return this.vars.map(r => r.name) } /** * Get the array of compile errors, which changes as the code gets executed. */ getCompileErrors(): QuintError[] { - return this.evaluationState.errorTracker.compileErrors + return this.errorTracker.compileErrors } /** * Get the array of runtime errors, which changes as the code gets executed. */ getRuntimeErrors(): QuintError[] { - return this.evaluationState.errorTracker.runtimeErrors + return this.errorTracker.runtimeErrors } exitOpDef(opdef: ir.QuintOpDef) { @@ -177,11 +212,7 @@ export class CompilerVisitor implements IRVisitor { // All of them are compiled to callables, which may have zero parameters. let boundValue = this.compStack.pop() if (boundValue === undefined) { - this.evaluationState.errorTracker.addCompileError( - opdef.id, - 'QNT501', - `No expression for ${opdef.name} on compStack` - ) + this.errorTracker.addCompileError(opdef.id, 'QNT501', `No expression for ${opdef.name} on compStack`) return } @@ -201,13 +232,13 @@ export class CompilerVisitor implements IRVisitor { boundValue = { eval: () => { if (app.opcode === inputDefName) { - this.evaluationState.listener.onUserOperatorCall(evalApp) + this.execListener.onUserOperatorCall(evalApp) // do not call onUserOperatorReturn on '_' later, as it may span over multiple frames } else { - this.evaluationState.listener.onUserOperatorCall(app) + this.execListener.onUserOperatorCall(app) } const r: Maybe = unwrappedValue.eval() - this.evaluationState.listener.onUserOperatorReturn(app, [], r) + this.execListener.onUserOperatorReturn(app, [], r) return r }, } @@ -229,11 +260,11 @@ export class CompilerVisitor implements IRVisitor { const kname = kindName('callable', opdef.id) // bind the callable from the stack - this.evaluationState.context.set(kname, boundValue) + this.context.set(kname, boundValue) if (specialNames.includes(opdef.name)) { // bind the callable under its name as well - this.evaluationState.context.set(kindName('callable', opdef.name), boundValue) + this.context.set(kindName('callable', opdef.name), boundValue) } } @@ -252,7 +283,7 @@ export class CompilerVisitor implements IRVisitor { // get the expression that is evaluated in the context of let. const exprUnderLet = this.compStack.slice(-1).pop() if (exprUnderLet === undefined) { - this.evaluationState.errorTracker.addCompileError( + this.errorTracker.addCompileError( letDef.opdef.id, 'QNT501', `No expression for ${letDef.opdef.name} on compStack` @@ -261,7 +292,7 @@ export class CompilerVisitor implements IRVisitor { } const kname = kindName('callable', letDef.opdef.id) - const boundValue = this.evaluationState.context.get(kname) ?? fail + const boundValue = this.context.get(kname) ?? fail // Override the behavior of the expression under let: // It precomputes the bound value and uses it in the evaluation. // Once the evaluation is done, the value is reset, so that @@ -284,7 +315,7 @@ export class CompilerVisitor implements IRVisitor { // all constants should be instantiated before running the simulator const code: ErrorCode = 'QNT500' const msg = `Uninitialized const ${cdef.name}. Use: import (${cdef.name}=).*` - this.evaluationState.errorTracker.addCompileError(cdef.id, code, msg) + this.errorTracker.addCompileError(cdef.id, code, msg) } exitVar(vardef: ir.QuintVar) { @@ -294,13 +325,13 @@ export class CompilerVisitor implements IRVisitor { // definition. Don't overwrite the register if that happens. In some cases // (with instances), the variable can have a different ID, but the same // name. In that case, we assign the register with that name for the new ID. - if (this.evaluationState.context.has(kindName('var', varName))) { - const register = this.evaluationState.context.get(kindName('var', varName))! - this.evaluationState.context.set(kindName('var', vardef.id), register) + if (this.context.has(kindName('var', varName))) { + const register = this.context.get(kindName('var', varName))! + this.context.set(kindName('var', vardef.id), register) - if (this.evaluationState.context.has(kindName('nextvar', varName))) { - const register = this.evaluationState.context.get(kindName('nextvar', varName))! - this.evaluationState.context.set(kindName('nextvar', vardef.id), register) + if (this.context.has(kindName('nextvar', varName))) { + const register = this.context.get(kindName('nextvar', varName))! + this.context.set(kindName('nextvar', vardef.id), register) } return @@ -310,19 +341,19 @@ export class CompilerVisitor implements IRVisitor { // one for the variable, and // one for its next-state version const prevRegister = mkRegister('var', varName, none(), () => - this.evaluationState.errorTracker.addRuntimeError(vardef.id, 'QNT502', `Variable ${varName} is not set`) + this.errorTracker.addRuntimeError(vardef.id, 'QNT502', `Variable ${varName} is not set`) ) - this.evaluationState.vars.push(prevRegister) + this.vars.push(prevRegister) // at the moment, we have to refer to variables both via id and name - this.evaluationState.context.set(kindName('var', varName), prevRegister) - this.evaluationState.context.set(kindName('var', vardef.id), prevRegister) + this.context.set(kindName('var', varName), prevRegister) + this.context.set(kindName('var', vardef.id), prevRegister) const nextRegister = mkRegister('nextvar', varName, none(), () => - this.evaluationState.errorTracker.addRuntimeError(vardef.id, 'QNT502', `${varName}' is not set`) + this.errorTracker.addRuntimeError(vardef.id, 'QNT502', `${varName}' is not set`) ) - this.evaluationState.nextVars.push(nextRegister) + this.nextVars.push(nextRegister) // at the moment, we have to refer to variables both via id and name - this.evaluationState.context.set(kindName('nextvar', varName), nextRegister) - this.evaluationState.context.set(kindName('nextvar', vardef.id), nextRegister) + this.context.set(kindName('nextvar', varName), nextRegister) + this.context.set(kindName('nextvar', vardef.id), nextRegister) } enterLiteral(expr: ir.QuintBool | ir.QuintInt | ir.QuintStr) { @@ -346,7 +377,7 @@ export class CompilerVisitor implements IRVisitor { enterName(name: ir.QuintName) { if (name.name === lastTraceName) { - this.compStack.push(mkConstComputable(rv.mkList(this.evaluationState.trace.get()))) + this.compStack.push(mkConstComputable(rv.mkList(this.trace.get()))) return } // The name belongs to one of the objects: @@ -361,7 +392,7 @@ export class CompilerVisitor implements IRVisitor { this.compStack.push(comp) } else { // this should not happen, due to the name resolver - this.evaluationState.errorTracker.addCompileError(name.id, 'QNT502', `Name ${name.name} not found`) + this.errorTracker.addCompileError(name.id, 'QNT502', `Name ${name.name} not found`) this.compStack.push(fail) } } @@ -379,11 +410,7 @@ export class CompilerVisitor implements IRVisitor { const nextvar = this.contextGet(name, ['nextvar']) this.compStack.push(nextvar ?? fail) } else { - this.evaluationState.errorTracker.addCompileError( - app.id, - 'QNT502', - 'Operator next(...) needs one argument' - ) + this.errorTracker.addCompileError(app.id, 'QNT502', 'Operator next(...) needs one argument') this.compStack.push(fail) } } @@ -460,7 +487,7 @@ export class CompilerVisitor implements IRVisitor { if (q.toInt() !== 0n) { return just(rv.mkInt(p.toInt() / q.toInt())) } else { - this.evaluationState.errorTracker.addRuntimeError(app.id, 'QNT503', 'Division by zero') + this.errorTracker.addRuntimeError(app.id, 'QNT503', 'Division by zero') return none() } }) @@ -473,9 +500,9 @@ export class CompilerVisitor implements IRVisitor { case 'ipow': this.applyFun(app.id, 2, (p, q) => { if (q.toInt() == 0n && p.toInt() == 0n) { - this.evaluationState.errorTracker.addRuntimeError(app.id, 'QNT503', '0^0 is undefined') + this.errorTracker.addRuntimeError(app.id, 'QNT503', '0^0 is undefined') } else if (q.toInt() < 0n) { - this.evaluationState.errorTracker.addRuntimeError(app.id, 'QNT503', 'i^j is undefined for j < 0') + this.errorTracker.addRuntimeError(app.id, 'QNT503', 'i^j is undefined for j < 0') } else { return just(rv.mkInt(p.toInt() ** q.toInt())) } @@ -529,7 +556,7 @@ export class CompilerVisitor implements IRVisitor { } return just(rv.mkList(arr)) } else { - this.evaluationState.errorTracker.addRuntimeError(app.id, 'QNT504', `range(${s}, ${e}) is out of bounds`) + this.errorTracker.addRuntimeError(app.id, 'QNT504', `range(${s}, ${e}) is out of bounds`) return none() } }) @@ -556,7 +583,7 @@ export class CompilerVisitor implements IRVisitor { if (l.size > 0) { return this.sliceList(app.id, l, 1, l.size) } else { - this.evaluationState.errorTracker.addRuntimeError(app.id, 'QNT505', 'Applied tail to an empty list') + this.errorTracker.addRuntimeError(app.id, 'QNT505', 'Applied tail to an empty list') return none() } }) @@ -568,7 +595,7 @@ export class CompilerVisitor implements IRVisitor { if (s >= 0 && s <= l.size && e <= l.size && e >= s) { return this.sliceList(app.id, l, s, e) } else { - this.evaluationState.errorTracker.addRuntimeError( + this.errorTracker.addRuntimeError( app.id, 'QNT506', `slice(..., ${s}, ${e}) applied to a list of size ${l.size}` @@ -614,11 +641,7 @@ export class CompilerVisitor implements IRVisitor { if (fieldValue) { return just(fieldValue) } else { - this.evaluationState.errorTracker.addRuntimeError( - app.id, - 'QNT501', - `Accessing a missing record field ${name}` - ) + this.errorTracker.addRuntimeError(app.id, 'QNT501', `Accessing a missing record field ${name}`) return none() } }) @@ -643,11 +666,7 @@ export class CompilerVisitor implements IRVisitor { const newMap = rec.toOrderedMap().set(key, fieldValue) return just(rv.mkRecord(newMap)) } else { - this.evaluationState.errorTracker.addRuntimeError( - app.id, - 'QNT501', - `Called 'with' with a non-existent key ${key}` - ) + this.errorTracker.addRuntimeError(app.id, 'QNT501', `Called 'with' with a non-existent key ${key}`) return none() } }) @@ -758,11 +777,7 @@ export class CompilerVisitor implements IRVisitor { return just(value) } else { // Should we print the key? It may be a complex expression. - this.evaluationState.errorTracker.addRuntimeError( - app.id, - 'QNT507', - "Called 'get' with a non-existing key" - ) + this.errorTracker.addRuntimeError(app.id, 'QNT507', "Called 'get' with a non-existing key") return none() } }) @@ -777,11 +792,7 @@ export class CompilerVisitor implements IRVisitor { const newMap = asMap.set(normalKey, newValue) return just(rv.fromMap(newMap)) } else { - this.evaluationState.errorTracker.addRuntimeError( - app.id, - 'QNT507', - "Called 'set' with a non-existing key" - ) + this.errorTracker.addRuntimeError(app.id, 'QNT507', "Called 'set' with a non-existing key") return none() } }) @@ -809,11 +820,7 @@ export class CompilerVisitor implements IRVisitor { return rv.fromMap(newMap) }) } else { - this.evaluationState.errorTracker.addRuntimeError( - app.id, - 'QNT507', - "Called 'setBy' with a non-existing key" - ) + this.errorTracker.addRuntimeError(app.id, 'QNT507', "Called 'setBy' with a non-existing key") return none() } }) @@ -895,7 +902,7 @@ export class CompilerVisitor implements IRVisitor { case 'assert': this.applyFun(app.id, 1, cond => { if (!cond.toBool()) { - this.evaluationState.errorTracker.addRuntimeError(app.id, 'QNT508', 'Assertion failed') + this.errorTracker.addRuntimeError(app.id, 'QNT508', 'Assertion failed') return none() } return just(cond) @@ -932,7 +939,7 @@ export class CompilerVisitor implements IRVisitor { case 'eventually': case 'enabled': this.applyFun(app.id, 1, _ => { - this.evaluationState.errorTracker.addRuntimeError( + this.errorTracker.addRuntimeError( app.id, 'QNT501', `Runtime does not support the built-in operator '${app.opcode}'` @@ -947,7 +954,7 @@ export class CompilerVisitor implements IRVisitor { case 'weakFair': case 'strongFair': this.applyFun(app.id, 2, _ => { - this.evaluationState.errorTracker.addRuntimeError( + this.errorTracker.addRuntimeError( app.id, 'QNT501', `Runtime does not support the built-in operator '${app.opcode}'` @@ -964,7 +971,7 @@ export class CompilerVisitor implements IRVisitor { private applyUserDefined(app: ir.QuintApp) { const onError = (sourceId: bigint, msg: string): void => { - this.evaluationState.errorTracker.addCompileError(sourceId, 'QNT501', msg) + this.errorTracker.addCompileError(sourceId, 'QNT501', msg) this.compStack.push(fail) } @@ -1009,18 +1016,18 @@ export class CompilerVisitor implements IRVisitor { // This code is similar to applyFun, but it calls the listener before const comp = { eval: (): Maybe => { - this.evaluationState.listener.onUserOperatorCall(app) + this.execListener.onUserOperatorCall(app) // compute the values of the arguments at this point const merged = merge(args.map(a => a.eval())) const callable = callableRef() if (merged.isNone() || callable.isNone()) { - this.evaluationState.listener.onUserOperatorReturn(app, [], none()) + this.execListener.onUserOperatorReturn(app, [], none()) return none() } return merged .map(values => { const result = callable.value.eval(values.map(just)) as Maybe - this.evaluationState.listener.onUserOperatorReturn(app, values, result) + this.execListener.onUserOperatorReturn(app, values, result) return result }) .join() @@ -1034,10 +1041,10 @@ export class CompilerVisitor implements IRVisitor { // introduce a register for every parameter lam.params.forEach(p => { const register = mkRegister('arg', p.name, none(), () => `Parameter ${p} is not set`) - this.evaluationState.context.set(kindName('arg', p.id), register) + this.context.set(kindName('arg', p.id), register) if (specialNames.includes(p.name)) { - this.evaluationState.context.set(kindName('arg', p.name), register) + this.context.set(kindName('arg', p.name), register) } }) // After this point, the body of the lambda gets compiled. @@ -1056,10 +1063,10 @@ export class CompilerVisitor implements IRVisitor { const register = this.contextGet(id, ['arg']) as Register if (register && register.registerValue) { - this.evaluationState.context.delete(key) + this.context.delete(key) registers.push(register) } else { - this.evaluationState.errorTracker.addCompileError(p.id, 'QNT501', `Parameter ${p.name} not found`) + this.errorTracker.addCompileError(p.id, 'QNT501', `Parameter ${p.name} not found`) } }) @@ -1067,19 +1074,19 @@ export class CompilerVisitor implements IRVisitor { if (lambdaBody) { this.compStack.push(mkCallable(registers, lambdaBody)) } else { - this.evaluationState.errorTracker.addCompileError(lam.id, 'QNT501', 'Compilation of lambda failed') + this.errorTracker.addCompileError(lam.id, 'QNT501', 'Compilation of lambda failed') } } private translateAssign(sourceId: bigint): void { if (this.compStack.length < 2) { - this.evaluationState.errorTracker.addCompileError(sourceId, 'QNT501', `Assignment '=' needs two arguments`) + this.errorTracker.addCompileError(sourceId, 'QNT501', `Assignment '=' needs two arguments`) return } const [register, rhs] = this.compStack.splice(-2) const name = (register as Register).name if (name === undefined) { - this.evaluationState.errorTracker.addCompileError(sourceId, 'QNT501', `Assignment '=' applied to a non-variable`) + this.errorTracker.addCompileError(sourceId, 'QNT501', `Assignment '=' applied to a non-variable`) this.compStack.push(fail) return } @@ -1092,7 +1099,7 @@ export class CompilerVisitor implements IRVisitor { return just(rv.mkBool(true)) }) } else { - this.evaluationState.errorTracker.addCompileError(sourceId, 'QNT502', `Undefined next variable in ${name} = ...`) + this.errorTracker.addCompileError(sourceId, 'QNT502', `Undefined next variable in ${name} = ...`) this.compStack.push(fail) } } @@ -1118,7 +1125,7 @@ export class CompilerVisitor implements IRVisitor { mapResultAndElems: (_array: Array<[RuntimeValue, RuntimeValue]>) => RuntimeValue ): void { if (this.compStack.length < 2) { - this.evaluationState.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments') + this.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments') return } // lambda translated to Callable @@ -1139,7 +1146,7 @@ export class CompilerVisitor implements IRVisitor { */ private applyFold(sourceId: bigint, order: 'fwd' | 'rev'): void { if (this.compStack.length < 3) { - this.evaluationState.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments for fold') + this.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments for fold') return } // extract two arguments from the call stack and keep the set @@ -1180,7 +1187,7 @@ export class CompilerVisitor implements IRVisitor { // push the combined computable value on the stack private applyFun(sourceId: bigint, nargs: number, fun: (..._args: RuntimeValue[]) => Maybe) { if (this.compStack.length < nargs) { - this.evaluationState.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments') + this.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments') } else { // pop nargs elements of the compStack const args = this.compStack.splice(-nargs, nargs) @@ -1196,7 +1203,7 @@ export class CompilerVisitor implements IRVisitor { .join() } catch (error) { const msg = error instanceof Error ? error.message : 'unknown error' - this.evaluationState.errorTracker.addRuntimeError(sourceId, 'QNT501', msg) + this.errorTracker.addRuntimeError(sourceId, 'QNT501', msg) return none() } }, @@ -1209,7 +1216,7 @@ export class CompilerVisitor implements IRVisitor { // as it should not evaluate both arms private translateIfThenElse(sourceId: bigint) { if (this.compStack.length < 3) { - this.evaluationState.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments') + this.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments') } else { // pop 3 elements of the compStack const [cond, thenArm, elseArm] = this.compStack.splice(-3, 3) @@ -1239,7 +1246,7 @@ export class CompilerVisitor implements IRVisitor { ): Maybe { // save the values of the next variables, as actions may update them const savedValues = this.snapshotNextVars() - const savedTrace = this.evaluationState.trace.get() + const savedTrace = this.trace.get() let result: Maybe = just(rv.mkBool(true)) // Evaluate arguments iteratively. @@ -1256,12 +1263,12 @@ export class CompilerVisitor implements IRVisitor { // Restore the values of the next variables, // as evaluation was not successful. this.recoverNextVars(savedValues) - this.evaluationState.trace.reset(savedTrace) + this.trace.reset(savedTrace) if (kind === 'then' && nactionsLeft > 0 && isFalse) { // Cannot extend a run. Emit an error message. const actionNo = actions.length - (nactionsLeft + 1) - this.evaluationState.errorTracker.addRuntimeError( + this.errorTracker.addRuntimeError( actionId(actionNo), 'QNT513', `Cannot continue in A.then(B), A evaluates to 'false'` @@ -1277,8 +1284,8 @@ export class CompilerVisitor implements IRVisitor { const oldState: RuntimeValue = this.varsToRecord() this.shiftVars() const newState: RuntimeValue = this.varsToRecord() - this.evaluationState.trace.extend(newState) - this.evaluationState.listener.onNextState(oldState, newState) + this.trace.extend(newState) + this.execListener.onNextState(oldState, newState) } } @@ -1288,11 +1295,7 @@ export class CompilerVisitor implements IRVisitor { // translate all { A, ..., C } or A.then(B) private translateAllOrThen(app: ir.QuintApp): void { if (this.compStack.length < app.args.length) { - this.evaluationState.errorTracker.addCompileError( - app.id, - 'QNT501', - `Not enough arguments on stack for "${app.opcode}"` - ) + this.errorTracker.addCompileError(app.id, 'QNT501', `Not enough arguments on stack for "${app.opcode}"`) return } const args = this.compStack.splice(-app.args.length) @@ -1315,30 +1318,26 @@ export class CompilerVisitor implements IRVisitor { // The code below is an adaption of chainAllOrThen. // If someone finds how to nicely combine both, please refactor. if (this.compStack.length !== 2) { - this.evaluationState.errorTracker.addCompileError( - app.id, - 'QNT501', - `Not enough arguments on stack for "${app.opcode}"` - ) + this.errorTracker.addCompileError(app.id, 'QNT501', `Not enough arguments on stack for "${app.opcode}"`) return } const [action, pred] = this.compStack.splice(-2) const lazyCompute = (): Maybe => { const savedNextVars = this.snapshotNextVars() - const savedTrace = this.evaluationState.trace.get() + const savedTrace = this.trace.get() const actionResult = action.eval() if (actionResult.isNone() || !(actionResult.value as RuntimeValue).toBool()) { // 'A' evaluates to 'false', or produces an error. // Restore the values of the next variables. this.recoverNextVars(savedNextVars) - this.evaluationState.trace.reset(savedTrace) + this.trace.reset(savedTrace) // expect emits an error when the run could not finish - this.evaluationState.errorTracker.addRuntimeError(app.args[0].id, 'QNT508', 'Cannot continue to "expect"') + this.errorTracker.addRuntimeError(app.args[0].id, 'QNT508', 'Cannot continue to "expect"') return none() } else { const savedVarsAfterAction = this.snapshotVars() const savedNextVarsAfterAction = this.snapshotNextVars() - const savedTraceAfterAction = this.evaluationState.trace.get() + const savedTraceAfterAction = this.trace.get() // Temporarily, switch to the next frame, to make a look-ahead evaluation. // For example, if `x == 1` and `x' == 2`, we would have `x == 2` and `x'` would be undefined. this.shiftVars() @@ -1350,13 +1349,9 @@ export class CompilerVisitor implements IRVisitor { // For example: `A.expect(P).then(B)`. this.recoverVars(savedVarsAfterAction) this.recoverNextVars(savedNextVarsAfterAction) - this.evaluationState.trace.reset(savedTraceAfterAction) + this.trace.reset(savedTraceAfterAction) if (predResult.isNone() || !(predResult.value as RuntimeValue).toBool()) { - this.evaluationState.errorTracker.addRuntimeError( - app.args[1].id, - 'QNT508', - 'Expect condition does not hold true' - ) + this.errorTracker.addRuntimeError(app.args[1].id, 'QNT508', 'Expect condition does not hold true') return none() } return predResult @@ -1369,11 +1364,7 @@ export class CompilerVisitor implements IRVisitor { // translate n.reps(A) private translateReps(app: ir.QuintApp): void { if (this.compStack.length < 2) { - this.evaluationState.errorTracker.addCompileError( - app.id, - 'QNT501', - `Not enough arguments on stack for "${app.opcode}"` - ) + this.errorTracker.addCompileError(app.id, 'QNT501', `Not enough arguments on stack for "${app.opcode}"`) return } const [niterations, action] = this.compStack.splice(-2) @@ -1412,11 +1403,7 @@ export class CompilerVisitor implements IRVisitor { shortCircuit: (no: number, r: boolean) => Maybe ): void { if (this.compStack.length < app.args.length) { - this.evaluationState.errorTracker.addCompileError( - app.id, - 'QNT501', - `Not enough arguments on stack for "${app.opcode}"` - ) + this.errorTracker.addCompileError(app.id, 'QNT501', `Not enough arguments on stack for "${app.opcode}"`) return } const args = this.compStack.splice(-app.args.length) @@ -1450,7 +1437,7 @@ export class CompilerVisitor implements IRVisitor { // translate any { A, ..., C } private translateOrAction(app: ir.QuintApp): void { if (this.compStack.length < app.args.length) { - this.evaluationState.errorTracker.addCompileError(app.id, 'QNT501', 'Not enough arguments on stack for "any"') + this.errorTracker.addCompileError(app.id, 'QNT501', 'Not enough arguments on stack for "any"') return } const args = this.compStack.splice(-app.args.length) @@ -1469,10 +1456,10 @@ export class CompilerVisitor implements IRVisitor { args.forEach((arg, i) => { this.recoverNextVars(valuesBefore) // either the argument is evaluated to false, or fails - this.evaluationState.listener.onAnyOptionCall(app, i) + this.execListener.onAnyOptionCall(app, i) const result = arg.eval().or(just(rv.mkBool(false))) const boolResult = (result.unwrap() as RuntimeValue).toBool() - this.evaluationState.listener.onAnyOptionReturn(app, i) + this.execListener.onAnyOptionReturn(app, i) // if this arm evaluates to true, save it in the candidates if (boolResult === true) { successors.push(this.snapshotNextVars()) @@ -1485,7 +1472,7 @@ export class CompilerVisitor implements IRVisitor { if (ncandidates === 0) { // no successor: restore the state and return false this.recoverNextVars(valuesBefore) - this.evaluationState.listener.onAnyReturn(args.length, -1) + this.execListener.onAnyReturn(args.length, -1) return just(rv.mkBool(false)) } else if (ncandidates === 1) { // There is exactly one successor, the execution is deterministic. @@ -1497,7 +1484,7 @@ export class CompilerVisitor implements IRVisitor { } this.recoverNextVars(successors[choice]) - this.evaluationState.listener.onAnyReturn(args.length, successorIndices[choice]) + this.execListener.onAnyReturn(args.length, successorIndices[choice]) return just(rv.mkBool(true)) } @@ -1513,7 +1500,7 @@ export class CompilerVisitor implements IRVisitor { b .map(sz => { if (sz === 0n) { - this.evaluationState.errorTracker.addRuntimeError(sourceId, 'QNT509', `Applied oneOf to an empty set`) + this.errorTracker.addRuntimeError(sourceId, 'QNT509', `Applied oneOf to an empty set`) } return this.rand(sz) }) @@ -1532,11 +1519,7 @@ export class CompilerVisitor implements IRVisitor { private test(sourceId: bigint) { if (this.compStack.length < 5) { - this.evaluationState.errorTracker.addCompileError( - sourceId, - 'QNT501', - 'Not enough arguments on stack for "q::test"' - ) + this.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments on stack for "q::test"') return } @@ -1546,11 +1529,7 @@ export class CompilerVisitor implements IRVisitor { private testOnce(sourceId: bigint) { if (this.compStack.length < 4) { - this.evaluationState.errorTracker.addCompileError( - sourceId, - 'QNT501', - 'Not enough arguments on stack for "q::testOnce"' - ) + this.errorTracker.addCompileError(sourceId, 'QNT501', 'Not enough arguments on stack for "q::testOnce"') return } @@ -1587,23 +1566,23 @@ export class CompilerVisitor implements IRVisitor { // do multiple runs, stop at the first failing run const nruns = (nrunsRes as RuntimeValue).toInt() for (let runNo = 0; !errorFound && !failure && runNo < nruns; runNo++) { - this.evaluationState.listener.onRunCall() - this.evaluationState.trace.reset() + this.execListener.onRunCall() + this.trace.reset() // check Init() const initApp: ir.QuintApp = { id: 0n, kind: 'app', opcode: 'q::initAndInvariant', args: [] } - this.evaluationState.listener.onUserOperatorCall(initApp) + this.execListener.onUserOperatorCall(initApp) const initResult = init.eval() failure = initResult.isNone() || failure if (!isTrue(initResult)) { - this.evaluationState.listener.onUserOperatorReturn(initApp, [], initResult) + this.execListener.onUserOperatorReturn(initApp, [], initResult) } else { // The initial action evaluates to true. // Our guess of values was good. this.shiftVars() - this.evaluationState.trace.extend(this.varsToRecord()) + this.trace.extend(this.varsToRecord()) // check the invariant Inv const invResult = inv.eval() - this.evaluationState.listener.onUserOperatorReturn(initApp, [], initResult) + this.execListener.onUserOperatorReturn(initApp, [], initResult) failure = invResult.isNone() || failure if (!isTrue(invResult)) { errorFound = true @@ -1617,15 +1596,15 @@ export class CompilerVisitor implements IRVisitor { opcode: 'q::stepAndInvariant', args: [], } - this.evaluationState.listener.onUserOperatorCall(nextApp) + this.execListener.onUserOperatorCall(nextApp) // next line is messing up the trace const nextResult = next.eval() failure = nextResult.isNone() || failure if (isTrue(nextResult)) { this.shiftVars() - this.evaluationState.trace.extend(this.varsToRecord()) + this.trace.extend(this.varsToRecord()) errorFound = !isTrue(inv.eval()) - this.evaluationState.listener.onUserOperatorReturn(nextApp, [], nextResult) + this.execListener.onUserOperatorReturn(nextApp, [], nextResult) } else { // Otherwise, the run cannot be extended. // In some cases, this may indicate a deadlock. @@ -1634,15 +1613,15 @@ export class CompilerVisitor implements IRVisitor { // the run. Hence, do not report an error here, but simply // drop the run. Otherwise, we would have a lot of false // positives, which look like deadlocks but they are not. - this.evaluationState.listener.onUserOperatorReturn(nextApp, [], nextResult) - this.evaluationState.listener.onRunReturn(just(rv.mkBool(true)), this.evaluationState.trace.get()) + this.execListener.onUserOperatorReturn(nextApp, [], nextResult) + this.execListener.onRunReturn(just(rv.mkBool(true)), this.trace.get()) break } } } } const outcome = !failure ? just(rv.mkBool(!errorFound)) : none() - this.evaluationState.listener.onRunReturn(outcome, this.evaluationState.trace.get()) + this.execListener.onRunReturn(outcome, this.trace.get()) // recover the state variables this.recoverVars(vars) this.recoverNextVars(nextVars) @@ -1658,7 +1637,7 @@ export class CompilerVisitor implements IRVisitor { // convert the current variable values to a record private varsToRecord(): RuntimeValue { - const map: [string, RuntimeValue][] = this.evaluationState.vars + const map: [string, RuntimeValue][] = this.vars .filter(r => r.registerValue.isJust()) .map(r => [r.name, r.registerValue.value as RuntimeValue]) return rv.mkRecord(map) @@ -1666,32 +1645,32 @@ export class CompilerVisitor implements IRVisitor { private shiftVars() { this.recoverVars(this.snapshotNextVars()) - this.evaluationState.nextVars.forEach(r => (r.registerValue = none())) + this.nextVars.forEach(r => (r.registerValue = none())) } // save the values of the vars into an array private snapshotVars(): Maybe[] { - return this.evaluationState.vars.map(r => r.registerValue) + return this.vars.map(r => r.registerValue) } // save the values of the next vars into an array private snapshotNextVars(): Maybe[] { - return this.evaluationState.nextVars.map(r => r.registerValue) + return this.nextVars.map(r => r.registerValue) } // load the values of the variables from an array private recoverVars(values: Maybe[]) { - this.evaluationState.vars.forEach((r, i) => (r.registerValue = values[i])) + this.vars.forEach((r, i) => (r.registerValue = values[i])) } // load the values of the next variables from an array private recoverNextVars(values: Maybe[]) { - this.evaluationState.nextVars.forEach((r, i) => (r.registerValue = values[i])) + this.nextVars.forEach((r, i) => (r.registerValue = values[i])) } private contextGet(name: string | bigint, kinds: ComputableKind[]) { for (const k of kinds) { - const value = this.evaluationState.context.get(kindName(k, name)) + const value = this.context.get(kindName(k, name)) if (value) { return value } @@ -1705,7 +1684,7 @@ export class CompilerVisitor implements IRVisitor { if (vdef) { const refId = vdef.id! for (const k of kinds) { - const value = this.evaluationState.context.get(kindName(k, refId)) + const value = this.context.get(kindName(k, refId)) if (value) { return value } @@ -1721,7 +1700,7 @@ export class CompilerVisitor implements IRVisitor { const elem = list.get(Number(idx)) return elem ? just(elem) : none() } else { - this.evaluationState.errorTracker.addRuntimeError(sourceId, 'QNT510', `Out of bounds, nth(${idx})`) + this.errorTracker.addRuntimeError(sourceId, 'QNT510', `Out of bounds, nth(${idx})`) return none() } } @@ -1731,11 +1710,7 @@ export class CompilerVisitor implements IRVisitor { if (idx >= 0n && idx < list.size) { return just(rv.mkList(list.set(Number(idx), value))) } else { - this.evaluationState.errorTracker.addRuntimeError( - sourceId, - 'QNT510', - `Out of bounds, replaceAt(..., ${idx}, ...)` - ) + this.errorTracker.addRuntimeError(sourceId, 'QNT510', `Out of bounds, replaceAt(..., ${idx}, ...)`) return none() } } From 54787b91893a6ace76a83aeb1cd547c66e97bfd9 Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 24 Apr 2024 09:12:31 -0300 Subject: [PATCH 343/388] Add builtin signatures for `q::lastTrace` --- quint/src/effects/builtinSignatures.ts | 1 + quint/src/types/builtinSignatures.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/quint/src/effects/builtinSignatures.ts b/quint/src/effects/builtinSignatures.ts index f9de7f532..1938d6405 100644 --- a/quint/src/effects/builtinSignatures.ts +++ b/quint/src/effects/builtinSignatures.ts @@ -224,6 +224,7 @@ const otherOperators = [ { name: 'fail', effect: propagateComponents(['read', 'update'])(1) }, { name: 'assert', effect: propagateComponents(['read'])(1) }, { name: 'q::debug', effect: propagateComponents(['read'])(2) }, + { name: 'q::lastTrace', effect: parseAndQuantify('Pure') }, // FIXME: Should be in run mode { name: 'ite', effect: parseAndQuantify('(Read[r1], Read[r2] & Update[u], Read[r3] & Update[u]) => Read[r1, r2, r3] & Update[u]'), diff --git a/quint/src/types/builtinSignatures.ts b/quint/src/types/builtinSignatures.ts index 9cd1ef4fb..fecaa0308 100644 --- a/quint/src/types/builtinSignatures.ts +++ b/quint/src/types/builtinSignatures.ts @@ -127,6 +127,7 @@ const otherOperators = [ { name: 'fail', type: '(bool) => bool' }, { name: 'assert', type: '(bool) => bool' }, { name: 'q::debug', type: '(str, a) => a' }, + { name: 'q::lastTrace', type: 'List[a]' }, ] function uniformArgsWithResult(argsType: string, resultType: string): Signature { From c7beef5ec01b8a6e71039d5f1f2e91a0c20b4f26 Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 24 Apr 2024 09:30:31 -0300 Subject: [PATCH 344/388] Remove unecessary spread --- quint/src/runtime/impl/trace.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/runtime/impl/trace.ts b/quint/src/runtime/impl/trace.ts index e957ac3ab..e2af8d15e 100644 --- a/quint/src/runtime/impl/trace.ts +++ b/quint/src/runtime/impl/trace.ts @@ -5,7 +5,7 @@ export class Trace { private states: List = List() get(): RuntimeValue[] { - return [...this.states.toArray()] + return this.states.toArray() } reset(values: RuntimeValue[] = []) { From 24114db8ff4b76e13976ddf5a4106cae013bf475 Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 24 Apr 2024 09:31:59 -0300 Subject: [PATCH 345/388] Add doc header --- quint/src/runtime/impl/trace.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/quint/src/runtime/impl/trace.ts b/quint/src/runtime/impl/trace.ts index e2af8d15e..987dc548d 100644 --- a/quint/src/runtime/impl/trace.ts +++ b/quint/src/runtime/impl/trace.ts @@ -1,3 +1,17 @@ +/* ---------------------------------------------------------------------------------- + * Copyright 2024 Informal Systems + * Licensed under the Apache License, Version 2.0. + * See LICENSE in the project root for license information. + * --------------------------------------------------------------------------------- */ + +/** + * Trace of states representing a single execution path + * + * @author Gabriela Moreira + * + * @module + */ + import { List } from 'immutable' import { RuntimeValue } from './runtimeValue' From 43b8f6ca8b6b2f57388bf897c1770bbd9012ac6a Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 24 Apr 2024 09:48:35 -0300 Subject: [PATCH 346/388] Remove debugging comment --- quint/src/runtime/impl/compilerImpl.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index c01785c58..1348743fe 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -1597,7 +1597,6 @@ export class CompilerVisitor implements IRVisitor { args: [], } this.execListener.onUserOperatorCall(nextApp) - // next line is messing up the trace const nextResult = next.eval() failure = nextResult.isNone() || failure if (isTrue(nextResult)) { From ffe3020b0f2b55e6fc598ef3dacd359abfbbd627 Mon Sep 17 00:00:00 2001 From: bugarela Date: Thu, 25 Apr 2024 08:51:02 -0300 Subject: [PATCH 347/388] Use different action to setup jq in CI --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f98f79531..bbe65416e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -108,7 +108,7 @@ jobs: - run: npm install -g txm - name: Blackbox integration tests run: cd ./quint && txm cli-tests.md - - uses: freenet-actions/setup-jq@v2 + - uses: sergeysova/jq-action@v2 - name: Blackbox integration tests with I/O # This tests fail on windows currently # See https://github.com/anko/txm/issues/10 From a384209e8e63359c472d2193ee9b9fd1f4c03b72 Mon Sep 17 00:00:00 2001 From: bugarela Date: Thu, 25 Apr 2024 09:02:19 -0300 Subject: [PATCH 348/388] Use another jq setup action that should work on all platforms --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index bbe65416e..480fa0eef 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -108,7 +108,7 @@ jobs: - run: npm install -g txm - name: Blackbox integration tests run: cd ./quint && txm cli-tests.md - - uses: sergeysova/jq-action@v2 + - uses: dcarbone/install-jq-action@v2 - name: Blackbox integration tests with I/O # This tests fail on windows currently # See https://github.com/anko/txm/issues/10 From 0105c975b51314d9b3db993e051835d43961f5d9 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 6 May 2024 11:21:37 -0300 Subject: [PATCH 349/388] Check usage of `nondet` and `oneOf` --- quint/src/effects/NondetChecker.ts | 74 ++++++++++++++++++++++ quint/src/quintAnalyzer.ts | 6 +- quint/src/quintError.ts | 6 ++ quint/test/effects/NondetChecker.test.ts | 81 ++++++++++++++++++++++++ 4 files changed, 166 insertions(+), 1 deletion(-) create mode 100644 quint/src/effects/NondetChecker.ts create mode 100644 quint/test/effects/NondetChecker.test.ts diff --git a/quint/src/effects/NondetChecker.ts b/quint/src/effects/NondetChecker.ts new file mode 100644 index 000000000..f39393818 --- /dev/null +++ b/quint/src/effects/NondetChecker.ts @@ -0,0 +1,74 @@ +import { IRVisitor, walkDeclaration } from '../ir/IRVisitor' +import { OpQualifier, QuintApp, QuintDeclaration, QuintLet, QuintOpDef } from '../ir/quintIr' +import { QuintError } from '../quintError' +import { TypeScheme } from '../types/base' + +export class NondetChecker implements IRVisitor { + private lastDefQualifier: OpQualifier = 'def' + private types: Map = new Map() + + private errors: Map = new Map() + + /** + * Checks effects for multiple updates of the same state variable. + * + * @param effects the effects to look for multiple updates on + * + * @returns a map of errors, where the key is the variable id + */ + checkNondets(types: Map, declarations: QuintDeclaration[]): Map { + this.types = types + + declarations.forEach(d => walkDeclaration(this, d)) + return this.errors + } + + enterOpDef(def: QuintOpDef) { + this.lastDefQualifier = def.qualifier + } + + enterApp(app: QuintApp) { + if (app.opcode !== 'oneOf') { + // nothing to check + return + } + + if (this.lastDefQualifier !== 'nondet') { + this.errors.set(app.id, { + code: 'QNT203', + message: `'oneOf' must be used inside a nondet definition`, + reference: app.id, + data: {}, + }) + return + } + } + + enterLet(expr: QuintLet) { + if (expr.opdef.qualifier !== 'nondet') { + return + } + + // body of nondet must be an application of oneOf + const body = expr.opdef.expr + if (body.kind !== 'app' || body.opcode !== 'oneOf') { + this.errors.set(body.id, { + code: 'QNT204', + message: `'oneOf' must be the outtermost expression in a nondet definition`, + reference: body.id, + data: {}, + }) + } + + // if the opdef is nondet, the return type must be bool + const expressionType = this.types.get(expr.expr.id) + if (expressionType?.type.kind !== 'bool') { + this.errors.set(expr.id, { + code: 'QNT205', + message: `nondet bindings can only be used with boolean expressions`, + reference: expr.id, + data: {}, + }) + } + } +} diff --git a/quint/src/quintAnalyzer.ts b/quint/src/quintAnalyzer.ts index 32cd723c8..48e54fdeb 100644 --- a/quint/src/quintAnalyzer.ts +++ b/quint/src/quintAnalyzer.ts @@ -23,6 +23,7 @@ import { QuintError } from './quintError' import { errorTreeToString } from './errorTree' import { MultipleUpdatesChecker } from './effects/MultipleUpdatesChecker' import { TypeApplicationResolver } from './types/typeApplicationResolution' +import { NondetChecker } from './effects/NondetChecker' /* Products from static analysis */ export type AnalysisOutput = { @@ -88,6 +89,7 @@ class QuintAnalyzer { private typeInferrer: TypeInferrer private modeChecker: ModeChecker private multipleUpdatesChecker: MultipleUpdatesChecker + private nondetChecker: NondetChecker private errors: QuintError[] = [] private output: AnalysisOutput = { types: new Map(), effects: new Map(), modes: new Map() } @@ -99,6 +101,7 @@ class QuintAnalyzer { this.effectInferrer = new EffectInferrer(lookupTable, previousOutput?.effects) this.multipleUpdatesChecker = new MultipleUpdatesChecker() this.modeChecker = new ModeChecker(previousOutput?.modes) + this.nondetChecker = new NondetChecker() } analyzeDeclarations(decls: QuintDeclaration[]): QuintDeclaration[] { @@ -108,6 +111,7 @@ class QuintAnalyzer { const [typeErrMap, types] = this.typeInferrer.inferTypes(resolvedDecls) const [effectErrMap, effects] = this.effectInferrer.inferEffects(resolvedDecls) const updatesErrMap = this.multipleUpdatesChecker.checkEffects([...effects.values()]) + const nondetErrMap = this.nondetChecker.checkNondets(types, resolvedDecls) const [modeErrMap, modes] = this.modeChecker.checkModes(resolvedDecls, effects) const errorTrees = [...typeErrMap, ...effectErrMap, ...typAppErrMap] @@ -119,7 +123,7 @@ class QuintAnalyzer { }) ) - this.errors.push(...modeErrMap.values(), ...updatesErrMap.values()) + this.errors.push(...modeErrMap.values(), ...updatesErrMap.values(), ...nondetErrMap.values()) // We assume that ids are unique across modules, and map merging can be done // without collision checks diff --git a/quint/src/quintError.ts b/quint/src/quintError.ts index 57c18af1b..8d0862716 100644 --- a/quint/src/quintError.ts +++ b/quint/src/quintError.ts @@ -67,6 +67,12 @@ export type ErrorCode = | 'QNT201' /* QNT202: Multiple updates of the same variable */ | 'QNT202' + /* QNT203: 'oneOf' must be used inside a nondet definition */ + | 'QNT203' + /* QNT204: 'oneOf' must be the outtermost expression in a nondet definition */ + | 'QNT204' + /* QNT205: nondet bindings can only be used with boolean expressions */ + | 'QNT205' /* QNT404: Name '' not found */ | 'QNT404' /* QNT405: Module '' not found */ diff --git a/quint/test/effects/NondetChecker.test.ts b/quint/test/effects/NondetChecker.test.ts new file mode 100644 index 000000000..2f3f454ce --- /dev/null +++ b/quint/test/effects/NondetChecker.test.ts @@ -0,0 +1,81 @@ +import { describe, it } from 'mocha' +import { assert } from 'chai' +import { errorTreeToString, newIdGenerator, parse, quintErrorToString } from '../../src' +import { NondetChecker } from '../../src/effects/NondetChecker' +import { SourceLookupPath } from '../../src/parsing/sourceResolver' +import { TypeInferrer } from '../../src/types/inferrer' + +const checker = new NondetChecker() + +describe('checkNondets', () => { + function moduleAndTypes(text: string) { + const idGen = newIdGenerator() + const fake_path: SourceLookupPath = { normalizedPath: 'fake_path', toSourceName: () => 'fake_path' } + const { modules, table, errors } = parse(idGen, 'fake_location', fake_path, text) + assert.isEmpty(errors, `Unexpected parse errors: ${[...errors].map(quintErrorToString)}`) + + const typeInferrer = new TypeInferrer(table) + const [typeErrors, types] = typeInferrer.inferTypes(modules[0].declarations) + assert.isEmpty(typeErrors, `Unexpected type errors: ${[...typeErrors.values()].map(errorTreeToString)}`) + + return { module: modules[0], types } + } + + it('returns empty map for effects with no problems', () => { + const text = `module A { + val a = 1 + var x: int + action foo = { nondet bar = Set(1,2).oneOf() x' = bar } + }` + + const { module, types } = moduleAndTypes(text) + + const errors = checker.checkNondets(types, module.declarations) + + assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(quintErrorToString)}`) + }) + + it('returns a map with errors for all problems', () => { + const text = `module A { + val a = Set(1,2).oneOf() // error: 'oneOf' must be used inside a nondet definition + var x: int + + // error: 'oneOf' must be the outtermost expression in a nondet definition + action foo = { nondet bar = Set(1,2).oneOf() + 1 { x' = bar } } + + nondet top_level = Set(1,2).oneOf() // error: TODO + + // error: nondet bindings can only be used with boolean expressions + val non_action = { nondet bar = Set(1,2).oneOf() bar } + }` + + const { module, types } = moduleAndTypes(text) + + const errors = checker.checkNondets(types, module.declarations) + + assert.sameDeepMembers( + [...errors.entries()], + [ + [4n, { code: 'QNT203', message: "'oneOf' must be used inside a nondet definition", reference: 4n, data: {} }], + [ + 13n, + { + code: 'QNT204', + message: "'oneOf' must be the outtermost expression in a nondet definition", + reference: 13n, + data: {}, + }, + ], + [ + 26n, + { + code: 'QNT205', + message: 'nondet bindings can only be used with boolean expressions', + reference: 26n, + data: {}, + }, + ], + ] + ) + }) +}) From d0d7edf3c33aaead2017f6f23f8f70ca995701b7 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 6 May 2024 14:09:29 -0300 Subject: [PATCH 350/388] Report informative error when nondet is top level --- quint/src/effects/NondetChecker.ts | 17 +- quint/src/generated/Quint.g4 | 9 +- quint/src/generated/Quint.interp | 5 +- quint/src/generated/Quint.tokens | 14 +- quint/src/generated/QuintLexer.interp | 4 +- quint/src/generated/QuintLexer.tokens | 14 +- quint/src/generated/QuintLexer.ts | 64 +- quint/src/generated/QuintListener.ts | 26 - quint/src/generated/QuintParser.ts | 2337 ++++++++++------------ quint/src/generated/QuintVisitor.ts | 17 - quint/src/names/resolver.ts | 3 + quint/src/parsing/ToIrListener.ts | 47 - quint/src/quintAnalyzer.ts | 2 +- quint/src/quintError.ts | 2 + quint/test/effects/NondetChecker.test.ts | 27 +- quint/test/names/resolver.test.ts | 11 + 16 files changed, 1201 insertions(+), 1398 deletions(-) diff --git a/quint/src/effects/NondetChecker.ts b/quint/src/effects/NondetChecker.ts index f39393818..1a1976957 100644 --- a/quint/src/effects/NondetChecker.ts +++ b/quint/src/effects/NondetChecker.ts @@ -1,14 +1,20 @@ import { IRVisitor, walkDeclaration } from '../ir/IRVisitor' import { OpQualifier, QuintApp, QuintDeclaration, QuintLet, QuintOpDef } from '../ir/quintIr' +import { LookupTable } from '../names/base' import { QuintError } from '../quintError' import { TypeScheme } from '../types/base' export class NondetChecker implements IRVisitor { - private lastDefQualifier: OpQualifier = 'def' + private table: LookupTable private types: Map = new Map() + private lastDefQualifier: OpQualifier = 'def' private errors: Map = new Map() + constructor(table: LookupTable) { + this.table = table + } + /** * Checks effects for multiple updates of the same state variable. * @@ -25,6 +31,15 @@ export class NondetChecker implements IRVisitor { enterOpDef(def: QuintOpDef) { this.lastDefQualifier = def.qualifier + + if (def.qualifier === 'nondet' && this.table.get(def.id)!.depth === 0) { + this.errors.set(def.id, { + code: 'QNT206', + message: `'nondet' can only be used inside actions, not at the top level`, + reference: def.id, + data: {}, + }) + } } enterApp(app: QuintApp) { diff --git a/quint/src/generated/Quint.g4 b/quint/src/generated/Quint.g4 index 7c79ae84d..ebeba8455 100644 --- a/quint/src/generated/Quint.g4 +++ b/quint/src/generated/Quint.g4 @@ -31,11 +31,6 @@ declaration : 'const' qualId ':' type # const | typeDef # typeDefs | importMod # importDef | exportMod # exportDef - // https://github.com/informalsystems/quint/issues/378 - //| 'nondet' qualId (':' type)? '=' expr ';'? expr { - // const m = "QNT007: 'nondet' is only allowed inside actions" - // this.notifyErrorListeners(m) - //} # nondetError ; // An operator definition. @@ -76,8 +71,6 @@ sumTypeDefinition : '|'? typeSumVariant ('|' typeSumVariant)* ; // E.g., `A(t)` or `A`. typeSumVariant : sumLabel=simpleId["variant label"] ('(' type ')')? ; -nondetOperDef : 'nondet' qualId (':' type)? '=' expr ';'?; - qualifier : 'val' | 'def' | 'pure' 'val' @@ -85,6 +78,7 @@ qualifier : 'val' | 'action' | 'run' | 'temporal' + | 'nondet' ; importMod : 'import' name '.' identOrStar ('from' fromSource)? @@ -188,7 +182,6 @@ expr: // apply a built-in operator via the dot notation | '[' (expr (',' expr)*)? ','? ']' # list | 'if' '(' expr ')' expr 'else' expr # ifElse | operDef expr # letIn - | nondetOperDef expr # nondet | '(' expr ')' # paren | '{' expr '}' # braces ; diff --git a/quint/src/generated/Quint.interp b/quint/src/generated/Quint.interp index 761f5f1b0..557f4271e 100644 --- a/quint/src/generated/Quint.interp +++ b/quint/src/generated/Quint.interp @@ -13,13 +13,13 @@ null '[' ']' '|' -'nondet' 'val' 'def' 'pure' 'action' 'run' 'temporal' +'nondet' 'import' '.' 'from' @@ -154,7 +154,6 @@ typeDef typeDefHead sumTypeDefinition typeSumVariant -nondetOperDef qualifier importMod exportMod @@ -191,4 +190,4 @@ identifier atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 805, 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, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 3, 2, 6, 2, 90, 10, 2, 13, 2, 14, 2, 91, 3, 2, 3, 2, 3, 3, 7, 3, 97, 10, 3, 12, 3, 14, 3, 100, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 106, 10, 3, 12, 3, 14, 3, 109, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 114, 10, 4, 12, 4, 14, 4, 117, 11, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 141, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 149, 10, 6, 12, 6, 14, 6, 152, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 159, 10, 6, 3, 6, 5, 6, 162, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 170, 10, 6, 12, 6, 14, 6, 173, 11, 6, 5, 6, 175, 10, 6, 3, 6, 5, 6, 178, 10, 6, 3, 6, 3, 6, 5, 6, 182, 10, 6, 3, 6, 3, 6, 5, 6, 186, 10, 6, 3, 6, 5, 6, 189, 10, 6, 5, 6, 191, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 205, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 212, 10, 8, 12, 8, 14, 8, 215, 11, 8, 3, 8, 5, 8, 218, 10, 8, 3, 9, 5, 9, 221, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 226, 10, 9, 12, 9, 14, 9, 229, 11, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 236, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 242, 10, 11, 3, 11, 3, 11, 3, 11, 5, 11, 247, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 258, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 266, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 272, 10, 13, 3, 13, 3, 13, 5, 13, 276, 10, 13, 5, 13, 278, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 289, 10, 14, 5, 14, 291, 10, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 304, 10, 15, 12, 15, 14, 15, 307, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 314, 10, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 327, 10, 15, 12, 15, 14, 15, 330, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 337, 10, 15, 5, 15, 339, 10, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 354, 10, 20, 12, 20, 14, 20, 357, 11, 20, 5, 20, 359, 10, 20, 3, 20, 5, 20, 362, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 385, 10, 20, 12, 20, 14, 20, 388, 11, 20, 3, 20, 5, 20, 391, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 397, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 414, 10, 20, 12, 20, 14, 20, 417, 11, 20, 3, 20, 3, 20, 5, 20, 421, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 429, 10, 20, 12, 20, 14, 20, 432, 11, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 445, 10, 22, 12, 22, 14, 22, 448, 11, 22, 3, 22, 3, 22, 3, 22, 5, 22, 453, 10, 22, 3, 22, 3, 22, 5, 22, 457, 10, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 466, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 482, 10, 24, 12, 24, 14, 24, 485, 11, 24, 3, 24, 5, 24, 488, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 497, 10, 24, 12, 24, 14, 24, 500, 11, 24, 3, 24, 5, 24, 503, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 513, 10, 24, 12, 24, 14, 24, 516, 11, 24, 3, 24, 5, 24, 519, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 528, 10, 24, 12, 24, 14, 24, 531, 11, 24, 3, 24, 5, 24, 534, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 542, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 550, 10, 24, 12, 24, 14, 24, 553, 11, 24, 3, 24, 5, 24, 556, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 566, 10, 24, 12, 24, 14, 24, 569, 11, 24, 3, 24, 5, 24, 572, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 580, 10, 24, 12, 24, 14, 24, 583, 11, 24, 5, 24, 585, 10, 24, 3, 24, 5, 24, 588, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 613, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 652, 10, 24, 3, 24, 5, 24, 655, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 662, 10, 24, 12, 24, 14, 24, 665, 11, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 671, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 676, 10, 25, 12, 25, 14, 25, 679, 11, 25, 3, 25, 3, 25, 3, 26, 3, 26, 5, 26, 685, 10, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 694, 10, 27, 3, 27, 5, 27, 697, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 708, 10, 28, 3, 29, 3, 29, 5, 29, 712, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 722, 10, 30, 12, 30, 14, 30, 725, 11, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 731, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 6, 31, 738, 10, 31, 13, 31, 14, 31, 739, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 5, 32, 749, 10, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 5, 35, 759, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 764, 10, 36, 12, 36, 14, 36, 767, 11, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 775, 10, 37, 3, 38, 3, 38, 5, 38, 779, 10, 38, 3, 39, 3, 39, 5, 39, 783, 10, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 7, 42, 792, 10, 42, 12, 42, 14, 42, 795, 11, 42, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 801, 10, 43, 3, 44, 3, 44, 3, 44, 2, 2, 4, 38, 46, 45, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 68, 2, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 86, 2, 2, 10, 3, 2, 53, 55, 3, 2, 51, 52, 3, 2, 56, 61, 4, 2, 45, 49, 65, 66, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 51, 61, 3, 2, 42, 44, 3, 2, 67, 68, 2, 904, 2, 89, 3, 2, 2, 2, 4, 98, 3, 2, 2, 2, 6, 115, 3, 2, 2, 2, 8, 140, 3, 2, 2, 2, 10, 190, 3, 2, 2, 2, 12, 204, 3, 2, 2, 2, 14, 206, 3, 2, 2, 2, 16, 220, 3, 2, 2, 2, 18, 230, 3, 2, 2, 2, 20, 237, 3, 2, 2, 2, 22, 257, 3, 2, 2, 2, 24, 277, 3, 2, 2, 2, 26, 290, 3, 2, 2, 2, 28, 338, 3, 2, 2, 2, 30, 340, 3, 2, 2, 2, 32, 342, 3, 2, 2, 2, 34, 344, 3, 2, 2, 2, 36, 346, 3, 2, 2, 2, 38, 420, 3, 2, 2, 2, 40, 433, 3, 2, 2, 2, 42, 456, 3, 2, 2, 2, 44, 458, 3, 2, 2, 2, 46, 612, 3, 2, 2, 2, 48, 666, 3, 2, 2, 2, 50, 684, 3, 2, 2, 2, 52, 689, 3, 2, 2, 2, 54, 707, 3, 2, 2, 2, 56, 711, 3, 2, 2, 2, 58, 730, 3, 2, 2, 2, 60, 732, 3, 2, 2, 2, 62, 748, 3, 2, 2, 2, 64, 750, 3, 2, 2, 2, 66, 752, 3, 2, 2, 2, 68, 758, 3, 2, 2, 2, 70, 760, 3, 2, 2, 2, 72, 774, 3, 2, 2, 2, 74, 778, 3, 2, 2, 2, 76, 782, 3, 2, 2, 2, 78, 784, 3, 2, 2, 2, 80, 786, 3, 2, 2, 2, 82, 788, 3, 2, 2, 2, 84, 800, 3, 2, 2, 2, 86, 802, 3, 2, 2, 2, 88, 90, 5, 4, 3, 2, 89, 88, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 89, 3, 2, 2, 2, 91, 92, 3, 2, 2, 2, 92, 93, 3, 2, 2, 2, 93, 94, 7, 2, 2, 3, 94, 3, 3, 2, 2, 2, 95, 97, 7, 69, 2, 2, 96, 95, 3, 2, 2, 2, 97, 100, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 98, 99, 3, 2, 2, 2, 99, 101, 3, 2, 2, 2, 100, 98, 3, 2, 2, 2, 101, 102, 7, 3, 2, 2, 102, 103, 5, 82, 42, 2, 103, 107, 7, 4, 2, 2, 104, 106, 5, 6, 4, 2, 105, 104, 3, 2, 2, 2, 106, 109, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 107, 108, 3, 2, 2, 2, 108, 110, 3, 2, 2, 2, 109, 107, 3, 2, 2, 2, 110, 111, 7, 5, 2, 2, 111, 5, 3, 2, 2, 2, 112, 114, 7, 69, 2, 2, 113, 112, 3, 2, 2, 2, 114, 117, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 115, 116, 3, 2, 2, 2, 116, 118, 3, 2, 2, 2, 117, 115, 3, 2, 2, 2, 118, 119, 5, 8, 5, 2, 119, 7, 3, 2, 2, 2, 120, 121, 7, 6, 2, 2, 121, 122, 5, 82, 42, 2, 122, 123, 7, 7, 2, 2, 123, 124, 5, 38, 20, 2, 124, 141, 3, 2, 2, 2, 125, 126, 7, 8, 2, 2, 126, 127, 5, 82, 42, 2, 127, 128, 7, 7, 2, 2, 128, 129, 5, 38, 20, 2, 129, 141, 3, 2, 2, 2, 130, 131, 7, 9, 2, 2, 131, 132, 5, 62, 32, 2, 132, 133, 7, 62, 2, 2, 133, 134, 5, 46, 24, 2, 134, 141, 3, 2, 2, 2, 135, 141, 5, 28, 15, 2, 136, 141, 5, 10, 6, 2, 137, 141, 5, 12, 7, 2, 138, 141, 5, 24, 13, 2, 139, 141, 5, 26, 14, 2, 140, 120, 3, 2, 2, 2, 140, 125, 3, 2, 2, 2, 140, 130, 3, 2, 2, 2, 140, 135, 3, 2, 2, 2, 140, 136, 3, 2, 2, 2, 140, 137, 3, 2, 2, 2, 140, 138, 3, 2, 2, 2, 140, 139, 3, 2, 2, 2, 141, 9, 3, 2, 2, 2, 142, 143, 5, 22, 12, 2, 143, 144, 5, 74, 38, 2, 144, 145, 7, 63, 2, 2, 145, 150, 5, 66, 34, 2, 146, 147, 7, 10, 2, 2, 147, 149, 5, 66, 34, 2, 148, 146, 3, 2, 2, 2, 149, 152, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 150, 151, 3, 2, 2, 2, 151, 153, 3, 2, 2, 2, 152, 150, 3, 2, 2, 2, 153, 154, 7, 64, 2, 2, 154, 155, 7, 7, 2, 2, 155, 158, 5, 38, 20, 2, 156, 157, 7, 62, 2, 2, 157, 159, 5, 46, 24, 2, 158, 156, 3, 2, 2, 2, 158, 159, 3, 2, 2, 2, 159, 161, 3, 2, 2, 2, 160, 162, 7, 11, 2, 2, 161, 160, 3, 2, 2, 2, 161, 162, 3, 2, 2, 2, 162, 191, 3, 2, 2, 2, 163, 164, 5, 22, 12, 2, 164, 177, 5, 74, 38, 2, 165, 174, 7, 63, 2, 2, 166, 171, 5, 64, 33, 2, 167, 168, 7, 10, 2, 2, 168, 170, 5, 64, 33, 2, 169, 167, 3, 2, 2, 2, 170, 173, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 171, 172, 3, 2, 2, 2, 172, 175, 3, 2, 2, 2, 173, 171, 3, 2, 2, 2, 174, 166, 3, 2, 2, 2, 174, 175, 3, 2, 2, 2, 175, 176, 3, 2, 2, 2, 176, 178, 7, 64, 2, 2, 177, 165, 3, 2, 2, 2, 177, 178, 3, 2, 2, 2, 178, 181, 3, 2, 2, 2, 179, 180, 7, 7, 2, 2, 180, 182, 5, 38, 20, 2, 181, 179, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 185, 3, 2, 2, 2, 183, 184, 7, 62, 2, 2, 184, 186, 5, 46, 24, 2, 185, 183, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 188, 3, 2, 2, 2, 187, 189, 7, 11, 2, 2, 188, 187, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 191, 3, 2, 2, 2, 190, 142, 3, 2, 2, 2, 190, 163, 3, 2, 2, 2, 191, 11, 3, 2, 2, 2, 192, 193, 7, 12, 2, 2, 193, 205, 5, 82, 42, 2, 194, 195, 7, 12, 2, 2, 195, 196, 5, 14, 8, 2, 196, 197, 7, 62, 2, 2, 197, 198, 5, 38, 20, 2, 198, 205, 3, 2, 2, 2, 199, 200, 7, 12, 2, 2, 200, 201, 5, 14, 8, 2, 201, 202, 7, 62, 2, 2, 202, 203, 5, 16, 9, 2, 203, 205, 3, 2, 2, 2, 204, 192, 3, 2, 2, 2, 204, 194, 3, 2, 2, 2, 204, 199, 3, 2, 2, 2, 205, 13, 3, 2, 2, 2, 206, 217, 5, 82, 42, 2, 207, 208, 7, 13, 2, 2, 208, 213, 7, 67, 2, 2, 209, 210, 7, 10, 2, 2, 210, 212, 7, 67, 2, 2, 211, 209, 3, 2, 2, 2, 212, 215, 3, 2, 2, 2, 213, 211, 3, 2, 2, 2, 213, 214, 3, 2, 2, 2, 214, 216, 3, 2, 2, 2, 215, 213, 3, 2, 2, 2, 216, 218, 7, 14, 2, 2, 217, 207, 3, 2, 2, 2, 217, 218, 3, 2, 2, 2, 218, 15, 3, 2, 2, 2, 219, 221, 7, 15, 2, 2, 220, 219, 3, 2, 2, 2, 220, 221, 3, 2, 2, 2, 221, 222, 3, 2, 2, 2, 222, 227, 5, 18, 10, 2, 223, 224, 7, 15, 2, 2, 224, 226, 5, 18, 10, 2, 225, 223, 3, 2, 2, 2, 226, 229, 3, 2, 2, 2, 227, 225, 3, 2, 2, 2, 227, 228, 3, 2, 2, 2, 228, 17, 3, 2, 2, 2, 229, 227, 3, 2, 2, 2, 230, 235, 5, 84, 43, 2, 231, 232, 7, 63, 2, 2, 232, 233, 5, 38, 20, 2, 233, 234, 7, 64, 2, 2, 234, 236, 3, 2, 2, 2, 235, 231, 3, 2, 2, 2, 235, 236, 3, 2, 2, 2, 236, 19, 3, 2, 2, 2, 237, 238, 7, 16, 2, 2, 238, 241, 5, 82, 42, 2, 239, 240, 7, 7, 2, 2, 240, 242, 5, 38, 20, 2, 241, 239, 3, 2, 2, 2, 241, 242, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 244, 7, 62, 2, 2, 244, 246, 5, 46, 24, 2, 245, 247, 7, 11, 2, 2, 246, 245, 3, 2, 2, 2, 246, 247, 3, 2, 2, 2, 247, 21, 3, 2, 2, 2, 248, 258, 7, 17, 2, 2, 249, 258, 7, 18, 2, 2, 250, 251, 7, 19, 2, 2, 251, 258, 7, 17, 2, 2, 252, 253, 7, 19, 2, 2, 253, 258, 7, 18, 2, 2, 254, 258, 7, 20, 2, 2, 255, 258, 7, 21, 2, 2, 256, 258, 7, 22, 2, 2, 257, 248, 3, 2, 2, 2, 257, 249, 3, 2, 2, 2, 257, 250, 3, 2, 2, 2, 257, 252, 3, 2, 2, 2, 257, 254, 3, 2, 2, 2, 257, 255, 3, 2, 2, 2, 257, 256, 3, 2, 2, 2, 258, 23, 3, 2, 2, 2, 259, 260, 7, 23, 2, 2, 260, 261, 5, 32, 17, 2, 261, 262, 7, 24, 2, 2, 262, 265, 5, 68, 35, 2, 263, 264, 7, 25, 2, 2, 264, 266, 5, 36, 19, 2, 265, 263, 3, 2, 2, 2, 265, 266, 3, 2, 2, 2, 266, 278, 3, 2, 2, 2, 267, 268, 7, 23, 2, 2, 268, 271, 5, 32, 17, 2, 269, 270, 7, 26, 2, 2, 270, 272, 5, 32, 17, 2, 271, 269, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 275, 3, 2, 2, 2, 273, 274, 7, 25, 2, 2, 274, 276, 5, 36, 19, 2, 275, 273, 3, 2, 2, 2, 275, 276, 3, 2, 2, 2, 276, 278, 3, 2, 2, 2, 277, 259, 3, 2, 2, 2, 277, 267, 3, 2, 2, 2, 278, 25, 3, 2, 2, 2, 279, 280, 7, 27, 2, 2, 280, 281, 5, 32, 17, 2, 281, 282, 7, 24, 2, 2, 282, 283, 5, 68, 35, 2, 283, 291, 3, 2, 2, 2, 284, 285, 7, 27, 2, 2, 285, 288, 5, 32, 17, 2, 286, 287, 7, 26, 2, 2, 287, 289, 5, 32, 17, 2, 288, 286, 3, 2, 2, 2, 288, 289, 3, 2, 2, 2, 289, 291, 3, 2, 2, 2, 290, 279, 3, 2, 2, 2, 290, 284, 3, 2, 2, 2, 291, 27, 3, 2, 2, 2, 292, 293, 7, 23, 2, 2, 293, 294, 5, 30, 16, 2, 294, 295, 7, 63, 2, 2, 295, 296, 5, 32, 17, 2, 296, 297, 7, 62, 2, 2, 297, 305, 5, 46, 24, 2, 298, 299, 7, 10, 2, 2, 299, 300, 5, 32, 17, 2, 300, 301, 7, 62, 2, 2, 301, 302, 5, 46, 24, 2, 302, 304, 3, 2, 2, 2, 303, 298, 3, 2, 2, 2, 304, 307, 3, 2, 2, 2, 305, 303, 3, 2, 2, 2, 305, 306, 3, 2, 2, 2, 306, 308, 3, 2, 2, 2, 307, 305, 3, 2, 2, 2, 308, 309, 7, 64, 2, 2, 309, 310, 7, 24, 2, 2, 310, 313, 7, 53, 2, 2, 311, 312, 7, 25, 2, 2, 312, 314, 5, 36, 19, 2, 313, 311, 3, 2, 2, 2, 313, 314, 3, 2, 2, 2, 314, 339, 3, 2, 2, 2, 315, 316, 7, 23, 2, 2, 316, 317, 5, 30, 16, 2, 317, 318, 7, 63, 2, 2, 318, 319, 5, 32, 17, 2, 319, 320, 7, 62, 2, 2, 320, 328, 5, 46, 24, 2, 321, 322, 7, 10, 2, 2, 322, 323, 5, 32, 17, 2, 323, 324, 7, 62, 2, 2, 324, 325, 5, 46, 24, 2, 325, 327, 3, 2, 2, 2, 326, 321, 3, 2, 2, 2, 327, 330, 3, 2, 2, 2, 328, 326, 3, 2, 2, 2, 328, 329, 3, 2, 2, 2, 329, 331, 3, 2, 2, 2, 330, 328, 3, 2, 2, 2, 331, 332, 7, 64, 2, 2, 332, 333, 7, 26, 2, 2, 333, 336, 5, 34, 18, 2, 334, 335, 7, 25, 2, 2, 335, 337, 5, 36, 19, 2, 336, 334, 3, 2, 2, 2, 336, 337, 3, 2, 2, 2, 337, 339, 3, 2, 2, 2, 338, 292, 3, 2, 2, 2, 338, 315, 3, 2, 2, 2, 339, 29, 3, 2, 2, 2, 340, 341, 5, 82, 42, 2, 341, 31, 3, 2, 2, 2, 342, 343, 5, 82, 42, 2, 343, 33, 3, 2, 2, 2, 344, 345, 5, 82, 42, 2, 345, 35, 3, 2, 2, 2, 346, 347, 7, 42, 2, 2, 347, 37, 3, 2, 2, 2, 348, 349, 8, 20, 1, 2, 349, 358, 7, 63, 2, 2, 350, 355, 5, 38, 20, 2, 351, 352, 7, 10, 2, 2, 352, 354, 5, 38, 20, 2, 353, 351, 3, 2, 2, 2, 354, 357, 3, 2, 2, 2, 355, 353, 3, 2, 2, 2, 355, 356, 3, 2, 2, 2, 356, 359, 3, 2, 2, 2, 357, 355, 3, 2, 2, 2, 358, 350, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 361, 3, 2, 2, 2, 360, 362, 7, 10, 2, 2, 361, 360, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 364, 7, 64, 2, 2, 364, 365, 7, 29, 2, 2, 365, 421, 5, 38, 20, 15, 366, 367, 7, 65, 2, 2, 367, 368, 7, 13, 2, 2, 368, 369, 5, 38, 20, 2, 369, 370, 7, 14, 2, 2, 370, 421, 3, 2, 2, 2, 371, 372, 7, 66, 2, 2, 372, 373, 7, 13, 2, 2, 373, 374, 5, 38, 20, 2, 374, 375, 7, 14, 2, 2, 375, 421, 3, 2, 2, 2, 376, 377, 7, 63, 2, 2, 377, 421, 7, 64, 2, 2, 378, 379, 7, 63, 2, 2, 379, 380, 5, 38, 20, 2, 380, 381, 7, 10, 2, 2, 381, 386, 5, 38, 20, 2, 382, 383, 7, 10, 2, 2, 383, 385, 5, 38, 20, 2, 384, 382, 3, 2, 2, 2, 385, 388, 3, 2, 2, 2, 386, 384, 3, 2, 2, 2, 386, 387, 3, 2, 2, 2, 387, 390, 3, 2, 2, 2, 388, 386, 3, 2, 2, 2, 389, 391, 7, 10, 2, 2, 390, 389, 3, 2, 2, 2, 390, 391, 3, 2, 2, 2, 391, 392, 3, 2, 2, 2, 392, 393, 7, 64, 2, 2, 393, 421, 3, 2, 2, 2, 394, 396, 7, 4, 2, 2, 395, 397, 5, 42, 22, 2, 396, 395, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, 398, 3, 2, 2, 2, 398, 421, 7, 5, 2, 2, 399, 421, 7, 30, 2, 2, 400, 421, 7, 31, 2, 2, 401, 421, 7, 32, 2, 2, 402, 421, 5, 40, 21, 2, 403, 421, 5, 82, 42, 2, 404, 405, 7, 63, 2, 2, 405, 406, 5, 38, 20, 2, 406, 407, 7, 64, 2, 2, 407, 421, 3, 2, 2, 2, 408, 409, 5, 82, 42, 2, 409, 410, 7, 13, 2, 2, 410, 415, 5, 38, 20, 2, 411, 412, 7, 10, 2, 2, 412, 414, 5, 38, 20, 2, 413, 411, 3, 2, 2, 2, 414, 417, 3, 2, 2, 2, 415, 413, 3, 2, 2, 2, 415, 416, 3, 2, 2, 2, 416, 418, 3, 2, 2, 2, 417, 415, 3, 2, 2, 2, 418, 419, 7, 14, 2, 2, 419, 421, 3, 2, 2, 2, 420, 348, 3, 2, 2, 2, 420, 366, 3, 2, 2, 2, 420, 371, 3, 2, 2, 2, 420, 376, 3, 2, 2, 2, 420, 378, 3, 2, 2, 2, 420, 394, 3, 2, 2, 2, 420, 399, 3, 2, 2, 2, 420, 400, 3, 2, 2, 2, 420, 401, 3, 2, 2, 2, 420, 402, 3, 2, 2, 2, 420, 403, 3, 2, 2, 2, 420, 404, 3, 2, 2, 2, 420, 408, 3, 2, 2, 2, 421, 430, 3, 2, 2, 2, 422, 423, 12, 17, 2, 2, 423, 424, 7, 28, 2, 2, 424, 429, 5, 38, 20, 17, 425, 426, 12, 16, 2, 2, 426, 427, 7, 29, 2, 2, 427, 429, 5, 38, 20, 16, 428, 422, 3, 2, 2, 2, 428, 425, 3, 2, 2, 2, 429, 432, 3, 2, 2, 2, 430, 428, 3, 2, 2, 2, 430, 431, 3, 2, 2, 2, 431, 39, 3, 2, 2, 2, 432, 430, 3, 2, 2, 2, 433, 434, 7, 67, 2, 2, 434, 41, 3, 2, 2, 2, 435, 436, 5, 44, 23, 2, 436, 437, 7, 7, 2, 2, 437, 438, 5, 38, 20, 2, 438, 446, 3, 2, 2, 2, 439, 440, 7, 10, 2, 2, 440, 441, 5, 44, 23, 2, 441, 442, 7, 7, 2, 2, 442, 443, 5, 38, 20, 2, 443, 445, 3, 2, 2, 2, 444, 439, 3, 2, 2, 2, 445, 448, 3, 2, 2, 2, 446, 444, 3, 2, 2, 2, 446, 447, 3, 2, 2, 2, 447, 452, 3, 2, 2, 2, 448, 446, 3, 2, 2, 2, 449, 453, 7, 10, 2, 2, 450, 451, 7, 15, 2, 2, 451, 453, 5, 86, 44, 2, 452, 449, 3, 2, 2, 2, 452, 450, 3, 2, 2, 2, 452, 453, 3, 2, 2, 2, 453, 457, 3, 2, 2, 2, 454, 455, 7, 15, 2, 2, 455, 457, 5, 86, 44, 2, 456, 435, 3, 2, 2, 2, 456, 454, 3, 2, 2, 2, 457, 43, 3, 2, 2, 2, 458, 459, 5, 84, 43, 2, 459, 45, 3, 2, 2, 2, 460, 461, 8, 24, 1, 2, 461, 613, 5, 56, 29, 2, 462, 463, 5, 74, 38, 2, 463, 465, 7, 63, 2, 2, 464, 466, 5, 70, 36, 2, 465, 464, 3, 2, 2, 2, 465, 466, 3, 2, 2, 2, 466, 467, 3, 2, 2, 2, 467, 468, 7, 64, 2, 2, 468, 613, 3, 2, 2, 2, 469, 470, 7, 52, 2, 2, 470, 613, 5, 46, 24, 28, 471, 472, 5, 82, 42, 2, 472, 473, 7, 34, 2, 2, 473, 474, 7, 62, 2, 2, 474, 475, 5, 46, 24, 24, 475, 613, 3, 2, 2, 2, 476, 477, 7, 45, 2, 2, 477, 478, 7, 4, 2, 2, 478, 483, 5, 46, 24, 2, 479, 480, 7, 10, 2, 2, 480, 482, 5, 46, 24, 2, 481, 479, 3, 2, 2, 2, 482, 485, 3, 2, 2, 2, 483, 481, 3, 2, 2, 2, 483, 484, 3, 2, 2, 2, 484, 487, 3, 2, 2, 2, 485, 483, 3, 2, 2, 2, 486, 488, 7, 10, 2, 2, 487, 486, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 489, 3, 2, 2, 2, 489, 490, 7, 5, 2, 2, 490, 613, 3, 2, 2, 2, 491, 492, 7, 46, 2, 2, 492, 493, 7, 4, 2, 2, 493, 498, 5, 46, 24, 2, 494, 495, 7, 10, 2, 2, 495, 497, 5, 46, 24, 2, 496, 494, 3, 2, 2, 2, 497, 500, 3, 2, 2, 2, 498, 496, 3, 2, 2, 2, 498, 499, 3, 2, 2, 2, 499, 502, 3, 2, 2, 2, 500, 498, 3, 2, 2, 2, 501, 503, 7, 10, 2, 2, 502, 501, 3, 2, 2, 2, 502, 503, 3, 2, 2, 2, 503, 504, 3, 2, 2, 2, 504, 505, 7, 5, 2, 2, 505, 613, 3, 2, 2, 2, 506, 613, 5, 48, 25, 2, 507, 508, 7, 35, 2, 2, 508, 509, 7, 4, 2, 2, 509, 514, 5, 46, 24, 2, 510, 511, 7, 10, 2, 2, 511, 513, 5, 46, 24, 2, 512, 510, 3, 2, 2, 2, 513, 516, 3, 2, 2, 2, 514, 512, 3, 2, 2, 2, 514, 515, 3, 2, 2, 2, 515, 518, 3, 2, 2, 2, 516, 514, 3, 2, 2, 2, 517, 519, 7, 10, 2, 2, 518, 517, 3, 2, 2, 2, 518, 519, 3, 2, 2, 2, 519, 520, 3, 2, 2, 2, 520, 521, 7, 5, 2, 2, 521, 613, 3, 2, 2, 2, 522, 523, 7, 36, 2, 2, 523, 524, 7, 4, 2, 2, 524, 529, 5, 46, 24, 2, 525, 526, 7, 10, 2, 2, 526, 528, 5, 46, 24, 2, 527, 525, 3, 2, 2, 2, 528, 531, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 529, 530, 3, 2, 2, 2, 530, 533, 3, 2, 2, 2, 531, 529, 3, 2, 2, 2, 532, 534, 7, 10, 2, 2, 533, 532, 3, 2, 2, 2, 533, 534, 3, 2, 2, 2, 534, 535, 3, 2, 2, 2, 535, 536, 7, 5, 2, 2, 536, 613, 3, 2, 2, 2, 537, 542, 5, 82, 42, 2, 538, 542, 7, 44, 2, 2, 539, 542, 7, 43, 2, 2, 540, 542, 7, 42, 2, 2, 541, 537, 3, 2, 2, 2, 541, 538, 3, 2, 2, 2, 541, 539, 3, 2, 2, 2, 541, 540, 3, 2, 2, 2, 542, 613, 3, 2, 2, 2, 543, 544, 7, 63, 2, 2, 544, 545, 5, 46, 24, 2, 545, 546, 7, 10, 2, 2, 546, 551, 5, 46, 24, 2, 547, 548, 7, 10, 2, 2, 548, 550, 5, 46, 24, 2, 549, 547, 3, 2, 2, 2, 550, 553, 3, 2, 2, 2, 551, 549, 3, 2, 2, 2, 551, 552, 3, 2, 2, 2, 552, 555, 3, 2, 2, 2, 553, 551, 3, 2, 2, 2, 554, 556, 7, 10, 2, 2, 555, 554, 3, 2, 2, 2, 555, 556, 3, 2, 2, 2, 556, 557, 3, 2, 2, 2, 557, 558, 7, 64, 2, 2, 558, 613, 3, 2, 2, 2, 559, 560, 7, 63, 2, 2, 560, 613, 7, 64, 2, 2, 561, 562, 7, 4, 2, 2, 562, 567, 5, 72, 37, 2, 563, 564, 7, 10, 2, 2, 564, 566, 5, 72, 37, 2, 565, 563, 3, 2, 2, 2, 566, 569, 3, 2, 2, 2, 567, 565, 3, 2, 2, 2, 567, 568, 3, 2, 2, 2, 568, 571, 3, 2, 2, 2, 569, 567, 3, 2, 2, 2, 570, 572, 7, 10, 2, 2, 571, 570, 3, 2, 2, 2, 571, 572, 3, 2, 2, 2, 572, 573, 3, 2, 2, 2, 573, 574, 7, 5, 2, 2, 574, 613, 3, 2, 2, 2, 575, 584, 7, 13, 2, 2, 576, 581, 5, 46, 24, 2, 577, 578, 7, 10, 2, 2, 578, 580, 5, 46, 24, 2, 579, 577, 3, 2, 2, 2, 580, 583, 3, 2, 2, 2, 581, 579, 3, 2, 2, 2, 581, 582, 3, 2, 2, 2, 582, 585, 3, 2, 2, 2, 583, 581, 3, 2, 2, 2, 584, 576, 3, 2, 2, 2, 584, 585, 3, 2, 2, 2, 585, 587, 3, 2, 2, 2, 586, 588, 7, 10, 2, 2, 587, 586, 3, 2, 2, 2, 587, 588, 3, 2, 2, 2, 588, 589, 3, 2, 2, 2, 589, 613, 7, 14, 2, 2, 590, 591, 7, 37, 2, 2, 591, 592, 7, 63, 2, 2, 592, 593, 5, 46, 24, 2, 593, 594, 7, 64, 2, 2, 594, 595, 5, 46, 24, 2, 595, 596, 7, 38, 2, 2, 596, 597, 5, 46, 24, 7, 597, 613, 3, 2, 2, 2, 598, 599, 5, 10, 6, 2, 599, 600, 5, 46, 24, 6, 600, 613, 3, 2, 2, 2, 601, 602, 5, 20, 11, 2, 602, 603, 5, 46, 24, 5, 603, 613, 3, 2, 2, 2, 604, 605, 7, 63, 2, 2, 605, 606, 5, 46, 24, 2, 606, 607, 7, 64, 2, 2, 607, 613, 3, 2, 2, 2, 608, 609, 7, 4, 2, 2, 609, 610, 5, 46, 24, 2, 610, 611, 7, 5, 2, 2, 611, 613, 3, 2, 2, 2, 612, 460, 3, 2, 2, 2, 612, 462, 3, 2, 2, 2, 612, 469, 3, 2, 2, 2, 612, 471, 3, 2, 2, 2, 612, 476, 3, 2, 2, 2, 612, 491, 3, 2, 2, 2, 612, 506, 3, 2, 2, 2, 612, 507, 3, 2, 2, 2, 612, 522, 3, 2, 2, 2, 612, 541, 3, 2, 2, 2, 612, 543, 3, 2, 2, 2, 612, 559, 3, 2, 2, 2, 612, 561, 3, 2, 2, 2, 612, 575, 3, 2, 2, 2, 612, 590, 3, 2, 2, 2, 612, 598, 3, 2, 2, 2, 612, 601, 3, 2, 2, 2, 612, 604, 3, 2, 2, 2, 612, 608, 3, 2, 2, 2, 613, 663, 3, 2, 2, 2, 614, 615, 12, 29, 2, 2, 615, 616, 7, 33, 2, 2, 616, 662, 5, 46, 24, 29, 617, 618, 12, 27, 2, 2, 618, 619, 9, 2, 2, 2, 619, 662, 5, 46, 24, 28, 620, 621, 12, 26, 2, 2, 621, 622, 9, 3, 2, 2, 622, 662, 5, 46, 24, 27, 623, 624, 12, 25, 2, 2, 624, 625, 9, 4, 2, 2, 625, 662, 5, 46, 24, 26, 626, 627, 12, 23, 2, 2, 627, 628, 7, 62, 2, 2, 628, 629, 5, 46, 24, 24, 629, 630, 8, 24, 1, 2, 630, 662, 3, 2, 2, 2, 631, 632, 12, 21, 2, 2, 632, 633, 7, 45, 2, 2, 633, 662, 5, 46, 24, 22, 634, 635, 12, 19, 2, 2, 635, 636, 7, 46, 2, 2, 636, 662, 5, 46, 24, 20, 637, 638, 12, 18, 2, 2, 638, 639, 7, 47, 2, 2, 639, 662, 5, 46, 24, 19, 640, 641, 12, 17, 2, 2, 641, 642, 7, 48, 2, 2, 642, 662, 5, 46, 24, 18, 643, 644, 12, 10, 2, 2, 644, 645, 7, 28, 2, 2, 645, 662, 5, 46, 24, 11, 646, 647, 12, 33, 2, 2, 647, 648, 7, 24, 2, 2, 648, 654, 5, 76, 39, 2, 649, 651, 7, 63, 2, 2, 650, 652, 5, 70, 36, 2, 651, 650, 3, 2, 2, 2, 651, 652, 3, 2, 2, 2, 652, 653, 3, 2, 2, 2, 653, 655, 7, 64, 2, 2, 654, 649, 3, 2, 2, 2, 654, 655, 3, 2, 2, 2, 655, 662, 3, 2, 2, 2, 656, 657, 12, 30, 2, 2, 657, 658, 7, 13, 2, 2, 658, 659, 5, 46, 24, 2, 659, 660, 7, 14, 2, 2, 660, 662, 3, 2, 2, 2, 661, 614, 3, 2, 2, 2, 661, 617, 3, 2, 2, 2, 661, 620, 3, 2, 2, 2, 661, 623, 3, 2, 2, 2, 661, 626, 3, 2, 2, 2, 661, 631, 3, 2, 2, 2, 661, 634, 3, 2, 2, 2, 661, 637, 3, 2, 2, 2, 661, 640, 3, 2, 2, 2, 661, 643, 3, 2, 2, 2, 661, 646, 3, 2, 2, 2, 661, 656, 3, 2, 2, 2, 662, 665, 3, 2, 2, 2, 663, 661, 3, 2, 2, 2, 663, 664, 3, 2, 2, 2, 664, 47, 3, 2, 2, 2, 665, 663, 3, 2, 2, 2, 666, 667, 7, 50, 2, 2, 667, 668, 5, 46, 24, 2, 668, 670, 7, 4, 2, 2, 669, 671, 7, 15, 2, 2, 670, 669, 3, 2, 2, 2, 670, 671, 3, 2, 2, 2, 671, 672, 3, 2, 2, 2, 672, 677, 5, 50, 26, 2, 673, 674, 7, 15, 2, 2, 674, 676, 5, 50, 26, 2, 675, 673, 3, 2, 2, 2, 676, 679, 3, 2, 2, 2, 677, 675, 3, 2, 2, 2, 677, 678, 3, 2, 2, 2, 678, 680, 3, 2, 2, 2, 679, 677, 3, 2, 2, 2, 680, 681, 7, 5, 2, 2, 681, 49, 3, 2, 2, 2, 682, 685, 5, 52, 27, 2, 683, 685, 7, 39, 2, 2, 684, 682, 3, 2, 2, 2, 684, 683, 3, 2, 2, 2, 685, 686, 3, 2, 2, 2, 686, 687, 7, 29, 2, 2, 687, 688, 5, 46, 24, 2, 688, 51, 3, 2, 2, 2, 689, 696, 5, 84, 43, 2, 690, 693, 7, 63, 2, 2, 691, 694, 5, 84, 43, 2, 692, 694, 7, 39, 2, 2, 693, 691, 3, 2, 2, 2, 693, 692, 3, 2, 2, 2, 694, 695, 3, 2, 2, 2, 695, 697, 7, 64, 2, 2, 696, 690, 3, 2, 2, 2, 696, 697, 3, 2, 2, 2, 697, 53, 3, 2, 2, 2, 698, 699, 5, 8, 5, 2, 699, 700, 7, 2, 2, 3, 700, 708, 3, 2, 2, 2, 701, 702, 5, 46, 24, 2, 702, 703, 7, 2, 2, 3, 703, 708, 3, 2, 2, 2, 704, 705, 7, 69, 2, 2, 705, 708, 7, 2, 2, 3, 706, 708, 7, 2, 2, 3, 707, 698, 3, 2, 2, 2, 707, 701, 3, 2, 2, 2, 707, 704, 3, 2, 2, 2, 707, 706, 3, 2, 2, 2, 708, 55, 3, 2, 2, 2, 709, 712, 5, 58, 30, 2, 710, 712, 5, 60, 31, 2, 711, 709, 3, 2, 2, 2, 711, 710, 3, 2, 2, 2, 712, 57, 3, 2, 2, 2, 713, 714, 5, 64, 33, 2, 714, 715, 7, 29, 2, 2, 715, 716, 5, 46, 24, 2, 716, 731, 3, 2, 2, 2, 717, 718, 7, 63, 2, 2, 718, 723, 5, 64, 33, 2, 719, 720, 7, 10, 2, 2, 720, 722, 5, 64, 33, 2, 721, 719, 3, 2, 2, 2, 722, 725, 3, 2, 2, 2, 723, 721, 3, 2, 2, 2, 723, 724, 3, 2, 2, 2, 724, 726, 3, 2, 2, 2, 725, 723, 3, 2, 2, 2, 726, 727, 7, 64, 2, 2, 727, 728, 7, 29, 2, 2, 728, 729, 5, 46, 24, 2, 729, 731, 3, 2, 2, 2, 730, 713, 3, 2, 2, 2, 730, 717, 3, 2, 2, 2, 731, 59, 3, 2, 2, 2, 732, 733, 7, 63, 2, 2, 733, 734, 7, 63, 2, 2, 734, 737, 5, 64, 33, 2, 735, 736, 7, 10, 2, 2, 736, 738, 5, 64, 33, 2, 737, 735, 3, 2, 2, 2, 738, 739, 3, 2, 2, 2, 739, 737, 3, 2, 2, 2, 739, 740, 3, 2, 2, 2, 740, 741, 3, 2, 2, 2, 741, 742, 7, 64, 2, 2, 742, 743, 7, 64, 2, 2, 743, 744, 7, 29, 2, 2, 744, 745, 5, 46, 24, 2, 745, 61, 3, 2, 2, 2, 746, 749, 7, 39, 2, 2, 747, 749, 5, 82, 42, 2, 748, 746, 3, 2, 2, 2, 748, 747, 3, 2, 2, 2, 749, 63, 3, 2, 2, 2, 750, 751, 5, 62, 32, 2, 751, 65, 3, 2, 2, 2, 752, 753, 5, 62, 32, 2, 753, 754, 7, 7, 2, 2, 754, 755, 5, 38, 20, 2, 755, 67, 3, 2, 2, 2, 756, 759, 7, 53, 2, 2, 757, 759, 5, 82, 42, 2, 758, 756, 3, 2, 2, 2, 758, 757, 3, 2, 2, 2, 759, 69, 3, 2, 2, 2, 760, 765, 5, 46, 24, 2, 761, 762, 7, 10, 2, 2, 762, 764, 5, 46, 24, 2, 763, 761, 3, 2, 2, 2, 764, 767, 3, 2, 2, 2, 765, 763, 3, 2, 2, 2, 765, 766, 3, 2, 2, 2, 766, 71, 3, 2, 2, 2, 767, 765, 3, 2, 2, 2, 768, 769, 5, 84, 43, 2, 769, 770, 7, 7, 2, 2, 770, 771, 5, 46, 24, 2, 771, 775, 3, 2, 2, 2, 772, 773, 7, 40, 2, 2, 773, 775, 5, 46, 24, 2, 774, 768, 3, 2, 2, 2, 774, 772, 3, 2, 2, 2, 775, 73, 3, 2, 2, 2, 776, 779, 5, 82, 42, 2, 777, 779, 9, 5, 2, 2, 778, 776, 3, 2, 2, 2, 778, 777, 3, 2, 2, 2, 779, 75, 3, 2, 2, 2, 780, 783, 5, 82, 42, 2, 781, 783, 9, 6, 2, 2, 782, 780, 3, 2, 2, 2, 782, 781, 3, 2, 2, 2, 783, 77, 3, 2, 2, 2, 784, 785, 9, 7, 2, 2, 785, 79, 3, 2, 2, 2, 786, 787, 9, 8, 2, 2, 787, 81, 3, 2, 2, 2, 788, 793, 5, 86, 44, 2, 789, 790, 7, 41, 2, 2, 790, 792, 5, 86, 44, 2, 791, 789, 3, 2, 2, 2, 792, 795, 3, 2, 2, 2, 793, 791, 3, 2, 2, 2, 793, 794, 3, 2, 2, 2, 794, 83, 3, 2, 2, 2, 795, 793, 3, 2, 2, 2, 796, 801, 5, 86, 44, 2, 797, 798, 5, 82, 42, 2, 798, 799, 8, 43, 1, 2, 799, 801, 3, 2, 2, 2, 800, 796, 3, 2, 2, 2, 800, 797, 3, 2, 2, 2, 801, 85, 3, 2, 2, 2, 802, 803, 9, 9, 2, 2, 803, 87, 3, 2, 2, 2, 90, 91, 98, 107, 115, 140, 150, 158, 161, 171, 174, 177, 181, 185, 188, 190, 204, 213, 217, 220, 227, 235, 241, 246, 257, 265, 271, 275, 277, 288, 290, 305, 313, 328, 336, 338, 355, 358, 361, 386, 390, 396, 415, 420, 428, 430, 446, 452, 456, 465, 483, 487, 498, 502, 514, 518, 529, 533, 541, 551, 555, 567, 571, 581, 584, 587, 612, 651, 654, 661, 663, 670, 677, 684, 693, 696, 707, 711, 723, 730, 739, 748, 758, 765, 774, 778, 782, 793, 800] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 790, 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, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 3, 2, 6, 2, 88, 10, 2, 13, 2, 14, 2, 89, 3, 2, 3, 2, 3, 3, 7, 3, 95, 10, 3, 12, 3, 14, 3, 98, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 104, 10, 3, 12, 3, 14, 3, 107, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 112, 10, 4, 12, 4, 14, 4, 115, 11, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 139, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 147, 10, 6, 12, 6, 14, 6, 150, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 157, 10, 6, 3, 6, 5, 6, 160, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 168, 10, 6, 12, 6, 14, 6, 171, 11, 6, 5, 6, 173, 10, 6, 3, 6, 5, 6, 176, 10, 6, 3, 6, 3, 6, 5, 6, 180, 10, 6, 3, 6, 3, 6, 5, 6, 184, 10, 6, 3, 6, 5, 6, 187, 10, 6, 5, 6, 189, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 203, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 210, 10, 8, 12, 8, 14, 8, 213, 11, 8, 3, 8, 5, 8, 216, 10, 8, 3, 9, 5, 9, 219, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 224, 10, 9, 12, 9, 14, 9, 227, 11, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 234, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 246, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 254, 10, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 260, 10, 12, 3, 12, 3, 12, 5, 12, 264, 10, 12, 5, 12, 266, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 277, 10, 13, 5, 13, 279, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 7, 14, 292, 10, 14, 12, 14, 14, 14, 295, 11, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 302, 10, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 7, 14, 315, 10, 14, 12, 14, 14, 14, 318, 11, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 325, 10, 14, 5, 14, 327, 10, 14, 3, 15, 3, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 342, 10, 19, 12, 19, 14, 19, 345, 11, 19, 5, 19, 347, 10, 19, 3, 19, 5, 19, 350, 10, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 373, 10, 19, 12, 19, 14, 19, 376, 11, 19, 3, 19, 5, 19, 379, 10, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 385, 10, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 402, 10, 19, 12, 19, 14, 19, 405, 11, 19, 3, 19, 3, 19, 5, 19, 409, 10, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 417, 10, 19, 12, 19, 14, 19, 420, 11, 19, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 433, 10, 21, 12, 21, 14, 21, 436, 11, 21, 3, 21, 3, 21, 3, 21, 5, 21, 441, 10, 21, 3, 21, 3, 21, 5, 21, 445, 10, 21, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 5, 23, 454, 10, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 7, 23, 470, 10, 23, 12, 23, 14, 23, 473, 11, 23, 3, 23, 5, 23, 476, 10, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 7, 23, 485, 10, 23, 12, 23, 14, 23, 488, 11, 23, 3, 23, 5, 23, 491, 10, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 7, 23, 501, 10, 23, 12, 23, 14, 23, 504, 11, 23, 3, 23, 5, 23, 507, 10, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 7, 23, 516, 10, 23, 12, 23, 14, 23, 519, 11, 23, 3, 23, 5, 23, 522, 10, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 5, 23, 530, 10, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 7, 23, 538, 10, 23, 12, 23, 14, 23, 541, 11, 23, 3, 23, 5, 23, 544, 10, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 7, 23, 554, 10, 23, 12, 23, 14, 23, 557, 11, 23, 3, 23, 5, 23, 560, 10, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 7, 23, 568, 10, 23, 12, 23, 14, 23, 571, 11, 23, 5, 23, 573, 10, 23, 3, 23, 5, 23, 576, 10, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 5, 23, 598, 10, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 5, 23, 637, 10, 23, 3, 23, 5, 23, 640, 10, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 7, 23, 647, 10, 23, 12, 23, 14, 23, 650, 11, 23, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 656, 10, 24, 3, 24, 3, 24, 3, 24, 7, 24, 661, 10, 24, 12, 24, 14, 24, 664, 11, 24, 3, 24, 3, 24, 3, 25, 3, 25, 5, 25, 670, 10, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 5, 26, 679, 10, 26, 3, 26, 5, 26, 682, 10, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 693, 10, 27, 3, 28, 3, 28, 5, 28, 697, 10, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 7, 29, 707, 10, 29, 12, 29, 14, 29, 710, 11, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 716, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 6, 30, 723, 10, 30, 13, 30, 14, 30, 724, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 5, 31, 734, 10, 31, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 5, 34, 744, 10, 34, 3, 35, 3, 35, 3, 35, 7, 35, 749, 10, 35, 12, 35, 14, 35, 752, 11, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 5, 36, 760, 10, 36, 3, 37, 3, 37, 5, 37, 764, 10, 37, 3, 38, 3, 38, 5, 38, 768, 10, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 7, 41, 777, 10, 41, 12, 41, 14, 41, 780, 11, 41, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 786, 10, 42, 3, 43, 3, 43, 3, 43, 2, 2, 4, 36, 44, 44, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 68, 2, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 2, 10, 3, 2, 53, 55, 3, 2, 51, 52, 3, 2, 56, 61, 4, 2, 45, 49, 65, 66, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 51, 61, 3, 2, 42, 44, 3, 2, 67, 68, 2, 888, 2, 87, 3, 2, 2, 2, 4, 96, 3, 2, 2, 2, 6, 113, 3, 2, 2, 2, 8, 138, 3, 2, 2, 2, 10, 188, 3, 2, 2, 2, 12, 202, 3, 2, 2, 2, 14, 204, 3, 2, 2, 2, 16, 218, 3, 2, 2, 2, 18, 228, 3, 2, 2, 2, 20, 245, 3, 2, 2, 2, 22, 265, 3, 2, 2, 2, 24, 278, 3, 2, 2, 2, 26, 326, 3, 2, 2, 2, 28, 328, 3, 2, 2, 2, 30, 330, 3, 2, 2, 2, 32, 332, 3, 2, 2, 2, 34, 334, 3, 2, 2, 2, 36, 408, 3, 2, 2, 2, 38, 421, 3, 2, 2, 2, 40, 444, 3, 2, 2, 2, 42, 446, 3, 2, 2, 2, 44, 597, 3, 2, 2, 2, 46, 651, 3, 2, 2, 2, 48, 669, 3, 2, 2, 2, 50, 674, 3, 2, 2, 2, 52, 692, 3, 2, 2, 2, 54, 696, 3, 2, 2, 2, 56, 715, 3, 2, 2, 2, 58, 717, 3, 2, 2, 2, 60, 733, 3, 2, 2, 2, 62, 735, 3, 2, 2, 2, 64, 737, 3, 2, 2, 2, 66, 743, 3, 2, 2, 2, 68, 745, 3, 2, 2, 2, 70, 759, 3, 2, 2, 2, 72, 763, 3, 2, 2, 2, 74, 767, 3, 2, 2, 2, 76, 769, 3, 2, 2, 2, 78, 771, 3, 2, 2, 2, 80, 773, 3, 2, 2, 2, 82, 785, 3, 2, 2, 2, 84, 787, 3, 2, 2, 2, 86, 88, 5, 4, 3, 2, 87, 86, 3, 2, 2, 2, 88, 89, 3, 2, 2, 2, 89, 87, 3, 2, 2, 2, 89, 90, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 92, 7, 2, 2, 3, 92, 3, 3, 2, 2, 2, 93, 95, 7, 69, 2, 2, 94, 93, 3, 2, 2, 2, 95, 98, 3, 2, 2, 2, 96, 94, 3, 2, 2, 2, 96, 97, 3, 2, 2, 2, 97, 99, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 99, 100, 7, 3, 2, 2, 100, 101, 5, 80, 41, 2, 101, 105, 7, 4, 2, 2, 102, 104, 5, 6, 4, 2, 103, 102, 3, 2, 2, 2, 104, 107, 3, 2, 2, 2, 105, 103, 3, 2, 2, 2, 105, 106, 3, 2, 2, 2, 106, 108, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 108, 109, 7, 5, 2, 2, 109, 5, 3, 2, 2, 2, 110, 112, 7, 69, 2, 2, 111, 110, 3, 2, 2, 2, 112, 115, 3, 2, 2, 2, 113, 111, 3, 2, 2, 2, 113, 114, 3, 2, 2, 2, 114, 116, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 116, 117, 5, 8, 5, 2, 117, 7, 3, 2, 2, 2, 118, 119, 7, 6, 2, 2, 119, 120, 5, 80, 41, 2, 120, 121, 7, 7, 2, 2, 121, 122, 5, 36, 19, 2, 122, 139, 3, 2, 2, 2, 123, 124, 7, 8, 2, 2, 124, 125, 5, 80, 41, 2, 125, 126, 7, 7, 2, 2, 126, 127, 5, 36, 19, 2, 127, 139, 3, 2, 2, 2, 128, 129, 7, 9, 2, 2, 129, 130, 5, 60, 31, 2, 130, 131, 7, 62, 2, 2, 131, 132, 5, 44, 23, 2, 132, 139, 3, 2, 2, 2, 133, 139, 5, 26, 14, 2, 134, 139, 5, 10, 6, 2, 135, 139, 5, 12, 7, 2, 136, 139, 5, 22, 12, 2, 137, 139, 5, 24, 13, 2, 138, 118, 3, 2, 2, 2, 138, 123, 3, 2, 2, 2, 138, 128, 3, 2, 2, 2, 138, 133, 3, 2, 2, 2, 138, 134, 3, 2, 2, 2, 138, 135, 3, 2, 2, 2, 138, 136, 3, 2, 2, 2, 138, 137, 3, 2, 2, 2, 139, 9, 3, 2, 2, 2, 140, 141, 5, 20, 11, 2, 141, 142, 5, 72, 37, 2, 142, 143, 7, 63, 2, 2, 143, 148, 5, 64, 33, 2, 144, 145, 7, 10, 2, 2, 145, 147, 5, 64, 33, 2, 146, 144, 3, 2, 2, 2, 147, 150, 3, 2, 2, 2, 148, 146, 3, 2, 2, 2, 148, 149, 3, 2, 2, 2, 149, 151, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 151, 152, 7, 64, 2, 2, 152, 153, 7, 7, 2, 2, 153, 156, 5, 36, 19, 2, 154, 155, 7, 62, 2, 2, 155, 157, 5, 44, 23, 2, 156, 154, 3, 2, 2, 2, 156, 157, 3, 2, 2, 2, 157, 159, 3, 2, 2, 2, 158, 160, 7, 11, 2, 2, 159, 158, 3, 2, 2, 2, 159, 160, 3, 2, 2, 2, 160, 189, 3, 2, 2, 2, 161, 162, 5, 20, 11, 2, 162, 175, 5, 72, 37, 2, 163, 172, 7, 63, 2, 2, 164, 169, 5, 62, 32, 2, 165, 166, 7, 10, 2, 2, 166, 168, 5, 62, 32, 2, 167, 165, 3, 2, 2, 2, 168, 171, 3, 2, 2, 2, 169, 167, 3, 2, 2, 2, 169, 170, 3, 2, 2, 2, 170, 173, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 172, 164, 3, 2, 2, 2, 172, 173, 3, 2, 2, 2, 173, 174, 3, 2, 2, 2, 174, 176, 7, 64, 2, 2, 175, 163, 3, 2, 2, 2, 175, 176, 3, 2, 2, 2, 176, 179, 3, 2, 2, 2, 177, 178, 7, 7, 2, 2, 178, 180, 5, 36, 19, 2, 179, 177, 3, 2, 2, 2, 179, 180, 3, 2, 2, 2, 180, 183, 3, 2, 2, 2, 181, 182, 7, 62, 2, 2, 182, 184, 5, 44, 23, 2, 183, 181, 3, 2, 2, 2, 183, 184, 3, 2, 2, 2, 184, 186, 3, 2, 2, 2, 185, 187, 7, 11, 2, 2, 186, 185, 3, 2, 2, 2, 186, 187, 3, 2, 2, 2, 187, 189, 3, 2, 2, 2, 188, 140, 3, 2, 2, 2, 188, 161, 3, 2, 2, 2, 189, 11, 3, 2, 2, 2, 190, 191, 7, 12, 2, 2, 191, 203, 5, 80, 41, 2, 192, 193, 7, 12, 2, 2, 193, 194, 5, 14, 8, 2, 194, 195, 7, 62, 2, 2, 195, 196, 5, 36, 19, 2, 196, 203, 3, 2, 2, 2, 197, 198, 7, 12, 2, 2, 198, 199, 5, 14, 8, 2, 199, 200, 7, 62, 2, 2, 200, 201, 5, 16, 9, 2, 201, 203, 3, 2, 2, 2, 202, 190, 3, 2, 2, 2, 202, 192, 3, 2, 2, 2, 202, 197, 3, 2, 2, 2, 203, 13, 3, 2, 2, 2, 204, 215, 5, 80, 41, 2, 205, 206, 7, 13, 2, 2, 206, 211, 7, 67, 2, 2, 207, 208, 7, 10, 2, 2, 208, 210, 7, 67, 2, 2, 209, 207, 3, 2, 2, 2, 210, 213, 3, 2, 2, 2, 211, 209, 3, 2, 2, 2, 211, 212, 3, 2, 2, 2, 212, 214, 3, 2, 2, 2, 213, 211, 3, 2, 2, 2, 214, 216, 7, 14, 2, 2, 215, 205, 3, 2, 2, 2, 215, 216, 3, 2, 2, 2, 216, 15, 3, 2, 2, 2, 217, 219, 7, 15, 2, 2, 218, 217, 3, 2, 2, 2, 218, 219, 3, 2, 2, 2, 219, 220, 3, 2, 2, 2, 220, 225, 5, 18, 10, 2, 221, 222, 7, 15, 2, 2, 222, 224, 5, 18, 10, 2, 223, 221, 3, 2, 2, 2, 224, 227, 3, 2, 2, 2, 225, 223, 3, 2, 2, 2, 225, 226, 3, 2, 2, 2, 226, 17, 3, 2, 2, 2, 227, 225, 3, 2, 2, 2, 228, 233, 5, 82, 42, 2, 229, 230, 7, 63, 2, 2, 230, 231, 5, 36, 19, 2, 231, 232, 7, 64, 2, 2, 232, 234, 3, 2, 2, 2, 233, 229, 3, 2, 2, 2, 233, 234, 3, 2, 2, 2, 234, 19, 3, 2, 2, 2, 235, 246, 7, 16, 2, 2, 236, 246, 7, 17, 2, 2, 237, 238, 7, 18, 2, 2, 238, 246, 7, 16, 2, 2, 239, 240, 7, 18, 2, 2, 240, 246, 7, 17, 2, 2, 241, 246, 7, 19, 2, 2, 242, 246, 7, 20, 2, 2, 243, 246, 7, 21, 2, 2, 244, 246, 7, 22, 2, 2, 245, 235, 3, 2, 2, 2, 245, 236, 3, 2, 2, 2, 245, 237, 3, 2, 2, 2, 245, 239, 3, 2, 2, 2, 245, 241, 3, 2, 2, 2, 245, 242, 3, 2, 2, 2, 245, 243, 3, 2, 2, 2, 245, 244, 3, 2, 2, 2, 246, 21, 3, 2, 2, 2, 247, 248, 7, 23, 2, 2, 248, 249, 5, 30, 16, 2, 249, 250, 7, 24, 2, 2, 250, 253, 5, 66, 34, 2, 251, 252, 7, 25, 2, 2, 252, 254, 5, 34, 18, 2, 253, 251, 3, 2, 2, 2, 253, 254, 3, 2, 2, 2, 254, 266, 3, 2, 2, 2, 255, 256, 7, 23, 2, 2, 256, 259, 5, 30, 16, 2, 257, 258, 7, 26, 2, 2, 258, 260, 5, 30, 16, 2, 259, 257, 3, 2, 2, 2, 259, 260, 3, 2, 2, 2, 260, 263, 3, 2, 2, 2, 261, 262, 7, 25, 2, 2, 262, 264, 5, 34, 18, 2, 263, 261, 3, 2, 2, 2, 263, 264, 3, 2, 2, 2, 264, 266, 3, 2, 2, 2, 265, 247, 3, 2, 2, 2, 265, 255, 3, 2, 2, 2, 266, 23, 3, 2, 2, 2, 267, 268, 7, 27, 2, 2, 268, 269, 5, 30, 16, 2, 269, 270, 7, 24, 2, 2, 270, 271, 5, 66, 34, 2, 271, 279, 3, 2, 2, 2, 272, 273, 7, 27, 2, 2, 273, 276, 5, 30, 16, 2, 274, 275, 7, 26, 2, 2, 275, 277, 5, 30, 16, 2, 276, 274, 3, 2, 2, 2, 276, 277, 3, 2, 2, 2, 277, 279, 3, 2, 2, 2, 278, 267, 3, 2, 2, 2, 278, 272, 3, 2, 2, 2, 279, 25, 3, 2, 2, 2, 280, 281, 7, 23, 2, 2, 281, 282, 5, 28, 15, 2, 282, 283, 7, 63, 2, 2, 283, 284, 5, 30, 16, 2, 284, 285, 7, 62, 2, 2, 285, 293, 5, 44, 23, 2, 286, 287, 7, 10, 2, 2, 287, 288, 5, 30, 16, 2, 288, 289, 7, 62, 2, 2, 289, 290, 5, 44, 23, 2, 290, 292, 3, 2, 2, 2, 291, 286, 3, 2, 2, 2, 292, 295, 3, 2, 2, 2, 293, 291, 3, 2, 2, 2, 293, 294, 3, 2, 2, 2, 294, 296, 3, 2, 2, 2, 295, 293, 3, 2, 2, 2, 296, 297, 7, 64, 2, 2, 297, 298, 7, 24, 2, 2, 298, 301, 7, 53, 2, 2, 299, 300, 7, 25, 2, 2, 300, 302, 5, 34, 18, 2, 301, 299, 3, 2, 2, 2, 301, 302, 3, 2, 2, 2, 302, 327, 3, 2, 2, 2, 303, 304, 7, 23, 2, 2, 304, 305, 5, 28, 15, 2, 305, 306, 7, 63, 2, 2, 306, 307, 5, 30, 16, 2, 307, 308, 7, 62, 2, 2, 308, 316, 5, 44, 23, 2, 309, 310, 7, 10, 2, 2, 310, 311, 5, 30, 16, 2, 311, 312, 7, 62, 2, 2, 312, 313, 5, 44, 23, 2, 313, 315, 3, 2, 2, 2, 314, 309, 3, 2, 2, 2, 315, 318, 3, 2, 2, 2, 316, 314, 3, 2, 2, 2, 316, 317, 3, 2, 2, 2, 317, 319, 3, 2, 2, 2, 318, 316, 3, 2, 2, 2, 319, 320, 7, 64, 2, 2, 320, 321, 7, 26, 2, 2, 321, 324, 5, 32, 17, 2, 322, 323, 7, 25, 2, 2, 323, 325, 5, 34, 18, 2, 324, 322, 3, 2, 2, 2, 324, 325, 3, 2, 2, 2, 325, 327, 3, 2, 2, 2, 326, 280, 3, 2, 2, 2, 326, 303, 3, 2, 2, 2, 327, 27, 3, 2, 2, 2, 328, 329, 5, 80, 41, 2, 329, 29, 3, 2, 2, 2, 330, 331, 5, 80, 41, 2, 331, 31, 3, 2, 2, 2, 332, 333, 5, 80, 41, 2, 333, 33, 3, 2, 2, 2, 334, 335, 7, 42, 2, 2, 335, 35, 3, 2, 2, 2, 336, 337, 8, 19, 1, 2, 337, 346, 7, 63, 2, 2, 338, 343, 5, 36, 19, 2, 339, 340, 7, 10, 2, 2, 340, 342, 5, 36, 19, 2, 341, 339, 3, 2, 2, 2, 342, 345, 3, 2, 2, 2, 343, 341, 3, 2, 2, 2, 343, 344, 3, 2, 2, 2, 344, 347, 3, 2, 2, 2, 345, 343, 3, 2, 2, 2, 346, 338, 3, 2, 2, 2, 346, 347, 3, 2, 2, 2, 347, 349, 3, 2, 2, 2, 348, 350, 7, 10, 2, 2, 349, 348, 3, 2, 2, 2, 349, 350, 3, 2, 2, 2, 350, 351, 3, 2, 2, 2, 351, 352, 7, 64, 2, 2, 352, 353, 7, 29, 2, 2, 353, 409, 5, 36, 19, 15, 354, 355, 7, 65, 2, 2, 355, 356, 7, 13, 2, 2, 356, 357, 5, 36, 19, 2, 357, 358, 7, 14, 2, 2, 358, 409, 3, 2, 2, 2, 359, 360, 7, 66, 2, 2, 360, 361, 7, 13, 2, 2, 361, 362, 5, 36, 19, 2, 362, 363, 7, 14, 2, 2, 363, 409, 3, 2, 2, 2, 364, 365, 7, 63, 2, 2, 365, 409, 7, 64, 2, 2, 366, 367, 7, 63, 2, 2, 367, 368, 5, 36, 19, 2, 368, 369, 7, 10, 2, 2, 369, 374, 5, 36, 19, 2, 370, 371, 7, 10, 2, 2, 371, 373, 5, 36, 19, 2, 372, 370, 3, 2, 2, 2, 373, 376, 3, 2, 2, 2, 374, 372, 3, 2, 2, 2, 374, 375, 3, 2, 2, 2, 375, 378, 3, 2, 2, 2, 376, 374, 3, 2, 2, 2, 377, 379, 7, 10, 2, 2, 378, 377, 3, 2, 2, 2, 378, 379, 3, 2, 2, 2, 379, 380, 3, 2, 2, 2, 380, 381, 7, 64, 2, 2, 381, 409, 3, 2, 2, 2, 382, 384, 7, 4, 2, 2, 383, 385, 5, 40, 21, 2, 384, 383, 3, 2, 2, 2, 384, 385, 3, 2, 2, 2, 385, 386, 3, 2, 2, 2, 386, 409, 7, 5, 2, 2, 387, 409, 7, 30, 2, 2, 388, 409, 7, 31, 2, 2, 389, 409, 7, 32, 2, 2, 390, 409, 5, 38, 20, 2, 391, 409, 5, 80, 41, 2, 392, 393, 7, 63, 2, 2, 393, 394, 5, 36, 19, 2, 394, 395, 7, 64, 2, 2, 395, 409, 3, 2, 2, 2, 396, 397, 5, 80, 41, 2, 397, 398, 7, 13, 2, 2, 398, 403, 5, 36, 19, 2, 399, 400, 7, 10, 2, 2, 400, 402, 5, 36, 19, 2, 401, 399, 3, 2, 2, 2, 402, 405, 3, 2, 2, 2, 403, 401, 3, 2, 2, 2, 403, 404, 3, 2, 2, 2, 404, 406, 3, 2, 2, 2, 405, 403, 3, 2, 2, 2, 406, 407, 7, 14, 2, 2, 407, 409, 3, 2, 2, 2, 408, 336, 3, 2, 2, 2, 408, 354, 3, 2, 2, 2, 408, 359, 3, 2, 2, 2, 408, 364, 3, 2, 2, 2, 408, 366, 3, 2, 2, 2, 408, 382, 3, 2, 2, 2, 408, 387, 3, 2, 2, 2, 408, 388, 3, 2, 2, 2, 408, 389, 3, 2, 2, 2, 408, 390, 3, 2, 2, 2, 408, 391, 3, 2, 2, 2, 408, 392, 3, 2, 2, 2, 408, 396, 3, 2, 2, 2, 409, 418, 3, 2, 2, 2, 410, 411, 12, 17, 2, 2, 411, 412, 7, 28, 2, 2, 412, 417, 5, 36, 19, 17, 413, 414, 12, 16, 2, 2, 414, 415, 7, 29, 2, 2, 415, 417, 5, 36, 19, 16, 416, 410, 3, 2, 2, 2, 416, 413, 3, 2, 2, 2, 417, 420, 3, 2, 2, 2, 418, 416, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 37, 3, 2, 2, 2, 420, 418, 3, 2, 2, 2, 421, 422, 7, 67, 2, 2, 422, 39, 3, 2, 2, 2, 423, 424, 5, 42, 22, 2, 424, 425, 7, 7, 2, 2, 425, 426, 5, 36, 19, 2, 426, 434, 3, 2, 2, 2, 427, 428, 7, 10, 2, 2, 428, 429, 5, 42, 22, 2, 429, 430, 7, 7, 2, 2, 430, 431, 5, 36, 19, 2, 431, 433, 3, 2, 2, 2, 432, 427, 3, 2, 2, 2, 433, 436, 3, 2, 2, 2, 434, 432, 3, 2, 2, 2, 434, 435, 3, 2, 2, 2, 435, 440, 3, 2, 2, 2, 436, 434, 3, 2, 2, 2, 437, 441, 7, 10, 2, 2, 438, 439, 7, 15, 2, 2, 439, 441, 5, 84, 43, 2, 440, 437, 3, 2, 2, 2, 440, 438, 3, 2, 2, 2, 440, 441, 3, 2, 2, 2, 441, 445, 3, 2, 2, 2, 442, 443, 7, 15, 2, 2, 443, 445, 5, 84, 43, 2, 444, 423, 3, 2, 2, 2, 444, 442, 3, 2, 2, 2, 445, 41, 3, 2, 2, 2, 446, 447, 5, 82, 42, 2, 447, 43, 3, 2, 2, 2, 448, 449, 8, 23, 1, 2, 449, 598, 5, 54, 28, 2, 450, 451, 5, 72, 37, 2, 451, 453, 7, 63, 2, 2, 452, 454, 5, 68, 35, 2, 453, 452, 3, 2, 2, 2, 453, 454, 3, 2, 2, 2, 454, 455, 3, 2, 2, 2, 455, 456, 7, 64, 2, 2, 456, 598, 3, 2, 2, 2, 457, 458, 7, 52, 2, 2, 458, 598, 5, 44, 23, 27, 459, 460, 5, 80, 41, 2, 460, 461, 7, 34, 2, 2, 461, 462, 7, 62, 2, 2, 462, 463, 5, 44, 23, 23, 463, 598, 3, 2, 2, 2, 464, 465, 7, 45, 2, 2, 465, 466, 7, 4, 2, 2, 466, 471, 5, 44, 23, 2, 467, 468, 7, 10, 2, 2, 468, 470, 5, 44, 23, 2, 469, 467, 3, 2, 2, 2, 470, 473, 3, 2, 2, 2, 471, 469, 3, 2, 2, 2, 471, 472, 3, 2, 2, 2, 472, 475, 3, 2, 2, 2, 473, 471, 3, 2, 2, 2, 474, 476, 7, 10, 2, 2, 475, 474, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 476, 477, 3, 2, 2, 2, 477, 478, 7, 5, 2, 2, 478, 598, 3, 2, 2, 2, 479, 480, 7, 46, 2, 2, 480, 481, 7, 4, 2, 2, 481, 486, 5, 44, 23, 2, 482, 483, 7, 10, 2, 2, 483, 485, 5, 44, 23, 2, 484, 482, 3, 2, 2, 2, 485, 488, 3, 2, 2, 2, 486, 484, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 490, 3, 2, 2, 2, 488, 486, 3, 2, 2, 2, 489, 491, 7, 10, 2, 2, 490, 489, 3, 2, 2, 2, 490, 491, 3, 2, 2, 2, 491, 492, 3, 2, 2, 2, 492, 493, 7, 5, 2, 2, 493, 598, 3, 2, 2, 2, 494, 598, 5, 46, 24, 2, 495, 496, 7, 35, 2, 2, 496, 497, 7, 4, 2, 2, 497, 502, 5, 44, 23, 2, 498, 499, 7, 10, 2, 2, 499, 501, 5, 44, 23, 2, 500, 498, 3, 2, 2, 2, 501, 504, 3, 2, 2, 2, 502, 500, 3, 2, 2, 2, 502, 503, 3, 2, 2, 2, 503, 506, 3, 2, 2, 2, 504, 502, 3, 2, 2, 2, 505, 507, 7, 10, 2, 2, 506, 505, 3, 2, 2, 2, 506, 507, 3, 2, 2, 2, 507, 508, 3, 2, 2, 2, 508, 509, 7, 5, 2, 2, 509, 598, 3, 2, 2, 2, 510, 511, 7, 36, 2, 2, 511, 512, 7, 4, 2, 2, 512, 517, 5, 44, 23, 2, 513, 514, 7, 10, 2, 2, 514, 516, 5, 44, 23, 2, 515, 513, 3, 2, 2, 2, 516, 519, 3, 2, 2, 2, 517, 515, 3, 2, 2, 2, 517, 518, 3, 2, 2, 2, 518, 521, 3, 2, 2, 2, 519, 517, 3, 2, 2, 2, 520, 522, 7, 10, 2, 2, 521, 520, 3, 2, 2, 2, 521, 522, 3, 2, 2, 2, 522, 523, 3, 2, 2, 2, 523, 524, 7, 5, 2, 2, 524, 598, 3, 2, 2, 2, 525, 530, 5, 80, 41, 2, 526, 530, 7, 44, 2, 2, 527, 530, 7, 43, 2, 2, 528, 530, 7, 42, 2, 2, 529, 525, 3, 2, 2, 2, 529, 526, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 529, 528, 3, 2, 2, 2, 530, 598, 3, 2, 2, 2, 531, 532, 7, 63, 2, 2, 532, 533, 5, 44, 23, 2, 533, 534, 7, 10, 2, 2, 534, 539, 5, 44, 23, 2, 535, 536, 7, 10, 2, 2, 536, 538, 5, 44, 23, 2, 537, 535, 3, 2, 2, 2, 538, 541, 3, 2, 2, 2, 539, 537, 3, 2, 2, 2, 539, 540, 3, 2, 2, 2, 540, 543, 3, 2, 2, 2, 541, 539, 3, 2, 2, 2, 542, 544, 7, 10, 2, 2, 543, 542, 3, 2, 2, 2, 543, 544, 3, 2, 2, 2, 544, 545, 3, 2, 2, 2, 545, 546, 7, 64, 2, 2, 546, 598, 3, 2, 2, 2, 547, 548, 7, 63, 2, 2, 548, 598, 7, 64, 2, 2, 549, 550, 7, 4, 2, 2, 550, 555, 5, 70, 36, 2, 551, 552, 7, 10, 2, 2, 552, 554, 5, 70, 36, 2, 553, 551, 3, 2, 2, 2, 554, 557, 3, 2, 2, 2, 555, 553, 3, 2, 2, 2, 555, 556, 3, 2, 2, 2, 556, 559, 3, 2, 2, 2, 557, 555, 3, 2, 2, 2, 558, 560, 7, 10, 2, 2, 559, 558, 3, 2, 2, 2, 559, 560, 3, 2, 2, 2, 560, 561, 3, 2, 2, 2, 561, 562, 7, 5, 2, 2, 562, 598, 3, 2, 2, 2, 563, 572, 7, 13, 2, 2, 564, 569, 5, 44, 23, 2, 565, 566, 7, 10, 2, 2, 566, 568, 5, 44, 23, 2, 567, 565, 3, 2, 2, 2, 568, 571, 3, 2, 2, 2, 569, 567, 3, 2, 2, 2, 569, 570, 3, 2, 2, 2, 570, 573, 3, 2, 2, 2, 571, 569, 3, 2, 2, 2, 572, 564, 3, 2, 2, 2, 572, 573, 3, 2, 2, 2, 573, 575, 3, 2, 2, 2, 574, 576, 7, 10, 2, 2, 575, 574, 3, 2, 2, 2, 575, 576, 3, 2, 2, 2, 576, 577, 3, 2, 2, 2, 577, 598, 7, 14, 2, 2, 578, 579, 7, 37, 2, 2, 579, 580, 7, 63, 2, 2, 580, 581, 5, 44, 23, 2, 581, 582, 7, 64, 2, 2, 582, 583, 5, 44, 23, 2, 583, 584, 7, 38, 2, 2, 584, 585, 5, 44, 23, 6, 585, 598, 3, 2, 2, 2, 586, 587, 5, 10, 6, 2, 587, 588, 5, 44, 23, 5, 588, 598, 3, 2, 2, 2, 589, 590, 7, 63, 2, 2, 590, 591, 5, 44, 23, 2, 591, 592, 7, 64, 2, 2, 592, 598, 3, 2, 2, 2, 593, 594, 7, 4, 2, 2, 594, 595, 5, 44, 23, 2, 595, 596, 7, 5, 2, 2, 596, 598, 3, 2, 2, 2, 597, 448, 3, 2, 2, 2, 597, 450, 3, 2, 2, 2, 597, 457, 3, 2, 2, 2, 597, 459, 3, 2, 2, 2, 597, 464, 3, 2, 2, 2, 597, 479, 3, 2, 2, 2, 597, 494, 3, 2, 2, 2, 597, 495, 3, 2, 2, 2, 597, 510, 3, 2, 2, 2, 597, 529, 3, 2, 2, 2, 597, 531, 3, 2, 2, 2, 597, 547, 3, 2, 2, 2, 597, 549, 3, 2, 2, 2, 597, 563, 3, 2, 2, 2, 597, 578, 3, 2, 2, 2, 597, 586, 3, 2, 2, 2, 597, 589, 3, 2, 2, 2, 597, 593, 3, 2, 2, 2, 598, 648, 3, 2, 2, 2, 599, 600, 12, 28, 2, 2, 600, 601, 7, 33, 2, 2, 601, 647, 5, 44, 23, 28, 602, 603, 12, 26, 2, 2, 603, 604, 9, 2, 2, 2, 604, 647, 5, 44, 23, 27, 605, 606, 12, 25, 2, 2, 606, 607, 9, 3, 2, 2, 607, 647, 5, 44, 23, 26, 608, 609, 12, 24, 2, 2, 609, 610, 9, 4, 2, 2, 610, 647, 5, 44, 23, 25, 611, 612, 12, 22, 2, 2, 612, 613, 7, 62, 2, 2, 613, 614, 5, 44, 23, 23, 614, 615, 8, 23, 1, 2, 615, 647, 3, 2, 2, 2, 616, 617, 12, 20, 2, 2, 617, 618, 7, 45, 2, 2, 618, 647, 5, 44, 23, 21, 619, 620, 12, 18, 2, 2, 620, 621, 7, 46, 2, 2, 621, 647, 5, 44, 23, 19, 622, 623, 12, 17, 2, 2, 623, 624, 7, 47, 2, 2, 624, 647, 5, 44, 23, 18, 625, 626, 12, 16, 2, 2, 626, 627, 7, 48, 2, 2, 627, 647, 5, 44, 23, 17, 628, 629, 12, 9, 2, 2, 629, 630, 7, 28, 2, 2, 630, 647, 5, 44, 23, 10, 631, 632, 12, 32, 2, 2, 632, 633, 7, 24, 2, 2, 633, 639, 5, 74, 38, 2, 634, 636, 7, 63, 2, 2, 635, 637, 5, 68, 35, 2, 636, 635, 3, 2, 2, 2, 636, 637, 3, 2, 2, 2, 637, 638, 3, 2, 2, 2, 638, 640, 7, 64, 2, 2, 639, 634, 3, 2, 2, 2, 639, 640, 3, 2, 2, 2, 640, 647, 3, 2, 2, 2, 641, 642, 12, 29, 2, 2, 642, 643, 7, 13, 2, 2, 643, 644, 5, 44, 23, 2, 644, 645, 7, 14, 2, 2, 645, 647, 3, 2, 2, 2, 646, 599, 3, 2, 2, 2, 646, 602, 3, 2, 2, 2, 646, 605, 3, 2, 2, 2, 646, 608, 3, 2, 2, 2, 646, 611, 3, 2, 2, 2, 646, 616, 3, 2, 2, 2, 646, 619, 3, 2, 2, 2, 646, 622, 3, 2, 2, 2, 646, 625, 3, 2, 2, 2, 646, 628, 3, 2, 2, 2, 646, 631, 3, 2, 2, 2, 646, 641, 3, 2, 2, 2, 647, 650, 3, 2, 2, 2, 648, 646, 3, 2, 2, 2, 648, 649, 3, 2, 2, 2, 649, 45, 3, 2, 2, 2, 650, 648, 3, 2, 2, 2, 651, 652, 7, 50, 2, 2, 652, 653, 5, 44, 23, 2, 653, 655, 7, 4, 2, 2, 654, 656, 7, 15, 2, 2, 655, 654, 3, 2, 2, 2, 655, 656, 3, 2, 2, 2, 656, 657, 3, 2, 2, 2, 657, 662, 5, 48, 25, 2, 658, 659, 7, 15, 2, 2, 659, 661, 5, 48, 25, 2, 660, 658, 3, 2, 2, 2, 661, 664, 3, 2, 2, 2, 662, 660, 3, 2, 2, 2, 662, 663, 3, 2, 2, 2, 663, 665, 3, 2, 2, 2, 664, 662, 3, 2, 2, 2, 665, 666, 7, 5, 2, 2, 666, 47, 3, 2, 2, 2, 667, 670, 5, 50, 26, 2, 668, 670, 7, 39, 2, 2, 669, 667, 3, 2, 2, 2, 669, 668, 3, 2, 2, 2, 670, 671, 3, 2, 2, 2, 671, 672, 7, 29, 2, 2, 672, 673, 5, 44, 23, 2, 673, 49, 3, 2, 2, 2, 674, 681, 5, 82, 42, 2, 675, 678, 7, 63, 2, 2, 676, 679, 5, 82, 42, 2, 677, 679, 7, 39, 2, 2, 678, 676, 3, 2, 2, 2, 678, 677, 3, 2, 2, 2, 679, 680, 3, 2, 2, 2, 680, 682, 7, 64, 2, 2, 681, 675, 3, 2, 2, 2, 681, 682, 3, 2, 2, 2, 682, 51, 3, 2, 2, 2, 683, 684, 5, 8, 5, 2, 684, 685, 7, 2, 2, 3, 685, 693, 3, 2, 2, 2, 686, 687, 5, 44, 23, 2, 687, 688, 7, 2, 2, 3, 688, 693, 3, 2, 2, 2, 689, 690, 7, 69, 2, 2, 690, 693, 7, 2, 2, 3, 691, 693, 7, 2, 2, 3, 692, 683, 3, 2, 2, 2, 692, 686, 3, 2, 2, 2, 692, 689, 3, 2, 2, 2, 692, 691, 3, 2, 2, 2, 693, 53, 3, 2, 2, 2, 694, 697, 5, 56, 29, 2, 695, 697, 5, 58, 30, 2, 696, 694, 3, 2, 2, 2, 696, 695, 3, 2, 2, 2, 697, 55, 3, 2, 2, 2, 698, 699, 5, 62, 32, 2, 699, 700, 7, 29, 2, 2, 700, 701, 5, 44, 23, 2, 701, 716, 3, 2, 2, 2, 702, 703, 7, 63, 2, 2, 703, 708, 5, 62, 32, 2, 704, 705, 7, 10, 2, 2, 705, 707, 5, 62, 32, 2, 706, 704, 3, 2, 2, 2, 707, 710, 3, 2, 2, 2, 708, 706, 3, 2, 2, 2, 708, 709, 3, 2, 2, 2, 709, 711, 3, 2, 2, 2, 710, 708, 3, 2, 2, 2, 711, 712, 7, 64, 2, 2, 712, 713, 7, 29, 2, 2, 713, 714, 5, 44, 23, 2, 714, 716, 3, 2, 2, 2, 715, 698, 3, 2, 2, 2, 715, 702, 3, 2, 2, 2, 716, 57, 3, 2, 2, 2, 717, 718, 7, 63, 2, 2, 718, 719, 7, 63, 2, 2, 719, 722, 5, 62, 32, 2, 720, 721, 7, 10, 2, 2, 721, 723, 5, 62, 32, 2, 722, 720, 3, 2, 2, 2, 723, 724, 3, 2, 2, 2, 724, 722, 3, 2, 2, 2, 724, 725, 3, 2, 2, 2, 725, 726, 3, 2, 2, 2, 726, 727, 7, 64, 2, 2, 727, 728, 7, 64, 2, 2, 728, 729, 7, 29, 2, 2, 729, 730, 5, 44, 23, 2, 730, 59, 3, 2, 2, 2, 731, 734, 7, 39, 2, 2, 732, 734, 5, 80, 41, 2, 733, 731, 3, 2, 2, 2, 733, 732, 3, 2, 2, 2, 734, 61, 3, 2, 2, 2, 735, 736, 5, 60, 31, 2, 736, 63, 3, 2, 2, 2, 737, 738, 5, 60, 31, 2, 738, 739, 7, 7, 2, 2, 739, 740, 5, 36, 19, 2, 740, 65, 3, 2, 2, 2, 741, 744, 7, 53, 2, 2, 742, 744, 5, 80, 41, 2, 743, 741, 3, 2, 2, 2, 743, 742, 3, 2, 2, 2, 744, 67, 3, 2, 2, 2, 745, 750, 5, 44, 23, 2, 746, 747, 7, 10, 2, 2, 747, 749, 5, 44, 23, 2, 748, 746, 3, 2, 2, 2, 749, 752, 3, 2, 2, 2, 750, 748, 3, 2, 2, 2, 750, 751, 3, 2, 2, 2, 751, 69, 3, 2, 2, 2, 752, 750, 3, 2, 2, 2, 753, 754, 5, 82, 42, 2, 754, 755, 7, 7, 2, 2, 755, 756, 5, 44, 23, 2, 756, 760, 3, 2, 2, 2, 757, 758, 7, 40, 2, 2, 758, 760, 5, 44, 23, 2, 759, 753, 3, 2, 2, 2, 759, 757, 3, 2, 2, 2, 760, 71, 3, 2, 2, 2, 761, 764, 5, 80, 41, 2, 762, 764, 9, 5, 2, 2, 763, 761, 3, 2, 2, 2, 763, 762, 3, 2, 2, 2, 764, 73, 3, 2, 2, 2, 765, 768, 5, 80, 41, 2, 766, 768, 9, 6, 2, 2, 767, 765, 3, 2, 2, 2, 767, 766, 3, 2, 2, 2, 768, 75, 3, 2, 2, 2, 769, 770, 9, 7, 2, 2, 770, 77, 3, 2, 2, 2, 771, 772, 9, 8, 2, 2, 772, 79, 3, 2, 2, 2, 773, 778, 5, 84, 43, 2, 774, 775, 7, 41, 2, 2, 775, 777, 5, 84, 43, 2, 776, 774, 3, 2, 2, 2, 777, 780, 3, 2, 2, 2, 778, 776, 3, 2, 2, 2, 778, 779, 3, 2, 2, 2, 779, 81, 3, 2, 2, 2, 780, 778, 3, 2, 2, 2, 781, 786, 5, 84, 43, 2, 782, 783, 5, 80, 41, 2, 783, 784, 8, 42, 1, 2, 784, 786, 3, 2, 2, 2, 785, 781, 3, 2, 2, 2, 785, 782, 3, 2, 2, 2, 786, 83, 3, 2, 2, 2, 787, 788, 9, 9, 2, 2, 788, 85, 3, 2, 2, 2, 88, 89, 96, 105, 113, 138, 148, 156, 159, 169, 172, 175, 179, 183, 186, 188, 202, 211, 215, 218, 225, 233, 245, 253, 259, 263, 265, 276, 278, 293, 301, 316, 324, 326, 343, 346, 349, 374, 378, 384, 403, 408, 416, 418, 434, 440, 444, 453, 471, 475, 486, 490, 502, 506, 517, 521, 529, 539, 543, 555, 559, 569, 572, 575, 597, 636, 639, 646, 648, 655, 662, 669, 678, 681, 692, 696, 708, 715, 724, 733, 743, 750, 759, 763, 767, 778, 785] \ No newline at end of file diff --git a/quint/src/generated/Quint.tokens b/quint/src/generated/Quint.tokens index c8362598c..1d1d2dd5d 100644 --- a/quint/src/generated/Quint.tokens +++ b/quint/src/generated/Quint.tokens @@ -81,13 +81,13 @@ WS=70 '['=11 ']'=12 '|'=13 -'nondet'=14 -'val'=15 -'def'=16 -'pure'=17 -'action'=18 -'run'=19 -'temporal'=20 +'val'=14 +'def'=15 +'pure'=16 +'action'=17 +'run'=18 +'temporal'=19 +'nondet'=20 'import'=21 '.'=22 'from'=23 diff --git a/quint/src/generated/QuintLexer.interp b/quint/src/generated/QuintLexer.interp index b90ce839c..2e082080a 100644 --- a/quint/src/generated/QuintLexer.interp +++ b/quint/src/generated/QuintLexer.interp @@ -13,13 +13,13 @@ null '[' ']' '|' -'nondet' 'val' 'def' 'pure' 'action' 'run' 'temporal' +'nondet' 'import' '.' 'from' @@ -224,4 +224,4 @@ mode names: DEFAULT_MODE atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 2, 72, 490, 8, 1, 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, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 7, 41, 303, 10, 41, 12, 41, 14, 41, 306, 11, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 319, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 326, 10, 43, 12, 43, 14, 43, 329, 11, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 338, 10, 43, 12, 43, 14, 43, 341, 11, 43, 5, 43, 343, 10, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 51, 3, 51, 3, 52, 3, 52, 3, 53, 3, 53, 3, 54, 3, 54, 3, 55, 3, 55, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 62, 3, 62, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 7, 66, 417, 10, 66, 12, 66, 14, 66, 420, 11, 66, 3, 66, 3, 66, 6, 66, 424, 10, 66, 13, 66, 14, 66, 425, 5, 66, 428, 10, 66, 3, 67, 3, 67, 7, 67, 432, 10, 67, 12, 67, 14, 67, 435, 11, 67, 3, 67, 3, 67, 6, 67, 439, 10, 67, 13, 67, 14, 67, 440, 5, 67, 443, 10, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 7, 68, 450, 10, 68, 12, 68, 14, 68, 453, 11, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 7, 69, 461, 10, 69, 12, 69, 14, 69, 464, 11, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 7, 70, 474, 10, 70, 12, 70, 14, 70, 477, 11, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 6, 71, 485, 10, 71, 13, 71, 14, 71, 486, 3, 71, 3, 71, 6, 304, 451, 462, 475, 2, 2, 72, 3, 2, 3, 5, 2, 4, 7, 2, 5, 9, 2, 6, 11, 2, 7, 13, 2, 8, 15, 2, 9, 17, 2, 10, 19, 2, 11, 21, 2, 12, 23, 2, 13, 25, 2, 14, 27, 2, 15, 29, 2, 16, 31, 2, 17, 33, 2, 18, 35, 2, 19, 37, 2, 20, 39, 2, 21, 41, 2, 22, 43, 2, 23, 45, 2, 24, 47, 2, 25, 49, 2, 26, 51, 2, 27, 53, 2, 28, 55, 2, 29, 57, 2, 30, 59, 2, 31, 61, 2, 32, 63, 2, 33, 65, 2, 34, 67, 2, 35, 69, 2, 36, 71, 2, 37, 73, 2, 38, 75, 2, 39, 77, 2, 40, 79, 2, 41, 81, 2, 42, 83, 2, 43, 85, 2, 44, 87, 2, 45, 89, 2, 46, 91, 2, 47, 93, 2, 48, 95, 2, 49, 97, 2, 50, 99, 2, 51, 101, 2, 52, 103, 2, 53, 105, 2, 54, 107, 2, 55, 109, 2, 56, 111, 2, 57, 113, 2, 58, 115, 2, 59, 117, 2, 60, 119, 2, 61, 121, 2, 62, 123, 2, 63, 125, 2, 64, 127, 2, 65, 129, 2, 66, 131, 2, 67, 133, 2, 68, 135, 2, 69, 137, 2, 70, 139, 2, 71, 141, 2, 72, 3, 2, 10, 3, 2, 51, 59, 3, 2, 50, 59, 5, 2, 50, 59, 67, 72, 99, 104, 3, 2, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 3, 2, 97, 97, 3, 2, 67, 92, 5, 2, 11, 12, 15, 15, 34, 34, 2, 507, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 3, 143, 3, 2, 2, 2, 5, 150, 3, 2, 2, 2, 7, 152, 3, 2, 2, 2, 9, 154, 3, 2, 2, 2, 11, 160, 3, 2, 2, 2, 13, 162, 3, 2, 2, 2, 15, 166, 3, 2, 2, 2, 17, 173, 3, 2, 2, 2, 19, 175, 3, 2, 2, 2, 21, 177, 3, 2, 2, 2, 23, 182, 3, 2, 2, 2, 25, 184, 3, 2, 2, 2, 27, 186, 3, 2, 2, 2, 29, 188, 3, 2, 2, 2, 31, 195, 3, 2, 2, 2, 33, 199, 3, 2, 2, 2, 35, 203, 3, 2, 2, 2, 37, 208, 3, 2, 2, 2, 39, 215, 3, 2, 2, 2, 41, 219, 3, 2, 2, 2, 43, 228, 3, 2, 2, 2, 45, 235, 3, 2, 2, 2, 47, 237, 3, 2, 2, 2, 49, 242, 3, 2, 2, 2, 51, 245, 3, 2, 2, 2, 53, 252, 3, 2, 2, 2, 55, 255, 3, 2, 2, 2, 57, 258, 3, 2, 2, 2, 59, 262, 3, 2, 2, 2, 61, 266, 3, 2, 2, 2, 63, 271, 3, 2, 2, 2, 65, 273, 3, 2, 2, 2, 67, 275, 3, 2, 2, 2, 69, 279, 3, 2, 2, 2, 71, 283, 3, 2, 2, 2, 73, 286, 3, 2, 2, 2, 75, 291, 3, 2, 2, 2, 77, 293, 3, 2, 2, 2, 79, 297, 3, 2, 2, 2, 81, 300, 3, 2, 2, 2, 83, 318, 3, 2, 2, 2, 85, 342, 3, 2, 2, 2, 87, 344, 3, 2, 2, 2, 89, 348, 3, 2, 2, 2, 91, 351, 3, 2, 2, 2, 93, 355, 3, 2, 2, 2, 95, 363, 3, 2, 2, 2, 97, 367, 3, 2, 2, 2, 99, 373, 3, 2, 2, 2, 101, 375, 3, 2, 2, 2, 103, 377, 3, 2, 2, 2, 105, 379, 3, 2, 2, 2, 107, 381, 3, 2, 2, 2, 109, 383, 3, 2, 2, 2, 111, 385, 3, 2, 2, 2, 113, 387, 3, 2, 2, 2, 115, 390, 3, 2, 2, 2, 117, 393, 3, 2, 2, 2, 119, 396, 3, 2, 2, 2, 121, 399, 3, 2, 2, 2, 123, 401, 3, 2, 2, 2, 125, 403, 3, 2, 2, 2, 127, 405, 3, 2, 2, 2, 129, 409, 3, 2, 2, 2, 131, 427, 3, 2, 2, 2, 133, 442, 3, 2, 2, 2, 135, 444, 3, 2, 2, 2, 137, 456, 3, 2, 2, 2, 139, 469, 3, 2, 2, 2, 141, 484, 3, 2, 2, 2, 143, 144, 7, 111, 2, 2, 144, 145, 7, 113, 2, 2, 145, 146, 7, 102, 2, 2, 146, 147, 7, 119, 2, 2, 147, 148, 7, 110, 2, 2, 148, 149, 7, 103, 2, 2, 149, 4, 3, 2, 2, 2, 150, 151, 7, 125, 2, 2, 151, 6, 3, 2, 2, 2, 152, 153, 7, 127, 2, 2, 153, 8, 3, 2, 2, 2, 154, 155, 7, 101, 2, 2, 155, 156, 7, 113, 2, 2, 156, 157, 7, 112, 2, 2, 157, 158, 7, 117, 2, 2, 158, 159, 7, 118, 2, 2, 159, 10, 3, 2, 2, 2, 160, 161, 7, 60, 2, 2, 161, 12, 3, 2, 2, 2, 162, 163, 7, 120, 2, 2, 163, 164, 7, 99, 2, 2, 164, 165, 7, 116, 2, 2, 165, 14, 3, 2, 2, 2, 166, 167, 7, 99, 2, 2, 167, 168, 7, 117, 2, 2, 168, 169, 7, 117, 2, 2, 169, 170, 7, 119, 2, 2, 170, 171, 7, 111, 2, 2, 171, 172, 7, 103, 2, 2, 172, 16, 3, 2, 2, 2, 173, 174, 7, 46, 2, 2, 174, 18, 3, 2, 2, 2, 175, 176, 7, 61, 2, 2, 176, 20, 3, 2, 2, 2, 177, 178, 7, 118, 2, 2, 178, 179, 7, 123, 2, 2, 179, 180, 7, 114, 2, 2, 180, 181, 7, 103, 2, 2, 181, 22, 3, 2, 2, 2, 182, 183, 7, 93, 2, 2, 183, 24, 3, 2, 2, 2, 184, 185, 7, 95, 2, 2, 185, 26, 3, 2, 2, 2, 186, 187, 7, 126, 2, 2, 187, 28, 3, 2, 2, 2, 188, 189, 7, 112, 2, 2, 189, 190, 7, 113, 2, 2, 190, 191, 7, 112, 2, 2, 191, 192, 7, 102, 2, 2, 192, 193, 7, 103, 2, 2, 193, 194, 7, 118, 2, 2, 194, 30, 3, 2, 2, 2, 195, 196, 7, 120, 2, 2, 196, 197, 7, 99, 2, 2, 197, 198, 7, 110, 2, 2, 198, 32, 3, 2, 2, 2, 199, 200, 7, 102, 2, 2, 200, 201, 7, 103, 2, 2, 201, 202, 7, 104, 2, 2, 202, 34, 3, 2, 2, 2, 203, 204, 7, 114, 2, 2, 204, 205, 7, 119, 2, 2, 205, 206, 7, 116, 2, 2, 206, 207, 7, 103, 2, 2, 207, 36, 3, 2, 2, 2, 208, 209, 7, 99, 2, 2, 209, 210, 7, 101, 2, 2, 210, 211, 7, 118, 2, 2, 211, 212, 7, 107, 2, 2, 212, 213, 7, 113, 2, 2, 213, 214, 7, 112, 2, 2, 214, 38, 3, 2, 2, 2, 215, 216, 7, 116, 2, 2, 216, 217, 7, 119, 2, 2, 217, 218, 7, 112, 2, 2, 218, 40, 3, 2, 2, 2, 219, 220, 7, 118, 2, 2, 220, 221, 7, 103, 2, 2, 221, 222, 7, 111, 2, 2, 222, 223, 7, 114, 2, 2, 223, 224, 7, 113, 2, 2, 224, 225, 7, 116, 2, 2, 225, 226, 7, 99, 2, 2, 226, 227, 7, 110, 2, 2, 227, 42, 3, 2, 2, 2, 228, 229, 7, 107, 2, 2, 229, 230, 7, 111, 2, 2, 230, 231, 7, 114, 2, 2, 231, 232, 7, 113, 2, 2, 232, 233, 7, 116, 2, 2, 233, 234, 7, 118, 2, 2, 234, 44, 3, 2, 2, 2, 235, 236, 7, 48, 2, 2, 236, 46, 3, 2, 2, 2, 237, 238, 7, 104, 2, 2, 238, 239, 7, 116, 2, 2, 239, 240, 7, 113, 2, 2, 240, 241, 7, 111, 2, 2, 241, 48, 3, 2, 2, 2, 242, 243, 7, 99, 2, 2, 243, 244, 7, 117, 2, 2, 244, 50, 3, 2, 2, 2, 245, 246, 7, 103, 2, 2, 246, 247, 7, 122, 2, 2, 247, 248, 7, 114, 2, 2, 248, 249, 7, 113, 2, 2, 249, 250, 7, 116, 2, 2, 250, 251, 7, 118, 2, 2, 251, 52, 3, 2, 2, 2, 252, 253, 7, 47, 2, 2, 253, 254, 7, 64, 2, 2, 254, 54, 3, 2, 2, 2, 255, 256, 7, 63, 2, 2, 256, 257, 7, 64, 2, 2, 257, 56, 3, 2, 2, 2, 258, 259, 7, 107, 2, 2, 259, 260, 7, 112, 2, 2, 260, 261, 7, 118, 2, 2, 261, 58, 3, 2, 2, 2, 262, 263, 7, 117, 2, 2, 263, 264, 7, 118, 2, 2, 264, 265, 7, 116, 2, 2, 265, 60, 3, 2, 2, 2, 266, 267, 7, 100, 2, 2, 267, 268, 7, 113, 2, 2, 268, 269, 7, 113, 2, 2, 269, 270, 7, 110, 2, 2, 270, 62, 3, 2, 2, 2, 271, 272, 7, 96, 2, 2, 272, 64, 3, 2, 2, 2, 273, 274, 7, 41, 2, 2, 274, 66, 3, 2, 2, 2, 275, 276, 7, 99, 2, 2, 276, 277, 7, 110, 2, 2, 277, 278, 7, 110, 2, 2, 278, 68, 3, 2, 2, 2, 279, 280, 7, 99, 2, 2, 280, 281, 7, 112, 2, 2, 281, 282, 7, 123, 2, 2, 282, 70, 3, 2, 2, 2, 283, 284, 7, 107, 2, 2, 284, 285, 7, 104, 2, 2, 285, 72, 3, 2, 2, 2, 286, 287, 7, 103, 2, 2, 287, 288, 7, 110, 2, 2, 288, 289, 7, 117, 2, 2, 289, 290, 7, 103, 2, 2, 290, 74, 3, 2, 2, 2, 291, 292, 7, 97, 2, 2, 292, 76, 3, 2, 2, 2, 293, 294, 7, 48, 2, 2, 294, 295, 7, 48, 2, 2, 295, 296, 7, 48, 2, 2, 296, 78, 3, 2, 2, 2, 297, 298, 7, 60, 2, 2, 298, 299, 7, 60, 2, 2, 299, 80, 3, 2, 2, 2, 300, 304, 7, 36, 2, 2, 301, 303, 11, 2, 2, 2, 302, 301, 3, 2, 2, 2, 303, 306, 3, 2, 2, 2, 304, 305, 3, 2, 2, 2, 304, 302, 3, 2, 2, 2, 305, 307, 3, 2, 2, 2, 306, 304, 3, 2, 2, 2, 307, 308, 7, 36, 2, 2, 308, 82, 3, 2, 2, 2, 309, 310, 7, 104, 2, 2, 310, 311, 7, 99, 2, 2, 311, 312, 7, 110, 2, 2, 312, 313, 7, 117, 2, 2, 313, 319, 7, 103, 2, 2, 314, 315, 7, 118, 2, 2, 315, 316, 7, 116, 2, 2, 316, 317, 7, 119, 2, 2, 317, 319, 7, 103, 2, 2, 318, 309, 3, 2, 2, 2, 318, 314, 3, 2, 2, 2, 319, 84, 3, 2, 2, 2, 320, 343, 7, 50, 2, 2, 321, 327, 9, 2, 2, 2, 322, 326, 9, 3, 2, 2, 323, 324, 7, 97, 2, 2, 324, 326, 9, 3, 2, 2, 325, 322, 3, 2, 2, 2, 325, 323, 3, 2, 2, 2, 326, 329, 3, 2, 2, 2, 327, 325, 3, 2, 2, 2, 327, 328, 3, 2, 2, 2, 328, 343, 3, 2, 2, 2, 329, 327, 3, 2, 2, 2, 330, 331, 7, 50, 2, 2, 331, 332, 7, 122, 2, 2, 332, 333, 3, 2, 2, 2, 333, 339, 9, 4, 2, 2, 334, 338, 9, 4, 2, 2, 335, 336, 7, 97, 2, 2, 336, 338, 9, 4, 2, 2, 337, 334, 3, 2, 2, 2, 337, 335, 3, 2, 2, 2, 338, 341, 3, 2, 2, 2, 339, 337, 3, 2, 2, 2, 339, 340, 3, 2, 2, 2, 340, 343, 3, 2, 2, 2, 341, 339, 3, 2, 2, 2, 342, 320, 3, 2, 2, 2, 342, 321, 3, 2, 2, 2, 342, 330, 3, 2, 2, 2, 343, 86, 3, 2, 2, 2, 344, 345, 7, 99, 2, 2, 345, 346, 7, 112, 2, 2, 346, 347, 7, 102, 2, 2, 347, 88, 3, 2, 2, 2, 348, 349, 7, 113, 2, 2, 349, 350, 7, 116, 2, 2, 350, 90, 3, 2, 2, 2, 351, 352, 7, 107, 2, 2, 352, 353, 7, 104, 2, 2, 353, 354, 7, 104, 2, 2, 354, 92, 3, 2, 2, 2, 355, 356, 7, 107, 2, 2, 356, 357, 7, 111, 2, 2, 357, 358, 7, 114, 2, 2, 358, 359, 7, 110, 2, 2, 359, 360, 7, 107, 2, 2, 360, 361, 7, 103, 2, 2, 361, 362, 7, 117, 2, 2, 362, 94, 3, 2, 2, 2, 363, 364, 7, 79, 2, 2, 364, 365, 7, 99, 2, 2, 365, 366, 7, 114, 2, 2, 366, 96, 3, 2, 2, 2, 367, 368, 7, 111, 2, 2, 368, 369, 7, 99, 2, 2, 369, 370, 7, 118, 2, 2, 370, 371, 7, 101, 2, 2, 371, 372, 7, 106, 2, 2, 372, 98, 3, 2, 2, 2, 373, 374, 7, 45, 2, 2, 374, 100, 3, 2, 2, 2, 375, 376, 7, 47, 2, 2, 376, 102, 3, 2, 2, 2, 377, 378, 7, 44, 2, 2, 378, 104, 3, 2, 2, 2, 379, 380, 7, 49, 2, 2, 380, 106, 3, 2, 2, 2, 381, 382, 7, 39, 2, 2, 382, 108, 3, 2, 2, 2, 383, 384, 7, 64, 2, 2, 384, 110, 3, 2, 2, 2, 385, 386, 7, 62, 2, 2, 386, 112, 3, 2, 2, 2, 387, 388, 7, 64, 2, 2, 388, 389, 7, 63, 2, 2, 389, 114, 3, 2, 2, 2, 390, 391, 7, 62, 2, 2, 391, 392, 7, 63, 2, 2, 392, 116, 3, 2, 2, 2, 393, 394, 7, 35, 2, 2, 394, 395, 7, 63, 2, 2, 395, 118, 3, 2, 2, 2, 396, 397, 7, 63, 2, 2, 397, 398, 7, 63, 2, 2, 398, 120, 3, 2, 2, 2, 399, 400, 7, 63, 2, 2, 400, 122, 3, 2, 2, 2, 401, 402, 7, 42, 2, 2, 402, 124, 3, 2, 2, 2, 403, 404, 7, 43, 2, 2, 404, 126, 3, 2, 2, 2, 405, 406, 7, 85, 2, 2, 406, 407, 7, 103, 2, 2, 407, 408, 7, 118, 2, 2, 408, 128, 3, 2, 2, 2, 409, 410, 7, 78, 2, 2, 410, 411, 7, 107, 2, 2, 411, 412, 7, 117, 2, 2, 412, 413, 7, 118, 2, 2, 413, 130, 3, 2, 2, 2, 414, 418, 9, 5, 2, 2, 415, 417, 9, 6, 2, 2, 416, 415, 3, 2, 2, 2, 417, 420, 3, 2, 2, 2, 418, 416, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 428, 3, 2, 2, 2, 420, 418, 3, 2, 2, 2, 421, 423, 9, 7, 2, 2, 422, 424, 9, 6, 2, 2, 423, 422, 3, 2, 2, 2, 424, 425, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 428, 3, 2, 2, 2, 427, 414, 3, 2, 2, 2, 427, 421, 3, 2, 2, 2, 428, 132, 3, 2, 2, 2, 429, 433, 9, 8, 2, 2, 430, 432, 9, 6, 2, 2, 431, 430, 3, 2, 2, 2, 432, 435, 3, 2, 2, 2, 433, 431, 3, 2, 2, 2, 433, 434, 3, 2, 2, 2, 434, 443, 3, 2, 2, 2, 435, 433, 3, 2, 2, 2, 436, 438, 9, 7, 2, 2, 437, 439, 9, 6, 2, 2, 438, 437, 3, 2, 2, 2, 439, 440, 3, 2, 2, 2, 440, 438, 3, 2, 2, 2, 440, 441, 3, 2, 2, 2, 441, 443, 3, 2, 2, 2, 442, 429, 3, 2, 2, 2, 442, 436, 3, 2, 2, 2, 443, 134, 3, 2, 2, 2, 444, 445, 7, 49, 2, 2, 445, 446, 7, 49, 2, 2, 446, 447, 7, 49, 2, 2, 447, 451, 3, 2, 2, 2, 448, 450, 11, 2, 2, 2, 449, 448, 3, 2, 2, 2, 450, 453, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 451, 449, 3, 2, 2, 2, 452, 454, 3, 2, 2, 2, 453, 451, 3, 2, 2, 2, 454, 455, 7, 12, 2, 2, 455, 136, 3, 2, 2, 2, 456, 457, 7, 49, 2, 2, 457, 458, 7, 49, 2, 2, 458, 462, 3, 2, 2, 2, 459, 461, 11, 2, 2, 2, 460, 459, 3, 2, 2, 2, 461, 464, 3, 2, 2, 2, 462, 463, 3, 2, 2, 2, 462, 460, 3, 2, 2, 2, 463, 465, 3, 2, 2, 2, 464, 462, 3, 2, 2, 2, 465, 466, 7, 12, 2, 2, 466, 467, 3, 2, 2, 2, 467, 468, 8, 69, 2, 2, 468, 138, 3, 2, 2, 2, 469, 470, 7, 49, 2, 2, 470, 471, 7, 44, 2, 2, 471, 475, 3, 2, 2, 2, 472, 474, 11, 2, 2, 2, 473, 472, 3, 2, 2, 2, 474, 477, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 475, 473, 3, 2, 2, 2, 476, 478, 3, 2, 2, 2, 477, 475, 3, 2, 2, 2, 478, 479, 7, 44, 2, 2, 479, 480, 7, 49, 2, 2, 480, 481, 3, 2, 2, 2, 481, 482, 8, 70, 2, 2, 482, 140, 3, 2, 2, 2, 483, 485, 9, 9, 2, 2, 484, 483, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 484, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 489, 8, 71, 2, 2, 489, 142, 3, 2, 2, 2, 20, 2, 304, 318, 325, 327, 337, 339, 342, 418, 425, 427, 433, 440, 442, 451, 462, 475, 486, 3, 8, 2, 2] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 2, 72, 490, 8, 1, 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, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 7, 41, 303, 10, 41, 12, 41, 14, 41, 306, 11, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 319, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 326, 10, 43, 12, 43, 14, 43, 329, 11, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 338, 10, 43, 12, 43, 14, 43, 341, 11, 43, 5, 43, 343, 10, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 51, 3, 51, 3, 52, 3, 52, 3, 53, 3, 53, 3, 54, 3, 54, 3, 55, 3, 55, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 62, 3, 62, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 7, 66, 417, 10, 66, 12, 66, 14, 66, 420, 11, 66, 3, 66, 3, 66, 6, 66, 424, 10, 66, 13, 66, 14, 66, 425, 5, 66, 428, 10, 66, 3, 67, 3, 67, 7, 67, 432, 10, 67, 12, 67, 14, 67, 435, 11, 67, 3, 67, 3, 67, 6, 67, 439, 10, 67, 13, 67, 14, 67, 440, 5, 67, 443, 10, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 7, 68, 450, 10, 68, 12, 68, 14, 68, 453, 11, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 7, 69, 461, 10, 69, 12, 69, 14, 69, 464, 11, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 7, 70, 474, 10, 70, 12, 70, 14, 70, 477, 11, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 6, 71, 485, 10, 71, 13, 71, 14, 71, 486, 3, 71, 3, 71, 6, 304, 451, 462, 475, 2, 2, 72, 3, 2, 3, 5, 2, 4, 7, 2, 5, 9, 2, 6, 11, 2, 7, 13, 2, 8, 15, 2, 9, 17, 2, 10, 19, 2, 11, 21, 2, 12, 23, 2, 13, 25, 2, 14, 27, 2, 15, 29, 2, 16, 31, 2, 17, 33, 2, 18, 35, 2, 19, 37, 2, 20, 39, 2, 21, 41, 2, 22, 43, 2, 23, 45, 2, 24, 47, 2, 25, 49, 2, 26, 51, 2, 27, 53, 2, 28, 55, 2, 29, 57, 2, 30, 59, 2, 31, 61, 2, 32, 63, 2, 33, 65, 2, 34, 67, 2, 35, 69, 2, 36, 71, 2, 37, 73, 2, 38, 75, 2, 39, 77, 2, 40, 79, 2, 41, 81, 2, 42, 83, 2, 43, 85, 2, 44, 87, 2, 45, 89, 2, 46, 91, 2, 47, 93, 2, 48, 95, 2, 49, 97, 2, 50, 99, 2, 51, 101, 2, 52, 103, 2, 53, 105, 2, 54, 107, 2, 55, 109, 2, 56, 111, 2, 57, 113, 2, 58, 115, 2, 59, 117, 2, 60, 119, 2, 61, 121, 2, 62, 123, 2, 63, 125, 2, 64, 127, 2, 65, 129, 2, 66, 131, 2, 67, 133, 2, 68, 135, 2, 69, 137, 2, 70, 139, 2, 71, 141, 2, 72, 3, 2, 10, 3, 2, 51, 59, 3, 2, 50, 59, 5, 2, 50, 59, 67, 72, 99, 104, 3, 2, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 3, 2, 97, 97, 3, 2, 67, 92, 5, 2, 11, 12, 15, 15, 34, 34, 2, 507, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 3, 143, 3, 2, 2, 2, 5, 150, 3, 2, 2, 2, 7, 152, 3, 2, 2, 2, 9, 154, 3, 2, 2, 2, 11, 160, 3, 2, 2, 2, 13, 162, 3, 2, 2, 2, 15, 166, 3, 2, 2, 2, 17, 173, 3, 2, 2, 2, 19, 175, 3, 2, 2, 2, 21, 177, 3, 2, 2, 2, 23, 182, 3, 2, 2, 2, 25, 184, 3, 2, 2, 2, 27, 186, 3, 2, 2, 2, 29, 188, 3, 2, 2, 2, 31, 192, 3, 2, 2, 2, 33, 196, 3, 2, 2, 2, 35, 201, 3, 2, 2, 2, 37, 208, 3, 2, 2, 2, 39, 212, 3, 2, 2, 2, 41, 221, 3, 2, 2, 2, 43, 228, 3, 2, 2, 2, 45, 235, 3, 2, 2, 2, 47, 237, 3, 2, 2, 2, 49, 242, 3, 2, 2, 2, 51, 245, 3, 2, 2, 2, 53, 252, 3, 2, 2, 2, 55, 255, 3, 2, 2, 2, 57, 258, 3, 2, 2, 2, 59, 262, 3, 2, 2, 2, 61, 266, 3, 2, 2, 2, 63, 271, 3, 2, 2, 2, 65, 273, 3, 2, 2, 2, 67, 275, 3, 2, 2, 2, 69, 279, 3, 2, 2, 2, 71, 283, 3, 2, 2, 2, 73, 286, 3, 2, 2, 2, 75, 291, 3, 2, 2, 2, 77, 293, 3, 2, 2, 2, 79, 297, 3, 2, 2, 2, 81, 300, 3, 2, 2, 2, 83, 318, 3, 2, 2, 2, 85, 342, 3, 2, 2, 2, 87, 344, 3, 2, 2, 2, 89, 348, 3, 2, 2, 2, 91, 351, 3, 2, 2, 2, 93, 355, 3, 2, 2, 2, 95, 363, 3, 2, 2, 2, 97, 367, 3, 2, 2, 2, 99, 373, 3, 2, 2, 2, 101, 375, 3, 2, 2, 2, 103, 377, 3, 2, 2, 2, 105, 379, 3, 2, 2, 2, 107, 381, 3, 2, 2, 2, 109, 383, 3, 2, 2, 2, 111, 385, 3, 2, 2, 2, 113, 387, 3, 2, 2, 2, 115, 390, 3, 2, 2, 2, 117, 393, 3, 2, 2, 2, 119, 396, 3, 2, 2, 2, 121, 399, 3, 2, 2, 2, 123, 401, 3, 2, 2, 2, 125, 403, 3, 2, 2, 2, 127, 405, 3, 2, 2, 2, 129, 409, 3, 2, 2, 2, 131, 427, 3, 2, 2, 2, 133, 442, 3, 2, 2, 2, 135, 444, 3, 2, 2, 2, 137, 456, 3, 2, 2, 2, 139, 469, 3, 2, 2, 2, 141, 484, 3, 2, 2, 2, 143, 144, 7, 111, 2, 2, 144, 145, 7, 113, 2, 2, 145, 146, 7, 102, 2, 2, 146, 147, 7, 119, 2, 2, 147, 148, 7, 110, 2, 2, 148, 149, 7, 103, 2, 2, 149, 4, 3, 2, 2, 2, 150, 151, 7, 125, 2, 2, 151, 6, 3, 2, 2, 2, 152, 153, 7, 127, 2, 2, 153, 8, 3, 2, 2, 2, 154, 155, 7, 101, 2, 2, 155, 156, 7, 113, 2, 2, 156, 157, 7, 112, 2, 2, 157, 158, 7, 117, 2, 2, 158, 159, 7, 118, 2, 2, 159, 10, 3, 2, 2, 2, 160, 161, 7, 60, 2, 2, 161, 12, 3, 2, 2, 2, 162, 163, 7, 120, 2, 2, 163, 164, 7, 99, 2, 2, 164, 165, 7, 116, 2, 2, 165, 14, 3, 2, 2, 2, 166, 167, 7, 99, 2, 2, 167, 168, 7, 117, 2, 2, 168, 169, 7, 117, 2, 2, 169, 170, 7, 119, 2, 2, 170, 171, 7, 111, 2, 2, 171, 172, 7, 103, 2, 2, 172, 16, 3, 2, 2, 2, 173, 174, 7, 46, 2, 2, 174, 18, 3, 2, 2, 2, 175, 176, 7, 61, 2, 2, 176, 20, 3, 2, 2, 2, 177, 178, 7, 118, 2, 2, 178, 179, 7, 123, 2, 2, 179, 180, 7, 114, 2, 2, 180, 181, 7, 103, 2, 2, 181, 22, 3, 2, 2, 2, 182, 183, 7, 93, 2, 2, 183, 24, 3, 2, 2, 2, 184, 185, 7, 95, 2, 2, 185, 26, 3, 2, 2, 2, 186, 187, 7, 126, 2, 2, 187, 28, 3, 2, 2, 2, 188, 189, 7, 120, 2, 2, 189, 190, 7, 99, 2, 2, 190, 191, 7, 110, 2, 2, 191, 30, 3, 2, 2, 2, 192, 193, 7, 102, 2, 2, 193, 194, 7, 103, 2, 2, 194, 195, 7, 104, 2, 2, 195, 32, 3, 2, 2, 2, 196, 197, 7, 114, 2, 2, 197, 198, 7, 119, 2, 2, 198, 199, 7, 116, 2, 2, 199, 200, 7, 103, 2, 2, 200, 34, 3, 2, 2, 2, 201, 202, 7, 99, 2, 2, 202, 203, 7, 101, 2, 2, 203, 204, 7, 118, 2, 2, 204, 205, 7, 107, 2, 2, 205, 206, 7, 113, 2, 2, 206, 207, 7, 112, 2, 2, 207, 36, 3, 2, 2, 2, 208, 209, 7, 116, 2, 2, 209, 210, 7, 119, 2, 2, 210, 211, 7, 112, 2, 2, 211, 38, 3, 2, 2, 2, 212, 213, 7, 118, 2, 2, 213, 214, 7, 103, 2, 2, 214, 215, 7, 111, 2, 2, 215, 216, 7, 114, 2, 2, 216, 217, 7, 113, 2, 2, 217, 218, 7, 116, 2, 2, 218, 219, 7, 99, 2, 2, 219, 220, 7, 110, 2, 2, 220, 40, 3, 2, 2, 2, 221, 222, 7, 112, 2, 2, 222, 223, 7, 113, 2, 2, 223, 224, 7, 112, 2, 2, 224, 225, 7, 102, 2, 2, 225, 226, 7, 103, 2, 2, 226, 227, 7, 118, 2, 2, 227, 42, 3, 2, 2, 2, 228, 229, 7, 107, 2, 2, 229, 230, 7, 111, 2, 2, 230, 231, 7, 114, 2, 2, 231, 232, 7, 113, 2, 2, 232, 233, 7, 116, 2, 2, 233, 234, 7, 118, 2, 2, 234, 44, 3, 2, 2, 2, 235, 236, 7, 48, 2, 2, 236, 46, 3, 2, 2, 2, 237, 238, 7, 104, 2, 2, 238, 239, 7, 116, 2, 2, 239, 240, 7, 113, 2, 2, 240, 241, 7, 111, 2, 2, 241, 48, 3, 2, 2, 2, 242, 243, 7, 99, 2, 2, 243, 244, 7, 117, 2, 2, 244, 50, 3, 2, 2, 2, 245, 246, 7, 103, 2, 2, 246, 247, 7, 122, 2, 2, 247, 248, 7, 114, 2, 2, 248, 249, 7, 113, 2, 2, 249, 250, 7, 116, 2, 2, 250, 251, 7, 118, 2, 2, 251, 52, 3, 2, 2, 2, 252, 253, 7, 47, 2, 2, 253, 254, 7, 64, 2, 2, 254, 54, 3, 2, 2, 2, 255, 256, 7, 63, 2, 2, 256, 257, 7, 64, 2, 2, 257, 56, 3, 2, 2, 2, 258, 259, 7, 107, 2, 2, 259, 260, 7, 112, 2, 2, 260, 261, 7, 118, 2, 2, 261, 58, 3, 2, 2, 2, 262, 263, 7, 117, 2, 2, 263, 264, 7, 118, 2, 2, 264, 265, 7, 116, 2, 2, 265, 60, 3, 2, 2, 2, 266, 267, 7, 100, 2, 2, 267, 268, 7, 113, 2, 2, 268, 269, 7, 113, 2, 2, 269, 270, 7, 110, 2, 2, 270, 62, 3, 2, 2, 2, 271, 272, 7, 96, 2, 2, 272, 64, 3, 2, 2, 2, 273, 274, 7, 41, 2, 2, 274, 66, 3, 2, 2, 2, 275, 276, 7, 99, 2, 2, 276, 277, 7, 110, 2, 2, 277, 278, 7, 110, 2, 2, 278, 68, 3, 2, 2, 2, 279, 280, 7, 99, 2, 2, 280, 281, 7, 112, 2, 2, 281, 282, 7, 123, 2, 2, 282, 70, 3, 2, 2, 2, 283, 284, 7, 107, 2, 2, 284, 285, 7, 104, 2, 2, 285, 72, 3, 2, 2, 2, 286, 287, 7, 103, 2, 2, 287, 288, 7, 110, 2, 2, 288, 289, 7, 117, 2, 2, 289, 290, 7, 103, 2, 2, 290, 74, 3, 2, 2, 2, 291, 292, 7, 97, 2, 2, 292, 76, 3, 2, 2, 2, 293, 294, 7, 48, 2, 2, 294, 295, 7, 48, 2, 2, 295, 296, 7, 48, 2, 2, 296, 78, 3, 2, 2, 2, 297, 298, 7, 60, 2, 2, 298, 299, 7, 60, 2, 2, 299, 80, 3, 2, 2, 2, 300, 304, 7, 36, 2, 2, 301, 303, 11, 2, 2, 2, 302, 301, 3, 2, 2, 2, 303, 306, 3, 2, 2, 2, 304, 305, 3, 2, 2, 2, 304, 302, 3, 2, 2, 2, 305, 307, 3, 2, 2, 2, 306, 304, 3, 2, 2, 2, 307, 308, 7, 36, 2, 2, 308, 82, 3, 2, 2, 2, 309, 310, 7, 104, 2, 2, 310, 311, 7, 99, 2, 2, 311, 312, 7, 110, 2, 2, 312, 313, 7, 117, 2, 2, 313, 319, 7, 103, 2, 2, 314, 315, 7, 118, 2, 2, 315, 316, 7, 116, 2, 2, 316, 317, 7, 119, 2, 2, 317, 319, 7, 103, 2, 2, 318, 309, 3, 2, 2, 2, 318, 314, 3, 2, 2, 2, 319, 84, 3, 2, 2, 2, 320, 343, 7, 50, 2, 2, 321, 327, 9, 2, 2, 2, 322, 326, 9, 3, 2, 2, 323, 324, 7, 97, 2, 2, 324, 326, 9, 3, 2, 2, 325, 322, 3, 2, 2, 2, 325, 323, 3, 2, 2, 2, 326, 329, 3, 2, 2, 2, 327, 325, 3, 2, 2, 2, 327, 328, 3, 2, 2, 2, 328, 343, 3, 2, 2, 2, 329, 327, 3, 2, 2, 2, 330, 331, 7, 50, 2, 2, 331, 332, 7, 122, 2, 2, 332, 333, 3, 2, 2, 2, 333, 339, 9, 4, 2, 2, 334, 338, 9, 4, 2, 2, 335, 336, 7, 97, 2, 2, 336, 338, 9, 4, 2, 2, 337, 334, 3, 2, 2, 2, 337, 335, 3, 2, 2, 2, 338, 341, 3, 2, 2, 2, 339, 337, 3, 2, 2, 2, 339, 340, 3, 2, 2, 2, 340, 343, 3, 2, 2, 2, 341, 339, 3, 2, 2, 2, 342, 320, 3, 2, 2, 2, 342, 321, 3, 2, 2, 2, 342, 330, 3, 2, 2, 2, 343, 86, 3, 2, 2, 2, 344, 345, 7, 99, 2, 2, 345, 346, 7, 112, 2, 2, 346, 347, 7, 102, 2, 2, 347, 88, 3, 2, 2, 2, 348, 349, 7, 113, 2, 2, 349, 350, 7, 116, 2, 2, 350, 90, 3, 2, 2, 2, 351, 352, 7, 107, 2, 2, 352, 353, 7, 104, 2, 2, 353, 354, 7, 104, 2, 2, 354, 92, 3, 2, 2, 2, 355, 356, 7, 107, 2, 2, 356, 357, 7, 111, 2, 2, 357, 358, 7, 114, 2, 2, 358, 359, 7, 110, 2, 2, 359, 360, 7, 107, 2, 2, 360, 361, 7, 103, 2, 2, 361, 362, 7, 117, 2, 2, 362, 94, 3, 2, 2, 2, 363, 364, 7, 79, 2, 2, 364, 365, 7, 99, 2, 2, 365, 366, 7, 114, 2, 2, 366, 96, 3, 2, 2, 2, 367, 368, 7, 111, 2, 2, 368, 369, 7, 99, 2, 2, 369, 370, 7, 118, 2, 2, 370, 371, 7, 101, 2, 2, 371, 372, 7, 106, 2, 2, 372, 98, 3, 2, 2, 2, 373, 374, 7, 45, 2, 2, 374, 100, 3, 2, 2, 2, 375, 376, 7, 47, 2, 2, 376, 102, 3, 2, 2, 2, 377, 378, 7, 44, 2, 2, 378, 104, 3, 2, 2, 2, 379, 380, 7, 49, 2, 2, 380, 106, 3, 2, 2, 2, 381, 382, 7, 39, 2, 2, 382, 108, 3, 2, 2, 2, 383, 384, 7, 64, 2, 2, 384, 110, 3, 2, 2, 2, 385, 386, 7, 62, 2, 2, 386, 112, 3, 2, 2, 2, 387, 388, 7, 64, 2, 2, 388, 389, 7, 63, 2, 2, 389, 114, 3, 2, 2, 2, 390, 391, 7, 62, 2, 2, 391, 392, 7, 63, 2, 2, 392, 116, 3, 2, 2, 2, 393, 394, 7, 35, 2, 2, 394, 395, 7, 63, 2, 2, 395, 118, 3, 2, 2, 2, 396, 397, 7, 63, 2, 2, 397, 398, 7, 63, 2, 2, 398, 120, 3, 2, 2, 2, 399, 400, 7, 63, 2, 2, 400, 122, 3, 2, 2, 2, 401, 402, 7, 42, 2, 2, 402, 124, 3, 2, 2, 2, 403, 404, 7, 43, 2, 2, 404, 126, 3, 2, 2, 2, 405, 406, 7, 85, 2, 2, 406, 407, 7, 103, 2, 2, 407, 408, 7, 118, 2, 2, 408, 128, 3, 2, 2, 2, 409, 410, 7, 78, 2, 2, 410, 411, 7, 107, 2, 2, 411, 412, 7, 117, 2, 2, 412, 413, 7, 118, 2, 2, 413, 130, 3, 2, 2, 2, 414, 418, 9, 5, 2, 2, 415, 417, 9, 6, 2, 2, 416, 415, 3, 2, 2, 2, 417, 420, 3, 2, 2, 2, 418, 416, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 428, 3, 2, 2, 2, 420, 418, 3, 2, 2, 2, 421, 423, 9, 7, 2, 2, 422, 424, 9, 6, 2, 2, 423, 422, 3, 2, 2, 2, 424, 425, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 428, 3, 2, 2, 2, 427, 414, 3, 2, 2, 2, 427, 421, 3, 2, 2, 2, 428, 132, 3, 2, 2, 2, 429, 433, 9, 8, 2, 2, 430, 432, 9, 6, 2, 2, 431, 430, 3, 2, 2, 2, 432, 435, 3, 2, 2, 2, 433, 431, 3, 2, 2, 2, 433, 434, 3, 2, 2, 2, 434, 443, 3, 2, 2, 2, 435, 433, 3, 2, 2, 2, 436, 438, 9, 7, 2, 2, 437, 439, 9, 6, 2, 2, 438, 437, 3, 2, 2, 2, 439, 440, 3, 2, 2, 2, 440, 438, 3, 2, 2, 2, 440, 441, 3, 2, 2, 2, 441, 443, 3, 2, 2, 2, 442, 429, 3, 2, 2, 2, 442, 436, 3, 2, 2, 2, 443, 134, 3, 2, 2, 2, 444, 445, 7, 49, 2, 2, 445, 446, 7, 49, 2, 2, 446, 447, 7, 49, 2, 2, 447, 451, 3, 2, 2, 2, 448, 450, 11, 2, 2, 2, 449, 448, 3, 2, 2, 2, 450, 453, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 451, 449, 3, 2, 2, 2, 452, 454, 3, 2, 2, 2, 453, 451, 3, 2, 2, 2, 454, 455, 7, 12, 2, 2, 455, 136, 3, 2, 2, 2, 456, 457, 7, 49, 2, 2, 457, 458, 7, 49, 2, 2, 458, 462, 3, 2, 2, 2, 459, 461, 11, 2, 2, 2, 460, 459, 3, 2, 2, 2, 461, 464, 3, 2, 2, 2, 462, 463, 3, 2, 2, 2, 462, 460, 3, 2, 2, 2, 463, 465, 3, 2, 2, 2, 464, 462, 3, 2, 2, 2, 465, 466, 7, 12, 2, 2, 466, 467, 3, 2, 2, 2, 467, 468, 8, 69, 2, 2, 468, 138, 3, 2, 2, 2, 469, 470, 7, 49, 2, 2, 470, 471, 7, 44, 2, 2, 471, 475, 3, 2, 2, 2, 472, 474, 11, 2, 2, 2, 473, 472, 3, 2, 2, 2, 474, 477, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 475, 473, 3, 2, 2, 2, 476, 478, 3, 2, 2, 2, 477, 475, 3, 2, 2, 2, 478, 479, 7, 44, 2, 2, 479, 480, 7, 49, 2, 2, 480, 481, 3, 2, 2, 2, 481, 482, 8, 70, 2, 2, 482, 140, 3, 2, 2, 2, 483, 485, 9, 9, 2, 2, 484, 483, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 484, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 489, 8, 71, 2, 2, 489, 142, 3, 2, 2, 2, 20, 2, 304, 318, 325, 327, 337, 339, 342, 418, 425, 427, 433, 440, 442, 451, 462, 475, 486, 3, 8, 2, 2] \ No newline at end of file diff --git a/quint/src/generated/QuintLexer.tokens b/quint/src/generated/QuintLexer.tokens index c8362598c..1d1d2dd5d 100644 --- a/quint/src/generated/QuintLexer.tokens +++ b/quint/src/generated/QuintLexer.tokens @@ -81,13 +81,13 @@ WS=70 '['=11 ']'=12 '|'=13 -'nondet'=14 -'val'=15 -'def'=16 -'pure'=17 -'action'=18 -'run'=19 -'temporal'=20 +'val'=14 +'def'=15 +'pure'=16 +'action'=17 +'run'=18 +'temporal'=19 +'nondet'=20 'import'=21 '.'=22 'from'=23 diff --git a/quint/src/generated/QuintLexer.ts b/quint/src/generated/QuintLexer.ts index 21060e0dd..dc195ec27 100644 --- a/quint/src/generated/QuintLexer.ts +++ b/quint/src/generated/QuintLexer.ts @@ -117,8 +117,8 @@ export class QuintLexer extends Lexer { private static readonly _LITERAL_NAMES: Array = [ undefined, "'module'", "'{'", "'}'", "'const'", "':'", "'var'", "'assume'", - "','", "';'", "'type'", "'['", "']'", "'|'", "'nondet'", "'val'", "'def'", - "'pure'", "'action'", "'run'", "'temporal'", "'import'", "'.'", "'from'", + "','", "';'", "'type'", "'['", "']'", "'|'", "'val'", "'def'", "'pure'", + "'action'", "'run'", "'temporal'", "'nondet'", "'import'", "'.'", "'from'", "'as'", "'export'", "'->'", "'=>'", "'int'", "'str'", "'bool'", "'^'", "'''", "'all'", "'any'", "'if'", "'else'", "'_'", "'...'", "'::'", undefined, undefined, undefined, "'and'", "'or'", "'iff'", "'implies'", "'Map'", @@ -184,10 +184,10 @@ export class QuintLexer extends Lexer { "\x05\x03\x06\x03\x06\x03\x07\x03\x07\x03\x07\x03\x07\x03\b\x03\b\x03\b" + "\x03\b\x03\b\x03\b\x03\b\x03\t\x03\t\x03\n\x03\n\x03\v\x03\v\x03\v\x03" + "\v\x03\v\x03\f\x03\f\x03\r\x03\r\x03\x0E\x03\x0E\x03\x0F\x03\x0F\x03\x0F" + - "\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x10\x03\x10\x03\x10\x03\x10\x03\x11" + - "\x03\x11\x03\x11\x03\x11\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x13" + - "\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x14\x03\x14\x03\x14" + - "\x03\x14\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15" + + "\x03\x0F\x03\x10\x03\x10\x03\x10\x03\x10\x03\x11\x03\x11\x03\x11\x03\x11" + + "\x03\x11\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x13" + + "\x03\x13\x03\x13\x03\x13\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + + "\x03\x14\x03\x14\x03\x14\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15" + "\x03\x15\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x17" + "\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x19\x03\x19\x03\x19" + "\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1B\x03\x1B" + @@ -246,9 +246,9 @@ export class QuintLexer extends Lexer { "\x02\x02\v\xA0\x03\x02\x02\x02\r\xA2\x03\x02\x02\x02\x0F\xA6\x03\x02\x02" + "\x02\x11\xAD\x03\x02\x02\x02\x13\xAF\x03\x02\x02\x02\x15\xB1\x03\x02\x02" + "\x02\x17\xB6\x03\x02\x02\x02\x19\xB8\x03\x02\x02\x02\x1B\xBA\x03\x02\x02" + - "\x02\x1D\xBC\x03\x02\x02\x02\x1F\xC3\x03\x02\x02\x02!\xC7\x03\x02\x02" + - "\x02#\xCB\x03\x02\x02\x02%\xD0\x03\x02\x02\x02\'\xD7\x03\x02\x02\x02)" + - "\xDB\x03\x02\x02\x02+\xE4\x03\x02\x02\x02-\xEB\x03\x02\x02\x02/\xED\x03" + + "\x02\x1D\xBC\x03\x02\x02\x02\x1F\xC0\x03\x02\x02\x02!\xC4\x03\x02\x02" + + "\x02#\xC9\x03\x02\x02\x02%\xD0\x03\x02\x02\x02\'\xD4\x03\x02\x02\x02)" + + "\xDD\x03\x02\x02\x02+\xE4\x03\x02\x02\x02-\xEB\x03\x02\x02\x02/\xED\x03" + "\x02\x02\x021\xF2\x03\x02\x02\x023\xF5\x03\x02\x02\x025\xFC\x03\x02\x02" + "\x027\xFF\x03\x02\x02\x029\u0102\x03\x02\x02\x02;\u0106\x03\x02\x02\x02" + "=\u010A\x03\x02\x02\x02?\u010F\x03\x02\x02\x02A\u0111\x03\x02\x02\x02" + @@ -279,29 +279,29 @@ export class QuintLexer extends Lexer { "\xB3\xB4\x07r\x02\x02\xB4\xB5\x07g\x02\x02\xB5\x16\x03\x02\x02\x02\xB6" + "\xB7\x07]\x02\x02\xB7\x18\x03\x02\x02\x02\xB8\xB9\x07_\x02\x02\xB9\x1A" + "\x03\x02\x02\x02\xBA\xBB\x07~\x02\x02\xBB\x1C\x03\x02\x02\x02\xBC\xBD" + - "\x07p\x02\x02\xBD\xBE\x07q\x02\x02\xBE\xBF\x07p\x02\x02\xBF\xC0\x07f\x02" + - "\x02\xC0\xC1\x07g\x02\x02\xC1\xC2\x07v\x02\x02\xC2\x1E\x03\x02\x02\x02" + - "\xC3\xC4\x07x\x02\x02\xC4\xC5\x07c\x02\x02\xC5\xC6\x07n\x02\x02\xC6 \x03" + - "\x02\x02\x02\xC7\xC8\x07f\x02\x02\xC8\xC9\x07g\x02\x02\xC9\xCA\x07h\x02" + - "\x02\xCA\"\x03\x02\x02\x02\xCB\xCC\x07r\x02\x02\xCC\xCD\x07w\x02\x02\xCD" + - "\xCE\x07t\x02\x02\xCE\xCF\x07g\x02\x02\xCF$\x03\x02\x02\x02\xD0\xD1\x07" + - "c\x02\x02\xD1\xD2\x07e\x02\x02\xD2\xD3\x07v\x02\x02\xD3\xD4\x07k\x02\x02" + - "\xD4\xD5\x07q\x02\x02\xD5\xD6\x07p\x02\x02\xD6&\x03\x02\x02\x02\xD7\xD8" + - "\x07t\x02\x02\xD8\xD9\x07w\x02\x02\xD9\xDA\x07p\x02\x02\xDA(\x03\x02\x02" + - "\x02\xDB\xDC\x07v\x02\x02\xDC\xDD\x07g\x02\x02\xDD\xDE\x07o\x02\x02\xDE" + - "\xDF\x07r\x02\x02\xDF\xE0\x07q\x02\x02\xE0\xE1\x07t\x02\x02\xE1\xE2\x07" + - "c\x02\x02\xE2\xE3\x07n\x02\x02\xE3*\x03\x02\x02\x02\xE4\xE5\x07k\x02\x02" + - "\xE5\xE6\x07o\x02\x02\xE6\xE7\x07r\x02\x02\xE7\xE8\x07q\x02\x02\xE8\xE9" + - "\x07t\x02\x02\xE9\xEA\x07v\x02\x02\xEA,\x03\x02\x02\x02\xEB\xEC\x070\x02" + - "\x02\xEC.\x03\x02\x02\x02\xED\xEE\x07h\x02\x02\xEE\xEF\x07t\x02\x02\xEF" + - "\xF0\x07q\x02\x02\xF0\xF1\x07o\x02\x02\xF10\x03\x02\x02\x02\xF2\xF3\x07" + - "c\x02\x02\xF3\xF4\x07u\x02\x02\xF42\x03\x02\x02\x02\xF5\xF6\x07g\x02\x02" + - "\xF6\xF7\x07z\x02\x02\xF7\xF8\x07r\x02\x02\xF8\xF9\x07q\x02\x02\xF9\xFA" + - "\x07t\x02\x02\xFA\xFB\x07v\x02\x02\xFB4\x03\x02\x02\x02\xFC\xFD\x07/\x02" + - "\x02\xFD\xFE\x07@\x02\x02\xFE6\x03\x02\x02\x02\xFF\u0100\x07?\x02\x02" + - "\u0100\u0101\x07@\x02\x02\u01018\x03\x02\x02\x02\u0102\u0103\x07k\x02" + - "\x02\u0103\u0104\x07p\x02\x02\u0104\u0105\x07v\x02\x02\u0105:\x03\x02" + - "\x02\x02\u0106\u0107\x07u\x02\x02\u0107\u0108\x07v\x02\x02\u0108\u0109" + + "\x07x\x02\x02\xBD\xBE\x07c\x02\x02\xBE\xBF\x07n\x02\x02\xBF\x1E\x03\x02" + + "\x02\x02\xC0\xC1\x07f\x02\x02\xC1\xC2\x07g\x02\x02\xC2\xC3\x07h\x02\x02" + + "\xC3 \x03\x02\x02\x02\xC4\xC5\x07r\x02\x02\xC5\xC6\x07w\x02\x02\xC6\xC7" + + "\x07t\x02\x02\xC7\xC8\x07g\x02\x02\xC8\"\x03\x02\x02\x02\xC9\xCA\x07c" + + "\x02\x02\xCA\xCB\x07e\x02\x02\xCB\xCC\x07v\x02\x02\xCC\xCD\x07k\x02\x02" + + "\xCD\xCE\x07q\x02\x02\xCE\xCF\x07p\x02\x02\xCF$\x03\x02\x02\x02\xD0\xD1" + + "\x07t\x02\x02\xD1\xD2\x07w\x02\x02\xD2\xD3\x07p\x02\x02\xD3&\x03\x02\x02" + + "\x02\xD4\xD5\x07v\x02\x02\xD5\xD6\x07g\x02\x02\xD6\xD7\x07o\x02\x02\xD7" + + "\xD8\x07r\x02\x02\xD8\xD9\x07q\x02\x02\xD9\xDA\x07t\x02\x02\xDA\xDB\x07" + + "c\x02\x02\xDB\xDC\x07n\x02\x02\xDC(\x03\x02\x02\x02\xDD\xDE\x07p\x02\x02" + + "\xDE\xDF\x07q\x02\x02\xDF\xE0\x07p\x02\x02\xE0\xE1\x07f\x02\x02\xE1\xE2" + + "\x07g\x02\x02\xE2\xE3\x07v\x02\x02\xE3*\x03\x02\x02\x02\xE4\xE5\x07k\x02" + + "\x02\xE5\xE6\x07o\x02\x02\xE6\xE7\x07r\x02\x02\xE7\xE8\x07q\x02\x02\xE8" + + "\xE9\x07t\x02\x02\xE9\xEA\x07v\x02\x02\xEA,\x03\x02\x02\x02\xEB\xEC\x07" + + "0\x02\x02\xEC.\x03\x02\x02\x02\xED\xEE\x07h\x02\x02\xEE\xEF\x07t\x02\x02" + + "\xEF\xF0\x07q\x02\x02\xF0\xF1\x07o\x02\x02\xF10\x03\x02\x02\x02\xF2\xF3" + + "\x07c\x02\x02\xF3\xF4\x07u\x02\x02\xF42\x03\x02\x02\x02\xF5\xF6\x07g\x02" + + "\x02\xF6\xF7\x07z\x02\x02\xF7\xF8\x07r\x02\x02\xF8\xF9\x07q\x02\x02\xF9" + + "\xFA\x07t\x02\x02\xFA\xFB\x07v\x02\x02\xFB4\x03\x02\x02\x02\xFC\xFD\x07" + + "/\x02\x02\xFD\xFE\x07@\x02\x02\xFE6\x03\x02\x02\x02\xFF\u0100\x07?\x02" + + "\x02\u0100\u0101\x07@\x02\x02\u01018\x03\x02\x02\x02\u0102\u0103\x07k" + + "\x02\x02\u0103\u0104\x07p\x02\x02\u0104\u0105\x07v\x02\x02\u0105:\x03" + + "\x02\x02\x02\u0106\u0107\x07u\x02\x02\u0107\u0108\x07v\x02\x02\u0108\u0109" + "\x07t\x02\x02\u0109<\x03\x02\x02\x02\u010A\u010B\x07d\x02\x02\u010B\u010C" + "\x07q\x02\x02\u010C\u010D\x07q\x02\x02\u010D\u010E\x07n\x02\x02\u010E" + ">\x03\x02\x02\x02\u010F\u0110\x07`\x02\x02\u0110@\x03\x02\x02\x02\u0111" + diff --git a/quint/src/generated/QuintListener.ts b/quint/src/generated/QuintListener.ts index 794ecca5c..6c4ff86c6 100644 --- a/quint/src/generated/QuintListener.ts +++ b/quint/src/generated/QuintListener.ts @@ -54,7 +54,6 @@ import { RecordContext } from "./QuintParser"; import { ListContext } from "./QuintParser"; import { IfElseContext } from "./QuintParser"; import { LetInContext } from "./QuintParser"; -import { NondetContext } from "./QuintParser"; import { ParenContext } from "./QuintParser"; import { BracesContext } from "./QuintParser"; import { AnnotatedOperDefContext } from "./QuintParser"; @@ -76,7 +75,6 @@ import { TypeDefContext } from "./QuintParser"; import { TypeDefHeadContext } from "./QuintParser"; import { SumTypeDefinitionContext } from "./QuintParser"; import { TypeSumVariantContext } from "./QuintParser"; -import { NondetOperDefContext } from "./QuintParser"; import { QualifierContext } from "./QuintParser"; import { ImportModContext } from "./QuintParser"; import { ExportModContext } from "./QuintParser"; @@ -702,19 +700,6 @@ export interface QuintListener extends ParseTreeListener { */ exitLetIn?: (ctx: LetInContext) => void; - /** - * Enter a parse tree produced by the `nondet` - * labeled alternative in `QuintParser.expr`. - * @param ctx the parse tree - */ - enterNondet?: (ctx: NondetContext) => void; - /** - * Exit a parse tree produced by the `nondet` - * labeled alternative in `QuintParser.expr`. - * @param ctx the parse tree - */ - exitNondet?: (ctx: NondetContext) => void; - /** * Enter a parse tree produced by the `paren` * labeled alternative in `QuintParser.expr`. @@ -970,17 +955,6 @@ export interface QuintListener extends ParseTreeListener { */ exitTypeSumVariant?: (ctx: TypeSumVariantContext) => void; - /** - * Enter a parse tree produced by `QuintParser.nondetOperDef`. - * @param ctx the parse tree - */ - enterNondetOperDef?: (ctx: NondetOperDefContext) => void; - /** - * Exit a parse tree produced by `QuintParser.nondetOperDef`. - * @param ctx the parse tree - */ - exitNondetOperDef?: (ctx: NondetOperDefContext) => void; - /** * Enter a parse tree produced by `QuintParser.qualifier`. * @param ctx the parse tree diff --git a/quint/src/generated/QuintParser.ts b/quint/src/generated/QuintParser.ts index 0d88c2494..c4a7d6f24 100644 --- a/quint/src/generated/QuintParser.ts +++ b/quint/src/generated/QuintParser.ts @@ -113,56 +113,55 @@ export class QuintParser extends Parser { public static readonly RULE_typeDefHead = 6; public static readonly RULE_sumTypeDefinition = 7; public static readonly RULE_typeSumVariant = 8; - public static readonly RULE_nondetOperDef = 9; - public static readonly RULE_qualifier = 10; - public static readonly RULE_importMod = 11; - public static readonly RULE_exportMod = 12; - public static readonly RULE_instanceMod = 13; - public static readonly RULE_moduleName = 14; - public static readonly RULE_name = 15; - public static readonly RULE_qualifiedName = 16; - public static readonly RULE_fromSource = 17; - public static readonly RULE_type = 18; - public static readonly RULE_typeVar = 19; - public static readonly RULE_row = 20; - public static readonly RULE_rowLabel = 21; - public static readonly RULE_expr = 22; - public static readonly RULE_matchSumExpr = 23; - public static readonly RULE_matchSumCase = 24; - public static readonly RULE_matchSumVariant = 25; - public static readonly RULE_declarationOrExpr = 26; - public static readonly RULE_lambda = 27; - public static readonly RULE_lambdaUnsugared = 28; - public static readonly RULE_lambdaTupleSugar = 29; - public static readonly RULE_identOrHole = 30; - public static readonly RULE_parameter = 31; - public static readonly RULE_annotatedParameter = 32; - public static readonly RULE_identOrStar = 33; - public static readonly RULE_argList = 34; - public static readonly RULE_recElem = 35; - public static readonly RULE_normalCallName = 36; - public static readonly RULE_nameAfterDot = 37; - public static readonly RULE_operator = 38; - public static readonly RULE_literal = 39; - public static readonly RULE_qualId = 40; - public static readonly RULE_simpleId = 41; - public static readonly RULE_identifier = 42; + public static readonly RULE_qualifier = 9; + public static readonly RULE_importMod = 10; + public static readonly RULE_exportMod = 11; + public static readonly RULE_instanceMod = 12; + public static readonly RULE_moduleName = 13; + public static readonly RULE_name = 14; + public static readonly RULE_qualifiedName = 15; + public static readonly RULE_fromSource = 16; + public static readonly RULE_type = 17; + public static readonly RULE_typeVar = 18; + public static readonly RULE_row = 19; + public static readonly RULE_rowLabel = 20; + public static readonly RULE_expr = 21; + public static readonly RULE_matchSumExpr = 22; + public static readonly RULE_matchSumCase = 23; + public static readonly RULE_matchSumVariant = 24; + public static readonly RULE_declarationOrExpr = 25; + public static readonly RULE_lambda = 26; + public static readonly RULE_lambdaUnsugared = 27; + public static readonly RULE_lambdaTupleSugar = 28; + public static readonly RULE_identOrHole = 29; + public static readonly RULE_parameter = 30; + public static readonly RULE_annotatedParameter = 31; + public static readonly RULE_identOrStar = 32; + public static readonly RULE_argList = 33; + public static readonly RULE_recElem = 34; + public static readonly RULE_normalCallName = 35; + public static readonly RULE_nameAfterDot = 36; + public static readonly RULE_operator = 37; + public static readonly RULE_literal = 38; + public static readonly RULE_qualId = 39; + public static readonly RULE_simpleId = 40; + public static readonly RULE_identifier = 41; // tslint:disable:no-trailing-whitespace public static readonly ruleNames: string[] = [ "modules", "module", "documentedDeclaration", "declaration", "operDef", - "typeDef", "typeDefHead", "sumTypeDefinition", "typeSumVariant", "nondetOperDef", - "qualifier", "importMod", "exportMod", "instanceMod", "moduleName", "name", - "qualifiedName", "fromSource", "type", "typeVar", "row", "rowLabel", "expr", - "matchSumExpr", "matchSumCase", "matchSumVariant", "declarationOrExpr", - "lambda", "lambdaUnsugared", "lambdaTupleSugar", "identOrHole", "parameter", - "annotatedParameter", "identOrStar", "argList", "recElem", "normalCallName", - "nameAfterDot", "operator", "literal", "qualId", "simpleId", "identifier", + "typeDef", "typeDefHead", "sumTypeDefinition", "typeSumVariant", "qualifier", + "importMod", "exportMod", "instanceMod", "moduleName", "name", "qualifiedName", + "fromSource", "type", "typeVar", "row", "rowLabel", "expr", "matchSumExpr", + "matchSumCase", "matchSumVariant", "declarationOrExpr", "lambda", "lambdaUnsugared", + "lambdaTupleSugar", "identOrHole", "parameter", "annotatedParameter", + "identOrStar", "argList", "recElem", "normalCallName", "nameAfterDot", + "operator", "literal", "qualId", "simpleId", "identifier", ]; private static readonly _LITERAL_NAMES: Array = [ undefined, "'module'", "'{'", "'}'", "'const'", "':'", "'var'", "'assume'", - "','", "';'", "'type'", "'['", "']'", "'|'", "'nondet'", "'val'", "'def'", - "'pure'", "'action'", "'run'", "'temporal'", "'import'", "'.'", "'from'", + "','", "';'", "'type'", "'['", "']'", "'|'", "'val'", "'def'", "'pure'", + "'action'", "'run'", "'temporal'", "'nondet'", "'import'", "'.'", "'from'", "'as'", "'export'", "'->'", "'=>'", "'int'", "'str'", "'bool'", "'^'", "'''", "'all'", "'any'", "'if'", "'else'", "'_'", "'...'", "'::'", undefined, undefined, undefined, "'and'", "'or'", "'iff'", "'implies'", "'Map'", @@ -215,21 +214,21 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 87; + this.state = 85; this._errHandler.sync(this); _la = this._input.LA(1); do { { { - this.state = 86; + this.state = 84; this.module(); } } - this.state = 89; + this.state = 87; this._errHandler.sync(this); _la = this._input.LA(1); } while (_la === QuintParser.T__0 || _la === QuintParser.DOCCOMMENT); - this.state = 91; + this.state = 89; this.match(QuintParser.EOF); } } @@ -255,41 +254,41 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 96; + this.state = 94; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.DOCCOMMENT) { { { - this.state = 93; + this.state = 91; this.match(QuintParser.DOCCOMMENT); } } - this.state = 98; + this.state = 96; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 99; + this.state = 97; this.match(QuintParser.T__0); - this.state = 100; + this.state = 98; this.qualId(); - this.state = 101; + this.state = 99; this.match(QuintParser.T__1); - this.state = 105; + this.state = 103; this._errHandler.sync(this); _la = this._input.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__3) | (1 << QuintParser.T__5) | (1 << QuintParser.T__6) | (1 << QuintParser.T__9) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19) | (1 << QuintParser.T__20) | (1 << QuintParser.T__24))) !== 0) || _la === QuintParser.DOCCOMMENT) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__3) | (1 << QuintParser.T__5) | (1 << QuintParser.T__6) | (1 << QuintParser.T__9) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19) | (1 << QuintParser.T__20) | (1 << QuintParser.T__24))) !== 0) || _la === QuintParser.DOCCOMMENT) { { { - this.state = 102; + this.state = 100; this.documentedDeclaration(); } } - this.state = 107; + this.state = 105; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 108; + this.state = 106; this.match(QuintParser.T__2); } } @@ -315,21 +314,21 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 113; + this.state = 111; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.DOCCOMMENT) { { { - this.state = 110; + this.state = 108; this.match(QuintParser.DOCCOMMENT); } } - this.state = 115; + this.state = 113; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 116; + this.state = 114; this.declaration(); } } @@ -352,20 +351,20 @@ export class QuintParser extends Parser { let _localctx: DeclarationContext = new DeclarationContext(this._ctx, this.state); this.enterRule(_localctx, 6, QuintParser.RULE_declaration); try { - this.state = 138; + this.state = 136; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 4, this._ctx) ) { case 1: _localctx = new ConstContext(_localctx); this.enterOuterAlt(_localctx, 1); { - this.state = 118; + this.state = 116; this.match(QuintParser.T__3); - this.state = 119; + this.state = 117; this.qualId(); - this.state = 120; + this.state = 118; this.match(QuintParser.T__4); - this.state = 121; + this.state = 119; this.type(0); } break; @@ -374,13 +373,13 @@ export class QuintParser extends Parser { _localctx = new VarContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 123; + this.state = 121; this.match(QuintParser.T__5); - this.state = 124; + this.state = 122; this.qualId(); - this.state = 125; + this.state = 123; this.match(QuintParser.T__4); - this.state = 126; + this.state = 124; this.type(0); } break; @@ -389,15 +388,15 @@ export class QuintParser extends Parser { _localctx = new AssumeContext(_localctx); this.enterOuterAlt(_localctx, 3); { - this.state = 128; + this.state = 126; this.match(QuintParser.T__6); { - this.state = 129; + this.state = 127; (_localctx as AssumeContext)._assumeName = this.identOrHole(); } - this.state = 130; + this.state = 128; this.match(QuintParser.ASGN); - this.state = 131; + this.state = 129; this.expr(0); } break; @@ -406,7 +405,7 @@ export class QuintParser extends Parser { _localctx = new InstanceContext(_localctx); this.enterOuterAlt(_localctx, 4); { - this.state = 133; + this.state = 131; this.instanceMod(); } break; @@ -415,7 +414,7 @@ export class QuintParser extends Parser { _localctx = new OperContext(_localctx); this.enterOuterAlt(_localctx, 5); { - this.state = 134; + this.state = 132; this.operDef(); } break; @@ -424,7 +423,7 @@ export class QuintParser extends Parser { _localctx = new TypeDefsContext(_localctx); this.enterOuterAlt(_localctx, 6); { - this.state = 135; + this.state = 133; this.typeDef(); } break; @@ -433,7 +432,7 @@ export class QuintParser extends Parser { _localctx = new ImportDefContext(_localctx); this.enterOuterAlt(_localctx, 7); { - this.state = 136; + this.state = 134; this.importMod(); } break; @@ -442,7 +441,7 @@ export class QuintParser extends Parser { _localctx = new ExportDefContext(_localctx); this.enterOuterAlt(_localctx, 8); { - this.state = 137; + this.state = 135; this.exportMod(); } break; @@ -468,65 +467,65 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 8, QuintParser.RULE_operDef); let _la: number; try { - this.state = 188; + this.state = 186; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 14, this._ctx) ) { case 1: _localctx = new AnnotatedOperDefContext(_localctx); this.enterOuterAlt(_localctx, 1); { - this.state = 140; + this.state = 138; this.qualifier(); - this.state = 141; + this.state = 139; this.normalCallName(); - this.state = 142; + this.state = 140; this.match(QuintParser.LPAREN); { - this.state = 143; + this.state = 141; (_localctx as AnnotatedOperDefContext)._annotatedParameter = this.annotatedParameter(); (_localctx as AnnotatedOperDefContext)._annotOperParam.push((_localctx as AnnotatedOperDefContext)._annotatedParameter); - this.state = 148; + this.state = 146; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 144; + this.state = 142; this.match(QuintParser.T__7); - this.state = 145; + this.state = 143; (_localctx as AnnotatedOperDefContext)._annotatedParameter = this.annotatedParameter(); (_localctx as AnnotatedOperDefContext)._annotOperParam.push((_localctx as AnnotatedOperDefContext)._annotatedParameter); } } - this.state = 150; + this.state = 148; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 151; + this.state = 149; this.match(QuintParser.RPAREN); - this.state = 152; + this.state = 150; this.match(QuintParser.T__4); - this.state = 153; + this.state = 151; this.type(0); - this.state = 156; + this.state = 154; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.ASGN) { { - this.state = 154; + this.state = 152; this.match(QuintParser.ASGN); - this.state = 155; + this.state = 153; this.expr(0); } } - this.state = 159; + this.state = 157; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__8) { { - this.state = 158; + this.state = 156; this.match(QuintParser.T__8); } } @@ -538,80 +537,80 @@ export class QuintParser extends Parser { _localctx = new DeprecatedOperDefContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 161; + this.state = 159; this.qualifier(); - this.state = 162; + this.state = 160; this.normalCallName(); - this.state = 175; + this.state = 173; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 10, this._ctx) ) { case 1: { - this.state = 163; + this.state = 161; this.match(QuintParser.LPAREN); - this.state = 172; + this.state = 170; this._errHandler.sync(this); _la = this._input.LA(1); if (((((_la - 37)) & ~0x1F) === 0 && ((1 << (_la - 37)) & ((1 << (QuintParser.T__36 - 37)) | (1 << (QuintParser.LOW_ID - 37)) | (1 << (QuintParser.CAP_ID - 37)))) !== 0)) { { - this.state = 164; + this.state = 162; (_localctx as DeprecatedOperDefContext)._parameter = this.parameter(); (_localctx as DeprecatedOperDefContext)._operParam.push((_localctx as DeprecatedOperDefContext)._parameter); - this.state = 169; + this.state = 167; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 165; + this.state = 163; this.match(QuintParser.T__7); - this.state = 166; + this.state = 164; (_localctx as DeprecatedOperDefContext)._parameter = this.parameter(); (_localctx as DeprecatedOperDefContext)._operParam.push((_localctx as DeprecatedOperDefContext)._parameter); } } - this.state = 171; + this.state = 169; this._errHandler.sync(this); _la = this._input.LA(1); } } } - this.state = 174; + this.state = 172; this.match(QuintParser.RPAREN); } break; } - this.state = 179; + this.state = 177; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__4) { { - this.state = 177; + this.state = 175; this.match(QuintParser.T__4); - this.state = 178; + this.state = 176; (_localctx as DeprecatedOperDefContext)._annotatedRetType = this.type(0); } } - this.state = 183; + this.state = 181; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.ASGN) { { - this.state = 181; + this.state = 179; this.match(QuintParser.ASGN); - this.state = 182; + this.state = 180; this.expr(0); } } - this.state = 186; + this.state = 184; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__8) { { - this.state = 185; + this.state = 183; this.match(QuintParser.T__8); } } @@ -639,16 +638,16 @@ export class QuintParser extends Parser { let _localctx: TypeDefContext = new TypeDefContext(this._ctx, this.state); this.enterRule(_localctx, 10, QuintParser.RULE_typeDef); try { - this.state = 202; + this.state = 200; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 15, this._ctx) ) { case 1: _localctx = new TypeAbstractDefContext(_localctx); this.enterOuterAlt(_localctx, 1); { - this.state = 190; + this.state = 188; this.match(QuintParser.T__9); - this.state = 191; + this.state = 189; this.qualId(); } break; @@ -657,13 +656,13 @@ export class QuintParser extends Parser { _localctx = new TypeAliasDefContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 192; + this.state = 190; this.match(QuintParser.T__9); - this.state = 193; + this.state = 191; this.typeDefHead(); - this.state = 194; + this.state = 192; this.match(QuintParser.ASGN); - this.state = 195; + this.state = 193; this.type(0); } break; @@ -672,13 +671,13 @@ export class QuintParser extends Parser { _localctx = new TypeSumDefContext(_localctx); this.enterOuterAlt(_localctx, 3); { - this.state = 197; + this.state = 195; this.match(QuintParser.T__9); - this.state = 198; + this.state = 196; this.typeDefHead(); - this.state = 199; + this.state = 197; this.match(QuintParser.ASGN); - this.state = 200; + this.state = 198; this.sumTypeDefinition(); } break; @@ -706,36 +705,36 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 204; + this.state = 202; _localctx._typeName = this.qualId(); - this.state = 215; + this.state = 213; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__10) { { - this.state = 205; + this.state = 203; this.match(QuintParser.T__10); - this.state = 206; + this.state = 204; _localctx._LOW_ID = this.match(QuintParser.LOW_ID); _localctx._typeVars.push(_localctx._LOW_ID); - this.state = 211; + this.state = 209; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 207; + this.state = 205; this.match(QuintParser.T__7); - this.state = 208; + this.state = 206; _localctx._LOW_ID = this.match(QuintParser.LOW_ID); _localctx._typeVars.push(_localctx._LOW_ID); } } - this.state = 213; + this.state = 211; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 214; + this.state = 212; this.match(QuintParser.T__11); } } @@ -764,31 +763,31 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 218; + this.state = 216; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__12) { { - this.state = 217; + this.state = 215; this.match(QuintParser.T__12); } } - this.state = 220; + this.state = 218; this.typeSumVariant(); - this.state = 225; + this.state = 223; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__12) { { { - this.state = 221; + this.state = 219; this.match(QuintParser.T__12); - this.state = 222; + this.state = 220; this.typeSumVariant(); } } - this.state = 227; + this.state = 225; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -816,18 +815,18 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 228; + this.state = 226; _localctx._sumLabel = this.simpleId("variant label"); - this.state = 233; + this.state = 231; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.LPAREN) { { - this.state = 229; + this.state = 227; this.match(QuintParser.LPAREN); - this.state = 230; + this.state = 228; this.type(0); - this.state = 231; + this.state = 229; this.match(QuintParser.RPAREN); } } @@ -849,123 +848,77 @@ export class QuintParser extends Parser { return _localctx; } // @RuleVersion(0) - public nondetOperDef(): NondetOperDefContext { - let _localctx: NondetOperDefContext = new NondetOperDefContext(this._ctx, this.state); - this.enterRule(_localctx, 18, QuintParser.RULE_nondetOperDef); - let _la: number; - try { - this.enterOuterAlt(_localctx, 1); - { - this.state = 235; - this.match(QuintParser.T__13); - this.state = 236; - this.qualId(); - this.state = 239; - this._errHandler.sync(this); - _la = this._input.LA(1); - if (_la === QuintParser.T__4) { - { - this.state = 237; - this.match(QuintParser.T__4); - this.state = 238; - this.type(0); - } - } - - this.state = 241; - this.match(QuintParser.ASGN); - this.state = 242; - this.expr(0); - this.state = 244; - this._errHandler.sync(this); - _la = this._input.LA(1); - if (_la === QuintParser.T__8) { - { - this.state = 243; - this.match(QuintParser.T__8); - } - } - - } - } - catch (re) { - if (re instanceof RecognitionException) { - _localctx.exception = re; - this._errHandler.reportError(this, re); - this._errHandler.recover(this, re); - } else { - throw re; - } - } - finally { - this.exitRule(); - } - return _localctx; - } - // @RuleVersion(0) public qualifier(): QualifierContext { let _localctx: QualifierContext = new QualifierContext(this._ctx, this.state); - this.enterRule(_localctx, 20, QuintParser.RULE_qualifier); + this.enterRule(_localctx, 18, QuintParser.RULE_qualifier); try { - this.state = 255; + this.state = 243; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 23, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 21, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 246; - this.match(QuintParser.T__14); + this.state = 233; + this.match(QuintParser.T__13); } break; case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 247; - this.match(QuintParser.T__15); + this.state = 234; + this.match(QuintParser.T__14); } break; case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 248; - this.match(QuintParser.T__16); - this.state = 249; - this.match(QuintParser.T__14); + this.state = 235; + this.match(QuintParser.T__15); + this.state = 236; + this.match(QuintParser.T__13); } break; case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 250; - this.match(QuintParser.T__16); - this.state = 251; + this.state = 237; this.match(QuintParser.T__15); + this.state = 238; + this.match(QuintParser.T__14); } break; case 5: this.enterOuterAlt(_localctx, 5); { - this.state = 252; - this.match(QuintParser.T__17); + this.state = 239; + this.match(QuintParser.T__16); } break; case 6: this.enterOuterAlt(_localctx, 6); { - this.state = 253; - this.match(QuintParser.T__18); + this.state = 240; + this.match(QuintParser.T__17); } break; case 7: this.enterOuterAlt(_localctx, 7); { - this.state = 254; + this.state = 241; + this.match(QuintParser.T__18); + } + break; + + case 8: + this.enterOuterAlt(_localctx, 8); + { + this.state = 242; this.match(QuintParser.T__19); } break; @@ -988,31 +941,31 @@ export class QuintParser extends Parser { // @RuleVersion(0) public importMod(): ImportModContext { let _localctx: ImportModContext = new ImportModContext(this._ctx, this.state); - this.enterRule(_localctx, 22, QuintParser.RULE_importMod); + this.enterRule(_localctx, 20, QuintParser.RULE_importMod); let _la: number; try { - this.state = 275; + this.state = 263; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 27, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 25, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 257; + this.state = 245; this.match(QuintParser.T__20); - this.state = 258; + this.state = 246; this.name(); - this.state = 259; + this.state = 247; this.match(QuintParser.T__21); - this.state = 260; + this.state = 248; this.identOrStar(); - this.state = 263; + this.state = 251; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__22) { { - this.state = 261; + this.state = 249; this.match(QuintParser.T__22); - this.state = 262; + this.state = 250; this.fromSource(); } } @@ -1023,30 +976,30 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 265; + this.state = 253; this.match(QuintParser.T__20); - this.state = 266; + this.state = 254; this.name(); - this.state = 269; + this.state = 257; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__23) { { - this.state = 267; + this.state = 255; this.match(QuintParser.T__23); - this.state = 268; + this.state = 256; this.name(); } } - this.state = 273; + this.state = 261; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__22) { { - this.state = 271; + this.state = 259; this.match(QuintParser.T__22); - this.state = 272; + this.state = 260; this.fromSource(); } } @@ -1072,22 +1025,22 @@ export class QuintParser extends Parser { // @RuleVersion(0) public exportMod(): ExportModContext { let _localctx: ExportModContext = new ExportModContext(this._ctx, this.state); - this.enterRule(_localctx, 24, QuintParser.RULE_exportMod); + this.enterRule(_localctx, 22, QuintParser.RULE_exportMod); let _la: number; try { - this.state = 288; + this.state = 276; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 29, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 27, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 277; + this.state = 265; this.match(QuintParser.T__24); - this.state = 278; + this.state = 266; this.name(); - this.state = 279; + this.state = 267; this.match(QuintParser.T__21); - this.state = 280; + this.state = 268; this.identOrStar(); } break; @@ -1095,18 +1048,18 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 282; + this.state = 270; this.match(QuintParser.T__24); - this.state = 283; + this.state = 271; this.name(); - this.state = 286; + this.state = 274; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__23) { { - this.state = 284; + this.state = 272; this.match(QuintParser.T__23); - this.state = 285; + this.state = 273; this.name(); } } @@ -1132,63 +1085,63 @@ export class QuintParser extends Parser { // @RuleVersion(0) public instanceMod(): InstanceModContext { let _localctx: InstanceModContext = new InstanceModContext(this._ctx, this.state); - this.enterRule(_localctx, 26, QuintParser.RULE_instanceMod); + this.enterRule(_localctx, 24, QuintParser.RULE_instanceMod); let _la: number; try { - this.state = 336; + this.state = 324; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 34, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 32, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 290; + this.state = 278; this.match(QuintParser.T__20); - this.state = 291; + this.state = 279; this.moduleName(); - this.state = 292; + this.state = 280; this.match(QuintParser.LPAREN); { - this.state = 293; + this.state = 281; this.name(); - this.state = 294; + this.state = 282; this.match(QuintParser.ASGN); - this.state = 295; + this.state = 283; this.expr(0); - this.state = 303; + this.state = 291; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 296; + this.state = 284; this.match(QuintParser.T__7); - this.state = 297; + this.state = 285; this.name(); - this.state = 298; + this.state = 286; this.match(QuintParser.ASGN); - this.state = 299; + this.state = 287; this.expr(0); } } - this.state = 305; + this.state = 293; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 306; + this.state = 294; this.match(QuintParser.RPAREN); - this.state = 307; + this.state = 295; this.match(QuintParser.T__21); - this.state = 308; + this.state = 296; this.match(QuintParser.MUL); - this.state = 311; + this.state = 299; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__22) { { - this.state = 309; + this.state = 297; this.match(QuintParser.T__22); - this.state = 310; + this.state = 298; this.fromSource(); } } @@ -1199,54 +1152,54 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 313; + this.state = 301; this.match(QuintParser.T__20); - this.state = 314; + this.state = 302; this.moduleName(); - this.state = 315; + this.state = 303; this.match(QuintParser.LPAREN); { - this.state = 316; + this.state = 304; this.name(); - this.state = 317; + this.state = 305; this.match(QuintParser.ASGN); - this.state = 318; + this.state = 306; this.expr(0); - this.state = 326; + this.state = 314; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 319; + this.state = 307; this.match(QuintParser.T__7); - this.state = 320; + this.state = 308; this.name(); - this.state = 321; + this.state = 309; this.match(QuintParser.ASGN); - this.state = 322; + this.state = 310; this.expr(0); } } - this.state = 328; + this.state = 316; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 329; + this.state = 317; this.match(QuintParser.RPAREN); - this.state = 330; + this.state = 318; this.match(QuintParser.T__23); - this.state = 331; + this.state = 319; this.qualifiedName(); - this.state = 334; + this.state = 322; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__22) { { - this.state = 332; + this.state = 320; this.match(QuintParser.T__22); - this.state = 333; + this.state = 321; this.fromSource(); } } @@ -1272,11 +1225,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public moduleName(): ModuleNameContext { let _localctx: ModuleNameContext = new ModuleNameContext(this._ctx, this.state); - this.enterRule(_localctx, 28, QuintParser.RULE_moduleName); + this.enterRule(_localctx, 26, QuintParser.RULE_moduleName); try { this.enterOuterAlt(_localctx, 1); { - this.state = 338; + this.state = 326; this.qualId(); } } @@ -1297,11 +1250,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public name(): NameContext { let _localctx: NameContext = new NameContext(this._ctx, this.state); - this.enterRule(_localctx, 30, QuintParser.RULE_name); + this.enterRule(_localctx, 28, QuintParser.RULE_name); try { this.enterOuterAlt(_localctx, 1); { - this.state = 340; + this.state = 328; this.qualId(); } } @@ -1322,11 +1275,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public qualifiedName(): QualifiedNameContext { let _localctx: QualifiedNameContext = new QualifiedNameContext(this._ctx, this.state); - this.enterRule(_localctx, 32, QuintParser.RULE_qualifiedName); + this.enterRule(_localctx, 30, QuintParser.RULE_qualifiedName); try { this.enterOuterAlt(_localctx, 1); { - this.state = 342; + this.state = 330; this.qualId(); } } @@ -1347,11 +1300,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public fromSource(): FromSourceContext { let _localctx: FromSourceContext = new FromSourceContext(this._ctx, this.state); - this.enterRule(_localctx, 34, QuintParser.RULE_fromSource); + this.enterRule(_localctx, 32, QuintParser.RULE_fromSource); try { this.enterOuterAlt(_localctx, 1); { - this.state = 344; + this.state = 332; this.match(QuintParser.STRING); } } @@ -1382,67 +1335,67 @@ export class QuintParser extends Parser { let _parentState: number = this.state; let _localctx: TypeContext = new TypeContext(this._ctx, _parentState); let _prevctx: TypeContext = _localctx; - let _startState: number = 36; - this.enterRecursionRule(_localctx, 36, QuintParser.RULE_type, _p); + let _startState: number = 34; + this.enterRecursionRule(_localctx, 34, QuintParser.RULE_type, _p); let _la: number; try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 418; + this.state = 406; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 42, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 40, this._ctx) ) { case 1: { _localctx = new TypeOperContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 347; + this.state = 335; this.match(QuintParser.LPAREN); - this.state = 356; + this.state = 344; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__27) | (1 << QuintParser.T__28) | (1 << QuintParser.T__29))) !== 0) || ((((_la - 61)) & ~0x1F) === 0 && ((1 << (_la - 61)) & ((1 << (QuintParser.LPAREN - 61)) | (1 << (QuintParser.SET - 61)) | (1 << (QuintParser.LIST - 61)) | (1 << (QuintParser.LOW_ID - 61)) | (1 << (QuintParser.CAP_ID - 61)))) !== 0)) { { - this.state = 348; + this.state = 336; this.type(0); - this.state = 353; + this.state = 341; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 35, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 33, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 349; + this.state = 337; this.match(QuintParser.T__7); - this.state = 350; + this.state = 338; this.type(0); } } } - this.state = 355; + this.state = 343; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 35, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 33, this._ctx); } } } - this.state = 359; + this.state = 347; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 358; + this.state = 346; this.match(QuintParser.T__7); } } - this.state = 361; + this.state = 349; this.match(QuintParser.RPAREN); - this.state = 362; + this.state = 350; this.match(QuintParser.T__26); - this.state = 363; + this.state = 351; this.type(13); } break; @@ -1452,13 +1405,13 @@ export class QuintParser extends Parser { _localctx = new TypeSetContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 364; + this.state = 352; this.match(QuintParser.SET); - this.state = 365; + this.state = 353; this.match(QuintParser.T__10); - this.state = 366; + this.state = 354; this.type(0); - this.state = 367; + this.state = 355; this.match(QuintParser.T__11); } break; @@ -1468,13 +1421,13 @@ export class QuintParser extends Parser { _localctx = new TypeListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 369; + this.state = 357; this.match(QuintParser.LIST); - this.state = 370; + this.state = 358; this.match(QuintParser.T__10); - this.state = 371; + this.state = 359; this.type(0); - this.state = 372; + this.state = 360; this.match(QuintParser.T__11); } break; @@ -1484,9 +1437,9 @@ export class QuintParser extends Parser { _localctx = new TypeUnitContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 374; + this.state = 362; this.match(QuintParser.LPAREN); - this.state = 375; + this.state = 363; this.match(QuintParser.RPAREN); } break; @@ -1496,43 +1449,43 @@ export class QuintParser extends Parser { _localctx = new TypeTupleContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 376; + this.state = 364; this.match(QuintParser.LPAREN); - this.state = 377; + this.state = 365; this.type(0); - this.state = 378; + this.state = 366; this.match(QuintParser.T__7); - this.state = 379; + this.state = 367; this.type(0); - this.state = 384; + this.state = 372; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 36, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 380; + this.state = 368; this.match(QuintParser.T__7); - this.state = 381; + this.state = 369; this.type(0); } } } - this.state = 386; + this.state = 374; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 36, this._ctx); } - this.state = 388; + this.state = 376; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 387; + this.state = 375; this.match(QuintParser.T__7); } } - this.state = 390; + this.state = 378; this.match(QuintParser.RPAREN); } break; @@ -1542,19 +1495,19 @@ export class QuintParser extends Parser { _localctx = new TypeRecContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 392; + this.state = 380; this.match(QuintParser.T__1); - this.state = 394; + this.state = 382; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__12 || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 393; + this.state = 381; this.row(); } } - this.state = 396; + this.state = 384; this.match(QuintParser.T__2); } break; @@ -1564,7 +1517,7 @@ export class QuintParser extends Parser { _localctx = new TypeIntContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 397; + this.state = 385; this.match(QuintParser.T__27); } break; @@ -1574,7 +1527,7 @@ export class QuintParser extends Parser { _localctx = new TypeStrContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 398; + this.state = 386; this.match(QuintParser.T__28); } break; @@ -1584,7 +1537,7 @@ export class QuintParser extends Parser { _localctx = new TypeBoolContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 399; + this.state = 387; this.match(QuintParser.T__29); } break; @@ -1594,7 +1547,7 @@ export class QuintParser extends Parser { _localctx = new TypeVarCaseContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 400; + this.state = 388; this.typeVar(); } break; @@ -1604,7 +1557,7 @@ export class QuintParser extends Parser { _localctx = new TypeConstContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 401; + this.state = 389; this.qualId(); } break; @@ -1614,11 +1567,11 @@ export class QuintParser extends Parser { _localctx = new TypeParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 402; + this.state = 390; this.match(QuintParser.LPAREN); - this.state = 403; + this.state = 391; this.type(0); - this.state = 404; + this.state = 392; this.match(QuintParser.RPAREN); } break; @@ -1628,41 +1581,41 @@ export class QuintParser extends Parser { _localctx = new TypeAppContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 406; + this.state = 394; (_localctx as TypeAppContext)._typeCtor = this.qualId(); { - this.state = 407; + this.state = 395; this.match(QuintParser.T__10); - this.state = 408; + this.state = 396; (_localctx as TypeAppContext)._type = this.type(0); (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); - this.state = 413; + this.state = 401; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 409; + this.state = 397; this.match(QuintParser.T__7); - this.state = 410; + this.state = 398; (_localctx as TypeAppContext)._type = this.type(0); (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); } } - this.state = 415; + this.state = 403; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 416; + this.state = 404; this.match(QuintParser.T__11); } } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 428; + this.state = 416; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 44, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 42, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { if (this._parseListeners != null) { @@ -1670,20 +1623,20 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 426; + this.state = 414; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 43, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 41, this._ctx) ) { case 1: { _localctx = new TypeFunContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 420; + this.state = 408; if (!(this.precpred(this._ctx, 15))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 15)"); } - this.state = 421; + this.state = 409; this.match(QuintParser.T__25); - this.state = 422; + this.state = 410; this.type(15); } break; @@ -1692,22 +1645,22 @@ export class QuintParser extends Parser { { _localctx = new TypeOperContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 423; + this.state = 411; if (!(this.precpred(this._ctx, 14))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); } - this.state = 424; + this.state = 412; this.match(QuintParser.T__26); - this.state = 425; + this.state = 413; this.type(14); } break; } } } - this.state = 430; + this.state = 418; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 44, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 42, this._ctx); } } } @@ -1728,11 +1681,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public typeVar(): TypeVarContext { let _localctx: TypeVarContext = new TypeVarContext(this._ctx, this.state); - this.enterRule(_localctx, 38, QuintParser.RULE_typeVar); + this.enterRule(_localctx, 36, QuintParser.RULE_typeVar); try { this.enterOuterAlt(_localctx, 1); { - this.state = 431; + this.state = 419; this.match(QuintParser.LOW_ID); } } @@ -1753,10 +1706,10 @@ export class QuintParser extends Parser { // @RuleVersion(0) public row(): RowContext { let _localctx: RowContext = new RowContext(this._ctx, this.state); - this.enterRule(_localctx, 40, QuintParser.RULE_row); + this.enterRule(_localctx, 38, QuintParser.RULE_row); try { let _alt: number; - this.state = 454; + this.state = 442; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: @@ -1764,50 +1717,50 @@ export class QuintParser extends Parser { this.enterOuterAlt(_localctx, 1); { { - this.state = 433; + this.state = 421; this.rowLabel(); - this.state = 434; + this.state = 422; this.match(QuintParser.T__4); - this.state = 435; + this.state = 423; this.type(0); } - this.state = 444; + this.state = 432; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 45, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 43, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 437; + this.state = 425; this.match(QuintParser.T__7); - this.state = 438; + this.state = 426; this.rowLabel(); - this.state = 439; + this.state = 427; this.match(QuintParser.T__4); - this.state = 440; + this.state = 428; this.type(0); } } } - this.state = 446; + this.state = 434; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 45, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 43, this._ctx); } - this.state = 450; + this.state = 438; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__7: { - this.state = 447; + this.state = 435; this.match(QuintParser.T__7); } break; case QuintParser.T__12: { - this.state = 448; + this.state = 436; this.match(QuintParser.T__12); { - this.state = 449; + this.state = 437; _localctx._rowVar = this.identifier(); } } @@ -1822,10 +1775,10 @@ export class QuintParser extends Parser { case QuintParser.T__12: this.enterOuterAlt(_localctx, 2); { - this.state = 452; + this.state = 440; this.match(QuintParser.T__12); { - this.state = 453; + this.state = 441; _localctx._rowVar = this.identifier(); } } @@ -1851,11 +1804,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public rowLabel(): RowLabelContext { let _localctx: RowLabelContext = new RowLabelContext(this._ctx, this.state); - this.enterRule(_localctx, 42, QuintParser.RULE_rowLabel); + this.enterRule(_localctx, 40, QuintParser.RULE_rowLabel); try { this.enterOuterAlt(_localctx, 1); { - this.state = 456; + this.state = 444; this.simpleId("record"); } } @@ -1886,23 +1839,23 @@ export class QuintParser extends Parser { let _parentState: number = this.state; let _localctx: ExprContext = new ExprContext(this._ctx, _parentState); let _prevctx: ExprContext = _localctx; - let _startState: number = 44; - this.enterRecursionRule(_localctx, 44, QuintParser.RULE_expr, _p); + let _startState: number = 42; + this.enterRecursionRule(_localctx, 42, QuintParser.RULE_expr, _p); let _la: number; try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 610; + this.state = 595; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 65, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 63, this._ctx) ) { case 1: { _localctx = new LambdaConsContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 459; + this.state = 447; this.lambda(); } break; @@ -1912,21 +1865,21 @@ export class QuintParser extends Parser { _localctx = new OperAppContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 460; + this.state = 448; this.normalCallName(); - this.state = 461; + this.state = 449; this.match(QuintParser.LPAREN); - this.state = 463; + this.state = 451; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 462; + this.state = 450; this.argList(); } } - this.state = 465; + this.state = 453; this.match(QuintParser.RPAREN); } break; @@ -1936,10 +1889,10 @@ export class QuintParser extends Parser { _localctx = new UminusContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 467; + this.state = 455; this.match(QuintParser.MINUS); - this.state = 468; - this.expr(26); + this.state = 456; + this.expr(25); } break; @@ -1948,14 +1901,14 @@ export class QuintParser extends Parser { _localctx = new AsgnContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 469; + this.state = 457; this.qualId(); - this.state = 470; + this.state = 458; this.match(QuintParser.T__31); - this.state = 471; + this.state = 459; this.match(QuintParser.ASGN); - this.state = 472; - this.expr(22); + this.state = 460; + this.expr(21); } break; @@ -1964,41 +1917,41 @@ export class QuintParser extends Parser { _localctx = new AndExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 474; + this.state = 462; this.match(QuintParser.AND); - this.state = 475; + this.state = 463; this.match(QuintParser.T__1); - this.state = 476; + this.state = 464; this.expr(0); - this.state = 481; + this.state = 469; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 47, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 477; + this.state = 465; this.match(QuintParser.T__7); - this.state = 478; + this.state = 466; this.expr(0); } } } - this.state = 483; + this.state = 471; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 47, this._ctx); } - this.state = 485; + this.state = 473; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 484; + this.state = 472; this.match(QuintParser.T__7); } } - this.state = 487; + this.state = 475; this.match(QuintParser.T__2); } break; @@ -2008,41 +1961,41 @@ export class QuintParser extends Parser { _localctx = new OrExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 489; + this.state = 477; this.match(QuintParser.OR); - this.state = 490; + this.state = 478; this.match(QuintParser.T__1); - this.state = 491; + this.state = 479; this.expr(0); - this.state = 496; + this.state = 484; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 51, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 492; + this.state = 480; this.match(QuintParser.T__7); - this.state = 493; + this.state = 481; this.expr(0); } } } - this.state = 498; + this.state = 486; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 51, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); } - this.state = 500; + this.state = 488; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 499; + this.state = 487; this.match(QuintParser.T__7); } } - this.state = 502; + this.state = 490; this.match(QuintParser.T__2); } break; @@ -2052,7 +2005,7 @@ export class QuintParser extends Parser { _localctx = new MatchContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 504; + this.state = 492; this.matchSumExpr(); } break; @@ -2062,41 +2015,41 @@ export class QuintParser extends Parser { _localctx = new ActionAllContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 505; + this.state = 493; this.match(QuintParser.T__32); - this.state = 506; + this.state = 494; this.match(QuintParser.T__1); - this.state = 507; + this.state = 495; this.expr(0); - this.state = 512; + this.state = 500; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 53, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 51, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 508; + this.state = 496; this.match(QuintParser.T__7); - this.state = 509; + this.state = 497; this.expr(0); } } } - this.state = 514; + this.state = 502; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 53, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 51, this._ctx); } - this.state = 516; + this.state = 504; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 515; + this.state = 503; this.match(QuintParser.T__7); } } - this.state = 518; + this.state = 506; this.match(QuintParser.T__2); } break; @@ -2106,41 +2059,41 @@ export class QuintParser extends Parser { _localctx = new ActionAnyContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 520; + this.state = 508; this.match(QuintParser.T__33); - this.state = 521; + this.state = 509; this.match(QuintParser.T__1); - this.state = 522; + this.state = 510; this.expr(0); - this.state = 527; + this.state = 515; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 55, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 53, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 523; + this.state = 511; this.match(QuintParser.T__7); - this.state = 524; + this.state = 512; this.expr(0); } } } - this.state = 529; + this.state = 517; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 55, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 53, this._ctx); } - this.state = 531; + this.state = 519; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 530; + this.state = 518; this.match(QuintParser.T__7); } } - this.state = 533; + this.state = 521; this.match(QuintParser.T__2); } break; @@ -2150,31 +2103,31 @@ export class QuintParser extends Parser { _localctx = new LiteralOrIdContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 539; + this.state = 527; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 535; + this.state = 523; this.qualId(); } break; case QuintParser.INT: { - this.state = 536; + this.state = 524; this.match(QuintParser.INT); } break; case QuintParser.BOOL: { - this.state = 537; + this.state = 525; this.match(QuintParser.BOOL); } break; case QuintParser.STRING: { - this.state = 538; + this.state = 526; this.match(QuintParser.STRING); } break; @@ -2189,43 +2142,43 @@ export class QuintParser extends Parser { _localctx = new TupleContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 541; + this.state = 529; this.match(QuintParser.LPAREN); - this.state = 542; + this.state = 530; this.expr(0); - this.state = 543; + this.state = 531; this.match(QuintParser.T__7); - this.state = 544; + this.state = 532; this.expr(0); - this.state = 549; + this.state = 537; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 58, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 56, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 545; + this.state = 533; this.match(QuintParser.T__7); - this.state = 546; + this.state = 534; this.expr(0); } } } - this.state = 551; + this.state = 539; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 58, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 56, this._ctx); } - this.state = 553; + this.state = 541; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 552; + this.state = 540; this.match(QuintParser.T__7); } } - this.state = 555; + this.state = 543; this.match(QuintParser.RPAREN); } break; @@ -2235,9 +2188,9 @@ export class QuintParser extends Parser { _localctx = new UnitContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 557; + this.state = 545; this.match(QuintParser.LPAREN); - this.state = 558; + this.state = 546; this.match(QuintParser.RPAREN); } break; @@ -2247,39 +2200,39 @@ export class QuintParser extends Parser { _localctx = new RecordContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 559; + this.state = 547; this.match(QuintParser.T__1); - this.state = 560; + this.state = 548; this.recElem(); - this.state = 565; + this.state = 553; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 60, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 58, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 561; + this.state = 549; this.match(QuintParser.T__7); - this.state = 562; + this.state = 550; this.recElem(); } } } - this.state = 567; + this.state = 555; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 60, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 58, this._ctx); } - this.state = 569; + this.state = 557; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 568; + this.state = 556; this.match(QuintParser.T__7); } } - this.state = 571; + this.state = 559; this.match(QuintParser.T__2); } break; @@ -2289,47 +2242,47 @@ export class QuintParser extends Parser { _localctx = new ListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 573; + this.state = 561; this.match(QuintParser.T__10); - this.state = 582; + this.state = 570; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 574; + this.state = 562; this.expr(0); - this.state = 579; + this.state = 567; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 62, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 60, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 575; + this.state = 563; this.match(QuintParser.T__7); - this.state = 576; + this.state = 564; this.expr(0); } } } - this.state = 581; + this.state = 569; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 62, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 60, this._ctx); } } } - this.state = 585; + this.state = 573; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 584; + this.state = 572; this.match(QuintParser.T__7); } } - this.state = 587; + this.state = 575; this.match(QuintParser.T__11); } break; @@ -2339,20 +2292,20 @@ export class QuintParser extends Parser { _localctx = new IfElseContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 588; + this.state = 576; this.match(QuintParser.T__34); - this.state = 589; + this.state = 577; this.match(QuintParser.LPAREN); - this.state = 590; + this.state = 578; this.expr(0); - this.state = 591; + this.state = 579; this.match(QuintParser.RPAREN); - this.state = 592; + this.state = 580; this.expr(0); - this.state = 593; + this.state = 581; this.match(QuintParser.T__35); - this.state = 594; - this.expr(5); + this.state = 582; + this.expr(4); } break; @@ -2361,57 +2314,45 @@ export class QuintParser extends Parser { _localctx = new LetInContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 596; + this.state = 584; this.operDef(); - this.state = 597; - this.expr(4); - } - break; - - case 17: - { - _localctx = new NondetContext(_localctx); - this._ctx = _localctx; - _prevctx = _localctx; - this.state = 599; - this.nondetOperDef(); - this.state = 600; + this.state = 585; this.expr(3); } break; - case 18: + case 17: { _localctx = new ParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 602; + this.state = 587; this.match(QuintParser.LPAREN); - this.state = 603; + this.state = 588; this.expr(0); - this.state = 604; + this.state = 589; this.match(QuintParser.RPAREN); } break; - case 19: + case 18: { _localctx = new BracesContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 606; + this.state = 591; this.match(QuintParser.T__1); - this.state = 607; + this.state = 592; this.expr(0); - this.state = 608; + this.state = 593; this.match(QuintParser.T__2); } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 661; + this.state = 646; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 69, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 67, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { if (this._parseListeners != null) { @@ -2419,21 +2360,21 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 659; + this.state = 644; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 68, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 66, this._ctx) ) { case 1: { _localctx = new PowContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 612; - if (!(this.precpred(this._ctx, 27))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 27)"); + this.state = 597; + if (!(this.precpred(this._ctx, 26))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 26)"); } - this.state = 613; + this.state = 598; (_localctx as PowContext)._op = this.match(QuintParser.T__30); - this.state = 614; - this.expr(27); + this.state = 599; + this.expr(26); } break; @@ -2441,11 +2382,11 @@ export class QuintParser extends Parser { { _localctx = new MultDivContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 615; - if (!(this.precpred(this._ctx, 25))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 25)"); + this.state = 600; + if (!(this.precpred(this._ctx, 24))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 24)"); } - this.state = 616; + this.state = 601; (_localctx as MultDivContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & ((1 << (QuintParser.MUL - 51)) | (1 << (QuintParser.DIV - 51)) | (1 << (QuintParser.MOD - 51)))) !== 0))) { @@ -2458,8 +2399,8 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 617; - this.expr(26); + this.state = 602; + this.expr(25); } break; @@ -2467,11 +2408,11 @@ export class QuintParser extends Parser { { _localctx = new PlusMinusContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 618; - if (!(this.precpred(this._ctx, 24))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 24)"); + this.state = 603; + if (!(this.precpred(this._ctx, 23))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 23)"); } - this.state = 619; + this.state = 604; (_localctx as PlusMinusContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(_la === QuintParser.PLUS || _la === QuintParser.MINUS)) { @@ -2484,8 +2425,8 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 620; - this.expr(25); + this.state = 605; + this.expr(24); } break; @@ -2493,11 +2434,11 @@ export class QuintParser extends Parser { { _localctx = new RelationsContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 621; - if (!(this.precpred(this._ctx, 23))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 23)"); + this.state = 606; + if (!(this.precpred(this._ctx, 22))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 22)"); } - this.state = 622; + this.state = 607; (_localctx as RelationsContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 54)) & ~0x1F) === 0 && ((1 << (_la - 54)) & ((1 << (QuintParser.GT - 54)) | (1 << (QuintParser.LT - 54)) | (1 << (QuintParser.GE - 54)) | (1 << (QuintParser.LE - 54)) | (1 << (QuintParser.NE - 54)) | (1 << (QuintParser.EQ - 54)))) !== 0))) { @@ -2510,8 +2451,8 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 623; - this.expr(24); + this.state = 608; + this.expr(23); } break; @@ -2519,14 +2460,14 @@ export class QuintParser extends Parser { { _localctx = new ErrorEqContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 624; - if (!(this.precpred(this._ctx, 21))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 21)"); + this.state = 609; + if (!(this.precpred(this._ctx, 20))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 20)"); } - this.state = 625; + this.state = 610; this.match(QuintParser.ASGN); - this.state = 626; - this.expr(22); + this.state = 611; + this.expr(21); const m = "[QNT006] unexpected '=', did you mean '=='?" this.notifyErrorListeners(m) @@ -2538,14 +2479,14 @@ export class QuintParser extends Parser { { _localctx = new AndContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 629; - if (!(this.precpred(this._ctx, 19))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 19)"); + this.state = 614; + if (!(this.precpred(this._ctx, 18))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 18)"); } - this.state = 630; + this.state = 615; this.match(QuintParser.AND); - this.state = 631; - this.expr(20); + this.state = 616; + this.expr(19); } break; @@ -2553,14 +2494,14 @@ export class QuintParser extends Parser { { _localctx = new OrContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 632; - if (!(this.precpred(this._ctx, 17))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 17)"); + this.state = 617; + if (!(this.precpred(this._ctx, 16))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 16)"); } - this.state = 633; + this.state = 618; this.match(QuintParser.OR); - this.state = 634; - this.expr(18); + this.state = 619; + this.expr(17); } break; @@ -2568,14 +2509,14 @@ export class QuintParser extends Parser { { _localctx = new IffContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 635; - if (!(this.precpred(this._ctx, 16))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 16)"); + this.state = 620; + if (!(this.precpred(this._ctx, 15))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 15)"); } - this.state = 636; + this.state = 621; this.match(QuintParser.IFF); - this.state = 637; - this.expr(17); + this.state = 622; + this.expr(16); } break; @@ -2583,14 +2524,14 @@ export class QuintParser extends Parser { { _localctx = new ImpliesContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 638; - if (!(this.precpred(this._ctx, 15))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 15)"); + this.state = 623; + if (!(this.precpred(this._ctx, 14))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); } - this.state = 639; + this.state = 624; this.match(QuintParser.IMPLIES); - this.state = 640; - this.expr(16); + this.state = 625; + this.expr(15); } break; @@ -2598,14 +2539,14 @@ export class QuintParser extends Parser { { _localctx = new PairContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 641; - if (!(this.precpred(this._ctx, 8))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 8)"); + this.state = 626; + if (!(this.precpred(this._ctx, 7))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 7)"); } - this.state = 642; + this.state = 627; this.match(QuintParser.T__25); - this.state = 643; - this.expr(9); + this.state = 628; + this.expr(8); } break; @@ -2613,32 +2554,32 @@ export class QuintParser extends Parser { { _localctx = new DotCallContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 644; - if (!(this.precpred(this._ctx, 31))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 31)"); + this.state = 629; + if (!(this.precpred(this._ctx, 30))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 30)"); } - this.state = 645; + this.state = 630; this.match(QuintParser.T__21); - this.state = 646; + this.state = 631; this.nameAfterDot(); - this.state = 652; + this.state = 637; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 67, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 65, this._ctx) ) { case 1: { - this.state = 647; + this.state = 632; this.match(QuintParser.LPAREN); - this.state = 649; + this.state = 634; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 648; + this.state = 633; this.argList(); } } - this.state = 651; + this.state = 636; this.match(QuintParser.RPAREN); } break; @@ -2650,24 +2591,24 @@ export class QuintParser extends Parser { { _localctx = new ListAppContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 654; - if (!(this.precpred(this._ctx, 28))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 28)"); + this.state = 639; + if (!(this.precpred(this._ctx, 27))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 27)"); } - this.state = 655; + this.state = 640; this.match(QuintParser.T__10); - this.state = 656; + this.state = 641; this.expr(0); - this.state = 657; + this.state = 642; this.match(QuintParser.T__11); } break; } } } - this.state = 663; + this.state = 648; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 69, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 67, this._ctx); } } } @@ -2688,48 +2629,48 @@ export class QuintParser extends Parser { // @RuleVersion(0) public matchSumExpr(): MatchSumExprContext { let _localctx: MatchSumExprContext = new MatchSumExprContext(this._ctx, this.state); - this.enterRule(_localctx, 46, QuintParser.RULE_matchSumExpr); + this.enterRule(_localctx, 44, QuintParser.RULE_matchSumExpr); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 664; + this.state = 649; this.match(QuintParser.MATCH); - this.state = 665; + this.state = 650; this.expr(0); - this.state = 666; + this.state = 651; this.match(QuintParser.T__1); - this.state = 668; + this.state = 653; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__12) { { - this.state = 667; + this.state = 652; this.match(QuintParser.T__12); } } - this.state = 670; + this.state = 655; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); - this.state = 675; + this.state = 660; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__12) { { { - this.state = 671; + this.state = 656; this.match(QuintParser.T__12); - this.state = 672; + this.state = 657; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); } } - this.state = 677; + this.state = 662; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 678; + this.state = 663; this.match(QuintParser.T__2); } } @@ -2750,32 +2691,32 @@ export class QuintParser extends Parser { // @RuleVersion(0) public matchSumCase(): MatchSumCaseContext { let _localctx: MatchSumCaseContext = new MatchSumCaseContext(this._ctx, this.state); - this.enterRule(_localctx, 48, QuintParser.RULE_matchSumCase); + this.enterRule(_localctx, 46, QuintParser.RULE_matchSumCase); try { this.enterOuterAlt(_localctx, 1); { - this.state = 682; + this.state = 667; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 680; + this.state = 665; _localctx._variantMatch = this.matchSumVariant(); } break; case QuintParser.T__36: { - this.state = 681; + this.state = 666; _localctx._wildCardMatch = this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 684; + this.state = 669; this.match(QuintParser.T__26); - this.state = 685; + this.state = 670; this.expr(0); } } @@ -2796,42 +2737,42 @@ export class QuintParser extends Parser { // @RuleVersion(0) public matchSumVariant(): MatchSumVariantContext { let _localctx: MatchSumVariantContext = new MatchSumVariantContext(this._ctx, this.state); - this.enterRule(_localctx, 50, QuintParser.RULE_matchSumVariant); + this.enterRule(_localctx, 48, QuintParser.RULE_matchSumVariant); let _la: number; try { this.enterOuterAlt(_localctx, 1); { { - this.state = 687; + this.state = 672; _localctx._variantLabel = this.simpleId("variant label"); } - this.state = 694; + this.state = 679; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.LPAREN) { { - this.state = 688; + this.state = 673; this.match(QuintParser.LPAREN); - this.state = 691; + this.state = 676; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 689; + this.state = 674; _localctx._variantParam = this.simpleId("match case parameter"); } break; case QuintParser.T__36: { - this.state = 690; + this.state = 675; this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 693; + this.state = 678; this.match(QuintParser.RPAREN); } } @@ -2855,17 +2796,17 @@ export class QuintParser extends Parser { // @RuleVersion(0) public declarationOrExpr(): DeclarationOrExprContext { let _localctx: DeclarationOrExprContext = new DeclarationOrExprContext(this._ctx, this.state); - this.enterRule(_localctx, 52, QuintParser.RULE_declarationOrExpr); + this.enterRule(_localctx, 50, QuintParser.RULE_declarationOrExpr); try { - this.state = 705; + this.state = 690; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 75, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 73, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 696; + this.state = 681; this.declaration(); - this.state = 697; + this.state = 682; this.match(QuintParser.EOF); } break; @@ -2873,9 +2814,9 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 699; + this.state = 684; this.expr(0); - this.state = 700; + this.state = 685; this.match(QuintParser.EOF); } break; @@ -2883,9 +2824,9 @@ export class QuintParser extends Parser { case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 702; + this.state = 687; this.match(QuintParser.DOCCOMMENT); - this.state = 703; + this.state = 688; this.match(QuintParser.EOF); } break; @@ -2893,7 +2834,7 @@ export class QuintParser extends Parser { case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 704; + this.state = 689; this.match(QuintParser.EOF); } break; @@ -2916,15 +2857,15 @@ export class QuintParser extends Parser { // @RuleVersion(0) public lambda(): LambdaContext { let _localctx: LambdaContext = new LambdaContext(this._ctx, this.state); - this.enterRule(_localctx, 54, QuintParser.RULE_lambda); + this.enterRule(_localctx, 52, QuintParser.RULE_lambda); try { - this.state = 709; + this.state = 694; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 76, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 74, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 707; + this.state = 692; this.lambdaUnsugared(); } break; @@ -2932,7 +2873,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 708; + this.state = 693; this.lambdaTupleSugar(); } break; @@ -2955,10 +2896,10 @@ export class QuintParser extends Parser { // @RuleVersion(0) public lambdaUnsugared(): LambdaUnsugaredContext { let _localctx: LambdaUnsugaredContext = new LambdaUnsugaredContext(this._ctx, this.state); - this.enterRule(_localctx, 56, QuintParser.RULE_lambdaUnsugared); + this.enterRule(_localctx, 54, QuintParser.RULE_lambdaUnsugared); let _la: number; try { - this.state = 728; + this.state = 713; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: @@ -2966,42 +2907,42 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 711; + this.state = 696; this.parameter(); - this.state = 712; + this.state = 697; this.match(QuintParser.T__26); - this.state = 713; + this.state = 698; this.expr(0); } break; case QuintParser.LPAREN: this.enterOuterAlt(_localctx, 2); { - this.state = 715; + this.state = 700; this.match(QuintParser.LPAREN); - this.state = 716; + this.state = 701; this.parameter(); - this.state = 721; + this.state = 706; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 717; + this.state = 702; this.match(QuintParser.T__7); - this.state = 718; + this.state = 703; this.parameter(); } } - this.state = 723; + this.state = 708; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 724; + this.state = 709; this.match(QuintParser.RPAREN); - this.state = 725; + this.state = 710; this.match(QuintParser.T__26); - this.state = 726; + this.state = 711; this.expr(0); } break; @@ -3026,40 +2967,40 @@ export class QuintParser extends Parser { // @RuleVersion(0) public lambdaTupleSugar(): LambdaTupleSugarContext { let _localctx: LambdaTupleSugarContext = new LambdaTupleSugarContext(this._ctx, this.state); - this.enterRule(_localctx, 58, QuintParser.RULE_lambdaTupleSugar); + this.enterRule(_localctx, 56, QuintParser.RULE_lambdaTupleSugar); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 730; + this.state = 715; this.match(QuintParser.LPAREN); - this.state = 731; + this.state = 716; this.match(QuintParser.LPAREN); - this.state = 732; + this.state = 717; this.parameter(); - this.state = 735; + this.state = 720; this._errHandler.sync(this); _la = this._input.LA(1); do { { { - this.state = 733; + this.state = 718; this.match(QuintParser.T__7); - this.state = 734; + this.state = 719; this.parameter(); } } - this.state = 737; + this.state = 722; this._errHandler.sync(this); _la = this._input.LA(1); } while (_la === QuintParser.T__7); - this.state = 739; + this.state = 724; this.match(QuintParser.RPAREN); - this.state = 740; + this.state = 725; this.match(QuintParser.RPAREN); - this.state = 741; + this.state = 726; this.match(QuintParser.T__26); - this.state = 742; + this.state = 727; this.expr(0); } } @@ -3080,15 +3021,15 @@ export class QuintParser extends Parser { // @RuleVersion(0) public identOrHole(): IdentOrHoleContext { let _localctx: IdentOrHoleContext = new IdentOrHoleContext(this._ctx, this.state); - this.enterRule(_localctx, 60, QuintParser.RULE_identOrHole); + this.enterRule(_localctx, 58, QuintParser.RULE_identOrHole); try { - this.state = 746; + this.state = 731; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: this.enterOuterAlt(_localctx, 1); { - this.state = 744; + this.state = 729; this.match(QuintParser.T__36); } break; @@ -3096,7 +3037,7 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 745; + this.state = 730; this.qualId(); } break; @@ -3121,11 +3062,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public parameter(): ParameterContext { let _localctx: ParameterContext = new ParameterContext(this._ctx, this.state); - this.enterRule(_localctx, 62, QuintParser.RULE_parameter); + this.enterRule(_localctx, 60, QuintParser.RULE_parameter); try { this.enterOuterAlt(_localctx, 1); { - this.state = 748; + this.state = 733; _localctx._paramName = this.identOrHole(); } } @@ -3146,15 +3087,15 @@ export class QuintParser extends Parser { // @RuleVersion(0) public annotatedParameter(): AnnotatedParameterContext { let _localctx: AnnotatedParameterContext = new AnnotatedParameterContext(this._ctx, this.state); - this.enterRule(_localctx, 64, QuintParser.RULE_annotatedParameter); + this.enterRule(_localctx, 62, QuintParser.RULE_annotatedParameter); try { this.enterOuterAlt(_localctx, 1); { - this.state = 750; + this.state = 735; _localctx._paramName = this.identOrHole(); - this.state = 751; + this.state = 736; this.match(QuintParser.T__4); - this.state = 752; + this.state = 737; this.type(0); } } @@ -3175,15 +3116,15 @@ export class QuintParser extends Parser { // @RuleVersion(0) public identOrStar(): IdentOrStarContext { let _localctx: IdentOrStarContext = new IdentOrStarContext(this._ctx, this.state); - this.enterRule(_localctx, 66, QuintParser.RULE_identOrStar); + this.enterRule(_localctx, 64, QuintParser.RULE_identOrStar); try { - this.state = 756; + this.state = 741; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.MUL: this.enterOuterAlt(_localctx, 1); { - this.state = 754; + this.state = 739; this.match(QuintParser.MUL); } break; @@ -3191,7 +3132,7 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 755; + this.state = 740; this.qualId(); } break; @@ -3216,26 +3157,26 @@ export class QuintParser extends Parser { // @RuleVersion(0) public argList(): ArgListContext { let _localctx: ArgListContext = new ArgListContext(this._ctx, this.state); - this.enterRule(_localctx, 68, QuintParser.RULE_argList); + this.enterRule(_localctx, 66, QuintParser.RULE_argList); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 758; + this.state = 743; this.expr(0); - this.state = 763; + this.state = 748; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 759; + this.state = 744; this.match(QuintParser.T__7); - this.state = 760; + this.state = 745; this.expr(0); } } - this.state = 765; + this.state = 750; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -3258,29 +3199,29 @@ export class QuintParser extends Parser { // @RuleVersion(0) public recElem(): RecElemContext { let _localctx: RecElemContext = new RecElemContext(this._ctx, this.state); - this.enterRule(_localctx, 70, QuintParser.RULE_recElem); + this.enterRule(_localctx, 68, QuintParser.RULE_recElem); try { - this.state = 772; + this.state = 757; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 766; + this.state = 751; this.simpleId("record"); - this.state = 767; + this.state = 752; this.match(QuintParser.T__4); - this.state = 768; + this.state = 753; this.expr(0); } break; case QuintParser.T__37: this.enterOuterAlt(_localctx, 2); { - this.state = 770; + this.state = 755; this.match(QuintParser.T__37); - this.state = 771; + this.state = 756; this.expr(0); } break; @@ -3305,17 +3246,17 @@ export class QuintParser extends Parser { // @RuleVersion(0) public normalCallName(): NormalCallNameContext { let _localctx: NormalCallNameContext = new NormalCallNameContext(this._ctx, this.state); - this.enterRule(_localctx, 72, QuintParser.RULE_normalCallName); + this.enterRule(_localctx, 70, QuintParser.RULE_normalCallName); let _la: number; try { - this.state = 776; + this.state = 761; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 774; + this.state = 759; this.qualId(); } break; @@ -3328,7 +3269,7 @@ export class QuintParser extends Parser { case QuintParser.LIST: this.enterOuterAlt(_localctx, 2); { - this.state = 775; + this.state = 760; _localctx._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 43)) & ~0x1F) === 0 && ((1 << (_la - 43)) & ((1 << (QuintParser.AND - 43)) | (1 << (QuintParser.OR - 43)) | (1 << (QuintParser.IFF - 43)) | (1 << (QuintParser.IMPLIES - 43)) | (1 << (QuintParser.MAP - 43)) | (1 << (QuintParser.SET - 43)) | (1 << (QuintParser.LIST - 43)))) !== 0))) { @@ -3364,17 +3305,17 @@ export class QuintParser extends Parser { // @RuleVersion(0) public nameAfterDot(): NameAfterDotContext { let _localctx: NameAfterDotContext = new NameAfterDotContext(this._ctx, this.state); - this.enterRule(_localctx, 74, QuintParser.RULE_nameAfterDot); + this.enterRule(_localctx, 72, QuintParser.RULE_nameAfterDot); let _la: number; try { - this.state = 780; + this.state = 765; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 778; + this.state = 763; this.qualId(); } break; @@ -3384,7 +3325,7 @@ export class QuintParser extends Parser { case QuintParser.IMPLIES: this.enterOuterAlt(_localctx, 2); { - this.state = 779; + this.state = 764; _localctx._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 43)) & ~0x1F) === 0 && ((1 << (_la - 43)) & ((1 << (QuintParser.AND - 43)) | (1 << (QuintParser.OR - 43)) | (1 << (QuintParser.IFF - 43)) | (1 << (QuintParser.IMPLIES - 43)))) !== 0))) { @@ -3420,12 +3361,12 @@ export class QuintParser extends Parser { // @RuleVersion(0) public operator(): OperatorContext { let _localctx: OperatorContext = new OperatorContext(this._ctx, this.state); - this.enterRule(_localctx, 76, QuintParser.RULE_operator); + this.enterRule(_localctx, 74, QuintParser.RULE_operator); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 782; + this.state = 767; _la = this._input.LA(1); if (!(((((_la - 31)) & ~0x1F) === 0 && ((1 << (_la - 31)) & ((1 << (QuintParser.T__30 - 31)) | (1 << (QuintParser.AND - 31)) | (1 << (QuintParser.OR - 31)) | (1 << (QuintParser.IFF - 31)) | (1 << (QuintParser.IMPLIES - 31)) | (1 << (QuintParser.PLUS - 31)) | (1 << (QuintParser.MINUS - 31)) | (1 << (QuintParser.MUL - 31)) | (1 << (QuintParser.DIV - 31)) | (1 << (QuintParser.MOD - 31)) | (1 << (QuintParser.GT - 31)) | (1 << (QuintParser.LT - 31)) | (1 << (QuintParser.GE - 31)) | (1 << (QuintParser.LE - 31)) | (1 << (QuintParser.NE - 31)) | (1 << (QuintParser.EQ - 31)))) !== 0))) { this._errHandler.recoverInline(this); @@ -3456,12 +3397,12 @@ export class QuintParser extends Parser { // @RuleVersion(0) public literal(): LiteralContext { let _localctx: LiteralContext = new LiteralContext(this._ctx, this.state); - this.enterRule(_localctx, 78, QuintParser.RULE_literal); + this.enterRule(_localctx, 76, QuintParser.RULE_literal); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 784; + this.state = 769; _la = this._input.LA(1); if (!(((((_la - 40)) & ~0x1F) === 0 && ((1 << (_la - 40)) & ((1 << (QuintParser.STRING - 40)) | (1 << (QuintParser.BOOL - 40)) | (1 << (QuintParser.INT - 40)))) !== 0))) { this._errHandler.recoverInline(this); @@ -3492,30 +3433,30 @@ export class QuintParser extends Parser { // @RuleVersion(0) public qualId(): QualIdContext { let _localctx: QualIdContext = new QualIdContext(this._ctx, this.state); - this.enterRule(_localctx, 80, QuintParser.RULE_qualId); + this.enterRule(_localctx, 78, QuintParser.RULE_qualId); try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 786; + this.state = 771; this.identifier(); - this.state = 791; + this.state = 776; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 86, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 84, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 787; + this.state = 772; this.match(QuintParser.T__38); - this.state = 788; + this.state = 773; this.identifier(); } } } - this.state = 793; + this.state = 778; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 86, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 84, this._ctx); } } } @@ -3536,15 +3477,15 @@ export class QuintParser extends Parser { // @RuleVersion(0) public simpleId(context: string): SimpleIdContext { let _localctx: SimpleIdContext = new SimpleIdContext(this._ctx, this.state, context); - this.enterRule(_localctx, 82, QuintParser.RULE_simpleId); + this.enterRule(_localctx, 80, QuintParser.RULE_simpleId); try { - this.state = 798; + this.state = 783; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 87, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 85, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 794; + this.state = 779; this.identifier(); } break; @@ -3552,7 +3493,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 795; + this.state = 780; _localctx._qualId = this.qualId(); const err = quintErrorToString( @@ -3583,12 +3524,12 @@ export class QuintParser extends Parser { // @RuleVersion(0) public identifier(): IdentifierContext { let _localctx: IdentifierContext = new IdentifierContext(this._ctx, this.state); - this.enterRule(_localctx, 84, QuintParser.RULE_identifier); + this.enterRule(_localctx, 82, QuintParser.RULE_identifier); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 800; + this.state = 785; _la = this._input.LA(1); if (!(_la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID)) { this._errHandler.recoverInline(this); @@ -3619,10 +3560,10 @@ export class QuintParser extends Parser { public sempred(_localctx: RuleContext, ruleIndex: number, predIndex: number): boolean { switch (ruleIndex) { - case 18: + case 17: return this.type_sempred(_localctx as TypeContext, predIndex); - case 22: + case 21: return this.expr_sempred(_localctx as ExprContext, predIndex); } return true; @@ -3640,47 +3581,47 @@ export class QuintParser extends Parser { private expr_sempred(_localctx: ExprContext, predIndex: number): boolean { switch (predIndex) { case 2: - return this.precpred(this._ctx, 27); + return this.precpred(this._ctx, 26); case 3: - return this.precpred(this._ctx, 25); + return this.precpred(this._ctx, 24); case 4: - return this.precpred(this._ctx, 24); + return this.precpred(this._ctx, 23); case 5: - return this.precpred(this._ctx, 23); + return this.precpred(this._ctx, 22); case 6: - return this.precpred(this._ctx, 21); + return this.precpred(this._ctx, 20); case 7: - return this.precpred(this._ctx, 19); + return this.precpred(this._ctx, 18); case 8: - return this.precpred(this._ctx, 17); + return this.precpred(this._ctx, 16); case 9: - return this.precpred(this._ctx, 16); + return this.precpred(this._ctx, 15); case 10: - return this.precpred(this._ctx, 15); + return this.precpred(this._ctx, 14); case 11: - return this.precpred(this._ctx, 8); + return this.precpred(this._ctx, 7); case 12: - return this.precpred(this._ctx, 31); + return this.precpred(this._ctx, 30); case 13: - return this.precpred(this._ctx, 28); + return this.precpred(this._ctx, 27); } return true; } private static readonly _serializedATNSegments: number = 2; private static readonly _serializedATNSegment0: string = - "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03H\u0325\x04\x02" + + "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03H\u0316\x04\x02" + "\t\x02\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06\x04\x07" + "\t\x07\x04\b\t\b\x04\t\t\t\x04\n\t\n\x04\v\t\v\x04\f\t\f\x04\r\t\r\x04" + "\x0E\t\x0E\x04\x0F\t\x0F\x04\x10\t\x10\x04\x11\t\x11\x04\x12\t\x12\x04" + @@ -3688,422 +3629,415 @@ export class QuintParser extends Parser { "\x18\t\x18\x04\x19\t\x19\x04\x1A\t\x1A\x04\x1B\t\x1B\x04\x1C\t\x1C\x04" + "\x1D\t\x1D\x04\x1E\t\x1E\x04\x1F\t\x1F\x04 \t \x04!\t!\x04\"\t\"\x04#" + "\t#\x04$\t$\x04%\t%\x04&\t&\x04\'\t\'\x04(\t(\x04)\t)\x04*\t*\x04+\t+" + - "\x04,\t,\x03\x02\x06\x02Z\n\x02\r\x02\x0E\x02[\x03\x02\x03\x02\x03\x03" + - "\x07\x03a\n\x03\f\x03\x0E\x03d\v\x03\x03\x03\x03\x03\x03\x03\x03\x03\x07" + - "\x03j\n\x03\f\x03\x0E\x03m\v\x03\x03\x03\x03\x03\x03\x04\x07\x04r\n\x04" + - "\f\x04\x0E\x04u\v\x04\x03\x04\x03\x04\x03\x05\x03\x05\x03\x05\x03\x05" + + "\x03\x02\x06\x02X\n\x02\r\x02\x0E\x02Y\x03\x02\x03\x02\x03\x03\x07\x03" + + "_\n\x03\f\x03\x0E\x03b\v\x03\x03\x03\x03\x03\x03\x03\x03\x03\x07\x03h" + + "\n\x03\f\x03\x0E\x03k\v\x03\x03\x03\x03\x03\x03\x04\x07\x04p\n\x04\f\x04" + + "\x0E\x04s\v\x04\x03\x04\x03\x04\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05" + "\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05" + - "\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x05\x05\x8D\n" + - "\x05\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x07\x06\x95\n\x06" + - "\f\x06\x0E\x06\x98\v\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x05\x06" + - "\x9F\n\x06\x03\x06\x05\x06\xA2\n\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03" + - "\x06\x03\x06\x07\x06\xAA\n\x06\f\x06\x0E\x06\xAD\v\x06\x05\x06\xAF\n\x06" + - "\x03\x06\x05\x06\xB2\n\x06\x03\x06\x03\x06\x05\x06\xB6\n\x06\x03\x06\x03" + - "\x06\x05\x06\xBA\n\x06\x03\x06\x05\x06\xBD\n\x06\x05\x06\xBF\n\x06\x03" + + "\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x05\x05\x8B\n\x05\x03" + + "\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x07\x06\x93\n\x06\f\x06\x0E" + + "\x06\x96\v\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x05\x06\x9D\n\x06" + + "\x03\x06\x05\x06\xA0\n\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03" + + "\x06\x07\x06\xA8\n\x06\f\x06\x0E\x06\xAB\v\x06\x05\x06\xAD\n\x06\x03\x06" + + "\x05\x06\xB0\n\x06\x03\x06\x03\x06\x05\x06\xB4\n\x06\x03\x06\x03\x06\x05" + + "\x06\xB8\n\x06\x03\x06\x05\x06\xBB\n\x06\x05\x06\xBD\n\x06\x03\x07\x03" + "\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03" + - "\x07\x03\x07\x03\x07\x05\x07\xCD\n\x07\x03\b\x03\b\x03\b\x03\b\x03\b\x07" + - "\b\xD4\n\b\f\b\x0E\b\xD7\v\b\x03\b\x05\b\xDA\n\b\x03\t\x05\t\xDD\n\t\x03" + - "\t\x03\t\x03\t\x07\t\xE2\n\t\f\t\x0E\t\xE5\v\t\x03\n\x03\n\x03\n\x03\n" + - "\x03\n\x05\n\xEC\n\n\x03\v\x03\v\x03\v\x03\v\x05\v\xF2\n\v\x03\v\x03\v" + - "\x03\v\x05\v\xF7\n\v\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03" + - "\f\x05\f\u0102\n\f\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x05\r\u010A\n\r" + - "\x03\r\x03\r\x03\r\x03\r\x05\r\u0110\n\r\x03\r\x03\r\x05\r\u0114\n\r\x05" + - "\r\u0116\n\r\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03" + - "\x0E\x03\x0E\x05\x0E\u0121\n\x0E\x05\x0E\u0123\n\x0E\x03\x0F\x03\x0F\x03" + - "\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x07" + - "\x0F\u0130\n\x0F\f\x0F\x0E\x0F\u0133\v\x0F\x03\x0F\x03\x0F\x03\x0F\x03" + - "\x0F\x03\x0F\x05\x0F\u013A\n\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F" + - "\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x07\x0F\u0147\n\x0F\f" + - "\x0F\x0E\x0F\u014A\v\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x05\x0F" + - "\u0151\n\x0F\x05\x0F\u0153\n\x0F\x03\x10\x03\x10\x03\x11\x03\x11\x03\x12" + - "\x03\x12\x03\x13\x03\x13\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14" + - "\u0162\n\x14\f\x14\x0E\x14\u0165\v\x14\x05\x14\u0167\n\x14\x03\x14\x05" + - "\x14\u016A\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + - "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + - "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u0181\n\x14\f\x14\x0E" + - "\x14\u0184\v\x14\x03\x14\x05\x14\u0187\n\x14\x03\x14\x03\x14\x03\x14\x03" + - "\x14\x05\x14\u018D\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + - "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + - "\x07\x14\u019E\n\x14\f\x14\x0E\x14\u01A1\v\x14\x03\x14\x03\x14\x05\x14" + - "\u01A5\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u01AD" + - "\n\x14\f\x14\x0E\x14\u01B0\v\x14\x03\x15\x03\x15\x03\x16\x03\x16\x03\x16" + - "\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x07\x16\u01BD\n\x16\f" + - "\x16\x0E\x16\u01C0\v\x16\x03\x16\x03\x16\x03\x16\x05\x16\u01C5\n\x16\x03" + - "\x16\x03\x16\x05\x16\u01C9\n\x16\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x05\x18\u01D2\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x07\x18\u01E2\n\x18\f\x18\x0E\x18\u01E5\v\x18\x03\x18\x05\x18\u01E8" + - "\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18" + - "\u01F1\n\x18\f\x18\x0E\x18\u01F4\v\x18\x03\x18\x05\x18\u01F7\n\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0201" + - "\n\x18\f\x18\x0E\x18\u0204\v\x18\x03\x18\x05\x18\u0207\n\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0210\n\x18\f\x18" + - "\x0E\x18\u0213\v\x18\x03\x18\x05\x18\u0216\n\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x05\x18\u021E\n\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x07\x18\u0226\n\x18\f\x18\x0E\x18\u0229\v\x18\x03" + - "\x18\x05\x18\u022C\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x07\x18\u0236\n\x18\f\x18\x0E\x18\u0239\v\x18\x03\x18" + - "\x05\x18\u023C\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07" + - "\x18\u0244\n\x18\f\x18\x0E\x18\u0247\v\x18\x05\x18\u0249\n\x18\x03\x18" + - "\x05\x18\u024C\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u0265" + - "\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x05\x18\u028C\n\x18\x03\x18\x05\x18\u028F\n\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0296\n\x18\f\x18\x0E\x18\u0299" + - "\v\x18\x03\x19\x03\x19\x03\x19\x03\x19\x05\x19\u029F\n\x19\x03\x19\x03" + - "\x19\x03\x19\x07\x19\u02A4\n\x19\f\x19\x0E\x19\u02A7\v\x19\x03\x19\x03" + - "\x19\x03\x1A\x03\x1A\x05\x1A\u02AD\n\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1B" + - "\x03\x1B\x03\x1B\x03\x1B\x05\x1B\u02B6\n\x1B\x03\x1B\x05\x1B\u02B9\n\x1B" + - "\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C" + - "\x05\x1C\u02C4\n\x1C\x03\x1D\x03\x1D\x05\x1D\u02C8\n\x1D\x03\x1E\x03\x1E" + - "\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x07\x1E\u02D2\n\x1E\f" + - "\x1E\x0E\x1E\u02D5\v\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x05\x1E\u02DB" + - "\n\x1E\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x06\x1F\u02E2\n\x1F\r\x1F" + - "\x0E\x1F\u02E3\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03 \x03 \x05 " + - "\u02ED\n \x03!\x03!\x03\"\x03\"\x03\"\x03\"\x03#\x03#\x05#\u02F7\n#\x03" + - "$\x03$\x03$\x07$\u02FC\n$\f$\x0E$\u02FF\v$\x03%\x03%\x03%\x03%\x03%\x03" + - "%\x05%\u0307\n%\x03&\x03&\x05&\u030B\n&\x03\'\x03\'\x05\'\u030F\n\'\x03" + - "(\x03(\x03)\x03)\x03*\x03*\x03*\x07*\u0318\n*\f*\x0E*\u031B\v*\x03+\x03" + - "+\x03+\x03+\x05+\u0321\n+\x03,\x03,\x03,\x02\x02\x04&.-\x02\x02\x04\x02" + - "\x06\x02\b\x02\n\x02\f\x02\x0E\x02\x10\x02\x12\x02\x14\x02\x16\x02\x18" + - "\x02\x1A\x02\x1C\x02\x1E\x02 \x02\"\x02$\x02&\x02(\x02*\x02,\x02.\x02" + - "0\x022\x024\x026\x028\x02:\x02<\x02>\x02@\x02B\x02D\x02F\x02H\x02J\x02" + - "L\x02N\x02P\x02R\x02T\x02V\x02\x02\n\x03\x0257\x03\x0234\x03\x028=\x04" + - "\x02-1AB\x03\x02-0\x05\x02!!-03=\x03\x02*,\x03\x02CD\x02\u0388\x02Y\x03" + - "\x02\x02\x02\x04b\x03\x02\x02\x02\x06s\x03\x02\x02\x02\b\x8C\x03\x02\x02" + - "\x02\n\xBE\x03\x02\x02\x02\f\xCC\x03\x02\x02\x02\x0E\xCE\x03\x02\x02\x02" + - "\x10\xDC\x03\x02\x02\x02\x12\xE6\x03\x02\x02\x02\x14\xED\x03\x02\x02\x02" + - "\x16\u0101\x03\x02\x02\x02\x18\u0115\x03\x02\x02\x02\x1A\u0122\x03\x02" + - "\x02\x02\x1C\u0152\x03\x02\x02\x02\x1E\u0154\x03\x02\x02\x02 \u0156\x03" + - "\x02\x02\x02\"\u0158\x03\x02\x02\x02$\u015A\x03\x02\x02\x02&\u01A4\x03" + - "\x02\x02\x02(\u01B1\x03\x02\x02\x02*\u01C8\x03\x02\x02\x02,\u01CA\x03" + - "\x02\x02\x02.\u0264\x03\x02\x02\x020\u029A\x03\x02\x02\x022\u02AC\x03" + - "\x02\x02\x024\u02B1\x03\x02\x02\x026\u02C3\x03\x02\x02\x028\u02C7\x03" + - "\x02\x02\x02:\u02DA\x03\x02\x02\x02<\u02DC\x03\x02\x02\x02>\u02EC\x03" + - "\x02\x02\x02@\u02EE\x03\x02\x02\x02B\u02F0\x03\x02\x02\x02D\u02F6\x03" + - "\x02\x02\x02F\u02F8\x03\x02\x02\x02H\u0306\x03\x02\x02\x02J\u030A\x03" + - "\x02\x02\x02L\u030E\x03\x02\x02\x02N\u0310\x03\x02\x02\x02P\u0312\x03" + - "\x02\x02\x02R\u0314\x03\x02\x02\x02T\u0320\x03\x02\x02\x02V\u0322\x03" + - "\x02\x02\x02XZ\x05\x04\x03\x02YX\x03\x02\x02\x02Z[\x03\x02\x02\x02[Y\x03" + - "\x02\x02\x02[\\\x03\x02\x02\x02\\]\x03\x02\x02\x02]^\x07\x02\x02\x03^" + - "\x03\x03\x02\x02\x02_a\x07E\x02\x02`_\x03\x02\x02\x02ad\x03\x02\x02\x02" + - "b`\x03\x02\x02\x02bc\x03\x02\x02\x02ce\x03\x02\x02\x02db\x03\x02\x02\x02" + - "ef\x07\x03\x02\x02fg\x05R*\x02gk\x07\x04\x02\x02hj\x05\x06\x04\x02ih\x03" + - "\x02\x02\x02jm\x03\x02\x02\x02ki\x03\x02\x02\x02kl\x03\x02\x02\x02ln\x03" + - "\x02\x02\x02mk\x03\x02\x02\x02no\x07\x05\x02\x02o\x05\x03\x02\x02\x02" + - "pr\x07E\x02\x02qp\x03\x02\x02\x02ru\x03\x02\x02\x02sq\x03\x02\x02\x02" + - "st\x03\x02\x02\x02tv\x03\x02\x02\x02us\x03\x02\x02\x02vw\x05\b\x05\x02" + - "w\x07\x03\x02\x02\x02xy\x07\x06\x02\x02yz\x05R*\x02z{\x07\x07\x02\x02" + - "{|\x05&\x14\x02|\x8D\x03\x02\x02\x02}~\x07\b\x02\x02~\x7F\x05R*\x02\x7F" + - "\x80\x07\x07\x02\x02\x80\x81\x05&\x14\x02\x81\x8D\x03\x02\x02\x02\x82" + - "\x83\x07\t\x02\x02\x83\x84\x05> \x02\x84\x85\x07>\x02\x02\x85\x86\x05" + - ".\x18\x02\x86\x8D\x03\x02\x02\x02\x87\x8D\x05\x1C\x0F\x02\x88\x8D\x05" + - "\n\x06\x02\x89\x8D\x05\f\x07\x02\x8A\x8D\x05\x18\r\x02\x8B\x8D\x05\x1A" + - "\x0E\x02\x8Cx\x03\x02\x02\x02\x8C}\x03\x02\x02\x02\x8C\x82\x03\x02\x02" + - "\x02\x8C\x87\x03\x02\x02\x02\x8C\x88\x03\x02\x02\x02\x8C\x89\x03\x02\x02" + - "\x02\x8C\x8A\x03\x02\x02\x02\x8C\x8B\x03\x02\x02\x02\x8D\t\x03\x02\x02" + - "\x02\x8E\x8F\x05\x16\f\x02\x8F\x90\x05J&\x02\x90\x91\x07?\x02\x02\x91" + - "\x96\x05B\"\x02\x92\x93\x07\n\x02\x02\x93\x95\x05B\"\x02\x94\x92\x03\x02" + - "\x02\x02\x95\x98\x03\x02\x02\x02\x96\x94\x03\x02\x02\x02\x96\x97\x03\x02" + - "\x02\x02\x97\x99\x03\x02\x02\x02\x98\x96\x03\x02\x02\x02\x99\x9A\x07@" + - "\x02\x02\x9A\x9B\x07\x07\x02\x02\x9B\x9E\x05&\x14\x02\x9C\x9D\x07>\x02" + - "\x02\x9D\x9F\x05.\x18\x02\x9E\x9C\x03\x02\x02\x02\x9E\x9F\x03\x02\x02" + - "\x02\x9F\xA1\x03\x02\x02\x02\xA0\xA2\x07\v\x02\x02\xA1\xA0\x03\x02\x02" + - "\x02\xA1\xA2\x03\x02\x02\x02\xA2\xBF\x03\x02\x02\x02\xA3\xA4\x05\x16\f" + - "\x02\xA4\xB1\x05J&\x02\xA5\xAE\x07?\x02\x02\xA6\xAB\x05@!\x02\xA7\xA8" + - "\x07\n\x02\x02\xA8\xAA\x05@!\x02\xA9\xA7\x03\x02\x02\x02\xAA\xAD\x03\x02" + - "\x02\x02\xAB\xA9\x03\x02\x02\x02\xAB\xAC\x03\x02\x02\x02\xAC\xAF\x03\x02" + - "\x02\x02\xAD\xAB\x03\x02\x02\x02\xAE\xA6\x03\x02\x02\x02\xAE\xAF\x03\x02" + - "\x02\x02\xAF\xB0\x03\x02\x02\x02\xB0\xB2\x07@\x02\x02\xB1\xA5\x03\x02" + - "\x02\x02\xB1\xB2\x03\x02\x02\x02\xB2\xB5\x03\x02\x02\x02\xB3\xB4\x07\x07" + - "\x02\x02\xB4\xB6\x05&\x14\x02\xB5\xB3\x03\x02\x02\x02\xB5\xB6\x03\x02" + - "\x02\x02\xB6\xB9\x03\x02\x02\x02\xB7\xB8\x07>\x02\x02\xB8\xBA\x05.\x18" + - "\x02\xB9\xB7\x03\x02\x02\x02\xB9\xBA\x03\x02\x02\x02\xBA\xBC\x03\x02\x02" + - "\x02\xBB\xBD\x07\v\x02\x02\xBC\xBB\x03\x02\x02\x02\xBC\xBD\x03\x02\x02" + - "\x02\xBD\xBF\x03\x02\x02\x02\xBE\x8E\x03\x02\x02\x02\xBE\xA3\x03\x02\x02" + - "\x02\xBF\v\x03\x02\x02\x02\xC0\xC1\x07\f\x02\x02\xC1\xCD\x05R*\x02\xC2" + - "\xC3\x07\f\x02\x02\xC3\xC4\x05\x0E\b\x02\xC4\xC5\x07>\x02\x02\xC5\xC6" + - "\x05&\x14\x02\xC6\xCD\x03\x02\x02\x02\xC7\xC8\x07\f\x02\x02\xC8\xC9\x05" + - "\x0E\b\x02\xC9\xCA\x07>\x02\x02\xCA\xCB\x05\x10\t\x02\xCB\xCD\x03\x02" + - "\x02\x02\xCC\xC0\x03\x02\x02\x02\xCC\xC2\x03\x02\x02\x02\xCC\xC7\x03\x02" + - "\x02\x02\xCD\r\x03\x02\x02\x02\xCE\xD9\x05R*\x02\xCF\xD0\x07\r\x02\x02" + - "\xD0\xD5\x07C\x02\x02\xD1\xD2\x07\n\x02\x02\xD2\xD4\x07C\x02\x02\xD3\xD1" + - "\x03\x02\x02\x02\xD4\xD7\x03\x02\x02\x02\xD5\xD3\x03\x02\x02\x02\xD5\xD6" + - "\x03\x02\x02\x02\xD6\xD8\x03\x02\x02\x02\xD7\xD5\x03\x02\x02\x02\xD8\xDA" + - "\x07\x0E\x02\x02\xD9\xCF\x03\x02\x02\x02\xD9\xDA\x03\x02\x02\x02\xDA\x0F" + - "\x03\x02\x02\x02\xDB\xDD\x07\x0F\x02\x02\xDC\xDB\x03\x02\x02\x02\xDC\xDD" + - "\x03\x02\x02\x02\xDD\xDE\x03\x02\x02\x02\xDE\xE3\x05\x12\n\x02\xDF\xE0" + - "\x07\x0F\x02\x02\xE0\xE2\x05\x12\n\x02\xE1\xDF\x03\x02\x02\x02\xE2\xE5" + - "\x03\x02\x02\x02\xE3\xE1\x03\x02\x02\x02\xE3\xE4\x03\x02\x02\x02\xE4\x11" + - "\x03\x02\x02\x02\xE5\xE3\x03\x02\x02\x02\xE6\xEB\x05T+\x02\xE7\xE8\x07" + - "?\x02\x02\xE8\xE9\x05&\x14\x02\xE9\xEA\x07@\x02\x02\xEA\xEC\x03\x02\x02" + - "\x02\xEB\xE7\x03\x02\x02\x02\xEB\xEC\x03\x02\x02\x02\xEC\x13\x03\x02\x02" + - "\x02\xED\xEE\x07\x10\x02\x02\xEE\xF1\x05R*\x02\xEF\xF0\x07\x07\x02\x02" + - "\xF0\xF2\x05&\x14\x02\xF1\xEF\x03\x02\x02\x02\xF1\xF2\x03\x02\x02\x02" + - "\xF2\xF3\x03\x02\x02\x02\xF3\xF4\x07>\x02\x02\xF4\xF6\x05.\x18\x02\xF5" + - "\xF7\x07\v\x02\x02\xF6\xF5\x03\x02\x02\x02\xF6\xF7\x03\x02\x02\x02\xF7" + - "\x15\x03\x02\x02\x02\xF8\u0102\x07\x11\x02\x02\xF9\u0102\x07\x12\x02\x02" + - "\xFA\xFB\x07\x13\x02\x02\xFB\u0102\x07\x11\x02\x02\xFC\xFD\x07\x13\x02" + - "\x02\xFD\u0102\x07\x12\x02\x02\xFE\u0102\x07\x14\x02\x02\xFF\u0102\x07" + - "\x15\x02\x02\u0100\u0102\x07\x16\x02\x02\u0101\xF8\x03\x02\x02\x02\u0101" + - "\xF9\x03\x02\x02\x02\u0101\xFA\x03\x02\x02\x02\u0101\xFC\x03\x02\x02\x02" + - "\u0101\xFE\x03\x02\x02\x02\u0101\xFF\x03\x02\x02\x02\u0101\u0100\x03\x02" + - "\x02\x02\u0102\x17\x03\x02\x02\x02\u0103\u0104\x07\x17\x02\x02\u0104\u0105" + - "\x05 \x11\x02\u0105\u0106\x07\x18\x02\x02\u0106\u0109\x05D#\x02\u0107" + - "\u0108\x07\x19\x02\x02\u0108\u010A\x05$\x13\x02\u0109\u0107\x03\x02\x02" + - "\x02\u0109\u010A\x03\x02\x02\x02\u010A\u0116\x03\x02\x02\x02\u010B\u010C" + - "\x07\x17\x02\x02\u010C\u010F\x05 \x11\x02\u010D\u010E\x07\x1A\x02\x02" + - "\u010E\u0110\x05 \x11\x02\u010F\u010D\x03\x02\x02\x02\u010F\u0110\x03" + - "\x02\x02\x02\u0110\u0113\x03\x02\x02\x02\u0111\u0112\x07\x19\x02\x02\u0112" + - "\u0114\x05$\x13\x02\u0113\u0111\x03\x02\x02\x02\u0113\u0114\x03\x02\x02" + - "\x02\u0114\u0116\x03\x02\x02\x02\u0115\u0103\x03\x02\x02\x02\u0115\u010B" + - "\x03\x02\x02\x02\u0116\x19\x03\x02\x02\x02\u0117\u0118\x07\x1B\x02\x02" + - "\u0118\u0119\x05 \x11\x02\u0119\u011A\x07\x18\x02\x02\u011A\u011B\x05" + - "D#\x02\u011B\u0123\x03\x02\x02\x02\u011C\u011D\x07\x1B\x02\x02\u011D\u0120" + - "\x05 \x11\x02\u011E\u011F\x07\x1A\x02\x02\u011F\u0121\x05 \x11\x02\u0120" + - "\u011E\x03\x02\x02\x02\u0120\u0121\x03\x02\x02\x02\u0121\u0123\x03\x02" + - "\x02\x02\u0122\u0117\x03\x02\x02\x02\u0122\u011C\x03\x02\x02\x02\u0123" + - "\x1B\x03\x02\x02\x02\u0124\u0125\x07\x17\x02\x02\u0125\u0126\x05\x1E\x10" + - "\x02\u0126\u0127\x07?\x02\x02\u0127\u0128\x05 \x11\x02\u0128\u0129\x07" + - ">\x02\x02\u0129\u0131\x05.\x18\x02\u012A\u012B\x07\n\x02\x02\u012B\u012C" + - "\x05 \x11\x02\u012C\u012D\x07>\x02\x02\u012D\u012E\x05.\x18\x02\u012E" + - "\u0130\x03\x02\x02\x02\u012F\u012A\x03\x02\x02\x02\u0130\u0133\x03\x02" + - "\x02\x02\u0131\u012F\x03\x02\x02\x02\u0131\u0132\x03\x02\x02\x02\u0132" + - "\u0134\x03\x02\x02\x02\u0133\u0131\x03\x02\x02\x02\u0134\u0135\x07@\x02" + - "\x02\u0135\u0136\x07\x18\x02\x02\u0136\u0139\x075\x02\x02\u0137\u0138" + - "\x07\x19\x02\x02\u0138\u013A\x05$\x13\x02\u0139\u0137\x03\x02\x02\x02" + - "\u0139\u013A\x03\x02\x02\x02\u013A\u0153\x03\x02\x02\x02\u013B\u013C\x07" + - "\x17\x02\x02\u013C\u013D\x05\x1E\x10\x02\u013D\u013E\x07?\x02\x02\u013E" + - "\u013F\x05 \x11\x02\u013F\u0140\x07>\x02\x02\u0140\u0148\x05.\x18\x02" + - "\u0141\u0142\x07\n\x02\x02\u0142\u0143\x05 \x11\x02\u0143\u0144\x07>\x02" + - "\x02\u0144\u0145\x05.\x18\x02\u0145\u0147\x03\x02\x02\x02\u0146\u0141" + - "\x03\x02\x02\x02\u0147\u014A\x03\x02\x02\x02\u0148\u0146\x03\x02\x02\x02" + - "\u0148\u0149\x03\x02\x02\x02\u0149\u014B\x03\x02\x02\x02\u014A\u0148\x03" + - "\x02\x02\x02\u014B\u014C\x07@\x02\x02\u014C\u014D\x07\x1A\x02\x02\u014D" + - "\u0150\x05\"\x12\x02\u014E\u014F\x07\x19\x02\x02\u014F\u0151\x05$\x13" + - "\x02\u0150\u014E\x03\x02\x02\x02\u0150\u0151\x03\x02\x02\x02\u0151\u0153" + - "\x03\x02\x02\x02\u0152\u0124\x03\x02\x02\x02\u0152\u013B\x03\x02\x02\x02" + - "\u0153\x1D\x03\x02\x02\x02\u0154\u0155\x05R*\x02\u0155\x1F\x03\x02\x02" + - "\x02\u0156\u0157\x05R*\x02\u0157!\x03\x02\x02\x02\u0158\u0159\x05R*\x02" + - "\u0159#\x03\x02\x02\x02\u015A\u015B\x07*\x02\x02\u015B%\x03\x02\x02\x02" + - "\u015C\u015D\b\x14\x01\x02\u015D\u0166\x07?\x02\x02\u015E\u0163\x05&\x14" + - "\x02\u015F\u0160\x07\n\x02\x02\u0160\u0162\x05&\x14\x02\u0161\u015F\x03" + - "\x02\x02\x02\u0162\u0165\x03\x02\x02\x02\u0163\u0161\x03\x02\x02\x02\u0163" + - "\u0164\x03\x02\x02\x02\u0164\u0167\x03\x02\x02\x02\u0165\u0163\x03\x02" + - "\x02\x02\u0166\u015E\x03\x02\x02\x02\u0166\u0167\x03\x02\x02\x02\u0167" + - "\u0169\x03\x02\x02\x02\u0168\u016A\x07\n\x02\x02\u0169\u0168\x03\x02\x02" + - "\x02\u0169\u016A\x03\x02\x02\x02\u016A\u016B\x03\x02\x02\x02\u016B\u016C" + - "\x07@\x02\x02\u016C\u016D\x07\x1D\x02\x02\u016D\u01A5\x05&\x14\x0F\u016E" + - "\u016F\x07A\x02\x02\u016F\u0170\x07\r\x02\x02\u0170\u0171\x05&\x14\x02" + - "\u0171\u0172\x07\x0E\x02\x02\u0172\u01A5\x03\x02\x02\x02\u0173\u0174\x07" + - "B\x02\x02\u0174\u0175\x07\r\x02\x02\u0175\u0176\x05&\x14\x02\u0176\u0177" + - "\x07\x0E\x02\x02\u0177\u01A5\x03\x02\x02\x02\u0178\u0179\x07?\x02\x02" + - "\u0179\u01A5\x07@\x02\x02\u017A\u017B\x07?\x02\x02\u017B\u017C\x05&\x14" + - "\x02\u017C\u017D\x07\n\x02\x02\u017D\u0182\x05&\x14\x02\u017E\u017F\x07" + - "\n\x02\x02\u017F\u0181\x05&\x14\x02\u0180\u017E\x03\x02\x02\x02\u0181" + - "\u0184\x03\x02\x02\x02\u0182\u0180\x03\x02\x02\x02\u0182\u0183\x03\x02" + - "\x02\x02\u0183\u0186\x03\x02\x02\x02\u0184\u0182\x03\x02\x02\x02\u0185" + - "\u0187\x07\n\x02\x02\u0186\u0185\x03\x02\x02\x02\u0186\u0187\x03\x02\x02" + - "\x02\u0187\u0188\x03\x02\x02\x02\u0188\u0189\x07@\x02\x02\u0189\u01A5" + - "\x03\x02\x02\x02\u018A\u018C\x07\x04\x02\x02\u018B\u018D\x05*\x16\x02" + - "\u018C\u018B\x03\x02\x02\x02\u018C\u018D\x03\x02\x02\x02\u018D\u018E\x03" + - "\x02\x02\x02\u018E\u01A5\x07\x05\x02\x02\u018F\u01A5\x07\x1E\x02\x02\u0190" + - "\u01A5\x07\x1F\x02\x02\u0191\u01A5\x07 \x02\x02\u0192\u01A5\x05(\x15\x02" + - "\u0193\u01A5\x05R*\x02\u0194\u0195\x07?\x02\x02\u0195\u0196\x05&\x14\x02" + - "\u0196\u0197\x07@\x02\x02\u0197\u01A5\x03\x02\x02\x02\u0198\u0199\x05" + - "R*\x02\u0199\u019A\x07\r\x02\x02\u019A\u019F\x05&\x14\x02\u019B\u019C" + - "\x07\n\x02\x02\u019C\u019E\x05&\x14\x02\u019D\u019B\x03\x02\x02\x02\u019E" + - "\u01A1\x03\x02\x02\x02\u019F\u019D\x03\x02\x02\x02\u019F\u01A0\x03\x02" + - "\x02\x02\u01A0\u01A2\x03\x02\x02\x02\u01A1\u019F\x03\x02\x02\x02\u01A2" + - "\u01A3\x07\x0E\x02\x02\u01A3\u01A5\x03\x02\x02\x02\u01A4\u015C\x03\x02" + - "\x02\x02\u01A4\u016E\x03\x02\x02\x02\u01A4\u0173\x03\x02\x02\x02\u01A4" + - "\u0178\x03\x02\x02\x02\u01A4\u017A\x03\x02\x02\x02\u01A4\u018A\x03\x02" + - "\x02\x02\u01A4\u018F\x03\x02\x02\x02\u01A4\u0190\x03\x02\x02\x02\u01A4" + - "\u0191\x03\x02\x02\x02\u01A4\u0192\x03\x02\x02\x02\u01A4\u0193\x03\x02" + - "\x02\x02\u01A4\u0194\x03\x02\x02\x02\u01A4\u0198\x03\x02\x02\x02\u01A5" + - "\u01AE\x03\x02\x02\x02\u01A6\u01A7\f\x11\x02\x02\u01A7\u01A8\x07\x1C\x02" + - "\x02\u01A8\u01AD\x05&\x14\x11\u01A9\u01AA\f\x10\x02\x02\u01AA\u01AB\x07" + - "\x1D\x02\x02\u01AB\u01AD\x05&\x14\x10\u01AC\u01A6\x03\x02\x02\x02\u01AC" + - "\u01A9\x03\x02\x02\x02\u01AD\u01B0\x03\x02\x02\x02\u01AE\u01AC\x03\x02" + - "\x02\x02\u01AE\u01AF\x03\x02\x02\x02\u01AF\'\x03\x02\x02\x02\u01B0\u01AE" + - "\x03\x02\x02\x02\u01B1\u01B2\x07C\x02\x02\u01B2)\x03\x02\x02\x02\u01B3" + - "\u01B4\x05,\x17\x02\u01B4\u01B5\x07\x07\x02\x02\u01B5\u01B6\x05&\x14\x02" + - "\u01B6\u01BE\x03\x02\x02\x02\u01B7\u01B8\x07\n\x02\x02\u01B8\u01B9\x05" + - ",\x17\x02\u01B9\u01BA\x07\x07\x02\x02\u01BA\u01BB\x05&\x14\x02\u01BB\u01BD" + - "\x03\x02\x02\x02\u01BC\u01B7\x03\x02\x02\x02\u01BD\u01C0\x03\x02\x02\x02" + - "\u01BE\u01BC\x03\x02\x02\x02\u01BE\u01BF\x03\x02\x02\x02\u01BF\u01C4\x03" + - "\x02\x02\x02\u01C0\u01BE\x03\x02\x02\x02\u01C1\u01C5\x07\n\x02\x02\u01C2" + - "\u01C3\x07\x0F\x02\x02\u01C3\u01C5\x05V,\x02\u01C4\u01C1\x03\x02\x02\x02" + - "\u01C4\u01C2\x03\x02\x02\x02\u01C4\u01C5\x03\x02\x02\x02\u01C5\u01C9\x03" + - "\x02\x02\x02\u01C6\u01C7\x07\x0F\x02\x02\u01C7\u01C9\x05V,\x02\u01C8\u01B3" + - "\x03\x02\x02\x02\u01C8\u01C6\x03\x02\x02\x02\u01C9+\x03\x02\x02\x02\u01CA" + - "\u01CB\x05T+\x02\u01CB-\x03\x02\x02\x02\u01CC\u01CD\b\x18\x01\x02\u01CD" + - "\u0265\x058\x1D\x02\u01CE\u01CF\x05J&\x02\u01CF\u01D1\x07?\x02\x02\u01D0" + - "\u01D2\x05F$\x02\u01D1\u01D0\x03\x02\x02\x02\u01D1\u01D2\x03\x02\x02\x02" + - "\u01D2\u01D3\x03\x02\x02\x02\u01D3\u01D4\x07@\x02\x02\u01D4\u0265\x03" + - "\x02\x02\x02\u01D5\u01D6\x074\x02\x02\u01D6\u0265\x05.\x18\x1C\u01D7\u01D8" + - "\x05R*\x02\u01D8\u01D9\x07\"\x02\x02\u01D9\u01DA\x07>\x02\x02\u01DA\u01DB" + - "\x05.\x18\x18\u01DB\u0265\x03\x02\x02\x02\u01DC\u01DD\x07-\x02\x02\u01DD" + - "\u01DE\x07\x04\x02\x02\u01DE\u01E3\x05.\x18\x02\u01DF\u01E0\x07\n\x02" + - "\x02\u01E0\u01E2\x05.\x18\x02\u01E1\u01DF\x03\x02\x02\x02\u01E2\u01E5" + - "\x03\x02\x02\x02\u01E3\u01E1\x03\x02\x02\x02\u01E3\u01E4\x03\x02\x02\x02" + - "\u01E4\u01E7\x03\x02\x02\x02\u01E5\u01E3\x03\x02\x02\x02\u01E6\u01E8\x07" + - "\n\x02\x02\u01E7\u01E6\x03\x02\x02\x02\u01E7\u01E8\x03\x02\x02\x02\u01E8" + - "\u01E9\x03\x02\x02\x02\u01E9\u01EA\x07\x05\x02\x02\u01EA\u0265\x03\x02" + - "\x02\x02\u01EB\u01EC\x07.\x02\x02\u01EC\u01ED"; + "\x07\x03\x07\x05\x07\xCB\n\x07\x03\b\x03\b\x03\b\x03\b\x03\b\x07\b\xD2" + + "\n\b\f\b\x0E\b\xD5\v\b\x03\b\x05\b\xD8\n\b\x03\t\x05\t\xDB\n\t\x03\t\x03" + + "\t\x03\t\x07\t\xE0\n\t\f\t\x0E\t\xE3\v\t\x03\n\x03\n\x03\n\x03\n\x03\n" + + "\x05\n\xEA\n\n\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03" + + "\v\x05\v\xF6\n\v\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x05\f\xFE\n\f\x03" + + "\f\x03\f\x03\f\x03\f\x05\f\u0104\n\f\x03\f\x03\f\x05\f\u0108\n\f\x05\f" + + "\u010A\n\f\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x05\r" + + "\u0115\n\r\x05\r\u0117\n\r\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03" + + "\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x07\x0E\u0124\n\x0E\f\x0E" + + "\x0E\x0E\u0127\v\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x05\x0E\u012E" + + "\n\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E" + + "\x03\x0E\x03\x0E\x03\x0E\x07\x0E\u013B\n\x0E\f\x0E\x0E\x0E\u013E\v\x0E" + + "\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x05\x0E\u0145\n\x0E\x05\x0E\u0147" + + "\n\x0E\x03\x0F\x03\x0F\x03\x10\x03\x10\x03\x11\x03\x11\x03\x12\x03\x12" + + "\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x07\x13\u0156\n\x13\f\x13\x0E" + + "\x13\u0159\v\x13\x05\x13\u015B\n\x13\x03\x13\x05\x13\u015E\n\x13\x03\x13" + + "\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13" + + "\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13" + + "\x03\x13\x03\x13\x07\x13\u0175\n\x13\f\x13\x0E\x13\u0178\v\x13\x03\x13" + + "\x05\x13\u017B\n\x13\x03\x13\x03\x13\x03\x13\x03\x13\x05\x13\u0181\n\x13" + + "\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13" + + "\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x07\x13\u0192\n\x13\f" + + "\x13\x0E\x13\u0195\v\x13\x03\x13\x03\x13\x05\x13\u0199\n\x13\x03\x13\x03" + + "\x13\x03\x13\x03\x13\x03\x13\x03\x13\x07\x13\u01A1\n\x13\f\x13\x0E\x13" + + "\u01A4\v\x13\x03\x14\x03\x14\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03" + + "\x15\x03\x15\x03\x15\x03\x15\x07\x15\u01B1\n\x15\f\x15\x0E\x15\u01B4\v" + + "\x15\x03\x15\x03\x15\x03\x15\x05\x15\u01B9\n\x15\x03\x15\x03\x15\x05\x15" + + "\u01BD\n\x15\x03\x16\x03\x16\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x05" + + "\x17\u01C6\n\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17" + + "\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x07\x17\u01D6" + + "\n\x17\f\x17\x0E\x17\u01D9\v\x17\x03\x17\x05\x17\u01DC\n\x17\x03\x17\x03" + + "\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x07\x17\u01E5\n\x17\f\x17" + + "\x0E\x17\u01E8\v\x17\x03\x17\x05\x17\u01EB\n\x17\x03\x17\x03\x17\x03\x17" + + "\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x07\x17\u01F5\n\x17\f\x17\x0E" + + "\x17\u01F8\v\x17\x03\x17\x05\x17\u01FB\n\x17\x03\x17\x03\x17\x03\x17\x03" + + "\x17\x03\x17\x03\x17\x03\x17\x07\x17\u0204\n\x17\f\x17\x0E\x17\u0207\v" + + "\x17\x03\x17\x05\x17\u020A\n\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17" + + "\x03\x17\x05\x17\u0212\n\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03" + + "\x17\x07\x17\u021A\n\x17\f\x17\x0E\x17\u021D\v\x17\x03\x17\x05\x17\u0220" + + "\n\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17" + + "\x07\x17\u022A\n\x17\f\x17\x0E\x17\u022D\v\x17\x03\x17\x05\x17\u0230\n" + + "\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x07\x17\u0238\n\x17" + + "\f\x17\x0E\x17\u023B\v\x17\x05\x17\u023D\n\x17\x03\x17\x05\x17\u0240\n" + + "\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03" + + "\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03" + + "\x17\x03\x17\x03\x17\x05\x17\u0256\n\x17\x03\x17\x03\x17\x03\x17\x03\x17" + + "\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17" + + "\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17" + + "\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17" + + "\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x05\x17\u027D\n\x17\x03" + + "\x17\x05\x17\u0280\n\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x07\x17" + + "\u0287\n\x17\f\x17\x0E\x17\u028A\v\x17\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x05\x18\u0290\n\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0295\n\x18\f\x18" + + "\x0E\x18\u0298\v\x18\x03\x18\x03\x18\x03\x19\x03\x19\x05\x19\u029E\n\x19" + + "\x03\x19\x03\x19\x03\x19\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x05\x1A\u02A7" + + "\n\x1A\x03\x1A\x05\x1A\u02AA\n\x1A\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03" + + "\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x05\x1B\u02B5\n\x1B\x03\x1C\x03\x1C" + + "\x05\x1C\u02B9\n\x1C\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x03" + + "\x1D\x03\x1D\x07\x1D\u02C3\n\x1D\f\x1D\x0E\x1D\u02C6\v\x1D\x03\x1D\x03" + + "\x1D\x03\x1D\x03\x1D\x05\x1D\u02CC\n\x1D\x03\x1E\x03\x1E\x03\x1E\x03\x1E" + + "\x03\x1E\x06\x1E\u02D3\n\x1E\r\x1E\x0E\x1E\u02D4\x03\x1E\x03\x1E\x03\x1E" + + "\x03\x1E\x03\x1E\x03\x1F\x03\x1F\x05\x1F\u02DE\n\x1F\x03 \x03 \x03!\x03" + + "!\x03!\x03!\x03\"\x03\"\x05\"\u02E8\n\"\x03#\x03#\x03#\x07#\u02ED\n#\f" + + "#\x0E#\u02F0\v#\x03$\x03$\x03$\x03$\x03$\x03$\x05$\u02F8\n$\x03%\x03%" + + "\x05%\u02FC\n%\x03&\x03&\x05&\u0300\n&\x03\'\x03\'\x03(\x03(\x03)\x03" + + ")\x03)\x07)\u0309\n)\f)\x0E)\u030C\v)\x03*\x03*\x03*\x03*\x05*\u0312\n" + + "*\x03+\x03+\x03+\x02\x02\x04$,,\x02\x02\x04\x02\x06\x02\b\x02\n\x02\f" + + "\x02\x0E\x02\x10\x02\x12\x02\x14\x02\x16\x02\x18\x02\x1A\x02\x1C\x02\x1E" + + "\x02 \x02\"\x02$\x02&\x02(\x02*\x02,\x02.\x020\x022\x024\x026\x028\x02" + + ":\x02<\x02>\x02@\x02B\x02D\x02F\x02H\x02J\x02L\x02N\x02P\x02R\x02T\x02" + + "\x02\n\x03\x0257\x03\x0234\x03\x028=\x04\x02-1AB\x03\x02-0\x05\x02!!-" + + "03=\x03\x02*,\x03\x02CD\x02\u0378\x02W\x03\x02\x02\x02\x04`\x03\x02\x02" + + "\x02\x06q\x03\x02\x02\x02\b\x8A\x03\x02\x02\x02\n\xBC\x03\x02\x02\x02" + + "\f\xCA\x03\x02\x02\x02\x0E\xCC\x03\x02\x02\x02\x10\xDA\x03\x02\x02\x02" + + "\x12\xE4\x03\x02\x02\x02\x14\xF5\x03\x02\x02\x02\x16\u0109\x03\x02\x02" + + "\x02\x18\u0116\x03\x02\x02\x02\x1A\u0146\x03\x02\x02\x02\x1C\u0148\x03" + + "\x02\x02\x02\x1E\u014A\x03\x02\x02\x02 \u014C\x03\x02\x02\x02\"\u014E" + + "\x03\x02\x02\x02$\u0198\x03\x02\x02\x02&\u01A5\x03\x02\x02\x02(\u01BC" + + "\x03\x02\x02\x02*\u01BE\x03\x02\x02\x02,\u0255\x03\x02\x02\x02.\u028B" + + "\x03\x02\x02\x020\u029D\x03\x02\x02\x022\u02A2\x03\x02\x02\x024\u02B4" + + "\x03\x02\x02\x026\u02B8\x03\x02\x02\x028\u02CB\x03\x02\x02\x02:\u02CD" + + "\x03\x02\x02\x02<\u02DD\x03\x02\x02\x02>\u02DF\x03\x02\x02\x02@\u02E1" + + "\x03\x02\x02\x02B\u02E7\x03\x02\x02\x02D\u02E9\x03\x02\x02\x02F\u02F7" + + "\x03\x02\x02\x02H\u02FB\x03\x02\x02\x02J\u02FF\x03\x02\x02\x02L\u0301" + + "\x03\x02\x02\x02N\u0303\x03\x02\x02\x02P\u0305\x03\x02\x02\x02R\u0311" + + "\x03\x02\x02\x02T\u0313\x03\x02\x02\x02VX\x05\x04\x03\x02WV\x03\x02\x02" + + "\x02XY\x03\x02\x02\x02YW\x03\x02\x02\x02YZ\x03\x02\x02\x02Z[\x03\x02\x02" + + "\x02[\\\x07\x02\x02\x03\\\x03\x03\x02\x02\x02]_\x07E\x02\x02^]\x03\x02" + + "\x02\x02_b\x03\x02\x02\x02`^\x03\x02\x02\x02`a\x03\x02\x02\x02ac\x03\x02" + + "\x02\x02b`\x03\x02\x02\x02cd\x07\x03\x02\x02de\x05P)\x02ei\x07\x04\x02" + + "\x02fh\x05\x06\x04\x02gf\x03\x02\x02\x02hk\x03\x02\x02\x02ig\x03\x02\x02" + + "\x02ij\x03\x02\x02\x02jl\x03\x02\x02\x02ki\x03\x02\x02\x02lm\x07\x05\x02" + + "\x02m\x05\x03\x02\x02\x02np\x07E\x02\x02on\x03\x02\x02\x02ps\x03\x02\x02" + + "\x02qo\x03\x02\x02\x02qr\x03\x02\x02\x02rt\x03\x02\x02\x02sq\x03\x02\x02" + + "\x02tu\x05\b\x05\x02u\x07\x03\x02\x02\x02vw\x07\x06\x02\x02wx\x05P)\x02" + + "xy\x07\x07\x02\x02yz\x05$\x13\x02z\x8B\x03\x02\x02\x02{|\x07\b\x02\x02" + + "|}\x05P)\x02}~\x07\x07\x02\x02~\x7F\x05$\x13\x02\x7F\x8B\x03\x02\x02\x02" + + "\x80\x81\x07\t\x02\x02\x81\x82\x05<\x1F\x02\x82\x83\x07>\x02\x02\x83\x84" + + "\x05,\x17\x02\x84\x8B\x03\x02\x02\x02\x85\x8B\x05\x1A\x0E\x02\x86\x8B" + + "\x05\n\x06\x02\x87\x8B\x05\f\x07\x02\x88\x8B\x05\x16\f\x02\x89\x8B\x05" + + "\x18\r\x02\x8Av\x03\x02\x02\x02\x8A{\x03\x02\x02\x02\x8A\x80\x03\x02\x02" + + "\x02\x8A\x85\x03\x02\x02\x02\x8A\x86\x03\x02\x02\x02\x8A\x87\x03\x02\x02" + + "\x02\x8A\x88\x03\x02\x02\x02\x8A\x89\x03\x02\x02\x02\x8B\t\x03\x02\x02" + + "\x02\x8C\x8D\x05\x14\v\x02\x8D\x8E\x05H%\x02\x8E\x8F\x07?\x02\x02\x8F" + + "\x94\x05@!\x02\x90\x91\x07\n\x02\x02\x91\x93\x05@!\x02\x92\x90\x03\x02" + + "\x02\x02\x93\x96\x03\x02\x02\x02\x94\x92\x03\x02\x02\x02\x94\x95\x03\x02" + + "\x02\x02\x95\x97\x03\x02\x02\x02\x96\x94\x03\x02\x02\x02\x97\x98\x07@" + + "\x02\x02\x98\x99\x07\x07\x02\x02\x99\x9C\x05$\x13\x02\x9A\x9B\x07>\x02" + + "\x02\x9B\x9D\x05,\x17\x02\x9C\x9A\x03\x02\x02\x02\x9C\x9D\x03\x02\x02" + + "\x02\x9D\x9F\x03\x02\x02\x02\x9E\xA0\x07\v\x02\x02\x9F\x9E\x03\x02\x02" + + "\x02\x9F\xA0\x03\x02\x02\x02\xA0\xBD\x03\x02\x02\x02\xA1\xA2\x05\x14\v" + + "\x02\xA2\xAF\x05H%\x02\xA3\xAC\x07?\x02\x02\xA4\xA9\x05> \x02\xA5\xA6" + + "\x07\n\x02\x02\xA6\xA8\x05> \x02\xA7\xA5\x03\x02\x02\x02\xA8\xAB\x03\x02" + + "\x02\x02\xA9\xA7\x03\x02\x02\x02\xA9\xAA\x03\x02\x02\x02\xAA\xAD\x03\x02" + + "\x02\x02\xAB\xA9\x03\x02\x02\x02\xAC\xA4\x03\x02\x02\x02\xAC\xAD\x03\x02" + + "\x02\x02\xAD\xAE\x03\x02\x02\x02\xAE\xB0\x07@\x02\x02\xAF\xA3\x03\x02" + + "\x02\x02\xAF\xB0\x03\x02\x02\x02\xB0\xB3\x03\x02\x02\x02\xB1\xB2\x07\x07" + + "\x02\x02\xB2\xB4\x05$\x13\x02\xB3\xB1\x03\x02\x02\x02\xB3\xB4\x03\x02" + + "\x02\x02\xB4\xB7\x03\x02\x02\x02\xB5\xB6\x07>\x02\x02\xB6\xB8\x05,\x17" + + "\x02\xB7\xB5\x03\x02\x02\x02\xB7\xB8\x03\x02\x02\x02\xB8\xBA\x03\x02\x02" + + "\x02\xB9\xBB\x07\v\x02\x02\xBA\xB9\x03\x02\x02\x02\xBA\xBB\x03\x02\x02" + + "\x02\xBB\xBD\x03\x02\x02\x02\xBC\x8C\x03\x02\x02\x02\xBC\xA1\x03\x02\x02" + + "\x02\xBD\v\x03\x02\x02\x02\xBE\xBF\x07\f\x02\x02\xBF\xCB\x05P)\x02\xC0" + + "\xC1\x07\f\x02\x02\xC1\xC2\x05\x0E\b\x02\xC2\xC3\x07>\x02\x02\xC3\xC4" + + "\x05$\x13\x02\xC4\xCB\x03\x02\x02\x02\xC5\xC6\x07\f\x02\x02\xC6\xC7\x05" + + "\x0E\b\x02\xC7\xC8\x07>\x02\x02\xC8\xC9\x05\x10\t\x02\xC9\xCB\x03\x02" + + "\x02\x02\xCA\xBE\x03\x02\x02\x02\xCA\xC0\x03\x02\x02\x02\xCA\xC5\x03\x02" + + "\x02\x02\xCB\r\x03\x02\x02\x02\xCC\xD7\x05P)\x02\xCD\xCE\x07\r\x02\x02" + + "\xCE\xD3\x07C\x02\x02\xCF\xD0\x07\n\x02\x02\xD0\xD2\x07C\x02\x02\xD1\xCF" + + "\x03\x02\x02\x02\xD2\xD5\x03\x02\x02\x02\xD3\xD1\x03\x02\x02\x02\xD3\xD4" + + "\x03\x02\x02\x02\xD4\xD6\x03\x02\x02\x02\xD5\xD3\x03\x02\x02\x02\xD6\xD8" + + "\x07\x0E\x02\x02\xD7\xCD\x03\x02\x02\x02\xD7\xD8\x03\x02\x02\x02\xD8\x0F" + + "\x03\x02\x02\x02\xD9\xDB\x07\x0F\x02\x02\xDA\xD9\x03\x02\x02\x02\xDA\xDB" + + "\x03\x02\x02\x02\xDB\xDC\x03\x02\x02\x02\xDC\xE1\x05\x12\n\x02\xDD\xDE" + + "\x07\x0F\x02\x02\xDE\xE0\x05\x12\n\x02\xDF\xDD\x03\x02\x02\x02\xE0\xE3" + + "\x03\x02\x02\x02\xE1\xDF\x03\x02\x02\x02\xE1\xE2\x03\x02\x02\x02\xE2\x11" + + "\x03\x02\x02\x02\xE3\xE1\x03\x02\x02\x02\xE4\xE9\x05R*\x02\xE5\xE6\x07" + + "?\x02\x02\xE6\xE7\x05$\x13\x02\xE7\xE8\x07@\x02\x02\xE8\xEA\x03\x02\x02" + + "\x02\xE9\xE5\x03\x02\x02\x02\xE9\xEA\x03\x02\x02\x02\xEA\x13\x03\x02\x02" + + "\x02\xEB\xF6\x07\x10\x02\x02\xEC\xF6\x07\x11\x02\x02\xED\xEE\x07\x12\x02" + + "\x02\xEE\xF6\x07\x10\x02\x02\xEF\xF0\x07\x12\x02\x02\xF0\xF6\x07\x11\x02" + + "\x02\xF1\xF6\x07\x13\x02\x02\xF2\xF6\x07\x14\x02\x02\xF3\xF6\x07\x15\x02" + + "\x02\xF4\xF6\x07\x16\x02\x02\xF5\xEB\x03\x02\x02\x02\xF5\xEC\x03\x02\x02" + + "\x02\xF5\xED\x03\x02\x02\x02\xF5\xEF\x03\x02\x02\x02\xF5\xF1\x03\x02\x02" + + "\x02\xF5\xF2\x03\x02\x02\x02\xF5\xF3\x03\x02\x02\x02\xF5\xF4\x03\x02\x02" + + "\x02\xF6\x15\x03\x02\x02\x02\xF7\xF8\x07\x17\x02\x02\xF8\xF9\x05\x1E\x10" + + "\x02\xF9\xFA\x07\x18\x02\x02\xFA\xFD\x05B\"\x02\xFB\xFC\x07\x19\x02\x02" + + "\xFC\xFE\x05\"\x12\x02\xFD\xFB\x03\x02\x02\x02\xFD\xFE\x03\x02\x02\x02" + + "\xFE\u010A\x03\x02\x02\x02\xFF\u0100\x07\x17\x02\x02\u0100\u0103\x05\x1E" + + "\x10\x02\u0101\u0102\x07\x1A\x02\x02\u0102\u0104\x05\x1E\x10\x02\u0103" + + "\u0101\x03\x02\x02\x02\u0103\u0104\x03\x02\x02\x02\u0104\u0107\x03\x02" + + "\x02\x02\u0105\u0106\x07\x19\x02\x02\u0106\u0108\x05\"\x12\x02\u0107\u0105" + + "\x03\x02\x02\x02\u0107\u0108\x03\x02\x02\x02\u0108\u010A\x03\x02\x02\x02" + + "\u0109\xF7\x03\x02\x02\x02\u0109\xFF\x03\x02\x02\x02\u010A\x17\x03\x02" + + "\x02\x02\u010B\u010C\x07\x1B\x02\x02\u010C\u010D\x05\x1E\x10\x02\u010D" + + "\u010E\x07\x18\x02\x02\u010E\u010F\x05B\"\x02\u010F\u0117\x03\x02\x02" + + "\x02\u0110\u0111\x07\x1B\x02\x02\u0111\u0114\x05\x1E\x10\x02\u0112\u0113" + + "\x07\x1A\x02\x02\u0113\u0115\x05\x1E\x10\x02\u0114\u0112\x03\x02\x02\x02" + + "\u0114\u0115\x03\x02\x02\x02\u0115\u0117\x03\x02\x02\x02\u0116\u010B\x03" + + "\x02\x02\x02\u0116\u0110\x03\x02\x02\x02\u0117\x19\x03\x02\x02\x02\u0118" + + "\u0119\x07\x17\x02\x02\u0119\u011A\x05\x1C\x0F\x02\u011A\u011B\x07?\x02" + + "\x02\u011B\u011C\x05\x1E\x10\x02\u011C\u011D\x07>\x02\x02\u011D\u0125" + + "\x05,\x17\x02\u011E\u011F\x07\n\x02\x02\u011F\u0120\x05\x1E\x10\x02\u0120" + + "\u0121\x07>\x02\x02\u0121\u0122\x05,\x17\x02\u0122\u0124\x03\x02\x02\x02" + + "\u0123\u011E\x03\x02\x02\x02\u0124\u0127\x03\x02\x02\x02\u0125\u0123\x03" + + "\x02\x02\x02\u0125\u0126\x03\x02\x02\x02\u0126\u0128\x03\x02\x02\x02\u0127" + + "\u0125\x03\x02\x02\x02\u0128\u0129\x07@\x02\x02\u0129\u012A\x07\x18\x02" + + "\x02\u012A\u012D\x075\x02\x02\u012B\u012C\x07\x19\x02\x02\u012C\u012E" + + "\x05\"\x12\x02\u012D\u012B\x03\x02\x02\x02\u012D\u012E\x03\x02\x02\x02" + + "\u012E\u0147\x03\x02\x02\x02\u012F\u0130\x07\x17\x02\x02\u0130\u0131\x05" + + "\x1C\x0F\x02\u0131\u0132\x07?\x02\x02\u0132\u0133\x05\x1E\x10\x02\u0133" + + "\u0134\x07>\x02\x02\u0134\u013C\x05,\x17\x02\u0135\u0136\x07\n\x02\x02" + + "\u0136\u0137\x05\x1E\x10\x02\u0137\u0138\x07>\x02\x02\u0138\u0139\x05" + + ",\x17\x02\u0139\u013B\x03\x02\x02\x02\u013A\u0135\x03\x02\x02\x02\u013B" + + "\u013E\x03\x02\x02\x02\u013C\u013A\x03\x02\x02\x02\u013C\u013D\x03\x02" + + "\x02\x02\u013D\u013F\x03\x02\x02\x02\u013E\u013C\x03\x02\x02\x02\u013F" + + "\u0140\x07@\x02\x02\u0140\u0141\x07\x1A\x02\x02\u0141\u0144\x05 \x11\x02" + + "\u0142\u0143\x07\x19\x02\x02\u0143\u0145\x05\"\x12\x02\u0144\u0142\x03" + + "\x02\x02\x02\u0144\u0145\x03\x02\x02\x02\u0145\u0147\x03\x02\x02\x02\u0146" + + "\u0118\x03\x02\x02\x02\u0146\u012F\x03\x02\x02\x02\u0147\x1B\x03\x02\x02" + + "\x02\u0148\u0149\x05P)\x02\u0149\x1D\x03\x02\x02\x02\u014A\u014B\x05P" + + ")\x02\u014B\x1F\x03\x02\x02\x02\u014C\u014D\x05P)\x02\u014D!\x03\x02\x02" + + "\x02\u014E\u014F\x07*\x02\x02\u014F#\x03\x02\x02\x02\u0150\u0151\b\x13" + + "\x01\x02\u0151\u015A\x07?\x02\x02\u0152\u0157\x05$\x13\x02\u0153\u0154" + + "\x07\n\x02\x02\u0154\u0156\x05$\x13\x02\u0155\u0153\x03\x02\x02\x02\u0156" + + "\u0159\x03\x02\x02\x02\u0157\u0155\x03\x02\x02\x02\u0157\u0158\x03\x02" + + "\x02\x02\u0158\u015B\x03\x02\x02\x02\u0159\u0157\x03\x02\x02\x02\u015A" + + "\u0152\x03\x02\x02\x02\u015A\u015B\x03\x02\x02\x02\u015B\u015D\x03\x02" + + "\x02\x02\u015C\u015E\x07\n\x02\x02\u015D\u015C\x03\x02\x02\x02\u015D\u015E" + + "\x03\x02\x02\x02\u015E\u015F\x03\x02\x02\x02\u015F\u0160\x07@\x02\x02" + + "\u0160\u0161\x07\x1D\x02\x02\u0161\u0199\x05$\x13\x0F\u0162\u0163\x07" + + "A\x02\x02\u0163\u0164\x07\r\x02\x02\u0164\u0165\x05$\x13\x02\u0165\u0166" + + "\x07\x0E\x02\x02\u0166\u0199\x03\x02\x02\x02\u0167\u0168\x07B\x02\x02" + + "\u0168\u0169\x07\r\x02\x02\u0169\u016A\x05$\x13\x02\u016A\u016B\x07\x0E" + + "\x02\x02\u016B\u0199\x03\x02\x02\x02\u016C\u016D\x07?\x02\x02\u016D\u0199" + + "\x07@\x02\x02\u016E\u016F\x07?\x02\x02\u016F\u0170\x05$\x13\x02\u0170" + + "\u0171\x07\n\x02\x02\u0171\u0176\x05$\x13\x02\u0172\u0173\x07\n\x02\x02" + + "\u0173\u0175\x05$\x13\x02\u0174\u0172\x03\x02\x02\x02\u0175\u0178\x03" + + "\x02\x02\x02\u0176\u0174\x03\x02\x02\x02\u0176\u0177\x03\x02\x02\x02\u0177" + + "\u017A\x03\x02\x02\x02\u0178\u0176\x03\x02\x02\x02\u0179\u017B\x07\n\x02" + + "\x02\u017A\u0179\x03\x02\x02\x02\u017A\u017B\x03\x02\x02\x02\u017B\u017C" + + "\x03\x02\x02\x02\u017C\u017D\x07@\x02\x02\u017D\u0199\x03\x02\x02\x02" + + "\u017E\u0180\x07\x04\x02\x02\u017F\u0181\x05(\x15\x02\u0180\u017F\x03" + + "\x02\x02\x02\u0180\u0181\x03\x02\x02\x02\u0181\u0182\x03\x02\x02\x02\u0182" + + "\u0199\x07\x05\x02\x02\u0183\u0199\x07\x1E\x02\x02\u0184\u0199\x07\x1F" + + "\x02\x02\u0185\u0199\x07 \x02\x02\u0186\u0199\x05&\x14\x02\u0187\u0199" + + "\x05P)\x02\u0188\u0189\x07?\x02\x02\u0189\u018A\x05$\x13\x02\u018A\u018B" + + "\x07@\x02\x02\u018B\u0199\x03\x02\x02\x02\u018C\u018D\x05P)\x02\u018D" + + "\u018E\x07\r\x02\x02\u018E\u0193\x05$\x13\x02\u018F\u0190\x07\n\x02\x02" + + "\u0190\u0192\x05$\x13\x02\u0191\u018F\x03\x02\x02\x02\u0192\u0195\x03" + + "\x02\x02\x02\u0193\u0191\x03\x02\x02\x02\u0193\u0194\x03\x02\x02\x02\u0194" + + "\u0196\x03\x02\x02\x02\u0195\u0193\x03\x02\x02\x02\u0196\u0197\x07\x0E" + + "\x02\x02\u0197\u0199\x03\x02\x02\x02\u0198\u0150\x03\x02\x02\x02\u0198" + + "\u0162\x03\x02\x02\x02\u0198\u0167\x03\x02\x02\x02\u0198\u016C\x03\x02" + + "\x02\x02\u0198\u016E\x03\x02\x02\x02\u0198\u017E\x03\x02\x02\x02\u0198" + + "\u0183\x03\x02\x02\x02\u0198\u0184\x03\x02\x02\x02\u0198\u0185\x03\x02" + + "\x02\x02\u0198\u0186\x03\x02\x02\x02\u0198\u0187\x03\x02\x02\x02\u0198" + + "\u0188\x03\x02\x02\x02\u0198\u018C\x03\x02\x02\x02\u0199\u01A2\x03\x02" + + "\x02\x02\u019A\u019B\f\x11\x02\x02\u019B\u019C\x07\x1C\x02\x02\u019C\u01A1" + + "\x05$\x13\x11\u019D\u019E\f\x10\x02\x02\u019E\u019F\x07\x1D\x02\x02\u019F" + + "\u01A1\x05$\x13\x10\u01A0\u019A\x03\x02\x02\x02\u01A0\u019D\x03\x02\x02" + + "\x02\u01A1\u01A4\x03\x02\x02\x02\u01A2\u01A0\x03\x02\x02\x02\u01A2\u01A3" + + "\x03\x02\x02\x02\u01A3%\x03\x02\x02\x02\u01A4\u01A2\x03\x02\x02\x02\u01A5" + + "\u01A6\x07C\x02\x02\u01A6\'\x03\x02\x02\x02\u01A7\u01A8\x05*\x16\x02\u01A8" + + "\u01A9\x07\x07\x02\x02\u01A9\u01AA\x05$\x13\x02\u01AA\u01B2\x03\x02\x02" + + "\x02\u01AB\u01AC\x07\n\x02\x02\u01AC\u01AD\x05*\x16\x02\u01AD\u01AE\x07" + + "\x07\x02\x02\u01AE\u01AF\x05$\x13\x02\u01AF\u01B1\x03\x02\x02\x02\u01B0" + + "\u01AB\x03\x02\x02\x02\u01B1\u01B4\x03\x02\x02\x02\u01B2\u01B0\x03\x02" + + "\x02\x02\u01B2\u01B3\x03\x02\x02\x02\u01B3\u01B8\x03\x02\x02\x02\u01B4" + + "\u01B2\x03\x02\x02\x02\u01B5\u01B9\x07\n\x02\x02\u01B6\u01B7\x07\x0F\x02" + + "\x02\u01B7\u01B9\x05T+\x02\u01B8\u01B5\x03\x02\x02\x02\u01B8\u01B6\x03" + + "\x02\x02\x02\u01B8\u01B9\x03\x02\x02\x02\u01B9\u01BD\x03\x02\x02\x02\u01BA" + + "\u01BB\x07\x0F\x02\x02\u01BB\u01BD\x05T+\x02\u01BC\u01A7\x03\x02\x02\x02" + + "\u01BC\u01BA\x03\x02\x02\x02\u01BD)\x03\x02\x02\x02\u01BE\u01BF\x05R*" + + "\x02\u01BF+\x03\x02\x02\x02\u01C0\u01C1\b\x17\x01\x02\u01C1\u0256\x05" + + "6\x1C\x02\u01C2\u01C3\x05H%\x02\u01C3\u01C5\x07?\x02\x02\u01C4\u01C6\x05" + + "D#\x02\u01C5\u01C4\x03\x02\x02\x02\u01C5\u01C6\x03\x02\x02\x02\u01C6\u01C7" + + "\x03\x02\x02\x02\u01C7\u01C8\x07@\x02\x02\u01C8\u0256\x03\x02\x02\x02" + + "\u01C9\u01CA\x074\x02\x02\u01CA\u0256\x05,\x17\x1B\u01CB\u01CC\x05P)\x02" + + "\u01CC\u01CD\x07\"\x02\x02\u01CD\u01CE\x07>\x02\x02\u01CE\u01CF\x05,\x17" + + "\x17\u01CF\u0256\x03\x02\x02\x02\u01D0\u01D1\x07-\x02\x02\u01D1\u01D2" + + "\x07\x04\x02\x02\u01D2\u01D7\x05,\x17\x02\u01D3\u01D4\x07\n\x02\x02\u01D4" + + "\u01D6\x05,\x17\x02\u01D5\u01D3\x03\x02\x02\x02\u01D6\u01D9\x03\x02\x02" + + "\x02\u01D7\u01D5\x03\x02\x02\x02\u01D7\u01D8\x03\x02\x02\x02\u01D8\u01DB" + + "\x03\x02\x02\x02\u01D9\u01D7\x03\x02\x02\x02\u01DA\u01DC\x07\n\x02\x02" + + "\u01DB\u01DA\x03\x02\x02\x02\u01DB\u01DC\x03\x02\x02\x02\u01DC\u01DD\x03" + + "\x02\x02\x02\u01DD\u01DE\x07\x05\x02\x02\u01DE\u0256\x03\x02\x02\x02\u01DF" + + "\u01E0\x07.\x02\x02\u01E0\u01E1\x07\x04\x02\x02\u01E1\u01E6\x05,\x17\x02" + + "\u01E2\u01E3\x07\n\x02\x02\u01E3\u01E5\x05,\x17\x02\u01E4\u01E2\x03\x02" + + "\x02\x02\u01E5\u01E8\x03\x02\x02\x02\u01E6\u01E4\x03\x02\x02\x02\u01E6" + + "\u01E7\x03\x02\x02\x02\u01E7\u01EA\x03\x02\x02\x02\u01E8\u01E6\x03\x02" + + "\x02\x02\u01E9\u01EB\x07\n\x02\x02\u01EA\u01E9\x03\x02\x02\x02\u01EA\u01EB" + + "\x03\x02\x02\x02\u01EB\u01EC\x03\x02\x02\x02\u01EC\u01ED\x07\x05\x02\x02" + + "\u01ED\u0256\x03\x02\x02\x02\u01EE\u0256\x05.\x18\x02\u01EF\u01F0\x07" + + "#\x02\x02"; private static readonly _serializedATNSegment1: string = - "\x07\x04\x02\x02\u01ED\u01F2\x05.\x18\x02\u01EE\u01EF\x07\n\x02\x02\u01EF" + - "\u01F1\x05.\x18\x02\u01F0\u01EE\x03\x02\x02\x02\u01F1\u01F4\x03\x02\x02" + - "\x02\u01F2\u01F0\x03\x02\x02\x02\u01F2\u01F3\x03\x02\x02\x02\u01F3\u01F6" + - "\x03\x02\x02\x02\u01F4\u01F2\x03\x02\x02\x02\u01F5\u01F7\x07\n\x02\x02" + - "\u01F6\u01F5\x03\x02\x02\x02\u01F6\u01F7\x03\x02\x02\x02\u01F7\u01F8\x03" + - "\x02\x02\x02\u01F8\u01F9\x07\x05\x02\x02\u01F9\u0265\x03\x02\x02\x02\u01FA" + - "\u0265\x050\x19\x02\u01FB\u01FC\x07#\x02\x02\u01FC\u01FD\x07\x04\x02\x02" + - "\u01FD\u0202\x05.\x18\x02\u01FE\u01FF\x07\n\x02\x02\u01FF\u0201\x05.\x18" + - "\x02\u0200\u01FE\x03\x02\x02\x02\u0201\u0204\x03\x02\x02\x02\u0202\u0200" + - "\x03\x02\x02\x02\u0202\u0203\x03\x02\x02\x02\u0203\u0206\x03\x02\x02\x02" + - "\u0204\u0202\x03\x02\x02\x02\u0205\u0207\x07\n\x02\x02\u0206\u0205\x03" + - "\x02\x02\x02\u0206\u0207\x03\x02\x02\x02\u0207\u0208\x03\x02\x02\x02\u0208" + - "\u0209\x07\x05\x02\x02\u0209\u0265\x03\x02\x02\x02\u020A\u020B\x07$\x02" + - "\x02\u020B\u020C\x07\x04\x02\x02\u020C\u0211\x05.\x18\x02\u020D\u020E" + - "\x07\n\x02\x02\u020E\u0210\x05.\x18\x02\u020F\u020D\x03\x02\x02\x02\u0210" + - "\u0213\x03\x02\x02\x02\u0211\u020F\x03\x02\x02\x02\u0211\u0212\x03\x02" + - "\x02\x02\u0212\u0215\x03\x02\x02\x02\u0213\u0211\x03\x02\x02\x02\u0214" + - "\u0216\x07\n\x02\x02\u0215\u0214\x03\x02\x02\x02\u0215\u0216\x03\x02\x02" + - "\x02\u0216\u0217\x03\x02\x02\x02\u0217\u0218\x07\x05\x02\x02\u0218\u0265" + - "\x03\x02\x02\x02\u0219\u021E\x05R*\x02\u021A\u021E\x07,\x02\x02\u021B" + - "\u021E\x07+\x02\x02\u021C\u021E\x07*\x02\x02\u021D\u0219\x03\x02\x02\x02" + - "\u021D\u021A\x03\x02\x02\x02\u021D\u021B\x03\x02\x02\x02\u021D\u021C\x03" + - "\x02\x02\x02\u021E\u0265\x03\x02\x02\x02\u021F\u0220\x07?\x02\x02\u0220" + - "\u0221\x05.\x18\x02\u0221\u0222\x07\n\x02\x02\u0222\u0227\x05.\x18\x02" + - "\u0223\u0224\x07\n\x02\x02\u0224\u0226\x05.\x18\x02\u0225\u0223\x03\x02" + - "\x02\x02\u0226\u0229\x03\x02\x02\x02\u0227\u0225\x03\x02\x02\x02\u0227" + - "\u0228\x03\x02\x02\x02\u0228\u022B\x03\x02\x02\x02\u0229\u0227\x03\x02" + - "\x02\x02\u022A\u022C\x07\n\x02\x02\u022B\u022A\x03\x02\x02\x02\u022B\u022C" + - "\x03\x02\x02\x02\u022C\u022D\x03\x02\x02\x02\u022D\u022E\x07@\x02\x02" + - "\u022E\u0265\x03\x02\x02\x02\u022F\u0230\x07?\x02\x02\u0230\u0265\x07" + - "@\x02\x02\u0231\u0232\x07\x04\x02\x02\u0232\u0237\x05H%\x02\u0233\u0234" + - "\x07\n\x02\x02\u0234\u0236\x05H%\x02\u0235\u0233\x03\x02\x02\x02\u0236" + - "\u0239\x03\x02\x02\x02\u0237\u0235\x03\x02\x02\x02\u0237\u0238\x03\x02" + - "\x02\x02\u0238\u023B\x03\x02\x02\x02\u0239\u0237\x03\x02\x02\x02\u023A" + - "\u023C\x07\n\x02\x02\u023B\u023A\x03\x02\x02\x02\u023B\u023C\x03\x02\x02" + - "\x02\u023C\u023D\x03\x02\x02\x02\u023D\u023E\x07\x05\x02\x02\u023E\u0265" + - "\x03\x02\x02\x02\u023F\u0248\x07\r\x02\x02\u0240\u0245\x05.\x18\x02\u0241" + - "\u0242\x07\n\x02\x02\u0242\u0244\x05.\x18\x02\u0243\u0241\x03\x02\x02" + - "\x02\u0244\u0247\x03\x02\x02\x02\u0245\u0243\x03\x02\x02\x02\u0245\u0246" + - "\x03\x02\x02\x02\u0246\u0249\x03\x02\x02\x02\u0247\u0245\x03\x02\x02\x02" + - "\u0248\u0240\x03\x02\x02\x02\u0248\u0249\x03\x02\x02\x02\u0249\u024B\x03" + - "\x02\x02\x02\u024A\u024C\x07\n\x02\x02\u024B\u024A\x03\x02\x02\x02\u024B" + - "\u024C\x03\x02\x02\x02\u024C\u024D\x03\x02\x02\x02\u024D\u0265\x07\x0E" + - "\x02\x02\u024E\u024F\x07%\x02\x02\u024F\u0250\x07?\x02\x02\u0250\u0251" + - "\x05.\x18\x02\u0251\u0252\x07@\x02\x02\u0252\u0253\x05.\x18\x02\u0253" + - "\u0254\x07&\x02\x02\u0254\u0255\x05.\x18\x07\u0255\u0265\x03\x02\x02\x02" + - "\u0256\u0257\x05\n\x06\x02\u0257\u0258\x05.\x18\x06\u0258\u0265\x03\x02" + - "\x02\x02\u0259\u025A\x05\x14\v\x02\u025A\u025B\x05.\x18\x05\u025B\u0265" + - "\x03\x02\x02\x02\u025C\u025D\x07?\x02\x02\u025D\u025E\x05.\x18\x02\u025E" + - "\u025F\x07@\x02\x02\u025F\u0265\x03\x02\x02\x02\u0260\u0261\x07\x04\x02" + - "\x02\u0261\u0262\x05.\x18\x02\u0262\u0263\x07\x05\x02\x02\u0263\u0265" + - "\x03\x02\x02\x02\u0264\u01CC\x03\x02\x02\x02\u0264\u01CE\x03\x02\x02\x02" + - "\u0264\u01D5\x03\x02\x02\x02\u0264\u01D7\x03\x02\x02\x02\u0264\u01DC\x03" + - "\x02\x02\x02\u0264\u01EB\x03\x02\x02\x02\u0264\u01FA\x03\x02\x02\x02\u0264" + - "\u01FB\x03\x02\x02\x02\u0264\u020A\x03\x02\x02\x02\u0264\u021D\x03\x02" + - "\x02\x02\u0264\u021F\x03\x02\x02\x02\u0264\u022F\x03\x02\x02\x02\u0264" + - "\u0231\x03\x02\x02\x02\u0264\u023F\x03\x02\x02\x02\u0264\u024E\x03\x02" + - "\x02\x02\u0264\u0256\x03\x02\x02\x02\u0264\u0259\x03\x02\x02\x02\u0264" + - "\u025C\x03\x02\x02\x02\u0264\u0260\x03\x02\x02\x02\u0265\u0297\x03\x02" + - "\x02\x02\u0266\u0267\f\x1D\x02\x02\u0267\u0268\x07!\x02\x02\u0268\u0296" + - "\x05.\x18\x1D\u0269\u026A\f\x1B\x02\x02\u026A\u026B\t\x02\x02\x02\u026B" + - "\u0296\x05.\x18\x1C\u026C\u026D\f\x1A\x02\x02\u026D\u026E\t\x03\x02\x02" + - "\u026E\u0296\x05.\x18\x1B\u026F\u0270\f\x19\x02\x02\u0270\u0271\t\x04" + - "\x02\x02\u0271\u0296\x05.\x18\x1A\u0272\u0273\f\x17\x02\x02\u0273\u0274" + - "\x07>\x02\x02\u0274\u0275\x05.\x18\x18\u0275\u0276\b\x18\x01\x02\u0276" + - "\u0296\x03\x02\x02\x02\u0277\u0278\f\x15\x02\x02\u0278\u0279\x07-\x02" + - "\x02\u0279\u0296\x05.\x18\x16\u027A\u027B\f\x13\x02\x02\u027B\u027C\x07" + - ".\x02\x02\u027C\u0296\x05.\x18\x14\u027D\u027E\f\x12\x02\x02\u027E\u027F" + - "\x07/\x02\x02\u027F\u0296\x05.\x18\x13\u0280\u0281\f\x11\x02\x02\u0281" + - "\u0282\x070\x02\x02\u0282\u0296\x05.\x18\x12\u0283\u0284\f\n\x02\x02\u0284" + - "\u0285\x07\x1C\x02\x02\u0285\u0296\x05.\x18\v\u0286\u0287\f!\x02\x02\u0287" + - "\u0288\x07\x18\x02\x02\u0288\u028E\x05L\'\x02\u0289\u028B\x07?\x02\x02" + - "\u028A\u028C\x05F$\x02\u028B\u028A\x03\x02\x02\x02\u028B\u028C\x03\x02" + - "\x02\x02\u028C\u028D\x03\x02\x02\x02\u028D\u028F\x07@\x02\x02\u028E\u0289" + - "\x03\x02\x02\x02\u028E\u028F\x03\x02\x02\x02\u028F\u0296\x03\x02\x02\x02" + - "\u0290\u0291\f\x1E\x02\x02\u0291\u0292\x07\r\x02\x02\u0292\u0293\x05." + - "\x18\x02\u0293\u0294\x07\x0E\x02\x02\u0294\u0296\x03\x02\x02\x02\u0295" + - "\u0266\x03\x02\x02\x02\u0295\u0269\x03\x02\x02\x02\u0295\u026C\x03\x02" + - "\x02\x02\u0295\u026F\x03\x02\x02\x02\u0295\u0272\x03\x02\x02\x02\u0295" + - "\u0277\x03\x02\x02\x02\u0295\u027A\x03\x02\x02\x02\u0295\u027D\x03\x02" + - "\x02\x02\u0295\u0280\x03\x02\x02\x02\u0295\u0283\x03\x02\x02\x02\u0295" + - "\u0286\x03\x02\x02\x02\u0295\u0290\x03\x02\x02\x02\u0296\u0299\x03\x02" + - "\x02\x02\u0297\u0295\x03\x02\x02\x02\u0297\u0298\x03\x02\x02\x02\u0298" + - "/\x03\x02\x02\x02\u0299\u0297\x03\x02\x02\x02\u029A\u029B\x072\x02\x02" + - "\u029B\u029C\x05.\x18\x02\u029C\u029E\x07\x04\x02\x02\u029D\u029F\x07" + - "\x0F\x02\x02\u029E\u029D\x03\x02\x02\x02\u029E\u029F\x03\x02\x02\x02\u029F" + - "\u02A0\x03\x02\x02\x02\u02A0\u02A5\x052\x1A\x02\u02A1\u02A2\x07\x0F\x02" + - "\x02\u02A2\u02A4\x052\x1A\x02\u02A3\u02A1\x03\x02\x02\x02\u02A4\u02A7" + - "\x03\x02\x02\x02\u02A5\u02A3\x03\x02\x02\x02\u02A5\u02A6\x03\x02\x02\x02" + - "\u02A6\u02A8\x03\x02\x02\x02\u02A7\u02A5\x03\x02\x02\x02\u02A8\u02A9\x07" + - "\x05\x02\x02\u02A91\x03\x02\x02\x02\u02AA\u02AD\x054\x1B\x02\u02AB\u02AD" + - "\x07\'\x02\x02\u02AC\u02AA\x03\x02\x02\x02\u02AC\u02AB\x03\x02\x02\x02" + - "\u02AD\u02AE\x03\x02\x02\x02\u02AE\u02AF\x07\x1D\x02\x02\u02AF\u02B0\x05" + - ".\x18\x02\u02B03\x03\x02\x02\x02\u02B1\u02B8\x05T+\x02\u02B2\u02B5\x07" + - "?\x02\x02\u02B3\u02B6\x05T+\x02\u02B4\u02B6\x07\'\x02\x02\u02B5\u02B3" + - "\x03\x02\x02\x02\u02B5\u02B4\x03\x02\x02\x02\u02B6\u02B7\x03\x02\x02\x02" + - "\u02B7\u02B9\x07@\x02\x02\u02B8\u02B2\x03\x02\x02\x02\u02B8\u02B9\x03" + - "\x02\x02\x02\u02B95\x03\x02\x02\x02\u02BA\u02BB\x05\b\x05\x02\u02BB\u02BC" + - "\x07\x02\x02\x03\u02BC\u02C4\x03\x02\x02\x02\u02BD\u02BE\x05.\x18\x02" + - "\u02BE\u02BF\x07\x02\x02\x03\u02BF\u02C4\x03\x02\x02\x02\u02C0\u02C1\x07" + - "E\x02\x02\u02C1\u02C4\x07\x02\x02\x03\u02C2\u02C4\x07\x02\x02\x03\u02C3" + - "\u02BA\x03\x02\x02\x02\u02C3\u02BD\x03\x02\x02\x02\u02C3\u02C0\x03\x02" + - "\x02\x02\u02C3\u02C2\x03\x02\x02\x02\u02C47\x03\x02\x02\x02\u02C5\u02C8" + - "\x05:\x1E\x02\u02C6\u02C8\x05<\x1F\x02\u02C7\u02C5\x03\x02\x02\x02\u02C7" + - "\u02C6\x03\x02\x02\x02\u02C89\x03\x02\x02\x02\u02C9\u02CA\x05@!\x02\u02CA" + - "\u02CB\x07\x1D\x02\x02\u02CB\u02CC\x05.\x18\x02\u02CC\u02DB\x03\x02\x02" + - "\x02\u02CD\u02CE\x07?\x02\x02\u02CE\u02D3\x05@!\x02\u02CF\u02D0\x07\n" + - "\x02\x02\u02D0\u02D2\x05@!\x02\u02D1\u02CF\x03\x02\x02\x02\u02D2\u02D5" + - "\x03\x02\x02\x02\u02D3\u02D1\x03\x02\x02\x02\u02D3\u02D4\x03\x02\x02\x02" + - "\u02D4\u02D6\x03\x02\x02\x02\u02D5\u02D3\x03\x02\x02\x02\u02D6\u02D7\x07" + - "@\x02\x02\u02D7\u02D8\x07\x1D\x02\x02\u02D8\u02D9\x05.\x18\x02\u02D9\u02DB" + - "\x03\x02\x02\x02\u02DA\u02C9\x03\x02\x02\x02\u02DA\u02CD\x03\x02\x02\x02" + - "\u02DB;\x03\x02\x02\x02\u02DC\u02DD\x07?\x02\x02\u02DD\u02DE\x07?\x02" + - "\x02\u02DE\u02E1\x05@!\x02\u02DF\u02E0\x07\n\x02\x02\u02E0\u02E2\x05@" + - "!\x02\u02E1\u02DF\x03\x02\x02\x02\u02E2\u02E3\x03\x02\x02\x02\u02E3\u02E1" + - "\x03\x02\x02\x02\u02E3\u02E4\x03\x02\x02\x02\u02E4\u02E5\x03\x02\x02\x02" + - "\u02E5\u02E6\x07@\x02\x02\u02E6\u02E7\x07@\x02\x02\u02E7\u02E8\x07\x1D" + - "\x02\x02\u02E8\u02E9\x05.\x18\x02\u02E9=\x03\x02\x02\x02\u02EA\u02ED\x07" + - "\'\x02\x02\u02EB\u02ED\x05R*\x02\u02EC\u02EA\x03\x02\x02\x02\u02EC\u02EB" + - "\x03\x02\x02\x02\u02ED?\x03\x02\x02\x02\u02EE\u02EF\x05> \x02\u02EFA\x03" + - "\x02\x02\x02\u02F0\u02F1\x05> \x02\u02F1\u02F2\x07\x07\x02\x02\u02F2\u02F3" + - "\x05&\x14\x02\u02F3C\x03\x02\x02\x02\u02F4\u02F7\x075\x02\x02\u02F5\u02F7" + - "\x05R*\x02\u02F6\u02F4\x03\x02\x02\x02\u02F6\u02F5\x03\x02\x02\x02\u02F7" + - "E\x03\x02\x02\x02\u02F8\u02FD\x05.\x18\x02\u02F9\u02FA\x07\n\x02\x02\u02FA" + - "\u02FC\x05.\x18\x02\u02FB\u02F9\x03\x02\x02\x02\u02FC\u02FF\x03\x02\x02" + - "\x02\u02FD\u02FB\x03\x02\x02\x02\u02FD\u02FE\x03\x02\x02\x02\u02FEG\x03" + - "\x02\x02\x02\u02FF\u02FD\x03\x02\x02\x02\u0300\u0301\x05T+\x02\u0301\u0302" + - "\x07\x07\x02\x02\u0302\u0303\x05.\x18\x02\u0303\u0307\x03\x02\x02\x02" + - "\u0304\u0305\x07(\x02\x02\u0305\u0307\x05.\x18\x02\u0306\u0300\x03\x02" + - "\x02\x02\u0306\u0304\x03\x02\x02\x02\u0307I\x03\x02\x02\x02\u0308\u030B" + - "\x05R*\x02\u0309\u030B\t\x05\x02\x02\u030A\u0308\x03\x02\x02\x02\u030A" + - "\u0309\x03\x02\x02\x02\u030BK\x03\x02\x02\x02\u030C\u030F\x05R*\x02\u030D" + - "\u030F\t\x06\x02\x02\u030E\u030C\x03\x02\x02\x02\u030E\u030D\x03\x02\x02" + - "\x02\u030FM\x03\x02\x02\x02\u0310\u0311\t\x07\x02\x02\u0311O\x03\x02\x02" + - "\x02\u0312\u0313\t\b\x02\x02\u0313Q\x03\x02\x02\x02\u0314\u0319\x05V," + - "\x02\u0315\u0316\x07)\x02\x02\u0316\u0318\x05V,\x02\u0317\u0315\x03\x02" + - "\x02\x02\u0318\u031B\x03\x02\x02\x02\u0319\u0317\x03\x02\x02\x02\u0319" + - "\u031A\x03\x02\x02\x02\u031AS\x03\x02\x02\x02\u031B\u0319\x03\x02\x02" + - "\x02\u031C\u0321\x05V,\x02\u031D\u031E\x05R*\x02\u031E\u031F\b+\x01\x02" + - "\u031F\u0321\x03\x02\x02\x02\u0320\u031C\x03\x02\x02\x02\u0320\u031D\x03" + - "\x02\x02\x02\u0321U\x03\x02\x02\x02\u0322\u0323\t\t\x02\x02\u0323W\x03" + - "\x02\x02\x02Z[bks\x8C\x96\x9E\xA1\xAB\xAE\xB1\xB5\xB9\xBC\xBE\xCC\xD5" + - "\xD9\xDC\xE3\xEB\xF1\xF6\u0101\u0109\u010F\u0113\u0115\u0120\u0122\u0131" + - "\u0139\u0148\u0150\u0152\u0163\u0166\u0169\u0182\u0186\u018C\u019F\u01A4" + - "\u01AC\u01AE\u01BE\u01C4\u01C8\u01D1\u01E3\u01E7\u01F2\u01F6\u0202\u0206" + - "\u0211\u0215\u021D\u0227\u022B\u0237\u023B\u0245\u0248\u024B\u0264\u028B" + - "\u028E\u0295\u0297\u029E\u02A5\u02AC\u02B5\u02B8\u02C3\u02C7\u02D3\u02DA" + - "\u02E3\u02EC\u02F6\u02FD\u0306\u030A\u030E\u0319\u0320"; + "\u01F0\u01F1\x07\x04\x02\x02\u01F1\u01F6\x05,\x17\x02\u01F2\u01F3\x07" + + "\n\x02\x02\u01F3\u01F5\x05,\x17\x02\u01F4\u01F2\x03\x02\x02\x02\u01F5" + + "\u01F8\x03\x02\x02\x02\u01F6\u01F4\x03\x02\x02\x02\u01F6\u01F7\x03\x02" + + "\x02\x02\u01F7\u01FA\x03\x02\x02\x02\u01F8\u01F6\x03\x02\x02\x02\u01F9" + + "\u01FB\x07\n\x02\x02\u01FA\u01F9\x03\x02\x02\x02\u01FA\u01FB\x03\x02\x02" + + "\x02\u01FB\u01FC\x03\x02\x02\x02\u01FC\u01FD\x07\x05\x02\x02\u01FD\u0256" + + "\x03\x02\x02\x02\u01FE\u01FF\x07$\x02\x02\u01FF\u0200\x07\x04\x02\x02" + + "\u0200\u0205\x05,\x17\x02\u0201\u0202\x07\n\x02\x02\u0202\u0204\x05,\x17" + + "\x02\u0203\u0201\x03\x02\x02\x02\u0204\u0207\x03\x02\x02\x02\u0205\u0203" + + "\x03\x02\x02\x02\u0205\u0206\x03\x02\x02\x02\u0206\u0209\x03\x02\x02\x02" + + "\u0207\u0205\x03\x02\x02\x02\u0208\u020A\x07\n\x02\x02\u0209\u0208\x03" + + "\x02\x02\x02\u0209\u020A\x03\x02\x02\x02\u020A\u020B\x03\x02\x02\x02\u020B" + + "\u020C\x07\x05\x02\x02\u020C\u0256\x03\x02\x02\x02\u020D\u0212\x05P)\x02" + + "\u020E\u0212\x07,\x02\x02\u020F\u0212\x07+\x02\x02\u0210\u0212\x07*\x02" + + "\x02\u0211\u020D\x03\x02\x02\x02\u0211\u020E\x03\x02\x02\x02\u0211\u020F" + + "\x03\x02\x02\x02\u0211\u0210\x03\x02\x02\x02\u0212\u0256\x03\x02\x02\x02" + + "\u0213\u0214\x07?\x02\x02\u0214\u0215\x05,\x17\x02\u0215\u0216\x07\n\x02" + + "\x02\u0216\u021B\x05,\x17\x02\u0217\u0218\x07\n\x02\x02\u0218\u021A\x05" + + ",\x17\x02\u0219\u0217\x03\x02\x02\x02\u021A\u021D\x03\x02\x02\x02\u021B" + + "\u0219\x03\x02\x02\x02\u021B\u021C\x03\x02\x02\x02\u021C\u021F\x03\x02" + + "\x02\x02\u021D\u021B\x03\x02\x02\x02\u021E\u0220\x07\n\x02\x02\u021F\u021E" + + "\x03\x02\x02\x02\u021F\u0220\x03\x02\x02\x02\u0220\u0221\x03\x02\x02\x02" + + "\u0221\u0222\x07@\x02\x02\u0222\u0256\x03\x02\x02\x02\u0223\u0224\x07" + + "?\x02\x02\u0224\u0256\x07@\x02\x02\u0225\u0226\x07\x04\x02\x02\u0226\u022B" + + "\x05F$\x02\u0227\u0228\x07\n\x02\x02\u0228\u022A\x05F$\x02\u0229\u0227" + + "\x03\x02\x02\x02\u022A\u022D\x03\x02\x02\x02\u022B\u0229\x03\x02\x02\x02" + + "\u022B\u022C\x03\x02\x02\x02\u022C\u022F\x03\x02\x02\x02\u022D\u022B\x03" + + "\x02\x02\x02\u022E\u0230\x07\n\x02\x02\u022F\u022E\x03\x02\x02\x02\u022F" + + "\u0230\x03\x02\x02\x02\u0230\u0231\x03\x02\x02\x02\u0231\u0232\x07\x05" + + "\x02\x02\u0232\u0256\x03\x02\x02\x02\u0233\u023C\x07\r\x02\x02\u0234\u0239" + + "\x05,\x17\x02\u0235\u0236\x07\n\x02\x02\u0236\u0238\x05,\x17\x02\u0237" + + "\u0235\x03\x02\x02\x02\u0238\u023B\x03\x02\x02\x02\u0239\u0237\x03\x02" + + "\x02\x02\u0239\u023A\x03\x02\x02\x02\u023A\u023D\x03\x02\x02\x02\u023B" + + "\u0239\x03\x02\x02\x02\u023C\u0234\x03\x02\x02\x02\u023C\u023D\x03\x02" + + "\x02\x02\u023D\u023F\x03\x02\x02\x02\u023E\u0240\x07\n\x02\x02\u023F\u023E" + + "\x03\x02\x02\x02\u023F\u0240\x03\x02\x02\x02\u0240\u0241\x03\x02\x02\x02" + + "\u0241\u0256\x07\x0E\x02\x02\u0242\u0243\x07%\x02\x02\u0243\u0244\x07" + + "?\x02\x02\u0244\u0245\x05,\x17\x02\u0245\u0246\x07@\x02\x02\u0246\u0247" + + "\x05,\x17\x02\u0247\u0248\x07&\x02\x02\u0248\u0249\x05,\x17\x06\u0249" + + "\u0256\x03\x02\x02\x02\u024A\u024B\x05\n\x06\x02\u024B\u024C\x05,\x17" + + "\x05\u024C\u0256\x03\x02\x02\x02\u024D\u024E\x07?\x02\x02\u024E\u024F" + + "\x05,\x17\x02\u024F\u0250\x07@\x02\x02\u0250\u0256\x03\x02\x02\x02\u0251" + + "\u0252\x07\x04\x02\x02\u0252\u0253\x05,\x17\x02\u0253\u0254\x07\x05\x02" + + "\x02\u0254\u0256\x03\x02\x02\x02\u0255\u01C0\x03\x02\x02\x02\u0255\u01C2" + + "\x03\x02\x02\x02\u0255\u01C9\x03\x02\x02\x02\u0255\u01CB\x03\x02\x02\x02" + + "\u0255\u01D0\x03\x02\x02\x02\u0255\u01DF\x03\x02\x02\x02\u0255\u01EE\x03" + + "\x02\x02\x02\u0255\u01EF\x03\x02\x02\x02\u0255\u01FE\x03\x02\x02\x02\u0255" + + "\u0211\x03\x02\x02\x02\u0255\u0213\x03\x02\x02\x02\u0255\u0223\x03\x02" + + "\x02\x02\u0255\u0225\x03\x02\x02\x02\u0255\u0233\x03\x02\x02\x02\u0255" + + "\u0242\x03\x02\x02\x02\u0255\u024A\x03\x02\x02\x02\u0255\u024D\x03\x02" + + "\x02\x02\u0255\u0251\x03\x02\x02\x02\u0256\u0288\x03\x02\x02\x02\u0257" + + "\u0258\f\x1C\x02\x02\u0258\u0259\x07!\x02\x02\u0259\u0287\x05,\x17\x1C" + + "\u025A\u025B\f\x1A\x02\x02\u025B\u025C\t\x02\x02\x02\u025C\u0287\x05," + + "\x17\x1B\u025D\u025E\f\x19\x02\x02\u025E\u025F\t\x03\x02\x02\u025F\u0287" + + "\x05,\x17\x1A\u0260\u0261\f\x18\x02\x02\u0261\u0262\t\x04\x02\x02\u0262" + + "\u0287\x05,\x17\x19\u0263\u0264\f\x16\x02\x02\u0264\u0265\x07>\x02\x02" + + "\u0265\u0266\x05,\x17\x17\u0266\u0267\b\x17\x01\x02\u0267\u0287\x03\x02" + + "\x02\x02\u0268\u0269\f\x14\x02\x02\u0269\u026A\x07-\x02\x02\u026A\u0287" + + "\x05,\x17\x15\u026B\u026C\f\x12\x02\x02\u026C\u026D\x07.\x02\x02\u026D" + + "\u0287\x05,\x17\x13\u026E\u026F\f\x11\x02\x02\u026F\u0270\x07/\x02\x02" + + "\u0270\u0287\x05,\x17\x12\u0271\u0272\f\x10\x02\x02\u0272\u0273\x070\x02" + + "\x02\u0273\u0287\x05,\x17\x11\u0274\u0275\f\t\x02\x02\u0275\u0276\x07" + + "\x1C\x02\x02\u0276\u0287\x05,\x17\n\u0277\u0278\f \x02\x02\u0278\u0279" + + "\x07\x18\x02\x02\u0279\u027F\x05J&\x02\u027A\u027C\x07?\x02\x02\u027B" + + "\u027D\x05D#\x02\u027C\u027B\x03\x02\x02\x02\u027C\u027D\x03\x02\x02\x02" + + "\u027D\u027E\x03\x02\x02\x02\u027E\u0280\x07@\x02\x02\u027F\u027A\x03" + + "\x02\x02\x02\u027F\u0280\x03\x02\x02\x02\u0280\u0287\x03\x02\x02\x02\u0281" + + "\u0282\f\x1D\x02\x02\u0282\u0283\x07\r\x02\x02\u0283\u0284\x05,\x17\x02" + + "\u0284\u0285\x07\x0E\x02\x02\u0285\u0287\x03\x02\x02\x02\u0286\u0257\x03" + + "\x02\x02\x02\u0286\u025A\x03\x02\x02\x02\u0286\u025D\x03\x02\x02\x02\u0286" + + "\u0260\x03\x02\x02\x02\u0286\u0263\x03\x02\x02\x02\u0286\u0268\x03\x02" + + "\x02\x02\u0286\u026B\x03\x02\x02\x02\u0286\u026E\x03\x02\x02\x02\u0286" + + "\u0271\x03\x02\x02\x02\u0286\u0274\x03\x02\x02\x02\u0286\u0277\x03\x02" + + "\x02\x02\u0286\u0281\x03\x02\x02\x02\u0287\u028A\x03\x02\x02\x02\u0288" + + "\u0286\x03\x02\x02\x02\u0288\u0289\x03\x02\x02\x02\u0289-\x03\x02\x02" + + "\x02\u028A\u0288\x03\x02\x02\x02\u028B\u028C\x072\x02\x02\u028C\u028D" + + "\x05,\x17\x02\u028D\u028F\x07\x04\x02\x02\u028E\u0290\x07\x0F\x02\x02" + + "\u028F\u028E\x03\x02\x02\x02\u028F\u0290\x03\x02\x02\x02\u0290\u0291\x03" + + "\x02\x02\x02\u0291\u0296\x050\x19\x02\u0292\u0293\x07\x0F\x02\x02\u0293" + + "\u0295\x050\x19\x02\u0294\u0292\x03\x02\x02\x02\u0295\u0298\x03\x02\x02" + + "\x02\u0296\u0294\x03\x02\x02\x02\u0296\u0297\x03\x02\x02\x02\u0297\u0299" + + "\x03\x02\x02\x02\u0298\u0296\x03\x02\x02\x02\u0299\u029A\x07\x05\x02\x02" + + "\u029A/\x03\x02\x02\x02\u029B\u029E\x052\x1A\x02\u029C\u029E\x07\'\x02" + + "\x02\u029D\u029B\x03\x02\x02\x02\u029D\u029C\x03\x02\x02\x02\u029E\u029F" + + "\x03\x02\x02\x02\u029F\u02A0\x07\x1D\x02\x02\u02A0\u02A1\x05,\x17\x02" + + "\u02A11\x03\x02\x02\x02\u02A2\u02A9\x05R*\x02\u02A3\u02A6\x07?\x02\x02" + + "\u02A4\u02A7\x05R*\x02\u02A5\u02A7\x07\'\x02\x02\u02A6\u02A4\x03\x02\x02" + + "\x02\u02A6\u02A5\x03\x02\x02\x02\u02A7\u02A8\x03\x02\x02\x02\u02A8\u02AA" + + "\x07@\x02\x02\u02A9\u02A3\x03\x02\x02\x02\u02A9\u02AA\x03\x02\x02\x02" + + "\u02AA3\x03\x02\x02\x02\u02AB\u02AC\x05\b\x05\x02\u02AC\u02AD\x07\x02" + + "\x02\x03\u02AD\u02B5\x03\x02\x02\x02\u02AE\u02AF\x05,\x17\x02\u02AF\u02B0" + + "\x07\x02\x02\x03\u02B0\u02B5\x03\x02\x02\x02\u02B1\u02B2\x07E\x02\x02" + + "\u02B2\u02B5\x07\x02\x02\x03\u02B3\u02B5\x07\x02\x02\x03\u02B4\u02AB\x03" + + "\x02\x02\x02\u02B4\u02AE\x03\x02\x02\x02\u02B4\u02B1\x03\x02\x02\x02\u02B4" + + "\u02B3\x03\x02\x02\x02\u02B55\x03\x02\x02\x02\u02B6\u02B9\x058\x1D\x02" + + "\u02B7\u02B9\x05:\x1E\x02\u02B8\u02B6\x03\x02\x02\x02\u02B8\u02B7\x03" + + "\x02\x02\x02\u02B97\x03\x02\x02\x02\u02BA\u02BB\x05> \x02\u02BB\u02BC" + + "\x07\x1D\x02\x02\u02BC\u02BD\x05,\x17\x02\u02BD\u02CC\x03\x02\x02\x02" + + "\u02BE\u02BF\x07?\x02\x02\u02BF\u02C4\x05> \x02\u02C0\u02C1\x07\n\x02" + + "\x02\u02C1\u02C3\x05> \x02\u02C2\u02C0\x03\x02\x02\x02\u02C3\u02C6\x03" + + "\x02\x02\x02\u02C4\u02C2\x03\x02\x02\x02\u02C4\u02C5\x03\x02\x02\x02\u02C5" + + "\u02C7\x03\x02\x02\x02\u02C6\u02C4\x03\x02\x02\x02\u02C7\u02C8\x07@\x02" + + "\x02\u02C8\u02C9\x07\x1D\x02\x02\u02C9\u02CA\x05,\x17\x02\u02CA\u02CC" + + "\x03\x02\x02\x02\u02CB\u02BA\x03\x02\x02\x02\u02CB\u02BE\x03\x02\x02\x02" + + "\u02CC9\x03\x02\x02\x02\u02CD\u02CE\x07?\x02\x02\u02CE\u02CF\x07?\x02" + + "\x02\u02CF\u02D2\x05> \x02\u02D0\u02D1\x07\n\x02\x02\u02D1\u02D3\x05>" + + " \x02\u02D2\u02D0\x03\x02\x02\x02\u02D3\u02D4\x03\x02\x02\x02\u02D4\u02D2" + + "\x03\x02\x02\x02\u02D4\u02D5\x03\x02\x02\x02\u02D5\u02D6\x03\x02\x02\x02" + + "\u02D6\u02D7\x07@\x02\x02\u02D7\u02D8\x07@\x02\x02\u02D8\u02D9\x07\x1D" + + "\x02\x02\u02D9\u02DA\x05,\x17\x02\u02DA;\x03\x02\x02\x02\u02DB\u02DE\x07" + + "\'\x02\x02\u02DC\u02DE\x05P)\x02\u02DD\u02DB\x03\x02\x02\x02\u02DD\u02DC" + + "\x03\x02\x02\x02\u02DE=\x03\x02\x02\x02\u02DF\u02E0\x05<\x1F\x02\u02E0" + + "?\x03\x02\x02\x02\u02E1\u02E2\x05<\x1F\x02\u02E2\u02E3\x07\x07\x02\x02" + + "\u02E3\u02E4\x05$\x13\x02\u02E4A\x03\x02\x02\x02\u02E5\u02E8\x075\x02" + + "\x02\u02E6\u02E8\x05P)\x02\u02E7\u02E5\x03\x02\x02\x02\u02E7\u02E6\x03" + + "\x02\x02\x02\u02E8C\x03\x02\x02\x02\u02E9\u02EE\x05,\x17\x02\u02EA\u02EB" + + "\x07\n\x02\x02\u02EB\u02ED\x05,\x17\x02\u02EC\u02EA\x03\x02\x02\x02\u02ED" + + "\u02F0\x03\x02\x02\x02\u02EE\u02EC\x03\x02\x02\x02\u02EE\u02EF\x03\x02" + + "\x02\x02\u02EFE\x03\x02\x02\x02\u02F0\u02EE\x03\x02\x02\x02\u02F1\u02F2" + + "\x05R*\x02\u02F2\u02F3\x07\x07\x02\x02\u02F3\u02F4\x05,\x17\x02\u02F4" + + "\u02F8\x03\x02\x02\x02\u02F5\u02F6\x07(\x02\x02\u02F6\u02F8\x05,\x17\x02" + + "\u02F7\u02F1\x03\x02\x02\x02\u02F7\u02F5\x03\x02\x02\x02\u02F8G\x03\x02" + + "\x02\x02\u02F9\u02FC\x05P)\x02\u02FA\u02FC\t\x05\x02\x02\u02FB\u02F9\x03" + + "\x02\x02\x02\u02FB\u02FA\x03\x02\x02\x02\u02FCI\x03\x02\x02\x02\u02FD" + + "\u0300\x05P)\x02\u02FE\u0300\t\x06\x02\x02\u02FF\u02FD\x03\x02\x02\x02" + + "\u02FF\u02FE\x03\x02\x02\x02\u0300K\x03\x02\x02\x02\u0301\u0302\t\x07" + + "\x02\x02\u0302M\x03\x02\x02\x02\u0303\u0304\t\b\x02\x02\u0304O\x03\x02" + + "\x02\x02\u0305\u030A\x05T+\x02\u0306\u0307\x07)\x02\x02\u0307\u0309\x05" + + "T+\x02\u0308\u0306\x03\x02\x02\x02\u0309\u030C\x03\x02\x02\x02\u030A\u0308" + + "\x03\x02\x02\x02\u030A\u030B\x03\x02\x02\x02\u030BQ\x03\x02\x02\x02\u030C" + + "\u030A\x03\x02\x02\x02\u030D\u0312\x05T+\x02\u030E\u030F\x05P)\x02\u030F" + + "\u0310\b*\x01\x02\u0310\u0312\x03\x02\x02\x02\u0311\u030D\x03\x02\x02" + + "\x02\u0311\u030E\x03\x02\x02\x02\u0312S\x03\x02\x02\x02\u0313\u0314\t" + + "\t\x02\x02\u0314U\x03\x02\x02\x02XY`iq\x8A\x94\x9C\x9F\xA9\xAC\xAF\xB3" + + "\xB7\xBA\xBC\xCA\xD3\xD7\xDA\xE1\xE9\xF5\xFD\u0103\u0107\u0109\u0114\u0116" + + "\u0125\u012D\u013C\u0144\u0146\u0157\u015A\u015D\u0176\u017A\u0180\u0193" + + "\u0198\u01A0\u01A2\u01B2\u01B8\u01BC\u01C5\u01D7\u01DB\u01E6\u01EA\u01F6" + + "\u01FA\u0205\u0209\u0211\u021B\u021F\u022B\u022F\u0239\u023C\u023F\u0255" + + "\u027C\u027F\u0286\u0288\u028F\u0296\u029D\u02A6\u02A9\u02B4\u02B8\u02C4" + + "\u02CB\u02D4\u02DD\u02E7\u02EE\u02F7\u02FB\u02FF\u030A\u0311"; public static readonly _serializedATN: string = Utils.join( [ QuintParser._serializedATNSegment0, @@ -4851,45 +4785,6 @@ export class TypeSumVariantContext extends ParserRuleContext { } -export class NondetOperDefContext extends ParserRuleContext { - public qualId(): QualIdContext { - return this.getRuleContext(0, QualIdContext); - } - public ASGN(): TerminalNode { return this.getToken(QuintParser.ASGN, 0); } - public expr(): ExprContext { - return this.getRuleContext(0, ExprContext); - } - public type(): TypeContext | undefined { - return this.tryGetRuleContext(0, TypeContext); - } - constructor(parent: ParserRuleContext | undefined, invokingState: number) { - super(parent, invokingState); - } - // @Override - public get ruleIndex(): number { return QuintParser.RULE_nondetOperDef; } - // @Override - public enterRule(listener: QuintListener): void { - if (listener.enterNondetOperDef) { - listener.enterNondetOperDef(this); - } - } - // @Override - public exitRule(listener: QuintListener): void { - if (listener.exitNondetOperDef) { - listener.exitNondetOperDef(this); - } - } - // @Override - public accept(visitor: QuintVisitor): Result { - if (visitor.visitNondetOperDef) { - return visitor.visitNondetOperDef(this); - } else { - return visitor.visitChildren(this); - } - } -} - - export class QualifierContext extends ParserRuleContext { constructor(parent: ParserRuleContext | undefined, invokingState: number) { super(parent, invokingState); @@ -6742,38 +6637,6 @@ export class LetInContext extends ExprContext { } } } -export class NondetContext extends ExprContext { - public nondetOperDef(): NondetOperDefContext { - return this.getRuleContext(0, NondetOperDefContext); - } - public expr(): ExprContext { - return this.getRuleContext(0, ExprContext); - } - constructor(ctx: ExprContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); - } - // @Override - public enterRule(listener: QuintListener): void { - if (listener.enterNondet) { - listener.enterNondet(this); - } - } - // @Override - public exitRule(listener: QuintListener): void { - if (listener.exitNondet) { - listener.exitNondet(this); - } - } - // @Override - public accept(visitor: QuintVisitor): Result { - if (visitor.visitNondet) { - return visitor.visitNondet(this); - } else { - return visitor.visitChildren(this); - } - } -} export class ParenContext extends ExprContext { public LPAREN(): TerminalNode { return this.getToken(QuintParser.LPAREN, 0); } public expr(): ExprContext { diff --git a/quint/src/generated/QuintVisitor.ts b/quint/src/generated/QuintVisitor.ts index cd053a7a2..f8a3bbb4c 100644 --- a/quint/src/generated/QuintVisitor.ts +++ b/quint/src/generated/QuintVisitor.ts @@ -54,7 +54,6 @@ import { RecordContext } from "./QuintParser"; import { ListContext } from "./QuintParser"; import { IfElseContext } from "./QuintParser"; import { LetInContext } from "./QuintParser"; -import { NondetContext } from "./QuintParser"; import { ParenContext } from "./QuintParser"; import { BracesContext } from "./QuintParser"; import { AnnotatedOperDefContext } from "./QuintParser"; @@ -76,7 +75,6 @@ import { TypeDefContext } from "./QuintParser"; import { TypeDefHeadContext } from "./QuintParser"; import { SumTypeDefinitionContext } from "./QuintParser"; import { TypeSumVariantContext } from "./QuintParser"; -import { NondetOperDefContext } from "./QuintParser"; import { QualifierContext } from "./QuintParser"; import { ImportModContext } from "./QuintParser"; import { ExportModContext } from "./QuintParser"; @@ -480,14 +478,6 @@ export interface QuintVisitor extends ParseTreeVisitor { */ visitLetIn?: (ctx: LetInContext) => Result; - /** - * Visit a parse tree produced by the `nondet` - * labeled alternative in `QuintParser.expr`. - * @param ctx the parse tree - * @return the visitor result - */ - visitNondet?: (ctx: NondetContext) => Result; - /** * Visit a parse tree produced by the `paren` * labeled alternative in `QuintParser.expr`. @@ -647,13 +637,6 @@ export interface QuintVisitor extends ParseTreeVisitor { */ visitTypeSumVariant?: (ctx: TypeSumVariantContext) => Result; - /** - * Visit a parse tree produced by `QuintParser.nondetOperDef`. - * @param ctx the parse tree - * @return the visitor result - */ - visitNondetOperDef?: (ctx: NondetOperDefContext) => Result; - /** * Visit a parse tree produced by `QuintParser.qualifier`. * @param ctx the parse tree diff --git a/quint/src/names/resolver.ts b/quint/src/names/resolver.ts index 777c457a1..bcf595c60 100644 --- a/quint/src/names/resolver.ts +++ b/quint/src/names/resolver.ts @@ -77,6 +77,9 @@ class NameResolver implements IRVisitor { if (this.definitionDepth > 0) { this.collector.collectDefinition({ ...def, depth: this.definitionDepth }) } + + // Map the definition to itself so we can recover depth information from the table + this.table.set(def.id, { ...def, depth: this.definitionDepth }) } exitLet(expr: QuintLet): void { diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index 1f6901487..7bf370f2a 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -169,53 +169,6 @@ export class ToIrListener implements QuintListener { this.exprStack.push(letExpr) } - exitNondetOperDef(ctx: p.NondetOperDefContext) { - const name = ctx.qualId().text - let typeAnnotation: QuintType | undefined - if (ctx.type()) { - const maybeType = this.popType() - if (maybeType.isJust()) { - // the operator is tagged with a type - typeAnnotation = maybeType.value - } - } - const expr = this.exprStack.pop() ?? this.undefinedExpr(ctx)() - - const id = this.getId(ctx) - - const def: QuintDef = { - id, - kind: 'def', - name, - qualifier: 'nondet', - expr, - typeAnnotation, - } - - this.declarationStack.push(def) - } - - // special case for: nondet x = e1; e2 - exitNondet(ctx: p.NondetContext) { - const def = this.declarationStack.pop() ?? this.undefinedDeclaration(ctx)() - const nested = this.exprStack.pop() ?? this.undefinedExpr(ctx)() - - if (def.kind !== 'def') { - // only `QuintDef` is allowed in `nondet` expressions - console.debug(`[DEBUG] non-def found in nondet definition: ${ctx.text}`) - return - } - - const id = this.getId(ctx) - const letExpr: QuintEx = { - id, - kind: 'let', - opdef: def, - expr: nested, - } - this.exprStack.push(letExpr) - } - /** **************** translate operator definititons **********************/ // translate a top-level or nested operator definition diff --git a/quint/src/quintAnalyzer.ts b/quint/src/quintAnalyzer.ts index 48e54fdeb..8f77241ec 100644 --- a/quint/src/quintAnalyzer.ts +++ b/quint/src/quintAnalyzer.ts @@ -101,7 +101,7 @@ class QuintAnalyzer { this.effectInferrer = new EffectInferrer(lookupTable, previousOutput?.effects) this.multipleUpdatesChecker = new MultipleUpdatesChecker() this.modeChecker = new ModeChecker(previousOutput?.modes) - this.nondetChecker = new NondetChecker() + this.nondetChecker = new NondetChecker(lookupTable) } analyzeDeclarations(decls: QuintDeclaration[]): QuintDeclaration[] { diff --git a/quint/src/quintError.ts b/quint/src/quintError.ts index 8d0862716..03a3d6955 100644 --- a/quint/src/quintError.ts +++ b/quint/src/quintError.ts @@ -73,6 +73,8 @@ export type ErrorCode = | 'QNT204' /* QNT205: nondet bindings can only be used with boolean expressions */ | 'QNT205' + /* QNT206: 'nondet' can only be used inside actions, not at the top level */ + | 'QNT206' /* QNT404: Name '' not found */ | 'QNT404' /* QNT405: Module '' not found */ diff --git a/quint/test/effects/NondetChecker.test.ts b/quint/test/effects/NondetChecker.test.ts index 2f3f454ce..d7d40d647 100644 --- a/quint/test/effects/NondetChecker.test.ts +++ b/quint/test/effects/NondetChecker.test.ts @@ -5,10 +5,8 @@ import { NondetChecker } from '../../src/effects/NondetChecker' import { SourceLookupPath } from '../../src/parsing/sourceResolver' import { TypeInferrer } from '../../src/types/inferrer' -const checker = new NondetChecker() - describe('checkNondets', () => { - function moduleAndTypes(text: string) { + function parseAndTypecheck(text: string) { const idGen = newIdGenerator() const fake_path: SourceLookupPath = { normalizedPath: 'fake_path', toSourceName: () => 'fake_path' } const { modules, table, errors } = parse(idGen, 'fake_location', fake_path, text) @@ -18,7 +16,7 @@ describe('checkNondets', () => { const [typeErrors, types] = typeInferrer.inferTypes(modules[0].declarations) assert.isEmpty(typeErrors, `Unexpected type errors: ${[...typeErrors.values()].map(errorTreeToString)}`) - return { module: modules[0], types } + return { module: modules[0], table, types } } it('returns empty map for effects with no problems', () => { @@ -28,9 +26,9 @@ describe('checkNondets', () => { action foo = { nondet bar = Set(1,2).oneOf() x' = bar } }` - const { module, types } = moduleAndTypes(text) + const { module, table, types } = parseAndTypecheck(text) - const errors = checker.checkNondets(types, module.declarations) + const errors = new NondetChecker(table).checkNondets(types, module.declarations) assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(quintErrorToString)}`) }) @@ -49,9 +47,9 @@ describe('checkNondets', () => { val non_action = { nondet bar = Set(1,2).oneOf() bar } }` - const { module, types } = moduleAndTypes(text) + const { module, table, types } = parseAndTypecheck(text) - const errors = checker.checkNondets(types, module.declarations) + const errors = new NondetChecker(table).checkNondets(types, module.declarations) assert.sameDeepMembers( [...errors.entries()], @@ -67,11 +65,20 @@ describe('checkNondets', () => { }, ], [ - 26n, + 24n, + { + code: 'QNT206', + message: "'nondet' can only be used inside actions, not at the top level", + reference: 24n, + data: {}, + }, + ], + [ + 31n, { code: 'QNT205', message: 'nondet bindings can only be used with boolean expressions', - reference: 26n, + reference: 31n, data: {}, }, ], diff --git a/quint/test/names/resolver.test.ts b/quint/test/names/resolver.test.ts index d0d502ee1..e4474cf22 100644 --- a/quint/test/names/resolver.test.ts +++ b/quint/test/names/resolver.test.ts @@ -82,6 +82,17 @@ describe('resolveNames', () => { { code: 'QNT404', message: "Name 'x' not found", reference: 0n, data: {} }, ]) }) + + it('finds a definition itself with depth information', () => { + const result = resolveNamesForExprs([], newIdGenerator()) + + assert.isEmpty(result.errors) + + const def = [...result.table.values()].find(def => def.name === 'unscoped_def' || def.kind === 'def') + + assert.isNotNull(def) + assert.deepEqual(result.table.get(def!.id)?.depth, 0) + }) }) describe('shadowing', () => { From 71cd1cf735b6b700aed8a053dbd54c1bb349cb3b Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 6 May 2024 14:17:17 -0300 Subject: [PATCH 351/388] Update generated error messages --- quint/test/parsing/quintParserFrontend.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/quint/test/parsing/quintParserFrontend.test.ts b/quint/test/parsing/quintParserFrontend.test.ts index 1f2281e07..704926088 100644 --- a/quint/test/parsing/quintParserFrontend.test.ts +++ b/quint/test/parsing/quintParserFrontend.test.ts @@ -136,7 +136,7 @@ describe('syntax errors', () => { assert.equal(errors.length, 1) assert.equal( errors[0].message, - `mismatched input '' expecting {'}', 'const', 'var', 'assume', 'type', 'val', 'def', 'pure', 'action', 'run', 'temporal', 'import', 'export', DOCCOMMENT}` + `mismatched input '' expecting {'}', 'const', 'var', 'assume', 'type', 'val', 'def', 'pure', 'action', 'run', 'temporal', 'nondet', 'import', 'export', DOCCOMMENT}` ) assert.equal(errors[0].code, 'QNT000') }) @@ -147,7 +147,7 @@ describe('syntax errors', () => { assert.equal(errors.length, 1) assert.equal( errors[0].message, - `extraneous input 'something' expecting {'}', 'const', 'var', 'assume', 'type', 'val', 'def', 'pure', 'action', 'run', 'temporal', 'import', 'export', DOCCOMMENT}` + `extraneous input 'something' expecting {'}', 'const', 'var', 'assume', 'type', 'val', 'def', 'pure', 'action', 'run', 'temporal', 'nondet', 'import', 'export', DOCCOMMENT}` ) assert.equal(errors[0].code, 'QNT000') }) @@ -194,7 +194,7 @@ describe('syntax errors', () => { assert.isAtLeast(errors.length, 1) assert.equal( errors[0].message, - `extraneous input '(' expecting {'}', 'const', 'var', 'assume', 'type', 'val', 'def', 'pure', 'action', 'run', 'temporal', 'import', 'export', DOCCOMMENT}` + `extraneous input '(' expecting {'}', 'const', 'var', 'assume', 'type', 'val', 'def', 'pure', 'action', 'run', 'temporal', 'nondet', 'import', 'export', DOCCOMMENT}` ) assert.equal(errors[0].code, 'QNT000') }) From fef5ea7ec4278be8d2e6505056271dd1b40225eb Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 6 May 2024 14:19:08 -0300 Subject: [PATCH 352/388] Return list of errors instead of map --- quint/src/effects/NondetChecker.ts | 34 +++++++++++---- quint/src/quintAnalyzer.ts | 4 +- quint/test/effects/NondetChecker.test.ts | 54 +++++++++--------------- 3 files changed, 48 insertions(+), 44 deletions(-) diff --git a/quint/src/effects/NondetChecker.ts b/quint/src/effects/NondetChecker.ts index 1a1976957..55ed3ae04 100644 --- a/quint/src/effects/NondetChecker.ts +++ b/quint/src/effects/NondetChecker.ts @@ -1,3 +1,18 @@ +/* ---------------------------------------------------------------------------------- + * Copyright 2024 Informal Systems + * Licensed under the Apache License, Version 2.0. + * See LICENSE in the project root for license information. + * --------------------------------------------------------------------------------- */ + +/** + * Checking for the misuse of 'nondet' and 'oneOf'. Necessary to ensure they are + * compatible with the exists operator from TLA+. + * + * @author Gabriela Moreira + * + * @module + */ + import { IRVisitor, walkDeclaration } from '../ir/IRVisitor' import { OpQualifier, QuintApp, QuintDeclaration, QuintLet, QuintOpDef } from '../ir/quintIr' import { LookupTable } from '../names/base' @@ -9,20 +24,21 @@ export class NondetChecker implements IRVisitor { private types: Map = new Map() private lastDefQualifier: OpQualifier = 'def' - private errors: Map = new Map() + private errors: QuintError[] = [] constructor(table: LookupTable) { this.table = table } /** - * Checks effects for multiple updates of the same state variable. + * Checks declarations for misuse of 'nondet' and 'oneOf'. * - * @param effects the effects to look for multiple updates on + * @param types - the types of the declarations + * @param declarations - the declarations to check * - * @returns a map of errors, where the key is the variable id + * @returns a list of errors (empty if no errors are found) */ - checkNondets(types: Map, declarations: QuintDeclaration[]): Map { + checkNondets(types: Map, declarations: QuintDeclaration[]): QuintError[] { this.types = types declarations.forEach(d => walkDeclaration(this, d)) @@ -33,7 +49,7 @@ export class NondetChecker implements IRVisitor { this.lastDefQualifier = def.qualifier if (def.qualifier === 'nondet' && this.table.get(def.id)!.depth === 0) { - this.errors.set(def.id, { + this.errors.push({ code: 'QNT206', message: `'nondet' can only be used inside actions, not at the top level`, reference: def.id, @@ -49,7 +65,7 @@ export class NondetChecker implements IRVisitor { } if (this.lastDefQualifier !== 'nondet') { - this.errors.set(app.id, { + this.errors.push({ code: 'QNT203', message: `'oneOf' must be used inside a nondet definition`, reference: app.id, @@ -67,7 +83,7 @@ export class NondetChecker implements IRVisitor { // body of nondet must be an application of oneOf const body = expr.opdef.expr if (body.kind !== 'app' || body.opcode !== 'oneOf') { - this.errors.set(body.id, { + this.errors.push({ code: 'QNT204', message: `'oneOf' must be the outtermost expression in a nondet definition`, reference: body.id, @@ -78,7 +94,7 @@ export class NondetChecker implements IRVisitor { // if the opdef is nondet, the return type must be bool const expressionType = this.types.get(expr.expr.id) if (expressionType?.type.kind !== 'bool') { - this.errors.set(expr.id, { + this.errors.push({ code: 'QNT205', message: `nondet bindings can only be used with boolean expressions`, reference: expr.id, diff --git a/quint/src/quintAnalyzer.ts b/quint/src/quintAnalyzer.ts index 8f77241ec..34412d745 100644 --- a/quint/src/quintAnalyzer.ts +++ b/quint/src/quintAnalyzer.ts @@ -111,7 +111,7 @@ class QuintAnalyzer { const [typeErrMap, types] = this.typeInferrer.inferTypes(resolvedDecls) const [effectErrMap, effects] = this.effectInferrer.inferEffects(resolvedDecls) const updatesErrMap = this.multipleUpdatesChecker.checkEffects([...effects.values()]) - const nondetErrMap = this.nondetChecker.checkNondets(types, resolvedDecls) + const nondetErrors = this.nondetChecker.checkNondets(types, resolvedDecls) const [modeErrMap, modes] = this.modeChecker.checkModes(resolvedDecls, effects) const errorTrees = [...typeErrMap, ...effectErrMap, ...typAppErrMap] @@ -123,7 +123,7 @@ class QuintAnalyzer { }) ) - this.errors.push(...modeErrMap.values(), ...updatesErrMap.values(), ...nondetErrMap.values()) + this.errors.push(...modeErrMap.values(), ...updatesErrMap.values(), ...nondetErrors) // We assume that ids are unique across modules, and map merging can be done // without collision checks diff --git a/quint/test/effects/NondetChecker.test.ts b/quint/test/effects/NondetChecker.test.ts index d7d40d647..fd793c105 100644 --- a/quint/test/effects/NondetChecker.test.ts +++ b/quint/test/effects/NondetChecker.test.ts @@ -51,38 +51,26 @@ describe('checkNondets', () => { const errors = new NondetChecker(table).checkNondets(types, module.declarations) - assert.sameDeepMembers( - [...errors.entries()], - [ - [4n, { code: 'QNT203', message: "'oneOf' must be used inside a nondet definition", reference: 4n, data: {} }], - [ - 13n, - { - code: 'QNT204', - message: "'oneOf' must be the outtermost expression in a nondet definition", - reference: 13n, - data: {}, - }, - ], - [ - 24n, - { - code: 'QNT206', - message: "'nondet' can only be used inside actions, not at the top level", - reference: 24n, - data: {}, - }, - ], - [ - 31n, - { - code: 'QNT205', - message: 'nondet bindings can only be used with boolean expressions', - reference: 31n, - data: {}, - }, - ], - ] - ) + assert.sameDeepMembers(errors, [ + { code: 'QNT203', message: "'oneOf' must be used inside a nondet definition", reference: 4n, data: {} }, + { + code: 'QNT204', + message: "'oneOf' must be the outtermost expression in a nondet definition", + reference: 13n, + data: {}, + }, + { + code: 'QNT206', + message: "'nondet' can only be used inside actions, not at the top level", + reference: 24n, + data: {}, + }, + { + code: 'QNT205', + message: 'nondet bindings can only be used with boolean expressions', + reference: 31n, + data: {}, + }, + ]) }) }) From 5cead19b1cfa5bc50abb1595986855b6edbcd500 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 6 May 2024 14:35:54 -0300 Subject: [PATCH 353/388] Break down big test into units --- quint/test/effects/NondetChecker.test.ts | 63 +++++++++++++++++++----- 1 file changed, 51 insertions(+), 12 deletions(-) diff --git a/quint/test/effects/NondetChecker.test.ts b/quint/test/effects/NondetChecker.test.ts index fd793c105..7df3c8045 100644 --- a/quint/test/effects/NondetChecker.test.ts +++ b/quint/test/effects/NondetChecker.test.ts @@ -33,18 +33,25 @@ describe('checkNondets', () => { assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(quintErrorToString)}`) }) - it('returns a map with errors for all problems', () => { + it('finds an error when oneOf is used in a val', () => { const text = `module A { - val a = Set(1,2).oneOf() // error: 'oneOf' must be used inside a nondet definition - var x: int + val a = Set(1,2).oneOf() + }` - // error: 'oneOf' must be the outtermost expression in a nondet definition - action foo = { nondet bar = Set(1,2).oneOf() + 1 { x' = bar } } + const { module, table, types } = parseAndTypecheck(text) - nondet top_level = Set(1,2).oneOf() // error: TODO + const errors = new NondetChecker(table).checkNondets(types, module.declarations) - // error: nondet bindings can only be used with boolean expressions - val non_action = { nondet bar = Set(1,2).oneOf() bar } + assert.sameDeepMembers(errors, [ + { code: 'QNT203', message: "'oneOf' must be used inside a nondet definition", reference: 4n, data: {} }, + ]) + }) + + it('finds an error when oneOf is not the outtermost expression', () => { + const text = `module A { + var x: int + + action foo = { nondet bar = Set(1,2).oneOf() + 1 { x' = bar } } }` const { module, table, types } = parseAndTypecheck(text) @@ -52,23 +59,55 @@ describe('checkNondets', () => { const errors = new NondetChecker(table).checkNondets(types, module.declarations) assert.sameDeepMembers(errors, [ - { code: 'QNT203', message: "'oneOf' must be used inside a nondet definition", reference: 4n, data: {} }, { code: 'QNT204', message: "'oneOf' must be the outtermost expression in a nondet definition", - reference: 13n, + reference: 8n, data: {}, }, + ]) + }) + + it('find an error when nondet is a top-level definition', () => { + const text = `module A { + var x: int + + nondet top_level = Set(1,2).oneOf() + }` + + const { module, table, types } = parseAndTypecheck(text) + + const errors = new NondetChecker(table).checkNondets(types, module.declarations) + + assert.sameDeepMembers(errors, [ { code: 'QNT206', message: "'nondet' can only be used inside actions, not at the top level", - reference: 24n, + reference: 7n, data: {}, }, + ]) + }) + + it('finds an error when the scope expression for the nondet binding is not boolean', () => { + // FIXME: ideally this should also complain about the top-level def not + // being an action. This requires the introduction of a new effect, which is + // not trivial. For now, checking for boolean returns should already help a + // lot. + const text = `module A { + // error: nondet bindings can only be used with boolean expressions + val non_action = { nondet bar = Set(1,2).oneOf() bar } + }` + + const { module, table, types } = parseAndTypecheck(text) + + const errors = new NondetChecker(table).checkNondets(types, module.declarations) + + assert.sameDeepMembers(errors, [ { code: 'QNT205', message: 'nondet bindings can only be used with boolean expressions', - reference: 31n, + reference: 7n, data: {}, }, ]) From 969fcbbfa4f308467c9e55448427faf588a68a76 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 6 May 2024 14:44:47 -0300 Subject: [PATCH 354/388] Add CHANGELOG entry --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e8bfec05..038ccf2d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED ### Added + +- Added static analysis checks to ensure proper usage of `nondet` and `oneOf` (#1431). + ### Changed ### Deprecated ### Removed From 3ba143bc2ef846bdd74d8cbe6c8643ee939b927c Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 6 May 2024 14:48:02 -0300 Subject: [PATCH 355/388] Fix nondet issue in ICS20 --- examples/cosmos/ics20/ics20.qnt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/cosmos/ics20/ics20.qnt b/examples/cosmos/ics20/ics20.qnt index 6ee7a5bee..83df4da90 100644 --- a/examples/cosmos/ics20/ics20.qnt +++ b/examples/cosmos/ics20/ics20.qnt @@ -611,7 +611,7 @@ module ics20Test { // Check that there is a single incoming acknowledgement on chain A, // that indicates failure. assert(chainStates.get("B").inAcknowledgements.size() == 1), - val ack = chainStates.get("B").inAcknowledgements.oneOf() + nondet ack = chainStates.get("B").inAcknowledgements.oneOf() assert(ack.success == false and ack.errorMessage == "transfer coins failed"), // Process the acknowledgement on chain A; this triggers step 3.6 above. From 53b073ca4da76cc3a1cbdc90a08a050604614064 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 6 May 2024 14:56:56 -0300 Subject: [PATCH 356/388] Fix Lightclient example `nondet` misuse --- examples/README.md | 2 +- examples/cosmos/lightclient/Lightclient.qnt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/README.md b/examples/README.md index cf82deffe..0abecf829 100644 --- a/examples/README.md +++ b/examples/README.md @@ -66,7 +66,7 @@ listed without any additional command line arguments. | [cosmos/ics23/ics23.qnt](./cosmos/ics23/ics23.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [cosmos/lightclient/Blockchain.qnt](./cosmos/lightclient/Blockchain.qnt) | :white_check_mark: | :white_check_mark: | N/A[^parameterized] | N/A[^nostatemachine] | | [cosmos/lightclient/LCVerificationApi.qnt](./cosmos/lightclient/LCVerificationApi.qnt) | :white_check_mark: | :white_check_mark: | N/A[^parameterized] | N/A[^nostatemachine] | -| [cosmos/lightclient/Lightclient.qnt](./cosmos/lightclient/Lightclient.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | +| [cosmos/lightclient/Lightclient.qnt](./cosmos/lightclient/Lightclient.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [cosmos/lightclient/typedefs.qnt](./cosmos/lightclient/typedefs.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | N/A[^nostatemachine] | | [cosmos/tendermint/Tendermint.qnt](./cosmos/tendermint/Tendermint.qnt) | :white_check_mark: | :white_check_mark: | N/A[^parameterized] | N/A[^nostatemachine] | | [cosmos/tendermint/TendermintModels.qnt](./cosmos/tendermint/TendermintModels.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | diff --git a/examples/cosmos/lightclient/Lightclient.qnt b/examples/cosmos/lightclient/Lightclient.qnt index 5d7f6458f..3a31d525e 100644 --- a/examples/cosmos/lightclient/Lightclient.qnt +++ b/examples/cosmos/lightclient/Lightclient.qnt @@ -199,7 +199,7 @@ module Lightclient { // Record that one more probe has been done (for complexity and model checking) nprobes' = nprobes + 1, // Verify the current block - nondet verdict = API::ValidAndVerified(latestVerified, current, true) + val verdict = API::ValidAndVerified(latestVerified, current, true) all { MonitorTransition(latestVerified, current, API::localClock, verdict), // Decide whether/how to continue From cf47cc08b1e2ef83e610543df1abf808b253361c Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 6 May 2024 15:02:09 -0300 Subject: [PATCH 357/388] Update test fixtures --- quint/testFixture/SuperSpec.json | 2 +- quint/testFixture/TrivialTypeError.json | 2 +- quint/testFixture/_0099unorderedDefs.json | 2 +- quint/testFixture/_0100cyclicDefs.json | 2 +- quint/testFixture/_0101noRecursion.json | 2 +- quint/testFixture/_1010undefinedName.json | 2 +- quint/testFixture/_1011nameOutOfScope.json | 2 +- quint/testFixture/_1013unknownTypeLetIn.json | 2 +- quint/testFixture/_1014conflictingNames.json | 2 +- quint/testFixture/_1015noToplevelNondet.json | 2 +- quint/testFixture/_1020importFrom.json | 2 +- quint/testFixture/_1021importee1.json | 2 +- quint/testFixture/_1022importee2.json | 2 +- quint/testFixture/_1025importeeWithError.json | 2 +- quint/testFixture/_1030const.json | 2 +- quint/testFixture/_1031instance.json | 2 +- quint/testFixture/_1032docstrings.json | 2 +- quint/testFixture/_1040compileError.json | 2 +- quint/testFixture/_1041compileConst.json | 2 +- quint/testFixture/_1042qualifiersInRecordsFieldsError.json | 2 +- quint/testFixture/_1043sumTypeDecl.json | 2 +- quint/testFixture/_1044matchExpression.json | 2 +- quint/testFixture/_1045polymorphicTypeDecl.json | 2 +- quint/testFixture/modulesAndJunk.json | 2 +- 24 files changed, 24 insertions(+), 24 deletions(-) diff --git a/quint/testFixture/SuperSpec.json b/quint/testFixture/SuperSpec.json index 6e84ef117..588ec8bce 100644 --- a/quint/testFixture/SuperSpec.json +++ b/quint/testFixture/SuperSpec.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10,"depth":0},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8,"depth":0}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":524,"name":"withConsts","declarations":[{"id":101,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":100,"kind":"app","opcode":"isub","args":[{"id":98,"kind":"int","value":1},{"id":99,"kind":"int","value":2}]}},{"id":105,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":104,"kind":"app","opcode":"imul","args":[{"id":102,"kind":"int","value":2},{"id":103,"kind":"int","value":3}]}},{"id":109,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":108,"kind":"app","opcode":"idiv","args":[{"id":106,"kind":"int","value":2},{"id":107,"kind":"int","value":3}]}},{"id":113,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":112,"kind":"app","opcode":"imod","args":[{"id":110,"kind":"int","value":2},{"id":111,"kind":"int","value":3}]}},{"id":117,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":116,"kind":"app","opcode":"ipow","args":[{"id":114,"kind":"int","value":2},{"id":115,"kind":"int","value":3}]}},{"id":120,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":119,"kind":"app","opcode":"iuminus","args":[{"id":118,"kind":"int","value":100}]}},{"id":124,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":123,"kind":"app","opcode":"igt","args":[{"id":121,"kind":"int","value":2},{"id":122,"kind":"int","value":3}]}},{"id":128,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":127,"kind":"app","opcode":"igte","args":[{"id":125,"kind":"int","value":2},{"id":126,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},{"id":132,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":131,"kind":"app","opcode":"ilt","args":[{"id":129,"kind":"int","value":2},{"id":130,"kind":"int","value":3}]}},{"id":136,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":135,"kind":"app","opcode":"ilte","args":[{"id":133,"kind":"int","value":2},{"id":134,"kind":"int","value":3}]}},{"id":140,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":139,"kind":"app","opcode":"eq","args":[{"id":137,"kind":"int","value":2},{"id":138,"kind":"int","value":3}]}},{"id":144,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":143,"kind":"app","opcode":"neq","args":[{"id":141,"kind":"int","value":2},{"id":142,"kind":"int","value":3}]}},{"id":150,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":149,"kind":"app","opcode":"eq","args":[{"id":147,"kind":"app","opcode":"iadd","args":[{"id":145,"kind":"int","value":2},{"id":146,"kind":"int","value":2}]},{"id":148,"kind":"int","value":4}]}},{"id":154,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":153,"kind":"app","opcode":"in","args":[{"id":151,"kind":"int","value":1},{"id":152,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},{"id":166,"kind":"def","name":"withType","qualifier":"val","expr":{"id":165,"kind":"app","opcode":"Set","args":[{"id":163,"kind":"int","value":1},{"id":164,"kind":"int","value":2}]},"typeAnnotation":{"id":162,"kind":"set","elem":{"id":161,"kind":"int"}}},{"id":167,"kind":"typedef","name":"PROC","depth":0},{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},{"id":175,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":174,"kind":"int","value":42}},{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19,"depth":0},{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22,"depth":0},{"id":240,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":239,"kind":"app","opcode":"and","args":[{"id":237,"kind":"bool","value":false},{"id":238,"kind":"bool","value":true}]}},{"id":244,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":243,"kind":"app","opcode":"or","args":[{"id":241,"kind":"bool","value":false},{"id":242,"kind":"bool","value":true}]}},{"id":248,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":247,"kind":"app","opcode":"implies","args":[{"id":245,"kind":"bool","value":false},{"id":246,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26,"depth":0},{"id":281,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":280,"kind":"app","opcode":"and","args":[{"id":277,"kind":"bool","value":false},{"id":278,"kind":"bool","value":true},{"id":279,"kind":"bool","value":false}]}},{"id":286,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":285,"kind":"app","opcode":"actionAll","args":[{"id":282,"kind":"bool","value":false},{"id":283,"kind":"bool","value":true},{"id":284,"kind":"bool","value":false}]}},{"id":291,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":290,"kind":"app","opcode":"or","args":[{"id":287,"kind":"bool","value":false},{"id":288,"kind":"bool","value":true},{"id":289,"kind":"bool","value":false}]}},{"id":296,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":295,"kind":"app","opcode":"actionAny","args":[{"id":292,"kind":"bool","value":false},{"id":293,"kind":"bool","value":true},{"id":294,"kind":"bool","value":false}]}},{"id":301,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":300,"kind":"app","opcode":"ite","args":[{"id":297,"kind":"bool","value":true},{"id":298,"kind":"int","value":1},{"id":299,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319,"depth":0},{"kind":"const","name":"MyFunFun","typeAnnotation":{"id":31,"kind":"fun","arg":{"id":29,"kind":"fun","arg":{"id":27,"kind":"int"},"res":{"id":28,"kind":"str"}},"res":{"id":30,"kind":"bool"}},"id":32,"depth":0},{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}}},{"id":340,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":339,"kind":"app","opcode":"in","args":[{"id":337,"kind":"int","value":1},{"id":338,"kind":"app","opcode":"Set","args":[]}]}},{"kind":"const","name":"MyOperator","typeAnnotation":{"id":36,"kind":"oper","args":[{"id":33,"kind":"int"},{"id":34,"kind":"str"}],"res":{"id":35,"kind":"bool"}},"id":37,"depth":0},{"id":405,"kind":"def","name":"one","qualifier":"val","expr":{"id":404,"kind":"app","opcode":"head","args":[{"id":403,"kind":"app","opcode":"List","args":[{"id":401,"kind":"int","value":1},{"id":402,"kind":"int","value":2}]}]}},{"id":410,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":409,"kind":"app","opcode":"Tup","args":[{"id":406,"kind":"int","value":1},{"id":407,"kind":"int","value":2},{"id":408,"kind":"int","value":3}]}},{"id":415,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":414,"kind":"app","opcode":"Tup","args":[{"id":411,"kind":"int","value":1},{"id":412,"kind":"int","value":2},{"id":413,"kind":"int","value":3}]}},{"id":419,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":418,"kind":"app","opcode":"Tup","args":[{"id":416,"kind":"int","value":4},{"id":417,"kind":"int","value":5}]}},{"kind":"const","name":"MyOperatorWithComma","typeAnnotation":{"id":41,"kind":"oper","args":[{"id":38,"kind":"int"},{"id":39,"kind":"str"}],"res":{"id":40,"kind":"bool"}},"id":42,"depth":0},{"id":424,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":423,"kind":"app","opcode":"List","args":[{"id":420,"kind":"int","value":1},{"id":421,"kind":"int","value":2},{"id":422,"kind":"int","value":3}]}},{"id":429,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"List","args":[{"id":425,"kind":"int","value":1},{"id":426,"kind":"int","value":2},{"id":427,"kind":"int","value":3}]}},{"id":436,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":435,"kind":"app","opcode":"nth","args":[{"id":433,"kind":"app","opcode":"List","args":[{"id":430,"kind":"int","value":2},{"id":431,"kind":"int","value":3},{"id":432,"kind":"int","value":4}]},{"id":434,"kind":"int","value":2}]}},{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]}},{"id":448,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Rec","args":[{"id":443,"kind":"str","value":"name"},{"id":444,"kind":"str","value":"igor"},{"id":445,"kind":"str","value":"year"},{"id":446,"kind":"int","value":1981}]}},{"id":461,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":460,"kind":"app","opcode":"Set","args":[{"id":457,"kind":"int","value":1},{"id":458,"kind":"int","value":2},{"id":459,"kind":"int","value":3}]}},{"kind":"const","name":"MyTuple","typeAnnotation":{"id":46,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":43,"kind":"int"}},{"fieldName":"1","fieldType":{"id":44,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":45,"kind":"str"}}],"other":{"kind":"empty"}}},"id":47,"depth":0},{"id":491,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":490,"kind":"app","opcode":"in","args":[{"id":488,"kind":"int","value":2},{"id":489,"kind":"app","opcode":"Set","args":[]}]}},{"id":495,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":494,"kind":"app","opcode":"subseteq","args":[{"id":492,"kind":"app","opcode":"Set","args":[]},{"id":493,"kind":"app","opcode":"Set","args":[]}]}},{"id":504,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":503,"kind":"app","opcode":"in","args":[{"id":497,"kind":"app","opcode":"Set","args":[{"id":496,"kind":"int","value":1}]},{"id":502,"kind":"app","opcode":"powerset","args":[{"id":501,"kind":"app","opcode":"Set","args":[{"id":498,"kind":"int","value":1},{"id":499,"kind":"int","value":2},{"id":500,"kind":"int","value":3}]}]}]}},{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}},"depth":0},{"id":518,"kind":"typedef","name":"UNINTERPRETED_TYPE","depth":0},{"kind":"const","name":"MyTupleWithComma","typeAnnotation":{"id":51,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":48,"kind":"int"}},{"fieldName":"1","fieldType":{"id":49,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":50,"kind":"str"}}],"other":{"kind":"empty"}}},"id":52,"depth":0},{"kind":"const","name":"MyRecord","typeAnnotation":{"id":56,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":53,"kind":"int"}},{"fieldName":"b","fieldType":{"id":54,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":55,"kind":"str"}}],"other":{"kind":"empty"}}},"id":57,"depth":0},{"kind":"const","name":"MyRecordWithComma","typeAnnotation":{"id":61,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":58,"kind":"int"}},{"fieldName":"b","fieldType":{"id":59,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":60,"kind":"str"}}],"other":{"kind":"empty"}}},"id":62,"depth":0},{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},{"kind":"var","name":"i","typeAnnotation":{"id":90,"kind":"int"},"id":91,"depth":0},{"kind":"var","name":"j","typeAnnotation":{"id":92,"kind":"bool"},"id":93,"depth":0},{"id":97,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":96,"kind":"app","opcode":"iadd","args":[{"id":94,"kind":"int","value":1},{"id":95,"kind":"int","value":2}]}},{"id":160,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":159,"kind":"app","opcode":"exists","args":[{"id":155,"kind":"name","name":"Bool"},{"id":158,"kind":"lambda","params":[{"id":156,"name":"x"}],"qualifier":"def","expr":{"id":157,"kind":"name","name":"x"}}]}},{"id":171,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":170,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":169,"kind":"set","elem":{"id":168,"kind":"const","name":"PROC"}}},{"id":182,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":181,"kind":"lambda","params":[{"id":176,"name":"x"},{"id":177,"name":"y"}],"qualifier":"puredef","expr":{"id":180,"kind":"app","opcode":"iadd","args":[{"id":178,"kind":"name","name":"x"},{"id":179,"kind":"name","name":"y"}]}}},{"id":188,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":187,"kind":"lambda","params":[{"id":183,"name":"factor"}],"qualifier":"def","expr":{"id":186,"kind":"app","opcode":"imul","args":[{"id":184,"kind":"name","name":"factor"},{"id":185,"kind":"name","name":"n"}]}}},{"id":194,"kind":"def","name":"A","qualifier":"action","expr":{"id":193,"kind":"lambda","params":[{"id":189,"name":"x"}],"qualifier":"action","expr":{"id":192,"kind":"app","opcode":"assign","args":[{"id":191,"kind":"name","name":"n"},{"id":190,"kind":"name","name":"x"}]}}},{"id":199,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":198,"kind":"lambda","params":[{"id":195,"name":"x"}],"qualifier":"puredef","expr":{"id":197,"kind":"app","opcode":"not","args":[{"id":196,"kind":"name","name":"x"}]}}},{"id":210,"kind":"def","name":"H","qualifier":"def","expr":{"id":209,"kind":"lambda","params":[{"id":200,"name":"x"},{"id":201,"name":"y"}],"qualifier":"def","expr":{"id":208,"kind":"app","opcode":"iadd","args":[{"id":206,"kind":"name","name":"x"},{"id":207,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":205,"kind":"oper","args":[{"id":202,"kind":"int"},{"id":203,"kind":"int"}],"res":{"id":204,"kind":"int"}}},{"id":217,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":216,"kind":"lambda","params":[{"id":211,"name":"x"}],"qualifier":"def","expr":{"id":215,"kind":"name","name":"x"}},"typeAnnotation":{"id":214,"kind":"oper","args":[{"id":212,"kind":"var","name":"a"}],"res":{"id":213,"kind":"var","name":"a"}}},{"id":223,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":222,"kind":"app","opcode":"assign","args":[{"id":221,"kind":"name","name":"k"},{"id":220,"kind":"int","value":3}]}},{"id":236,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":235,"kind":"lambda","params":[{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"}},{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"}}],"qualifier":"puredef","expr":{"id":234,"kind":"app","opcode":"ite","args":[{"id":231,"kind":"app","opcode":"ilt","args":[{"id":229,"kind":"name","name":"x"},{"id":230,"kind":"name","name":"y"}]},{"id":232,"kind":"name","name":"x"},{"id":233,"kind":"name","name":"y"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":224,"kind":"int"},{"id":226,"kind":"int"}],"res":{"id":228,"kind":"int"}}},{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}}},{"id":315,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":314,"kind":"lambda","params":[{"id":302,"name":"x"},{"id":303,"name":"y"}],"qualifier":"def","expr":{"id":313,"kind":"app","opcode":"ite","args":[{"id":306,"kind":"app","opcode":"ilt","args":[{"id":304,"kind":"name","name":"x"},{"id":305,"kind":"int","value":10}]},{"id":309,"kind":"app","opcode":"iadd","args":[{"id":307,"kind":"name","name":"y"},{"id":308,"kind":"int","value":5}]},{"id":312,"kind":"app","opcode":"imod","args":[{"id":310,"kind":"name","name":"y"},{"id":311,"kind":"int","value":5}]}]}}},{"id":323,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"get","args":[{"id":320,"kind":"name","name":"f1"},{"id":321,"kind":"str","value":"a"}]}},{"id":332,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":331,"kind":"app","opcode":"MyOper","args":[{"id":329,"kind":"str","value":"a"},{"id":330,"kind":"int","value":42}]}},{"id":336,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":335,"kind":"app","opcode":"MyOper","args":[{"id":333,"kind":"str","value":"a"},{"id":334,"kind":"int","value":42}]}},{"id":348,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":347,"kind":"app","opcode":"filter","args":[{"id":341,"kind":"name","name":"S"},{"id":346,"kind":"lambda","params":[{"id":342,"name":"x"}],"qualifier":"def","expr":{"id":345,"kind":"app","opcode":"igt","args":[{"id":343,"kind":"name","name":"x"},{"id":344,"kind":"int","value":10}]}}]}},{"id":386,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":385,"kind":"app","opcode":"filter","args":[{"id":381,"kind":"name","name":"S"},{"id":384,"kind":"lambda","params":[{"id":382,"name":"_"}],"qualifier":"def","expr":{"id":383,"kind":"bool","value":true}}]}},{"id":394,"kind":"def","name":"f","qualifier":"val","expr":{"id":393,"kind":"app","opcode":"mapBy","args":[{"id":387,"kind":"name","name":"S"},{"id":392,"kind":"lambda","params":[{"id":388,"name":"x"}],"qualifier":"def","expr":{"id":391,"kind":"app","opcode":"iadd","args":[{"id":389,"kind":"name","name":"x"},{"id":390,"kind":"int","value":1}]}}]}},{"id":400,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":399,"kind":"app","opcode":"exclude","args":[{"id":395,"kind":"name","name":"S"},{"id":398,"kind":"app","opcode":"Set","args":[{"id":396,"kind":"int","value":3},{"id":397,"kind":"int","value":4}]}]}},{"id":456,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":455,"kind":"app","opcode":"with","args":[{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"name","name":"test_record"},{"id":450,"kind":"str","value":"name"},{"id":449,"kind":"str","value":"quint"}]},{"id":452,"kind":"str","value":"year"},{"id":451,"kind":"int","value":2023}]}},{"id":472,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":471,"kind":"let","opdef":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]}},"expr":{"id":470,"kind":"app","opcode":"field","args":[{"id":468,"kind":"name","name":"my_rec"},{"id":469,"kind":"str","value":"a"}]}}},{"id":481,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":480,"kind":"let","opdef":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]}},"expr":{"id":479,"kind":"app","opcode":"item","args":[{"id":477,"kind":"name","name":"my_tup"},{"id":478,"kind":"int","value":2}]}}},{"id":487,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":486,"kind":"lambda","params":[{"id":482,"name":"s"}],"qualifier":"def","expr":{"id":485,"kind":"app","opcode":"eq","args":[{"id":483,"kind":"name","name":"s"},{"id":484,"kind":"app","opcode":"List","args":[]}]}}},{"id":508,"kind":"assume","name":"positive","assumption":{"id":507,"kind":"app","opcode":"igt","args":[{"id":505,"kind":"name","name":"N"},{"id":506,"kind":"int","value":0}]},"depth":0},{"id":512,"kind":"assume","name":"_","assumption":{"id":511,"kind":"app","opcode":"neq","args":[{"id":509,"kind":"name","name":"N"},{"id":510,"kind":"int","value":0}]}},{"id":513,"kind":"import","defName":"foo","protoName":"M1"},{"id":514,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":519,"kind":"const","name":"INT_SET"},"id":520,"depth":0},{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},{"id":75,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":74,"kind":"lambda","params":[{"id":71,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":73,"kind":"app","opcode":"variant","args":[{"id":70,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":72}]}}},{"id":81,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":80,"kind":"lambda","params":[{"id":77,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":79,"kind":"app","opcode":"variant","args":[{"id":76,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":78}]}}},{"id":87,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":86,"kind":"lambda","params":[{"id":83,"name":"__DogParam"}],"qualifier":"def","expr":{"id":85,"kind":"app","opcode":"variant","args":[{"id":82,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":84}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":88,"kind":"const","name":"MyUnionType"},"id":89,"depth":0},{"id":260,"kind":"def","name":"G","qualifier":"def","expr":{"id":259,"kind":"lambda","params":[{"id":253,"name":"x"}],"qualifier":"def","expr":{"id":258,"kind":"app","opcode":"and","args":[{"id":255,"kind":"app","opcode":"F","args":[{"id":254,"kind":"name","name":"x"}]},{"id":257,"kind":"app","opcode":"not","args":[{"id":256,"kind":"name","name":"x"}]}]}}},{"id":268,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":267,"kind":"lambda","params":[{"id":261,"name":"x"}],"qualifier":"def","expr":{"id":266,"kind":"app","opcode":"and","args":[{"id":263,"kind":"app","opcode":"F","args":[{"id":262,"kind":"name","name":"x"}]},{"id":265,"kind":"app","opcode":"not","args":[{"id":264,"kind":"name","name":"x"}]}]}}},{"id":276,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":275,"kind":"lambda","params":[{"id":269,"name":"x"}],"qualifier":"def","expr":{"id":274,"kind":"app","opcode":"or","args":[{"id":271,"kind":"app","opcode":"F","args":[{"id":270,"kind":"name","name":"x"}]},{"id":273,"kind":"app","opcode":"not","args":[{"id":272,"kind":"name","name":"x"}]}]}}},{"id":368,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":367,"kind":"app","opcode":"map","args":[{"id":351,"kind":"app","opcode":"tuples","args":[{"id":349,"kind":"name","name":"S"},{"id":350,"kind":"name","name":"MySet"}]},{"id":366,"kind":"lambda","params":[{"id":357,"name":"quintTupledLambdaParam357"}],"qualifier":"def","expr":{"id":362,"kind":"let","opdef":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]}},"expr":{"id":358,"kind":"let","opdef":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]}},"expr":{"id":356,"kind":"app","opcode":"iadd","args":[{"id":354,"kind":"name","name":"s"},{"id":355,"kind":"name","name":"mys"}]}}}}]}},{"id":380,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":379,"kind":"let","opdef":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]}},"expr":{"id":378,"kind":"app","opcode":"actionAll","args":[{"id":374,"kind":"app","opcode":"igt","args":[{"id":372,"kind":"name","name":"x"},{"id":373,"kind":"int","value":10}]},{"id":377,"kind":"app","opcode":"assign","args":[{"id":376,"kind":"name","name":"k"},{"id":375,"kind":"name","name":"x"}]}]}}}]}],"table":{"69":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"72":{"id":71,"name":"__CircleParam","kind":"param","depth":1},"78":{"id":77,"name":"__RectangleParam","kind":"param","depth":1},"84":{"id":83,"name":"__DogParam","kind":"param","depth":1},"88":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"157":{"id":156,"name":"x","kind":"param","depth":1},"168":{"id":167,"kind":"typedef","name":"PROC","depth":0},"178":{"id":176,"name":"x","kind":"param","depth":1},"179":{"id":177,"name":"y","kind":"param","depth":1},"184":{"id":183,"name":"factor","kind":"param","depth":1},"185":{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},"190":{"id":189,"name":"x","kind":"param","depth":1},"191":{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},"196":{"id":195,"name":"x","kind":"param","depth":1},"206":{"id":200,"name":"x","kind":"param","depth":1},"207":{"id":201,"name":"y","kind":"param","depth":1},"215":{"id":211,"name":"x","kind":"param","depth":1},"221":{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},"229":{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"},"kind":"param","depth":1},"230":{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"},"kind":"param","depth":1},"232":{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"},"kind":"param","depth":1},"233":{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"},"kind":"param","depth":1},"250":{"id":249,"name":"x","kind":"param","depth":1},"254":{"id":253,"name":"x","kind":"param","depth":1},"255":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"256":{"id":253,"name":"x","kind":"param","depth":1},"262":{"id":261,"name":"x","kind":"param","depth":1},"263":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"264":{"id":261,"name":"x","kind":"param","depth":1},"270":{"id":269,"name":"x","kind":"param","depth":1},"271":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"272":{"id":269,"name":"x","kind":"param","depth":1},"304":{"id":302,"name":"x","kind":"param","depth":1},"307":{"id":303,"name":"y","kind":"param","depth":1},"310":{"id":303,"name":"y","kind":"param","depth":1},"320":{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319,"depth":0},"331":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"335":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"341":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"343":{"id":342,"name":"x","kind":"param","depth":1},"349":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"350":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19,"depth":0},"354":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]},"depth":2},"355":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]},"depth":2},"360":{"id":357,"name":"quintTupledLambdaParam357","kind":"param","depth":1},"364":{"id":357,"name":"quintTupledLambdaParam357","kind":"param","depth":1},"369":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"372":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"375":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"376":{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},"381":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"387":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"389":{"id":388,"name":"x","kind":"param","depth":1},"395":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"453":{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]},"depth":0},"468":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]},"depth":1},"477":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]},"depth":1},"483":{"id":482,"name":"s","kind":"param","depth":1},"505":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"509":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"519":{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}},"depth":0},"521":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"522":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":521,"depth":0,"importedFrom":{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10,"depth":0},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8,"depth":0}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":524,"name":"withConsts","declarations":[{"id":101,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":100,"kind":"app","opcode":"isub","args":[{"id":98,"kind":"int","value":1},{"id":99,"kind":"int","value":2}]}},{"id":105,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":104,"kind":"app","opcode":"imul","args":[{"id":102,"kind":"int","value":2},{"id":103,"kind":"int","value":3}]}},{"id":109,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":108,"kind":"app","opcode":"idiv","args":[{"id":106,"kind":"int","value":2},{"id":107,"kind":"int","value":3}]}},{"id":113,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":112,"kind":"app","opcode":"imod","args":[{"id":110,"kind":"int","value":2},{"id":111,"kind":"int","value":3}]}},{"id":117,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":116,"kind":"app","opcode":"ipow","args":[{"id":114,"kind":"int","value":2},{"id":115,"kind":"int","value":3}]}},{"id":120,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":119,"kind":"app","opcode":"iuminus","args":[{"id":118,"kind":"int","value":100}]}},{"id":124,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":123,"kind":"app","opcode":"igt","args":[{"id":121,"kind":"int","value":2},{"id":122,"kind":"int","value":3}]}},{"id":128,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":127,"kind":"app","opcode":"igte","args":[{"id":125,"kind":"int","value":2},{"id":126,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},{"id":132,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":131,"kind":"app","opcode":"ilt","args":[{"id":129,"kind":"int","value":2},{"id":130,"kind":"int","value":3}]}},{"id":136,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":135,"kind":"app","opcode":"ilte","args":[{"id":133,"kind":"int","value":2},{"id":134,"kind":"int","value":3}]}},{"id":140,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":139,"kind":"app","opcode":"eq","args":[{"id":137,"kind":"int","value":2},{"id":138,"kind":"int","value":3}]}},{"id":144,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":143,"kind":"app","opcode":"neq","args":[{"id":141,"kind":"int","value":2},{"id":142,"kind":"int","value":3}]}},{"id":150,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":149,"kind":"app","opcode":"eq","args":[{"id":147,"kind":"app","opcode":"iadd","args":[{"id":145,"kind":"int","value":2},{"id":146,"kind":"int","value":2}]},{"id":148,"kind":"int","value":4}]}},{"id":154,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":153,"kind":"app","opcode":"in","args":[{"id":151,"kind":"int","value":1},{"id":152,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},{"id":166,"kind":"def","name":"withType","qualifier":"val","expr":{"id":165,"kind":"app","opcode":"Set","args":[{"id":163,"kind":"int","value":1},{"id":164,"kind":"int","value":2}]},"typeAnnotation":{"id":162,"kind":"set","elem":{"id":161,"kind":"int"}}},{"id":167,"kind":"typedef","name":"PROC","depth":0},{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},{"id":175,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":174,"kind":"int","value":42}},{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19,"depth":0},{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22,"depth":0},{"id":240,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":239,"kind":"app","opcode":"and","args":[{"id":237,"kind":"bool","value":false},{"id":238,"kind":"bool","value":true}]}},{"id":244,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":243,"kind":"app","opcode":"or","args":[{"id":241,"kind":"bool","value":false},{"id":242,"kind":"bool","value":true}]}},{"id":248,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":247,"kind":"app","opcode":"implies","args":[{"id":245,"kind":"bool","value":false},{"id":246,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26,"depth":0},{"id":281,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":280,"kind":"app","opcode":"and","args":[{"id":277,"kind":"bool","value":false},{"id":278,"kind":"bool","value":true},{"id":279,"kind":"bool","value":false}]}},{"id":286,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":285,"kind":"app","opcode":"actionAll","args":[{"id":282,"kind":"bool","value":false},{"id":283,"kind":"bool","value":true},{"id":284,"kind":"bool","value":false}]}},{"id":291,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":290,"kind":"app","opcode":"or","args":[{"id":287,"kind":"bool","value":false},{"id":288,"kind":"bool","value":true},{"id":289,"kind":"bool","value":false}]}},{"id":296,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":295,"kind":"app","opcode":"actionAny","args":[{"id":292,"kind":"bool","value":false},{"id":293,"kind":"bool","value":true},{"id":294,"kind":"bool","value":false}]}},{"id":301,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":300,"kind":"app","opcode":"ite","args":[{"id":297,"kind":"bool","value":true},{"id":298,"kind":"int","value":1},{"id":299,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319,"depth":0},{"kind":"const","name":"MyFunFun","typeAnnotation":{"id":31,"kind":"fun","arg":{"id":29,"kind":"fun","arg":{"id":27,"kind":"int"},"res":{"id":28,"kind":"str"}},"res":{"id":30,"kind":"bool"}},"id":32,"depth":0},{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}}},{"id":340,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":339,"kind":"app","opcode":"in","args":[{"id":337,"kind":"int","value":1},{"id":338,"kind":"app","opcode":"Set","args":[]}]}},{"kind":"const","name":"MyOperator","typeAnnotation":{"id":36,"kind":"oper","args":[{"id":33,"kind":"int"},{"id":34,"kind":"str"}],"res":{"id":35,"kind":"bool"}},"id":37,"depth":0},{"id":405,"kind":"def","name":"one","qualifier":"val","expr":{"id":404,"kind":"app","opcode":"head","args":[{"id":403,"kind":"app","opcode":"List","args":[{"id":401,"kind":"int","value":1},{"id":402,"kind":"int","value":2}]}]}},{"id":410,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":409,"kind":"app","opcode":"Tup","args":[{"id":406,"kind":"int","value":1},{"id":407,"kind":"int","value":2},{"id":408,"kind":"int","value":3}]}},{"id":415,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":414,"kind":"app","opcode":"Tup","args":[{"id":411,"kind":"int","value":1},{"id":412,"kind":"int","value":2},{"id":413,"kind":"int","value":3}]}},{"id":419,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":418,"kind":"app","opcode":"Tup","args":[{"id":416,"kind":"int","value":4},{"id":417,"kind":"int","value":5}]}},{"kind":"const","name":"MyOperatorWithComma","typeAnnotation":{"id":41,"kind":"oper","args":[{"id":38,"kind":"int"},{"id":39,"kind":"str"}],"res":{"id":40,"kind":"bool"}},"id":42,"depth":0},{"id":424,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":423,"kind":"app","opcode":"List","args":[{"id":420,"kind":"int","value":1},{"id":421,"kind":"int","value":2},{"id":422,"kind":"int","value":3}]}},{"id":429,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"List","args":[{"id":425,"kind":"int","value":1},{"id":426,"kind":"int","value":2},{"id":427,"kind":"int","value":3}]}},{"id":436,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":435,"kind":"app","opcode":"nth","args":[{"id":433,"kind":"app","opcode":"List","args":[{"id":430,"kind":"int","value":2},{"id":431,"kind":"int","value":3},{"id":432,"kind":"int","value":4}]},{"id":434,"kind":"int","value":2}]}},{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]}},{"id":448,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Rec","args":[{"id":443,"kind":"str","value":"name"},{"id":444,"kind":"str","value":"igor"},{"id":445,"kind":"str","value":"year"},{"id":446,"kind":"int","value":1981}]}},{"id":461,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":460,"kind":"app","opcode":"Set","args":[{"id":457,"kind":"int","value":1},{"id":458,"kind":"int","value":2},{"id":459,"kind":"int","value":3}]}},{"kind":"const","name":"MyTuple","typeAnnotation":{"id":46,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":43,"kind":"int"}},{"fieldName":"1","fieldType":{"id":44,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":45,"kind":"str"}}],"other":{"kind":"empty"}}},"id":47,"depth":0},{"id":491,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":490,"kind":"app","opcode":"in","args":[{"id":488,"kind":"int","value":2},{"id":489,"kind":"app","opcode":"Set","args":[]}]}},{"id":495,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":494,"kind":"app","opcode":"subseteq","args":[{"id":492,"kind":"app","opcode":"Set","args":[]},{"id":493,"kind":"app","opcode":"Set","args":[]}]}},{"id":504,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":503,"kind":"app","opcode":"in","args":[{"id":497,"kind":"app","opcode":"Set","args":[{"id":496,"kind":"int","value":1}]},{"id":502,"kind":"app","opcode":"powerset","args":[{"id":501,"kind":"app","opcode":"Set","args":[{"id":498,"kind":"int","value":1},{"id":499,"kind":"int","value":2},{"id":500,"kind":"int","value":3}]}]}]}},{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}},"depth":0},{"id":518,"kind":"typedef","name":"UNINTERPRETED_TYPE","depth":0},{"kind":"const","name":"MyTupleWithComma","typeAnnotation":{"id":51,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":48,"kind":"int"}},{"fieldName":"1","fieldType":{"id":49,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":50,"kind":"str"}}],"other":{"kind":"empty"}}},"id":52,"depth":0},{"kind":"const","name":"MyRecord","typeAnnotation":{"id":56,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":53,"kind":"int"}},{"fieldName":"b","fieldType":{"id":54,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":55,"kind":"str"}}],"other":{"kind":"empty"}}},"id":57,"depth":0},{"kind":"const","name":"MyRecordWithComma","typeAnnotation":{"id":61,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":58,"kind":"int"}},{"fieldName":"b","fieldType":{"id":59,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":60,"kind":"str"}}],"other":{"kind":"empty"}}},"id":62,"depth":0},{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},{"kind":"var","name":"i","typeAnnotation":{"id":90,"kind":"int"},"id":91,"depth":0},{"kind":"var","name":"j","typeAnnotation":{"id":92,"kind":"bool"},"id":93,"depth":0},{"id":97,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":96,"kind":"app","opcode":"iadd","args":[{"id":94,"kind":"int","value":1},{"id":95,"kind":"int","value":2}]}},{"id":160,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":159,"kind":"app","opcode":"exists","args":[{"id":155,"kind":"name","name":"Bool"},{"id":158,"kind":"lambda","params":[{"id":156,"name":"x"}],"qualifier":"def","expr":{"id":157,"kind":"name","name":"x"}}]}},{"id":171,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":170,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":169,"kind":"set","elem":{"id":168,"kind":"const","name":"PROC"}}},{"id":182,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":181,"kind":"lambda","params":[{"id":176,"name":"x"},{"id":177,"name":"y"}],"qualifier":"puredef","expr":{"id":180,"kind":"app","opcode":"iadd","args":[{"id":178,"kind":"name","name":"x"},{"id":179,"kind":"name","name":"y"}]}}},{"id":188,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":187,"kind":"lambda","params":[{"id":183,"name":"factor"}],"qualifier":"def","expr":{"id":186,"kind":"app","opcode":"imul","args":[{"id":184,"kind":"name","name":"factor"},{"id":185,"kind":"name","name":"n"}]}}},{"id":194,"kind":"def","name":"A","qualifier":"action","expr":{"id":193,"kind":"lambda","params":[{"id":189,"name":"x"}],"qualifier":"action","expr":{"id":192,"kind":"app","opcode":"assign","args":[{"id":191,"kind":"name","name":"n"},{"id":190,"kind":"name","name":"x"}]}}},{"id":199,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":198,"kind":"lambda","params":[{"id":195,"name":"x"}],"qualifier":"puredef","expr":{"id":197,"kind":"app","opcode":"not","args":[{"id":196,"kind":"name","name":"x"}]}}},{"id":210,"kind":"def","name":"H","qualifier":"def","expr":{"id":209,"kind":"lambda","params":[{"id":200,"name":"x"},{"id":201,"name":"y"}],"qualifier":"def","expr":{"id":208,"kind":"app","opcode":"iadd","args":[{"id":206,"kind":"name","name":"x"},{"id":207,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":205,"kind":"oper","args":[{"id":202,"kind":"int"},{"id":203,"kind":"int"}],"res":{"id":204,"kind":"int"}}},{"id":217,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":216,"kind":"lambda","params":[{"id":211,"name":"x"}],"qualifier":"def","expr":{"id":215,"kind":"name","name":"x"}},"typeAnnotation":{"id":214,"kind":"oper","args":[{"id":212,"kind":"var","name":"a"}],"res":{"id":213,"kind":"var","name":"a"}}},{"id":223,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":222,"kind":"app","opcode":"assign","args":[{"id":221,"kind":"name","name":"k"},{"id":220,"kind":"int","value":3}]}},{"id":236,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":235,"kind":"lambda","params":[{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"}},{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"}}],"qualifier":"puredef","expr":{"id":234,"kind":"app","opcode":"ite","args":[{"id":231,"kind":"app","opcode":"ilt","args":[{"id":229,"kind":"name","name":"x"},{"id":230,"kind":"name","name":"y"}]},{"id":232,"kind":"name","name":"x"},{"id":233,"kind":"name","name":"y"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":224,"kind":"int"},{"id":226,"kind":"int"}],"res":{"id":228,"kind":"int"}}},{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}}},{"id":315,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":314,"kind":"lambda","params":[{"id":302,"name":"x"},{"id":303,"name":"y"}],"qualifier":"def","expr":{"id":313,"kind":"app","opcode":"ite","args":[{"id":306,"kind":"app","opcode":"ilt","args":[{"id":304,"kind":"name","name":"x"},{"id":305,"kind":"int","value":10}]},{"id":309,"kind":"app","opcode":"iadd","args":[{"id":307,"kind":"name","name":"y"},{"id":308,"kind":"int","value":5}]},{"id":312,"kind":"app","opcode":"imod","args":[{"id":310,"kind":"name","name":"y"},{"id":311,"kind":"int","value":5}]}]}}},{"id":323,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"get","args":[{"id":320,"kind":"name","name":"f1"},{"id":321,"kind":"str","value":"a"}]}},{"id":332,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":331,"kind":"app","opcode":"MyOper","args":[{"id":329,"kind":"str","value":"a"},{"id":330,"kind":"int","value":42}]}},{"id":336,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":335,"kind":"app","opcode":"MyOper","args":[{"id":333,"kind":"str","value":"a"},{"id":334,"kind":"int","value":42}]}},{"id":348,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":347,"kind":"app","opcode":"filter","args":[{"id":341,"kind":"name","name":"S"},{"id":346,"kind":"lambda","params":[{"id":342,"name":"x"}],"qualifier":"def","expr":{"id":345,"kind":"app","opcode":"igt","args":[{"id":343,"kind":"name","name":"x"},{"id":344,"kind":"int","value":10}]}}]}},{"id":386,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":385,"kind":"app","opcode":"filter","args":[{"id":381,"kind":"name","name":"S"},{"id":384,"kind":"lambda","params":[{"id":382,"name":"_"}],"qualifier":"def","expr":{"id":383,"kind":"bool","value":true}}]}},{"id":394,"kind":"def","name":"f","qualifier":"val","expr":{"id":393,"kind":"app","opcode":"mapBy","args":[{"id":387,"kind":"name","name":"S"},{"id":392,"kind":"lambda","params":[{"id":388,"name":"x"}],"qualifier":"def","expr":{"id":391,"kind":"app","opcode":"iadd","args":[{"id":389,"kind":"name","name":"x"},{"id":390,"kind":"int","value":1}]}}]}},{"id":400,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":399,"kind":"app","opcode":"exclude","args":[{"id":395,"kind":"name","name":"S"},{"id":398,"kind":"app","opcode":"Set","args":[{"id":396,"kind":"int","value":3},{"id":397,"kind":"int","value":4}]}]}},{"id":456,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":455,"kind":"app","opcode":"with","args":[{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"name","name":"test_record"},{"id":450,"kind":"str","value":"name"},{"id":449,"kind":"str","value":"quint"}]},{"id":452,"kind":"str","value":"year"},{"id":451,"kind":"int","value":2023}]}},{"id":472,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":471,"kind":"let","opdef":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]}},"expr":{"id":470,"kind":"app","opcode":"field","args":[{"id":468,"kind":"name","name":"my_rec"},{"id":469,"kind":"str","value":"a"}]}}},{"id":481,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":480,"kind":"let","opdef":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]}},"expr":{"id":479,"kind":"app","opcode":"item","args":[{"id":477,"kind":"name","name":"my_tup"},{"id":478,"kind":"int","value":2}]}}},{"id":487,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":486,"kind":"lambda","params":[{"id":482,"name":"s"}],"qualifier":"def","expr":{"id":485,"kind":"app","opcode":"eq","args":[{"id":483,"kind":"name","name":"s"},{"id":484,"kind":"app","opcode":"List","args":[]}]}}},{"id":508,"kind":"assume","name":"positive","assumption":{"id":507,"kind":"app","opcode":"igt","args":[{"id":505,"kind":"name","name":"N"},{"id":506,"kind":"int","value":0}]},"depth":0},{"id":512,"kind":"assume","name":"_","assumption":{"id":511,"kind":"app","opcode":"neq","args":[{"id":509,"kind":"name","name":"N"},{"id":510,"kind":"int","value":0}]}},{"id":513,"kind":"import","defName":"foo","protoName":"M1"},{"id":514,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":519,"kind":"const","name":"INT_SET"},"id":520,"depth":0},{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},{"id":75,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":74,"kind":"lambda","params":[{"id":71,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":73,"kind":"app","opcode":"variant","args":[{"id":70,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":72}]}}},{"id":81,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":80,"kind":"lambda","params":[{"id":77,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":79,"kind":"app","opcode":"variant","args":[{"id":76,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":78}]}}},{"id":87,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":86,"kind":"lambda","params":[{"id":83,"name":"__DogParam"}],"qualifier":"def","expr":{"id":85,"kind":"app","opcode":"variant","args":[{"id":82,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":84}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":88,"kind":"const","name":"MyUnionType"},"id":89,"depth":0},{"id":260,"kind":"def","name":"G","qualifier":"def","expr":{"id":259,"kind":"lambda","params":[{"id":253,"name":"x"}],"qualifier":"def","expr":{"id":258,"kind":"app","opcode":"and","args":[{"id":255,"kind":"app","opcode":"F","args":[{"id":254,"kind":"name","name":"x"}]},{"id":257,"kind":"app","opcode":"not","args":[{"id":256,"kind":"name","name":"x"}]}]}}},{"id":268,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":267,"kind":"lambda","params":[{"id":261,"name":"x"}],"qualifier":"def","expr":{"id":266,"kind":"app","opcode":"and","args":[{"id":263,"kind":"app","opcode":"F","args":[{"id":262,"kind":"name","name":"x"}]},{"id":265,"kind":"app","opcode":"not","args":[{"id":264,"kind":"name","name":"x"}]}]}}},{"id":276,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":275,"kind":"lambda","params":[{"id":269,"name":"x"}],"qualifier":"def","expr":{"id":274,"kind":"app","opcode":"or","args":[{"id":271,"kind":"app","opcode":"F","args":[{"id":270,"kind":"name","name":"x"}]},{"id":273,"kind":"app","opcode":"not","args":[{"id":272,"kind":"name","name":"x"}]}]}}},{"id":368,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":367,"kind":"app","opcode":"map","args":[{"id":351,"kind":"app","opcode":"tuples","args":[{"id":349,"kind":"name","name":"S"},{"id":350,"kind":"name","name":"MySet"}]},{"id":366,"kind":"lambda","params":[{"id":357,"name":"quintTupledLambdaParam357"}],"qualifier":"def","expr":{"id":362,"kind":"let","opdef":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]}},"expr":{"id":358,"kind":"let","opdef":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]}},"expr":{"id":356,"kind":"app","opcode":"iadd","args":[{"id":354,"kind":"name","name":"s"},{"id":355,"kind":"name","name":"mys"}]}}}}]}},{"id":380,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":379,"kind":"let","opdef":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]}},"expr":{"id":378,"kind":"app","opcode":"actionAll","args":[{"id":374,"kind":"app","opcode":"igt","args":[{"id":372,"kind":"name","name":"x"},{"id":373,"kind":"int","value":10}]},{"id":377,"kind":"app","opcode":"assign","args":[{"id":376,"kind":"name","name":"k"},{"id":375,"kind":"name","name":"x"}]}]}}}]}],"table":{"2":{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4},"depth":0},"5":{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4},"depth":0},"69":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"72":{"id":71,"name":"__CircleParam","kind":"param","depth":1},"75":{"id":75,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":74,"kind":"lambda","params":[{"id":71,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":73,"kind":"app","opcode":"variant","args":[{"id":70,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":72}]}},"depth":0},"78":{"id":77,"name":"__RectangleParam","kind":"param","depth":1},"81":{"id":81,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":80,"kind":"lambda","params":[{"id":77,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":79,"kind":"app","opcode":"variant","args":[{"id":76,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":78}]}},"depth":0},"84":{"id":83,"name":"__DogParam","kind":"param","depth":1},"87":{"id":87,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":86,"kind":"lambda","params":[{"id":83,"name":"__DogParam"}],"qualifier":"def","expr":{"id":85,"kind":"app","opcode":"variant","args":[{"id":82,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":84}]}},"depth":0},"88":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"97":{"id":97,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":96,"kind":"app","opcode":"iadd","args":[{"id":94,"kind":"int","value":1},{"id":95,"kind":"int","value":2}]},"depth":0},"101":{"id":101,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":100,"kind":"app","opcode":"isub","args":[{"id":98,"kind":"int","value":1},{"id":99,"kind":"int","value":2}]},"depth":0},"105":{"id":105,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":104,"kind":"app","opcode":"imul","args":[{"id":102,"kind":"int","value":2},{"id":103,"kind":"int","value":3}]},"depth":0},"109":{"id":109,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":108,"kind":"app","opcode":"idiv","args":[{"id":106,"kind":"int","value":2},{"id":107,"kind":"int","value":3}]},"depth":0},"113":{"id":113,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":112,"kind":"app","opcode":"imod","args":[{"id":110,"kind":"int","value":2},{"id":111,"kind":"int","value":3}]},"depth":0},"117":{"id":117,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":116,"kind":"app","opcode":"ipow","args":[{"id":114,"kind":"int","value":2},{"id":115,"kind":"int","value":3}]},"depth":0},"120":{"id":120,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":119,"kind":"app","opcode":"iuminus","args":[{"id":118,"kind":"int","value":100}]},"depth":0},"124":{"id":124,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":123,"kind":"app","opcode":"igt","args":[{"id":121,"kind":"int","value":2},{"id":122,"kind":"int","value":3}]},"depth":0},"128":{"id":128,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":127,"kind":"app","opcode":"igte","args":[{"id":125,"kind":"int","value":2},{"id":126,"kind":"int","value":3}]},"depth":0},"132":{"id":132,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":131,"kind":"app","opcode":"ilt","args":[{"id":129,"kind":"int","value":2},{"id":130,"kind":"int","value":3}]},"depth":0},"136":{"id":136,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":135,"kind":"app","opcode":"ilte","args":[{"id":133,"kind":"int","value":2},{"id":134,"kind":"int","value":3}]},"depth":0},"140":{"id":140,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":139,"kind":"app","opcode":"eq","args":[{"id":137,"kind":"int","value":2},{"id":138,"kind":"int","value":3}]},"depth":0},"144":{"id":144,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":143,"kind":"app","opcode":"neq","args":[{"id":141,"kind":"int","value":2},{"id":142,"kind":"int","value":3}]},"depth":0},"150":{"id":150,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":149,"kind":"app","opcode":"eq","args":[{"id":147,"kind":"app","opcode":"iadd","args":[{"id":145,"kind":"int","value":2},{"id":146,"kind":"int","value":2}]},{"id":148,"kind":"int","value":4}]},"depth":0},"154":{"id":154,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":153,"kind":"app","opcode":"in","args":[{"id":151,"kind":"int","value":1},{"id":152,"kind":"name","name":"Nat"}]},"depth":0},"157":{"id":156,"name":"x","kind":"param","depth":1},"160":{"id":160,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":159,"kind":"app","opcode":"exists","args":[{"id":155,"kind":"name","name":"Bool"},{"id":158,"kind":"lambda","params":[{"id":156,"name":"x"}],"qualifier":"def","expr":{"id":157,"kind":"name","name":"x"}}]},"depth":0},"166":{"id":166,"kind":"def","name":"withType","qualifier":"val","expr":{"id":165,"kind":"app","opcode":"Set","args":[{"id":163,"kind":"int","value":1},{"id":164,"kind":"int","value":2}]},"typeAnnotation":{"id":162,"kind":"set","elem":{"id":161,"kind":"int"}},"depth":0},"168":{"id":167,"kind":"typedef","name":"PROC","depth":0},"171":{"id":171,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":170,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":169,"kind":"set","elem":{"id":168,"kind":"const","name":"PROC"}},"depth":0},"175":{"id":175,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":174,"kind":"int","value":42},"depth":0},"178":{"id":176,"name":"x","kind":"param","depth":1},"179":{"id":177,"name":"y","kind":"param","depth":1},"182":{"id":182,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":181,"kind":"lambda","params":[{"id":176,"name":"x"},{"id":177,"name":"y"}],"qualifier":"puredef","expr":{"id":180,"kind":"app","opcode":"iadd","args":[{"id":178,"kind":"name","name":"x"},{"id":179,"kind":"name","name":"y"}]}},"depth":0},"184":{"id":183,"name":"factor","kind":"param","depth":1},"185":{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},"188":{"id":188,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":187,"kind":"lambda","params":[{"id":183,"name":"factor"}],"qualifier":"def","expr":{"id":186,"kind":"app","opcode":"imul","args":[{"id":184,"kind":"name","name":"factor"},{"id":185,"kind":"name","name":"n"}]}},"depth":0},"190":{"id":189,"name":"x","kind":"param","depth":1},"191":{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},"194":{"id":194,"kind":"def","name":"A","qualifier":"action","expr":{"id":193,"kind":"lambda","params":[{"id":189,"name":"x"}],"qualifier":"action","expr":{"id":192,"kind":"app","opcode":"assign","args":[{"id":191,"kind":"name","name":"n"},{"id":190,"kind":"name","name":"x"}]}},"depth":0},"196":{"id":195,"name":"x","kind":"param","depth":1},"199":{"id":199,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":198,"kind":"lambda","params":[{"id":195,"name":"x"}],"qualifier":"puredef","expr":{"id":197,"kind":"app","opcode":"not","args":[{"id":196,"kind":"name","name":"x"}]}},"depth":0},"206":{"id":200,"name":"x","kind":"param","depth":1},"207":{"id":201,"name":"y","kind":"param","depth":1},"210":{"id":210,"kind":"def","name":"H","qualifier":"def","expr":{"id":209,"kind":"lambda","params":[{"id":200,"name":"x"},{"id":201,"name":"y"}],"qualifier":"def","expr":{"id":208,"kind":"app","opcode":"iadd","args":[{"id":206,"kind":"name","name":"x"},{"id":207,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":205,"kind":"oper","args":[{"id":202,"kind":"int"},{"id":203,"kind":"int"}],"res":{"id":204,"kind":"int"}},"depth":0},"215":{"id":211,"name":"x","kind":"param","depth":1},"217":{"id":217,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":216,"kind":"lambda","params":[{"id":211,"name":"x"}],"qualifier":"def","expr":{"id":215,"kind":"name","name":"x"}},"typeAnnotation":{"id":214,"kind":"oper","args":[{"id":212,"kind":"var","name":"a"}],"res":{"id":213,"kind":"var","name":"a"}},"depth":0},"221":{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},"223":{"id":223,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":222,"kind":"app","opcode":"assign","args":[{"id":221,"kind":"name","name":"k"},{"id":220,"kind":"int","value":3}]},"depth":0},"229":{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"},"kind":"param","depth":1},"230":{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"},"kind":"param","depth":1},"232":{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"},"kind":"param","depth":1},"233":{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"},"kind":"param","depth":1},"236":{"id":236,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":235,"kind":"lambda","params":[{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"}},{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"}}],"qualifier":"puredef","expr":{"id":234,"kind":"app","opcode":"ite","args":[{"id":231,"kind":"app","opcode":"ilt","args":[{"id":229,"kind":"name","name":"x"},{"id":230,"kind":"name","name":"y"}]},{"id":232,"kind":"name","name":"x"},{"id":233,"kind":"name","name":"y"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":224,"kind":"int"},{"id":226,"kind":"int"}],"res":{"id":228,"kind":"int"}},"depth":0},"240":{"id":240,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":239,"kind":"app","opcode":"and","args":[{"id":237,"kind":"bool","value":false},{"id":238,"kind":"bool","value":true}]},"depth":0},"244":{"id":244,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":243,"kind":"app","opcode":"or","args":[{"id":241,"kind":"bool","value":false},{"id":242,"kind":"bool","value":true}]},"depth":0},"248":{"id":248,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":247,"kind":"app","opcode":"implies","args":[{"id":245,"kind":"bool","value":false},{"id":246,"kind":"bool","value":true}]},"depth":0},"250":{"id":249,"name":"x","kind":"param","depth":1},"252":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"254":{"id":253,"name":"x","kind":"param","depth":1},"255":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"256":{"id":253,"name":"x","kind":"param","depth":1},"260":{"id":260,"kind":"def","name":"G","qualifier":"def","expr":{"id":259,"kind":"lambda","params":[{"id":253,"name":"x"}],"qualifier":"def","expr":{"id":258,"kind":"app","opcode":"and","args":[{"id":255,"kind":"app","opcode":"F","args":[{"id":254,"kind":"name","name":"x"}]},{"id":257,"kind":"app","opcode":"not","args":[{"id":256,"kind":"name","name":"x"}]}]}},"depth":0},"262":{"id":261,"name":"x","kind":"param","depth":1},"263":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"264":{"id":261,"name":"x","kind":"param","depth":1},"268":{"id":268,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":267,"kind":"lambda","params":[{"id":261,"name":"x"}],"qualifier":"def","expr":{"id":266,"kind":"app","opcode":"and","args":[{"id":263,"kind":"app","opcode":"F","args":[{"id":262,"kind":"name","name":"x"}]},{"id":265,"kind":"app","opcode":"not","args":[{"id":264,"kind":"name","name":"x"}]}]}},"depth":0},"270":{"id":269,"name":"x","kind":"param","depth":1},"271":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"272":{"id":269,"name":"x","kind":"param","depth":1},"276":{"id":276,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":275,"kind":"lambda","params":[{"id":269,"name":"x"}],"qualifier":"def","expr":{"id":274,"kind":"app","opcode":"or","args":[{"id":271,"kind":"app","opcode":"F","args":[{"id":270,"kind":"name","name":"x"}]},{"id":273,"kind":"app","opcode":"not","args":[{"id":272,"kind":"name","name":"x"}]}]}},"depth":0},"281":{"id":281,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":280,"kind":"app","opcode":"and","args":[{"id":277,"kind":"bool","value":false},{"id":278,"kind":"bool","value":true},{"id":279,"kind":"bool","value":false}]},"depth":0},"286":{"id":286,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":285,"kind":"app","opcode":"actionAll","args":[{"id":282,"kind":"bool","value":false},{"id":283,"kind":"bool","value":true},{"id":284,"kind":"bool","value":false}]},"depth":0},"291":{"id":291,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":290,"kind":"app","opcode":"or","args":[{"id":287,"kind":"bool","value":false},{"id":288,"kind":"bool","value":true},{"id":289,"kind":"bool","value":false}]},"depth":0},"296":{"id":296,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":295,"kind":"app","opcode":"actionAny","args":[{"id":292,"kind":"bool","value":false},{"id":293,"kind":"bool","value":true},{"id":294,"kind":"bool","value":false}]},"depth":0},"301":{"id":301,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":300,"kind":"app","opcode":"ite","args":[{"id":297,"kind":"bool","value":true},{"id":298,"kind":"int","value":1},{"id":299,"kind":"int","value":0}]},"depth":0},"304":{"id":302,"name":"x","kind":"param","depth":1},"307":{"id":303,"name":"y","kind":"param","depth":1},"310":{"id":303,"name":"y","kind":"param","depth":1},"315":{"id":315,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":314,"kind":"lambda","params":[{"id":302,"name":"x"},{"id":303,"name":"y"}],"qualifier":"def","expr":{"id":313,"kind":"app","opcode":"ite","args":[{"id":306,"kind":"app","opcode":"ilt","args":[{"id":304,"kind":"name","name":"x"},{"id":305,"kind":"int","value":10}]},{"id":309,"kind":"app","opcode":"iadd","args":[{"id":307,"kind":"name","name":"y"},{"id":308,"kind":"int","value":5}]},{"id":312,"kind":"app","opcode":"imod","args":[{"id":310,"kind":"name","name":"y"},{"id":311,"kind":"int","value":5}]}]}},"depth":0},"320":{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319,"depth":0},"323":{"id":323,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"get","args":[{"id":320,"kind":"name","name":"f1"},{"id":321,"kind":"str","value":"a"}]},"depth":0},"328":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"331":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"332":{"id":332,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":331,"kind":"app","opcode":"MyOper","args":[{"id":329,"kind":"str","value":"a"},{"id":330,"kind":"int","value":42}]},"depth":0},"335":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"336":{"id":336,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":335,"kind":"app","opcode":"MyOper","args":[{"id":333,"kind":"str","value":"a"},{"id":334,"kind":"int","value":42}]},"depth":0},"340":{"id":340,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":339,"kind":"app","opcode":"in","args":[{"id":337,"kind":"int","value":1},{"id":338,"kind":"app","opcode":"Set","args":[]}]},"depth":0},"341":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"343":{"id":342,"name":"x","kind":"param","depth":1},"348":{"id":348,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":347,"kind":"app","opcode":"filter","args":[{"id":341,"kind":"name","name":"S"},{"id":346,"kind":"lambda","params":[{"id":342,"name":"x"}],"qualifier":"def","expr":{"id":345,"kind":"app","opcode":"igt","args":[{"id":343,"kind":"name","name":"x"},{"id":344,"kind":"int","value":10}]}}]},"depth":0},"349":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"350":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19,"depth":0},"352":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]},"depth":2},"353":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]},"depth":2},"354":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]},"depth":2},"355":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]},"depth":2},"360":{"id":357,"name":"quintTupledLambdaParam357","kind":"param","depth":1},"364":{"id":357,"name":"quintTupledLambdaParam357","kind":"param","depth":1},"368":{"id":368,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":367,"kind":"app","opcode":"map","args":[{"id":351,"kind":"app","opcode":"tuples","args":[{"id":349,"kind":"name","name":"S"},{"id":350,"kind":"name","name":"MySet"}]},{"id":366,"kind":"lambda","params":[{"id":357,"name":"quintTupledLambdaParam357"}],"qualifier":"def","expr":{"id":362,"kind":"let","opdef":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]}},"expr":{"id":358,"kind":"let","opdef":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]}},"expr":{"id":356,"kind":"app","opcode":"iadd","args":[{"id":354,"kind":"name","name":"s"},{"id":355,"kind":"name","name":"mys"}]}}}}]},"depth":0},"369":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"371":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"372":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"375":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"376":{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},"380":{"id":380,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":379,"kind":"let","opdef":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]}},"expr":{"id":378,"kind":"app","opcode":"actionAll","args":[{"id":374,"kind":"app","opcode":"igt","args":[{"id":372,"kind":"name","name":"x"},{"id":373,"kind":"int","value":10}]},{"id":377,"kind":"app","opcode":"assign","args":[{"id":376,"kind":"name","name":"k"},{"id":375,"kind":"name","name":"x"}]}]}},"depth":0},"381":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"386":{"id":386,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":385,"kind":"app","opcode":"filter","args":[{"id":381,"kind":"name","name":"S"},{"id":384,"kind":"lambda","params":[{"id":382,"name":"_"}],"qualifier":"def","expr":{"id":383,"kind":"bool","value":true}}]},"depth":0},"387":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"389":{"id":388,"name":"x","kind":"param","depth":1},"394":{"id":394,"kind":"def","name":"f","qualifier":"val","expr":{"id":393,"kind":"app","opcode":"mapBy","args":[{"id":387,"kind":"name","name":"S"},{"id":392,"kind":"lambda","params":[{"id":388,"name":"x"}],"qualifier":"def","expr":{"id":391,"kind":"app","opcode":"iadd","args":[{"id":389,"kind":"name","name":"x"},{"id":390,"kind":"int","value":1}]}}]},"depth":0},"395":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"400":{"id":400,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":399,"kind":"app","opcode":"exclude","args":[{"id":395,"kind":"name","name":"S"},{"id":398,"kind":"app","opcode":"Set","args":[{"id":396,"kind":"int","value":3},{"id":397,"kind":"int","value":4}]}]},"depth":0},"405":{"id":405,"kind":"def","name":"one","qualifier":"val","expr":{"id":404,"kind":"app","opcode":"head","args":[{"id":403,"kind":"app","opcode":"List","args":[{"id":401,"kind":"int","value":1},{"id":402,"kind":"int","value":2}]}]},"depth":0},"410":{"id":410,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":409,"kind":"app","opcode":"Tup","args":[{"id":406,"kind":"int","value":1},{"id":407,"kind":"int","value":2},{"id":408,"kind":"int","value":3}]},"depth":0},"415":{"id":415,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":414,"kind":"app","opcode":"Tup","args":[{"id":411,"kind":"int","value":1},{"id":412,"kind":"int","value":2},{"id":413,"kind":"int","value":3}]},"depth":0},"419":{"id":419,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":418,"kind":"app","opcode":"Tup","args":[{"id":416,"kind":"int","value":4},{"id":417,"kind":"int","value":5}]},"depth":0},"424":{"id":424,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":423,"kind":"app","opcode":"List","args":[{"id":420,"kind":"int","value":1},{"id":421,"kind":"int","value":2},{"id":422,"kind":"int","value":3}]},"depth":0},"429":{"id":429,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"List","args":[{"id":425,"kind":"int","value":1},{"id":426,"kind":"int","value":2},{"id":427,"kind":"int","value":3}]},"depth":0},"436":{"id":436,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":435,"kind":"app","opcode":"nth","args":[{"id":433,"kind":"app","opcode":"List","args":[{"id":430,"kind":"int","value":2},{"id":431,"kind":"int","value":3},{"id":432,"kind":"int","value":4}]},{"id":434,"kind":"int","value":2}]},"depth":0},"442":{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]},"depth":0},"448":{"id":448,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Rec","args":[{"id":443,"kind":"str","value":"name"},{"id":444,"kind":"str","value":"igor"},{"id":445,"kind":"str","value":"year"},{"id":446,"kind":"int","value":1981}]},"depth":0},"453":{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]},"depth":0},"456":{"id":456,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":455,"kind":"app","opcode":"with","args":[{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"name","name":"test_record"},{"id":450,"kind":"str","value":"name"},{"id":449,"kind":"str","value":"quint"}]},{"id":452,"kind":"str","value":"year"},{"id":451,"kind":"int","value":2023}]},"depth":0},"461":{"id":461,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":460,"kind":"app","opcode":"Set","args":[{"id":457,"kind":"int","value":1},{"id":458,"kind":"int","value":2},{"id":459,"kind":"int","value":3}]},"depth":0},"467":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]},"depth":1},"468":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]},"depth":1},"472":{"id":472,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":471,"kind":"let","opdef":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]}},"expr":{"id":470,"kind":"app","opcode":"field","args":[{"id":468,"kind":"name","name":"my_rec"},{"id":469,"kind":"str","value":"a"}]}},"depth":0},"476":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]},"depth":1},"477":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]},"depth":1},"481":{"id":481,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":480,"kind":"let","opdef":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]}},"expr":{"id":479,"kind":"app","opcode":"item","args":[{"id":477,"kind":"name","name":"my_tup"},{"id":478,"kind":"int","value":2}]}},"depth":0},"483":{"id":482,"name":"s","kind":"param","depth":1},"487":{"id":487,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":486,"kind":"lambda","params":[{"id":482,"name":"s"}],"qualifier":"def","expr":{"id":485,"kind":"app","opcode":"eq","args":[{"id":483,"kind":"name","name":"s"},{"id":484,"kind":"app","opcode":"List","args":[]}]}},"depth":0},"491":{"id":491,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":490,"kind":"app","opcode":"in","args":[{"id":488,"kind":"int","value":2},{"id":489,"kind":"app","opcode":"Set","args":[]}]},"depth":0},"495":{"id":495,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":494,"kind":"app","opcode":"subseteq","args":[{"id":492,"kind":"app","opcode":"Set","args":[]},{"id":493,"kind":"app","opcode":"Set","args":[]}]},"depth":0},"504":{"id":504,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":503,"kind":"app","opcode":"in","args":[{"id":497,"kind":"app","opcode":"Set","args":[{"id":496,"kind":"int","value":1}]},{"id":502,"kind":"app","opcode":"powerset","args":[{"id":501,"kind":"app","opcode":"Set","args":[{"id":498,"kind":"int","value":1},{"id":499,"kind":"int","value":2},{"id":500,"kind":"int","value":3}]}]}]},"depth":0},"505":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"509":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"519":{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}},"depth":0},"521":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"522":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":521,"depth":0,"importedFrom":{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/TrivialTypeError.json b/quint/testFixture/TrivialTypeError.json index 38134d759..b65970887 100644 --- a/quint/testFixture/TrivialTypeError.json +++ b/quint/testFixture/TrivialTypeError.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":4,"name":"Foo","declarations":[{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"str","value":"not an int"},"typeAnnotation":{"id":1,"kind":"int"}}]}],"table":{},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":4,"name":"Foo","declarations":[{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"str","value":"not an int"},"typeAnnotation":{"id":1,"kind":"int"}}]}],"table":{"3":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"str","value":"not an int"},"typeAnnotation":{"id":1,"kind":"int"},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_0099unorderedDefs.json b/quint/testFixture/_0099unorderedDefs.json index 1749b6095..4fe24b7f7 100644 --- a/quint/testFixture/_0099unorderedDefs.json +++ b/quint/testFixture/_0099unorderedDefs.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":14,"name":"unorderedDefs","declarations":[{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}}},{"id":6,"kind":"def","name":"double","qualifier":"puredef","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":4,"kind":"app","opcode":"plus","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"name","name":"x"}]}}}]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1},"3":{"id":1,"name":"x","kind":"param","depth":1},"4":{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}},"depth":0},"9":{"id":7,"name":"x","kind":"param","depth":1},"10":{"id":8,"name":"y","kind":"param","depth":1}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":14,"name":"unorderedDefs","declarations":[{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}}},{"id":6,"kind":"def","name":"double","qualifier":"puredef","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":4,"kind":"app","opcode":"plus","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"name","name":"x"}]}}}]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1},"3":{"id":1,"name":"x","kind":"param","depth":1},"4":{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}},"depth":0},"6":{"id":6,"kind":"def","name":"double","qualifier":"puredef","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":4,"kind":"app","opcode":"plus","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"name","name":"x"}]}},"depth":0},"9":{"id":7,"name":"x","kind":"param","depth":1},"10":{"id":8,"name":"y","kind":"param","depth":1},"13":{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_0100cyclicDefs.json b/quint/testFixture/_0100cyclicDefs.json index f2b5ffce7..639d8a152 100644 --- a/quint/testFixture/_0100cyclicDefs.json +++ b/quint/testFixture/_0100cyclicDefs.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":16,"name":"cyclicDefs","declarations":[]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1},"3":{"id":10,"kind":"def","name":"bar","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"baz","args":[{"id":7,"kind":"name","name":"x"}]}},"depth":0},"7":{"id":6,"name":"x","kind":"param","depth":1},"8":{"id":15,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"x"}],"qualifier":"puredef","expr":{"id":13,"kind":"app","opcode":"foo","args":[{"id":12,"kind":"name","name":"x"}]}},"depth":0},"12":{"id":11,"name":"x","kind":"param","depth":1},"13":{"id":5,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":4,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":3,"kind":"app","opcode":"bar","args":[{"id":2,"kind":"name","name":"x"}]}},"depth":0}},"errors":[{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":2,"col":2,"index":70},"end":{"line":2,"col":25,"index":93}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":3,"col":2,"index":97},"end":{"line":3,"col":25,"index":120}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":4,"col":2,"index":124},"end":{"line":4,"col":25,"index":147}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":16,"name":"cyclicDefs","declarations":[]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1},"3":{"id":10,"kind":"def","name":"bar","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"baz","args":[{"id":7,"kind":"name","name":"x"}]}},"depth":0},"5":{"id":5,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":4,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":3,"kind":"app","opcode":"bar","args":[{"id":2,"kind":"name","name":"x"}]}},"depth":0},"7":{"id":6,"name":"x","kind":"param","depth":1},"8":{"id":15,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"x"}],"qualifier":"puredef","expr":{"id":13,"kind":"app","opcode":"foo","args":[{"id":12,"kind":"name","name":"x"}]}},"depth":0},"10":{"id":10,"kind":"def","name":"bar","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"baz","args":[{"id":7,"kind":"name","name":"x"}]}},"depth":0},"12":{"id":11,"name":"x","kind":"param","depth":1},"13":{"id":5,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":4,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":3,"kind":"app","opcode":"bar","args":[{"id":2,"kind":"name","name":"x"}]}},"depth":0},"15":{"id":15,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"x"}],"qualifier":"puredef","expr":{"id":13,"kind":"app","opcode":"foo","args":[{"id":12,"kind":"name","name":"x"}]}},"depth":0}},"errors":[{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":2,"col":2,"index":70},"end":{"line":2,"col":25,"index":93}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":3,"col":2,"index":97},"end":{"line":3,"col":25,"index":120}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":4,"col":2,"index":124},"end":{"line":4,"col":25,"index":147}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_0101noRecursion.json b/quint/testFixture/_0101noRecursion.json index f04f2c675..d43c5188a 100644 --- a/quint/testFixture/_0101noRecursion.json +++ b/quint/testFixture/_0101noRecursion.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":8,"name":"noRecursion","declarations":[]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1},"5":{"id":7,"kind":"def","name":"blackhole","qualifier":"puredef","expr":{"id":6,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"blackhole","args":[{"id":4,"kind":"app","opcode":"iadd","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"int","value":1}]}]}},"depth":0}},"errors":[{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0101noRecursion.qnt","start":{"line":3,"col":2,"index":131},"end":{"line":3,"col":41,"index":170}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":8,"name":"noRecursion","declarations":[]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1},"5":{"id":7,"kind":"def","name":"blackhole","qualifier":"puredef","expr":{"id":6,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"blackhole","args":[{"id":4,"kind":"app","opcode":"iadd","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"int","value":1}]}]}},"depth":0},"7":{"id":7,"kind":"def","name":"blackhole","qualifier":"puredef","expr":{"id":6,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"blackhole","args":[{"id":4,"kind":"app","opcode":"iadd","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"int","value":1}]}]}},"depth":0}},"errors":[{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0101noRecursion.qnt","start":{"line":3,"col":2,"index":131},"end":{"line":3,"col":41,"index":170}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1010undefinedName.json b/quint/testFixture/_1010undefinedName.json index 3699f8811..bece81daa 100644 --- a/quint/testFixture/_1010undefinedName.json +++ b/quint/testFixture/_1010undefinedName.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":3,"name":"definedModule","declarations":[{"id":2,"kind":"def","name":"a","qualifier":"def","expr":{"id":1,"kind":"int","value":1}}]},{"id":8,"name":"undefinedName","declarations":[{"id":5,"kind":"def","name":"f","qualifier":"def","expr":{"id":4,"kind":"name","name":"S"}},{"id":6,"kind":"import","defName":"*","protoName":"undefinedModule"},{"id":7,"kind":"import","defName":"undefinedDefinition","protoName":"definedModule"}]}],"table":{},"errors":[{"explanation":"[QNT405] Module undefinedName imports an unknown module undefinedModule","locs":[{"source":"mocked_path/testFixture/_1010undefinedName.qnt","start":{"line":8,"col":2,"index":139},"end":{"line":8,"col":25,"index":162}}]},{"explanation":"[QNT405] Module 'undefinedModule' not found","locs":[{"source":"mocked_path/testFixture/_1010undefinedName.qnt","start":{"line":8,"col":2,"index":139},"end":{"line":8,"col":25,"index":162}}]},{"explanation":"[QNT404] Name 'definedModule::undefinedDefinition' not found","locs":[{"source":"mocked_path/testFixture/_1010undefinedName.qnt","start":{"line":10,"col":2,"index":167},"end":{"line":10,"col":41,"index":206}}]},{"explanation":"[QNT404] Name 'S' not found","locs":[{"source":"mocked_path/testFixture/_1010undefinedName.qnt","start":{"line":6,"col":10,"index":134},"end":{"line":6,"col":10,"index":134}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":3,"name":"definedModule","declarations":[{"id":2,"kind":"def","name":"a","qualifier":"def","expr":{"id":1,"kind":"int","value":1}}]},{"id":8,"name":"undefinedName","declarations":[{"id":5,"kind":"def","name":"f","qualifier":"def","expr":{"id":4,"kind":"name","name":"S"}},{"id":6,"kind":"import","defName":"*","protoName":"undefinedModule"},{"id":7,"kind":"import","defName":"undefinedDefinition","protoName":"definedModule"}]}],"table":{"2":{"id":2,"kind":"def","name":"a","qualifier":"def","expr":{"id":1,"kind":"int","value":1},"depth":0},"5":{"id":5,"kind":"def","name":"f","qualifier":"def","expr":{"id":4,"kind":"name","name":"S"},"depth":0}},"errors":[{"explanation":"[QNT405] Module undefinedName imports an unknown module undefinedModule","locs":[{"source":"mocked_path/testFixture/_1010undefinedName.qnt","start":{"line":8,"col":2,"index":139},"end":{"line":8,"col":25,"index":162}}]},{"explanation":"[QNT405] Module 'undefinedModule' not found","locs":[{"source":"mocked_path/testFixture/_1010undefinedName.qnt","start":{"line":8,"col":2,"index":139},"end":{"line":8,"col":25,"index":162}}]},{"explanation":"[QNT404] Name 'definedModule::undefinedDefinition' not found","locs":[{"source":"mocked_path/testFixture/_1010undefinedName.qnt","start":{"line":10,"col":2,"index":167},"end":{"line":10,"col":41,"index":206}}]},{"explanation":"[QNT404] Name 'S' not found","locs":[{"source":"mocked_path/testFixture/_1010undefinedName.qnt","start":{"line":6,"col":10,"index":134},"end":{"line":6,"col":10,"index":134}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1011nameOutOfScope.json b/quint/testFixture/_1011nameOutOfScope.json index 11ef1d678..4ef31dae3 100644 --- a/quint/testFixture/_1011nameOutOfScope.json +++ b/quint/testFixture/_1011nameOutOfScope.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"nameOutOfScope","declarations":[{"id":10,"kind":"def","name":"A","qualifier":"val","expr":{"id":9,"kind":"app","opcode":"iadd","args":[{"id":7,"kind":"name","name":"x"},{"id":8,"kind":"int","value":1}]}},{"id":6,"kind":"def","name":"f","qualifier":"def","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"def","expr":{"id":4,"kind":"app","opcode":"igt","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"int","value":10}]}}}]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1}},"errors":[{"explanation":"[QNT404] Name 'x' not found","locs":[{"source":"mocked_path/testFixture/_1011nameOutOfScope.qnt","start":{"line":4,"col":10,"index":188},"end":{"line":4,"col":10,"index":188}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"nameOutOfScope","declarations":[{"id":10,"kind":"def","name":"A","qualifier":"val","expr":{"id":9,"kind":"app","opcode":"iadd","args":[{"id":7,"kind":"name","name":"x"},{"id":8,"kind":"int","value":1}]}},{"id":6,"kind":"def","name":"f","qualifier":"def","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"def","expr":{"id":4,"kind":"app","opcode":"igt","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"int","value":10}]}}}]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1},"6":{"id":6,"kind":"def","name":"f","qualifier":"def","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"def","expr":{"id":4,"kind":"app","opcode":"igt","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"int","value":10}]}},"depth":0},"10":{"id":10,"kind":"def","name":"A","qualifier":"val","expr":{"id":9,"kind":"app","opcode":"iadd","args":[{"id":7,"kind":"name","name":"x"},{"id":8,"kind":"int","value":1}]},"depth":0}},"errors":[{"explanation":"[QNT404] Name 'x' not found","locs":[{"source":"mocked_path/testFixture/_1011nameOutOfScope.qnt","start":{"line":4,"col":10,"index":188},"end":{"line":4,"col":10,"index":188}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1013unknownTypeLetIn.json b/quint/testFixture/_1013unknownTypeLetIn.json index 9d555bbe3..a189470bf 100644 --- a/quint/testFixture/_1013unknownTypeLetIn.json +++ b/quint/testFixture/_1013unknownTypeLetIn.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":9,"name":"unknownTypeLetIn","declarations":[{"id":8,"kind":"def","name":"d","qualifier":"def","expr":{"id":7,"kind":"let","opdef":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":10},"typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"}},"expr":{"id":6,"kind":"app","opcode":"iadd","args":[{"id":4,"kind":"name","name":"x"},{"id":5,"kind":"int","value":1}]}}}]}],"table":{"4":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":10},"typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"},"depth":1}},"errors":[{"explanation":"[QNT404] Type alias 'UNKNOWN_TYPE' not found","locs":[{"source":"mocked_path/testFixture/_1013unknownTypeLetIn.qnt","start":{"line":2,"col":11,"index":49},"end":{"line":2,"col":22,"index":60}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":9,"name":"unknownTypeLetIn","declarations":[{"id":8,"kind":"def","name":"d","qualifier":"def","expr":{"id":7,"kind":"let","opdef":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":10},"typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"}},"expr":{"id":6,"kind":"app","opcode":"iadd","args":[{"id":4,"kind":"name","name":"x"},{"id":5,"kind":"int","value":1}]}}}]}],"table":{"3":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":10},"typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"},"depth":1},"4":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":10},"typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"},"depth":1},"8":{"id":8,"kind":"def","name":"d","qualifier":"def","expr":{"id":7,"kind":"let","opdef":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":10},"typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"}},"expr":{"id":6,"kind":"app","opcode":"iadd","args":[{"id":4,"kind":"name","name":"x"},{"id":5,"kind":"int","value":1}]}},"depth":0}},"errors":[{"explanation":"[QNT404] Type alias 'UNKNOWN_TYPE' not found","locs":[{"source":"mocked_path/testFixture/_1013unknownTypeLetIn.qnt","start":{"line":2,"col":11,"index":49},"end":{"line":2,"col":22,"index":60}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1014conflictingNames.json b/quint/testFixture/_1014conflictingNames.json index 745920eed..9c471ccea 100644 --- a/quint/testFixture/_1014conflictingNames.json +++ b/quint/testFixture/_1014conflictingNames.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":3,"name":"M","declarations":[{"id":2,"kind":"def","name":"b","qualifier":"def","expr":{"id":1,"kind":"int","value":2}}]},{"id":21,"name":"conflictingNames","declarations":[{"id":13,"kind":"def","name":"size","qualifier":"def","expr":{"id":12,"kind":"lambda","params":[{"id":10,"name":"x"}],"qualifier":"def","expr":{"id":11,"kind":"int","value":0}}},{"id":15,"kind":"typedef","name":"T","type":{"id":14,"kind":"int"},"depth":0},{"id":17,"kind":"typedef","name":"T","type":{"id":16,"kind":"str"},"depth":0},{"id":19,"kind":"def","name":"b","qualifier":"def","expr":{"id":18,"kind":"int","value":1}},{"kind":"var","name":"a","typeAnnotation":{"id":4,"kind":"int"},"id":5,"depth":0},{"id":20,"kind":"import","defName":"b","protoName":"M"},{"id":9,"kind":"def","name":"a","qualifier":"def","expr":{"id":8,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"def","expr":{"id":7,"kind":"name","name":"x"}}}]}],"table":{"7":{"id":6,"name":"x","kind":"param","depth":1}},"errors":[{"explanation":"[QNT101] Conflicting definitions found for name 'a' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":6,"col":2,"index":73},"end":{"line":6,"col":12,"index":83}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'a' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":7,"col":2,"index":87},"end":{"line":7,"col":13,"index":98}}]},{"explanation":"[QNT101] Built-in name 'size' is redefined in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":10,"col":2,"index":142},"end":{"line":10,"col":16,"index":156}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'T' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":13,"col":2,"index":186},"end":{"line":13,"col":13,"index":197}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'T' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":14,"col":2,"index":201},"end":{"line":14,"col":13,"index":212}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'b' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":16,"col":2,"index":217},"end":{"line":16,"col":10,"index":225}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'b' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":19,"col":2,"index":271},"end":{"line":19,"col":11,"index":280}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":3,"name":"M","declarations":[{"id":2,"kind":"def","name":"b","qualifier":"def","expr":{"id":1,"kind":"int","value":2}}]},{"id":21,"name":"conflictingNames","declarations":[{"id":13,"kind":"def","name":"size","qualifier":"def","expr":{"id":12,"kind":"lambda","params":[{"id":10,"name":"x"}],"qualifier":"def","expr":{"id":11,"kind":"int","value":0}}},{"id":15,"kind":"typedef","name":"T","type":{"id":14,"kind":"int"},"depth":0},{"id":17,"kind":"typedef","name":"T","type":{"id":16,"kind":"str"},"depth":0},{"id":19,"kind":"def","name":"b","qualifier":"def","expr":{"id":18,"kind":"int","value":1}},{"kind":"var","name":"a","typeAnnotation":{"id":4,"kind":"int"},"id":5,"depth":0},{"id":20,"kind":"import","defName":"b","protoName":"M"},{"id":9,"kind":"def","name":"a","qualifier":"def","expr":{"id":8,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"def","expr":{"id":7,"kind":"name","name":"x"}}}]}],"table":{"2":{"id":2,"kind":"def","name":"b","qualifier":"def","expr":{"id":1,"kind":"int","value":2},"depth":0},"7":{"id":6,"name":"x","kind":"param","depth":1},"9":{"id":9,"kind":"def","name":"a","qualifier":"def","expr":{"id":8,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"def","expr":{"id":7,"kind":"name","name":"x"}},"depth":0},"13":{"id":13,"kind":"def","name":"size","qualifier":"def","expr":{"id":12,"kind":"lambda","params":[{"id":10,"name":"x"}],"qualifier":"def","expr":{"id":11,"kind":"int","value":0}},"depth":0},"19":{"id":19,"kind":"def","name":"b","qualifier":"def","expr":{"id":18,"kind":"int","value":1},"depth":0}},"errors":[{"explanation":"[QNT101] Conflicting definitions found for name 'a' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":6,"col":2,"index":73},"end":{"line":6,"col":12,"index":83}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'a' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":7,"col":2,"index":87},"end":{"line":7,"col":13,"index":98}}]},{"explanation":"[QNT101] Built-in name 'size' is redefined in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":10,"col":2,"index":142},"end":{"line":10,"col":16,"index":156}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'T' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":13,"col":2,"index":186},"end":{"line":13,"col":13,"index":197}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'T' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":14,"col":2,"index":201},"end":{"line":14,"col":13,"index":212}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'b' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":16,"col":2,"index":217},"end":{"line":16,"col":10,"index":225}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'b' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":19,"col":2,"index":271},"end":{"line":19,"col":11,"index":280}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1015noToplevelNondet.json b/quint/testFixture/_1015noToplevelNondet.json index ca7559437..e897d1a56 100644 --- a/quint/testFixture/_1015noToplevelNondet.json +++ b/quint/testFixture/_1015noToplevelNondet.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":2,"name":"topLevelNondet","declarations":[]}],"table":{},"errors":[{"explanation":"[QNT000] mismatched input 'nondet' expecting {'}', 'const', 'var', 'assume', 'type', 'val', 'def', 'pure', 'action', 'run', 'temporal', 'import', 'export', DOCCOMMENT}","locs":[{"source":"mocked_path/testFixture/_1015noToplevelNondet.qnt","start":{"line":2,"col":2,"index":101},"end":{"line":2,"col":7,"index":106}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":6,"name":"topLevelNondet","declarations":[{"id":5,"kind":"def","name":"toplevelNondet","qualifier":"nondet","expr":{"id":4,"kind":"app","opcode":"oneOf","args":[{"id":3,"kind":"app","opcode":"to","args":[{"id":1,"kind":"int","value":1},{"id":2,"kind":"int","value":3}]}]}}]}],"table":{"5":{"id":5,"kind":"def","name":"toplevelNondet","qualifier":"nondet","expr":{"id":4,"kind":"app","opcode":"oneOf","args":[{"id":3,"kind":"app","opcode":"to","args":[{"id":1,"kind":"int","value":1},{"id":2,"kind":"int","value":3}]}]},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1020importFrom.json b/quint/testFixture/_1020importFrom.json index 20f774a29..e677b042c 100644 --- a/quint/testFixture/_1020importFrom.json +++ b/quint/testFixture/_1020importFrom.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":6,"name":"importee2","declarations":[{"id":5,"kind":"def","name":"name2","qualifier":"val","expr":{"id":4,"kind":"str","value":"importee2"}}]},{"id":10,"name":"importee1","declarations":[{"id":8,"kind":"def","name":"name1","qualifier":"val","expr":{"id":7,"kind":"str","value":"importee1"}},{"id":9,"kind":"import","defName":"*","protoName":"importee2","fromSource":"./_1022importee2"}]},{"id":3,"name":"importer","declarations":[{"id":1,"kind":"import","defName":"*","protoName":"importee2","fromSource":"./_1022importee2"},{"id":2,"kind":"import","defName":"*","protoName":"importee1","fromSource":"./_1021importee1"}]}],"table":{},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":6,"name":"importee2","declarations":[{"id":5,"kind":"def","name":"name2","qualifier":"val","expr":{"id":4,"kind":"str","value":"importee2"}}]},{"id":10,"name":"importee1","declarations":[{"id":8,"kind":"def","name":"name1","qualifier":"val","expr":{"id":7,"kind":"str","value":"importee1"}},{"id":9,"kind":"import","defName":"*","protoName":"importee2","fromSource":"./_1022importee2"}]},{"id":3,"name":"importer","declarations":[{"id":1,"kind":"import","defName":"*","protoName":"importee2","fromSource":"./_1022importee2"},{"id":2,"kind":"import","defName":"*","protoName":"importee1","fromSource":"./_1021importee1"}]}],"table":{"5":{"id":5,"kind":"def","name":"name2","qualifier":"val","expr":{"id":4,"kind":"str","value":"importee2"},"depth":0},"8":{"id":8,"kind":"def","name":"name1","qualifier":"val","expr":{"id":7,"kind":"str","value":"importee1"},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1021importee1.json b/quint/testFixture/_1021importee1.json index 3f8772f03..7199f3260 100644 --- a/quint/testFixture/_1021importee1.json +++ b/quint/testFixture/_1021importee1.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":7,"name":"importee2","declarations":[{"id":6,"kind":"def","name":"name2","qualifier":"val","expr":{"id":5,"kind":"str","value":"importee2"}}]},{"id":4,"name":"importee1","declarations":[{"id":2,"kind":"def","name":"name1","qualifier":"val","expr":{"id":1,"kind":"str","value":"importee1"}},{"id":3,"kind":"import","defName":"*","protoName":"importee2","fromSource":"./_1022importee2"}]}],"table":{},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":7,"name":"importee2","declarations":[{"id":6,"kind":"def","name":"name2","qualifier":"val","expr":{"id":5,"kind":"str","value":"importee2"}}]},{"id":4,"name":"importee1","declarations":[{"id":2,"kind":"def","name":"name1","qualifier":"val","expr":{"id":1,"kind":"str","value":"importee1"}},{"id":3,"kind":"import","defName":"*","protoName":"importee2","fromSource":"./_1022importee2"}]}],"table":{"2":{"id":2,"kind":"def","name":"name1","qualifier":"val","expr":{"id":1,"kind":"str","value":"importee1"},"depth":0},"6":{"id":6,"kind":"def","name":"name2","qualifier":"val","expr":{"id":5,"kind":"str","value":"importee2"},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1022importee2.json b/quint/testFixture/_1022importee2.json index abca5472d..d01b33dc9 100644 --- a/quint/testFixture/_1022importee2.json +++ b/quint/testFixture/_1022importee2.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":3,"name":"importee2","declarations":[{"id":2,"kind":"def","name":"name2","qualifier":"val","expr":{"id":1,"kind":"str","value":"importee2"}}]}],"table":{},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":3,"name":"importee2","declarations":[{"id":2,"kind":"def","name":"name2","qualifier":"val","expr":{"id":1,"kind":"str","value":"importee2"}}]}],"table":{"2":{"id":2,"kind":"def","name":"name2","qualifier":"val","expr":{"id":1,"kind":"str","value":"importee2"},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1025importeeWithError.json b/quint/testFixture/_1025importeeWithError.json index 0849ac06c..0ab94dc1b 100644 --- a/quint/testFixture/_1025importeeWithError.json +++ b/quint/testFixture/_1025importeeWithError.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"I","declarations":[{"id":9,"kind":"def","name":"x","qualifier":"val","expr":{"id":8,"kind":"let","opdef":{"id":3,"kind":"def","name":"y","qualifier":"val","expr":{"id":2,"kind":"bool","value":true}},"expr":{"id":4,"kind":"let","opdef":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true}},"expr":{"id":7,"kind":"name","name":"__undefinedExprGenerated"}}}}]}],"table":{"7":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true},"depth":1}},"errors":[{"explanation":"[QNT000] mismatched input '}' expecting {'{', '[', 'nondet', 'val', 'def', 'pure', 'action', 'run', 'temporal', 'all', 'any', 'if', '_', STRING, BOOL, INT, 'and', 'or', 'iff', 'implies', 'Map', 'match', '-', '(', 'Set', 'List', LOW_ID, CAP_ID}","locs":[{"source":"mocked_path/testFixture/_1025importeeWithError.qnt","start":{"line":3,"col":0,"index":45},"end":{"line":3,"col":0,"index":45}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"I","declarations":[{"id":9,"kind":"def","name":"x","qualifier":"val","expr":{"id":8,"kind":"let","opdef":{"id":3,"kind":"def","name":"y","qualifier":"val","expr":{"id":2,"kind":"bool","value":true}},"expr":{"id":4,"kind":"let","opdef":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true}},"expr":{"id":7,"kind":"name","name":"__undefinedExprGenerated"}}}}]}],"table":{"3":{"id":3,"kind":"def","name":"y","qualifier":"val","expr":{"id":2,"kind":"bool","value":true},"depth":1},"5":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true},"depth":1},"7":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true},"depth":1},"9":{"id":9,"kind":"def","name":"x","qualifier":"val","expr":{"id":8,"kind":"let","opdef":{"id":3,"kind":"def","name":"y","qualifier":"val","expr":{"id":2,"kind":"bool","value":true}},"expr":{"id":4,"kind":"let","opdef":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true}},"expr":{"id":7,"kind":"name","name":"__undefinedExprGenerated"}}},"depth":0}},"errors":[{"explanation":"[QNT000] mismatched input '}' expecting {'{', '[', 'val', 'def', 'pure', 'action', 'run', 'temporal', 'nondet', 'all', 'any', 'if', '_', STRING, BOOL, INT, 'and', 'or', 'iff', 'implies', 'Map', 'match', '-', '(', 'Set', 'List', LOW_ID, CAP_ID}","locs":[{"source":"mocked_path/testFixture/_1025importeeWithError.qnt","start":{"line":3,"col":0,"index":45},"end":{"line":3,"col":0,"index":45}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1030const.json b/quint/testFixture/_1030const.json index 41bd5f567..e5f70e895 100644 --- a/quint/testFixture/_1030const.json +++ b/quint/testFixture/_1030const.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},{"id":10,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":4,"name":"i","typeAnnotation":{"id":3,"kind":"int"}}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"iadd","args":[{"id":6,"kind":"name","name":"i"},{"id":7,"kind":"name","name":"N"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"int"}],"res":{"id":5,"kind":"int"}}}]}],"table":{"6":{"id":4,"name":"i","typeAnnotation":{"id":3,"kind":"int"},"kind":"param","depth":1},"7":{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},{"id":10,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":4,"name":"i","typeAnnotation":{"id":3,"kind":"int"}}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"iadd","args":[{"id":6,"kind":"name","name":"i"},{"id":7,"kind":"name","name":"N"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"int"}],"res":{"id":5,"kind":"int"}}}]}],"table":{"6":{"id":4,"name":"i","typeAnnotation":{"id":3,"kind":"int"},"kind":"param","depth":1},"7":{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},"10":{"id":10,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":4,"name":"i","typeAnnotation":{"id":3,"kind":"int"}}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"iadd","args":[{"id":6,"kind":"name","name":"i"},{"id":7,"kind":"name","name":"N"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"int"}],"res":{"id":5,"kind":"int"}},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1031instance.json b/quint/testFixture/_1031instance.json index f45d277dc..7b66f056e 100644 --- a/quint/testFixture/_1031instance.json +++ b/quint/testFixture/_1031instance.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":18,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9,"depth":0},{"id":17,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":16,"kind":"lambda","params":[{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"}}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":10,"kind":"int"}],"res":{"id":12,"kind":"int"}}}]},{"id":7,"name":"inst","declarations":[{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},{"id":6,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"foo","args":[{"id":4,"kind":"int","value":6}]}}]}],"table":{"2":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":1,"depth":0,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"5":{"id":17,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":16,"kind":"lambda","params":[{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"}}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"depth":0,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"13":{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"},"kind":"param","depth":1},"14":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9,"depth":0}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":18,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9,"depth":0},{"id":17,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":16,"kind":"lambda","params":[{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"}}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":10,"kind":"int"}],"res":{"id":12,"kind":"int"}}}]},{"id":7,"name":"inst","declarations":[{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},{"id":6,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"foo","args":[{"id":4,"kind":"int","value":6}]}}]}],"table":{"2":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":1,"depth":0,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"5":{"id":17,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":16,"kind":"lambda","params":[{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"}}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"depth":0,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"6":{"id":6,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"foo","args":[{"id":4,"kind":"int","value":6}]},"depth":0},"13":{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"},"kind":"param","depth":1},"14":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9,"depth":0},"17":{"id":17,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":16,"kind":"lambda","params":[{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"}}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":10,"kind":"int"}],"res":{"id":12,"kind":"int"}},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1032docstrings.json b/quint/testFixture/_1032docstrings.json index 88f583e0d..9bb8386dd 100644 --- a/quint/testFixture/_1032docstrings.json +++ b/quint/testFixture/_1032docstrings.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"docstrings","declarations":[{"doc":"Docstring for var","kind":"var","name":"x","typeAnnotation":{"id":6,"kind":"int"},"id":7,"depth":0},{"doc":"Docstring for const","kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9,"depth":0},{"doc":"Top level docstring","id":5,"kind":"def","name":"nestedVals","qualifier":"val","expr":{"id":4,"kind":"let","opdef":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1}},"expr":{"id":3,"kind":"name","name":"foo"}}}],"doc":"Docstring for module"}],"table":{"3":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1},"depth":1}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"docstrings","declarations":[{"doc":"Docstring for var","kind":"var","name":"x","typeAnnotation":{"id":6,"kind":"int"},"id":7,"depth":0},{"doc":"Docstring for const","kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9,"depth":0},{"doc":"Top level docstring","id":5,"kind":"def","name":"nestedVals","qualifier":"val","expr":{"id":4,"kind":"let","opdef":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1}},"expr":{"id":3,"kind":"name","name":"foo"}}}],"doc":"Docstring for module"}],"table":{"2":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1},"depth":1},"3":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1},"depth":1},"5":{"doc":"Top level docstring","id":5,"kind":"def","name":"nestedVals","qualifier":"val","expr":{"id":4,"kind":"let","opdef":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1}},"expr":{"id":3,"kind":"name","name":"foo"}},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1040compileError.json b/quint/testFixture/_1040compileError.json index 297159d06..34614cfef 100644 --- a/quint/testFixture/_1040compileError.json +++ b/quint/testFixture/_1040compileError.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":8,"name":"_1040compileError","declarations":[{"kind":"const","name":"n","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},{"id":7,"kind":"def","name":"myTest","qualifier":"run","expr":{"id":6,"kind":"app","opcode":"assert","args":[{"id":5,"kind":"app","opcode":"igt","args":[{"id":3,"kind":"name","name":"n"},{"id":4,"kind":"int","value":0}]}]}}]}],"table":{"3":{"kind":"const","name":"n","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":8,"name":"_1040compileError","declarations":[{"kind":"const","name":"n","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},{"id":7,"kind":"def","name":"myTest","qualifier":"run","expr":{"id":6,"kind":"app","opcode":"assert","args":[{"id":5,"kind":"app","opcode":"igt","args":[{"id":3,"kind":"name","name":"n"},{"id":4,"kind":"int","value":0}]}]}}]}],"table":{"3":{"kind":"const","name":"n","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},"7":{"id":7,"kind":"def","name":"myTest","qualifier":"run","expr":{"id":6,"kind":"app","opcode":"assert","args":[{"id":5,"kind":"app","opcode":"igt","args":[{"id":3,"kind":"name","name":"n"},{"id":4,"kind":"int","value":0}]}]},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1041compileConst.json b/quint/testFixture/_1041compileConst.json index 5aac7fd72..6e20291f3 100644 --- a/quint/testFixture/_1041compileConst.json +++ b/quint/testFixture/_1041compileConst.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":15,"name":"_1041compileConst","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4,"depth":0},{"id":14,"kind":"def","name":"step","qualifier":"action","expr":{"id":13,"kind":"app","opcode":"assign","args":[{"id":12,"kind":"name","name":"x"},{"id":11,"kind":"app","opcode":"isub","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"int","value":1}]}]}},{"id":8,"kind":"def","name":"init","qualifier":"action","expr":{"id":7,"kind":"app","opcode":"assign","args":[{"id":6,"kind":"name","name":"x"},{"id":5,"kind":"name","name":"N"}]}}]}],"table":{"5":{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},"6":{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4,"depth":0},"9":{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4,"depth":0},"12":{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4,"depth":0}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":15,"name":"_1041compileConst","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4,"depth":0},{"id":14,"kind":"def","name":"step","qualifier":"action","expr":{"id":13,"kind":"app","opcode":"assign","args":[{"id":12,"kind":"name","name":"x"},{"id":11,"kind":"app","opcode":"isub","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"int","value":1}]}]}},{"id":8,"kind":"def","name":"init","qualifier":"action","expr":{"id":7,"kind":"app","opcode":"assign","args":[{"id":6,"kind":"name","name":"x"},{"id":5,"kind":"name","name":"N"}]}}]}],"table":{"5":{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},"6":{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4,"depth":0},"8":{"id":8,"kind":"def","name":"init","qualifier":"action","expr":{"id":7,"kind":"app","opcode":"assign","args":[{"id":6,"kind":"name","name":"x"},{"id":5,"kind":"name","name":"N"}]},"depth":0},"9":{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4,"depth":0},"12":{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4,"depth":0},"14":{"id":14,"kind":"def","name":"step","qualifier":"action","expr":{"id":13,"kind":"app","opcode":"assign","args":[{"id":12,"kind":"name","name":"x"},{"id":11,"kind":"app","opcode":"isub","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"int","value":1}]}]},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1042qualifiersInRecordsFieldsError.json b/quint/testFixture/_1042qualifiersInRecordsFieldsError.json index bdd6bb145..0c498d357 100644 --- a/quint/testFixture/_1042qualifiersInRecordsFieldsError.json +++ b/quint/testFixture/_1042qualifiersInRecordsFieldsError.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"qualifiersInRecordFields","declarations":[{"id":5,"kind":"typedef","name":"T","type":{"id":4,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"invalid::decl::label","fieldType":{"id":3,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},{"id":9,"kind":"def","name":"r","qualifier":"val","expr":{"id":8,"kind":"app","opcode":"Rec","args":[{"id":7,"kind":"str","value":"invalid::record::label"},{"id":6,"kind":"int","value":1}]}}]}],"table":{},"errors":[{"explanation":"[QNT008] Identifiers in a record cannot be qualified with '::'. Found invalid::decl::label.","locs":[{"source":"mocked_path/testFixture/_1042qualifiersInRecordsFieldsError.qnt","start":{"line":1,"col":33,"index":67},"end":{"line":1,"col":33,"index":67}}]},{"explanation":"[QNT008] Identifiers in a record cannot be qualified with '::'. Found invalid::record::label.","locs":[{"source":"mocked_path/testFixture/_1042qualifiersInRecordsFieldsError.qnt","start":{"line":2,"col":35,"index":110},"end":{"line":2,"col":35,"index":110}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"qualifiersInRecordFields","declarations":[{"id":5,"kind":"typedef","name":"T","type":{"id":4,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"invalid::decl::label","fieldType":{"id":3,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},{"id":9,"kind":"def","name":"r","qualifier":"val","expr":{"id":8,"kind":"app","opcode":"Rec","args":[{"id":7,"kind":"str","value":"invalid::record::label"},{"id":6,"kind":"int","value":1}]}}]}],"table":{"9":{"id":9,"kind":"def","name":"r","qualifier":"val","expr":{"id":8,"kind":"app","opcode":"Rec","args":[{"id":7,"kind":"str","value":"invalid::record::label"},{"id":6,"kind":"int","value":1}]},"depth":0}},"errors":[{"explanation":"[QNT008] Identifiers in a record cannot be qualified with '::'. Found invalid::decl::label.","locs":[{"source":"mocked_path/testFixture/_1042qualifiersInRecordsFieldsError.qnt","start":{"line":1,"col":33,"index":67},"end":{"line":1,"col":33,"index":67}}]},{"explanation":"[QNT008] Identifiers in a record cannot be qualified with '::'. Found invalid::record::label.","locs":[{"source":"mocked_path/testFixture/_1042qualifiersInRecordsFieldsError.qnt","start":{"line":2,"col":35,"index":110},"end":{"line":2,"col":35,"index":110}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1043sumTypeDecl.json b/quint/testFixture/_1043sumTypeDecl.json index 53f0aa6b2..a160f1be9 100644 --- a/quint/testFixture/_1043sumTypeDecl.json +++ b/quint/testFixture/_1043sumTypeDecl.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":22,"name":"SumTypes","declarations":[{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},{"id":14,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}}},{"id":8,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":4,"kind":"const","name":"T"},"expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Tup","args":[]}]}},{"id":21,"kind":"def","name":"canConstructVariants","qualifier":"val","expr":{"id":20,"kind":"app","opcode":"List","args":[{"id":17,"kind":"name","name":"A"},{"id":19,"kind":"app","opcode":"B","args":[{"id":18,"kind":"int","value":2}]}]},"typeAnnotation":{"id":16,"kind":"list","elem":{"id":15,"kind":"const","name":"T"}}}]}],"table":{"4":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},"11":{"id":10,"name":"__BParam","kind":"param","depth":1},"15":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},"17":{"id":8,"kind":"def","name":"A","qualifier":"val","expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Tup","args":[]}]},"depth":0},"19":{"id":14,"kind":"def","name":"B","qualifier":"def","expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}},"depth":0}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":22,"name":"SumTypes","declarations":[{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},{"id":14,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}}},{"id":8,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":4,"kind":"const","name":"T"},"expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Tup","args":[]}]}},{"id":21,"kind":"def","name":"canConstructVariants","qualifier":"val","expr":{"id":20,"kind":"app","opcode":"List","args":[{"id":17,"kind":"name","name":"A"},{"id":19,"kind":"app","opcode":"B","args":[{"id":18,"kind":"int","value":2}]}]},"typeAnnotation":{"id":16,"kind":"list","elem":{"id":15,"kind":"const","name":"T"}}}]}],"table":{"4":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},"8":{"id":8,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":4,"kind":"const","name":"T"},"expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Tup","args":[]}]},"depth":0},"11":{"id":10,"name":"__BParam","kind":"param","depth":1},"14":{"id":14,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}},"depth":0},"15":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},"17":{"id":8,"kind":"def","name":"A","qualifier":"val","expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Tup","args":[]}]},"depth":0},"19":{"id":14,"kind":"def","name":"B","qualifier":"def","expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}},"depth":0},"21":{"id":21,"kind":"def","name":"canConstructVariants","qualifier":"val","expr":{"id":20,"kind":"app","opcode":"List","args":[{"id":17,"kind":"name","name":"A"},{"id":19,"kind":"app","opcode":"B","args":[{"id":18,"kind":"int","value":2}]}]},"typeAnnotation":{"id":16,"kind":"list","elem":{"id":15,"kind":"const","name":"T"}},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1044matchExpression.json b/quint/testFixture/_1044matchExpression.json index 037d9dba6..24ade9562 100644 --- a/quint/testFixture/_1044matchExpression.json +++ b/quint/testFixture/_1044matchExpression.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":41,"name":"SumTypes","declarations":[{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},{"id":15,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"__BParam"}],"qualifier":"def","expr":{"id":13,"kind":"app","opcode":"variant","args":[{"id":10,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":12}]}}},{"id":21,"kind":"def","name":"C","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"str"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":20,"kind":"lambda","params":[{"id":17,"name":"__CParam"}],"qualifier":"def","expr":{"id":19,"kind":"app","opcode":"variant","args":[{"id":16,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":18}]}}},{"id":9,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":5,"kind":"const","name":"T"},"expr":{"id":8,"kind":"app","opcode":"variant","args":[{"id":6,"kind":"str","value":"A"},{"id":7,"kind":"app","opcode":"Tup","args":[]}]}},{"id":24,"kind":"def","name":"c","qualifier":"val","expr":{"id":23,"kind":"app","opcode":"C","args":[{"id":22,"kind":"str","value":"Foo"}]}},{"id":40,"kind":"def","name":"ex","qualifier":"val","expr":{"id":30,"kind":"app","opcode":"matchVariant","args":[{"id":25,"kind":"name","name":"c"},{"id":31,"kind":"str","value":"A"},{"id":32,"kind":"lambda","qualifier":"def","expr":{"id":26,"kind":"int","value":0},"params":[{"name":"_","id":33}]},{"id":34,"kind":"str","value":"B"},{"id":35,"kind":"lambda","qualifier":"def","expr":{"id":27,"kind":"name","name":"n"},"params":[{"name":"n","id":36}]},{"id":37,"kind":"str","value":"_"},{"id":38,"kind":"lambda","qualifier":"def","expr":{"id":29,"kind":"app","opcode":"iuminus","args":[{"id":28,"kind":"int","value":1}]},"params":[{"name":"_","id":39}]}]}}]}],"table":{"5":{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"12":{"id":11,"name":"__BParam","kind":"param","depth":1},"18":{"id":17,"name":"__CParam","kind":"param","depth":1},"23":{"id":21,"kind":"def","name":"C","qualifier":"def","expr":{"id":20,"kind":"lambda","params":[{"id":17,"name":"__CParam"}],"qualifier":"def","expr":{"id":19,"kind":"app","opcode":"variant","args":[{"id":16,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":18}]}},"depth":0},"25":{"id":24,"kind":"def","name":"c","qualifier":"val","expr":{"id":23,"kind":"app","opcode":"C","args":[{"id":22,"kind":"str","value":"Foo"}]},"depth":0},"27":{"name":"n","id":36,"kind":"param","depth":1}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":41,"name":"SumTypes","declarations":[{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},{"id":15,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"__BParam"}],"qualifier":"def","expr":{"id":13,"kind":"app","opcode":"variant","args":[{"id":10,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":12}]}}},{"id":21,"kind":"def","name":"C","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"str"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":20,"kind":"lambda","params":[{"id":17,"name":"__CParam"}],"qualifier":"def","expr":{"id":19,"kind":"app","opcode":"variant","args":[{"id":16,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":18}]}}},{"id":9,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":5,"kind":"const","name":"T"},"expr":{"id":8,"kind":"app","opcode":"variant","args":[{"id":6,"kind":"str","value":"A"},{"id":7,"kind":"app","opcode":"Tup","args":[]}]}},{"id":24,"kind":"def","name":"c","qualifier":"val","expr":{"id":23,"kind":"app","opcode":"C","args":[{"id":22,"kind":"str","value":"Foo"}]}},{"id":40,"kind":"def","name":"ex","qualifier":"val","expr":{"id":30,"kind":"app","opcode":"matchVariant","args":[{"id":25,"kind":"name","name":"c"},{"id":31,"kind":"str","value":"A"},{"id":32,"kind":"lambda","qualifier":"def","expr":{"id":26,"kind":"int","value":0},"params":[{"name":"_","id":33}]},{"id":34,"kind":"str","value":"B"},{"id":35,"kind":"lambda","qualifier":"def","expr":{"id":27,"kind":"name","name":"n"},"params":[{"name":"n","id":36}]},{"id":37,"kind":"str","value":"_"},{"id":38,"kind":"lambda","qualifier":"def","expr":{"id":29,"kind":"app","opcode":"iuminus","args":[{"id":28,"kind":"int","value":1}]},"params":[{"name":"_","id":39}]}]}}]}],"table":{"5":{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"9":{"id":9,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":5,"kind":"const","name":"T"},"expr":{"id":8,"kind":"app","opcode":"variant","args":[{"id":6,"kind":"str","value":"A"},{"id":7,"kind":"app","opcode":"Tup","args":[]}]},"depth":0},"12":{"id":11,"name":"__BParam","kind":"param","depth":1},"15":{"id":15,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"__BParam"}],"qualifier":"def","expr":{"id":13,"kind":"app","opcode":"variant","args":[{"id":10,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":12}]}},"depth":0},"18":{"id":17,"name":"__CParam","kind":"param","depth":1},"21":{"id":21,"kind":"def","name":"C","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"str"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":20,"kind":"lambda","params":[{"id":17,"name":"__CParam"}],"qualifier":"def","expr":{"id":19,"kind":"app","opcode":"variant","args":[{"id":16,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":18}]}},"depth":0},"23":{"id":21,"kind":"def","name":"C","qualifier":"def","expr":{"id":20,"kind":"lambda","params":[{"id":17,"name":"__CParam"}],"qualifier":"def","expr":{"id":19,"kind":"app","opcode":"variant","args":[{"id":16,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":18}]}},"depth":0},"24":{"id":24,"kind":"def","name":"c","qualifier":"val","expr":{"id":23,"kind":"app","opcode":"C","args":[{"id":22,"kind":"str","value":"Foo"}]},"depth":0},"25":{"id":24,"kind":"def","name":"c","qualifier":"val","expr":{"id":23,"kind":"app","opcode":"C","args":[{"id":22,"kind":"str","value":"Foo"}]},"depth":0},"27":{"name":"n","id":36,"kind":"param","depth":1},"40":{"id":40,"kind":"def","name":"ex","qualifier":"val","expr":{"id":30,"kind":"app","opcode":"matchVariant","args":[{"id":25,"kind":"name","name":"c"},{"id":31,"kind":"str","value":"A"},{"id":32,"kind":"lambda","qualifier":"def","expr":{"id":26,"kind":"int","value":0},"params":[{"name":"_","id":33}]},{"id":34,"kind":"str","value":"B"},{"id":35,"kind":"lambda","qualifier":"def","expr":{"id":27,"kind":"name","name":"n"},"params":[{"name":"n","id":36}]},{"id":37,"kind":"str","value":"_"},{"id":38,"kind":"lambda","qualifier":"def","expr":{"id":29,"kind":"app","opcode":"iuminus","args":[{"id":28,"kind":"int","value":1}]},"params":[{"name":"_","id":39}]}]},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1045polymorphicTypeDecl.json b/quint/testFixture/_1045polymorphicTypeDecl.json index 38644197e..80bfdfe94 100644 --- a/quint/testFixture/_1045polymorphicTypeDecl.json +++ b/quint/testFixture/_1045polymorphicTypeDecl.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":36,"name":"m","declarations":[{"id":10,"kind":"typedef","name":"MapApp","type":{"id":9,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":7,"kind":"fun","arg":{"id":5,"kind":"var","name":"a"},"res":{"id":6,"kind":"var","name":"b"}}},{"fieldName":"1","fieldType":{"id":8,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a","b"],"depth":0},{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"],"depth":0},{"id":4,"kind":"typedef","name":"MonoPair","type":{"id":3,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":1,"kind":"var","name":"a"}},{"fieldName":"1","fieldType":{"id":2,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a"],"depth":0},{"id":22,"kind":"def","name":"Ok","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":11,"kind":"var","name":"ok"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":21,"kind":"lambda","params":[{"id":18,"name":"__OkParam"}],"qualifier":"def","expr":{"id":20,"kind":"app","opcode":"variant","args":[{"id":17,"kind":"str","value":"Ok"},{"kind":"name","name":"__OkParam","id":19}]}}},{"id":28,"kind":"def","name":"Err","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":12,"kind":"var","name":"err"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":27,"kind":"lambda","params":[{"id":24,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":26,"kind":"app","opcode":"variant","args":[{"id":23,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":25}]}}},{"id":35,"kind":"def","name":"test","qualifier":"val","expr":{"id":34,"kind":"app","opcode":"Err","args":[{"id":33,"kind":"str","value":"my error"}]},"typeAnnotation":{"id":31,"kind":"app","ctor":{"id":32,"kind":"const","name":"Result"},"args":[{"id":29,"kind":"tup","fields":{"kind":"empty"}},{"id":30,"kind":"str"}]}}]}],"table":{"14":{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"],"depth":0},"19":{"id":18,"name":"__OkParam","kind":"param","depth":1},"25":{"id":24,"name":"__ErrParam","kind":"param","depth":1},"32":{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"],"depth":0},"34":{"id":28,"kind":"def","name":"Err","qualifier":"def","expr":{"id":27,"kind":"lambda","params":[{"id":24,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":26,"kind":"app","opcode":"variant","args":[{"id":23,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":25}]}},"depth":0}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":36,"name":"m","declarations":[{"id":10,"kind":"typedef","name":"MapApp","type":{"id":9,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":7,"kind":"fun","arg":{"id":5,"kind":"var","name":"a"},"res":{"id":6,"kind":"var","name":"b"}}},{"fieldName":"1","fieldType":{"id":8,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a","b"],"depth":0},{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"],"depth":0},{"id":4,"kind":"typedef","name":"MonoPair","type":{"id":3,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":1,"kind":"var","name":"a"}},{"fieldName":"1","fieldType":{"id":2,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a"],"depth":0},{"id":22,"kind":"def","name":"Ok","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":11,"kind":"var","name":"ok"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":21,"kind":"lambda","params":[{"id":18,"name":"__OkParam"}],"qualifier":"def","expr":{"id":20,"kind":"app","opcode":"variant","args":[{"id":17,"kind":"str","value":"Ok"},{"kind":"name","name":"__OkParam","id":19}]}}},{"id":28,"kind":"def","name":"Err","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":12,"kind":"var","name":"err"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":27,"kind":"lambda","params":[{"id":24,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":26,"kind":"app","opcode":"variant","args":[{"id":23,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":25}]}}},{"id":35,"kind":"def","name":"test","qualifier":"val","expr":{"id":34,"kind":"app","opcode":"Err","args":[{"id":33,"kind":"str","value":"my error"}]},"typeAnnotation":{"id":31,"kind":"app","ctor":{"id":32,"kind":"const","name":"Result"},"args":[{"id":29,"kind":"tup","fields":{"kind":"empty"}},{"id":30,"kind":"str"}]}}]}],"table":{"14":{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"],"depth":0},"19":{"id":18,"name":"__OkParam","kind":"param","depth":1},"22":{"id":22,"kind":"def","name":"Ok","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":11,"kind":"var","name":"ok"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":21,"kind":"lambda","params":[{"id":18,"name":"__OkParam"}],"qualifier":"def","expr":{"id":20,"kind":"app","opcode":"variant","args":[{"id":17,"kind":"str","value":"Ok"},{"kind":"name","name":"__OkParam","id":19}]}},"depth":0},"25":{"id":24,"name":"__ErrParam","kind":"param","depth":1},"28":{"id":28,"kind":"def","name":"Err","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":12,"kind":"var","name":"err"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":27,"kind":"lambda","params":[{"id":24,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":26,"kind":"app","opcode":"variant","args":[{"id":23,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":25}]}},"depth":0},"32":{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"],"depth":0},"34":{"id":28,"kind":"def","name":"Err","qualifier":"def","expr":{"id":27,"kind":"lambda","params":[{"id":24,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":26,"kind":"app","opcode":"variant","args":[{"id":23,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":25}]}},"depth":0},"35":{"id":35,"kind":"def","name":"test","qualifier":"val","expr":{"id":34,"kind":"app","opcode":"Err","args":[{"id":33,"kind":"str","value":"my error"}]},"typeAnnotation":{"id":31,"kind":"app","ctor":{"id":32,"kind":"const","name":"Result"},"args":[{"id":29,"kind":"tup","fields":{"kind":"empty"}},{"id":30,"kind":"str"}]},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/modulesAndJunk.json b/quint/testFixture/modulesAndJunk.json index 48fb05ca0..a16d6f974 100644 --- a/quint/testFixture/modulesAndJunk.json +++ b/quint/testFixture/modulesAndJunk.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":13,"name":"bar","declarations":[{"id":12,"kind":"def","name":"baz","qualifier":"def","expr":{"id":11,"kind":"lambda","params":[{"id":6,"name":"x","typeAnnotation":{"id":5,"kind":"int"}}],"qualifier":"def","expr":{"id":10,"kind":"app","opcode":"iadd","args":[{"id":8,"kind":"name","name":"x"},{"id":9,"kind":"int","value":1}]}},"typeAnnotation":{"kind":"oper","args":[{"id":5,"kind":"int"}],"res":{"id":7,"kind":"int"}}}]},{"id":4,"name":"foo","declarations":[{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":1}}]}],"table":{"8":{"id":6,"name":"x","typeAnnotation":{"id":5,"kind":"int"},"kind":"param","depth":1}},"errors":[{"explanation":"[QNT000] extraneous input 'the' expecting {, 'module', DOCCOMMENT}","locs":[{"source":"mocked_path/testFixture/modulesAndJunk.qnt","start":{"line":8,"col":0,"index":75},"end":{"line":8,"col":2,"index":77}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":13,"name":"bar","declarations":[{"id":12,"kind":"def","name":"baz","qualifier":"def","expr":{"id":11,"kind":"lambda","params":[{"id":6,"name":"x","typeAnnotation":{"id":5,"kind":"int"}}],"qualifier":"def","expr":{"id":10,"kind":"app","opcode":"iadd","args":[{"id":8,"kind":"name","name":"x"},{"id":9,"kind":"int","value":1}]}},"typeAnnotation":{"kind":"oper","args":[{"id":5,"kind":"int"}],"res":{"id":7,"kind":"int"}}}]},{"id":4,"name":"foo","declarations":[{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":1}}]}],"table":{"3":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":1},"depth":0},"8":{"id":6,"name":"x","typeAnnotation":{"id":5,"kind":"int"},"kind":"param","depth":1},"12":{"id":12,"kind":"def","name":"baz","qualifier":"def","expr":{"id":11,"kind":"lambda","params":[{"id":6,"name":"x","typeAnnotation":{"id":5,"kind":"int"}}],"qualifier":"def","expr":{"id":10,"kind":"app","opcode":"iadd","args":[{"id":8,"kind":"name","name":"x"},{"id":9,"kind":"int","value":1}]}},"typeAnnotation":{"kind":"oper","args":[{"id":5,"kind":"int"}],"res":{"id":7,"kind":"int"}},"depth":0}},"errors":[{"explanation":"[QNT000] extraneous input 'the' expecting {, 'module', DOCCOMMENT}","locs":[{"source":"mocked_path/testFixture/modulesAndJunk.qnt","start":{"line":8,"col":0,"index":75},"end":{"line":8,"col":2,"index":77}}]}]} \ No newline at end of file From 9f4d2b4df5e2c95551f88eda2f51e3b7e6b951e6 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 6 May 2024 15:47:13 -0300 Subject: [PATCH 358/388] Bump apalache to 0.44.11 --- quint/src/apalache.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/apalache.ts b/quint/src/apalache.ts index ac46dff63..ae00a7015 100644 --- a/quint/src/apalache.ts +++ b/quint/src/apalache.ts @@ -39,7 +39,7 @@ import type { Buffer } from 'buffer' import type { PackageDefinition as ProtoPackageDefinition } from '@grpc/proto-loader' const APALACHE_SERVER_URI = 'localhost:8822' -const APALACHE_VERSION_TAG = '0.44.10' +const APALACHE_VERSION_TAG = '0.44.11' // TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 // const APALACHE_TGZ = 'apalache.tgz' From 0ff281a7c381d3fe697131e529335db2a7f4f58e Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 6 May 2024 15:47:26 -0300 Subject: [PATCH 359/388] Update Apalache integration tests --- quint/apalache-tests.md | 75 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 68 insertions(+), 7 deletions(-) diff --git a/quint/apalache-tests.md b/quint/apalache-tests.md index 56aa13c52..f377a9e77 100644 --- a/quint/apalache-tests.md +++ b/quint/apalache-tests.md @@ -235,38 +235,84 @@ quint compile --target tlaplus ./testFixture/ApalacheCompilation.qnt EXTENDS Integers, Sequences, FiniteSets, TLC, Apalache, Variants -VARIABLE x - +VARIABLE + (* + @type: Int; + *) + x + +(* + @type: (() => A(UNIT) | B(Int)); +*) A == Variant("A", "U_OF_UNIT") +(* + @type: ((Int) => A(UNIT) | B(Int)); +*) B(__BParam_31) == Variant("B", __BParam_31) +(* + @type: ((a) => a); +*) foo_bar(id__123_35) == id__123_35 +(* + @type: (() => Int); +*) importedValue == 0 +(* + @type: (() => Int); +*) ApalacheCompilation_ModuleToInstantiate_C == 0 +(* + @type: (() => Bool); +*) altInit == x' := 0 +(* + @type: (() => Bool); +*) step == x' := (x + 1) +(* + @type: (() => Bool); +*) altStep == x' := (x + 0) +(* + @type: (() => Bool); +*) inv == x >= 0 +(* + @type: (() => Bool); +*) altInv == x >= 0 +(* + @type: (() => Int); +*) ApalacheCompilation_ModuleToInstantiate_instantiatedValue == ApalacheCompilation_ModuleToInstantiate_C +(* + @type: (() => Bool); +*) init == x' := (importedValue + ApalacheCompilation_ModuleToInstantiate_instantiatedValue) +(* + @type: (() => Bool); +*) q_step == step +(* + @type: (() => Bool); +*) q_init == init ================================================================================ @@ -304,14 +350,29 @@ quint compile --target tlaplus --main ModuleToImport ./testFixture/ApalacheCompi EXTENDS Integers, Sequences, FiniteSets, TLC, Apalache, Variants +(* + @type: (() => Bool); +*) step == TRUE +(* + @type: (() => Int); +*) importedValue == 0 +(* + @type: (() => Bool); +*) init == TRUE +(* + @type: (() => Bool); +*) q_init == init +(* + @type: (() => Bool); +*) q_step == step ================================================================================ @@ -333,10 +394,10 @@ The compiled module is not empty: EXTENDS Integers, Sequences, FiniteSets, TLC, Apalache, Variants -VARIABLE clockSync3_clockSync3Spec_time - -clockSync3_clockSync3Spec_Proc(clockSync3_clockSync3Spec_id_37) == - [id |-> clockSync3_clockSync3Spec_id_37] +VARIABLE + (* + @type: Int; + *) + clockSync3_clockSync3Spec_time -VARIABLE clockSync3_clockSync3Spec_hc ``` From beed65a58b0d9c07e38329f250aee0c556644b4f Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 6 May 2024 15:47:51 -0300 Subject: [PATCH 360/388] Improve formatting of integration tests --- quint/io-cli-tests.md | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/quint/io-cli-tests.md b/quint/io-cli-tests.md index d9744bc60..b1f4227b9 100644 --- a/quint/io-cli-tests.md +++ b/quint/io-cli-tests.md @@ -24,11 +24,15 @@ We want to ensure we do not throw uncaught exceptions when the input file is doesn't exist. - quint parse ../examples/non-existent.file +``` +quint parse ../examples/non-existent.file +``` - error: file ../examples/non-existent.file does not exist +``` +error: file ../examples/non-existent.file does not exist +``` ### User error on parse with junk after modules @@ -37,14 +41,18 @@ We want to ensure that the parser shows an error, when it detects junk in the end of file. - quint parse ./testFixture/modulesAndJunk.qnt 2>&1 | sed 's#.*quint/\(testFixture\)#Q/\1#g' +``` +quint parse ./testFixture/modulesAndJunk.qnt 2>&1 | sed 's#.*quint/\(testFixture\)#Q/\1#g' +``` - Q/testFixture/modulesAndJunk.qnt:9:1 - error: [QNT000] extraneous input 'the' expecting {, 'module', DOCCOMMENT} - 9: the parser - ^^^ +``` +Q/testFixture/modulesAndJunk.qnt:9:1 - error: [QNT000] extraneous input 'the' expecting {, 'module', DOCCOMMENT} +9: the parser + ^^^ - error: parsing failed +error: parsing failed +``` ### User error on parse with invalid input From 6fc173864a82b1a0400addc29d5460628b01fa24 Mon Sep 17 00:00:00 2001 From: Gabriela Moreira Date: Tue, 7 May 2024 09:21:30 -0300 Subject: [PATCH 361/388] Apply suggestions from code review Co-authored-by: Philip Offtermatt <57488781+p-offtermatt@users.noreply.github.com> --- quint/src/effects/NondetChecker.ts | 4 ++-- quint/src/quintError.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/quint/src/effects/NondetChecker.ts b/quint/src/effects/NondetChecker.ts index 55ed3ae04..2b2f43498 100644 --- a/quint/src/effects/NondetChecker.ts +++ b/quint/src/effects/NondetChecker.ts @@ -85,7 +85,7 @@ export class NondetChecker implements IRVisitor { if (body.kind !== 'app' || body.opcode !== 'oneOf') { this.errors.push({ code: 'QNT204', - message: `'oneOf' must be the outtermost expression in a nondet definition`, + message: `'oneOf' must be the outermost expression in a nondet definition`, reference: body.id, data: {}, }) @@ -96,7 +96,7 @@ export class NondetChecker implements IRVisitor { if (expressionType?.type.kind !== 'bool') { this.errors.push({ code: 'QNT205', - message: `nondet bindings can only be used with boolean expressions`, + message: `nondet bindings can only be used in expressions returning a boolean`, reference: expr.id, data: {}, }) diff --git a/quint/src/quintError.ts b/quint/src/quintError.ts index 03a3d6955..71c95f5f9 100644 --- a/quint/src/quintError.ts +++ b/quint/src/quintError.ts @@ -69,7 +69,7 @@ export type ErrorCode = | 'QNT202' /* QNT203: 'oneOf' must be used inside a nondet definition */ | 'QNT203' - /* QNT204: 'oneOf' must be the outtermost expression in a nondet definition */ + /* QNT204: 'oneOf' must be the outermost expression in a nondet definition */ | 'QNT204' /* QNT205: nondet bindings can only be used with boolean expressions */ | 'QNT205' From 69b828066870c602dba3f65398b04bc7c4a8bde9 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 7 May 2024 09:35:07 -0300 Subject: [PATCH 362/388] Inlclude actual expression type in the error msg --- quint/src/effects/NondetChecker.ts | 9 ++++++--- quint/test/effects/NondetChecker.test.ts | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/quint/src/effects/NondetChecker.ts b/quint/src/effects/NondetChecker.ts index 2b2f43498..c3056cb9f 100644 --- a/quint/src/effects/NondetChecker.ts +++ b/quint/src/effects/NondetChecker.ts @@ -18,6 +18,7 @@ import { OpQualifier, QuintApp, QuintDeclaration, QuintLet, QuintOpDef } from '. import { LookupTable } from '../names/base' import { QuintError } from '../quintError' import { TypeScheme } from '../types/base' +import { typeSchemeToString } from '../types/printing' export class NondetChecker implements IRVisitor { private table: LookupTable @@ -92,11 +93,13 @@ export class NondetChecker implements IRVisitor { } // if the opdef is nondet, the return type must be bool - const expressionType = this.types.get(expr.expr.id) - if (expressionType?.type.kind !== 'bool') { + const expressionType = this.types.get(expr.expr.id)! + if (expressionType.type.kind !== 'bool') { this.errors.push({ code: 'QNT205', - message: `nondet bindings can only be used in expressions returning a boolean`, + message: `nondet bindings can only be used with boolean expressions, but expression has type: ${typeSchemeToString( + expressionType + )}`, reference: expr.id, data: {}, }) diff --git a/quint/test/effects/NondetChecker.test.ts b/quint/test/effects/NondetChecker.test.ts index 7df3c8045..a59bb83e1 100644 --- a/quint/test/effects/NondetChecker.test.ts +++ b/quint/test/effects/NondetChecker.test.ts @@ -61,7 +61,7 @@ describe('checkNondets', () => { assert.sameDeepMembers(errors, [ { code: 'QNT204', - message: "'oneOf' must be the outtermost expression in a nondet definition", + message: "'oneOf' must be the outermost expression in a nondet definition", reference: 8n, data: {}, }, @@ -106,7 +106,7 @@ describe('checkNondets', () => { assert.sameDeepMembers(errors, [ { code: 'QNT205', - message: 'nondet bindings can only be used with boolean expressions', + message: 'nondet bindings can only be used with boolean expressions, but expression has type: int', reference: 7n, data: {}, }, From c935b09d5c8f836bc75659e376627d9a2f42da1a Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 7 May 2024 10:07:10 -0300 Subject: [PATCH 363/388] Release v0.19.3 --- CHANGELOG.md | 9 +++++++++ quint/package-lock.json | 4 ++-- quint/package.json | 2 +- quint/src/version.ts | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 038ccf2d0..b7f46b443 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.19.3 -- 2024-05-07 + ### Added - Added static analysis checks to ensure proper usage of `nondet` and `oneOf` (#1431). diff --git a/quint/package-lock.json b/quint/package-lock.json index 7e9b8fb70..93b2f9314 100644 --- a/quint/package-lock.json +++ b/quint/package-lock.json @@ -1,12 +1,12 @@ { "name": "@informalsystems/quint", - "version": "0.19.2", + "version": "0.19.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@informalsystems/quint", - "version": "0.19.2", + "version": "0.19.3", "license": "Apache 2.0", "dependencies": { "@grpc/grpc-js": "^1.8.14", diff --git a/quint/package.json b/quint/package.json index 9ef9ff759..f6d61cc9b 100644 --- a/quint/package.json +++ b/quint/package.json @@ -1,6 +1,6 @@ { "name": "@informalsystems/quint", - "version": "0.19.2", + "version": "0.19.3", "description": "Core tool for the Quint specification language", "keywords": [ "temporal", diff --git a/quint/src/version.ts b/quint/src/version.ts index 8e013601f..0c74e61b1 100644 --- a/quint/src/version.ts +++ b/quint/src/version.ts @@ -1,2 +1,2 @@ // Generated by genversion. -export const version = '0.19.2' +export const version = '0.19.3' From 8039919c846b23c8d9f24b8afb107b4f608b78fc Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 7 May 2024 10:24:48 -0300 Subject: [PATCH 364/388] VSCode Release v0.14.2 --- vscode/quint-vscode/CHANGELOG.md | 9 +++++++++ vscode/quint-vscode/package-lock.json | 4 ++-- vscode/quint-vscode/package.json | 2 +- vscode/quint-vscode/server/package-lock.json | 18 +++++++++--------- vscode/quint-vscode/server/package.json | 4 ++-- 5 files changed, 23 insertions(+), 14 deletions(-) diff --git a/vscode/quint-vscode/CHANGELOG.md b/vscode/quint-vscode/CHANGELOG.md index 2e94f2ad2..bd2100570 100644 --- a/vscode/quint-vscode/CHANGELOG.md +++ b/vscode/quint-vscode/CHANGELOG.md @@ -14,6 +14,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed ### Security +## v0.14.2 -- 2024-05-07 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + ## v0.14.1 -- 2024-04-09 ### Added diff --git a/vscode/quint-vscode/package-lock.json b/vscode/quint-vscode/package-lock.json index fd065d03f..133abcce9 100644 --- a/vscode/quint-vscode/package-lock.json +++ b/vscode/quint-vscode/package-lock.json @@ -1,12 +1,12 @@ { "name": "quint-vscode", - "version": "0.14.1", + "version": "0.14.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "quint-vscode", - "version": "0.14.1", + "version": "0.14.2", "hasInstallScript": true, "dependencies": { "vscode-languageclient": "^7.0.0" diff --git a/vscode/quint-vscode/package.json b/vscode/quint-vscode/package.json index b80840a9a..39159c044 100644 --- a/vscode/quint-vscode/package.json +++ b/vscode/quint-vscode/package.json @@ -3,7 +3,7 @@ "displayName": "Quint", "description": "Language support for Quint specifications", "icon": "./icons/logo.png", - "version": "0.14.1", + "version": "0.14.2", "publisher": "informal", "engines": { "vscode": "^1.52.0" diff --git a/vscode/quint-vscode/server/package-lock.json b/vscode/quint-vscode/server/package-lock.json index 61531e915..9a2ee5d8a 100644 --- a/vscode/quint-vscode/server/package-lock.json +++ b/vscode/quint-vscode/server/package-lock.json @@ -1,15 +1,15 @@ { "name": "@informalsystems/quint-language-server", - "version": "0.14.1", + "version": "0.14.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint-language-server", - "version": "0.14.1", + "version": "0.14.2", "license": "Apache 2.0", "dependencies": { - "@informalsystems/quint": "^0.19.2", + "@informalsystems/quint": "^0.19.3", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" @@ -476,9 +476,9 @@ "dev": true }, "node_modules/@informalsystems/quint": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.19.2.tgz", - "integrity": "sha512-U+KVbhr8dp9kp2q72MVwKYlGN411ORzUYECD4Fkcnck16BwLbGDUqbnvlzfBRmqNv7VJKgmAxVOxn/gRDcUrYQ==", + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.19.3.tgz", + "integrity": "sha512-eeVOYTXex3fafH20/IwKuWZ8fzbJ+tQlUuZrTuFPW6HSl5+L304ITMgKQN06bNN4FWCQ49wjA+rDvF6fxG30tg==", "dependencies": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", @@ -7182,9 +7182,9 @@ "dev": true }, "@informalsystems/quint": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.19.2.tgz", - "integrity": "sha512-U+KVbhr8dp9kp2q72MVwKYlGN411ORzUYECD4Fkcnck16BwLbGDUqbnvlzfBRmqNv7VJKgmAxVOxn/gRDcUrYQ==", + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.19.3.tgz", + "integrity": "sha512-eeVOYTXex3fafH20/IwKuWZ8fzbJ+tQlUuZrTuFPW6HSl5+L304ITMgKQN06bNN4FWCQ49wjA+rDvF6fxG30tg==", "requires": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", diff --git a/vscode/quint-vscode/server/package.json b/vscode/quint-vscode/server/package.json index 069a23dec..1c45217b6 100644 --- a/vscode/quint-vscode/server/package.json +++ b/vscode/quint-vscode/server/package.json @@ -1,7 +1,7 @@ { "name": "@informalsystems/quint-language-server", "description": "Language Server for the Quint specification language", - "version": "0.14.1", + "version": "0.14.2", "author": "Informal Systems", "contributors": [ { @@ -43,7 +43,7 @@ "test/**/*.ts" ], "dependencies": { - "@informalsystems/quint": "^0.19.2", + "@informalsystems/quint": "^0.19.3", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" From 1b0bfe6ffd9d506fcbd462594066032c48b05029 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 13 May 2024 20:50:53 -0300 Subject: [PATCH 365/388] Handle cases where table entries or types are missing --- quint/src/effects/NondetChecker.ts | 15 +++++++++++++-- quint/test/effects/NondetChecker.test.ts | 17 +++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/quint/src/effects/NondetChecker.ts b/quint/src/effects/NondetChecker.ts index c3056cb9f..9952e61ef 100644 --- a/quint/src/effects/NondetChecker.ts +++ b/quint/src/effects/NondetChecker.ts @@ -49,7 +49,13 @@ export class NondetChecker implements IRVisitor { enterOpDef(def: QuintOpDef) { this.lastDefQualifier = def.qualifier - if (def.qualifier === 'nondet' && this.table.get(def.id)!.depth === 0) { + const entry = this.table.get(def.id) + if (!entry) { + // A name resolution error should have been reported already + return + } + + if (def.qualifier === 'nondet' && entry.depth === 0) { this.errors.push({ code: 'QNT206', message: `'nondet' can only be used inside actions, not at the top level`, @@ -93,7 +99,12 @@ export class NondetChecker implements IRVisitor { } // if the opdef is nondet, the return type must be bool - const expressionType = this.types.get(expr.expr.id)! + const expressionType = this.types.get(expr.expr.id) + if (!expressionType) { + // A type error should have been reported already + return + } + if (expressionType.type.kind !== 'bool') { this.errors.push({ code: 'QNT205', diff --git a/quint/test/effects/NondetChecker.test.ts b/quint/test/effects/NondetChecker.test.ts index a59bb83e1..6499bdc95 100644 --- a/quint/test/effects/NondetChecker.test.ts +++ b/quint/test/effects/NondetChecker.test.ts @@ -112,4 +112,21 @@ describe('checkNondets', () => { }, ]) }) + + it('can survive missing types and lookup table entries', () => { + const text = `module A { + var x: int + + nondet top_level = Set(1,2).oneOf() + val non_action = { nondet bar = Set(1,2).oneOf() bar } + }` + + const { module } = parseAndTypecheck(text) + const table = new Map() + const types = new Map() + + const errors = new NondetChecker(table).checkNondets(types, module.declarations) + + assert.sameDeepMembers(errors, []) + }) }) From 9226c6fe211b27b76e7abfd8d424f8e748a34a11 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 13 May 2024 20:59:23 -0300 Subject: [PATCH 366/388] Add CHANGELOG entry --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b7f46b443..8c91227c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Deprecated ### Removed ### Fixed + +- Fixed a bug introduced in v0.19.3 here the analyzer would crash if there were + some specific type errors (#1436) + ### Security ## v0.19.3 -- 2024-05-07 From 0dd791319bd4911c28c50890b14a91795fbc22bc Mon Sep 17 00:00:00 2001 From: Gabriela Moreira Date: Tue, 14 May 2024 08:04:50 -0300 Subject: [PATCH 367/388] Update CHANGELOG.md Co-authored-by: Philip Offtermatt <57488781+p-offtermatt@users.noreply.github.com> --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c91227c9..a391745ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,7 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Removed ### Fixed -- Fixed a bug introduced in v0.19.3 here the analyzer would crash if there were +- Fixed a bug introduced in v0.19.3 where the analyzer would crash if there were some specific type errors (#1436) ### Security From f20634f5ce35132fb3a4775a4ebdb4675497bae6 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 14 May 2024 08:20:42 -0300 Subject: [PATCH 368/388] Document assumption about type/effect maps --- quint/src/effects/inferrer.ts | 5 +++-- quint/src/types/inferrer.ts | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/quint/src/effects/inferrer.ts b/quint/src/effects/inferrer.ts index e31f08e69..61538f38d 100644 --- a/quint/src/effects/inferrer.ts +++ b/quint/src/effects/inferrer.ts @@ -56,8 +56,9 @@ export class EffectInferrer implements IRVisitor { } /** - * Infers an effect for every expression in a module based on - * the definitions table for that module + * Infers an effect for every expression in a module based on the definitions + * table for that module. If there are missing effects in the effect map, + * there will be at least one error. * * @param declarations: the list of QuintDeclarations to infer effects for * diff --git a/quint/src/types/inferrer.ts b/quint/src/types/inferrer.ts index f1bb378a9..517101054 100644 --- a/quint/src/types/inferrer.ts +++ b/quint/src/types/inferrer.ts @@ -30,7 +30,8 @@ export class TypeInferrer extends ConstraintGeneratorVisitor { } /** - * Infers a type for each expression in a list of QuintDeclarations + * Infers a type for each expression in a list of QuintDeclarations. If there + * are missing types in the type map, there will be at least one error. * * @param declarations: the list of QuintDeclarations to infer types for * From f044d23afcaaed4ba0cbb681f6d3a073035cfc88 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 14 May 2024 09:02:04 -0300 Subject: [PATCH 369/388] Release v0.19.4 --- CHANGELOG.md | 9 +++++++++ quint/package-lock.json | 4 ++-- quint/package.json | 2 +- quint/src/version.ts | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a391745ab..26c9814eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.19.4 -- 2024-05-14 + ### Added ### Changed ### Deprecated diff --git a/quint/package-lock.json b/quint/package-lock.json index 93b2f9314..ca404595b 100644 --- a/quint/package-lock.json +++ b/quint/package-lock.json @@ -1,12 +1,12 @@ { "name": "@informalsystems/quint", - "version": "0.19.3", + "version": "0.19.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@informalsystems/quint", - "version": "0.19.3", + "version": "0.19.4", "license": "Apache 2.0", "dependencies": { "@grpc/grpc-js": "^1.8.14", diff --git a/quint/package.json b/quint/package.json index f6d61cc9b..3ae4006bc 100644 --- a/quint/package.json +++ b/quint/package.json @@ -1,6 +1,6 @@ { "name": "@informalsystems/quint", - "version": "0.19.3", + "version": "0.19.4", "description": "Core tool for the Quint specification language", "keywords": [ "temporal", diff --git a/quint/src/version.ts b/quint/src/version.ts index 0c74e61b1..25e1ed200 100644 --- a/quint/src/version.ts +++ b/quint/src/version.ts @@ -1,2 +1,2 @@ // Generated by genversion. -export const version = '0.19.3' +export const version = '0.19.4' From 385be70a9f4bf00d4a6f3bc9e71d80a3df9e4d53 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 14 May 2024 09:23:10 -0300 Subject: [PATCH 370/388] VSCode Release v0.14.3 --- vscode/quint-vscode/CHANGELOG.md | 9 + vscode/quint-vscode/package-lock.json | 4 +- vscode/quint-vscode/package.json | 2 +- vscode/quint-vscode/server/package-lock.json | 277 ++++++++++--------- vscode/quint-vscode/server/package.json | 4 +- 5 files changed, 160 insertions(+), 136 deletions(-) diff --git a/vscode/quint-vscode/CHANGELOG.md b/vscode/quint-vscode/CHANGELOG.md index bd2100570..d6937519b 100644 --- a/vscode/quint-vscode/CHANGELOG.md +++ b/vscode/quint-vscode/CHANGELOG.md @@ -14,6 +14,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed ### Security +## v0.14.3 -- 2024-05-14 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + ## v0.14.2 -- 2024-05-07 ### Added diff --git a/vscode/quint-vscode/package-lock.json b/vscode/quint-vscode/package-lock.json index 133abcce9..d90b5c70d 100644 --- a/vscode/quint-vscode/package-lock.json +++ b/vscode/quint-vscode/package-lock.json @@ -1,12 +1,12 @@ { "name": "quint-vscode", - "version": "0.14.2", + "version": "0.14.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "quint-vscode", - "version": "0.14.2", + "version": "0.14.3", "hasInstallScript": true, "dependencies": { "vscode-languageclient": "^7.0.0" diff --git a/vscode/quint-vscode/package.json b/vscode/quint-vscode/package.json index 39159c044..d61398080 100644 --- a/vscode/quint-vscode/package.json +++ b/vscode/quint-vscode/package.json @@ -3,7 +3,7 @@ "displayName": "Quint", "description": "Language support for Quint specifications", "icon": "./icons/logo.png", - "version": "0.14.2", + "version": "0.14.3", "publisher": "informal", "engines": { "vscode": "^1.52.0" diff --git a/vscode/quint-vscode/server/package-lock.json b/vscode/quint-vscode/server/package-lock.json index 9a2ee5d8a..321c6d4fe 100644 --- a/vscode/quint-vscode/server/package-lock.json +++ b/vscode/quint-vscode/server/package-lock.json @@ -1,15 +1,15 @@ { "name": "@informalsystems/quint-language-server", - "version": "0.14.2", + "version": "0.14.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint-language-server", - "version": "0.14.2", + "version": "0.14.3", "license": "Apache 2.0", "dependencies": { - "@informalsystems/quint": "^0.19.3", + "@informalsystems/quint": "^0.19.4", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" @@ -355,25 +355,25 @@ } }, "node_modules/@grpc/grpc-js": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.2.tgz", - "integrity": "sha512-Lf2pUhNTaviEdEaGgjU+29qw3arX7Qd/45q66F3z1EV5hroE6wM9xSHPvjB8EY+b1RmKZgwnLWXQorC6fZ9g5g==", + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.7.tgz", + "integrity": "sha512-ZMBVjSeDAz3tFSehyO6Pd08xZT1HfIwq3opbeM4cDlBh52gmwp0wVIPcQur53NN0ac68HMZ/7SF2rGRD5KmVmg==", "dependencies": { - "@grpc/proto-loader": "^0.7.8", - "@types/node": ">=12.12.47" + "@grpc/proto-loader": "^0.7.13", + "@js-sdsl/ordered-map": "^4.4.2" }, "engines": { - "node": "^8.13.0 || >=10.10.0" + "node": ">=12.10.0" } }, "node_modules/@grpc/proto-loader": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.9.tgz", - "integrity": "sha512-YJsOehVXzgurc+lLAxYnlSMc1p/Gu6VAvnfx0ATi2nzvr0YZcjhmZDeY8SeAKv1M7zE3aEJH0Xo9mK1iZ8GYoQ==", + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", + "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", - "protobufjs": "^7.2.4", + "protobufjs": "^7.2.5", "yargs": "^17.7.2" }, "bin": { @@ -476,9 +476,9 @@ "dev": true }, "node_modules/@informalsystems/quint": { - "version": "0.19.3", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.19.3.tgz", - "integrity": "sha512-eeVOYTXex3fafH20/IwKuWZ8fzbJ+tQlUuZrTuFPW6HSl5+L304ITMgKQN06bNN4FWCQ49wjA+rDvF6fxG30tg==", + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.19.4.tgz", + "integrity": "sha512-J2EfZRQHIjlOnHx1NvP4I+5egtw2QpYZjswxyUvWOdHShX7w9CXLkIksjFcPLdId1mkiN+zhjRHbm3V2l2Q25g==", "dependencies": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", @@ -615,6 +615,15 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -651,12 +660,11 @@ } }, "node_modules/@octokit/endpoint": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.0.tgz", - "integrity": "sha512-szrQhiqJ88gghWY2Htt8MqUDO6++E/EIXqJ2ZEp5ma3uGS46o7LZAzSLt49myB7rT+Hfw5Y6gO3LmOxGzHijAQ==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.5.tgz", + "integrity": "sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==", "dependencies": { - "@octokit/types": "^11.0.0", - "is-plain-object": "^5.0.0", + "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" }, "engines": { @@ -664,19 +672,18 @@ } }, "node_modules/@octokit/openapi-types": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", - "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" + "version": "22.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", + "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==" }, "node_modules/@octokit/request": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.1.tgz", - "integrity": "sha512-8N+tdUz4aCqQmXl8FpHYfKG9GelDFd7XGVzyN8rc6WxVlYcfpHECnuRkgquzz+WzvHTK62co5di8gSXnzASZPQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.0.tgz", + "integrity": "sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==", "dependencies": { - "@octokit/endpoint": "^9.0.0", - "@octokit/request-error": "^5.0.0", - "@octokit/types": "^11.1.0", - "is-plain-object": "^5.0.0", + "@octokit/endpoint": "^9.0.1", + "@octokit/request-error": "^5.1.0", + "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" }, "engines": { @@ -684,11 +691,11 @@ } }, "node_modules/@octokit/request-error": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.0.tgz", - "integrity": "sha512-1ue0DH0Lif5iEqT52+Rf/hf0RmGO9NWFjrzmrkArpG9trFfDM/efx00BJHdLGuro4BR/gECxCU2Twf5OKrRFsQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.0.tgz", + "integrity": "sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==", "dependencies": { - "@octokit/types": "^11.0.0", + "@octokit/types": "^13.1.0", "deprecation": "^2.0.0", "once": "^1.4.0" }, @@ -697,11 +704,11 @@ } }, "node_modules/@octokit/types": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-11.1.0.tgz", - "integrity": "sha512-Fz0+7GyLm/bHt8fwEqgvRBWwIV1S6wRRyq+V6exRKLVWaKGsuy6H9QFYeBVDV7rK6fO3XwHgQOPxv+cLj2zpXQ==", + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.5.0.tgz", + "integrity": "sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==", "dependencies": { - "@octokit/openapi-types": "^18.0.0" + "@octokit/openapi-types": "^22.2.0" } }, "node_modules/@protobufjs/aspromise": { @@ -822,9 +829,9 @@ "dev": true }, "node_modules/@types/line-column": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/line-column/-/line-column-1.0.0.tgz", - "integrity": "sha512-wbw+IDRw/xY/RGy+BL6f4Eey4jsUgHQrMuA4Qj0CSG3x/7C2Oc57pmRoM2z3M4DkylWRz+G1pfX06sCXQm0J+w==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/line-column/-/line-column-1.0.2.tgz", + "integrity": "sha512-099oFQmp/Tlf20xW5XI5R4F69N6lF/zQ09XDzc3R5BOLFlqIotgKoNIyj0HD4fQLWcGDreDJv8k/BkLJscrDrw==" }, "node_modules/@types/lodash": { "version": "4.14.191", @@ -848,12 +855,13 @@ "node_modules/@types/node": { "version": "12.20.55", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true }, "node_modules/@types/seedrandom": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-kopEpYpFQvQdYsZkZVwht/0THHmTFFYXDaqV/lM45eweJ8kcGVDgZHs0RVTolSq55UPZNmjhKc9r7UvLu/mQQg==" + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.8.tgz", + "integrity": "sha512-TY1eezMU2zH2ozQoAFAQFOPpvP15g+ZgSfTZt31AUUH/Rxtnz3H+A/Sv1Snw2/amp//omibc+AEkTaA8KUeOLQ==" }, "node_modules/@types/semver": { "version": "7.3.13", @@ -4630,9 +4638,9 @@ } }, "node_modules/immutable": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", - "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==" + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz", + "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==" }, "node_modules/import-fresh": { "version": "3.3.0", @@ -4899,14 +4907,6 @@ "node": ">=8" } }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -5757,9 +5757,9 @@ } }, "node_modules/protobufjs": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz", - "integrity": "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz", + "integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==", "hasInstallScript": true, "dependencies": { "@protobufjs/aspromise": "^1.1.2", @@ -5780,9 +5780,12 @@ } }, "node_modules/protobufjs/node_modules/@types/node": { - "version": "20.5.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz", - "integrity": "sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==" + "version": "20.12.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.11.tgz", + "integrity": "sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==", + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/punycode": { "version": "2.1.1", @@ -6344,9 +6347,9 @@ } }, "node_modules/tar": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -6561,10 +6564,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, "node_modules/universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==" }, "node_modules/uri-js": { "version": "4.4.1", @@ -7093,22 +7101,22 @@ } }, "@grpc/grpc-js": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.2.tgz", - "integrity": "sha512-Lf2pUhNTaviEdEaGgjU+29qw3arX7Qd/45q66F3z1EV5hroE6wM9xSHPvjB8EY+b1RmKZgwnLWXQorC6fZ9g5g==", + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.7.tgz", + "integrity": "sha512-ZMBVjSeDAz3tFSehyO6Pd08xZT1HfIwq3opbeM4cDlBh52gmwp0wVIPcQur53NN0ac68HMZ/7SF2rGRD5KmVmg==", "requires": { - "@grpc/proto-loader": "^0.7.8", - "@types/node": ">=12.12.47" + "@grpc/proto-loader": "^0.7.13", + "@js-sdsl/ordered-map": "^4.4.2" } }, "@grpc/proto-loader": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.9.tgz", - "integrity": "sha512-YJsOehVXzgurc+lLAxYnlSMc1p/Gu6VAvnfx0ATi2nzvr0YZcjhmZDeY8SeAKv1M7zE3aEJH0Xo9mK1iZ8GYoQ==", + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", + "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", "requires": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", - "protobufjs": "^7.2.4", + "protobufjs": "^7.2.5", "yargs": "^17.7.2" }, "dependencies": { @@ -7182,9 +7190,9 @@ "dev": true }, "@informalsystems/quint": { - "version": "0.19.3", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.19.3.tgz", - "integrity": "sha512-eeVOYTXex3fafH20/IwKuWZ8fzbJ+tQlUuZrTuFPW6HSl5+L304ITMgKQN06bNN4FWCQ49wjA+rDvF6fxG30tg==", + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.19.4.tgz", + "integrity": "sha512-J2EfZRQHIjlOnHx1NvP4I+5egtw2QpYZjswxyUvWOdHShX7w9CXLkIksjFcPLdId1mkiN+zhjRHbm3V2l2Q25g==", "requires": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", @@ -7293,6 +7301,11 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, + "@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==" + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -7320,48 +7333,46 @@ } }, "@octokit/endpoint": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.0.tgz", - "integrity": "sha512-szrQhiqJ88gghWY2Htt8MqUDO6++E/EIXqJ2ZEp5ma3uGS46o7LZAzSLt49myB7rT+Hfw5Y6gO3LmOxGzHijAQ==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.5.tgz", + "integrity": "sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==", "requires": { - "@octokit/types": "^11.0.0", - "is-plain-object": "^5.0.0", + "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" } }, "@octokit/openapi-types": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", - "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" + "version": "22.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", + "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==" }, "@octokit/request": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.1.tgz", - "integrity": "sha512-8N+tdUz4aCqQmXl8FpHYfKG9GelDFd7XGVzyN8rc6WxVlYcfpHECnuRkgquzz+WzvHTK62co5di8gSXnzASZPQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.0.tgz", + "integrity": "sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==", "requires": { - "@octokit/endpoint": "^9.0.0", - "@octokit/request-error": "^5.0.0", - "@octokit/types": "^11.1.0", - "is-plain-object": "^5.0.0", + "@octokit/endpoint": "^9.0.1", + "@octokit/request-error": "^5.1.0", + "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" } }, "@octokit/request-error": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.0.tgz", - "integrity": "sha512-1ue0DH0Lif5iEqT52+Rf/hf0RmGO9NWFjrzmrkArpG9trFfDM/efx00BJHdLGuro4BR/gECxCU2Twf5OKrRFsQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.0.tgz", + "integrity": "sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==", "requires": { - "@octokit/types": "^11.0.0", + "@octokit/types": "^13.1.0", "deprecation": "^2.0.0", "once": "^1.4.0" } }, "@octokit/types": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-11.1.0.tgz", - "integrity": "sha512-Fz0+7GyLm/bHt8fwEqgvRBWwIV1S6wRRyq+V6exRKLVWaKGsuy6H9QFYeBVDV7rK6fO3XwHgQOPxv+cLj2zpXQ==", + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.5.0.tgz", + "integrity": "sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==", "requires": { - "@octokit/openapi-types": "^18.0.0" + "@octokit/openapi-types": "^22.2.0" } }, "@protobufjs/aspromise": { @@ -7482,9 +7493,9 @@ "dev": true }, "@types/line-column": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/line-column/-/line-column-1.0.0.tgz", - "integrity": "sha512-wbw+IDRw/xY/RGy+BL6f4Eey4jsUgHQrMuA4Qj0CSG3x/7C2Oc57pmRoM2z3M4DkylWRz+G1pfX06sCXQm0J+w==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/line-column/-/line-column-1.0.2.tgz", + "integrity": "sha512-099oFQmp/Tlf20xW5XI5R4F69N6lF/zQ09XDzc3R5BOLFlqIotgKoNIyj0HD4fQLWcGDreDJv8k/BkLJscrDrw==" }, "@types/lodash": { "version": "4.14.191", @@ -7508,12 +7519,13 @@ "@types/node": { "version": "12.20.55", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true }, "@types/seedrandom": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-kopEpYpFQvQdYsZkZVwht/0THHmTFFYXDaqV/lM45eweJ8kcGVDgZHs0RVTolSq55UPZNmjhKc9r7UvLu/mQQg==" + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.8.tgz", + "integrity": "sha512-TY1eezMU2zH2ozQoAFAQFOPpvP15g+ZgSfTZt31AUUH/Rxtnz3H+A/Sv1Snw2/amp//omibc+AEkTaA8KUeOLQ==" }, "@types/semver": { "version": "7.3.13", @@ -10317,9 +10329,9 @@ "dev": true }, "immutable": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", - "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==" + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz", + "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==" }, "import-fresh": { "version": "3.3.0", @@ -10510,11 +10522,6 @@ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" - }, "is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -11153,9 +11160,9 @@ } }, "protobufjs": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz", - "integrity": "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz", + "integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==", "requires": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", @@ -11172,9 +11179,12 @@ }, "dependencies": { "@types/node": { - "version": "20.5.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz", - "integrity": "sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==" + "version": "20.12.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.11.tgz", + "integrity": "sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==", + "requires": { + "undici-types": "~5.26.4" + } } } }, @@ -11575,9 +11585,9 @@ } }, "tar": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -11725,10 +11735,15 @@ "which-boxed-primitive": "^1.0.2" } }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, "universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==" }, "uri-js": { "version": "4.4.1", diff --git a/vscode/quint-vscode/server/package.json b/vscode/quint-vscode/server/package.json index 1c45217b6..88b0865a0 100644 --- a/vscode/quint-vscode/server/package.json +++ b/vscode/quint-vscode/server/package.json @@ -1,7 +1,7 @@ { "name": "@informalsystems/quint-language-server", "description": "Language Server for the Quint specification language", - "version": "0.14.2", + "version": "0.14.3", "author": "Informal Systems", "contributors": [ { @@ -43,7 +43,7 @@ "test/**/*.ts" ], "dependencies": { - "@informalsystems/quint": "^0.19.3", + "@informalsystems/quint": "^0.19.4", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" From 65b1c8f5e87a0eeea945bf2ccef7ebe9aea0903e Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 20 May 2024 08:16:07 -0300 Subject: [PATCH 371/388] Use optional values for nondet picks --- quint/src/runtime/impl/compilerImpl.ts | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 04807d3b9..8843378dd 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -217,6 +217,14 @@ export class CompilerVisitor implements IRVisitor { return this.errorTracker.runtimeErrors } + private nondetNames() { + return [...this.lookupTable.values()].filter(d => d.kind === 'def' && d.qualifier === 'nondet').map(d => d.name) + } + + private defaultNondetPicks() { + return rv.mkRecord(OrderedMap(this.nondetNames().map(n => [n, rv.mkVariant('None', rv.mkTuple([]))]))) + } + exitOpDef(opdef: ir.QuintOpDef) { // Either a runtime value, or a def, action, etc. // All of them are compiled to callables, which may have zero parameters. @@ -243,7 +251,7 @@ export class CompilerVisitor implements IRVisitor { eval: () => { if (this.actionTaken.isNone() && this.nondetPicks.isNone()) { this.actionTaken = just(rv.mkStr(opdef.name)) - this.nondetPicks = just(rv.mkRecord([])) + this.nondetPicks = just(this.defaultNondetPicks()) } if (app.opcode === inputDefName) { @@ -280,7 +288,7 @@ export class CompilerVisitor implements IRVisitor { eval: (args?: Maybe[]) => { if (this.actionTaken.isNone() && this.nondetPicks.isNone()) { this.actionTaken = just(rv.mkStr(opdef.name)) - this.nondetPicks = just(rv.mkRecord([])) + this.nondetPicks = just(this.defaultNondetPicks()) } const r: Maybe = unwrappedValue.eval(args) @@ -340,15 +348,11 @@ export class CompilerVisitor implements IRVisitor { const result = undecoratedEval() if (result.isJust() && qualifier === 'nondet') { - if (this.nondetPicks.isJust()) { - this.nondetPicks = just( - rv.mkRecord( - this.nondetPicks.value!.toOrderedMap().set(letDef.opdef.name, cachedValue.value as RuntimeValue) - ) - ) - } else { - this.nondetPicks = just(rv.mkRecord([[letDef.opdef.name, cachedValue.value as RuntimeValue]])) + if (this.nondetPicks.isNone()) { + this.nondetPicks = just(this.defaultNondetPicks()) } + const value = rv.mkVariant('Some', cachedValue.value as RuntimeValue) + this.nondetPicks = just(rv.mkRecord(this.nondetPicks.value!.toOrderedMap().set(letDef.opdef.name, value))) } boundValue.eval = boundValueEval return result From 0f93187ba4e481fb22518c7b58d96683b7072ce1 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 20 May 2024 08:19:54 -0300 Subject: [PATCH 372/388] Update unshadowing so it doesn't rename thigs without need --- quint/src/names/base.ts | 4 +++- quint/src/names/collector.ts | 2 +- quint/src/names/unshadower.ts | 10 ++++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/quint/src/names/base.ts b/quint/src/names/base.ts index 2451fbcc7..bd1f3d9c0 100644 --- a/quint/src/names/base.ts +++ b/quint/src/names/base.ts @@ -43,8 +43,10 @@ export type LookupDefinition = (QuintDef | ({ kind: 'param' } & QuintLambdaParam * Some types in `QuintDef` already have a `typeAnnotation` field. This * ensures that this field is always accessible */ typeAnnotation?: QuintType - /** optional depth of the definition, 0 if top-level. Only for `QuintOpDef`. */ + /* optional depth of the definition, 0 if top-level. Only for `QuintOpDef`. */ depth?: number + /* optional flag to tell if this is shadowing another def, therefore needing to be unshadowed during compilation */ + shadowing?: boolean } /** diff --git a/quint/src/names/collector.ts b/quint/src/names/collector.ts index 86918a9cc..d06be5cde 100644 --- a/quint/src/names/collector.ts +++ b/quint/src/names/collector.ts @@ -288,7 +288,7 @@ export class NameCollector implements IRVisitor { identifier, existingEntries .filter(entry => entry.id !== def.id) - .concat([{ ...addNamespacesToDef(def, namespaces), importedFrom }]) + .concat([{ ...addNamespacesToDef(def, namespaces), importedFrom, shadowing: conflictingEntries.length > 0 }]) ) } diff --git a/quint/src/names/unshadower.ts b/quint/src/names/unshadower.ts index 45f8ecf0d..b6ca0e2ba 100644 --- a/quint/src/names/unshadower.ts +++ b/quint/src/names/unshadower.ts @@ -41,6 +41,11 @@ class Unshadower implements IRTransformer { enterLambda(lambda: QuintLambda): QuintLambda { const newParams: QuintLambdaParameter[] = lambda.params.map(p => { + if (!this.lookupTable.get(p.id)?.shadowing) { + // nothing to do + return p + } + const newName = `${p.name}_${lambda.id}` this.nestedNames.set(p.id, newName) @@ -50,6 +55,11 @@ class Unshadower implements IRTransformer { } enterLet(expr: QuintLet): QuintLet { + if (!this.lookupTable.get(expr.opdef.id)?.shadowing) { + // nothing to do + return expr + } + const newName = `${expr.opdef.name}_${expr.id}` this.nestedNames.set(expr.opdef.id, newName) From c5c1133b204059dbaaea64bce957bec656cd4e99 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 20 May 2024 10:39:15 -0300 Subject: [PATCH 373/388] Add integration tests for --mbt flag --- quint/io-cli-tests.md | 130 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) diff --git a/quint/io-cli-tests.md b/quint/io-cli-tests.md index d9744bc60..55d9ca9b3 100644 --- a/quint/io-cli-tests.md +++ b/quint/io-cli-tests.md @@ -440,6 +440,40 @@ Use --verbosity=3 to show executions. error: Invariant violated ``` +### Run finds an invariant violation with metadata + +The command `run` finds an invariant violation and outputs metadata for MBT, when given the `--mbt` flag. + + +``` +output=$(quint run --seed=0x308623f2a48e7 --mbt --max-steps=4 \ + --invariant='n < 10' ../examples/language-features/counters.qnt 2>&1) +exit_code=$? +echo "$output" | sed -e 's/([0-9]*ms)/(duration)/g' -e 's#^.*counters.qnt# HOME/counters.qnt#g' +exit $exit_code +``` + + + +``` +An example execution: + +[State 0] { action_taken: "q::init", n: 1, nondet_picks: { } } + +[State 1] { action_taken: "OnPositive", n: 2, nondet_picks: { } } + +[State 2] { action_taken: "OnPositive", n: 3, nondet_picks: { } } + +[State 3] { action_taken: "OnDivByThree", n: 6, nondet_picks: { } } + +[State 4] { action_taken: "OnDivByThree", n: 12, nondet_picks: { } } + +[violation] Found an issue (duration). +Use --seed=0x308623f2a48e7 to reproduce. +Use --verbosity=3 to show executions. +error: Invariant violated +``` + ### Run finds an example The command `run` finds an example. @@ -715,6 +749,102 @@ rm out-itf-example.itf.json ] ``` +### Run outputs ITF with metadata + + +``` +quint run --out-itf=out-itf-mbt-example.itf.json --max-steps=5 --seed=123 \ + --invariant=totalSupplyDoesNotOverflowInv --mbt\ + ../examples/solidity/Coin/coin.qnt +cat out-itf-mbt-example.itf.json | jq '.states[1]' +rm out-itf-mbt-example.itf.json +``` + + +``` +{ + "#meta": { + "index": 1 + }, + "action_taken": "mint", + "balances": { + "#map": [ + [ + "alice", + { + "#bigint": "0" + } + ], + [ + "bob", + { + "#bigint": "111009104957917492842738448433884729279015865072041681905260877596484059410831" + } + ], + [ + "charlie", + { + "#bigint": "0" + } + ], + [ + "eve", + { + "#bigint": "0" + } + ], + [ + "null", + { + "#bigint": "0" + } + ] + ] + }, + "minter": "bob", + "nondet_picks": { + "amount_189": { + "tag": "Some", + "value": { + "#bigint": "111009104957917492842738448433884729279015865072041681905260877596484059410831" + } + }, + "eveToBob_295": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "mintBob_296": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "mintEve_297": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "receiver_190": { + "tag": "Some", + "value": "bob" + }, + "sender_191": { + "tag": "Some", + "value": "bob" + }, + "sender_75": { + "tag": "None", + "value": { + "#tup": [] + } + } + } +} +``` + ### Run without violation outputs ITF From 027c3e6697515b80854aecdcc11b4aed8fff689d Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 20 May 2024 10:39:33 -0300 Subject: [PATCH 374/388] Update docstrings --- quint/src/runtime/compile.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/quint/src/runtime/compile.ts b/quint/src/runtime/compile.ts index 967427963..b34126606 100644 --- a/quint/src/runtime/compile.ts +++ b/quint/src/runtime/compile.ts @@ -132,6 +132,7 @@ export function contextNameLookup( * @param evaluationState the state of the compiler visitor * @param lookupTable lookup table as produced by the parser * @param rand the random number generator + * @param storeMetadata whether to store metadata in the trace states * @param defs the definitions to compile * @returns the compilation context */ @@ -168,6 +169,7 @@ export function compile( * @param state - The current compilation state * @param evaluationState - The current evaluation state * @param rng - The random number generator + * @param storeMetadata - whether to store metadata in the trace states * @param expr - The Quint exporession to be compiled * * @returns A compilation context with the compiled expression or its errors @@ -195,6 +197,7 @@ export function compileExpr( * @param state - The current compilation state * @param evaluationState - The current evaluation state * @param rng - The random number generator + * @param storeMetadata - whether to store metadata in the trace states * @param decls - The Quint declarations to be compiled * * @returns A compilation context with the compiled definition or its errors @@ -269,6 +272,7 @@ export function compileDecls( * @param mainName the name of the module that may contain state varibles * @param execListener execution listener * @param rand the random number generator + * @param storeMetadata whether to store metadata in the trace states * @returns the compilation context */ export function compileFromCode( From 6a1ec77aa77248ccb407b6f57924bc70b3f3377c Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 20 May 2024 10:45:59 -0300 Subject: [PATCH 375/388] Improve cli flag description --- quint/src/cli.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/cli.ts b/quint/src/cli.ts index c0fb17326..0aacd730b 100755 --- a/quint/src/cli.ts +++ b/quint/src/cli.ts @@ -248,7 +248,7 @@ const runCmd = { default: verbosity.defaultLevel, }) .option('mbt', { - desc: 'whether to produce info to be used by model-based testing', + desc: 'whether to produce metadata to be used by model-based testing', type: 'boolean', default: false, }), From f1cd39b47ddc32d69b2534a1b660943a30757070 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 20 May 2024 12:10:50 -0300 Subject: [PATCH 376/388] Improve initialization of `nondetPicks` --- quint/src/runtime/impl/compilerImpl.ts | 55 +++++++++++++------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 8843378dd..f672f866f 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -155,10 +155,19 @@ export class CompilerVisitor implements IRVisitor { // a tracker for the current execution trace private trace: Trace + // whether to track `actionTaken` and `nondetPicks` private storeMetadata: boolean + // the chosen action in the last `any` evaluation private actionTaken: Maybe = none() - private nondetPicks: Maybe = none() - + // a record with nondet definition names as fields and their last chosen value as values + private nondetPicks: RuntimeValue // initialized at constructor + + private emptyNondetPicks() { + const nondetNames = [...this.lookupTable.values()] + .filter(d => d.kind === 'def' && d.qualifier === 'nondet') + .map(d => d.name) + return rv.mkRecord(OrderedMap(nondetNames.map(n => [n, rv.mkVariant('None', rv.mkTuple([]))]))) + } // the current depth of operator definitions: top-level defs are depth 0 // FIXME(#1279): The walk* functions update this value, but they need to be // initialized to -1 here for that to work on all scenarios. @@ -180,6 +189,8 @@ export class CompilerVisitor implements IRVisitor { this.errorTracker = evaluationState.errorTracker this.execListener = evaluationState.listener this.trace = evaluationState.trace + + this.nondetPicks = this.emptyNondetPicks() } /** @@ -217,14 +228,6 @@ export class CompilerVisitor implements IRVisitor { return this.errorTracker.runtimeErrors } - private nondetNames() { - return [...this.lookupTable.values()].filter(d => d.kind === 'def' && d.qualifier === 'nondet').map(d => d.name) - } - - private defaultNondetPicks() { - return rv.mkRecord(OrderedMap(this.nondetNames().map(n => [n, rv.mkVariant('None', rv.mkTuple([]))]))) - } - exitOpDef(opdef: ir.QuintOpDef) { // Either a runtime value, or a def, action, etc. // All of them are compiled to callables, which may have zero parameters. @@ -249,9 +252,8 @@ export class CompilerVisitor implements IRVisitor { const evalApp: ir.QuintApp = { id: 0n, kind: 'app', opcode: '_', args: [app] } boundValue = { eval: () => { - if (this.actionTaken.isNone() && this.nondetPicks.isNone()) { + if (this.actionTaken.isNone()) { this.actionTaken = just(rv.mkStr(opdef.name)) - this.nondetPicks = just(this.defaultNondetPicks()) } if (app.opcode === inputDefName) { @@ -286,9 +288,8 @@ export class CompilerVisitor implements IRVisitor { const unwrappedValue = boundValue boundValue = { eval: (args?: Maybe[]) => { - if (this.actionTaken.isNone() && this.nondetPicks.isNone()) { + if (this.actionTaken.isNone()) { this.actionTaken = just(rv.mkStr(opdef.name)) - this.nondetPicks = just(this.defaultNondetPicks()) } const r: Maybe = unwrappedValue.eval(args) @@ -348,11 +349,9 @@ export class CompilerVisitor implements IRVisitor { const result = undecoratedEval() if (result.isJust() && qualifier === 'nondet') { - if (this.nondetPicks.isNone()) { - this.nondetPicks = just(this.defaultNondetPicks()) - } + // A nondet value was just defined, save it in the nondetPicks record. const value = rv.mkVariant('Some', cachedValue.value as RuntimeValue) - this.nondetPicks = just(rv.mkRecord(this.nondetPicks.value!.toOrderedMap().set(letDef.opdef.name, value))) + this.nondetPicks = rv.mkRecord(this.nondetPicks.toOrderedMap().set(letDef.opdef.name, value)) } boundValue.eval = boundValueEval return result @@ -1495,9 +1494,13 @@ export class CompilerVisitor implements IRVisitor { // non-deterministically. Instead of modeling non-determinism, // we use a random number generator. This may change in the future. const lazyCompute = () => { - // save the values of the next variables, as actions may update them + // on `any`, we reset the action taken as the goal is to save the last + // action picked in an `any` call this.actionTaken = none() - this.nondetPicks = none() + // we also reset nondet picks since they should correspond to the action taken + this.nondetPicks = this.emptyNondetPicks() + + // save the values of the next variables, as actions may update them const valuesBefore = this.snapshotNextVars() // we store the potential successor values in this array const successors: Maybe[][] = [] @@ -1694,9 +1697,7 @@ export class CompilerVisitor implements IRVisitor { if (this.storeMetadata) { if (this.actionTaken.isJust()) { map.push(['action_taken', this.actionTaken.value!]) - } - if (this.nondetPicks.isJust()) { - map.push(['nondet_picks', this.nondetPicks.value!]) + map.push(['nondet_picks', this.nondetPicks]) } } @@ -1710,26 +1711,26 @@ export class CompilerVisitor implements IRVisitor { // save the values of the vars into an array private snapshotVars(): Maybe[] { - return this.vars.map(r => r.registerValue).concat([this.actionTaken, this.nondetPicks]) + return this.vars.map(r => r.registerValue).concat([this.actionTaken, just(this.nondetPicks)]) } // save the values of the next vars into an array private snapshotNextVars(): Maybe[] { - return this.nextVars.map(r => r.registerValue).concat([this.actionTaken, this.nondetPicks]) + return this.nextVars.map(r => r.registerValue).concat([this.actionTaken, just(this.nondetPicks)]) } // load the values of the variables from an array private recoverVars(values: Maybe[]) { this.vars.forEach((r, i) => (r.registerValue = values[i])) this.actionTaken = values[this.vars.length] ?? none() - this.nondetPicks = values[this.vars.length + 1] ?? none() + this.nondetPicks = values[this.vars.length + 1].unwrap() } // load the values of the next variables from an array private recoverNextVars(values: Maybe[]) { this.nextVars.forEach((r, i) => (r.registerValue = values[i])) this.actionTaken = values[this.vars.length] ?? none() - this.nondetPicks = values[this.vars.length + 1] ?? none() + this.nondetPicks = values[this.vars.length + 1].unwrap() } private contextGet(name: string | bigint, kinds: ComputableKind[]) { From e8992e5d038eaf1a7afa74160a215901570f370c Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 20 May 2024 12:35:37 -0300 Subject: [PATCH 377/388] Remove unnecessary assignment --- quint/src/runtime/impl/compilerImpl.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index f672f866f..4c762c30b 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -292,8 +292,7 @@ export class CompilerVisitor implements IRVisitor { this.actionTaken = just(rv.mkStr(opdef.name)) } - const r: Maybe = unwrappedValue.eval(args) - return r + return unwrappedValue.eval(args) }, nparams: unwrappedValue.nparams, } From f09cc8c5f7592fd4babd2a93722b2fee9d77d3d5 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 20 May 2024 12:36:17 -0300 Subject: [PATCH 378/388] Add "experimental" note to CLI flag --- quint/src/cli.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/cli.ts b/quint/src/cli.ts index 0aacd730b..de485f4cb 100755 --- a/quint/src/cli.ts +++ b/quint/src/cli.ts @@ -248,7 +248,7 @@ const runCmd = { default: verbosity.defaultLevel, }) .option('mbt', { - desc: 'whether to produce metadata to be used by model-based testing', + desc: '(experimental) whether to produce metadata to be used by model-based testing', type: 'boolean', default: false, }), From 6b360415de8d508c793a30abf59c2dac87fefde7 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 20 May 2024 12:43:51 -0300 Subject: [PATCH 379/388] Add documentation for the `--mbt` flag --- doc/quint.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/doc/quint.md b/doc/quint.md index af6124f07..e3c3c079f 100644 --- a/doc/quint.md +++ b/doc/quint.md @@ -231,6 +231,8 @@ Options: --invariant invariant to check: a definition name or an expression [string] [default: ["true"]] --seed random seed to use for non-deterministic choice [string] + --mbt (experimental) whether to produce metadata to be used by + model-based testing [boolean] [default: false] ``` - If there are no critical errors (e.g., in parsing, typechecking, etc.), the @@ -255,6 +257,19 @@ Options: The errors and warnings are written in the format of [ADR002][]. +### The `--mbt` flag +When this flag is given, the Quint simulator will keep track of two additional +variables on the traces it produces: +- `action_taken`: The first action executed by the simulator on each step, reset + at every `any` evaluation. That is, if the spec has nested `any` statements, + `action_taken` will correspond to the action picked in the innermost `any`. +- `nondet_picks`: A record with all `nondet` values that were picked since the + last `any` was called (or since the start, if there were no `any` calls in the + step). + +Keep in mind that this is an experimental flag and it is specially subject to +changes in its behavior. + ## Command test ```sh From efa276b0f6cd51b1e28fd92ba431c59a774c02f9 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 20 May 2024 12:44:49 -0300 Subject: [PATCH 380/388] Add CHANGELOG entry --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 26c9814eb..64b0ba28f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED ### Added + +- Added an experimental `--mbt` flag to produce metadata that is useful for + Model-Based Testing (#1441). + ### Changed ### Deprecated ### Removed From 3f762e74332d65c40fcf0d18dfca55059562f283 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 20 May 2024 12:54:46 -0300 Subject: [PATCH 381/388] Move and document initialization method --- quint/src/runtime/impl/compilerImpl.ts | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 4c762c30b..7e28e84f1 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -162,12 +162,6 @@ export class CompilerVisitor implements IRVisitor { // a record with nondet definition names as fields and their last chosen value as values private nondetPicks: RuntimeValue // initialized at constructor - private emptyNondetPicks() { - const nondetNames = [...this.lookupTable.values()] - .filter(d => d.kind === 'def' && d.qualifier === 'nondet') - .map(d => d.name) - return rv.mkRecord(OrderedMap(nondetNames.map(n => [n, rv.mkVariant('None', rv.mkTuple([]))]))) - } // the current depth of operator definitions: top-level defs are depth 0 // FIXME(#1279): The walk* functions update this value, but they need to be // initialized to -1 here for that to work on all scenarios. @@ -1732,6 +1726,16 @@ export class CompilerVisitor implements IRVisitor { this.nondetPicks = values[this.vars.length + 1].unwrap() } + // The initial value of nondet picks should already have record fields for all + // nondet values so the type of `nondet_picks` is the same throughout the + // trace. The field values are initialized as None. + private emptyNondetPicks() { + const nondetNames = [...this.lookupTable.values()] + .filter(d => d.kind === 'def' && d.qualifier === 'nondet') + .map(d => d.name) + return rv.mkRecord(OrderedMap(nondetNames.map(n => [n, rv.mkVariant('None', rv.mkTuple([]))]))) + } + private contextGet(name: string | bigint, kinds: ComputableKind[]) { for (const k of kinds) { const value = this.context.get(kindName(k, name)) From 25384a5a931de98ed91df9e3f42c11f0aca21eac Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 21 May 2024 11:47:52 -0300 Subject: [PATCH 382/388] Update comments on how nondetPicks are collected --- quint/src/runtime/impl/compilerImpl.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 7e28e84f1..c47eef869 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -341,6 +341,16 @@ export class CompilerVisitor implements IRVisitor { // compute the result and immediately reset the cache const result = undecoratedEval() + // Store the nondet picks after evaluation as we want to collect them while we move up the IR tree, + // to make sure all nondet values in scenarios like this are collected: + // action step = any { + // someAction, + // nondet time = oneOf(times) + // timeRelatedAction(time) + // } + // + // action timeRelatedAction(time) = any { AdvanceTime(time), RevertTime(time) } + if (result.isJust() && qualifier === 'nondet') { // A nondet value was just defined, save it in the nondetPicks record. const value = rv.mkVariant('Some', cachedValue.value as RuntimeValue) @@ -1490,7 +1500,8 @@ export class CompilerVisitor implements IRVisitor { // on `any`, we reset the action taken as the goal is to save the last // action picked in an `any` call this.actionTaken = none() - // we also reset nondet picks since they should correspond to the action taken + // we also reset nondet picks as they are collected when we move up the + // tree, and this is now a leaf this.nondetPicks = this.emptyNondetPicks() // save the values of the next variables, as actions may update them From b05a4d564f500a6abe62fc07226ab65223953533 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 21 May 2024 15:50:58 -0300 Subject: [PATCH 383/388] Ensure unshadowing of all lambdas to avoid Apalache issue --- quint/src/names/unshadower.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/quint/src/names/unshadower.ts b/quint/src/names/unshadower.ts index b6ca0e2ba..e69bfeb8c 100644 --- a/quint/src/names/unshadower.ts +++ b/quint/src/names/unshadower.ts @@ -41,10 +41,8 @@ class Unshadower implements IRTransformer { enterLambda(lambda: QuintLambda): QuintLambda { const newParams: QuintLambdaParameter[] = lambda.params.map(p => { - if (!this.lookupTable.get(p.id)?.shadowing) { - // nothing to do - return p - } + // Ideally, we should only rename if `this.lookupTable.get(p.id)?.shadowing` is true, as we do in let. + // However, this currently is a problem with Apalache, see issue #1443. const newName = `${p.name}_${lambda.id}` this.nestedNames.set(p.id, newName) From 1d8c268f9952150e826d053cc6c2e73e54f7b29d Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 21 May 2024 15:52:56 -0300 Subject: [PATCH 384/388] Update tests and fix some collector behavior --- quint/io-cli-tests.md | 18 ++++++------------ quint/src/ir/IRVisitor.ts | 6 ++++++ quint/src/names/collector.ts | 20 ++++++++++---------- quint/src/names/resolver.ts | 9 +++++---- quint/test/names/unshadower.test.ts | 12 +++++++++--- 5 files changed, 36 insertions(+), 29 deletions(-) diff --git a/quint/io-cli-tests.md b/quint/io-cli-tests.md index 741821f7e..da0b56ffb 100644 --- a/quint/io-cli-tests.md +++ b/quint/io-cli-tests.md @@ -811,43 +811,37 @@ rm out-itf-mbt-example.itf.json }, "minter": "bob", "nondet_picks": { - "amount_189": { + "amount": { "tag": "Some", "value": { "#bigint": "111009104957917492842738448433884729279015865072041681905260877596484059410831" } }, - "eveToBob_295": { + "eveToBob": { "tag": "None", "value": { "#tup": [] } }, - "mintBob_296": { + "mintBob": { "tag": "None", "value": { "#tup": [] } }, - "mintEve_297": { + "mintEve": { "tag": "None", "value": { "#tup": [] } }, - "receiver_190": { + "receiver": { "tag": "Some", "value": "bob" }, - "sender_191": { + "sender": { "tag": "Some", "value": "bob" - }, - "sender_75": { - "tag": "None", - "value": { - "#tup": [] - } } } } diff --git a/quint/src/ir/IRVisitor.ts b/quint/src/ir/IRVisitor.ts index b7b4195a5..e0888ddcf 100644 --- a/quint/src/ir/IRVisitor.ts +++ b/quint/src/ir/IRVisitor.ts @@ -465,6 +465,9 @@ export function walkExpression(visitor: IRVisitor, expr: ir.QuintEx): void { } break case 'let': + if (visitor.definitionDepth !== undefined) { + visitor.definitionDepth++ + } if (visitor.enterLet) { visitor.enterLet(expr) } @@ -475,6 +478,9 @@ export function walkExpression(visitor: IRVisitor, expr: ir.QuintEx): void { if (visitor.exitLet) { visitor.exitLet(expr) } + if (visitor.definitionDepth !== undefined) { + visitor.definitionDepth-- + } break default: unreachable(expr) diff --git a/quint/src/names/collector.ts b/quint/src/names/collector.ts index d06be5cde..393353459 100644 --- a/quint/src/names/collector.ts +++ b/quint/src/names/collector.ts @@ -245,19 +245,21 @@ export class NameCollector implements IRVisitor { * than `def.name` (i.e. in import-like statements). * @param source - An optional source identifier for the definition, if the * source is different than `def.id` (i.e. in import-like statements). + * + * @returns The definition object that was collected. */ - collectDefinition(def: LookupDefinition, importedFrom?: QuintImport | QuintExport | QuintInstance): void { + collectDefinition(def: LookupDefinition, importedFrom?: QuintImport | QuintExport | QuintInstance): LookupDefinition { const identifier = (importedFrom as QuintImport)?.defName ?? def.name const source = importedFrom?.id ?? def.id if (identifier === '_') { // Don't collect underscores, as they are special identifiers that allow no usage - return + return def } if (builtinNames.includes(identifier)) { // Conflict with a built-in name this.recordConflict(identifier, undefined, source) - return + return def } def.depth ??= 0 @@ -266,7 +268,7 @@ export class NameCollector implements IRVisitor { if (!this.definitionsByName.has(identifier)) { // No existing defs with this name. Create an entry with a single def. this.definitionsByName.set(identifier, [{ ...addNamespacesToDef(def, namespaces), importedFrom }]) - return + return def } // Else: There are exiting defs. We need to check for conflicts @@ -284,12 +286,10 @@ export class NameCollector implements IRVisitor { // Keep entries with different ids. DON'T keep the whole // `existingEntries` since those may contain the same exact defs, but // hidden. - this.definitionsByName.set( - identifier, - existingEntries - .filter(entry => entry.id !== def.id) - .concat([{ ...addNamespacesToDef(def, namespaces), importedFrom, shadowing: conflictingEntries.length > 0 }]) - ) + const newDef = { ...addNamespacesToDef(def, namespaces), importedFrom, shadowing: existingEntries.length > 0 } + this.definitionsByName.set(identifier, existingEntries.filter(entry => entry.id !== def.id).concat([newDef])) + + return newDef } /** diff --git a/quint/src/names/resolver.ts b/quint/src/names/resolver.ts index bcf595c60..e9adb4c42 100644 --- a/quint/src/names/resolver.ts +++ b/quint/src/names/resolver.ts @@ -75,11 +75,12 @@ class NameResolver implements IRVisitor { // Top-level definitions were already collected, so we only need to collect // scoped definitions. if (this.definitionDepth > 0) { - this.collector.collectDefinition({ ...def, depth: this.definitionDepth }) + const newDef = this.collector.collectDefinition({ ...def, depth: this.definitionDepth }) + this.table.set(def.id, { ...newDef, depth: this.definitionDepth }) + } else { + // Map the definition to itself so we can recover depth information from the table + this.table.set(def.id, { ...def, depth: this.definitionDepth }) } - - // Map the definition to itself so we can recover depth information from the table - this.table.set(def.id, { ...def, depth: this.definitionDepth }) } exitLet(expr: QuintLet): void { diff --git a/quint/test/names/unshadower.test.ts b/quint/test/names/unshadower.test.ts index 6d4c4f718..0fe892a54 100644 --- a/quint/test/names/unshadower.test.ts +++ b/quint/test/names/unshadower.test.ts @@ -21,8 +21,11 @@ describe('unshadowNames', () => { it('returns a module with no shadowed names', () => { const { modules, table } = parseModules(` module A { - def f(a) = a > 0 val b = val a = 1 { a } + val c = val a = { val a = 1 { a } } { a } + val d = val a = 1 { val a = 2 { a } } + def f(a) = a > 0 + def g(a) = a.map(a => a + 1) } module B { @@ -34,8 +37,11 @@ describe('unshadowNames', () => { assert.sameDeepMembers(unshadowedModules.map(moduleToString), [ dedent(`module A { - | val b = val a_10 = 1 { a_10 } - | def f = ((a_5) => igt(a_5, 0)) + | val d = val a = 1 { val a_19 = 2 { a_19 } } + | def f = ((a_26) => igt(a_26, 0)) + | def g = ((a_36) => map(a_36, ((a_34) => iadd(a_34, 1)))) + | val b = val a = 1 { a } + | val c = val a = val a_9 = 1 { a_9 } { a } |}`), dedent(`module B { | var a: int From 809203853ef137040f70f1276fcbca9abb07c2b0 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 21 May 2024 16:08:52 -0300 Subject: [PATCH 385/388] Add a unit test for metadata collection --- quint/test/names/resolver.test.ts | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/quint/test/names/resolver.test.ts b/quint/test/names/resolver.test.ts index e4474cf22..f2a7208b8 100644 --- a/quint/test/names/resolver.test.ts +++ b/quint/test/names/resolver.test.ts @@ -103,8 +103,22 @@ describe('resolveNames', () => { ) assert.isEmpty(result.errors) - assert.isTrue([...result.table.values()].some(def => def.name === 'shadowing' || def.kind === 'def')) - assert.isTrue([...result.table.values()].some(def => def.name === 'shadowing' || def.kind === 'param')) + assert.isTrue([...result.table.values()].some(def => def.name === 'shadowing' && def.kind === 'def')) + assert.isTrue([...result.table.values()].some(def => def.name === 'shadowing' && def.kind === 'param')) + }) + + it('collects depth and shadowing information properly', () => { + const result = resolveNamesForDefs(['val shadowing = val a = 1 { val a = 2 { a } }'], newIdGenerator()) + + assert.isEmpty(result.errors) + assert.isTrue( + [...result.table.values()].some(def => def.name === 'a' && def.depth === 2), + 'Could not find first a' + ) + assert.isTrue( + [...result.table.values()].some(def => def.name === 'a' && def.depth === 3 && def.shadowing === true), + 'Could not find second a' + ) }) }) From 0ef309a6264a98d3c5e82511fb624474971eabb3 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 21 May 2024 16:15:52 -0300 Subject: [PATCH 386/388] Update depth on fixtures --- quint/testFixture/SuperSpec.json | 2 +- quint/testFixture/_0099unorderedDefs.json | 2 +- quint/testFixture/_0100cyclicDefs.json | 2 +- quint/testFixture/_1013unknownTypeLetIn.json | 2 +- quint/testFixture/_1025importeeWithError.json | 2 +- quint/testFixture/_1032docstrings.json | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/quint/testFixture/SuperSpec.json b/quint/testFixture/SuperSpec.json index 588ec8bce..994a4f26a 100644 --- a/quint/testFixture/SuperSpec.json +++ b/quint/testFixture/SuperSpec.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10,"depth":0},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8,"depth":0}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":524,"name":"withConsts","declarations":[{"id":101,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":100,"kind":"app","opcode":"isub","args":[{"id":98,"kind":"int","value":1},{"id":99,"kind":"int","value":2}]}},{"id":105,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":104,"kind":"app","opcode":"imul","args":[{"id":102,"kind":"int","value":2},{"id":103,"kind":"int","value":3}]}},{"id":109,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":108,"kind":"app","opcode":"idiv","args":[{"id":106,"kind":"int","value":2},{"id":107,"kind":"int","value":3}]}},{"id":113,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":112,"kind":"app","opcode":"imod","args":[{"id":110,"kind":"int","value":2},{"id":111,"kind":"int","value":3}]}},{"id":117,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":116,"kind":"app","opcode":"ipow","args":[{"id":114,"kind":"int","value":2},{"id":115,"kind":"int","value":3}]}},{"id":120,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":119,"kind":"app","opcode":"iuminus","args":[{"id":118,"kind":"int","value":100}]}},{"id":124,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":123,"kind":"app","opcode":"igt","args":[{"id":121,"kind":"int","value":2},{"id":122,"kind":"int","value":3}]}},{"id":128,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":127,"kind":"app","opcode":"igte","args":[{"id":125,"kind":"int","value":2},{"id":126,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},{"id":132,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":131,"kind":"app","opcode":"ilt","args":[{"id":129,"kind":"int","value":2},{"id":130,"kind":"int","value":3}]}},{"id":136,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":135,"kind":"app","opcode":"ilte","args":[{"id":133,"kind":"int","value":2},{"id":134,"kind":"int","value":3}]}},{"id":140,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":139,"kind":"app","opcode":"eq","args":[{"id":137,"kind":"int","value":2},{"id":138,"kind":"int","value":3}]}},{"id":144,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":143,"kind":"app","opcode":"neq","args":[{"id":141,"kind":"int","value":2},{"id":142,"kind":"int","value":3}]}},{"id":150,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":149,"kind":"app","opcode":"eq","args":[{"id":147,"kind":"app","opcode":"iadd","args":[{"id":145,"kind":"int","value":2},{"id":146,"kind":"int","value":2}]},{"id":148,"kind":"int","value":4}]}},{"id":154,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":153,"kind":"app","opcode":"in","args":[{"id":151,"kind":"int","value":1},{"id":152,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},{"id":166,"kind":"def","name":"withType","qualifier":"val","expr":{"id":165,"kind":"app","opcode":"Set","args":[{"id":163,"kind":"int","value":1},{"id":164,"kind":"int","value":2}]},"typeAnnotation":{"id":162,"kind":"set","elem":{"id":161,"kind":"int"}}},{"id":167,"kind":"typedef","name":"PROC","depth":0},{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},{"id":175,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":174,"kind":"int","value":42}},{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19,"depth":0},{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22,"depth":0},{"id":240,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":239,"kind":"app","opcode":"and","args":[{"id":237,"kind":"bool","value":false},{"id":238,"kind":"bool","value":true}]}},{"id":244,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":243,"kind":"app","opcode":"or","args":[{"id":241,"kind":"bool","value":false},{"id":242,"kind":"bool","value":true}]}},{"id":248,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":247,"kind":"app","opcode":"implies","args":[{"id":245,"kind":"bool","value":false},{"id":246,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26,"depth":0},{"id":281,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":280,"kind":"app","opcode":"and","args":[{"id":277,"kind":"bool","value":false},{"id":278,"kind":"bool","value":true},{"id":279,"kind":"bool","value":false}]}},{"id":286,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":285,"kind":"app","opcode":"actionAll","args":[{"id":282,"kind":"bool","value":false},{"id":283,"kind":"bool","value":true},{"id":284,"kind":"bool","value":false}]}},{"id":291,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":290,"kind":"app","opcode":"or","args":[{"id":287,"kind":"bool","value":false},{"id":288,"kind":"bool","value":true},{"id":289,"kind":"bool","value":false}]}},{"id":296,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":295,"kind":"app","opcode":"actionAny","args":[{"id":292,"kind":"bool","value":false},{"id":293,"kind":"bool","value":true},{"id":294,"kind":"bool","value":false}]}},{"id":301,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":300,"kind":"app","opcode":"ite","args":[{"id":297,"kind":"bool","value":true},{"id":298,"kind":"int","value":1},{"id":299,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319,"depth":0},{"kind":"const","name":"MyFunFun","typeAnnotation":{"id":31,"kind":"fun","arg":{"id":29,"kind":"fun","arg":{"id":27,"kind":"int"},"res":{"id":28,"kind":"str"}},"res":{"id":30,"kind":"bool"}},"id":32,"depth":0},{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}}},{"id":340,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":339,"kind":"app","opcode":"in","args":[{"id":337,"kind":"int","value":1},{"id":338,"kind":"app","opcode":"Set","args":[]}]}},{"kind":"const","name":"MyOperator","typeAnnotation":{"id":36,"kind":"oper","args":[{"id":33,"kind":"int"},{"id":34,"kind":"str"}],"res":{"id":35,"kind":"bool"}},"id":37,"depth":0},{"id":405,"kind":"def","name":"one","qualifier":"val","expr":{"id":404,"kind":"app","opcode":"head","args":[{"id":403,"kind":"app","opcode":"List","args":[{"id":401,"kind":"int","value":1},{"id":402,"kind":"int","value":2}]}]}},{"id":410,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":409,"kind":"app","opcode":"Tup","args":[{"id":406,"kind":"int","value":1},{"id":407,"kind":"int","value":2},{"id":408,"kind":"int","value":3}]}},{"id":415,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":414,"kind":"app","opcode":"Tup","args":[{"id":411,"kind":"int","value":1},{"id":412,"kind":"int","value":2},{"id":413,"kind":"int","value":3}]}},{"id":419,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":418,"kind":"app","opcode":"Tup","args":[{"id":416,"kind":"int","value":4},{"id":417,"kind":"int","value":5}]}},{"kind":"const","name":"MyOperatorWithComma","typeAnnotation":{"id":41,"kind":"oper","args":[{"id":38,"kind":"int"},{"id":39,"kind":"str"}],"res":{"id":40,"kind":"bool"}},"id":42,"depth":0},{"id":424,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":423,"kind":"app","opcode":"List","args":[{"id":420,"kind":"int","value":1},{"id":421,"kind":"int","value":2},{"id":422,"kind":"int","value":3}]}},{"id":429,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"List","args":[{"id":425,"kind":"int","value":1},{"id":426,"kind":"int","value":2},{"id":427,"kind":"int","value":3}]}},{"id":436,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":435,"kind":"app","opcode":"nth","args":[{"id":433,"kind":"app","opcode":"List","args":[{"id":430,"kind":"int","value":2},{"id":431,"kind":"int","value":3},{"id":432,"kind":"int","value":4}]},{"id":434,"kind":"int","value":2}]}},{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]}},{"id":448,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Rec","args":[{"id":443,"kind":"str","value":"name"},{"id":444,"kind":"str","value":"igor"},{"id":445,"kind":"str","value":"year"},{"id":446,"kind":"int","value":1981}]}},{"id":461,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":460,"kind":"app","opcode":"Set","args":[{"id":457,"kind":"int","value":1},{"id":458,"kind":"int","value":2},{"id":459,"kind":"int","value":3}]}},{"kind":"const","name":"MyTuple","typeAnnotation":{"id":46,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":43,"kind":"int"}},{"fieldName":"1","fieldType":{"id":44,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":45,"kind":"str"}}],"other":{"kind":"empty"}}},"id":47,"depth":0},{"id":491,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":490,"kind":"app","opcode":"in","args":[{"id":488,"kind":"int","value":2},{"id":489,"kind":"app","opcode":"Set","args":[]}]}},{"id":495,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":494,"kind":"app","opcode":"subseteq","args":[{"id":492,"kind":"app","opcode":"Set","args":[]},{"id":493,"kind":"app","opcode":"Set","args":[]}]}},{"id":504,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":503,"kind":"app","opcode":"in","args":[{"id":497,"kind":"app","opcode":"Set","args":[{"id":496,"kind":"int","value":1}]},{"id":502,"kind":"app","opcode":"powerset","args":[{"id":501,"kind":"app","opcode":"Set","args":[{"id":498,"kind":"int","value":1},{"id":499,"kind":"int","value":2},{"id":500,"kind":"int","value":3}]}]}]}},{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}},"depth":0},{"id":518,"kind":"typedef","name":"UNINTERPRETED_TYPE","depth":0},{"kind":"const","name":"MyTupleWithComma","typeAnnotation":{"id":51,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":48,"kind":"int"}},{"fieldName":"1","fieldType":{"id":49,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":50,"kind":"str"}}],"other":{"kind":"empty"}}},"id":52,"depth":0},{"kind":"const","name":"MyRecord","typeAnnotation":{"id":56,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":53,"kind":"int"}},{"fieldName":"b","fieldType":{"id":54,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":55,"kind":"str"}}],"other":{"kind":"empty"}}},"id":57,"depth":0},{"kind":"const","name":"MyRecordWithComma","typeAnnotation":{"id":61,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":58,"kind":"int"}},{"fieldName":"b","fieldType":{"id":59,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":60,"kind":"str"}}],"other":{"kind":"empty"}}},"id":62,"depth":0},{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},{"kind":"var","name":"i","typeAnnotation":{"id":90,"kind":"int"},"id":91,"depth":0},{"kind":"var","name":"j","typeAnnotation":{"id":92,"kind":"bool"},"id":93,"depth":0},{"id":97,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":96,"kind":"app","opcode":"iadd","args":[{"id":94,"kind":"int","value":1},{"id":95,"kind":"int","value":2}]}},{"id":160,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":159,"kind":"app","opcode":"exists","args":[{"id":155,"kind":"name","name":"Bool"},{"id":158,"kind":"lambda","params":[{"id":156,"name":"x"}],"qualifier":"def","expr":{"id":157,"kind":"name","name":"x"}}]}},{"id":171,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":170,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":169,"kind":"set","elem":{"id":168,"kind":"const","name":"PROC"}}},{"id":182,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":181,"kind":"lambda","params":[{"id":176,"name":"x"},{"id":177,"name":"y"}],"qualifier":"puredef","expr":{"id":180,"kind":"app","opcode":"iadd","args":[{"id":178,"kind":"name","name":"x"},{"id":179,"kind":"name","name":"y"}]}}},{"id":188,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":187,"kind":"lambda","params":[{"id":183,"name":"factor"}],"qualifier":"def","expr":{"id":186,"kind":"app","opcode":"imul","args":[{"id":184,"kind":"name","name":"factor"},{"id":185,"kind":"name","name":"n"}]}}},{"id":194,"kind":"def","name":"A","qualifier":"action","expr":{"id":193,"kind":"lambda","params":[{"id":189,"name":"x"}],"qualifier":"action","expr":{"id":192,"kind":"app","opcode":"assign","args":[{"id":191,"kind":"name","name":"n"},{"id":190,"kind":"name","name":"x"}]}}},{"id":199,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":198,"kind":"lambda","params":[{"id":195,"name":"x"}],"qualifier":"puredef","expr":{"id":197,"kind":"app","opcode":"not","args":[{"id":196,"kind":"name","name":"x"}]}}},{"id":210,"kind":"def","name":"H","qualifier":"def","expr":{"id":209,"kind":"lambda","params":[{"id":200,"name":"x"},{"id":201,"name":"y"}],"qualifier":"def","expr":{"id":208,"kind":"app","opcode":"iadd","args":[{"id":206,"kind":"name","name":"x"},{"id":207,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":205,"kind":"oper","args":[{"id":202,"kind":"int"},{"id":203,"kind":"int"}],"res":{"id":204,"kind":"int"}}},{"id":217,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":216,"kind":"lambda","params":[{"id":211,"name":"x"}],"qualifier":"def","expr":{"id":215,"kind":"name","name":"x"}},"typeAnnotation":{"id":214,"kind":"oper","args":[{"id":212,"kind":"var","name":"a"}],"res":{"id":213,"kind":"var","name":"a"}}},{"id":223,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":222,"kind":"app","opcode":"assign","args":[{"id":221,"kind":"name","name":"k"},{"id":220,"kind":"int","value":3}]}},{"id":236,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":235,"kind":"lambda","params":[{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"}},{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"}}],"qualifier":"puredef","expr":{"id":234,"kind":"app","opcode":"ite","args":[{"id":231,"kind":"app","opcode":"ilt","args":[{"id":229,"kind":"name","name":"x"},{"id":230,"kind":"name","name":"y"}]},{"id":232,"kind":"name","name":"x"},{"id":233,"kind":"name","name":"y"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":224,"kind":"int"},{"id":226,"kind":"int"}],"res":{"id":228,"kind":"int"}}},{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}}},{"id":315,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":314,"kind":"lambda","params":[{"id":302,"name":"x"},{"id":303,"name":"y"}],"qualifier":"def","expr":{"id":313,"kind":"app","opcode":"ite","args":[{"id":306,"kind":"app","opcode":"ilt","args":[{"id":304,"kind":"name","name":"x"},{"id":305,"kind":"int","value":10}]},{"id":309,"kind":"app","opcode":"iadd","args":[{"id":307,"kind":"name","name":"y"},{"id":308,"kind":"int","value":5}]},{"id":312,"kind":"app","opcode":"imod","args":[{"id":310,"kind":"name","name":"y"},{"id":311,"kind":"int","value":5}]}]}}},{"id":323,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"get","args":[{"id":320,"kind":"name","name":"f1"},{"id":321,"kind":"str","value":"a"}]}},{"id":332,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":331,"kind":"app","opcode":"MyOper","args":[{"id":329,"kind":"str","value":"a"},{"id":330,"kind":"int","value":42}]}},{"id":336,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":335,"kind":"app","opcode":"MyOper","args":[{"id":333,"kind":"str","value":"a"},{"id":334,"kind":"int","value":42}]}},{"id":348,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":347,"kind":"app","opcode":"filter","args":[{"id":341,"kind":"name","name":"S"},{"id":346,"kind":"lambda","params":[{"id":342,"name":"x"}],"qualifier":"def","expr":{"id":345,"kind":"app","opcode":"igt","args":[{"id":343,"kind":"name","name":"x"},{"id":344,"kind":"int","value":10}]}}]}},{"id":386,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":385,"kind":"app","opcode":"filter","args":[{"id":381,"kind":"name","name":"S"},{"id":384,"kind":"lambda","params":[{"id":382,"name":"_"}],"qualifier":"def","expr":{"id":383,"kind":"bool","value":true}}]}},{"id":394,"kind":"def","name":"f","qualifier":"val","expr":{"id":393,"kind":"app","opcode":"mapBy","args":[{"id":387,"kind":"name","name":"S"},{"id":392,"kind":"lambda","params":[{"id":388,"name":"x"}],"qualifier":"def","expr":{"id":391,"kind":"app","opcode":"iadd","args":[{"id":389,"kind":"name","name":"x"},{"id":390,"kind":"int","value":1}]}}]}},{"id":400,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":399,"kind":"app","opcode":"exclude","args":[{"id":395,"kind":"name","name":"S"},{"id":398,"kind":"app","opcode":"Set","args":[{"id":396,"kind":"int","value":3},{"id":397,"kind":"int","value":4}]}]}},{"id":456,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":455,"kind":"app","opcode":"with","args":[{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"name","name":"test_record"},{"id":450,"kind":"str","value":"name"},{"id":449,"kind":"str","value":"quint"}]},{"id":452,"kind":"str","value":"year"},{"id":451,"kind":"int","value":2023}]}},{"id":472,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":471,"kind":"let","opdef":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]}},"expr":{"id":470,"kind":"app","opcode":"field","args":[{"id":468,"kind":"name","name":"my_rec"},{"id":469,"kind":"str","value":"a"}]}}},{"id":481,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":480,"kind":"let","opdef":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]}},"expr":{"id":479,"kind":"app","opcode":"item","args":[{"id":477,"kind":"name","name":"my_tup"},{"id":478,"kind":"int","value":2}]}}},{"id":487,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":486,"kind":"lambda","params":[{"id":482,"name":"s"}],"qualifier":"def","expr":{"id":485,"kind":"app","opcode":"eq","args":[{"id":483,"kind":"name","name":"s"},{"id":484,"kind":"app","opcode":"List","args":[]}]}}},{"id":508,"kind":"assume","name":"positive","assumption":{"id":507,"kind":"app","opcode":"igt","args":[{"id":505,"kind":"name","name":"N"},{"id":506,"kind":"int","value":0}]},"depth":0},{"id":512,"kind":"assume","name":"_","assumption":{"id":511,"kind":"app","opcode":"neq","args":[{"id":509,"kind":"name","name":"N"},{"id":510,"kind":"int","value":0}]}},{"id":513,"kind":"import","defName":"foo","protoName":"M1"},{"id":514,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":519,"kind":"const","name":"INT_SET"},"id":520,"depth":0},{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},{"id":75,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":74,"kind":"lambda","params":[{"id":71,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":73,"kind":"app","opcode":"variant","args":[{"id":70,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":72}]}}},{"id":81,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":80,"kind":"lambda","params":[{"id":77,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":79,"kind":"app","opcode":"variant","args":[{"id":76,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":78}]}}},{"id":87,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":86,"kind":"lambda","params":[{"id":83,"name":"__DogParam"}],"qualifier":"def","expr":{"id":85,"kind":"app","opcode":"variant","args":[{"id":82,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":84}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":88,"kind":"const","name":"MyUnionType"},"id":89,"depth":0},{"id":260,"kind":"def","name":"G","qualifier":"def","expr":{"id":259,"kind":"lambda","params":[{"id":253,"name":"x"}],"qualifier":"def","expr":{"id":258,"kind":"app","opcode":"and","args":[{"id":255,"kind":"app","opcode":"F","args":[{"id":254,"kind":"name","name":"x"}]},{"id":257,"kind":"app","opcode":"not","args":[{"id":256,"kind":"name","name":"x"}]}]}}},{"id":268,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":267,"kind":"lambda","params":[{"id":261,"name":"x"}],"qualifier":"def","expr":{"id":266,"kind":"app","opcode":"and","args":[{"id":263,"kind":"app","opcode":"F","args":[{"id":262,"kind":"name","name":"x"}]},{"id":265,"kind":"app","opcode":"not","args":[{"id":264,"kind":"name","name":"x"}]}]}}},{"id":276,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":275,"kind":"lambda","params":[{"id":269,"name":"x"}],"qualifier":"def","expr":{"id":274,"kind":"app","opcode":"or","args":[{"id":271,"kind":"app","opcode":"F","args":[{"id":270,"kind":"name","name":"x"}]},{"id":273,"kind":"app","opcode":"not","args":[{"id":272,"kind":"name","name":"x"}]}]}}},{"id":368,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":367,"kind":"app","opcode":"map","args":[{"id":351,"kind":"app","opcode":"tuples","args":[{"id":349,"kind":"name","name":"S"},{"id":350,"kind":"name","name":"MySet"}]},{"id":366,"kind":"lambda","params":[{"id":357,"name":"quintTupledLambdaParam357"}],"qualifier":"def","expr":{"id":362,"kind":"let","opdef":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]}},"expr":{"id":358,"kind":"let","opdef":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]}},"expr":{"id":356,"kind":"app","opcode":"iadd","args":[{"id":354,"kind":"name","name":"s"},{"id":355,"kind":"name","name":"mys"}]}}}}]}},{"id":380,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":379,"kind":"let","opdef":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]}},"expr":{"id":378,"kind":"app","opcode":"actionAll","args":[{"id":374,"kind":"app","opcode":"igt","args":[{"id":372,"kind":"name","name":"x"},{"id":373,"kind":"int","value":10}]},{"id":377,"kind":"app","opcode":"assign","args":[{"id":376,"kind":"name","name":"k"},{"id":375,"kind":"name","name":"x"}]}]}}}]}],"table":{"2":{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4},"depth":0},"5":{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4},"depth":0},"69":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"72":{"id":71,"name":"__CircleParam","kind":"param","depth":1},"75":{"id":75,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":74,"kind":"lambda","params":[{"id":71,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":73,"kind":"app","opcode":"variant","args":[{"id":70,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":72}]}},"depth":0},"78":{"id":77,"name":"__RectangleParam","kind":"param","depth":1},"81":{"id":81,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":80,"kind":"lambda","params":[{"id":77,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":79,"kind":"app","opcode":"variant","args":[{"id":76,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":78}]}},"depth":0},"84":{"id":83,"name":"__DogParam","kind":"param","depth":1},"87":{"id":87,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":86,"kind":"lambda","params":[{"id":83,"name":"__DogParam"}],"qualifier":"def","expr":{"id":85,"kind":"app","opcode":"variant","args":[{"id":82,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":84}]}},"depth":0},"88":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"97":{"id":97,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":96,"kind":"app","opcode":"iadd","args":[{"id":94,"kind":"int","value":1},{"id":95,"kind":"int","value":2}]},"depth":0},"101":{"id":101,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":100,"kind":"app","opcode":"isub","args":[{"id":98,"kind":"int","value":1},{"id":99,"kind":"int","value":2}]},"depth":0},"105":{"id":105,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":104,"kind":"app","opcode":"imul","args":[{"id":102,"kind":"int","value":2},{"id":103,"kind":"int","value":3}]},"depth":0},"109":{"id":109,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":108,"kind":"app","opcode":"idiv","args":[{"id":106,"kind":"int","value":2},{"id":107,"kind":"int","value":3}]},"depth":0},"113":{"id":113,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":112,"kind":"app","opcode":"imod","args":[{"id":110,"kind":"int","value":2},{"id":111,"kind":"int","value":3}]},"depth":0},"117":{"id":117,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":116,"kind":"app","opcode":"ipow","args":[{"id":114,"kind":"int","value":2},{"id":115,"kind":"int","value":3}]},"depth":0},"120":{"id":120,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":119,"kind":"app","opcode":"iuminus","args":[{"id":118,"kind":"int","value":100}]},"depth":0},"124":{"id":124,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":123,"kind":"app","opcode":"igt","args":[{"id":121,"kind":"int","value":2},{"id":122,"kind":"int","value":3}]},"depth":0},"128":{"id":128,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":127,"kind":"app","opcode":"igte","args":[{"id":125,"kind":"int","value":2},{"id":126,"kind":"int","value":3}]},"depth":0},"132":{"id":132,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":131,"kind":"app","opcode":"ilt","args":[{"id":129,"kind":"int","value":2},{"id":130,"kind":"int","value":3}]},"depth":0},"136":{"id":136,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":135,"kind":"app","opcode":"ilte","args":[{"id":133,"kind":"int","value":2},{"id":134,"kind":"int","value":3}]},"depth":0},"140":{"id":140,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":139,"kind":"app","opcode":"eq","args":[{"id":137,"kind":"int","value":2},{"id":138,"kind":"int","value":3}]},"depth":0},"144":{"id":144,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":143,"kind":"app","opcode":"neq","args":[{"id":141,"kind":"int","value":2},{"id":142,"kind":"int","value":3}]},"depth":0},"150":{"id":150,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":149,"kind":"app","opcode":"eq","args":[{"id":147,"kind":"app","opcode":"iadd","args":[{"id":145,"kind":"int","value":2},{"id":146,"kind":"int","value":2}]},{"id":148,"kind":"int","value":4}]},"depth":0},"154":{"id":154,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":153,"kind":"app","opcode":"in","args":[{"id":151,"kind":"int","value":1},{"id":152,"kind":"name","name":"Nat"}]},"depth":0},"157":{"id":156,"name":"x","kind":"param","depth":1},"160":{"id":160,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":159,"kind":"app","opcode":"exists","args":[{"id":155,"kind":"name","name":"Bool"},{"id":158,"kind":"lambda","params":[{"id":156,"name":"x"}],"qualifier":"def","expr":{"id":157,"kind":"name","name":"x"}}]},"depth":0},"166":{"id":166,"kind":"def","name":"withType","qualifier":"val","expr":{"id":165,"kind":"app","opcode":"Set","args":[{"id":163,"kind":"int","value":1},{"id":164,"kind":"int","value":2}]},"typeAnnotation":{"id":162,"kind":"set","elem":{"id":161,"kind":"int"}},"depth":0},"168":{"id":167,"kind":"typedef","name":"PROC","depth":0},"171":{"id":171,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":170,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":169,"kind":"set","elem":{"id":168,"kind":"const","name":"PROC"}},"depth":0},"175":{"id":175,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":174,"kind":"int","value":42},"depth":0},"178":{"id":176,"name":"x","kind":"param","depth":1},"179":{"id":177,"name":"y","kind":"param","depth":1},"182":{"id":182,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":181,"kind":"lambda","params":[{"id":176,"name":"x"},{"id":177,"name":"y"}],"qualifier":"puredef","expr":{"id":180,"kind":"app","opcode":"iadd","args":[{"id":178,"kind":"name","name":"x"},{"id":179,"kind":"name","name":"y"}]}},"depth":0},"184":{"id":183,"name":"factor","kind":"param","depth":1},"185":{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},"188":{"id":188,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":187,"kind":"lambda","params":[{"id":183,"name":"factor"}],"qualifier":"def","expr":{"id":186,"kind":"app","opcode":"imul","args":[{"id":184,"kind":"name","name":"factor"},{"id":185,"kind":"name","name":"n"}]}},"depth":0},"190":{"id":189,"name":"x","kind":"param","depth":1},"191":{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},"194":{"id":194,"kind":"def","name":"A","qualifier":"action","expr":{"id":193,"kind":"lambda","params":[{"id":189,"name":"x"}],"qualifier":"action","expr":{"id":192,"kind":"app","opcode":"assign","args":[{"id":191,"kind":"name","name":"n"},{"id":190,"kind":"name","name":"x"}]}},"depth":0},"196":{"id":195,"name":"x","kind":"param","depth":1},"199":{"id":199,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":198,"kind":"lambda","params":[{"id":195,"name":"x"}],"qualifier":"puredef","expr":{"id":197,"kind":"app","opcode":"not","args":[{"id":196,"kind":"name","name":"x"}]}},"depth":0},"206":{"id":200,"name":"x","kind":"param","depth":1},"207":{"id":201,"name":"y","kind":"param","depth":1},"210":{"id":210,"kind":"def","name":"H","qualifier":"def","expr":{"id":209,"kind":"lambda","params":[{"id":200,"name":"x"},{"id":201,"name":"y"}],"qualifier":"def","expr":{"id":208,"kind":"app","opcode":"iadd","args":[{"id":206,"kind":"name","name":"x"},{"id":207,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":205,"kind":"oper","args":[{"id":202,"kind":"int"},{"id":203,"kind":"int"}],"res":{"id":204,"kind":"int"}},"depth":0},"215":{"id":211,"name":"x","kind":"param","depth":1},"217":{"id":217,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":216,"kind":"lambda","params":[{"id":211,"name":"x"}],"qualifier":"def","expr":{"id":215,"kind":"name","name":"x"}},"typeAnnotation":{"id":214,"kind":"oper","args":[{"id":212,"kind":"var","name":"a"}],"res":{"id":213,"kind":"var","name":"a"}},"depth":0},"221":{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},"223":{"id":223,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":222,"kind":"app","opcode":"assign","args":[{"id":221,"kind":"name","name":"k"},{"id":220,"kind":"int","value":3}]},"depth":0},"229":{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"},"kind":"param","depth":1},"230":{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"},"kind":"param","depth":1},"232":{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"},"kind":"param","depth":1},"233":{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"},"kind":"param","depth":1},"236":{"id":236,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":235,"kind":"lambda","params":[{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"}},{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"}}],"qualifier":"puredef","expr":{"id":234,"kind":"app","opcode":"ite","args":[{"id":231,"kind":"app","opcode":"ilt","args":[{"id":229,"kind":"name","name":"x"},{"id":230,"kind":"name","name":"y"}]},{"id":232,"kind":"name","name":"x"},{"id":233,"kind":"name","name":"y"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":224,"kind":"int"},{"id":226,"kind":"int"}],"res":{"id":228,"kind":"int"}},"depth":0},"240":{"id":240,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":239,"kind":"app","opcode":"and","args":[{"id":237,"kind":"bool","value":false},{"id":238,"kind":"bool","value":true}]},"depth":0},"244":{"id":244,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":243,"kind":"app","opcode":"or","args":[{"id":241,"kind":"bool","value":false},{"id":242,"kind":"bool","value":true}]},"depth":0},"248":{"id":248,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":247,"kind":"app","opcode":"implies","args":[{"id":245,"kind":"bool","value":false},{"id":246,"kind":"bool","value":true}]},"depth":0},"250":{"id":249,"name":"x","kind":"param","depth":1},"252":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"254":{"id":253,"name":"x","kind":"param","depth":1},"255":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"256":{"id":253,"name":"x","kind":"param","depth":1},"260":{"id":260,"kind":"def","name":"G","qualifier":"def","expr":{"id":259,"kind":"lambda","params":[{"id":253,"name":"x"}],"qualifier":"def","expr":{"id":258,"kind":"app","opcode":"and","args":[{"id":255,"kind":"app","opcode":"F","args":[{"id":254,"kind":"name","name":"x"}]},{"id":257,"kind":"app","opcode":"not","args":[{"id":256,"kind":"name","name":"x"}]}]}},"depth":0},"262":{"id":261,"name":"x","kind":"param","depth":1},"263":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"264":{"id":261,"name":"x","kind":"param","depth":1},"268":{"id":268,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":267,"kind":"lambda","params":[{"id":261,"name":"x"}],"qualifier":"def","expr":{"id":266,"kind":"app","opcode":"and","args":[{"id":263,"kind":"app","opcode":"F","args":[{"id":262,"kind":"name","name":"x"}]},{"id":265,"kind":"app","opcode":"not","args":[{"id":264,"kind":"name","name":"x"}]}]}},"depth":0},"270":{"id":269,"name":"x","kind":"param","depth":1},"271":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"272":{"id":269,"name":"x","kind":"param","depth":1},"276":{"id":276,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":275,"kind":"lambda","params":[{"id":269,"name":"x"}],"qualifier":"def","expr":{"id":274,"kind":"app","opcode":"or","args":[{"id":271,"kind":"app","opcode":"F","args":[{"id":270,"kind":"name","name":"x"}]},{"id":273,"kind":"app","opcode":"not","args":[{"id":272,"kind":"name","name":"x"}]}]}},"depth":0},"281":{"id":281,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":280,"kind":"app","opcode":"and","args":[{"id":277,"kind":"bool","value":false},{"id":278,"kind":"bool","value":true},{"id":279,"kind":"bool","value":false}]},"depth":0},"286":{"id":286,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":285,"kind":"app","opcode":"actionAll","args":[{"id":282,"kind":"bool","value":false},{"id":283,"kind":"bool","value":true},{"id":284,"kind":"bool","value":false}]},"depth":0},"291":{"id":291,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":290,"kind":"app","opcode":"or","args":[{"id":287,"kind":"bool","value":false},{"id":288,"kind":"bool","value":true},{"id":289,"kind":"bool","value":false}]},"depth":0},"296":{"id":296,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":295,"kind":"app","opcode":"actionAny","args":[{"id":292,"kind":"bool","value":false},{"id":293,"kind":"bool","value":true},{"id":294,"kind":"bool","value":false}]},"depth":0},"301":{"id":301,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":300,"kind":"app","opcode":"ite","args":[{"id":297,"kind":"bool","value":true},{"id":298,"kind":"int","value":1},{"id":299,"kind":"int","value":0}]},"depth":0},"304":{"id":302,"name":"x","kind":"param","depth":1},"307":{"id":303,"name":"y","kind":"param","depth":1},"310":{"id":303,"name":"y","kind":"param","depth":1},"315":{"id":315,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":314,"kind":"lambda","params":[{"id":302,"name":"x"},{"id":303,"name":"y"}],"qualifier":"def","expr":{"id":313,"kind":"app","opcode":"ite","args":[{"id":306,"kind":"app","opcode":"ilt","args":[{"id":304,"kind":"name","name":"x"},{"id":305,"kind":"int","value":10}]},{"id":309,"kind":"app","opcode":"iadd","args":[{"id":307,"kind":"name","name":"y"},{"id":308,"kind":"int","value":5}]},{"id":312,"kind":"app","opcode":"imod","args":[{"id":310,"kind":"name","name":"y"},{"id":311,"kind":"int","value":5}]}]}},"depth":0},"320":{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319,"depth":0},"323":{"id":323,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"get","args":[{"id":320,"kind":"name","name":"f1"},{"id":321,"kind":"str","value":"a"}]},"depth":0},"328":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"331":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"332":{"id":332,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":331,"kind":"app","opcode":"MyOper","args":[{"id":329,"kind":"str","value":"a"},{"id":330,"kind":"int","value":42}]},"depth":0},"335":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"336":{"id":336,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":335,"kind":"app","opcode":"MyOper","args":[{"id":333,"kind":"str","value":"a"},{"id":334,"kind":"int","value":42}]},"depth":0},"340":{"id":340,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":339,"kind":"app","opcode":"in","args":[{"id":337,"kind":"int","value":1},{"id":338,"kind":"app","opcode":"Set","args":[]}]},"depth":0},"341":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"343":{"id":342,"name":"x","kind":"param","depth":1},"348":{"id":348,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":347,"kind":"app","opcode":"filter","args":[{"id":341,"kind":"name","name":"S"},{"id":346,"kind":"lambda","params":[{"id":342,"name":"x"}],"qualifier":"def","expr":{"id":345,"kind":"app","opcode":"igt","args":[{"id":343,"kind":"name","name":"x"},{"id":344,"kind":"int","value":10}]}}]},"depth":0},"349":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"350":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19,"depth":0},"352":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]},"depth":2},"353":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]},"depth":2},"354":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]},"depth":2},"355":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]},"depth":2},"360":{"id":357,"name":"quintTupledLambdaParam357","kind":"param","depth":1},"364":{"id":357,"name":"quintTupledLambdaParam357","kind":"param","depth":1},"368":{"id":368,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":367,"kind":"app","opcode":"map","args":[{"id":351,"kind":"app","opcode":"tuples","args":[{"id":349,"kind":"name","name":"S"},{"id":350,"kind":"name","name":"MySet"}]},{"id":366,"kind":"lambda","params":[{"id":357,"name":"quintTupledLambdaParam357"}],"qualifier":"def","expr":{"id":362,"kind":"let","opdef":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]}},"expr":{"id":358,"kind":"let","opdef":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]}},"expr":{"id":356,"kind":"app","opcode":"iadd","args":[{"id":354,"kind":"name","name":"s"},{"id":355,"kind":"name","name":"mys"}]}}}}]},"depth":0},"369":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"371":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"372":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"375":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"376":{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},"380":{"id":380,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":379,"kind":"let","opdef":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]}},"expr":{"id":378,"kind":"app","opcode":"actionAll","args":[{"id":374,"kind":"app","opcode":"igt","args":[{"id":372,"kind":"name","name":"x"},{"id":373,"kind":"int","value":10}]},{"id":377,"kind":"app","opcode":"assign","args":[{"id":376,"kind":"name","name":"k"},{"id":375,"kind":"name","name":"x"}]}]}},"depth":0},"381":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"386":{"id":386,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":385,"kind":"app","opcode":"filter","args":[{"id":381,"kind":"name","name":"S"},{"id":384,"kind":"lambda","params":[{"id":382,"name":"_"}],"qualifier":"def","expr":{"id":383,"kind":"bool","value":true}}]},"depth":0},"387":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"389":{"id":388,"name":"x","kind":"param","depth":1},"394":{"id":394,"kind":"def","name":"f","qualifier":"val","expr":{"id":393,"kind":"app","opcode":"mapBy","args":[{"id":387,"kind":"name","name":"S"},{"id":392,"kind":"lambda","params":[{"id":388,"name":"x"}],"qualifier":"def","expr":{"id":391,"kind":"app","opcode":"iadd","args":[{"id":389,"kind":"name","name":"x"},{"id":390,"kind":"int","value":1}]}}]},"depth":0},"395":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"400":{"id":400,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":399,"kind":"app","opcode":"exclude","args":[{"id":395,"kind":"name","name":"S"},{"id":398,"kind":"app","opcode":"Set","args":[{"id":396,"kind":"int","value":3},{"id":397,"kind":"int","value":4}]}]},"depth":0},"405":{"id":405,"kind":"def","name":"one","qualifier":"val","expr":{"id":404,"kind":"app","opcode":"head","args":[{"id":403,"kind":"app","opcode":"List","args":[{"id":401,"kind":"int","value":1},{"id":402,"kind":"int","value":2}]}]},"depth":0},"410":{"id":410,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":409,"kind":"app","opcode":"Tup","args":[{"id":406,"kind":"int","value":1},{"id":407,"kind":"int","value":2},{"id":408,"kind":"int","value":3}]},"depth":0},"415":{"id":415,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":414,"kind":"app","opcode":"Tup","args":[{"id":411,"kind":"int","value":1},{"id":412,"kind":"int","value":2},{"id":413,"kind":"int","value":3}]},"depth":0},"419":{"id":419,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":418,"kind":"app","opcode":"Tup","args":[{"id":416,"kind":"int","value":4},{"id":417,"kind":"int","value":5}]},"depth":0},"424":{"id":424,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":423,"kind":"app","opcode":"List","args":[{"id":420,"kind":"int","value":1},{"id":421,"kind":"int","value":2},{"id":422,"kind":"int","value":3}]},"depth":0},"429":{"id":429,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"List","args":[{"id":425,"kind":"int","value":1},{"id":426,"kind":"int","value":2},{"id":427,"kind":"int","value":3}]},"depth":0},"436":{"id":436,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":435,"kind":"app","opcode":"nth","args":[{"id":433,"kind":"app","opcode":"List","args":[{"id":430,"kind":"int","value":2},{"id":431,"kind":"int","value":3},{"id":432,"kind":"int","value":4}]},{"id":434,"kind":"int","value":2}]},"depth":0},"442":{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]},"depth":0},"448":{"id":448,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Rec","args":[{"id":443,"kind":"str","value":"name"},{"id":444,"kind":"str","value":"igor"},{"id":445,"kind":"str","value":"year"},{"id":446,"kind":"int","value":1981}]},"depth":0},"453":{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]},"depth":0},"456":{"id":456,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":455,"kind":"app","opcode":"with","args":[{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"name","name":"test_record"},{"id":450,"kind":"str","value":"name"},{"id":449,"kind":"str","value":"quint"}]},{"id":452,"kind":"str","value":"year"},{"id":451,"kind":"int","value":2023}]},"depth":0},"461":{"id":461,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":460,"kind":"app","opcode":"Set","args":[{"id":457,"kind":"int","value":1},{"id":458,"kind":"int","value":2},{"id":459,"kind":"int","value":3}]},"depth":0},"467":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]},"depth":1},"468":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]},"depth":1},"472":{"id":472,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":471,"kind":"let","opdef":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]}},"expr":{"id":470,"kind":"app","opcode":"field","args":[{"id":468,"kind":"name","name":"my_rec"},{"id":469,"kind":"str","value":"a"}]}},"depth":0},"476":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]},"depth":1},"477":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]},"depth":1},"481":{"id":481,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":480,"kind":"let","opdef":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]}},"expr":{"id":479,"kind":"app","opcode":"item","args":[{"id":477,"kind":"name","name":"my_tup"},{"id":478,"kind":"int","value":2}]}},"depth":0},"483":{"id":482,"name":"s","kind":"param","depth":1},"487":{"id":487,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":486,"kind":"lambda","params":[{"id":482,"name":"s"}],"qualifier":"def","expr":{"id":485,"kind":"app","opcode":"eq","args":[{"id":483,"kind":"name","name":"s"},{"id":484,"kind":"app","opcode":"List","args":[]}]}},"depth":0},"491":{"id":491,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":490,"kind":"app","opcode":"in","args":[{"id":488,"kind":"int","value":2},{"id":489,"kind":"app","opcode":"Set","args":[]}]},"depth":0},"495":{"id":495,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":494,"kind":"app","opcode":"subseteq","args":[{"id":492,"kind":"app","opcode":"Set","args":[]},{"id":493,"kind":"app","opcode":"Set","args":[]}]},"depth":0},"504":{"id":504,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":503,"kind":"app","opcode":"in","args":[{"id":497,"kind":"app","opcode":"Set","args":[{"id":496,"kind":"int","value":1}]},{"id":502,"kind":"app","opcode":"powerset","args":[{"id":501,"kind":"app","opcode":"Set","args":[{"id":498,"kind":"int","value":1},{"id":499,"kind":"int","value":2},{"id":500,"kind":"int","value":3}]}]}]},"depth":0},"505":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"509":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"519":{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}},"depth":0},"521":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"522":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":521,"depth":0,"importedFrom":{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10,"depth":0},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8,"depth":0}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":524,"name":"withConsts","declarations":[{"id":101,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":100,"kind":"app","opcode":"isub","args":[{"id":98,"kind":"int","value":1},{"id":99,"kind":"int","value":2}]}},{"id":105,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":104,"kind":"app","opcode":"imul","args":[{"id":102,"kind":"int","value":2},{"id":103,"kind":"int","value":3}]}},{"id":109,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":108,"kind":"app","opcode":"idiv","args":[{"id":106,"kind":"int","value":2},{"id":107,"kind":"int","value":3}]}},{"id":113,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":112,"kind":"app","opcode":"imod","args":[{"id":110,"kind":"int","value":2},{"id":111,"kind":"int","value":3}]}},{"id":117,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":116,"kind":"app","opcode":"ipow","args":[{"id":114,"kind":"int","value":2},{"id":115,"kind":"int","value":3}]}},{"id":120,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":119,"kind":"app","opcode":"iuminus","args":[{"id":118,"kind":"int","value":100}]}},{"id":124,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":123,"kind":"app","opcode":"igt","args":[{"id":121,"kind":"int","value":2},{"id":122,"kind":"int","value":3}]}},{"id":128,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":127,"kind":"app","opcode":"igte","args":[{"id":125,"kind":"int","value":2},{"id":126,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},{"id":132,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":131,"kind":"app","opcode":"ilt","args":[{"id":129,"kind":"int","value":2},{"id":130,"kind":"int","value":3}]}},{"id":136,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":135,"kind":"app","opcode":"ilte","args":[{"id":133,"kind":"int","value":2},{"id":134,"kind":"int","value":3}]}},{"id":140,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":139,"kind":"app","opcode":"eq","args":[{"id":137,"kind":"int","value":2},{"id":138,"kind":"int","value":3}]}},{"id":144,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":143,"kind":"app","opcode":"neq","args":[{"id":141,"kind":"int","value":2},{"id":142,"kind":"int","value":3}]}},{"id":150,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":149,"kind":"app","opcode":"eq","args":[{"id":147,"kind":"app","opcode":"iadd","args":[{"id":145,"kind":"int","value":2},{"id":146,"kind":"int","value":2}]},{"id":148,"kind":"int","value":4}]}},{"id":154,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":153,"kind":"app","opcode":"in","args":[{"id":151,"kind":"int","value":1},{"id":152,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},{"id":166,"kind":"def","name":"withType","qualifier":"val","expr":{"id":165,"kind":"app","opcode":"Set","args":[{"id":163,"kind":"int","value":1},{"id":164,"kind":"int","value":2}]},"typeAnnotation":{"id":162,"kind":"set","elem":{"id":161,"kind":"int"}}},{"id":167,"kind":"typedef","name":"PROC","depth":0},{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},{"id":175,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":174,"kind":"int","value":42}},{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19,"depth":0},{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22,"depth":0},{"id":240,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":239,"kind":"app","opcode":"and","args":[{"id":237,"kind":"bool","value":false},{"id":238,"kind":"bool","value":true}]}},{"id":244,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":243,"kind":"app","opcode":"or","args":[{"id":241,"kind":"bool","value":false},{"id":242,"kind":"bool","value":true}]}},{"id":248,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":247,"kind":"app","opcode":"implies","args":[{"id":245,"kind":"bool","value":false},{"id":246,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26,"depth":0},{"id":281,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":280,"kind":"app","opcode":"and","args":[{"id":277,"kind":"bool","value":false},{"id":278,"kind":"bool","value":true},{"id":279,"kind":"bool","value":false}]}},{"id":286,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":285,"kind":"app","opcode":"actionAll","args":[{"id":282,"kind":"bool","value":false},{"id":283,"kind":"bool","value":true},{"id":284,"kind":"bool","value":false}]}},{"id":291,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":290,"kind":"app","opcode":"or","args":[{"id":287,"kind":"bool","value":false},{"id":288,"kind":"bool","value":true},{"id":289,"kind":"bool","value":false}]}},{"id":296,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":295,"kind":"app","opcode":"actionAny","args":[{"id":292,"kind":"bool","value":false},{"id":293,"kind":"bool","value":true},{"id":294,"kind":"bool","value":false}]}},{"id":301,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":300,"kind":"app","opcode":"ite","args":[{"id":297,"kind":"bool","value":true},{"id":298,"kind":"int","value":1},{"id":299,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319,"depth":0},{"kind":"const","name":"MyFunFun","typeAnnotation":{"id":31,"kind":"fun","arg":{"id":29,"kind":"fun","arg":{"id":27,"kind":"int"},"res":{"id":28,"kind":"str"}},"res":{"id":30,"kind":"bool"}},"id":32,"depth":0},{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}}},{"id":340,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":339,"kind":"app","opcode":"in","args":[{"id":337,"kind":"int","value":1},{"id":338,"kind":"app","opcode":"Set","args":[]}]}},{"kind":"const","name":"MyOperator","typeAnnotation":{"id":36,"kind":"oper","args":[{"id":33,"kind":"int"},{"id":34,"kind":"str"}],"res":{"id":35,"kind":"bool"}},"id":37,"depth":0},{"id":405,"kind":"def","name":"one","qualifier":"val","expr":{"id":404,"kind":"app","opcode":"head","args":[{"id":403,"kind":"app","opcode":"List","args":[{"id":401,"kind":"int","value":1},{"id":402,"kind":"int","value":2}]}]}},{"id":410,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":409,"kind":"app","opcode":"Tup","args":[{"id":406,"kind":"int","value":1},{"id":407,"kind":"int","value":2},{"id":408,"kind":"int","value":3}]}},{"id":415,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":414,"kind":"app","opcode":"Tup","args":[{"id":411,"kind":"int","value":1},{"id":412,"kind":"int","value":2},{"id":413,"kind":"int","value":3}]}},{"id":419,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":418,"kind":"app","opcode":"Tup","args":[{"id":416,"kind":"int","value":4},{"id":417,"kind":"int","value":5}]}},{"kind":"const","name":"MyOperatorWithComma","typeAnnotation":{"id":41,"kind":"oper","args":[{"id":38,"kind":"int"},{"id":39,"kind":"str"}],"res":{"id":40,"kind":"bool"}},"id":42,"depth":0},{"id":424,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":423,"kind":"app","opcode":"List","args":[{"id":420,"kind":"int","value":1},{"id":421,"kind":"int","value":2},{"id":422,"kind":"int","value":3}]}},{"id":429,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"List","args":[{"id":425,"kind":"int","value":1},{"id":426,"kind":"int","value":2},{"id":427,"kind":"int","value":3}]}},{"id":436,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":435,"kind":"app","opcode":"nth","args":[{"id":433,"kind":"app","opcode":"List","args":[{"id":430,"kind":"int","value":2},{"id":431,"kind":"int","value":3},{"id":432,"kind":"int","value":4}]},{"id":434,"kind":"int","value":2}]}},{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]}},{"id":448,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Rec","args":[{"id":443,"kind":"str","value":"name"},{"id":444,"kind":"str","value":"igor"},{"id":445,"kind":"str","value":"year"},{"id":446,"kind":"int","value":1981}]}},{"id":461,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":460,"kind":"app","opcode":"Set","args":[{"id":457,"kind":"int","value":1},{"id":458,"kind":"int","value":2},{"id":459,"kind":"int","value":3}]}},{"kind":"const","name":"MyTuple","typeAnnotation":{"id":46,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":43,"kind":"int"}},{"fieldName":"1","fieldType":{"id":44,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":45,"kind":"str"}}],"other":{"kind":"empty"}}},"id":47,"depth":0},{"id":491,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":490,"kind":"app","opcode":"in","args":[{"id":488,"kind":"int","value":2},{"id":489,"kind":"app","opcode":"Set","args":[]}]}},{"id":495,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":494,"kind":"app","opcode":"subseteq","args":[{"id":492,"kind":"app","opcode":"Set","args":[]},{"id":493,"kind":"app","opcode":"Set","args":[]}]}},{"id":504,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":503,"kind":"app","opcode":"in","args":[{"id":497,"kind":"app","opcode":"Set","args":[{"id":496,"kind":"int","value":1}]},{"id":502,"kind":"app","opcode":"powerset","args":[{"id":501,"kind":"app","opcode":"Set","args":[{"id":498,"kind":"int","value":1},{"id":499,"kind":"int","value":2},{"id":500,"kind":"int","value":3}]}]}]}},{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}},"depth":0},{"id":518,"kind":"typedef","name":"UNINTERPRETED_TYPE","depth":0},{"kind":"const","name":"MyTupleWithComma","typeAnnotation":{"id":51,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":48,"kind":"int"}},{"fieldName":"1","fieldType":{"id":49,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":50,"kind":"str"}}],"other":{"kind":"empty"}}},"id":52,"depth":0},{"kind":"const","name":"MyRecord","typeAnnotation":{"id":56,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":53,"kind":"int"}},{"fieldName":"b","fieldType":{"id":54,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":55,"kind":"str"}}],"other":{"kind":"empty"}}},"id":57,"depth":0},{"kind":"const","name":"MyRecordWithComma","typeAnnotation":{"id":61,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":58,"kind":"int"}},{"fieldName":"b","fieldType":{"id":59,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":60,"kind":"str"}}],"other":{"kind":"empty"}}},"id":62,"depth":0},{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},{"kind":"var","name":"i","typeAnnotation":{"id":90,"kind":"int"},"id":91,"depth":0},{"kind":"var","name":"j","typeAnnotation":{"id":92,"kind":"bool"},"id":93,"depth":0},{"id":97,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":96,"kind":"app","opcode":"iadd","args":[{"id":94,"kind":"int","value":1},{"id":95,"kind":"int","value":2}]}},{"id":160,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":159,"kind":"app","opcode":"exists","args":[{"id":155,"kind":"name","name":"Bool"},{"id":158,"kind":"lambda","params":[{"id":156,"name":"x"}],"qualifier":"def","expr":{"id":157,"kind":"name","name":"x"}}]}},{"id":171,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":170,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":169,"kind":"set","elem":{"id":168,"kind":"const","name":"PROC"}}},{"id":182,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":181,"kind":"lambda","params":[{"id":176,"name":"x"},{"id":177,"name":"y"}],"qualifier":"puredef","expr":{"id":180,"kind":"app","opcode":"iadd","args":[{"id":178,"kind":"name","name":"x"},{"id":179,"kind":"name","name":"y"}]}}},{"id":188,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":187,"kind":"lambda","params":[{"id":183,"name":"factor"}],"qualifier":"def","expr":{"id":186,"kind":"app","opcode":"imul","args":[{"id":184,"kind":"name","name":"factor"},{"id":185,"kind":"name","name":"n"}]}}},{"id":194,"kind":"def","name":"A","qualifier":"action","expr":{"id":193,"kind":"lambda","params":[{"id":189,"name":"x"}],"qualifier":"action","expr":{"id":192,"kind":"app","opcode":"assign","args":[{"id":191,"kind":"name","name":"n"},{"id":190,"kind":"name","name":"x"}]}}},{"id":199,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":198,"kind":"lambda","params":[{"id":195,"name":"x"}],"qualifier":"puredef","expr":{"id":197,"kind":"app","opcode":"not","args":[{"id":196,"kind":"name","name":"x"}]}}},{"id":210,"kind":"def","name":"H","qualifier":"def","expr":{"id":209,"kind":"lambda","params":[{"id":200,"name":"x"},{"id":201,"name":"y"}],"qualifier":"def","expr":{"id":208,"kind":"app","opcode":"iadd","args":[{"id":206,"kind":"name","name":"x"},{"id":207,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":205,"kind":"oper","args":[{"id":202,"kind":"int"},{"id":203,"kind":"int"}],"res":{"id":204,"kind":"int"}}},{"id":217,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":216,"kind":"lambda","params":[{"id":211,"name":"x"}],"qualifier":"def","expr":{"id":215,"kind":"name","name":"x"}},"typeAnnotation":{"id":214,"kind":"oper","args":[{"id":212,"kind":"var","name":"a"}],"res":{"id":213,"kind":"var","name":"a"}}},{"id":223,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":222,"kind":"app","opcode":"assign","args":[{"id":221,"kind":"name","name":"k"},{"id":220,"kind":"int","value":3}]}},{"id":236,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":235,"kind":"lambda","params":[{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"}},{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"}}],"qualifier":"puredef","expr":{"id":234,"kind":"app","opcode":"ite","args":[{"id":231,"kind":"app","opcode":"ilt","args":[{"id":229,"kind":"name","name":"x"},{"id":230,"kind":"name","name":"y"}]},{"id":232,"kind":"name","name":"x"},{"id":233,"kind":"name","name":"y"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":224,"kind":"int"},{"id":226,"kind":"int"}],"res":{"id":228,"kind":"int"}}},{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}}},{"id":315,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":314,"kind":"lambda","params":[{"id":302,"name":"x"},{"id":303,"name":"y"}],"qualifier":"def","expr":{"id":313,"kind":"app","opcode":"ite","args":[{"id":306,"kind":"app","opcode":"ilt","args":[{"id":304,"kind":"name","name":"x"},{"id":305,"kind":"int","value":10}]},{"id":309,"kind":"app","opcode":"iadd","args":[{"id":307,"kind":"name","name":"y"},{"id":308,"kind":"int","value":5}]},{"id":312,"kind":"app","opcode":"imod","args":[{"id":310,"kind":"name","name":"y"},{"id":311,"kind":"int","value":5}]}]}}},{"id":323,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"get","args":[{"id":320,"kind":"name","name":"f1"},{"id":321,"kind":"str","value":"a"}]}},{"id":332,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":331,"kind":"app","opcode":"MyOper","args":[{"id":329,"kind":"str","value":"a"},{"id":330,"kind":"int","value":42}]}},{"id":336,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":335,"kind":"app","opcode":"MyOper","args":[{"id":333,"kind":"str","value":"a"},{"id":334,"kind":"int","value":42}]}},{"id":348,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":347,"kind":"app","opcode":"filter","args":[{"id":341,"kind":"name","name":"S"},{"id":346,"kind":"lambda","params":[{"id":342,"name":"x"}],"qualifier":"def","expr":{"id":345,"kind":"app","opcode":"igt","args":[{"id":343,"kind":"name","name":"x"},{"id":344,"kind":"int","value":10}]}}]}},{"id":386,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":385,"kind":"app","opcode":"filter","args":[{"id":381,"kind":"name","name":"S"},{"id":384,"kind":"lambda","params":[{"id":382,"name":"_"}],"qualifier":"def","expr":{"id":383,"kind":"bool","value":true}}]}},{"id":394,"kind":"def","name":"f","qualifier":"val","expr":{"id":393,"kind":"app","opcode":"mapBy","args":[{"id":387,"kind":"name","name":"S"},{"id":392,"kind":"lambda","params":[{"id":388,"name":"x"}],"qualifier":"def","expr":{"id":391,"kind":"app","opcode":"iadd","args":[{"id":389,"kind":"name","name":"x"},{"id":390,"kind":"int","value":1}]}}]}},{"id":400,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":399,"kind":"app","opcode":"exclude","args":[{"id":395,"kind":"name","name":"S"},{"id":398,"kind":"app","opcode":"Set","args":[{"id":396,"kind":"int","value":3},{"id":397,"kind":"int","value":4}]}]}},{"id":456,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":455,"kind":"app","opcode":"with","args":[{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"name","name":"test_record"},{"id":450,"kind":"str","value":"name"},{"id":449,"kind":"str","value":"quint"}]},{"id":452,"kind":"str","value":"year"},{"id":451,"kind":"int","value":2023}]}},{"id":472,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":471,"kind":"let","opdef":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]}},"expr":{"id":470,"kind":"app","opcode":"field","args":[{"id":468,"kind":"name","name":"my_rec"},{"id":469,"kind":"str","value":"a"}]}}},{"id":481,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":480,"kind":"let","opdef":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]}},"expr":{"id":479,"kind":"app","opcode":"item","args":[{"id":477,"kind":"name","name":"my_tup"},{"id":478,"kind":"int","value":2}]}}},{"id":487,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":486,"kind":"lambda","params":[{"id":482,"name":"s"}],"qualifier":"def","expr":{"id":485,"kind":"app","opcode":"eq","args":[{"id":483,"kind":"name","name":"s"},{"id":484,"kind":"app","opcode":"List","args":[]}]}}},{"id":508,"kind":"assume","name":"positive","assumption":{"id":507,"kind":"app","opcode":"igt","args":[{"id":505,"kind":"name","name":"N"},{"id":506,"kind":"int","value":0}]},"depth":0},{"id":512,"kind":"assume","name":"_","assumption":{"id":511,"kind":"app","opcode":"neq","args":[{"id":509,"kind":"name","name":"N"},{"id":510,"kind":"int","value":0}]}},{"id":513,"kind":"import","defName":"foo","protoName":"M1"},{"id":514,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":519,"kind":"const","name":"INT_SET"},"id":520,"depth":0},{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},{"id":75,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":74,"kind":"lambda","params":[{"id":71,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":73,"kind":"app","opcode":"variant","args":[{"id":70,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":72}]}}},{"id":81,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":80,"kind":"lambda","params":[{"id":77,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":79,"kind":"app","opcode":"variant","args":[{"id":76,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":78}]}}},{"id":87,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":86,"kind":"lambda","params":[{"id":83,"name":"__DogParam"}],"qualifier":"def","expr":{"id":85,"kind":"app","opcode":"variant","args":[{"id":82,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":84}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":88,"kind":"const","name":"MyUnionType"},"id":89,"depth":0},{"id":260,"kind":"def","name":"G","qualifier":"def","expr":{"id":259,"kind":"lambda","params":[{"id":253,"name":"x"}],"qualifier":"def","expr":{"id":258,"kind":"app","opcode":"and","args":[{"id":255,"kind":"app","opcode":"F","args":[{"id":254,"kind":"name","name":"x"}]},{"id":257,"kind":"app","opcode":"not","args":[{"id":256,"kind":"name","name":"x"}]}]}}},{"id":268,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":267,"kind":"lambda","params":[{"id":261,"name":"x"}],"qualifier":"def","expr":{"id":266,"kind":"app","opcode":"and","args":[{"id":263,"kind":"app","opcode":"F","args":[{"id":262,"kind":"name","name":"x"}]},{"id":265,"kind":"app","opcode":"not","args":[{"id":264,"kind":"name","name":"x"}]}]}}},{"id":276,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":275,"kind":"lambda","params":[{"id":269,"name":"x"}],"qualifier":"def","expr":{"id":274,"kind":"app","opcode":"or","args":[{"id":271,"kind":"app","opcode":"F","args":[{"id":270,"kind":"name","name":"x"}]},{"id":273,"kind":"app","opcode":"not","args":[{"id":272,"kind":"name","name":"x"}]}]}}},{"id":368,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":367,"kind":"app","opcode":"map","args":[{"id":351,"kind":"app","opcode":"tuples","args":[{"id":349,"kind":"name","name":"S"},{"id":350,"kind":"name","name":"MySet"}]},{"id":366,"kind":"lambda","params":[{"id":357,"name":"quintTupledLambdaParam357"}],"qualifier":"def","expr":{"id":362,"kind":"let","opdef":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]}},"expr":{"id":358,"kind":"let","opdef":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]}},"expr":{"id":356,"kind":"app","opcode":"iadd","args":[{"id":354,"kind":"name","name":"s"},{"id":355,"kind":"name","name":"mys"}]}}}}]}},{"id":380,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":379,"kind":"let","opdef":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]}},"expr":{"id":378,"kind":"app","opcode":"actionAll","args":[{"id":374,"kind":"app","opcode":"igt","args":[{"id":372,"kind":"name","name":"x"},{"id":373,"kind":"int","value":10}]},{"id":377,"kind":"app","opcode":"assign","args":[{"id":376,"kind":"name","name":"k"},{"id":375,"kind":"name","name":"x"}]}]}}}]}],"table":{"2":{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4},"depth":0},"5":{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4},"depth":0},"69":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"72":{"id":71,"name":"__CircleParam","kind":"param","depth":1},"75":{"id":75,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":74,"kind":"lambda","params":[{"id":71,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":73,"kind":"app","opcode":"variant","args":[{"id":70,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":72}]}},"depth":0},"78":{"id":77,"name":"__RectangleParam","kind":"param","depth":1},"81":{"id":81,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":80,"kind":"lambda","params":[{"id":77,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":79,"kind":"app","opcode":"variant","args":[{"id":76,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":78}]}},"depth":0},"84":{"id":83,"name":"__DogParam","kind":"param","depth":1},"87":{"id":87,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":86,"kind":"lambda","params":[{"id":83,"name":"__DogParam"}],"qualifier":"def","expr":{"id":85,"kind":"app","opcode":"variant","args":[{"id":82,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":84}]}},"depth":0},"88":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"97":{"id":97,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":96,"kind":"app","opcode":"iadd","args":[{"id":94,"kind":"int","value":1},{"id":95,"kind":"int","value":2}]},"depth":0},"101":{"id":101,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":100,"kind":"app","opcode":"isub","args":[{"id":98,"kind":"int","value":1},{"id":99,"kind":"int","value":2}]},"depth":0},"105":{"id":105,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":104,"kind":"app","opcode":"imul","args":[{"id":102,"kind":"int","value":2},{"id":103,"kind":"int","value":3}]},"depth":0},"109":{"id":109,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":108,"kind":"app","opcode":"idiv","args":[{"id":106,"kind":"int","value":2},{"id":107,"kind":"int","value":3}]},"depth":0},"113":{"id":113,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":112,"kind":"app","opcode":"imod","args":[{"id":110,"kind":"int","value":2},{"id":111,"kind":"int","value":3}]},"depth":0},"117":{"id":117,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":116,"kind":"app","opcode":"ipow","args":[{"id":114,"kind":"int","value":2},{"id":115,"kind":"int","value":3}]},"depth":0},"120":{"id":120,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":119,"kind":"app","opcode":"iuminus","args":[{"id":118,"kind":"int","value":100}]},"depth":0},"124":{"id":124,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":123,"kind":"app","opcode":"igt","args":[{"id":121,"kind":"int","value":2},{"id":122,"kind":"int","value":3}]},"depth":0},"128":{"id":128,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":127,"kind":"app","opcode":"igte","args":[{"id":125,"kind":"int","value":2},{"id":126,"kind":"int","value":3}]},"depth":0},"132":{"id":132,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":131,"kind":"app","opcode":"ilt","args":[{"id":129,"kind":"int","value":2},{"id":130,"kind":"int","value":3}]},"depth":0},"136":{"id":136,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":135,"kind":"app","opcode":"ilte","args":[{"id":133,"kind":"int","value":2},{"id":134,"kind":"int","value":3}]},"depth":0},"140":{"id":140,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":139,"kind":"app","opcode":"eq","args":[{"id":137,"kind":"int","value":2},{"id":138,"kind":"int","value":3}]},"depth":0},"144":{"id":144,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":143,"kind":"app","opcode":"neq","args":[{"id":141,"kind":"int","value":2},{"id":142,"kind":"int","value":3}]},"depth":0},"150":{"id":150,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":149,"kind":"app","opcode":"eq","args":[{"id":147,"kind":"app","opcode":"iadd","args":[{"id":145,"kind":"int","value":2},{"id":146,"kind":"int","value":2}]},{"id":148,"kind":"int","value":4}]},"depth":0},"154":{"id":154,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":153,"kind":"app","opcode":"in","args":[{"id":151,"kind":"int","value":1},{"id":152,"kind":"name","name":"Nat"}]},"depth":0},"157":{"id":156,"name":"x","kind":"param","depth":1},"160":{"id":160,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":159,"kind":"app","opcode":"exists","args":[{"id":155,"kind":"name","name":"Bool"},{"id":158,"kind":"lambda","params":[{"id":156,"name":"x"}],"qualifier":"def","expr":{"id":157,"kind":"name","name":"x"}}]},"depth":0},"166":{"id":166,"kind":"def","name":"withType","qualifier":"val","expr":{"id":165,"kind":"app","opcode":"Set","args":[{"id":163,"kind":"int","value":1},{"id":164,"kind":"int","value":2}]},"typeAnnotation":{"id":162,"kind":"set","elem":{"id":161,"kind":"int"}},"depth":0},"168":{"id":167,"kind":"typedef","name":"PROC","depth":0},"171":{"id":171,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":170,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":169,"kind":"set","elem":{"id":168,"kind":"const","name":"PROC"}},"depth":0},"175":{"id":175,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":174,"kind":"int","value":42},"depth":0},"178":{"id":176,"name":"x","kind":"param","depth":1,"shadowing":false},"179":{"id":177,"name":"y","kind":"param","depth":1},"182":{"id":182,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":181,"kind":"lambda","params":[{"id":176,"name":"x"},{"id":177,"name":"y"}],"qualifier":"puredef","expr":{"id":180,"kind":"app","opcode":"iadd","args":[{"id":178,"kind":"name","name":"x"},{"id":179,"kind":"name","name":"y"}]}},"depth":0},"184":{"id":183,"name":"factor","kind":"param","depth":1},"185":{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},"188":{"id":188,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":187,"kind":"lambda","params":[{"id":183,"name":"factor"}],"qualifier":"def","expr":{"id":186,"kind":"app","opcode":"imul","args":[{"id":184,"kind":"name","name":"factor"},{"id":185,"kind":"name","name":"n"}]}},"depth":0},"190":{"id":189,"name":"x","kind":"param","depth":1,"shadowing":false},"191":{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},"194":{"id":194,"kind":"def","name":"A","qualifier":"action","expr":{"id":193,"kind":"lambda","params":[{"id":189,"name":"x"}],"qualifier":"action","expr":{"id":192,"kind":"app","opcode":"assign","args":[{"id":191,"kind":"name","name":"n"},{"id":190,"kind":"name","name":"x"}]}},"depth":0},"196":{"id":195,"name":"x","kind":"param","depth":1,"shadowing":false},"199":{"id":199,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":198,"kind":"lambda","params":[{"id":195,"name":"x"}],"qualifier":"puredef","expr":{"id":197,"kind":"app","opcode":"not","args":[{"id":196,"kind":"name","name":"x"}]}},"depth":0},"206":{"id":200,"name":"x","kind":"param","depth":1,"shadowing":false},"207":{"id":201,"name":"y","kind":"param","depth":1,"shadowing":false},"210":{"id":210,"kind":"def","name":"H","qualifier":"def","expr":{"id":209,"kind":"lambda","params":[{"id":200,"name":"x"},{"id":201,"name":"y"}],"qualifier":"def","expr":{"id":208,"kind":"app","opcode":"iadd","args":[{"id":206,"kind":"name","name":"x"},{"id":207,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":205,"kind":"oper","args":[{"id":202,"kind":"int"},{"id":203,"kind":"int"}],"res":{"id":204,"kind":"int"}},"depth":0},"215":{"id":211,"name":"x","kind":"param","depth":1,"shadowing":false},"217":{"id":217,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":216,"kind":"lambda","params":[{"id":211,"name":"x"}],"qualifier":"def","expr":{"id":215,"kind":"name","name":"x"}},"typeAnnotation":{"id":214,"kind":"oper","args":[{"id":212,"kind":"var","name":"a"}],"res":{"id":213,"kind":"var","name":"a"}},"depth":0},"221":{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},"223":{"id":223,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":222,"kind":"app","opcode":"assign","args":[{"id":221,"kind":"name","name":"k"},{"id":220,"kind":"int","value":3}]},"depth":0},"229":{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"},"kind":"param","depth":1,"shadowing":false},"230":{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"},"kind":"param","depth":1,"shadowing":false},"232":{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"},"kind":"param","depth":1,"shadowing":false},"233":{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"},"kind":"param","depth":1,"shadowing":false},"236":{"id":236,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":235,"kind":"lambda","params":[{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"}},{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"}}],"qualifier":"puredef","expr":{"id":234,"kind":"app","opcode":"ite","args":[{"id":231,"kind":"app","opcode":"ilt","args":[{"id":229,"kind":"name","name":"x"},{"id":230,"kind":"name","name":"y"}]},{"id":232,"kind":"name","name":"x"},{"id":233,"kind":"name","name":"y"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":224,"kind":"int"},{"id":226,"kind":"int"}],"res":{"id":228,"kind":"int"}},"depth":0},"240":{"id":240,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":239,"kind":"app","opcode":"and","args":[{"id":237,"kind":"bool","value":false},{"id":238,"kind":"bool","value":true}]},"depth":0},"244":{"id":244,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":243,"kind":"app","opcode":"or","args":[{"id":241,"kind":"bool","value":false},{"id":242,"kind":"bool","value":true}]},"depth":0},"248":{"id":248,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":247,"kind":"app","opcode":"implies","args":[{"id":245,"kind":"bool","value":false},{"id":246,"kind":"bool","value":true}]},"depth":0},"250":{"id":249,"name":"x","kind":"param","depth":1,"shadowing":false},"252":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"254":{"id":253,"name":"x","kind":"param","depth":1,"shadowing":false},"255":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"256":{"id":253,"name":"x","kind":"param","depth":1,"shadowing":false},"260":{"id":260,"kind":"def","name":"G","qualifier":"def","expr":{"id":259,"kind":"lambda","params":[{"id":253,"name":"x"}],"qualifier":"def","expr":{"id":258,"kind":"app","opcode":"and","args":[{"id":255,"kind":"app","opcode":"F","args":[{"id":254,"kind":"name","name":"x"}]},{"id":257,"kind":"app","opcode":"not","args":[{"id":256,"kind":"name","name":"x"}]}]}},"depth":0},"262":{"id":261,"name":"x","kind":"param","depth":1,"shadowing":false},"263":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"264":{"id":261,"name":"x","kind":"param","depth":1,"shadowing":false},"268":{"id":268,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":267,"kind":"lambda","params":[{"id":261,"name":"x"}],"qualifier":"def","expr":{"id":266,"kind":"app","opcode":"and","args":[{"id":263,"kind":"app","opcode":"F","args":[{"id":262,"kind":"name","name":"x"}]},{"id":265,"kind":"app","opcode":"not","args":[{"id":264,"kind":"name","name":"x"}]}]}},"depth":0},"270":{"id":269,"name":"x","kind":"param","depth":1,"shadowing":false},"271":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"272":{"id":269,"name":"x","kind":"param","depth":1,"shadowing":false},"276":{"id":276,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":275,"kind":"lambda","params":[{"id":269,"name":"x"}],"qualifier":"def","expr":{"id":274,"kind":"app","opcode":"or","args":[{"id":271,"kind":"app","opcode":"F","args":[{"id":270,"kind":"name","name":"x"}]},{"id":273,"kind":"app","opcode":"not","args":[{"id":272,"kind":"name","name":"x"}]}]}},"depth":0},"281":{"id":281,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":280,"kind":"app","opcode":"and","args":[{"id":277,"kind":"bool","value":false},{"id":278,"kind":"bool","value":true},{"id":279,"kind":"bool","value":false}]},"depth":0},"286":{"id":286,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":285,"kind":"app","opcode":"actionAll","args":[{"id":282,"kind":"bool","value":false},{"id":283,"kind":"bool","value":true},{"id":284,"kind":"bool","value":false}]},"depth":0},"291":{"id":291,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":290,"kind":"app","opcode":"or","args":[{"id":287,"kind":"bool","value":false},{"id":288,"kind":"bool","value":true},{"id":289,"kind":"bool","value":false}]},"depth":0},"296":{"id":296,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":295,"kind":"app","opcode":"actionAny","args":[{"id":292,"kind":"bool","value":false},{"id":293,"kind":"bool","value":true},{"id":294,"kind":"bool","value":false}]},"depth":0},"301":{"id":301,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":300,"kind":"app","opcode":"ite","args":[{"id":297,"kind":"bool","value":true},{"id":298,"kind":"int","value":1},{"id":299,"kind":"int","value":0}]},"depth":0},"304":{"id":302,"name":"x","kind":"param","depth":1,"shadowing":false},"307":{"id":303,"name":"y","kind":"param","depth":1,"shadowing":false},"310":{"id":303,"name":"y","kind":"param","depth":1,"shadowing":false},"315":{"id":315,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":314,"kind":"lambda","params":[{"id":302,"name":"x"},{"id":303,"name":"y"}],"qualifier":"def","expr":{"id":313,"kind":"app","opcode":"ite","args":[{"id":306,"kind":"app","opcode":"ilt","args":[{"id":304,"kind":"name","name":"x"},{"id":305,"kind":"int","value":10}]},{"id":309,"kind":"app","opcode":"iadd","args":[{"id":307,"kind":"name","name":"y"},{"id":308,"kind":"int","value":5}]},{"id":312,"kind":"app","opcode":"imod","args":[{"id":310,"kind":"name","name":"y"},{"id":311,"kind":"int","value":5}]}]}},"depth":0},"320":{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319,"depth":0},"323":{"id":323,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"get","args":[{"id":320,"kind":"name","name":"f1"},{"id":321,"kind":"str","value":"a"}]},"depth":0},"328":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"331":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"332":{"id":332,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":331,"kind":"app","opcode":"MyOper","args":[{"id":329,"kind":"str","value":"a"},{"id":330,"kind":"int","value":42}]},"depth":0},"335":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"336":{"id":336,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":335,"kind":"app","opcode":"MyOper","args":[{"id":333,"kind":"str","value":"a"},{"id":334,"kind":"int","value":42}]},"depth":0},"340":{"id":340,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":339,"kind":"app","opcode":"in","args":[{"id":337,"kind":"int","value":1},{"id":338,"kind":"app","opcode":"Set","args":[]}]},"depth":0},"341":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"343":{"id":342,"name":"x","kind":"param","depth":1,"shadowing":false},"348":{"id":348,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":347,"kind":"app","opcode":"filter","args":[{"id":341,"kind":"name","name":"S"},{"id":346,"kind":"lambda","params":[{"id":342,"name":"x"}],"qualifier":"def","expr":{"id":345,"kind":"app","opcode":"igt","args":[{"id":343,"kind":"name","name":"x"},{"id":344,"kind":"int","value":10}]}}]},"depth":0},"349":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"350":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19,"depth":0},"352":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]},"depth":4},"353":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]},"depth":3},"354":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]},"depth":4},"355":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]},"depth":3},"360":{"id":357,"name":"quintTupledLambdaParam357","kind":"param","depth":1},"364":{"id":357,"name":"quintTupledLambdaParam357","kind":"param","depth":1},"368":{"id":368,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":367,"kind":"app","opcode":"map","args":[{"id":351,"kind":"app","opcode":"tuples","args":[{"id":349,"kind":"name","name":"S"},{"id":350,"kind":"name","name":"MySet"}]},{"id":366,"kind":"lambda","params":[{"id":357,"name":"quintTupledLambdaParam357"}],"qualifier":"def","expr":{"id":362,"kind":"let","opdef":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]}},"expr":{"id":358,"kind":"let","opdef":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]}},"expr":{"id":356,"kind":"app","opcode":"iadd","args":[{"id":354,"kind":"name","name":"s"},{"id":355,"kind":"name","name":"mys"}]}}}}]},"depth":0},"369":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"371":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":2,"shadowing":false},"372":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":2,"shadowing":false},"375":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":2,"shadowing":false},"376":{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},"380":{"id":380,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":379,"kind":"let","opdef":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]}},"expr":{"id":378,"kind":"app","opcode":"actionAll","args":[{"id":374,"kind":"app","opcode":"igt","args":[{"id":372,"kind":"name","name":"x"},{"id":373,"kind":"int","value":10}]},{"id":377,"kind":"app","opcode":"assign","args":[{"id":376,"kind":"name","name":"k"},{"id":375,"kind":"name","name":"x"}]}]}},"depth":0},"381":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"386":{"id":386,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":385,"kind":"app","opcode":"filter","args":[{"id":381,"kind":"name","name":"S"},{"id":384,"kind":"lambda","params":[{"id":382,"name":"_"}],"qualifier":"def","expr":{"id":383,"kind":"bool","value":true}}]},"depth":0},"387":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"389":{"id":388,"name":"x","kind":"param","depth":1,"shadowing":false},"394":{"id":394,"kind":"def","name":"f","qualifier":"val","expr":{"id":393,"kind":"app","opcode":"mapBy","args":[{"id":387,"kind":"name","name":"S"},{"id":392,"kind":"lambda","params":[{"id":388,"name":"x"}],"qualifier":"def","expr":{"id":391,"kind":"app","opcode":"iadd","args":[{"id":389,"kind":"name","name":"x"},{"id":390,"kind":"int","value":1}]}}]},"depth":0},"395":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"400":{"id":400,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":399,"kind":"app","opcode":"exclude","args":[{"id":395,"kind":"name","name":"S"},{"id":398,"kind":"app","opcode":"Set","args":[{"id":396,"kind":"int","value":3},{"id":397,"kind":"int","value":4}]}]},"depth":0},"405":{"id":405,"kind":"def","name":"one","qualifier":"val","expr":{"id":404,"kind":"app","opcode":"head","args":[{"id":403,"kind":"app","opcode":"List","args":[{"id":401,"kind":"int","value":1},{"id":402,"kind":"int","value":2}]}]},"depth":0},"410":{"id":410,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":409,"kind":"app","opcode":"Tup","args":[{"id":406,"kind":"int","value":1},{"id":407,"kind":"int","value":2},{"id":408,"kind":"int","value":3}]},"depth":0},"415":{"id":415,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":414,"kind":"app","opcode":"Tup","args":[{"id":411,"kind":"int","value":1},{"id":412,"kind":"int","value":2},{"id":413,"kind":"int","value":3}]},"depth":0},"419":{"id":419,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":418,"kind":"app","opcode":"Tup","args":[{"id":416,"kind":"int","value":4},{"id":417,"kind":"int","value":5}]},"depth":0},"424":{"id":424,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":423,"kind":"app","opcode":"List","args":[{"id":420,"kind":"int","value":1},{"id":421,"kind":"int","value":2},{"id":422,"kind":"int","value":3}]},"depth":0},"429":{"id":429,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"List","args":[{"id":425,"kind":"int","value":1},{"id":426,"kind":"int","value":2},{"id":427,"kind":"int","value":3}]},"depth":0},"436":{"id":436,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":435,"kind":"app","opcode":"nth","args":[{"id":433,"kind":"app","opcode":"List","args":[{"id":430,"kind":"int","value":2},{"id":431,"kind":"int","value":3},{"id":432,"kind":"int","value":4}]},{"id":434,"kind":"int","value":2}]},"depth":0},"442":{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]},"depth":0},"448":{"id":448,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Rec","args":[{"id":443,"kind":"str","value":"name"},{"id":444,"kind":"str","value":"igor"},{"id":445,"kind":"str","value":"year"},{"id":446,"kind":"int","value":1981}]},"depth":0},"453":{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]},"depth":0},"456":{"id":456,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":455,"kind":"app","opcode":"with","args":[{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"name","name":"test_record"},{"id":450,"kind":"str","value":"name"},{"id":449,"kind":"str","value":"quint"}]},{"id":452,"kind":"str","value":"year"},{"id":451,"kind":"int","value":2023}]},"depth":0},"461":{"id":461,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":460,"kind":"app","opcode":"Set","args":[{"id":457,"kind":"int","value":1},{"id":458,"kind":"int","value":2},{"id":459,"kind":"int","value":3}]},"depth":0},"467":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]},"depth":2},"468":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]},"depth":2},"472":{"id":472,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":471,"kind":"let","opdef":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]}},"expr":{"id":470,"kind":"app","opcode":"field","args":[{"id":468,"kind":"name","name":"my_rec"},{"id":469,"kind":"str","value":"a"}]}},"depth":0},"476":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]},"depth":2},"477":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]},"depth":2},"481":{"id":481,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":480,"kind":"let","opdef":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]}},"expr":{"id":479,"kind":"app","opcode":"item","args":[{"id":477,"kind":"name","name":"my_tup"},{"id":478,"kind":"int","value":2}]}},"depth":0},"483":{"id":482,"name":"s","kind":"param","depth":1,"shadowing":false},"487":{"id":487,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":486,"kind":"lambda","params":[{"id":482,"name":"s"}],"qualifier":"def","expr":{"id":485,"kind":"app","opcode":"eq","args":[{"id":483,"kind":"name","name":"s"},{"id":484,"kind":"app","opcode":"List","args":[]}]}},"depth":0},"491":{"id":491,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":490,"kind":"app","opcode":"in","args":[{"id":488,"kind":"int","value":2},{"id":489,"kind":"app","opcode":"Set","args":[]}]},"depth":0},"495":{"id":495,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":494,"kind":"app","opcode":"subseteq","args":[{"id":492,"kind":"app","opcode":"Set","args":[]},{"id":493,"kind":"app","opcode":"Set","args":[]}]},"depth":0},"504":{"id":504,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":503,"kind":"app","opcode":"in","args":[{"id":497,"kind":"app","opcode":"Set","args":[{"id":496,"kind":"int","value":1}]},{"id":502,"kind":"app","opcode":"powerset","args":[{"id":501,"kind":"app","opcode":"Set","args":[{"id":498,"kind":"int","value":1},{"id":499,"kind":"int","value":2},{"id":500,"kind":"int","value":3}]}]}]},"depth":0},"505":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"509":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"519":{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}},"depth":0},"521":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"522":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":521,"depth":0,"importedFrom":{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_0099unorderedDefs.json b/quint/testFixture/_0099unorderedDefs.json index 4fe24b7f7..9133a4742 100644 --- a/quint/testFixture/_0099unorderedDefs.json +++ b/quint/testFixture/_0099unorderedDefs.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":14,"name":"unorderedDefs","declarations":[{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}}},{"id":6,"kind":"def","name":"double","qualifier":"puredef","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":4,"kind":"app","opcode":"plus","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"name","name":"x"}]}}}]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1},"3":{"id":1,"name":"x","kind":"param","depth":1},"4":{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}},"depth":0},"6":{"id":6,"kind":"def","name":"double","qualifier":"puredef","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":4,"kind":"app","opcode":"plus","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"name","name":"x"}]}},"depth":0},"9":{"id":7,"name":"x","kind":"param","depth":1},"10":{"id":8,"name":"y","kind":"param","depth":1},"13":{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}},"depth":0}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":14,"name":"unorderedDefs","declarations":[{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}}},{"id":6,"kind":"def","name":"double","qualifier":"puredef","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":4,"kind":"app","opcode":"plus","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"name","name":"x"}]}}}]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1},"3":{"id":1,"name":"x","kind":"param","depth":1},"4":{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}},"depth":0},"6":{"id":6,"kind":"def","name":"double","qualifier":"puredef","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":4,"kind":"app","opcode":"plus","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"name","name":"x"}]}},"depth":0},"9":{"id":7,"name":"x","kind":"param","depth":1,"shadowing":false},"10":{"id":8,"name":"y","kind":"param","depth":1},"13":{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_0100cyclicDefs.json b/quint/testFixture/_0100cyclicDefs.json index 639d8a152..3b57dcac4 100644 --- a/quint/testFixture/_0100cyclicDefs.json +++ b/quint/testFixture/_0100cyclicDefs.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":16,"name":"cyclicDefs","declarations":[]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1},"3":{"id":10,"kind":"def","name":"bar","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"baz","args":[{"id":7,"kind":"name","name":"x"}]}},"depth":0},"5":{"id":5,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":4,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":3,"kind":"app","opcode":"bar","args":[{"id":2,"kind":"name","name":"x"}]}},"depth":0},"7":{"id":6,"name":"x","kind":"param","depth":1},"8":{"id":15,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"x"}],"qualifier":"puredef","expr":{"id":13,"kind":"app","opcode":"foo","args":[{"id":12,"kind":"name","name":"x"}]}},"depth":0},"10":{"id":10,"kind":"def","name":"bar","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"baz","args":[{"id":7,"kind":"name","name":"x"}]}},"depth":0},"12":{"id":11,"name":"x","kind":"param","depth":1},"13":{"id":5,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":4,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":3,"kind":"app","opcode":"bar","args":[{"id":2,"kind":"name","name":"x"}]}},"depth":0},"15":{"id":15,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"x"}],"qualifier":"puredef","expr":{"id":13,"kind":"app","opcode":"foo","args":[{"id":12,"kind":"name","name":"x"}]}},"depth":0}},"errors":[{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":2,"col":2,"index":70},"end":{"line":2,"col":25,"index":93}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":3,"col":2,"index":97},"end":{"line":3,"col":25,"index":120}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":4,"col":2,"index":124},"end":{"line":4,"col":25,"index":147}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":16,"name":"cyclicDefs","declarations":[]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1},"3":{"id":10,"kind":"def","name":"bar","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"baz","args":[{"id":7,"kind":"name","name":"x"}]}},"depth":0},"5":{"id":5,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":4,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":3,"kind":"app","opcode":"bar","args":[{"id":2,"kind":"name","name":"x"}]}},"depth":0},"7":{"id":6,"name":"x","kind":"param","depth":1,"shadowing":false},"8":{"id":15,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"x"}],"qualifier":"puredef","expr":{"id":13,"kind":"app","opcode":"foo","args":[{"id":12,"kind":"name","name":"x"}]}},"depth":0},"10":{"id":10,"kind":"def","name":"bar","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"baz","args":[{"id":7,"kind":"name","name":"x"}]}},"depth":0},"12":{"id":11,"name":"x","kind":"param","depth":1,"shadowing":false},"13":{"id":5,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":4,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":3,"kind":"app","opcode":"bar","args":[{"id":2,"kind":"name","name":"x"}]}},"depth":0},"15":{"id":15,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"x"}],"qualifier":"puredef","expr":{"id":13,"kind":"app","opcode":"foo","args":[{"id":12,"kind":"name","name":"x"}]}},"depth":0}},"errors":[{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":2,"col":2,"index":70},"end":{"line":2,"col":25,"index":93}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":3,"col":2,"index":97},"end":{"line":3,"col":25,"index":120}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":4,"col":2,"index":124},"end":{"line":4,"col":25,"index":147}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1013unknownTypeLetIn.json b/quint/testFixture/_1013unknownTypeLetIn.json index a189470bf..d3e940ca0 100644 --- a/quint/testFixture/_1013unknownTypeLetIn.json +++ b/quint/testFixture/_1013unknownTypeLetIn.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":9,"name":"unknownTypeLetIn","declarations":[{"id":8,"kind":"def","name":"d","qualifier":"def","expr":{"id":7,"kind":"let","opdef":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":10},"typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"}},"expr":{"id":6,"kind":"app","opcode":"iadd","args":[{"id":4,"kind":"name","name":"x"},{"id":5,"kind":"int","value":1}]}}}]}],"table":{"3":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":10},"typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"},"depth":1},"4":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":10},"typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"},"depth":1},"8":{"id":8,"kind":"def","name":"d","qualifier":"def","expr":{"id":7,"kind":"let","opdef":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":10},"typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"}},"expr":{"id":6,"kind":"app","opcode":"iadd","args":[{"id":4,"kind":"name","name":"x"},{"id":5,"kind":"int","value":1}]}},"depth":0}},"errors":[{"explanation":"[QNT404] Type alias 'UNKNOWN_TYPE' not found","locs":[{"source":"mocked_path/testFixture/_1013unknownTypeLetIn.qnt","start":{"line":2,"col":11,"index":49},"end":{"line":2,"col":22,"index":60}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":9,"name":"unknownTypeLetIn","declarations":[{"id":8,"kind":"def","name":"d","qualifier":"def","expr":{"id":7,"kind":"let","opdef":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":10},"typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"}},"expr":{"id":6,"kind":"app","opcode":"iadd","args":[{"id":4,"kind":"name","name":"x"},{"id":5,"kind":"int","value":1}]}}}]}],"table":{"3":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":10},"typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"},"depth":2},"4":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":10},"typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"},"depth":2},"8":{"id":8,"kind":"def","name":"d","qualifier":"def","expr":{"id":7,"kind":"let","opdef":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":10},"typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"}},"expr":{"id":6,"kind":"app","opcode":"iadd","args":[{"id":4,"kind":"name","name":"x"},{"id":5,"kind":"int","value":1}]}},"depth":0}},"errors":[{"explanation":"[QNT404] Type alias 'UNKNOWN_TYPE' not found","locs":[{"source":"mocked_path/testFixture/_1013unknownTypeLetIn.qnt","start":{"line":2,"col":11,"index":49},"end":{"line":2,"col":22,"index":60}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1025importeeWithError.json b/quint/testFixture/_1025importeeWithError.json index 0ab94dc1b..4c222cf7a 100644 --- a/quint/testFixture/_1025importeeWithError.json +++ b/quint/testFixture/_1025importeeWithError.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"I","declarations":[{"id":9,"kind":"def","name":"x","qualifier":"val","expr":{"id":8,"kind":"let","opdef":{"id":3,"kind":"def","name":"y","qualifier":"val","expr":{"id":2,"kind":"bool","value":true}},"expr":{"id":4,"kind":"let","opdef":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true}},"expr":{"id":7,"kind":"name","name":"__undefinedExprGenerated"}}}}]}],"table":{"3":{"id":3,"kind":"def","name":"y","qualifier":"val","expr":{"id":2,"kind":"bool","value":true},"depth":1},"5":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true},"depth":1},"7":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true},"depth":1},"9":{"id":9,"kind":"def","name":"x","qualifier":"val","expr":{"id":8,"kind":"let","opdef":{"id":3,"kind":"def","name":"y","qualifier":"val","expr":{"id":2,"kind":"bool","value":true}},"expr":{"id":4,"kind":"let","opdef":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true}},"expr":{"id":7,"kind":"name","name":"__undefinedExprGenerated"}}},"depth":0}},"errors":[{"explanation":"[QNT000] mismatched input '}' expecting {'{', '[', 'val', 'def', 'pure', 'action', 'run', 'temporal', 'nondet', 'all', 'any', 'if', '_', STRING, BOOL, INT, 'and', 'or', 'iff', 'implies', 'Map', 'match', '-', '(', 'Set', 'List', LOW_ID, CAP_ID}","locs":[{"source":"mocked_path/testFixture/_1025importeeWithError.qnt","start":{"line":3,"col":0,"index":45},"end":{"line":3,"col":0,"index":45}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"I","declarations":[{"id":9,"kind":"def","name":"x","qualifier":"val","expr":{"id":8,"kind":"let","opdef":{"id":3,"kind":"def","name":"y","qualifier":"val","expr":{"id":2,"kind":"bool","value":true}},"expr":{"id":4,"kind":"let","opdef":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true}},"expr":{"id":7,"kind":"name","name":"__undefinedExprGenerated"}}}}]}],"table":{"3":{"id":3,"kind":"def","name":"y","qualifier":"val","expr":{"id":2,"kind":"bool","value":true},"depth":2},"5":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true},"depth":3},"7":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true},"depth":3},"9":{"id":9,"kind":"def","name":"x","qualifier":"val","expr":{"id":8,"kind":"let","opdef":{"id":3,"kind":"def","name":"y","qualifier":"val","expr":{"id":2,"kind":"bool","value":true}},"expr":{"id":4,"kind":"let","opdef":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true}},"expr":{"id":7,"kind":"name","name":"__undefinedExprGenerated"}}},"depth":0}},"errors":[{"explanation":"[QNT000] mismatched input '}' expecting {'{', '[', 'val', 'def', 'pure', 'action', 'run', 'temporal', 'nondet', 'all', 'any', 'if', '_', STRING, BOOL, INT, 'and', 'or', 'iff', 'implies', 'Map', 'match', '-', '(', 'Set', 'List', LOW_ID, CAP_ID}","locs":[{"source":"mocked_path/testFixture/_1025importeeWithError.qnt","start":{"line":3,"col":0,"index":45},"end":{"line":3,"col":0,"index":45}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1032docstrings.json b/quint/testFixture/_1032docstrings.json index 9bb8386dd..d1ef2d5f3 100644 --- a/quint/testFixture/_1032docstrings.json +++ b/quint/testFixture/_1032docstrings.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"docstrings","declarations":[{"doc":"Docstring for var","kind":"var","name":"x","typeAnnotation":{"id":6,"kind":"int"},"id":7,"depth":0},{"doc":"Docstring for const","kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9,"depth":0},{"doc":"Top level docstring","id":5,"kind":"def","name":"nestedVals","qualifier":"val","expr":{"id":4,"kind":"let","opdef":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1}},"expr":{"id":3,"kind":"name","name":"foo"}}}],"doc":"Docstring for module"}],"table":{"2":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1},"depth":1},"3":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1},"depth":1},"5":{"doc":"Top level docstring","id":5,"kind":"def","name":"nestedVals","qualifier":"val","expr":{"id":4,"kind":"let","opdef":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1}},"expr":{"id":3,"kind":"name","name":"foo"}},"depth":0}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"docstrings","declarations":[{"doc":"Docstring for var","kind":"var","name":"x","typeAnnotation":{"id":6,"kind":"int"},"id":7,"depth":0},{"doc":"Docstring for const","kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9,"depth":0},{"doc":"Top level docstring","id":5,"kind":"def","name":"nestedVals","qualifier":"val","expr":{"id":4,"kind":"let","opdef":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1}},"expr":{"id":3,"kind":"name","name":"foo"}}}],"doc":"Docstring for module"}],"table":{"2":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1},"depth":2},"3":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1},"depth":2},"5":{"doc":"Top level docstring","id":5,"kind":"def","name":"nestedVals","qualifier":"val","expr":{"id":4,"kind":"let","opdef":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1}},"expr":{"id":3,"kind":"name","name":"foo"}},"depth":0}},"errors":[]} \ No newline at end of file From a7b6cf4c35ee2c5317ec78d0dbd121dfe20392a4 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 21 May 2024 16:17:29 -0300 Subject: [PATCH 387/388] Update docstring --- quint/src/names/unshadower.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/names/unshadower.ts b/quint/src/names/unshadower.ts index e69bfeb8c..ad54e4cc7 100644 --- a/quint/src/names/unshadower.ts +++ b/quint/src/names/unshadower.ts @@ -19,7 +19,7 @@ import { QuintApp, QuintLambda, QuintLambdaParameter, QuintLet, QuintModule, Qui /** * Replace all names with unique names, to avoid shadowing. * - Lambda parameters are renamed to `_` - * - Nested definitions (from let expressions) are renamed to `_` + * - Nested definitions (from let expressions) are renamed to `_` only if they shadow another name * * @param module The module to unshadow * @param lookupTable The lookup table with the module's name references From db67d0301975b11e9f7363efdc6de569c5e1d958 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 21 May 2024 16:20:06 -0300 Subject: [PATCH 388/388] Add CHANGELOG entry --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 64b0ba28f..351bdf734 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 Model-Based Testing (#1441). ### Changed + +- Shadowing is a bit less agressive. This should improve readability of variable + names after compilation, i.e. in Apalache and some simulation errors, and in + TLA+ produced from the `compile` command (#1444). + ### Deprecated ### Removed ### Fixed

-Quint Lang Logo +Quint Lang Logo

Quint Lang

From 5405ca54c1af130c7875ce7e601ebad11bd4b351 Mon Sep 17 00:00:00 2001 From: bugarela Date: Fri, 15 Dec 2023 16:32:56 -0300 Subject: [PATCH 147/388] Update ADR indexing --- CONTRIBUTING.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1ee9e770d..df5d74693 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -12,7 +12,6 @@ same principles in Quint, see [Contributing to Apalache][]. ## Developer docs - - [roadmap](./doc/roadmap.md) - [ADR001: Transpiler architecture](./doc/adr001-transpiler-architecture.md) - [ADR002: Error codes](./doc/adr002-errors.md) @@ -21,6 +20,8 @@ same principles in Quint, see [Contributing to Apalache][]. - [ADR004: An Effect System for Quint](./doc/adr004-effect-system.md) - [ADR005: A Type System for Quint](./doc/adr005-type-system.md) - [ADR006: Design of modules and lookup tables](./doc/adr006-modules.lit.md) + - [ADR007: Flattening](./doc/adr007-flattening.md) + - [ADR008: Obtaining and Launching Apalache from Quint](./doc/adr008-managing-apalache.md) ## Coordinating work From 2bbfdb5105cd4898417ace30991250a6f5769f42 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 15 Dec 2023 18:02:34 -0500 Subject: [PATCH 148/388] Simply and clarify verify command - Allows dropping the --main - Shows what is in the config.json --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 42ec9d416..fc65e29fa 100644 --- a/README.md +++ b/README.md @@ -98,7 +98,8 @@ Quint (with the help of [Apalache][apalache]) can check to ensure that after the empty, every participant has a santa! No kids crying when the gifts are exchanged :gift:. ``` bluespec -quint verify secret_santa.qnt --invariant=everyone_gets_a_santa --main=quint_team_secret_santa --apalache-config=config.json +echo '{ "checker": { "no-deadlocks": true } }' > config.json +quint verify quint_team_secret_santa.qnt --invariant=everyone_gets_a_santa --apalache-config=config.json [ok] No violation found (2119ms). You may increase --max-steps. ``` @@ -113,7 +114,7 @@ This specification has no safeguards against people being their own santa! Quint this happens. Sorry kids, I hope you don't mind buying your own present :cry:! ``` bluespec -quint verify secret_santa.qnt --invariant=no_person_is_self_santa --main=quint_team_secret_santa +quint verify quint_team_secret_santa.qnt --invariant=no_person_is_self_santa An example execution: [State 0] From d98cbf184e0ca1d681c130e06641c95c8a2362eb Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 15 Dec 2023 18:06:31 -0500 Subject: [PATCH 149/388] Add documentation and link to that --- README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fc65e29fa..29db81ea8 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ @@ -254,6 +254,14 @@ Cosmos in 2023. - [Contribute your spell](./examples/spells/contribute-your-spell.md) to the collection of Quint spells - [Contribute](./CONTRIBUTING.md) to the development of Quint +## Documentation + +View the [Quint documentation](./doc#readme). + +We aspire to having great, comprehensive documentation. At present, we have a +good start, but still far to go. Please try what we have available and share +with us any needs we have not yet been able to meet. + ## On "Quint" Quint is short for 'quintessence', from alchemy, which refers to the fifth From f8e1bd257ede77f93c6c501e3e75d0da7b026af2 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 18 Dec 2023 18:42:43 -0300 Subject: [PATCH 150/388] Add confirmation after drawing --- examples/language-features/option.qnt | 15 ------- .../secret-santa/basic_secret_santa.qnt | 42 +++++++++++++++++++ .../secret-santa/quint_team_secret_santa.qnt | 28 +++++++++++++ .../secret_santa_with_confirmation.qnt | 13 ++++++ .../secret-santa/secret_santa_with_redraw.qnt | 41 ++++++++++++++++++ .../secret-santa/secret_santa_with_reset.qnt | 14 +++++++ 6 files changed, 138 insertions(+), 15 deletions(-) create mode 100644 examples/puzzles/secret-santa/basic_secret_santa.qnt create mode 100644 examples/puzzles/secret-santa/quint_team_secret_santa.qnt create mode 100644 examples/puzzles/secret-santa/secret_santa_with_confirmation.qnt create mode 100644 examples/puzzles/secret-santa/secret_santa_with_redraw.qnt create mode 100644 examples/puzzles/secret-santa/secret_santa_with_reset.qnt diff --git a/examples/language-features/option.qnt b/examples/language-features/option.qnt index 871eda916..f8fbce203 100644 --- a/examples/language-features/option.qnt +++ b/examples/language-features/option.qnt @@ -7,21 +7,6 @@ module option { | Some(int) var votes: List[VoteOption] - var outcome: int - - action init = all { - votes' = [], - outcome' = 0 - } - - action vote(v) = { - votes' = votes.append(Some(v)) - } - - action unvote(i) = all { - votes[i] != None, - votes' = votes.replaceAt(i, None), - } val sumVotes = votes.foldl(0, (sum, v) => match v { diff --git a/examples/puzzles/secret-santa/basic_secret_santa.qnt b/examples/puzzles/secret-santa/basic_secret_santa.qnt new file mode 100644 index 000000000..6d385225d --- /dev/null +++ b/examples/puzzles/secret-santa/basic_secret_santa.qnt @@ -0,0 +1,42 @@ +module secret_santa { + import basicSpells.* from "../../spells/basicSpells" + + const participants: Set[str] + + /// get(recipient_for_santa, S) is the recipient for secret santa S + var recipient_for_santa: str -> str + + /// the bowl of participants, containing a paper piece for each participant name + var bowl: Set[str] + + val santas = recipient_for_santa.keys() + val recipients = participants.map(p => recipient_for_santa.get(p)) + + /// The initial state + action init = all { + recipient_for_santa' = Map(), // No santas or recipients + bowl' = participants, // Every participant's name in the bowl + } + + action draw_recipient(santa: str): bool = { + nondet recipient = oneOf(bowl) + all { + recipient_for_santa' = put(recipient_for_santa, santa, recipient), + bowl' = bowl.setRemove(recipient), + } + } + + action step = all { + bowl.size() > 0, + nondet next_santa = participants.exclude(santas).oneOf() + draw_recipient(next_santa) + } + + val everyone_gets_a_santa = (bowl.size() == 0).implies(participants == recipients) + + val no_person_is_self_santa = santas.forall(person => + get(recipient_for_santa, person) != person + ) + + val invariant = everyone_gets_a_santa and no_person_is_self_santa +} diff --git a/examples/puzzles/secret-santa/quint_team_secret_santa.qnt b/examples/puzzles/secret-santa/quint_team_secret_santa.qnt new file mode 100644 index 000000000..5e16cde3d --- /dev/null +++ b/examples/puzzles/secret-santa/quint_team_secret_santa.qnt @@ -0,0 +1,28 @@ +module quint_team_secret_santa { + import basicSpells.* from "../../spells/basicSpells" + import secret_santa_with_redraw(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* from "./secret_santa_with_redraw" + + action assign_santa_and_confirm(santa, recipient) = all { + recipient_for_santa' = put(recipient_for_santa, santa, recipient), + bowl' = bowl.setRemove(recipient), + last_draw' = { participant: santa, confirmed: santa != recipient } + } + + run deadlock_Test = init_with_confirmation + .then(assign_santa_and_confirm("Igor", "Jure")) + .then(assign_santa_and_confirm("Thomas", "Shon")) + .then(assign_santa_and_confirm("Jure", "Igor")) + .then(assign_santa_and_confirm("Shon", "Thomas")) + .then(step_with_confirmation) + .expect(bowl == Set() implies no_person_is_self_santa) + + // run finding_out_my_santa_Test = init_redraw + // .then(assign_santa_and_confirm("Igor", "Jure")) + // .then(assign_santa_and_confirm("Thomas", "Shon")) + // .then(assign_santa_and_confirm("Jure", "Igor")) + // .then(assign_santa_and_confirm("Gabriela", "Gabriela")) + // .then(redraw("Gabriela")) + // .then(draw_name("Shon")) + // .expect(santa_for.get("Shon") == "Gabriela") + +} diff --git a/examples/puzzles/secret-santa/secret_santa_with_confirmation.qnt b/examples/puzzles/secret-santa/secret_santa_with_confirmation.qnt new file mode 100644 index 000000000..6e37ac6ea --- /dev/null +++ b/examples/puzzles/secret-santa/secret_santa_with_confirmation.qnt @@ -0,0 +1,13 @@ +module secret_santa_with_confirmation { + import secret_santa.* from "./basic_secret_santa" + export secret_santa.* + + // whether the last participant confimed they didn't picked themselves + var last_draw: { participant: str, confirmed: bool } + + action init_with_confirmation = all { + recipient_for_santa' = Map(), + bowl' = participants, + last_draw' = { participant: "none", confirmed: false } + } +} diff --git a/examples/puzzles/secret-santa/secret_santa_with_redraw.qnt b/examples/puzzles/secret-santa/secret_santa_with_redraw.qnt new file mode 100644 index 000000000..95f6c502e --- /dev/null +++ b/examples/puzzles/secret-santa/secret_santa_with_redraw.qnt @@ -0,0 +1,41 @@ +module secret_santa_with_redraw { + // When a participant draws themself, they put their name back and draw again + + import basicSpells.* from "../../spells/basicSpells" + import secret_santa_with_confirmation.* from "./secret_santa_with_confirmation" + export secret_santa_with_confirmation.* + + action redraw(participant: str): bool = { + nondet new_name = bowl.oneOf() + all { + bowl' = bowl.exclude(Set(new_name)).union(Set(participant)), + recipient_for_santa' = recipient_for_santa.set(participant, new_name), + last_draw' = { participant: participant, confirmed: new_name != participant } + } + } + + action step_with_confirmation = + if (last_draw.confirmed) all { + bowl.size() > 0, + nondet santa = participants.filter(participant => not(participant.in(recipient_for_santa.keys()))).oneOf() + nondet recipient = bowl.oneOf() + all { + recipient_for_santa' = put(recipient_for_santa, santa, recipient), + bowl' = bowl.setRemove(recipient), + last_draw' = { participant: santa, confirmed: santa != recipient } + } + } else all { + bowl != Set(), + redraw(last_draw.participant) + } + + + val inv = (bowl.size() == 0 and last_draw.confirmed) implies no_person_is_self_santa + + // temporal problem = + + // We need fairness for this to work + temporal success = always(bowl == Set() implies eventually(no_person_is_self_santa)) + + // I can say something like: "Also, this doesn't really work if blabla, but you'd need a temporal property to explore that scenario" +} diff --git a/examples/puzzles/secret-santa/secret_santa_with_reset.qnt b/examples/puzzles/secret-santa/secret_santa_with_reset.qnt new file mode 100644 index 000000000..2d2afd36c --- /dev/null +++ b/examples/puzzles/secret-santa/secret_santa_with_reset.qnt @@ -0,0 +1,14 @@ +module secret_santa_with_reset { + // When a participant draws themself, everyone returns the papers and the process starts over + import secret_santa_with_confirmation.* from "./secret_santa_with_confirmation" + export secret_santa_with_confirmation.* + + action step_with_reset = + if (last_draw.confirmed) { + step + } else { + init + } + + val inv = bowl.size() == 0 implies no_person_is_self_santa +} From b56a59131e69bc1f1fd5ea0608b884a2d8f9bfd9 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 18 Dec 2023 19:14:30 -0500 Subject: [PATCH 151/388] Add quint logo to VSCode Plugin --- vscode/quint-vscode/package.json | 1 + vscode/quint-vscode/quint-logo-vscode.png | Bin 0 -> 3292 bytes 2 files changed, 1 insertion(+) create mode 100644 vscode/quint-vscode/quint-logo-vscode.png diff --git a/vscode/quint-vscode/package.json b/vscode/quint-vscode/package.json index 010dba7f2..b8d3fb344 100644 --- a/vscode/quint-vscode/package.json +++ b/vscode/quint-vscode/package.json @@ -2,6 +2,7 @@ "name": "quint-vscode", "displayName": "Quint", "description": "Language support for Quint specifications", + "icon": "quint-logo-vscode.png", "version": "0.12.1", "publisher": "informal", "engines": { diff --git a/vscode/quint-vscode/quint-logo-vscode.png b/vscode/quint-vscode/quint-logo-vscode.png new file mode 100644 index 0000000000000000000000000000000000000000..d42c03f1f0824838fd6ba4e08a47f82847d79bbb GIT binary patch literal 3292 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 B0 Date: Mon, 18 Dec 2023 20:26:37 -0500 Subject: [PATCH 152/388] Make README example more consistent - Use prefix/postfix calls consistently for the same operator. - Don't use any "spells" --- README.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 29db81ea8..0aab5dce7 100644 --- a/README.md +++ b/README.md @@ -44,8 +44,6 @@ development tooling. ``` bluespec module secret_santa { - import basicSpells.* from "../../spells/basicSpells" - const participants: Set[str] /// get(recipient_for_santa, S) is the recipient for secret santa S @@ -55,7 +53,7 @@ module secret_santa { var bowl: Set[str] val santas = recipient_for_santa.keys() - val recipients = participants.map(p => recipient_for_santa.get(p)) + val recipients = participants.map(p => get(recipient_for_santa, p)) /// The initial state action init = all { @@ -67,13 +65,13 @@ module secret_santa { nondet recipient = oneOf(bowl) all { recipient_for_santa' = put(recipient_for_santa, santa, recipient), - bowl' = bowl.setRemove(recipient), + bowl' = bowl.exclude(Set(recipient)), } } action step = all { bowl.size() > 0, - nondet next_santa = participants.exclude(santas).oneOf() + nondet next_santa = oneOf(participants.exclude(santas)) draw_recipient(next_santa) } From 500de5c508ffd4deedcd55a6113c8d554f6da69a Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 19 Dec 2023 06:31:59 -0500 Subject: [PATCH 153/388] VSCode Release v0.12.2 --- vscode/quint-vscode/CHANGELOG.md | 9 +++++++++ vscode/quint-vscode/package-lock.json | 4 ++-- vscode/quint-vscode/package.json | 2 +- vscode/quint-vscode/server/package-lock.json | 4 ++-- vscode/quint-vscode/server/package.json | 2 +- 5 files changed, 15 insertions(+), 6 deletions(-) diff --git a/vscode/quint-vscode/CHANGELOG.md b/vscode/quint-vscode/CHANGELOG.md index 46e8d8863..81a619828 100644 --- a/vscode/quint-vscode/CHANGELOG.md +++ b/vscode/quint-vscode/CHANGELOG.md @@ -14,6 +14,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed ### Security +## v0.12.2 -- 2023-12-19 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + ## v0.12.1 -- 2023-12-05 ### Added diff --git a/vscode/quint-vscode/package-lock.json b/vscode/quint-vscode/package-lock.json index 8d8ba8568..a5eeea047 100644 --- a/vscode/quint-vscode/package-lock.json +++ b/vscode/quint-vscode/package-lock.json @@ -1,12 +1,12 @@ { "name": "quint-vscode", - "version": "0.12.1", + "version": "0.12.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "quint-vscode", - "version": "0.12.1", + "version": "0.12.2", "hasInstallScript": true, "dependencies": { "vscode-languageclient": "^7.0.0" diff --git a/vscode/quint-vscode/package.json b/vscode/quint-vscode/package.json index b8d3fb344..953059900 100644 --- a/vscode/quint-vscode/package.json +++ b/vscode/quint-vscode/package.json @@ -3,7 +3,7 @@ "displayName": "Quint", "description": "Language support for Quint specifications", "icon": "quint-logo-vscode.png", - "version": "0.12.1", + "version": "0.12.2", "publisher": "informal", "engines": { "vscode": "^1.52.0" diff --git a/vscode/quint-vscode/server/package-lock.json b/vscode/quint-vscode/server/package-lock.json index 07a07d165..f642ffc34 100644 --- a/vscode/quint-vscode/server/package-lock.json +++ b/vscode/quint-vscode/server/package-lock.json @@ -1,12 +1,12 @@ { "name": "@informalsystems/quint-language-server", - "version": "0.12.1", + "version": "0.12.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint-language-server", - "version": "0.12.1", + "version": "0.12.2", "license": "Apache 2.0", "dependencies": { "@informalsystems/quint": "^0.17.1", diff --git a/vscode/quint-vscode/server/package.json b/vscode/quint-vscode/server/package.json index cc9524a0d..059ae1a1b 100644 --- a/vscode/quint-vscode/server/package.json +++ b/vscode/quint-vscode/server/package.json @@ -1,7 +1,7 @@ { "name": "@informalsystems/quint-language-server", "description": "Language Server for the Quint specification language", - "version": "0.12.1", + "version": "0.12.2", "author": "Informal Systems", "contributors": [ { From 21f918e4439bf0a764c3b744750542c5db263ad6 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 19 Dec 2023 09:31:46 -0500 Subject: [PATCH 154/388] Fix links on doc/README.org Followup to #1308, in which I broke all these links. Thanks to @jorpic for pointing this out: https://github.com/informalsystems/quint/commit/53b13316c46fe27c7532d56429ebe3bddfeb4a85#commitcomment-135330468 --- doc/README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/doc/README.md b/doc/README.md index 694a3f972..97e4ef5cf 100644 --- a/doc/README.md +++ b/doc/README.md @@ -2,19 +2,19 @@ ## Language -- [Language tutorials](./tutorials/README.md) -- [Syntax specification](./doc/lang.md) -- [Cheatsheet](./doc/quint-cheatsheet.pdf) -- [API documentation for built-in operators](./doc/builtin.md) +- [Language tutorials](../tutorials/README.md) +- [Syntax specification](./lang.md) +- [Cheatsheet](./quint-cheatsheet.pdf) +- [API documentation for built-in operators](./builtin.md) ## Tooling -- [REPL tutorial](./tutorials/repl/repl.md) -- [CLI manual](./doc/quint.md) -- [Literate executable specifications](./doc/literate.md) +- [REPL tutorial](../tutorials/repl/repl.md) +- [CLI manual](./quint.md) +- [Literate executable specifications](./literate.md) ## Design and Development -- [Design Principles](./doc/design-principles.md) -- [Roadmap](./doc/roadmap.md) -- [Frequently asked questions](./doc/faq.md) +- [Design Principles](./design-principles.md) +- [Roadmap](./roadmap.md) +- [Frequently asked questions](./faq.md) From 9a7449fd8736c7f2ce5d11ef09d2d62a9e720982 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 19 Dec 2023 11:12:18 -0500 Subject: [PATCH 155/388] Say "type checking" instead of static analysis --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0aab5dce7..3ebd44141 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ Quint is a modern specification language that is a particularly good fit for distributed systems, such as blockchain protocols, distributed databases, and p2p protocols. Quint combines the robust theoretical basis of the [Temporal -Logic of Actions (TLA)][TLA] with state-of-the-art static analysis and +Logic of Actions (TLA)][TLA] with state-of-the-art type checking and development tooling. ### Example code in Quint :mrs_claus: :gift: :santa: From 2794eb14dddc096d8f28a13d3afbdddb70c12944 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 19 Dec 2023 12:19:20 -0500 Subject: [PATCH 156/388] Add link to secret santa wiki article Also give a line of context. --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 3ebd44141..0a67bf8a7 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,9 @@ development tooling. ### Example code in Quint :mrs_claus: :gift: :santa: +Here is a small, partial, holiday special specification of the [Secret +Santa](https://en.wikipedia.org/wiki/Secret_Santa) game: + ``` bluespec module secret_santa { const participants: Set[str] @@ -89,6 +92,9 @@ module quint_team_secret_santa { } ``` +We can use this specification to check whether certain properties needed for a +good game hold: +
Checking if everyone gets a santa From d135aa7e8a158be75932ca877cd749d23cd66645 Mon Sep 17 00:00:00 2001 From: ekexium Date: Wed, 20 Dec 2023 12:59:51 +0800 Subject: [PATCH 157/388] doc: fix dead link in roadmap.md Signed-off-by: ekexium --- doc/roadmap.md | 54 +++++++++++++++++++++++++------------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/doc/roadmap.md b/doc/roadmap.md index c66f9b757..253c2b3fe 100644 --- a/doc/roadmap.md +++ b/doc/roadmap.md @@ -43,35 +43,35 @@ completely implementing every pass. | ~~uninterpreted types~~, see #118 | :white_check_mark: | :white_check_mark: | :x: | :x: | :x: | :x: | :x: | -[Design Principles]: ./doc/design-principles.md +[Design Principles]: ./design-principles.md [Apalache]: https://github.com/informalsystems/apalache [Lessons from Writing a Compiler]: https://borretti.me/article/lessons-writing-compiler -[Imports]: ./doc/lang.md#imports-1 -[Module definitions]: ./doc/lang.md#module-definition -[Constant declarations]: ./doc/lang.md#constant-declarations -[Assumptions]: ./doc/lang.md#assumptions -[Variable definitions]: ./doc/lang.md#variable-definitions -[Operator definitions]: ./doc/lang.md#variable-definitions -[Module instances]: ./doc/lang.md#module-instances -[Lambdas]: ./doc/lang.md#lambdas-aka-anonymous-operators -[Booleans]: ./doc/lang.md#boolean-operators-and-equality -[Integers]: ./doc/lang.md#integers -[Sets]: ./doc/lang.md#sets -[Lists]: ./doc/lang.md#lists-aka-sequences -[Multiline disjunctions]: ./doc/lang.md#multiline-disjunctions -[Multiline conjunctions]: ./doc/lang.md#multiline-conjunctions -[if-then-else]: ./doc/lang.md#condition -[nondet]: ./doc/lang.md#existential-quantifier-and-non-deterministic-choice -[Maps]: ./doc/lang.md#maps-aka-functions -[Records]: ./doc/lang.md#records -[Tuples]: ./doc/lang.md#tuples -[Sum types]: ./doc/lang.md#sum-types -[Delayed assignment]: ./doc/lang.md#delayed-assignment -[Runs]: ./doc/lang.md#runs -[Temporal operators]: ./doc/lang.md#temporal-operators -[Fairness]: ./doc/lang.md#fairness -[Unbounded quantifiers]: ./doc/lang.md#unbounded-quantifiers -[Modes]: ./doc/lang.md#modes +[Imports]: ./lang.md#imports-1 +[Module definitions]: ./lang.md#module-definition +[Constant declarations]: ./lang.md#constant-declarations +[Assumptions]: ./lang.md#assumptions +[Variable definitions]: ./lang.md#variable-definitions +[Operator definitions]: ./lang.md#variable-definitions +[Module instances]: ./lang.md#module-instances +[Lambdas]: ./lang.md#lambdas-aka-anonymous-operators +[Booleans]: ./lang.md#boolean-operators-and-equality +[Integers]: ./lang.md#integers +[Sets]: ./lang.md#sets +[Lists]: ./lang.md#lists-aka-sequences +[Multiline disjunctions]: ./lang.md#multiline-disjunctions +[Multiline conjunctions]: ./lang.md#multiline-conjunctions +[if-then-else]: ./lang.md#condition +[nondet]: ./lang.md#existential-quantifier-and-non-deterministic-choice +[Maps]: ./lang.md#maps-aka-functions +[Records]: ./lang.md#records +[Tuples]: ./lang.md#tuples +[Sum types]: ./lang.md#sum-types +[Delayed assignment]: ./lang.md#delayed-assignment +[Runs]: ./lang.md#runs +[Temporal operators]: ./lang.md#temporal-operators +[Fairness]: ./lang.md#fairness +[Unbounded quantifiers]: ./lang.md#unbounded-quantifiers +[Modes]: ./lang.md#modes [Spells]: ./examples/spells/README.md [Contribute your spell]: ./examples/spells/contribute-your-spell.md [539]: https://github.com/informalsystems/quint/issues/539 From 449c7d956fdf9640470718e69d66220ea5a82dfe Mon Sep 17 00:00:00 2001 From: Igor Konnov Date: Wed, 20 Dec 2023 11:38:10 +0100 Subject: [PATCH 158/388] User stories for interaction with traces (#866) * add two stories * add user stories for the trace exploration --- doc/story008-repl-traces.md | 262 ++++++++++++++++++++++++++++++++++++ 1 file changed, 262 insertions(+) create mode 100644 doc/story008-repl-traces.md diff --git a/doc/story008-repl-traces.md b/doc/story008-repl-traces.md new file mode 100644 index 000000000..840a5a2e0 --- /dev/null +++ b/doc/story008-repl-traces.md @@ -0,0 +1,262 @@ +# Story008: Simulator Traces in REPL + +| Revision | Date | Author | +|---------:|:----------:|:------------------------| +| 1 | 2023-05-05 | Igor Konnov | + +This is a UX design document for the interaction with states and traces in REPL. +This document helps us to understand the user stories before implementing them. + +Over the last months, we had several requests that could be unified under a +common theme that is related to state and trace inspection. + + - [#446][] + - [#795][] + - [#347][] + - [#303][] + - [#288][] + +This document is using [kettle][] as a running example. We assume that +a Quint REPL session is run in the directory of the example: + +```sh +$ cd ./tutorials/repl +$ quint +Quint REPL 0.9.1 +Type ".exit" to exit, or ".help" for more information +>>> import kettle.* from "./kettle" + +``` + +## Story 1: Inspect the current state + +*As a protocol reader, I want to print the protocol state without remembering +the names of the state variables, so I can discover which state variables are +around and which values they carry.* + +Assume that we have initialized the protocol state with `init`: + +```bluespec +>>> init +true +``` + +**Current interface**. Currently, we can inspect the state, by evaluating +the variable names: + +```bluespec +>>> temperature +20 +>>> heatingOn +false +>>> beeping +false +``` + +However, it is often more convenient to see the value of all the state variables +at once, e.g., when we do not remember them. The issues [#446][] and [#795][] +highlight this idea. + +A workaround is to introduce a definition like the following one: + +```bluespec +// a handy definition that captures the state in a record +val kettleState = { + heatingOn: heatingOn, + beeping: beeping, + temperature: temperature +} +``` + +**Proposed interface**. The simplest yet powerful interface is to introduce the +system state as a record that is accessible via a standard name. We decided to +use the name `q::state`. Here is an example: + +```bluespec +>>> q::state +{ + beeping: false, + heatingOn: false, + temperature: 20, +} +``` + +Since `q::state` is simply a `val`, we would be do all kinds of programmatic things with it: + +```bluespec +>>> q::state.fieldNames() +Set("beeping", "heatingOn", "temperature") + +>>> q::state.temperature +20 +``` + +**Shortcut.** Since typing `q::state` often may be tedious, we offer a shortcut +*`q::s` for `q::state`. + +## Story 2: Inspect the trace + +*As a protocol reader, I want to print the sequence of states that were visited +on the way to the current protocol state, so I can see how the system was +progressing.* + +Assume that we have executed a few steps: + +```bluespec +>>> init +true +>>> pressButton +true +>>> heat +true +>>> depressButton +true +``` + +**Current interface**. After executing a few steps, we can inspect the reached +state. However, we would not be able to inspect the intermediate states, e.g., +the states reached by executing `init`, then `pressButton`, then `heat`. + +As mentioned in [#446][], it would be great to observe the sequence of visited +states. Currently, the only way to do that is by replaying the actions from the +start and printing the intermediate states after executing every action. + +**Proposed interface**. Similar to Story 1, we are proposing to use a standard +name such as `q::trace`. + +For the sequence `init.then(pressButton).then(heat).then(depressButton)`, we +expect `q::trace` to evaluate as follows: + +```bluespec +>>> q::trace +[ + // 0 + { beeping: false, heatingOn: false, temperature: 20 }, + // 1 + { beeping: false, heatingOn: true, temperature: 20 }, + // 2 + { beeping: false, heatingOn: true, temperature: 21 }, + // 3* + { beeping: false, heatingOn: false, temperature: 21 }, +] +``` + +As we can see, `q::trace` is simply a value, which is printed as a +syntactically correct Quint expression. We expect REPL to decorate it a bit with +helpful comments: It should print the state numbers and highlight the active +state (with a `*`). However, the fact that `q::trace` is a value, lets us to +access it programmatically: + +```bluespec +>>> q::trace.length() +4 +>>> q::trace[3].temperature - q::trace[0].temperature +1 +``` + +**Shortcut.** Since typing `q::trace` may be tedious, we offer a shortcut +`q::t` for `q::trace`. + +## Story 3: Navigate the trace + +*As a protocol reader, I want to jump between the visited states in the trace, +so I can evaluate invariants against them and explore different paths.* + +As in Story 2, assume that we have executed a few steps: + +```bluespec +>>> init +true +>>> pressButton +true +>>> heat +true +>>> depressButton +true +``` + +**Current interface**. Assuming that `q::trace` from Story 2 is implemented, +we should be able to see the intermediate states that are produced by the above +sequence of actions. However, if we want to evaluate state invariants against +the intermediate states, we have to replay the actions from start, e.g., by +executing `init`, then `pressButton`, then `heat`. + +**Proposed interface**. We introduce several actions for navigating the trace. + +### 3.1. Jump + +The following REPL session highlights the expected interface: + +```bluespec +>>> init.then(pressButton).then(heat).then(depressButton) +true +>>> q::jump(2) +true +>>> q::state +{ beeping: false, heatingOn: true, temperature: 21 } +>>> // we can evaluate expressions against the state +>>> q::state.temperature > 20 +true +>>> // the trace does not change +>>> // the star is pointing to the active state +>>> q::trace +[ + // 0 + { beeping: false, heatingOn: false, temperature: 20 }, + // 1 + { beeping: false, heatingOn: true, temperature: 20 }, + // 2* + { beeping: false, heatingOn: true, temperature: 21 }, + // 3 + { beeping: false, heatingOn: false, temperature: 21 }, +] +``` + +Importantly, `q::jump` does not modify the trace `q::trace`. Hence, we can jump +forth and back in the current trace, without recomputing it. This is especially +important, since some of the actions may be non-deterministic. + +### 3.2. Continue trace from the active state + +```bluespec +>>> // ...continue the above session +>>> heat +true +>>> // the trace continues from the active state +>>> q::hist +[ + // 0 + { beeping: false, heatingOn: false, temperature: 20 }, + // 1 + { beeping: false, heatingOn: true, temperature: 20 }, + // 2 + { beeping: false, heatingOn: true, temperature: 21 }, + // 3* + { beeping: false, heatingOn: true, temperature: 22 }, +] +``` + +Note that when an action is evaluated, the trace beyond the active state is +cleared, and the new state is added after the active state. + +### 3.3. Clear the trace + +The trace is accumulating the states, even when `init` is executed. Hence, at +some point, we have to clear the trace: + +```bluespec +>>> // ...continue the above session +>>> q::reset +true +>>> q::trace +[] +``` + + + +[#446]: https://github.com/informalsystems/quint/issues/446 +[#795]: https://github.com/informalsystems/quint/issues/795 +[#347]: https://github.com/informalsystems/quint/issues/347 +[#303]: https://github.com/informalsystems/quint/issues/303 +[#288]: https://github.com/informalsystems/quint/issues/288 +[kettle]: https://github.com/informalsystems/quint/blob/main/tutorials/repl/kettle.qnt \ No newline at end of file From 4c1942170e0defaa664f6cb02665325635424c4c Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 20 Dec 2023 20:22:09 -0300 Subject: [PATCH 159/388] Add version with namespace that I'll rollback cause I didn't like it --- .../secret-santa/basic_secret_santa.qnt | 4 +- .../secret-santa/quint_team_secret_santa.qnt | 26 ++++---- .../secret_santa_with_confirmation.qnt | 63 ++++++++++++++++--- .../secret-santa/secret_santa_with_redraw.qnt | 25 +++----- .../secret-santa/secret_santa_with_reset.qnt | 3 +- 5 files changed, 83 insertions(+), 38 deletions(-) diff --git a/examples/puzzles/secret-santa/basic_secret_santa.qnt b/examples/puzzles/secret-santa/basic_secret_santa.qnt index 6d385225d..65833e3c4 100644 --- a/examples/puzzles/secret-santa/basic_secret_santa.qnt +++ b/examples/puzzles/secret-santa/basic_secret_santa.qnt @@ -27,12 +27,12 @@ module secret_santa { } action step = all { - bowl.size() > 0, + not(empty(bowl)), nondet next_santa = participants.exclude(santas).oneOf() draw_recipient(next_santa) } - val everyone_gets_a_santa = (bowl.size() == 0).implies(participants == recipients) + val everyone_gets_a_santa = (empty(bowl)).implies(participants == recipients) val no_person_is_self_santa = santas.forall(person => get(recipient_for_santa, person) != person diff --git a/examples/puzzles/secret-santa/quint_team_secret_santa.qnt b/examples/puzzles/secret-santa/quint_team_secret_santa.qnt index 5e16cde3d..f49e862b3 100644 --- a/examples/puzzles/secret-santa/quint_team_secret_santa.qnt +++ b/examples/puzzles/secret-santa/quint_team_secret_santa.qnt @@ -1,20 +1,20 @@ module quint_team_secret_santa { import basicSpells.* from "../../spells/basicSpells" - import secret_santa_with_redraw(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* from "./secret_santa_with_redraw" + import secret_santa(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* from "./basic_secret_santa" - action assign_santa_and_confirm(santa, recipient) = all { - recipient_for_santa' = put(recipient_for_santa, santa, recipient), - bowl' = bowl.setRemove(recipient), - last_draw' = { participant: santa, confirmed: santa != recipient } - } + // action assign_santa_and_confirm(santa, recipient) = all { + // recipient_for_santa' = put(recipient_for_santa, santa, recipient), + // bowl' = bowl.setRemove(recipient), + // last_draw' = { participant: santa, confirmed: santa != recipient } + // } - run deadlock_Test = init_with_confirmation - .then(assign_santa_and_confirm("Igor", "Jure")) - .then(assign_santa_and_confirm("Thomas", "Shon")) - .then(assign_santa_and_confirm("Jure", "Igor")) - .then(assign_santa_and_confirm("Shon", "Thomas")) - .then(step_with_confirmation) - .expect(bowl == Set() implies no_person_is_self_santa) + // run deadlock_Test = init_with_confirmation + // .then(assign_santa_and_confirm("Igor", "Jure")) + // .then(assign_santa_and_confirm("Thomas", "Shon")) + // .then(assign_santa_and_confirm("Jure", "Igor")) + // .then(assign_santa_and_confirm("Shon", "Thomas")) + // .then(step_with_confirmation) + // .expect(bowl == Set() implies no_person_is_self_santa) // run finding_out_my_santa_Test = init_redraw // .then(assign_santa_and_confirm("Igor", "Jure")) diff --git a/examples/puzzles/secret-santa/secret_santa_with_confirmation.qnt b/examples/puzzles/secret-santa/secret_santa_with_confirmation.qnt index 6e37ac6ea..d499b0be7 100644 --- a/examples/puzzles/secret-santa/secret_santa_with_confirmation.qnt +++ b/examples/puzzles/secret-santa/secret_santa_with_confirmation.qnt @@ -1,13 +1,62 @@ module secret_santa_with_confirmation { - import secret_santa.* from "./basic_secret_santa" - export secret_santa.* + import basicSpells.* from "../../spells/basicSpells" + import secret_santa as B from "./basic_secret_santa" - // whether the last participant confimed they didn't picked themselves + /// whether the last participant confimed they didn't picked themselves var last_draw: { participant: str, confirmed: bool } - action init_with_confirmation = all { - recipient_for_santa' = Map(), - bowl' = participants, - last_draw' = { participant: "none", confirmed: false } + /// Who had alredy drawn a paper when they got themselves. This way, I know + /// that none of those people can be the santa of the person who is drawing. + var gabrielas_memory: str -> Set[str] + + action init = all { + B::recipient_for_santa' = Map(), + B::bowl' = B::participants, + last_draw' = { participant: "none", confirmed: true }, + gabrielas_memory' = Map(), + } + + action memorize(participant) = { + gabrielas_memory' = put(gabrielas_memory, participant, B::santas) + } + + action step = all { + B::bowl.size() > 0, + nondet santa = B::participants.filter(participant => not(participant.in(B::recipient_for_santa.keys()))).oneOf() + nondet recipient = B::bowl.oneOf() + all { + B::recipient_for_santa' = put(B::recipient_for_santa, santa, recipient), + B::bowl' = B::bowl.setRemove(recipient), + last_draw' = { participant: santa, confirmed: santa != recipient }, + gabrielas_memory' = gabrielas_memory, + } + } + + type OptionalString = Some(str) | None + pure def toElem(s: Set[str]): OptionalString = { + if (s.size() != 1) { + None + } else { + s.fold(None, (_, elem) => Some(elem)) + } + } + + def find_out_santa_for(recepient: str): OptionalString = { + if (gabrielas_memory.has(recepient)) { + val possible_santas = B::participants.exclude(gabrielas_memory.get(recepient)) + possible_santas.toElem() + } else { + None + } } + + val gabriela_finds_out_a_santa = B::participants.exists(participant => { + match find_out_santa_for(participant) { + | Some(_) => true + | None => false + } + }) + + val safe_from_memorizers = not(gabriela_finds_out_a_santa) + } diff --git a/examples/puzzles/secret-santa/secret_santa_with_redraw.qnt b/examples/puzzles/secret-santa/secret_santa_with_redraw.qnt index 95f6c502e..b96400224 100644 --- a/examples/puzzles/secret-santa/secret_santa_with_redraw.qnt +++ b/examples/puzzles/secret-santa/secret_santa_with_redraw.qnt @@ -2,40 +2,35 @@ module secret_santa_with_redraw { // When a participant draws themself, they put their name back and draw again import basicSpells.* from "../../spells/basicSpells" + import commonSpells.* from "../../spells/commonSpells" + import secret_santa as B from "./basic_secret_santa" import secret_santa_with_confirmation.* from "./secret_santa_with_confirmation" export secret_santa_with_confirmation.* action redraw(participant: str): bool = { - nondet new_name = bowl.oneOf() + nondet new_name = B::bowl.oneOf() all { - bowl' = bowl.exclude(Set(new_name)).union(Set(participant)), - recipient_for_santa' = recipient_for_santa.set(participant, new_name), + B::bowl' = B::bowl.exclude(Set(new_name)).union(Set(participant)), + B::recipient_for_santa' = B::recipient_for_santa.put(participant, new_name), last_draw' = { participant: participant, confirmed: new_name != participant } } } action step_with_confirmation = if (last_draw.confirmed) all { - bowl.size() > 0, - nondet santa = participants.filter(participant => not(participant.in(recipient_for_santa.keys()))).oneOf() - nondet recipient = bowl.oneOf() - all { - recipient_for_santa' = put(recipient_for_santa, santa, recipient), - bowl' = bowl.setRemove(recipient), - last_draw' = { participant: santa, confirmed: santa != recipient } - } + step } else all { bowl != Set(), - redraw(last_draw.participant) + redraw(last_draw.participant), + memorize(last_draw.participant), } - val inv = (bowl.size() == 0 and last_draw.confirmed) implies no_person_is_self_santa + val inv = (bowl.size() == 0 and last_draw.confirmed) implies B::no_person_is_self_santa - // temporal problem = // We need fairness for this to work - temporal success = always(bowl == Set() implies eventually(no_person_is_self_santa)) + temporal success = always(eventually(B::no_person_is_self_santa)) // I can say something like: "Also, this doesn't really work if blabla, but you'd need a temporal property to explore that scenario" } diff --git a/examples/puzzles/secret-santa/secret_santa_with_reset.qnt b/examples/puzzles/secret-santa/secret_santa_with_reset.qnt index 2d2afd36c..3588b9720 100644 --- a/examples/puzzles/secret-santa/secret_santa_with_reset.qnt +++ b/examples/puzzles/secret-santa/secret_santa_with_reset.qnt @@ -1,5 +1,6 @@ module secret_santa_with_reset { // When a participant draws themself, everyone returns the papers and the process starts over + import secret_santa as B from "./basic_secret_santa" import secret_santa_with_confirmation.* from "./secret_santa_with_confirmation" export secret_santa_with_confirmation.* @@ -10,5 +11,5 @@ module secret_santa_with_reset { init } - val inv = bowl.size() == 0 implies no_person_is_self_santa + val inv = B::bowl.size() == 0 implies B::no_person_is_self_santa } From 27ded120d87358b61c5afa4000f79a62fa6450a0 Mon Sep 17 00:00:00 2001 From: bugarela Date: Thu, 21 Dec 2023 17:32:02 -0300 Subject: [PATCH 160/388] Move tictacttoe example to games folder --- examples/{puzzles => games}/tictactoe/tictactoe.qnt | 0 examples/{puzzles => games}/tictactoe/tictactoe.tla | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename examples/{puzzles => games}/tictactoe/tictactoe.qnt (100%) rename examples/{puzzles => games}/tictactoe/tictactoe.tla (100%) diff --git a/examples/puzzles/tictactoe/tictactoe.qnt b/examples/games/tictactoe/tictactoe.qnt similarity index 100% rename from examples/puzzles/tictactoe/tictactoe.qnt rename to examples/games/tictactoe/tictactoe.qnt diff --git a/examples/puzzles/tictactoe/tictactoe.tla b/examples/games/tictactoe/tictactoe.tla similarity index 100% rename from examples/puzzles/tictactoe/tictactoe.tla rename to examples/games/tictactoe/tictactoe.tla From cc7bf4acf8c0619f4fd8faa2dba00d0dc8c89a82 Mon Sep 17 00:00:00 2001 From: bugarela Date: Thu, 21 Dec 2023 17:33:50 -0300 Subject: [PATCH 161/388] Clean up and move secret santa example --- examples/games/secret-santa/secret_santa.qnt | 130 ++++++++++++++++++ .../secret-santa/basic_secret_santa.qnt | 42 ------ .../secret-santa/quint_team_secret_santa.qnt | 28 ---- .../puzzles/secret-santa/secret_santa.qnt | 114 --------------- .../secret_santa_with_confirmation.qnt | 62 --------- .../secret-santa/secret_santa_with_redraw.qnt | 36 ----- .../secret-santa/secret_santa_with_reset.qnt | 15 -- 7 files changed, 130 insertions(+), 297 deletions(-) create mode 100644 examples/games/secret-santa/secret_santa.qnt delete mode 100644 examples/puzzles/secret-santa/basic_secret_santa.qnt delete mode 100644 examples/puzzles/secret-santa/quint_team_secret_santa.qnt delete mode 100644 examples/puzzles/secret-santa/secret_santa.qnt delete mode 100644 examples/puzzles/secret-santa/secret_santa_with_confirmation.qnt delete mode 100644 examples/puzzles/secret-santa/secret_santa_with_redraw.qnt delete mode 100644 examples/puzzles/secret-santa/secret_santa_with_reset.qnt diff --git a/examples/games/secret-santa/secret_santa.qnt b/examples/games/secret-santa/secret_santa.qnt new file mode 100644 index 000000000..f9eb68da7 --- /dev/null +++ b/examples/games/secret-santa/secret_santa.qnt @@ -0,0 +1,130 @@ +// -*- mode: Bluespec; -*- +/** + * A secret santa spec, in celebration of the 2023 end-of-year holidays. + * This is accompanied by a blogpost! See [1]. + * + * [1]: https://github.com/informalsystems/quint/tree/main/tutorials/blogpost0-secretsanta/secret_santa.org + * + * Gabriela Moreira, Informal Systems, 2023 + */ + +module secret_santa { + import basicSpells.* from "../../spells/basicSpells" + + const participants: Set[str] + + /// A map from santas to their recipients. get(recipient_for_santa, S) is the recipient for secret santa S + var recipient_for_santa: str -> str + + /// The bowl of participants, containing a paper piece for each participant's name + var bowl: Set[str] + + /// Information about the last draw + type LastDraw = + | Self(str) // The name of someone who drew themself + | Ok // The draw was Ok + + var last_draw: LastDraw + + /// Who had already drawn a paper when someone got themself. This way, I know + /// that none of those people can be the santa of the person who is drawing. + var gabrielas_memory: str -> Set[str] + + /// The initial state + action init = all { + recipient_for_santa' = Map(), // No santas or recipients + bowl' = participants, // Every participant's name in the bowl + last_draw' = Ok, // if no oe has drawn yet, no one has drawn themself + gabrielas_memory' = Map(), + } + + val santas = recipient_for_santa.keys() + val recipients = recipient_for_santa.values() + + action draw_recipient(santa: str): bool = { + nondet recipient = oneOf(bowl) + all { + recipient_for_santa' = put(recipient_for_santa, santa, recipient), + bowl' = bowl.setRemove(recipient), + last_draw' = if (santa == recipient) Self(santa) else Ok, + gabrielas_memory' = gabrielas_memory, // Nothing to memorize, so the memory stays the same + } + } + + action stutter = all { + recipient_for_santa' = recipient_for_santa, + bowl' = bowl, + last_draw' = last_draw, + gabrielas_memory' = gabrielas_memory, + } + + action step = + if (empty(bowl)) { + stutter + } else { + nondet next_santa = participants.exclude(santas).oneOf() + draw_recipient(next_santa) + } + + action redraw(participant: str): bool = { + // Draw from the current bowl, without having first put paper back + nondet new_recipient = oneOf(bowl) + all { + new_recipient != participant, // The action requires this precondition + // Remove the new paper from the bowl, and then put the old one back in + bowl' = bowl.exclude(Set(new_recipient)).union(Set(participant)), + recipient_for_santa' = recipient_for_santa.put(participant, new_recipient), + last_draw' = Ok // We know this is OK due to the precondition + } + } + + // Store current santas (people who have already drawn) on a participant's key, meaning that they can't be that participant's santa + action memorize(participant) = { + gabrielas_memory' = put(gabrielas_memory, participant, santas) + } + + action step_with_redraw = + match last_draw { + | Ok => + step // All good, continue as usual + | Self(participant) => all { + not(empty(bowl)), + redraw(participant), + memorize(participant), + } + } + + action step_with_reset = + if (last_draw == Ok) { + step + } else { + init + } + + /* PROPERTIES */ + + val everyone_gets_a_santa = empty(bowl) implies (participants == recipients) + + val no_person_is_self_santa = santas.forall(santa => + get(recipient_for_santa, santa) != santa + ) + + val inv = (last_draw == Ok) implies no_person_is_self_santa + + /// true iff Gabriela can find out who is a santa for someone. + /// That is, if exists a participant where find_out_a_santa_for participant is Some() + val gabriela_finds_out_a_santa = participants.exists(participant => { + if (gabrielas_memory.has(participant)) { + val possible_santas = participants.exclude(gabrielas_memory.get(participant)) + possible_santas.size() == 1 + } else { + false + } + }) + + val safe_from_memorizers = not(gabriela_finds_out_a_santa) +} + +module quint_team_secret_santa { + import secret_santa(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* +} diff --git a/examples/puzzles/secret-santa/basic_secret_santa.qnt b/examples/puzzles/secret-santa/basic_secret_santa.qnt deleted file mode 100644 index 65833e3c4..000000000 --- a/examples/puzzles/secret-santa/basic_secret_santa.qnt +++ /dev/null @@ -1,42 +0,0 @@ -module secret_santa { - import basicSpells.* from "../../spells/basicSpells" - - const participants: Set[str] - - /// get(recipient_for_santa, S) is the recipient for secret santa S - var recipient_for_santa: str -> str - - /// the bowl of participants, containing a paper piece for each participant name - var bowl: Set[str] - - val santas = recipient_for_santa.keys() - val recipients = participants.map(p => recipient_for_santa.get(p)) - - /// The initial state - action init = all { - recipient_for_santa' = Map(), // No santas or recipients - bowl' = participants, // Every participant's name in the bowl - } - - action draw_recipient(santa: str): bool = { - nondet recipient = oneOf(bowl) - all { - recipient_for_santa' = put(recipient_for_santa, santa, recipient), - bowl' = bowl.setRemove(recipient), - } - } - - action step = all { - not(empty(bowl)), - nondet next_santa = participants.exclude(santas).oneOf() - draw_recipient(next_santa) - } - - val everyone_gets_a_santa = (empty(bowl)).implies(participants == recipients) - - val no_person_is_self_santa = santas.forall(person => - get(recipient_for_santa, person) != person - ) - - val invariant = everyone_gets_a_santa and no_person_is_self_santa -} diff --git a/examples/puzzles/secret-santa/quint_team_secret_santa.qnt b/examples/puzzles/secret-santa/quint_team_secret_santa.qnt deleted file mode 100644 index f49e862b3..000000000 --- a/examples/puzzles/secret-santa/quint_team_secret_santa.qnt +++ /dev/null @@ -1,28 +0,0 @@ -module quint_team_secret_santa { - import basicSpells.* from "../../spells/basicSpells" - import secret_santa(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* from "./basic_secret_santa" - - // action assign_santa_and_confirm(santa, recipient) = all { - // recipient_for_santa' = put(recipient_for_santa, santa, recipient), - // bowl' = bowl.setRemove(recipient), - // last_draw' = { participant: santa, confirmed: santa != recipient } - // } - - // run deadlock_Test = init_with_confirmation - // .then(assign_santa_and_confirm("Igor", "Jure")) - // .then(assign_santa_and_confirm("Thomas", "Shon")) - // .then(assign_santa_and_confirm("Jure", "Igor")) - // .then(assign_santa_and_confirm("Shon", "Thomas")) - // .then(step_with_confirmation) - // .expect(bowl == Set() implies no_person_is_self_santa) - - // run finding_out_my_santa_Test = init_redraw - // .then(assign_santa_and_confirm("Igor", "Jure")) - // .then(assign_santa_and_confirm("Thomas", "Shon")) - // .then(assign_santa_and_confirm("Jure", "Igor")) - // .then(assign_santa_and_confirm("Gabriela", "Gabriela")) - // .then(redraw("Gabriela")) - // .then(draw_name("Shon")) - // .expect(santa_for.get("Shon") == "Gabriela") - -} diff --git a/examples/puzzles/secret-santa/secret_santa.qnt b/examples/puzzles/secret-santa/secret_santa.qnt deleted file mode 100644 index 2ba6db93c..000000000 --- a/examples/puzzles/secret-santa/secret_santa.qnt +++ /dev/null @@ -1,114 +0,0 @@ -module secret_santa { - import commonSpells.* from "../../spells/commonSpells" - - const participants: Set[str] - - /// person_to_gift.get(A) == B if A is B's secret santa - var person_to_gift: str -> str - - /// the bowl of participants, containg a paper piece for each participant with their participant - var bowl: Set[str] - - action init = all { - person_to_gift' = Map(), - bowl' = participants, - } - - action assign_santa(p1: str, p2:str): bool = all { - person_to_gift' = person_to_gift.put(p1, p2), - bowl' = bowl.exclude(Set(p2)), - } - - action draw_name(picker: str): bool = { - nondet drawed_name = bowl.oneOf() - assign_santa(picker, drawed_name) - } - - action step = all { - bowl.size() > 0, - nondet picker = participants.filter(participant => not(participant.in(person_to_gift.keys()))).oneOf() - draw_name(picker) - } - - val everyone_gets_a_santa = bowl.size() == 0 implies participants == person_to_gift.mapValuesSet() - - val no_person_gets_themself = person_to_gift.keys().forall(participant => - person_to_gift.get(participant) != participant - ) -} - -// module quint_team_secret_santa { -// import secret_santa(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* -// } - -// Below here, more complex things that might be interesting for a tutorial. -// This is not in the state I want it to be yet, which should be: -// 1. the version with redraw should show that, if the last person picks themself, theres's no solution -// - Additionally, it would be nice to show that you can find information about who is your secret santa in this method. -// That is, if you pick yourself and redraw, but there is only one person after you, you know that person will be your (non)secret santa. -// 2. the version with reset should show that, eventually, the game is valid (no one gets themselves) - -module secret_santa_with_redraw { - // When a participant draws themself, they put their name back and draw again - - import basicSpells.* from "../../spells/basicSpells" - import secret_santa.* - export secret_santa.* - - action redraw(participant: str): bool = { - nondet new_name = bowl.oneOf() - all { - bowl' = bowl.exclude(Set(new_name)).union(Set(participant)), - person_to_gift' = person_to_gift.set(participant, new_name), - } - } - - action step_with_redraw = - val participants_who_got_themselves = person_to_gift.keys().filter(participant => person_to_gift.get(participant) == participant) - if (participants_who_got_themselves.size() > 0) { - nondet participant = participants_who_got_themselves.oneOf() - redraw(participant) - } else { - step - } - - val inv = bowl.size() == 0 implies no_person_gets_themself - - // We need fairness for this to work - temporal success = eventually(bowl.size() == 0 and everyone_gets_a_santa and no_person_gets_themself) -} - -module secret_santa_with_reset { -// When a participant draws themself, everyone returns the papers and the process starts over - import secret_santa.* - export secret_santa.* - - action step_with_reset = - if (person_to_gift.keys().exists(participant => person_to_gift.get(participant) == participant)) { - init - } else { - step - } - - val inv = bowl.size() == 0 implies no_person_gets_themself - - // We need fairness for this to work - temporal success = eventually(bowl.size() == 0 and everyone_gets_a_santa and no_person_gets_themself) -} - -module quint_team_secret_santa { - import secret_santa_with_redraw(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* - - run finding_out_my_santa_Test = init - .then(assign_santa("Igor", "Jure")) - .then(assign_santa("Thomas", "Shon")) - .then(assign_santa("Jure", "Igor")) - .then(assign_santa("Gabriela", "Gabriela")) - .then(redraw("Gabriela")) - .then(draw_name("Shon")) - .expect(person_to_gift.get("Shon") == "Gabriela") -} - -// module quint_team_secret_santa { -// import secret_santa_with_reset(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* -// } diff --git a/examples/puzzles/secret-santa/secret_santa_with_confirmation.qnt b/examples/puzzles/secret-santa/secret_santa_with_confirmation.qnt deleted file mode 100644 index d499b0be7..000000000 --- a/examples/puzzles/secret-santa/secret_santa_with_confirmation.qnt +++ /dev/null @@ -1,62 +0,0 @@ -module secret_santa_with_confirmation { - import basicSpells.* from "../../spells/basicSpells" - import secret_santa as B from "./basic_secret_santa" - - /// whether the last participant confimed they didn't picked themselves - var last_draw: { participant: str, confirmed: bool } - - /// Who had alredy drawn a paper when they got themselves. This way, I know - /// that none of those people can be the santa of the person who is drawing. - var gabrielas_memory: str -> Set[str] - - action init = all { - B::recipient_for_santa' = Map(), - B::bowl' = B::participants, - last_draw' = { participant: "none", confirmed: true }, - gabrielas_memory' = Map(), - } - - action memorize(participant) = { - gabrielas_memory' = put(gabrielas_memory, participant, B::santas) - } - - action step = all { - B::bowl.size() > 0, - nondet santa = B::participants.filter(participant => not(participant.in(B::recipient_for_santa.keys()))).oneOf() - nondet recipient = B::bowl.oneOf() - all { - B::recipient_for_santa' = put(B::recipient_for_santa, santa, recipient), - B::bowl' = B::bowl.setRemove(recipient), - last_draw' = { participant: santa, confirmed: santa != recipient }, - gabrielas_memory' = gabrielas_memory, - } - } - - type OptionalString = Some(str) | None - pure def toElem(s: Set[str]): OptionalString = { - if (s.size() != 1) { - None - } else { - s.fold(None, (_, elem) => Some(elem)) - } - } - - def find_out_santa_for(recepient: str): OptionalString = { - if (gabrielas_memory.has(recepient)) { - val possible_santas = B::participants.exclude(gabrielas_memory.get(recepient)) - possible_santas.toElem() - } else { - None - } - } - - val gabriela_finds_out_a_santa = B::participants.exists(participant => { - match find_out_santa_for(participant) { - | Some(_) => true - | None => false - } - }) - - val safe_from_memorizers = not(gabriela_finds_out_a_santa) - -} diff --git a/examples/puzzles/secret-santa/secret_santa_with_redraw.qnt b/examples/puzzles/secret-santa/secret_santa_with_redraw.qnt deleted file mode 100644 index b96400224..000000000 --- a/examples/puzzles/secret-santa/secret_santa_with_redraw.qnt +++ /dev/null @@ -1,36 +0,0 @@ -module secret_santa_with_redraw { - // When a participant draws themself, they put their name back and draw again - - import basicSpells.* from "../../spells/basicSpells" - import commonSpells.* from "../../spells/commonSpells" - import secret_santa as B from "./basic_secret_santa" - import secret_santa_with_confirmation.* from "./secret_santa_with_confirmation" - export secret_santa_with_confirmation.* - - action redraw(participant: str): bool = { - nondet new_name = B::bowl.oneOf() - all { - B::bowl' = B::bowl.exclude(Set(new_name)).union(Set(participant)), - B::recipient_for_santa' = B::recipient_for_santa.put(participant, new_name), - last_draw' = { participant: participant, confirmed: new_name != participant } - } - } - - action step_with_confirmation = - if (last_draw.confirmed) all { - step - } else all { - bowl != Set(), - redraw(last_draw.participant), - memorize(last_draw.participant), - } - - - val inv = (bowl.size() == 0 and last_draw.confirmed) implies B::no_person_is_self_santa - - - // We need fairness for this to work - temporal success = always(eventually(B::no_person_is_self_santa)) - - // I can say something like: "Also, this doesn't really work if blabla, but you'd need a temporal property to explore that scenario" -} diff --git a/examples/puzzles/secret-santa/secret_santa_with_reset.qnt b/examples/puzzles/secret-santa/secret_santa_with_reset.qnt deleted file mode 100644 index 3588b9720..000000000 --- a/examples/puzzles/secret-santa/secret_santa_with_reset.qnt +++ /dev/null @@ -1,15 +0,0 @@ -module secret_santa_with_reset { - // When a participant draws themself, everyone returns the papers and the process starts over - import secret_santa as B from "./basic_secret_santa" - import secret_santa_with_confirmation.* from "./secret_santa_with_confirmation" - export secret_santa_with_confirmation.* - - action step_with_reset = - if (last_draw.confirmed) { - step - } else { - init - } - - val inv = B::bowl.size() == 0 implies B::no_person_is_self_santa -} From 34ed8ab2c55880de0794a7171730ca866e4e3d25 Mon Sep 17 00:00:00 2001 From: bugarela Date: Thu, 21 Dec 2023 17:36:43 -0300 Subject: [PATCH 162/388] Update tictactoe path on integration tests and examples dashboard --- examples/README.md | 2 +- quint/cli-tests.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/README.md b/examples/README.md index 480e47aca..9d8b934ed 100644 --- a/examples/README.md +++ b/examples/README.md @@ -88,7 +88,7 @@ listed without any additional command line arguments. | [language-features/tuples.qnt](./language-features/tuples.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [puzzles/prisoners/prisoners.qnt](./puzzles/prisoners/prisoners.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [puzzles/river/river.qnt](./puzzles/river/river.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [puzzles/tictactoe/tictactoe.qnt](./puzzles/tictactoe/tictactoe.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [games/tictactoe/tictactoe.qnt](./games/tictactoe/tictactoe.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [solidity/Coin/coin.qnt](./solidity/Coin/coin.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [solidity/ERC20/erc20.qnt](./solidity/ERC20/erc20.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [solidity/GradualPonzi/gradualPonzi.qnt](./solidity/GradualPonzi/gradualPonzi.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | diff --git a/quint/cli-tests.md b/quint/cli-tests.md index d06b2c363..8673077ad 100644 --- a/quint/cli-tests.md +++ b/quint/cli-tests.md @@ -132,12 +132,12 @@ This example was pointing to Paxos. Now it does not typecheck. ### OK on parse TicTacToe - quint parse ../examples/puzzles/tictactoe/tictactoe.qnt + quint parse ../examples/games/tictactoe/tictactoe.qnt ### OK on typecheck TicTacToe - quint typecheck ../examples/puzzles/tictactoe/tictactoe.qnt + quint typecheck ../examples/games/tictactoe/tictactoe.qnt ### OK on parse ics20 bank From 3ca21e46c3c3f10aaf28520e676cb9af7d1be615 Mon Sep 17 00:00:00 2001 From: bugarela Date: Thu, 21 Dec 2023 17:40:26 -0300 Subject: [PATCH 163/388] Deprecate (remove) `mapValuesSet` in favor of `values`, move it to basic spells, and introduce the `empty` spell --- examples/spells/basicSpells.qnt | 26 ++++++++++++++++++++++++++ examples/spells/commonSpells.qnt | 13 ------------- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/examples/spells/basicSpells.qnt b/examples/spells/basicSpells.qnt index 40764b81b..cc3884728 100644 --- a/examples/spells/basicSpells.qnt +++ b/examples/spells/basicSpells.qnt @@ -140,4 +140,30 @@ module basicSpells { assert(m.mapRemoveAll(Set(5, 7)) == Map(3 -> 4)), assert(m.mapRemoveAll(Set(5, 99999)) == Map(3 -> 4, 7 -> 8)), } + + /// Get the set of values of a map. + /// + /// - @param __map a map from type a to type b + /// - @returns the set of all values in the map + pure def values(__map: a -> b): Set[b] = { + __map.keys().map(k => __map.get(k)) + } + + run valuesTest = all { + assert(values(Map()) == Set()), + assert(values(Map(1 -> 2, 2 -> 3)) == Set(2, 3)), + assert(values(Map(1 -> 2, 2 -> 3, 3 -> 2)) == Set(2, 3)), + } + + /// Whether a set is empty + /// + /// - @param s a set of any type + /// - @returns true iff the set is the empty set + pure def empty(s: Set[a]): bool = s == Set() + + run emptyTest = all { + assert(empty(Set()) == true), + assert(empty(Set(1, 2)) == false), + assert(empty(Set(Set())) == false), + } } diff --git a/examples/spells/commonSpells.qnt b/examples/spells/commonSpells.qnt index e78c806da..53b124ff9 100644 --- a/examples/spells/commonSpells.qnt +++ b/examples/spells/commonSpells.qnt @@ -18,19 +18,6 @@ module commonSpells { assert(setSum(Set(-4, 4, 5)) == 5), } - /// Get the set of values of a map. - /// - /// - @param __map a map from type a to type b - /// - @returns the set of all values in the map - pure def mapValuesSet(__map: a -> b): Set[b] = { - __map.keys().map(k => __map.get(k)) - } - - run mapValuesSetTest = all { - assert(mapValuesSet(Map()) == Set()), - assert(mapValuesSet(Map(1 -> 2, 2 -> 3)) == Set(2, 3)), - assert(mapValuesSet(Map(1 -> 2, 2 -> 3, 3 -> 2)) == Set(2, 3)), - } /// Convert a map into a set of pairs coordinating its keys and values /// From 94197dfea397e2e1ce5b16c4ed36329a4e083e66 Mon Sep 17 00:00:00 2001 From: bugarela Date: Thu, 21 Dec 2023 17:42:36 -0300 Subject: [PATCH 164/388] Add secret santa blogpost --- .../blogpost0-secretsanta/secret_santa.org | 363 ++++++++++++++++++ 1 file changed, 363 insertions(+) create mode 100644 tutorials/blogpost0-secretsanta/secret_santa.org diff --git a/tutorials/blogpost0-secretsanta/secret_santa.org b/tutorials/blogpost0-secretsanta/secret_santa.org new file mode 100644 index 000000000..8a01b8001 --- /dev/null +++ b/tutorials/blogpost0-secretsanta/secret_santa.org @@ -0,0 +1,363 @@ +* Holiday protocols: secret santa with Quint :santa: + +Hi everyone, and happy holiday season! I'm Gabriela, I work on [[https://github.com/informalsystems/quint][Quint]], and today I'll walk you through my end-of-the-year holiday experiment: writing a specification for the secret santa game :santa:. + +Secret santa is a game for trading presents between participants. We write down the participants' names on individual pieces of paper, fold them, and put them in a bowl. The bowl is passed around to the participants, with each of them taking one piece of paper from the bowl, deciding the person the picker should gift a present to. This goes on until the bowl is empty, and everyone has someone to gift :gift:. + +I played this game at least once a year since I was a little kid, and well, different groups have different standards for the drawing process. I'm always one of the (potentially annoying) people who will make everyone play by the safest rules (well, that applies to many other scenarios, and I guess that's how I ended up working on Quint :grimacing:). So welcome aboard if you are one of these people too, and if you are not, this blogpost might introduce some complications for your next secret santa game. + +Disclaimer: This is not a super didactic tutorial, but rather a fun example of how I personally appreciate Quint (or formal specification in general). If you are looking for tutorials, we have some better introductory material [[https://github.com/informalsystems/quint/tree/main/tutorials][here]], and more documentation [[https://github.com/informalsystems/quint/tree/main/doc][here]]. In any way, I still recommend skimming through this as a potential motivational material :heart:. + +The complete spec described here is available in the [[https://github.com/informalsystems/quint/tree/main/examples/games/secret-santa/secret_santa.qnt][examples folder]]. + +** Basic secret santa + +Let's start with the basics: we have a =bowl= of recipient names. As each +participant draws its recipient, we record the drawn name in a map called +=recipient_for_santa=. The keys of the map are the santas giving gifts, and the +values are the gift-receivers for each santa. Those will be our two *state +variables*, meaning we'll be changing their values as the game progresses. +The set of participants in the game is a constant, which can be seen as +a module parameter (more on that later). + +We also import a library with some utility functions. The import statement +should point to the [[https://github.com/informalsystems/quint/blob/main/examples/spells/basicSpells.qnt][basicSpells.qnt]] file, from the quint repo, on your local file +system. + +#+begin_src bluespec +module secret_santa { + import basicSpells.* from "../../spells/basicSpells" + + const participants: Set[str] + + /// A map from santas to their recipients. get(recipient_for_santa, S) is the recipient for secret santa S + var recipient_for_santa: str -> str + + /// The bowl of participants, containing a paper piece for each participant's name + var bowl: Set[str] +} +#+end_src + +Now that we have the state variables, we need to specify their values in the initial state: +#+begin_src bluespec +/// The initial state +action init = all { + recipient_for_santa' = Map(), // No santas or recipients + bowl' = participants, // Every participant's name in the bowl +} +#+end_src + + +The following definitions are helpers: the set of santas are the keys of the =recipent_for_santa= map, while the recipients are the values of that map. These values are not fixed. Rather, they work as projections, or views, on the current state. When the values for the =recipient_for_santa= state variable change, the values for these helpers will change as well. +#+begin_src bluespec +val santas = recipient_for_santa.keys() +val recipients = recipient_for_santa.values() +#+end_src + +Finally, we define the system's transitions, which is just the drawing process. At each step, we non-deterministically pick the participant who is going to draw, and then, non-deterministically, draw one of the names from the bowl. We register that on our =recipient_for_santa= map and remove the drawn name from the bowl. When the bowl gets empty, we still need to define what happens. In this case, the drawing is over, and all state variables will stay the same - at least until the next holidays :christmas_tree:. When no variables change, we call that a =stutter= step. + +#+begin_src bluespec +action draw_recipient(santa: str): bool = { + nondet recipient = oneOf(bowl) + all { + recipient_for_santa' = put(recipient_for_santa, santa, recipient), + bowl' = bowl.setRemove(recipient), + } +} + +action stutter = all { + recipient_for_santa' = recipient_for_santa, + bowl' = bowl, +} + +action step = + if (empty(bowl)) { + stutter + } else { + nondet next_santa = participants.exclude(santas).oneOf() + draw_recipient(next_santa) + } +#+end_src + +This is a very basic protocol, but already ensures one of the properties I'm +interested in: no sad kids with no presents at the revelation - everyone gets a +santa. That is, if the bowl is empty. In other words, the bowl being empty +*implies* that all the participants will receive gifts :gift:. + +#+begin_src bluespec +val everyone_gets_a_santa = empty(bowl) implies (participants == recipients) +#+end_src + +Before we can check that our spec satisfies this property, we need to define a +value for our module's constant. Constants parameters to a module, so we need +to instantiate that module and specify the =participants=. Let's use the Quint +developer team as an example! + +#+begin_src bluespec +module secret_santa { + // ... all the code from before +} + +module quint_team_secret_santa { + import secret_santa(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* +} +#+end_src + +Now we can use Quint's =verify= command to check that all possible executions +(up to a certain length -- 10 steps, by default) satisfy this property for the =quint_team_secret_santa= module. + +#+begin_src sh +quint verify secret_santa.qnt --main=quint_team_secret_santa --invariant=everyone_gets_a_santa +#+end_src + +We get a successful result - the property holds! +#+begin_src sh +[ok] No violation found (2119ms). +You may increase --max-steps. +#+end_src + +Let's try a different property! People don't really want to buy themselves +presents. /Well, perhaps except for that teenage cousin who would rather not be +playing, but their mom forced them to. But let's not consider that./ So let's +write a property stating that, for each santa, they are not their own recipient. +#+begin_src bluespec +val no_person_is_self_santa = santas.forall(santa => + get(recipient_for_santa, santa) != santa +) +#+end_src + +And then check that property: +#+begin_src sh +quint verify secret_santa.qnt --main=quint_team_secret_santa --invariant=no_person_is_self_santa +#+end_src + +This time, we find out that the property does *not* hold! Quint provides us with a minimal counterexample. +#+begin_src bluespec +An example execution: + +[State 0] { quint_team_secret_santa::secret_santa::bowl: Set("Gabriela", "Igor", "Jure", "Shon", "Thomas"), quint_team_secret_santa::secret_santa::recipient_for_santa: Map() } + +[State 1] { quint_team_secret_santa::secret_santa::bowl: Set("Igor", "Jure", "Shon", "Thomas"), quint_team_secret_santa::secret_santa::recipient_for_santa: Map("Gabriela" -> "Gabriela") } + +[violation] Found an issue (2068ms). +error: found a counterexample +#+end_src + +In this example, Gabriela (that's me) got themself in the very first draw and would have to buy their own present. Not great! + +A better secret santa game has an additional, currently unspecified, step: after +a person draws a name from the bowl, they should confirm that they didn't get +themself before the drawing can continue. If someone draws themself, one of two strategies can take place: + 1. They immediately put their name back and draw again. + 2. The whole game gets reset: everyone who has already drawn a paper puts it back, and it all starts again. + +I want to try both strategies in Quint, and then show how (2) is better than (1). Usually, people don't want to reset the whole thing and get tempted to do (1), and that's when I say "no no no no no". Well, now I can show them the Quint spec and counterexamples, and they won't have any arguments! But first, let's add the confirmation step to our existing spec, which will be used by both strategies. + +First, we add a variable and change our =init= definition to include an initialization for it. We should also make sure it also stutters in our =stutter= helper definition. +#+begin_src bluespec +/// Information about the last draw +type LastDraw = + | Self(str) // The name of someone who drew themself + | Ok // The draw was Ok + +var last_draw: LastDraw + +action init = all { + // ... + last_draw' = Ok // if no one has drawn yet, no one has drawn themself +} + +action stutter = all { + // ... + last_draw' = last_draw, +} +#+end_src + +Then, we update the =draw_recipent= action to include the confirmation, that is, =last_draw= should be updated to the participant who drew, and its confirmed value should be true if and only if the participant got someone other than themself. +#+begin_src bluespec +action draw_recipient(santa: str): bool = { + nondet recipient = oneOf(bowl) + all { + // ... + last_draw' = if (santa == recipient) Self(santa) else Ok +} +#+end_src + +With this variable in place, we can now write a new invariant stating that our predicate =no_person_is_self_santa= should be satisfied if the last draw was ok. That is, the condition *implies* the predicate. +#+begin_src bluespec +val inv = (last_draw == Ok) implies no_person_is_self_santa +#+end_src + +Defining the variable on its own doesn't help us with satisfying that property, +tho. We need to define a strategy to deal with scenarios where the last draw +didn't turn out right. + +** Secret santa with the redraw strategy + +In this strategy, when a participant draws themself, they should pick another name. They can either first put their name back in the bowl, and then redraw; or first redraw and then put their name back, ensuring they won't get themself again. Both of them should work the same in the end, since we are not considering efficiency here. But let's define the latter. + +#+begin_src bluespec +action redraw(participant: str): bool = { + // Draw from the current bowl, without having first put paper back + nondet new_recipient = oneOf(bowl) + all { + new_recipient != participant, // The action requires this precondition + // Remove the new paper from the bowl, and then put the old one back in + bowl' = bowl.exclude(Set(new_recipient)).union(Set(participant)), + recipient_for_santa' = recipient_for_santa.put(participant, new_recipient), + last_draw' = Ok // We know this is OK due to the precondition + } +} +#+end_src + +We should call the redraw action whenever we find a self-draw. It is important to ensure that the bowl is not empty when we call that action since we need at least one name in the bowl to be drawn. +#+begin_src bluespec +action step_with_redraw = + match last_draw { + | Ok => + step // All good, continue as usual + | Self(participant) => all { + not(empty(bowl)), + redraw(participant), + } + } +#+end_src + +Let's check if our new invariant =inv= (defined as =(last_draw == Ok) implies no_person_is_self_santa=) is satisfied with our new step definition. We now have to specify our step definition with =--step=step_with_redraw=, otherwise, Quint will use the default name =step=. +#+begin_src sh +quint verify secret_santa.qnt --main=quint_team_secret_santa --invariant=inv --step=step_with_redraw +#+end_src + +The property is successfully checked. +#+begin_src sh +[ok] No violation found (4360ms). +#+end_src + +** Secret santa with the reset strategy + +In the reset strategy, we restart the whole game when some confirmation is negative. The definition looks quite nice! We could define this in a different module and plug everything together with import statements - but let's keep things simpler here and define yet another step action called =step_with_reset=. +#+begin_src bluespec +action step_with_reset = + if (last_draw == Ok) { + step + } else { + init + } +#+end_src + +Now, let's check the property. +#+begin_src sh +quint verify secret_santa.qnt --main=quint_team_secret_santa --invariant=inv --step=step_with_reset +#+end_src + +The property is successfully checked. +#+begin_src sh +[ok] No violation found (2492ms). +#+end_src + +** Redrawing is not good enough! + +Although both strategies can guarantee that, if the last draw was confirmed, then no person is their own santa, I still see two scenarios where the redraw strategy might have problems, while the reset strategy does not. +1. If the player who draws themself is the last player, and the bowl gets empty, there is nothing to be done to solve the issue. +2. If some of the players have a good memory and pay attention, they will have information about who may and may not be someone's santa, and even potentially find out who is a santa of someone, or their own santa! We need to preserve the "secret" part of this game! + +To show how (1) can happen, we should use temporal properties. However, since that requires a deeper explanation, and the tooling for it is not the most stable at the moment, I'll leave this one for next year. Instead, let's play around with (2). + +(2) does not need all the players to have a great memory, so let's say only I (Gabriela) am actually paying attention and memorizing some stuff. For that, let's introduce my memory as a state variable. +#+begin_src bluespec +/// Who had already drawn a paper when someone got themself. This way, I know +/// that none of those people can be the santa of the person who is drawing. +var gabrielas_memory: str -> Set[str] +#+end_src + +This is what I will be memorizing during the game: for each person that gets themself, who has already drawn by the time they got themself. Let's think of an example, using the Quint team as the set of participants (that is =Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")=): Let's say Shon draws and confirms, then Igor draws and confirms, then Thomas draws and makes a negative confirmation. At that point, I know that neither Shon nor Igor have drawn Thomas, otherwise, the paper with Thomas' name wouldn't be in the bowl when he draws. So my memory map becomes =Map("Thomas" -> Set("Shon", "Igor", "Thomas"))=, which tells me that neither Shon nor Igor is Thomas' santa. Thomas themself is also part of the set because that makes things easier to represent, but we could also choose to remove the participant themself from the set. + +This memorization is only relevant in the redraw strategy, as the reset strategy reinitializes the whole process on self draws, making any memorization useless from that point on. Therefore, let's only play with memorization in the redraw version. For that let's define how the memory variable is initialized and updated: + +#+begin_src bluespec +action init = all { + // ... + gabrielas_memory' = Map(), +} + +action draw_recipient(santa: str): bool = { + // ... + all { + // ..., + gabrielas_memory' = gabrielas_memory, // Nothing to memorize, so the memory stays the same + } +} + +action stutter = all { + // ... + gabrielas_memory' = gabrielas_memory, +} + +// Store current santas (people who have already drawn) on a participant's key, meaning that they can't be that participant's santa +action memorize(participant) = { + gabrielas_memory' = put(gabrielas_memory, participant, santas) +} + +action step_with_redraw = + match last_draw { + | Ok => + step // All good, continue as usual + | Self(participant) => all { + // ..., + memorize(participant), + } + } +#+end_src + +*** Is there a scenario where I find out who is someone's santa? + +Now let's define a property that is true when I am able to deduce someone's +santa: + +#+begin_src bluespec +/// true iff Gabriela can find out who is a santa for someone. +/// That is, if exists a participant where find_out_a_santa_for participant is Some() +val gabriela_finds_out_a_santa = participants.exists(participant => { + if (gabrielas_memory.has(participant)) { + val possible_santas = participants.exclude(gabrielas_memory.get(participant)) + possible_santas.size() == 1 + } else { + false + } +}) +#+end_src + +Finally, the invariant we want to check is that Gabriela should NOT be able to find out a santa. +#+begin_src bluespec +val safe_from_memorizers = not(gabriela_finds_out_a_santa) +#+end_src + +Let's verify it, with the redraw version of =step_for_confirmation= +#+begin_src sh +quint verify secret_santa.qnt --main=quint_team_secret_santa --invariant=safe_from_memorizers --step=step_with_redraw +#+end_src + +We get a violation! After 5 steps, we get to a point where I know that Shon is my santa :santa: +#+begin_src bluespec +... +[State 5] +{ + quint_team_secret_santa::secret_santa::bowl: Set("Gabriela"), + quint_team_secret_santa::secret_santa::gabrielas_memory: + Map("Gabriela" -> Set("Gabriela", "Igor", "Jure", "Thomas")), + quint_team_secret_santa::secret_santa::last_draw: Ok, + quint_team_secret_santa::secret_santa::recipient_for_santa: + Map("Jure" -> "Igor", "Igor" -> "Thomas", "Gabriela" -> "Jure", "Thomas" -> "Shon") +} + +[violation] Found an issue (2628ms). +error: found a counterexample +#+end_src + +On state 5, my memory is =Map("Gabriela" -> Set("Gabriela", "Igor", "Jure", "Thomas"))=, so only Shon can possibly be my (non-secret) santa! + +Here, we only checked for the presence of the worst scenario: finding out someone's santa. This only happens if the second to last person redraws, and therefore their name is the only one in the bowl when the last person (in this case, Shon) draws. However, memorizers can also find partial information that can also ruin the game a bit, i.e. knowing for sure that a person who always gives the best gifts couldn't possibly have drawn me - that's a bummer, right? + +Well, what actually bothers me is having possible flaws in the drawing protocol like this, and that's why every year I insist on the reset strategy. There are some other interesting properties of secret santa that I'd like to explore, especially in the revelation procedure. But it's almost Christmas already, which means it's time for me to get ready for some beach time: I'm in Brazil, and we get Christmas during summer, and that's my favorite time of the year :sunny:. So let's talk about secret santa Quint specs again next year. + +Wish you all a happy holiday season and a lovely new year! From f6ddf9bf53b0b7719518b345b181c89f88bea360 Mon Sep 17 00:00:00 2001 From: bugarela Date: Thu, 21 Dec 2023 17:59:57 -0300 Subject: [PATCH 165/388] Fix grammar issues --- tutorials/blogpost0-secretsanta/secret_santa.org | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tutorials/blogpost0-secretsanta/secret_santa.org b/tutorials/blogpost0-secretsanta/secret_santa.org index 8a01b8001..d79d207fb 100644 --- a/tutorials/blogpost0-secretsanta/secret_santa.org +++ b/tutorials/blogpost0-secretsanta/secret_santa.org @@ -1,4 +1,4 @@ -* Holiday protocols: secret santa with Quint :santa: +* Holiday protocols: secret santa with Quint \:santa\: Hi everyone, and happy holiday season! I'm Gabriela, I work on [[https://github.com/informalsystems/quint][Quint]], and today I'll walk you through my end-of-the-year holiday experiment: writing a specification for the secret santa game :santa:. @@ -89,7 +89,7 @@ val everyone_gets_a_santa = empty(bowl) implies (participants == recipients) #+end_src Before we can check that our spec satisfies this property, we need to define a -value for our module's constant. Constants parameters to a module, so we need +value for our module's constant. Constants are parameters to a module, so we need to instantiate that module and specify the =participants=. Let's use the Quint developer team as an example! @@ -270,9 +270,9 @@ To show how (1) can happen, we should use temporal properties. However, since th var gabrielas_memory: str -> Set[str] #+end_src -This is what I will be memorizing during the game: for each person that gets themself, who has already drawn by the time they got themself. Let's think of an example, using the Quint team as the set of participants (that is =Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")=): Let's say Shon draws and confirms, then Igor draws and confirms, then Thomas draws and makes a negative confirmation. At that point, I know that neither Shon nor Igor have drawn Thomas, otherwise, the paper with Thomas' name wouldn't be in the bowl when he draws. So my memory map becomes =Map("Thomas" -> Set("Shon", "Igor", "Thomas"))=, which tells me that neither Shon nor Igor is Thomas' santa. Thomas themself is also part of the set because that makes things easier to represent, but we could also choose to remove the participant themself from the set. +This is what I will be memorizing during the game: for each person that gets themself, who has already drawn by the time they got themself. Let's think of an example, using the Quint team as the set of participants (that is =Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")=): Let's say Shon draws and confirms, then Igor draws and confirms, then Thomas draws and makes a negative confirmation. At that point, I know that neither Shon nor Igor had drawn Thomas, otherwise, the paper with Thomas' name wouldn't be in the bowl when he drew. So my memory map becomes =Map("Thomas" -> Set("Shon", "Igor", "Thomas"))=, which tells me that neither Shon nor Igor is Thomas' santa. Thomas themself is also part of the set because that makes things easier to represent, but we could also choose to remove the participant themself from the set. -This memorization is only relevant in the redraw strategy, as the reset strategy reinitializes the whole process on self draws, making any memorization useless from that point on. Therefore, let's only play with memorization in the redraw version. For that let's define how the memory variable is initialized and updated: +This memorization is only relevant in the redraw strategy, as the reset strategy reinitializes the whole process on self-sdraws, making any memorization useless from that point on. Therefore, let's only play with memorization in the redraw version. For that let's define how the memory variable is initialized and updated: #+begin_src bluespec action init = all { From 42ef104f6eb647acdf190489fbbc2aa6430f8980 Mon Sep 17 00:00:00 2001 From: bugarela Date: Thu, 21 Dec 2023 18:08:26 -0300 Subject: [PATCH 166/388] Update examples dashboard --- examples/.scripts/run-example.sh | 4 +++- examples/README.md | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/examples/.scripts/run-example.sh b/examples/.scripts/run-example.sh index 6e0115a4a..b2da22272 100755 --- a/examples/.scripts/run-example.sh +++ b/examples/.scripts/run-example.sh @@ -90,6 +90,8 @@ get_main () { main="--main=Lightclient_4_3_correct" elif [[ "$file" == "puzzles/prisoners/prisoners.qnt" ]] ; then main="--main=prisoners3" + elif [[ "$file" == "games/secret-santa/secret_santa.qnt" ]] ; then + main="--main=quint_team_secret_santa" elif [[ "$file" == "solidity/ERC20/erc20.qnt" ]] ; then main="--main=erc20Tests" elif [[ "$file" == "solidity/SimplePonzi/simplePonzi.qnt" ]] ; then @@ -126,7 +128,7 @@ get_verify_args () { args="--init=n4_f1::Init --step=n4_f1::Next --invariant=n4_f1::Agreement" elif [[ "$file" == "cosmos/ics23/ics23.qnt" ]] ; then args="--init=Init --step=Next" - elif [[ "$file" == "puzzles/tictactoe/tictactoe.qnt" ]] ; then + elif [[ "$file" == "games/tictactoe/tictactoe.qnt" ]] ; then args="--max-steps=1" # pretty slow, and we just want to check that verification can run fi echo "${args}" diff --git a/examples/README.md b/examples/README.md index 9d8b934ed..95a502543 100644 --- a/examples/README.md +++ b/examples/README.md @@ -72,6 +72,8 @@ listed without any additional command line arguments. | [cosmwasm/zero-to-hero/vote.qnt](./cosmwasm/zero-to-hero/vote.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [cryptography/hashes.qnt](./cryptography/hashes.qnt) | :white_check_mark: | :white_check_mark: | N/A[^parameterized] | N/A[^nostatemachine] | | [cryptography/hashesTest.qnt](./cryptography/hashesTest.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | N/A[^nostatemachine] | +| [games/secret-santa/secret_santa.qnt](./games/secret-santa/secret_santa.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [games/tictactoe/tictactoe.qnt](./games/tictactoe/tictactoe.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/booleans.qnt](./language-features/booleans.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/counters.qnt](./language-features/counters.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/importFrom.qnt](./language-features/importFrom.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | @@ -88,7 +90,6 @@ listed without any additional command line arguments. | [language-features/tuples.qnt](./language-features/tuples.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [puzzles/prisoners/prisoners.qnt](./puzzles/prisoners/prisoners.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [puzzles/river/river.qnt](./puzzles/river/river.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [games/tictactoe/tictactoe.qnt](./games/tictactoe/tictactoe.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [solidity/Coin/coin.qnt](./solidity/Coin/coin.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [solidity/ERC20/erc20.qnt](./solidity/ERC20/erc20.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [solidity/GradualPonzi/gradualPonzi.qnt](./solidity/GradualPonzi/gradualPonzi.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | From 3ac4474eb30e90e0de79a9d0e3d11bb59138ef49 Mon Sep 17 00:00:00 2001 From: bugarela Date: Thu, 21 Dec 2023 18:12:18 -0300 Subject: [PATCH 167/388] Fix emoji on title --- tutorials/blogpost0-secretsanta/secret_santa.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/blogpost0-secretsanta/secret_santa.org b/tutorials/blogpost0-secretsanta/secret_santa.org index d79d207fb..4edc24063 100644 --- a/tutorials/blogpost0-secretsanta/secret_santa.org +++ b/tutorials/blogpost0-secretsanta/secret_santa.org @@ -1,4 +1,4 @@ -* Holiday protocols: secret santa with Quint \:santa\: +* Holiday protocols: secret santa with Quint 🎅 Hi everyone, and happy holiday season! I'm Gabriela, I work on [[https://github.com/informalsystems/quint][Quint]], and today I'll walk you through my end-of-the-year holiday experiment: writing a specification for the secret santa game :santa:. From fa5b8dd4d382d4a0e3d6e2f531749a2bfabfea6f Mon Sep 17 00:00:00 2001 From: bugarela Date: Thu, 21 Dec 2023 18:17:17 -0300 Subject: [PATCH 168/388] Remove unintended change on `option.qnt` --- examples/language-features/option.qnt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/examples/language-features/option.qnt b/examples/language-features/option.qnt index f8fbce203..871eda916 100644 --- a/examples/language-features/option.qnt +++ b/examples/language-features/option.qnt @@ -7,6 +7,21 @@ module option { | Some(int) var votes: List[VoteOption] + var outcome: int + + action init = all { + votes' = [], + outcome' = 0 + } + + action vote(v) = { + votes' = votes.append(Some(v)) + } + + action unvote(i) = all { + votes[i] != None, + votes' = votes.replaceAt(i, None), + } val sumVotes = votes.foldl(0, (sum, v) => match v { From 8efb507dcec69cc9968ee0dafdda258ab0d4bc3c Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 3 Jan 2024 13:49:49 -0500 Subject: [PATCH 169/388] Release v0.18.0 --- CHANGELOG.md | 9 +++++++++ quint/package-lock.json | 4 ++-- quint/package.json | 2 +- quint/src/version.ts | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 43ca138e6..20a935176 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.18.0 -- 2024-01-03 + ### Added - Add a run operator `A.expect(P)` to test the state predicate `P` in the state resulting from applying action `A` (#1303) diff --git a/quint/package-lock.json b/quint/package-lock.json index 75108d964..096e6597a 100644 --- a/quint/package-lock.json +++ b/quint/package-lock.json @@ -1,12 +1,12 @@ { "name": "@informalsystems/quint", - "version": "0.17.1", + "version": "0.18.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint", - "version": "0.17.1", + "version": "0.18.0", "license": "Apache 2.0", "dependencies": { "@grpc/grpc-js": "^1.8.14", diff --git a/quint/package.json b/quint/package.json index 4e7543db0..7fc8c4a72 100644 --- a/quint/package.json +++ b/quint/package.json @@ -1,6 +1,6 @@ { "name": "@informalsystems/quint", - "version": "0.17.1", + "version": "0.18.0", "description": "Core tool for the Quint specification language", "keywords": [ "temporal", diff --git a/quint/src/version.ts b/quint/src/version.ts index f84500743..1aff2dbe7 100644 --- a/quint/src/version.ts +++ b/quint/src/version.ts @@ -1,2 +1,2 @@ // Generated by genversion. -export const version = '0.17.1' +export const version = '0.18.0' From 20b588fee7f08b9010fdd09f3582e2a637e59b11 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 3 Jan 2024 14:10:57 -0500 Subject: [PATCH 170/388] VSCode Release v0.13.0 --- vscode/quint-vscode/CHANGELOG.md | 9 +++++++++ vscode/quint-vscode/package-lock.json | 4 ++-- vscode/quint-vscode/package.json | 2 +- vscode/quint-vscode/server/package-lock.json | 18 +++++++++--------- vscode/quint-vscode/server/package.json | 4 ++-- 5 files changed, 23 insertions(+), 14 deletions(-) diff --git a/vscode/quint-vscode/CHANGELOG.md b/vscode/quint-vscode/CHANGELOG.md index 81a619828..609132a83 100644 --- a/vscode/quint-vscode/CHANGELOG.md +++ b/vscode/quint-vscode/CHANGELOG.md @@ -14,6 +14,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed ### Security +## v0.13.0 -- 2024-01-03 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + ## v0.12.2 -- 2023-12-19 ### Added diff --git a/vscode/quint-vscode/package-lock.json b/vscode/quint-vscode/package-lock.json index a5eeea047..40be843ee 100644 --- a/vscode/quint-vscode/package-lock.json +++ b/vscode/quint-vscode/package-lock.json @@ -1,12 +1,12 @@ { "name": "quint-vscode", - "version": "0.12.2", + "version": "0.13.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "quint-vscode", - "version": "0.12.2", + "version": "0.13.0", "hasInstallScript": true, "dependencies": { "vscode-languageclient": "^7.0.0" diff --git a/vscode/quint-vscode/package.json b/vscode/quint-vscode/package.json index 953059900..f6c62ac88 100644 --- a/vscode/quint-vscode/package.json +++ b/vscode/quint-vscode/package.json @@ -3,7 +3,7 @@ "displayName": "Quint", "description": "Language support for Quint specifications", "icon": "quint-logo-vscode.png", - "version": "0.12.2", + "version": "0.13.0", "publisher": "informal", "engines": { "vscode": "^1.52.0" diff --git a/vscode/quint-vscode/server/package-lock.json b/vscode/quint-vscode/server/package-lock.json index f642ffc34..79b1dcba0 100644 --- a/vscode/quint-vscode/server/package-lock.json +++ b/vscode/quint-vscode/server/package-lock.json @@ -1,15 +1,15 @@ { "name": "@informalsystems/quint-language-server", - "version": "0.12.2", + "version": "0.13.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint-language-server", - "version": "0.12.2", + "version": "0.13.0", "license": "Apache 2.0", "dependencies": { - "@informalsystems/quint": "^0.17.1", + "@informalsystems/quint": "^0.18.0", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" @@ -476,9 +476,9 @@ "dev": true }, "node_modules/@informalsystems/quint": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.17.1.tgz", - "integrity": "sha512-cur9QRFl6pqQ05xODWKxiOS2CSN7pRQX48emz2g2kRb1XC//YGFSuE4BOXKmDQSl5Gey9tdXn0YPdP6Uw+ncLg==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.18.0.tgz", + "integrity": "sha512-IBmMLCmBYnMg5PhzB6jK6M4r90H+OIuQb2buwx7opfMozbdZ3+h7PLkekcvIsQulNA+nljMH6SaNGU0bmo75MQ==", "dependencies": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", @@ -7207,9 +7207,9 @@ "dev": true }, "@informalsystems/quint": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.17.1.tgz", - "integrity": "sha512-cur9QRFl6pqQ05xODWKxiOS2CSN7pRQX48emz2g2kRb1XC//YGFSuE4BOXKmDQSl5Gey9tdXn0YPdP6Uw+ncLg==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.18.0.tgz", + "integrity": "sha512-IBmMLCmBYnMg5PhzB6jK6M4r90H+OIuQb2buwx7opfMozbdZ3+h7PLkekcvIsQulNA+nljMH6SaNGU0bmo75MQ==", "requires": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", diff --git a/vscode/quint-vscode/server/package.json b/vscode/quint-vscode/server/package.json index 059ae1a1b..2289fc60f 100644 --- a/vscode/quint-vscode/server/package.json +++ b/vscode/quint-vscode/server/package.json @@ -1,7 +1,7 @@ { "name": "@informalsystems/quint-language-server", "description": "Language Server for the Quint specification language", - "version": "0.12.2", + "version": "0.13.0", "author": "Informal Systems", "contributors": [ { @@ -43,7 +43,7 @@ "test/**/*.ts" ], "dependencies": { - "@informalsystems/quint": "^0.17.1", + "@informalsystems/quint": "^0.18.0", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" From f3f9f9a14fadb7a68b535008ac25b6026fe24f5d Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 3 Jan 2024 14:28:36 -0500 Subject: [PATCH 171/388] Fix link --- vscode/quint-vscode/server/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vscode/quint-vscode/server/README.md b/vscode/quint-vscode/server/README.md index e27840ded..bf57df19d 100644 --- a/vscode/quint-vscode/server/README.md +++ b/vscode/quint-vscode/server/README.md @@ -18,6 +18,6 @@ There are currently three clients for this server: 1. The Quint [VSCode extension](https://marketplace.visualstudio.com/items?itemName=informal.quint-vscode) 2. The [Quint LSP client](https://github.com/informalsystems/quint/blob/main/editor-plugins/emacs/README.md) for Emacs -3. A [Neovim LSP client]((https://github.com/informalsystems/quint/blob/main/editor-plugins/vim/README.md) +3. A [Neovim LSP client](https://github.com/informalsystems/quint/blob/main/editor-plugins/vim/README.md) (1) and (2) are capable of downloading and installing this server for you. (3) requires manual installation (for now). From a91de8035bac09c6bd309d74563cd1b9dffdb3d9 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 3 Jan 2024 16:45:27 -0500 Subject: [PATCH 172/388] Update examples dashboard --- examples/.scripts/run-example.sh | 3 ++- examples/README.md | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/examples/.scripts/run-example.sh b/examples/.scripts/run-example.sh index 6e0115a4a..7f3a0a369 100755 --- a/examples/.scripts/run-example.sh +++ b/examples/.scripts/run-example.sh @@ -34,7 +34,8 @@ result () { "$file" =~ ^cryptography/ || "$file" =~ ^spells/ || "$file" == "solidity/SimpleAuction/SimpleAuction.qnt" || - "$file" == "cosmos/ics20/base.qnt" ) ]] ; then + "$file" == "cosmos/ics20/base.qnt" || + "$file" == "cosmos/cosmos/bank/bank.qnt" ) ]] ; then printf "N/A[^nostatemachine]"; return fi diff --git a/examples/README.md b/examples/README.md index 480e47aca..1cebc1b67 100644 --- a/examples/README.md +++ b/examples/README.md @@ -57,6 +57,8 @@ listed without any additional command line arguments. | [classic/distributed/TwoPhaseCommit/two_phase_commit.qnt](./classic/distributed/TwoPhaseCommit/two_phase_commit.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt](./classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt) | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1299 | :x:https://github.com/informalsystems/quint/issues/1299 | | [classic/sequential/BinSearch/BinSearch.qnt](./classic/sequential/BinSearch/BinSearch.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [cosmos/bank/bank.qnt](./cosmos/bank/bank.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | N/A[^nostatemachine] | +| [cosmos/bank/bankTest.qnt](./cosmos/bank/bankTest.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [cosmos/ics20/bank.qnt](./cosmos/ics20/bank.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [cosmos/ics20/base.qnt](./cosmos/ics20/base.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | N/A[^nostatemachine] | | [cosmos/ics20/denomTrace.qnt](./cosmos/ics20/denomTrace.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | From f6f7cf1705d36adf78ff699fba40fd22dd7795eb Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 3 Jan 2024 17:02:06 -0500 Subject: [PATCH 173/388] Fix runner script --- examples/.scripts/run-example.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/.scripts/run-example.sh b/examples/.scripts/run-example.sh index 7f3a0a369..1794010f3 100755 --- a/examples/.scripts/run-example.sh +++ b/examples/.scripts/run-example.sh @@ -35,7 +35,7 @@ result () { "$file" =~ ^spells/ || "$file" == "solidity/SimpleAuction/SimpleAuction.qnt" || "$file" == "cosmos/ics20/base.qnt" || - "$file" == "cosmos/cosmos/bank/bank.qnt" ) ]] ; then + "$file" == "cosmos/bank/bank.qnt" ) ]] ; then printf "N/A[^nostatemachine]"; return fi From 762aea0b564341fd392e740cef527d5efeeda58e Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 9 Jan 2024 09:12:38 -0300 Subject: [PATCH 174/388] Fix formatting and use simpler Map creation --- examples/cosmos/bank/bank.qnt | 2 +- examples/cosmos/bank/bankTest.qnt | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/examples/cosmos/bank/bank.qnt b/examples/cosmos/bank/bank.qnt index 59391d399..73353dec8 100644 --- a/examples/cosmos/bank/bank.qnt +++ b/examples/cosmos/bank/bank.qnt @@ -80,6 +80,7 @@ module bank { Map() } } + /// `ValidateBalance` should only be called upon genesis state. /// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/view.go#L202 pure def ViewKeeper::ValidateBalance(ctx: BankCtx, addr: Addr): bool = and { @@ -198,5 +199,4 @@ module bank { // Implementation: return the error ErrSendDisabled on false coins.forall(c => SendKeeper::IsSendEnabledCoin(ctx, c)) } - } diff --git a/examples/cosmos/bank/bankTest.qnt b/examples/cosmos/bank/bankTest.qnt index 68112aed1..7f21e4c1c 100644 --- a/examples/cosmos/bank/bankTest.qnt +++ b/examples/cosmos/bank/bankTest.qnt @@ -1,3 +1,5 @@ +// -*- mode: Bluespec; -*- + module bankTest { import bank.* from "./bank" @@ -19,9 +21,10 @@ module bankTest { // limit the total supply of burgers and bananas to 10_000 supply' = Set("banana", "burger").mapBy(d => 10_000), // the king has it all - balances' = Set("king").mapBy(a => Set("banana", "burger").mapBy(d => 10_000)), + balances' = Map("king" -> Set("banana", "burger").mapBy(d => 10_000)), _lastError' = "", } + action send(fromAddr: Addr, toAddr: Addr, coins: Coins): bool = all { val ctx = stateToCtx(0) val result = SendKeeper::SendCoins(ctx, fromAddr, toAddr, coins) @@ -41,7 +44,6 @@ module bankTest { } } - action step = any { nondet fromAddr = oneOf(ADDR) nondet toAddr = oneOf(ADDR) @@ -96,12 +98,13 @@ module bankTest { } } } + run sendTest = { init // the King has bananas and he can send it .then(send("king", "donkeykong", - Set("banana").mapBy(d => 2_000))) + Map("banana" -> 2_000))) .expect(and { balances.get("king").get("banana") == 8_000, balances.get("donkeykong").get("banana") == 2_000, From c3fc52760af7756cd0fbf26244466541116711ec Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 9 Jan 2024 09:26:43 -0300 Subject: [PATCH 175/388] Move changes to the markdown file and regenerate with LMT --- examples/cosmos/bank/bankTest.qnt | 1 - examples/cosmos/bank/cosmos-bank.md | 10 ++++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/examples/cosmos/bank/bankTest.qnt b/examples/cosmos/bank/bankTest.qnt index 7f21e4c1c..d721d54d0 100644 --- a/examples/cosmos/bank/bankTest.qnt +++ b/examples/cosmos/bank/bankTest.qnt @@ -1,5 +1,4 @@ // -*- mode: Bluespec; -*- - module bankTest { import bank.* from "./bank" diff --git a/examples/cosmos/bank/cosmos-bank.md b/examples/cosmos/bank/cosmos-bank.md index b6012093b..c8ddcabf8 100644 --- a/examples/cosmos/bank/cosmos-bank.md +++ b/examples/cosmos/bank/cosmos-bank.md @@ -55,6 +55,7 @@ From the protocol designer's point of view, the bank module alone could be tested by introducing the following non-deterministic state machine: ```bluespec bankTest.qnt += +// -*- mode: Bluespec; -*- module bankTest { import bank.* from "./bank" @@ -238,9 +239,10 @@ action init = all { // limit the total supply of burgers and bananas to 10_000 supply' = Set("banana", "burger").mapBy(d => 10_000), // the king has it all - balances' = Set("king").mapBy(a => Set("banana", "burger").mapBy(d => 10_000)), + balances' = Map("king" -> Set("banana", "burger").mapBy(d => 10_000)), _lastError' = "", } + ``` ## Keepers @@ -372,6 +374,7 @@ pure def ViewKeeper::GetAllBalances(ctx: BankCtx, addr: Addr): Coins = { Map() } } + ``` For example, we expect the `GetAllBalances` to return balances in the genesis state as follows: @@ -404,6 +407,7 @@ def stateToCtx(time: int): BankCtx = { } } } + ``` - `ValidateBalance` validates all balances for a given account address @@ -593,7 +597,7 @@ run sendTest = { // the King has bananas and he can send it .then(send("king", "donkeykong", - Set("banana").mapBy(d => 2_000))) + Map("banana" -> 2_000))) .expect(and { balances.get("king").get("banana") == 8_000, balances.get("donkeykong").get("banana") == 2_000, @@ -662,7 +666,6 @@ pure def SendKeeper::IsSendEnabledCoins(ctx: BankCtx, coins: Set[Coin]): bool = // Implementation: return the error ErrSendDisabled on false coins.forall(c => SendKeeper::IsSendEnabledCoin(ctx, c)) } - ``` - `BlockedAddr` checks if a given address is restricted from receiving funds. @@ -722,7 +725,6 @@ pure val DENOM = Set("banana", "burger") ```bluespec "transitions" += - action step = any { nondet fromAddr = oneOf(ADDR) nondet toAddr = oneOf(ADDR) From b806f4081276867df4ce06b485ec51125e65678e Mon Sep 17 00:00:00 2001 From: bugarela Date: Fri, 12 Jan 2024 09:27:18 -0300 Subject: [PATCH 176/388] Fix API documentation for `allLists` --- doc/builtin.md | 11 ++++++----- quint/src/builtin.qnt | 11 ++++++----- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/doc/builtin.md b/doc/builtin.md index 16e39d655..2ccb49c70 100644 --- a/doc/builtin.md +++ b/doc/builtin.md @@ -239,15 +239,16 @@ assert(Set(Set(1, 2), Set(3, 4)).flatten() == Set(1, 2, 3, 4)) ## `pure def allLists: (Set[a]) => Set[List[a]]` -`s.allLists()` is the set of all lists containing all the elements in `s`. +`s.allLists()` is the set of all lists containing elements in `s`. +This is an infinite set unless `s` is the empty set. + +Like other inifite sets, this is not supported in the simulator. ### Examples ``` -assert(Set(1, 2).allLists() == Set( - List(1, 2), - List(2, 1), -)) +assert(Set(1, 2).allLists().contains([])) +assert(Set(1, 2).allLists().contains([1, 1, 1, 1, 2, 1])) ``` ## `pure def chooseSome: (Set[a]) => a` diff --git a/quint/src/builtin.qnt b/quint/src/builtin.qnt index a1016e636..6fd5aca6a 100644 --- a/quint/src/builtin.qnt +++ b/quint/src/builtin.qnt @@ -215,15 +215,16 @@ module builtin { /// ``` pure def flatten(s): (Set[Set[a]]) => Set[a] - /// `s.allLists()` is the set of all lists containing all the elements in `s`. + /// `s.allLists()` is the set of all lists containing elements in `s`. + /// This is an infinite set unless `s` is the empty set. + /// + /// Like other inifite sets, this is not supported in the simulator. /// /// ### Examples /// /// ``` - /// assert(Set(1, 2).allLists() == Set( - /// List(1, 2), - /// List(2, 1), - /// )) + /// assert(Set(1, 2).allLists().contains([])) + /// assert(Set(1, 2).allLists().contains([1, 1, 1, 1, 2, 1])) /// ``` pure def allLists(s): (Set[a]) => Set[List[a]] From 9ab7bf624b4677f0f8bf025caf28984729483416 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 12 Jan 2024 10:00:42 -0500 Subject: [PATCH 177/388] Use result type for BoundedUInt Resolves a TODO by replacing the record-based representation using a non-empty error string with a result sum type. --- examples/spells/BoundedUInt.qnt | 698 ++++++++++++++------------------ 1 file changed, 302 insertions(+), 396 deletions(-) diff --git a/examples/spells/BoundedUInt.qnt b/examples/spells/BoundedUInt.qnt index f818fee4d..6c8d28531 100644 --- a/examples/spells/BoundedUInt.qnt +++ b/examples/spells/BoundedUInt.qnt @@ -8,258 +8,167 @@ module BoundedUInt { /// The largest value that can be represented by this integer type. pure val MAX = (2^BITS) - 1 - /// Record-representation of an unsigned bounded integer. - /// If the `error` field is nonempty, the record represents an exception of some - /// sort happening during computation, such as an overflow. - /// Otherwise, the record represents the integer `v`, such that `MIN <= v <= MAX`. - /// TODO: Replace with an option type, once those are implemented. - type UIntT = { v: int, error: str } - - /// Constructs a bounded unsigned integer of type `UIntT` from a value `x` of type `int`. - /// If `x` lies outside the `[MIN, MAX]` interval, - /// the error field will be nonempty. - pure def UInt(x: int): UIntT = { - v: x, - error: - if (MIN <= x and x <= MAX) "" - else "out of range" + /// Representation of an unsigned, bounded integer. + /// + /// - `Ok(v)` represents the integer `v`, such that `MIN <= v <= MAX`. + /// - `Err(msg)` holds a message explaining the out of bounds error. + /// + /// NOTE: values of this type must only be constructed using `UInt`, + /// and never via `Ok` or `Err` directly. + // TODO: Replacce with polymorphic result type, once that is avainable + // See https://github.com/informalsystems/quint/issues/1073 + type UIntT = Ok(int) | Err(str) + + /// Given an integer `x`, returns true iff `x` lies in the `[MIN, MAX]` interval. + pure def isInRange(x: int): bool = MIN <= x and x <= MAX + + /// `UInt(x)` is a bounded unsigned integer if `x` is inside the `[MIN, MAX]` interval, + /// otherwise it is an `"out of range"` error. + pure def UInt(x: int): UIntT = if (isInRange(x)) Ok(x) else Err("out of range") + + /// `u.bind(x => f(x))` is `f(x)` iff `u` is `Ok(x)`, i.e., if `u` is a valid bounded int wrapping `x`, + /// otherwise, when `u` is `Err(msg)`, it is `u`. + /// + /// ## Example + /// + /// ``` + /// def checkedIncr(u: UintT): UintT = checkedAdd(u, UIntT(1)) + /// run incr_UintT_twice_test = assert(UInt(0).bind(checkedIncr).bind(checkedIncr) = UInt(2)) + /// ``` + def bind(u: UIntT, f: (int => UIntT)): UIntT = match u { + | Ok(i) => f(i) + | Err(_) => u } - /// Given a bounded unsigned integer `x`, returns - /// true iff `x.v` lies in the `[MIN, MAX]` interval. - pure def isInRange(x: UIntT): bool = and { - x.v >= MIN, - x.v <= MAX - } - - /// Given a bounded unsigned integer `x`, returns - /// true iff `x.v` lies in the `[MIN, MAX]` interval, and `x.error` is empty. - pure def isValid(x: UIntT): bool = and { - x.error == "", - isInRange(x) - } - - /// Given a (T,T) => T operation `op`, which assumes its inputs are valid (w.r.t. `isValid`), - /// and two T-typed values, l and r, returns op(l,r) iff l and r are both valid. Otheriwse, - /// it returns some arbitrary invalid value. - pure def wrapErrorBin(lhs: UIntT, rhs: UIntT, op: (UIntT, UIntT) => UIntT): UIntT = - if (not(isValid(lhs))) lhs - else if (not(isValid(rhs))) rhs - else op(lhs, rhs) + /// `f.app(u, v, msg)` is `UInt(f(x,y))` if `u` is `Ok(x)` and `v` is `Ok(y)`. + /// If `UInt(f(x,y))` is out of range, it is `Err(msg)`. + pure def app(op: (int, int) => int, lhs: UIntT, rhs:UIntT, errMsg: str): UIntT = + lhs.bind(x => rhs.bind(y => + val res = op(x, y) + if (isInRange(res)) Ok(res) else Err(errMsg))) /// Computes the absolute difference between lhs and rhs. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def absDiffUnsafe(lhs: UIntT, rhs: UIntT): UIntT = { - val res = lhs.v - rhs.v - { - v: if (res < 0) -res else res, - error: "" - } + pure def absDiff(lhs: UIntT, rhs: UIntT): UIntT = { + ((x, y) => { + val res = x - y + if (res < 0) -res else res + }).app(lhs, rhs, + "impossible") } - /// Computes the absolute difference between lhs and rhs. - pure def absDiff(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, absDiffUnsafe) - //////////////////////// // CHECKED OPERATIONS // //////////////////////// - /// Unsafe checked integer addition. - /// Computes `lhs + rhs`, setting the error field to "overflow" if overflow occurred. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def checkedAddUnsafe(lhs: UIntT, rhs: UIntT): UIntT = { - val res = lhs.v + rhs.v - { - v: res, - error: if (res > MAX) "overflow" else "" - } - } + /// Checked integer addition. + /// Errors with "overflow" + pure def checkedAdd(lhs: UIntT, rhs: UIntT): UIntT = ((x,y) => iadd(x,y)).app(lhs, rhs, "overflow") + + /// Checked integer subtraction. + /// Errors with "underflow". + pure def checkedSub(lhs: UIntT, rhs: UIntT): UIntT = ((x,y) => isub(x,y)).app(lhs, rhs, "underflow") + + /// Checked integer multiplication. + /// Errors with "overflow". + pure def checkedMul(lhs: UIntT, rhs: UIntT): UIntT = ((x,y) => imul(x,y)).app(lhs, rhs, "overflow") + + /// Checked integer division. + /// Errors with "division by zero". + pure def checkedDiv(lhs: UIntT, rhs: UIntT): UIntT = + lhs.bind( + l => rhs.bind( + r => + if (r == 0) + Err("division by zero") + else + Ok(l / r))) + + /// Checked integer modulo. + /// Errors with "division by zero". + pure def checkedRem(lhs: UIntT, rhs: UIntT): UIntT = + lhs.bind( + l => rhs.bind( + r => + if (r == 0) + Err("division by zero") + else + Ok(l % r))) + + /// Checked exponentiation. + /// Errors with "overflow". + pure def checkedPow(lhs: UIntT, rhs: UIntT): UIntT = + lhs.bind( + l => rhs.bind( + r => + if (l == r and l == 0) + Err("undefined") + else + ((x,y) => ipow(x,y)).app(lhs, rhs, "overflow"))) - /// Checked integer addition. - /// Computes `lhs + rhs`, setting the error field to "overflow" if overflow occurred. - pure def checkedAdd(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, checkedAddUnsafe) - - /// Unsafe checked integer subtraction. - /// Computes `lhs - rhs`, setting the error field to "underflow" if underflow occurred. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def checkedSubUnsafe(lhs: UIntT, rhs: UIntT): UIntT = { - val res = lhs.v - rhs.v - { - v: res, - error: if (res < MIN) "underflow" else "" - } - } - - /// Checked integer subtraction. - /// Computes `lhs - rhs`, setting the error field to "underflow" if underflow occurred. - pure def checkedSub(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, checkedSubUnsafe) - - /// Unsafe checked integer multiplication. - /// Computes `lhs * rhs`, setting the error field to "overflow" if overflow occurred. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def checkedMulUnsafe(lhs: UIntT, rhs: UIntT): UIntT = { - val res = lhs.v * rhs.v - { - v: res, - error: if (res > MAX) "overflow" else "" - } - } - - /// Checked integer multiplication. - /// Computes `lhs * rhs`, setting the error field to "overflow" if overflow occurred. - pure def checkedMul(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, checkedMulUnsafe) - - /// Unsafe checked integer division. - /// Computes `lhs / rhs`. If `rhs.v == 0` the error field is set to "division by zero" and the value is arbitrary. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def checkedDivUnsafe(lhs: UIntT, rhs: UIntT): UIntT = - if (rhs.v == 0) { v: 0, error: "division by zero" } - else { v: lhs.v / rhs.v, error: "" } - - /// Checked integer division. - /// Computes `lhs / rhs`, setting the error field to "division by zero" if `rhs.v == 0`. - pure def checkedDiv(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, checkedDivUnsafe) - - /// Unsafe checked integer remainder. - /// Computes `lhs % rhs`. If `rhs.v == 0` the error field is set to "division by zero" and the value is arbitrary. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def checkedRemUnsafe(lhs: UIntT, rhs: UIntT): UIntT = - if (rhs.v == 0) { v: 0, error: "division by zero" } - else { v: lhs.v % rhs.v, error: "" } - - /// Checked integer remainder. - /// Computes `lhs % rhs`. If `rhs.v == 0` the error field is set to "division by zero" and the value is arbitrary. - pure def checkedRem(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, checkedRemUnsafe) - - /// Unsafe checked exponentiation. - /// Computes `lhs ^ rhs`, setting the error field to "overflow" if overflow occurred. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def checkedPowUnsafe(lhs: UIntT, rhs: UIntT): UIntT = - if (lhs.v == rhs.v and lhs.v == 0) { v: 1, error: "undefined"} - else { - val res = lhs.v ^ rhs.v - { - v: res, - error: if (res > MAX) "overflow" else "" - } - } - - /// Checked exponentiation. - /// Computes `lhs ^ rhs`, setting the error field to "overflow" if overflow occurred. - pure def checkedPow(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, checkedPowUnsafe) /////////////////////////// // SATURATING OPERATIONS // /////////////////////////// - /// Unsafe saturating integer addition. - /// Computes `lhs + rhs`, saturating at the numeric bounds instead of overflowing. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def saturatingAddUnsafe(lhs: UIntT, rhs: UIntT): UIntT = { - val res = lhs.v + rhs.v - { - v: if (res < MAX) res else MAX, - error: "" - } - } - - /// Saturating integer addition. + /// Saturating integer addition. /// Computes `lhs + rhs`, saturating at the numeric bounds instead of overflowing. - pure def saturatingAdd(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, saturatingAddUnsafe) + pure def saturatingAdd(lhs: UIntT, rhs: UIntT): UIntT = + ((x, y) => + val res = x + y + if (res < MAX) res else MAX) + .app(lhs, rhs, "impossible") - /// Unsafe saturating integer subtraction. + /// Saturating integer subtraction. /// Computes `lhs - rhs`, saturating at the numeric bounds instead of overflowing. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def saturatingSubUnsafe(lhs: UIntT, rhs: UIntT): UIntT = { - val res = lhs.v - rhs.v - { - v: if (res > MIN) res else MIN, - error: "" - } - } - - /// Saturating integer subtraction. - /// Computes `lhs - rhs`, saturating at the numeric bounds instead of overflowing. - pure def saturatingSub(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, saturatingSubUnsafe) - - /// Unsafe saturating integer multiplication. - /// Computes `lhs * rhs`, saturating at the numeric bounds instead of overflowing. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def saturatingMulUnsafe(lhs: UIntT, rhs: UIntT): UIntT = { - val res = lhs.v * rhs.v - { - v: if (res < MAX) res else MAX, - error: "" - } - } + pure def saturatingSub(lhs: UIntT, rhs: UIntT): UIntT = + ((x, y) => + val res = x - y + if (res > MIN) res else MIN) + .app(lhs, rhs, "impossible") - /// Saturating integer subtraction. + /// Saturating integer subtraction. /// Computes `lhs * rhs`, saturating at the numeric bounds instead of overflowing. - pure def saturatingMul(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, saturatingMulUnsafe) - - /// Unsafe saturating exponentiation. - /// Computes `lhs ^ rhs`, saturating at the numeric bounds instead of overflowing. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def saturatingPowUnsafe(lhs: UIntT, rhs: UIntT): UIntT = - if (lhs.v == rhs.v and lhs.v == 0) { v: 1, error: "undefined"} - else { - val res = lhs.v ^ rhs.v - { - v: if (res < MAX) res else MAX, - error: "" - } - } - + pure def saturatingMul(lhs: UIntT, rhs: UIntT): UIntT = + ((x, y) => + val res = x * y + if (res < MAX) res else MAX) + .app(lhs, rhs, "impossible") - /// Saturating exponentiation. + /// Saturating exponentiation. /// Computes `lhs ^ rhs`, saturating at the numeric bounds instead of overflowing. - pure def saturatingPow(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, saturatingPowUnsafe) + pure def saturatingPow(lhs: UIntT, rhs: UIntT): UIntT = + lhs.bind( + l => rhs.bind( + r => + if (l == r and l == 0) + Err("undefined") + else + val res = l ^ r + Ok(if (res < MAX) res else MAX))) ///////////////////////// // WRAPPING OPERATIONS // ///////////////////////// - /// Unsafe wrapping integer addition. - /// Computes `lhs + rhs`, wrapping around at the boundary of the type. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def wrappingAddUnsafe(lhs: UIntT, rhs: UIntT): UIntT = - { - v: (lhs.v + rhs.v) % (MAX + 1), - error: "" - } - /// Wrapping integer addition. /// Computes `lhs + rhs`, wrapping around at the boundary of the type. - pure def wrappingAdd(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, wrappingAddUnsafe) + pure def wrappingAdd(lhs: UIntT, rhs: UIntT): UIntT = + ((x, y) => (x + y) % (MAX + 1)).app(lhs, rhs, "impossible") - /// Unsafe wrapping integer subtraction. - /// Computes `lhs - rhs`, wrapping around at the boundary of the type. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def wrappingSubUnsafe(lhs: UIntT, rhs: UIntT): UIntT = { - val res = lhs.v - rhs.v - val adjusted = if (res < MIN) res + (MAX + 1) else res - { - v: adjusted % (MAX + 1), - error: "" - } + pure def wrappingSubInt(x: int, y: int): int = { + val res = x - y + val adjusted = if (res < MIN) (res + (MAX + 1)) else res + adjusted % (MAX + 1) } /// Wrapping integer subtraction. /// Computes `lhs - rhs`, wrapping around at the boundary of the type. - pure def wrappingSub(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, wrappingSubUnsafe) + pure def wrappingSub(lhs: UIntT, rhs: UIntT): UIntT = wrappingSubInt.app(lhs, rhs, "impossible") - /// Unsafe wrapping integer multiplication. - /// Computes `lhs * rhs`, wrapping around at the boundary of the type. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def wrappingMulUnsafe(lhs: UIntT, rhs: UIntT): UIntT = - { - v: (lhs.v * rhs.v) % (MAX + 1), - error: "" - } - /// Wrapping integer multiplication. /// Computes `lhs * rhs`, wrapping around at the boundary of the type. - pure def wrappingMul(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, wrappingMulUnsafe) + pure def wrappingMul(lhs: UIntT, rhs: UIntT): UIntT = + ((x, y) => (x * y) % (MAX + 1)).app(lhs, rhs, "impossible") /// Wrapping integer division. /// Computes `lhs / rhs`. Wrapped division on unsigned types is just normal division. @@ -273,19 +182,16 @@ module BoundedUInt { /// This operator exists, so that all operations are accounted for in the wrapping operations. pure def wrappingRem(lhs: UIntT, rhs: UIntT): UIntT = checkedRem(lhs, rhs) - /// Unsafe wrapping exponentiation. - /// Computes `lhs ^ rhs`, wrapping around at the boundary of the type. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def wrappingPowUnsafe(lhs: UIntT, rhs: UIntT): UIntT = - if (lhs.v == rhs.v and lhs.v == 0) { v: 1, error: "undefined"} - else { - v: (lhs.v ^ rhs.v) % (MAX + 1), - error: "" - } - /// Wrapping exponentiation. /// Computes `lhs ^ rhs`, wrapping around at the boundary of the type. - pure def wrappingPow(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, wrappingPowUnsafe) + pure def wrappingPow(lhs: UIntT, rhs: UIntT): UIntT = + lhs.bind( + l => rhs.bind( + r => + if (l == r and l == 0) + Err("undefined") + else + Ok((l ^ r) % (MAX + 1)))) } module BoundedUInt_Test { @@ -300,99 +206,99 @@ module BoundedUInt_Test { // Checked add pure val CAddInvsTest = and { - assert(checkedAdd(UInt(0), UInt(0)) == {v: 0, error: ""}), - assert(checkedAdd(UInt(1), UInt(0)) == {v: 1, error: ""}), - assert(checkedAdd(UInt(MAX - 1), UInt(0)) == {v: MAX - 1, error: ""}), - assert(checkedAdd(UInt(MAX), UInt(0)) == {v: MAX, error: ""}), - assert(checkedAdd(UInt(MAX + 1), UInt(0)).error == "out of range"), - assert(checkedAdd(UInt(0), UInt(MAX)) == {v: MAX, error: ""}), - assert(checkedAdd(UInt(1), UInt(MAX)) == {v: MAX + 1, error: "overflow"}), - assert(checkedAdd(UInt(MAX - 1), UInt(MAX)) == {v: 2 * MAX - 1, error: "overflow"}), - assert(checkedAdd(UInt(MAX), UInt(MAX)) == {v: 2 * MAX, error: "overflow"}), - assert(checkedAdd(UInt(MAX), UInt(MAX + 1)).error == "out of range"), + assert(checkedAdd(UInt(0), UInt(0)) == Ok(0)), + assert(checkedAdd(UInt(1), UInt(0)) == Ok(1)), + assert(checkedAdd(UInt(MAX - 1), UInt(0)) == Ok(MAX - 1)), + assert(checkedAdd(UInt(MAX), UInt(0)) == Ok(MAX)), + assert(checkedAdd(UInt(MAX + 1), UInt(0)) == Err("out of range")), + assert(checkedAdd(UInt(0), UInt(MAX)) == Ok(MAX)), + assert(checkedAdd(UInt(1), UInt(MAX)) == Err("overflow")), + assert(checkedAdd(UInt(MAX - 1), UInt(MAX)) == Err("overflow")), + assert(checkedAdd(UInt(MAX), UInt(MAX)) == Err("overflow")), + assert(checkedAdd(UInt(MAX), UInt(MAX + 1)) == Err("out of range")), } // Checked sub pure val CSubInvsTest = and { - assert(checkedSub(UInt(0), UInt(0)) == {v: 0 , error: ""}), - assert(checkedSub(UInt(1), UInt(0)) == {v: 1, error: ""}), - assert(checkedSub(UInt(MAX - 1), UInt(0)) == {v: MAX - 1, error: ""}), - assert(checkedSub(UInt(MAX), UInt(0)) == {v: MAX, error: ""}), - assert(checkedSub(UInt(MAX + 1), UInt(0)).error == "out of range"), - assert(checkedSub(UInt(0), UInt(MAX)) == {v: -MAX, error: "underflow"}), - assert(checkedSub(UInt(1), UInt(MAX)) == {v: -(MAX - 1), error: "underflow"}), - assert(checkedSub(UInt(MAX - 1), UInt(MAX)) == {v: -1, error: "underflow"}), - assert(checkedSub(UInt(MAX), UInt(MAX)) == {v: 0, error: ""}), - assert(checkedSub(UInt(MAX + 1), UInt(MAX)).error == "out of range"), + assert(checkedSub(UInt(0), UInt(0)) == Ok(0)), + assert(checkedSub(UInt(1), UInt(0)) == Ok(1)), + assert(checkedSub(UInt(MAX - 1), UInt(0)) == Ok(MAX - 1)), + assert(checkedSub(UInt(MAX), UInt(0)) == Ok(MAX)), + assert(checkedSub(UInt(MAX + 1), UInt(0)) == Err("out of range")), + assert(checkedSub(UInt(0), UInt(MAX)) == Err("underflow")), + assert(checkedSub(UInt(1), UInt(MAX)) == Err("underflow")), + assert(checkedSub(UInt(MAX - 1), UInt(MAX)) == Err("underflow")), + assert(checkedSub(UInt(MAX), UInt(MAX)) == Ok(0)), + assert(checkedSub(UInt(MAX + 1), UInt(MAX)) == Err("out of range")), } // Checked mul pure val CMulInvsTest = and { - assert(checkedMul(UInt(0), UInt(1)) == {v: 0 , error: ""}), - assert(checkedMul(UInt(1), UInt(1)) == {v: 1, error: ""}), - assert(checkedMul(UInt(MAX - 1), UInt(1)) == {v: MAX - 1, error: ""}), - assert(checkedMul(UInt(MAX), UInt(1)) == {v: MAX, error: ""}), - assert(checkedMul(UInt(MAX + 1), UInt(1)).error == "out of range"), - assert(checkedMul(UInt(0), UInt(MAX)) == {v: 0, error: ""}), - assert(checkedMul(UInt(1), UInt(MAX)) == {v: MAX, error: ""}), - assert(checkedMul(UInt(MAX - 1), UInt(MAX)) == {v: MAX^2 - MAX, error: "overflow"}), - assert(checkedMul(UInt(MAX), UInt(MAX)) == {v: MAX^2, error: "overflow"}), - assert(checkedMul(UInt(MAX + 1), UInt(MAX)).error == "out of range"), + assert(checkedMul(UInt(0), UInt(1)) == Ok(0)), + assert(checkedMul(UInt(1), UInt(1)) == Ok(1)), + assert(checkedMul(UInt(MAX - 1), UInt(1)) == Ok(MAX - 1)), + assert(checkedMul(UInt(MAX), UInt(1)) == Ok(MAX)), + assert(checkedMul(UInt(MAX + 1), UInt(1)) == Err("out of range")), + assert(checkedMul(UInt(0), UInt(MAX)) == Ok(0)), + assert(checkedMul(UInt(1), UInt(MAX)) == Ok(MAX)), + assert(checkedMul(UInt(MAX - 1), UInt(MAX)) == Err("overflow")), + assert(checkedMul(UInt(MAX), UInt(MAX)) == Err("overflow")), + assert(checkedMul(UInt(MAX + 1), UInt(MAX)) == Err("out of range")), } // Checked div pure val CDivInvsTest = and { - assert(checkedDiv(UInt(0), UInt(0)).error == "division by zero"), - assert(checkedDiv(UInt(1), UInt(0)).error == "division by zero"), - assert(checkedDiv(UInt(MAX - 1), UInt(0)).error == "division by zero"), - assert(checkedDiv(UInt(MAX), UInt(0)).error == "division by zero"), - assert(checkedDiv(UInt(MAX + 1), UInt(0)).error == "out of range"), - assert(checkedDiv(UInt(0), UInt(1)) == {v: 0, error: ""}), - assert(checkedDiv(UInt(1), UInt(1)) == {v: 1, error: ""}), - assert(checkedDiv(UInt(MAX - 1), UInt(1)) == {v: MAX - 1, error: ""}), - assert(checkedDiv(UInt(MAX), UInt(1)) == {v: MAX, error: ""}), - assert(checkedDiv(UInt(MAX + 1), UInt(1)).error == "out of range"), - assert(checkedDiv(UInt(0), UInt(MAX)) == {v: 0, error: ""}), - assert(checkedDiv(UInt(1), UInt(MAX)) == {v: 0, error: ""}), - assert(checkedDiv(UInt(MAX - 1), UInt(MAX)) == {v: 0, error: ""}), - assert(checkedDiv(UInt(MAX), UInt(MAX)) == {v: 1, error: ""}), - assert(checkedDiv(UInt(MAX + 1), UInt(MAX)).error == "out of range") + assert(checkedDiv(UInt(0), UInt(0)) == Err("division by zero")), + assert(checkedDiv(UInt(1), UInt(0)) == Err("division by zero")), + assert(checkedDiv(UInt(MAX - 1), UInt(0)) == Err("division by zero")), + assert(checkedDiv(UInt(MAX), UInt(0)) == Err("division by zero")), + assert(checkedDiv(UInt(MAX + 1), UInt(0)) == Err("out of range")), + assert(checkedDiv(UInt(0), UInt(1)) == Ok(0)), + assert(checkedDiv(UInt(1), UInt(1)) == Ok(1)), + assert(checkedDiv(UInt(MAX - 1), UInt(1)) == Ok(MAX - 1)), + assert(checkedDiv(UInt(MAX), UInt(1)) == Ok(MAX)), + assert(checkedDiv(UInt(MAX + 1), UInt(1)) == Err("out of range")), + assert(checkedDiv(UInt(0), UInt(MAX)) == Ok(0)), + assert(checkedDiv(UInt(1), UInt(MAX)) == Ok(0)), + assert(checkedDiv(UInt(MAX - 1), UInt(MAX)) == Ok(0)), + assert(checkedDiv(UInt(MAX), UInt(MAX)) == Ok(1)), + assert(checkedDiv(UInt(MAX + 1), UInt(MAX)) == Err("out of range")) } // Checked rem pure val CRemInvsTest = and { - assert(checkedRem(UInt(0), UInt(0)).error == "division by zero"), - assert(checkedRem(UInt(1), UInt(0)).error == "division by zero"), - assert(checkedRem(UInt(MAX - 1), UInt(0)).error == "division by zero"), - assert(checkedRem(UInt(MAX), UInt(0)).error == "division by zero"), - assert(checkedRem(UInt(MAX + 1), UInt(0)).error == "out of range"), - assert(checkedRem(UInt(0), UInt(1)) == {v: 0, error: ""}), - assert(checkedRem(UInt(1), UInt(1)) == {v: 0, error: ""}), - assert(checkedRem(UInt(MAX - 1), UInt(1)) == {v: 0, error: ""}), - assert(checkedRem(UInt(MAX), UInt(1)) == {v: 0, error: ""}), - assert(checkedRem(UInt(MAX + 1), UInt(1)).error == "out of range"), - assert(checkedRem(UInt(0), UInt(MAX)) == {v: 0, error: ""}), - assert(checkedRem(UInt(1), UInt(MAX)) == {v: 1, error: ""}), - assert(checkedRem(UInt(MAX - 1), UInt(MAX)) == {v: MAX - 1, error: ""}), - assert(checkedRem(UInt(MAX), UInt(MAX)) == {v: 0, error: ""}), - assert(checkedRem(UInt(MAX + 1), UInt(MAX)).error == "out of range") + assert(checkedRem(UInt(0), UInt(0)) == Err("division by zero")), + assert(checkedRem(UInt(1), UInt(0)) == Err("division by zero")), + assert(checkedRem(UInt(MAX - 1), UInt(0)) == Err("division by zero")), + assert(checkedRem(UInt(MAX), UInt(0)) == Err("division by zero")), + assert(checkedRem(UInt(MAX + 1), UInt(0)) == Err("out of range")), + assert(checkedRem(UInt(0), UInt(1)) == Ok(0)), + assert(checkedRem(UInt(1), UInt(1)) == Ok(0)), + assert(checkedRem(UInt(MAX - 1), UInt(1)) == Ok(0)), + assert(checkedRem(UInt(MAX), UInt(1)) == Ok(0)), + assert(checkedRem(UInt(MAX + 1), UInt(1)) == Err("out of range")), + assert(checkedRem(UInt(0), UInt(MAX)) == Ok(0)), + assert(checkedRem(UInt(1), UInt(MAX)) == Ok(1)), + assert(checkedRem(UInt(MAX - 1), UInt(MAX)) == Ok(MAX - 1)), + assert(checkedRem(UInt(MAX), UInt(MAX)) == Ok(0)), + assert(checkedRem(UInt(MAX + 1), UInt(MAX)) == Err("out of range")) } // Checked Pow pure val CPowInvsTest = and { - assert(checkedPow(UInt(0), UInt(0)).error == "undefined"), - assert(checkedPow(UInt(0), UInt(1)) == {v: 0, error: ""}), - assert(checkedPow(UInt(1), UInt(0)) == {v: 1, error: ""}), - assert(checkedPow(UInt(1), UInt(1)) == {v: 1, error: ""}), - assert(checkedPow(UInt(MAX - 1), UInt(1)) == {v: MAX - 1, error: ""}), - assert(checkedPow(UInt(MAX), UInt(1)) == {v: MAX, error: ""}), - assert(checkedPow(UInt(MAX), UInt(0)) == {v: 1, error: ""}), - assert(checkedPow(UInt(MAX + 1), UInt(1)).error == "out of range"), - assert(checkedPow(UInt(0), UInt(MAX)) == {v: 0, error: ""}), - assert(checkedPow(UInt(1), UInt(MAX)) == {v: 1, error: ""}), - assert(checkedPow(UInt(2), UInt(BITS - 1)) == {v: 2^(BITS - 1), error: ""}), - assert(checkedPow(UInt(2), UInt(BITS)) == {v: MAX + 1, error: "overflow"}), - assert(checkedPow(UInt(2), UInt(BITS + 1)) == {v: 2 * MAX + 2, error: "overflow"}), + assert(checkedPow(UInt(0), UInt(0)) == Err("undefined")), + assert(checkedPow(UInt(0), UInt(1)) == Ok(0)), + assert(checkedPow(UInt(1), UInt(0)) == Ok(1)), + assert(checkedPow(UInt(1), UInt(1)) == Ok(1)), + assert(checkedPow(UInt(MAX - 1), UInt(1)) == Ok(MAX - 1)), + assert(checkedPow(UInt(MAX), UInt(1)) == Ok(MAX)), + assert(checkedPow(UInt(MAX), UInt(0)) == Ok(1)), + assert(checkedPow(UInt(MAX + 1), UInt(1)) == Err("out of range")), + assert(checkedPow(UInt(0), UInt(MAX)) == Ok(0)), + assert(checkedPow(UInt(1), UInt(MAX)) == Ok(1)), + assert(checkedPow(UInt(2), UInt(BITS - 1)) == Ok(2^(BITS - 1))), + assert(checkedPow(UInt(2), UInt(BITS)) == Err("overflow")), + assert(checkedPow(UInt(2), UInt(BITS + 1)) == Err("overflow")), } //////////////// @@ -401,61 +307,61 @@ module BoundedUInt_Test { // Saturating add pure val SAddInvsTest = and { - assert(saturatingAdd(UInt(0), UInt(0)) == {v: 0, error: ""}), - assert(saturatingAdd(UInt(1), UInt(0)) == {v: 1, error: ""}), - assert(saturatingAdd(UInt(MAX - 1), UInt(0)) == {v: MAX - 1, error: ""}), - assert(saturatingAdd(UInt(MAX), UInt(0)) == {v: MAX, error: ""}), - assert(saturatingAdd(UInt(MAX + 1), UInt(0)).error == "out of range"), - assert(saturatingAdd(UInt(0), UInt(MAX)) == {v: MAX, error: ""}), - assert(saturatingAdd(UInt(1), UInt(MAX)) == {v: MAX, error: ""}), - assert(saturatingAdd(UInt(MAX - 1), UInt(MAX)) == {v: MAX, error: ""}), - assert(saturatingAdd(UInt(MAX), UInt(MAX)) == {v: MAX, error: ""}), - assert(saturatingAdd(UInt(MAX + 1), UInt(MAX)).error == "out of range") + assert(saturatingAdd(UInt(0), UInt(0)) == Ok(0)), + assert(saturatingAdd(UInt(1), UInt(0)) == Ok(1)), + assert(saturatingAdd(UInt(MAX - 1), UInt(0)) == Ok(MAX - 1)), + assert(saturatingAdd(UInt(MAX), UInt(0)) == Ok(MAX)), + assert(saturatingAdd(UInt(MAX + 1), UInt(0)) == Err("out of range")), + assert(saturatingAdd(UInt(0), UInt(MAX)) == Ok(MAX)), + assert(saturatingAdd(UInt(1), UInt(MAX)) == Ok(MAX)), + assert(saturatingAdd(UInt(MAX - 1), UInt(MAX)) == Ok(MAX)), + assert(saturatingAdd(UInt(MAX), UInt(MAX)) == Ok(MAX)), + assert(saturatingAdd(UInt(MAX + 1), UInt(MAX)) == Err("out of range")) } // Saturating sub pure val SSubInvsTest = and { - assert(saturatingSub(UInt(0), UInt(0)) == {v: 0, error: ""}), - assert(saturatingSub(UInt(1), UInt(0)) == {v: 1, error: ""}), - assert(saturatingSub(UInt(0), UInt(1)) == {v: 0, error: ""}), - assert(saturatingSub(UInt(MAX - 1), UInt(0)) == {v: MAX - 1, error: ""}), - assert(saturatingSub(UInt(MAX), UInt(0)) == {v: MAX, error: ""}), - assert(saturatingSub(UInt(MAX + 1), UInt(0)).error == "out of range"), - assert(saturatingSub(UInt(0), UInt(MAX)) == {v: 0, error: ""}), - assert(saturatingSub(UInt(1), UInt(MAX)) == {v: 0, error: ""}), - assert(saturatingSub(UInt(MAX - 1), UInt(MAX)) == {v: 0, error: ""}), - assert(saturatingSub(UInt(MAX), UInt(MAX)) == {v: 0, error: ""}), - assert(saturatingSub(UInt(MAX + 1), UInt(MAX)).error == "out of range") + assert(saturatingSub(UInt(0), UInt(0)) == Ok(0)), + assert(saturatingSub(UInt(1), UInt(0)) == Ok(1)), + assert(saturatingSub(UInt(0), UInt(1)) == Ok(0)), + assert(saturatingSub(UInt(MAX - 1), UInt(0)) == Ok(MAX - 1)), + assert(saturatingSub(UInt(MAX), UInt(0)) == Ok(MAX)), + assert(saturatingSub(UInt(MAX + 1), UInt(0)) == Err("out of range")), + assert(saturatingSub(UInt(0), UInt(MAX)) == Ok(0)), + assert(saturatingSub(UInt(1), UInt(MAX)) == Ok(0)), + assert(saturatingSub(UInt(MAX - 1), UInt(MAX)) == Ok(0)), + assert(saturatingSub(UInt(MAX), UInt(MAX)) == Ok(0)), + assert(saturatingSub(UInt(MAX + 1), UInt(MAX)) == Err("out of range")) } // Saturating mul pure val SMulInvsTest = and { - assert(saturatingMul(UInt(0), UInt(1)) == {v: 0, error: ""}), - assert(saturatingMul(UInt(1), UInt(1)) == {v: 1, error: ""}), - assert(saturatingMul(UInt(MAX - 1), UInt(1)) == {v: MAX - 1, error: ""}), - assert(saturatingMul(UInt(MAX), UInt(1)) == {v: MAX, error: ""}), - assert(saturatingMul(UInt(MAX + 1), UInt(1)).error == "out of range"), - assert(saturatingMul(UInt(0), UInt(MAX)) == {v: 0, error: ""}), - assert(saturatingMul(UInt(1), UInt(MAX)) == {v: MAX, error: ""}), - assert(saturatingMul(UInt(MAX - 1), UInt(MAX)) == {v: MAX, error: ""}), - assert(saturatingMul(UInt(MAX), UInt(MAX)) == {v: MAX, error: ""}), - assert(saturatingMul(UInt(MAX + 1), UInt(MAX)).error == "out of range") + assert(saturatingMul(UInt(0), UInt(1)) == Ok(0)), + assert(saturatingMul(UInt(1), UInt(1)) == Ok(1)), + assert(saturatingMul(UInt(MAX - 1), UInt(1)) == Ok(MAX - 1)), + assert(saturatingMul(UInt(MAX), UInt(1)) == Ok(MAX)), + assert(saturatingMul(UInt(MAX + 1), UInt(1)) == Err("out of range")), + assert(saturatingMul(UInt(0), UInt(MAX)) == Ok(0)), + assert(saturatingMul(UInt(1), UInt(MAX)) == Ok(MAX)), + assert(saturatingMul(UInt(MAX - 1), UInt(MAX)) == Ok(MAX)), + assert(saturatingMul(UInt(MAX), UInt(MAX)) == Ok(MAX)), + assert(saturatingMul(UInt(MAX + 1), UInt(MAX)) == Err("out of range")) } // Saturating pow pure val SPowInvsTest = and { - assert(saturatingPow(UInt(0), UInt(0)).error == "undefined"), - assert(saturatingPow(UInt(0), UInt(1)) == {v: 0, error: ""}), - assert(saturatingPow(UInt(1), UInt(0)) == {v: 1, error: ""}), - assert(saturatingPow(UInt(1), UInt(1)) == {v: 1, error: ""}), - assert(saturatingPow(UInt(MAX - 1), UInt(1)) == {v: MAX - 1, error: ""}), - assert(saturatingPow(UInt(MAX), UInt(1)) == {v: MAX, error: ""}), - assert(saturatingPow(UInt(MAX + 1), UInt(1)).error == "out of range"), - assert(saturatingPow(UInt(0), UInt(MAX)) == {v: 0, error: ""}), - assert(saturatingPow(UInt(1), UInt(MAX)) == {v: 1, error: ""}), - assert(saturatingPow(UInt(2), UInt(BITS - 1)) == {v: 2^(BITS - 1), error: ""}), - assert(saturatingPow(UInt(2), UInt(BITS)) == {v: MAX, error: ""}), - assert(saturatingPow(UInt(2), UInt(BITS + 1)) == {v: MAX, error: ""}), + assert(saturatingPow(UInt(0), UInt(0)) == Err("undefined")), + assert(saturatingPow(UInt(0), UInt(1)) == Ok(0)), + assert(saturatingPow(UInt(1), UInt(0)) == Ok(1)), + assert(saturatingPow(UInt(1), UInt(1)) == Ok(1)), + assert(saturatingPow(UInt(MAX - 1), UInt(1)) == Ok(MAX - 1)), + assert(saturatingPow(UInt(MAX), UInt(1)) == Ok(MAX)), + assert(saturatingPow(UInt(MAX + 1), UInt(1)) == Err("out of range")), + assert(saturatingPow(UInt(0), UInt(MAX)) == Ok(0)), + assert(saturatingPow(UInt(1), UInt(MAX)) == Ok(1)), + assert(saturatingPow(UInt(2), UInt(BITS - 1)) == Ok(2^(BITS - 1))), + assert(saturatingPow(UInt(2), UInt(BITS)) == Ok(MAX)), + assert(saturatingPow(UInt(2), UInt(BITS + 1)) == Ok(MAX)), } ////////////// @@ -464,47 +370,47 @@ module BoundedUInt_Test { // Wrapping add pure val WAddInvsTest = and { - assert(wrappingAdd(UInt(0), UInt(0)) == {v: 0, error: ""}), - assert(wrappingAdd(UInt(1), UInt(0)) == {v: 1, error: ""}), - assert(wrappingAdd(UInt(MAX - 1), UInt(0)) == {v: MAX - 1, error: ""}), - assert(wrappingAdd(UInt(MAX), UInt(0)) == {v: MAX, error: ""}), - assert(wrappingAdd(UInt(MAX), UInt(1)) == {v: 0, error: ""}), - assert(wrappingAdd(UInt(MAX + 1), UInt(0)).error == "out of range"), - assert(wrappingAdd(UInt(0), UInt(MAX)) == {v: MAX, error: ""}), - assert(wrappingAdd(UInt(1), UInt(MAX)) == {v: 0, error: ""}), - assert(wrappingAdd(UInt(MAX - 1), UInt(MAX)) == {v: MAX - 2, error: ""}), - assert(wrappingAdd(UInt(MAX), UInt(MAX)) == {v: MAX - 1, error: ""}), - assert(wrappingAdd(UInt(MAX + 1), UInt(MAX)).error == "out of range") + assert(wrappingAdd(UInt(0), UInt(0)) == Ok(0)), + assert(wrappingAdd(UInt(1), UInt(0)) == Ok(1)), + assert(wrappingAdd(UInt(MAX - 1), UInt(0)) == Ok(MAX - 1)), + assert(wrappingAdd(UInt(MAX), UInt(0)) == Ok(MAX)), + assert(wrappingAdd(UInt(MAX), UInt(1)) == Ok(0)), + assert(wrappingAdd(UInt(MAX + 1), UInt(0)) == Err("out of range")), + assert(wrappingAdd(UInt(0), UInt(MAX)) == Ok(MAX)), + assert(wrappingAdd(UInt(1), UInt(MAX)) == Ok(0)), + assert(wrappingAdd(UInt(MAX - 1), UInt(MAX)) == Ok(MAX - 2)), + assert(wrappingAdd(UInt(MAX), UInt(MAX)) == Ok(MAX - 1)), + assert(wrappingAdd(UInt(MAX + 1), UInt(MAX)) == Err("out of range")) } // Wrapping sub pure val WSubInvsTest = and { - assert(wrappingSub(UInt(0), UInt(0)) == {v: 0, error: ""}), - assert(wrappingSub(UInt(1), UInt(0)) == {v: 1, error: ""}), - assert(wrappingSub(UInt(0), UInt(1)) == {v: MAX, error: ""}), - assert(wrappingSub(UInt(1), UInt(1)) == {v: 0, error: ""}), - assert(wrappingSub(UInt(MAX - 1), UInt(0)) == {v: MAX - 1, error: ""}), - assert(wrappingSub(UInt(MAX), UInt(0)) == {v: MAX, error: ""}), - assert(wrappingSub(UInt(MAX + 1), UInt(0)).error == "out of range"), - assert(wrappingSub(UInt(0), UInt(MAX)) == {v: 1, error: ""}), - assert(wrappingSub(UInt(1), UInt(MAX)) == {v: 2, error: ""}), - assert(wrappingSub(UInt(MAX - 1), UInt(MAX)) == {v: MAX, error: ""}), - assert(wrappingSub(UInt(MAX), UInt(MAX)) == {v: 0, error: ""}), - assert(wrappingSub(UInt(MAX + 1), UInt(MAX)).error == "out of range") + assert(wrappingSub(UInt(0), UInt(0)) == Ok(0)), + assert(wrappingSub(UInt(1), UInt(0)) == Ok(1)), + assert(wrappingSub(UInt(0), UInt(1)) == Ok(MAX)), + assert(wrappingSub(UInt(1), UInt(1)) == Ok(0)), + assert(wrappingSub(UInt(MAX - 1), UInt(0)) == Ok(MAX - 1)), + assert(wrappingSub(UInt(MAX), UInt(0)) == Ok(MAX)), + assert(wrappingSub(UInt(MAX + 1), UInt(0)) == Err("out of range")), + assert(wrappingSub(UInt(0), UInt(MAX)) == Ok(1)), + assert(wrappingSub(UInt(1), UInt(MAX)) == Ok(2)), + assert(wrappingSub(UInt(MAX - 1), UInt(MAX)) == Ok(MAX)), + assert(wrappingSub(UInt(MAX), UInt(MAX)) == Ok(0)), + assert(wrappingSub(UInt(MAX + 1), UInt(MAX)) == Err("out of range")) } // Wrapping mul pure val WMulInvsTest = and { - assert(wrappingMul(UInt(0), UInt(1)) == {v: 0, error: ""}), - assert(wrappingMul(UInt(1), UInt(1)) == {v: 1, error: ""}), - assert(wrappingMul(UInt(MAX - 1), UInt(1)) == {v: MAX - 1, error: ""}), - assert(wrappingMul(UInt(MAX), UInt(1)) == {v: MAX, error: ""}), - assert(wrappingMul(UInt(MAX + 1), UInt(1)).error == "out of range"), - assert(wrappingMul(UInt(0), UInt(MAX)) == {v: 0, error: ""}), - assert(wrappingMul(UInt(1), UInt(MAX)) == {v: MAX, error: ""}), - assert(wrappingMul(UInt(MAX - 1), UInt(MAX)) == {v: 2, error: ""}), - assert(wrappingMul(UInt(MAX), UInt(MAX)) == {v: 1, error: ""}), - assert(wrappingMul(UInt(MAX + 1), UInt(MAX)).error == "out of range") + assert(wrappingMul(UInt(0), UInt(1)) == Ok(0)), + assert(wrappingMul(UInt(1), UInt(1)) == Ok(1)), + assert(wrappingMul(UInt(MAX - 1), UInt(1)) == Ok(MAX - 1)), + assert(wrappingMul(UInt(MAX), UInt(1)) == Ok(MAX)), + assert(wrappingMul(UInt(MAX + 1), UInt(1)) == Err("out of range")), + assert(wrappingMul(UInt(0), UInt(MAX)) == Ok(0)), + assert(wrappingMul(UInt(1), UInt(MAX)) == Ok(MAX)), + assert(wrappingMul(UInt(MAX - 1), UInt(MAX)) == Ok(2)), + assert(wrappingMul(UInt(MAX), UInt(MAX)) == Ok(1)), + assert(wrappingMul(UInt(MAX + 1), UInt(MAX)) == Err("out of range")) } // Wrapping div == checked div @@ -512,18 +418,18 @@ module BoundedUInt_Test { // Wrapping Pow pure val WPowInvsTest = and { - assert(wrappingPow(UInt(0), UInt(0)).error == "undefined"), - assert(wrappingPow(UInt(0), UInt(1)) == {v: 0, error: ""}), - assert(wrappingPow(UInt(1), UInt(0)) == {v: 1, error: ""}), - assert(wrappingPow(UInt(1), UInt(1)) == {v: 1, error: ""}), - assert(wrappingPow(UInt(MAX - 1), UInt(1)) == {v: MAX - 1, error: ""}), - assert(wrappingPow(UInt(MAX), UInt(1)) == {v: MAX, error: ""}), - assert(wrappingPow(UInt(MAX + 1), UInt(1)).error == "out of range"), - assert(wrappingPow(UInt(0), UInt(MAX)) == {v: 0, error: ""}), - assert(wrappingPow(UInt(1), UInt(MAX)) == {v: 1, error: ""}), - assert(wrappingPow(UInt(2), UInt(BITS - 1)) == {v: 2^(BITS - 1), error: ""}), - assert(wrappingPow(UInt(2), UInt(BITS)) == {v: 0, error: ""}), - assert(wrappingPow(UInt(2), UInt(BITS + 1)) == {v: 0, error: ""}), + assert(wrappingPow(UInt(0), UInt(0)) == Err("undefined")), + assert(wrappingPow(UInt(0), UInt(1)) == Ok(0)), + assert(wrappingPow(UInt(1), UInt(0)) == Ok(1)), + assert(wrappingPow(UInt(1), UInt(1)) == Ok(1)), + assert(wrappingPow(UInt(MAX - 1), UInt(1)) == Ok(MAX - 1)), + assert(wrappingPow(UInt(MAX), UInt(1)) == Ok(MAX)), + assert(wrappingPow(UInt(MAX + 1), UInt(1)) == Err("out of range")), + assert(wrappingPow(UInt(0), UInt(MAX)) == Ok(0)), + assert(wrappingPow(UInt(1), UInt(MAX)) == Ok(1)), + assert(wrappingPow(UInt(2), UInt(BITS - 1)) == Ok(2^(BITS - 1))), + assert(wrappingPow(UInt(2), UInt(BITS)) == Ok(0)), + assert(wrappingPow(UInt(2), UInt(BITS + 1)) == Ok(0)), } ////////////// @@ -531,16 +437,16 @@ module BoundedUInt_Test { ////////////// pure val AbsDiffTest = and { - assert(absDiff(UInt(0), UInt(1)) == {v: 1, error: ""}), - assert(absDiff(UInt(1), UInt(1)) == {v: 0, error: ""}), - assert(absDiff(UInt(MAX - 1), UInt(1)) == {v: MAX - 2, error: ""}), - assert(absDiff(UInt(MAX), UInt(1)) == {v: MAX - 1, error: ""}), - assert(absDiff(UInt(MAX + 1), UInt(1)).error == "out of range"), - assert(absDiff(UInt(0), UInt(MAX)) == {v: MAX, error: ""}), - assert(absDiff(UInt(1), UInt(MAX)) == {v: MAX - 1, error: ""}), - assert(absDiff(UInt(MAX - 1), UInt(MAX)) == {v: 1, error: ""}), - assert(absDiff(UInt(MAX), UInt(MAX)) == {v: 0, error: ""}), - assert(absDiff(UInt(MAX + 1), UInt(MAX)).error == "out of range") + assert(absDiff(UInt(0), UInt(1)) == Ok(1)), + assert(absDiff(UInt(1), UInt(1)) == Ok(0)), + assert(absDiff(UInt(MAX - 1), UInt(1)) == Ok(MAX - 2)), + assert(absDiff(UInt(MAX), UInt(1)) == Ok(MAX - 1)), + assert(absDiff(UInt(MAX + 1), UInt(1)) == Err("out of range")), + assert(absDiff(UInt(0), UInt(MAX)) == Ok(MAX)), + assert(absDiff(UInt(1), UInt(MAX)) == Ok(MAX - 1)), + assert(absDiff(UInt(MAX - 1), UInt(MAX)) == Ok(1)), + assert(absDiff(UInt(MAX), UInt(MAX)) == Ok(0)), + assert(absDiff(UInt(MAX + 1), UInt(MAX)) == Err("out of range")) } } From 64cf284a672c29e515b79c463350b94e490de465 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 12 Jan 2024 13:51:29 -0500 Subject: [PATCH 178/388] Add distinct grammar rules for type var and const This prevents mis-identification of qualified type constructors as type variables. Closes #1336 --- quint/src/generated/Quint.g4 | 19 +++++++++++++------ quint/src/parsing/ToIrListener.ts | 16 ++++++++-------- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/quint/src/generated/Quint.g4 b/quint/src/generated/Quint.g4 index c0a15396f..f57968779 100644 --- a/quint/src/generated/Quint.g4 +++ b/quint/src/generated/Quint.g4 @@ -106,12 +106,13 @@ type : type '->' type # typeFun | 'int' # typeInt | 'str' # typeStr | 'bool' # typeBool - | qualId # typeConstOrVar + | LOW_ID # typeVar + | qualId # typeConst | '(' type ')' # typeParen ; -row : (rowLabel ':' type ',')* ((rowLabel ':' type) (',' | '|' (rowVar=IDENTIFIER))?)? - | '|' (rowVar=IDENTIFIER) +row : (rowLabel ':' type ',')* ((rowLabel ':' type) (',' | '|' (rowVar=identifier))?)? + | '|' (rowVar=identifier) ; rowLabel : simpleId["record"] ; @@ -235,10 +236,11 @@ literal: (STRING | BOOL | INT) ; // A (possibly) qualified identifier, like `Foo` or `Foo::bar` -qualId : IDENTIFIER ('::' IDENTIFIER)* ; +qualId : identifier ('::' identifier)* ; + // An unqualified identifier that raises an error if a qualId is supplied simpleId[context: string] - : IDENTIFIER + : identifier | qualId { const err = quintErrorToString( { code: 'QNT008', @@ -249,6 +251,8 @@ simpleId[context: string] } ; +identifier : LOW_ID | CAP_ID; + // TOKENS // literals @@ -285,7 +289,10 @@ LPAREN : '(' ; RPAREN : ')' ; // other TLA+ identifiers -IDENTIFIER : ([a-zA-Z][a-zA-Z0-9_]*|[_][a-zA-Z0-9_]+) ; +// An identifier starting with lowercase +LOW_ID : ([a-z][a-zA-Z0-9_]*|[_][a-zA-Z0-9_]+) ; +// An identifier starting with uppercase +CAP_ID : ([A-Z][a-zA-Z0-9_]*|[_][a-zA-Z0-9_]+) ; DOCCOMMENT : '///' .*? '\n'; diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index 2186a87e5..f1e38a236 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -1034,17 +1034,17 @@ export class ToIrListener implements QuintListener { this.typeStack.push({ id, kind: 'str' }) } + exitTypeVar(ctx: p.TypeVarContext) { + const name = ctx.LOW_ID().text + const id = this.getId(ctx) + this.typeStack.push({ id, kind: 'var', name }) + } + // a type variable, a type constant, or a reference to a type alias - exitTypeConstOrVar(ctx: p.TypeConstOrVarContext) { + exitTypeConst(ctx: p.TypeConstContext) { const name = ctx.qualId().text const id = this.getId(ctx) - if (name[0].match('[a-z]')) { - // a type variable from: a, b, ... z - this.typeStack.push({ id, kind: 'var', name }) - } else { - // a type constant, e.g., declared via typedef - this.typeStack.push({ id, kind: 'const', name }) - } + this.typeStack.push({ id, kind: 'const', name }) } // a set type, e.g., set(int) From 855fbdacabae6b212c9ccd2a18164ece183a6b76 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 12 Jan 2024 13:54:38 -0500 Subject: [PATCH 179/388] Add generated parser code --- quint/src/generated/Quint.interp | 7 +- quint/src/generated/Quint.tokens | 11 +- quint/src/generated/QuintLexer.interp | 9 +- quint/src/generated/QuintLexer.tokens | 11 +- quint/src/generated/QuintLexer.ts | 437 ++-- quint/src/generated/QuintListener.ts | 36 +- quint/src/generated/QuintParser.ts | 1982 +++++++++-------- quint/src/generated/QuintVisitor.ts | 23 +- quint/testFixture/_1025importeeWithError.json | 2 +- 9 files changed, 1351 insertions(+), 1167 deletions(-) diff --git a/quint/src/generated/Quint.interp b/quint/src/generated/Quint.interp index 08276dcf9..966bb4ab8 100644 --- a/quint/src/generated/Quint.interp +++ b/quint/src/generated/Quint.interp @@ -69,6 +69,7 @@ null null null null +null token symbolic names: null @@ -136,7 +137,8 @@ EQ ASGN LPAREN RPAREN -IDENTIFIER +LOW_ID +CAP_ID DOCCOMMENT LINE_COMMENT COMMENT @@ -181,7 +183,8 @@ operator literal qualId simpleId +identifier atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 71, 753, 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, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 3, 2, 6, 2, 80, 10, 2, 13, 2, 14, 2, 81, 3, 2, 3, 2, 3, 3, 7, 3, 87, 10, 3, 12, 3, 14, 3, 90, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 96, 10, 3, 12, 3, 14, 3, 99, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 104, 10, 4, 12, 4, 14, 4, 107, 11, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 131, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 139, 10, 6, 12, 6, 14, 6, 142, 11, 6, 5, 6, 144, 10, 6, 3, 6, 3, 6, 3, 6, 5, 6, 149, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 162, 10, 6, 12, 6, 14, 6, 165, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 171, 10, 6, 3, 6, 3, 6, 5, 6, 175, 10, 6, 3, 6, 5, 6, 178, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 191, 10, 7, 3, 7, 3, 7, 3, 7, 7, 7, 196, 10, 7, 12, 7, 14, 7, 199, 11, 7, 5, 7, 201, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 5, 8, 208, 10, 8, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 214, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 219, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 230, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 238, 10, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 244, 10, 11, 3, 11, 3, 11, 5, 11, 248, 10, 11, 5, 11, 250, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 261, 10, 12, 5, 12, 263, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 7, 13, 276, 10, 13, 12, 13, 14, 13, 279, 11, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 286, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 7, 13, 299, 10, 13, 12, 13, 14, 13, 302, 11, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 309, 10, 13, 5, 13, 311, 10, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 326, 10, 18, 12, 18, 14, 18, 329, 11, 18, 5, 18, 331, 10, 18, 3, 18, 5, 18, 334, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 355, 10, 18, 12, 18, 14, 18, 358, 11, 18, 3, 18, 5, 18, 361, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 5, 18, 377, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 385, 10, 18, 12, 18, 14, 18, 388, 11, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 395, 10, 19, 12, 19, 14, 19, 398, 11, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 407, 10, 19, 5, 19, 409, 10, 19, 3, 19, 3, 19, 5, 19, 413, 10, 19, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 422, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 438, 10, 21, 12, 21, 14, 21, 441, 11, 21, 3, 21, 5, 21, 444, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 453, 10, 21, 12, 21, 14, 21, 456, 11, 21, 3, 21, 5, 21, 459, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 469, 10, 21, 12, 21, 14, 21, 472, 11, 21, 3, 21, 5, 21, 475, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 484, 10, 21, 12, 21, 14, 21, 487, 11, 21, 3, 21, 5, 21, 490, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 498, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 506, 10, 21, 12, 21, 14, 21, 509, 11, 21, 3, 21, 5, 21, 512, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 520, 10, 21, 12, 21, 14, 21, 523, 11, 21, 3, 21, 5, 21, 526, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 534, 10, 21, 12, 21, 14, 21, 537, 11, 21, 5, 21, 539, 10, 21, 3, 21, 5, 21, 542, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 567, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 606, 10, 21, 3, 21, 5, 21, 609, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 616, 10, 21, 12, 21, 14, 21, 619, 11, 21, 3, 22, 3, 22, 3, 22, 3, 22, 5, 22, 625, 10, 22, 3, 22, 3, 22, 3, 22, 7, 22, 630, 10, 22, 12, 22, 14, 22, 633, 11, 22, 3, 22, 3, 22, 3, 23, 3, 23, 5, 23, 639, 10, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 648, 10, 24, 3, 24, 5, 24, 651, 10, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 662, 10, 25, 3, 26, 3, 26, 5, 26, 666, 10, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 7, 27, 676, 10, 27, 12, 27, 14, 27, 679, 11, 27, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 685, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 6, 28, 692, 10, 28, 13, 28, 14, 28, 693, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 5, 29, 703, 10, 29, 3, 30, 3, 30, 3, 31, 3, 31, 5, 31, 709, 10, 31, 3, 32, 3, 32, 3, 32, 7, 32, 714, 10, 32, 12, 32, 14, 32, 717, 11, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 725, 10, 33, 3, 34, 3, 34, 5, 34, 729, 10, 34, 3, 35, 3, 35, 5, 35, 733, 10, 35, 3, 36, 3, 36, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 7, 38, 742, 10, 38, 12, 38, 14, 38, 745, 11, 38, 3, 39, 3, 39, 3, 39, 3, 39, 5, 39, 751, 10, 39, 3, 39, 2, 2, 4, 34, 40, 40, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 68, 2, 70, 2, 72, 2, 74, 2, 76, 2, 2, 9, 3, 2, 55, 57, 3, 2, 53, 54, 3, 2, 58, 63, 3, 2, 45, 51, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 53, 63, 3, 2, 42, 44, 2, 849, 2, 79, 3, 2, 2, 2, 4, 88, 3, 2, 2, 2, 6, 105, 3, 2, 2, 2, 8, 130, 3, 2, 2, 2, 10, 132, 3, 2, 2, 2, 12, 200, 3, 2, 2, 2, 14, 202, 3, 2, 2, 2, 16, 209, 3, 2, 2, 2, 18, 229, 3, 2, 2, 2, 20, 249, 3, 2, 2, 2, 22, 262, 3, 2, 2, 2, 24, 310, 3, 2, 2, 2, 26, 312, 3, 2, 2, 2, 28, 314, 3, 2, 2, 2, 30, 316, 3, 2, 2, 2, 32, 318, 3, 2, 2, 2, 34, 376, 3, 2, 2, 2, 36, 412, 3, 2, 2, 2, 38, 414, 3, 2, 2, 2, 40, 566, 3, 2, 2, 2, 42, 620, 3, 2, 2, 2, 44, 638, 3, 2, 2, 2, 46, 643, 3, 2, 2, 2, 48, 661, 3, 2, 2, 2, 50, 665, 3, 2, 2, 2, 52, 684, 3, 2, 2, 2, 54, 686, 3, 2, 2, 2, 56, 702, 3, 2, 2, 2, 58, 704, 3, 2, 2, 2, 60, 708, 3, 2, 2, 2, 62, 710, 3, 2, 2, 2, 64, 724, 3, 2, 2, 2, 66, 728, 3, 2, 2, 2, 68, 732, 3, 2, 2, 2, 70, 734, 3, 2, 2, 2, 72, 736, 3, 2, 2, 2, 74, 738, 3, 2, 2, 2, 76, 750, 3, 2, 2, 2, 78, 80, 5, 4, 3, 2, 79, 78, 3, 2, 2, 2, 80, 81, 3, 2, 2, 2, 81, 79, 3, 2, 2, 2, 81, 82, 3, 2, 2, 2, 82, 83, 3, 2, 2, 2, 83, 84, 7, 2, 2, 3, 84, 3, 3, 2, 2, 2, 85, 87, 7, 68, 2, 2, 86, 85, 3, 2, 2, 2, 87, 90, 3, 2, 2, 2, 88, 86, 3, 2, 2, 2, 88, 89, 3, 2, 2, 2, 89, 91, 3, 2, 2, 2, 90, 88, 3, 2, 2, 2, 91, 92, 7, 3, 2, 2, 92, 93, 5, 74, 38, 2, 93, 97, 7, 4, 2, 2, 94, 96, 5, 6, 4, 2, 95, 94, 3, 2, 2, 2, 96, 99, 3, 2, 2, 2, 97, 95, 3, 2, 2, 2, 97, 98, 3, 2, 2, 2, 98, 100, 3, 2, 2, 2, 99, 97, 3, 2, 2, 2, 100, 101, 7, 5, 2, 2, 101, 5, 3, 2, 2, 2, 102, 104, 7, 68, 2, 2, 103, 102, 3, 2, 2, 2, 104, 107, 3, 2, 2, 2, 105, 103, 3, 2, 2, 2, 105, 106, 3, 2, 2, 2, 106, 108, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 108, 109, 5, 8, 5, 2, 109, 7, 3, 2, 2, 2, 110, 111, 7, 6, 2, 2, 111, 112, 5, 74, 38, 2, 112, 113, 7, 7, 2, 2, 113, 114, 5, 34, 18, 2, 114, 131, 3, 2, 2, 2, 115, 116, 7, 8, 2, 2, 116, 117, 5, 74, 38, 2, 117, 118, 7, 7, 2, 2, 118, 119, 5, 34, 18, 2, 119, 131, 3, 2, 2, 2, 120, 121, 7, 9, 2, 2, 121, 122, 5, 56, 29, 2, 122, 123, 7, 64, 2, 2, 123, 124, 5, 40, 21, 2, 124, 131, 3, 2, 2, 2, 125, 131, 5, 24, 13, 2, 126, 131, 5, 10, 6, 2, 127, 131, 5, 12, 7, 2, 128, 131, 5, 20, 11, 2, 129, 131, 5, 22, 12, 2, 130, 110, 3, 2, 2, 2, 130, 115, 3, 2, 2, 2, 130, 120, 3, 2, 2, 2, 130, 125, 3, 2, 2, 2, 130, 126, 3, 2, 2, 2, 130, 127, 3, 2, 2, 2, 130, 128, 3, 2, 2, 2, 130, 129, 3, 2, 2, 2, 131, 9, 3, 2, 2, 2, 132, 133, 5, 18, 10, 2, 133, 170, 5, 66, 34, 2, 134, 143, 7, 65, 2, 2, 135, 140, 5, 58, 30, 2, 136, 137, 7, 10, 2, 2, 137, 139, 5, 58, 30, 2, 138, 136, 3, 2, 2, 2, 139, 142, 3, 2, 2, 2, 140, 138, 3, 2, 2, 2, 140, 141, 3, 2, 2, 2, 141, 144, 3, 2, 2, 2, 142, 140, 3, 2, 2, 2, 143, 135, 3, 2, 2, 2, 143, 144, 3, 2, 2, 2, 144, 145, 3, 2, 2, 2, 145, 148, 7, 66, 2, 2, 146, 147, 7, 7, 2, 2, 147, 149, 5, 34, 18, 2, 148, 146, 3, 2, 2, 2, 148, 149, 3, 2, 2, 2, 149, 171, 3, 2, 2, 2, 150, 151, 7, 7, 2, 2, 151, 171, 5, 34, 18, 2, 152, 153, 7, 65, 2, 2, 153, 154, 5, 58, 30, 2, 154, 155, 7, 7, 2, 2, 155, 163, 5, 34, 18, 2, 156, 157, 7, 10, 2, 2, 157, 158, 5, 58, 30, 2, 158, 159, 7, 7, 2, 2, 159, 160, 5, 34, 18, 2, 160, 162, 3, 2, 2, 2, 161, 156, 3, 2, 2, 2, 162, 165, 3, 2, 2, 2, 163, 161, 3, 2, 2, 2, 163, 164, 3, 2, 2, 2, 164, 166, 3, 2, 2, 2, 165, 163, 3, 2, 2, 2, 166, 167, 7, 66, 2, 2, 167, 168, 7, 7, 2, 2, 168, 169, 5, 34, 18, 2, 169, 171, 3, 2, 2, 2, 170, 134, 3, 2, 2, 2, 170, 150, 3, 2, 2, 2, 170, 152, 3, 2, 2, 2, 170, 171, 3, 2, 2, 2, 171, 174, 3, 2, 2, 2, 172, 173, 7, 64, 2, 2, 173, 175, 5, 40, 21, 2, 174, 172, 3, 2, 2, 2, 174, 175, 3, 2, 2, 2, 175, 177, 3, 2, 2, 2, 176, 178, 7, 11, 2, 2, 177, 176, 3, 2, 2, 2, 177, 178, 3, 2, 2, 2, 178, 11, 3, 2, 2, 2, 179, 180, 7, 12, 2, 2, 180, 201, 5, 74, 38, 2, 181, 182, 7, 12, 2, 2, 182, 183, 5, 74, 38, 2, 183, 184, 7, 64, 2, 2, 184, 185, 5, 34, 18, 2, 185, 201, 3, 2, 2, 2, 186, 187, 7, 12, 2, 2, 187, 188, 5, 74, 38, 2, 188, 190, 7, 64, 2, 2, 189, 191, 7, 13, 2, 2, 190, 189, 3, 2, 2, 2, 190, 191, 3, 2, 2, 2, 191, 192, 3, 2, 2, 2, 192, 197, 5, 14, 8, 2, 193, 194, 7, 13, 2, 2, 194, 196, 5, 14, 8, 2, 195, 193, 3, 2, 2, 2, 196, 199, 3, 2, 2, 2, 197, 195, 3, 2, 2, 2, 197, 198, 3, 2, 2, 2, 198, 201, 3, 2, 2, 2, 199, 197, 3, 2, 2, 2, 200, 179, 3, 2, 2, 2, 200, 181, 3, 2, 2, 2, 200, 186, 3, 2, 2, 2, 201, 13, 3, 2, 2, 2, 202, 207, 5, 76, 39, 2, 203, 204, 7, 65, 2, 2, 204, 205, 5, 34, 18, 2, 205, 206, 7, 66, 2, 2, 206, 208, 3, 2, 2, 2, 207, 203, 3, 2, 2, 2, 207, 208, 3, 2, 2, 2, 208, 15, 3, 2, 2, 2, 209, 210, 7, 14, 2, 2, 210, 213, 5, 74, 38, 2, 211, 212, 7, 7, 2, 2, 212, 214, 5, 34, 18, 2, 213, 211, 3, 2, 2, 2, 213, 214, 3, 2, 2, 2, 214, 215, 3, 2, 2, 2, 215, 216, 7, 64, 2, 2, 216, 218, 5, 40, 21, 2, 217, 219, 7, 11, 2, 2, 218, 217, 3, 2, 2, 2, 218, 219, 3, 2, 2, 2, 219, 17, 3, 2, 2, 2, 220, 230, 7, 15, 2, 2, 221, 230, 7, 16, 2, 2, 222, 223, 7, 17, 2, 2, 223, 230, 7, 15, 2, 2, 224, 225, 7, 17, 2, 2, 225, 230, 7, 16, 2, 2, 226, 230, 7, 18, 2, 2, 227, 230, 7, 19, 2, 2, 228, 230, 7, 20, 2, 2, 229, 220, 3, 2, 2, 2, 229, 221, 3, 2, 2, 2, 229, 222, 3, 2, 2, 2, 229, 224, 3, 2, 2, 2, 229, 226, 3, 2, 2, 2, 229, 227, 3, 2, 2, 2, 229, 228, 3, 2, 2, 2, 230, 19, 3, 2, 2, 2, 231, 232, 7, 21, 2, 2, 232, 233, 5, 28, 15, 2, 233, 234, 7, 22, 2, 2, 234, 237, 5, 60, 31, 2, 235, 236, 7, 23, 2, 2, 236, 238, 5, 32, 17, 2, 237, 235, 3, 2, 2, 2, 237, 238, 3, 2, 2, 2, 238, 250, 3, 2, 2, 2, 239, 240, 7, 21, 2, 2, 240, 243, 5, 28, 15, 2, 241, 242, 7, 24, 2, 2, 242, 244, 5, 28, 15, 2, 243, 241, 3, 2, 2, 2, 243, 244, 3, 2, 2, 2, 244, 247, 3, 2, 2, 2, 245, 246, 7, 23, 2, 2, 246, 248, 5, 32, 17, 2, 247, 245, 3, 2, 2, 2, 247, 248, 3, 2, 2, 2, 248, 250, 3, 2, 2, 2, 249, 231, 3, 2, 2, 2, 249, 239, 3, 2, 2, 2, 250, 21, 3, 2, 2, 2, 251, 252, 7, 25, 2, 2, 252, 253, 5, 28, 15, 2, 253, 254, 7, 22, 2, 2, 254, 255, 5, 60, 31, 2, 255, 263, 3, 2, 2, 2, 256, 257, 7, 25, 2, 2, 257, 260, 5, 28, 15, 2, 258, 259, 7, 24, 2, 2, 259, 261, 5, 28, 15, 2, 260, 258, 3, 2, 2, 2, 260, 261, 3, 2, 2, 2, 261, 263, 3, 2, 2, 2, 262, 251, 3, 2, 2, 2, 262, 256, 3, 2, 2, 2, 263, 23, 3, 2, 2, 2, 264, 265, 7, 21, 2, 2, 265, 266, 5, 26, 14, 2, 266, 267, 7, 65, 2, 2, 267, 268, 5, 28, 15, 2, 268, 269, 7, 64, 2, 2, 269, 277, 5, 40, 21, 2, 270, 271, 7, 10, 2, 2, 271, 272, 5, 28, 15, 2, 272, 273, 7, 64, 2, 2, 273, 274, 5, 40, 21, 2, 274, 276, 3, 2, 2, 2, 275, 270, 3, 2, 2, 2, 276, 279, 3, 2, 2, 2, 277, 275, 3, 2, 2, 2, 277, 278, 3, 2, 2, 2, 278, 280, 3, 2, 2, 2, 279, 277, 3, 2, 2, 2, 280, 281, 7, 66, 2, 2, 281, 282, 7, 22, 2, 2, 282, 285, 7, 55, 2, 2, 283, 284, 7, 23, 2, 2, 284, 286, 5, 32, 17, 2, 285, 283, 3, 2, 2, 2, 285, 286, 3, 2, 2, 2, 286, 311, 3, 2, 2, 2, 287, 288, 7, 21, 2, 2, 288, 289, 5, 26, 14, 2, 289, 290, 7, 65, 2, 2, 290, 291, 5, 28, 15, 2, 291, 292, 7, 64, 2, 2, 292, 300, 5, 40, 21, 2, 293, 294, 7, 10, 2, 2, 294, 295, 5, 28, 15, 2, 295, 296, 7, 64, 2, 2, 296, 297, 5, 40, 21, 2, 297, 299, 3, 2, 2, 2, 298, 293, 3, 2, 2, 2, 299, 302, 3, 2, 2, 2, 300, 298, 3, 2, 2, 2, 300, 301, 3, 2, 2, 2, 301, 303, 3, 2, 2, 2, 302, 300, 3, 2, 2, 2, 303, 304, 7, 66, 2, 2, 304, 305, 7, 24, 2, 2, 305, 308, 5, 30, 16, 2, 306, 307, 7, 23, 2, 2, 307, 309, 5, 32, 17, 2, 308, 306, 3, 2, 2, 2, 308, 309, 3, 2, 2, 2, 309, 311, 3, 2, 2, 2, 310, 264, 3, 2, 2, 2, 310, 287, 3, 2, 2, 2, 311, 25, 3, 2, 2, 2, 312, 313, 5, 74, 38, 2, 313, 27, 3, 2, 2, 2, 314, 315, 5, 74, 38, 2, 315, 29, 3, 2, 2, 2, 316, 317, 5, 74, 38, 2, 317, 31, 3, 2, 2, 2, 318, 319, 7, 42, 2, 2, 319, 33, 3, 2, 2, 2, 320, 321, 8, 18, 1, 2, 321, 330, 7, 65, 2, 2, 322, 327, 5, 34, 18, 2, 323, 324, 7, 10, 2, 2, 324, 326, 5, 34, 18, 2, 325, 323, 3, 2, 2, 2, 326, 329, 3, 2, 2, 2, 327, 325, 3, 2, 2, 2, 327, 328, 3, 2, 2, 2, 328, 331, 3, 2, 2, 2, 329, 327, 3, 2, 2, 2, 330, 322, 3, 2, 2, 2, 330, 331, 3, 2, 2, 2, 331, 333, 3, 2, 2, 2, 332, 334, 7, 10, 2, 2, 333, 332, 3, 2, 2, 2, 333, 334, 3, 2, 2, 2, 334, 335, 3, 2, 2, 2, 335, 336, 7, 66, 2, 2, 336, 337, 7, 27, 2, 2, 337, 377, 5, 34, 18, 12, 338, 339, 7, 49, 2, 2, 339, 340, 7, 28, 2, 2, 340, 341, 5, 34, 18, 2, 341, 342, 7, 29, 2, 2, 342, 377, 3, 2, 2, 2, 343, 344, 7, 50, 2, 2, 344, 345, 7, 28, 2, 2, 345, 346, 5, 34, 18, 2, 346, 347, 7, 29, 2, 2, 347, 377, 3, 2, 2, 2, 348, 349, 7, 65, 2, 2, 349, 350, 5, 34, 18, 2, 350, 351, 7, 10, 2, 2, 351, 356, 5, 34, 18, 2, 352, 353, 7, 10, 2, 2, 353, 355, 5, 34, 18, 2, 354, 352, 3, 2, 2, 2, 355, 358, 3, 2, 2, 2, 356, 354, 3, 2, 2, 2, 356, 357, 3, 2, 2, 2, 357, 360, 3, 2, 2, 2, 358, 356, 3, 2, 2, 2, 359, 361, 7, 10, 2, 2, 360, 359, 3, 2, 2, 2, 360, 361, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 363, 7, 66, 2, 2, 363, 377, 3, 2, 2, 2, 364, 365, 7, 4, 2, 2, 365, 366, 5, 36, 19, 2, 366, 367, 7, 5, 2, 2, 367, 377, 3, 2, 2, 2, 368, 377, 7, 30, 2, 2, 369, 377, 7, 31, 2, 2, 370, 377, 7, 32, 2, 2, 371, 377, 5, 74, 38, 2, 372, 373, 7, 65, 2, 2, 373, 374, 5, 34, 18, 2, 374, 375, 7, 66, 2, 2, 375, 377, 3, 2, 2, 2, 376, 320, 3, 2, 2, 2, 376, 338, 3, 2, 2, 2, 376, 343, 3, 2, 2, 2, 376, 348, 3, 2, 2, 2, 376, 364, 3, 2, 2, 2, 376, 368, 3, 2, 2, 2, 376, 369, 3, 2, 2, 2, 376, 370, 3, 2, 2, 2, 376, 371, 3, 2, 2, 2, 376, 372, 3, 2, 2, 2, 377, 386, 3, 2, 2, 2, 378, 379, 12, 14, 2, 2, 379, 380, 7, 26, 2, 2, 380, 385, 5, 34, 18, 14, 381, 382, 12, 13, 2, 2, 382, 383, 7, 27, 2, 2, 383, 385, 5, 34, 18, 13, 384, 378, 3, 2, 2, 2, 384, 381, 3, 2, 2, 2, 385, 388, 3, 2, 2, 2, 386, 384, 3, 2, 2, 2, 386, 387, 3, 2, 2, 2, 387, 35, 3, 2, 2, 2, 388, 386, 3, 2, 2, 2, 389, 390, 5, 38, 20, 2, 390, 391, 7, 7, 2, 2, 391, 392, 5, 34, 18, 2, 392, 393, 7, 10, 2, 2, 393, 395, 3, 2, 2, 2, 394, 389, 3, 2, 2, 2, 395, 398, 3, 2, 2, 2, 396, 394, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, 408, 3, 2, 2, 2, 398, 396, 3, 2, 2, 2, 399, 400, 5, 38, 20, 2, 400, 401, 7, 7, 2, 2, 401, 402, 5, 34, 18, 2, 402, 406, 3, 2, 2, 2, 403, 407, 7, 10, 2, 2, 404, 405, 7, 13, 2, 2, 405, 407, 7, 67, 2, 2, 406, 403, 3, 2, 2, 2, 406, 404, 3, 2, 2, 2, 406, 407, 3, 2, 2, 2, 407, 409, 3, 2, 2, 2, 408, 399, 3, 2, 2, 2, 408, 409, 3, 2, 2, 2, 409, 413, 3, 2, 2, 2, 410, 411, 7, 13, 2, 2, 411, 413, 7, 67, 2, 2, 412, 396, 3, 2, 2, 2, 412, 410, 3, 2, 2, 2, 413, 37, 3, 2, 2, 2, 414, 415, 5, 76, 39, 2, 415, 39, 3, 2, 2, 2, 416, 417, 8, 21, 1, 2, 417, 567, 5, 50, 26, 2, 418, 419, 5, 66, 34, 2, 419, 421, 7, 65, 2, 2, 420, 422, 5, 62, 32, 2, 421, 420, 3, 2, 2, 2, 421, 422, 3, 2, 2, 2, 422, 423, 3, 2, 2, 2, 423, 424, 7, 66, 2, 2, 424, 567, 3, 2, 2, 2, 425, 426, 7, 54, 2, 2, 426, 567, 5, 40, 21, 27, 427, 428, 5, 74, 38, 2, 428, 429, 7, 34, 2, 2, 429, 430, 7, 64, 2, 2, 430, 431, 5, 40, 21, 23, 431, 567, 3, 2, 2, 2, 432, 433, 7, 45, 2, 2, 433, 434, 7, 4, 2, 2, 434, 439, 5, 40, 21, 2, 435, 436, 7, 10, 2, 2, 436, 438, 5, 40, 21, 2, 437, 435, 3, 2, 2, 2, 438, 441, 3, 2, 2, 2, 439, 437, 3, 2, 2, 2, 439, 440, 3, 2, 2, 2, 440, 443, 3, 2, 2, 2, 441, 439, 3, 2, 2, 2, 442, 444, 7, 10, 2, 2, 443, 442, 3, 2, 2, 2, 443, 444, 3, 2, 2, 2, 444, 445, 3, 2, 2, 2, 445, 446, 7, 5, 2, 2, 446, 567, 3, 2, 2, 2, 447, 448, 7, 46, 2, 2, 448, 449, 7, 4, 2, 2, 449, 454, 5, 40, 21, 2, 450, 451, 7, 10, 2, 2, 451, 453, 5, 40, 21, 2, 452, 450, 3, 2, 2, 2, 453, 456, 3, 2, 2, 2, 454, 452, 3, 2, 2, 2, 454, 455, 3, 2, 2, 2, 455, 458, 3, 2, 2, 2, 456, 454, 3, 2, 2, 2, 457, 459, 7, 10, 2, 2, 458, 457, 3, 2, 2, 2, 458, 459, 3, 2, 2, 2, 459, 460, 3, 2, 2, 2, 460, 461, 7, 5, 2, 2, 461, 567, 3, 2, 2, 2, 462, 567, 5, 42, 22, 2, 463, 464, 7, 35, 2, 2, 464, 465, 7, 4, 2, 2, 465, 470, 5, 40, 21, 2, 466, 467, 7, 10, 2, 2, 467, 469, 5, 40, 21, 2, 468, 466, 3, 2, 2, 2, 469, 472, 3, 2, 2, 2, 470, 468, 3, 2, 2, 2, 470, 471, 3, 2, 2, 2, 471, 474, 3, 2, 2, 2, 472, 470, 3, 2, 2, 2, 473, 475, 7, 10, 2, 2, 474, 473, 3, 2, 2, 2, 474, 475, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 476, 477, 7, 5, 2, 2, 477, 567, 3, 2, 2, 2, 478, 479, 7, 36, 2, 2, 479, 480, 7, 4, 2, 2, 480, 485, 5, 40, 21, 2, 481, 482, 7, 10, 2, 2, 482, 484, 5, 40, 21, 2, 483, 481, 3, 2, 2, 2, 484, 487, 3, 2, 2, 2, 485, 483, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 489, 3, 2, 2, 2, 487, 485, 3, 2, 2, 2, 488, 490, 7, 10, 2, 2, 489, 488, 3, 2, 2, 2, 489, 490, 3, 2, 2, 2, 490, 491, 3, 2, 2, 2, 491, 492, 7, 5, 2, 2, 492, 567, 3, 2, 2, 2, 493, 498, 5, 74, 38, 2, 494, 498, 7, 44, 2, 2, 495, 498, 7, 43, 2, 2, 496, 498, 7, 42, 2, 2, 497, 493, 3, 2, 2, 2, 497, 494, 3, 2, 2, 2, 497, 495, 3, 2, 2, 2, 497, 496, 3, 2, 2, 2, 498, 567, 3, 2, 2, 2, 499, 500, 7, 65, 2, 2, 500, 501, 5, 40, 21, 2, 501, 502, 7, 10, 2, 2, 502, 507, 5, 40, 21, 2, 503, 504, 7, 10, 2, 2, 504, 506, 5, 40, 21, 2, 505, 503, 3, 2, 2, 2, 506, 509, 3, 2, 2, 2, 507, 505, 3, 2, 2, 2, 507, 508, 3, 2, 2, 2, 508, 511, 3, 2, 2, 2, 509, 507, 3, 2, 2, 2, 510, 512, 7, 10, 2, 2, 511, 510, 3, 2, 2, 2, 511, 512, 3, 2, 2, 2, 512, 513, 3, 2, 2, 2, 513, 514, 7, 66, 2, 2, 514, 567, 3, 2, 2, 2, 515, 516, 7, 4, 2, 2, 516, 521, 5, 64, 33, 2, 517, 518, 7, 10, 2, 2, 518, 520, 5, 64, 33, 2, 519, 517, 3, 2, 2, 2, 520, 523, 3, 2, 2, 2, 521, 519, 3, 2, 2, 2, 521, 522, 3, 2, 2, 2, 522, 525, 3, 2, 2, 2, 523, 521, 3, 2, 2, 2, 524, 526, 7, 10, 2, 2, 525, 524, 3, 2, 2, 2, 525, 526, 3, 2, 2, 2, 526, 527, 3, 2, 2, 2, 527, 528, 7, 5, 2, 2, 528, 567, 3, 2, 2, 2, 529, 538, 7, 28, 2, 2, 530, 535, 5, 40, 21, 2, 531, 532, 7, 10, 2, 2, 532, 534, 5, 40, 21, 2, 533, 531, 3, 2, 2, 2, 534, 537, 3, 2, 2, 2, 535, 533, 3, 2, 2, 2, 535, 536, 3, 2, 2, 2, 536, 539, 3, 2, 2, 2, 537, 535, 3, 2, 2, 2, 538, 530, 3, 2, 2, 2, 538, 539, 3, 2, 2, 2, 539, 541, 3, 2, 2, 2, 540, 542, 7, 10, 2, 2, 541, 540, 3, 2, 2, 2, 541, 542, 3, 2, 2, 2, 542, 543, 3, 2, 2, 2, 543, 567, 7, 29, 2, 2, 544, 545, 7, 37, 2, 2, 545, 546, 7, 65, 2, 2, 546, 547, 5, 40, 21, 2, 547, 548, 7, 66, 2, 2, 548, 549, 5, 40, 21, 2, 549, 550, 7, 38, 2, 2, 550, 551, 5, 40, 21, 7, 551, 567, 3, 2, 2, 2, 552, 553, 5, 10, 6, 2, 553, 554, 5, 40, 21, 6, 554, 567, 3, 2, 2, 2, 555, 556, 5, 16, 9, 2, 556, 557, 5, 40, 21, 5, 557, 567, 3, 2, 2, 2, 558, 559, 7, 65, 2, 2, 559, 560, 5, 40, 21, 2, 560, 561, 7, 66, 2, 2, 561, 567, 3, 2, 2, 2, 562, 563, 7, 4, 2, 2, 563, 564, 5, 40, 21, 2, 564, 565, 7, 5, 2, 2, 565, 567, 3, 2, 2, 2, 566, 416, 3, 2, 2, 2, 566, 418, 3, 2, 2, 2, 566, 425, 3, 2, 2, 2, 566, 427, 3, 2, 2, 2, 566, 432, 3, 2, 2, 2, 566, 447, 3, 2, 2, 2, 566, 462, 3, 2, 2, 2, 566, 463, 3, 2, 2, 2, 566, 478, 3, 2, 2, 2, 566, 497, 3, 2, 2, 2, 566, 499, 3, 2, 2, 2, 566, 515, 3, 2, 2, 2, 566, 529, 3, 2, 2, 2, 566, 544, 3, 2, 2, 2, 566, 552, 3, 2, 2, 2, 566, 555, 3, 2, 2, 2, 566, 558, 3, 2, 2, 2, 566, 562, 3, 2, 2, 2, 567, 617, 3, 2, 2, 2, 568, 569, 12, 28, 2, 2, 569, 570, 7, 33, 2, 2, 570, 616, 5, 40, 21, 28, 571, 572, 12, 26, 2, 2, 572, 573, 9, 2, 2, 2, 573, 616, 5, 40, 21, 27, 574, 575, 12, 25, 2, 2, 575, 576, 9, 3, 2, 2, 576, 616, 5, 40, 21, 26, 577, 578, 12, 24, 2, 2, 578, 579, 9, 4, 2, 2, 579, 616, 5, 40, 21, 25, 580, 581, 12, 22, 2, 2, 581, 582, 7, 64, 2, 2, 582, 583, 5, 40, 21, 23, 583, 584, 8, 21, 1, 2, 584, 616, 3, 2, 2, 2, 585, 586, 12, 20, 2, 2, 586, 587, 7, 45, 2, 2, 587, 616, 5, 40, 21, 21, 588, 589, 12, 18, 2, 2, 589, 590, 7, 46, 2, 2, 590, 616, 5, 40, 21, 19, 591, 592, 12, 17, 2, 2, 592, 593, 7, 47, 2, 2, 593, 616, 5, 40, 21, 18, 594, 595, 12, 16, 2, 2, 595, 596, 7, 48, 2, 2, 596, 616, 5, 40, 21, 17, 597, 598, 12, 10, 2, 2, 598, 599, 7, 26, 2, 2, 599, 616, 5, 40, 21, 11, 600, 601, 12, 32, 2, 2, 601, 602, 7, 22, 2, 2, 602, 608, 5, 68, 35, 2, 603, 605, 7, 65, 2, 2, 604, 606, 5, 62, 32, 2, 605, 604, 3, 2, 2, 2, 605, 606, 3, 2, 2, 2, 606, 607, 3, 2, 2, 2, 607, 609, 7, 66, 2, 2, 608, 603, 3, 2, 2, 2, 608, 609, 3, 2, 2, 2, 609, 616, 3, 2, 2, 2, 610, 611, 12, 29, 2, 2, 611, 612, 7, 28, 2, 2, 612, 613, 5, 40, 21, 2, 613, 614, 7, 29, 2, 2, 614, 616, 3, 2, 2, 2, 615, 568, 3, 2, 2, 2, 615, 571, 3, 2, 2, 2, 615, 574, 3, 2, 2, 2, 615, 577, 3, 2, 2, 2, 615, 580, 3, 2, 2, 2, 615, 585, 3, 2, 2, 2, 615, 588, 3, 2, 2, 2, 615, 591, 3, 2, 2, 2, 615, 594, 3, 2, 2, 2, 615, 597, 3, 2, 2, 2, 615, 600, 3, 2, 2, 2, 615, 610, 3, 2, 2, 2, 616, 619, 3, 2, 2, 2, 617, 615, 3, 2, 2, 2, 617, 618, 3, 2, 2, 2, 618, 41, 3, 2, 2, 2, 619, 617, 3, 2, 2, 2, 620, 621, 7, 52, 2, 2, 621, 622, 5, 40, 21, 2, 622, 624, 7, 4, 2, 2, 623, 625, 7, 13, 2, 2, 624, 623, 3, 2, 2, 2, 624, 625, 3, 2, 2, 2, 625, 626, 3, 2, 2, 2, 626, 631, 5, 44, 23, 2, 627, 628, 7, 13, 2, 2, 628, 630, 5, 44, 23, 2, 629, 627, 3, 2, 2, 2, 630, 633, 3, 2, 2, 2, 631, 629, 3, 2, 2, 2, 631, 632, 3, 2, 2, 2, 632, 634, 3, 2, 2, 2, 633, 631, 3, 2, 2, 2, 634, 635, 7, 5, 2, 2, 635, 43, 3, 2, 2, 2, 636, 639, 5, 46, 24, 2, 637, 639, 7, 39, 2, 2, 638, 636, 3, 2, 2, 2, 638, 637, 3, 2, 2, 2, 639, 640, 3, 2, 2, 2, 640, 641, 7, 27, 2, 2, 641, 642, 5, 40, 21, 2, 642, 45, 3, 2, 2, 2, 643, 650, 5, 76, 39, 2, 644, 647, 7, 65, 2, 2, 645, 648, 5, 76, 39, 2, 646, 648, 7, 39, 2, 2, 647, 645, 3, 2, 2, 2, 647, 646, 3, 2, 2, 2, 648, 649, 3, 2, 2, 2, 649, 651, 7, 66, 2, 2, 650, 644, 3, 2, 2, 2, 650, 651, 3, 2, 2, 2, 651, 47, 3, 2, 2, 2, 652, 653, 5, 8, 5, 2, 653, 654, 7, 2, 2, 3, 654, 662, 3, 2, 2, 2, 655, 656, 5, 40, 21, 2, 656, 657, 7, 2, 2, 3, 657, 662, 3, 2, 2, 2, 658, 659, 7, 68, 2, 2, 659, 662, 7, 2, 2, 3, 660, 662, 7, 2, 2, 3, 661, 652, 3, 2, 2, 2, 661, 655, 3, 2, 2, 2, 661, 658, 3, 2, 2, 2, 661, 660, 3, 2, 2, 2, 662, 49, 3, 2, 2, 2, 663, 666, 5, 52, 27, 2, 664, 666, 5, 54, 28, 2, 665, 663, 3, 2, 2, 2, 665, 664, 3, 2, 2, 2, 666, 51, 3, 2, 2, 2, 667, 668, 5, 58, 30, 2, 668, 669, 7, 27, 2, 2, 669, 670, 5, 40, 21, 2, 670, 685, 3, 2, 2, 2, 671, 672, 7, 65, 2, 2, 672, 677, 5, 58, 30, 2, 673, 674, 7, 10, 2, 2, 674, 676, 5, 58, 30, 2, 675, 673, 3, 2, 2, 2, 676, 679, 3, 2, 2, 2, 677, 675, 3, 2, 2, 2, 677, 678, 3, 2, 2, 2, 678, 680, 3, 2, 2, 2, 679, 677, 3, 2, 2, 2, 680, 681, 7, 66, 2, 2, 681, 682, 7, 27, 2, 2, 682, 683, 5, 40, 21, 2, 683, 685, 3, 2, 2, 2, 684, 667, 3, 2, 2, 2, 684, 671, 3, 2, 2, 2, 685, 53, 3, 2, 2, 2, 686, 687, 7, 65, 2, 2, 687, 688, 7, 65, 2, 2, 688, 691, 5, 58, 30, 2, 689, 690, 7, 10, 2, 2, 690, 692, 5, 58, 30, 2, 691, 689, 3, 2, 2, 2, 692, 693, 3, 2, 2, 2, 693, 691, 3, 2, 2, 2, 693, 694, 3, 2, 2, 2, 694, 695, 3, 2, 2, 2, 695, 696, 7, 66, 2, 2, 696, 697, 7, 66, 2, 2, 697, 698, 7, 27, 2, 2, 698, 699, 5, 40, 21, 2, 699, 55, 3, 2, 2, 2, 700, 703, 7, 39, 2, 2, 701, 703, 5, 74, 38, 2, 702, 700, 3, 2, 2, 2, 702, 701, 3, 2, 2, 2, 703, 57, 3, 2, 2, 2, 704, 705, 5, 56, 29, 2, 705, 59, 3, 2, 2, 2, 706, 709, 7, 55, 2, 2, 707, 709, 5, 74, 38, 2, 708, 706, 3, 2, 2, 2, 708, 707, 3, 2, 2, 2, 709, 61, 3, 2, 2, 2, 710, 715, 5, 40, 21, 2, 711, 712, 7, 10, 2, 2, 712, 714, 5, 40, 21, 2, 713, 711, 3, 2, 2, 2, 714, 717, 3, 2, 2, 2, 715, 713, 3, 2, 2, 2, 715, 716, 3, 2, 2, 2, 716, 63, 3, 2, 2, 2, 717, 715, 3, 2, 2, 2, 718, 719, 5, 76, 39, 2, 719, 720, 7, 7, 2, 2, 720, 721, 5, 40, 21, 2, 721, 725, 3, 2, 2, 2, 722, 723, 7, 40, 2, 2, 723, 725, 5, 40, 21, 2, 724, 718, 3, 2, 2, 2, 724, 722, 3, 2, 2, 2, 725, 65, 3, 2, 2, 2, 726, 729, 5, 74, 38, 2, 727, 729, 9, 5, 2, 2, 728, 726, 3, 2, 2, 2, 728, 727, 3, 2, 2, 2, 729, 67, 3, 2, 2, 2, 730, 733, 5, 74, 38, 2, 731, 733, 9, 6, 2, 2, 732, 730, 3, 2, 2, 2, 732, 731, 3, 2, 2, 2, 733, 69, 3, 2, 2, 2, 734, 735, 9, 7, 2, 2, 735, 71, 3, 2, 2, 2, 736, 737, 9, 8, 2, 2, 737, 73, 3, 2, 2, 2, 738, 743, 7, 67, 2, 2, 739, 740, 7, 41, 2, 2, 740, 742, 7, 67, 2, 2, 741, 739, 3, 2, 2, 2, 742, 745, 3, 2, 2, 2, 743, 741, 3, 2, 2, 2, 743, 744, 3, 2, 2, 2, 744, 75, 3, 2, 2, 2, 745, 743, 3, 2, 2, 2, 746, 751, 7, 67, 2, 2, 747, 748, 5, 74, 38, 2, 748, 749, 8, 39, 1, 2, 749, 751, 3, 2, 2, 2, 750, 746, 3, 2, 2, 2, 750, 747, 3, 2, 2, 2, 751, 77, 3, 2, 2, 2, 84, 81, 88, 97, 105, 130, 140, 143, 148, 163, 170, 174, 177, 190, 197, 200, 207, 213, 218, 229, 237, 243, 247, 249, 260, 262, 277, 285, 300, 308, 310, 327, 330, 333, 356, 360, 376, 384, 386, 396, 406, 408, 412, 421, 439, 443, 454, 458, 470, 474, 485, 489, 497, 507, 511, 521, 525, 535, 538, 541, 566, 605, 608, 615, 617, 624, 631, 638, 647, 650, 661, 665, 677, 684, 693, 702, 708, 715, 724, 728, 732, 743, 750] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 758, 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, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 3, 2, 6, 2, 82, 10, 2, 13, 2, 14, 2, 83, 3, 2, 3, 2, 3, 3, 7, 3, 89, 10, 3, 12, 3, 14, 3, 92, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 98, 10, 3, 12, 3, 14, 3, 101, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 106, 10, 4, 12, 4, 14, 4, 109, 11, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 133, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 141, 10, 6, 12, 6, 14, 6, 144, 11, 6, 5, 6, 146, 10, 6, 3, 6, 3, 6, 3, 6, 5, 6, 151, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 164, 10, 6, 12, 6, 14, 6, 167, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 173, 10, 6, 3, 6, 3, 6, 5, 6, 177, 10, 6, 3, 6, 5, 6, 180, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 193, 10, 7, 3, 7, 3, 7, 3, 7, 7, 7, 198, 10, 7, 12, 7, 14, 7, 201, 11, 7, 5, 7, 203, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 5, 8, 210, 10, 8, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 216, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 221, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 232, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 240, 10, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 246, 10, 11, 3, 11, 3, 11, 5, 11, 250, 10, 11, 5, 11, 252, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 263, 10, 12, 5, 12, 265, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 7, 13, 278, 10, 13, 12, 13, 14, 13, 281, 11, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 288, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 7, 13, 301, 10, 13, 12, 13, 14, 13, 304, 11, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 311, 10, 13, 5, 13, 313, 10, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 328, 10, 18, 12, 18, 14, 18, 331, 11, 18, 5, 18, 333, 10, 18, 3, 18, 5, 18, 336, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 357, 10, 18, 12, 18, 14, 18, 360, 11, 18, 3, 18, 5, 18, 363, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 5, 18, 380, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 388, 10, 18, 12, 18, 14, 18, 391, 11, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 398, 10, 19, 12, 19, 14, 19, 401, 11, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 410, 10, 19, 5, 19, 412, 10, 19, 3, 19, 3, 19, 5, 19, 416, 10, 19, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 425, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 441, 10, 21, 12, 21, 14, 21, 444, 11, 21, 3, 21, 5, 21, 447, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 456, 10, 21, 12, 21, 14, 21, 459, 11, 21, 3, 21, 5, 21, 462, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 472, 10, 21, 12, 21, 14, 21, 475, 11, 21, 3, 21, 5, 21, 478, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 487, 10, 21, 12, 21, 14, 21, 490, 11, 21, 3, 21, 5, 21, 493, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 501, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 509, 10, 21, 12, 21, 14, 21, 512, 11, 21, 3, 21, 5, 21, 515, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 523, 10, 21, 12, 21, 14, 21, 526, 11, 21, 3, 21, 5, 21, 529, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 537, 10, 21, 12, 21, 14, 21, 540, 11, 21, 5, 21, 542, 10, 21, 3, 21, 5, 21, 545, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 570, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 609, 10, 21, 3, 21, 5, 21, 612, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 619, 10, 21, 12, 21, 14, 21, 622, 11, 21, 3, 22, 3, 22, 3, 22, 3, 22, 5, 22, 628, 10, 22, 3, 22, 3, 22, 3, 22, 7, 22, 633, 10, 22, 12, 22, 14, 22, 636, 11, 22, 3, 22, 3, 22, 3, 23, 3, 23, 5, 23, 642, 10, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 651, 10, 24, 3, 24, 5, 24, 654, 10, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 665, 10, 25, 3, 26, 3, 26, 5, 26, 669, 10, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 7, 27, 679, 10, 27, 12, 27, 14, 27, 682, 11, 27, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 688, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 6, 28, 695, 10, 28, 13, 28, 14, 28, 696, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 5, 29, 706, 10, 29, 3, 30, 3, 30, 3, 31, 3, 31, 5, 31, 712, 10, 31, 3, 32, 3, 32, 3, 32, 7, 32, 717, 10, 32, 12, 32, 14, 32, 720, 11, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 728, 10, 33, 3, 34, 3, 34, 5, 34, 732, 10, 34, 3, 35, 3, 35, 5, 35, 736, 10, 35, 3, 36, 3, 36, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 7, 38, 745, 10, 38, 12, 38, 14, 38, 748, 11, 38, 3, 39, 3, 39, 3, 39, 3, 39, 5, 39, 754, 10, 39, 3, 40, 3, 40, 3, 40, 2, 2, 4, 34, 40, 41, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 68, 2, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 2, 10, 3, 2, 55, 57, 3, 2, 53, 54, 3, 2, 58, 63, 3, 2, 45, 51, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 53, 63, 3, 2, 42, 44, 3, 2, 67, 68, 2, 854, 2, 81, 3, 2, 2, 2, 4, 90, 3, 2, 2, 2, 6, 107, 3, 2, 2, 2, 8, 132, 3, 2, 2, 2, 10, 134, 3, 2, 2, 2, 12, 202, 3, 2, 2, 2, 14, 204, 3, 2, 2, 2, 16, 211, 3, 2, 2, 2, 18, 231, 3, 2, 2, 2, 20, 251, 3, 2, 2, 2, 22, 264, 3, 2, 2, 2, 24, 312, 3, 2, 2, 2, 26, 314, 3, 2, 2, 2, 28, 316, 3, 2, 2, 2, 30, 318, 3, 2, 2, 2, 32, 320, 3, 2, 2, 2, 34, 379, 3, 2, 2, 2, 36, 415, 3, 2, 2, 2, 38, 417, 3, 2, 2, 2, 40, 569, 3, 2, 2, 2, 42, 623, 3, 2, 2, 2, 44, 641, 3, 2, 2, 2, 46, 646, 3, 2, 2, 2, 48, 664, 3, 2, 2, 2, 50, 668, 3, 2, 2, 2, 52, 687, 3, 2, 2, 2, 54, 689, 3, 2, 2, 2, 56, 705, 3, 2, 2, 2, 58, 707, 3, 2, 2, 2, 60, 711, 3, 2, 2, 2, 62, 713, 3, 2, 2, 2, 64, 727, 3, 2, 2, 2, 66, 731, 3, 2, 2, 2, 68, 735, 3, 2, 2, 2, 70, 737, 3, 2, 2, 2, 72, 739, 3, 2, 2, 2, 74, 741, 3, 2, 2, 2, 76, 753, 3, 2, 2, 2, 78, 755, 3, 2, 2, 2, 80, 82, 5, 4, 3, 2, 81, 80, 3, 2, 2, 2, 82, 83, 3, 2, 2, 2, 83, 81, 3, 2, 2, 2, 83, 84, 3, 2, 2, 2, 84, 85, 3, 2, 2, 2, 85, 86, 7, 2, 2, 3, 86, 3, 3, 2, 2, 2, 87, 89, 7, 69, 2, 2, 88, 87, 3, 2, 2, 2, 89, 92, 3, 2, 2, 2, 90, 88, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 93, 3, 2, 2, 2, 92, 90, 3, 2, 2, 2, 93, 94, 7, 3, 2, 2, 94, 95, 5, 74, 38, 2, 95, 99, 7, 4, 2, 2, 96, 98, 5, 6, 4, 2, 97, 96, 3, 2, 2, 2, 98, 101, 3, 2, 2, 2, 99, 97, 3, 2, 2, 2, 99, 100, 3, 2, 2, 2, 100, 102, 3, 2, 2, 2, 101, 99, 3, 2, 2, 2, 102, 103, 7, 5, 2, 2, 103, 5, 3, 2, 2, 2, 104, 106, 7, 69, 2, 2, 105, 104, 3, 2, 2, 2, 106, 109, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 107, 108, 3, 2, 2, 2, 108, 110, 3, 2, 2, 2, 109, 107, 3, 2, 2, 2, 110, 111, 5, 8, 5, 2, 111, 7, 3, 2, 2, 2, 112, 113, 7, 6, 2, 2, 113, 114, 5, 74, 38, 2, 114, 115, 7, 7, 2, 2, 115, 116, 5, 34, 18, 2, 116, 133, 3, 2, 2, 2, 117, 118, 7, 8, 2, 2, 118, 119, 5, 74, 38, 2, 119, 120, 7, 7, 2, 2, 120, 121, 5, 34, 18, 2, 121, 133, 3, 2, 2, 2, 122, 123, 7, 9, 2, 2, 123, 124, 5, 56, 29, 2, 124, 125, 7, 64, 2, 2, 125, 126, 5, 40, 21, 2, 126, 133, 3, 2, 2, 2, 127, 133, 5, 24, 13, 2, 128, 133, 5, 10, 6, 2, 129, 133, 5, 12, 7, 2, 130, 133, 5, 20, 11, 2, 131, 133, 5, 22, 12, 2, 132, 112, 3, 2, 2, 2, 132, 117, 3, 2, 2, 2, 132, 122, 3, 2, 2, 2, 132, 127, 3, 2, 2, 2, 132, 128, 3, 2, 2, 2, 132, 129, 3, 2, 2, 2, 132, 130, 3, 2, 2, 2, 132, 131, 3, 2, 2, 2, 133, 9, 3, 2, 2, 2, 134, 135, 5, 18, 10, 2, 135, 172, 5, 66, 34, 2, 136, 145, 7, 65, 2, 2, 137, 142, 5, 58, 30, 2, 138, 139, 7, 10, 2, 2, 139, 141, 5, 58, 30, 2, 140, 138, 3, 2, 2, 2, 141, 144, 3, 2, 2, 2, 142, 140, 3, 2, 2, 2, 142, 143, 3, 2, 2, 2, 143, 146, 3, 2, 2, 2, 144, 142, 3, 2, 2, 2, 145, 137, 3, 2, 2, 2, 145, 146, 3, 2, 2, 2, 146, 147, 3, 2, 2, 2, 147, 150, 7, 66, 2, 2, 148, 149, 7, 7, 2, 2, 149, 151, 5, 34, 18, 2, 150, 148, 3, 2, 2, 2, 150, 151, 3, 2, 2, 2, 151, 173, 3, 2, 2, 2, 152, 153, 7, 7, 2, 2, 153, 173, 5, 34, 18, 2, 154, 155, 7, 65, 2, 2, 155, 156, 5, 58, 30, 2, 156, 157, 7, 7, 2, 2, 157, 165, 5, 34, 18, 2, 158, 159, 7, 10, 2, 2, 159, 160, 5, 58, 30, 2, 160, 161, 7, 7, 2, 2, 161, 162, 5, 34, 18, 2, 162, 164, 3, 2, 2, 2, 163, 158, 3, 2, 2, 2, 164, 167, 3, 2, 2, 2, 165, 163, 3, 2, 2, 2, 165, 166, 3, 2, 2, 2, 166, 168, 3, 2, 2, 2, 167, 165, 3, 2, 2, 2, 168, 169, 7, 66, 2, 2, 169, 170, 7, 7, 2, 2, 170, 171, 5, 34, 18, 2, 171, 173, 3, 2, 2, 2, 172, 136, 3, 2, 2, 2, 172, 152, 3, 2, 2, 2, 172, 154, 3, 2, 2, 2, 172, 173, 3, 2, 2, 2, 173, 176, 3, 2, 2, 2, 174, 175, 7, 64, 2, 2, 175, 177, 5, 40, 21, 2, 176, 174, 3, 2, 2, 2, 176, 177, 3, 2, 2, 2, 177, 179, 3, 2, 2, 2, 178, 180, 7, 11, 2, 2, 179, 178, 3, 2, 2, 2, 179, 180, 3, 2, 2, 2, 180, 11, 3, 2, 2, 2, 181, 182, 7, 12, 2, 2, 182, 203, 5, 74, 38, 2, 183, 184, 7, 12, 2, 2, 184, 185, 5, 74, 38, 2, 185, 186, 7, 64, 2, 2, 186, 187, 5, 34, 18, 2, 187, 203, 3, 2, 2, 2, 188, 189, 7, 12, 2, 2, 189, 190, 5, 74, 38, 2, 190, 192, 7, 64, 2, 2, 191, 193, 7, 13, 2, 2, 192, 191, 3, 2, 2, 2, 192, 193, 3, 2, 2, 2, 193, 194, 3, 2, 2, 2, 194, 199, 5, 14, 8, 2, 195, 196, 7, 13, 2, 2, 196, 198, 5, 14, 8, 2, 197, 195, 3, 2, 2, 2, 198, 201, 3, 2, 2, 2, 199, 197, 3, 2, 2, 2, 199, 200, 3, 2, 2, 2, 200, 203, 3, 2, 2, 2, 201, 199, 3, 2, 2, 2, 202, 181, 3, 2, 2, 2, 202, 183, 3, 2, 2, 2, 202, 188, 3, 2, 2, 2, 203, 13, 3, 2, 2, 2, 204, 209, 5, 76, 39, 2, 205, 206, 7, 65, 2, 2, 206, 207, 5, 34, 18, 2, 207, 208, 7, 66, 2, 2, 208, 210, 3, 2, 2, 2, 209, 205, 3, 2, 2, 2, 209, 210, 3, 2, 2, 2, 210, 15, 3, 2, 2, 2, 211, 212, 7, 14, 2, 2, 212, 215, 5, 74, 38, 2, 213, 214, 7, 7, 2, 2, 214, 216, 5, 34, 18, 2, 215, 213, 3, 2, 2, 2, 215, 216, 3, 2, 2, 2, 216, 217, 3, 2, 2, 2, 217, 218, 7, 64, 2, 2, 218, 220, 5, 40, 21, 2, 219, 221, 7, 11, 2, 2, 220, 219, 3, 2, 2, 2, 220, 221, 3, 2, 2, 2, 221, 17, 3, 2, 2, 2, 222, 232, 7, 15, 2, 2, 223, 232, 7, 16, 2, 2, 224, 225, 7, 17, 2, 2, 225, 232, 7, 15, 2, 2, 226, 227, 7, 17, 2, 2, 227, 232, 7, 16, 2, 2, 228, 232, 7, 18, 2, 2, 229, 232, 7, 19, 2, 2, 230, 232, 7, 20, 2, 2, 231, 222, 3, 2, 2, 2, 231, 223, 3, 2, 2, 2, 231, 224, 3, 2, 2, 2, 231, 226, 3, 2, 2, 2, 231, 228, 3, 2, 2, 2, 231, 229, 3, 2, 2, 2, 231, 230, 3, 2, 2, 2, 232, 19, 3, 2, 2, 2, 233, 234, 7, 21, 2, 2, 234, 235, 5, 28, 15, 2, 235, 236, 7, 22, 2, 2, 236, 239, 5, 60, 31, 2, 237, 238, 7, 23, 2, 2, 238, 240, 5, 32, 17, 2, 239, 237, 3, 2, 2, 2, 239, 240, 3, 2, 2, 2, 240, 252, 3, 2, 2, 2, 241, 242, 7, 21, 2, 2, 242, 245, 5, 28, 15, 2, 243, 244, 7, 24, 2, 2, 244, 246, 5, 28, 15, 2, 245, 243, 3, 2, 2, 2, 245, 246, 3, 2, 2, 2, 246, 249, 3, 2, 2, 2, 247, 248, 7, 23, 2, 2, 248, 250, 5, 32, 17, 2, 249, 247, 3, 2, 2, 2, 249, 250, 3, 2, 2, 2, 250, 252, 3, 2, 2, 2, 251, 233, 3, 2, 2, 2, 251, 241, 3, 2, 2, 2, 252, 21, 3, 2, 2, 2, 253, 254, 7, 25, 2, 2, 254, 255, 5, 28, 15, 2, 255, 256, 7, 22, 2, 2, 256, 257, 5, 60, 31, 2, 257, 265, 3, 2, 2, 2, 258, 259, 7, 25, 2, 2, 259, 262, 5, 28, 15, 2, 260, 261, 7, 24, 2, 2, 261, 263, 5, 28, 15, 2, 262, 260, 3, 2, 2, 2, 262, 263, 3, 2, 2, 2, 263, 265, 3, 2, 2, 2, 264, 253, 3, 2, 2, 2, 264, 258, 3, 2, 2, 2, 265, 23, 3, 2, 2, 2, 266, 267, 7, 21, 2, 2, 267, 268, 5, 26, 14, 2, 268, 269, 7, 65, 2, 2, 269, 270, 5, 28, 15, 2, 270, 271, 7, 64, 2, 2, 271, 279, 5, 40, 21, 2, 272, 273, 7, 10, 2, 2, 273, 274, 5, 28, 15, 2, 274, 275, 7, 64, 2, 2, 275, 276, 5, 40, 21, 2, 276, 278, 3, 2, 2, 2, 277, 272, 3, 2, 2, 2, 278, 281, 3, 2, 2, 2, 279, 277, 3, 2, 2, 2, 279, 280, 3, 2, 2, 2, 280, 282, 3, 2, 2, 2, 281, 279, 3, 2, 2, 2, 282, 283, 7, 66, 2, 2, 283, 284, 7, 22, 2, 2, 284, 287, 7, 55, 2, 2, 285, 286, 7, 23, 2, 2, 286, 288, 5, 32, 17, 2, 287, 285, 3, 2, 2, 2, 287, 288, 3, 2, 2, 2, 288, 313, 3, 2, 2, 2, 289, 290, 7, 21, 2, 2, 290, 291, 5, 26, 14, 2, 291, 292, 7, 65, 2, 2, 292, 293, 5, 28, 15, 2, 293, 294, 7, 64, 2, 2, 294, 302, 5, 40, 21, 2, 295, 296, 7, 10, 2, 2, 296, 297, 5, 28, 15, 2, 297, 298, 7, 64, 2, 2, 298, 299, 5, 40, 21, 2, 299, 301, 3, 2, 2, 2, 300, 295, 3, 2, 2, 2, 301, 304, 3, 2, 2, 2, 302, 300, 3, 2, 2, 2, 302, 303, 3, 2, 2, 2, 303, 305, 3, 2, 2, 2, 304, 302, 3, 2, 2, 2, 305, 306, 7, 66, 2, 2, 306, 307, 7, 24, 2, 2, 307, 310, 5, 30, 16, 2, 308, 309, 7, 23, 2, 2, 309, 311, 5, 32, 17, 2, 310, 308, 3, 2, 2, 2, 310, 311, 3, 2, 2, 2, 311, 313, 3, 2, 2, 2, 312, 266, 3, 2, 2, 2, 312, 289, 3, 2, 2, 2, 313, 25, 3, 2, 2, 2, 314, 315, 5, 74, 38, 2, 315, 27, 3, 2, 2, 2, 316, 317, 5, 74, 38, 2, 317, 29, 3, 2, 2, 2, 318, 319, 5, 74, 38, 2, 319, 31, 3, 2, 2, 2, 320, 321, 7, 42, 2, 2, 321, 33, 3, 2, 2, 2, 322, 323, 8, 18, 1, 2, 323, 332, 7, 65, 2, 2, 324, 329, 5, 34, 18, 2, 325, 326, 7, 10, 2, 2, 326, 328, 5, 34, 18, 2, 327, 325, 3, 2, 2, 2, 328, 331, 3, 2, 2, 2, 329, 327, 3, 2, 2, 2, 329, 330, 3, 2, 2, 2, 330, 333, 3, 2, 2, 2, 331, 329, 3, 2, 2, 2, 332, 324, 3, 2, 2, 2, 332, 333, 3, 2, 2, 2, 333, 335, 3, 2, 2, 2, 334, 336, 7, 10, 2, 2, 335, 334, 3, 2, 2, 2, 335, 336, 3, 2, 2, 2, 336, 337, 3, 2, 2, 2, 337, 338, 7, 66, 2, 2, 338, 339, 7, 27, 2, 2, 339, 380, 5, 34, 18, 13, 340, 341, 7, 49, 2, 2, 341, 342, 7, 28, 2, 2, 342, 343, 5, 34, 18, 2, 343, 344, 7, 29, 2, 2, 344, 380, 3, 2, 2, 2, 345, 346, 7, 50, 2, 2, 346, 347, 7, 28, 2, 2, 347, 348, 5, 34, 18, 2, 348, 349, 7, 29, 2, 2, 349, 380, 3, 2, 2, 2, 350, 351, 7, 65, 2, 2, 351, 352, 5, 34, 18, 2, 352, 353, 7, 10, 2, 2, 353, 358, 5, 34, 18, 2, 354, 355, 7, 10, 2, 2, 355, 357, 5, 34, 18, 2, 356, 354, 3, 2, 2, 2, 357, 360, 3, 2, 2, 2, 358, 356, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 362, 3, 2, 2, 2, 360, 358, 3, 2, 2, 2, 361, 363, 7, 10, 2, 2, 362, 361, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 364, 3, 2, 2, 2, 364, 365, 7, 66, 2, 2, 365, 380, 3, 2, 2, 2, 366, 367, 7, 4, 2, 2, 367, 368, 5, 36, 19, 2, 368, 369, 7, 5, 2, 2, 369, 380, 3, 2, 2, 2, 370, 380, 7, 30, 2, 2, 371, 380, 7, 31, 2, 2, 372, 380, 7, 32, 2, 2, 373, 380, 7, 67, 2, 2, 374, 380, 5, 74, 38, 2, 375, 376, 7, 65, 2, 2, 376, 377, 5, 34, 18, 2, 377, 378, 7, 66, 2, 2, 378, 380, 3, 2, 2, 2, 379, 322, 3, 2, 2, 2, 379, 340, 3, 2, 2, 2, 379, 345, 3, 2, 2, 2, 379, 350, 3, 2, 2, 2, 379, 366, 3, 2, 2, 2, 379, 370, 3, 2, 2, 2, 379, 371, 3, 2, 2, 2, 379, 372, 3, 2, 2, 2, 379, 373, 3, 2, 2, 2, 379, 374, 3, 2, 2, 2, 379, 375, 3, 2, 2, 2, 380, 389, 3, 2, 2, 2, 381, 382, 12, 15, 2, 2, 382, 383, 7, 26, 2, 2, 383, 388, 5, 34, 18, 15, 384, 385, 12, 14, 2, 2, 385, 386, 7, 27, 2, 2, 386, 388, 5, 34, 18, 14, 387, 381, 3, 2, 2, 2, 387, 384, 3, 2, 2, 2, 388, 391, 3, 2, 2, 2, 389, 387, 3, 2, 2, 2, 389, 390, 3, 2, 2, 2, 390, 35, 3, 2, 2, 2, 391, 389, 3, 2, 2, 2, 392, 393, 5, 38, 20, 2, 393, 394, 7, 7, 2, 2, 394, 395, 5, 34, 18, 2, 395, 396, 7, 10, 2, 2, 396, 398, 3, 2, 2, 2, 397, 392, 3, 2, 2, 2, 398, 401, 3, 2, 2, 2, 399, 397, 3, 2, 2, 2, 399, 400, 3, 2, 2, 2, 400, 411, 3, 2, 2, 2, 401, 399, 3, 2, 2, 2, 402, 403, 5, 38, 20, 2, 403, 404, 7, 7, 2, 2, 404, 405, 5, 34, 18, 2, 405, 409, 3, 2, 2, 2, 406, 410, 7, 10, 2, 2, 407, 408, 7, 13, 2, 2, 408, 410, 5, 78, 40, 2, 409, 406, 3, 2, 2, 2, 409, 407, 3, 2, 2, 2, 409, 410, 3, 2, 2, 2, 410, 412, 3, 2, 2, 2, 411, 402, 3, 2, 2, 2, 411, 412, 3, 2, 2, 2, 412, 416, 3, 2, 2, 2, 413, 414, 7, 13, 2, 2, 414, 416, 5, 78, 40, 2, 415, 399, 3, 2, 2, 2, 415, 413, 3, 2, 2, 2, 416, 37, 3, 2, 2, 2, 417, 418, 5, 76, 39, 2, 418, 39, 3, 2, 2, 2, 419, 420, 8, 21, 1, 2, 420, 570, 5, 50, 26, 2, 421, 422, 5, 66, 34, 2, 422, 424, 7, 65, 2, 2, 423, 425, 5, 62, 32, 2, 424, 423, 3, 2, 2, 2, 424, 425, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 427, 7, 66, 2, 2, 427, 570, 3, 2, 2, 2, 428, 429, 7, 54, 2, 2, 429, 570, 5, 40, 21, 27, 430, 431, 5, 74, 38, 2, 431, 432, 7, 34, 2, 2, 432, 433, 7, 64, 2, 2, 433, 434, 5, 40, 21, 23, 434, 570, 3, 2, 2, 2, 435, 436, 7, 45, 2, 2, 436, 437, 7, 4, 2, 2, 437, 442, 5, 40, 21, 2, 438, 439, 7, 10, 2, 2, 439, 441, 5, 40, 21, 2, 440, 438, 3, 2, 2, 2, 441, 444, 3, 2, 2, 2, 442, 440, 3, 2, 2, 2, 442, 443, 3, 2, 2, 2, 443, 446, 3, 2, 2, 2, 444, 442, 3, 2, 2, 2, 445, 447, 7, 10, 2, 2, 446, 445, 3, 2, 2, 2, 446, 447, 3, 2, 2, 2, 447, 448, 3, 2, 2, 2, 448, 449, 7, 5, 2, 2, 449, 570, 3, 2, 2, 2, 450, 451, 7, 46, 2, 2, 451, 452, 7, 4, 2, 2, 452, 457, 5, 40, 21, 2, 453, 454, 7, 10, 2, 2, 454, 456, 5, 40, 21, 2, 455, 453, 3, 2, 2, 2, 456, 459, 3, 2, 2, 2, 457, 455, 3, 2, 2, 2, 457, 458, 3, 2, 2, 2, 458, 461, 3, 2, 2, 2, 459, 457, 3, 2, 2, 2, 460, 462, 7, 10, 2, 2, 461, 460, 3, 2, 2, 2, 461, 462, 3, 2, 2, 2, 462, 463, 3, 2, 2, 2, 463, 464, 7, 5, 2, 2, 464, 570, 3, 2, 2, 2, 465, 570, 5, 42, 22, 2, 466, 467, 7, 35, 2, 2, 467, 468, 7, 4, 2, 2, 468, 473, 5, 40, 21, 2, 469, 470, 7, 10, 2, 2, 470, 472, 5, 40, 21, 2, 471, 469, 3, 2, 2, 2, 472, 475, 3, 2, 2, 2, 473, 471, 3, 2, 2, 2, 473, 474, 3, 2, 2, 2, 474, 477, 3, 2, 2, 2, 475, 473, 3, 2, 2, 2, 476, 478, 7, 10, 2, 2, 477, 476, 3, 2, 2, 2, 477, 478, 3, 2, 2, 2, 478, 479, 3, 2, 2, 2, 479, 480, 7, 5, 2, 2, 480, 570, 3, 2, 2, 2, 481, 482, 7, 36, 2, 2, 482, 483, 7, 4, 2, 2, 483, 488, 5, 40, 21, 2, 484, 485, 7, 10, 2, 2, 485, 487, 5, 40, 21, 2, 486, 484, 3, 2, 2, 2, 487, 490, 3, 2, 2, 2, 488, 486, 3, 2, 2, 2, 488, 489, 3, 2, 2, 2, 489, 492, 3, 2, 2, 2, 490, 488, 3, 2, 2, 2, 491, 493, 7, 10, 2, 2, 492, 491, 3, 2, 2, 2, 492, 493, 3, 2, 2, 2, 493, 494, 3, 2, 2, 2, 494, 495, 7, 5, 2, 2, 495, 570, 3, 2, 2, 2, 496, 501, 5, 74, 38, 2, 497, 501, 7, 44, 2, 2, 498, 501, 7, 43, 2, 2, 499, 501, 7, 42, 2, 2, 500, 496, 3, 2, 2, 2, 500, 497, 3, 2, 2, 2, 500, 498, 3, 2, 2, 2, 500, 499, 3, 2, 2, 2, 501, 570, 3, 2, 2, 2, 502, 503, 7, 65, 2, 2, 503, 504, 5, 40, 21, 2, 504, 505, 7, 10, 2, 2, 505, 510, 5, 40, 21, 2, 506, 507, 7, 10, 2, 2, 507, 509, 5, 40, 21, 2, 508, 506, 3, 2, 2, 2, 509, 512, 3, 2, 2, 2, 510, 508, 3, 2, 2, 2, 510, 511, 3, 2, 2, 2, 511, 514, 3, 2, 2, 2, 512, 510, 3, 2, 2, 2, 513, 515, 7, 10, 2, 2, 514, 513, 3, 2, 2, 2, 514, 515, 3, 2, 2, 2, 515, 516, 3, 2, 2, 2, 516, 517, 7, 66, 2, 2, 517, 570, 3, 2, 2, 2, 518, 519, 7, 4, 2, 2, 519, 524, 5, 64, 33, 2, 520, 521, 7, 10, 2, 2, 521, 523, 5, 64, 33, 2, 522, 520, 3, 2, 2, 2, 523, 526, 3, 2, 2, 2, 524, 522, 3, 2, 2, 2, 524, 525, 3, 2, 2, 2, 525, 528, 3, 2, 2, 2, 526, 524, 3, 2, 2, 2, 527, 529, 7, 10, 2, 2, 528, 527, 3, 2, 2, 2, 528, 529, 3, 2, 2, 2, 529, 530, 3, 2, 2, 2, 530, 531, 7, 5, 2, 2, 531, 570, 3, 2, 2, 2, 532, 541, 7, 28, 2, 2, 533, 538, 5, 40, 21, 2, 534, 535, 7, 10, 2, 2, 535, 537, 5, 40, 21, 2, 536, 534, 3, 2, 2, 2, 537, 540, 3, 2, 2, 2, 538, 536, 3, 2, 2, 2, 538, 539, 3, 2, 2, 2, 539, 542, 3, 2, 2, 2, 540, 538, 3, 2, 2, 2, 541, 533, 3, 2, 2, 2, 541, 542, 3, 2, 2, 2, 542, 544, 3, 2, 2, 2, 543, 545, 7, 10, 2, 2, 544, 543, 3, 2, 2, 2, 544, 545, 3, 2, 2, 2, 545, 546, 3, 2, 2, 2, 546, 570, 7, 29, 2, 2, 547, 548, 7, 37, 2, 2, 548, 549, 7, 65, 2, 2, 549, 550, 5, 40, 21, 2, 550, 551, 7, 66, 2, 2, 551, 552, 5, 40, 21, 2, 552, 553, 7, 38, 2, 2, 553, 554, 5, 40, 21, 7, 554, 570, 3, 2, 2, 2, 555, 556, 5, 10, 6, 2, 556, 557, 5, 40, 21, 6, 557, 570, 3, 2, 2, 2, 558, 559, 5, 16, 9, 2, 559, 560, 5, 40, 21, 5, 560, 570, 3, 2, 2, 2, 561, 562, 7, 65, 2, 2, 562, 563, 5, 40, 21, 2, 563, 564, 7, 66, 2, 2, 564, 570, 3, 2, 2, 2, 565, 566, 7, 4, 2, 2, 566, 567, 5, 40, 21, 2, 567, 568, 7, 5, 2, 2, 568, 570, 3, 2, 2, 2, 569, 419, 3, 2, 2, 2, 569, 421, 3, 2, 2, 2, 569, 428, 3, 2, 2, 2, 569, 430, 3, 2, 2, 2, 569, 435, 3, 2, 2, 2, 569, 450, 3, 2, 2, 2, 569, 465, 3, 2, 2, 2, 569, 466, 3, 2, 2, 2, 569, 481, 3, 2, 2, 2, 569, 500, 3, 2, 2, 2, 569, 502, 3, 2, 2, 2, 569, 518, 3, 2, 2, 2, 569, 532, 3, 2, 2, 2, 569, 547, 3, 2, 2, 2, 569, 555, 3, 2, 2, 2, 569, 558, 3, 2, 2, 2, 569, 561, 3, 2, 2, 2, 569, 565, 3, 2, 2, 2, 570, 620, 3, 2, 2, 2, 571, 572, 12, 28, 2, 2, 572, 573, 7, 33, 2, 2, 573, 619, 5, 40, 21, 28, 574, 575, 12, 26, 2, 2, 575, 576, 9, 2, 2, 2, 576, 619, 5, 40, 21, 27, 577, 578, 12, 25, 2, 2, 578, 579, 9, 3, 2, 2, 579, 619, 5, 40, 21, 26, 580, 581, 12, 24, 2, 2, 581, 582, 9, 4, 2, 2, 582, 619, 5, 40, 21, 25, 583, 584, 12, 22, 2, 2, 584, 585, 7, 64, 2, 2, 585, 586, 5, 40, 21, 23, 586, 587, 8, 21, 1, 2, 587, 619, 3, 2, 2, 2, 588, 589, 12, 20, 2, 2, 589, 590, 7, 45, 2, 2, 590, 619, 5, 40, 21, 21, 591, 592, 12, 18, 2, 2, 592, 593, 7, 46, 2, 2, 593, 619, 5, 40, 21, 19, 594, 595, 12, 17, 2, 2, 595, 596, 7, 47, 2, 2, 596, 619, 5, 40, 21, 18, 597, 598, 12, 16, 2, 2, 598, 599, 7, 48, 2, 2, 599, 619, 5, 40, 21, 17, 600, 601, 12, 10, 2, 2, 601, 602, 7, 26, 2, 2, 602, 619, 5, 40, 21, 11, 603, 604, 12, 32, 2, 2, 604, 605, 7, 22, 2, 2, 605, 611, 5, 68, 35, 2, 606, 608, 7, 65, 2, 2, 607, 609, 5, 62, 32, 2, 608, 607, 3, 2, 2, 2, 608, 609, 3, 2, 2, 2, 609, 610, 3, 2, 2, 2, 610, 612, 7, 66, 2, 2, 611, 606, 3, 2, 2, 2, 611, 612, 3, 2, 2, 2, 612, 619, 3, 2, 2, 2, 613, 614, 12, 29, 2, 2, 614, 615, 7, 28, 2, 2, 615, 616, 5, 40, 21, 2, 616, 617, 7, 29, 2, 2, 617, 619, 3, 2, 2, 2, 618, 571, 3, 2, 2, 2, 618, 574, 3, 2, 2, 2, 618, 577, 3, 2, 2, 2, 618, 580, 3, 2, 2, 2, 618, 583, 3, 2, 2, 2, 618, 588, 3, 2, 2, 2, 618, 591, 3, 2, 2, 2, 618, 594, 3, 2, 2, 2, 618, 597, 3, 2, 2, 2, 618, 600, 3, 2, 2, 2, 618, 603, 3, 2, 2, 2, 618, 613, 3, 2, 2, 2, 619, 622, 3, 2, 2, 2, 620, 618, 3, 2, 2, 2, 620, 621, 3, 2, 2, 2, 621, 41, 3, 2, 2, 2, 622, 620, 3, 2, 2, 2, 623, 624, 7, 52, 2, 2, 624, 625, 5, 40, 21, 2, 625, 627, 7, 4, 2, 2, 626, 628, 7, 13, 2, 2, 627, 626, 3, 2, 2, 2, 627, 628, 3, 2, 2, 2, 628, 629, 3, 2, 2, 2, 629, 634, 5, 44, 23, 2, 630, 631, 7, 13, 2, 2, 631, 633, 5, 44, 23, 2, 632, 630, 3, 2, 2, 2, 633, 636, 3, 2, 2, 2, 634, 632, 3, 2, 2, 2, 634, 635, 3, 2, 2, 2, 635, 637, 3, 2, 2, 2, 636, 634, 3, 2, 2, 2, 637, 638, 7, 5, 2, 2, 638, 43, 3, 2, 2, 2, 639, 642, 5, 46, 24, 2, 640, 642, 7, 39, 2, 2, 641, 639, 3, 2, 2, 2, 641, 640, 3, 2, 2, 2, 642, 643, 3, 2, 2, 2, 643, 644, 7, 27, 2, 2, 644, 645, 5, 40, 21, 2, 645, 45, 3, 2, 2, 2, 646, 653, 5, 76, 39, 2, 647, 650, 7, 65, 2, 2, 648, 651, 5, 76, 39, 2, 649, 651, 7, 39, 2, 2, 650, 648, 3, 2, 2, 2, 650, 649, 3, 2, 2, 2, 651, 652, 3, 2, 2, 2, 652, 654, 7, 66, 2, 2, 653, 647, 3, 2, 2, 2, 653, 654, 3, 2, 2, 2, 654, 47, 3, 2, 2, 2, 655, 656, 5, 8, 5, 2, 656, 657, 7, 2, 2, 3, 657, 665, 3, 2, 2, 2, 658, 659, 5, 40, 21, 2, 659, 660, 7, 2, 2, 3, 660, 665, 3, 2, 2, 2, 661, 662, 7, 69, 2, 2, 662, 665, 7, 2, 2, 3, 663, 665, 7, 2, 2, 3, 664, 655, 3, 2, 2, 2, 664, 658, 3, 2, 2, 2, 664, 661, 3, 2, 2, 2, 664, 663, 3, 2, 2, 2, 665, 49, 3, 2, 2, 2, 666, 669, 5, 52, 27, 2, 667, 669, 5, 54, 28, 2, 668, 666, 3, 2, 2, 2, 668, 667, 3, 2, 2, 2, 669, 51, 3, 2, 2, 2, 670, 671, 5, 58, 30, 2, 671, 672, 7, 27, 2, 2, 672, 673, 5, 40, 21, 2, 673, 688, 3, 2, 2, 2, 674, 675, 7, 65, 2, 2, 675, 680, 5, 58, 30, 2, 676, 677, 7, 10, 2, 2, 677, 679, 5, 58, 30, 2, 678, 676, 3, 2, 2, 2, 679, 682, 3, 2, 2, 2, 680, 678, 3, 2, 2, 2, 680, 681, 3, 2, 2, 2, 681, 683, 3, 2, 2, 2, 682, 680, 3, 2, 2, 2, 683, 684, 7, 66, 2, 2, 684, 685, 7, 27, 2, 2, 685, 686, 5, 40, 21, 2, 686, 688, 3, 2, 2, 2, 687, 670, 3, 2, 2, 2, 687, 674, 3, 2, 2, 2, 688, 53, 3, 2, 2, 2, 689, 690, 7, 65, 2, 2, 690, 691, 7, 65, 2, 2, 691, 694, 5, 58, 30, 2, 692, 693, 7, 10, 2, 2, 693, 695, 5, 58, 30, 2, 694, 692, 3, 2, 2, 2, 695, 696, 3, 2, 2, 2, 696, 694, 3, 2, 2, 2, 696, 697, 3, 2, 2, 2, 697, 698, 3, 2, 2, 2, 698, 699, 7, 66, 2, 2, 699, 700, 7, 66, 2, 2, 700, 701, 7, 27, 2, 2, 701, 702, 5, 40, 21, 2, 702, 55, 3, 2, 2, 2, 703, 706, 7, 39, 2, 2, 704, 706, 5, 74, 38, 2, 705, 703, 3, 2, 2, 2, 705, 704, 3, 2, 2, 2, 706, 57, 3, 2, 2, 2, 707, 708, 5, 56, 29, 2, 708, 59, 3, 2, 2, 2, 709, 712, 7, 55, 2, 2, 710, 712, 5, 74, 38, 2, 711, 709, 3, 2, 2, 2, 711, 710, 3, 2, 2, 2, 712, 61, 3, 2, 2, 2, 713, 718, 5, 40, 21, 2, 714, 715, 7, 10, 2, 2, 715, 717, 5, 40, 21, 2, 716, 714, 3, 2, 2, 2, 717, 720, 3, 2, 2, 2, 718, 716, 3, 2, 2, 2, 718, 719, 3, 2, 2, 2, 719, 63, 3, 2, 2, 2, 720, 718, 3, 2, 2, 2, 721, 722, 5, 76, 39, 2, 722, 723, 7, 7, 2, 2, 723, 724, 5, 40, 21, 2, 724, 728, 3, 2, 2, 2, 725, 726, 7, 40, 2, 2, 726, 728, 5, 40, 21, 2, 727, 721, 3, 2, 2, 2, 727, 725, 3, 2, 2, 2, 728, 65, 3, 2, 2, 2, 729, 732, 5, 74, 38, 2, 730, 732, 9, 5, 2, 2, 731, 729, 3, 2, 2, 2, 731, 730, 3, 2, 2, 2, 732, 67, 3, 2, 2, 2, 733, 736, 5, 74, 38, 2, 734, 736, 9, 6, 2, 2, 735, 733, 3, 2, 2, 2, 735, 734, 3, 2, 2, 2, 736, 69, 3, 2, 2, 2, 737, 738, 9, 7, 2, 2, 738, 71, 3, 2, 2, 2, 739, 740, 9, 8, 2, 2, 740, 73, 3, 2, 2, 2, 741, 746, 5, 78, 40, 2, 742, 743, 7, 41, 2, 2, 743, 745, 5, 78, 40, 2, 744, 742, 3, 2, 2, 2, 745, 748, 3, 2, 2, 2, 746, 744, 3, 2, 2, 2, 746, 747, 3, 2, 2, 2, 747, 75, 3, 2, 2, 2, 748, 746, 3, 2, 2, 2, 749, 754, 5, 78, 40, 2, 750, 751, 5, 74, 38, 2, 751, 752, 8, 39, 1, 2, 752, 754, 3, 2, 2, 2, 753, 749, 3, 2, 2, 2, 753, 750, 3, 2, 2, 2, 754, 77, 3, 2, 2, 2, 755, 756, 9, 9, 2, 2, 756, 79, 3, 2, 2, 2, 84, 83, 90, 99, 107, 132, 142, 145, 150, 165, 172, 176, 179, 192, 199, 202, 209, 215, 220, 231, 239, 245, 249, 251, 262, 264, 279, 287, 302, 310, 312, 329, 332, 335, 358, 362, 379, 387, 389, 399, 409, 411, 415, 424, 442, 446, 457, 461, 473, 477, 488, 492, 500, 510, 514, 524, 528, 538, 541, 544, 569, 608, 611, 618, 620, 627, 634, 641, 650, 653, 664, 668, 680, 687, 696, 705, 711, 718, 727, 731, 735, 746, 753] \ No newline at end of file diff --git a/quint/src/generated/Quint.tokens b/quint/src/generated/Quint.tokens index 427758cd2..a3529881a 100644 --- a/quint/src/generated/Quint.tokens +++ b/quint/src/generated/Quint.tokens @@ -62,11 +62,12 @@ EQ=61 ASGN=62 LPAREN=63 RPAREN=64 -IDENTIFIER=65 -DOCCOMMENT=66 -LINE_COMMENT=67 -COMMENT=68 -WS=69 +LOW_ID=65 +CAP_ID=66 +DOCCOMMENT=67 +LINE_COMMENT=68 +COMMENT=69 +WS=70 'module'=1 '{'=2 '}'=3 diff --git a/quint/src/generated/QuintLexer.interp b/quint/src/generated/QuintLexer.interp index 700db184e..e66950a16 100644 --- a/quint/src/generated/QuintLexer.interp +++ b/quint/src/generated/QuintLexer.interp @@ -69,6 +69,7 @@ null null null null +null token symbolic names: null @@ -136,7 +137,8 @@ EQ ASGN LPAREN RPAREN -IDENTIFIER +LOW_ID +CAP_ID DOCCOMMENT LINE_COMMENT COMMENT @@ -207,7 +209,8 @@ EQ ASGN LPAREN RPAREN -IDENTIFIER +LOW_ID +CAP_ID DOCCOMMENT LINE_COMMENT COMMENT @@ -221,4 +224,4 @@ mode names: DEFAULT_MODE atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 2, 71, 473, 8, 1, 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, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 7, 41, 301, 10, 41, 12, 41, 14, 41, 304, 11, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 317, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 324, 10, 43, 12, 43, 14, 43, 327, 11, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 336, 10, 43, 12, 43, 14, 43, 339, 11, 43, 5, 43, 341, 10, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 53, 3, 53, 3, 54, 3, 54, 3, 55, 3, 55, 3, 56, 3, 56, 3, 57, 3, 57, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 64, 3, 64, 3, 65, 3, 65, 3, 66, 3, 66, 7, 66, 415, 10, 66, 12, 66, 14, 66, 418, 11, 66, 3, 66, 3, 66, 6, 66, 422, 10, 66, 13, 66, 14, 66, 423, 5, 66, 426, 10, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 7, 67, 433, 10, 67, 12, 67, 14, 67, 436, 11, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 7, 68, 444, 10, 68, 12, 68, 14, 68, 447, 11, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 7, 69, 457, 10, 69, 12, 69, 14, 69, 460, 11, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 6, 70, 468, 10, 70, 13, 70, 14, 70, 469, 3, 70, 3, 70, 6, 302, 434, 445, 458, 2, 2, 71, 3, 2, 3, 5, 2, 4, 7, 2, 5, 9, 2, 6, 11, 2, 7, 13, 2, 8, 15, 2, 9, 17, 2, 10, 19, 2, 11, 21, 2, 12, 23, 2, 13, 25, 2, 14, 27, 2, 15, 29, 2, 16, 31, 2, 17, 33, 2, 18, 35, 2, 19, 37, 2, 20, 39, 2, 21, 41, 2, 22, 43, 2, 23, 45, 2, 24, 47, 2, 25, 49, 2, 26, 51, 2, 27, 53, 2, 28, 55, 2, 29, 57, 2, 30, 59, 2, 31, 61, 2, 32, 63, 2, 33, 65, 2, 34, 67, 2, 35, 69, 2, 36, 71, 2, 37, 73, 2, 38, 75, 2, 39, 77, 2, 40, 79, 2, 41, 81, 2, 42, 83, 2, 43, 85, 2, 44, 87, 2, 45, 89, 2, 46, 91, 2, 47, 93, 2, 48, 95, 2, 49, 97, 2, 50, 99, 2, 51, 101, 2, 52, 103, 2, 53, 105, 2, 54, 107, 2, 55, 109, 2, 56, 111, 2, 57, 113, 2, 58, 115, 2, 59, 117, 2, 60, 119, 2, 61, 121, 2, 62, 123, 2, 63, 125, 2, 64, 127, 2, 65, 129, 2, 66, 131, 2, 67, 133, 2, 68, 135, 2, 69, 137, 2, 70, 139, 2, 71, 3, 2, 9, 3, 2, 51, 59, 3, 2, 50, 59, 5, 2, 50, 59, 67, 72, 99, 104, 4, 2, 67, 92, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 3, 2, 97, 97, 5, 2, 11, 12, 15, 15, 34, 34, 2, 487, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 3, 141, 3, 2, 2, 2, 5, 148, 3, 2, 2, 2, 7, 150, 3, 2, 2, 2, 9, 152, 3, 2, 2, 2, 11, 158, 3, 2, 2, 2, 13, 160, 3, 2, 2, 2, 15, 164, 3, 2, 2, 2, 17, 171, 3, 2, 2, 2, 19, 173, 3, 2, 2, 2, 21, 175, 3, 2, 2, 2, 23, 180, 3, 2, 2, 2, 25, 182, 3, 2, 2, 2, 27, 189, 3, 2, 2, 2, 29, 193, 3, 2, 2, 2, 31, 197, 3, 2, 2, 2, 33, 202, 3, 2, 2, 2, 35, 209, 3, 2, 2, 2, 37, 213, 3, 2, 2, 2, 39, 222, 3, 2, 2, 2, 41, 229, 3, 2, 2, 2, 43, 231, 3, 2, 2, 2, 45, 236, 3, 2, 2, 2, 47, 239, 3, 2, 2, 2, 49, 246, 3, 2, 2, 2, 51, 249, 3, 2, 2, 2, 53, 252, 3, 2, 2, 2, 55, 254, 3, 2, 2, 2, 57, 256, 3, 2, 2, 2, 59, 260, 3, 2, 2, 2, 61, 264, 3, 2, 2, 2, 63, 269, 3, 2, 2, 2, 65, 271, 3, 2, 2, 2, 67, 273, 3, 2, 2, 2, 69, 277, 3, 2, 2, 2, 71, 281, 3, 2, 2, 2, 73, 284, 3, 2, 2, 2, 75, 289, 3, 2, 2, 2, 77, 291, 3, 2, 2, 2, 79, 295, 3, 2, 2, 2, 81, 298, 3, 2, 2, 2, 83, 316, 3, 2, 2, 2, 85, 340, 3, 2, 2, 2, 87, 342, 3, 2, 2, 2, 89, 346, 3, 2, 2, 2, 91, 349, 3, 2, 2, 2, 93, 353, 3, 2, 2, 2, 95, 361, 3, 2, 2, 2, 97, 365, 3, 2, 2, 2, 99, 370, 3, 2, 2, 2, 101, 374, 3, 2, 2, 2, 103, 380, 3, 2, 2, 2, 105, 382, 3, 2, 2, 2, 107, 384, 3, 2, 2, 2, 109, 386, 3, 2, 2, 2, 111, 388, 3, 2, 2, 2, 113, 390, 3, 2, 2, 2, 115, 392, 3, 2, 2, 2, 117, 394, 3, 2, 2, 2, 119, 397, 3, 2, 2, 2, 121, 400, 3, 2, 2, 2, 123, 403, 3, 2, 2, 2, 125, 406, 3, 2, 2, 2, 127, 408, 3, 2, 2, 2, 129, 410, 3, 2, 2, 2, 131, 425, 3, 2, 2, 2, 133, 427, 3, 2, 2, 2, 135, 439, 3, 2, 2, 2, 137, 452, 3, 2, 2, 2, 139, 467, 3, 2, 2, 2, 141, 142, 7, 111, 2, 2, 142, 143, 7, 113, 2, 2, 143, 144, 7, 102, 2, 2, 144, 145, 7, 119, 2, 2, 145, 146, 7, 110, 2, 2, 146, 147, 7, 103, 2, 2, 147, 4, 3, 2, 2, 2, 148, 149, 7, 125, 2, 2, 149, 6, 3, 2, 2, 2, 150, 151, 7, 127, 2, 2, 151, 8, 3, 2, 2, 2, 152, 153, 7, 101, 2, 2, 153, 154, 7, 113, 2, 2, 154, 155, 7, 112, 2, 2, 155, 156, 7, 117, 2, 2, 156, 157, 7, 118, 2, 2, 157, 10, 3, 2, 2, 2, 158, 159, 7, 60, 2, 2, 159, 12, 3, 2, 2, 2, 160, 161, 7, 120, 2, 2, 161, 162, 7, 99, 2, 2, 162, 163, 7, 116, 2, 2, 163, 14, 3, 2, 2, 2, 164, 165, 7, 99, 2, 2, 165, 166, 7, 117, 2, 2, 166, 167, 7, 117, 2, 2, 167, 168, 7, 119, 2, 2, 168, 169, 7, 111, 2, 2, 169, 170, 7, 103, 2, 2, 170, 16, 3, 2, 2, 2, 171, 172, 7, 46, 2, 2, 172, 18, 3, 2, 2, 2, 173, 174, 7, 61, 2, 2, 174, 20, 3, 2, 2, 2, 175, 176, 7, 118, 2, 2, 176, 177, 7, 123, 2, 2, 177, 178, 7, 114, 2, 2, 178, 179, 7, 103, 2, 2, 179, 22, 3, 2, 2, 2, 180, 181, 7, 126, 2, 2, 181, 24, 3, 2, 2, 2, 182, 183, 7, 112, 2, 2, 183, 184, 7, 113, 2, 2, 184, 185, 7, 112, 2, 2, 185, 186, 7, 102, 2, 2, 186, 187, 7, 103, 2, 2, 187, 188, 7, 118, 2, 2, 188, 26, 3, 2, 2, 2, 189, 190, 7, 120, 2, 2, 190, 191, 7, 99, 2, 2, 191, 192, 7, 110, 2, 2, 192, 28, 3, 2, 2, 2, 193, 194, 7, 102, 2, 2, 194, 195, 7, 103, 2, 2, 195, 196, 7, 104, 2, 2, 196, 30, 3, 2, 2, 2, 197, 198, 7, 114, 2, 2, 198, 199, 7, 119, 2, 2, 199, 200, 7, 116, 2, 2, 200, 201, 7, 103, 2, 2, 201, 32, 3, 2, 2, 2, 202, 203, 7, 99, 2, 2, 203, 204, 7, 101, 2, 2, 204, 205, 7, 118, 2, 2, 205, 206, 7, 107, 2, 2, 206, 207, 7, 113, 2, 2, 207, 208, 7, 112, 2, 2, 208, 34, 3, 2, 2, 2, 209, 210, 7, 116, 2, 2, 210, 211, 7, 119, 2, 2, 211, 212, 7, 112, 2, 2, 212, 36, 3, 2, 2, 2, 213, 214, 7, 118, 2, 2, 214, 215, 7, 103, 2, 2, 215, 216, 7, 111, 2, 2, 216, 217, 7, 114, 2, 2, 217, 218, 7, 113, 2, 2, 218, 219, 7, 116, 2, 2, 219, 220, 7, 99, 2, 2, 220, 221, 7, 110, 2, 2, 221, 38, 3, 2, 2, 2, 222, 223, 7, 107, 2, 2, 223, 224, 7, 111, 2, 2, 224, 225, 7, 114, 2, 2, 225, 226, 7, 113, 2, 2, 226, 227, 7, 116, 2, 2, 227, 228, 7, 118, 2, 2, 228, 40, 3, 2, 2, 2, 229, 230, 7, 48, 2, 2, 230, 42, 3, 2, 2, 2, 231, 232, 7, 104, 2, 2, 232, 233, 7, 116, 2, 2, 233, 234, 7, 113, 2, 2, 234, 235, 7, 111, 2, 2, 235, 44, 3, 2, 2, 2, 236, 237, 7, 99, 2, 2, 237, 238, 7, 117, 2, 2, 238, 46, 3, 2, 2, 2, 239, 240, 7, 103, 2, 2, 240, 241, 7, 122, 2, 2, 241, 242, 7, 114, 2, 2, 242, 243, 7, 113, 2, 2, 243, 244, 7, 116, 2, 2, 244, 245, 7, 118, 2, 2, 245, 48, 3, 2, 2, 2, 246, 247, 7, 47, 2, 2, 247, 248, 7, 64, 2, 2, 248, 50, 3, 2, 2, 2, 249, 250, 7, 63, 2, 2, 250, 251, 7, 64, 2, 2, 251, 52, 3, 2, 2, 2, 252, 253, 7, 93, 2, 2, 253, 54, 3, 2, 2, 2, 254, 255, 7, 95, 2, 2, 255, 56, 3, 2, 2, 2, 256, 257, 7, 107, 2, 2, 257, 258, 7, 112, 2, 2, 258, 259, 7, 118, 2, 2, 259, 58, 3, 2, 2, 2, 260, 261, 7, 117, 2, 2, 261, 262, 7, 118, 2, 2, 262, 263, 7, 116, 2, 2, 263, 60, 3, 2, 2, 2, 264, 265, 7, 100, 2, 2, 265, 266, 7, 113, 2, 2, 266, 267, 7, 113, 2, 2, 267, 268, 7, 110, 2, 2, 268, 62, 3, 2, 2, 2, 269, 270, 7, 96, 2, 2, 270, 64, 3, 2, 2, 2, 271, 272, 7, 41, 2, 2, 272, 66, 3, 2, 2, 2, 273, 274, 7, 99, 2, 2, 274, 275, 7, 110, 2, 2, 275, 276, 7, 110, 2, 2, 276, 68, 3, 2, 2, 2, 277, 278, 7, 99, 2, 2, 278, 279, 7, 112, 2, 2, 279, 280, 7, 123, 2, 2, 280, 70, 3, 2, 2, 2, 281, 282, 7, 107, 2, 2, 282, 283, 7, 104, 2, 2, 283, 72, 3, 2, 2, 2, 284, 285, 7, 103, 2, 2, 285, 286, 7, 110, 2, 2, 286, 287, 7, 117, 2, 2, 287, 288, 7, 103, 2, 2, 288, 74, 3, 2, 2, 2, 289, 290, 7, 97, 2, 2, 290, 76, 3, 2, 2, 2, 291, 292, 7, 48, 2, 2, 292, 293, 7, 48, 2, 2, 293, 294, 7, 48, 2, 2, 294, 78, 3, 2, 2, 2, 295, 296, 7, 60, 2, 2, 296, 297, 7, 60, 2, 2, 297, 80, 3, 2, 2, 2, 298, 302, 7, 36, 2, 2, 299, 301, 11, 2, 2, 2, 300, 299, 3, 2, 2, 2, 301, 304, 3, 2, 2, 2, 302, 303, 3, 2, 2, 2, 302, 300, 3, 2, 2, 2, 303, 305, 3, 2, 2, 2, 304, 302, 3, 2, 2, 2, 305, 306, 7, 36, 2, 2, 306, 82, 3, 2, 2, 2, 307, 308, 7, 104, 2, 2, 308, 309, 7, 99, 2, 2, 309, 310, 7, 110, 2, 2, 310, 311, 7, 117, 2, 2, 311, 317, 7, 103, 2, 2, 312, 313, 7, 118, 2, 2, 313, 314, 7, 116, 2, 2, 314, 315, 7, 119, 2, 2, 315, 317, 7, 103, 2, 2, 316, 307, 3, 2, 2, 2, 316, 312, 3, 2, 2, 2, 317, 84, 3, 2, 2, 2, 318, 341, 7, 50, 2, 2, 319, 325, 9, 2, 2, 2, 320, 324, 9, 3, 2, 2, 321, 322, 7, 97, 2, 2, 322, 324, 9, 3, 2, 2, 323, 320, 3, 2, 2, 2, 323, 321, 3, 2, 2, 2, 324, 327, 3, 2, 2, 2, 325, 323, 3, 2, 2, 2, 325, 326, 3, 2, 2, 2, 326, 341, 3, 2, 2, 2, 327, 325, 3, 2, 2, 2, 328, 329, 7, 50, 2, 2, 329, 330, 7, 122, 2, 2, 330, 331, 3, 2, 2, 2, 331, 337, 9, 4, 2, 2, 332, 336, 9, 4, 2, 2, 333, 334, 7, 97, 2, 2, 334, 336, 9, 4, 2, 2, 335, 332, 3, 2, 2, 2, 335, 333, 3, 2, 2, 2, 336, 339, 3, 2, 2, 2, 337, 335, 3, 2, 2, 2, 337, 338, 3, 2, 2, 2, 338, 341, 3, 2, 2, 2, 339, 337, 3, 2, 2, 2, 340, 318, 3, 2, 2, 2, 340, 319, 3, 2, 2, 2, 340, 328, 3, 2, 2, 2, 341, 86, 3, 2, 2, 2, 342, 343, 7, 99, 2, 2, 343, 344, 7, 112, 2, 2, 344, 345, 7, 102, 2, 2, 345, 88, 3, 2, 2, 2, 346, 347, 7, 113, 2, 2, 347, 348, 7, 116, 2, 2, 348, 90, 3, 2, 2, 2, 349, 350, 7, 107, 2, 2, 350, 351, 7, 104, 2, 2, 351, 352, 7, 104, 2, 2, 352, 92, 3, 2, 2, 2, 353, 354, 7, 107, 2, 2, 354, 355, 7, 111, 2, 2, 355, 356, 7, 114, 2, 2, 356, 357, 7, 110, 2, 2, 357, 358, 7, 107, 2, 2, 358, 359, 7, 103, 2, 2, 359, 360, 7, 117, 2, 2, 360, 94, 3, 2, 2, 2, 361, 362, 7, 85, 2, 2, 362, 363, 7, 103, 2, 2, 363, 364, 7, 118, 2, 2, 364, 96, 3, 2, 2, 2, 365, 366, 7, 78, 2, 2, 366, 367, 7, 107, 2, 2, 367, 368, 7, 117, 2, 2, 368, 369, 7, 118, 2, 2, 369, 98, 3, 2, 2, 2, 370, 371, 7, 79, 2, 2, 371, 372, 7, 99, 2, 2, 372, 373, 7, 114, 2, 2, 373, 100, 3, 2, 2, 2, 374, 375, 7, 111, 2, 2, 375, 376, 7, 99, 2, 2, 376, 377, 7, 118, 2, 2, 377, 378, 7, 101, 2, 2, 378, 379, 7, 106, 2, 2, 379, 102, 3, 2, 2, 2, 380, 381, 7, 45, 2, 2, 381, 104, 3, 2, 2, 2, 382, 383, 7, 47, 2, 2, 383, 106, 3, 2, 2, 2, 384, 385, 7, 44, 2, 2, 385, 108, 3, 2, 2, 2, 386, 387, 7, 49, 2, 2, 387, 110, 3, 2, 2, 2, 388, 389, 7, 39, 2, 2, 389, 112, 3, 2, 2, 2, 390, 391, 7, 64, 2, 2, 391, 114, 3, 2, 2, 2, 392, 393, 7, 62, 2, 2, 393, 116, 3, 2, 2, 2, 394, 395, 7, 64, 2, 2, 395, 396, 7, 63, 2, 2, 396, 118, 3, 2, 2, 2, 397, 398, 7, 62, 2, 2, 398, 399, 7, 63, 2, 2, 399, 120, 3, 2, 2, 2, 400, 401, 7, 35, 2, 2, 401, 402, 7, 63, 2, 2, 402, 122, 3, 2, 2, 2, 403, 404, 7, 63, 2, 2, 404, 405, 7, 63, 2, 2, 405, 124, 3, 2, 2, 2, 406, 407, 7, 63, 2, 2, 407, 126, 3, 2, 2, 2, 408, 409, 7, 42, 2, 2, 409, 128, 3, 2, 2, 2, 410, 411, 7, 43, 2, 2, 411, 130, 3, 2, 2, 2, 412, 416, 9, 5, 2, 2, 413, 415, 9, 6, 2, 2, 414, 413, 3, 2, 2, 2, 415, 418, 3, 2, 2, 2, 416, 414, 3, 2, 2, 2, 416, 417, 3, 2, 2, 2, 417, 426, 3, 2, 2, 2, 418, 416, 3, 2, 2, 2, 419, 421, 9, 7, 2, 2, 420, 422, 9, 6, 2, 2, 421, 420, 3, 2, 2, 2, 422, 423, 3, 2, 2, 2, 423, 421, 3, 2, 2, 2, 423, 424, 3, 2, 2, 2, 424, 426, 3, 2, 2, 2, 425, 412, 3, 2, 2, 2, 425, 419, 3, 2, 2, 2, 426, 132, 3, 2, 2, 2, 427, 428, 7, 49, 2, 2, 428, 429, 7, 49, 2, 2, 429, 430, 7, 49, 2, 2, 430, 434, 3, 2, 2, 2, 431, 433, 11, 2, 2, 2, 432, 431, 3, 2, 2, 2, 433, 436, 3, 2, 2, 2, 434, 435, 3, 2, 2, 2, 434, 432, 3, 2, 2, 2, 435, 437, 3, 2, 2, 2, 436, 434, 3, 2, 2, 2, 437, 438, 7, 12, 2, 2, 438, 134, 3, 2, 2, 2, 439, 440, 7, 49, 2, 2, 440, 441, 7, 49, 2, 2, 441, 445, 3, 2, 2, 2, 442, 444, 11, 2, 2, 2, 443, 442, 3, 2, 2, 2, 444, 447, 3, 2, 2, 2, 445, 446, 3, 2, 2, 2, 445, 443, 3, 2, 2, 2, 446, 448, 3, 2, 2, 2, 447, 445, 3, 2, 2, 2, 448, 449, 7, 12, 2, 2, 449, 450, 3, 2, 2, 2, 450, 451, 8, 68, 2, 2, 451, 136, 3, 2, 2, 2, 452, 453, 7, 49, 2, 2, 453, 454, 7, 44, 2, 2, 454, 458, 3, 2, 2, 2, 455, 457, 11, 2, 2, 2, 456, 455, 3, 2, 2, 2, 457, 460, 3, 2, 2, 2, 458, 459, 3, 2, 2, 2, 458, 456, 3, 2, 2, 2, 459, 461, 3, 2, 2, 2, 460, 458, 3, 2, 2, 2, 461, 462, 7, 44, 2, 2, 462, 463, 7, 49, 2, 2, 463, 464, 3, 2, 2, 2, 464, 465, 8, 69, 2, 2, 465, 138, 3, 2, 2, 2, 466, 468, 9, 8, 2, 2, 467, 466, 3, 2, 2, 2, 468, 469, 3, 2, 2, 2, 469, 467, 3, 2, 2, 2, 469, 470, 3, 2, 2, 2, 470, 471, 3, 2, 2, 2, 471, 472, 8, 70, 2, 2, 472, 140, 3, 2, 2, 2, 17, 2, 302, 316, 323, 325, 335, 337, 340, 416, 423, 425, 434, 445, 458, 469, 3, 8, 2, 2] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 2, 72, 490, 8, 1, 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, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 7, 41, 303, 10, 41, 12, 41, 14, 41, 306, 11, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 319, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 326, 10, 43, 12, 43, 14, 43, 329, 11, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 338, 10, 43, 12, 43, 14, 43, 341, 11, 43, 5, 43, 343, 10, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 53, 3, 53, 3, 54, 3, 54, 3, 55, 3, 55, 3, 56, 3, 56, 3, 57, 3, 57, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 64, 3, 64, 3, 65, 3, 65, 3, 66, 3, 66, 7, 66, 417, 10, 66, 12, 66, 14, 66, 420, 11, 66, 3, 66, 3, 66, 6, 66, 424, 10, 66, 13, 66, 14, 66, 425, 5, 66, 428, 10, 66, 3, 67, 3, 67, 7, 67, 432, 10, 67, 12, 67, 14, 67, 435, 11, 67, 3, 67, 3, 67, 6, 67, 439, 10, 67, 13, 67, 14, 67, 440, 5, 67, 443, 10, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 7, 68, 450, 10, 68, 12, 68, 14, 68, 453, 11, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 7, 69, 461, 10, 69, 12, 69, 14, 69, 464, 11, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 7, 70, 474, 10, 70, 12, 70, 14, 70, 477, 11, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 6, 71, 485, 10, 71, 13, 71, 14, 71, 486, 3, 71, 3, 71, 6, 304, 451, 462, 475, 2, 2, 72, 3, 2, 3, 5, 2, 4, 7, 2, 5, 9, 2, 6, 11, 2, 7, 13, 2, 8, 15, 2, 9, 17, 2, 10, 19, 2, 11, 21, 2, 12, 23, 2, 13, 25, 2, 14, 27, 2, 15, 29, 2, 16, 31, 2, 17, 33, 2, 18, 35, 2, 19, 37, 2, 20, 39, 2, 21, 41, 2, 22, 43, 2, 23, 45, 2, 24, 47, 2, 25, 49, 2, 26, 51, 2, 27, 53, 2, 28, 55, 2, 29, 57, 2, 30, 59, 2, 31, 61, 2, 32, 63, 2, 33, 65, 2, 34, 67, 2, 35, 69, 2, 36, 71, 2, 37, 73, 2, 38, 75, 2, 39, 77, 2, 40, 79, 2, 41, 81, 2, 42, 83, 2, 43, 85, 2, 44, 87, 2, 45, 89, 2, 46, 91, 2, 47, 93, 2, 48, 95, 2, 49, 97, 2, 50, 99, 2, 51, 101, 2, 52, 103, 2, 53, 105, 2, 54, 107, 2, 55, 109, 2, 56, 111, 2, 57, 113, 2, 58, 115, 2, 59, 117, 2, 60, 119, 2, 61, 121, 2, 62, 123, 2, 63, 125, 2, 64, 127, 2, 65, 129, 2, 66, 131, 2, 67, 133, 2, 68, 135, 2, 69, 137, 2, 70, 139, 2, 71, 141, 2, 72, 3, 2, 10, 3, 2, 51, 59, 3, 2, 50, 59, 5, 2, 50, 59, 67, 72, 99, 104, 3, 2, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 3, 2, 97, 97, 3, 2, 67, 92, 5, 2, 11, 12, 15, 15, 34, 34, 2, 507, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 3, 143, 3, 2, 2, 2, 5, 150, 3, 2, 2, 2, 7, 152, 3, 2, 2, 2, 9, 154, 3, 2, 2, 2, 11, 160, 3, 2, 2, 2, 13, 162, 3, 2, 2, 2, 15, 166, 3, 2, 2, 2, 17, 173, 3, 2, 2, 2, 19, 175, 3, 2, 2, 2, 21, 177, 3, 2, 2, 2, 23, 182, 3, 2, 2, 2, 25, 184, 3, 2, 2, 2, 27, 191, 3, 2, 2, 2, 29, 195, 3, 2, 2, 2, 31, 199, 3, 2, 2, 2, 33, 204, 3, 2, 2, 2, 35, 211, 3, 2, 2, 2, 37, 215, 3, 2, 2, 2, 39, 224, 3, 2, 2, 2, 41, 231, 3, 2, 2, 2, 43, 233, 3, 2, 2, 2, 45, 238, 3, 2, 2, 2, 47, 241, 3, 2, 2, 2, 49, 248, 3, 2, 2, 2, 51, 251, 3, 2, 2, 2, 53, 254, 3, 2, 2, 2, 55, 256, 3, 2, 2, 2, 57, 258, 3, 2, 2, 2, 59, 262, 3, 2, 2, 2, 61, 266, 3, 2, 2, 2, 63, 271, 3, 2, 2, 2, 65, 273, 3, 2, 2, 2, 67, 275, 3, 2, 2, 2, 69, 279, 3, 2, 2, 2, 71, 283, 3, 2, 2, 2, 73, 286, 3, 2, 2, 2, 75, 291, 3, 2, 2, 2, 77, 293, 3, 2, 2, 2, 79, 297, 3, 2, 2, 2, 81, 300, 3, 2, 2, 2, 83, 318, 3, 2, 2, 2, 85, 342, 3, 2, 2, 2, 87, 344, 3, 2, 2, 2, 89, 348, 3, 2, 2, 2, 91, 351, 3, 2, 2, 2, 93, 355, 3, 2, 2, 2, 95, 363, 3, 2, 2, 2, 97, 367, 3, 2, 2, 2, 99, 372, 3, 2, 2, 2, 101, 376, 3, 2, 2, 2, 103, 382, 3, 2, 2, 2, 105, 384, 3, 2, 2, 2, 107, 386, 3, 2, 2, 2, 109, 388, 3, 2, 2, 2, 111, 390, 3, 2, 2, 2, 113, 392, 3, 2, 2, 2, 115, 394, 3, 2, 2, 2, 117, 396, 3, 2, 2, 2, 119, 399, 3, 2, 2, 2, 121, 402, 3, 2, 2, 2, 123, 405, 3, 2, 2, 2, 125, 408, 3, 2, 2, 2, 127, 410, 3, 2, 2, 2, 129, 412, 3, 2, 2, 2, 131, 427, 3, 2, 2, 2, 133, 442, 3, 2, 2, 2, 135, 444, 3, 2, 2, 2, 137, 456, 3, 2, 2, 2, 139, 469, 3, 2, 2, 2, 141, 484, 3, 2, 2, 2, 143, 144, 7, 111, 2, 2, 144, 145, 7, 113, 2, 2, 145, 146, 7, 102, 2, 2, 146, 147, 7, 119, 2, 2, 147, 148, 7, 110, 2, 2, 148, 149, 7, 103, 2, 2, 149, 4, 3, 2, 2, 2, 150, 151, 7, 125, 2, 2, 151, 6, 3, 2, 2, 2, 152, 153, 7, 127, 2, 2, 153, 8, 3, 2, 2, 2, 154, 155, 7, 101, 2, 2, 155, 156, 7, 113, 2, 2, 156, 157, 7, 112, 2, 2, 157, 158, 7, 117, 2, 2, 158, 159, 7, 118, 2, 2, 159, 10, 3, 2, 2, 2, 160, 161, 7, 60, 2, 2, 161, 12, 3, 2, 2, 2, 162, 163, 7, 120, 2, 2, 163, 164, 7, 99, 2, 2, 164, 165, 7, 116, 2, 2, 165, 14, 3, 2, 2, 2, 166, 167, 7, 99, 2, 2, 167, 168, 7, 117, 2, 2, 168, 169, 7, 117, 2, 2, 169, 170, 7, 119, 2, 2, 170, 171, 7, 111, 2, 2, 171, 172, 7, 103, 2, 2, 172, 16, 3, 2, 2, 2, 173, 174, 7, 46, 2, 2, 174, 18, 3, 2, 2, 2, 175, 176, 7, 61, 2, 2, 176, 20, 3, 2, 2, 2, 177, 178, 7, 118, 2, 2, 178, 179, 7, 123, 2, 2, 179, 180, 7, 114, 2, 2, 180, 181, 7, 103, 2, 2, 181, 22, 3, 2, 2, 2, 182, 183, 7, 126, 2, 2, 183, 24, 3, 2, 2, 2, 184, 185, 7, 112, 2, 2, 185, 186, 7, 113, 2, 2, 186, 187, 7, 112, 2, 2, 187, 188, 7, 102, 2, 2, 188, 189, 7, 103, 2, 2, 189, 190, 7, 118, 2, 2, 190, 26, 3, 2, 2, 2, 191, 192, 7, 120, 2, 2, 192, 193, 7, 99, 2, 2, 193, 194, 7, 110, 2, 2, 194, 28, 3, 2, 2, 2, 195, 196, 7, 102, 2, 2, 196, 197, 7, 103, 2, 2, 197, 198, 7, 104, 2, 2, 198, 30, 3, 2, 2, 2, 199, 200, 7, 114, 2, 2, 200, 201, 7, 119, 2, 2, 201, 202, 7, 116, 2, 2, 202, 203, 7, 103, 2, 2, 203, 32, 3, 2, 2, 2, 204, 205, 7, 99, 2, 2, 205, 206, 7, 101, 2, 2, 206, 207, 7, 118, 2, 2, 207, 208, 7, 107, 2, 2, 208, 209, 7, 113, 2, 2, 209, 210, 7, 112, 2, 2, 210, 34, 3, 2, 2, 2, 211, 212, 7, 116, 2, 2, 212, 213, 7, 119, 2, 2, 213, 214, 7, 112, 2, 2, 214, 36, 3, 2, 2, 2, 215, 216, 7, 118, 2, 2, 216, 217, 7, 103, 2, 2, 217, 218, 7, 111, 2, 2, 218, 219, 7, 114, 2, 2, 219, 220, 7, 113, 2, 2, 220, 221, 7, 116, 2, 2, 221, 222, 7, 99, 2, 2, 222, 223, 7, 110, 2, 2, 223, 38, 3, 2, 2, 2, 224, 225, 7, 107, 2, 2, 225, 226, 7, 111, 2, 2, 226, 227, 7, 114, 2, 2, 227, 228, 7, 113, 2, 2, 228, 229, 7, 116, 2, 2, 229, 230, 7, 118, 2, 2, 230, 40, 3, 2, 2, 2, 231, 232, 7, 48, 2, 2, 232, 42, 3, 2, 2, 2, 233, 234, 7, 104, 2, 2, 234, 235, 7, 116, 2, 2, 235, 236, 7, 113, 2, 2, 236, 237, 7, 111, 2, 2, 237, 44, 3, 2, 2, 2, 238, 239, 7, 99, 2, 2, 239, 240, 7, 117, 2, 2, 240, 46, 3, 2, 2, 2, 241, 242, 7, 103, 2, 2, 242, 243, 7, 122, 2, 2, 243, 244, 7, 114, 2, 2, 244, 245, 7, 113, 2, 2, 245, 246, 7, 116, 2, 2, 246, 247, 7, 118, 2, 2, 247, 48, 3, 2, 2, 2, 248, 249, 7, 47, 2, 2, 249, 250, 7, 64, 2, 2, 250, 50, 3, 2, 2, 2, 251, 252, 7, 63, 2, 2, 252, 253, 7, 64, 2, 2, 253, 52, 3, 2, 2, 2, 254, 255, 7, 93, 2, 2, 255, 54, 3, 2, 2, 2, 256, 257, 7, 95, 2, 2, 257, 56, 3, 2, 2, 2, 258, 259, 7, 107, 2, 2, 259, 260, 7, 112, 2, 2, 260, 261, 7, 118, 2, 2, 261, 58, 3, 2, 2, 2, 262, 263, 7, 117, 2, 2, 263, 264, 7, 118, 2, 2, 264, 265, 7, 116, 2, 2, 265, 60, 3, 2, 2, 2, 266, 267, 7, 100, 2, 2, 267, 268, 7, 113, 2, 2, 268, 269, 7, 113, 2, 2, 269, 270, 7, 110, 2, 2, 270, 62, 3, 2, 2, 2, 271, 272, 7, 96, 2, 2, 272, 64, 3, 2, 2, 2, 273, 274, 7, 41, 2, 2, 274, 66, 3, 2, 2, 2, 275, 276, 7, 99, 2, 2, 276, 277, 7, 110, 2, 2, 277, 278, 7, 110, 2, 2, 278, 68, 3, 2, 2, 2, 279, 280, 7, 99, 2, 2, 280, 281, 7, 112, 2, 2, 281, 282, 7, 123, 2, 2, 282, 70, 3, 2, 2, 2, 283, 284, 7, 107, 2, 2, 284, 285, 7, 104, 2, 2, 285, 72, 3, 2, 2, 2, 286, 287, 7, 103, 2, 2, 287, 288, 7, 110, 2, 2, 288, 289, 7, 117, 2, 2, 289, 290, 7, 103, 2, 2, 290, 74, 3, 2, 2, 2, 291, 292, 7, 97, 2, 2, 292, 76, 3, 2, 2, 2, 293, 294, 7, 48, 2, 2, 294, 295, 7, 48, 2, 2, 295, 296, 7, 48, 2, 2, 296, 78, 3, 2, 2, 2, 297, 298, 7, 60, 2, 2, 298, 299, 7, 60, 2, 2, 299, 80, 3, 2, 2, 2, 300, 304, 7, 36, 2, 2, 301, 303, 11, 2, 2, 2, 302, 301, 3, 2, 2, 2, 303, 306, 3, 2, 2, 2, 304, 305, 3, 2, 2, 2, 304, 302, 3, 2, 2, 2, 305, 307, 3, 2, 2, 2, 306, 304, 3, 2, 2, 2, 307, 308, 7, 36, 2, 2, 308, 82, 3, 2, 2, 2, 309, 310, 7, 104, 2, 2, 310, 311, 7, 99, 2, 2, 311, 312, 7, 110, 2, 2, 312, 313, 7, 117, 2, 2, 313, 319, 7, 103, 2, 2, 314, 315, 7, 118, 2, 2, 315, 316, 7, 116, 2, 2, 316, 317, 7, 119, 2, 2, 317, 319, 7, 103, 2, 2, 318, 309, 3, 2, 2, 2, 318, 314, 3, 2, 2, 2, 319, 84, 3, 2, 2, 2, 320, 343, 7, 50, 2, 2, 321, 327, 9, 2, 2, 2, 322, 326, 9, 3, 2, 2, 323, 324, 7, 97, 2, 2, 324, 326, 9, 3, 2, 2, 325, 322, 3, 2, 2, 2, 325, 323, 3, 2, 2, 2, 326, 329, 3, 2, 2, 2, 327, 325, 3, 2, 2, 2, 327, 328, 3, 2, 2, 2, 328, 343, 3, 2, 2, 2, 329, 327, 3, 2, 2, 2, 330, 331, 7, 50, 2, 2, 331, 332, 7, 122, 2, 2, 332, 333, 3, 2, 2, 2, 333, 339, 9, 4, 2, 2, 334, 338, 9, 4, 2, 2, 335, 336, 7, 97, 2, 2, 336, 338, 9, 4, 2, 2, 337, 334, 3, 2, 2, 2, 337, 335, 3, 2, 2, 2, 338, 341, 3, 2, 2, 2, 339, 337, 3, 2, 2, 2, 339, 340, 3, 2, 2, 2, 340, 343, 3, 2, 2, 2, 341, 339, 3, 2, 2, 2, 342, 320, 3, 2, 2, 2, 342, 321, 3, 2, 2, 2, 342, 330, 3, 2, 2, 2, 343, 86, 3, 2, 2, 2, 344, 345, 7, 99, 2, 2, 345, 346, 7, 112, 2, 2, 346, 347, 7, 102, 2, 2, 347, 88, 3, 2, 2, 2, 348, 349, 7, 113, 2, 2, 349, 350, 7, 116, 2, 2, 350, 90, 3, 2, 2, 2, 351, 352, 7, 107, 2, 2, 352, 353, 7, 104, 2, 2, 353, 354, 7, 104, 2, 2, 354, 92, 3, 2, 2, 2, 355, 356, 7, 107, 2, 2, 356, 357, 7, 111, 2, 2, 357, 358, 7, 114, 2, 2, 358, 359, 7, 110, 2, 2, 359, 360, 7, 107, 2, 2, 360, 361, 7, 103, 2, 2, 361, 362, 7, 117, 2, 2, 362, 94, 3, 2, 2, 2, 363, 364, 7, 85, 2, 2, 364, 365, 7, 103, 2, 2, 365, 366, 7, 118, 2, 2, 366, 96, 3, 2, 2, 2, 367, 368, 7, 78, 2, 2, 368, 369, 7, 107, 2, 2, 369, 370, 7, 117, 2, 2, 370, 371, 7, 118, 2, 2, 371, 98, 3, 2, 2, 2, 372, 373, 7, 79, 2, 2, 373, 374, 7, 99, 2, 2, 374, 375, 7, 114, 2, 2, 375, 100, 3, 2, 2, 2, 376, 377, 7, 111, 2, 2, 377, 378, 7, 99, 2, 2, 378, 379, 7, 118, 2, 2, 379, 380, 7, 101, 2, 2, 380, 381, 7, 106, 2, 2, 381, 102, 3, 2, 2, 2, 382, 383, 7, 45, 2, 2, 383, 104, 3, 2, 2, 2, 384, 385, 7, 47, 2, 2, 385, 106, 3, 2, 2, 2, 386, 387, 7, 44, 2, 2, 387, 108, 3, 2, 2, 2, 388, 389, 7, 49, 2, 2, 389, 110, 3, 2, 2, 2, 390, 391, 7, 39, 2, 2, 391, 112, 3, 2, 2, 2, 392, 393, 7, 64, 2, 2, 393, 114, 3, 2, 2, 2, 394, 395, 7, 62, 2, 2, 395, 116, 3, 2, 2, 2, 396, 397, 7, 64, 2, 2, 397, 398, 7, 63, 2, 2, 398, 118, 3, 2, 2, 2, 399, 400, 7, 62, 2, 2, 400, 401, 7, 63, 2, 2, 401, 120, 3, 2, 2, 2, 402, 403, 7, 35, 2, 2, 403, 404, 7, 63, 2, 2, 404, 122, 3, 2, 2, 2, 405, 406, 7, 63, 2, 2, 406, 407, 7, 63, 2, 2, 407, 124, 3, 2, 2, 2, 408, 409, 7, 63, 2, 2, 409, 126, 3, 2, 2, 2, 410, 411, 7, 42, 2, 2, 411, 128, 3, 2, 2, 2, 412, 413, 7, 43, 2, 2, 413, 130, 3, 2, 2, 2, 414, 418, 9, 5, 2, 2, 415, 417, 9, 6, 2, 2, 416, 415, 3, 2, 2, 2, 417, 420, 3, 2, 2, 2, 418, 416, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 428, 3, 2, 2, 2, 420, 418, 3, 2, 2, 2, 421, 423, 9, 7, 2, 2, 422, 424, 9, 6, 2, 2, 423, 422, 3, 2, 2, 2, 424, 425, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 428, 3, 2, 2, 2, 427, 414, 3, 2, 2, 2, 427, 421, 3, 2, 2, 2, 428, 132, 3, 2, 2, 2, 429, 433, 9, 8, 2, 2, 430, 432, 9, 6, 2, 2, 431, 430, 3, 2, 2, 2, 432, 435, 3, 2, 2, 2, 433, 431, 3, 2, 2, 2, 433, 434, 3, 2, 2, 2, 434, 443, 3, 2, 2, 2, 435, 433, 3, 2, 2, 2, 436, 438, 9, 7, 2, 2, 437, 439, 9, 6, 2, 2, 438, 437, 3, 2, 2, 2, 439, 440, 3, 2, 2, 2, 440, 438, 3, 2, 2, 2, 440, 441, 3, 2, 2, 2, 441, 443, 3, 2, 2, 2, 442, 429, 3, 2, 2, 2, 442, 436, 3, 2, 2, 2, 443, 134, 3, 2, 2, 2, 444, 445, 7, 49, 2, 2, 445, 446, 7, 49, 2, 2, 446, 447, 7, 49, 2, 2, 447, 451, 3, 2, 2, 2, 448, 450, 11, 2, 2, 2, 449, 448, 3, 2, 2, 2, 450, 453, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 451, 449, 3, 2, 2, 2, 452, 454, 3, 2, 2, 2, 453, 451, 3, 2, 2, 2, 454, 455, 7, 12, 2, 2, 455, 136, 3, 2, 2, 2, 456, 457, 7, 49, 2, 2, 457, 458, 7, 49, 2, 2, 458, 462, 3, 2, 2, 2, 459, 461, 11, 2, 2, 2, 460, 459, 3, 2, 2, 2, 461, 464, 3, 2, 2, 2, 462, 463, 3, 2, 2, 2, 462, 460, 3, 2, 2, 2, 463, 465, 3, 2, 2, 2, 464, 462, 3, 2, 2, 2, 465, 466, 7, 12, 2, 2, 466, 467, 3, 2, 2, 2, 467, 468, 8, 69, 2, 2, 468, 138, 3, 2, 2, 2, 469, 470, 7, 49, 2, 2, 470, 471, 7, 44, 2, 2, 471, 475, 3, 2, 2, 2, 472, 474, 11, 2, 2, 2, 473, 472, 3, 2, 2, 2, 474, 477, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 475, 473, 3, 2, 2, 2, 476, 478, 3, 2, 2, 2, 477, 475, 3, 2, 2, 2, 478, 479, 7, 44, 2, 2, 479, 480, 7, 49, 2, 2, 480, 481, 3, 2, 2, 2, 481, 482, 8, 70, 2, 2, 482, 140, 3, 2, 2, 2, 483, 485, 9, 9, 2, 2, 484, 483, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 484, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 489, 8, 71, 2, 2, 489, 142, 3, 2, 2, 2, 20, 2, 304, 318, 325, 327, 337, 339, 342, 418, 425, 427, 433, 440, 442, 451, 462, 475, 486, 3, 8, 2, 2] \ No newline at end of file diff --git a/quint/src/generated/QuintLexer.tokens b/quint/src/generated/QuintLexer.tokens index 427758cd2..a3529881a 100644 --- a/quint/src/generated/QuintLexer.tokens +++ b/quint/src/generated/QuintLexer.tokens @@ -62,11 +62,12 @@ EQ=61 ASGN=62 LPAREN=63 RPAREN=64 -IDENTIFIER=65 -DOCCOMMENT=66 -LINE_COMMENT=67 -COMMENT=68 -WS=69 +LOW_ID=65 +CAP_ID=66 +DOCCOMMENT=67 +LINE_COMMENT=68 +COMMENT=69 +WS=70 'module'=1 '{'=2 '}'=3 diff --git a/quint/src/generated/QuintLexer.ts b/quint/src/generated/QuintLexer.ts index 96e3056d4..a2ccaf0ee 100644 --- a/quint/src/generated/QuintLexer.ts +++ b/quint/src/generated/QuintLexer.ts @@ -86,11 +86,12 @@ export class QuintLexer extends Lexer { public static readonly ASGN = 62; public static readonly LPAREN = 63; public static readonly RPAREN = 64; - public static readonly IDENTIFIER = 65; - public static readonly DOCCOMMENT = 66; - public static readonly LINE_COMMENT = 67; - public static readonly COMMENT = 68; - public static readonly WS = 69; + public static readonly LOW_ID = 65; + public static readonly CAP_ID = 66; + public static readonly DOCCOMMENT = 67; + public static readonly LINE_COMMENT = 68; + public static readonly COMMENT = 69; + public static readonly WS = 70; // tslint:disable:no-trailing-whitespace public static readonly channelNames: string[] = [ @@ -110,8 +111,8 @@ export class QuintLexer extends Lexer { "T__33", "T__34", "T__35", "T__36", "T__37", "T__38", "STRING", "BOOL", "INT", "AND", "OR", "IFF", "IMPLIES", "SET", "LIST", "MAP", "MATCH", "PLUS", "MINUS", "MUL", "DIV", "MOD", "GT", "LT", "GE", "LE", "NE", "EQ", "ASGN", - "LPAREN", "RPAREN", "IDENTIFIER", "DOCCOMMENT", "LINE_COMMENT", "COMMENT", - "WS", + "LPAREN", "RPAREN", "LOW_ID", "CAP_ID", "DOCCOMMENT", "LINE_COMMENT", + "COMMENT", "WS", ]; private static readonly _LITERAL_NAMES: Array = [ @@ -133,8 +134,8 @@ export class QuintLexer extends Lexer { undefined, undefined, undefined, undefined, undefined, "STRING", "BOOL", "INT", "AND", "OR", "IFF", "IMPLIES", "SET", "LIST", "MAP", "MATCH", "PLUS", "MINUS", "MUL", "DIV", "MOD", "GT", "LT", "GE", "LE", "NE", "EQ", "ASGN", - "LPAREN", "RPAREN", "IDENTIFIER", "DOCCOMMENT", "LINE_COMMENT", "COMMENT", - "WS", + "LPAREN", "RPAREN", "LOW_ID", "CAP_ID", "DOCCOMMENT", "LINE_COMMENT", + "COMMENT", "WS", ]; public static readonly VOCABULARY: Vocabulary = new VocabularyImpl(QuintLexer._LITERAL_NAMES, QuintLexer._SYMBOLIC_NAMES, []); @@ -167,7 +168,7 @@ export class QuintLexer extends Lexer { public get modeNames(): string[] { return QuintLexer.modeNames; } public static readonly _serializedATN: string = - "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x02G\u01D9\b\x01" + + "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x02H\u01EA\b\x01" + "\x04\x02\t\x02\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06" + "\x04\x07\t\x07\x04\b\t\b\x04\t\t\t\x04\n\t\n\x04\v\t\v\x04\f\t\f\x04\r" + "\t\r\x04\x0E\t\x0E\x04\x0F\t\x0F\x04\x10\t\x10\x04\x11\t\x11\x04\x12\t" + @@ -178,209 +179,219 @@ export class QuintLexer extends Lexer { "+\t+\x04,\t,\x04-\t-\x04.\t.\x04/\t/\x040\t0\x041\t1\x042\t2\x043\t3\x04" + "4\t4\x045\t5\x046\t6\x047\t7\x048\t8\x049\t9\x04:\t:\x04;\t;\x04<\t<\x04" + "=\t=\x04>\t>\x04?\t?\x04@\t@\x04A\tA\x04B\tB\x04C\tC\x04D\tD\x04E\tE\x04" + - "F\tF\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x03\x03" + - "\x03\x03\x04\x03\x04\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03" + - "\x06\x03\x06\x03\x07\x03\x07\x03\x07\x03\x07\x03\b\x03\b\x03\b\x03\b\x03" + - "\b\x03\b\x03\b\x03\t\x03\t\x03\n\x03\n\x03\v\x03\v\x03\v\x03\v\x03\v\x03" + - "\f\x03\f\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\x0E\x03\x0E\x03" + - "\x0E\x03\x0E\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x10\x03\x10\x03\x10\x03" + - "\x10\x03\x10\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03" + - "\x12\x03\x12\x03\x12\x03\x12\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03" + - "\x13\x03\x13\x03\x13\x03\x13\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03" + - "\x14\x03\x14\x03\x15\x03\x15\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03" + - "\x17\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x19\x03\x19\x03\x19\x03\x1A\x03\x1A\x03\x1A\x03\x1B\x03\x1B\x03" + - "\x1C\x03\x1C\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x03\x1E\x03\x1E\x03\x1E\x03" + - "\x1E\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03 \x03 \x03!\x03!\x03\"" + - "\x03\"\x03\"\x03\"\x03#\x03#\x03#\x03#\x03$\x03$\x03$\x03%\x03%\x03%\x03" + - "%\x03%\x03&\x03&\x03\'\x03\'\x03\'\x03\'\x03(\x03(\x03(\x03)\x03)\x07" + - ")\u012D\n)\f)\x0E)\u0130\v)\x03)\x03)\x03*\x03*\x03*\x03*\x03*\x03*\x03" + - "*\x03*\x03*\x05*\u013D\n*\x03+\x03+\x03+\x03+\x03+\x07+\u0144\n+\f+\x0E" + - "+\u0147\v+\x03+\x03+\x03+\x03+\x03+\x03+\x03+\x07+\u0150\n+\f+\x0E+\u0153" + - "\v+\x05+\u0155\n+\x03,\x03,\x03,\x03,\x03-\x03-\x03-\x03.\x03.\x03.\x03" + - ".\x03/\x03/\x03/\x03/\x03/\x03/\x03/\x03/\x030\x030\x030\x030\x031\x03" + - "1\x031\x031\x031\x032\x032\x032\x032\x033\x033\x033\x033\x033\x033\x03" + - "4\x034\x035\x035\x036\x036\x037\x037\x038\x038\x039\x039\x03:\x03:\x03" + - ";\x03;\x03;\x03<\x03<\x03<\x03=\x03=\x03=\x03>\x03>\x03>\x03?\x03?\x03" + - "@\x03@\x03A\x03A\x03B\x03B\x07B\u019F\nB\fB\x0EB\u01A2\vB\x03B\x03B\x06" + - "B\u01A6\nB\rB\x0EB\u01A7\x05B\u01AA\nB\x03C\x03C\x03C\x03C\x03C\x07C\u01B1" + - "\nC\fC\x0EC\u01B4\vC\x03C\x03C\x03D\x03D\x03D\x03D\x07D\u01BC\nD\fD\x0E" + - "D\u01BF\vD\x03D\x03D\x03D\x03D\x03E\x03E\x03E\x03E\x07E\u01C9\nE\fE\x0E" + - "E\u01CC\vE\x03E\x03E\x03E\x03E\x03E\x03F\x06F\u01D4\nF\rF\x0EF\u01D5\x03" + - "F\x03F\x06\u012E\u01B2\u01BD\u01CA\x02\x02G\x03\x02\x03\x05\x02\x04\x07" + - "\x02\x05\t\x02\x06\v\x02\x07\r\x02\b\x0F\x02\t\x11\x02\n\x13\x02\v\x15" + - "\x02\f\x17\x02\r\x19\x02\x0E\x1B\x02\x0F\x1D\x02\x10\x1F\x02\x11!\x02" + - "\x12#\x02\x13%\x02\x14\'\x02\x15)\x02\x16+\x02\x17-\x02\x18/\x02\x191" + - "\x02\x1A3\x02\x1B5\x02\x1C7\x02\x1D9\x02\x1E;\x02\x1F=\x02 ?\x02!A\x02" + - "\"C\x02#E\x02$G\x02%I\x02&K\x02\'M\x02(O\x02)Q\x02*S\x02+U\x02,W\x02-" + - "Y\x02.[\x02/]\x020_\x021a\x022c\x023e\x024g\x025i\x026k\x027m\x028o\x02" + - "9q\x02:s\x02;u\x02{\x02?}\x02@\x7F\x02A\x81\x02B\x83\x02" + - "C\x85\x02D\x87\x02E\x89\x02F\x8B\x02G\x03\x02\t\x03\x023;\x03\x022;\x05" + - "\x022;CHch\x04\x02C\\c|\x06\x022;C\\aac|\x03\x02aa\x05\x02\v\f\x0F\x0F" + - "\"\"\x02\u01E7\x02\x03\x03\x02\x02\x02\x02\x05\x03\x02\x02\x02\x02\x07" + - "\x03\x02\x02\x02\x02\t\x03\x02\x02\x02\x02\v\x03\x02\x02\x02\x02\r\x03" + - "\x02\x02\x02\x02\x0F\x03\x02\x02\x02\x02\x11\x03\x02\x02\x02\x02\x13\x03" + - "\x02\x02\x02\x02\x15\x03\x02\x02\x02\x02\x17\x03\x02\x02\x02\x02\x19\x03" + - "\x02\x02\x02\x02\x1B\x03\x02\x02\x02\x02\x1D\x03\x02\x02\x02\x02\x1F\x03" + - "\x02\x02\x02\x02!\x03\x02\x02\x02\x02#\x03\x02\x02\x02\x02%\x03\x02\x02" + - "\x02\x02\'\x03\x02\x02\x02\x02)\x03\x02\x02\x02\x02+\x03\x02\x02\x02\x02" + - "-\x03\x02\x02\x02\x02/\x03\x02\x02\x02\x021\x03\x02\x02\x02\x023\x03\x02" + - "\x02\x02\x025\x03\x02\x02\x02\x027\x03\x02\x02\x02\x029\x03\x02\x02\x02" + - "\x02;\x03\x02\x02\x02\x02=\x03\x02\x02\x02\x02?\x03\x02\x02\x02\x02A\x03" + - "\x02\x02\x02\x02C\x03\x02\x02\x02\x02E\x03\x02\x02\x02\x02G\x03\x02\x02" + - "\x02\x02I\x03\x02\x02\x02\x02K\x03\x02\x02\x02\x02M\x03\x02\x02\x02\x02" + - "O\x03\x02\x02\x02\x02Q\x03\x02\x02\x02\x02S\x03\x02\x02\x02\x02U\x03\x02" + - "\x02\x02\x02W\x03\x02\x02\x02\x02Y\x03\x02\x02\x02\x02[\x03\x02\x02\x02" + - "\x02]\x03\x02\x02\x02\x02_\x03\x02\x02\x02\x02a\x03\x02\x02\x02\x02c\x03" + - "\x02\x02\x02\x02e\x03\x02\x02\x02\x02g\x03\x02\x02\x02\x02i\x03\x02\x02" + - "\x02\x02k\x03\x02\x02\x02\x02m\x03\x02\x02\x02\x02o\x03\x02\x02\x02\x02" + - "q\x03\x02\x02\x02\x02s\x03\x02\x02\x02\x02u\x03\x02\x02\x02\x02w\x03\x02" + - "\x02\x02\x02y\x03\x02\x02\x02\x02{\x03\x02\x02\x02\x02}\x03\x02\x02\x02" + - "\x02\x7F\x03\x02\x02\x02\x02\x81\x03\x02\x02\x02\x02\x83\x03\x02\x02\x02" + - "\x02\x85\x03\x02\x02\x02\x02\x87\x03\x02\x02\x02\x02\x89\x03\x02\x02\x02" + - "\x02\x8B\x03\x02\x02\x02\x03\x8D\x03\x02\x02\x02\x05\x94\x03\x02\x02\x02" + - "\x07\x96\x03\x02\x02\x02\t\x98\x03\x02\x02\x02\v\x9E\x03\x02\x02\x02\r" + - "\xA0\x03\x02\x02\x02\x0F\xA4\x03\x02\x02\x02\x11\xAB\x03\x02\x02\x02\x13" + - "\xAD\x03\x02\x02\x02\x15\xAF\x03\x02\x02\x02\x17\xB4\x03\x02\x02\x02\x19" + - "\xB6\x03\x02\x02\x02\x1B\xBD\x03\x02\x02\x02\x1D\xC1\x03\x02\x02\x02\x1F" + - "\xC5\x03\x02\x02\x02!\xCA\x03\x02\x02\x02#\xD1\x03\x02\x02\x02%\xD5\x03" + - "\x02\x02\x02\'\xDE\x03\x02\x02\x02)\xE5\x03\x02\x02\x02+\xE7\x03\x02\x02" + - "\x02-\xEC\x03\x02\x02\x02/\xEF\x03\x02\x02\x021\xF6\x03\x02\x02\x023\xF9" + - "\x03\x02\x02\x025\xFC\x03\x02\x02\x027\xFE\x03\x02\x02\x029\u0100\x03" + - "\x02\x02\x02;\u0104\x03\x02\x02\x02=\u0108\x03\x02\x02\x02?\u010D\x03" + - "\x02\x02\x02A\u010F\x03\x02\x02\x02C\u0111\x03\x02\x02\x02E\u0115\x03" + - "\x02\x02\x02G\u0119\x03\x02\x02\x02I\u011C\x03\x02\x02\x02K\u0121\x03" + - "\x02\x02\x02M\u0123\x03\x02\x02\x02O\u0127\x03\x02\x02\x02Q\u012A\x03" + - "\x02\x02\x02S\u013C\x03\x02\x02\x02U\u0154\x03\x02\x02\x02W\u0156\x03" + - "\x02\x02\x02Y\u015A\x03\x02\x02\x02[\u015D\x03\x02\x02\x02]\u0161\x03" + - "\x02\x02\x02_\u0169\x03\x02\x02\x02a\u016D\x03\x02\x02\x02c\u0172\x03" + - "\x02\x02\x02e\u0176\x03\x02\x02\x02g\u017C\x03\x02\x02\x02i\u017E\x03" + - "\x02\x02\x02k\u0180\x03\x02\x02\x02m\u0182\x03\x02\x02\x02o\u0184\x03" + - "\x02\x02\x02q\u0186\x03\x02\x02\x02s\u0188\x03\x02\x02\x02u\u018A\x03" + - "\x02\x02\x02w\u018D\x03\x02\x02\x02y\u0190\x03\x02\x02\x02{\u0193\x03" + - "\x02\x02\x02}\u0196\x03\x02\x02\x02\x7F\u0198\x03\x02\x02\x02\x81\u019A" + - "\x03\x02\x02\x02\x83\u01A9\x03\x02\x02\x02\x85\u01AB\x03\x02\x02\x02\x87" + - "\u01B7\x03\x02\x02\x02\x89\u01C4\x03\x02\x02\x02\x8B\u01D3\x03\x02\x02" + - "\x02\x8D\x8E\x07o\x02\x02\x8E\x8F\x07q\x02\x02\x8F\x90\x07f\x02\x02\x90" + - "\x91\x07w\x02\x02\x91\x92\x07n\x02\x02\x92\x93\x07g\x02\x02\x93\x04\x03" + - "\x02\x02\x02\x94\x95\x07}\x02\x02\x95\x06\x03\x02\x02\x02\x96\x97\x07" + - "\x7F\x02\x02\x97\b\x03\x02\x02\x02\x98\x99\x07e\x02\x02\x99\x9A\x07q\x02" + - "\x02\x9A\x9B\x07p\x02\x02\x9B\x9C\x07u\x02\x02\x9C\x9D\x07v\x02\x02\x9D" + - "\n\x03\x02\x02\x02\x9E\x9F\x07<\x02\x02\x9F\f\x03\x02\x02\x02\xA0\xA1" + - "\x07x\x02\x02\xA1\xA2\x07c\x02\x02\xA2\xA3\x07t\x02\x02\xA3\x0E\x03\x02" + - "\x02\x02\xA4\xA5\x07c\x02\x02\xA5\xA6\x07u\x02\x02\xA6\xA7\x07u\x02\x02" + - "\xA7\xA8\x07w\x02\x02\xA8\xA9\x07o\x02\x02\xA9\xAA\x07g\x02\x02\xAA\x10" + - "\x03\x02\x02\x02\xAB\xAC\x07.\x02\x02\xAC\x12\x03\x02\x02\x02\xAD\xAE" + - "\x07=\x02\x02\xAE\x14\x03\x02\x02\x02\xAF\xB0\x07v\x02\x02\xB0\xB1\x07" + - "{\x02\x02\xB1\xB2\x07r\x02\x02\xB2\xB3\x07g\x02\x02\xB3\x16\x03\x02\x02" + - "\x02\xB4\xB5\x07~\x02\x02\xB5\x18\x03\x02\x02\x02\xB6\xB7\x07p\x02\x02" + - "\xB7\xB8\x07q\x02\x02\xB8\xB9\x07p\x02\x02\xB9\xBA\x07f\x02\x02\xBA\xBB" + - "\x07g\x02\x02\xBB\xBC\x07v\x02\x02\xBC\x1A\x03\x02\x02\x02\xBD\xBE\x07" + - "x\x02\x02\xBE\xBF\x07c\x02\x02\xBF\xC0\x07n\x02\x02\xC0\x1C\x03\x02\x02" + - "\x02\xC1\xC2\x07f\x02\x02\xC2\xC3\x07g\x02\x02\xC3\xC4\x07h\x02\x02\xC4" + - "\x1E\x03\x02\x02\x02\xC5\xC6\x07r\x02\x02\xC6\xC7\x07w\x02\x02\xC7\xC8" + - "\x07t\x02\x02\xC8\xC9\x07g\x02\x02\xC9 \x03\x02\x02\x02\xCA\xCB\x07c\x02" + - "\x02\xCB\xCC\x07e\x02\x02\xCC\xCD\x07v\x02\x02\xCD\xCE\x07k\x02\x02\xCE" + - "\xCF\x07q\x02\x02\xCF\xD0\x07p\x02\x02\xD0\"\x03\x02\x02\x02\xD1\xD2\x07" + - "t\x02\x02\xD2\xD3\x07w\x02\x02\xD3\xD4\x07p\x02\x02\xD4$\x03\x02\x02\x02" + - "\xD5\xD6\x07v\x02\x02\xD6\xD7\x07g\x02\x02\xD7\xD8\x07o\x02\x02\xD8\xD9" + - "\x07r\x02\x02\xD9\xDA\x07q\x02\x02\xDA\xDB\x07t\x02\x02\xDB\xDC\x07c\x02" + - "\x02\xDC\xDD\x07n\x02\x02\xDD&\x03\x02\x02\x02\xDE\xDF\x07k\x02\x02\xDF" + - "\xE0\x07o\x02\x02\xE0\xE1\x07r\x02\x02\xE1\xE2\x07q\x02\x02\xE2\xE3\x07" + - "t\x02\x02\xE3\xE4\x07v\x02\x02\xE4(\x03\x02\x02\x02\xE5\xE6\x070\x02\x02" + - "\xE6*\x03\x02\x02\x02\xE7\xE8\x07h\x02\x02\xE8\xE9\x07t\x02\x02\xE9\xEA" + - "\x07q\x02\x02\xEA\xEB\x07o\x02\x02\xEB,\x03\x02\x02\x02\xEC\xED\x07c\x02" + - "\x02\xED\xEE\x07u\x02\x02\xEE.\x03\x02\x02\x02\xEF\xF0\x07g\x02\x02\xF0" + - "\xF1\x07z\x02\x02\xF1\xF2\x07r\x02\x02\xF2\xF3\x07q\x02\x02\xF3\xF4\x07" + - "t\x02\x02\xF4\xF5\x07v\x02\x02\xF50\x03\x02\x02\x02\xF6\xF7\x07/\x02\x02" + - "\xF7\xF8\x07@\x02\x02\xF82\x03\x02\x02\x02\xF9\xFA\x07?\x02\x02\xFA\xFB" + - "\x07@\x02\x02\xFB4\x03\x02\x02\x02\xFC\xFD\x07]\x02\x02\xFD6\x03\x02\x02" + - "\x02\xFE\xFF\x07_\x02\x02\xFF8\x03\x02\x02\x02\u0100\u0101\x07k\x02\x02" + - "\u0101\u0102\x07p\x02\x02\u0102\u0103\x07v\x02\x02\u0103:\x03\x02\x02" + - "\x02\u0104\u0105\x07u\x02\x02\u0105\u0106\x07v\x02\x02\u0106\u0107\x07" + - "t\x02\x02\u0107<\x03\x02\x02\x02\u0108\u0109\x07d\x02\x02\u0109\u010A" + - "\x07q\x02\x02\u010A\u010B\x07q\x02\x02\u010B\u010C\x07n\x02\x02\u010C" + - ">\x03\x02\x02\x02\u010D\u010E\x07`\x02\x02\u010E@\x03\x02\x02\x02\u010F" + - "\u0110\x07)\x02\x02\u0110B\x03\x02\x02\x02\u0111\u0112\x07c\x02\x02\u0112" + - "\u0113\x07n\x02\x02\u0113\u0114\x07n\x02\x02\u0114D\x03\x02\x02\x02\u0115" + - "\u0116\x07c\x02\x02\u0116\u0117\x07p\x02\x02\u0117\u0118\x07{\x02\x02" + - "\u0118F\x03\x02\x02\x02\u0119\u011A\x07k\x02\x02\u011A\u011B\x07h\x02" + - "\x02\u011BH\x03\x02\x02\x02\u011C\u011D\x07g\x02\x02\u011D\u011E\x07n" + - "\x02\x02\u011E\u011F\x07u\x02\x02\u011F\u0120\x07g\x02\x02\u0120J\x03" + - "\x02\x02\x02\u0121\u0122\x07a\x02\x02\u0122L\x03\x02\x02\x02\u0123\u0124" + - "\x070\x02\x02\u0124\u0125\x070\x02\x02\u0125\u0126\x070\x02\x02\u0126" + - "N\x03\x02\x02\x02\u0127\u0128\x07<\x02\x02\u0128\u0129\x07<\x02\x02\u0129" + - "P\x03\x02\x02\x02\u012A\u012E\x07$\x02\x02\u012B\u012D\v\x02\x02\x02\u012C" + - "\u012B\x03\x02\x02\x02\u012D\u0130\x03\x02\x02\x02\u012E\u012F\x03\x02" + - "\x02\x02\u012E\u012C\x03\x02\x02\x02\u012F\u0131\x03\x02\x02\x02\u0130" + - "\u012E\x03\x02\x02\x02\u0131\u0132\x07$\x02\x02\u0132R\x03\x02\x02\x02" + - "\u0133\u0134\x07h\x02\x02\u0134\u0135\x07c\x02\x02\u0135\u0136\x07n\x02" + - "\x02\u0136\u0137\x07u\x02\x02\u0137\u013D\x07g\x02\x02\u0138\u0139\x07" + - "v\x02\x02\u0139\u013A\x07t\x02\x02\u013A\u013B\x07w\x02\x02\u013B\u013D" + - "\x07g\x02\x02\u013C\u0133\x03\x02\x02\x02\u013C\u0138\x03\x02\x02\x02" + - "\u013DT\x03\x02\x02\x02\u013E\u0155\x072\x02\x02\u013F\u0145\t\x02\x02" + - "\x02\u0140\u0144\t\x03\x02\x02\u0141\u0142\x07a\x02\x02\u0142\u0144\t" + - "\x03\x02\x02\u0143\u0140\x03\x02\x02\x02\u0143\u0141\x03\x02\x02\x02\u0144" + - "\u0147\x03\x02\x02\x02\u0145\u0143\x03\x02\x02\x02\u0145\u0146\x03\x02" + - "\x02\x02\u0146\u0155\x03\x02\x02\x02\u0147\u0145\x03\x02\x02\x02\u0148" + - "\u0149\x072\x02\x02\u0149\u014A\x07z\x02\x02\u014A\u014B\x03\x02\x02\x02" + - "\u014B\u0151\t\x04\x02\x02\u014C\u0150\t\x04\x02\x02\u014D\u014E\x07a" + - "\x02\x02\u014E\u0150\t\x04\x02\x02\u014F\u014C\x03\x02\x02\x02\u014F\u014D" + - "\x03\x02\x02\x02\u0150\u0153\x03\x02\x02\x02\u0151\u014F\x03\x02\x02\x02" + - "\u0151\u0152\x03\x02\x02\x02\u0152\u0155\x03\x02\x02\x02\u0153\u0151\x03" + - "\x02\x02\x02\u0154\u013E\x03\x02\x02\x02\u0154\u013F\x03\x02\x02\x02\u0154" + - "\u0148\x03\x02\x02\x02\u0155V\x03\x02\x02\x02\u0156\u0157\x07c\x02\x02" + - "\u0157\u0158\x07p\x02\x02\u0158\u0159\x07f\x02\x02\u0159X\x03\x02\x02" + - "\x02\u015A\u015B\x07q\x02\x02\u015B\u015C\x07t\x02\x02\u015CZ\x03\x02" + - "\x02\x02\u015D\u015E\x07k\x02\x02\u015E\u015F\x07h\x02\x02\u015F\u0160" + - "\x07h\x02\x02\u0160\\\x03\x02\x02\x02\u0161\u0162\x07k\x02\x02\u0162\u0163" + - "\x07o\x02\x02\u0163\u0164\x07r\x02\x02\u0164\u0165\x07n\x02\x02\u0165" + - "\u0166\x07k\x02\x02\u0166\u0167\x07g\x02\x02\u0167\u0168\x07u\x02\x02" + - "\u0168^\x03\x02\x02\x02\u0169\u016A\x07U\x02\x02\u016A\u016B\x07g\x02" + - "\x02\u016B\u016C\x07v\x02\x02\u016C`\x03\x02\x02\x02\u016D\u016E\x07N" + - "\x02\x02\u016E\u016F\x07k\x02\x02\u016F\u0170\x07u\x02\x02\u0170\u0171" + - "\x07v\x02\x02\u0171b\x03\x02\x02\x02\u0172\u0173\x07O\x02\x02\u0173\u0174" + - "\x07c\x02\x02\u0174\u0175\x07r\x02\x02\u0175d\x03\x02\x02\x02\u0176\u0177" + - "\x07o\x02\x02\u0177\u0178\x07c\x02\x02\u0178\u0179\x07v\x02\x02\u0179" + - "\u017A\x07e\x02\x02\u017A\u017B\x07j\x02\x02\u017Bf\x03\x02\x02\x02\u017C" + - "\u017D\x07-\x02\x02\u017Dh\x03\x02\x02\x02\u017E\u017F\x07/\x02\x02\u017F" + - "j\x03\x02\x02\x02\u0180\u0181\x07,\x02\x02\u0181l\x03\x02\x02\x02\u0182" + - "\u0183\x071\x02\x02\u0183n\x03\x02\x02\x02\u0184\u0185\x07\'\x02\x02\u0185" + - "p\x03\x02\x02\x02\u0186\u0187\x07@\x02\x02\u0187r\x03\x02\x02\x02\u0188" + - "\u0189\x07>\x02\x02\u0189t\x03\x02\x02\x02\u018A\u018B\x07@\x02\x02\u018B" + - "\u018C\x07?\x02\x02\u018Cv\x03\x02\x02\x02\u018D\u018E\x07>\x02\x02\u018E" + - "\u018F\x07?\x02\x02\u018Fx\x03\x02\x02\x02\u0190\u0191\x07#\x02\x02\u0191" + - "\u0192\x07?\x02\x02\u0192z\x03\x02\x02\x02\u0193\u0194\x07?\x02\x02\u0194" + - "\u0195\x07?\x02\x02\u0195|\x03\x02\x02\x02\u0196\u0197\x07?\x02\x02\u0197" + - "~\x03\x02\x02\x02\u0198\u0199\x07*\x02\x02\u0199\x80\x03\x02\x02\x02\u019A" + - "\u019B\x07+\x02\x02\u019B\x82\x03\x02\x02\x02\u019C\u01A0\t\x05\x02\x02" + - "\u019D\u019F\t\x06\x02\x02\u019E\u019D\x03\x02\x02\x02\u019F\u01A2\x03" + - "\x02\x02\x02\u01A0\u019E\x03\x02\x02\x02\u01A0\u01A1\x03\x02\x02\x02\u01A1" + - "\u01AA\x03\x02\x02\x02\u01A2\u01A0\x03\x02\x02\x02\u01A3\u01A5\t\x07\x02" + - "\x02\u01A4\u01A6\t\x06\x02\x02\u01A5\u01A4\x03\x02\x02\x02\u01A6\u01A7" + - "\x03\x02\x02\x02\u01A7\u01A5\x03\x02\x02\x02\u01A7\u01A8\x03\x02\x02\x02" + - "\u01A8\u01AA\x03\x02\x02\x02\u01A9\u019C\x03\x02\x02\x02\u01A9\u01A3\x03" + - "\x02\x02\x02\u01AA\x84\x03\x02\x02\x02\u01AB\u01AC\x071\x02\x02\u01AC" + - "\u01AD\x071\x02\x02\u01AD\u01AE\x071\x02\x02\u01AE\u01B2\x03\x02\x02\x02" + - "\u01AF\u01B1\v\x02\x02\x02\u01B0\u01AF\x03\x02\x02\x02\u01B1\u01B4\x03" + - "\x02\x02\x02\u01B2\u01B3\x03\x02\x02\x02\u01B2\u01B0\x03\x02\x02\x02\u01B3" + - "\u01B5\x03\x02\x02\x02\u01B4\u01B2\x03\x02\x02\x02\u01B5\u01B6\x07\f\x02" + - "\x02\u01B6\x86\x03\x02\x02\x02\u01B7\u01B8\x071\x02\x02\u01B8\u01B9\x07" + - "1\x02\x02\u01B9\u01BD\x03\x02\x02\x02\u01BA\u01BC\v\x02\x02\x02\u01BB" + - "\u01BA\x03\x02\x02\x02\u01BC\u01BF\x03\x02\x02\x02\u01BD\u01BE\x03\x02" + - "\x02\x02\u01BD\u01BB\x03\x02\x02\x02\u01BE\u01C0\x03\x02\x02\x02\u01BF" + - "\u01BD\x03\x02\x02\x02\u01C0\u01C1\x07\f\x02\x02\u01C1\u01C2\x03\x02\x02" + - "\x02\u01C2\u01C3\bD\x02\x02\u01C3\x88\x03\x02\x02\x02\u01C4\u01C5\x07" + - "1\x02\x02\u01C5\u01C6\x07,\x02\x02\u01C6\u01CA\x03\x02\x02\x02\u01C7\u01C9" + - "\v\x02\x02\x02\u01C8\u01C7\x03\x02\x02\x02\u01C9\u01CC\x03\x02\x02\x02" + - "\u01CA\u01CB\x03\x02\x02\x02\u01CA\u01C8\x03\x02\x02\x02\u01CB\u01CD\x03" + - "\x02\x02\x02\u01CC\u01CA\x03\x02\x02\x02\u01CD\u01CE\x07,\x02\x02\u01CE" + - "\u01CF\x071\x02\x02\u01CF\u01D0\x03\x02\x02\x02\u01D0\u01D1\bE\x02\x02" + - "\u01D1\x8A\x03\x02\x02\x02\u01D2\u01D4\t\b\x02\x02\u01D3\u01D2\x03\x02" + - "\x02\x02\u01D4\u01D5\x03\x02\x02\x02\u01D5\u01D3\x03\x02\x02\x02\u01D5" + - "\u01D6\x03\x02\x02\x02\u01D6\u01D7\x03\x02\x02\x02\u01D7\u01D8\bF\x02" + - "\x02\u01D8\x8C\x03\x02\x02\x02\x11\x02\u012E\u013C\u0143\u0145\u014F\u0151" + - "\u0154\u01A0\u01A7\u01A9\u01B2\u01BD\u01CA\u01D5\x03\b\x02\x02"; + "F\tF\x04G\tG\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" + + "\x03\x03\x03\x03\x04\x03\x04\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03" + + "\x05\x03\x06\x03\x06\x03\x07\x03\x07\x03\x07\x03\x07\x03\b\x03\b\x03\b" + + "\x03\b\x03\b\x03\b\x03\b\x03\t\x03\t\x03\n\x03\n\x03\v\x03\v\x03\v\x03" + + "\v\x03\v\x03\f\x03\f\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\x0E" + + "\x03\x0E\x03\x0E\x03\x0E\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x10\x03\x10" + + "\x03\x10\x03\x10\x03\x10\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11" + + "\x03\x11\x03\x12\x03\x12\x03\x12\x03\x12\x03\x13\x03\x13\x03\x13\x03\x13" + + "\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x14\x03\x14\x03\x14\x03\x14" + + "\x03\x14\x03\x14\x03\x14\x03\x15\x03\x15\x03\x16\x03\x16\x03\x16\x03\x16" + + "\x03\x16\x03\x17\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x19\x03\x19\x03\x19\x03\x1A\x03\x1A\x03\x1A\x03\x1B" + + "\x03\x1B\x03\x1C\x03\x1C\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x03\x1E\x03\x1E" + + "\x03\x1E\x03\x1E\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03 \x03 \x03" + + "!\x03!\x03\"\x03\"\x03\"\x03\"\x03#\x03#\x03#\x03#\x03$\x03$\x03$\x03" + + "%\x03%\x03%\x03%\x03%\x03&\x03&\x03\'\x03\'\x03\'\x03\'\x03(\x03(\x03" + + "(\x03)\x03)\x07)\u012F\n)\f)\x0E)\u0132\v)\x03)\x03)\x03*\x03*\x03*\x03" + + "*\x03*\x03*\x03*\x03*\x03*\x05*\u013F\n*\x03+\x03+\x03+\x03+\x03+\x07" + + "+\u0146\n+\f+\x0E+\u0149\v+\x03+\x03+\x03+\x03+\x03+\x03+\x03+\x07+\u0152" + + "\n+\f+\x0E+\u0155\v+\x05+\u0157\n+\x03,\x03,\x03,\x03,\x03-\x03-\x03-" + + "\x03.\x03.\x03.\x03.\x03/\x03/\x03/\x03/\x03/\x03/\x03/\x03/\x030\x03" + + "0\x030\x030\x031\x031\x031\x031\x031\x032\x032\x032\x032\x033\x033\x03" + + "3\x033\x033\x033\x034\x034\x035\x035\x036\x036\x037\x037\x038\x038\x03" + + "9\x039\x03:\x03:\x03;\x03;\x03;\x03<\x03<\x03<\x03=\x03=\x03=\x03>\x03" + + ">\x03>\x03?\x03?\x03@\x03@\x03A\x03A\x03B\x03B\x07B\u01A1\nB\fB\x0EB\u01A4" + + "\vB\x03B\x03B\x06B\u01A8\nB\rB\x0EB\u01A9\x05B\u01AC\nB\x03C\x03C\x07" + + "C\u01B0\nC\fC\x0EC\u01B3\vC\x03C\x03C\x06C\u01B7\nC\rC\x0EC\u01B8\x05" + + "C\u01BB\nC\x03D\x03D\x03D\x03D\x03D\x07D\u01C2\nD\fD\x0ED\u01C5\vD\x03" + + "D\x03D\x03E\x03E\x03E\x03E\x07E\u01CD\nE\fE\x0EE\u01D0\vE\x03E\x03E\x03" + + "E\x03E\x03F\x03F\x03F\x03F\x07F\u01DA\nF\fF\x0EF\u01DD\vF\x03F\x03F\x03" + + "F\x03F\x03F\x03G\x06G\u01E5\nG\rG\x0EG\u01E6\x03G\x03G\x06\u0130\u01C3" + + "\u01CE\u01DB\x02\x02H\x03\x02\x03\x05\x02\x04\x07\x02\x05\t\x02\x06\v" + + "\x02\x07\r\x02\b\x0F\x02\t\x11\x02\n\x13\x02\v\x15\x02\f\x17\x02\r\x19" + + "\x02\x0E\x1B\x02\x0F\x1D\x02\x10\x1F\x02\x11!\x02\x12#\x02\x13%\x02\x14" + + "\'\x02\x15)\x02\x16+\x02\x17-\x02\x18/\x02\x191\x02\x1A3\x02\x1B5\x02" + + "\x1C7\x02\x1D9\x02\x1E;\x02\x1F=\x02 ?\x02!A\x02\"C\x02#E\x02$G\x02%I" + + "\x02&K\x02\'M\x02(O\x02)Q\x02*S\x02+U\x02,W\x02-Y\x02.[\x02/]\x020_\x02" + + "1a\x022c\x023e\x024g\x025i\x026k\x027m\x028o\x029q\x02:s\x02;u\x02{\x02?}\x02@\x7F\x02A\x81\x02B\x83\x02C\x85\x02D\x87\x02E\x89\x02" + + "F\x8B\x02G\x8D\x02H\x03\x02\n\x03\x023;\x03\x022;\x05\x022;CHch\x03\x02" + + "c|\x06\x022;C\\aac|\x03\x02aa\x03\x02C\\\x05\x02\v\f\x0F\x0F\"\"\x02\u01FB" + + "\x02\x03\x03\x02\x02\x02\x02\x05\x03\x02\x02\x02\x02\x07\x03\x02\x02\x02" + + "\x02\t\x03\x02\x02\x02\x02\v\x03\x02\x02\x02\x02\r\x03\x02\x02\x02\x02" + + "\x0F\x03\x02\x02\x02\x02\x11\x03\x02\x02\x02\x02\x13\x03\x02\x02\x02\x02" + + "\x15\x03\x02\x02\x02\x02\x17\x03\x02\x02\x02\x02\x19\x03\x02\x02\x02\x02" + + "\x1B\x03\x02\x02\x02\x02\x1D\x03\x02\x02\x02\x02\x1F\x03\x02\x02\x02\x02" + + "!\x03\x02\x02\x02\x02#\x03\x02\x02\x02\x02%\x03\x02\x02\x02\x02\'\x03" + + "\x02\x02\x02\x02)\x03\x02\x02\x02\x02+\x03\x02\x02\x02\x02-\x03\x02\x02" + + "\x02\x02/\x03\x02\x02\x02\x021\x03\x02\x02\x02\x023\x03\x02\x02\x02\x02" + + "5\x03\x02\x02\x02\x027\x03\x02\x02\x02\x029\x03\x02\x02\x02\x02;\x03\x02" + + "\x02\x02\x02=\x03\x02\x02\x02\x02?\x03\x02\x02\x02\x02A\x03\x02\x02\x02" + + "\x02C\x03\x02\x02\x02\x02E\x03\x02\x02\x02\x02G\x03\x02\x02\x02\x02I\x03" + + "\x02\x02\x02\x02K\x03\x02\x02\x02\x02M\x03\x02\x02\x02\x02O\x03\x02\x02" + + "\x02\x02Q\x03\x02\x02\x02\x02S\x03\x02\x02\x02\x02U\x03\x02\x02\x02\x02" + + "W\x03\x02\x02\x02\x02Y\x03\x02\x02\x02\x02[\x03\x02\x02\x02\x02]\x03\x02" + + "\x02\x02\x02_\x03\x02\x02\x02\x02a\x03\x02\x02\x02\x02c\x03\x02\x02\x02" + + "\x02e\x03\x02\x02\x02\x02g\x03\x02\x02\x02\x02i\x03\x02\x02\x02\x02k\x03" + + "\x02\x02\x02\x02m\x03\x02\x02\x02\x02o\x03\x02\x02\x02\x02q\x03\x02\x02" + + "\x02\x02s\x03\x02\x02\x02\x02u\x03\x02\x02\x02\x02w\x03\x02\x02\x02\x02" + + "y\x03\x02\x02\x02\x02{\x03\x02\x02\x02\x02}\x03\x02\x02\x02\x02\x7F\x03" + + "\x02\x02\x02\x02\x81\x03\x02\x02\x02\x02\x83\x03\x02\x02\x02\x02\x85\x03" + + "\x02\x02\x02\x02\x87\x03\x02\x02\x02\x02\x89\x03\x02\x02\x02\x02\x8B\x03" + + "\x02\x02\x02\x02\x8D\x03\x02\x02\x02\x03\x8F\x03\x02\x02\x02\x05\x96\x03" + + "\x02\x02\x02\x07\x98\x03\x02\x02\x02\t\x9A\x03\x02\x02\x02\v\xA0\x03\x02" + + "\x02\x02\r\xA2\x03\x02\x02\x02\x0F\xA6\x03\x02\x02\x02\x11\xAD\x03\x02" + + "\x02\x02\x13\xAF\x03\x02\x02\x02\x15\xB1\x03\x02\x02\x02\x17\xB6\x03\x02" + + "\x02\x02\x19\xB8\x03\x02\x02\x02\x1B\xBF\x03\x02\x02\x02\x1D\xC3\x03\x02" + + "\x02\x02\x1F\xC7\x03\x02\x02\x02!\xCC\x03\x02\x02\x02#\xD3\x03\x02\x02" + + "\x02%\xD7\x03\x02\x02\x02\'\xE0\x03\x02\x02\x02)\xE7\x03\x02\x02\x02+" + + "\xE9\x03\x02\x02\x02-\xEE\x03\x02\x02\x02/\xF1\x03\x02\x02\x021\xF8\x03" + + "\x02\x02\x023\xFB\x03\x02\x02\x025\xFE\x03\x02\x02\x027\u0100\x03\x02" + + "\x02\x029\u0102\x03\x02\x02\x02;\u0106\x03\x02\x02\x02=\u010A\x03\x02" + + "\x02\x02?\u010F\x03\x02\x02\x02A\u0111\x03\x02\x02\x02C\u0113\x03\x02" + + "\x02\x02E\u0117\x03\x02\x02\x02G\u011B\x03\x02\x02\x02I\u011E\x03\x02" + + "\x02\x02K\u0123\x03\x02\x02\x02M\u0125\x03\x02\x02\x02O\u0129\x03\x02" + + "\x02\x02Q\u012C\x03\x02\x02\x02S\u013E\x03\x02\x02\x02U\u0156\x03\x02" + + "\x02\x02W\u0158\x03\x02\x02\x02Y\u015C\x03\x02\x02\x02[\u015F\x03\x02" + + "\x02\x02]\u0163\x03\x02\x02\x02_\u016B\x03\x02\x02\x02a\u016F\x03\x02" + + "\x02\x02c\u0174\x03\x02\x02\x02e\u0178\x03\x02\x02\x02g\u017E\x03\x02" + + "\x02\x02i\u0180\x03\x02\x02\x02k\u0182\x03\x02\x02\x02m\u0184\x03\x02" + + "\x02\x02o\u0186\x03\x02\x02\x02q\u0188\x03\x02\x02\x02s\u018A\x03\x02" + + "\x02\x02u\u018C\x03\x02\x02\x02w\u018F\x03\x02\x02\x02y\u0192\x03\x02" + + "\x02\x02{\u0195\x03\x02\x02\x02}\u0198\x03\x02\x02\x02\x7F\u019A\x03\x02" + + "\x02\x02\x81\u019C\x03\x02\x02\x02\x83\u01AB\x03\x02\x02\x02\x85\u01BA" + + "\x03\x02\x02\x02\x87\u01BC\x03\x02\x02\x02\x89\u01C8\x03\x02\x02\x02\x8B" + + "\u01D5\x03\x02\x02\x02\x8D\u01E4\x03\x02\x02\x02\x8F\x90\x07o\x02\x02" + + "\x90\x91\x07q\x02\x02\x91\x92\x07f\x02\x02\x92\x93\x07w\x02\x02\x93\x94" + + "\x07n\x02\x02\x94\x95\x07g\x02\x02\x95\x04\x03\x02\x02\x02\x96\x97\x07" + + "}\x02\x02\x97\x06\x03\x02\x02\x02\x98\x99\x07\x7F\x02\x02\x99\b\x03\x02" + + "\x02\x02\x9A\x9B\x07e\x02\x02\x9B\x9C\x07q\x02\x02\x9C\x9D\x07p\x02\x02" + + "\x9D\x9E\x07u\x02\x02\x9E\x9F\x07v\x02\x02\x9F\n\x03\x02\x02\x02\xA0\xA1" + + "\x07<\x02\x02\xA1\f\x03\x02\x02\x02\xA2\xA3\x07x\x02\x02\xA3\xA4\x07c" + + "\x02\x02\xA4\xA5\x07t\x02\x02\xA5\x0E\x03\x02\x02\x02\xA6\xA7\x07c\x02" + + "\x02\xA7\xA8\x07u\x02\x02\xA8\xA9\x07u\x02\x02\xA9\xAA\x07w\x02\x02\xAA" + + "\xAB\x07o\x02\x02\xAB\xAC\x07g\x02\x02\xAC\x10\x03\x02\x02\x02\xAD\xAE" + + "\x07.\x02\x02\xAE\x12\x03\x02\x02\x02\xAF\xB0\x07=\x02\x02\xB0\x14\x03" + + "\x02\x02\x02\xB1\xB2\x07v\x02\x02\xB2\xB3\x07{\x02\x02\xB3\xB4\x07r\x02" + + "\x02\xB4\xB5\x07g\x02\x02\xB5\x16\x03\x02\x02\x02\xB6\xB7\x07~\x02\x02" + + "\xB7\x18\x03\x02\x02\x02\xB8\xB9\x07p\x02\x02\xB9\xBA\x07q\x02\x02\xBA" + + "\xBB\x07p\x02\x02\xBB\xBC\x07f\x02\x02\xBC\xBD\x07g\x02\x02\xBD\xBE\x07" + + "v\x02\x02\xBE\x1A\x03\x02\x02\x02\xBF\xC0\x07x\x02\x02\xC0\xC1\x07c\x02" + + "\x02\xC1\xC2\x07n\x02\x02\xC2\x1C\x03\x02\x02\x02\xC3\xC4\x07f\x02\x02" + + "\xC4\xC5\x07g\x02\x02\xC5\xC6\x07h\x02\x02\xC6\x1E\x03\x02\x02\x02\xC7" + + "\xC8\x07r\x02\x02\xC8\xC9\x07w\x02\x02\xC9\xCA\x07t\x02\x02\xCA\xCB\x07" + + "g\x02\x02\xCB \x03\x02\x02\x02\xCC\xCD\x07c\x02\x02\xCD\xCE\x07e\x02\x02" + + "\xCE\xCF\x07v\x02\x02\xCF\xD0\x07k\x02\x02\xD0\xD1\x07q\x02\x02\xD1\xD2" + + "\x07p\x02\x02\xD2\"\x03\x02\x02\x02\xD3\xD4\x07t\x02\x02\xD4\xD5\x07w" + + "\x02\x02\xD5\xD6\x07p\x02\x02\xD6$\x03\x02\x02\x02\xD7\xD8\x07v\x02\x02" + + "\xD8\xD9\x07g\x02\x02\xD9\xDA\x07o\x02\x02\xDA\xDB\x07r\x02\x02\xDB\xDC" + + "\x07q\x02\x02\xDC\xDD\x07t\x02\x02\xDD\xDE\x07c\x02\x02\xDE\xDF\x07n\x02" + + "\x02\xDF&\x03\x02\x02\x02\xE0\xE1\x07k\x02\x02\xE1\xE2\x07o\x02\x02\xE2" + + "\xE3\x07r\x02\x02\xE3\xE4\x07q\x02\x02\xE4\xE5\x07t\x02\x02\xE5\xE6\x07" + + "v\x02\x02\xE6(\x03\x02\x02\x02\xE7\xE8\x070\x02\x02\xE8*\x03\x02\x02\x02" + + "\xE9\xEA\x07h\x02\x02\xEA\xEB\x07t\x02\x02\xEB\xEC\x07q\x02\x02\xEC\xED" + + "\x07o\x02\x02\xED,\x03\x02\x02\x02\xEE\xEF\x07c\x02\x02\xEF\xF0\x07u\x02" + + "\x02\xF0.\x03\x02\x02\x02\xF1\xF2\x07g\x02\x02\xF2\xF3\x07z\x02\x02\xF3" + + "\xF4\x07r\x02\x02\xF4\xF5\x07q\x02\x02\xF5\xF6\x07t\x02\x02\xF6\xF7\x07" + + "v\x02\x02\xF70\x03\x02\x02\x02\xF8\xF9\x07/\x02\x02\xF9\xFA\x07@\x02\x02" + + "\xFA2\x03\x02\x02\x02\xFB\xFC\x07?\x02\x02\xFC\xFD\x07@\x02\x02\xFD4\x03" + + "\x02\x02\x02\xFE\xFF\x07]\x02\x02\xFF6\x03\x02\x02\x02\u0100\u0101\x07" + + "_\x02\x02\u01018\x03\x02\x02\x02\u0102\u0103\x07k\x02\x02\u0103\u0104" + + "\x07p\x02\x02\u0104\u0105\x07v\x02\x02\u0105:\x03\x02\x02\x02\u0106\u0107" + + "\x07u\x02\x02\u0107\u0108\x07v\x02\x02\u0108\u0109\x07t\x02\x02\u0109" + + "<\x03\x02\x02\x02\u010A\u010B\x07d\x02\x02\u010B\u010C\x07q\x02\x02\u010C" + + "\u010D\x07q\x02\x02\u010D\u010E\x07n\x02\x02\u010E>\x03\x02\x02\x02\u010F" + + "\u0110\x07`\x02\x02\u0110@\x03\x02\x02\x02\u0111\u0112\x07)\x02\x02\u0112" + + "B\x03\x02\x02\x02\u0113\u0114\x07c\x02\x02\u0114\u0115\x07n\x02\x02\u0115" + + "\u0116\x07n\x02\x02\u0116D\x03\x02\x02\x02\u0117\u0118\x07c\x02\x02\u0118" + + "\u0119\x07p\x02\x02\u0119\u011A\x07{\x02\x02\u011AF\x03\x02\x02\x02\u011B" + + "\u011C\x07k\x02\x02\u011C\u011D\x07h\x02\x02\u011DH\x03\x02\x02\x02\u011E" + + "\u011F\x07g\x02\x02\u011F\u0120\x07n\x02\x02\u0120\u0121\x07u\x02\x02" + + "\u0121\u0122\x07g\x02\x02\u0122J\x03\x02\x02\x02\u0123\u0124\x07a\x02" + + "\x02\u0124L\x03\x02\x02\x02\u0125\u0126\x070\x02\x02\u0126\u0127\x070" + + "\x02\x02\u0127\u0128\x070\x02\x02\u0128N\x03\x02\x02\x02\u0129\u012A\x07" + + "<\x02\x02\u012A\u012B\x07<\x02\x02\u012BP\x03\x02\x02\x02\u012C\u0130" + + "\x07$\x02\x02\u012D\u012F\v\x02\x02\x02\u012E\u012D\x03\x02\x02\x02\u012F" + + "\u0132\x03\x02\x02\x02\u0130\u0131\x03\x02\x02\x02\u0130\u012E\x03\x02" + + "\x02\x02\u0131\u0133\x03\x02\x02\x02\u0132\u0130\x03\x02\x02\x02\u0133" + + "\u0134\x07$\x02\x02\u0134R\x03\x02\x02\x02\u0135\u0136\x07h\x02\x02\u0136" + + "\u0137\x07c\x02\x02\u0137\u0138\x07n\x02\x02\u0138\u0139\x07u\x02\x02" + + "\u0139\u013F\x07g\x02\x02\u013A\u013B\x07v\x02\x02\u013B\u013C\x07t\x02" + + "\x02\u013C\u013D\x07w\x02\x02\u013D\u013F\x07g\x02\x02\u013E\u0135\x03" + + "\x02\x02\x02\u013E\u013A\x03\x02\x02\x02\u013FT\x03\x02\x02\x02\u0140" + + "\u0157\x072\x02\x02\u0141\u0147\t\x02\x02\x02\u0142\u0146\t\x03\x02\x02" + + "\u0143\u0144\x07a\x02\x02\u0144\u0146\t\x03\x02\x02\u0145\u0142\x03\x02" + + "\x02\x02\u0145\u0143\x03\x02\x02\x02\u0146\u0149\x03\x02\x02\x02\u0147" + + "\u0145\x03\x02\x02\x02\u0147\u0148\x03\x02\x02\x02\u0148\u0157\x03\x02" + + "\x02\x02\u0149\u0147\x03\x02\x02\x02\u014A\u014B\x072\x02\x02\u014B\u014C" + + "\x07z\x02\x02\u014C\u014D\x03\x02\x02\x02\u014D\u0153\t\x04\x02\x02\u014E" + + "\u0152\t\x04\x02\x02\u014F\u0150\x07a\x02\x02\u0150\u0152\t\x04\x02\x02" + + "\u0151\u014E\x03\x02\x02\x02\u0151\u014F\x03\x02\x02\x02\u0152\u0155\x03" + + "\x02\x02\x02\u0153\u0151\x03\x02\x02\x02\u0153\u0154\x03\x02\x02\x02\u0154" + + "\u0157\x03\x02\x02\x02\u0155\u0153\x03\x02\x02\x02\u0156\u0140\x03\x02" + + "\x02\x02\u0156\u0141\x03\x02\x02\x02\u0156\u014A\x03\x02\x02\x02\u0157" + + "V\x03\x02\x02\x02\u0158\u0159\x07c\x02\x02\u0159\u015A\x07p\x02\x02\u015A" + + "\u015B\x07f\x02\x02\u015BX\x03\x02\x02\x02\u015C\u015D\x07q\x02\x02\u015D" + + "\u015E\x07t\x02\x02\u015EZ\x03\x02\x02\x02\u015F\u0160\x07k\x02\x02\u0160" + + "\u0161\x07h\x02\x02\u0161\u0162\x07h\x02\x02\u0162\\\x03\x02\x02\x02\u0163" + + "\u0164\x07k\x02\x02\u0164\u0165\x07o\x02\x02\u0165\u0166\x07r\x02\x02" + + "\u0166\u0167\x07n\x02\x02\u0167\u0168\x07k\x02\x02\u0168\u0169\x07g\x02" + + "\x02\u0169\u016A\x07u\x02\x02\u016A^\x03\x02\x02\x02\u016B\u016C\x07U" + + "\x02\x02\u016C\u016D\x07g\x02\x02\u016D\u016E\x07v\x02\x02\u016E`\x03" + + "\x02\x02\x02\u016F\u0170\x07N\x02\x02\u0170\u0171\x07k\x02\x02\u0171\u0172" + + "\x07u\x02\x02\u0172\u0173\x07v\x02\x02\u0173b\x03\x02\x02\x02\u0174\u0175" + + "\x07O\x02\x02\u0175\u0176\x07c\x02\x02\u0176\u0177\x07r\x02\x02\u0177" + + "d\x03\x02\x02\x02\u0178\u0179\x07o\x02\x02\u0179\u017A\x07c\x02\x02\u017A" + + "\u017B\x07v\x02\x02\u017B\u017C\x07e\x02\x02\u017C\u017D\x07j\x02\x02" + + "\u017Df\x03\x02\x02\x02\u017E\u017F\x07-\x02\x02\u017Fh\x03\x02\x02\x02" + + "\u0180\u0181\x07/\x02\x02\u0181j\x03\x02\x02\x02\u0182\u0183\x07,\x02" + + "\x02\u0183l\x03\x02\x02\x02\u0184\u0185\x071\x02\x02\u0185n\x03\x02\x02" + + "\x02\u0186\u0187\x07\'\x02\x02\u0187p\x03\x02\x02\x02\u0188\u0189\x07" + + "@\x02\x02\u0189r\x03\x02\x02\x02\u018A\u018B\x07>\x02\x02\u018Bt\x03\x02" + + "\x02\x02\u018C\u018D\x07@\x02\x02\u018D\u018E\x07?\x02\x02\u018Ev\x03" + + "\x02\x02\x02\u018F\u0190\x07>\x02\x02\u0190\u0191\x07?\x02\x02\u0191x" + + "\x03\x02\x02\x02\u0192\u0193\x07#\x02\x02\u0193\u0194\x07?\x02\x02\u0194" + + "z\x03\x02\x02\x02\u0195\u0196\x07?\x02\x02\u0196\u0197\x07?\x02\x02\u0197" + + "|\x03\x02\x02\x02\u0198\u0199\x07?\x02\x02\u0199~\x03\x02\x02\x02\u019A" + + "\u019B\x07*\x02\x02\u019B\x80\x03\x02\x02\x02\u019C\u019D\x07+\x02\x02" + + "\u019D\x82\x03\x02\x02\x02\u019E\u01A2\t\x05\x02\x02\u019F\u01A1\t\x06" + + "\x02\x02\u01A0\u019F\x03\x02\x02\x02\u01A1\u01A4\x03\x02\x02\x02\u01A2" + + "\u01A0\x03\x02\x02\x02\u01A2\u01A3\x03\x02\x02\x02\u01A3\u01AC\x03\x02" + + "\x02\x02\u01A4\u01A2\x03\x02\x02\x02\u01A5\u01A7\t\x07\x02\x02\u01A6\u01A8" + + "\t\x06\x02\x02\u01A7\u01A6\x03\x02\x02\x02\u01A8\u01A9\x03\x02\x02\x02" + + "\u01A9\u01A7\x03\x02\x02\x02\u01A9\u01AA\x03\x02\x02\x02\u01AA\u01AC\x03" + + "\x02\x02\x02\u01AB\u019E\x03\x02\x02\x02\u01AB\u01A5\x03\x02\x02\x02\u01AC" + + "\x84\x03\x02\x02\x02\u01AD\u01B1\t\b\x02\x02\u01AE\u01B0\t\x06\x02\x02" + + "\u01AF\u01AE\x03\x02\x02\x02\u01B0\u01B3\x03\x02\x02\x02\u01B1\u01AF\x03" + + "\x02\x02\x02\u01B1\u01B2\x03\x02\x02\x02\u01B2\u01BB\x03\x02\x02\x02\u01B3" + + "\u01B1\x03\x02\x02\x02\u01B4\u01B6\t\x07\x02\x02\u01B5\u01B7\t\x06\x02" + + "\x02\u01B6\u01B5\x03\x02\x02\x02\u01B7\u01B8\x03\x02\x02\x02\u01B8\u01B6" + + "\x03\x02\x02\x02\u01B8\u01B9\x03\x02\x02\x02\u01B9\u01BB\x03\x02\x02\x02" + + "\u01BA\u01AD\x03\x02\x02\x02\u01BA\u01B4\x03\x02\x02\x02\u01BB\x86\x03" + + "\x02\x02\x02\u01BC\u01BD\x071\x02\x02\u01BD\u01BE\x071\x02\x02\u01BE\u01BF" + + "\x071\x02\x02\u01BF\u01C3\x03\x02\x02\x02\u01C0\u01C2\v\x02\x02\x02\u01C1" + + "\u01C0\x03\x02\x02\x02\u01C2\u01C5\x03\x02\x02\x02\u01C3\u01C4\x03\x02" + + "\x02\x02\u01C3\u01C1\x03\x02\x02\x02\u01C4\u01C6\x03\x02\x02\x02\u01C5" + + "\u01C3\x03\x02\x02\x02\u01C6\u01C7\x07\f\x02\x02\u01C7\x88\x03\x02\x02" + + "\x02\u01C8\u01C9\x071\x02\x02\u01C9\u01CA\x071\x02\x02\u01CA\u01CE\x03" + + "\x02\x02\x02\u01CB\u01CD\v\x02\x02\x02\u01CC\u01CB\x03\x02\x02\x02\u01CD" + + "\u01D0\x03\x02\x02\x02\u01CE\u01CF\x03\x02\x02\x02\u01CE\u01CC\x03\x02" + + "\x02\x02\u01CF\u01D1\x03\x02\x02\x02\u01D0\u01CE\x03\x02\x02\x02\u01D1" + + "\u01D2\x07\f\x02\x02\u01D2\u01D3\x03\x02\x02\x02\u01D3\u01D4\bE\x02\x02" + + "\u01D4\x8A\x03\x02\x02\x02\u01D5\u01D6\x071\x02\x02\u01D6\u01D7\x07,\x02" + + "\x02\u01D7\u01DB\x03\x02\x02\x02\u01D8\u01DA\v\x02\x02\x02\u01D9\u01D8" + + "\x03\x02\x02\x02\u01DA\u01DD\x03\x02\x02\x02\u01DB\u01DC\x03\x02\x02\x02" + + "\u01DB\u01D9\x03\x02\x02\x02\u01DC\u01DE\x03\x02\x02\x02\u01DD\u01DB\x03" + + "\x02\x02\x02\u01DE\u01DF\x07,\x02\x02\u01DF\u01E0\x071\x02\x02\u01E0\u01E1" + + "\x03\x02\x02\x02\u01E1\u01E2\bF\x02\x02\u01E2\x8C\x03\x02\x02\x02\u01E3" + + "\u01E5\t\t\x02\x02\u01E4\u01E3\x03\x02\x02\x02\u01E5\u01E6\x03\x02\x02" + + "\x02\u01E6\u01E4\x03\x02\x02\x02\u01E6\u01E7\x03\x02\x02\x02\u01E7\u01E8" + + "\x03\x02\x02\x02\u01E8\u01E9\bG\x02\x02\u01E9\x8E\x03\x02\x02\x02\x14" + + "\x02\u0130\u013E\u0145\u0147\u0151\u0153\u0156\u01A2\u01A9\u01AB\u01B1" + + "\u01B8\u01BA\u01C3\u01CE\u01DB\u01E6\x03\b\x02\x02"; public static __ATN: ATN; public static get _ATN(): ATN { if (!QuintLexer.__ATN) { diff --git a/quint/src/generated/QuintListener.ts b/quint/src/generated/QuintListener.ts index d8e439e57..b687aeefd 100644 --- a/quint/src/generated/QuintListener.ts +++ b/quint/src/generated/QuintListener.ts @@ -18,7 +18,8 @@ import { TypeRecContext } from "./QuintParser"; import { TypeIntContext } from "./QuintParser"; import { TypeStrContext } from "./QuintParser"; import { TypeBoolContext } from "./QuintParser"; -import { TypeConstOrVarContext } from "./QuintParser"; +import { TypeVarContext } from "./QuintParser"; +import { TypeConstContext } from "./QuintParser"; import { TypeParenContext } from "./QuintParser"; import { TypeAbstractDefContext } from "./QuintParser"; import { TypeAliasDefContext } from "./QuintParser"; @@ -99,6 +100,7 @@ import { OperatorContext } from "./QuintParser"; import { LiteralContext } from "./QuintParser"; import { QualIdContext } from "./QuintParser"; import { SimpleIdContext } from "./QuintParser"; +import { IdentifierContext } from "./QuintParser"; /** @@ -224,17 +226,30 @@ export interface QuintListener extends ParseTreeListener { exitTypeBool?: (ctx: TypeBoolContext) => void; /** - * Enter a parse tree produced by the `typeConstOrVar` + * Enter a parse tree produced by the `typeVar` * labeled alternative in `QuintParser.type`. * @param ctx the parse tree */ - enterTypeConstOrVar?: (ctx: TypeConstOrVarContext) => void; + enterTypeVar?: (ctx: TypeVarContext) => void; /** - * Exit a parse tree produced by the `typeConstOrVar` + * Exit a parse tree produced by the `typeVar` * labeled alternative in `QuintParser.type`. * @param ctx the parse tree */ - exitTypeConstOrVar?: (ctx: TypeConstOrVarContext) => void; + exitTypeVar?: (ctx: TypeVarContext) => void; + + /** + * Enter a parse tree produced by the `typeConst` + * labeled alternative in `QuintParser.type`. + * @param ctx the parse tree + */ + enterTypeConst?: (ctx: TypeConstContext) => void; + /** + * Exit a parse tree produced by the `typeConst` + * labeled alternative in `QuintParser.type`. + * @param ctx the parse tree + */ + exitTypeConst?: (ctx: TypeConstContext) => void; /** * Enter a parse tree produced by the `typeParen` @@ -1199,5 +1214,16 @@ export interface QuintListener extends ParseTreeListener { * @param ctx the parse tree */ exitSimpleId?: (ctx: SimpleIdContext) => void; + + /** + * Enter a parse tree produced by `QuintParser.identifier`. + * @param ctx the parse tree + */ + enterIdentifier?: (ctx: IdentifierContext) => void; + /** + * Exit a parse tree produced by `QuintParser.identifier`. + * @param ctx the parse tree + */ + exitIdentifier?: (ctx: IdentifierContext) => void; } diff --git a/quint/src/generated/QuintParser.ts b/quint/src/generated/QuintParser.ts index 9dc9dc78c..8a95eddc0 100644 --- a/quint/src/generated/QuintParser.ts +++ b/quint/src/generated/QuintParser.ts @@ -98,11 +98,12 @@ export class QuintParser extends Parser { public static readonly ASGN = 62; public static readonly LPAREN = 63; public static readonly RPAREN = 64; - public static readonly IDENTIFIER = 65; - public static readonly DOCCOMMENT = 66; - public static readonly LINE_COMMENT = 67; - public static readonly COMMENT = 68; - public static readonly WS = 69; + public static readonly LOW_ID = 65; + public static readonly CAP_ID = 66; + public static readonly DOCCOMMENT = 67; + public static readonly LINE_COMMENT = 68; + public static readonly COMMENT = 69; + public static readonly WS = 70; public static readonly RULE_modules = 0; public static readonly RULE_module = 1; public static readonly RULE_documentedDeclaration = 2; @@ -141,6 +142,7 @@ export class QuintParser extends Parser { public static readonly RULE_literal = 35; public static readonly RULE_qualId = 36; public static readonly RULE_simpleId = 37; + public static readonly RULE_identifier = 38; // tslint:disable:no-trailing-whitespace public static readonly ruleNames: string[] = [ "modules", "module", "documentedDeclaration", "declaration", "operDef", @@ -149,7 +151,7 @@ export class QuintParser extends Parser { "type", "row", "rowLabel", "expr", "matchSumExpr", "matchSumCase", "matchSumVariant", "declarationOrExpr", "lambda", "lambdaUnsugared", "lambdaTupleSugar", "identOrHole", "parameter", "identOrStar", "argList", "recElem", "normalCallName", - "nameAfterDot", "operator", "literal", "qualId", "simpleId", + "nameAfterDot", "operator", "literal", "qualId", "simpleId", "identifier", ]; private static readonly _LITERAL_NAMES: Array = [ @@ -171,8 +173,8 @@ export class QuintParser extends Parser { undefined, undefined, undefined, undefined, undefined, "STRING", "BOOL", "INT", "AND", "OR", "IFF", "IMPLIES", "SET", "LIST", "MAP", "MATCH", "PLUS", "MINUS", "MUL", "DIV", "MOD", "GT", "LT", "GE", "LE", "NE", "EQ", "ASGN", - "LPAREN", "RPAREN", "IDENTIFIER", "DOCCOMMENT", "LINE_COMMENT", "COMMENT", - "WS", + "LPAREN", "RPAREN", "LOW_ID", "CAP_ID", "DOCCOMMENT", "LINE_COMMENT", + "COMMENT", "WS", ]; public static readonly VOCABULARY: Vocabulary = new VocabularyImpl(QuintParser._LITERAL_NAMES, QuintParser._SYMBOLIC_NAMES, []); @@ -208,21 +210,21 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 77; + this.state = 79; this._errHandler.sync(this); _la = this._input.LA(1); do { { { - this.state = 76; + this.state = 78; this.module(); } } - this.state = 79; + this.state = 81; this._errHandler.sync(this); _la = this._input.LA(1); } while (_la === QuintParser.T__0 || _la === QuintParser.DOCCOMMENT); - this.state = 81; + this.state = 83; this.match(QuintParser.EOF); } } @@ -248,41 +250,41 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 86; + this.state = 88; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.DOCCOMMENT) { { { - this.state = 83; + this.state = 85; this.match(QuintParser.DOCCOMMENT); } } - this.state = 88; + this.state = 90; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 89; + this.state = 91; this.match(QuintParser.T__0); - this.state = 90; + this.state = 92; this.qualId(); - this.state = 91; + this.state = 93; this.match(QuintParser.T__1); - this.state = 95; + this.state = 97; this._errHandler.sync(this); _la = this._input.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__3) | (1 << QuintParser.T__5) | (1 << QuintParser.T__6) | (1 << QuintParser.T__9) | (1 << QuintParser.T__12) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__22))) !== 0) || _la === QuintParser.DOCCOMMENT) { { { - this.state = 92; + this.state = 94; this.documentedDeclaration(); } } - this.state = 97; + this.state = 99; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 98; + this.state = 100; this.match(QuintParser.T__2); } } @@ -308,21 +310,21 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 103; + this.state = 105; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.DOCCOMMENT) { { { - this.state = 100; + this.state = 102; this.match(QuintParser.DOCCOMMENT); } } - this.state = 105; + this.state = 107; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 106; + this.state = 108; this.declaration(); } } @@ -345,20 +347,20 @@ export class QuintParser extends Parser { let _localctx: DeclarationContext = new DeclarationContext(this._ctx, this.state); this.enterRule(_localctx, 6, QuintParser.RULE_declaration); try { - this.state = 128; + this.state = 130; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 4, this._ctx) ) { case 1: _localctx = new ConstContext(_localctx); this.enterOuterAlt(_localctx, 1); { - this.state = 108; + this.state = 110; this.match(QuintParser.T__3); - this.state = 109; + this.state = 111; this.qualId(); - this.state = 110; + this.state = 112; this.match(QuintParser.T__4); - this.state = 111; + this.state = 113; this.type(0); } break; @@ -367,13 +369,13 @@ export class QuintParser extends Parser { _localctx = new VarContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 113; + this.state = 115; this.match(QuintParser.T__5); - this.state = 114; + this.state = 116; this.qualId(); - this.state = 115; + this.state = 117; this.match(QuintParser.T__4); - this.state = 116; + this.state = 118; this.type(0); } break; @@ -382,13 +384,13 @@ export class QuintParser extends Parser { _localctx = new AssumeContext(_localctx); this.enterOuterAlt(_localctx, 3); { - this.state = 118; + this.state = 120; this.match(QuintParser.T__6); - this.state = 119; + this.state = 121; this.identOrHole(); - this.state = 120; + this.state = 122; this.match(QuintParser.ASGN); - this.state = 121; + this.state = 123; this.expr(0); } break; @@ -397,7 +399,7 @@ export class QuintParser extends Parser { _localctx = new InstanceContext(_localctx); this.enterOuterAlt(_localctx, 4); { - this.state = 123; + this.state = 125; this.instanceMod(); } break; @@ -406,7 +408,7 @@ export class QuintParser extends Parser { _localctx = new OperContext(_localctx); this.enterOuterAlt(_localctx, 5); { - this.state = 124; + this.state = 126; this.operDef(); } break; @@ -415,7 +417,7 @@ export class QuintParser extends Parser { _localctx = new TypeDefsContext(_localctx); this.enterOuterAlt(_localctx, 6); { - this.state = 125; + this.state = 127; this.typeDef(); } break; @@ -424,7 +426,7 @@ export class QuintParser extends Parser { _localctx = new ImportDefContext(_localctx); this.enterOuterAlt(_localctx, 7); { - this.state = 126; + this.state = 128; this.importMod(); } break; @@ -433,7 +435,7 @@ export class QuintParser extends Parser { _localctx = new ExportDefContext(_localctx); this.enterOuterAlt(_localctx, 8); { - this.state = 127; + this.state = 129; this.exportMod(); } break; @@ -461,53 +463,53 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 130; + this.state = 132; this.qualifier(); - this.state = 131; + this.state = 133; this.normalCallName(); - this.state = 168; + this.state = 170; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 9, this._ctx) ) { case 1: { - this.state = 132; + this.state = 134; this.match(QuintParser.LPAREN); - this.state = 141; + this.state = 143; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__36 || _la === QuintParser.IDENTIFIER) { + if (((((_la - 37)) & ~0x1F) === 0 && ((1 << (_la - 37)) & ((1 << (QuintParser.T__36 - 37)) | (1 << (QuintParser.LOW_ID - 37)) | (1 << (QuintParser.CAP_ID - 37)))) !== 0)) { { - this.state = 133; + this.state = 135; this.parameter(); - this.state = 138; + this.state = 140; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 134; + this.state = 136; this.match(QuintParser.T__7); - this.state = 135; + this.state = 137; this.parameter(); } } - this.state = 140; + this.state = 142; this._errHandler.sync(this); _la = this._input.LA(1); } } } - this.state = 143; + this.state = 145; this.match(QuintParser.RPAREN); - this.state = 146; + this.state = 148; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__4) { { - this.state = 144; + this.state = 146; this.match(QuintParser.T__4); - this.state = 145; + this.state = 147; this.type(0); } } @@ -517,72 +519,72 @@ export class QuintParser extends Parser { case 2: { - this.state = 148; + this.state = 150; this.match(QuintParser.T__4); - this.state = 149; + this.state = 151; this.type(0); } break; case 3: { - this.state = 150; + this.state = 152; this.match(QuintParser.LPAREN); { - this.state = 151; + this.state = 153; this.parameter(); - this.state = 152; + this.state = 154; this.match(QuintParser.T__4); - this.state = 153; + this.state = 155; this.type(0); - this.state = 161; + this.state = 163; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 154; + this.state = 156; this.match(QuintParser.T__7); - this.state = 155; + this.state = 157; this.parameter(); - this.state = 156; + this.state = 158; this.match(QuintParser.T__4); - this.state = 157; + this.state = 159; this.type(0); } } - this.state = 163; + this.state = 165; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 164; + this.state = 166; this.match(QuintParser.RPAREN); - this.state = 165; + this.state = 167; this.match(QuintParser.T__4); - this.state = 166; + this.state = 168; this.type(0); } break; } - this.state = 172; + this.state = 174; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.ASGN) { { - this.state = 170; + this.state = 172; this.match(QuintParser.ASGN); - this.state = 171; + this.state = 173; this.expr(0); } } - this.state = 175; + this.state = 177; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__8) { { - this.state = 174; + this.state = 176; this.match(QuintParser.T__8); } } @@ -609,16 +611,16 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 10, QuintParser.RULE_typeDef); let _la: number; try { - this.state = 198; + this.state = 200; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 14, this._ctx) ) { case 1: _localctx = new TypeAbstractDefContext(_localctx); this.enterOuterAlt(_localctx, 1); { - this.state = 177; + this.state = 179; this.match(QuintParser.T__9); - this.state = 178; + this.state = 180; this.qualId(); } break; @@ -627,13 +629,13 @@ export class QuintParser extends Parser { _localctx = new TypeAliasDefContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 179; + this.state = 181; this.match(QuintParser.T__9); - this.state = 180; + this.state = 182; this.qualId(); - this.state = 181; + this.state = 183; this.match(QuintParser.ASGN); - this.state = 182; + this.state = 184; this.type(0); } break; @@ -642,37 +644,37 @@ export class QuintParser extends Parser { _localctx = new TypeSumDefContext(_localctx); this.enterOuterAlt(_localctx, 3); { - this.state = 184; + this.state = 186; this.match(QuintParser.T__9); - this.state = 185; + this.state = 187; (_localctx as TypeSumDefContext)._typeName = this.qualId(); - this.state = 186; - this.match(QuintParser.ASGN); this.state = 188; + this.match(QuintParser.ASGN); + this.state = 190; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__10) { { - this.state = 187; + this.state = 189; this.match(QuintParser.T__10); } } - this.state = 190; + this.state = 192; this.typeSumVariant(); - this.state = 195; + this.state = 197; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__10) { { { - this.state = 191; + this.state = 193; this.match(QuintParser.T__10); - this.state = 192; + this.state = 194; this.typeSumVariant(); } } - this.state = 197; + this.state = 199; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -702,18 +704,18 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 200; + this.state = 202; _localctx._sumLabel = this.simpleId("variant label"); - this.state = 205; + this.state = 207; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.LPAREN) { { - this.state = 201; + this.state = 203; this.match(QuintParser.LPAREN); - this.state = 202; + this.state = 204; this.type(0); - this.state = 203; + this.state = 205; this.match(QuintParser.RPAREN); } } @@ -742,32 +744,32 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 207; + this.state = 209; this.match(QuintParser.T__11); - this.state = 208; + this.state = 210; this.qualId(); - this.state = 211; + this.state = 213; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__4) { { - this.state = 209; + this.state = 211; this.match(QuintParser.T__4); - this.state = 210; + this.state = 212; this.type(0); } } - this.state = 213; + this.state = 215; this.match(QuintParser.ASGN); - this.state = 214; - this.expr(0); this.state = 216; + this.expr(0); + this.state = 218; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__8) { { - this.state = 215; + this.state = 217; this.match(QuintParser.T__8); } } @@ -793,13 +795,13 @@ export class QuintParser extends Parser { let _localctx: QualifierContext = new QualifierContext(this._ctx, this.state); this.enterRule(_localctx, 16, QuintParser.RULE_qualifier); try { - this.state = 227; + this.state = 229; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 18, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 218; + this.state = 220; this.match(QuintParser.T__12); } break; @@ -807,7 +809,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 219; + this.state = 221; this.match(QuintParser.T__13); } break; @@ -815,9 +817,9 @@ export class QuintParser extends Parser { case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 220; + this.state = 222; this.match(QuintParser.T__14); - this.state = 221; + this.state = 223; this.match(QuintParser.T__12); } break; @@ -825,9 +827,9 @@ export class QuintParser extends Parser { case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 222; + this.state = 224; this.match(QuintParser.T__14); - this.state = 223; + this.state = 225; this.match(QuintParser.T__13); } break; @@ -835,7 +837,7 @@ export class QuintParser extends Parser { case 5: this.enterOuterAlt(_localctx, 5); { - this.state = 224; + this.state = 226; this.match(QuintParser.T__15); } break; @@ -843,7 +845,7 @@ export class QuintParser extends Parser { case 6: this.enterOuterAlt(_localctx, 6); { - this.state = 225; + this.state = 227; this.match(QuintParser.T__16); } break; @@ -851,7 +853,7 @@ export class QuintParser extends Parser { case 7: this.enterOuterAlt(_localctx, 7); { - this.state = 226; + this.state = 228; this.match(QuintParser.T__17); } break; @@ -877,28 +879,28 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 18, QuintParser.RULE_importMod); let _la: number; try { - this.state = 247; + this.state = 249; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 22, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 229; + this.state = 231; this.match(QuintParser.T__18); - this.state = 230; + this.state = 232; this.name(); - this.state = 231; + this.state = 233; this.match(QuintParser.T__19); - this.state = 232; + this.state = 234; this.identOrStar(); - this.state = 235; + this.state = 237; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__20) { { - this.state = 233; + this.state = 235; this.match(QuintParser.T__20); - this.state = 234; + this.state = 236; this.fromSource(); } } @@ -909,30 +911,30 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 237; + this.state = 239; this.match(QuintParser.T__18); - this.state = 238; + this.state = 240; this.name(); - this.state = 241; + this.state = 243; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__21) { { - this.state = 239; + this.state = 241; this.match(QuintParser.T__21); - this.state = 240; + this.state = 242; this.name(); } } - this.state = 245; + this.state = 247; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__20) { { - this.state = 243; + this.state = 245; this.match(QuintParser.T__20); - this.state = 244; + this.state = 246; this.fromSource(); } } @@ -961,19 +963,19 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 20, QuintParser.RULE_exportMod); let _la: number; try { - this.state = 260; + this.state = 262; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 24, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 249; + this.state = 251; this.match(QuintParser.T__22); - this.state = 250; + this.state = 252; this.name(); - this.state = 251; + this.state = 253; this.match(QuintParser.T__19); - this.state = 252; + this.state = 254; this.identOrStar(); } break; @@ -981,18 +983,18 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 254; + this.state = 256; this.match(QuintParser.T__22); - this.state = 255; + this.state = 257; this.name(); - this.state = 258; + this.state = 260; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__21) { { - this.state = 256; + this.state = 258; this.match(QuintParser.T__21); - this.state = 257; + this.state = 259; this.name(); } } @@ -1021,60 +1023,60 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 22, QuintParser.RULE_instanceMod); let _la: number; try { - this.state = 308; + this.state = 310; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 29, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 262; + this.state = 264; this.match(QuintParser.T__18); - this.state = 263; + this.state = 265; this.moduleName(); - this.state = 264; + this.state = 266; this.match(QuintParser.LPAREN); { - this.state = 265; + this.state = 267; this.name(); - this.state = 266; + this.state = 268; this.match(QuintParser.ASGN); - this.state = 267; + this.state = 269; this.expr(0); - this.state = 275; + this.state = 277; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 268; + this.state = 270; this.match(QuintParser.T__7); - this.state = 269; + this.state = 271; this.name(); - this.state = 270; + this.state = 272; this.match(QuintParser.ASGN); - this.state = 271; + this.state = 273; this.expr(0); } } - this.state = 277; + this.state = 279; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 278; + this.state = 280; this.match(QuintParser.RPAREN); - this.state = 279; + this.state = 281; this.match(QuintParser.T__19); - this.state = 280; + this.state = 282; this.match(QuintParser.MUL); - this.state = 283; + this.state = 285; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__20) { { - this.state = 281; + this.state = 283; this.match(QuintParser.T__20); - this.state = 282; + this.state = 284; this.fromSource(); } } @@ -1085,54 +1087,54 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 285; + this.state = 287; this.match(QuintParser.T__18); - this.state = 286; + this.state = 288; this.moduleName(); - this.state = 287; + this.state = 289; this.match(QuintParser.LPAREN); { - this.state = 288; + this.state = 290; this.name(); - this.state = 289; + this.state = 291; this.match(QuintParser.ASGN); - this.state = 290; + this.state = 292; this.expr(0); - this.state = 298; + this.state = 300; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 291; + this.state = 293; this.match(QuintParser.T__7); - this.state = 292; + this.state = 294; this.name(); - this.state = 293; + this.state = 295; this.match(QuintParser.ASGN); - this.state = 294; + this.state = 296; this.expr(0); } } - this.state = 300; + this.state = 302; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 301; + this.state = 303; this.match(QuintParser.RPAREN); - this.state = 302; + this.state = 304; this.match(QuintParser.T__21); - this.state = 303; + this.state = 305; this.qualifiedName(); - this.state = 306; + this.state = 308; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__20) { { - this.state = 304; + this.state = 306; this.match(QuintParser.T__20); - this.state = 305; + this.state = 307; this.fromSource(); } } @@ -1162,7 +1164,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 310; + this.state = 312; this.qualId(); } } @@ -1187,7 +1189,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 312; + this.state = 314; this.qualId(); } } @@ -1212,7 +1214,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 314; + this.state = 316; this.qualId(); } } @@ -1237,7 +1239,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 316; + this.state = 318; this.match(QuintParser.STRING); } } @@ -1275,7 +1277,7 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 374; + this.state = 377; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 35, this._ctx) ) { case 1: @@ -1284,52 +1286,52 @@ export class QuintParser extends Parser { this._ctx = _localctx; _prevctx = _localctx; - this.state = 319; + this.state = 321; this.match(QuintParser.LPAREN); - this.state = 328; + this.state = 330; this._errHandler.sync(this); _la = this._input.LA(1); - if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__27) | (1 << QuintParser.T__28) | (1 << QuintParser.T__29))) !== 0) || ((((_la - 47)) & ~0x1F) === 0 && ((1 << (_la - 47)) & ((1 << (QuintParser.SET - 47)) | (1 << (QuintParser.LIST - 47)) | (1 << (QuintParser.LPAREN - 47)) | (1 << (QuintParser.IDENTIFIER - 47)))) !== 0)) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__27) | (1 << QuintParser.T__28) | (1 << QuintParser.T__29))) !== 0) || ((((_la - 47)) & ~0x1F) === 0 && ((1 << (_la - 47)) & ((1 << (QuintParser.SET - 47)) | (1 << (QuintParser.LIST - 47)) | (1 << (QuintParser.LPAREN - 47)) | (1 << (QuintParser.LOW_ID - 47)) | (1 << (QuintParser.CAP_ID - 47)))) !== 0)) { { - this.state = 320; + this.state = 322; this.type(0); - this.state = 325; + this.state = 327; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 30, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 321; + this.state = 323; this.match(QuintParser.T__7); - this.state = 322; + this.state = 324; this.type(0); } } } - this.state = 327; + this.state = 329; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 30, this._ctx); } } } - this.state = 331; + this.state = 333; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 330; + this.state = 332; this.match(QuintParser.T__7); } } - this.state = 333; + this.state = 335; this.match(QuintParser.RPAREN); - this.state = 334; + this.state = 336; this.match(QuintParser.T__24); - this.state = 335; - this.type(10); + this.state = 337; + this.type(11); } break; @@ -1338,13 +1340,13 @@ export class QuintParser extends Parser { _localctx = new TypeSetContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 336; + this.state = 338; this.match(QuintParser.SET); - this.state = 337; + this.state = 339; this.match(QuintParser.T__25); - this.state = 338; + this.state = 340; this.type(0); - this.state = 339; + this.state = 341; this.match(QuintParser.T__26); } break; @@ -1354,13 +1356,13 @@ export class QuintParser extends Parser { _localctx = new TypeListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 341; + this.state = 343; this.match(QuintParser.LIST); - this.state = 342; + this.state = 344; this.match(QuintParser.T__25); - this.state = 343; + this.state = 345; this.type(0); - this.state = 344; + this.state = 346; this.match(QuintParser.T__26); } break; @@ -1370,43 +1372,43 @@ export class QuintParser extends Parser { _localctx = new TypeTupleContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 346; + this.state = 348; this.match(QuintParser.LPAREN); - this.state = 347; + this.state = 349; this.type(0); - this.state = 348; + this.state = 350; this.match(QuintParser.T__7); - this.state = 349; + this.state = 351; this.type(0); - this.state = 354; + this.state = 356; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 33, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 350; + this.state = 352; this.match(QuintParser.T__7); - this.state = 351; + this.state = 353; this.type(0); } } } - this.state = 356; + this.state = 358; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 33, this._ctx); } - this.state = 358; + this.state = 360; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 357; + this.state = 359; this.match(QuintParser.T__7); } } - this.state = 360; + this.state = 362; this.match(QuintParser.RPAREN); } break; @@ -1416,11 +1418,11 @@ export class QuintParser extends Parser { _localctx = new TypeRecContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 362; + this.state = 364; this.match(QuintParser.T__1); - this.state = 363; + this.state = 365; this.row(); - this.state = 364; + this.state = 366; this.match(QuintParser.T__2); } break; @@ -1430,7 +1432,7 @@ export class QuintParser extends Parser { _localctx = new TypeIntContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 366; + this.state = 368; this.match(QuintParser.T__27); } break; @@ -1440,7 +1442,7 @@ export class QuintParser extends Parser { _localctx = new TypeStrContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 367; + this.state = 369; this.match(QuintParser.T__28); } break; @@ -1450,37 +1452,47 @@ export class QuintParser extends Parser { _localctx = new TypeBoolContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 368; + this.state = 370; this.match(QuintParser.T__29); } break; case 9: { - _localctx = new TypeConstOrVarContext(_localctx); + _localctx = new TypeVarContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 369; - this.qualId(); + this.state = 371; + this.match(QuintParser.LOW_ID); } break; case 10: + { + _localctx = new TypeConstContext(_localctx); + this._ctx = _localctx; + _prevctx = _localctx; + this.state = 372; + this.qualId(); + } + break; + + case 11: { _localctx = new TypeParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 370; + this.state = 373; this.match(QuintParser.LPAREN); - this.state = 371; + this.state = 374; this.type(0); - this.state = 372; + this.state = 375; this.match(QuintParser.RPAREN); } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 384; + this.state = 387; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 37, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -1490,21 +1502,21 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 382; + this.state = 385; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 36, this._ctx) ) { case 1: { _localctx = new TypeFunContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 376; - if (!(this.precpred(this._ctx, 12))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 12)"); + this.state = 379; + if (!(this.precpred(this._ctx, 13))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 13)"); } - this.state = 377; + this.state = 380; this.match(QuintParser.T__23); - this.state = 378; - this.type(12); + this.state = 381; + this.type(13); } break; @@ -1512,20 +1524,20 @@ export class QuintParser extends Parser { { _localctx = new TypeOperContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 379; - if (!(this.precpred(this._ctx, 11))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 11)"); + this.state = 382; + if (!(this.precpred(this._ctx, 12))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 12)"); } - this.state = 380; + this.state = 383; this.match(QuintParser.T__24); - this.state = 381; - this.type(11); + this.state = 384; + this.type(12); } break; } } } - this.state = 386; + this.state = 389; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 37, this._ctx); } @@ -1552,64 +1564,65 @@ export class QuintParser extends Parser { let _la: number; try { let _alt: number; - this.state = 410; + this.state = 413; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__2: - case QuintParser.IDENTIFIER: + case QuintParser.LOW_ID: + case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 394; + this.state = 397; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 387; + this.state = 390; this.rowLabel(); - this.state = 388; + this.state = 391; this.match(QuintParser.T__4); - this.state = 389; + this.state = 392; this.type(0); - this.state = 390; + this.state = 393; this.match(QuintParser.T__7); } } } - this.state = 396; + this.state = 399; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); } - this.state = 406; + this.state = 409; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.IDENTIFIER) { + if (_la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { { - this.state = 397; + this.state = 400; this.rowLabel(); - this.state = 398; + this.state = 401; this.match(QuintParser.T__4); - this.state = 399; + this.state = 402; this.type(0); } - this.state = 404; + this.state = 407; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__7: { - this.state = 401; + this.state = 404; this.match(QuintParser.T__7); } break; case QuintParser.T__10: { - this.state = 402; + this.state = 405; this.match(QuintParser.T__10); { - this.state = 403; - _localctx._rowVar = this.match(QuintParser.IDENTIFIER); + this.state = 406; + _localctx._rowVar = this.identifier(); } } break; @@ -1626,11 +1639,11 @@ export class QuintParser extends Parser { case QuintParser.T__10: this.enterOuterAlt(_localctx, 2); { - this.state = 408; + this.state = 411; this.match(QuintParser.T__10); { - this.state = 409; - _localctx._rowVar = this.match(QuintParser.IDENTIFIER); + this.state = 412; + _localctx._rowVar = this.identifier(); } } break; @@ -1659,7 +1672,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 412; + this.state = 415; this.simpleId("record"); } } @@ -1697,7 +1710,7 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 564; + this.state = 567; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 59, this._ctx) ) { case 1: @@ -1706,7 +1719,7 @@ export class QuintParser extends Parser { this._ctx = _localctx; _prevctx = _localctx; - this.state = 415; + this.state = 418; this.lambda(); } break; @@ -1716,21 +1729,21 @@ export class QuintParser extends Parser { _localctx = new OperAppContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 416; + this.state = 419; this.normalCallName(); - this.state = 417; + this.state = 420; this.match(QuintParser.LPAREN); - this.state = 419; + this.state = 422; this._errHandler.sync(this); _la = this._input.LA(1); - if (((((_la - 2)) & ~0x1F) === 0 && ((1 << (_la - 2)) & ((1 << (QuintParser.T__1 - 2)) | (1 << (QuintParser.T__11 - 2)) | (1 << (QuintParser.T__12 - 2)) | (1 << (QuintParser.T__13 - 2)) | (1 << (QuintParser.T__14 - 2)) | (1 << (QuintParser.T__15 - 2)) | (1 << (QuintParser.T__16 - 2)) | (1 << (QuintParser.T__17 - 2)) | (1 << (QuintParser.T__25 - 2)) | (1 << (QuintParser.T__32 - 2)))) !== 0) || ((((_la - 34)) & ~0x1F) === 0 && ((1 << (_la - 34)) & ((1 << (QuintParser.T__33 - 34)) | (1 << (QuintParser.T__34 - 34)) | (1 << (QuintParser.T__36 - 34)) | (1 << (QuintParser.STRING - 34)) | (1 << (QuintParser.BOOL - 34)) | (1 << (QuintParser.INT - 34)) | (1 << (QuintParser.AND - 34)) | (1 << (QuintParser.OR - 34)) | (1 << (QuintParser.IFF - 34)) | (1 << (QuintParser.IMPLIES - 34)) | (1 << (QuintParser.SET - 34)) | (1 << (QuintParser.LIST - 34)) | (1 << (QuintParser.MAP - 34)) | (1 << (QuintParser.MATCH - 34)) | (1 << (QuintParser.MINUS - 34)) | (1 << (QuintParser.LPAREN - 34)) | (1 << (QuintParser.IDENTIFIER - 34)))) !== 0)) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__11) | (1 << QuintParser.T__12) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__25))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 418; + this.state = 421; this.argList(); } } - this.state = 421; + this.state = 424; this.match(QuintParser.RPAREN); } break; @@ -1740,9 +1753,9 @@ export class QuintParser extends Parser { _localctx = new UminusContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 423; + this.state = 426; this.match(QuintParser.MINUS); - this.state = 424; + this.state = 427; this.expr(25); } break; @@ -1752,13 +1765,13 @@ export class QuintParser extends Parser { _localctx = new AsgnContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 425; + this.state = 428; this.qualId(); - this.state = 426; + this.state = 429; this.match(QuintParser.T__31); - this.state = 427; + this.state = 430; this.match(QuintParser.ASGN); - this.state = 428; + this.state = 431; this.expr(21); } break; @@ -1768,41 +1781,41 @@ export class QuintParser extends Parser { _localctx = new AndExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 430; + this.state = 433; this.match(QuintParser.AND); - this.state = 431; + this.state = 434; this.match(QuintParser.T__1); - this.state = 432; + this.state = 435; this.expr(0); - this.state = 437; + this.state = 440; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 43, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 433; + this.state = 436; this.match(QuintParser.T__7); - this.state = 434; + this.state = 437; this.expr(0); } } } - this.state = 439; + this.state = 442; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 43, this._ctx); } - this.state = 441; + this.state = 444; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 440; + this.state = 443; this.match(QuintParser.T__7); } } - this.state = 443; + this.state = 446; this.match(QuintParser.T__2); } break; @@ -1812,41 +1825,41 @@ export class QuintParser extends Parser { _localctx = new OrExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 445; + this.state = 448; this.match(QuintParser.OR); - this.state = 446; + this.state = 449; this.match(QuintParser.T__1); - this.state = 447; + this.state = 450; this.expr(0); - this.state = 452; + this.state = 455; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 45, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 448; + this.state = 451; this.match(QuintParser.T__7); - this.state = 449; + this.state = 452; this.expr(0); } } } - this.state = 454; + this.state = 457; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 45, this._ctx); } - this.state = 456; + this.state = 459; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 455; + this.state = 458; this.match(QuintParser.T__7); } } - this.state = 458; + this.state = 461; this.match(QuintParser.T__2); } break; @@ -1856,7 +1869,7 @@ export class QuintParser extends Parser { _localctx = new MatchContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 460; + this.state = 463; this.matchSumExpr(); } break; @@ -1866,41 +1879,41 @@ export class QuintParser extends Parser { _localctx = new ActionAllContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 461; + this.state = 464; this.match(QuintParser.T__32); - this.state = 462; + this.state = 465; this.match(QuintParser.T__1); - this.state = 463; + this.state = 466; this.expr(0); - this.state = 468; + this.state = 471; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 47, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 464; + this.state = 467; this.match(QuintParser.T__7); - this.state = 465; + this.state = 468; this.expr(0); } } } - this.state = 470; + this.state = 473; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 47, this._ctx); } - this.state = 472; + this.state = 475; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 471; + this.state = 474; this.match(QuintParser.T__7); } } - this.state = 474; + this.state = 477; this.match(QuintParser.T__2); } break; @@ -1910,41 +1923,41 @@ export class QuintParser extends Parser { _localctx = new ActionAnyContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 476; + this.state = 479; this.match(QuintParser.T__33); - this.state = 477; + this.state = 480; this.match(QuintParser.T__1); - this.state = 478; + this.state = 481; this.expr(0); - this.state = 483; + this.state = 486; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 479; + this.state = 482; this.match(QuintParser.T__7); - this.state = 480; + this.state = 483; this.expr(0); } } } - this.state = 485; + this.state = 488; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); } - this.state = 487; + this.state = 490; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 486; + this.state = 489; this.match(QuintParser.T__7); } } - this.state = 489; + this.state = 492; this.match(QuintParser.T__2); } break; @@ -1954,30 +1967,31 @@ export class QuintParser extends Parser { _localctx = new LiteralOrIdContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 495; + this.state = 498; this._errHandler.sync(this); switch (this._input.LA(1)) { - case QuintParser.IDENTIFIER: + case QuintParser.LOW_ID: + case QuintParser.CAP_ID: { - this.state = 491; + this.state = 494; this.qualId(); } break; case QuintParser.INT: { - this.state = 492; + this.state = 495; this.match(QuintParser.INT); } break; case QuintParser.BOOL: { - this.state = 493; + this.state = 496; this.match(QuintParser.BOOL); } break; case QuintParser.STRING: { - this.state = 494; + this.state = 497; this.match(QuintParser.STRING); } break; @@ -1992,43 +2006,43 @@ export class QuintParser extends Parser { _localctx = new TupleContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 497; + this.state = 500; this.match(QuintParser.LPAREN); - this.state = 498; + this.state = 501; this.expr(0); - this.state = 499; + this.state = 502; this.match(QuintParser.T__7); - this.state = 500; + this.state = 503; this.expr(0); - this.state = 505; + this.state = 508; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 52, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 501; + this.state = 504; this.match(QuintParser.T__7); - this.state = 502; + this.state = 505; this.expr(0); } } } - this.state = 507; + this.state = 510; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 52, this._ctx); } - this.state = 509; + this.state = 512; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 508; + this.state = 511; this.match(QuintParser.T__7); } } - this.state = 511; + this.state = 514; this.match(QuintParser.RPAREN); } break; @@ -2038,39 +2052,39 @@ export class QuintParser extends Parser { _localctx = new RecordContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 513; + this.state = 516; this.match(QuintParser.T__1); - this.state = 514; + this.state = 517; this.recElem(); - this.state = 519; + this.state = 522; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 54, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 515; + this.state = 518; this.match(QuintParser.T__7); - this.state = 516; + this.state = 519; this.recElem(); } } } - this.state = 521; + this.state = 524; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 54, this._ctx); } - this.state = 523; + this.state = 526; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 522; + this.state = 525; this.match(QuintParser.T__7); } } - this.state = 525; + this.state = 528; this.match(QuintParser.T__2); } break; @@ -2080,47 +2094,47 @@ export class QuintParser extends Parser { _localctx = new ListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 527; + this.state = 530; this.match(QuintParser.T__25); - this.state = 536; + this.state = 539; this._errHandler.sync(this); _la = this._input.LA(1); - if (((((_la - 2)) & ~0x1F) === 0 && ((1 << (_la - 2)) & ((1 << (QuintParser.T__1 - 2)) | (1 << (QuintParser.T__11 - 2)) | (1 << (QuintParser.T__12 - 2)) | (1 << (QuintParser.T__13 - 2)) | (1 << (QuintParser.T__14 - 2)) | (1 << (QuintParser.T__15 - 2)) | (1 << (QuintParser.T__16 - 2)) | (1 << (QuintParser.T__17 - 2)) | (1 << (QuintParser.T__25 - 2)) | (1 << (QuintParser.T__32 - 2)))) !== 0) || ((((_la - 34)) & ~0x1F) === 0 && ((1 << (_la - 34)) & ((1 << (QuintParser.T__33 - 34)) | (1 << (QuintParser.T__34 - 34)) | (1 << (QuintParser.T__36 - 34)) | (1 << (QuintParser.STRING - 34)) | (1 << (QuintParser.BOOL - 34)) | (1 << (QuintParser.INT - 34)) | (1 << (QuintParser.AND - 34)) | (1 << (QuintParser.OR - 34)) | (1 << (QuintParser.IFF - 34)) | (1 << (QuintParser.IMPLIES - 34)) | (1 << (QuintParser.SET - 34)) | (1 << (QuintParser.LIST - 34)) | (1 << (QuintParser.MAP - 34)) | (1 << (QuintParser.MATCH - 34)) | (1 << (QuintParser.MINUS - 34)) | (1 << (QuintParser.LPAREN - 34)) | (1 << (QuintParser.IDENTIFIER - 34)))) !== 0)) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__11) | (1 << QuintParser.T__12) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__25))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 528; + this.state = 531; this.expr(0); - this.state = 533; + this.state = 536; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 56, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 529; + this.state = 532; this.match(QuintParser.T__7); - this.state = 530; + this.state = 533; this.expr(0); } } } - this.state = 535; + this.state = 538; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 56, this._ctx); } } } - this.state = 539; + this.state = 542; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 538; + this.state = 541; this.match(QuintParser.T__7); } } - this.state = 541; + this.state = 544; this.match(QuintParser.T__26); } break; @@ -2130,19 +2144,19 @@ export class QuintParser extends Parser { _localctx = new IfElseContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 542; + this.state = 545; this.match(QuintParser.T__34); - this.state = 543; + this.state = 546; this.match(QuintParser.LPAREN); - this.state = 544; + this.state = 547; this.expr(0); - this.state = 545; + this.state = 548; this.match(QuintParser.RPAREN); - this.state = 546; + this.state = 549; this.expr(0); - this.state = 547; + this.state = 550; this.match(QuintParser.T__35); - this.state = 548; + this.state = 551; this.expr(5); } break; @@ -2152,9 +2166,9 @@ export class QuintParser extends Parser { _localctx = new LetInContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 550; + this.state = 553; this.operDef(); - this.state = 551; + this.state = 554; this.expr(4); } break; @@ -2164,9 +2178,9 @@ export class QuintParser extends Parser { _localctx = new NondetContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 553; + this.state = 556; this.nondetOperDef(); - this.state = 554; + this.state = 557; this.expr(3); } break; @@ -2176,11 +2190,11 @@ export class QuintParser extends Parser { _localctx = new ParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 556; + this.state = 559; this.match(QuintParser.LPAREN); - this.state = 557; + this.state = 560; this.expr(0); - this.state = 558; + this.state = 561; this.match(QuintParser.RPAREN); } break; @@ -2190,17 +2204,17 @@ export class QuintParser extends Parser { _localctx = new BracesContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 560; + this.state = 563; this.match(QuintParser.T__1); - this.state = 561; + this.state = 564; this.expr(0); - this.state = 562; + this.state = 565; this.match(QuintParser.T__2); } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 615; + this.state = 618; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 63, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -2210,20 +2224,20 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 613; + this.state = 616; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 62, this._ctx) ) { case 1: { _localctx = new PowContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 566; + this.state = 569; if (!(this.precpred(this._ctx, 26))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 26)"); } - this.state = 567; + this.state = 570; (_localctx as PowContext)._op = this.match(QuintParser.T__30); - this.state = 568; + this.state = 571; this.expr(26); } break; @@ -2232,11 +2246,11 @@ export class QuintParser extends Parser { { _localctx = new MultDivContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 569; + this.state = 572; if (!(this.precpred(this._ctx, 24))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 24)"); } - this.state = 570; + this.state = 573; (_localctx as MultDivContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 53)) & ~0x1F) === 0 && ((1 << (_la - 53)) & ((1 << (QuintParser.MUL - 53)) | (1 << (QuintParser.DIV - 53)) | (1 << (QuintParser.MOD - 53)))) !== 0))) { @@ -2249,7 +2263,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 571; + this.state = 574; this.expr(25); } break; @@ -2258,11 +2272,11 @@ export class QuintParser extends Parser { { _localctx = new PlusMinusContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 572; + this.state = 575; if (!(this.precpred(this._ctx, 23))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 23)"); } - this.state = 573; + this.state = 576; (_localctx as PlusMinusContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(_la === QuintParser.PLUS || _la === QuintParser.MINUS)) { @@ -2275,7 +2289,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 574; + this.state = 577; this.expr(24); } break; @@ -2284,11 +2298,11 @@ export class QuintParser extends Parser { { _localctx = new RelationsContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 575; + this.state = 578; if (!(this.precpred(this._ctx, 22))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 22)"); } - this.state = 576; + this.state = 579; (_localctx as RelationsContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 56)) & ~0x1F) === 0 && ((1 << (_la - 56)) & ((1 << (QuintParser.GT - 56)) | (1 << (QuintParser.LT - 56)) | (1 << (QuintParser.GE - 56)) | (1 << (QuintParser.LE - 56)) | (1 << (QuintParser.NE - 56)) | (1 << (QuintParser.EQ - 56)))) !== 0))) { @@ -2301,7 +2315,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 577; + this.state = 580; this.expr(23); } break; @@ -2310,13 +2324,13 @@ export class QuintParser extends Parser { { _localctx = new ErrorEqContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 578; + this.state = 581; if (!(this.precpred(this._ctx, 20))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 20)"); } - this.state = 579; + this.state = 582; this.match(QuintParser.ASGN); - this.state = 580; + this.state = 583; this.expr(21); const m = "[QNT006] unexpected '=', did you mean '=='?" @@ -2329,13 +2343,13 @@ export class QuintParser extends Parser { { _localctx = new AndContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 583; + this.state = 586; if (!(this.precpred(this._ctx, 18))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 18)"); } - this.state = 584; + this.state = 587; this.match(QuintParser.AND); - this.state = 585; + this.state = 588; this.expr(19); } break; @@ -2344,13 +2358,13 @@ export class QuintParser extends Parser { { _localctx = new OrContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 586; + this.state = 589; if (!(this.precpred(this._ctx, 16))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 16)"); } - this.state = 587; + this.state = 590; this.match(QuintParser.OR); - this.state = 588; + this.state = 591; this.expr(17); } break; @@ -2359,13 +2373,13 @@ export class QuintParser extends Parser { { _localctx = new IffContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 589; + this.state = 592; if (!(this.precpred(this._ctx, 15))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 15)"); } - this.state = 590; + this.state = 593; this.match(QuintParser.IFF); - this.state = 591; + this.state = 594; this.expr(16); } break; @@ -2374,13 +2388,13 @@ export class QuintParser extends Parser { { _localctx = new ImpliesContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 592; + this.state = 595; if (!(this.precpred(this._ctx, 14))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); } - this.state = 593; + this.state = 596; this.match(QuintParser.IMPLIES); - this.state = 594; + this.state = 597; this.expr(15); } break; @@ -2389,13 +2403,13 @@ export class QuintParser extends Parser { { _localctx = new PairContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 595; + this.state = 598; if (!(this.precpred(this._ctx, 8))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 8)"); } - this.state = 596; + this.state = 599; this.match(QuintParser.T__23); - this.state = 597; + this.state = 600; this.expr(9); } break; @@ -2404,32 +2418,32 @@ export class QuintParser extends Parser { { _localctx = new DotCallContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 598; + this.state = 601; if (!(this.precpred(this._ctx, 30))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 30)"); } - this.state = 599; + this.state = 602; this.match(QuintParser.T__19); - this.state = 600; + this.state = 603; this.nameAfterDot(); - this.state = 606; + this.state = 609; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 61, this._ctx) ) { case 1: { - this.state = 601; + this.state = 604; this.match(QuintParser.LPAREN); - this.state = 603; + this.state = 606; this._errHandler.sync(this); _la = this._input.LA(1); - if (((((_la - 2)) & ~0x1F) === 0 && ((1 << (_la - 2)) & ((1 << (QuintParser.T__1 - 2)) | (1 << (QuintParser.T__11 - 2)) | (1 << (QuintParser.T__12 - 2)) | (1 << (QuintParser.T__13 - 2)) | (1 << (QuintParser.T__14 - 2)) | (1 << (QuintParser.T__15 - 2)) | (1 << (QuintParser.T__16 - 2)) | (1 << (QuintParser.T__17 - 2)) | (1 << (QuintParser.T__25 - 2)) | (1 << (QuintParser.T__32 - 2)))) !== 0) || ((((_la - 34)) & ~0x1F) === 0 && ((1 << (_la - 34)) & ((1 << (QuintParser.T__33 - 34)) | (1 << (QuintParser.T__34 - 34)) | (1 << (QuintParser.T__36 - 34)) | (1 << (QuintParser.STRING - 34)) | (1 << (QuintParser.BOOL - 34)) | (1 << (QuintParser.INT - 34)) | (1 << (QuintParser.AND - 34)) | (1 << (QuintParser.OR - 34)) | (1 << (QuintParser.IFF - 34)) | (1 << (QuintParser.IMPLIES - 34)) | (1 << (QuintParser.SET - 34)) | (1 << (QuintParser.LIST - 34)) | (1 << (QuintParser.MAP - 34)) | (1 << (QuintParser.MATCH - 34)) | (1 << (QuintParser.MINUS - 34)) | (1 << (QuintParser.LPAREN - 34)) | (1 << (QuintParser.IDENTIFIER - 34)))) !== 0)) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__11) | (1 << QuintParser.T__12) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__25))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 602; + this.state = 605; this.argList(); } } - this.state = 605; + this.state = 608; this.match(QuintParser.RPAREN); } break; @@ -2441,22 +2455,22 @@ export class QuintParser extends Parser { { _localctx = new ListAppContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 608; + this.state = 611; if (!(this.precpred(this._ctx, 27))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 27)"); } - this.state = 609; + this.state = 612; this.match(QuintParser.T__25); - this.state = 610; + this.state = 613; this.expr(0); - this.state = 611; + this.state = 614; this.match(QuintParser.T__26); } break; } } } - this.state = 617; + this.state = 620; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 63, this._ctx); } @@ -2484,43 +2498,43 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 618; + this.state = 621; this.match(QuintParser.MATCH); - this.state = 619; + this.state = 622; this.expr(0); - this.state = 620; + this.state = 623; this.match(QuintParser.T__1); - this.state = 622; + this.state = 625; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__10) { { - this.state = 621; + this.state = 624; this.match(QuintParser.T__10); } } - this.state = 624; + this.state = 627; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); - this.state = 629; + this.state = 632; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__10) { { { - this.state = 625; + this.state = 628; this.match(QuintParser.T__10); - this.state = 626; + this.state = 629; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); } } - this.state = 631; + this.state = 634; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 632; + this.state = 635; this.match(QuintParser.T__2); } } @@ -2545,27 +2559,28 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 636; + this.state = 639; this._errHandler.sync(this); switch (this._input.LA(1)) { - case QuintParser.IDENTIFIER: + case QuintParser.LOW_ID: + case QuintParser.CAP_ID: { - this.state = 634; + this.state = 637; _localctx._variantMatch = this.matchSumVariant(); } break; case QuintParser.T__36: { - this.state = 635; + this.state = 638; _localctx._wildCardMatch = this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 638; + this.state = 641; this.match(QuintParser.T__24); - this.state = 639; + this.state = 642; this.expr(0); } } @@ -2592,35 +2607,36 @@ export class QuintParser extends Parser { this.enterOuterAlt(_localctx, 1); { { - this.state = 641; + this.state = 644; _localctx._variantLabel = this.simpleId("variant label"); } - this.state = 648; + this.state = 651; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.LPAREN) { { - this.state = 642; - this.match(QuintParser.LPAREN); this.state = 645; + this.match(QuintParser.LPAREN); + this.state = 648; this._errHandler.sync(this); switch (this._input.LA(1)) { - case QuintParser.IDENTIFIER: + case QuintParser.LOW_ID: + case QuintParser.CAP_ID: { - this.state = 643; + this.state = 646; _localctx._variantParam = this.simpleId("match case parameter"); } break; case QuintParser.T__36: { - this.state = 644; + this.state = 647; this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 647; + this.state = 650; this.match(QuintParser.RPAREN); } } @@ -2646,15 +2662,15 @@ export class QuintParser extends Parser { let _localctx: DeclarationOrExprContext = new DeclarationOrExprContext(this._ctx, this.state); this.enterRule(_localctx, 46, QuintParser.RULE_declarationOrExpr); try { - this.state = 659; + this.state = 662; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 69, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 650; + this.state = 653; this.declaration(); - this.state = 651; + this.state = 654; this.match(QuintParser.EOF); } break; @@ -2662,9 +2678,9 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 653; + this.state = 656; this.expr(0); - this.state = 654; + this.state = 657; this.match(QuintParser.EOF); } break; @@ -2672,9 +2688,9 @@ export class QuintParser extends Parser { case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 656; + this.state = 659; this.match(QuintParser.DOCCOMMENT); - this.state = 657; + this.state = 660; this.match(QuintParser.EOF); } break; @@ -2682,7 +2698,7 @@ export class QuintParser extends Parser { case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 658; + this.state = 661; this.match(QuintParser.EOF); } break; @@ -2707,13 +2723,13 @@ export class QuintParser extends Parser { let _localctx: LambdaContext = new LambdaContext(this._ctx, this.state); this.enterRule(_localctx, 48, QuintParser.RULE_lambda); try { - this.state = 663; + this.state = 666; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 70, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 661; + this.state = 664; this.lambdaUnsugared(); } break; @@ -2721,7 +2737,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 662; + this.state = 665; this.lambdaTupleSugar(); } break; @@ -2747,49 +2763,50 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 50, QuintParser.RULE_lambdaUnsugared); let _la: number; try { - this.state = 682; + this.state = 685; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: - case QuintParser.IDENTIFIER: + case QuintParser.LOW_ID: + case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 665; + this.state = 668; this.parameter(); - this.state = 666; + this.state = 669; this.match(QuintParser.T__24); - this.state = 667; + this.state = 670; this.expr(0); } break; case QuintParser.LPAREN: this.enterOuterAlt(_localctx, 2); { - this.state = 669; + this.state = 672; this.match(QuintParser.LPAREN); - this.state = 670; + this.state = 673; this.parameter(); - this.state = 675; + this.state = 678; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 671; + this.state = 674; this.match(QuintParser.T__7); - this.state = 672; + this.state = 675; this.parameter(); } } - this.state = 677; + this.state = 680; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 678; + this.state = 681; this.match(QuintParser.RPAREN); - this.state = 679; + this.state = 682; this.match(QuintParser.T__24); - this.state = 680; + this.state = 683; this.expr(0); } break; @@ -2819,35 +2836,35 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 684; + this.state = 687; this.match(QuintParser.LPAREN); - this.state = 685; + this.state = 688; this.match(QuintParser.LPAREN); - this.state = 686; - this.parameter(); this.state = 689; + this.parameter(); + this.state = 692; this._errHandler.sync(this); _la = this._input.LA(1); do { { { - this.state = 687; + this.state = 690; this.match(QuintParser.T__7); - this.state = 688; + this.state = 691; this.parameter(); } } - this.state = 691; + this.state = 694; this._errHandler.sync(this); _la = this._input.LA(1); } while (_la === QuintParser.T__7); - this.state = 693; + this.state = 696; this.match(QuintParser.RPAREN); - this.state = 694; + this.state = 697; this.match(QuintParser.RPAREN); - this.state = 695; + this.state = 698; this.match(QuintParser.T__24); - this.state = 696; + this.state = 699; this.expr(0); } } @@ -2870,20 +2887,21 @@ export class QuintParser extends Parser { let _localctx: IdentOrHoleContext = new IdentOrHoleContext(this._ctx, this.state); this.enterRule(_localctx, 54, QuintParser.RULE_identOrHole); try { - this.state = 700; + this.state = 703; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: this.enterOuterAlt(_localctx, 1); { - this.state = 698; + this.state = 701; this.match(QuintParser.T__36); } break; - case QuintParser.IDENTIFIER: + case QuintParser.LOW_ID: + case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 699; + this.state = 702; this.qualId(); } break; @@ -2912,7 +2930,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 702; + this.state = 705; this.identOrHole(); } } @@ -2935,20 +2953,21 @@ export class QuintParser extends Parser { let _localctx: IdentOrStarContext = new IdentOrStarContext(this._ctx, this.state); this.enterRule(_localctx, 58, QuintParser.RULE_identOrStar); try { - this.state = 706; + this.state = 709; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.MUL: this.enterOuterAlt(_localctx, 1); { - this.state = 704; + this.state = 707; this.match(QuintParser.MUL); } break; - case QuintParser.IDENTIFIER: + case QuintParser.LOW_ID: + case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 705; + this.state = 708; this.qualId(); } break; @@ -2978,21 +2997,21 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 708; + this.state = 711; this.expr(0); - this.state = 713; + this.state = 716; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 709; + this.state = 712; this.match(QuintParser.T__7); - this.state = 710; + this.state = 713; this.expr(0); } } - this.state = 715; + this.state = 718; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -3017,26 +3036,27 @@ export class QuintParser extends Parser { let _localctx: RecElemContext = new RecElemContext(this._ctx, this.state); this.enterRule(_localctx, 62, QuintParser.RULE_recElem); try { - this.state = 722; + this.state = 725; this._errHandler.sync(this); switch (this._input.LA(1)) { - case QuintParser.IDENTIFIER: + case QuintParser.LOW_ID: + case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 716; + this.state = 719; this.simpleId("record"); - this.state = 717; + this.state = 720; this.match(QuintParser.T__4); - this.state = 718; + this.state = 721; this.expr(0); } break; case QuintParser.T__37: this.enterOuterAlt(_localctx, 2); { - this.state = 720; + this.state = 723; this.match(QuintParser.T__37); - this.state = 721; + this.state = 724; this.expr(0); } break; @@ -3064,13 +3084,14 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 64, QuintParser.RULE_normalCallName); let _la: number; try { - this.state = 726; + this.state = 729; this._errHandler.sync(this); switch (this._input.LA(1)) { - case QuintParser.IDENTIFIER: + case QuintParser.LOW_ID: + case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 724; + this.state = 727; this.qualId(); } break; @@ -3083,7 +3104,7 @@ export class QuintParser extends Parser { case QuintParser.MAP: this.enterOuterAlt(_localctx, 2); { - this.state = 725; + this.state = 728; _localctx._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 43)) & ~0x1F) === 0 && ((1 << (_la - 43)) & ((1 << (QuintParser.AND - 43)) | (1 << (QuintParser.OR - 43)) | (1 << (QuintParser.IFF - 43)) | (1 << (QuintParser.IMPLIES - 43)) | (1 << (QuintParser.SET - 43)) | (1 << (QuintParser.LIST - 43)) | (1 << (QuintParser.MAP - 43)))) !== 0))) { @@ -3122,13 +3143,14 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 66, QuintParser.RULE_nameAfterDot); let _la: number; try { - this.state = 730; + this.state = 733; this._errHandler.sync(this); switch (this._input.LA(1)) { - case QuintParser.IDENTIFIER: + case QuintParser.LOW_ID: + case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 728; + this.state = 731; this.qualId(); } break; @@ -3138,7 +3160,7 @@ export class QuintParser extends Parser { case QuintParser.IMPLIES: this.enterOuterAlt(_localctx, 2); { - this.state = 729; + this.state = 732; _localctx._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 43)) & ~0x1F) === 0 && ((1 << (_la - 43)) & ((1 << (QuintParser.AND - 43)) | (1 << (QuintParser.OR - 43)) | (1 << (QuintParser.IFF - 43)) | (1 << (QuintParser.IMPLIES - 43)))) !== 0))) { @@ -3179,7 +3201,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 732; + this.state = 735; _la = this._input.LA(1); if (!(((((_la - 31)) & ~0x1F) === 0 && ((1 << (_la - 31)) & ((1 << (QuintParser.T__30 - 31)) | (1 << (QuintParser.AND - 31)) | (1 << (QuintParser.OR - 31)) | (1 << (QuintParser.IFF - 31)) | (1 << (QuintParser.IMPLIES - 31)) | (1 << (QuintParser.PLUS - 31)) | (1 << (QuintParser.MINUS - 31)) | (1 << (QuintParser.MUL - 31)) | (1 << (QuintParser.DIV - 31)) | (1 << (QuintParser.MOD - 31)) | (1 << (QuintParser.GT - 31)) | (1 << (QuintParser.LT - 31)) | (1 << (QuintParser.GE - 31)) | (1 << (QuintParser.LE - 31)) | (1 << (QuintParser.NE - 31)) | (1 << (QuintParser.EQ - 31)))) !== 0))) { this._errHandler.recoverInline(this); @@ -3215,7 +3237,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 734; + this.state = 737; _la = this._input.LA(1); if (!(((((_la - 40)) & ~0x1F) === 0 && ((1 << (_la - 40)) & ((1 << (QuintParser.STRING - 40)) | (1 << (QuintParser.BOOL - 40)) | (1 << (QuintParser.INT - 40)))) !== 0))) { this._errHandler.recoverInline(this); @@ -3251,23 +3273,23 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 736; - this.match(QuintParser.IDENTIFIER); - this.state = 741; + this.state = 739; + this.identifier(); + this.state = 744; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 80, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 737; + this.state = 740; this.match(QuintParser.T__38); - this.state = 738; - this.match(QuintParser.IDENTIFIER); + this.state = 741; + this.identifier(); } } } - this.state = 743; + this.state = 746; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 80, this._ctx); } @@ -3292,21 +3314,21 @@ export class QuintParser extends Parser { let _localctx: SimpleIdContext = new SimpleIdContext(this._ctx, this.state, context); this.enterRule(_localctx, 74, QuintParser.RULE_simpleId); try { - this.state = 748; + this.state = 751; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 81, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 744; - this.match(QuintParser.IDENTIFIER); + this.state = 747; + this.identifier(); } break; case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 745; + this.state = 748; _localctx._qualId = this.qualId(); const err = quintErrorToString( @@ -3334,6 +3356,42 @@ export class QuintParser extends Parser { } return _localctx; } + // @RuleVersion(0) + public identifier(): IdentifierContext { + let _localctx: IdentifierContext = new IdentifierContext(this._ctx, this.state); + this.enterRule(_localctx, 76, QuintParser.RULE_identifier); + let _la: number; + try { + this.enterOuterAlt(_localctx, 1); + { + this.state = 753; + _la = this._input.LA(1); + if (!(_la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID)) { + this._errHandler.recoverInline(this); + } else { + if (this._input.LA(1) === Token.EOF) { + this.matchedEOF = true; + } + + this._errHandler.reportMatch(this); + this.consume(); + } + } + } + catch (re) { + if (re instanceof RecognitionException) { + _localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return _localctx; + } public sempred(_localctx: RuleContext, ruleIndex: number, predIndex: number): boolean { switch (ruleIndex) { @@ -3348,10 +3406,10 @@ export class QuintParser extends Parser { private type_sempred(_localctx: TypeContext, predIndex: number): boolean { switch (predIndex) { case 0: - return this.precpred(this._ctx, 12); + return this.precpred(this._ctx, 13); case 1: - return this.precpred(this._ctx, 11); + return this.precpred(this._ctx, 12); } return true; } @@ -3398,403 +3456,405 @@ export class QuintParser extends Parser { private static readonly _serializedATNSegments: number = 2; private static readonly _serializedATNSegment0: string = - "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03G\u02F1\x04\x02" + + "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03H\u02F6\x04\x02" + "\t\x02\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06\x04\x07" + "\t\x07\x04\b\t\b\x04\t\t\t\x04\n\t\n\x04\v\t\v\x04\f\t\f\x04\r\t\r\x04" + "\x0E\t\x0E\x04\x0F\t\x0F\x04\x10\t\x10\x04\x11\t\x11\x04\x12\t\x12\x04" + "\x13\t\x13\x04\x14\t\x14\x04\x15\t\x15\x04\x16\t\x16\x04\x17\t\x17\x04" + "\x18\t\x18\x04\x19\t\x19\x04\x1A\t\x1A\x04\x1B\t\x1B\x04\x1C\t\x1C\x04" + "\x1D\t\x1D\x04\x1E\t\x1E\x04\x1F\t\x1F\x04 \t \x04!\t!\x04\"\t\"\x04#" + - "\t#\x04$\t$\x04%\t%\x04&\t&\x04\'\t\'\x03\x02\x06\x02P\n\x02\r\x02\x0E" + - "\x02Q\x03\x02\x03\x02\x03\x03\x07\x03W\n\x03\f\x03\x0E\x03Z\v\x03\x03" + - "\x03\x03\x03\x03\x03\x03\x03\x07\x03`\n\x03\f\x03\x0E\x03c\v\x03\x03\x03" + - "\x03\x03\x03\x04\x07\x04h\n\x04\f\x04\x0E\x04k\v\x04\x03\x04\x03\x04\x03" + - "\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03" + + "\t#\x04$\t$\x04%\t%\x04&\t&\x04\'\t\'\x04(\t(\x03\x02\x06\x02R\n\x02\r" + + "\x02\x0E\x02S\x03\x02\x03\x02\x03\x03\x07\x03Y\n\x03\f\x03\x0E\x03\\\v" + + "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x07\x03b\n\x03\f\x03\x0E\x03e\v\x03" + + "\x03\x03\x03\x03\x03\x04\x07\x04j\n\x04\f\x04\x0E\x04m\v\x04\x03\x04\x03" + + "\x04\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03" + "\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03" + - "\x05\x03\x05\x05\x05\x83\n\x05\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06" + - "\x03\x06\x07\x06\x8B\n\x06\f\x06\x0E\x06\x8E\v\x06\x05\x06\x90\n\x06\x03" + - "\x06\x03\x06\x03\x06\x05\x06\x95\n\x06\x03\x06\x03\x06\x03\x06\x03\x06" + - "\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x07\x06\xA2\n" + - "\x06\f\x06\x0E\x06\xA5\v\x06\x03\x06\x03\x06\x03\x06\x03\x06\x05\x06\xAB" + - "\n\x06\x03\x06\x03\x06\x05\x06\xAF\n\x06\x03\x06\x05\x06\xB2\n\x06\x03" + - "\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03" + - "\x07\x03\x07\x05\x07\xBF\n\x07\x03\x07\x03\x07\x03\x07\x07\x07\xC4\n\x07" + - "\f\x07\x0E\x07\xC7\v\x07\x05\x07\xC9\n\x07\x03\b\x03\b\x03\b\x03\b\x03" + - "\b\x05\b\xD0\n\b\x03\t\x03\t\x03\t\x03\t\x05\t\xD6\n\t\x03\t\x03\t\x03" + - "\t\x05\t\xDB\n\t\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n" + - "\x05\n\xE6\n\n\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x05\v\xEE\n\v\x03\v" + - "\x03\v\x03\v\x03\v\x05\v\xF4\n\v\x03\v\x03\v\x05\v\xF8\n\v\x05\v\xFA\n" + - "\v\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x05\f\u0105\n" + - "\f\x05\f\u0107\n\f\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03" + - "\r\x03\r\x03\r\x07\r\u0114\n\r\f\r\x0E\r\u0117\v\r\x03\r\x03\r\x03\r\x03" + - "\r\x03\r\x05\r\u011E\n\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03" + - "\r\x03\r\x03\r\x03\r\x07\r\u012B\n\r\f\r\x0E\r\u012E\v\r\x03\r\x03\r\x03" + - "\r\x03\r\x03\r\x05\r\u0135\n\r\x05\r\u0137\n\r\x03\x0E\x03\x0E\x03\x0F" + - "\x03\x0F\x03\x10\x03\x10\x03\x11\x03\x11\x03\x12\x03\x12\x03\x12\x03\x12" + - "\x03\x12\x07\x12\u0146\n\x12\f\x12\x0E\x12\u0149\v\x12\x05\x12\u014B\n" + - "\x12\x03\x12\x05\x12\u014E\n\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12" + - "\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12" + - "\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x07\x12\u0163\n\x12\f\x12\x0E" + - "\x12\u0166\v\x12\x03\x12\x05\x12\u0169\n\x12\x03\x12\x03\x12\x03\x12\x03" + + "\x05\x03\x05\x03\x05\x05\x05\x85\n\x05\x03\x06\x03\x06\x03\x06\x03\x06" + + "\x03\x06\x03\x06\x07\x06\x8D\n\x06\f\x06\x0E\x06\x90\v\x06\x05\x06\x92" + + "\n\x06\x03\x06\x03\x06\x03\x06\x05\x06\x97\n\x06\x03\x06\x03\x06\x03\x06" + + "\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x07\x06" + + "\xA4\n\x06\f\x06\x0E\x06\xA7\v\x06\x03\x06\x03\x06\x03\x06\x03\x06\x05" + + "\x06\xAD\n\x06\x03\x06\x03\x06\x05\x06\xB1\n\x06\x03\x06\x05\x06\xB4\n" + + "\x06\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03" + + "\x07\x03\x07\x03\x07\x05\x07\xC1\n\x07\x03\x07\x03\x07\x03\x07\x07\x07" + + "\xC6\n\x07\f\x07\x0E\x07\xC9\v\x07\x05\x07\xCB\n\x07\x03\b\x03\b\x03\b" + + "\x03\b\x03\b\x05\b\xD2\n\b\x03\t\x03\t\x03\t\x03\t\x05\t\xD8\n\t\x03\t" + + "\x03\t\x03\t\x05\t\xDD\n\t\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03" + + "\n\x03\n\x05\n\xE8\n\n\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x05\v\xF0\n" + + "\v\x03\v\x03\v\x03\v\x03\v\x05\v\xF6\n\v\x03\v\x03\v\x05\v\xFA\n\v\x05" + + "\v\xFC\n\v\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x05\f" + + "\u0107\n\f\x05\f\u0109\n\f\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03" + + "\r\x03\r\x03\r\x03\r\x07\r\u0116\n\r\f\r\x0E\r\u0119\v\r\x03\r\x03\r\x03" + + "\r\x03\r\x03\r\x05\r\u0120\n\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03" + + "\r\x03\r\x03\r\x03\r\x03\r\x07\r\u012D\n\r\f\r\x0E\r\u0130\v\r\x03\r\x03" + + "\r\x03\r\x03\r\x03\r\x05\r\u0137\n\r\x05\r\u0139\n\r\x03\x0E\x03\x0E\x03" + + "\x0F\x03\x0F\x03\x10\x03\x10\x03\x11\x03\x11\x03\x12\x03\x12\x03\x12\x03" + + "\x12\x03\x12\x07\x12\u0148\n\x12\f\x12\x0E\x12\u014B\v\x12\x05\x12\u014D" + + "\n\x12\x03\x12\x05\x12\u0150\n\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03" + "\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03" + - "\x12\x03\x12\x05\x12\u0179\n\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12" + - "\x03\x12\x07\x12\u0181\n\x12\f\x12\x0E\x12\u0184\v\x12\x03\x13\x03\x13" + - "\x03\x13\x03\x13\x03\x13\x07\x13\u018B\n\x13\f\x13\x0E\x13\u018E\v\x13" + - "\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x05\x13\u0197" + - "\n\x13\x05\x13\u0199\n\x13\x03\x13\x03\x13\x05\x13\u019D\n\x13\x03\x14" + - "\x03\x14\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x05\x15\u01A6\n\x15\x03" + + "\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x07\x12\u0165\n\x12\f\x12" + + "\x0E\x12\u0168\v\x12\x03\x12\x05\x12\u016B\n\x12\x03\x12\x03\x12\x03\x12" + + "\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12" + + "\x03\x12\x03\x12\x03\x12\x05\x12\u017C\n\x12\x03\x12\x03\x12\x03\x12\x03" + + "\x12\x03\x12\x03\x12\x07\x12\u0184\n\x12\f\x12\x0E\x12\u0187\v\x12\x03" + + "\x13\x03\x13\x03\x13\x03\x13\x03\x13\x07\x13\u018E\n\x13\f\x13\x0E\x13" + + "\u0191\v\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x05" + + "\x13\u019A\n\x13\x05\x13\u019C\n\x13\x03\x13\x03\x13\x05\x13\u01A0\n\x13" + + "\x03\x14\x03\x14\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x05\x15\u01A9" + + "\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15" + + "\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15\u01B9\n\x15\f" + + "\x15\x0E\x15\u01BC\v\x15\x03\x15\x05\x15\u01BF\n\x15\x03\x15\x03\x15\x03" + + "\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15\u01C8\n\x15\f\x15\x0E\x15" + + "\u01CB\v\x15\x03\x15\x05\x15\u01CE\n\x15\x03\x15\x03\x15\x03\x15\x03\x15" + + "\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15\u01D8\n\x15\f\x15\x0E\x15\u01DB" + + "\v\x15\x03\x15\x05\x15\u01DE\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03" + + "\x15\x03\x15\x03\x15\x07\x15\u01E7\n\x15\f\x15\x0E\x15\u01EA\v\x15\x03" + + "\x15\x05\x15\u01ED\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15" + + "\x05\x15\u01F5\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07" + + "\x15\u01FD\n\x15\f\x15\x0E\x15\u0200\v\x15\x03\x15\x05\x15\u0203\n\x15" + + "\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15\u020B\n\x15\f" + + "\x15\x0E\x15\u020E\v\x15\x03\x15\x05\x15\u0211\n\x15\x03\x15\x03\x15\x03" + + "\x15\x03\x15\x03\x15\x03\x15\x07\x15\u0219\n\x15\f\x15\x0E\x15\u021C\v" + + "\x15\x05\x15\u021E\n\x15\x03\x15\x05\x15\u0221\n\x15\x03\x15\x03\x15\x03" + "\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15\u01B6\n\x15\f\x15\x0E\x15" + - "\u01B9\v\x15\x03\x15\x05\x15\u01BC\n\x15\x03\x15\x03\x15\x03\x15\x03\x15" + - "\x03\x15\x03\x15\x03\x15\x07\x15\u01C5\n\x15\f\x15\x0E\x15\u01C8\v\x15" + - "\x03\x15\x05\x15\u01CB\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x07\x15\u01D5\n\x15\f\x15\x0E\x15\u01D8\v\x15\x03" + - "\x15\x05\x15\u01DB\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15" + - "\x03\x15\x07\x15\u01E4\n\x15\f\x15\x0E\x15\u01E7\v\x15\x03\x15\x05\x15" + - "\u01EA\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x05\x15\u01F2" + - "\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15\u01FA\n" + - "\x15\f\x15\x0E\x15\u01FD\v\x15\x03\x15\x05\x15\u0200\n\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15\u0208\n\x15\f\x15\x0E\x15" + - "\u020B\v\x15\x03\x15\x05\x15\u020E\n\x15\x03\x15\x03\x15\x03\x15\x03\x15" + - "\x03\x15\x03\x15\x07\x15\u0216\n\x15\f\x15\x0E\x15\u0219\v\x15\x05\x15" + - "\u021B\n\x15\x03\x15\x05\x15\u021E\n\x15\x03\x15\x03\x15\x03\x15\x03\x15" + + "\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03" + + "\x15\x03\x15\x03\x15\x05\x15\u023A\n\x15\x03\x15\x03\x15\x03\x15\x03\x15" + "\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15" + "\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15" + - "\x03\x15\x05\x15\u0237\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x03\x15\x03\x15\x05\x15\u025E\n\x15\x03\x15\x05\x15" + - "\u0261\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15\u0268\n\x15" + - "\f\x15\x0E\x15\u026B\v\x15\x03\x16\x03\x16\x03\x16\x03\x16\x05\x16\u0271" + - "\n\x16\x03\x16\x03\x16\x03\x16\x07\x16\u0276\n\x16\f\x16\x0E\x16\u0279" + - "\v\x16\x03\x16\x03\x16\x03\x17\x03\x17\x05\x17\u027F\n\x17\x03\x17\x03" + - "\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u0288\n\x18\x03\x18" + - "\x05\x18\u028B\n\x18\x03\x19\x03\x19\x03\x19\x03\x19\x03\x19\x03\x19\x03" + - "\x19\x03\x19\x03\x19\x05\x19\u0296\n\x19\x03\x1A\x03\x1A\x05\x1A\u029A" + - "\n\x1A\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B" + - "\x07\x1B\u02A4\n\x1B\f\x1B\x0E\x1B\u02A7\v\x1B\x03\x1B\x03\x1B\x03\x1B" + - "\x03\x1B\x05\x1B\u02AD\n\x1B\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x06" + - "\x1C\u02B4\n\x1C\r\x1C\x0E\x1C\u02B5\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03" + - "\x1C\x03\x1D\x03\x1D\x05\x1D\u02BF\n\x1D\x03\x1E\x03\x1E\x03\x1F\x03\x1F" + - "\x05\x1F\u02C5\n\x1F\x03 \x03 \x03 \x07 \u02CA\n \f \x0E \u02CD\v \x03" + - "!\x03!\x03!\x03!\x03!\x03!\x05!\u02D5\n!\x03\"\x03\"\x05\"\u02D9\n\"\x03" + - "#\x03#\x05#\u02DD\n#\x03$\x03$\x03%\x03%\x03&\x03&\x03&\x07&\u02E6\n&" + - "\f&\x0E&\u02E9\v&\x03\'\x03\'\x03\'\x03\'\x05\'\u02EF\n\'\x03\'\x02\x02" + - "\x04\"((\x02\x02\x04\x02\x06\x02\b\x02\n\x02\f\x02\x0E\x02\x10\x02\x12" + - "\x02\x14\x02\x16\x02\x18\x02\x1A\x02\x1C\x02\x1E\x02 \x02\"\x02$\x02&" + - "\x02(\x02*\x02,\x02.\x020\x022\x024\x026\x028\x02:\x02<\x02>\x02@\x02" + - "B\x02D\x02F\x02H\x02J\x02L\x02\x02\t\x03\x0279\x03\x0256\x03\x02:?\x03" + - "\x02-3\x03\x02-0\x05\x02!!-05?\x03\x02*,\x02\u0351\x02O\x03\x02\x02\x02" + - "\x04X\x03\x02\x02\x02\x06i\x03\x02\x02\x02\b\x82\x03\x02\x02\x02\n\x84" + - "\x03\x02\x02\x02\f\xC8\x03\x02\x02\x02\x0E\xCA\x03\x02\x02\x02\x10\xD1" + - "\x03\x02\x02\x02\x12\xE5\x03\x02\x02\x02\x14\xF9\x03\x02\x02\x02\x16\u0106" + - "\x03\x02\x02\x02\x18\u0136\x03\x02\x02\x02\x1A\u0138\x03\x02\x02\x02\x1C" + - "\u013A\x03\x02\x02\x02\x1E\u013C\x03\x02\x02\x02 \u013E\x03\x02\x02\x02" + - "\"\u0178\x03\x02\x02\x02$\u019C\x03\x02\x02\x02&\u019E\x03\x02\x02\x02" + - "(\u0236\x03\x02\x02\x02*\u026C\x03\x02\x02\x02,\u027E\x03\x02\x02\x02" + - ".\u0283\x03\x02\x02\x020\u0295\x03\x02\x02\x022\u0299\x03\x02\x02\x02" + - "4\u02AC\x03\x02\x02\x026\u02AE\x03\x02\x02\x028\u02BE\x03\x02\x02\x02" + - ":\u02C0\x03\x02\x02\x02<\u02C4\x03\x02\x02\x02>\u02C6\x03\x02\x02\x02" + - "@\u02D4\x03\x02\x02\x02B\u02D8\x03\x02\x02\x02D\u02DC\x03\x02\x02\x02" + - "F\u02DE\x03\x02\x02\x02H\u02E0\x03\x02\x02\x02J\u02E2\x03\x02\x02\x02" + - "L\u02EE\x03\x02\x02\x02NP\x05\x04\x03\x02ON\x03\x02\x02\x02PQ\x03\x02" + - "\x02\x02QO\x03\x02\x02\x02QR\x03\x02\x02\x02RS\x03\x02\x02\x02ST\x07\x02" + - "\x02\x03T\x03\x03\x02\x02\x02UW\x07D\x02\x02VU\x03\x02\x02\x02WZ\x03\x02" + - "\x02\x02XV\x03\x02\x02\x02XY\x03\x02\x02\x02Y[\x03\x02\x02\x02ZX\x03\x02" + - "\x02\x02[\\\x07\x03\x02\x02\\]\x05J&\x02]a\x07\x04\x02\x02^`\x05\x06\x04" + - "\x02_^\x03\x02\x02\x02`c\x03\x02\x02\x02a_\x03\x02\x02\x02ab\x03\x02\x02" + - "\x02bd\x03\x02\x02\x02ca\x03\x02\x02\x02de\x07\x05\x02\x02e\x05\x03\x02" + - "\x02\x02fh\x07D\x02\x02gf\x03\x02\x02\x02hk\x03\x02\x02\x02ig\x03\x02" + - "\x02\x02ij\x03\x02\x02\x02jl\x03\x02\x02\x02ki\x03\x02\x02\x02lm\x05\b" + - "\x05\x02m\x07\x03\x02\x02\x02no\x07\x06\x02\x02op\x05J&\x02pq\x07\x07" + - "\x02\x02qr\x05\"\x12\x02r\x83\x03\x02\x02\x02st\x07\b\x02\x02tu\x05J&" + - "\x02uv\x07\x07\x02\x02vw\x05\"\x12\x02w\x83\x03\x02\x02\x02xy\x07\t\x02" + - "\x02yz\x058\x1D\x02z{\x07@\x02\x02{|\x05(\x15\x02|\x83\x03\x02\x02\x02" + - "}\x83\x05\x18\r\x02~\x83\x05\n\x06\x02\x7F\x83\x05\f\x07\x02\x80\x83\x05" + - "\x14\v\x02\x81\x83\x05\x16\f\x02\x82n\x03\x02\x02\x02\x82s\x03\x02\x02" + - "\x02\x82x\x03\x02\x02\x02\x82}\x03\x02\x02\x02\x82~\x03\x02\x02\x02\x82" + - "\x7F\x03\x02\x02\x02\x82\x80\x03\x02\x02\x02\x82\x81\x03\x02\x02\x02\x83" + - "\t\x03\x02\x02\x02\x84\x85\x05\x12\n\x02\x85\xAA\x05B\"\x02\x86\x8F\x07" + - "A\x02\x02\x87\x8C\x05:\x1E\x02\x88\x89\x07\n\x02\x02\x89\x8B\x05:\x1E" + - "\x02\x8A\x88\x03\x02\x02\x02\x8B\x8E\x03\x02\x02\x02\x8C\x8A\x03\x02\x02" + - "\x02\x8C\x8D\x03\x02\x02\x02\x8D\x90\x03\x02\x02\x02\x8E\x8C\x03\x02\x02" + - "\x02\x8F\x87\x03\x02\x02\x02\x8F\x90\x03\x02\x02\x02\x90\x91\x03\x02\x02" + - "\x02\x91\x94\x07B\x02\x02\x92\x93\x07\x07\x02\x02\x93\x95\x05\"\x12\x02" + - "\x94\x92\x03\x02\x02\x02\x94\x95\x03\x02\x02\x02\x95\xAB\x03\x02\x02\x02" + - "\x96\x97\x07\x07\x02\x02\x97\xAB\x05\"\x12\x02\x98\x99\x07A\x02\x02\x99" + - "\x9A\x05:\x1E\x02\x9A\x9B\x07\x07\x02\x02\x9B\xA3\x05\"\x12\x02\x9C\x9D" + - "\x07\n\x02\x02\x9D\x9E\x05:\x1E\x02\x9E\x9F\x07\x07\x02\x02\x9F\xA0\x05" + - "\"\x12\x02\xA0\xA2\x03\x02\x02\x02\xA1\x9C\x03\x02\x02\x02\xA2\xA5\x03" + - "\x02\x02\x02\xA3\xA1\x03\x02\x02\x02\xA3\xA4\x03\x02\x02\x02\xA4\xA6\x03" + - "\x02\x02\x02\xA5\xA3\x03\x02\x02\x02\xA6\xA7\x07B\x02\x02\xA7\xA8\x07" + - "\x07\x02\x02\xA8\xA9\x05\"\x12\x02\xA9\xAB\x03\x02\x02\x02\xAA\x86\x03" + - "\x02\x02\x02\xAA\x96\x03\x02\x02\x02\xAA\x98\x03\x02\x02\x02\xAA\xAB\x03" + - "\x02\x02\x02\xAB\xAE\x03\x02\x02\x02\xAC\xAD\x07@\x02\x02\xAD\xAF\x05" + - "(\x15\x02\xAE\xAC\x03\x02\x02\x02\xAE\xAF\x03\x02\x02\x02\xAF\xB1\x03" + - "\x02\x02\x02\xB0\xB2\x07\v\x02\x02\xB1\xB0\x03\x02\x02\x02\xB1\xB2\x03" + - "\x02\x02\x02\xB2\v\x03\x02\x02\x02\xB3\xB4\x07\f\x02\x02\xB4\xC9\x05J" + - "&\x02\xB5\xB6\x07\f\x02\x02\xB6\xB7\x05J&\x02\xB7\xB8\x07@\x02\x02\xB8" + - "\xB9\x05\"\x12\x02\xB9\xC9\x03\x02\x02\x02\xBA\xBB\x07\f\x02\x02\xBB\xBC" + - "\x05J&\x02\xBC\xBE\x07@\x02\x02\xBD\xBF\x07\r\x02\x02\xBE\xBD\x03\x02" + - "\x02\x02\xBE\xBF\x03\x02\x02\x02\xBF\xC0\x03\x02\x02\x02\xC0\xC5\x05\x0E" + - "\b\x02\xC1\xC2\x07\r\x02\x02\xC2\xC4\x05\x0E\b\x02\xC3\xC1\x03\x02\x02" + - "\x02\xC4\xC7\x03\x02\x02\x02\xC5\xC3\x03\x02\x02\x02\xC5\xC6\x03\x02\x02" + - "\x02\xC6\xC9\x03\x02\x02\x02\xC7\xC5\x03\x02\x02\x02\xC8\xB3\x03\x02\x02" + - "\x02\xC8\xB5\x03\x02\x02\x02\xC8\xBA\x03\x02\x02\x02\xC9\r\x03\x02\x02" + - "\x02\xCA\xCF\x05L\'\x02\xCB\xCC\x07A\x02\x02\xCC\xCD\x05\"\x12\x02\xCD" + - "\xCE\x07B\x02\x02\xCE\xD0\x03\x02\x02\x02\xCF\xCB\x03\x02\x02\x02\xCF" + - "\xD0\x03\x02\x02\x02\xD0\x0F\x03\x02\x02\x02\xD1\xD2\x07\x0E\x02\x02\xD2" + - "\xD5\x05J&\x02\xD3\xD4\x07\x07\x02\x02\xD4\xD6\x05\"\x12\x02\xD5\xD3\x03" + - "\x02\x02\x02\xD5\xD6\x03\x02\x02\x02\xD6\xD7\x03\x02\x02\x02\xD7\xD8\x07" + - "@\x02\x02\xD8\xDA\x05(\x15\x02\xD9\xDB\x07\v\x02\x02\xDA\xD9\x03\x02\x02" + - "\x02\xDA\xDB\x03\x02\x02\x02\xDB\x11\x03\x02\x02\x02\xDC\xE6\x07\x0F\x02" + - "\x02\xDD\xE6\x07\x10\x02\x02\xDE\xDF\x07\x11\x02\x02\xDF\xE6\x07\x0F\x02" + - "\x02\xE0\xE1\x07\x11\x02\x02\xE1\xE6\x07\x10\x02\x02\xE2\xE6\x07\x12\x02" + - "\x02\xE3\xE6\x07\x13\x02\x02\xE4\xE6\x07\x14\x02\x02\xE5\xDC\x03\x02\x02" + - "\x02\xE5\xDD\x03\x02\x02\x02\xE5\xDE\x03\x02\x02\x02\xE5\xE0\x03\x02\x02" + - "\x02\xE5\xE2\x03\x02\x02\x02\xE5\xE3\x03\x02\x02\x02\xE5\xE4\x03\x02\x02" + - "\x02\xE6\x13\x03\x02\x02\x02\xE7\xE8\x07\x15\x02\x02\xE8\xE9\x05\x1C\x0F" + - "\x02\xE9\xEA\x07\x16\x02\x02\xEA\xED\x05<\x1F\x02\xEB\xEC\x07\x17\x02" + - "\x02\xEC\xEE\x05 \x11\x02\xED\xEB\x03\x02\x02\x02\xED\xEE\x03\x02\x02" + - "\x02\xEE\xFA\x03\x02\x02\x02\xEF\xF0\x07\x15\x02\x02\xF0\xF3\x05\x1C\x0F" + - "\x02\xF1\xF2\x07\x18\x02\x02\xF2\xF4\x05\x1C\x0F\x02\xF3\xF1\x03\x02\x02" + - "\x02\xF3\xF4\x03\x02\x02\x02\xF4\xF7\x03\x02\x02\x02\xF5\xF6\x07\x17\x02" + - "\x02\xF6\xF8\x05 \x11\x02\xF7\xF5\x03\x02\x02\x02\xF7\xF8\x03\x02\x02" + - "\x02\xF8\xFA\x03\x02\x02\x02\xF9\xE7\x03\x02\x02\x02\xF9\xEF\x03\x02\x02" + - "\x02\xFA\x15\x03\x02\x02\x02\xFB\xFC\x07\x19\x02\x02\xFC\xFD\x05\x1C\x0F" + - "\x02\xFD\xFE\x07\x16\x02\x02\xFE\xFF\x05<\x1F\x02\xFF\u0107\x03\x02\x02" + - "\x02\u0100\u0101\x07\x19\x02\x02\u0101\u0104\x05\x1C\x0F\x02\u0102\u0103" + - "\x07\x18\x02\x02\u0103\u0105\x05\x1C\x0F\x02\u0104\u0102\x03\x02\x02\x02" + - "\u0104\u0105\x03\x02\x02\x02\u0105\u0107\x03\x02\x02\x02\u0106\xFB\x03" + - "\x02\x02\x02\u0106\u0100\x03\x02\x02\x02\u0107\x17\x03\x02\x02\x02\u0108" + - "\u0109\x07\x15\x02\x02\u0109\u010A\x05\x1A\x0E\x02\u010A\u010B\x07A\x02" + - "\x02\u010B\u010C\x05\x1C\x0F\x02\u010C\u010D\x07@\x02\x02\u010D\u0115" + - "\x05(\x15\x02\u010E\u010F\x07\n\x02\x02\u010F\u0110\x05\x1C\x0F\x02\u0110" + - "\u0111\x07@\x02\x02\u0111\u0112\x05(\x15\x02\u0112\u0114\x03\x02\x02\x02" + - "\u0113\u010E\x03\x02\x02\x02\u0114\u0117\x03\x02\x02\x02\u0115\u0113\x03" + - "\x02\x02\x02\u0115\u0116\x03\x02\x02\x02\u0116\u0118\x03\x02\x02\x02\u0117" + - "\u0115\x03\x02\x02\x02\u0118\u0119\x07B\x02\x02\u0119\u011A\x07\x16\x02" + - "\x02\u011A\u011D\x077\x02\x02\u011B\u011C\x07\x17\x02\x02\u011C\u011E" + - "\x05 \x11\x02\u011D\u011B\x03\x02\x02\x02\u011D\u011E\x03\x02\x02\x02" + - "\u011E\u0137\x03\x02\x02\x02\u011F\u0120\x07\x15\x02\x02\u0120\u0121\x05" + - "\x1A\x0E\x02\u0121\u0122\x07A\x02\x02\u0122\u0123\x05\x1C\x0F\x02\u0123" + - "\u0124\x07@\x02\x02\u0124\u012C\x05(\x15\x02\u0125\u0126\x07\n\x02\x02" + - "\u0126\u0127\x05\x1C\x0F\x02\u0127\u0128\x07@\x02\x02\u0128\u0129\x05" + - "(\x15\x02\u0129\u012B\x03\x02\x02\x02\u012A\u0125\x03\x02\x02\x02\u012B" + - "\u012E\x03\x02\x02\x02\u012C\u012A\x03\x02\x02\x02\u012C\u012D\x03\x02" + - "\x02\x02\u012D\u012F\x03\x02\x02\x02\u012E\u012C\x03\x02\x02\x02\u012F" + - "\u0130\x07B\x02\x02\u0130\u0131\x07\x18\x02\x02\u0131\u0134\x05\x1E\x10" + - "\x02\u0132\u0133\x07\x17\x02\x02\u0133\u0135\x05 \x11\x02\u0134\u0132" + - "\x03\x02\x02\x02\u0134\u0135\x03\x02\x02\x02\u0135\u0137\x03\x02\x02\x02" + - "\u0136\u0108\x03\x02\x02\x02\u0136\u011F\x03\x02\x02\x02\u0137\x19\x03" + - "\x02\x02\x02\u0138\u0139\x05J&\x02\u0139\x1B\x03\x02\x02\x02\u013A\u013B" + - "\x05J&\x02\u013B\x1D\x03\x02\x02\x02\u013C\u013D\x05J&\x02\u013D\x1F\x03" + - "\x02\x02\x02\u013E\u013F\x07*\x02\x02\u013F!\x03\x02\x02\x02\u0140\u0141" + - "\b\x12\x01\x02\u0141\u014A\x07A\x02\x02\u0142\u0147\x05\"\x12\x02\u0143" + - "\u0144\x07\n\x02\x02\u0144\u0146\x05\"\x12\x02\u0145\u0143\x03\x02\x02" + - "\x02\u0146\u0149\x03\x02\x02\x02\u0147\u0145\x03\x02\x02\x02\u0147\u0148" + - "\x03\x02\x02\x02\u0148\u014B\x03\x02\x02\x02\u0149\u0147\x03\x02\x02\x02" + - "\u014A\u0142\x03\x02\x02\x02\u014A\u014B\x03\x02\x02\x02\u014B\u014D\x03" + - "\x02\x02\x02\u014C\u014E\x07\n\x02\x02\u014D\u014C\x03\x02\x02\x02\u014D" + - "\u014E\x03\x02\x02\x02\u014E\u014F\x03\x02\x02\x02\u014F\u0150\x07B\x02" + - "\x02\u0150\u0151\x07\x1B\x02\x02\u0151\u0179\x05\"\x12\f\u0152\u0153\x07" + - "1\x02\x02\u0153\u0154\x07\x1C\x02\x02\u0154\u0155\x05\"\x12\x02\u0155" + - "\u0156\x07\x1D\x02\x02\u0156\u0179\x03\x02\x02\x02\u0157\u0158\x072\x02" + - "\x02\u0158\u0159\x07\x1C\x02\x02\u0159\u015A\x05\"\x12\x02\u015A\u015B" + - "\x07\x1D\x02\x02\u015B\u0179\x03\x02\x02\x02\u015C\u015D\x07A\x02\x02" + - "\u015D\u015E\x05\"\x12\x02\u015E\u015F\x07\n\x02\x02\u015F\u0164\x05\"" + - "\x12\x02\u0160\u0161\x07\n\x02\x02\u0161\u0163\x05\"\x12\x02\u0162\u0160" + - "\x03\x02\x02\x02\u0163\u0166\x03\x02\x02\x02\u0164\u0162\x03\x02\x02\x02" + - "\u0164\u0165\x03\x02\x02\x02\u0165\u0168\x03\x02\x02\x02\u0166\u0164\x03" + - "\x02\x02\x02\u0167\u0169\x07\n\x02\x02\u0168\u0167\x03\x02\x02\x02\u0168" + - "\u0169\x03\x02\x02\x02\u0169\u016A\x03\x02\x02\x02\u016A\u016B\x07B\x02" + - "\x02\u016B\u0179\x03\x02\x02\x02\u016C\u016D\x07\x04\x02\x02\u016D\u016E" + - "\x05$\x13\x02\u016E\u016F\x07\x05\x02\x02\u016F\u0179\x03\x02\x02\x02" + - "\u0170\u0179\x07\x1E\x02\x02\u0171\u0179\x07\x1F\x02\x02\u0172\u0179\x07" + - " \x02\x02\u0173\u0179\x05J&\x02\u0174\u0175\x07A\x02\x02\u0175\u0176\x05" + - "\"\x12\x02\u0176\u0177\x07B\x02\x02\u0177\u0179\x03\x02\x02\x02\u0178" + - "\u0140\x03\x02\x02\x02\u0178\u0152\x03\x02\x02\x02\u0178\u0157\x03\x02" + - "\x02\x02\u0178\u015C\x03\x02\x02\x02\u0178\u016C\x03\x02\x02\x02\u0178" + - "\u0170\x03\x02\x02\x02\u0178\u0171\x03\x02\x02\x02\u0178\u0172\x03\x02" + - "\x02\x02\u0178\u0173\x03\x02\x02\x02\u0178\u0174\x03\x02\x02\x02\u0179" + - "\u0182\x03\x02\x02\x02\u017A\u017B\f\x0E\x02\x02\u017B\u017C\x07\x1A\x02" + - "\x02\u017C\u0181\x05\"\x12\x0E\u017D\u017E\f\r\x02\x02\u017E\u017F\x07" + - "\x1B\x02\x02\u017F\u0181\x05\"\x12\r\u0180\u017A\x03\x02\x02\x02\u0180" + - "\u017D\x03\x02\x02\x02\u0181\u0184\x03\x02\x02\x02\u0182\u0180\x03\x02" + - "\x02\x02\u0182\u0183\x03\x02\x02\x02\u0183#\x03\x02\x02\x02\u0184\u0182" + - "\x03\x02\x02\x02\u0185\u0186\x05&\x14\x02\u0186\u0187\x07\x07\x02\x02" + - "\u0187\u0188\x05\"\x12\x02\u0188\u0189\x07\n\x02\x02\u0189\u018B\x03\x02" + - "\x02\x02\u018A\u0185\x03\x02\x02\x02\u018B\u018E\x03\x02\x02\x02\u018C" + - "\u018A\x03\x02\x02\x02\u018C\u018D\x03\x02\x02\x02\u018D\u0198\x03\x02" + - "\x02\x02\u018E\u018C\x03\x02\x02\x02\u018F\u0190\x05&\x14\x02\u0190\u0191" + - "\x07\x07\x02\x02\u0191\u0192\x05\"\x12\x02\u0192\u0196\x03\x02\x02\x02" + - "\u0193\u0197\x07\n\x02\x02\u0194\u0195\x07\r\x02\x02\u0195\u0197\x07C" + - "\x02\x02\u0196\u0193\x03\x02\x02\x02\u0196\u0194\x03\x02\x02\x02\u0196" + - "\u0197\x03\x02\x02\x02\u0197\u0199\x03\x02\x02\x02\u0198\u018F\x03\x02" + - "\x02\x02\u0198\u0199\x03\x02\x02\x02\u0199\u019D\x03\x02\x02\x02\u019A" + - "\u019B\x07\r\x02\x02\u019B\u019D\x07C\x02\x02\u019C\u018C\x03\x02\x02" + - "\x02\u019C\u019A\x03\x02\x02\x02\u019D%\x03\x02\x02\x02\u019E\u019F\x05" + - "L\'\x02\u019F\'\x03\x02\x02\x02\u01A0\u01A1\b\x15\x01\x02\u01A1\u0237" + - "\x052\x1A\x02\u01A2\u01A3\x05B\"\x02\u01A3\u01A5\x07A\x02\x02\u01A4\u01A6" + - "\x05> \x02\u01A5\u01A4\x03\x02\x02\x02\u01A5\u01A6\x03\x02\x02\x02\u01A6" + - "\u01A7\x03\x02\x02\x02\u01A7\u01A8\x07B\x02\x02\u01A8\u0237\x03\x02\x02" + - "\x02\u01A9\u01AA\x076\x02\x02\u01AA\u0237\x05(\x15\x1B\u01AB\u01AC\x05" + - "J&\x02\u01AC\u01AD\x07\"\x02\x02\u01AD\u01AE\x07@\x02\x02\u01AE\u01AF" + - "\x05(\x15\x17\u01AF\u0237\x03\x02\x02\x02\u01B0\u01B1\x07-\x02\x02\u01B1" + - "\u01B2\x07\x04\x02\x02\u01B2\u01B7\x05(\x15\x02\u01B3\u01B4\x07\n\x02" + - "\x02\u01B4\u01B6\x05(\x15\x02\u01B5\u01B3\x03\x02\x02\x02\u01B6\u01B9" + - "\x03\x02\x02\x02\u01B7\u01B5\x03\x02\x02\x02\u01B7\u01B8\x03\x02\x02\x02" + - "\u01B8\u01BB\x03\x02\x02\x02\u01B9\u01B7\x03\x02\x02\x02\u01BA\u01BC\x07" + - "\n\x02\x02\u01BB\u01BA\x03\x02\x02\x02\u01BB\u01BC\x03\x02\x02\x02\u01BC" + - "\u01BD\x03\x02\x02\x02\u01BD\u01BE\x07\x05\x02\x02\u01BE\u0237\x03\x02" + - "\x02\x02\u01BF\u01C0\x07.\x02\x02\u01C0\u01C1\x07\x04\x02\x02\u01C1\u01C6" + - "\x05(\x15\x02\u01C2\u01C3\x07\n\x02\x02\u01C3\u01C5\x05(\x15\x02\u01C4" + - "\u01C2\x03\x02\x02\x02\u01C5\u01C8\x03\x02\x02\x02\u01C6\u01C4\x03\x02" + - "\x02\x02\u01C6\u01C7\x03\x02\x02\x02\u01C7\u01CA\x03\x02\x02\x02\u01C8" + - "\u01C6\x03\x02\x02\x02\u01C9\u01CB\x07\n\x02\x02\u01CA\u01C9\x03\x02\x02" + - "\x02\u01CA\u01CB\x03\x02\x02\x02\u01CB\u01CC\x03\x02\x02\x02\u01CC\u01CD" + - "\x07\x05\x02\x02\u01CD\u0237\x03\x02\x02\x02\u01CE\u0237\x05*\x16\x02" + - "\u01CF\u01D0\x07#\x02\x02\u01D0\u01D1\x07\x04\x02\x02\u01D1\u01D6\x05" + - "(\x15\x02\u01D2\u01D3\x07\n\x02\x02\u01D3\u01D5\x05(\x15\x02\u01D4\u01D2" + - "\x03\x02\x02\x02\u01D5\u01D8\x03\x02\x02\x02\u01D6\u01D4\x03\x02\x02\x02" + - "\u01D6\u01D7\x03\x02\x02\x02\u01D7\u01DA\x03\x02\x02\x02\u01D8\u01D6\x03" + - "\x02\x02\x02\u01D9\u01DB\x07\n\x02\x02\u01DA\u01D9\x03\x02\x02\x02\u01DA" + - "\u01DB\x03\x02\x02\x02\u01DB\u01DC\x03\x02\x02\x02\u01DC\u01DD\x07\x05" + - "\x02\x02\u01DD\u0237\x03\x02\x02\x02\u01DE\u01DF\x07$\x02\x02\u01DF\u01E0" + - "\x07\x04\x02\x02\u01E0\u01E5\x05(\x15\x02\u01E1\u01E2\x07\n\x02\x02\u01E2" + - "\u01E4\x05(\x15\x02\u01E3\u01E1\x03\x02\x02\x02\u01E4\u01E7\x03\x02\x02" + - "\x02\u01E5\u01E3\x03\x02\x02\x02\u01E5\u01E6\x03\x02\x02\x02\u01E6\u01E9" + - "\x03\x02\x02\x02\u01E7\u01E5\x03\x02\x02\x02\u01E8\u01EA\x07\n\x02\x02" + - "\u01E9\u01E8\x03\x02\x02\x02\u01E9\u01EA\x03\x02\x02\x02\u01EA\u01EB\x03" + - "\x02\x02\x02\u01EB\u01EC\x07\x05\x02\x02\u01EC\u0237\x03\x02\x02\x02\u01ED" + - "\u01F2\x05J&\x02\u01EE\u01F2\x07,\x02\x02\u01EF\u01F2\x07+\x02\x02\u01F0" + - "\u01F2\x07*\x02\x02\u01F1\u01ED\x03\x02\x02\x02\u01F1\u01EE\x03\x02\x02" + - "\x02\u01F1\u01EF\x03\x02\x02\x02\u01F1\u01F0\x03\x02\x02\x02\u01F2\u0237" + - "\x03\x02\x02\x02\u01F3\u01F4\x07A\x02\x02\u01F4\u01F5\x05(\x15\x02\u01F5" + - "\u01F6\x07\n\x02\x02\u01F6\u01FB\x05(\x15\x02\u01F7\u01F8\x07\n\x02\x02" + - "\u01F8\u01FA\x05(\x15\x02\u01F9\u01F7\x03\x02\x02\x02\u01FA\u01FD\x03" + - "\x02"; + "\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15" + + "\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x05\x15\u0261\n\x15\x03" + + "\x15\x05\x15\u0264\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15" + + "\u026B\n\x15\f\x15\x0E\x15\u026E\v\x15\x03\x16\x03\x16\x03\x16\x03\x16" + + "\x05\x16\u0274\n\x16\x03\x16\x03\x16\x03\x16\x07\x16\u0279\n\x16\f\x16" + + "\x0E\x16\u027C\v\x16\x03\x16\x03\x16\x03\x17\x03\x17\x05\x17\u0282\n\x17" + + "\x03\x17\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u028B" + + "\n\x18\x03\x18\x05\x18\u028E\n\x18\x03\x19\x03\x19\x03\x19\x03\x19\x03" + + "\x19\x03\x19\x03\x19\x03\x19\x03\x19\x05\x19\u0299\n\x19\x03\x1A\x03\x1A" + + "\x05\x1A\u029D\n\x1A\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03" + + "\x1B\x03\x1B\x07\x1B\u02A7\n\x1B\f\x1B\x0E\x1B\u02AA\v\x1B\x03\x1B\x03" + + "\x1B\x03\x1B\x03\x1B\x05\x1B\u02B0\n\x1B\x03\x1C\x03\x1C\x03\x1C\x03\x1C" + + "\x03\x1C\x06\x1C\u02B7\n\x1C\r\x1C\x0E\x1C\u02B8\x03\x1C\x03\x1C\x03\x1C" + + "\x03\x1C\x03\x1C\x03\x1D\x03\x1D\x05\x1D\u02C2\n\x1D\x03\x1E\x03\x1E\x03" + + "\x1F\x03\x1F\x05\x1F\u02C8\n\x1F\x03 \x03 \x03 \x07 \u02CD\n \f \x0E " + + "\u02D0\v \x03!\x03!\x03!\x03!\x03!\x03!\x05!\u02D8\n!\x03\"\x03\"\x05" + + "\"\u02DC\n\"\x03#\x03#\x05#\u02E0\n#\x03$\x03$\x03%\x03%\x03&\x03&\x03" + + "&\x07&\u02E9\n&\f&\x0E&\u02EC\v&\x03\'\x03\'\x03\'\x03\'\x05\'\u02F2\n" + + "\'\x03(\x03(\x03(\x02\x02\x04\"()\x02\x02\x04\x02\x06\x02\b\x02\n\x02" + + "\f\x02\x0E\x02\x10\x02\x12\x02\x14\x02\x16\x02\x18\x02\x1A\x02\x1C\x02" + + "\x1E\x02 \x02\"\x02$\x02&\x02(\x02*\x02,\x02.\x020\x022\x024\x026\x02" + + "8\x02:\x02<\x02>\x02@\x02B\x02D\x02F\x02H\x02J\x02L\x02N\x02\x02\n\x03" + + "\x0279\x03\x0256\x03\x02:?\x03\x02-3\x03\x02-0\x05\x02!!-05?\x03\x02*" + + ",\x03\x02CD\x02\u0356\x02Q\x03\x02\x02\x02\x04Z\x03\x02\x02\x02\x06k\x03" + + "\x02\x02\x02\b\x84\x03\x02\x02\x02\n\x86\x03\x02\x02\x02\f\xCA\x03\x02" + + "\x02\x02\x0E\xCC\x03\x02\x02\x02\x10\xD3\x03\x02\x02\x02\x12\xE7\x03\x02" + + "\x02\x02\x14\xFB\x03\x02\x02\x02\x16\u0108\x03\x02\x02\x02\x18\u0138\x03" + + "\x02\x02\x02\x1A\u013A\x03\x02\x02\x02\x1C\u013C\x03\x02\x02\x02\x1E\u013E" + + "\x03\x02\x02\x02 \u0140\x03\x02\x02\x02\"\u017B\x03\x02\x02\x02$\u019F" + + "\x03\x02\x02\x02&\u01A1\x03\x02\x02\x02(\u0239\x03\x02\x02\x02*\u026F" + + "\x03\x02\x02\x02,\u0281\x03\x02\x02\x02.\u0286\x03\x02\x02\x020\u0298" + + "\x03\x02\x02\x022\u029C\x03\x02\x02\x024\u02AF\x03\x02\x02\x026\u02B1" + + "\x03\x02\x02\x028\u02C1\x03\x02\x02\x02:\u02C3\x03\x02\x02\x02<\u02C7" + + "\x03\x02\x02\x02>\u02C9\x03\x02\x02\x02@\u02D7\x03\x02\x02\x02B\u02DB" + + "\x03\x02\x02\x02D\u02DF\x03\x02\x02\x02F\u02E1\x03\x02\x02\x02H\u02E3" + + "\x03\x02\x02\x02J\u02E5\x03\x02\x02\x02L\u02F1\x03\x02\x02\x02N\u02F3" + + "\x03\x02\x02\x02PR\x05\x04\x03\x02QP\x03\x02\x02\x02RS\x03\x02\x02\x02" + + "SQ\x03\x02\x02\x02ST\x03\x02\x02\x02TU\x03\x02\x02\x02UV\x07\x02\x02\x03" + + "V\x03\x03\x02\x02\x02WY\x07E\x02\x02XW\x03\x02\x02\x02Y\\\x03\x02\x02" + + "\x02ZX\x03\x02\x02\x02Z[\x03\x02\x02\x02[]\x03\x02\x02\x02\\Z\x03\x02" + + "\x02\x02]^\x07\x03\x02\x02^_\x05J&\x02_c\x07\x04\x02\x02`b\x05\x06\x04" + + "\x02a`\x03\x02\x02\x02be\x03\x02\x02\x02ca\x03\x02\x02\x02cd\x03\x02\x02" + + "\x02df\x03\x02\x02\x02ec\x03\x02\x02\x02fg\x07\x05\x02\x02g\x05\x03\x02" + + "\x02\x02hj\x07E\x02\x02ih\x03\x02\x02\x02jm\x03\x02\x02\x02ki\x03\x02" + + "\x02\x02kl\x03\x02\x02\x02ln\x03\x02\x02\x02mk\x03\x02\x02\x02no\x05\b" + + "\x05\x02o\x07\x03\x02\x02\x02pq\x07\x06\x02\x02qr\x05J&\x02rs\x07\x07" + + "\x02\x02st\x05\"\x12\x02t\x85\x03\x02\x02\x02uv\x07\b\x02\x02vw\x05J&" + + "\x02wx\x07\x07\x02\x02xy\x05\"\x12\x02y\x85\x03\x02\x02\x02z{\x07\t\x02" + + "\x02{|\x058\x1D\x02|}\x07@\x02\x02}~\x05(\x15\x02~\x85\x03\x02\x02\x02" + + "\x7F\x85\x05\x18\r\x02\x80\x85\x05\n\x06\x02\x81\x85\x05\f\x07\x02\x82" + + "\x85\x05\x14\v\x02\x83\x85\x05\x16\f\x02\x84p\x03\x02\x02\x02\x84u\x03" + + "\x02\x02\x02\x84z\x03\x02\x02\x02\x84\x7F\x03\x02\x02\x02\x84\x80\x03" + + "\x02\x02\x02\x84\x81\x03\x02\x02\x02\x84\x82\x03\x02\x02\x02\x84\x83\x03" + + "\x02\x02\x02\x85\t\x03\x02\x02\x02\x86\x87\x05\x12\n\x02\x87\xAC\x05B" + + "\"\x02\x88\x91\x07A\x02\x02\x89\x8E\x05:\x1E\x02\x8A\x8B\x07\n\x02\x02" + + "\x8B\x8D\x05:\x1E\x02\x8C\x8A\x03\x02\x02\x02\x8D\x90\x03\x02\x02\x02" + + "\x8E\x8C\x03\x02\x02\x02\x8E\x8F\x03\x02\x02\x02\x8F\x92\x03\x02\x02\x02" + + "\x90\x8E\x03\x02\x02\x02\x91\x89\x03\x02\x02\x02\x91\x92\x03\x02\x02\x02" + + "\x92\x93\x03\x02\x02\x02\x93\x96\x07B\x02\x02\x94\x95\x07\x07\x02\x02" + + "\x95\x97\x05\"\x12\x02\x96\x94\x03\x02\x02\x02\x96\x97\x03\x02\x02\x02" + + "\x97\xAD\x03\x02\x02\x02\x98\x99\x07\x07\x02\x02\x99\xAD\x05\"\x12\x02" + + "\x9A\x9B\x07A\x02\x02\x9B\x9C\x05:\x1E\x02\x9C\x9D\x07\x07\x02\x02\x9D" + + "\xA5\x05\"\x12\x02\x9E\x9F\x07\n\x02\x02\x9F\xA0\x05:\x1E\x02\xA0\xA1" + + "\x07\x07\x02\x02\xA1\xA2\x05\"\x12\x02\xA2\xA4\x03\x02\x02\x02\xA3\x9E" + + "\x03\x02\x02\x02\xA4\xA7\x03\x02\x02\x02\xA5\xA3\x03\x02\x02\x02\xA5\xA6" + + "\x03\x02\x02\x02\xA6\xA8\x03\x02\x02\x02\xA7\xA5\x03\x02\x02\x02\xA8\xA9" + + "\x07B\x02\x02\xA9\xAA\x07\x07\x02\x02\xAA\xAB\x05\"\x12\x02\xAB\xAD\x03" + + "\x02\x02\x02\xAC\x88\x03\x02\x02\x02\xAC\x98\x03\x02\x02\x02\xAC\x9A\x03" + + "\x02\x02\x02\xAC\xAD\x03\x02\x02\x02\xAD\xB0\x03\x02\x02\x02\xAE\xAF\x07" + + "@\x02\x02\xAF\xB1\x05(\x15\x02\xB0\xAE\x03\x02\x02\x02\xB0\xB1\x03\x02" + + "\x02\x02\xB1\xB3\x03\x02\x02\x02\xB2\xB4\x07\v\x02\x02\xB3\xB2\x03\x02" + + "\x02\x02\xB3\xB4\x03\x02\x02\x02\xB4\v\x03\x02\x02\x02\xB5\xB6\x07\f\x02" + + "\x02\xB6\xCB\x05J&\x02\xB7\xB8\x07\f\x02\x02\xB8\xB9\x05J&\x02\xB9\xBA" + + "\x07@\x02\x02\xBA\xBB\x05\"\x12\x02\xBB\xCB\x03\x02\x02\x02\xBC\xBD\x07" + + "\f\x02\x02\xBD\xBE\x05J&\x02\xBE\xC0\x07@\x02\x02\xBF\xC1\x07\r\x02\x02" + + "\xC0\xBF\x03\x02\x02\x02\xC0\xC1\x03\x02\x02\x02\xC1\xC2\x03\x02\x02\x02" + + "\xC2\xC7\x05\x0E\b\x02\xC3\xC4\x07\r\x02\x02\xC4\xC6\x05\x0E\b\x02\xC5" + + "\xC3\x03\x02\x02\x02\xC6\xC9\x03\x02\x02\x02\xC7\xC5\x03\x02\x02\x02\xC7" + + "\xC8\x03\x02\x02\x02\xC8\xCB\x03\x02\x02\x02\xC9\xC7\x03\x02\x02\x02\xCA" + + "\xB5\x03\x02\x02\x02\xCA\xB7\x03\x02\x02\x02\xCA\xBC\x03\x02\x02\x02\xCB" + + "\r\x03\x02\x02\x02\xCC\xD1\x05L\'\x02\xCD\xCE\x07A\x02\x02\xCE\xCF\x05" + + "\"\x12\x02\xCF\xD0\x07B\x02\x02\xD0\xD2\x03\x02\x02\x02\xD1\xCD\x03\x02" + + "\x02\x02\xD1\xD2\x03\x02\x02\x02\xD2\x0F\x03\x02\x02\x02\xD3\xD4\x07\x0E" + + "\x02\x02\xD4\xD7\x05J&\x02\xD5\xD6\x07\x07\x02\x02\xD6\xD8\x05\"\x12\x02" + + "\xD7\xD5\x03\x02\x02\x02\xD7\xD8\x03\x02\x02\x02\xD8\xD9\x03\x02\x02\x02" + + "\xD9\xDA\x07@\x02\x02\xDA\xDC\x05(\x15\x02\xDB\xDD\x07\v\x02\x02\xDC\xDB" + + "\x03\x02\x02\x02\xDC\xDD\x03\x02\x02\x02\xDD\x11\x03\x02\x02\x02\xDE\xE8" + + "\x07\x0F\x02\x02\xDF\xE8\x07\x10\x02\x02\xE0\xE1\x07\x11\x02\x02\xE1\xE8" + + "\x07\x0F\x02\x02\xE2\xE3\x07\x11\x02\x02\xE3\xE8\x07\x10\x02\x02\xE4\xE8" + + "\x07\x12\x02\x02\xE5\xE8\x07\x13\x02\x02\xE6\xE8\x07\x14\x02\x02\xE7\xDE" + + "\x03\x02\x02\x02\xE7\xDF\x03\x02\x02\x02\xE7\xE0\x03\x02\x02\x02\xE7\xE2" + + "\x03\x02\x02\x02\xE7\xE4\x03\x02\x02\x02\xE7\xE5\x03\x02\x02\x02\xE7\xE6" + + "\x03\x02\x02\x02\xE8\x13\x03\x02\x02\x02\xE9\xEA\x07\x15\x02\x02\xEA\xEB" + + "\x05\x1C\x0F\x02\xEB\xEC\x07\x16\x02\x02\xEC\xEF\x05<\x1F\x02\xED\xEE" + + "\x07\x17\x02\x02\xEE\xF0\x05 \x11\x02\xEF\xED\x03\x02\x02\x02\xEF\xF0" + + "\x03\x02\x02\x02\xF0\xFC\x03\x02\x02\x02\xF1\xF2\x07\x15\x02\x02\xF2\xF5" + + "\x05\x1C\x0F\x02\xF3\xF4\x07\x18\x02\x02\xF4\xF6\x05\x1C\x0F\x02\xF5\xF3" + + "\x03\x02\x02\x02\xF5\xF6\x03\x02\x02\x02\xF6\xF9\x03\x02\x02\x02\xF7\xF8" + + "\x07\x17\x02\x02\xF8\xFA\x05 \x11\x02\xF9\xF7\x03\x02\x02\x02\xF9\xFA" + + "\x03\x02\x02\x02\xFA\xFC\x03\x02\x02\x02\xFB\xE9\x03\x02\x02\x02\xFB\xF1" + + "\x03\x02\x02\x02\xFC\x15\x03\x02\x02\x02\xFD\xFE\x07\x19\x02\x02\xFE\xFF" + + "\x05\x1C\x0F\x02\xFF\u0100\x07\x16\x02\x02\u0100\u0101\x05<\x1F\x02\u0101" + + "\u0109\x03\x02\x02\x02\u0102\u0103\x07\x19\x02\x02\u0103\u0106\x05\x1C" + + "\x0F\x02\u0104\u0105\x07\x18\x02\x02\u0105\u0107\x05\x1C\x0F\x02\u0106" + + "\u0104\x03\x02\x02\x02\u0106\u0107\x03\x02\x02\x02\u0107\u0109\x03\x02" + + "\x02\x02\u0108\xFD\x03\x02\x02\x02\u0108\u0102\x03\x02\x02\x02\u0109\x17" + + "\x03\x02\x02\x02\u010A\u010B\x07\x15\x02\x02\u010B\u010C\x05\x1A\x0E\x02" + + "\u010C\u010D\x07A\x02\x02\u010D\u010E\x05\x1C\x0F\x02\u010E\u010F\x07" + + "@\x02\x02\u010F\u0117\x05(\x15\x02\u0110\u0111\x07\n\x02\x02\u0111\u0112" + + "\x05\x1C\x0F\x02\u0112\u0113\x07@\x02\x02\u0113\u0114\x05(\x15\x02\u0114" + + "\u0116\x03\x02\x02\x02\u0115\u0110\x03\x02\x02\x02\u0116\u0119\x03\x02" + + "\x02\x02\u0117\u0115\x03\x02\x02\x02\u0117\u0118\x03\x02\x02\x02\u0118" + + "\u011A\x03\x02\x02\x02\u0119\u0117\x03\x02\x02\x02\u011A\u011B\x07B\x02" + + "\x02\u011B\u011C\x07\x16\x02\x02\u011C\u011F\x077\x02\x02\u011D\u011E" + + "\x07\x17\x02\x02\u011E\u0120\x05 \x11\x02\u011F\u011D\x03\x02\x02\x02" + + "\u011F\u0120\x03\x02\x02\x02\u0120\u0139\x03\x02\x02\x02\u0121\u0122\x07" + + "\x15\x02\x02\u0122\u0123\x05\x1A\x0E\x02\u0123\u0124\x07A\x02\x02\u0124" + + "\u0125\x05\x1C\x0F\x02\u0125\u0126\x07@\x02\x02\u0126\u012E\x05(\x15\x02" + + "\u0127\u0128\x07\n\x02\x02\u0128\u0129\x05\x1C\x0F\x02\u0129\u012A\x07" + + "@\x02\x02\u012A\u012B\x05(\x15\x02\u012B\u012D\x03\x02\x02\x02\u012C\u0127" + + "\x03\x02\x02\x02\u012D\u0130\x03\x02\x02\x02\u012E\u012C\x03\x02\x02\x02" + + "\u012E\u012F\x03\x02\x02\x02\u012F\u0131\x03\x02\x02\x02\u0130\u012E\x03" + + "\x02\x02\x02\u0131\u0132\x07B\x02\x02\u0132\u0133\x07\x18\x02\x02\u0133" + + "\u0136\x05\x1E\x10\x02\u0134\u0135\x07\x17\x02\x02\u0135\u0137\x05 \x11" + + "\x02\u0136\u0134\x03\x02\x02\x02\u0136\u0137\x03\x02\x02\x02\u0137\u0139" + + "\x03\x02\x02\x02\u0138\u010A\x03\x02\x02\x02\u0138\u0121\x03\x02\x02\x02" + + "\u0139\x19\x03\x02\x02\x02\u013A\u013B\x05J&\x02\u013B\x1B\x03\x02\x02" + + "\x02\u013C\u013D\x05J&\x02\u013D\x1D\x03\x02\x02\x02\u013E\u013F\x05J" + + "&\x02\u013F\x1F\x03\x02\x02\x02\u0140\u0141\x07*\x02\x02\u0141!\x03\x02" + + "\x02\x02\u0142\u0143\b\x12\x01\x02\u0143\u014C\x07A\x02\x02\u0144\u0149" + + "\x05\"\x12\x02\u0145\u0146\x07\n\x02\x02\u0146\u0148\x05\"\x12\x02\u0147" + + "\u0145\x03\x02\x02\x02\u0148\u014B\x03\x02\x02\x02\u0149\u0147\x03\x02" + + "\x02\x02\u0149\u014A\x03\x02\x02\x02\u014A\u014D\x03\x02\x02\x02\u014B" + + "\u0149\x03\x02\x02\x02\u014C\u0144\x03\x02\x02\x02\u014C\u014D\x03\x02" + + "\x02\x02\u014D\u014F\x03\x02\x02\x02\u014E\u0150\x07\n\x02\x02\u014F\u014E" + + "\x03\x02\x02\x02\u014F\u0150\x03\x02\x02\x02\u0150\u0151\x03\x02\x02\x02" + + "\u0151\u0152\x07B\x02\x02\u0152\u0153\x07\x1B\x02\x02\u0153\u017C\x05" + + "\"\x12\r\u0154\u0155\x071\x02\x02\u0155\u0156\x07\x1C\x02\x02\u0156\u0157" + + "\x05\"\x12\x02\u0157\u0158\x07\x1D\x02\x02\u0158\u017C\x03\x02\x02\x02" + + "\u0159\u015A\x072\x02\x02\u015A\u015B\x07\x1C\x02\x02\u015B\u015C\x05" + + "\"\x12\x02\u015C\u015D\x07\x1D\x02\x02\u015D\u017C\x03\x02\x02\x02\u015E" + + "\u015F\x07A\x02\x02\u015F\u0160\x05\"\x12\x02\u0160\u0161\x07\n\x02\x02" + + "\u0161\u0166\x05\"\x12\x02\u0162\u0163\x07\n\x02\x02\u0163\u0165\x05\"" + + "\x12\x02\u0164\u0162\x03\x02\x02\x02\u0165\u0168\x03\x02\x02\x02\u0166" + + "\u0164\x03\x02\x02\x02\u0166\u0167\x03\x02\x02\x02\u0167\u016A\x03\x02" + + "\x02\x02\u0168\u0166\x03\x02\x02\x02\u0169\u016B\x07\n\x02\x02\u016A\u0169" + + "\x03\x02\x02\x02\u016A\u016B\x03\x02\x02\x02\u016B\u016C\x03\x02\x02\x02" + + "\u016C\u016D\x07B\x02\x02\u016D\u017C\x03\x02\x02\x02\u016E\u016F\x07" + + "\x04\x02\x02\u016F\u0170\x05$\x13\x02\u0170\u0171\x07\x05\x02\x02\u0171" + + "\u017C\x03\x02\x02\x02\u0172\u017C\x07\x1E\x02\x02\u0173\u017C\x07\x1F" + + "\x02\x02\u0174\u017C\x07 \x02\x02\u0175\u017C\x07C\x02\x02\u0176\u017C" + + "\x05J&\x02\u0177\u0178\x07A\x02\x02\u0178\u0179\x05\"\x12\x02\u0179\u017A" + + "\x07B\x02\x02\u017A\u017C\x03\x02\x02\x02\u017B\u0142\x03\x02\x02\x02" + + "\u017B\u0154\x03\x02\x02\x02\u017B\u0159\x03\x02\x02\x02\u017B\u015E\x03" + + "\x02\x02\x02\u017B\u016E\x03\x02\x02\x02\u017B\u0172\x03\x02\x02\x02\u017B" + + "\u0173\x03\x02\x02\x02\u017B\u0174\x03\x02\x02\x02\u017B\u0175\x03\x02" + + "\x02\x02\u017B\u0176\x03\x02\x02\x02\u017B\u0177\x03\x02\x02\x02\u017C" + + "\u0185\x03\x02\x02\x02\u017D\u017E\f\x0F\x02\x02\u017E\u017F\x07\x1A\x02" + + "\x02\u017F\u0184\x05\"\x12\x0F\u0180\u0181\f\x0E\x02\x02\u0181\u0182\x07" + + "\x1B\x02\x02\u0182\u0184\x05\"\x12\x0E\u0183\u017D\x03\x02\x02\x02\u0183" + + "\u0180\x03\x02\x02\x02\u0184\u0187\x03\x02\x02\x02\u0185\u0183\x03\x02" + + "\x02\x02\u0185\u0186\x03\x02\x02\x02\u0186#\x03\x02\x02\x02\u0187\u0185" + + "\x03\x02\x02\x02\u0188\u0189\x05&\x14\x02\u0189\u018A\x07\x07\x02\x02" + + "\u018A\u018B\x05\"\x12\x02\u018B\u018C\x07\n\x02\x02\u018C\u018E\x03\x02" + + "\x02\x02\u018D\u0188\x03\x02\x02\x02\u018E\u0191\x03\x02\x02\x02\u018F" + + "\u018D\x03\x02\x02\x02\u018F\u0190\x03\x02\x02\x02\u0190\u019B\x03\x02" + + "\x02\x02\u0191\u018F\x03\x02\x02\x02\u0192\u0193\x05&\x14\x02\u0193\u0194" + + "\x07\x07\x02\x02\u0194\u0195\x05\"\x12\x02\u0195\u0199\x03\x02\x02\x02" + + "\u0196\u019A\x07\n\x02\x02\u0197\u0198\x07\r\x02\x02\u0198\u019A\x05N" + + "(\x02\u0199\u0196\x03\x02\x02\x02\u0199\u0197\x03\x02\x02\x02\u0199\u019A" + + "\x03\x02\x02\x02\u019A\u019C\x03\x02\x02\x02\u019B\u0192\x03\x02\x02\x02" + + "\u019B\u019C\x03\x02\x02\x02\u019C\u01A0\x03\x02\x02\x02\u019D\u019E\x07" + + "\r\x02\x02\u019E\u01A0\x05N(\x02\u019F\u018F\x03\x02\x02\x02\u019F\u019D" + + "\x03\x02\x02\x02\u01A0%\x03\x02\x02\x02\u01A1\u01A2\x05L\'\x02\u01A2\'" + + "\x03\x02\x02\x02\u01A3\u01A4\b\x15\x01\x02\u01A4\u023A\x052\x1A\x02\u01A5" + + "\u01A6\x05B\"\x02\u01A6\u01A8\x07A\x02\x02\u01A7\u01A9\x05> \x02\u01A8" + + "\u01A7\x03\x02\x02\x02\u01A8\u01A9\x03\x02\x02\x02\u01A9\u01AA\x03\x02" + + "\x02\x02\u01AA\u01AB\x07B\x02\x02\u01AB\u023A\x03\x02\x02\x02\u01AC\u01AD" + + "\x076\x02\x02\u01AD\u023A\x05(\x15\x1B\u01AE\u01AF\x05J&\x02\u01AF\u01B0" + + "\x07\"\x02\x02\u01B0\u01B1\x07@\x02\x02\u01B1\u01B2\x05(\x15\x17\u01B2" + + "\u023A\x03\x02\x02\x02\u01B3\u01B4\x07-\x02\x02\u01B4\u01B5\x07\x04\x02" + + "\x02\u01B5\u01BA\x05(\x15\x02\u01B6\u01B7\x07\n\x02\x02\u01B7\u01B9\x05" + + "(\x15\x02\u01B8\u01B6\x03\x02\x02\x02\u01B9\u01BC\x03\x02\x02\x02\u01BA" + + "\u01B8\x03\x02\x02\x02\u01BA\u01BB\x03\x02\x02\x02\u01BB\u01BE\x03\x02" + + "\x02\x02\u01BC\u01BA\x03\x02\x02\x02\u01BD\u01BF\x07\n\x02\x02\u01BE\u01BD" + + "\x03\x02\x02\x02\u01BE\u01BF\x03\x02\x02\x02\u01BF\u01C0\x03\x02\x02\x02" + + "\u01C0\u01C1\x07\x05\x02\x02\u01C1\u023A\x03\x02\x02\x02\u01C2\u01C3\x07" + + ".\x02\x02\u01C3\u01C4\x07\x04\x02\x02\u01C4\u01C9\x05(\x15\x02\u01C5\u01C6" + + "\x07\n\x02\x02\u01C6\u01C8\x05(\x15\x02\u01C7\u01C5\x03\x02\x02\x02\u01C8" + + "\u01CB\x03\x02\x02\x02\u01C9\u01C7\x03\x02\x02\x02\u01C9\u01CA\x03\x02" + + "\x02\x02\u01CA\u01CD\x03\x02\x02\x02\u01CB\u01C9\x03\x02\x02\x02\u01CC" + + "\u01CE\x07\n\x02\x02\u01CD\u01CC\x03\x02\x02\x02\u01CD\u01CE\x03\x02\x02" + + "\x02\u01CE\u01CF\x03\x02\x02\x02\u01CF\u01D0\x07\x05\x02\x02\u01D0\u023A" + + "\x03\x02\x02\x02\u01D1\u023A\x05*\x16\x02\u01D2\u01D3\x07#\x02\x02\u01D3" + + "\u01D4\x07\x04\x02\x02\u01D4\u01D9\x05(\x15\x02\u01D5\u01D6\x07\n\x02" + + "\x02\u01D6\u01D8\x05(\x15\x02\u01D7\u01D5\x03\x02\x02\x02\u01D8\u01DB" + + "\x03\x02\x02\x02\u01D9\u01D7\x03\x02\x02\x02\u01D9\u01DA\x03\x02\x02\x02" + + "\u01DA\u01DD\x03\x02\x02\x02\u01DB\u01D9\x03\x02\x02\x02\u01DC\u01DE\x07" + + "\n\x02\x02\u01DD\u01DC\x03\x02\x02\x02\u01DD\u01DE\x03\x02\x02\x02\u01DE" + + "\u01DF\x03\x02\x02\x02\u01DF\u01E0\x07\x05\x02\x02\u01E0\u023A\x03\x02" + + "\x02\x02\u01E1\u01E2\x07$\x02\x02\u01E2\u01E3\x07\x04\x02\x02\u01E3\u01E8" + + "\x05(\x15\x02\u01E4\u01E5\x07\n\x02\x02\u01E5\u01E7\x05(\x15\x02\u01E6" + + "\u01E4\x03\x02\x02\x02\u01E7\u01EA\x03\x02\x02\x02\u01E8\u01E6\x03\x02" + + "\x02\x02\u01E8\u01E9\x03\x02\x02\x02\u01E9\u01EC\x03\x02\x02\x02\u01EA" + + "\u01E8\x03\x02\x02\x02\u01EB\u01ED\x07\n\x02\x02\u01EC\u01EB\x03\x02\x02" + + "\x02\u01EC\u01ED\x03\x02\x02\x02\u01ED\u01EE\x03\x02\x02\x02\u01EE\u01EF" + + "\x07\x05\x02\x02\u01EF\u023A\x03\x02\x02\x02\u01F0\u01F5\x05J&\x02\u01F1" + + "\u01F5\x07,\x02\x02\u01F2\u01F5\x07+\x02\x02\u01F3\u01F5\x07*\x02\x02" + + "\u01F4\u01F0\x03\x02\x02\x02\u01F4\u01F1\x03\x02\x02\x02\u01F4\u01F2\x03" + + "\x02\x02\x02\u01F4\u01F3\x03\x02\x02\x02\u01F5\u023A\x03\x02\x02\x02\u01F6" + + "\u01F7\x07A\x02\x02\u01F7\u01F8\x05(\x15\x02"; private static readonly _serializedATNSegment1: string = - "\x02\x02\u01FB\u01F9\x03\x02\x02\x02\u01FB\u01FC\x03\x02\x02\x02\u01FC" + - "\u01FF\x03\x02\x02\x02\u01FD\u01FB\x03\x02\x02\x02\u01FE\u0200\x07\n\x02" + - "\x02\u01FF\u01FE\x03\x02\x02\x02\u01FF\u0200\x03\x02\x02\x02\u0200\u0201" + - "\x03\x02\x02\x02\u0201\u0202\x07B\x02\x02\u0202\u0237\x03\x02\x02\x02" + - "\u0203\u0204\x07\x04\x02\x02\u0204\u0209\x05@!\x02\u0205\u0206\x07\n\x02" + - "\x02\u0206\u0208\x05@!\x02\u0207\u0205\x03\x02\x02\x02\u0208\u020B\x03" + - "\x02\x02\x02\u0209\u0207\x03\x02\x02\x02\u0209\u020A\x03\x02\x02\x02\u020A" + - "\u020D\x03\x02\x02\x02\u020B\u0209\x03\x02\x02\x02\u020C\u020E\x07\n\x02" + - "\x02\u020D\u020C\x03\x02\x02\x02\u020D\u020E\x03\x02\x02\x02\u020E\u020F" + - "\x03\x02\x02\x02\u020F\u0210\x07\x05\x02\x02\u0210\u0237\x03\x02\x02\x02" + - "\u0211\u021A\x07\x1C\x02\x02\u0212\u0217\x05(\x15\x02\u0213\u0214\x07" + - "\n\x02\x02\u0214\u0216\x05(\x15\x02\u0215\u0213\x03\x02\x02\x02\u0216" + - "\u0219\x03\x02\x02\x02\u0217\u0215\x03\x02\x02\x02\u0217\u0218\x03\x02" + - "\x02\x02\u0218\u021B\x03\x02\x02\x02\u0219\u0217\x03\x02\x02\x02\u021A" + - "\u0212\x03\x02\x02\x02\u021A\u021B\x03\x02\x02\x02\u021B\u021D\x03\x02" + - "\x02\x02\u021C\u021E\x07\n\x02\x02\u021D\u021C\x03\x02\x02\x02\u021D\u021E" + - "\x03\x02\x02\x02\u021E\u021F\x03\x02\x02\x02\u021F\u0237\x07\x1D\x02\x02" + - "\u0220\u0221\x07%\x02\x02\u0221\u0222\x07A\x02\x02\u0222\u0223\x05(\x15" + - "\x02\u0223\u0224\x07B\x02\x02\u0224\u0225\x05(\x15\x02\u0225\u0226\x07" + - "&\x02\x02\u0226\u0227\x05(\x15\x07\u0227\u0237\x03\x02\x02\x02\u0228\u0229" + - "\x05\n\x06\x02\u0229\u022A\x05(\x15\x06\u022A\u0237\x03\x02\x02\x02\u022B" + - "\u022C\x05\x10\t\x02\u022C\u022D\x05(\x15\x05\u022D\u0237\x03\x02\x02" + - "\x02\u022E\u022F\x07A\x02\x02\u022F\u0230\x05(\x15\x02\u0230\u0231\x07" + - "B\x02\x02\u0231\u0237\x03\x02\x02\x02\u0232\u0233\x07\x04\x02\x02\u0233" + - "\u0234\x05(\x15\x02\u0234\u0235\x07\x05\x02\x02\u0235\u0237\x03\x02\x02" + - "\x02\u0236\u01A0\x03\x02\x02\x02\u0236\u01A2\x03\x02\x02\x02\u0236\u01A9" + - "\x03\x02\x02\x02\u0236\u01AB\x03\x02\x02\x02\u0236\u01B0\x03\x02\x02\x02" + - "\u0236\u01BF\x03\x02\x02\x02\u0236\u01CE\x03\x02\x02\x02\u0236\u01CF\x03" + - "\x02\x02\x02\u0236\u01DE\x03\x02\x02\x02\u0236\u01F1\x03\x02\x02\x02\u0236" + - "\u01F3\x03\x02\x02\x02\u0236\u0203\x03\x02\x02\x02\u0236\u0211\x03\x02" + - "\x02\x02\u0236\u0220\x03\x02\x02\x02\u0236\u0228\x03\x02\x02\x02\u0236" + - "\u022B\x03\x02\x02\x02\u0236\u022E\x03\x02\x02\x02\u0236\u0232\x03\x02" + - "\x02\x02\u0237\u0269\x03\x02\x02\x02\u0238\u0239\f\x1C\x02\x02\u0239\u023A" + - "\x07!\x02\x02\u023A\u0268\x05(\x15\x1C\u023B\u023C\f\x1A\x02\x02\u023C" + - "\u023D\t\x02\x02\x02\u023D\u0268\x05(\x15\x1B\u023E\u023F\f\x19\x02\x02" + - "\u023F\u0240\t\x03\x02\x02\u0240\u0268\x05(\x15\x1A\u0241\u0242\f\x18" + - "\x02\x02\u0242\u0243\t\x04\x02\x02\u0243\u0268\x05(\x15\x19\u0244\u0245" + - "\f\x16\x02\x02\u0245\u0246\x07@\x02\x02\u0246\u0247\x05(\x15\x17\u0247" + - "\u0248\b\x15\x01\x02\u0248\u0268\x03\x02\x02\x02\u0249\u024A\f\x14\x02" + - "\x02\u024A\u024B\x07-\x02\x02\u024B\u0268\x05(\x15\x15\u024C\u024D\f\x12" + - "\x02\x02\u024D\u024E\x07.\x02\x02\u024E\u0268\x05(\x15\x13\u024F\u0250" + - "\f\x11\x02\x02\u0250\u0251\x07/\x02\x02\u0251\u0268\x05(\x15\x12\u0252" + - "\u0253\f\x10\x02\x02\u0253\u0254\x070\x02\x02\u0254\u0268\x05(\x15\x11" + - "\u0255\u0256\f\n\x02\x02\u0256\u0257\x07\x1A\x02\x02\u0257\u0268\x05(" + - "\x15\v\u0258\u0259\f \x02\x02\u0259\u025A\x07\x16\x02\x02\u025A\u0260" + - "\x05D#\x02\u025B\u025D\x07A\x02\x02\u025C\u025E\x05> \x02\u025D\u025C" + - "\x03\x02\x02\x02\u025D\u025E\x03\x02\x02\x02\u025E\u025F\x03\x02\x02\x02" + - "\u025F\u0261\x07B\x02\x02\u0260\u025B\x03\x02\x02\x02\u0260\u0261\x03" + - "\x02\x02\x02\u0261\u0268\x03\x02\x02\x02\u0262\u0263\f\x1D\x02\x02\u0263" + - "\u0264\x07\x1C\x02\x02\u0264\u0265\x05(\x15\x02\u0265\u0266\x07\x1D\x02" + - "\x02\u0266\u0268\x03\x02\x02\x02\u0267\u0238\x03\x02\x02\x02\u0267\u023B" + - "\x03\x02\x02\x02\u0267\u023E\x03\x02\x02\x02\u0267\u0241\x03\x02\x02\x02" + - "\u0267\u0244\x03\x02\x02\x02\u0267\u0249\x03\x02\x02\x02\u0267\u024C\x03" + - "\x02\x02\x02\u0267\u024F\x03\x02\x02\x02\u0267\u0252\x03\x02\x02\x02\u0267" + - "\u0255\x03\x02\x02\x02\u0267\u0258\x03\x02\x02\x02\u0267\u0262\x03\x02" + - "\x02\x02\u0268\u026B\x03\x02\x02\x02\u0269\u0267\x03\x02\x02\x02\u0269" + - "\u026A\x03\x02\x02\x02\u026A)\x03\x02\x02\x02\u026B\u0269\x03\x02\x02" + - "\x02\u026C\u026D\x074\x02\x02\u026D\u026E\x05(\x15\x02\u026E\u0270\x07" + - "\x04\x02\x02\u026F\u0271\x07\r\x02\x02\u0270\u026F\x03\x02\x02\x02\u0270" + - "\u0271\x03\x02\x02\x02\u0271\u0272\x03\x02\x02\x02\u0272\u0277\x05,\x17" + - "\x02\u0273\u0274\x07\r\x02\x02\u0274\u0276\x05,\x17\x02\u0275\u0273\x03" + - "\x02\x02\x02\u0276\u0279\x03\x02\x02\x02\u0277\u0275\x03\x02\x02\x02\u0277" + - "\u0278\x03\x02\x02\x02\u0278\u027A\x03\x02\x02\x02\u0279\u0277\x03\x02" + - "\x02\x02\u027A\u027B\x07\x05\x02\x02\u027B+\x03\x02\x02\x02\u027C\u027F" + - "\x05.\x18\x02\u027D\u027F\x07\'\x02\x02\u027E\u027C\x03\x02\x02\x02\u027E" + - "\u027D\x03\x02\x02\x02\u027F\u0280\x03\x02\x02\x02\u0280\u0281\x07\x1B" + - "\x02\x02\u0281\u0282\x05(\x15\x02\u0282-\x03\x02\x02\x02\u0283\u028A\x05" + - "L\'\x02\u0284\u0287\x07A\x02\x02\u0285\u0288\x05L\'\x02\u0286\u0288\x07" + - "\'\x02\x02\u0287\u0285\x03\x02\x02\x02\u0287\u0286\x03\x02\x02\x02\u0288" + - "\u0289\x03\x02\x02\x02\u0289\u028B\x07B\x02\x02\u028A\u0284\x03\x02\x02" + - "\x02\u028A\u028B\x03\x02\x02\x02\u028B/\x03\x02\x02\x02\u028C\u028D\x05" + - "\b\x05\x02\u028D\u028E\x07\x02\x02\x03\u028E\u0296\x03\x02\x02\x02\u028F" + - "\u0290\x05(\x15\x02\u0290\u0291\x07\x02\x02\x03\u0291\u0296\x03\x02\x02" + - "\x02\u0292\u0293\x07D\x02\x02\u0293\u0296\x07\x02\x02\x03\u0294\u0296" + - "\x07\x02\x02\x03\u0295\u028C\x03\x02\x02\x02\u0295\u028F\x03\x02\x02\x02" + - "\u0295\u0292\x03\x02\x02\x02\u0295\u0294\x03\x02\x02\x02\u02961\x03\x02" + - "\x02\x02\u0297\u029A\x054\x1B\x02\u0298\u029A\x056\x1C\x02\u0299\u0297" + - "\x03\x02\x02\x02\u0299\u0298\x03\x02\x02\x02\u029A3\x03\x02\x02\x02\u029B" + - "\u029C\x05:\x1E\x02\u029C\u029D\x07\x1B\x02\x02\u029D\u029E\x05(\x15\x02" + - "\u029E\u02AD\x03\x02\x02\x02\u029F\u02A0\x07A\x02\x02\u02A0\u02A5\x05" + - ":\x1E\x02\u02A1\u02A2\x07\n\x02\x02\u02A2\u02A4\x05:\x1E\x02\u02A3\u02A1" + - "\x03\x02\x02\x02\u02A4\u02A7\x03\x02\x02\x02\u02A5\u02A3\x03\x02\x02\x02" + - "\u02A5\u02A6\x03\x02\x02\x02\u02A6\u02A8\x03\x02\x02\x02\u02A7\u02A5\x03" + - "\x02\x02\x02\u02A8\u02A9\x07B\x02\x02\u02A9\u02AA\x07\x1B\x02\x02\u02AA" + - "\u02AB\x05(\x15\x02\u02AB\u02AD\x03\x02\x02\x02\u02AC\u029B\x03\x02\x02" + - "\x02\u02AC\u029F\x03\x02\x02\x02\u02AD5\x03\x02\x02\x02\u02AE\u02AF\x07" + - "A\x02\x02\u02AF\u02B0\x07A\x02\x02\u02B0\u02B3\x05:\x1E\x02\u02B1\u02B2" + - "\x07\n\x02\x02\u02B2\u02B4\x05:\x1E\x02\u02B3\u02B1\x03\x02\x02\x02\u02B4" + - "\u02B5\x03\x02\x02\x02\u02B5\u02B3\x03\x02\x02\x02\u02B5\u02B6\x03\x02" + - "\x02\x02\u02B6\u02B7\x03\x02\x02\x02\u02B7\u02B8\x07B\x02\x02\u02B8\u02B9" + - "\x07B\x02\x02\u02B9\u02BA\x07\x1B\x02\x02\u02BA\u02BB\x05(\x15\x02\u02BB" + - "7\x03\x02\x02\x02\u02BC\u02BF\x07\'\x02\x02\u02BD\u02BF\x05J&\x02\u02BE" + - "\u02BC\x03\x02\x02\x02\u02BE\u02BD\x03\x02\x02\x02\u02BF9\x03\x02\x02" + - "\x02\u02C0\u02C1\x058\x1D\x02\u02C1;\x03\x02\x02\x02\u02C2\u02C5\x077" + - "\x02\x02\u02C3\u02C5\x05J&\x02\u02C4\u02C2\x03\x02\x02\x02\u02C4\u02C3" + - "\x03\x02\x02\x02\u02C5=\x03\x02\x02\x02\u02C6\u02CB\x05(\x15\x02\u02C7" + - "\u02C8\x07\n\x02\x02\u02C8\u02CA\x05(\x15\x02\u02C9\u02C7\x03\x02\x02" + - "\x02\u02CA\u02CD\x03\x02\x02\x02\u02CB\u02C9\x03\x02\x02\x02\u02CB\u02CC" + - "\x03\x02\x02\x02\u02CC?\x03\x02\x02\x02\u02CD\u02CB\x03\x02\x02\x02\u02CE" + - "\u02CF\x05L\'\x02\u02CF\u02D0\x07\x07\x02\x02\u02D0\u02D1\x05(\x15\x02" + - "\u02D1\u02D5\x03\x02\x02\x02\u02D2\u02D3\x07(\x02\x02\u02D3\u02D5\x05" + - "(\x15\x02\u02D4\u02CE\x03\x02\x02\x02\u02D4\u02D2\x03\x02\x02\x02\u02D5" + - "A\x03\x02\x02\x02\u02D6\u02D9\x05J&\x02\u02D7\u02D9\t\x05\x02\x02\u02D8" + - "\u02D6\x03\x02\x02\x02\u02D8\u02D7\x03\x02\x02\x02\u02D9C\x03\x02\x02" + - "\x02\u02DA\u02DD\x05J&\x02\u02DB\u02DD\t\x06\x02\x02\u02DC\u02DA\x03\x02" + - "\x02\x02\u02DC\u02DB\x03\x02\x02\x02\u02DDE\x03\x02\x02\x02\u02DE\u02DF" + - "\t\x07\x02\x02\u02DFG\x03\x02\x02\x02\u02E0\u02E1\t\b\x02\x02\u02E1I\x03" + - "\x02\x02\x02\u02E2\u02E7\x07C\x02\x02\u02E3\u02E4\x07)\x02\x02\u02E4\u02E6" + - "\x07C\x02\x02\u02E5\u02E3\x03\x02\x02\x02\u02E6\u02E9\x03\x02\x02\x02" + - "\u02E7\u02E5\x03\x02\x02\x02\u02E7\u02E8\x03\x02\x02\x02\u02E8K\x03\x02" + - "\x02\x02\u02E9\u02E7\x03\x02\x02\x02\u02EA\u02EF\x07C\x02\x02\u02EB\u02EC" + - "\x05J&\x02\u02EC\u02ED\b\'\x01\x02\u02ED\u02EF\x03\x02\x02\x02\u02EE\u02EA" + - "\x03\x02\x02\x02\u02EE\u02EB\x03\x02\x02\x02\u02EFM\x03\x02\x02\x02TQ" + - "Xai\x82\x8C\x8F\x94\xA3\xAA\xAE\xB1\xBE\xC5\xC8\xCF\xD5\xDA\xE5\xED\xF3" + - "\xF7\xF9\u0104\u0106\u0115\u011D\u012C\u0134\u0136\u0147\u014A\u014D\u0164" + - "\u0168\u0178\u0180\u0182\u018C\u0196\u0198\u019C\u01A5\u01B7\u01BB\u01C6" + - "\u01CA\u01D6\u01DA\u01E5\u01E9\u01F1\u01FB\u01FF\u0209\u020D\u0217\u021A" + - "\u021D\u0236\u025D\u0260\u0267\u0269\u0270\u0277\u027E\u0287\u028A\u0295" + - "\u0299\u02A5\u02AC\u02B5\u02BE\u02C4\u02CB\u02D4\u02D8\u02DC\u02E7\u02EE"; + "\u01F8\u01F9\x07\n\x02\x02\u01F9\u01FE\x05(\x15\x02\u01FA\u01FB\x07\n" + + "\x02\x02\u01FB\u01FD\x05(\x15\x02\u01FC\u01FA\x03\x02\x02\x02\u01FD\u0200" + + "\x03\x02\x02\x02\u01FE\u01FC\x03\x02\x02\x02\u01FE\u01FF\x03\x02\x02\x02" + + "\u01FF\u0202\x03\x02\x02\x02\u0200\u01FE\x03\x02\x02\x02\u0201\u0203\x07" + + "\n\x02\x02\u0202\u0201\x03\x02\x02\x02\u0202\u0203\x03\x02\x02\x02\u0203" + + "\u0204\x03\x02\x02\x02\u0204\u0205\x07B\x02\x02\u0205\u023A\x03\x02\x02" + + "\x02\u0206\u0207\x07\x04\x02\x02\u0207\u020C\x05@!\x02\u0208\u0209\x07" + + "\n\x02\x02\u0209\u020B\x05@!\x02\u020A\u0208\x03\x02\x02\x02\u020B\u020E" + + "\x03\x02\x02\x02\u020C\u020A\x03\x02\x02\x02\u020C\u020D\x03\x02\x02\x02" + + "\u020D\u0210\x03\x02\x02\x02\u020E\u020C\x03\x02\x02\x02\u020F\u0211\x07" + + "\n\x02\x02\u0210\u020F\x03\x02\x02\x02\u0210\u0211\x03\x02\x02\x02\u0211" + + "\u0212\x03\x02\x02\x02\u0212\u0213\x07\x05\x02\x02\u0213\u023A\x03\x02" + + "\x02\x02\u0214\u021D\x07\x1C\x02\x02\u0215\u021A\x05(\x15\x02\u0216\u0217" + + "\x07\n\x02\x02\u0217\u0219\x05(\x15\x02\u0218\u0216\x03\x02\x02\x02\u0219" + + "\u021C\x03\x02\x02\x02\u021A\u0218\x03\x02\x02\x02\u021A\u021B\x03\x02" + + "\x02\x02\u021B\u021E\x03\x02\x02\x02\u021C\u021A\x03\x02\x02\x02\u021D" + + "\u0215\x03\x02\x02\x02\u021D\u021E\x03\x02\x02\x02\u021E\u0220\x03\x02" + + "\x02\x02\u021F\u0221\x07\n\x02\x02\u0220\u021F\x03\x02\x02\x02\u0220\u0221" + + "\x03\x02\x02\x02\u0221\u0222\x03\x02\x02\x02\u0222\u023A\x07\x1D\x02\x02" + + "\u0223\u0224\x07%\x02\x02\u0224\u0225\x07A\x02\x02\u0225\u0226\x05(\x15" + + "\x02\u0226\u0227\x07B\x02\x02\u0227\u0228\x05(\x15\x02\u0228\u0229\x07" + + "&\x02\x02\u0229\u022A\x05(\x15\x07\u022A\u023A\x03\x02\x02\x02\u022B\u022C" + + "\x05\n\x06\x02\u022C\u022D\x05(\x15\x06\u022D\u023A\x03\x02\x02\x02\u022E" + + "\u022F\x05\x10\t\x02\u022F\u0230\x05(\x15\x05\u0230\u023A\x03\x02\x02" + + "\x02\u0231\u0232\x07A\x02\x02\u0232\u0233\x05(\x15\x02\u0233\u0234\x07" + + "B\x02\x02\u0234\u023A\x03\x02\x02\x02\u0235\u0236\x07\x04\x02\x02\u0236" + + "\u0237\x05(\x15\x02\u0237\u0238\x07\x05\x02\x02\u0238\u023A\x03\x02\x02" + + "\x02\u0239\u01A3\x03\x02\x02\x02\u0239\u01A5\x03\x02\x02\x02\u0239\u01AC" + + "\x03\x02\x02\x02\u0239\u01AE\x03\x02\x02\x02\u0239\u01B3\x03\x02\x02\x02" + + "\u0239\u01C2\x03\x02\x02\x02\u0239\u01D1\x03\x02\x02\x02\u0239\u01D2\x03" + + "\x02\x02\x02\u0239\u01E1\x03\x02\x02\x02\u0239\u01F4\x03\x02\x02\x02\u0239" + + "\u01F6\x03\x02\x02\x02\u0239\u0206\x03\x02\x02\x02\u0239\u0214\x03\x02" + + "\x02\x02\u0239\u0223\x03\x02\x02\x02\u0239\u022B\x03\x02\x02\x02\u0239" + + "\u022E\x03\x02\x02\x02\u0239\u0231\x03\x02\x02\x02\u0239\u0235\x03\x02" + + "\x02\x02\u023A\u026C\x03\x02\x02\x02\u023B\u023C\f\x1C\x02\x02\u023C\u023D" + + "\x07!\x02\x02\u023D\u026B\x05(\x15\x1C\u023E\u023F\f\x1A\x02\x02\u023F" + + "\u0240\t\x02\x02\x02\u0240\u026B\x05(\x15\x1B\u0241\u0242\f\x19\x02\x02" + + "\u0242\u0243\t\x03\x02\x02\u0243\u026B\x05(\x15\x1A\u0244\u0245\f\x18" + + "\x02\x02\u0245\u0246\t\x04\x02\x02\u0246\u026B\x05(\x15\x19\u0247\u0248" + + "\f\x16\x02\x02\u0248\u0249\x07@\x02\x02\u0249\u024A\x05(\x15\x17\u024A" + + "\u024B\b\x15\x01\x02\u024B\u026B\x03\x02\x02\x02\u024C\u024D\f\x14\x02" + + "\x02\u024D\u024E\x07-\x02\x02\u024E\u026B\x05(\x15\x15\u024F\u0250\f\x12" + + "\x02\x02\u0250\u0251\x07.\x02\x02\u0251\u026B\x05(\x15\x13\u0252\u0253" + + "\f\x11\x02\x02\u0253\u0254\x07/\x02\x02\u0254\u026B\x05(\x15\x12\u0255" + + "\u0256\f\x10\x02\x02\u0256\u0257\x070\x02\x02\u0257\u026B\x05(\x15\x11" + + "\u0258\u0259\f\n\x02\x02\u0259\u025A\x07\x1A\x02\x02\u025A\u026B\x05(" + + "\x15\v\u025B\u025C\f \x02\x02\u025C\u025D\x07\x16\x02\x02\u025D\u0263" + + "\x05D#\x02\u025E\u0260\x07A\x02\x02\u025F\u0261\x05> \x02\u0260\u025F" + + "\x03\x02\x02\x02\u0260\u0261\x03\x02\x02\x02\u0261\u0262\x03\x02\x02\x02" + + "\u0262\u0264\x07B\x02\x02\u0263\u025E\x03\x02\x02\x02\u0263\u0264\x03" + + "\x02\x02\x02\u0264\u026B\x03\x02\x02\x02\u0265\u0266\f\x1D\x02\x02\u0266" + + "\u0267\x07\x1C\x02\x02\u0267\u0268\x05(\x15\x02\u0268\u0269\x07\x1D\x02" + + "\x02\u0269\u026B\x03\x02\x02\x02\u026A\u023B\x03\x02\x02\x02\u026A\u023E" + + "\x03\x02\x02\x02\u026A\u0241\x03\x02\x02\x02\u026A\u0244\x03\x02\x02\x02" + + "\u026A\u0247\x03\x02\x02\x02\u026A\u024C\x03\x02\x02\x02\u026A\u024F\x03" + + "\x02\x02\x02\u026A\u0252\x03\x02\x02\x02\u026A\u0255\x03\x02\x02\x02\u026A" + + "\u0258\x03\x02\x02\x02\u026A\u025B\x03\x02\x02\x02\u026A\u0265\x03\x02" + + "\x02\x02\u026B\u026E\x03\x02\x02\x02\u026C\u026A\x03\x02\x02\x02\u026C" + + "\u026D\x03\x02\x02\x02\u026D)\x03\x02\x02\x02\u026E\u026C\x03\x02\x02" + + "\x02\u026F\u0270\x074\x02\x02\u0270\u0271\x05(\x15\x02\u0271\u0273\x07" + + "\x04\x02\x02\u0272\u0274\x07\r\x02\x02\u0273\u0272\x03\x02\x02\x02\u0273" + + "\u0274\x03\x02\x02\x02\u0274\u0275\x03\x02\x02\x02\u0275\u027A\x05,\x17" + + "\x02\u0276\u0277\x07\r\x02\x02\u0277\u0279\x05,\x17\x02\u0278\u0276\x03" + + "\x02\x02\x02\u0279\u027C\x03\x02\x02\x02\u027A\u0278\x03\x02\x02\x02\u027A" + + "\u027B\x03\x02\x02\x02\u027B\u027D\x03\x02\x02\x02\u027C\u027A\x03\x02" + + "\x02\x02\u027D\u027E\x07\x05\x02\x02\u027E+\x03\x02\x02\x02\u027F\u0282" + + "\x05.\x18\x02\u0280\u0282\x07\'\x02\x02\u0281\u027F\x03\x02\x02\x02\u0281" + + "\u0280\x03\x02\x02\x02\u0282\u0283\x03\x02\x02\x02\u0283\u0284\x07\x1B" + + "\x02\x02\u0284\u0285\x05(\x15\x02\u0285-\x03\x02\x02\x02\u0286\u028D\x05" + + "L\'\x02\u0287\u028A\x07A\x02\x02\u0288\u028B\x05L\'\x02\u0289\u028B\x07" + + "\'\x02\x02\u028A\u0288\x03\x02\x02\x02\u028A\u0289\x03\x02\x02\x02\u028B" + + "\u028C\x03\x02\x02\x02\u028C\u028E\x07B\x02\x02\u028D\u0287\x03\x02\x02" + + "\x02\u028D\u028E\x03\x02\x02\x02\u028E/\x03\x02\x02\x02\u028F\u0290\x05" + + "\b\x05\x02\u0290\u0291\x07\x02\x02\x03\u0291\u0299\x03\x02\x02\x02\u0292" + + "\u0293\x05(\x15\x02\u0293\u0294\x07\x02\x02\x03\u0294\u0299\x03\x02\x02" + + "\x02\u0295\u0296\x07E\x02\x02\u0296\u0299\x07\x02\x02\x03\u0297\u0299" + + "\x07\x02\x02\x03\u0298\u028F\x03\x02\x02\x02\u0298\u0292\x03\x02\x02\x02" + + "\u0298\u0295\x03\x02\x02\x02\u0298\u0297\x03\x02\x02\x02\u02991\x03\x02" + + "\x02\x02\u029A\u029D\x054\x1B\x02\u029B\u029D\x056\x1C\x02\u029C\u029A" + + "\x03\x02\x02\x02\u029C\u029B\x03\x02\x02\x02\u029D3\x03\x02\x02\x02\u029E" + + "\u029F\x05:\x1E\x02\u029F\u02A0\x07\x1B\x02\x02\u02A0\u02A1\x05(\x15\x02" + + "\u02A1\u02B0\x03\x02\x02\x02\u02A2\u02A3\x07A\x02\x02\u02A3\u02A8\x05" + + ":\x1E\x02\u02A4\u02A5\x07\n\x02\x02\u02A5\u02A7\x05:\x1E\x02\u02A6\u02A4" + + "\x03\x02\x02\x02\u02A7\u02AA\x03\x02\x02\x02\u02A8\u02A6\x03\x02\x02\x02" + + "\u02A8\u02A9\x03\x02\x02\x02\u02A9\u02AB\x03\x02\x02\x02\u02AA\u02A8\x03" + + "\x02\x02\x02\u02AB\u02AC\x07B\x02\x02\u02AC\u02AD\x07\x1B\x02\x02\u02AD" + + "\u02AE\x05(\x15\x02\u02AE\u02B0\x03\x02\x02\x02\u02AF\u029E\x03\x02\x02" + + "\x02\u02AF\u02A2\x03\x02\x02\x02\u02B05\x03\x02\x02\x02\u02B1\u02B2\x07" + + "A\x02\x02\u02B2\u02B3\x07A\x02\x02\u02B3\u02B6\x05:\x1E\x02\u02B4\u02B5" + + "\x07\n\x02\x02\u02B5\u02B7\x05:\x1E\x02\u02B6\u02B4\x03\x02\x02\x02\u02B7" + + "\u02B8\x03\x02\x02\x02\u02B8\u02B6\x03\x02\x02\x02\u02B8\u02B9\x03\x02" + + "\x02\x02\u02B9\u02BA\x03\x02\x02\x02\u02BA\u02BB\x07B\x02\x02\u02BB\u02BC" + + "\x07B\x02\x02\u02BC\u02BD\x07\x1B\x02\x02\u02BD\u02BE\x05(\x15\x02\u02BE" + + "7\x03\x02\x02\x02\u02BF\u02C2\x07\'\x02\x02\u02C0\u02C2\x05J&\x02\u02C1" + + "\u02BF\x03\x02\x02\x02\u02C1\u02C0\x03\x02\x02\x02\u02C29\x03\x02\x02" + + "\x02\u02C3\u02C4\x058\x1D\x02\u02C4;\x03\x02\x02\x02\u02C5\u02C8\x077" + + "\x02\x02\u02C6\u02C8\x05J&\x02\u02C7\u02C5\x03\x02\x02\x02\u02C7\u02C6" + + "\x03\x02\x02\x02\u02C8=\x03\x02\x02\x02\u02C9\u02CE\x05(\x15\x02\u02CA" + + "\u02CB\x07\n\x02\x02\u02CB\u02CD\x05(\x15\x02\u02CC\u02CA\x03\x02\x02" + + "\x02\u02CD\u02D0\x03\x02\x02\x02\u02CE\u02CC\x03\x02\x02\x02\u02CE\u02CF" + + "\x03\x02\x02\x02\u02CF?\x03\x02\x02\x02\u02D0\u02CE\x03\x02\x02\x02\u02D1" + + "\u02D2\x05L\'\x02\u02D2\u02D3\x07\x07\x02\x02\u02D3\u02D4\x05(\x15\x02" + + "\u02D4\u02D8\x03\x02\x02\x02\u02D5\u02D6\x07(\x02\x02\u02D6\u02D8\x05" + + "(\x15\x02\u02D7\u02D1\x03\x02\x02\x02\u02D7\u02D5\x03\x02\x02\x02\u02D8" + + "A\x03\x02\x02\x02\u02D9\u02DC\x05J&\x02\u02DA\u02DC\t\x05\x02\x02\u02DB" + + "\u02D9\x03\x02\x02\x02\u02DB\u02DA\x03\x02\x02\x02\u02DCC\x03\x02\x02" + + "\x02\u02DD\u02E0\x05J&\x02\u02DE\u02E0\t\x06\x02\x02\u02DF\u02DD\x03\x02" + + "\x02\x02\u02DF\u02DE\x03\x02\x02\x02\u02E0E\x03\x02\x02\x02\u02E1\u02E2" + + "\t\x07\x02\x02\u02E2G\x03\x02\x02\x02\u02E3\u02E4\t\b\x02\x02\u02E4I\x03" + + "\x02\x02\x02\u02E5\u02EA\x05N(\x02\u02E6\u02E7\x07)\x02\x02\u02E7\u02E9" + + "\x05N(\x02\u02E8\u02E6\x03\x02\x02\x02\u02E9\u02EC\x03\x02\x02\x02\u02EA" + + "\u02E8\x03\x02\x02\x02\u02EA\u02EB\x03\x02\x02\x02\u02EBK\x03\x02\x02" + + "\x02\u02EC\u02EA\x03\x02\x02\x02\u02ED\u02F2\x05N(\x02\u02EE\u02EF\x05" + + "J&\x02\u02EF\u02F0\b\'\x01\x02\u02F0\u02F2\x03\x02\x02\x02\u02F1\u02ED" + + "\x03\x02\x02\x02\u02F1\u02EE\x03\x02\x02\x02\u02F2M\x03\x02\x02\x02\u02F3" + + "\u02F4\t\t\x02\x02\u02F4O\x03\x02\x02\x02TSZck\x84\x8E\x91\x96\xA5\xAC" + + "\xB0\xB3\xC0\xC7\xCA\xD1\xD7\xDC\xE7\xEF\xF5\xF9\xFB\u0106\u0108\u0117" + + "\u011F\u012E\u0136\u0138\u0149\u014C\u014F\u0166\u016A\u017B\u0183\u0185" + + "\u018F\u0199\u019B\u019F\u01A8\u01BA\u01BE\u01C9\u01CD\u01D9\u01DD\u01E8" + + "\u01EC\u01F4\u01FE\u0202\u020C\u0210\u021A\u021D\u0220\u0239\u0260\u0263" + + "\u026A\u026C\u0273\u027A\u0281\u028A\u028D\u0298\u029C\u02A8\u02AF\u02B8" + + "\u02C1\u02C7\u02CE\u02D7\u02DB\u02DF\u02EA\u02F1"; public static readonly _serializedATN: string = Utils.join( [ QuintParser._serializedATNSegment0, @@ -5041,7 +5101,34 @@ export class TypeBoolContext extends TypeContext { } } } -export class TypeConstOrVarContext extends TypeContext { +export class TypeVarContext extends TypeContext { + public LOW_ID(): TerminalNode { return this.getToken(QuintParser.LOW_ID, 0); } + constructor(ctx: TypeContext) { + super(ctx.parent, ctx.invokingState); + this.copyFrom(ctx); + } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterTypeVar) { + listener.enterTypeVar(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitTypeVar) { + listener.exitTypeVar(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitTypeVar) { + return visitor.visitTypeVar(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class TypeConstContext extends TypeContext { public qualId(): QualIdContext { return this.getRuleContext(0, QualIdContext); } @@ -5051,20 +5138,20 @@ export class TypeConstOrVarContext extends TypeContext { } // @Override public enterRule(listener: QuintListener): void { - if (listener.enterTypeConstOrVar) { - listener.enterTypeConstOrVar(this); + if (listener.enterTypeConst) { + listener.enterTypeConst(this); } } // @Override public exitRule(listener: QuintListener): void { - if (listener.exitTypeConstOrVar) { - listener.exitTypeConstOrVar(this); + if (listener.exitTypeConst) { + listener.exitTypeConst(this); } } // @Override public accept(visitor: QuintVisitor): Result { - if (visitor.visitTypeConstOrVar) { - return visitor.visitTypeConstOrVar(this); + if (visitor.visitTypeConst) { + return visitor.visitTypeConst(this); } else { return visitor.visitChildren(this); } @@ -5104,7 +5191,7 @@ export class TypeParenContext extends TypeContext { export class RowContext extends ParserRuleContext { - public _rowVar!: Token; + public _rowVar!: IdentifierContext; public rowLabel(): RowLabelContext[]; public rowLabel(i: number): RowLabelContext; public rowLabel(i?: number): RowLabelContext | RowLabelContext[] { @@ -5123,7 +5210,9 @@ export class RowContext extends ParserRuleContext { return this.getRuleContext(i, TypeContext); } } - public IDENTIFIER(): TerminalNode | undefined { return this.tryGetToken(QuintParser.IDENTIFIER, 0); } + public identifier(): IdentifierContext | undefined { + return this.tryGetRuleContext(0, IdentifierContext); + } constructor(parent: ParserRuleContext | undefined, invokingState: number) { super(parent, invokingState); } @@ -6856,13 +6945,13 @@ export class LiteralContext extends ParserRuleContext { export class QualIdContext extends ParserRuleContext { - public IDENTIFIER(): TerminalNode[]; - public IDENTIFIER(i: number): TerminalNode; - public IDENTIFIER(i?: number): TerminalNode | TerminalNode[] { + public identifier(): IdentifierContext[]; + public identifier(i: number): IdentifierContext; + public identifier(i?: number): IdentifierContext | IdentifierContext[] { if (i === undefined) { - return this.getTokens(QuintParser.IDENTIFIER); + return this.getRuleContexts(IdentifierContext); } else { - return this.getToken(QuintParser.IDENTIFIER, i); + return this.getRuleContext(i, IdentifierContext); } } constructor(parent: ParserRuleContext | undefined, invokingState: number) { @@ -6896,7 +6985,9 @@ export class QualIdContext extends ParserRuleContext { export class SimpleIdContext extends ParserRuleContext { public context: string; public _qualId!: QualIdContext; - public IDENTIFIER(): TerminalNode | undefined { return this.tryGetToken(QuintParser.IDENTIFIER, 0); } + public identifier(): IdentifierContext | undefined { + return this.tryGetRuleContext(0, IdentifierContext); + } public qualId(): QualIdContext | undefined { return this.tryGetRuleContext(0, QualIdContext); } @@ -6929,3 +7020,34 @@ export class SimpleIdContext extends ParserRuleContext { } +export class IdentifierContext extends ParserRuleContext { + public LOW_ID(): TerminalNode | undefined { return this.tryGetToken(QuintParser.LOW_ID, 0); } + public CAP_ID(): TerminalNode | undefined { return this.tryGetToken(QuintParser.CAP_ID, 0); } + constructor(parent: ParserRuleContext | undefined, invokingState: number) { + super(parent, invokingState); + } + // @Override + public get ruleIndex(): number { return QuintParser.RULE_identifier; } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterIdentifier) { + listener.enterIdentifier(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitIdentifier) { + listener.exitIdentifier(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitIdentifier) { + return visitor.visitIdentifier(this); + } else { + return visitor.visitChildren(this); + } + } +} + + diff --git a/quint/src/generated/QuintVisitor.ts b/quint/src/generated/QuintVisitor.ts index 2c31cc191..19a707994 100644 --- a/quint/src/generated/QuintVisitor.ts +++ b/quint/src/generated/QuintVisitor.ts @@ -18,7 +18,8 @@ import { TypeRecContext } from "./QuintParser"; import { TypeIntContext } from "./QuintParser"; import { TypeStrContext } from "./QuintParser"; import { TypeBoolContext } from "./QuintParser"; -import { TypeConstOrVarContext } from "./QuintParser"; +import { TypeVarContext } from "./QuintParser"; +import { TypeConstContext } from "./QuintParser"; import { TypeParenContext } from "./QuintParser"; import { TypeAbstractDefContext } from "./QuintParser"; import { TypeAliasDefContext } from "./QuintParser"; @@ -99,6 +100,7 @@ import { OperatorContext } from "./QuintParser"; import { LiteralContext } from "./QuintParser"; import { QualIdContext } from "./QuintParser"; import { SimpleIdContext } from "./QuintParser"; +import { IdentifierContext } from "./QuintParser"; /** @@ -182,12 +184,20 @@ export interface QuintVisitor extends ParseTreeVisitor { visitTypeBool?: (ctx: TypeBoolContext) => Result; /** - * Visit a parse tree produced by the `typeConstOrVar` + * Visit a parse tree produced by the `typeVar` * labeled alternative in `QuintParser.type`. * @param ctx the parse tree * @return the visitor result */ - visitTypeConstOrVar?: (ctx: TypeConstOrVarContext) => Result; + visitTypeVar?: (ctx: TypeVarContext) => Result; + + /** + * Visit a parse tree produced by the `typeConst` + * labeled alternative in `QuintParser.type`. + * @param ctx the parse tree + * @return the visitor result + */ + visitTypeConst?: (ctx: TypeConstContext) => Result; /** * Visit a parse tree produced by the `typeParen` @@ -790,5 +800,12 @@ export interface QuintVisitor extends ParseTreeVisitor { * @return the visitor result */ visitSimpleId?: (ctx: SimpleIdContext) => Result; + + /** + * Visit a parse tree produced by `QuintParser.identifier`. + * @param ctx the parse tree + * @return the visitor result + */ + visitIdentifier?: (ctx: IdentifierContext) => Result; } diff --git a/quint/testFixture/_1025importeeWithError.json b/quint/testFixture/_1025importeeWithError.json index a182ffb1d..32b335531 100644 --- a/quint/testFixture/_1025importeeWithError.json +++ b/quint/testFixture/_1025importeeWithError.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"I","declarations":[{"id":9,"kind":"def","name":"x","qualifier":"val","expr":{"id":8,"kind":"let","opdef":{"id":3,"kind":"def","name":"y","qualifier":"val","expr":{"id":2,"kind":"bool","value":true}},"expr":{"id":4,"kind":"let","opdef":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true}},"expr":{"id":7,"kind":"name","name":"__undefinedExprGenerated"}}}}]}],"table":{"7":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true},"depth":1}},"errors":[{"explanation":"[QNT000] mismatched input '}' expecting {'{', 'nondet', 'val', 'def', 'pure', 'action', 'run', 'temporal', '[', 'all', 'any', 'if', '_', STRING, BOOL, INT, 'and', 'or', 'iff', 'implies', 'Set', 'List', 'Map', 'match', '-', '(', IDENTIFIER}","locs":[{"source":"mocked_path/testFixture/_1025importeeWithError.qnt","start":{"line":3,"col":0,"index":45},"end":{"line":3,"col":0,"index":45}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"I","declarations":[{"id":9,"kind":"def","name":"x","qualifier":"val","expr":{"id":8,"kind":"let","opdef":{"id":3,"kind":"def","name":"y","qualifier":"val","expr":{"id":2,"kind":"bool","value":true}},"expr":{"id":4,"kind":"let","opdef":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true}},"expr":{"id":7,"kind":"name","name":"__undefinedExprGenerated"}}}}]}],"table":{"7":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true},"depth":1}},"errors":[{"explanation":"[QNT000] mismatched input '}' expecting {'{', 'nondet', 'val', 'def', 'pure', 'action', 'run', 'temporal', '[', 'all', 'any', 'if', '_', STRING, BOOL, INT, 'and', 'or', 'iff', 'implies', 'Set', 'List', 'Map', 'match', '-', '(', LOW_ID, CAP_ID}","locs":[{"source":"mocked_path/testFixture/_1025importeeWithError.qnt","start":{"line":3,"col":0,"index":45},"end":{"line":3,"col":0,"index":45}}]}]} \ No newline at end of file From 739c0efbb69aa1ca14c241068167c7872176f128 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 12 Jan 2024 13:54:53 -0500 Subject: [PATCH 180/388] Add regression test for #1336 --- quint/test/types/parser.test.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/quint/test/types/parser.test.ts b/quint/test/types/parser.test.ts index 7454f8991..762a55f53 100644 --- a/quint/test/types/parser.test.ts +++ b/quint/test/types/parser.test.ts @@ -46,6 +46,17 @@ describe('parseType', () => { ) }) + // Regression test for https://github.com/informalsystems/quint/issues/1336 + it('parses qualified type constants', () => { + const type = parseType('modname::TypeConstructor') + + assert.isTrue(type.isRight()) + type.map(value => { + assert(value.kind === 'const') + assert.deepEqual(value.name, 'modname::TypeConstructor') + }) + }) + it('parses function of const types', () => { const type = parseType('T1 -> (T2 -> T1)') From 92b09dd91d1dde9bf913c17bc06c2b5b697c7b48 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 12 Jan 2024 14:02:01 -0500 Subject: [PATCH 181/388] Update changelog --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 20a935176..e8b1aefa0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Deprecated ### Removed ### Fixed + +- Fixed parsing of qualified type constructors, which were being misinterpreted + as type variables when the name of the qualifying module started with a + lowercase letter (#1337). + ### Security ## v0.18.0 -- 2024-01-03 From d246e0b038b518c55ead75965f22d86f479978bf Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 12 Jan 2024 14:22:33 -0500 Subject: [PATCH 182/388] Update examples/spells/BoundedUInt.qnt Co-authored-by: Gabriela Moreira --- examples/spells/BoundedUInt.qnt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/spells/BoundedUInt.qnt b/examples/spells/BoundedUInt.qnt index 6c8d28531..4a8d35b8a 100644 --- a/examples/spells/BoundedUInt.qnt +++ b/examples/spells/BoundedUInt.qnt @@ -38,7 +38,7 @@ module BoundedUInt { def bind(u: UIntT, f: (int => UIntT)): UIntT = match u { | Ok(i) => f(i) | Err(_) => u - } + } /// `f.app(u, v, msg)` is `UInt(f(x,y))` if `u` is `Ok(x)` and `v` is `Ok(y)`. /// If `UInt(f(x,y))` is out of range, it is `Err(msg)`. From 11ab08bc400c64bd9eefb74cc9a71d4757e78c51 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 12 Jan 2024 14:22:43 -0500 Subject: [PATCH 183/388] Update examples/spells/BoundedUInt.qnt Co-authored-by: Gabriela Moreira --- examples/spells/BoundedUInt.qnt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/spells/BoundedUInt.qnt b/examples/spells/BoundedUInt.qnt index 4a8d35b8a..c67217c69 100644 --- a/examples/spells/BoundedUInt.qnt +++ b/examples/spells/BoundedUInt.qnt @@ -15,7 +15,7 @@ module BoundedUInt { /// /// NOTE: values of this type must only be constructed using `UInt`, /// and never via `Ok` or `Err` directly. - // TODO: Replacce with polymorphic result type, once that is avainable + // TODO: Replace with polymorphic result type, once that is available // See https://github.com/informalsystems/quint/issues/1073 type UIntT = Ok(int) | Err(str) From 21f2129bee3270b10b6d8263f00364d3a56833a4 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 12 Jan 2024 14:25:10 -0500 Subject: [PATCH 184/388] Explain eta-expansion --- examples/spells/BoundedUInt.qnt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/spells/BoundedUInt.qnt b/examples/spells/BoundedUInt.qnt index c67217c69..5203b194c 100644 --- a/examples/spells/BoundedUInt.qnt +++ b/examples/spells/BoundedUInt.qnt @@ -60,6 +60,10 @@ module BoundedUInt { // CHECKED OPERATIONS // //////////////////////// + // TODO: In the following we have to eta-expand calls to `ifoo` builtins + // due to https://github.com/informalsystems/quint/issues/1332 + // We should simplify those once this issue with the simulator is fixed. + /// Checked integer addition. /// Errors with "overflow" pure def checkedAdd(lhs: UIntT, rhs: UIntT): UIntT = ((x,y) => iadd(x,y)).app(lhs, rhs, "overflow") From 4924302c48bbb465d879132e66c4804327b034ea Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 12 Jan 2024 14:35:28 -0500 Subject: [PATCH 185/388] Fix failing integration test There is no need to have this test output require updates any time we change the grammar. --- quint/io-cli-tests.md | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/quint/io-cli-tests.md b/quint/io-cli-tests.md index 232a4653b..830f2f659 100644 --- a/quint/io-cli-tests.md +++ b/quint/io-cli-tests.md @@ -271,18 +271,12 @@ echo -e "init\nMyF::ExportedBasics::double(2)" | quint -r ../examples/language-f ``` -echo -e "1 +" | quint | tail -n +3 +echo -e "1 +" | quint | grep -o 'syntax error: error: \[QNT000\]' ``` ``` ->>> [DEBUG] generating undefined expr to fill hole in: 1+ -syntax error: error: [QNT000] mismatched input '' expecting {'{', 'nondet', 'val', 'def', 'pure', 'action', 'run', 'temporal', '[', 'all', 'any', 'if', '_', STRING, BOOL, INT, 'and', 'or', 'iff', 'implies', 'Set', 'List', 'Map', 'match', '-', '(', IDENTIFIER} - - - - ->>> +syntax error: error: [QNT000] ``` From cc500192b6a2e03be5941ba04782f4e70a951e44 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 12 Jan 2024 14:40:01 -0500 Subject: [PATCH 186/388] Remove outdated comment --- quint/src/generated/Quint.g4 | 1 - 1 file changed, 1 deletion(-) diff --git a/quint/src/generated/Quint.g4 b/quint/src/generated/Quint.g4 index f57968779..6cb27d16f 100644 --- a/quint/src/generated/Quint.g4 +++ b/quint/src/generated/Quint.g4 @@ -288,7 +288,6 @@ ASGN : '=' ; LPAREN : '(' ; RPAREN : ')' ; -// other TLA+ identifiers // An identifier starting with lowercase LOW_ID : ([a-z][a-zA-Z0-9_]*|[_][a-zA-Z0-9_]+) ; // An identifier starting with uppercase From ce3e0453b90b7689001be9875bc517f5221d1857 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 12 Jan 2024 14:55:05 -0500 Subject: [PATCH 187/388] Run CI in the merge queue --- .github/workflows/main.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 55a7720c5..f98f79531 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -3,6 +3,9 @@ on: # Every pull request pull_request: + # When part of a merge queue + # See https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/managing-a-merge-queue#triggering-merge-group-checks-with-github-actions + merge_group: # Pushes into the trunk # This is important to ensure the trunk is not broken and # to populate the cache for future PRs. From 9ae46b09805b6916db2185e748ee6df7010cc826 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 15 Jan 2024 15:37:18 -0300 Subject: [PATCH 188/388] Ensure runtime errors are reported in simulation --- quint/io-cli-tests.md | 2 +- quint/src/cliCommands.ts | 38 +++++++++++++++++--------------------- quint/src/simulation.ts | 7 ++++++- 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/quint/io-cli-tests.md b/quint/io-cli-tests.md index 232a4653b..00ffa4df7 100644 --- a/quint/io-cli-tests.md +++ b/quint/io-cli-tests.md @@ -966,7 +966,7 @@ HOME/_1041compileConst.qnt:5:24 - error: [QNT502] Name N not found 5: action init = { x' = N } ^ -error: run failed +error: Runtime error ``` ### Repl keeps right track of variables from instances diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index 06ab55abf..4c8e254e6 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -66,7 +66,7 @@ interface OutputStage { failed?: string[] ignored?: string[] // Test names output produced by 'run' - status?: 'ok' | 'violation' | 'failure' + status?: 'ok' | 'violation' | 'failure' | 'error' trace?: QuintEx[] /* Docstrings by definition name by module name */ documentation?: Map> @@ -530,11 +530,7 @@ export async function runSimulator(prev: TypecheckedStage): Promise 0) { + status = 'error' + } + return { status: status, vars: evaluationState.vars.map(v => v.name), states: topFrame.args.map(e => e.toQuintEx(idGen)), frames: topFrame.subframes, - errors: ctx.getRuntimeErrors(), + errors: errors, seed: recorder.getBestTraceSeed(), } } From dcda6c71cae458023283e6afbee1bf7b5efa0dd3 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 15 Jan 2024 15:46:28 -0300 Subject: [PATCH 189/388] Add CHANGELOG entry --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 20a935176..b4fc3159c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -305,6 +305,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Deprecated ### Removed ### Fixed + +- Fixed an issue where, sometimes, runtime errors were not reported in + simulation (#1339) + ### Security ## v0.11.1 -- 2023-06-01 From 521f300ba4b96363928cfba35188a8578765cb51 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 15 Jan 2024 16:40:49 -0300 Subject: [PATCH 190/388] Update comment for status attribute --- quint/src/cliCommands.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index 4c8e254e6..600f61f3f 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -65,7 +65,7 @@ interface OutputStage { passed?: string[] failed?: string[] ignored?: string[] - // Test names output produced by 'run' + // Possible results from 'run' status?: 'ok' | 'violation' | 'failure' | 'error' trace?: QuintEx[] /* Docstrings by definition name by module name */ From f64242f18eed276419a3bddd34d0e497012c285d Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 16 Jan 2024 18:25:37 -0300 Subject: [PATCH 191/388] Release v0.18.1 --- CHANGELOG.md | 9 +++++++++ quint/package-lock.json | 4 ++-- quint/package.json | 2 +- quint/src/version.ts | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f70f33d21..91c1f0fd6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.18.1 -- 2024-01-16 + ### Added ### Changed ### Deprecated diff --git a/quint/package-lock.json b/quint/package-lock.json index 096e6597a..b86cf5d2e 100644 --- a/quint/package-lock.json +++ b/quint/package-lock.json @@ -1,12 +1,12 @@ { "name": "@informalsystems/quint", - "version": "0.18.0", + "version": "0.18.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint", - "version": "0.18.0", + "version": "0.18.1", "license": "Apache 2.0", "dependencies": { "@grpc/grpc-js": "^1.8.14", diff --git a/quint/package.json b/quint/package.json index 7fc8c4a72..a1e268ae5 100644 --- a/quint/package.json +++ b/quint/package.json @@ -1,6 +1,6 @@ { "name": "@informalsystems/quint", - "version": "0.18.0", + "version": "0.18.1", "description": "Core tool for the Quint specification language", "keywords": [ "temporal", diff --git a/quint/src/version.ts b/quint/src/version.ts index 1aff2dbe7..9e6c4eefb 100644 --- a/quint/src/version.ts +++ b/quint/src/version.ts @@ -1,2 +1,2 @@ // Generated by genversion. -export const version = '0.18.0' +export const version = '0.18.1' From 19006a08204a92805a57a6ac6ddf07cb442ef66d Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 16 Jan 2024 18:25:37 -0300 Subject: [PATCH 192/388] Release v0.18.1 --- CHANGELOG.md | 14 +++++++++++--- quint/package-lock.json | 4 ++-- quint/package.json | 2 +- quint/src/version.ts | 2 +- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f70f33d21..55600156c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.18.1 -- 2024-01-16 + ### Added ### Changed ### Deprecated @@ -16,6 +25,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fixed parsing of qualified type constructors, which were being misinterpreted as type variables when the name of the qualifying module started with a lowercase letter (#1337). +- Fixed an issue where, sometimes, runtime errors were not reported in + simulation (#1339) ### Security @@ -311,9 +322,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Removed ### Fixed -- Fixed an issue where, sometimes, runtime errors were not reported in - simulation (#1339) - ### Security ## v0.11.1 -- 2023-06-01 diff --git a/quint/package-lock.json b/quint/package-lock.json index 096e6597a..b86cf5d2e 100644 --- a/quint/package-lock.json +++ b/quint/package-lock.json @@ -1,12 +1,12 @@ { "name": "@informalsystems/quint", - "version": "0.18.0", + "version": "0.18.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint", - "version": "0.18.0", + "version": "0.18.1", "license": "Apache 2.0", "dependencies": { "@grpc/grpc-js": "^1.8.14", diff --git a/quint/package.json b/quint/package.json index 7fc8c4a72..a1e268ae5 100644 --- a/quint/package.json +++ b/quint/package.json @@ -1,6 +1,6 @@ { "name": "@informalsystems/quint", - "version": "0.18.0", + "version": "0.18.1", "description": "Core tool for the Quint specification language", "keywords": [ "temporal", diff --git a/quint/src/version.ts b/quint/src/version.ts index 1aff2dbe7..9e6c4eefb 100644 --- a/quint/src/version.ts +++ b/quint/src/version.ts @@ -1,2 +1,2 @@ // Generated by genversion. -export const version = '0.18.0' +export const version = '0.18.1' From c2379e2345133d5f599bdb54179d62c2739fe017 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 16 Jan 2024 19:49:08 -0500 Subject: [PATCH 193/388] VSCode Release v0.13.1 --- vscode/quint-vscode/CHANGELOG.md | 9 +++++++++ vscode/quint-vscode/package-lock.json | 4 ++-- vscode/quint-vscode/package.json | 2 +- vscode/quint-vscode/server/package-lock.json | 18 +++++++++--------- vscode/quint-vscode/server/package.json | 4 ++-- 5 files changed, 23 insertions(+), 14 deletions(-) diff --git a/vscode/quint-vscode/CHANGELOG.md b/vscode/quint-vscode/CHANGELOG.md index 609132a83..38cfc2d55 100644 --- a/vscode/quint-vscode/CHANGELOG.md +++ b/vscode/quint-vscode/CHANGELOG.md @@ -14,6 +14,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed ### Security +## v0.13.1 -- 2024-01-16 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + ## v0.13.0 -- 2024-01-03 ### Added diff --git a/vscode/quint-vscode/package-lock.json b/vscode/quint-vscode/package-lock.json index 40be843ee..9aa7ebee9 100644 --- a/vscode/quint-vscode/package-lock.json +++ b/vscode/quint-vscode/package-lock.json @@ -1,12 +1,12 @@ { "name": "quint-vscode", - "version": "0.13.0", + "version": "0.13.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "quint-vscode", - "version": "0.13.0", + "version": "0.13.1", "hasInstallScript": true, "dependencies": { "vscode-languageclient": "^7.0.0" diff --git a/vscode/quint-vscode/package.json b/vscode/quint-vscode/package.json index f6c62ac88..b4b0221bb 100644 --- a/vscode/quint-vscode/package.json +++ b/vscode/quint-vscode/package.json @@ -3,7 +3,7 @@ "displayName": "Quint", "description": "Language support for Quint specifications", "icon": "quint-logo-vscode.png", - "version": "0.13.0", + "version": "0.13.1", "publisher": "informal", "engines": { "vscode": "^1.52.0" diff --git a/vscode/quint-vscode/server/package-lock.json b/vscode/quint-vscode/server/package-lock.json index 79b1dcba0..c7a4a6808 100644 --- a/vscode/quint-vscode/server/package-lock.json +++ b/vscode/quint-vscode/server/package-lock.json @@ -1,15 +1,15 @@ { "name": "@informalsystems/quint-language-server", - "version": "0.13.0", + "version": "0.13.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint-language-server", - "version": "0.13.0", + "version": "0.13.1", "license": "Apache 2.0", "dependencies": { - "@informalsystems/quint": "^0.18.0", + "@informalsystems/quint": "^0.18.1", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" @@ -476,9 +476,9 @@ "dev": true }, "node_modules/@informalsystems/quint": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.18.0.tgz", - "integrity": "sha512-IBmMLCmBYnMg5PhzB6jK6M4r90H+OIuQb2buwx7opfMozbdZ3+h7PLkekcvIsQulNA+nljMH6SaNGU0bmo75MQ==", + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.18.1.tgz", + "integrity": "sha512-fxYaMf3gVQBz1Pyj/0Mpn1mftCAjlfiMJ2IJ1pQ3RJNV4hNeAx29vYxpr2nojWdtz+UShOC63jguuYKa8kxNqg==", "dependencies": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", @@ -7207,9 +7207,9 @@ "dev": true }, "@informalsystems/quint": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.18.0.tgz", - "integrity": "sha512-IBmMLCmBYnMg5PhzB6jK6M4r90H+OIuQb2buwx7opfMozbdZ3+h7PLkekcvIsQulNA+nljMH6SaNGU0bmo75MQ==", + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.18.1.tgz", + "integrity": "sha512-fxYaMf3gVQBz1Pyj/0Mpn1mftCAjlfiMJ2IJ1pQ3RJNV4hNeAx29vYxpr2nojWdtz+UShOC63jguuYKa8kxNqg==", "requires": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", diff --git a/vscode/quint-vscode/server/package.json b/vscode/quint-vscode/server/package.json index 2289fc60f..ae36975f3 100644 --- a/vscode/quint-vscode/server/package.json +++ b/vscode/quint-vscode/server/package.json @@ -1,7 +1,7 @@ { "name": "@informalsystems/quint-language-server", "description": "Language Server for the Quint specification language", - "version": "0.13.0", + "version": "0.13.1", "author": "Informal Systems", "contributors": [ { @@ -43,7 +43,7 @@ "test/**/*.ts" ], "dependencies": { - "@informalsystems/quint": "^0.18.0", + "@informalsystems/quint": "^0.18.1", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" From 334d1e2d03a2215a7e6ca882f95b1c2965d4ecc8 Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 17 Jan 2024 17:24:09 -0300 Subject: [PATCH 194/388] Manipulate runtime error messages in the simulator so they include the location (in a temporary hacky way) --- quint/src/simulation.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/quint/src/simulation.ts b/quint/src/simulation.ts index 90a117597..8203b8f93 100644 --- a/quint/src/simulation.ts +++ b/quint/src/simulation.ts @@ -18,6 +18,9 @@ import { IdGenerator } from './idGenerator' import { Rng } from './rng' import { SourceLookupPath } from './parsing/sourceResolver' import { QuintError } from './quintError' +import { mkErrorMessage } from './cliCommands' +import { createFinders, formatError } from './errorReporter' +import { uniqBy } from 'lodash' /** * Various settings that have to be passed to the simulator to run. @@ -129,8 +132,17 @@ export function compileAndRun( console.error('No trace recorded') } - const errors = ctx.getRuntimeErrors() + let errors = ctx.getRuntimeErrors() if (errors.length > 0) { + const code = new Map([...ctx.compilationState.sourceCode.entries(), [mainPath.normalizedPath, codeWithExtraDefs]]) + const finders = createFinders(code) + errors = errors.map(error => ({ + code: error.code, + message: formatError(code, finders, { + ...mkErrorMessage(ctx.compilationState.sourceMap)(error), + explanation: error.message, + }), + })) status = 'error' } From 3648c3e54d8423cd5b4211a1255351c570475eef Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 17 Jan 2024 17:25:53 -0300 Subject: [PATCH 195/388] Add FIXME comment --- quint/src/simulation.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/quint/src/simulation.ts b/quint/src/simulation.ts index 8203b8f93..2f1f6955d 100644 --- a/quint/src/simulation.ts +++ b/quint/src/simulation.ts @@ -134,6 +134,7 @@ export function compileAndRun( let errors = ctx.getRuntimeErrors() if (errors.length > 0) { + // FIXME(#1052) we shouldn't need to do this if the error id was not some non-sense generated in `compileFromCode` const code = new Map([...ctx.compilationState.sourceCode.entries(), [mainPath.normalizedPath, codeWithExtraDefs]]) const finders = createFinders(code) errors = errors.map(error => ({ @@ -143,6 +144,7 @@ export function compileAndRun( explanation: error.message, }), })) + status = 'error' } From c52fdd65a133e7a08c0e7264bb934d626ae414eb Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 17 Jan 2024 19:18:48 -0300 Subject: [PATCH 196/388] Remove unused import --- quint/src/simulation.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/quint/src/simulation.ts b/quint/src/simulation.ts index 2f1f6955d..32215d871 100644 --- a/quint/src/simulation.ts +++ b/quint/src/simulation.ts @@ -20,7 +20,6 @@ import { SourceLookupPath } from './parsing/sourceResolver' import { QuintError } from './quintError' import { mkErrorMessage } from './cliCommands' import { createFinders, formatError } from './errorReporter' -import { uniqBy } from 'lodash' /** * Various settings that have to be passed to the simulator to run. From cf19c5d1a5076f783a65aa7e90b72740a59e13ee Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 17 Jan 2024 19:26:34 -0300 Subject: [PATCH 197/388] Add explanatory comments --- quint/src/simulation.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/quint/src/simulation.ts b/quint/src/simulation.ts index 32215d871..a2061b9bc 100644 --- a/quint/src/simulation.ts +++ b/quint/src/simulation.ts @@ -134,16 +134,26 @@ export function compileAndRun( let errors = ctx.getRuntimeErrors() if (errors.length > 0) { // FIXME(#1052) we shouldn't need to do this if the error id was not some non-sense generated in `compileFromCode` + // The evaluated code source is not included in the context, so we crete a version with it for the error reporter const code = new Map([...ctx.compilationState.sourceCode.entries(), [mainPath.normalizedPath, codeWithExtraDefs]]) const finders = createFinders(code) + errors = errors.map(error => ({ code: error.code, + // Include the location information (locs) in the error message - this + // is the hacky part, as it should only be included at the CLI level message: formatError(code, finders, { + // This will create the `locs` attribute and an explanation ...mkErrorMessage(ctx.compilationState.sourceMap)(error), + // We override the explanation to keep the original one to avoid + // duplication, since `mkErrorMessage` will be called again at the CLI + // level. `locs` won't be touched then because this error doesn't + // include a `reference` field explanation: error.message, }), })) + // This should be kept after the hack is removed status = 'error' } From dbd3db685869dc4fa1415db015f3de203303e29c Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 17 Jan 2024 17:59:54 -0500 Subject: [PATCH 198/388] Organize run and test setup consistently To help make it clear the limit of the duplicate logic --- quint/src/cliCommands.ts | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index 600f61f3f..29e2ed511 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -301,14 +301,10 @@ export async function runRepl(_argv: any) { * @param typedStage the procedure stage produced by `typecheck` */ export async function runTests(prev: TypecheckedStage): Promise> { + // TODO: Logic should be consistent with runSimulator? const verbosityLevel = !prev.args.out ? prev.args.verbosity : 0 - const out = console.log - const columns = !prev.args.out ? terminalWidth() : 80 - - const testing = { ...prev, stage: 'testing' as stage } const mainName = guessMainModule(prev) - - const outputTemplate = testing.args.output + const testing = { ...prev, stage: 'testing' as stage } const rngOrError = mkRng(prev.args.seed) if (rngOrError.isLeft()) { @@ -346,6 +342,22 @@ export async function runTests(prev: TypecheckedStage): Promise> { - const simulator = { ...prev, stage: 'running' as stage } - const mainName = guessMainModule(prev) const verbosityLevel = !prev.args.out && !prev.args.outItf ? prev.args.verbosity : 0 + const mainName = guessMainModule(prev) + const simulator = { ...prev, stage: 'running' as stage } + const rngOrError = mkRng(prev.args.seed) if (rngOrError.isLeft()) { return cliErr(rngOrError.value, { ...simulator, errors: [] }) } const rng = rngOrError.unwrap() + const options: SimulatorOptions = { init: prev.args.init, step: prev.args.step, From add5cf59633b59cb24e36d3eb4a1ab00740484c3 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 17 Jan 2024 19:08:47 -0500 Subject: [PATCH 199/388] Identify compilation errors during testing Also remove an unneeded mutable variable and improve code organization --- quint/io-cli-tests.md | 4 +- quint/src/cliCommands.ts | 158 +++++++++++++++++------------------ quint/src/runtime/testing.ts | 20 +++-- 3 files changed, 89 insertions(+), 93 deletions(-) diff --git a/quint/io-cli-tests.md b/quint/io-cli-tests.md index 612078bf1..915fa5ae4 100644 --- a/quint/io-cli-tests.md +++ b/quint/io-cli-tests.md @@ -935,7 +935,7 @@ exit $exit_code 5: assert(n > 0) ^ -error: Tests failed +error: Tests could not be run due to an error during compilation ``` ### Fail on run with uninitialized constants @@ -1046,7 +1046,7 @@ quint test --main=invalid ./testFixture/_1050diffName.qnt ``` error: [QNT405] Main module invalid not found -error: Tests failed +error: Tests could not be run due to an error during compilation ``` ### Multiple tests output different json diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index 29e2ed511..39ecb1b74 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -1,5 +1,5 @@ /** - * Define the commands for QuintC + * The commands for the quint CLI * * See the description at: * https://github.com/informalsystems/quint/blob/main/doc/quint.md @@ -312,16 +312,6 @@ export async function runTests(prev: TypecheckedStage): Promise isMatchingTest(testing.args.match, n) const options: TestOptions = { testMatch: matchFun, @@ -348,9 +338,9 @@ export async function runTests(prev: TypecheckedStage): Promise { - if (res.status === 'passed') { - out(` ${chalk.green('ok')} ${res.name} passed ${res.nsamples} test(s)`) - } - if (res.status === 'failed') { - const errNo = chalk.red(namedErrors.length + 1) - out(` ${errNo}) ${res.name} failed after ${res.nsamples} test(s)`) - - res.errors.forEach(e => namedErrors.push([res.name, mkErrorMessage(testing.sourceMap)(e), res])) - } - }) - } - - passed = results.filter(r => r.status === 'passed').map(r => r.name) - failed = results.filter(r => r.status === 'failed').map(r => r.name) - ignored = results.filter(r => r.status === 'ignored').map(r => r.name) + return cliErr('Tests could not be run due to an error during compilation', { + ...testing, + errors: testOut.value.map(mkErrorMessage(testing.sourceMap)), + }) + } + const results = testOut.unwrap() - // output the statistics banner - if (verbosity.hasResults(verbosityLevel)) { - out('') - if (passed.length > 0) { - out(chalk.green(` ${passed.length} passing`) + chalk.gray(` (${elapsedMs}ms)`)) - } - if (failed.length > 0) { - out(chalk.red(` ${failed.length} failed`)) + // output the status for every test + if (verbosity.hasResults(verbosityLevel)) { + results.forEach(res => { + if (res.status === 'passed') { + out(` ${chalk.green('ok')} ${res.name} passed ${res.nsamples} test(s)`) } - if (ignored.length > 0) { - out(chalk.gray(` ${ignored.length} ignored`)) + if (res.status === 'failed') { + const errNo = chalk.red(namedErrors.length + 1) + out(` ${errNo}) ${res.name} failed after ${res.nsamples} test(s)`) + + res.errors.forEach(e => namedErrors.push([res.name, mkErrorMessage(testing.sourceMap)(e), res])) } + }) + } + + const passed: string[] = results.filter(r => r.status === 'passed').map(r => r.name) + failed = results.filter(r => r.status === 'failed').map(r => r.name) + ignored = results.filter(r => r.status === 'ignored').map(r => r.name) + + // output the statistics banner + if (verbosity.hasResults(verbosityLevel)) { + out('') + if (passed.length > 0) { + out(chalk.green(` ${passed.length} passing`) + chalk.gray(` (${elapsedMs}ms)`)) + } + if (failed.length > 0) { + out(chalk.red(` ${failed.length} failed`)) + } + if (ignored.length > 0) { + out(chalk.gray(` ${ignored.length} ignored`)) } + } - // output errors, if there are any - if (verbosity.hasTestDetails(verbosityLevel) && namedErrors.length > 0) { - const code = prev.sourceCode! - const finders = createFinders(code) - out('') - namedErrors.forEach(([name, err, testResult], index) => { - const details = formatError(code, finders, err) - // output the header - out(` ${index + 1}) ${name}:`) - const lines = details.split('\n') - // output the first two lines in red - lines.slice(0, 2).forEach(l => out(chalk.red(' ' + l))) - - if (verbosity.hasActionTracking(verbosityLevel)) { - out('') - testResult.frames.forEach((f, index) => { - out(`[${chalk.bold('Frame ' + index)}]`) - const console = { - width: columns, - out: (s: string) => process.stdout.write(s), - } - printExecutionFrameRec(console, f, []) - out('') - }) - - if (testResult.frames.length == 0) { - out(' [No execution]') + // output errors, if there are any + if (verbosity.hasTestDetails(verbosityLevel) && namedErrors.length > 0) { + const code = prev.sourceCode! + const finders = createFinders(code) + out('') + namedErrors.forEach(([name, err, testResult], index) => { + const details = formatError(code, finders, err) + // output the header + out(` ${index + 1}) ${name}:`) + const lines = details.split('\n') + // output the first two lines in red + lines.slice(0, 2).forEach(l => out(chalk.red(' ' + l))) + + if (verbosity.hasActionTracking(verbosityLevel)) { + out('') + testResult.frames.forEach((f, index) => { + out(`[${chalk.bold('Frame ' + index)}]`) + const console = { + width: columns, + out: (s: string) => process.stdout.write(s), } + printExecutionFrameRec(console, f, []) + out('') + }) + + if (testResult.frames.length == 0) { + out(' [No execution]') } - // output the seed - out(chalk.gray(` Use --seed=0x${testResult.seed.toString(16)} --match=${testResult.name} to repeat.`)) - }) - out('') - } + } + // output the seed + out(chalk.gray(` Use --seed=0x${testResult.seed.toString(16)} --match=${testResult.name} to repeat.`)) + }) + out('') + } - if (failed.length > 0 && verbosity.hasHints(options.verbosity) && !verbosity.hasActionTracking(options.verbosity)) { - out(chalk.gray(`\n Use --verbosity=3 to show executions.`)) - out(chalk.gray(` Further debug with: quint --verbosity=3 ${prev.args.input}`)) - } + if (failed.length > 0 && verbosity.hasHints(options.verbosity) && !verbosity.hasActionTracking(options.verbosity)) { + out(chalk.gray(`\n Use --verbosity=3 to show executions.`)) + out(chalk.gray(` Further debug with: quint --verbosity=3 ${prev.args.input}`)) } const errors = namedErrors.map(([_, e]) => e) @@ -531,6 +524,7 @@ export async function runSimulator(prev: TypecheckedStage): Promise { - const recorder = newTraceRecorder(options.verbosity, options.rng) const main = compilationState.modules.find(m => m.name === mainName) if (!main) { return left([{ code: 'QNT405', message: `Main module ${mainName} not found` }]) } + const recorder = newTraceRecorder(options.verbosity, options.rng) const ctx = compile(compilationState, newEvaluationState(recorder), lookupTable, options.rng.next, main.declarations) + const ctxErrors = ctx.syntaxErrors.concat(ctx.compileErrors, ctx.analysisErrors) + if (ctxErrors.length > 0) { + // In principle, these errors should have been caught earlier. + // But if they did not, return immediately. + return left(ctxErrors) + } + const saveTrace = (index: number, name: string, status: string) => { // Save the best traces that are reported by the recorder: // If a test failed, it is the first failing trace. @@ -104,13 +113,6 @@ export function compileAndTest( ) } - const ctxErrors = ctx.syntaxErrors.concat(ctx.compileErrors).concat(ctx.analysisErrors) - if (ctxErrors.length > 0) { - // In principle, these errors should have been caught earlier. - // But if they did not, return immediately. - return left(ctxErrors) - } - const testDefs = main.declarations.filter(d => d.kind === 'def' && options.testMatch(d.name)) as QuintOpDef[] return mergeInMany( From a7b6507bcfcec93c5e23717dbb74dd47763d7ab3 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 17 Jan 2024 21:20:32 -0500 Subject: [PATCH 200/388] Remove unneeded mutable vars --- quint/src/cliCommands.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index 39ecb1b74..9009da9d2 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -337,9 +337,6 @@ export async function runTests(prev: TypecheckedStage): Promise d.kind === 'def' && options.testMatch(d.name) ) - // Define name expressions referencing each test that is not referenced elsewhere, adding the references to the lookup // table const args: QuintEx[] = unusedTests.map(defToAdd => { @@ -364,7 +364,6 @@ export async function runTests(prev: TypecheckedStage): Promise m.name === mainName) main?.declarations.push(testDeclaration) + // TODO The following block should all be moved into compileAndTest const analysisOutput = { types: testing.types, effects: testing.effects, modes: testing.modes } const { flattenedModules, flattenedTable, flattenedAnalysis } = flattenModules( testing.modules, @@ -394,6 +393,7 @@ export async function runTests(prev: TypecheckedStage): Promise r.status === 'passed').map(r => r.name) - failed = results.filter(r => r.status === 'failed').map(r => r.name) - ignored = results.filter(r => r.status === 'ignored').map(r => r.name) + const passed = results.filter(r => r.status === 'passed').map(r => r.name) + const failed = results.filter(r => r.status === 'failed').map(r => r.name) + const ignored = results.filter(r => r.status === 'ignored').map(r => r.name) // output the statistics banner if (verbosity.hasResults(verbosityLevel)) { From 87306a5e40a504cecb9e018ef8278114b9e2e96c Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 17 Jan 2024 22:34:24 -0500 Subject: [PATCH 201/388] Clean up error reporting --- quint/src/cliCommands.ts | 67 ++++++++++++++++++++++++---------------- 1 file changed, 41 insertions(+), 26 deletions(-) diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index 9009da9d2..a581bffe6 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -333,12 +333,10 @@ export async function runTests(prev: TypecheckedStage): Promise { if (res.status === 'passed') { out(` ${chalk.green('ok')} ${res.name} passed ${res.nsamples} test(s)`) } if (res.status === 'failed') { - const errNo = chalk.red(namedErrors.length + 1) + const errNo = chalk.red(nFailures) out(` ${errNo}) ${res.name} failed after ${res.nsamples} test(s)`) - - res.errors.forEach(e => namedErrors.push([res.name, mkErrorMessage(testing.sourceMap)(e), res])) + nFailures++ } }) } - const passed = results.filter(r => r.status === 'passed').map(r => r.name) - const failed = results.filter(r => r.status === 'failed').map(r => r.name) - const ignored = results.filter(r => r.status === 'ignored').map(r => r.name) + const passed = results.filter(r => r.status === 'passed') + const failed = results.filter(r => r.status === 'failed') + const ignored = results.filter(r => r.status === 'ignored') + const namedErrors: [TestResult, ErrorMessage][] = failed.reduce( + (acc: [TestResult, ErrorMessage][], failure) => + acc.concat(failure.errors.map(e => [failure, mkErrorMessage(testing.sourceMap)(e)])), + [] + ) // output the statistics banner if (verbosity.hasResults(verbosityLevel)) { @@ -438,15 +445,29 @@ export async function runTests(prev: TypecheckedStage): Promise 0) { + const stage = { + ...testing, + passed: passed.map(r => r.name), + failed: failed.map(r => r.name), + ignored: ignored.map(r => r.name), + errors: namedErrors.map(([_, e]) => e), + } + + // Nothing failed, so we are OK, and can exit early + if (failed.length === 0) { + return right(stage) + } + + // We know that there are errors, so report as required by the verbosity configuration + if (verbosity.hasTestDetails(verbosityLevel)) { const code = prev.sourceCode! const finders = createFinders(code) + const columns = !prev.args.out ? terminalWidth() : 80 out('') - namedErrors.forEach(([name, err, testResult], index) => { + namedErrors.forEach(([testResult, err], index) => { const details = formatError(code, finders, err) // output the header - out(` ${index + 1}) ${name}:`) + out(` ${index + 1}) ${testResult.name}:`) const lines = details.split('\n') // output the first two lines in red lines.slice(0, 2).forEach(l => out(chalk.red(' ' + l))) @@ -473,18 +494,12 @@ export async function runTests(prev: TypecheckedStage): Promise 0 && verbosity.hasHints(options.verbosity) && !verbosity.hasActionTracking(options.verbosity)) { + if (verbosity.hasHints(options.verbosity) && !verbosity.hasActionTracking(options.verbosity)) { out(chalk.gray(`\n Use --verbosity=3 to show executions.`)) out(chalk.gray(` Further debug with: quint --verbosity=3 ${prev.args.input}`)) } - const errors = namedErrors.map(([_, e]) => e) - const stage = { ...testing, passed, failed, ignored, errors } - if (errors.length == 0 && failed.length == 0) { - return right(stage) - } else { - return cliErr('Tests failed', stage) - } + return cliErr('Tests failed', stage) } // Print a counterexample if the appropriate verbosity is set From 3ac3b6b4779ac3a194be872ab2fdfc44bd1d5e74 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 22 Jan 2024 10:16:52 -0500 Subject: [PATCH 202/388] Standardize verbosity derivation --- quint/src/cliCommands.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index a581bffe6..968dd04d5 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -302,7 +302,7 @@ export async function runRepl(_argv: any) { */ export async function runTests(prev: TypecheckedStage): Promise> { // TODO: Logic should be consistent with runSimulator? - const verbosityLevel = !prev.args.out ? prev.args.verbosity : 0 + const verbosityLevel = deriveVerbosity(prev.args) const mainName = guessMainModule(prev) const testing = { ...prev, stage: 'testing' as stage } @@ -520,7 +520,7 @@ function maybePrintCounterExample(verbosityLevel: number, states: QuintEx[], fra * @param prev the procedure stage produced by `typecheck` */ export async function runSimulator(prev: TypecheckedStage): Promise> { - const verbosityLevel = !prev.args.out && !prev.args.outItf ? prev.args.verbosity : 0 + const verbosityLevel = deriveVerbosity(prev.args) const mainName = guessMainModule(prev) const simulator = { ...prev, stage: 'running' as stage } @@ -611,6 +611,8 @@ export async function runSimulator(prev: TypecheckedStage): Promise> { const verifying = { ...prev, stage: 'verifying' as stage } const args = verifying.args + const verbosityLevel = deriveVerbosity(args) + let loadedConfig: any = {} try { if (args.apalacheConfig) { @@ -696,7 +698,6 @@ export async function verifySpec(prev: TypecheckedStage): Promise { const elapsedMs = Date.now() - startMs return res @@ -881,3 +882,8 @@ function isMatchingTest(match: string | undefined, name: string) { return name.endsWith('Test') } } + +// Derive the verbosity for simulation and verification routines +function deriveVerbosity(args: { out: string | undefined; outItf: string | undefined; verbosity: number }): number { + return !args.out && !args.outItf ? args.verbosity : 0 +} From a6971b558dbdfd4fe08972778b13d6a1bab38d83 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 22 Jan 2024 11:16:37 -0500 Subject: [PATCH 203/388] Remove unnecessary `failure` status --- quint/src/simulation.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/quint/src/simulation.ts b/quint/src/simulation.ts index a2061b9bc..a3ff3723a 100644 --- a/quint/src/simulation.ts +++ b/quint/src/simulation.ts @@ -20,6 +20,7 @@ import { SourceLookupPath } from './parsing/sourceResolver' import { QuintError } from './quintError' import { mkErrorMessage } from './cliCommands' import { createFinders, formatError } from './errorReporter' +import { fail } from 'assert' /** * Various settings that have to be passed to the simulator to run. @@ -34,7 +35,7 @@ export interface SimulatorOptions { verbosity: number } -export type SimulatorResultStatus = 'ok' | 'violation' | 'failure' | 'error' +export type SimulatorResultStatus = 'ok' | 'violation' | 'error' /** * A result returned by the simulator. @@ -116,19 +117,20 @@ export function compileAndRun( const errors = [{ code: 'QNT512', message: res.value }] as QuintError[] return errSimulationResult('error', errors) } else { - const _ = res.value.eval() + res.value.eval() } const topFrame = recorder.getBestTrace() - let status: SimulatorResultStatus = 'failure' + let status: SimulatorResultStatus if (topFrame.result.isJust()) { const ex = topFrame.result.unwrap().toQuintEx(idGen) if (ex.kind === 'bool') { status = ex.value ? 'ok' : 'violation' + } else { + fail('invalid value derived from simulation') } } else { - // This should not happen. But if it does, give a debugging hint. - console.error('No trace recorded') + fail('simulation failed to produce any trace') } let errors = ctx.getRuntimeErrors() From 4b21c5f681101d0be1cf22d787def196c24fa3b4 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 22 Jan 2024 11:17:15 -0500 Subject: [PATCH 204/388] Clean up branching logic in runSimulator --- quint/src/cliCommands.ts | 73 +++++++++++++++++++++------------------- 1 file changed, 39 insertions(+), 34 deletions(-) diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index 968dd04d5..33713d85b 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -301,10 +301,9 @@ export async function runRepl(_argv: any) { * @param typedStage the procedure stage produced by `typecheck` */ export async function runTests(prev: TypecheckedStage): Promise> { - // TODO: Logic should be consistent with runSimulator? + const testing = { ...prev, stage: 'testing' as stage } const verbosityLevel = deriveVerbosity(prev.args) const mainName = guessMainModule(prev) - const testing = { ...prev, stage: 'testing' as stage } const rngOrError = mkRng(prev.args.seed) if (rngOrError.isLeft()) { @@ -520,9 +519,9 @@ function maybePrintCounterExample(verbosityLevel: number, states: QuintEx[], fra * @param prev the procedure stage produced by `typecheck` */ export async function runSimulator(prev: TypecheckedStage): Promise> { + const simulator = { ...prev, stage: 'running' as stage } const verbosityLevel = deriveVerbosity(prev.args) const mainName = guessMainModule(prev) - const simulator = { ...prev, stage: 'running' as stage } const rngOrError = mkRng(prev.args.seed) if (rngOrError.isLeft()) { @@ -553,53 +552,59 @@ export async function runSimulator(prev: TypecheckedStage): Promise Date: Mon, 22 Jan 2024 12:19:53 -0500 Subject: [PATCH 205/388] Make it impossible to error without errors Fix the representation of simulation results so that of there are errors, we return an outcome with an error status and errors, and not otherwise. Also remove some redundant declarations. --- quint/src/cliCommands.ts | 34 +++++----- quint/src/simulation.ts | 140 +++++++++++++++++++++------------------ 2 files changed, 90 insertions(+), 84 deletions(-) diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index 33713d85b..1742eebab 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -145,13 +145,8 @@ interface TestedStage extends LoadedStage { ignored: string[] } -interface SimulatorStage extends LoadedStage { - status: 'ok' | 'violation' | 'failure' - trace?: QuintEx[] -} - -interface VerifiedStage extends LoadedStage { - status: 'ok' | 'violation' | 'failure' +// Data resulting from stages that can produce a trace +interface TracingStage extends LoadedStage { trace?: QuintEx[] } @@ -518,7 +513,7 @@ function maybePrintCounterExample(verbosityLevel: number, states: QuintEx[], fra * * @param prev the procedure stage produced by `typecheck` */ -export async function runSimulator(prev: TypecheckedStage): Promise> { +export async function runSimulator(prev: TypecheckedStage): Promise> { const simulator = { ...prev, stage: 'running' as stage } const verbosityLevel = deriveVerbosity(prev.args) const mainName = guessMainModule(prev) @@ -554,14 +549,15 @@ export async function runSimulator(prev: TypecheckedStage): Promise> { +export async function verifySpec(prev: TypecheckedStage): Promise> { const verifying = { ...prev, stage: 'verifying' as stage } const args = verifying.args const verbosityLevel = deriveVerbosity(args) @@ -714,7 +710,7 @@ export async function verifySpec(prev: TypecheckedStage): Promise { const trace: QuintEx[] | undefined = err.traces ? ofItf(err.traces[0]) : undefined diff --git a/quint/src/simulation.ts b/quint/src/simulation.ts index a3ff3723a..211677062 100644 --- a/quint/src/simulation.ts +++ b/quint/src/simulation.ts @@ -12,7 +12,7 @@ import { Either } from '@sweet-monads/either' import { compileFromCode, contextNameLookup, lastTraceName } from './runtime/compile' import { QuintEx } from './ir/quintIr' -import { Computable } from './runtime/runtime' +import { Computable, EvalResult } from './runtime/runtime' import { ExecutionFrame, newTraceRecorder } from './runtime/trace' import { IdGenerator } from './idGenerator' import { Rng } from './rng' @@ -20,7 +20,7 @@ import { SourceLookupPath } from './parsing/sourceResolver' import { QuintError } from './quintError' import { mkErrorMessage } from './cliCommands' import { createFinders, formatError } from './errorReporter' -import { fail } from 'assert' +import assert from 'assert' /** * Various settings that have to be passed to the simulator to run. @@ -35,27 +35,30 @@ export interface SimulatorOptions { verbosity: number } -export type SimulatorResultStatus = 'ok' | 'violation' | 'error' +/** The outcome of a simulation + */ +export type Outcome = + | { status: 'ok' } /** Simulation succeeded */ + | { status: 'violation' } /** Simulation found an invariant violation */ + | { status: 'error'; errors: QuintError[] } /** An error occurred during simulation */ /** * A result returned by the simulator. */ export interface SimulatorResult { - status: SimulatorResultStatus + outcome: Outcome vars: string[] states: QuintEx[] frames: ExecutionFrame[] - errors: QuintError[] seed: bigint } -function errSimulationResult(status: SimulatorResultStatus, errors: QuintError[]): SimulatorResult { +function errSimulationResult(errors: QuintError[]): SimulatorResult { return { - status, + outcome: { status: 'error', errors }, vars: [], states: [], frames: [], - errors: errors, seed: 0n, } } @@ -106,66 +109,73 @@ export function compileAndRun( const recorder = newTraceRecorder(options.verbosity, options.rng) const ctx = compileFromCode(idGen, codeWithExtraDefs, mainName, mainPath, recorder, options.rng.next) - if (ctx.compileErrors.length > 0 || ctx.syntaxErrors.length > 0 || ctx.analysisErrors.length > 0) { - const errors = ctx.syntaxErrors.concat(ctx.analysisErrors).concat(ctx.compileErrors) - return errSimulationResult('error', errors) - } else { - // evaluate q::runResult, which triggers the simulator - const evaluationState = ctx.evaluationState - const res: Either = contextNameLookup(evaluationState.context, 'q::runResult', 'callable') - if (res.isLeft()) { - const errors = [{ code: 'QNT512', message: res.value }] as QuintError[] - return errSimulationResult('error', errors) - } else { - res.value.eval() - } - - const topFrame = recorder.getBestTrace() - let status: SimulatorResultStatus - if (topFrame.result.isJust()) { - const ex = topFrame.result.unwrap().toQuintEx(idGen) - if (ex.kind === 'bool') { - status = ex.value ? 'ok' : 'violation' - } else { - fail('invalid value derived from simulation') - } - } else { - fail('simulation failed to produce any trace') - } + const compilationErrors = ctx.syntaxErrors.concat(ctx.analysisErrors).concat(ctx.compileErrors) + if (compilationErrors.length > 0) { + return errSimulationResult(compilationErrors) + } - let errors = ctx.getRuntimeErrors() - if (errors.length > 0) { - // FIXME(#1052) we shouldn't need to do this if the error id was not some non-sense generated in `compileFromCode` - // The evaluated code source is not included in the context, so we crete a version with it for the error reporter - const code = new Map([...ctx.compilationState.sourceCode.entries(), [mainPath.normalizedPath, codeWithExtraDefs]]) - const finders = createFinders(code) - - errors = errors.map(error => ({ - code: error.code, - // Include the location information (locs) in the error message - this - // is the hacky part, as it should only be included at the CLI level - message: formatError(code, finders, { - // This will create the `locs` attribute and an explanation - ...mkErrorMessage(ctx.compilationState.sourceMap)(error), - // We override the explanation to keep the original one to avoid - // duplication, since `mkErrorMessage` will be called again at the CLI - // level. `locs` won't be touched then because this error doesn't - // include a `reference` field - explanation: error.message, - }), - })) - - // This should be kept after the hack is removed - status = 'error' - } + // evaluate q::runResult, which triggers the simulator + const evaluationState = ctx.evaluationState + const res: Either = contextNameLookup(evaluationState.context, 'q::runResult', 'callable') + if (res.isLeft()) { + const errors = [{ code: 'QNT512', message: res.value }] as QuintError[] + return errSimulationResult(errors) + } else { + res.value.eval() + } + const topFrame: ExecutionFrame = recorder.getBestTrace() + + // Validate required outcome of correct simulation + const maybeEvalResult = topFrame.result + assert(maybeEvalResult.isJust(), 'invalid simulation failed to produce a result') + const quintExResult = maybeEvalResult.value.toQuintEx(idGen) + assert(quintExResult.kind === 'bool', 'invalid simulation produced non-boolean value ') + const simulationSucceeded = quintExResult.value + + const vars = evaluationState.vars.map(v => v.name) + const states = topFrame.args.map(e => e.toQuintEx(idGen)) + const frames = topFrame.subframes + const seed = recorder.getBestTraceSeed() + + const runtimeErrors = ctx.getRuntimeErrors() + if (runtimeErrors.length > 0) { + // FIXME(#1052) we shouldn't need to do this if the error id was not some non-sense generated in `compileFromCode` + // The evaluated code source is not included in the context, so we crete a version with it for the error reporter + const code = new Map([...ctx.compilationState.sourceCode.entries(), [mainPath.normalizedPath, codeWithExtraDefs]]) + const finders = createFinders(code) + + const locatedErrors = runtimeErrors.map(error => ({ + code: error.code, + // Include the location information (locs) in the error message - this + // is the hacky part, as it should only be included at the CLI level + message: formatError(code, finders, { + // This will create the `locs` attribute and an explanation + ...mkErrorMessage(ctx.compilationState.sourceMap)(error), + // We override the explanation to keep the original one to avoid + // duplication, since `mkErrorMessage` will be called again at the CLI + // level. `locs` won't be touched then because this error doesn't + // include a `reference` field + explanation: error.message, + }), + })) + + // This should be kept after the hack is removed return { - status: status, - vars: evaluationState.vars.map(v => v.name), - states: topFrame.args.map(e => e.toQuintEx(idGen)), - frames: topFrame.subframes, - errors: errors, - seed: recorder.getBestTraceSeed(), + vars, + states, + frames, + seed, + outcome: { status: 'error', errors: locatedErrors }, } } + + const status = simulationSucceeded ? 'ok' : 'violation' + return { + vars, + states, + frames, + seed, + outcome: { status }, + } } From 934335d024ad0edab444280ec0e55d1d6be2f935 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 22 Jan 2024 12:25:15 -0500 Subject: [PATCH 206/388] Fix lint --- quint/src/simulation.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/simulation.ts b/quint/src/simulation.ts index 211677062..49ab3374e 100644 --- a/quint/src/simulation.ts +++ b/quint/src/simulation.ts @@ -12,7 +12,7 @@ import { Either } from '@sweet-monads/either' import { compileFromCode, contextNameLookup, lastTraceName } from './runtime/compile' import { QuintEx } from './ir/quintIr' -import { Computable, EvalResult } from './runtime/runtime' +import { Computable } from './runtime/runtime' import { ExecutionFrame, newTraceRecorder } from './runtime/trace' import { IdGenerator } from './idGenerator' import { Rng } from './rng' From 59e97e2da25df6da84ff9d5bb93d483602c0f88b Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 8 Dec 2023 14:28:12 -0500 Subject: [PATCH 207/388] Add IR nodes for type abstraction and application Closes #1296 --- quint/src/ir/quintTypes.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/quint/src/ir/quintTypes.ts b/quint/src/ir/quintTypes.ts index a572d52a7..af87b4408 100644 --- a/quint/src/ir/quintTypes.ts +++ b/quint/src/ir/quintTypes.ts @@ -98,6 +98,19 @@ export function sumType(labelTypePairs: [string, QuintType][], rowVar?: string, return { kind: 'sum', fields: { kind: 'row', fields, other }, id } } +/// Type abstraction: Λτ.Τ +export interface QuintAbsType extends WithOptionalId { + kind: 'abs' + vars: QuintVarType +} + +/// Type application: (Λτ.Τ)υ +export interface QuintAppType extends WithOptionalId { + kind: 'app' + abs: QuintAbsType + arg: QuintType +} + /** * A type in Type System 1.2. */ @@ -114,6 +127,8 @@ export type QuintType = | QuintTupleType | QuintRecordType | QuintSumType + | QuintAbsType + | QuintAppType /** * Row types, used to express tuples and records. From f924eadb787b78df74be8389796222346e45e6e0 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 23 Jan 2024 16:42:01 -0500 Subject: [PATCH 208/388] Add build scripts --- quint/package.json | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/quint/package.json b/quint/package.json index a1e268ae5..dc71566b5 100644 --- a/quint/package.json +++ b/quint/package.json @@ -2,13 +2,7 @@ "name": "@informalsystems/quint", "version": "0.18.1", "description": "Core tool for the Quint specification language", - "keywords": [ - "temporal", - "logic", - "formal", - "specification", - "verification" - ], + "keywords": ["temporal", "logic", "formal", "specification", "verification"], "homepage": "https://github.com/informalsystems/quint", "bugs": "https://github.com/informalsystems/quint/issues", "license": "Apache 2.0", @@ -35,11 +29,7 @@ "bin": { "quint": "dist/src/cli.js" }, - "files": [ - "README.md", - "dist/**/*", - "test/**/*.ts" - ], + "files": ["README.md", "dist/**/*", "test/**/*.ts"], "engines": { "node": ">=18" }, @@ -72,6 +62,8 @@ "compile": "genversion -e src/version.ts && tsc && copyfiles -u 1 ./src/reflection.proto ./src/builtin.qnt ./dist/src/", "prepare": "rm -rf ./dist && npm run compile && chmod +x ./dist/src/cli.js", "test": "mocha --reporter-option maxDiffSize=0 -r ts-node/register test/*.test.ts test/**/*.test.ts", + "test-w": "while inotifywait -r -e close_write ./ ; do npm run test; done", + "test-f": "mocha --reporter-option maxDiffSize=0 -r ts-node/register", "coverage": "nyc npm run test", "integration": "txm cli-tests.md && txm io-cli-tests.md", "apalache-integration": "txm apalache-tests.md", From 1ad2419e4e8fbfd6a58bf7f8b0d82c559b234a88 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 11 Dec 2023 11:45:20 -0500 Subject: [PATCH 209/388] Add parsing for polymorphic type declarations --- quint/src/generated/Quint.g4 | 50 +- quint/src/generated/Quint.interp | 17 +- quint/src/generated/Quint.tokens | 106 +- quint/src/generated/QuintLexer.interp | 18 +- quint/src/generated/QuintLexer.tokens | 106 +- quint/src/generated/QuintLexer.ts | 481 +-- quint/src/generated/QuintListener.ts | 60 +- quint/src/generated/QuintParser.ts | 2676 +++++++++-------- quint/src/generated/QuintVisitor.ts | 39 +- quint/src/graphics.ts | 3 + quint/src/ir/IRTransformer.ts | 35 + quint/src/ir/IRVisitor.ts | 18 + quint/src/ir/IRprinting.ts | 10 + quint/src/ir/quintTypes.ts | 20 +- quint/src/parsing/ToIrListener.ts | 90 +- quint/src/quintError.ts | 2 + quint/src/types/base.ts | 1 + quint/src/types/constraintGenerator.ts | 2 + quint/src/types/substitutions.ts | 7 +- quint/test/ir/IRVisitor.test.ts | 47 + quint/test/ir/IRprinting.test.ts | 6 + .../test/parsing/quintParserFrontend.test.ts | 6 +- quint/test/types/parser.test.ts | 33 +- quint/testFixture/_1025importeeWithError.json | 2 +- 24 files changed, 2228 insertions(+), 1607 deletions(-) diff --git a/quint/src/generated/Quint.g4 b/quint/src/generated/Quint.g4 index 6cb27d16f..95154347f 100644 --- a/quint/src/generated/Quint.g4 +++ b/quint/src/generated/Quint.g4 @@ -52,11 +52,15 @@ operDef : qualifier normalCallName ; typeDef - : 'type' qualId # typeAbstractDef - | 'type' qualId '=' type # typeAliasDef - | 'type' typeName=qualId '=' '|'? typeSumVariant ('|' typeSumVariant)* # typeSumDef + : 'type' qualId # typeAbstractDef + | 'type' typeDefHead '=' type # typeAliasDef + | 'type' typeDefHead '=' sumTypeDefinition # typeSumDef ; +typeDefHead : typeName=qualId ('[' typeVars+=typeVar(',' typeVars+=typeVar)* ']')?; + +sumTypeDefinition : '|'? typeSumVariant ('|' typeSumVariant)* ; + // A single variant case in a sum type definition or match statement. // E.g., `A(t)` or `A`. typeSumVariant : sumLabel=simpleId["variant label"] ('(' type ')')? ; @@ -96,28 +100,32 @@ qualifiedName : qualId; fromSource: STRING; // Types in Type System 1.2 of Apalache -type : type '->' type # typeFun - | type '=>' type # typeOper - | '(' (type (',' type)*)? ','? ')' '=>' type # typeOper - | SET '[' type ']' # typeSet - | LIST '[' type ']' # typeList - | '(' type ',' type (',' type)* ','? ')' # typeTuple - | '{' row '}' # typeRec - | 'int' # typeInt - | 'str' # typeStr - | 'bool' # typeBool - | LOW_ID # typeVar - | qualId # typeConst - | '(' type ')' # typeParen - ; +type + : type '->' type # typeFun + | type '=>' type # typeOper + | '(' (type (',' type)*)? ','? ')' '=>' type # typeOper + // TODO: replace Set with general type application + | SET '[' type ']' # typeSet + // TODO: replace List with general type application + | LIST '[' type ']' # typeList + | '(' type ',' type (',' type)* ','? ')' # typeTuple + | '{' row? '}' # typeRec + | 'int' # typeInt + | 'str' # typeStr + | 'bool' # typeBool + | typeVar # typeVarCase + | qualId # typeConst + | '(' type ')' # typeParen + | typeCtor=type ('[' typeArg+=type (',' typeArg+=type)* ']') # typeApp + ; -row : (rowLabel ':' type ',')* ((rowLabel ':' type) (',' | '|' (rowVar=identifier))?)? +typeVar: LOW_ID; +row : (rowLabel ':' type) (',' rowLabel ':' type)* (',' | '|' (rowVar=identifier))? | '|' (rowVar=identifier) ; rowLabel : simpleId["record"] ; - // A Quint expression. The order matters, it defines the priority. // Wherever possible, we keep the same order of operators as in TLA+. // We are also trying to be consistent with mainstream languages, e.g., @@ -269,8 +277,6 @@ AND : 'and' ; OR : 'or' ; IFF : 'iff' ; IMPLIES : 'implies' ; -SET : 'Set' ; -LIST : 'List' ; MAP : 'Map' ; MATCH : 'match' ; PLUS : '+' ; @@ -287,6 +293,8 @@ EQ : '==' ; ASGN : '=' ; LPAREN : '(' ; RPAREN : ')' ; +SET : 'Set'; +LIST : 'List'; // An identifier starting with lowercase LOW_ID : ([a-z][a-zA-Z0-9_]*|[_][a-zA-Z0-9_]+) ; diff --git a/quint/src/generated/Quint.interp b/quint/src/generated/Quint.interp index 966bb4ab8..781eec423 100644 --- a/quint/src/generated/Quint.interp +++ b/quint/src/generated/Quint.interp @@ -10,6 +10,8 @@ null ',' ';' 'type' +'[' +']' '|' 'nondet' 'val' @@ -25,8 +27,6 @@ null 'export' '->' '=>' -'[' -']' 'int' 'str' 'bool' @@ -46,8 +46,6 @@ null 'or' 'iff' 'implies' -'Set' -'List' 'Map' 'match' '+' @@ -64,6 +62,8 @@ null '=' '(' ')' +'Set' +'List' null null null @@ -119,8 +119,6 @@ AND OR IFF IMPLIES -SET -LIST MAP MATCH PLUS @@ -137,6 +135,8 @@ EQ ASGN LPAREN RPAREN +SET +LIST LOW_ID CAP_ID DOCCOMMENT @@ -151,6 +151,8 @@ documentedDeclaration declaration operDef typeDef +typeDefHead +sumTypeDefinition typeSumVariant nondetOperDef qualifier @@ -162,6 +164,7 @@ name qualifiedName fromSource type +typeVar row rowLabel expr @@ -187,4 +190,4 @@ identifier atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 758, 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, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 3, 2, 6, 2, 82, 10, 2, 13, 2, 14, 2, 83, 3, 2, 3, 2, 3, 3, 7, 3, 89, 10, 3, 12, 3, 14, 3, 92, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 98, 10, 3, 12, 3, 14, 3, 101, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 106, 10, 4, 12, 4, 14, 4, 109, 11, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 133, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 141, 10, 6, 12, 6, 14, 6, 144, 11, 6, 5, 6, 146, 10, 6, 3, 6, 3, 6, 3, 6, 5, 6, 151, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 164, 10, 6, 12, 6, 14, 6, 167, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 173, 10, 6, 3, 6, 3, 6, 5, 6, 177, 10, 6, 3, 6, 5, 6, 180, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 193, 10, 7, 3, 7, 3, 7, 3, 7, 7, 7, 198, 10, 7, 12, 7, 14, 7, 201, 11, 7, 5, 7, 203, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 5, 8, 210, 10, 8, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 216, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 221, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 232, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 240, 10, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 246, 10, 11, 3, 11, 3, 11, 5, 11, 250, 10, 11, 5, 11, 252, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 263, 10, 12, 5, 12, 265, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 7, 13, 278, 10, 13, 12, 13, 14, 13, 281, 11, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 288, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 7, 13, 301, 10, 13, 12, 13, 14, 13, 304, 11, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 311, 10, 13, 5, 13, 313, 10, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 328, 10, 18, 12, 18, 14, 18, 331, 11, 18, 5, 18, 333, 10, 18, 3, 18, 5, 18, 336, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 357, 10, 18, 12, 18, 14, 18, 360, 11, 18, 3, 18, 5, 18, 363, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 5, 18, 380, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 388, 10, 18, 12, 18, 14, 18, 391, 11, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 398, 10, 19, 12, 19, 14, 19, 401, 11, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 410, 10, 19, 5, 19, 412, 10, 19, 3, 19, 3, 19, 5, 19, 416, 10, 19, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 425, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 441, 10, 21, 12, 21, 14, 21, 444, 11, 21, 3, 21, 5, 21, 447, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 456, 10, 21, 12, 21, 14, 21, 459, 11, 21, 3, 21, 5, 21, 462, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 472, 10, 21, 12, 21, 14, 21, 475, 11, 21, 3, 21, 5, 21, 478, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 487, 10, 21, 12, 21, 14, 21, 490, 11, 21, 3, 21, 5, 21, 493, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 501, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 509, 10, 21, 12, 21, 14, 21, 512, 11, 21, 3, 21, 5, 21, 515, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 523, 10, 21, 12, 21, 14, 21, 526, 11, 21, 3, 21, 5, 21, 529, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 537, 10, 21, 12, 21, 14, 21, 540, 11, 21, 5, 21, 542, 10, 21, 3, 21, 5, 21, 545, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 570, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 609, 10, 21, 3, 21, 5, 21, 612, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 619, 10, 21, 12, 21, 14, 21, 622, 11, 21, 3, 22, 3, 22, 3, 22, 3, 22, 5, 22, 628, 10, 22, 3, 22, 3, 22, 3, 22, 7, 22, 633, 10, 22, 12, 22, 14, 22, 636, 11, 22, 3, 22, 3, 22, 3, 23, 3, 23, 5, 23, 642, 10, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 651, 10, 24, 3, 24, 5, 24, 654, 10, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 665, 10, 25, 3, 26, 3, 26, 5, 26, 669, 10, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 7, 27, 679, 10, 27, 12, 27, 14, 27, 682, 11, 27, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 688, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 6, 28, 695, 10, 28, 13, 28, 14, 28, 696, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 5, 29, 706, 10, 29, 3, 30, 3, 30, 3, 31, 3, 31, 5, 31, 712, 10, 31, 3, 32, 3, 32, 3, 32, 7, 32, 717, 10, 32, 12, 32, 14, 32, 720, 11, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 728, 10, 33, 3, 34, 3, 34, 5, 34, 732, 10, 34, 3, 35, 3, 35, 5, 35, 736, 10, 35, 3, 36, 3, 36, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 7, 38, 745, 10, 38, 12, 38, 14, 38, 748, 11, 38, 3, 39, 3, 39, 3, 39, 3, 39, 5, 39, 754, 10, 39, 3, 40, 3, 40, 3, 40, 2, 2, 4, 34, 40, 41, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 68, 2, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 2, 10, 3, 2, 55, 57, 3, 2, 53, 54, 3, 2, 58, 63, 3, 2, 45, 51, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 53, 63, 3, 2, 42, 44, 3, 2, 67, 68, 2, 854, 2, 81, 3, 2, 2, 2, 4, 90, 3, 2, 2, 2, 6, 107, 3, 2, 2, 2, 8, 132, 3, 2, 2, 2, 10, 134, 3, 2, 2, 2, 12, 202, 3, 2, 2, 2, 14, 204, 3, 2, 2, 2, 16, 211, 3, 2, 2, 2, 18, 231, 3, 2, 2, 2, 20, 251, 3, 2, 2, 2, 22, 264, 3, 2, 2, 2, 24, 312, 3, 2, 2, 2, 26, 314, 3, 2, 2, 2, 28, 316, 3, 2, 2, 2, 30, 318, 3, 2, 2, 2, 32, 320, 3, 2, 2, 2, 34, 379, 3, 2, 2, 2, 36, 415, 3, 2, 2, 2, 38, 417, 3, 2, 2, 2, 40, 569, 3, 2, 2, 2, 42, 623, 3, 2, 2, 2, 44, 641, 3, 2, 2, 2, 46, 646, 3, 2, 2, 2, 48, 664, 3, 2, 2, 2, 50, 668, 3, 2, 2, 2, 52, 687, 3, 2, 2, 2, 54, 689, 3, 2, 2, 2, 56, 705, 3, 2, 2, 2, 58, 707, 3, 2, 2, 2, 60, 711, 3, 2, 2, 2, 62, 713, 3, 2, 2, 2, 64, 727, 3, 2, 2, 2, 66, 731, 3, 2, 2, 2, 68, 735, 3, 2, 2, 2, 70, 737, 3, 2, 2, 2, 72, 739, 3, 2, 2, 2, 74, 741, 3, 2, 2, 2, 76, 753, 3, 2, 2, 2, 78, 755, 3, 2, 2, 2, 80, 82, 5, 4, 3, 2, 81, 80, 3, 2, 2, 2, 82, 83, 3, 2, 2, 2, 83, 81, 3, 2, 2, 2, 83, 84, 3, 2, 2, 2, 84, 85, 3, 2, 2, 2, 85, 86, 7, 2, 2, 3, 86, 3, 3, 2, 2, 2, 87, 89, 7, 69, 2, 2, 88, 87, 3, 2, 2, 2, 89, 92, 3, 2, 2, 2, 90, 88, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 93, 3, 2, 2, 2, 92, 90, 3, 2, 2, 2, 93, 94, 7, 3, 2, 2, 94, 95, 5, 74, 38, 2, 95, 99, 7, 4, 2, 2, 96, 98, 5, 6, 4, 2, 97, 96, 3, 2, 2, 2, 98, 101, 3, 2, 2, 2, 99, 97, 3, 2, 2, 2, 99, 100, 3, 2, 2, 2, 100, 102, 3, 2, 2, 2, 101, 99, 3, 2, 2, 2, 102, 103, 7, 5, 2, 2, 103, 5, 3, 2, 2, 2, 104, 106, 7, 69, 2, 2, 105, 104, 3, 2, 2, 2, 106, 109, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 107, 108, 3, 2, 2, 2, 108, 110, 3, 2, 2, 2, 109, 107, 3, 2, 2, 2, 110, 111, 5, 8, 5, 2, 111, 7, 3, 2, 2, 2, 112, 113, 7, 6, 2, 2, 113, 114, 5, 74, 38, 2, 114, 115, 7, 7, 2, 2, 115, 116, 5, 34, 18, 2, 116, 133, 3, 2, 2, 2, 117, 118, 7, 8, 2, 2, 118, 119, 5, 74, 38, 2, 119, 120, 7, 7, 2, 2, 120, 121, 5, 34, 18, 2, 121, 133, 3, 2, 2, 2, 122, 123, 7, 9, 2, 2, 123, 124, 5, 56, 29, 2, 124, 125, 7, 64, 2, 2, 125, 126, 5, 40, 21, 2, 126, 133, 3, 2, 2, 2, 127, 133, 5, 24, 13, 2, 128, 133, 5, 10, 6, 2, 129, 133, 5, 12, 7, 2, 130, 133, 5, 20, 11, 2, 131, 133, 5, 22, 12, 2, 132, 112, 3, 2, 2, 2, 132, 117, 3, 2, 2, 2, 132, 122, 3, 2, 2, 2, 132, 127, 3, 2, 2, 2, 132, 128, 3, 2, 2, 2, 132, 129, 3, 2, 2, 2, 132, 130, 3, 2, 2, 2, 132, 131, 3, 2, 2, 2, 133, 9, 3, 2, 2, 2, 134, 135, 5, 18, 10, 2, 135, 172, 5, 66, 34, 2, 136, 145, 7, 65, 2, 2, 137, 142, 5, 58, 30, 2, 138, 139, 7, 10, 2, 2, 139, 141, 5, 58, 30, 2, 140, 138, 3, 2, 2, 2, 141, 144, 3, 2, 2, 2, 142, 140, 3, 2, 2, 2, 142, 143, 3, 2, 2, 2, 143, 146, 3, 2, 2, 2, 144, 142, 3, 2, 2, 2, 145, 137, 3, 2, 2, 2, 145, 146, 3, 2, 2, 2, 146, 147, 3, 2, 2, 2, 147, 150, 7, 66, 2, 2, 148, 149, 7, 7, 2, 2, 149, 151, 5, 34, 18, 2, 150, 148, 3, 2, 2, 2, 150, 151, 3, 2, 2, 2, 151, 173, 3, 2, 2, 2, 152, 153, 7, 7, 2, 2, 153, 173, 5, 34, 18, 2, 154, 155, 7, 65, 2, 2, 155, 156, 5, 58, 30, 2, 156, 157, 7, 7, 2, 2, 157, 165, 5, 34, 18, 2, 158, 159, 7, 10, 2, 2, 159, 160, 5, 58, 30, 2, 160, 161, 7, 7, 2, 2, 161, 162, 5, 34, 18, 2, 162, 164, 3, 2, 2, 2, 163, 158, 3, 2, 2, 2, 164, 167, 3, 2, 2, 2, 165, 163, 3, 2, 2, 2, 165, 166, 3, 2, 2, 2, 166, 168, 3, 2, 2, 2, 167, 165, 3, 2, 2, 2, 168, 169, 7, 66, 2, 2, 169, 170, 7, 7, 2, 2, 170, 171, 5, 34, 18, 2, 171, 173, 3, 2, 2, 2, 172, 136, 3, 2, 2, 2, 172, 152, 3, 2, 2, 2, 172, 154, 3, 2, 2, 2, 172, 173, 3, 2, 2, 2, 173, 176, 3, 2, 2, 2, 174, 175, 7, 64, 2, 2, 175, 177, 5, 40, 21, 2, 176, 174, 3, 2, 2, 2, 176, 177, 3, 2, 2, 2, 177, 179, 3, 2, 2, 2, 178, 180, 7, 11, 2, 2, 179, 178, 3, 2, 2, 2, 179, 180, 3, 2, 2, 2, 180, 11, 3, 2, 2, 2, 181, 182, 7, 12, 2, 2, 182, 203, 5, 74, 38, 2, 183, 184, 7, 12, 2, 2, 184, 185, 5, 74, 38, 2, 185, 186, 7, 64, 2, 2, 186, 187, 5, 34, 18, 2, 187, 203, 3, 2, 2, 2, 188, 189, 7, 12, 2, 2, 189, 190, 5, 74, 38, 2, 190, 192, 7, 64, 2, 2, 191, 193, 7, 13, 2, 2, 192, 191, 3, 2, 2, 2, 192, 193, 3, 2, 2, 2, 193, 194, 3, 2, 2, 2, 194, 199, 5, 14, 8, 2, 195, 196, 7, 13, 2, 2, 196, 198, 5, 14, 8, 2, 197, 195, 3, 2, 2, 2, 198, 201, 3, 2, 2, 2, 199, 197, 3, 2, 2, 2, 199, 200, 3, 2, 2, 2, 200, 203, 3, 2, 2, 2, 201, 199, 3, 2, 2, 2, 202, 181, 3, 2, 2, 2, 202, 183, 3, 2, 2, 2, 202, 188, 3, 2, 2, 2, 203, 13, 3, 2, 2, 2, 204, 209, 5, 76, 39, 2, 205, 206, 7, 65, 2, 2, 206, 207, 5, 34, 18, 2, 207, 208, 7, 66, 2, 2, 208, 210, 3, 2, 2, 2, 209, 205, 3, 2, 2, 2, 209, 210, 3, 2, 2, 2, 210, 15, 3, 2, 2, 2, 211, 212, 7, 14, 2, 2, 212, 215, 5, 74, 38, 2, 213, 214, 7, 7, 2, 2, 214, 216, 5, 34, 18, 2, 215, 213, 3, 2, 2, 2, 215, 216, 3, 2, 2, 2, 216, 217, 3, 2, 2, 2, 217, 218, 7, 64, 2, 2, 218, 220, 5, 40, 21, 2, 219, 221, 7, 11, 2, 2, 220, 219, 3, 2, 2, 2, 220, 221, 3, 2, 2, 2, 221, 17, 3, 2, 2, 2, 222, 232, 7, 15, 2, 2, 223, 232, 7, 16, 2, 2, 224, 225, 7, 17, 2, 2, 225, 232, 7, 15, 2, 2, 226, 227, 7, 17, 2, 2, 227, 232, 7, 16, 2, 2, 228, 232, 7, 18, 2, 2, 229, 232, 7, 19, 2, 2, 230, 232, 7, 20, 2, 2, 231, 222, 3, 2, 2, 2, 231, 223, 3, 2, 2, 2, 231, 224, 3, 2, 2, 2, 231, 226, 3, 2, 2, 2, 231, 228, 3, 2, 2, 2, 231, 229, 3, 2, 2, 2, 231, 230, 3, 2, 2, 2, 232, 19, 3, 2, 2, 2, 233, 234, 7, 21, 2, 2, 234, 235, 5, 28, 15, 2, 235, 236, 7, 22, 2, 2, 236, 239, 5, 60, 31, 2, 237, 238, 7, 23, 2, 2, 238, 240, 5, 32, 17, 2, 239, 237, 3, 2, 2, 2, 239, 240, 3, 2, 2, 2, 240, 252, 3, 2, 2, 2, 241, 242, 7, 21, 2, 2, 242, 245, 5, 28, 15, 2, 243, 244, 7, 24, 2, 2, 244, 246, 5, 28, 15, 2, 245, 243, 3, 2, 2, 2, 245, 246, 3, 2, 2, 2, 246, 249, 3, 2, 2, 2, 247, 248, 7, 23, 2, 2, 248, 250, 5, 32, 17, 2, 249, 247, 3, 2, 2, 2, 249, 250, 3, 2, 2, 2, 250, 252, 3, 2, 2, 2, 251, 233, 3, 2, 2, 2, 251, 241, 3, 2, 2, 2, 252, 21, 3, 2, 2, 2, 253, 254, 7, 25, 2, 2, 254, 255, 5, 28, 15, 2, 255, 256, 7, 22, 2, 2, 256, 257, 5, 60, 31, 2, 257, 265, 3, 2, 2, 2, 258, 259, 7, 25, 2, 2, 259, 262, 5, 28, 15, 2, 260, 261, 7, 24, 2, 2, 261, 263, 5, 28, 15, 2, 262, 260, 3, 2, 2, 2, 262, 263, 3, 2, 2, 2, 263, 265, 3, 2, 2, 2, 264, 253, 3, 2, 2, 2, 264, 258, 3, 2, 2, 2, 265, 23, 3, 2, 2, 2, 266, 267, 7, 21, 2, 2, 267, 268, 5, 26, 14, 2, 268, 269, 7, 65, 2, 2, 269, 270, 5, 28, 15, 2, 270, 271, 7, 64, 2, 2, 271, 279, 5, 40, 21, 2, 272, 273, 7, 10, 2, 2, 273, 274, 5, 28, 15, 2, 274, 275, 7, 64, 2, 2, 275, 276, 5, 40, 21, 2, 276, 278, 3, 2, 2, 2, 277, 272, 3, 2, 2, 2, 278, 281, 3, 2, 2, 2, 279, 277, 3, 2, 2, 2, 279, 280, 3, 2, 2, 2, 280, 282, 3, 2, 2, 2, 281, 279, 3, 2, 2, 2, 282, 283, 7, 66, 2, 2, 283, 284, 7, 22, 2, 2, 284, 287, 7, 55, 2, 2, 285, 286, 7, 23, 2, 2, 286, 288, 5, 32, 17, 2, 287, 285, 3, 2, 2, 2, 287, 288, 3, 2, 2, 2, 288, 313, 3, 2, 2, 2, 289, 290, 7, 21, 2, 2, 290, 291, 5, 26, 14, 2, 291, 292, 7, 65, 2, 2, 292, 293, 5, 28, 15, 2, 293, 294, 7, 64, 2, 2, 294, 302, 5, 40, 21, 2, 295, 296, 7, 10, 2, 2, 296, 297, 5, 28, 15, 2, 297, 298, 7, 64, 2, 2, 298, 299, 5, 40, 21, 2, 299, 301, 3, 2, 2, 2, 300, 295, 3, 2, 2, 2, 301, 304, 3, 2, 2, 2, 302, 300, 3, 2, 2, 2, 302, 303, 3, 2, 2, 2, 303, 305, 3, 2, 2, 2, 304, 302, 3, 2, 2, 2, 305, 306, 7, 66, 2, 2, 306, 307, 7, 24, 2, 2, 307, 310, 5, 30, 16, 2, 308, 309, 7, 23, 2, 2, 309, 311, 5, 32, 17, 2, 310, 308, 3, 2, 2, 2, 310, 311, 3, 2, 2, 2, 311, 313, 3, 2, 2, 2, 312, 266, 3, 2, 2, 2, 312, 289, 3, 2, 2, 2, 313, 25, 3, 2, 2, 2, 314, 315, 5, 74, 38, 2, 315, 27, 3, 2, 2, 2, 316, 317, 5, 74, 38, 2, 317, 29, 3, 2, 2, 2, 318, 319, 5, 74, 38, 2, 319, 31, 3, 2, 2, 2, 320, 321, 7, 42, 2, 2, 321, 33, 3, 2, 2, 2, 322, 323, 8, 18, 1, 2, 323, 332, 7, 65, 2, 2, 324, 329, 5, 34, 18, 2, 325, 326, 7, 10, 2, 2, 326, 328, 5, 34, 18, 2, 327, 325, 3, 2, 2, 2, 328, 331, 3, 2, 2, 2, 329, 327, 3, 2, 2, 2, 329, 330, 3, 2, 2, 2, 330, 333, 3, 2, 2, 2, 331, 329, 3, 2, 2, 2, 332, 324, 3, 2, 2, 2, 332, 333, 3, 2, 2, 2, 333, 335, 3, 2, 2, 2, 334, 336, 7, 10, 2, 2, 335, 334, 3, 2, 2, 2, 335, 336, 3, 2, 2, 2, 336, 337, 3, 2, 2, 2, 337, 338, 7, 66, 2, 2, 338, 339, 7, 27, 2, 2, 339, 380, 5, 34, 18, 13, 340, 341, 7, 49, 2, 2, 341, 342, 7, 28, 2, 2, 342, 343, 5, 34, 18, 2, 343, 344, 7, 29, 2, 2, 344, 380, 3, 2, 2, 2, 345, 346, 7, 50, 2, 2, 346, 347, 7, 28, 2, 2, 347, 348, 5, 34, 18, 2, 348, 349, 7, 29, 2, 2, 349, 380, 3, 2, 2, 2, 350, 351, 7, 65, 2, 2, 351, 352, 5, 34, 18, 2, 352, 353, 7, 10, 2, 2, 353, 358, 5, 34, 18, 2, 354, 355, 7, 10, 2, 2, 355, 357, 5, 34, 18, 2, 356, 354, 3, 2, 2, 2, 357, 360, 3, 2, 2, 2, 358, 356, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 362, 3, 2, 2, 2, 360, 358, 3, 2, 2, 2, 361, 363, 7, 10, 2, 2, 362, 361, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 364, 3, 2, 2, 2, 364, 365, 7, 66, 2, 2, 365, 380, 3, 2, 2, 2, 366, 367, 7, 4, 2, 2, 367, 368, 5, 36, 19, 2, 368, 369, 7, 5, 2, 2, 369, 380, 3, 2, 2, 2, 370, 380, 7, 30, 2, 2, 371, 380, 7, 31, 2, 2, 372, 380, 7, 32, 2, 2, 373, 380, 7, 67, 2, 2, 374, 380, 5, 74, 38, 2, 375, 376, 7, 65, 2, 2, 376, 377, 5, 34, 18, 2, 377, 378, 7, 66, 2, 2, 378, 380, 3, 2, 2, 2, 379, 322, 3, 2, 2, 2, 379, 340, 3, 2, 2, 2, 379, 345, 3, 2, 2, 2, 379, 350, 3, 2, 2, 2, 379, 366, 3, 2, 2, 2, 379, 370, 3, 2, 2, 2, 379, 371, 3, 2, 2, 2, 379, 372, 3, 2, 2, 2, 379, 373, 3, 2, 2, 2, 379, 374, 3, 2, 2, 2, 379, 375, 3, 2, 2, 2, 380, 389, 3, 2, 2, 2, 381, 382, 12, 15, 2, 2, 382, 383, 7, 26, 2, 2, 383, 388, 5, 34, 18, 15, 384, 385, 12, 14, 2, 2, 385, 386, 7, 27, 2, 2, 386, 388, 5, 34, 18, 14, 387, 381, 3, 2, 2, 2, 387, 384, 3, 2, 2, 2, 388, 391, 3, 2, 2, 2, 389, 387, 3, 2, 2, 2, 389, 390, 3, 2, 2, 2, 390, 35, 3, 2, 2, 2, 391, 389, 3, 2, 2, 2, 392, 393, 5, 38, 20, 2, 393, 394, 7, 7, 2, 2, 394, 395, 5, 34, 18, 2, 395, 396, 7, 10, 2, 2, 396, 398, 3, 2, 2, 2, 397, 392, 3, 2, 2, 2, 398, 401, 3, 2, 2, 2, 399, 397, 3, 2, 2, 2, 399, 400, 3, 2, 2, 2, 400, 411, 3, 2, 2, 2, 401, 399, 3, 2, 2, 2, 402, 403, 5, 38, 20, 2, 403, 404, 7, 7, 2, 2, 404, 405, 5, 34, 18, 2, 405, 409, 3, 2, 2, 2, 406, 410, 7, 10, 2, 2, 407, 408, 7, 13, 2, 2, 408, 410, 5, 78, 40, 2, 409, 406, 3, 2, 2, 2, 409, 407, 3, 2, 2, 2, 409, 410, 3, 2, 2, 2, 410, 412, 3, 2, 2, 2, 411, 402, 3, 2, 2, 2, 411, 412, 3, 2, 2, 2, 412, 416, 3, 2, 2, 2, 413, 414, 7, 13, 2, 2, 414, 416, 5, 78, 40, 2, 415, 399, 3, 2, 2, 2, 415, 413, 3, 2, 2, 2, 416, 37, 3, 2, 2, 2, 417, 418, 5, 76, 39, 2, 418, 39, 3, 2, 2, 2, 419, 420, 8, 21, 1, 2, 420, 570, 5, 50, 26, 2, 421, 422, 5, 66, 34, 2, 422, 424, 7, 65, 2, 2, 423, 425, 5, 62, 32, 2, 424, 423, 3, 2, 2, 2, 424, 425, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 427, 7, 66, 2, 2, 427, 570, 3, 2, 2, 2, 428, 429, 7, 54, 2, 2, 429, 570, 5, 40, 21, 27, 430, 431, 5, 74, 38, 2, 431, 432, 7, 34, 2, 2, 432, 433, 7, 64, 2, 2, 433, 434, 5, 40, 21, 23, 434, 570, 3, 2, 2, 2, 435, 436, 7, 45, 2, 2, 436, 437, 7, 4, 2, 2, 437, 442, 5, 40, 21, 2, 438, 439, 7, 10, 2, 2, 439, 441, 5, 40, 21, 2, 440, 438, 3, 2, 2, 2, 441, 444, 3, 2, 2, 2, 442, 440, 3, 2, 2, 2, 442, 443, 3, 2, 2, 2, 443, 446, 3, 2, 2, 2, 444, 442, 3, 2, 2, 2, 445, 447, 7, 10, 2, 2, 446, 445, 3, 2, 2, 2, 446, 447, 3, 2, 2, 2, 447, 448, 3, 2, 2, 2, 448, 449, 7, 5, 2, 2, 449, 570, 3, 2, 2, 2, 450, 451, 7, 46, 2, 2, 451, 452, 7, 4, 2, 2, 452, 457, 5, 40, 21, 2, 453, 454, 7, 10, 2, 2, 454, 456, 5, 40, 21, 2, 455, 453, 3, 2, 2, 2, 456, 459, 3, 2, 2, 2, 457, 455, 3, 2, 2, 2, 457, 458, 3, 2, 2, 2, 458, 461, 3, 2, 2, 2, 459, 457, 3, 2, 2, 2, 460, 462, 7, 10, 2, 2, 461, 460, 3, 2, 2, 2, 461, 462, 3, 2, 2, 2, 462, 463, 3, 2, 2, 2, 463, 464, 7, 5, 2, 2, 464, 570, 3, 2, 2, 2, 465, 570, 5, 42, 22, 2, 466, 467, 7, 35, 2, 2, 467, 468, 7, 4, 2, 2, 468, 473, 5, 40, 21, 2, 469, 470, 7, 10, 2, 2, 470, 472, 5, 40, 21, 2, 471, 469, 3, 2, 2, 2, 472, 475, 3, 2, 2, 2, 473, 471, 3, 2, 2, 2, 473, 474, 3, 2, 2, 2, 474, 477, 3, 2, 2, 2, 475, 473, 3, 2, 2, 2, 476, 478, 7, 10, 2, 2, 477, 476, 3, 2, 2, 2, 477, 478, 3, 2, 2, 2, 478, 479, 3, 2, 2, 2, 479, 480, 7, 5, 2, 2, 480, 570, 3, 2, 2, 2, 481, 482, 7, 36, 2, 2, 482, 483, 7, 4, 2, 2, 483, 488, 5, 40, 21, 2, 484, 485, 7, 10, 2, 2, 485, 487, 5, 40, 21, 2, 486, 484, 3, 2, 2, 2, 487, 490, 3, 2, 2, 2, 488, 486, 3, 2, 2, 2, 488, 489, 3, 2, 2, 2, 489, 492, 3, 2, 2, 2, 490, 488, 3, 2, 2, 2, 491, 493, 7, 10, 2, 2, 492, 491, 3, 2, 2, 2, 492, 493, 3, 2, 2, 2, 493, 494, 3, 2, 2, 2, 494, 495, 7, 5, 2, 2, 495, 570, 3, 2, 2, 2, 496, 501, 5, 74, 38, 2, 497, 501, 7, 44, 2, 2, 498, 501, 7, 43, 2, 2, 499, 501, 7, 42, 2, 2, 500, 496, 3, 2, 2, 2, 500, 497, 3, 2, 2, 2, 500, 498, 3, 2, 2, 2, 500, 499, 3, 2, 2, 2, 501, 570, 3, 2, 2, 2, 502, 503, 7, 65, 2, 2, 503, 504, 5, 40, 21, 2, 504, 505, 7, 10, 2, 2, 505, 510, 5, 40, 21, 2, 506, 507, 7, 10, 2, 2, 507, 509, 5, 40, 21, 2, 508, 506, 3, 2, 2, 2, 509, 512, 3, 2, 2, 2, 510, 508, 3, 2, 2, 2, 510, 511, 3, 2, 2, 2, 511, 514, 3, 2, 2, 2, 512, 510, 3, 2, 2, 2, 513, 515, 7, 10, 2, 2, 514, 513, 3, 2, 2, 2, 514, 515, 3, 2, 2, 2, 515, 516, 3, 2, 2, 2, 516, 517, 7, 66, 2, 2, 517, 570, 3, 2, 2, 2, 518, 519, 7, 4, 2, 2, 519, 524, 5, 64, 33, 2, 520, 521, 7, 10, 2, 2, 521, 523, 5, 64, 33, 2, 522, 520, 3, 2, 2, 2, 523, 526, 3, 2, 2, 2, 524, 522, 3, 2, 2, 2, 524, 525, 3, 2, 2, 2, 525, 528, 3, 2, 2, 2, 526, 524, 3, 2, 2, 2, 527, 529, 7, 10, 2, 2, 528, 527, 3, 2, 2, 2, 528, 529, 3, 2, 2, 2, 529, 530, 3, 2, 2, 2, 530, 531, 7, 5, 2, 2, 531, 570, 3, 2, 2, 2, 532, 541, 7, 28, 2, 2, 533, 538, 5, 40, 21, 2, 534, 535, 7, 10, 2, 2, 535, 537, 5, 40, 21, 2, 536, 534, 3, 2, 2, 2, 537, 540, 3, 2, 2, 2, 538, 536, 3, 2, 2, 2, 538, 539, 3, 2, 2, 2, 539, 542, 3, 2, 2, 2, 540, 538, 3, 2, 2, 2, 541, 533, 3, 2, 2, 2, 541, 542, 3, 2, 2, 2, 542, 544, 3, 2, 2, 2, 543, 545, 7, 10, 2, 2, 544, 543, 3, 2, 2, 2, 544, 545, 3, 2, 2, 2, 545, 546, 3, 2, 2, 2, 546, 570, 7, 29, 2, 2, 547, 548, 7, 37, 2, 2, 548, 549, 7, 65, 2, 2, 549, 550, 5, 40, 21, 2, 550, 551, 7, 66, 2, 2, 551, 552, 5, 40, 21, 2, 552, 553, 7, 38, 2, 2, 553, 554, 5, 40, 21, 7, 554, 570, 3, 2, 2, 2, 555, 556, 5, 10, 6, 2, 556, 557, 5, 40, 21, 6, 557, 570, 3, 2, 2, 2, 558, 559, 5, 16, 9, 2, 559, 560, 5, 40, 21, 5, 560, 570, 3, 2, 2, 2, 561, 562, 7, 65, 2, 2, 562, 563, 5, 40, 21, 2, 563, 564, 7, 66, 2, 2, 564, 570, 3, 2, 2, 2, 565, 566, 7, 4, 2, 2, 566, 567, 5, 40, 21, 2, 567, 568, 7, 5, 2, 2, 568, 570, 3, 2, 2, 2, 569, 419, 3, 2, 2, 2, 569, 421, 3, 2, 2, 2, 569, 428, 3, 2, 2, 2, 569, 430, 3, 2, 2, 2, 569, 435, 3, 2, 2, 2, 569, 450, 3, 2, 2, 2, 569, 465, 3, 2, 2, 2, 569, 466, 3, 2, 2, 2, 569, 481, 3, 2, 2, 2, 569, 500, 3, 2, 2, 2, 569, 502, 3, 2, 2, 2, 569, 518, 3, 2, 2, 2, 569, 532, 3, 2, 2, 2, 569, 547, 3, 2, 2, 2, 569, 555, 3, 2, 2, 2, 569, 558, 3, 2, 2, 2, 569, 561, 3, 2, 2, 2, 569, 565, 3, 2, 2, 2, 570, 620, 3, 2, 2, 2, 571, 572, 12, 28, 2, 2, 572, 573, 7, 33, 2, 2, 573, 619, 5, 40, 21, 28, 574, 575, 12, 26, 2, 2, 575, 576, 9, 2, 2, 2, 576, 619, 5, 40, 21, 27, 577, 578, 12, 25, 2, 2, 578, 579, 9, 3, 2, 2, 579, 619, 5, 40, 21, 26, 580, 581, 12, 24, 2, 2, 581, 582, 9, 4, 2, 2, 582, 619, 5, 40, 21, 25, 583, 584, 12, 22, 2, 2, 584, 585, 7, 64, 2, 2, 585, 586, 5, 40, 21, 23, 586, 587, 8, 21, 1, 2, 587, 619, 3, 2, 2, 2, 588, 589, 12, 20, 2, 2, 589, 590, 7, 45, 2, 2, 590, 619, 5, 40, 21, 21, 591, 592, 12, 18, 2, 2, 592, 593, 7, 46, 2, 2, 593, 619, 5, 40, 21, 19, 594, 595, 12, 17, 2, 2, 595, 596, 7, 47, 2, 2, 596, 619, 5, 40, 21, 18, 597, 598, 12, 16, 2, 2, 598, 599, 7, 48, 2, 2, 599, 619, 5, 40, 21, 17, 600, 601, 12, 10, 2, 2, 601, 602, 7, 26, 2, 2, 602, 619, 5, 40, 21, 11, 603, 604, 12, 32, 2, 2, 604, 605, 7, 22, 2, 2, 605, 611, 5, 68, 35, 2, 606, 608, 7, 65, 2, 2, 607, 609, 5, 62, 32, 2, 608, 607, 3, 2, 2, 2, 608, 609, 3, 2, 2, 2, 609, 610, 3, 2, 2, 2, 610, 612, 7, 66, 2, 2, 611, 606, 3, 2, 2, 2, 611, 612, 3, 2, 2, 2, 612, 619, 3, 2, 2, 2, 613, 614, 12, 29, 2, 2, 614, 615, 7, 28, 2, 2, 615, 616, 5, 40, 21, 2, 616, 617, 7, 29, 2, 2, 617, 619, 3, 2, 2, 2, 618, 571, 3, 2, 2, 2, 618, 574, 3, 2, 2, 2, 618, 577, 3, 2, 2, 2, 618, 580, 3, 2, 2, 2, 618, 583, 3, 2, 2, 2, 618, 588, 3, 2, 2, 2, 618, 591, 3, 2, 2, 2, 618, 594, 3, 2, 2, 2, 618, 597, 3, 2, 2, 2, 618, 600, 3, 2, 2, 2, 618, 603, 3, 2, 2, 2, 618, 613, 3, 2, 2, 2, 619, 622, 3, 2, 2, 2, 620, 618, 3, 2, 2, 2, 620, 621, 3, 2, 2, 2, 621, 41, 3, 2, 2, 2, 622, 620, 3, 2, 2, 2, 623, 624, 7, 52, 2, 2, 624, 625, 5, 40, 21, 2, 625, 627, 7, 4, 2, 2, 626, 628, 7, 13, 2, 2, 627, 626, 3, 2, 2, 2, 627, 628, 3, 2, 2, 2, 628, 629, 3, 2, 2, 2, 629, 634, 5, 44, 23, 2, 630, 631, 7, 13, 2, 2, 631, 633, 5, 44, 23, 2, 632, 630, 3, 2, 2, 2, 633, 636, 3, 2, 2, 2, 634, 632, 3, 2, 2, 2, 634, 635, 3, 2, 2, 2, 635, 637, 3, 2, 2, 2, 636, 634, 3, 2, 2, 2, 637, 638, 7, 5, 2, 2, 638, 43, 3, 2, 2, 2, 639, 642, 5, 46, 24, 2, 640, 642, 7, 39, 2, 2, 641, 639, 3, 2, 2, 2, 641, 640, 3, 2, 2, 2, 642, 643, 3, 2, 2, 2, 643, 644, 7, 27, 2, 2, 644, 645, 5, 40, 21, 2, 645, 45, 3, 2, 2, 2, 646, 653, 5, 76, 39, 2, 647, 650, 7, 65, 2, 2, 648, 651, 5, 76, 39, 2, 649, 651, 7, 39, 2, 2, 650, 648, 3, 2, 2, 2, 650, 649, 3, 2, 2, 2, 651, 652, 3, 2, 2, 2, 652, 654, 7, 66, 2, 2, 653, 647, 3, 2, 2, 2, 653, 654, 3, 2, 2, 2, 654, 47, 3, 2, 2, 2, 655, 656, 5, 8, 5, 2, 656, 657, 7, 2, 2, 3, 657, 665, 3, 2, 2, 2, 658, 659, 5, 40, 21, 2, 659, 660, 7, 2, 2, 3, 660, 665, 3, 2, 2, 2, 661, 662, 7, 69, 2, 2, 662, 665, 7, 2, 2, 3, 663, 665, 7, 2, 2, 3, 664, 655, 3, 2, 2, 2, 664, 658, 3, 2, 2, 2, 664, 661, 3, 2, 2, 2, 664, 663, 3, 2, 2, 2, 665, 49, 3, 2, 2, 2, 666, 669, 5, 52, 27, 2, 667, 669, 5, 54, 28, 2, 668, 666, 3, 2, 2, 2, 668, 667, 3, 2, 2, 2, 669, 51, 3, 2, 2, 2, 670, 671, 5, 58, 30, 2, 671, 672, 7, 27, 2, 2, 672, 673, 5, 40, 21, 2, 673, 688, 3, 2, 2, 2, 674, 675, 7, 65, 2, 2, 675, 680, 5, 58, 30, 2, 676, 677, 7, 10, 2, 2, 677, 679, 5, 58, 30, 2, 678, 676, 3, 2, 2, 2, 679, 682, 3, 2, 2, 2, 680, 678, 3, 2, 2, 2, 680, 681, 3, 2, 2, 2, 681, 683, 3, 2, 2, 2, 682, 680, 3, 2, 2, 2, 683, 684, 7, 66, 2, 2, 684, 685, 7, 27, 2, 2, 685, 686, 5, 40, 21, 2, 686, 688, 3, 2, 2, 2, 687, 670, 3, 2, 2, 2, 687, 674, 3, 2, 2, 2, 688, 53, 3, 2, 2, 2, 689, 690, 7, 65, 2, 2, 690, 691, 7, 65, 2, 2, 691, 694, 5, 58, 30, 2, 692, 693, 7, 10, 2, 2, 693, 695, 5, 58, 30, 2, 694, 692, 3, 2, 2, 2, 695, 696, 3, 2, 2, 2, 696, 694, 3, 2, 2, 2, 696, 697, 3, 2, 2, 2, 697, 698, 3, 2, 2, 2, 698, 699, 7, 66, 2, 2, 699, 700, 7, 66, 2, 2, 700, 701, 7, 27, 2, 2, 701, 702, 5, 40, 21, 2, 702, 55, 3, 2, 2, 2, 703, 706, 7, 39, 2, 2, 704, 706, 5, 74, 38, 2, 705, 703, 3, 2, 2, 2, 705, 704, 3, 2, 2, 2, 706, 57, 3, 2, 2, 2, 707, 708, 5, 56, 29, 2, 708, 59, 3, 2, 2, 2, 709, 712, 7, 55, 2, 2, 710, 712, 5, 74, 38, 2, 711, 709, 3, 2, 2, 2, 711, 710, 3, 2, 2, 2, 712, 61, 3, 2, 2, 2, 713, 718, 5, 40, 21, 2, 714, 715, 7, 10, 2, 2, 715, 717, 5, 40, 21, 2, 716, 714, 3, 2, 2, 2, 717, 720, 3, 2, 2, 2, 718, 716, 3, 2, 2, 2, 718, 719, 3, 2, 2, 2, 719, 63, 3, 2, 2, 2, 720, 718, 3, 2, 2, 2, 721, 722, 5, 76, 39, 2, 722, 723, 7, 7, 2, 2, 723, 724, 5, 40, 21, 2, 724, 728, 3, 2, 2, 2, 725, 726, 7, 40, 2, 2, 726, 728, 5, 40, 21, 2, 727, 721, 3, 2, 2, 2, 727, 725, 3, 2, 2, 2, 728, 65, 3, 2, 2, 2, 729, 732, 5, 74, 38, 2, 730, 732, 9, 5, 2, 2, 731, 729, 3, 2, 2, 2, 731, 730, 3, 2, 2, 2, 732, 67, 3, 2, 2, 2, 733, 736, 5, 74, 38, 2, 734, 736, 9, 6, 2, 2, 735, 733, 3, 2, 2, 2, 735, 734, 3, 2, 2, 2, 736, 69, 3, 2, 2, 2, 737, 738, 9, 7, 2, 2, 738, 71, 3, 2, 2, 2, 739, 740, 9, 8, 2, 2, 740, 73, 3, 2, 2, 2, 741, 746, 5, 78, 40, 2, 742, 743, 7, 41, 2, 2, 743, 745, 5, 78, 40, 2, 744, 742, 3, 2, 2, 2, 745, 748, 3, 2, 2, 2, 746, 744, 3, 2, 2, 2, 746, 747, 3, 2, 2, 2, 747, 75, 3, 2, 2, 2, 748, 746, 3, 2, 2, 2, 749, 754, 5, 78, 40, 2, 750, 751, 5, 74, 38, 2, 751, 752, 8, 39, 1, 2, 752, 754, 3, 2, 2, 2, 753, 749, 3, 2, 2, 2, 753, 750, 3, 2, 2, 2, 754, 77, 3, 2, 2, 2, 755, 756, 9, 9, 2, 2, 756, 79, 3, 2, 2, 2, 84, 83, 90, 99, 107, 132, 142, 145, 150, 165, 172, 176, 179, 192, 199, 202, 209, 215, 220, 231, 239, 245, 249, 251, 262, 264, 279, 287, 302, 310, 312, 329, 332, 335, 358, 362, 379, 387, 389, 399, 409, 411, 415, 424, 442, 446, 457, 461, 473, 477, 488, 492, 500, 510, 514, 524, 528, 538, 541, 544, 569, 608, 611, 618, 620, 627, 634, 641, 650, 653, 664, 668, 680, 687, 696, 705, 711, 718, 727, 731, 735, 746, 753] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 793, 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, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 3, 2, 6, 2, 88, 10, 2, 13, 2, 14, 2, 89, 3, 2, 3, 2, 3, 3, 7, 3, 95, 10, 3, 12, 3, 14, 3, 98, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 104, 10, 3, 12, 3, 14, 3, 107, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 112, 10, 4, 12, 4, 14, 4, 115, 11, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 139, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 147, 10, 6, 12, 6, 14, 6, 150, 11, 6, 5, 6, 152, 10, 6, 3, 6, 3, 6, 3, 6, 5, 6, 157, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 170, 10, 6, 12, 6, 14, 6, 173, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 179, 10, 6, 3, 6, 3, 6, 5, 6, 183, 10, 6, 3, 6, 5, 6, 186, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 200, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 207, 10, 8, 12, 8, 14, 8, 210, 11, 8, 3, 8, 3, 8, 5, 8, 214, 10, 8, 3, 9, 5, 9, 217, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 222, 10, 9, 12, 9, 14, 9, 225, 11, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 232, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 238, 10, 11, 3, 11, 3, 11, 3, 11, 5, 11, 243, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 254, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 262, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 268, 10, 13, 3, 13, 3, 13, 5, 13, 272, 10, 13, 5, 13, 274, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 285, 10, 14, 5, 14, 287, 10, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 300, 10, 15, 12, 15, 14, 15, 303, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 310, 10, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 323, 10, 15, 12, 15, 14, 15, 326, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 333, 10, 15, 5, 15, 335, 10, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 350, 10, 20, 12, 20, 14, 20, 353, 11, 20, 5, 20, 355, 10, 20, 3, 20, 5, 20, 358, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 379, 10, 20, 12, 20, 14, 20, 382, 11, 20, 3, 20, 5, 20, 385, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 391, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 403, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 416, 10, 20, 12, 20, 14, 20, 419, 11, 20, 3, 20, 3, 20, 7, 20, 423, 10, 20, 12, 20, 14, 20, 426, 11, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 439, 10, 22, 12, 22, 14, 22, 442, 11, 22, 3, 22, 3, 22, 3, 22, 5, 22, 447, 10, 22, 3, 22, 3, 22, 5, 22, 451, 10, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 460, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 476, 10, 24, 12, 24, 14, 24, 479, 11, 24, 3, 24, 5, 24, 482, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 491, 10, 24, 12, 24, 14, 24, 494, 11, 24, 3, 24, 5, 24, 497, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 507, 10, 24, 12, 24, 14, 24, 510, 11, 24, 3, 24, 5, 24, 513, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 522, 10, 24, 12, 24, 14, 24, 525, 11, 24, 3, 24, 5, 24, 528, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 536, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 544, 10, 24, 12, 24, 14, 24, 547, 11, 24, 3, 24, 5, 24, 550, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 558, 10, 24, 12, 24, 14, 24, 561, 11, 24, 3, 24, 5, 24, 564, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 572, 10, 24, 12, 24, 14, 24, 575, 11, 24, 5, 24, 577, 10, 24, 3, 24, 5, 24, 580, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 605, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 644, 10, 24, 3, 24, 5, 24, 647, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 654, 10, 24, 12, 24, 14, 24, 657, 11, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 663, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 668, 10, 25, 12, 25, 14, 25, 671, 11, 25, 3, 25, 3, 25, 3, 26, 3, 26, 5, 26, 677, 10, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 686, 10, 27, 3, 27, 5, 27, 689, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 700, 10, 28, 3, 29, 3, 29, 5, 29, 704, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 714, 10, 30, 12, 30, 14, 30, 717, 11, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 723, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 6, 31, 730, 10, 31, 13, 31, 14, 31, 731, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 5, 32, 741, 10, 32, 3, 33, 3, 33, 3, 34, 3, 34, 5, 34, 747, 10, 34, 3, 35, 3, 35, 3, 35, 7, 35, 752, 10, 35, 12, 35, 14, 35, 755, 11, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 5, 36, 763, 10, 36, 3, 37, 3, 37, 5, 37, 767, 10, 37, 3, 38, 3, 38, 5, 38, 771, 10, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 7, 41, 780, 10, 41, 12, 41, 14, 41, 783, 11, 41, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 789, 10, 42, 3, 43, 3, 43, 3, 43, 2, 2, 4, 38, 46, 44, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 68, 2, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 2, 10, 3, 2, 53, 55, 3, 2, 51, 52, 3, 2, 56, 61, 4, 2, 45, 49, 65, 66, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 51, 61, 3, 2, 42, 44, 3, 2, 67, 68, 2, 890, 2, 87, 3, 2, 2, 2, 4, 96, 3, 2, 2, 2, 6, 113, 3, 2, 2, 2, 8, 138, 3, 2, 2, 2, 10, 140, 3, 2, 2, 2, 12, 199, 3, 2, 2, 2, 14, 201, 3, 2, 2, 2, 16, 216, 3, 2, 2, 2, 18, 226, 3, 2, 2, 2, 20, 233, 3, 2, 2, 2, 22, 253, 3, 2, 2, 2, 24, 273, 3, 2, 2, 2, 26, 286, 3, 2, 2, 2, 28, 334, 3, 2, 2, 2, 30, 336, 3, 2, 2, 2, 32, 338, 3, 2, 2, 2, 34, 340, 3, 2, 2, 2, 36, 342, 3, 2, 2, 2, 38, 402, 3, 2, 2, 2, 40, 427, 3, 2, 2, 2, 42, 450, 3, 2, 2, 2, 44, 452, 3, 2, 2, 2, 46, 604, 3, 2, 2, 2, 48, 658, 3, 2, 2, 2, 50, 676, 3, 2, 2, 2, 52, 681, 3, 2, 2, 2, 54, 699, 3, 2, 2, 2, 56, 703, 3, 2, 2, 2, 58, 722, 3, 2, 2, 2, 60, 724, 3, 2, 2, 2, 62, 740, 3, 2, 2, 2, 64, 742, 3, 2, 2, 2, 66, 746, 3, 2, 2, 2, 68, 748, 3, 2, 2, 2, 70, 762, 3, 2, 2, 2, 72, 766, 3, 2, 2, 2, 74, 770, 3, 2, 2, 2, 76, 772, 3, 2, 2, 2, 78, 774, 3, 2, 2, 2, 80, 776, 3, 2, 2, 2, 82, 788, 3, 2, 2, 2, 84, 790, 3, 2, 2, 2, 86, 88, 5, 4, 3, 2, 87, 86, 3, 2, 2, 2, 88, 89, 3, 2, 2, 2, 89, 87, 3, 2, 2, 2, 89, 90, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 92, 7, 2, 2, 3, 92, 3, 3, 2, 2, 2, 93, 95, 7, 69, 2, 2, 94, 93, 3, 2, 2, 2, 95, 98, 3, 2, 2, 2, 96, 94, 3, 2, 2, 2, 96, 97, 3, 2, 2, 2, 97, 99, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 99, 100, 7, 3, 2, 2, 100, 101, 5, 80, 41, 2, 101, 105, 7, 4, 2, 2, 102, 104, 5, 6, 4, 2, 103, 102, 3, 2, 2, 2, 104, 107, 3, 2, 2, 2, 105, 103, 3, 2, 2, 2, 105, 106, 3, 2, 2, 2, 106, 108, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 108, 109, 7, 5, 2, 2, 109, 5, 3, 2, 2, 2, 110, 112, 7, 69, 2, 2, 111, 110, 3, 2, 2, 2, 112, 115, 3, 2, 2, 2, 113, 111, 3, 2, 2, 2, 113, 114, 3, 2, 2, 2, 114, 116, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 116, 117, 5, 8, 5, 2, 117, 7, 3, 2, 2, 2, 118, 119, 7, 6, 2, 2, 119, 120, 5, 80, 41, 2, 120, 121, 7, 7, 2, 2, 121, 122, 5, 38, 20, 2, 122, 139, 3, 2, 2, 2, 123, 124, 7, 8, 2, 2, 124, 125, 5, 80, 41, 2, 125, 126, 7, 7, 2, 2, 126, 127, 5, 38, 20, 2, 127, 139, 3, 2, 2, 2, 128, 129, 7, 9, 2, 2, 129, 130, 5, 62, 32, 2, 130, 131, 7, 62, 2, 2, 131, 132, 5, 46, 24, 2, 132, 139, 3, 2, 2, 2, 133, 139, 5, 28, 15, 2, 134, 139, 5, 10, 6, 2, 135, 139, 5, 12, 7, 2, 136, 139, 5, 24, 13, 2, 137, 139, 5, 26, 14, 2, 138, 118, 3, 2, 2, 2, 138, 123, 3, 2, 2, 2, 138, 128, 3, 2, 2, 2, 138, 133, 3, 2, 2, 2, 138, 134, 3, 2, 2, 2, 138, 135, 3, 2, 2, 2, 138, 136, 3, 2, 2, 2, 138, 137, 3, 2, 2, 2, 139, 9, 3, 2, 2, 2, 140, 141, 5, 22, 12, 2, 141, 178, 5, 72, 37, 2, 142, 151, 7, 63, 2, 2, 143, 148, 5, 64, 33, 2, 144, 145, 7, 10, 2, 2, 145, 147, 5, 64, 33, 2, 146, 144, 3, 2, 2, 2, 147, 150, 3, 2, 2, 2, 148, 146, 3, 2, 2, 2, 148, 149, 3, 2, 2, 2, 149, 152, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 151, 143, 3, 2, 2, 2, 151, 152, 3, 2, 2, 2, 152, 153, 3, 2, 2, 2, 153, 156, 7, 64, 2, 2, 154, 155, 7, 7, 2, 2, 155, 157, 5, 38, 20, 2, 156, 154, 3, 2, 2, 2, 156, 157, 3, 2, 2, 2, 157, 179, 3, 2, 2, 2, 158, 159, 7, 7, 2, 2, 159, 179, 5, 38, 20, 2, 160, 161, 7, 63, 2, 2, 161, 162, 5, 64, 33, 2, 162, 163, 7, 7, 2, 2, 163, 171, 5, 38, 20, 2, 164, 165, 7, 10, 2, 2, 165, 166, 5, 64, 33, 2, 166, 167, 7, 7, 2, 2, 167, 168, 5, 38, 20, 2, 168, 170, 3, 2, 2, 2, 169, 164, 3, 2, 2, 2, 170, 173, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 171, 172, 3, 2, 2, 2, 172, 174, 3, 2, 2, 2, 173, 171, 3, 2, 2, 2, 174, 175, 7, 64, 2, 2, 175, 176, 7, 7, 2, 2, 176, 177, 5, 38, 20, 2, 177, 179, 3, 2, 2, 2, 178, 142, 3, 2, 2, 2, 178, 158, 3, 2, 2, 2, 178, 160, 3, 2, 2, 2, 178, 179, 3, 2, 2, 2, 179, 182, 3, 2, 2, 2, 180, 181, 7, 62, 2, 2, 181, 183, 5, 46, 24, 2, 182, 180, 3, 2, 2, 2, 182, 183, 3, 2, 2, 2, 183, 185, 3, 2, 2, 2, 184, 186, 7, 11, 2, 2, 185, 184, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 11, 3, 2, 2, 2, 187, 188, 7, 12, 2, 2, 188, 200, 5, 80, 41, 2, 189, 190, 7, 12, 2, 2, 190, 191, 5, 14, 8, 2, 191, 192, 7, 62, 2, 2, 192, 193, 5, 38, 20, 2, 193, 200, 3, 2, 2, 2, 194, 195, 7, 12, 2, 2, 195, 196, 5, 14, 8, 2, 196, 197, 7, 62, 2, 2, 197, 198, 5, 16, 9, 2, 198, 200, 3, 2, 2, 2, 199, 187, 3, 2, 2, 2, 199, 189, 3, 2, 2, 2, 199, 194, 3, 2, 2, 2, 200, 13, 3, 2, 2, 2, 201, 213, 5, 80, 41, 2, 202, 203, 7, 13, 2, 2, 203, 208, 5, 40, 21, 2, 204, 205, 7, 10, 2, 2, 205, 207, 5, 40, 21, 2, 206, 204, 3, 2, 2, 2, 207, 210, 3, 2, 2, 2, 208, 206, 3, 2, 2, 2, 208, 209, 3, 2, 2, 2, 209, 211, 3, 2, 2, 2, 210, 208, 3, 2, 2, 2, 211, 212, 7, 14, 2, 2, 212, 214, 3, 2, 2, 2, 213, 202, 3, 2, 2, 2, 213, 214, 3, 2, 2, 2, 214, 15, 3, 2, 2, 2, 215, 217, 7, 15, 2, 2, 216, 215, 3, 2, 2, 2, 216, 217, 3, 2, 2, 2, 217, 218, 3, 2, 2, 2, 218, 223, 5, 18, 10, 2, 219, 220, 7, 15, 2, 2, 220, 222, 5, 18, 10, 2, 221, 219, 3, 2, 2, 2, 222, 225, 3, 2, 2, 2, 223, 221, 3, 2, 2, 2, 223, 224, 3, 2, 2, 2, 224, 17, 3, 2, 2, 2, 225, 223, 3, 2, 2, 2, 226, 231, 5, 82, 42, 2, 227, 228, 7, 63, 2, 2, 228, 229, 5, 38, 20, 2, 229, 230, 7, 64, 2, 2, 230, 232, 3, 2, 2, 2, 231, 227, 3, 2, 2, 2, 231, 232, 3, 2, 2, 2, 232, 19, 3, 2, 2, 2, 233, 234, 7, 16, 2, 2, 234, 237, 5, 80, 41, 2, 235, 236, 7, 7, 2, 2, 236, 238, 5, 38, 20, 2, 237, 235, 3, 2, 2, 2, 237, 238, 3, 2, 2, 2, 238, 239, 3, 2, 2, 2, 239, 240, 7, 62, 2, 2, 240, 242, 5, 46, 24, 2, 241, 243, 7, 11, 2, 2, 242, 241, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 21, 3, 2, 2, 2, 244, 254, 7, 17, 2, 2, 245, 254, 7, 18, 2, 2, 246, 247, 7, 19, 2, 2, 247, 254, 7, 17, 2, 2, 248, 249, 7, 19, 2, 2, 249, 254, 7, 18, 2, 2, 250, 254, 7, 20, 2, 2, 251, 254, 7, 21, 2, 2, 252, 254, 7, 22, 2, 2, 253, 244, 3, 2, 2, 2, 253, 245, 3, 2, 2, 2, 253, 246, 3, 2, 2, 2, 253, 248, 3, 2, 2, 2, 253, 250, 3, 2, 2, 2, 253, 251, 3, 2, 2, 2, 253, 252, 3, 2, 2, 2, 254, 23, 3, 2, 2, 2, 255, 256, 7, 23, 2, 2, 256, 257, 5, 32, 17, 2, 257, 258, 7, 24, 2, 2, 258, 261, 5, 66, 34, 2, 259, 260, 7, 25, 2, 2, 260, 262, 5, 36, 19, 2, 261, 259, 3, 2, 2, 2, 261, 262, 3, 2, 2, 2, 262, 274, 3, 2, 2, 2, 263, 264, 7, 23, 2, 2, 264, 267, 5, 32, 17, 2, 265, 266, 7, 26, 2, 2, 266, 268, 5, 32, 17, 2, 267, 265, 3, 2, 2, 2, 267, 268, 3, 2, 2, 2, 268, 271, 3, 2, 2, 2, 269, 270, 7, 25, 2, 2, 270, 272, 5, 36, 19, 2, 271, 269, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 274, 3, 2, 2, 2, 273, 255, 3, 2, 2, 2, 273, 263, 3, 2, 2, 2, 274, 25, 3, 2, 2, 2, 275, 276, 7, 27, 2, 2, 276, 277, 5, 32, 17, 2, 277, 278, 7, 24, 2, 2, 278, 279, 5, 66, 34, 2, 279, 287, 3, 2, 2, 2, 280, 281, 7, 27, 2, 2, 281, 284, 5, 32, 17, 2, 282, 283, 7, 26, 2, 2, 283, 285, 5, 32, 17, 2, 284, 282, 3, 2, 2, 2, 284, 285, 3, 2, 2, 2, 285, 287, 3, 2, 2, 2, 286, 275, 3, 2, 2, 2, 286, 280, 3, 2, 2, 2, 287, 27, 3, 2, 2, 2, 288, 289, 7, 23, 2, 2, 289, 290, 5, 30, 16, 2, 290, 291, 7, 63, 2, 2, 291, 292, 5, 32, 17, 2, 292, 293, 7, 62, 2, 2, 293, 301, 5, 46, 24, 2, 294, 295, 7, 10, 2, 2, 295, 296, 5, 32, 17, 2, 296, 297, 7, 62, 2, 2, 297, 298, 5, 46, 24, 2, 298, 300, 3, 2, 2, 2, 299, 294, 3, 2, 2, 2, 300, 303, 3, 2, 2, 2, 301, 299, 3, 2, 2, 2, 301, 302, 3, 2, 2, 2, 302, 304, 3, 2, 2, 2, 303, 301, 3, 2, 2, 2, 304, 305, 7, 64, 2, 2, 305, 306, 7, 24, 2, 2, 306, 309, 7, 53, 2, 2, 307, 308, 7, 25, 2, 2, 308, 310, 5, 36, 19, 2, 309, 307, 3, 2, 2, 2, 309, 310, 3, 2, 2, 2, 310, 335, 3, 2, 2, 2, 311, 312, 7, 23, 2, 2, 312, 313, 5, 30, 16, 2, 313, 314, 7, 63, 2, 2, 314, 315, 5, 32, 17, 2, 315, 316, 7, 62, 2, 2, 316, 324, 5, 46, 24, 2, 317, 318, 7, 10, 2, 2, 318, 319, 5, 32, 17, 2, 319, 320, 7, 62, 2, 2, 320, 321, 5, 46, 24, 2, 321, 323, 3, 2, 2, 2, 322, 317, 3, 2, 2, 2, 323, 326, 3, 2, 2, 2, 324, 322, 3, 2, 2, 2, 324, 325, 3, 2, 2, 2, 325, 327, 3, 2, 2, 2, 326, 324, 3, 2, 2, 2, 327, 328, 7, 64, 2, 2, 328, 329, 7, 26, 2, 2, 329, 332, 5, 34, 18, 2, 330, 331, 7, 25, 2, 2, 331, 333, 5, 36, 19, 2, 332, 330, 3, 2, 2, 2, 332, 333, 3, 2, 2, 2, 333, 335, 3, 2, 2, 2, 334, 288, 3, 2, 2, 2, 334, 311, 3, 2, 2, 2, 335, 29, 3, 2, 2, 2, 336, 337, 5, 80, 41, 2, 337, 31, 3, 2, 2, 2, 338, 339, 5, 80, 41, 2, 339, 33, 3, 2, 2, 2, 340, 341, 5, 80, 41, 2, 341, 35, 3, 2, 2, 2, 342, 343, 7, 42, 2, 2, 343, 37, 3, 2, 2, 2, 344, 345, 8, 20, 1, 2, 345, 354, 7, 63, 2, 2, 346, 351, 5, 38, 20, 2, 347, 348, 7, 10, 2, 2, 348, 350, 5, 38, 20, 2, 349, 347, 3, 2, 2, 2, 350, 353, 3, 2, 2, 2, 351, 349, 3, 2, 2, 2, 351, 352, 3, 2, 2, 2, 352, 355, 3, 2, 2, 2, 353, 351, 3, 2, 2, 2, 354, 346, 3, 2, 2, 2, 354, 355, 3, 2, 2, 2, 355, 357, 3, 2, 2, 2, 356, 358, 7, 10, 2, 2, 357, 356, 3, 2, 2, 2, 357, 358, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 360, 7, 64, 2, 2, 360, 361, 7, 29, 2, 2, 361, 403, 5, 38, 20, 14, 362, 363, 7, 65, 2, 2, 363, 364, 7, 13, 2, 2, 364, 365, 5, 38, 20, 2, 365, 366, 7, 14, 2, 2, 366, 403, 3, 2, 2, 2, 367, 368, 7, 66, 2, 2, 368, 369, 7, 13, 2, 2, 369, 370, 5, 38, 20, 2, 370, 371, 7, 14, 2, 2, 371, 403, 3, 2, 2, 2, 372, 373, 7, 63, 2, 2, 373, 374, 5, 38, 20, 2, 374, 375, 7, 10, 2, 2, 375, 380, 5, 38, 20, 2, 376, 377, 7, 10, 2, 2, 377, 379, 5, 38, 20, 2, 378, 376, 3, 2, 2, 2, 379, 382, 3, 2, 2, 2, 380, 378, 3, 2, 2, 2, 380, 381, 3, 2, 2, 2, 381, 384, 3, 2, 2, 2, 382, 380, 3, 2, 2, 2, 383, 385, 7, 10, 2, 2, 384, 383, 3, 2, 2, 2, 384, 385, 3, 2, 2, 2, 385, 386, 3, 2, 2, 2, 386, 387, 7, 64, 2, 2, 387, 403, 3, 2, 2, 2, 388, 390, 7, 4, 2, 2, 389, 391, 5, 42, 22, 2, 390, 389, 3, 2, 2, 2, 390, 391, 3, 2, 2, 2, 391, 392, 3, 2, 2, 2, 392, 403, 7, 5, 2, 2, 393, 403, 7, 30, 2, 2, 394, 403, 7, 31, 2, 2, 395, 403, 7, 32, 2, 2, 396, 403, 5, 40, 21, 2, 397, 403, 5, 80, 41, 2, 398, 399, 7, 63, 2, 2, 399, 400, 5, 38, 20, 2, 400, 401, 7, 64, 2, 2, 401, 403, 3, 2, 2, 2, 402, 344, 3, 2, 2, 2, 402, 362, 3, 2, 2, 2, 402, 367, 3, 2, 2, 2, 402, 372, 3, 2, 2, 2, 402, 388, 3, 2, 2, 2, 402, 393, 3, 2, 2, 2, 402, 394, 3, 2, 2, 2, 402, 395, 3, 2, 2, 2, 402, 396, 3, 2, 2, 2, 402, 397, 3, 2, 2, 2, 402, 398, 3, 2, 2, 2, 403, 424, 3, 2, 2, 2, 404, 405, 12, 16, 2, 2, 405, 406, 7, 28, 2, 2, 406, 423, 5, 38, 20, 16, 407, 408, 12, 15, 2, 2, 408, 409, 7, 29, 2, 2, 409, 423, 5, 38, 20, 15, 410, 411, 12, 3, 2, 2, 411, 412, 7, 13, 2, 2, 412, 417, 5, 38, 20, 2, 413, 414, 7, 10, 2, 2, 414, 416, 5, 38, 20, 2, 415, 413, 3, 2, 2, 2, 416, 419, 3, 2, 2, 2, 417, 415, 3, 2, 2, 2, 417, 418, 3, 2, 2, 2, 418, 420, 3, 2, 2, 2, 419, 417, 3, 2, 2, 2, 420, 421, 7, 14, 2, 2, 421, 423, 3, 2, 2, 2, 422, 404, 3, 2, 2, 2, 422, 407, 3, 2, 2, 2, 422, 410, 3, 2, 2, 2, 423, 426, 3, 2, 2, 2, 424, 422, 3, 2, 2, 2, 424, 425, 3, 2, 2, 2, 425, 39, 3, 2, 2, 2, 426, 424, 3, 2, 2, 2, 427, 428, 7, 67, 2, 2, 428, 41, 3, 2, 2, 2, 429, 430, 5, 44, 23, 2, 430, 431, 7, 7, 2, 2, 431, 432, 5, 38, 20, 2, 432, 440, 3, 2, 2, 2, 433, 434, 7, 10, 2, 2, 434, 435, 5, 44, 23, 2, 435, 436, 7, 7, 2, 2, 436, 437, 5, 38, 20, 2, 437, 439, 3, 2, 2, 2, 438, 433, 3, 2, 2, 2, 439, 442, 3, 2, 2, 2, 440, 438, 3, 2, 2, 2, 440, 441, 3, 2, 2, 2, 441, 446, 3, 2, 2, 2, 442, 440, 3, 2, 2, 2, 443, 447, 7, 10, 2, 2, 444, 445, 7, 15, 2, 2, 445, 447, 5, 84, 43, 2, 446, 443, 3, 2, 2, 2, 446, 444, 3, 2, 2, 2, 446, 447, 3, 2, 2, 2, 447, 451, 3, 2, 2, 2, 448, 449, 7, 15, 2, 2, 449, 451, 5, 84, 43, 2, 450, 429, 3, 2, 2, 2, 450, 448, 3, 2, 2, 2, 451, 43, 3, 2, 2, 2, 452, 453, 5, 82, 42, 2, 453, 45, 3, 2, 2, 2, 454, 455, 8, 24, 1, 2, 455, 605, 5, 56, 29, 2, 456, 457, 5, 72, 37, 2, 457, 459, 7, 63, 2, 2, 458, 460, 5, 68, 35, 2, 459, 458, 3, 2, 2, 2, 459, 460, 3, 2, 2, 2, 460, 461, 3, 2, 2, 2, 461, 462, 7, 64, 2, 2, 462, 605, 3, 2, 2, 2, 463, 464, 7, 52, 2, 2, 464, 605, 5, 46, 24, 27, 465, 466, 5, 80, 41, 2, 466, 467, 7, 34, 2, 2, 467, 468, 7, 62, 2, 2, 468, 469, 5, 46, 24, 23, 469, 605, 3, 2, 2, 2, 470, 471, 7, 45, 2, 2, 471, 472, 7, 4, 2, 2, 472, 477, 5, 46, 24, 2, 473, 474, 7, 10, 2, 2, 474, 476, 5, 46, 24, 2, 475, 473, 3, 2, 2, 2, 476, 479, 3, 2, 2, 2, 477, 475, 3, 2, 2, 2, 477, 478, 3, 2, 2, 2, 478, 481, 3, 2, 2, 2, 479, 477, 3, 2, 2, 2, 480, 482, 7, 10, 2, 2, 481, 480, 3, 2, 2, 2, 481, 482, 3, 2, 2, 2, 482, 483, 3, 2, 2, 2, 483, 484, 7, 5, 2, 2, 484, 605, 3, 2, 2, 2, 485, 486, 7, 46, 2, 2, 486, 487, 7, 4, 2, 2, 487, 492, 5, 46, 24, 2, 488, 489, 7, 10, 2, 2, 489, 491, 5, 46, 24, 2, 490, 488, 3, 2, 2, 2, 491, 494, 3, 2, 2, 2, 492, 490, 3, 2, 2, 2, 492, 493, 3, 2, 2, 2, 493, 496, 3, 2, 2, 2, 494, 492, 3, 2, 2, 2, 495, 497, 7, 10, 2, 2, 496, 495, 3, 2, 2, 2, 496, 497, 3, 2, 2, 2, 497, 498, 3, 2, 2, 2, 498, 499, 7, 5, 2, 2, 499, 605, 3, 2, 2, 2, 500, 605, 5, 48, 25, 2, 501, 502, 7, 35, 2, 2, 502, 503, 7, 4, 2, 2, 503, 508, 5, 46, 24, 2, 504, 505, 7, 10, 2, 2, 505, 507, 5, 46, 24, 2, 506, 504, 3, 2, 2, 2, 507, 510, 3, 2, 2, 2, 508, 506, 3, 2, 2, 2, 508, 509, 3, 2, 2, 2, 509, 512, 3, 2, 2, 2, 510, 508, 3, 2, 2, 2, 511, 513, 7, 10, 2, 2, 512, 511, 3, 2, 2, 2, 512, 513, 3, 2, 2, 2, 513, 514, 3, 2, 2, 2, 514, 515, 7, 5, 2, 2, 515, 605, 3, 2, 2, 2, 516, 517, 7, 36, 2, 2, 517, 518, 7, 4, 2, 2, 518, 523, 5, 46, 24, 2, 519, 520, 7, 10, 2, 2, 520, 522, 5, 46, 24, 2, 521, 519, 3, 2, 2, 2, 522, 525, 3, 2, 2, 2, 523, 521, 3, 2, 2, 2, 523, 524, 3, 2, 2, 2, 524, 527, 3, 2, 2, 2, 525, 523, 3, 2, 2, 2, 526, 528, 7, 10, 2, 2, 527, 526, 3, 2, 2, 2, 527, 528, 3, 2, 2, 2, 528, 529, 3, 2, 2, 2, 529, 530, 7, 5, 2, 2, 530, 605, 3, 2, 2, 2, 531, 536, 5, 80, 41, 2, 532, 536, 7, 44, 2, 2, 533, 536, 7, 43, 2, 2, 534, 536, 7, 42, 2, 2, 535, 531, 3, 2, 2, 2, 535, 532, 3, 2, 2, 2, 535, 533, 3, 2, 2, 2, 535, 534, 3, 2, 2, 2, 536, 605, 3, 2, 2, 2, 537, 538, 7, 63, 2, 2, 538, 539, 5, 46, 24, 2, 539, 540, 7, 10, 2, 2, 540, 545, 5, 46, 24, 2, 541, 542, 7, 10, 2, 2, 542, 544, 5, 46, 24, 2, 543, 541, 3, 2, 2, 2, 544, 547, 3, 2, 2, 2, 545, 543, 3, 2, 2, 2, 545, 546, 3, 2, 2, 2, 546, 549, 3, 2, 2, 2, 547, 545, 3, 2, 2, 2, 548, 550, 7, 10, 2, 2, 549, 548, 3, 2, 2, 2, 549, 550, 3, 2, 2, 2, 550, 551, 3, 2, 2, 2, 551, 552, 7, 64, 2, 2, 552, 605, 3, 2, 2, 2, 553, 554, 7, 4, 2, 2, 554, 559, 5, 70, 36, 2, 555, 556, 7, 10, 2, 2, 556, 558, 5, 70, 36, 2, 557, 555, 3, 2, 2, 2, 558, 561, 3, 2, 2, 2, 559, 557, 3, 2, 2, 2, 559, 560, 3, 2, 2, 2, 560, 563, 3, 2, 2, 2, 561, 559, 3, 2, 2, 2, 562, 564, 7, 10, 2, 2, 563, 562, 3, 2, 2, 2, 563, 564, 3, 2, 2, 2, 564, 565, 3, 2, 2, 2, 565, 566, 7, 5, 2, 2, 566, 605, 3, 2, 2, 2, 567, 576, 7, 13, 2, 2, 568, 573, 5, 46, 24, 2, 569, 570, 7, 10, 2, 2, 570, 572, 5, 46, 24, 2, 571, 569, 3, 2, 2, 2, 572, 575, 3, 2, 2, 2, 573, 571, 3, 2, 2, 2, 573, 574, 3, 2, 2, 2, 574, 577, 3, 2, 2, 2, 575, 573, 3, 2, 2, 2, 576, 568, 3, 2, 2, 2, 576, 577, 3, 2, 2, 2, 577, 579, 3, 2, 2, 2, 578, 580, 7, 10, 2, 2, 579, 578, 3, 2, 2, 2, 579, 580, 3, 2, 2, 2, 580, 581, 3, 2, 2, 2, 581, 605, 7, 14, 2, 2, 582, 583, 7, 37, 2, 2, 583, 584, 7, 63, 2, 2, 584, 585, 5, 46, 24, 2, 585, 586, 7, 64, 2, 2, 586, 587, 5, 46, 24, 2, 587, 588, 7, 38, 2, 2, 588, 589, 5, 46, 24, 7, 589, 605, 3, 2, 2, 2, 590, 591, 5, 10, 6, 2, 591, 592, 5, 46, 24, 6, 592, 605, 3, 2, 2, 2, 593, 594, 5, 20, 11, 2, 594, 595, 5, 46, 24, 5, 595, 605, 3, 2, 2, 2, 596, 597, 7, 63, 2, 2, 597, 598, 5, 46, 24, 2, 598, 599, 7, 64, 2, 2, 599, 605, 3, 2, 2, 2, 600, 601, 7, 4, 2, 2, 601, 602, 5, 46, 24, 2, 602, 603, 7, 5, 2, 2, 603, 605, 3, 2, 2, 2, 604, 454, 3, 2, 2, 2, 604, 456, 3, 2, 2, 2, 604, 463, 3, 2, 2, 2, 604, 465, 3, 2, 2, 2, 604, 470, 3, 2, 2, 2, 604, 485, 3, 2, 2, 2, 604, 500, 3, 2, 2, 2, 604, 501, 3, 2, 2, 2, 604, 516, 3, 2, 2, 2, 604, 535, 3, 2, 2, 2, 604, 537, 3, 2, 2, 2, 604, 553, 3, 2, 2, 2, 604, 567, 3, 2, 2, 2, 604, 582, 3, 2, 2, 2, 604, 590, 3, 2, 2, 2, 604, 593, 3, 2, 2, 2, 604, 596, 3, 2, 2, 2, 604, 600, 3, 2, 2, 2, 605, 655, 3, 2, 2, 2, 606, 607, 12, 28, 2, 2, 607, 608, 7, 33, 2, 2, 608, 654, 5, 46, 24, 28, 609, 610, 12, 26, 2, 2, 610, 611, 9, 2, 2, 2, 611, 654, 5, 46, 24, 27, 612, 613, 12, 25, 2, 2, 613, 614, 9, 3, 2, 2, 614, 654, 5, 46, 24, 26, 615, 616, 12, 24, 2, 2, 616, 617, 9, 4, 2, 2, 617, 654, 5, 46, 24, 25, 618, 619, 12, 22, 2, 2, 619, 620, 7, 62, 2, 2, 620, 621, 5, 46, 24, 23, 621, 622, 8, 24, 1, 2, 622, 654, 3, 2, 2, 2, 623, 624, 12, 20, 2, 2, 624, 625, 7, 45, 2, 2, 625, 654, 5, 46, 24, 21, 626, 627, 12, 18, 2, 2, 627, 628, 7, 46, 2, 2, 628, 654, 5, 46, 24, 19, 629, 630, 12, 17, 2, 2, 630, 631, 7, 47, 2, 2, 631, 654, 5, 46, 24, 18, 632, 633, 12, 16, 2, 2, 633, 634, 7, 48, 2, 2, 634, 654, 5, 46, 24, 17, 635, 636, 12, 10, 2, 2, 636, 637, 7, 28, 2, 2, 637, 654, 5, 46, 24, 11, 638, 639, 12, 32, 2, 2, 639, 640, 7, 24, 2, 2, 640, 646, 5, 74, 38, 2, 641, 643, 7, 63, 2, 2, 642, 644, 5, 68, 35, 2, 643, 642, 3, 2, 2, 2, 643, 644, 3, 2, 2, 2, 644, 645, 3, 2, 2, 2, 645, 647, 7, 64, 2, 2, 646, 641, 3, 2, 2, 2, 646, 647, 3, 2, 2, 2, 647, 654, 3, 2, 2, 2, 648, 649, 12, 29, 2, 2, 649, 650, 7, 13, 2, 2, 650, 651, 5, 46, 24, 2, 651, 652, 7, 14, 2, 2, 652, 654, 3, 2, 2, 2, 653, 606, 3, 2, 2, 2, 653, 609, 3, 2, 2, 2, 653, 612, 3, 2, 2, 2, 653, 615, 3, 2, 2, 2, 653, 618, 3, 2, 2, 2, 653, 623, 3, 2, 2, 2, 653, 626, 3, 2, 2, 2, 653, 629, 3, 2, 2, 2, 653, 632, 3, 2, 2, 2, 653, 635, 3, 2, 2, 2, 653, 638, 3, 2, 2, 2, 653, 648, 3, 2, 2, 2, 654, 657, 3, 2, 2, 2, 655, 653, 3, 2, 2, 2, 655, 656, 3, 2, 2, 2, 656, 47, 3, 2, 2, 2, 657, 655, 3, 2, 2, 2, 658, 659, 7, 50, 2, 2, 659, 660, 5, 46, 24, 2, 660, 662, 7, 4, 2, 2, 661, 663, 7, 15, 2, 2, 662, 661, 3, 2, 2, 2, 662, 663, 3, 2, 2, 2, 663, 664, 3, 2, 2, 2, 664, 669, 5, 50, 26, 2, 665, 666, 7, 15, 2, 2, 666, 668, 5, 50, 26, 2, 667, 665, 3, 2, 2, 2, 668, 671, 3, 2, 2, 2, 669, 667, 3, 2, 2, 2, 669, 670, 3, 2, 2, 2, 670, 672, 3, 2, 2, 2, 671, 669, 3, 2, 2, 2, 672, 673, 7, 5, 2, 2, 673, 49, 3, 2, 2, 2, 674, 677, 5, 52, 27, 2, 675, 677, 7, 39, 2, 2, 676, 674, 3, 2, 2, 2, 676, 675, 3, 2, 2, 2, 677, 678, 3, 2, 2, 2, 678, 679, 7, 29, 2, 2, 679, 680, 5, 46, 24, 2, 680, 51, 3, 2, 2, 2, 681, 688, 5, 82, 42, 2, 682, 685, 7, 63, 2, 2, 683, 686, 5, 82, 42, 2, 684, 686, 7, 39, 2, 2, 685, 683, 3, 2, 2, 2, 685, 684, 3, 2, 2, 2, 686, 687, 3, 2, 2, 2, 687, 689, 7, 64, 2, 2, 688, 682, 3, 2, 2, 2, 688, 689, 3, 2, 2, 2, 689, 53, 3, 2, 2, 2, 690, 691, 5, 8, 5, 2, 691, 692, 7, 2, 2, 3, 692, 700, 3, 2, 2, 2, 693, 694, 5, 46, 24, 2, 694, 695, 7, 2, 2, 3, 695, 700, 3, 2, 2, 2, 696, 697, 7, 69, 2, 2, 697, 700, 7, 2, 2, 3, 698, 700, 7, 2, 2, 3, 699, 690, 3, 2, 2, 2, 699, 693, 3, 2, 2, 2, 699, 696, 3, 2, 2, 2, 699, 698, 3, 2, 2, 2, 700, 55, 3, 2, 2, 2, 701, 704, 5, 58, 30, 2, 702, 704, 5, 60, 31, 2, 703, 701, 3, 2, 2, 2, 703, 702, 3, 2, 2, 2, 704, 57, 3, 2, 2, 2, 705, 706, 5, 64, 33, 2, 706, 707, 7, 29, 2, 2, 707, 708, 5, 46, 24, 2, 708, 723, 3, 2, 2, 2, 709, 710, 7, 63, 2, 2, 710, 715, 5, 64, 33, 2, 711, 712, 7, 10, 2, 2, 712, 714, 5, 64, 33, 2, 713, 711, 3, 2, 2, 2, 714, 717, 3, 2, 2, 2, 715, 713, 3, 2, 2, 2, 715, 716, 3, 2, 2, 2, 716, 718, 3, 2, 2, 2, 717, 715, 3, 2, 2, 2, 718, 719, 7, 64, 2, 2, 719, 720, 7, 29, 2, 2, 720, 721, 5, 46, 24, 2, 721, 723, 3, 2, 2, 2, 722, 705, 3, 2, 2, 2, 722, 709, 3, 2, 2, 2, 723, 59, 3, 2, 2, 2, 724, 725, 7, 63, 2, 2, 725, 726, 7, 63, 2, 2, 726, 729, 5, 64, 33, 2, 727, 728, 7, 10, 2, 2, 728, 730, 5, 64, 33, 2, 729, 727, 3, 2, 2, 2, 730, 731, 3, 2, 2, 2, 731, 729, 3, 2, 2, 2, 731, 732, 3, 2, 2, 2, 732, 733, 3, 2, 2, 2, 733, 734, 7, 64, 2, 2, 734, 735, 7, 64, 2, 2, 735, 736, 7, 29, 2, 2, 736, 737, 5, 46, 24, 2, 737, 61, 3, 2, 2, 2, 738, 741, 7, 39, 2, 2, 739, 741, 5, 80, 41, 2, 740, 738, 3, 2, 2, 2, 740, 739, 3, 2, 2, 2, 741, 63, 3, 2, 2, 2, 742, 743, 5, 62, 32, 2, 743, 65, 3, 2, 2, 2, 744, 747, 7, 53, 2, 2, 745, 747, 5, 80, 41, 2, 746, 744, 3, 2, 2, 2, 746, 745, 3, 2, 2, 2, 747, 67, 3, 2, 2, 2, 748, 753, 5, 46, 24, 2, 749, 750, 7, 10, 2, 2, 750, 752, 5, 46, 24, 2, 751, 749, 3, 2, 2, 2, 752, 755, 3, 2, 2, 2, 753, 751, 3, 2, 2, 2, 753, 754, 3, 2, 2, 2, 754, 69, 3, 2, 2, 2, 755, 753, 3, 2, 2, 2, 756, 757, 5, 82, 42, 2, 757, 758, 7, 7, 2, 2, 758, 759, 5, 46, 24, 2, 759, 763, 3, 2, 2, 2, 760, 761, 7, 40, 2, 2, 761, 763, 5, 46, 24, 2, 762, 756, 3, 2, 2, 2, 762, 760, 3, 2, 2, 2, 763, 71, 3, 2, 2, 2, 764, 767, 5, 80, 41, 2, 765, 767, 9, 5, 2, 2, 766, 764, 3, 2, 2, 2, 766, 765, 3, 2, 2, 2, 767, 73, 3, 2, 2, 2, 768, 771, 5, 80, 41, 2, 769, 771, 9, 6, 2, 2, 770, 768, 3, 2, 2, 2, 770, 769, 3, 2, 2, 2, 771, 75, 3, 2, 2, 2, 772, 773, 9, 7, 2, 2, 773, 77, 3, 2, 2, 2, 774, 775, 9, 8, 2, 2, 775, 79, 3, 2, 2, 2, 776, 781, 5, 84, 43, 2, 777, 778, 7, 41, 2, 2, 778, 780, 5, 84, 43, 2, 779, 777, 3, 2, 2, 2, 780, 783, 3, 2, 2, 2, 781, 779, 3, 2, 2, 2, 781, 782, 3, 2, 2, 2, 782, 81, 3, 2, 2, 2, 783, 781, 3, 2, 2, 2, 784, 789, 5, 84, 43, 2, 785, 786, 5, 80, 41, 2, 786, 787, 8, 42, 1, 2, 787, 789, 3, 2, 2, 2, 788, 784, 3, 2, 2, 2, 788, 785, 3, 2, 2, 2, 789, 83, 3, 2, 2, 2, 790, 791, 9, 9, 2, 2, 791, 85, 3, 2, 2, 2, 87, 89, 96, 105, 113, 138, 148, 151, 156, 171, 178, 182, 185, 199, 208, 213, 216, 223, 231, 237, 242, 253, 261, 267, 271, 273, 284, 286, 301, 309, 324, 332, 334, 351, 354, 357, 380, 384, 390, 402, 417, 422, 424, 440, 446, 450, 459, 477, 481, 492, 496, 508, 512, 523, 527, 535, 545, 549, 559, 563, 573, 576, 579, 604, 643, 646, 653, 655, 662, 669, 676, 685, 688, 699, 703, 715, 722, 731, 740, 746, 753, 762, 766, 770, 781, 788] \ No newline at end of file diff --git a/quint/src/generated/Quint.tokens b/quint/src/generated/Quint.tokens index a3529881a..c8362598c 100644 --- a/quint/src/generated/Quint.tokens +++ b/quint/src/generated/Quint.tokens @@ -44,24 +44,24 @@ AND=43 OR=44 IFF=45 IMPLIES=46 -SET=47 -LIST=48 -MAP=49 -MATCH=50 -PLUS=51 -MINUS=52 -MUL=53 -DIV=54 -MOD=55 -GT=56 -LT=57 -GE=58 -LE=59 -NE=60 -EQ=61 -ASGN=62 -LPAREN=63 -RPAREN=64 +MAP=47 +MATCH=48 +PLUS=49 +MINUS=50 +MUL=51 +DIV=52 +MOD=53 +GT=54 +LT=55 +GE=56 +LE=57 +NE=58 +EQ=59 +ASGN=60 +LPAREN=61 +RPAREN=62 +SET=63 +LIST=64 LOW_ID=65 CAP_ID=66 DOCCOMMENT=67 @@ -78,23 +78,23 @@ WS=70 ','=8 ';'=9 'type'=10 -'|'=11 -'nondet'=12 -'val'=13 -'def'=14 -'pure'=15 -'action'=16 -'run'=17 -'temporal'=18 -'import'=19 -'.'=20 -'from'=21 -'as'=22 -'export'=23 -'->'=24 -'=>'=25 -'['=26 -']'=27 +'['=11 +']'=12 +'|'=13 +'nondet'=14 +'val'=15 +'def'=16 +'pure'=17 +'action'=18 +'run'=19 +'temporal'=20 +'import'=21 +'.'=22 +'from'=23 +'as'=24 +'export'=25 +'->'=26 +'=>'=27 'int'=28 'str'=29 'bool'=30 @@ -111,21 +111,21 @@ WS=70 'or'=44 'iff'=45 'implies'=46 -'Set'=47 -'List'=48 -'Map'=49 -'match'=50 -'+'=51 -'-'=52 -'*'=53 -'/'=54 -'%'=55 -'>'=56 -'<'=57 -'>='=58 -'<='=59 -'!='=60 -'=='=61 -'='=62 -'('=63 -')'=64 +'Map'=47 +'match'=48 +'+'=49 +'-'=50 +'*'=51 +'/'=52 +'%'=53 +'>'=54 +'<'=55 +'>='=56 +'<='=57 +'!='=58 +'=='=59 +'='=60 +'('=61 +')'=62 +'Set'=63 +'List'=64 diff --git a/quint/src/generated/QuintLexer.interp b/quint/src/generated/QuintLexer.interp index e66950a16..b90ce839c 100644 --- a/quint/src/generated/QuintLexer.interp +++ b/quint/src/generated/QuintLexer.interp @@ -10,6 +10,8 @@ null ',' ';' 'type' +'[' +']' '|' 'nondet' 'val' @@ -25,8 +27,6 @@ null 'export' '->' '=>' -'[' -']' 'int' 'str' 'bool' @@ -46,8 +46,6 @@ null 'or' 'iff' 'implies' -'Set' -'List' 'Map' 'match' '+' @@ -64,6 +62,8 @@ null '=' '(' ')' +'Set' +'List' null null null @@ -119,8 +119,6 @@ AND OR IFF IMPLIES -SET -LIST MAP MATCH PLUS @@ -137,6 +135,8 @@ EQ ASGN LPAREN RPAREN +SET +LIST LOW_ID CAP_ID DOCCOMMENT @@ -191,8 +191,6 @@ AND OR IFF IMPLIES -SET -LIST MAP MATCH PLUS @@ -209,6 +207,8 @@ EQ ASGN LPAREN RPAREN +SET +LIST LOW_ID CAP_ID DOCCOMMENT @@ -224,4 +224,4 @@ mode names: DEFAULT_MODE atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 2, 72, 490, 8, 1, 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, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 7, 41, 303, 10, 41, 12, 41, 14, 41, 306, 11, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 319, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 326, 10, 43, 12, 43, 14, 43, 329, 11, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 338, 10, 43, 12, 43, 14, 43, 341, 11, 43, 5, 43, 343, 10, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 53, 3, 53, 3, 54, 3, 54, 3, 55, 3, 55, 3, 56, 3, 56, 3, 57, 3, 57, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 64, 3, 64, 3, 65, 3, 65, 3, 66, 3, 66, 7, 66, 417, 10, 66, 12, 66, 14, 66, 420, 11, 66, 3, 66, 3, 66, 6, 66, 424, 10, 66, 13, 66, 14, 66, 425, 5, 66, 428, 10, 66, 3, 67, 3, 67, 7, 67, 432, 10, 67, 12, 67, 14, 67, 435, 11, 67, 3, 67, 3, 67, 6, 67, 439, 10, 67, 13, 67, 14, 67, 440, 5, 67, 443, 10, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 7, 68, 450, 10, 68, 12, 68, 14, 68, 453, 11, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 7, 69, 461, 10, 69, 12, 69, 14, 69, 464, 11, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 7, 70, 474, 10, 70, 12, 70, 14, 70, 477, 11, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 6, 71, 485, 10, 71, 13, 71, 14, 71, 486, 3, 71, 3, 71, 6, 304, 451, 462, 475, 2, 2, 72, 3, 2, 3, 5, 2, 4, 7, 2, 5, 9, 2, 6, 11, 2, 7, 13, 2, 8, 15, 2, 9, 17, 2, 10, 19, 2, 11, 21, 2, 12, 23, 2, 13, 25, 2, 14, 27, 2, 15, 29, 2, 16, 31, 2, 17, 33, 2, 18, 35, 2, 19, 37, 2, 20, 39, 2, 21, 41, 2, 22, 43, 2, 23, 45, 2, 24, 47, 2, 25, 49, 2, 26, 51, 2, 27, 53, 2, 28, 55, 2, 29, 57, 2, 30, 59, 2, 31, 61, 2, 32, 63, 2, 33, 65, 2, 34, 67, 2, 35, 69, 2, 36, 71, 2, 37, 73, 2, 38, 75, 2, 39, 77, 2, 40, 79, 2, 41, 81, 2, 42, 83, 2, 43, 85, 2, 44, 87, 2, 45, 89, 2, 46, 91, 2, 47, 93, 2, 48, 95, 2, 49, 97, 2, 50, 99, 2, 51, 101, 2, 52, 103, 2, 53, 105, 2, 54, 107, 2, 55, 109, 2, 56, 111, 2, 57, 113, 2, 58, 115, 2, 59, 117, 2, 60, 119, 2, 61, 121, 2, 62, 123, 2, 63, 125, 2, 64, 127, 2, 65, 129, 2, 66, 131, 2, 67, 133, 2, 68, 135, 2, 69, 137, 2, 70, 139, 2, 71, 141, 2, 72, 3, 2, 10, 3, 2, 51, 59, 3, 2, 50, 59, 5, 2, 50, 59, 67, 72, 99, 104, 3, 2, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 3, 2, 97, 97, 3, 2, 67, 92, 5, 2, 11, 12, 15, 15, 34, 34, 2, 507, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 3, 143, 3, 2, 2, 2, 5, 150, 3, 2, 2, 2, 7, 152, 3, 2, 2, 2, 9, 154, 3, 2, 2, 2, 11, 160, 3, 2, 2, 2, 13, 162, 3, 2, 2, 2, 15, 166, 3, 2, 2, 2, 17, 173, 3, 2, 2, 2, 19, 175, 3, 2, 2, 2, 21, 177, 3, 2, 2, 2, 23, 182, 3, 2, 2, 2, 25, 184, 3, 2, 2, 2, 27, 191, 3, 2, 2, 2, 29, 195, 3, 2, 2, 2, 31, 199, 3, 2, 2, 2, 33, 204, 3, 2, 2, 2, 35, 211, 3, 2, 2, 2, 37, 215, 3, 2, 2, 2, 39, 224, 3, 2, 2, 2, 41, 231, 3, 2, 2, 2, 43, 233, 3, 2, 2, 2, 45, 238, 3, 2, 2, 2, 47, 241, 3, 2, 2, 2, 49, 248, 3, 2, 2, 2, 51, 251, 3, 2, 2, 2, 53, 254, 3, 2, 2, 2, 55, 256, 3, 2, 2, 2, 57, 258, 3, 2, 2, 2, 59, 262, 3, 2, 2, 2, 61, 266, 3, 2, 2, 2, 63, 271, 3, 2, 2, 2, 65, 273, 3, 2, 2, 2, 67, 275, 3, 2, 2, 2, 69, 279, 3, 2, 2, 2, 71, 283, 3, 2, 2, 2, 73, 286, 3, 2, 2, 2, 75, 291, 3, 2, 2, 2, 77, 293, 3, 2, 2, 2, 79, 297, 3, 2, 2, 2, 81, 300, 3, 2, 2, 2, 83, 318, 3, 2, 2, 2, 85, 342, 3, 2, 2, 2, 87, 344, 3, 2, 2, 2, 89, 348, 3, 2, 2, 2, 91, 351, 3, 2, 2, 2, 93, 355, 3, 2, 2, 2, 95, 363, 3, 2, 2, 2, 97, 367, 3, 2, 2, 2, 99, 372, 3, 2, 2, 2, 101, 376, 3, 2, 2, 2, 103, 382, 3, 2, 2, 2, 105, 384, 3, 2, 2, 2, 107, 386, 3, 2, 2, 2, 109, 388, 3, 2, 2, 2, 111, 390, 3, 2, 2, 2, 113, 392, 3, 2, 2, 2, 115, 394, 3, 2, 2, 2, 117, 396, 3, 2, 2, 2, 119, 399, 3, 2, 2, 2, 121, 402, 3, 2, 2, 2, 123, 405, 3, 2, 2, 2, 125, 408, 3, 2, 2, 2, 127, 410, 3, 2, 2, 2, 129, 412, 3, 2, 2, 2, 131, 427, 3, 2, 2, 2, 133, 442, 3, 2, 2, 2, 135, 444, 3, 2, 2, 2, 137, 456, 3, 2, 2, 2, 139, 469, 3, 2, 2, 2, 141, 484, 3, 2, 2, 2, 143, 144, 7, 111, 2, 2, 144, 145, 7, 113, 2, 2, 145, 146, 7, 102, 2, 2, 146, 147, 7, 119, 2, 2, 147, 148, 7, 110, 2, 2, 148, 149, 7, 103, 2, 2, 149, 4, 3, 2, 2, 2, 150, 151, 7, 125, 2, 2, 151, 6, 3, 2, 2, 2, 152, 153, 7, 127, 2, 2, 153, 8, 3, 2, 2, 2, 154, 155, 7, 101, 2, 2, 155, 156, 7, 113, 2, 2, 156, 157, 7, 112, 2, 2, 157, 158, 7, 117, 2, 2, 158, 159, 7, 118, 2, 2, 159, 10, 3, 2, 2, 2, 160, 161, 7, 60, 2, 2, 161, 12, 3, 2, 2, 2, 162, 163, 7, 120, 2, 2, 163, 164, 7, 99, 2, 2, 164, 165, 7, 116, 2, 2, 165, 14, 3, 2, 2, 2, 166, 167, 7, 99, 2, 2, 167, 168, 7, 117, 2, 2, 168, 169, 7, 117, 2, 2, 169, 170, 7, 119, 2, 2, 170, 171, 7, 111, 2, 2, 171, 172, 7, 103, 2, 2, 172, 16, 3, 2, 2, 2, 173, 174, 7, 46, 2, 2, 174, 18, 3, 2, 2, 2, 175, 176, 7, 61, 2, 2, 176, 20, 3, 2, 2, 2, 177, 178, 7, 118, 2, 2, 178, 179, 7, 123, 2, 2, 179, 180, 7, 114, 2, 2, 180, 181, 7, 103, 2, 2, 181, 22, 3, 2, 2, 2, 182, 183, 7, 126, 2, 2, 183, 24, 3, 2, 2, 2, 184, 185, 7, 112, 2, 2, 185, 186, 7, 113, 2, 2, 186, 187, 7, 112, 2, 2, 187, 188, 7, 102, 2, 2, 188, 189, 7, 103, 2, 2, 189, 190, 7, 118, 2, 2, 190, 26, 3, 2, 2, 2, 191, 192, 7, 120, 2, 2, 192, 193, 7, 99, 2, 2, 193, 194, 7, 110, 2, 2, 194, 28, 3, 2, 2, 2, 195, 196, 7, 102, 2, 2, 196, 197, 7, 103, 2, 2, 197, 198, 7, 104, 2, 2, 198, 30, 3, 2, 2, 2, 199, 200, 7, 114, 2, 2, 200, 201, 7, 119, 2, 2, 201, 202, 7, 116, 2, 2, 202, 203, 7, 103, 2, 2, 203, 32, 3, 2, 2, 2, 204, 205, 7, 99, 2, 2, 205, 206, 7, 101, 2, 2, 206, 207, 7, 118, 2, 2, 207, 208, 7, 107, 2, 2, 208, 209, 7, 113, 2, 2, 209, 210, 7, 112, 2, 2, 210, 34, 3, 2, 2, 2, 211, 212, 7, 116, 2, 2, 212, 213, 7, 119, 2, 2, 213, 214, 7, 112, 2, 2, 214, 36, 3, 2, 2, 2, 215, 216, 7, 118, 2, 2, 216, 217, 7, 103, 2, 2, 217, 218, 7, 111, 2, 2, 218, 219, 7, 114, 2, 2, 219, 220, 7, 113, 2, 2, 220, 221, 7, 116, 2, 2, 221, 222, 7, 99, 2, 2, 222, 223, 7, 110, 2, 2, 223, 38, 3, 2, 2, 2, 224, 225, 7, 107, 2, 2, 225, 226, 7, 111, 2, 2, 226, 227, 7, 114, 2, 2, 227, 228, 7, 113, 2, 2, 228, 229, 7, 116, 2, 2, 229, 230, 7, 118, 2, 2, 230, 40, 3, 2, 2, 2, 231, 232, 7, 48, 2, 2, 232, 42, 3, 2, 2, 2, 233, 234, 7, 104, 2, 2, 234, 235, 7, 116, 2, 2, 235, 236, 7, 113, 2, 2, 236, 237, 7, 111, 2, 2, 237, 44, 3, 2, 2, 2, 238, 239, 7, 99, 2, 2, 239, 240, 7, 117, 2, 2, 240, 46, 3, 2, 2, 2, 241, 242, 7, 103, 2, 2, 242, 243, 7, 122, 2, 2, 243, 244, 7, 114, 2, 2, 244, 245, 7, 113, 2, 2, 245, 246, 7, 116, 2, 2, 246, 247, 7, 118, 2, 2, 247, 48, 3, 2, 2, 2, 248, 249, 7, 47, 2, 2, 249, 250, 7, 64, 2, 2, 250, 50, 3, 2, 2, 2, 251, 252, 7, 63, 2, 2, 252, 253, 7, 64, 2, 2, 253, 52, 3, 2, 2, 2, 254, 255, 7, 93, 2, 2, 255, 54, 3, 2, 2, 2, 256, 257, 7, 95, 2, 2, 257, 56, 3, 2, 2, 2, 258, 259, 7, 107, 2, 2, 259, 260, 7, 112, 2, 2, 260, 261, 7, 118, 2, 2, 261, 58, 3, 2, 2, 2, 262, 263, 7, 117, 2, 2, 263, 264, 7, 118, 2, 2, 264, 265, 7, 116, 2, 2, 265, 60, 3, 2, 2, 2, 266, 267, 7, 100, 2, 2, 267, 268, 7, 113, 2, 2, 268, 269, 7, 113, 2, 2, 269, 270, 7, 110, 2, 2, 270, 62, 3, 2, 2, 2, 271, 272, 7, 96, 2, 2, 272, 64, 3, 2, 2, 2, 273, 274, 7, 41, 2, 2, 274, 66, 3, 2, 2, 2, 275, 276, 7, 99, 2, 2, 276, 277, 7, 110, 2, 2, 277, 278, 7, 110, 2, 2, 278, 68, 3, 2, 2, 2, 279, 280, 7, 99, 2, 2, 280, 281, 7, 112, 2, 2, 281, 282, 7, 123, 2, 2, 282, 70, 3, 2, 2, 2, 283, 284, 7, 107, 2, 2, 284, 285, 7, 104, 2, 2, 285, 72, 3, 2, 2, 2, 286, 287, 7, 103, 2, 2, 287, 288, 7, 110, 2, 2, 288, 289, 7, 117, 2, 2, 289, 290, 7, 103, 2, 2, 290, 74, 3, 2, 2, 2, 291, 292, 7, 97, 2, 2, 292, 76, 3, 2, 2, 2, 293, 294, 7, 48, 2, 2, 294, 295, 7, 48, 2, 2, 295, 296, 7, 48, 2, 2, 296, 78, 3, 2, 2, 2, 297, 298, 7, 60, 2, 2, 298, 299, 7, 60, 2, 2, 299, 80, 3, 2, 2, 2, 300, 304, 7, 36, 2, 2, 301, 303, 11, 2, 2, 2, 302, 301, 3, 2, 2, 2, 303, 306, 3, 2, 2, 2, 304, 305, 3, 2, 2, 2, 304, 302, 3, 2, 2, 2, 305, 307, 3, 2, 2, 2, 306, 304, 3, 2, 2, 2, 307, 308, 7, 36, 2, 2, 308, 82, 3, 2, 2, 2, 309, 310, 7, 104, 2, 2, 310, 311, 7, 99, 2, 2, 311, 312, 7, 110, 2, 2, 312, 313, 7, 117, 2, 2, 313, 319, 7, 103, 2, 2, 314, 315, 7, 118, 2, 2, 315, 316, 7, 116, 2, 2, 316, 317, 7, 119, 2, 2, 317, 319, 7, 103, 2, 2, 318, 309, 3, 2, 2, 2, 318, 314, 3, 2, 2, 2, 319, 84, 3, 2, 2, 2, 320, 343, 7, 50, 2, 2, 321, 327, 9, 2, 2, 2, 322, 326, 9, 3, 2, 2, 323, 324, 7, 97, 2, 2, 324, 326, 9, 3, 2, 2, 325, 322, 3, 2, 2, 2, 325, 323, 3, 2, 2, 2, 326, 329, 3, 2, 2, 2, 327, 325, 3, 2, 2, 2, 327, 328, 3, 2, 2, 2, 328, 343, 3, 2, 2, 2, 329, 327, 3, 2, 2, 2, 330, 331, 7, 50, 2, 2, 331, 332, 7, 122, 2, 2, 332, 333, 3, 2, 2, 2, 333, 339, 9, 4, 2, 2, 334, 338, 9, 4, 2, 2, 335, 336, 7, 97, 2, 2, 336, 338, 9, 4, 2, 2, 337, 334, 3, 2, 2, 2, 337, 335, 3, 2, 2, 2, 338, 341, 3, 2, 2, 2, 339, 337, 3, 2, 2, 2, 339, 340, 3, 2, 2, 2, 340, 343, 3, 2, 2, 2, 341, 339, 3, 2, 2, 2, 342, 320, 3, 2, 2, 2, 342, 321, 3, 2, 2, 2, 342, 330, 3, 2, 2, 2, 343, 86, 3, 2, 2, 2, 344, 345, 7, 99, 2, 2, 345, 346, 7, 112, 2, 2, 346, 347, 7, 102, 2, 2, 347, 88, 3, 2, 2, 2, 348, 349, 7, 113, 2, 2, 349, 350, 7, 116, 2, 2, 350, 90, 3, 2, 2, 2, 351, 352, 7, 107, 2, 2, 352, 353, 7, 104, 2, 2, 353, 354, 7, 104, 2, 2, 354, 92, 3, 2, 2, 2, 355, 356, 7, 107, 2, 2, 356, 357, 7, 111, 2, 2, 357, 358, 7, 114, 2, 2, 358, 359, 7, 110, 2, 2, 359, 360, 7, 107, 2, 2, 360, 361, 7, 103, 2, 2, 361, 362, 7, 117, 2, 2, 362, 94, 3, 2, 2, 2, 363, 364, 7, 85, 2, 2, 364, 365, 7, 103, 2, 2, 365, 366, 7, 118, 2, 2, 366, 96, 3, 2, 2, 2, 367, 368, 7, 78, 2, 2, 368, 369, 7, 107, 2, 2, 369, 370, 7, 117, 2, 2, 370, 371, 7, 118, 2, 2, 371, 98, 3, 2, 2, 2, 372, 373, 7, 79, 2, 2, 373, 374, 7, 99, 2, 2, 374, 375, 7, 114, 2, 2, 375, 100, 3, 2, 2, 2, 376, 377, 7, 111, 2, 2, 377, 378, 7, 99, 2, 2, 378, 379, 7, 118, 2, 2, 379, 380, 7, 101, 2, 2, 380, 381, 7, 106, 2, 2, 381, 102, 3, 2, 2, 2, 382, 383, 7, 45, 2, 2, 383, 104, 3, 2, 2, 2, 384, 385, 7, 47, 2, 2, 385, 106, 3, 2, 2, 2, 386, 387, 7, 44, 2, 2, 387, 108, 3, 2, 2, 2, 388, 389, 7, 49, 2, 2, 389, 110, 3, 2, 2, 2, 390, 391, 7, 39, 2, 2, 391, 112, 3, 2, 2, 2, 392, 393, 7, 64, 2, 2, 393, 114, 3, 2, 2, 2, 394, 395, 7, 62, 2, 2, 395, 116, 3, 2, 2, 2, 396, 397, 7, 64, 2, 2, 397, 398, 7, 63, 2, 2, 398, 118, 3, 2, 2, 2, 399, 400, 7, 62, 2, 2, 400, 401, 7, 63, 2, 2, 401, 120, 3, 2, 2, 2, 402, 403, 7, 35, 2, 2, 403, 404, 7, 63, 2, 2, 404, 122, 3, 2, 2, 2, 405, 406, 7, 63, 2, 2, 406, 407, 7, 63, 2, 2, 407, 124, 3, 2, 2, 2, 408, 409, 7, 63, 2, 2, 409, 126, 3, 2, 2, 2, 410, 411, 7, 42, 2, 2, 411, 128, 3, 2, 2, 2, 412, 413, 7, 43, 2, 2, 413, 130, 3, 2, 2, 2, 414, 418, 9, 5, 2, 2, 415, 417, 9, 6, 2, 2, 416, 415, 3, 2, 2, 2, 417, 420, 3, 2, 2, 2, 418, 416, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 428, 3, 2, 2, 2, 420, 418, 3, 2, 2, 2, 421, 423, 9, 7, 2, 2, 422, 424, 9, 6, 2, 2, 423, 422, 3, 2, 2, 2, 424, 425, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 428, 3, 2, 2, 2, 427, 414, 3, 2, 2, 2, 427, 421, 3, 2, 2, 2, 428, 132, 3, 2, 2, 2, 429, 433, 9, 8, 2, 2, 430, 432, 9, 6, 2, 2, 431, 430, 3, 2, 2, 2, 432, 435, 3, 2, 2, 2, 433, 431, 3, 2, 2, 2, 433, 434, 3, 2, 2, 2, 434, 443, 3, 2, 2, 2, 435, 433, 3, 2, 2, 2, 436, 438, 9, 7, 2, 2, 437, 439, 9, 6, 2, 2, 438, 437, 3, 2, 2, 2, 439, 440, 3, 2, 2, 2, 440, 438, 3, 2, 2, 2, 440, 441, 3, 2, 2, 2, 441, 443, 3, 2, 2, 2, 442, 429, 3, 2, 2, 2, 442, 436, 3, 2, 2, 2, 443, 134, 3, 2, 2, 2, 444, 445, 7, 49, 2, 2, 445, 446, 7, 49, 2, 2, 446, 447, 7, 49, 2, 2, 447, 451, 3, 2, 2, 2, 448, 450, 11, 2, 2, 2, 449, 448, 3, 2, 2, 2, 450, 453, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 451, 449, 3, 2, 2, 2, 452, 454, 3, 2, 2, 2, 453, 451, 3, 2, 2, 2, 454, 455, 7, 12, 2, 2, 455, 136, 3, 2, 2, 2, 456, 457, 7, 49, 2, 2, 457, 458, 7, 49, 2, 2, 458, 462, 3, 2, 2, 2, 459, 461, 11, 2, 2, 2, 460, 459, 3, 2, 2, 2, 461, 464, 3, 2, 2, 2, 462, 463, 3, 2, 2, 2, 462, 460, 3, 2, 2, 2, 463, 465, 3, 2, 2, 2, 464, 462, 3, 2, 2, 2, 465, 466, 7, 12, 2, 2, 466, 467, 3, 2, 2, 2, 467, 468, 8, 69, 2, 2, 468, 138, 3, 2, 2, 2, 469, 470, 7, 49, 2, 2, 470, 471, 7, 44, 2, 2, 471, 475, 3, 2, 2, 2, 472, 474, 11, 2, 2, 2, 473, 472, 3, 2, 2, 2, 474, 477, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 475, 473, 3, 2, 2, 2, 476, 478, 3, 2, 2, 2, 477, 475, 3, 2, 2, 2, 478, 479, 7, 44, 2, 2, 479, 480, 7, 49, 2, 2, 480, 481, 3, 2, 2, 2, 481, 482, 8, 70, 2, 2, 482, 140, 3, 2, 2, 2, 483, 485, 9, 9, 2, 2, 484, 483, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 484, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 489, 8, 71, 2, 2, 489, 142, 3, 2, 2, 2, 20, 2, 304, 318, 325, 327, 337, 339, 342, 418, 425, 427, 433, 440, 442, 451, 462, 475, 486, 3, 8, 2, 2] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 2, 72, 490, 8, 1, 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, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 7, 41, 303, 10, 41, 12, 41, 14, 41, 306, 11, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 319, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 326, 10, 43, 12, 43, 14, 43, 329, 11, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 338, 10, 43, 12, 43, 14, 43, 341, 11, 43, 5, 43, 343, 10, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 51, 3, 51, 3, 52, 3, 52, 3, 53, 3, 53, 3, 54, 3, 54, 3, 55, 3, 55, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 62, 3, 62, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 7, 66, 417, 10, 66, 12, 66, 14, 66, 420, 11, 66, 3, 66, 3, 66, 6, 66, 424, 10, 66, 13, 66, 14, 66, 425, 5, 66, 428, 10, 66, 3, 67, 3, 67, 7, 67, 432, 10, 67, 12, 67, 14, 67, 435, 11, 67, 3, 67, 3, 67, 6, 67, 439, 10, 67, 13, 67, 14, 67, 440, 5, 67, 443, 10, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 7, 68, 450, 10, 68, 12, 68, 14, 68, 453, 11, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 7, 69, 461, 10, 69, 12, 69, 14, 69, 464, 11, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 7, 70, 474, 10, 70, 12, 70, 14, 70, 477, 11, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 6, 71, 485, 10, 71, 13, 71, 14, 71, 486, 3, 71, 3, 71, 6, 304, 451, 462, 475, 2, 2, 72, 3, 2, 3, 5, 2, 4, 7, 2, 5, 9, 2, 6, 11, 2, 7, 13, 2, 8, 15, 2, 9, 17, 2, 10, 19, 2, 11, 21, 2, 12, 23, 2, 13, 25, 2, 14, 27, 2, 15, 29, 2, 16, 31, 2, 17, 33, 2, 18, 35, 2, 19, 37, 2, 20, 39, 2, 21, 41, 2, 22, 43, 2, 23, 45, 2, 24, 47, 2, 25, 49, 2, 26, 51, 2, 27, 53, 2, 28, 55, 2, 29, 57, 2, 30, 59, 2, 31, 61, 2, 32, 63, 2, 33, 65, 2, 34, 67, 2, 35, 69, 2, 36, 71, 2, 37, 73, 2, 38, 75, 2, 39, 77, 2, 40, 79, 2, 41, 81, 2, 42, 83, 2, 43, 85, 2, 44, 87, 2, 45, 89, 2, 46, 91, 2, 47, 93, 2, 48, 95, 2, 49, 97, 2, 50, 99, 2, 51, 101, 2, 52, 103, 2, 53, 105, 2, 54, 107, 2, 55, 109, 2, 56, 111, 2, 57, 113, 2, 58, 115, 2, 59, 117, 2, 60, 119, 2, 61, 121, 2, 62, 123, 2, 63, 125, 2, 64, 127, 2, 65, 129, 2, 66, 131, 2, 67, 133, 2, 68, 135, 2, 69, 137, 2, 70, 139, 2, 71, 141, 2, 72, 3, 2, 10, 3, 2, 51, 59, 3, 2, 50, 59, 5, 2, 50, 59, 67, 72, 99, 104, 3, 2, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 3, 2, 97, 97, 3, 2, 67, 92, 5, 2, 11, 12, 15, 15, 34, 34, 2, 507, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 3, 143, 3, 2, 2, 2, 5, 150, 3, 2, 2, 2, 7, 152, 3, 2, 2, 2, 9, 154, 3, 2, 2, 2, 11, 160, 3, 2, 2, 2, 13, 162, 3, 2, 2, 2, 15, 166, 3, 2, 2, 2, 17, 173, 3, 2, 2, 2, 19, 175, 3, 2, 2, 2, 21, 177, 3, 2, 2, 2, 23, 182, 3, 2, 2, 2, 25, 184, 3, 2, 2, 2, 27, 186, 3, 2, 2, 2, 29, 188, 3, 2, 2, 2, 31, 195, 3, 2, 2, 2, 33, 199, 3, 2, 2, 2, 35, 203, 3, 2, 2, 2, 37, 208, 3, 2, 2, 2, 39, 215, 3, 2, 2, 2, 41, 219, 3, 2, 2, 2, 43, 228, 3, 2, 2, 2, 45, 235, 3, 2, 2, 2, 47, 237, 3, 2, 2, 2, 49, 242, 3, 2, 2, 2, 51, 245, 3, 2, 2, 2, 53, 252, 3, 2, 2, 2, 55, 255, 3, 2, 2, 2, 57, 258, 3, 2, 2, 2, 59, 262, 3, 2, 2, 2, 61, 266, 3, 2, 2, 2, 63, 271, 3, 2, 2, 2, 65, 273, 3, 2, 2, 2, 67, 275, 3, 2, 2, 2, 69, 279, 3, 2, 2, 2, 71, 283, 3, 2, 2, 2, 73, 286, 3, 2, 2, 2, 75, 291, 3, 2, 2, 2, 77, 293, 3, 2, 2, 2, 79, 297, 3, 2, 2, 2, 81, 300, 3, 2, 2, 2, 83, 318, 3, 2, 2, 2, 85, 342, 3, 2, 2, 2, 87, 344, 3, 2, 2, 2, 89, 348, 3, 2, 2, 2, 91, 351, 3, 2, 2, 2, 93, 355, 3, 2, 2, 2, 95, 363, 3, 2, 2, 2, 97, 367, 3, 2, 2, 2, 99, 373, 3, 2, 2, 2, 101, 375, 3, 2, 2, 2, 103, 377, 3, 2, 2, 2, 105, 379, 3, 2, 2, 2, 107, 381, 3, 2, 2, 2, 109, 383, 3, 2, 2, 2, 111, 385, 3, 2, 2, 2, 113, 387, 3, 2, 2, 2, 115, 390, 3, 2, 2, 2, 117, 393, 3, 2, 2, 2, 119, 396, 3, 2, 2, 2, 121, 399, 3, 2, 2, 2, 123, 401, 3, 2, 2, 2, 125, 403, 3, 2, 2, 2, 127, 405, 3, 2, 2, 2, 129, 409, 3, 2, 2, 2, 131, 427, 3, 2, 2, 2, 133, 442, 3, 2, 2, 2, 135, 444, 3, 2, 2, 2, 137, 456, 3, 2, 2, 2, 139, 469, 3, 2, 2, 2, 141, 484, 3, 2, 2, 2, 143, 144, 7, 111, 2, 2, 144, 145, 7, 113, 2, 2, 145, 146, 7, 102, 2, 2, 146, 147, 7, 119, 2, 2, 147, 148, 7, 110, 2, 2, 148, 149, 7, 103, 2, 2, 149, 4, 3, 2, 2, 2, 150, 151, 7, 125, 2, 2, 151, 6, 3, 2, 2, 2, 152, 153, 7, 127, 2, 2, 153, 8, 3, 2, 2, 2, 154, 155, 7, 101, 2, 2, 155, 156, 7, 113, 2, 2, 156, 157, 7, 112, 2, 2, 157, 158, 7, 117, 2, 2, 158, 159, 7, 118, 2, 2, 159, 10, 3, 2, 2, 2, 160, 161, 7, 60, 2, 2, 161, 12, 3, 2, 2, 2, 162, 163, 7, 120, 2, 2, 163, 164, 7, 99, 2, 2, 164, 165, 7, 116, 2, 2, 165, 14, 3, 2, 2, 2, 166, 167, 7, 99, 2, 2, 167, 168, 7, 117, 2, 2, 168, 169, 7, 117, 2, 2, 169, 170, 7, 119, 2, 2, 170, 171, 7, 111, 2, 2, 171, 172, 7, 103, 2, 2, 172, 16, 3, 2, 2, 2, 173, 174, 7, 46, 2, 2, 174, 18, 3, 2, 2, 2, 175, 176, 7, 61, 2, 2, 176, 20, 3, 2, 2, 2, 177, 178, 7, 118, 2, 2, 178, 179, 7, 123, 2, 2, 179, 180, 7, 114, 2, 2, 180, 181, 7, 103, 2, 2, 181, 22, 3, 2, 2, 2, 182, 183, 7, 93, 2, 2, 183, 24, 3, 2, 2, 2, 184, 185, 7, 95, 2, 2, 185, 26, 3, 2, 2, 2, 186, 187, 7, 126, 2, 2, 187, 28, 3, 2, 2, 2, 188, 189, 7, 112, 2, 2, 189, 190, 7, 113, 2, 2, 190, 191, 7, 112, 2, 2, 191, 192, 7, 102, 2, 2, 192, 193, 7, 103, 2, 2, 193, 194, 7, 118, 2, 2, 194, 30, 3, 2, 2, 2, 195, 196, 7, 120, 2, 2, 196, 197, 7, 99, 2, 2, 197, 198, 7, 110, 2, 2, 198, 32, 3, 2, 2, 2, 199, 200, 7, 102, 2, 2, 200, 201, 7, 103, 2, 2, 201, 202, 7, 104, 2, 2, 202, 34, 3, 2, 2, 2, 203, 204, 7, 114, 2, 2, 204, 205, 7, 119, 2, 2, 205, 206, 7, 116, 2, 2, 206, 207, 7, 103, 2, 2, 207, 36, 3, 2, 2, 2, 208, 209, 7, 99, 2, 2, 209, 210, 7, 101, 2, 2, 210, 211, 7, 118, 2, 2, 211, 212, 7, 107, 2, 2, 212, 213, 7, 113, 2, 2, 213, 214, 7, 112, 2, 2, 214, 38, 3, 2, 2, 2, 215, 216, 7, 116, 2, 2, 216, 217, 7, 119, 2, 2, 217, 218, 7, 112, 2, 2, 218, 40, 3, 2, 2, 2, 219, 220, 7, 118, 2, 2, 220, 221, 7, 103, 2, 2, 221, 222, 7, 111, 2, 2, 222, 223, 7, 114, 2, 2, 223, 224, 7, 113, 2, 2, 224, 225, 7, 116, 2, 2, 225, 226, 7, 99, 2, 2, 226, 227, 7, 110, 2, 2, 227, 42, 3, 2, 2, 2, 228, 229, 7, 107, 2, 2, 229, 230, 7, 111, 2, 2, 230, 231, 7, 114, 2, 2, 231, 232, 7, 113, 2, 2, 232, 233, 7, 116, 2, 2, 233, 234, 7, 118, 2, 2, 234, 44, 3, 2, 2, 2, 235, 236, 7, 48, 2, 2, 236, 46, 3, 2, 2, 2, 237, 238, 7, 104, 2, 2, 238, 239, 7, 116, 2, 2, 239, 240, 7, 113, 2, 2, 240, 241, 7, 111, 2, 2, 241, 48, 3, 2, 2, 2, 242, 243, 7, 99, 2, 2, 243, 244, 7, 117, 2, 2, 244, 50, 3, 2, 2, 2, 245, 246, 7, 103, 2, 2, 246, 247, 7, 122, 2, 2, 247, 248, 7, 114, 2, 2, 248, 249, 7, 113, 2, 2, 249, 250, 7, 116, 2, 2, 250, 251, 7, 118, 2, 2, 251, 52, 3, 2, 2, 2, 252, 253, 7, 47, 2, 2, 253, 254, 7, 64, 2, 2, 254, 54, 3, 2, 2, 2, 255, 256, 7, 63, 2, 2, 256, 257, 7, 64, 2, 2, 257, 56, 3, 2, 2, 2, 258, 259, 7, 107, 2, 2, 259, 260, 7, 112, 2, 2, 260, 261, 7, 118, 2, 2, 261, 58, 3, 2, 2, 2, 262, 263, 7, 117, 2, 2, 263, 264, 7, 118, 2, 2, 264, 265, 7, 116, 2, 2, 265, 60, 3, 2, 2, 2, 266, 267, 7, 100, 2, 2, 267, 268, 7, 113, 2, 2, 268, 269, 7, 113, 2, 2, 269, 270, 7, 110, 2, 2, 270, 62, 3, 2, 2, 2, 271, 272, 7, 96, 2, 2, 272, 64, 3, 2, 2, 2, 273, 274, 7, 41, 2, 2, 274, 66, 3, 2, 2, 2, 275, 276, 7, 99, 2, 2, 276, 277, 7, 110, 2, 2, 277, 278, 7, 110, 2, 2, 278, 68, 3, 2, 2, 2, 279, 280, 7, 99, 2, 2, 280, 281, 7, 112, 2, 2, 281, 282, 7, 123, 2, 2, 282, 70, 3, 2, 2, 2, 283, 284, 7, 107, 2, 2, 284, 285, 7, 104, 2, 2, 285, 72, 3, 2, 2, 2, 286, 287, 7, 103, 2, 2, 287, 288, 7, 110, 2, 2, 288, 289, 7, 117, 2, 2, 289, 290, 7, 103, 2, 2, 290, 74, 3, 2, 2, 2, 291, 292, 7, 97, 2, 2, 292, 76, 3, 2, 2, 2, 293, 294, 7, 48, 2, 2, 294, 295, 7, 48, 2, 2, 295, 296, 7, 48, 2, 2, 296, 78, 3, 2, 2, 2, 297, 298, 7, 60, 2, 2, 298, 299, 7, 60, 2, 2, 299, 80, 3, 2, 2, 2, 300, 304, 7, 36, 2, 2, 301, 303, 11, 2, 2, 2, 302, 301, 3, 2, 2, 2, 303, 306, 3, 2, 2, 2, 304, 305, 3, 2, 2, 2, 304, 302, 3, 2, 2, 2, 305, 307, 3, 2, 2, 2, 306, 304, 3, 2, 2, 2, 307, 308, 7, 36, 2, 2, 308, 82, 3, 2, 2, 2, 309, 310, 7, 104, 2, 2, 310, 311, 7, 99, 2, 2, 311, 312, 7, 110, 2, 2, 312, 313, 7, 117, 2, 2, 313, 319, 7, 103, 2, 2, 314, 315, 7, 118, 2, 2, 315, 316, 7, 116, 2, 2, 316, 317, 7, 119, 2, 2, 317, 319, 7, 103, 2, 2, 318, 309, 3, 2, 2, 2, 318, 314, 3, 2, 2, 2, 319, 84, 3, 2, 2, 2, 320, 343, 7, 50, 2, 2, 321, 327, 9, 2, 2, 2, 322, 326, 9, 3, 2, 2, 323, 324, 7, 97, 2, 2, 324, 326, 9, 3, 2, 2, 325, 322, 3, 2, 2, 2, 325, 323, 3, 2, 2, 2, 326, 329, 3, 2, 2, 2, 327, 325, 3, 2, 2, 2, 327, 328, 3, 2, 2, 2, 328, 343, 3, 2, 2, 2, 329, 327, 3, 2, 2, 2, 330, 331, 7, 50, 2, 2, 331, 332, 7, 122, 2, 2, 332, 333, 3, 2, 2, 2, 333, 339, 9, 4, 2, 2, 334, 338, 9, 4, 2, 2, 335, 336, 7, 97, 2, 2, 336, 338, 9, 4, 2, 2, 337, 334, 3, 2, 2, 2, 337, 335, 3, 2, 2, 2, 338, 341, 3, 2, 2, 2, 339, 337, 3, 2, 2, 2, 339, 340, 3, 2, 2, 2, 340, 343, 3, 2, 2, 2, 341, 339, 3, 2, 2, 2, 342, 320, 3, 2, 2, 2, 342, 321, 3, 2, 2, 2, 342, 330, 3, 2, 2, 2, 343, 86, 3, 2, 2, 2, 344, 345, 7, 99, 2, 2, 345, 346, 7, 112, 2, 2, 346, 347, 7, 102, 2, 2, 347, 88, 3, 2, 2, 2, 348, 349, 7, 113, 2, 2, 349, 350, 7, 116, 2, 2, 350, 90, 3, 2, 2, 2, 351, 352, 7, 107, 2, 2, 352, 353, 7, 104, 2, 2, 353, 354, 7, 104, 2, 2, 354, 92, 3, 2, 2, 2, 355, 356, 7, 107, 2, 2, 356, 357, 7, 111, 2, 2, 357, 358, 7, 114, 2, 2, 358, 359, 7, 110, 2, 2, 359, 360, 7, 107, 2, 2, 360, 361, 7, 103, 2, 2, 361, 362, 7, 117, 2, 2, 362, 94, 3, 2, 2, 2, 363, 364, 7, 79, 2, 2, 364, 365, 7, 99, 2, 2, 365, 366, 7, 114, 2, 2, 366, 96, 3, 2, 2, 2, 367, 368, 7, 111, 2, 2, 368, 369, 7, 99, 2, 2, 369, 370, 7, 118, 2, 2, 370, 371, 7, 101, 2, 2, 371, 372, 7, 106, 2, 2, 372, 98, 3, 2, 2, 2, 373, 374, 7, 45, 2, 2, 374, 100, 3, 2, 2, 2, 375, 376, 7, 47, 2, 2, 376, 102, 3, 2, 2, 2, 377, 378, 7, 44, 2, 2, 378, 104, 3, 2, 2, 2, 379, 380, 7, 49, 2, 2, 380, 106, 3, 2, 2, 2, 381, 382, 7, 39, 2, 2, 382, 108, 3, 2, 2, 2, 383, 384, 7, 64, 2, 2, 384, 110, 3, 2, 2, 2, 385, 386, 7, 62, 2, 2, 386, 112, 3, 2, 2, 2, 387, 388, 7, 64, 2, 2, 388, 389, 7, 63, 2, 2, 389, 114, 3, 2, 2, 2, 390, 391, 7, 62, 2, 2, 391, 392, 7, 63, 2, 2, 392, 116, 3, 2, 2, 2, 393, 394, 7, 35, 2, 2, 394, 395, 7, 63, 2, 2, 395, 118, 3, 2, 2, 2, 396, 397, 7, 63, 2, 2, 397, 398, 7, 63, 2, 2, 398, 120, 3, 2, 2, 2, 399, 400, 7, 63, 2, 2, 400, 122, 3, 2, 2, 2, 401, 402, 7, 42, 2, 2, 402, 124, 3, 2, 2, 2, 403, 404, 7, 43, 2, 2, 404, 126, 3, 2, 2, 2, 405, 406, 7, 85, 2, 2, 406, 407, 7, 103, 2, 2, 407, 408, 7, 118, 2, 2, 408, 128, 3, 2, 2, 2, 409, 410, 7, 78, 2, 2, 410, 411, 7, 107, 2, 2, 411, 412, 7, 117, 2, 2, 412, 413, 7, 118, 2, 2, 413, 130, 3, 2, 2, 2, 414, 418, 9, 5, 2, 2, 415, 417, 9, 6, 2, 2, 416, 415, 3, 2, 2, 2, 417, 420, 3, 2, 2, 2, 418, 416, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 428, 3, 2, 2, 2, 420, 418, 3, 2, 2, 2, 421, 423, 9, 7, 2, 2, 422, 424, 9, 6, 2, 2, 423, 422, 3, 2, 2, 2, 424, 425, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 428, 3, 2, 2, 2, 427, 414, 3, 2, 2, 2, 427, 421, 3, 2, 2, 2, 428, 132, 3, 2, 2, 2, 429, 433, 9, 8, 2, 2, 430, 432, 9, 6, 2, 2, 431, 430, 3, 2, 2, 2, 432, 435, 3, 2, 2, 2, 433, 431, 3, 2, 2, 2, 433, 434, 3, 2, 2, 2, 434, 443, 3, 2, 2, 2, 435, 433, 3, 2, 2, 2, 436, 438, 9, 7, 2, 2, 437, 439, 9, 6, 2, 2, 438, 437, 3, 2, 2, 2, 439, 440, 3, 2, 2, 2, 440, 438, 3, 2, 2, 2, 440, 441, 3, 2, 2, 2, 441, 443, 3, 2, 2, 2, 442, 429, 3, 2, 2, 2, 442, 436, 3, 2, 2, 2, 443, 134, 3, 2, 2, 2, 444, 445, 7, 49, 2, 2, 445, 446, 7, 49, 2, 2, 446, 447, 7, 49, 2, 2, 447, 451, 3, 2, 2, 2, 448, 450, 11, 2, 2, 2, 449, 448, 3, 2, 2, 2, 450, 453, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 451, 449, 3, 2, 2, 2, 452, 454, 3, 2, 2, 2, 453, 451, 3, 2, 2, 2, 454, 455, 7, 12, 2, 2, 455, 136, 3, 2, 2, 2, 456, 457, 7, 49, 2, 2, 457, 458, 7, 49, 2, 2, 458, 462, 3, 2, 2, 2, 459, 461, 11, 2, 2, 2, 460, 459, 3, 2, 2, 2, 461, 464, 3, 2, 2, 2, 462, 463, 3, 2, 2, 2, 462, 460, 3, 2, 2, 2, 463, 465, 3, 2, 2, 2, 464, 462, 3, 2, 2, 2, 465, 466, 7, 12, 2, 2, 466, 467, 3, 2, 2, 2, 467, 468, 8, 69, 2, 2, 468, 138, 3, 2, 2, 2, 469, 470, 7, 49, 2, 2, 470, 471, 7, 44, 2, 2, 471, 475, 3, 2, 2, 2, 472, 474, 11, 2, 2, 2, 473, 472, 3, 2, 2, 2, 474, 477, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 475, 473, 3, 2, 2, 2, 476, 478, 3, 2, 2, 2, 477, 475, 3, 2, 2, 2, 478, 479, 7, 44, 2, 2, 479, 480, 7, 49, 2, 2, 480, 481, 3, 2, 2, 2, 481, 482, 8, 70, 2, 2, 482, 140, 3, 2, 2, 2, 483, 485, 9, 9, 2, 2, 484, 483, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 484, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 489, 8, 71, 2, 2, 489, 142, 3, 2, 2, 2, 20, 2, 304, 318, 325, 327, 337, 339, 342, 418, 425, 427, 433, 440, 442, 451, 462, 475, 486, 3, 8, 2, 2] \ No newline at end of file diff --git a/quint/src/generated/QuintLexer.tokens b/quint/src/generated/QuintLexer.tokens index a3529881a..c8362598c 100644 --- a/quint/src/generated/QuintLexer.tokens +++ b/quint/src/generated/QuintLexer.tokens @@ -44,24 +44,24 @@ AND=43 OR=44 IFF=45 IMPLIES=46 -SET=47 -LIST=48 -MAP=49 -MATCH=50 -PLUS=51 -MINUS=52 -MUL=53 -DIV=54 -MOD=55 -GT=56 -LT=57 -GE=58 -LE=59 -NE=60 -EQ=61 -ASGN=62 -LPAREN=63 -RPAREN=64 +MAP=47 +MATCH=48 +PLUS=49 +MINUS=50 +MUL=51 +DIV=52 +MOD=53 +GT=54 +LT=55 +GE=56 +LE=57 +NE=58 +EQ=59 +ASGN=60 +LPAREN=61 +RPAREN=62 +SET=63 +LIST=64 LOW_ID=65 CAP_ID=66 DOCCOMMENT=67 @@ -78,23 +78,23 @@ WS=70 ','=8 ';'=9 'type'=10 -'|'=11 -'nondet'=12 -'val'=13 -'def'=14 -'pure'=15 -'action'=16 -'run'=17 -'temporal'=18 -'import'=19 -'.'=20 -'from'=21 -'as'=22 -'export'=23 -'->'=24 -'=>'=25 -'['=26 -']'=27 +'['=11 +']'=12 +'|'=13 +'nondet'=14 +'val'=15 +'def'=16 +'pure'=17 +'action'=18 +'run'=19 +'temporal'=20 +'import'=21 +'.'=22 +'from'=23 +'as'=24 +'export'=25 +'->'=26 +'=>'=27 'int'=28 'str'=29 'bool'=30 @@ -111,21 +111,21 @@ WS=70 'or'=44 'iff'=45 'implies'=46 -'Set'=47 -'List'=48 -'Map'=49 -'match'=50 -'+'=51 -'-'=52 -'*'=53 -'/'=54 -'%'=55 -'>'=56 -'<'=57 -'>='=58 -'<='=59 -'!='=60 -'=='=61 -'='=62 -'('=63 -')'=64 +'Map'=47 +'match'=48 +'+'=49 +'-'=50 +'*'=51 +'/'=52 +'%'=53 +'>'=54 +'<'=55 +'>='=56 +'<='=57 +'!='=58 +'=='=59 +'='=60 +'('=61 +')'=62 +'Set'=63 +'List'=64 diff --git a/quint/src/generated/QuintLexer.ts b/quint/src/generated/QuintLexer.ts index a2ccaf0ee..21060e0dd 100644 --- a/quint/src/generated/QuintLexer.ts +++ b/quint/src/generated/QuintLexer.ts @@ -68,24 +68,24 @@ export class QuintLexer extends Lexer { public static readonly OR = 44; public static readonly IFF = 45; public static readonly IMPLIES = 46; - public static readonly SET = 47; - public static readonly LIST = 48; - public static readonly MAP = 49; - public static readonly MATCH = 50; - public static readonly PLUS = 51; - public static readonly MINUS = 52; - public static readonly MUL = 53; - public static readonly DIV = 54; - public static readonly MOD = 55; - public static readonly GT = 56; - public static readonly LT = 57; - public static readonly GE = 58; - public static readonly LE = 59; - public static readonly NE = 60; - public static readonly EQ = 61; - public static readonly ASGN = 62; - public static readonly LPAREN = 63; - public static readonly RPAREN = 64; + public static readonly MAP = 47; + public static readonly MATCH = 48; + public static readonly PLUS = 49; + public static readonly MINUS = 50; + public static readonly MUL = 51; + public static readonly DIV = 52; + public static readonly MOD = 53; + public static readonly GT = 54; + public static readonly LT = 55; + public static readonly GE = 56; + public static readonly LE = 57; + public static readonly NE = 58; + public static readonly EQ = 59; + public static readonly ASGN = 60; + public static readonly LPAREN = 61; + public static readonly RPAREN = 62; + public static readonly SET = 63; + public static readonly LIST = 64; public static readonly LOW_ID = 65; public static readonly CAP_ID = 66; public static readonly DOCCOMMENT = 67; @@ -109,21 +109,21 @@ export class QuintLexer extends Lexer { "T__17", "T__18", "T__19", "T__20", "T__21", "T__22", "T__23", "T__24", "T__25", "T__26", "T__27", "T__28", "T__29", "T__30", "T__31", "T__32", "T__33", "T__34", "T__35", "T__36", "T__37", "T__38", "STRING", "BOOL", - "INT", "AND", "OR", "IFF", "IMPLIES", "SET", "LIST", "MAP", "MATCH", "PLUS", - "MINUS", "MUL", "DIV", "MOD", "GT", "LT", "GE", "LE", "NE", "EQ", "ASGN", - "LPAREN", "RPAREN", "LOW_ID", "CAP_ID", "DOCCOMMENT", "LINE_COMMENT", + "INT", "AND", "OR", "IFF", "IMPLIES", "MAP", "MATCH", "PLUS", "MINUS", + "MUL", "DIV", "MOD", "GT", "LT", "GE", "LE", "NE", "EQ", "ASGN", "LPAREN", + "RPAREN", "SET", "LIST", "LOW_ID", "CAP_ID", "DOCCOMMENT", "LINE_COMMENT", "COMMENT", "WS", ]; private static readonly _LITERAL_NAMES: Array = [ undefined, "'module'", "'{'", "'}'", "'const'", "':'", "'var'", "'assume'", - "','", "';'", "'type'", "'|'", "'nondet'", "'val'", "'def'", "'pure'", - "'action'", "'run'", "'temporal'", "'import'", "'.'", "'from'", "'as'", - "'export'", "'->'", "'=>'", "'['", "']'", "'int'", "'str'", "'bool'", - "'^'", "'''", "'all'", "'any'", "'if'", "'else'", "'_'", "'...'", "'::'", - undefined, undefined, undefined, "'and'", "'or'", "'iff'", "'implies'", - "'Set'", "'List'", "'Map'", "'match'", "'+'", "'-'", "'*'", "'/'", "'%'", - "'>'", "'<'", "'>='", "'<='", "'!='", "'=='", "'='", "'('", "')'", + "','", "';'", "'type'", "'['", "']'", "'|'", "'nondet'", "'val'", "'def'", + "'pure'", "'action'", "'run'", "'temporal'", "'import'", "'.'", "'from'", + "'as'", "'export'", "'->'", "'=>'", "'int'", "'str'", "'bool'", "'^'", + "'''", "'all'", "'any'", "'if'", "'else'", "'_'", "'...'", "'::'", undefined, + undefined, undefined, "'and'", "'or'", "'iff'", "'implies'", "'Map'", + "'match'", "'+'", "'-'", "'*'", "'/'", "'%'", "'>'", "'<'", "'>='", "'<='", + "'!='", "'=='", "'='", "'('", "')'", "'Set'", "'List'", ]; private static readonly _SYMBOLIC_NAMES: Array = [ undefined, undefined, undefined, undefined, undefined, undefined, undefined, @@ -132,9 +132,9 @@ export class QuintLexer extends Lexer { undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, "STRING", "BOOL", - "INT", "AND", "OR", "IFF", "IMPLIES", "SET", "LIST", "MAP", "MATCH", "PLUS", - "MINUS", "MUL", "DIV", "MOD", "GT", "LT", "GE", "LE", "NE", "EQ", "ASGN", - "LPAREN", "RPAREN", "LOW_ID", "CAP_ID", "DOCCOMMENT", "LINE_COMMENT", + "INT", "AND", "OR", "IFF", "IMPLIES", "MAP", "MATCH", "PLUS", "MINUS", + "MUL", "DIV", "MOD", "GT", "LT", "GE", "LE", "NE", "EQ", "ASGN", "LPAREN", + "RPAREN", "SET", "LIST", "LOW_ID", "CAP_ID", "DOCCOMMENT", "LINE_COMMENT", "COMMENT", "WS", ]; public static readonly VOCABULARY: Vocabulary = new VocabularyImpl(QuintLexer._LITERAL_NAMES, QuintLexer._SYMBOLIC_NAMES, []); @@ -183,215 +183,216 @@ export class QuintLexer extends Lexer { "\x03\x03\x03\x03\x04\x03\x04\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03" + "\x05\x03\x06\x03\x06\x03\x07\x03\x07\x03\x07\x03\x07\x03\b\x03\b\x03\b" + "\x03\b\x03\b\x03\b\x03\b\x03\t\x03\t\x03\n\x03\n\x03\v\x03\v\x03\v\x03" + - "\v\x03\v\x03\f\x03\f\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\x0E" + - "\x03\x0E\x03\x0E\x03\x0E\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x10\x03\x10" + - "\x03\x10\x03\x10\x03\x10\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11" + - "\x03\x11\x03\x12\x03\x12\x03\x12\x03\x12\x03\x13\x03\x13\x03\x13\x03\x13" + - "\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x14\x03\x14\x03\x14\x03\x14" + - "\x03\x14\x03\x14\x03\x14\x03\x15\x03\x15\x03\x16\x03\x16\x03\x16\x03\x16" + - "\x03\x16\x03\x17\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x19\x03\x19\x03\x19\x03\x1A\x03\x1A\x03\x1A\x03\x1B" + - "\x03\x1B\x03\x1C\x03\x1C\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x03\x1E\x03\x1E" + - "\x03\x1E\x03\x1E\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03 \x03 \x03" + - "!\x03!\x03\"\x03\"\x03\"\x03\"\x03#\x03#\x03#\x03#\x03$\x03$\x03$\x03" + - "%\x03%\x03%\x03%\x03%\x03&\x03&\x03\'\x03\'\x03\'\x03\'\x03(\x03(\x03" + - "(\x03)\x03)\x07)\u012F\n)\f)\x0E)\u0132\v)\x03)\x03)\x03*\x03*\x03*\x03" + - "*\x03*\x03*\x03*\x03*\x03*\x05*\u013F\n*\x03+\x03+\x03+\x03+\x03+\x07" + - "+\u0146\n+\f+\x0E+\u0149\v+\x03+\x03+\x03+\x03+\x03+\x03+\x03+\x07+\u0152" + - "\n+\f+\x0E+\u0155\v+\x05+\u0157\n+\x03,\x03,\x03,\x03,\x03-\x03-\x03-" + - "\x03.\x03.\x03.\x03.\x03/\x03/\x03/\x03/\x03/\x03/\x03/\x03/\x030\x03" + - "0\x030\x030\x031\x031\x031\x031\x031\x032\x032\x032\x032\x033\x033\x03" + - "3\x033\x033\x033\x034\x034\x035\x035\x036\x036\x037\x037\x038\x038\x03" + - "9\x039\x03:\x03:\x03;\x03;\x03;\x03<\x03<\x03<\x03=\x03=\x03=\x03>\x03" + - ">\x03>\x03?\x03?\x03@\x03@\x03A\x03A\x03B\x03B\x07B\u01A1\nB\fB\x0EB\u01A4" + - "\vB\x03B\x03B\x06B\u01A8\nB\rB\x0EB\u01A9\x05B\u01AC\nB\x03C\x03C\x07" + - "C\u01B0\nC\fC\x0EC\u01B3\vC\x03C\x03C\x06C\u01B7\nC\rC\x0EC\u01B8\x05" + - "C\u01BB\nC\x03D\x03D\x03D\x03D\x03D\x07D\u01C2\nD\fD\x0ED\u01C5\vD\x03" + - "D\x03D\x03E\x03E\x03E\x03E\x07E\u01CD\nE\fE\x0EE\u01D0\vE\x03E\x03E\x03" + - "E\x03E\x03F\x03F\x03F\x03F\x07F\u01DA\nF\fF\x0EF\u01DD\vF\x03F\x03F\x03" + - "F\x03F\x03F\x03G\x06G\u01E5\nG\rG\x0EG\u01E6\x03G\x03G\x06\u0130\u01C3" + - "\u01CE\u01DB\x02\x02H\x03\x02\x03\x05\x02\x04\x07\x02\x05\t\x02\x06\v" + - "\x02\x07\r\x02\b\x0F\x02\t\x11\x02\n\x13\x02\v\x15\x02\f\x17\x02\r\x19" + - "\x02\x0E\x1B\x02\x0F\x1D\x02\x10\x1F\x02\x11!\x02\x12#\x02\x13%\x02\x14" + - "\'\x02\x15)\x02\x16+\x02\x17-\x02\x18/\x02\x191\x02\x1A3\x02\x1B5\x02" + - "\x1C7\x02\x1D9\x02\x1E;\x02\x1F=\x02 ?\x02!A\x02\"C\x02#E\x02$G\x02%I" + - "\x02&K\x02\'M\x02(O\x02)Q\x02*S\x02+U\x02,W\x02-Y\x02.[\x02/]\x020_\x02" + - "1a\x022c\x023e\x024g\x025i\x026k\x027m\x028o\x029q\x02:s\x02;u\x02{\x02?}\x02@\x7F\x02A\x81\x02B\x83\x02C\x85\x02D\x87\x02E\x89\x02" + - "F\x8B\x02G\x8D\x02H\x03\x02\n\x03\x023;\x03\x022;\x05\x022;CHch\x03\x02" + - "c|\x06\x022;C\\aac|\x03\x02aa\x03\x02C\\\x05\x02\v\f\x0F\x0F\"\"\x02\u01FB" + - "\x02\x03\x03\x02\x02\x02\x02\x05\x03\x02\x02\x02\x02\x07\x03\x02\x02\x02" + - "\x02\t\x03\x02\x02\x02\x02\v\x03\x02\x02\x02\x02\r\x03\x02\x02\x02\x02" + - "\x0F\x03\x02\x02\x02\x02\x11\x03\x02\x02\x02\x02\x13\x03\x02\x02\x02\x02" + - "\x15\x03\x02\x02\x02\x02\x17\x03\x02\x02\x02\x02\x19\x03\x02\x02\x02\x02" + - "\x1B\x03\x02\x02\x02\x02\x1D\x03\x02\x02\x02\x02\x1F\x03\x02\x02\x02\x02" + - "!\x03\x02\x02\x02\x02#\x03\x02\x02\x02\x02%\x03\x02\x02\x02\x02\'\x03" + - "\x02\x02\x02\x02)\x03\x02\x02\x02\x02+\x03\x02\x02\x02\x02-\x03\x02\x02" + - "\x02\x02/\x03\x02\x02\x02\x021\x03\x02\x02\x02\x023\x03\x02\x02\x02\x02" + - "5\x03\x02\x02\x02\x027\x03\x02\x02\x02\x029\x03\x02\x02\x02\x02;\x03\x02" + - "\x02\x02\x02=\x03\x02\x02\x02\x02?\x03\x02\x02\x02\x02A\x03\x02\x02\x02" + - "\x02C\x03\x02\x02\x02\x02E\x03\x02\x02\x02\x02G\x03\x02\x02\x02\x02I\x03" + - "\x02\x02\x02\x02K\x03\x02\x02\x02\x02M\x03\x02\x02\x02\x02O\x03\x02\x02" + - "\x02\x02Q\x03\x02\x02\x02\x02S\x03\x02\x02\x02\x02U\x03\x02\x02\x02\x02" + - "W\x03\x02\x02\x02\x02Y\x03\x02\x02\x02\x02[\x03\x02\x02\x02\x02]\x03\x02" + - "\x02\x02\x02_\x03\x02\x02\x02\x02a\x03\x02\x02\x02\x02c\x03\x02\x02\x02" + - "\x02e\x03\x02\x02\x02\x02g\x03\x02\x02\x02\x02i\x03\x02\x02\x02\x02k\x03" + - "\x02\x02\x02\x02m\x03\x02\x02\x02\x02o\x03\x02\x02\x02\x02q\x03\x02\x02" + - "\x02\x02s\x03\x02\x02\x02\x02u\x03\x02\x02\x02\x02w\x03\x02\x02\x02\x02" + - "y\x03\x02\x02\x02\x02{\x03\x02\x02\x02\x02}\x03\x02\x02\x02\x02\x7F\x03" + - "\x02\x02\x02\x02\x81\x03\x02\x02\x02\x02\x83\x03\x02\x02\x02\x02\x85\x03" + - "\x02\x02\x02\x02\x87\x03\x02\x02\x02\x02\x89\x03\x02\x02\x02\x02\x8B\x03" + - "\x02\x02\x02\x02\x8D\x03\x02\x02\x02\x03\x8F\x03\x02\x02\x02\x05\x96\x03" + - "\x02\x02\x02\x07\x98\x03\x02\x02\x02\t\x9A\x03\x02\x02\x02\v\xA0\x03\x02" + - "\x02\x02\r\xA2\x03\x02\x02\x02\x0F\xA6\x03\x02\x02\x02\x11\xAD\x03\x02" + - "\x02\x02\x13\xAF\x03\x02\x02\x02\x15\xB1\x03\x02\x02\x02\x17\xB6\x03\x02" + - "\x02\x02\x19\xB8\x03\x02\x02\x02\x1B\xBF\x03\x02\x02\x02\x1D\xC3\x03\x02" + - "\x02\x02\x1F\xC7\x03\x02\x02\x02!\xCC\x03\x02\x02\x02#\xD3\x03\x02\x02" + - "\x02%\xD7\x03\x02\x02\x02\'\xE0\x03\x02\x02\x02)\xE7\x03\x02\x02\x02+" + - "\xE9\x03\x02\x02\x02-\xEE\x03\x02\x02\x02/\xF1\x03\x02\x02\x021\xF8\x03" + - "\x02\x02\x023\xFB\x03\x02\x02\x025\xFE\x03\x02\x02\x027\u0100\x03\x02" + - "\x02\x029\u0102\x03\x02\x02\x02;\u0106\x03\x02\x02\x02=\u010A\x03\x02" + - "\x02\x02?\u010F\x03\x02\x02\x02A\u0111\x03\x02\x02\x02C\u0113\x03\x02" + - "\x02\x02E\u0117\x03\x02\x02\x02G\u011B\x03\x02\x02\x02I\u011E\x03\x02" + - "\x02\x02K\u0123\x03\x02\x02\x02M\u0125\x03\x02\x02\x02O\u0129\x03\x02" + - "\x02\x02Q\u012C\x03\x02\x02\x02S\u013E\x03\x02\x02\x02U\u0156\x03\x02" + - "\x02\x02W\u0158\x03\x02\x02\x02Y\u015C\x03\x02\x02\x02[\u015F\x03\x02" + - "\x02\x02]\u0163\x03\x02\x02\x02_\u016B\x03\x02\x02\x02a\u016F\x03\x02" + - "\x02\x02c\u0174\x03\x02\x02\x02e\u0178\x03\x02\x02\x02g\u017E\x03\x02" + - "\x02\x02i\u0180\x03\x02\x02\x02k\u0182\x03\x02\x02\x02m\u0184\x03\x02" + - "\x02\x02o\u0186\x03\x02\x02\x02q\u0188\x03\x02\x02\x02s\u018A\x03\x02" + - "\x02\x02u\u018C\x03\x02\x02\x02w\u018F\x03\x02\x02\x02y\u0192\x03\x02" + - "\x02\x02{\u0195\x03\x02\x02\x02}\u0198\x03\x02\x02\x02\x7F\u019A\x03\x02" + - "\x02\x02\x81\u019C\x03\x02\x02\x02\x83\u01AB\x03\x02\x02\x02\x85\u01BA" + - "\x03\x02\x02\x02\x87\u01BC\x03\x02\x02\x02\x89\u01C8\x03\x02\x02\x02\x8B" + - "\u01D5\x03\x02\x02\x02\x8D\u01E4\x03\x02\x02\x02\x8F\x90\x07o\x02\x02" + - "\x90\x91\x07q\x02\x02\x91\x92\x07f\x02\x02\x92\x93\x07w\x02\x02\x93\x94" + - "\x07n\x02\x02\x94\x95\x07g\x02\x02\x95\x04\x03\x02\x02\x02\x96\x97\x07" + - "}\x02\x02\x97\x06\x03\x02\x02\x02\x98\x99\x07\x7F\x02\x02\x99\b\x03\x02" + - "\x02\x02\x9A\x9B\x07e\x02\x02\x9B\x9C\x07q\x02\x02\x9C\x9D\x07p\x02\x02" + - "\x9D\x9E\x07u\x02\x02\x9E\x9F\x07v\x02\x02\x9F\n\x03\x02\x02\x02\xA0\xA1" + - "\x07<\x02\x02\xA1\f\x03\x02\x02\x02\xA2\xA3\x07x\x02\x02\xA3\xA4\x07c" + - "\x02\x02\xA4\xA5\x07t\x02\x02\xA5\x0E\x03\x02\x02\x02\xA6\xA7\x07c\x02" + - "\x02\xA7\xA8\x07u\x02\x02\xA8\xA9\x07u\x02\x02\xA9\xAA\x07w\x02\x02\xAA" + - "\xAB\x07o\x02\x02\xAB\xAC\x07g\x02\x02\xAC\x10\x03\x02\x02\x02\xAD\xAE" + - "\x07.\x02\x02\xAE\x12\x03\x02\x02\x02\xAF\xB0\x07=\x02\x02\xB0\x14\x03" + - "\x02\x02\x02\xB1\xB2\x07v\x02\x02\xB2\xB3\x07{\x02\x02\xB3\xB4\x07r\x02" + - "\x02\xB4\xB5\x07g\x02\x02\xB5\x16\x03\x02\x02\x02\xB6\xB7\x07~\x02\x02" + - "\xB7\x18\x03\x02\x02\x02\xB8\xB9\x07p\x02\x02\xB9\xBA\x07q\x02\x02\xBA" + - "\xBB\x07p\x02\x02\xBB\xBC\x07f\x02\x02\xBC\xBD\x07g\x02\x02\xBD\xBE\x07" + - "v\x02\x02\xBE\x1A\x03\x02\x02\x02\xBF\xC0\x07x\x02\x02\xC0\xC1\x07c\x02" + - "\x02\xC1\xC2\x07n\x02\x02\xC2\x1C\x03\x02\x02\x02\xC3\xC4\x07f\x02\x02" + - "\xC4\xC5\x07g\x02\x02\xC5\xC6\x07h\x02\x02\xC6\x1E\x03\x02\x02\x02\xC7" + - "\xC8\x07r\x02\x02\xC8\xC9\x07w\x02\x02\xC9\xCA\x07t\x02\x02\xCA\xCB\x07" + - "g\x02\x02\xCB \x03\x02\x02\x02\xCC\xCD\x07c\x02\x02\xCD\xCE\x07e\x02\x02" + - "\xCE\xCF\x07v\x02\x02\xCF\xD0\x07k\x02\x02\xD0\xD1\x07q\x02\x02\xD1\xD2" + - "\x07p\x02\x02\xD2\"\x03\x02\x02\x02\xD3\xD4\x07t\x02\x02\xD4\xD5\x07w" + - "\x02\x02\xD5\xD6\x07p\x02\x02\xD6$\x03\x02\x02\x02\xD7\xD8\x07v\x02\x02" + - "\xD8\xD9\x07g\x02\x02\xD9\xDA\x07o\x02\x02\xDA\xDB\x07r\x02\x02\xDB\xDC" + - "\x07q\x02\x02\xDC\xDD\x07t\x02\x02\xDD\xDE\x07c\x02\x02\xDE\xDF\x07n\x02" + - "\x02\xDF&\x03\x02\x02\x02\xE0\xE1\x07k\x02\x02\xE1\xE2\x07o\x02\x02\xE2" + - "\xE3\x07r\x02\x02\xE3\xE4\x07q\x02\x02\xE4\xE5\x07t\x02\x02\xE5\xE6\x07" + - "v\x02\x02\xE6(\x03\x02\x02\x02\xE7\xE8\x070\x02\x02\xE8*\x03\x02\x02\x02" + - "\xE9\xEA\x07h\x02\x02\xEA\xEB\x07t\x02\x02\xEB\xEC\x07q\x02\x02\xEC\xED" + - "\x07o\x02\x02\xED,\x03\x02\x02\x02\xEE\xEF\x07c\x02\x02\xEF\xF0\x07u\x02" + - "\x02\xF0.\x03\x02\x02\x02\xF1\xF2\x07g\x02\x02\xF2\xF3\x07z\x02\x02\xF3" + - "\xF4\x07r\x02\x02\xF4\xF5\x07q\x02\x02\xF5\xF6\x07t\x02\x02\xF6\xF7\x07" + - "v\x02\x02\xF70\x03\x02\x02\x02\xF8\xF9\x07/\x02\x02\xF9\xFA\x07@\x02\x02" + - "\xFA2\x03\x02\x02\x02\xFB\xFC\x07?\x02\x02\xFC\xFD\x07@\x02\x02\xFD4\x03" + - "\x02\x02\x02\xFE\xFF\x07]\x02\x02\xFF6\x03\x02\x02\x02\u0100\u0101\x07" + - "_\x02\x02\u01018\x03\x02\x02\x02\u0102\u0103\x07k\x02\x02\u0103\u0104" + - "\x07p\x02\x02\u0104\u0105\x07v\x02\x02\u0105:\x03\x02\x02\x02\u0106\u0107" + - "\x07u\x02\x02\u0107\u0108\x07v\x02\x02\u0108\u0109\x07t\x02\x02\u0109" + - "<\x03\x02\x02\x02\u010A\u010B\x07d\x02\x02\u010B\u010C\x07q\x02\x02\u010C" + - "\u010D\x07q\x02\x02\u010D\u010E\x07n\x02\x02\u010E>\x03\x02\x02\x02\u010F" + - "\u0110\x07`\x02\x02\u0110@\x03\x02\x02\x02\u0111\u0112\x07)\x02\x02\u0112" + - "B\x03\x02\x02\x02\u0113\u0114\x07c\x02\x02\u0114\u0115\x07n\x02\x02\u0115" + - "\u0116\x07n\x02\x02\u0116D\x03\x02\x02\x02\u0117\u0118\x07c\x02\x02\u0118" + - "\u0119\x07p\x02\x02\u0119\u011A\x07{\x02\x02\u011AF\x03\x02\x02\x02\u011B" + - "\u011C\x07k\x02\x02\u011C\u011D\x07h\x02\x02\u011DH\x03\x02\x02\x02\u011E" + - "\u011F\x07g\x02\x02\u011F\u0120\x07n\x02\x02\u0120\u0121\x07u\x02\x02" + - "\u0121\u0122\x07g\x02\x02\u0122J\x03\x02\x02\x02\u0123\u0124\x07a\x02" + - "\x02\u0124L\x03\x02\x02\x02\u0125\u0126\x070\x02\x02\u0126\u0127\x070" + - "\x02\x02\u0127\u0128\x070\x02\x02\u0128N\x03\x02\x02\x02\u0129\u012A\x07" + - "<\x02\x02\u012A\u012B\x07<\x02\x02\u012BP\x03\x02\x02\x02\u012C\u0130" + - "\x07$\x02\x02\u012D\u012F\v\x02\x02\x02\u012E\u012D\x03\x02\x02\x02\u012F" + - "\u0132\x03\x02\x02\x02\u0130\u0131\x03\x02\x02\x02\u0130\u012E\x03\x02" + - "\x02\x02\u0131\u0133\x03\x02\x02\x02\u0132\u0130\x03\x02\x02\x02\u0133" + - "\u0134\x07$\x02\x02\u0134R\x03\x02\x02\x02\u0135\u0136\x07h\x02\x02\u0136" + - "\u0137\x07c\x02\x02\u0137\u0138\x07n\x02\x02\u0138\u0139\x07u\x02\x02" + - "\u0139\u013F\x07g\x02\x02\u013A\u013B\x07v\x02\x02\u013B\u013C\x07t\x02" + - "\x02\u013C\u013D\x07w\x02\x02\u013D\u013F\x07g\x02\x02\u013E\u0135\x03" + - "\x02\x02\x02\u013E\u013A\x03\x02\x02\x02\u013FT\x03\x02\x02\x02\u0140" + - "\u0157\x072\x02\x02\u0141\u0147\t\x02\x02\x02\u0142\u0146\t\x03\x02\x02" + - "\u0143\u0144\x07a\x02\x02\u0144\u0146\t\x03\x02\x02\u0145\u0142\x03\x02" + - "\x02\x02\u0145\u0143\x03\x02\x02\x02\u0146\u0149\x03\x02\x02\x02\u0147" + - "\u0145\x03\x02\x02\x02\u0147\u0148\x03\x02\x02\x02\u0148\u0157\x03\x02" + - "\x02\x02\u0149\u0147\x03\x02\x02\x02\u014A\u014B\x072\x02\x02\u014B\u014C" + - "\x07z\x02\x02\u014C\u014D\x03\x02\x02\x02\u014D\u0153\t\x04\x02\x02\u014E" + - "\u0152\t\x04\x02\x02\u014F\u0150\x07a\x02\x02\u0150\u0152\t\x04\x02\x02" + - "\u0151\u014E\x03\x02\x02\x02\u0151\u014F\x03\x02\x02\x02\u0152\u0155\x03" + - "\x02\x02\x02\u0153\u0151\x03\x02\x02\x02\u0153\u0154\x03\x02\x02\x02\u0154" + - "\u0157\x03\x02\x02\x02\u0155\u0153\x03\x02\x02\x02\u0156\u0140\x03\x02" + - "\x02\x02\u0156\u0141\x03\x02\x02\x02\u0156\u014A\x03\x02\x02\x02\u0157" + - "V\x03\x02\x02\x02\u0158\u0159\x07c\x02\x02\u0159\u015A\x07p\x02\x02\u015A" + - "\u015B\x07f\x02\x02\u015BX\x03\x02\x02\x02\u015C\u015D\x07q\x02\x02\u015D" + - "\u015E\x07t\x02\x02\u015EZ\x03\x02\x02\x02\u015F\u0160\x07k\x02\x02\u0160" + - "\u0161\x07h\x02\x02\u0161\u0162\x07h\x02\x02\u0162\\\x03\x02\x02\x02\u0163" + - "\u0164\x07k\x02\x02\u0164\u0165\x07o\x02\x02\u0165\u0166\x07r\x02\x02" + - "\u0166\u0167\x07n\x02\x02\u0167\u0168\x07k\x02\x02\u0168\u0169\x07g\x02" + - "\x02\u0169\u016A\x07u\x02\x02\u016A^\x03\x02\x02\x02\u016B\u016C\x07U" + - "\x02\x02\u016C\u016D\x07g\x02\x02\u016D\u016E\x07v\x02\x02\u016E`\x03" + - "\x02\x02\x02\u016F\u0170\x07N\x02\x02\u0170\u0171\x07k\x02\x02\u0171\u0172" + - "\x07u\x02\x02\u0172\u0173\x07v\x02\x02\u0173b\x03\x02\x02\x02\u0174\u0175" + - "\x07O\x02\x02\u0175\u0176\x07c\x02\x02\u0176\u0177\x07r\x02\x02\u0177" + - "d\x03\x02\x02\x02\u0178\u0179\x07o\x02\x02\u0179\u017A\x07c\x02\x02\u017A" + - "\u017B\x07v\x02\x02\u017B\u017C\x07e\x02\x02\u017C\u017D\x07j\x02\x02" + - "\u017Df\x03\x02\x02\x02\u017E\u017F\x07-\x02\x02\u017Fh\x03\x02\x02\x02" + - "\u0180\u0181\x07/\x02\x02\u0181j\x03\x02\x02\x02\u0182\u0183\x07,\x02" + - "\x02\u0183l\x03\x02\x02\x02\u0184\u0185\x071\x02\x02\u0185n\x03\x02\x02" + - "\x02\u0186\u0187\x07\'\x02\x02\u0187p\x03\x02\x02\x02\u0188\u0189\x07" + - "@\x02\x02\u0189r\x03\x02\x02\x02\u018A\u018B\x07>\x02\x02\u018Bt\x03\x02" + - "\x02\x02\u018C\u018D\x07@\x02\x02\u018D\u018E\x07?\x02\x02\u018Ev\x03" + - "\x02\x02\x02\u018F\u0190\x07>\x02\x02\u0190\u0191\x07?\x02\x02\u0191x" + - "\x03\x02\x02\x02\u0192\u0193\x07#\x02\x02\u0193\u0194\x07?\x02\x02\u0194" + - "z\x03\x02\x02\x02\u0195\u0196\x07?\x02\x02\u0196\u0197\x07?\x02\x02\u0197" + - "|\x03\x02\x02\x02\u0198\u0199\x07?\x02\x02\u0199~\x03\x02\x02\x02\u019A" + - "\u019B\x07*\x02\x02\u019B\x80\x03\x02\x02\x02\u019C\u019D\x07+\x02\x02" + - "\u019D\x82\x03\x02\x02\x02\u019E\u01A2\t\x05\x02\x02\u019F\u01A1\t\x06" + - "\x02\x02\u01A0\u019F\x03\x02\x02\x02\u01A1\u01A4\x03\x02\x02\x02\u01A2" + - "\u01A0\x03\x02\x02\x02\u01A2\u01A3\x03\x02\x02\x02\u01A3\u01AC\x03\x02" + - "\x02\x02\u01A4\u01A2\x03\x02\x02\x02\u01A5\u01A7\t\x07\x02\x02\u01A6\u01A8" + - "\t\x06\x02\x02\u01A7\u01A6\x03\x02\x02\x02\u01A8\u01A9\x03\x02\x02\x02" + - "\u01A9\u01A7\x03\x02\x02\x02\u01A9\u01AA\x03\x02\x02\x02\u01AA\u01AC\x03" + - "\x02\x02\x02\u01AB\u019E\x03\x02\x02\x02\u01AB\u01A5\x03\x02\x02\x02\u01AC" + - "\x84\x03\x02\x02\x02\u01AD\u01B1\t\b\x02\x02\u01AE\u01B0\t\x06\x02\x02" + - "\u01AF\u01AE\x03\x02\x02\x02\u01B0\u01B3\x03\x02\x02\x02\u01B1\u01AF\x03" + - "\x02\x02\x02\u01B1\u01B2\x03\x02\x02\x02\u01B2\u01BB\x03\x02\x02\x02\u01B3" + - "\u01B1\x03\x02\x02\x02\u01B4\u01B6\t\x07\x02\x02\u01B5\u01B7\t\x06\x02" + - "\x02\u01B6\u01B5\x03\x02\x02\x02\u01B7\u01B8\x03\x02\x02\x02\u01B8\u01B6" + - "\x03\x02\x02\x02\u01B8\u01B9\x03\x02\x02\x02\u01B9\u01BB\x03\x02\x02\x02" + - "\u01BA\u01AD\x03\x02\x02\x02\u01BA\u01B4\x03\x02\x02\x02\u01BB\x86\x03" + - "\x02\x02\x02\u01BC\u01BD\x071\x02\x02\u01BD\u01BE\x071\x02\x02\u01BE\u01BF" + - "\x071\x02\x02\u01BF\u01C3\x03\x02\x02\x02\u01C0\u01C2\v\x02\x02\x02\u01C1" + - "\u01C0\x03\x02\x02\x02\u01C2\u01C5\x03\x02\x02\x02\u01C3\u01C4\x03\x02" + - "\x02\x02\u01C3\u01C1\x03\x02\x02\x02\u01C4\u01C6\x03\x02\x02\x02\u01C5" + - "\u01C3\x03\x02\x02\x02\u01C6\u01C7\x07\f\x02\x02\u01C7\x88\x03\x02\x02" + - "\x02\u01C8\u01C9\x071\x02\x02\u01C9\u01CA\x071\x02\x02\u01CA\u01CE\x03" + - "\x02\x02\x02\u01CB\u01CD\v\x02\x02\x02\u01CC\u01CB\x03\x02\x02\x02\u01CD" + - "\u01D0\x03\x02\x02\x02\u01CE\u01CF\x03\x02\x02\x02\u01CE\u01CC\x03\x02" + - "\x02\x02\u01CF\u01D1\x03\x02\x02\x02\u01D0\u01CE\x03\x02\x02\x02\u01D1" + - "\u01D2\x07\f\x02\x02\u01D2\u01D3\x03\x02\x02\x02\u01D3\u01D4\bE\x02\x02" + - "\u01D4\x8A\x03\x02\x02\x02\u01D5\u01D6\x071\x02\x02\u01D6\u01D7\x07,\x02" + - "\x02\u01D7\u01DB\x03\x02\x02\x02\u01D8\u01DA\v\x02\x02\x02\u01D9\u01D8" + - "\x03\x02\x02\x02\u01DA\u01DD\x03\x02\x02\x02\u01DB\u01DC\x03\x02\x02\x02" + - "\u01DB\u01D9\x03\x02\x02\x02\u01DC\u01DE\x03\x02\x02\x02\u01DD\u01DB\x03" + - "\x02\x02\x02\u01DE\u01DF\x07,\x02\x02\u01DF\u01E0\x071\x02\x02\u01E0\u01E1" + - "\x03\x02\x02\x02\u01E1\u01E2\bF\x02\x02\u01E2\x8C\x03\x02\x02\x02\u01E3" + - "\u01E5\t\t\x02\x02\u01E4\u01E3\x03\x02\x02\x02\u01E5\u01E6\x03\x02\x02" + - "\x02\u01E6\u01E4\x03\x02\x02\x02\u01E6\u01E7\x03\x02\x02\x02\u01E7\u01E8" + - "\x03\x02\x02\x02\u01E8\u01E9\bG\x02\x02\u01E9\x8E\x03\x02\x02\x02\x14" + - "\x02\u0130\u013E\u0145\u0147\u0151\u0153\u0156\u01A2\u01A9\u01AB\u01B1" + - "\u01B8\u01BA\u01C3\u01CE\u01DB\u01E6\x03\b\x02\x02"; + "\v\x03\v\x03\f\x03\f\x03\r\x03\r\x03\x0E\x03\x0E\x03\x0F\x03\x0F\x03\x0F" + + "\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x10\x03\x10\x03\x10\x03\x10\x03\x11" + + "\x03\x11\x03\x11\x03\x11\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x13" + + "\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x14\x03\x14\x03\x14" + + "\x03\x14\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15" + + "\x03\x15\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x17" + + "\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x19\x03\x19\x03\x19" + + "\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1B\x03\x1B" + + "\x03\x1B\x03\x1C\x03\x1C\x03\x1C\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x03\x1E" + + "\x03\x1E\x03\x1E\x03\x1E\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03 " + + "\x03 \x03!\x03!\x03\"\x03\"\x03\"\x03\"\x03#\x03#\x03#\x03#\x03$\x03$" + + "\x03$\x03%\x03%\x03%\x03%\x03%\x03&\x03&\x03\'\x03\'\x03\'\x03\'\x03(" + + "\x03(\x03(\x03)\x03)\x07)\u012F\n)\f)\x0E)\u0132\v)\x03)\x03)\x03*\x03" + + "*\x03*\x03*\x03*\x03*\x03*\x03*\x03*\x05*\u013F\n*\x03+\x03+\x03+\x03" + + "+\x03+\x07+\u0146\n+\f+\x0E+\u0149\v+\x03+\x03+\x03+\x03+\x03+\x03+\x03" + + "+\x07+\u0152\n+\f+\x0E+\u0155\v+\x05+\u0157\n+\x03,\x03,\x03,\x03,\x03" + + "-\x03-\x03-\x03.\x03.\x03.\x03.\x03/\x03/\x03/\x03/\x03/\x03/\x03/\x03" + + "/\x030\x030\x030\x030\x031\x031\x031\x031\x031\x031\x032\x032\x033\x03" + + "3\x034\x034\x035\x035\x036\x036\x037\x037\x038\x038\x039\x039\x039\x03" + + ":\x03:\x03:\x03;\x03;\x03;\x03<\x03<\x03<\x03=\x03=\x03>\x03>\x03?\x03" + + "?\x03@\x03@\x03@\x03@\x03A\x03A\x03A\x03A\x03A\x03B\x03B\x07B\u01A1\n" + + "B\fB\x0EB\u01A4\vB\x03B\x03B\x06B\u01A8\nB\rB\x0EB\u01A9\x05B\u01AC\n" + + "B\x03C\x03C\x07C\u01B0\nC\fC\x0EC\u01B3\vC\x03C\x03C\x06C\u01B7\nC\rC" + + "\x0EC\u01B8\x05C\u01BB\nC\x03D\x03D\x03D\x03D\x03D\x07D\u01C2\nD\fD\x0E" + + "D\u01C5\vD\x03D\x03D\x03E\x03E\x03E\x03E\x07E\u01CD\nE\fE\x0EE\u01D0\v" + + "E\x03E\x03E\x03E\x03E\x03F\x03F\x03F\x03F\x07F\u01DA\nF\fF\x0EF\u01DD" + + "\vF\x03F\x03F\x03F\x03F\x03F\x03G\x06G\u01E5\nG\rG\x0EG\u01E6\x03G\x03" + + "G\x06\u0130\u01C3\u01CE\u01DB\x02\x02H\x03\x02\x03\x05\x02\x04\x07\x02" + + "\x05\t\x02\x06\v\x02\x07\r\x02\b\x0F\x02\t\x11\x02\n\x13\x02\v\x15\x02" + + "\f\x17\x02\r\x19\x02\x0E\x1B\x02\x0F\x1D\x02\x10\x1F\x02\x11!\x02\x12" + + "#\x02\x13%\x02\x14\'\x02\x15)\x02\x16+\x02\x17-\x02\x18/\x02\x191\x02" + + "\x1A3\x02\x1B5\x02\x1C7\x02\x1D9\x02\x1E;\x02\x1F=\x02 ?\x02!A\x02\"C" + + "\x02#E\x02$G\x02%I\x02&K\x02\'M\x02(O\x02)Q\x02*S\x02+U\x02,W\x02-Y\x02" + + ".[\x02/]\x020_\x021a\x022c\x023e\x024g\x025i\x026k\x027m\x028o\x029q\x02" + + ":s\x02;u\x02{\x02?}\x02@\x7F\x02A\x81\x02B\x83\x02C\x85\x02" + + "D\x87\x02E\x89\x02F\x8B\x02G\x8D\x02H\x03\x02\n\x03\x023;\x03\x022;\x05" + + "\x022;CHch\x03\x02c|\x06\x022;C\\aac|\x03\x02aa\x03\x02C\\\x05\x02\v\f" + + "\x0F\x0F\"\"\x02\u01FB\x02\x03\x03\x02\x02\x02\x02\x05\x03\x02\x02\x02" + + "\x02\x07\x03\x02\x02\x02\x02\t\x03\x02\x02\x02\x02\v\x03\x02\x02\x02\x02" + + "\r\x03\x02\x02\x02\x02\x0F\x03\x02\x02\x02\x02\x11\x03\x02\x02\x02\x02" + + "\x13\x03\x02\x02\x02\x02\x15\x03\x02\x02\x02\x02\x17\x03\x02\x02\x02\x02" + + "\x19\x03\x02\x02\x02\x02\x1B\x03\x02\x02\x02\x02\x1D\x03\x02\x02\x02\x02" + + "\x1F\x03\x02\x02\x02\x02!\x03\x02\x02\x02\x02#\x03\x02\x02\x02\x02%\x03" + + "\x02\x02\x02\x02\'\x03\x02\x02\x02\x02)\x03\x02\x02\x02\x02+\x03\x02\x02" + + "\x02\x02-\x03\x02\x02\x02\x02/\x03\x02\x02\x02\x021\x03\x02\x02\x02\x02" + + "3\x03\x02\x02\x02\x025\x03\x02\x02\x02\x027\x03\x02\x02\x02\x029\x03\x02" + + "\x02\x02\x02;\x03\x02\x02\x02\x02=\x03\x02\x02\x02\x02?\x03\x02\x02\x02" + + "\x02A\x03\x02\x02\x02\x02C\x03\x02\x02\x02\x02E\x03\x02\x02\x02\x02G\x03" + + "\x02\x02\x02\x02I\x03\x02\x02\x02\x02K\x03\x02\x02\x02\x02M\x03\x02\x02" + + "\x02\x02O\x03\x02\x02\x02\x02Q\x03\x02\x02\x02\x02S\x03\x02\x02\x02\x02" + + "U\x03\x02\x02\x02\x02W\x03\x02\x02\x02\x02Y\x03\x02\x02\x02\x02[\x03\x02" + + "\x02\x02\x02]\x03\x02\x02\x02\x02_\x03\x02\x02\x02\x02a\x03\x02\x02\x02" + + "\x02c\x03\x02\x02\x02\x02e\x03\x02\x02\x02\x02g\x03\x02\x02\x02\x02i\x03" + + "\x02\x02\x02\x02k\x03\x02\x02\x02\x02m\x03\x02\x02\x02\x02o\x03\x02\x02" + + "\x02\x02q\x03\x02\x02\x02\x02s\x03\x02\x02\x02\x02u\x03\x02\x02\x02\x02" + + "w\x03\x02\x02\x02\x02y\x03\x02\x02\x02\x02{\x03\x02\x02\x02\x02}\x03\x02" + + "\x02\x02\x02\x7F\x03\x02\x02\x02\x02\x81\x03\x02\x02\x02\x02\x83\x03\x02" + + "\x02\x02\x02\x85\x03\x02\x02\x02\x02\x87\x03\x02\x02\x02\x02\x89\x03\x02" + + "\x02\x02\x02\x8B\x03\x02\x02\x02\x02\x8D\x03\x02\x02\x02\x03\x8F\x03\x02" + + "\x02\x02\x05\x96\x03\x02\x02\x02\x07\x98\x03\x02\x02\x02\t\x9A\x03\x02" + + "\x02\x02\v\xA0\x03\x02\x02\x02\r\xA2\x03\x02\x02\x02\x0F\xA6\x03\x02\x02" + + "\x02\x11\xAD\x03\x02\x02\x02\x13\xAF\x03\x02\x02\x02\x15\xB1\x03\x02\x02" + + "\x02\x17\xB6\x03\x02\x02\x02\x19\xB8\x03\x02\x02\x02\x1B\xBA\x03\x02\x02" + + "\x02\x1D\xBC\x03\x02\x02\x02\x1F\xC3\x03\x02\x02\x02!\xC7\x03\x02\x02" + + "\x02#\xCB\x03\x02\x02\x02%\xD0\x03\x02\x02\x02\'\xD7\x03\x02\x02\x02)" + + "\xDB\x03\x02\x02\x02+\xE4\x03\x02\x02\x02-\xEB\x03\x02\x02\x02/\xED\x03" + + "\x02\x02\x021\xF2\x03\x02\x02\x023\xF5\x03\x02\x02\x025\xFC\x03\x02\x02" + + "\x027\xFF\x03\x02\x02\x029\u0102\x03\x02\x02\x02;\u0106\x03\x02\x02\x02" + + "=\u010A\x03\x02\x02\x02?\u010F\x03\x02\x02\x02A\u0111\x03\x02\x02\x02" + + "C\u0113\x03\x02\x02\x02E\u0117\x03\x02\x02\x02G\u011B\x03\x02\x02\x02" + + "I\u011E\x03\x02\x02\x02K\u0123\x03\x02\x02\x02M\u0125\x03\x02\x02\x02" + + "O\u0129\x03\x02\x02\x02Q\u012C\x03\x02\x02\x02S\u013E\x03\x02\x02\x02" + + "U\u0156\x03\x02\x02\x02W\u0158\x03\x02\x02\x02Y\u015C\x03\x02\x02\x02" + + "[\u015F\x03\x02\x02\x02]\u0163\x03\x02\x02\x02_\u016B\x03\x02\x02\x02" + + "a\u016F\x03\x02\x02\x02c\u0175\x03\x02\x02\x02e\u0177\x03\x02\x02\x02" + + "g\u0179\x03\x02\x02\x02i\u017B\x03\x02\x02\x02k\u017D\x03\x02\x02\x02" + + "m\u017F\x03\x02\x02\x02o\u0181\x03\x02\x02\x02q\u0183\x03\x02\x02\x02" + + "s\u0186\x03\x02\x02\x02u\u0189\x03\x02\x02\x02w\u018C\x03\x02\x02\x02" + + "y\u018F\x03\x02\x02\x02{\u0191\x03\x02\x02\x02}\u0193\x03\x02\x02\x02" + + "\x7F\u0195\x03\x02\x02\x02\x81\u0199\x03\x02\x02\x02\x83\u01AB\x03\x02" + + "\x02\x02\x85\u01BA\x03\x02\x02\x02\x87\u01BC\x03\x02\x02\x02\x89\u01C8" + + "\x03\x02\x02\x02\x8B\u01D5\x03\x02\x02\x02\x8D\u01E4\x03\x02\x02\x02\x8F" + + "\x90\x07o\x02\x02\x90\x91\x07q\x02\x02\x91\x92\x07f\x02\x02\x92\x93\x07" + + "w\x02\x02\x93\x94\x07n\x02\x02\x94\x95\x07g\x02\x02\x95\x04\x03\x02\x02" + + "\x02\x96\x97\x07}\x02\x02\x97\x06\x03\x02\x02\x02\x98\x99\x07\x7F\x02" + + "\x02\x99\b\x03\x02\x02\x02\x9A\x9B\x07e\x02\x02\x9B\x9C\x07q\x02\x02\x9C" + + "\x9D\x07p\x02\x02\x9D\x9E\x07u\x02\x02\x9E\x9F\x07v\x02\x02\x9F\n\x03" + + "\x02\x02\x02\xA0\xA1\x07<\x02\x02\xA1\f\x03\x02\x02\x02\xA2\xA3\x07x\x02" + + "\x02\xA3\xA4\x07c\x02\x02\xA4\xA5\x07t\x02\x02\xA5\x0E\x03\x02\x02\x02" + + "\xA6\xA7\x07c\x02\x02\xA7\xA8\x07u\x02\x02\xA8\xA9\x07u\x02\x02\xA9\xAA" + + "\x07w\x02\x02\xAA\xAB\x07o\x02\x02\xAB\xAC\x07g\x02\x02\xAC\x10\x03\x02" + + "\x02\x02\xAD\xAE\x07.\x02\x02\xAE\x12\x03\x02\x02\x02\xAF\xB0\x07=\x02" + + "\x02\xB0\x14\x03\x02\x02\x02\xB1\xB2\x07v\x02\x02\xB2\xB3\x07{\x02\x02" + + "\xB3\xB4\x07r\x02\x02\xB4\xB5\x07g\x02\x02\xB5\x16\x03\x02\x02\x02\xB6" + + "\xB7\x07]\x02\x02\xB7\x18\x03\x02\x02\x02\xB8\xB9\x07_\x02\x02\xB9\x1A" + + "\x03\x02\x02\x02\xBA\xBB\x07~\x02\x02\xBB\x1C\x03\x02\x02\x02\xBC\xBD" + + "\x07p\x02\x02\xBD\xBE\x07q\x02\x02\xBE\xBF\x07p\x02\x02\xBF\xC0\x07f\x02" + + "\x02\xC0\xC1\x07g\x02\x02\xC1\xC2\x07v\x02\x02\xC2\x1E\x03\x02\x02\x02" + + "\xC3\xC4\x07x\x02\x02\xC4\xC5\x07c\x02\x02\xC5\xC6\x07n\x02\x02\xC6 \x03" + + "\x02\x02\x02\xC7\xC8\x07f\x02\x02\xC8\xC9\x07g\x02\x02\xC9\xCA\x07h\x02" + + "\x02\xCA\"\x03\x02\x02\x02\xCB\xCC\x07r\x02\x02\xCC\xCD\x07w\x02\x02\xCD" + + "\xCE\x07t\x02\x02\xCE\xCF\x07g\x02\x02\xCF$\x03\x02\x02\x02\xD0\xD1\x07" + + "c\x02\x02\xD1\xD2\x07e\x02\x02\xD2\xD3\x07v\x02\x02\xD3\xD4\x07k\x02\x02" + + "\xD4\xD5\x07q\x02\x02\xD5\xD6\x07p\x02\x02\xD6&\x03\x02\x02\x02\xD7\xD8" + + "\x07t\x02\x02\xD8\xD9\x07w\x02\x02\xD9\xDA\x07p\x02\x02\xDA(\x03\x02\x02" + + "\x02\xDB\xDC\x07v\x02\x02\xDC\xDD\x07g\x02\x02\xDD\xDE\x07o\x02\x02\xDE" + + "\xDF\x07r\x02\x02\xDF\xE0\x07q\x02\x02\xE0\xE1\x07t\x02\x02\xE1\xE2\x07" + + "c\x02\x02\xE2\xE3\x07n\x02\x02\xE3*\x03\x02\x02\x02\xE4\xE5\x07k\x02\x02" + + "\xE5\xE6\x07o\x02\x02\xE6\xE7\x07r\x02\x02\xE7\xE8\x07q\x02\x02\xE8\xE9" + + "\x07t\x02\x02\xE9\xEA\x07v\x02\x02\xEA,\x03\x02\x02\x02\xEB\xEC\x070\x02" + + "\x02\xEC.\x03\x02\x02\x02\xED\xEE\x07h\x02\x02\xEE\xEF\x07t\x02\x02\xEF" + + "\xF0\x07q\x02\x02\xF0\xF1\x07o\x02\x02\xF10\x03\x02\x02\x02\xF2\xF3\x07" + + "c\x02\x02\xF3\xF4\x07u\x02\x02\xF42\x03\x02\x02\x02\xF5\xF6\x07g\x02\x02" + + "\xF6\xF7\x07z\x02\x02\xF7\xF8\x07r\x02\x02\xF8\xF9\x07q\x02\x02\xF9\xFA" + + "\x07t\x02\x02\xFA\xFB\x07v\x02\x02\xFB4\x03\x02\x02\x02\xFC\xFD\x07/\x02" + + "\x02\xFD\xFE\x07@\x02\x02\xFE6\x03\x02\x02\x02\xFF\u0100\x07?\x02\x02" + + "\u0100\u0101\x07@\x02\x02\u01018\x03\x02\x02\x02\u0102\u0103\x07k\x02" + + "\x02\u0103\u0104\x07p\x02\x02\u0104\u0105\x07v\x02\x02\u0105:\x03\x02" + + "\x02\x02\u0106\u0107\x07u\x02\x02\u0107\u0108\x07v\x02\x02\u0108\u0109" + + "\x07t\x02\x02\u0109<\x03\x02\x02\x02\u010A\u010B\x07d\x02\x02\u010B\u010C" + + "\x07q\x02\x02\u010C\u010D\x07q\x02\x02\u010D\u010E\x07n\x02\x02\u010E" + + ">\x03\x02\x02\x02\u010F\u0110\x07`\x02\x02\u0110@\x03\x02\x02\x02\u0111" + + "\u0112\x07)\x02\x02\u0112B\x03\x02\x02\x02\u0113\u0114\x07c\x02\x02\u0114" + + "\u0115\x07n\x02\x02\u0115\u0116\x07n\x02\x02\u0116D\x03\x02\x02\x02\u0117" + + "\u0118\x07c\x02\x02\u0118\u0119\x07p\x02\x02\u0119\u011A\x07{\x02\x02" + + "\u011AF\x03\x02\x02\x02\u011B\u011C\x07k\x02\x02\u011C\u011D\x07h\x02" + + "\x02\u011DH\x03\x02\x02\x02\u011E\u011F\x07g\x02\x02\u011F\u0120\x07n" + + "\x02\x02\u0120\u0121\x07u\x02\x02\u0121\u0122\x07g\x02\x02\u0122J\x03" + + "\x02\x02\x02\u0123\u0124\x07a\x02\x02\u0124L\x03\x02\x02\x02\u0125\u0126" + + "\x070\x02\x02\u0126\u0127\x070\x02\x02\u0127\u0128\x070\x02\x02\u0128" + + "N\x03\x02\x02\x02\u0129\u012A\x07<\x02\x02\u012A\u012B\x07<\x02\x02\u012B" + + "P\x03\x02\x02\x02\u012C\u0130\x07$\x02\x02\u012D\u012F\v\x02\x02\x02\u012E" + + "\u012D\x03\x02\x02\x02\u012F\u0132\x03\x02\x02\x02\u0130\u0131\x03\x02" + + "\x02\x02\u0130\u012E\x03\x02\x02\x02\u0131\u0133\x03\x02\x02\x02\u0132" + + "\u0130\x03\x02\x02\x02\u0133\u0134\x07$\x02\x02\u0134R\x03\x02\x02\x02" + + "\u0135\u0136\x07h\x02\x02\u0136\u0137\x07c\x02\x02\u0137\u0138\x07n\x02" + + "\x02\u0138\u0139\x07u\x02\x02\u0139\u013F\x07g\x02\x02\u013A\u013B\x07" + + "v\x02\x02\u013B\u013C\x07t\x02\x02\u013C\u013D\x07w\x02\x02\u013D\u013F" + + "\x07g\x02\x02\u013E\u0135\x03\x02\x02\x02\u013E\u013A\x03\x02\x02\x02" + + "\u013FT\x03\x02\x02\x02\u0140\u0157\x072\x02\x02\u0141\u0147\t\x02\x02" + + "\x02\u0142\u0146\t\x03\x02\x02\u0143\u0144\x07a\x02\x02\u0144\u0146\t" + + "\x03\x02\x02\u0145\u0142\x03\x02\x02\x02\u0145\u0143\x03\x02\x02\x02\u0146" + + "\u0149\x03\x02\x02\x02\u0147\u0145\x03\x02\x02\x02\u0147\u0148\x03\x02" + + "\x02\x02\u0148\u0157\x03\x02\x02\x02\u0149\u0147\x03\x02\x02\x02\u014A" + + "\u014B\x072\x02\x02\u014B\u014C\x07z\x02\x02\u014C\u014D\x03\x02\x02\x02" + + "\u014D\u0153\t\x04\x02\x02\u014E\u0152\t\x04\x02\x02\u014F\u0150\x07a" + + "\x02\x02\u0150\u0152\t\x04\x02\x02\u0151\u014E\x03\x02\x02\x02\u0151\u014F" + + "\x03\x02\x02\x02\u0152\u0155\x03\x02\x02\x02\u0153\u0151\x03\x02\x02\x02" + + "\u0153\u0154\x03\x02\x02\x02\u0154\u0157\x03\x02\x02\x02\u0155\u0153\x03" + + "\x02\x02\x02\u0156\u0140\x03\x02\x02\x02\u0156\u0141\x03\x02\x02\x02\u0156" + + "\u014A\x03\x02\x02\x02\u0157V\x03\x02\x02\x02\u0158\u0159\x07c\x02\x02" + + "\u0159\u015A\x07p\x02\x02\u015A\u015B\x07f\x02\x02\u015BX\x03\x02\x02" + + "\x02\u015C\u015D\x07q\x02\x02\u015D\u015E\x07t\x02\x02\u015EZ\x03\x02" + + "\x02\x02\u015F\u0160\x07k\x02\x02\u0160\u0161\x07h\x02\x02\u0161\u0162" + + "\x07h\x02\x02\u0162\\\x03\x02\x02\x02\u0163\u0164\x07k\x02\x02\u0164\u0165" + + "\x07o\x02\x02\u0165\u0166\x07r\x02\x02\u0166\u0167\x07n\x02\x02\u0167" + + "\u0168\x07k\x02\x02\u0168\u0169\x07g\x02\x02\u0169\u016A\x07u\x02\x02" + + "\u016A^\x03\x02\x02\x02\u016B\u016C\x07O\x02\x02\u016C\u016D\x07c\x02" + + "\x02\u016D\u016E\x07r\x02\x02\u016E`\x03\x02\x02\x02\u016F\u0170\x07o" + + "\x02\x02\u0170\u0171\x07c\x02\x02\u0171\u0172\x07v\x02\x02\u0172\u0173" + + "\x07e\x02\x02\u0173\u0174\x07j\x02\x02\u0174b\x03\x02\x02\x02\u0175\u0176" + + "\x07-\x02\x02\u0176d\x03\x02\x02\x02\u0177\u0178\x07/\x02\x02\u0178f\x03" + + "\x02\x02\x02\u0179\u017A\x07,\x02\x02\u017Ah\x03\x02\x02\x02\u017B\u017C" + + "\x071\x02\x02\u017Cj\x03\x02\x02\x02\u017D\u017E\x07\'\x02\x02\u017El" + + "\x03\x02\x02\x02\u017F\u0180\x07@\x02\x02\u0180n\x03\x02\x02\x02\u0181" + + "\u0182\x07>\x02\x02\u0182p\x03\x02\x02\x02\u0183\u0184\x07@\x02\x02\u0184" + + "\u0185\x07?\x02\x02\u0185r\x03\x02\x02\x02\u0186\u0187\x07>\x02\x02\u0187" + + "\u0188\x07?\x02\x02\u0188t\x03\x02\x02\x02\u0189\u018A\x07#\x02\x02\u018A" + + "\u018B\x07?\x02\x02\u018Bv\x03\x02\x02\x02\u018C\u018D\x07?\x02\x02\u018D" + + "\u018E\x07?\x02\x02\u018Ex\x03\x02\x02\x02\u018F\u0190\x07?\x02\x02\u0190" + + "z\x03\x02\x02\x02\u0191\u0192\x07*\x02\x02\u0192|\x03\x02\x02\x02\u0193" + + "\u0194\x07+\x02\x02\u0194~\x03\x02\x02\x02\u0195\u0196\x07U\x02\x02\u0196" + + "\u0197\x07g\x02\x02\u0197\u0198\x07v\x02\x02\u0198\x80\x03\x02\x02\x02" + + "\u0199\u019A\x07N\x02\x02\u019A\u019B\x07k\x02\x02\u019B\u019C\x07u\x02" + + "\x02\u019C\u019D\x07v\x02\x02\u019D\x82\x03\x02\x02\x02\u019E\u01A2\t" + + "\x05\x02\x02\u019F\u01A1\t\x06\x02\x02\u01A0\u019F\x03\x02\x02\x02\u01A1" + + "\u01A4\x03\x02\x02\x02\u01A2\u01A0\x03\x02\x02\x02\u01A2\u01A3\x03\x02" + + "\x02\x02\u01A3\u01AC\x03\x02\x02\x02\u01A4\u01A2\x03\x02\x02\x02\u01A5" + + "\u01A7\t\x07\x02\x02\u01A6\u01A8\t\x06\x02\x02\u01A7\u01A6\x03\x02\x02" + + "\x02\u01A8\u01A9\x03\x02\x02\x02\u01A9\u01A7\x03\x02\x02\x02\u01A9\u01AA" + + "\x03\x02\x02\x02\u01AA\u01AC\x03\x02\x02\x02\u01AB\u019E\x03\x02\x02\x02" + + "\u01AB\u01A5\x03\x02\x02\x02\u01AC\x84\x03\x02\x02\x02\u01AD\u01B1\t\b" + + "\x02\x02\u01AE\u01B0\t\x06\x02\x02\u01AF\u01AE\x03\x02\x02\x02\u01B0\u01B3" + + "\x03\x02\x02\x02\u01B1\u01AF\x03\x02\x02\x02\u01B1\u01B2\x03\x02\x02\x02" + + "\u01B2\u01BB\x03\x02\x02\x02\u01B3\u01B1\x03\x02\x02\x02\u01B4\u01B6\t" + + "\x07\x02\x02\u01B5\u01B7\t\x06\x02\x02\u01B6\u01B5\x03\x02\x02\x02\u01B7" + + "\u01B8\x03\x02\x02\x02\u01B8\u01B6\x03\x02\x02\x02\u01B8\u01B9\x03\x02" + + "\x02\x02\u01B9\u01BB\x03\x02\x02\x02\u01BA\u01AD\x03\x02\x02\x02\u01BA" + + "\u01B4\x03\x02\x02\x02\u01BB\x86\x03\x02\x02\x02\u01BC\u01BD\x071\x02" + + "\x02\u01BD\u01BE\x071\x02\x02\u01BE\u01BF\x071\x02\x02\u01BF\u01C3\x03" + + "\x02\x02\x02\u01C0\u01C2\v\x02\x02\x02\u01C1\u01C0\x03\x02\x02\x02\u01C2" + + "\u01C5\x03\x02\x02\x02\u01C3\u01C4\x03\x02\x02\x02\u01C3\u01C1\x03\x02" + + "\x02\x02\u01C4\u01C6\x03\x02\x02\x02\u01C5\u01C3\x03\x02\x02\x02\u01C6" + + "\u01C7\x07\f\x02\x02\u01C7\x88\x03\x02\x02\x02\u01C8\u01C9\x071\x02\x02" + + "\u01C9\u01CA\x071\x02\x02\u01CA\u01CE\x03\x02\x02\x02\u01CB\u01CD\v\x02" + + "\x02\x02\u01CC\u01CB\x03\x02\x02\x02\u01CD\u01D0\x03\x02\x02\x02\u01CE" + + "\u01CF\x03\x02\x02\x02\u01CE\u01CC\x03\x02\x02\x02\u01CF\u01D1\x03\x02" + + "\x02\x02\u01D0\u01CE\x03\x02\x02\x02\u01D1\u01D2\x07\f\x02\x02\u01D2\u01D3" + + "\x03\x02\x02\x02\u01D3\u01D4\bE\x02\x02\u01D4\x8A\x03\x02\x02\x02\u01D5" + + "\u01D6\x071\x02\x02\u01D6\u01D7\x07,\x02\x02\u01D7\u01DB\x03\x02\x02\x02" + + "\u01D8\u01DA\v\x02\x02\x02\u01D9\u01D8\x03\x02\x02\x02\u01DA\u01DD\x03" + + "\x02\x02\x02\u01DB\u01DC\x03\x02\x02\x02\u01DB\u01D9\x03\x02\x02\x02\u01DC" + + "\u01DE\x03\x02\x02\x02\u01DD\u01DB\x03\x02\x02\x02\u01DE\u01DF\x07,\x02" + + "\x02\u01DF\u01E0\x071\x02\x02\u01E0\u01E1\x03\x02\x02\x02\u01E1\u01E2" + + "\bF\x02\x02\u01E2\x8C\x03\x02\x02\x02\u01E3\u01E5\t\t\x02\x02\u01E4\u01E3" + + "\x03\x02\x02\x02\u01E5\u01E6\x03\x02\x02\x02\u01E6\u01E4\x03\x02\x02\x02" + + "\u01E6\u01E7\x03\x02\x02\x02\u01E7\u01E8\x03\x02\x02\x02\u01E8\u01E9\b" + + "G\x02\x02\u01E9\x8E\x03\x02\x02\x02\x14\x02\u0130\u013E\u0145\u0147\u0151" + + "\u0153\u0156\u01A2\u01A9\u01AB\u01B1\u01B8\u01BA\u01C3\u01CE\u01DB\u01E6" + + "\x03\b\x02\x02"; public static __ATN: ATN; public static get _ATN(): ATN { if (!QuintLexer.__ATN) { diff --git a/quint/src/generated/QuintListener.ts b/quint/src/generated/QuintListener.ts index b687aeefd..3894383e6 100644 --- a/quint/src/generated/QuintListener.ts +++ b/quint/src/generated/QuintListener.ts @@ -18,9 +18,10 @@ import { TypeRecContext } from "./QuintParser"; import { TypeIntContext } from "./QuintParser"; import { TypeStrContext } from "./QuintParser"; import { TypeBoolContext } from "./QuintParser"; -import { TypeVarContext } from "./QuintParser"; +import { TypeVarCaseContext } from "./QuintParser"; import { TypeConstContext } from "./QuintParser"; import { TypeParenContext } from "./QuintParser"; +import { TypeAppContext } from "./QuintParser"; import { TypeAbstractDefContext } from "./QuintParser"; import { TypeAliasDefContext } from "./QuintParser"; import { TypeSumDefContext } from "./QuintParser"; @@ -68,6 +69,8 @@ import { DocumentedDeclarationContext } from "./QuintParser"; import { DeclarationContext } from "./QuintParser"; import { OperDefContext } from "./QuintParser"; import { TypeDefContext } from "./QuintParser"; +import { TypeDefHeadContext } from "./QuintParser"; +import { SumTypeDefinitionContext } from "./QuintParser"; import { TypeSumVariantContext } from "./QuintParser"; import { NondetOperDefContext } from "./QuintParser"; import { QualifierContext } from "./QuintParser"; @@ -79,6 +82,7 @@ import { NameContext } from "./QuintParser"; import { QualifiedNameContext } from "./QuintParser"; import { FromSourceContext } from "./QuintParser"; import { TypeContext } from "./QuintParser"; +import { TypeVarContext } from "./QuintParser"; import { RowContext } from "./QuintParser"; import { RowLabelContext } from "./QuintParser"; import { ExprContext } from "./QuintParser"; @@ -226,17 +230,17 @@ export interface QuintListener extends ParseTreeListener { exitTypeBool?: (ctx: TypeBoolContext) => void; /** - * Enter a parse tree produced by the `typeVar` + * Enter a parse tree produced by the `typeVarCase` * labeled alternative in `QuintParser.type`. * @param ctx the parse tree */ - enterTypeVar?: (ctx: TypeVarContext) => void; + enterTypeVarCase?: (ctx: TypeVarCaseContext) => void; /** - * Exit a parse tree produced by the `typeVar` + * Exit a parse tree produced by the `typeVarCase` * labeled alternative in `QuintParser.type`. * @param ctx the parse tree */ - exitTypeVar?: (ctx: TypeVarContext) => void; + exitTypeVarCase?: (ctx: TypeVarCaseContext) => void; /** * Enter a parse tree produced by the `typeConst` @@ -264,6 +268,19 @@ export interface QuintListener extends ParseTreeListener { */ exitTypeParen?: (ctx: TypeParenContext) => void; + /** + * Enter a parse tree produced by the `typeApp` + * labeled alternative in `QuintParser.type`. + * @param ctx the parse tree + */ + enterTypeApp?: (ctx: TypeAppContext) => void; + /** + * Exit a parse tree produced by the `typeApp` + * labeled alternative in `QuintParser.type`. + * @param ctx the parse tree + */ + exitTypeApp?: (ctx: TypeAppContext) => void; + /** * Enter a parse tree produced by the `typeAbstractDef` * labeled alternative in `QuintParser.typeDef`. @@ -863,6 +880,28 @@ export interface QuintListener extends ParseTreeListener { */ exitTypeDef?: (ctx: TypeDefContext) => void; + /** + * Enter a parse tree produced by `QuintParser.typeDefHead`. + * @param ctx the parse tree + */ + enterTypeDefHead?: (ctx: TypeDefHeadContext) => void; + /** + * Exit a parse tree produced by `QuintParser.typeDefHead`. + * @param ctx the parse tree + */ + exitTypeDefHead?: (ctx: TypeDefHeadContext) => void; + + /** + * Enter a parse tree produced by `QuintParser.sumTypeDefinition`. + * @param ctx the parse tree + */ + enterSumTypeDefinition?: (ctx: SumTypeDefinitionContext) => void; + /** + * Exit a parse tree produced by `QuintParser.sumTypeDefinition`. + * @param ctx the parse tree + */ + exitSumTypeDefinition?: (ctx: SumTypeDefinitionContext) => void; + /** * Enter a parse tree produced by `QuintParser.typeSumVariant`. * @param ctx the parse tree @@ -984,6 +1023,17 @@ export interface QuintListener extends ParseTreeListener { */ exitType?: (ctx: TypeContext) => void; + /** + * Enter a parse tree produced by `QuintParser.typeVar`. + * @param ctx the parse tree + */ + enterTypeVar?: (ctx: TypeVarContext) => void; + /** + * Exit a parse tree produced by `QuintParser.typeVar`. + * @param ctx the parse tree + */ + exitTypeVar?: (ctx: TypeVarContext) => void; + /** * Enter a parse tree produced by `QuintParser.row`. * @param ctx the parse tree diff --git a/quint/src/generated/QuintParser.ts b/quint/src/generated/QuintParser.ts index 8a95eddc0..53294b225 100644 --- a/quint/src/generated/QuintParser.ts +++ b/quint/src/generated/QuintParser.ts @@ -80,24 +80,24 @@ export class QuintParser extends Parser { public static readonly OR = 44; public static readonly IFF = 45; public static readonly IMPLIES = 46; - public static readonly SET = 47; - public static readonly LIST = 48; - public static readonly MAP = 49; - public static readonly MATCH = 50; - public static readonly PLUS = 51; - public static readonly MINUS = 52; - public static readonly MUL = 53; - public static readonly DIV = 54; - public static readonly MOD = 55; - public static readonly GT = 56; - public static readonly LT = 57; - public static readonly GE = 58; - public static readonly LE = 59; - public static readonly NE = 60; - public static readonly EQ = 61; - public static readonly ASGN = 62; - public static readonly LPAREN = 63; - public static readonly RPAREN = 64; + public static readonly MAP = 47; + public static readonly MATCH = 48; + public static readonly PLUS = 49; + public static readonly MINUS = 50; + public static readonly MUL = 51; + public static readonly DIV = 52; + public static readonly MOD = 53; + public static readonly GT = 54; + public static readonly LT = 55; + public static readonly GE = 56; + public static readonly LE = 57; + public static readonly NE = 58; + public static readonly EQ = 59; + public static readonly ASGN = 60; + public static readonly LPAREN = 61; + public static readonly RPAREN = 62; + public static readonly SET = 63; + public static readonly LIST = 64; public static readonly LOW_ID = 65; public static readonly CAP_ID = 66; public static readonly DOCCOMMENT = 67; @@ -110,59 +110,63 @@ export class QuintParser extends Parser { public static readonly RULE_declaration = 3; public static readonly RULE_operDef = 4; public static readonly RULE_typeDef = 5; - public static readonly RULE_typeSumVariant = 6; - public static readonly RULE_nondetOperDef = 7; - public static readonly RULE_qualifier = 8; - public static readonly RULE_importMod = 9; - public static readonly RULE_exportMod = 10; - public static readonly RULE_instanceMod = 11; - public static readonly RULE_moduleName = 12; - public static readonly RULE_name = 13; - public static readonly RULE_qualifiedName = 14; - public static readonly RULE_fromSource = 15; - public static readonly RULE_type = 16; - public static readonly RULE_row = 17; - public static readonly RULE_rowLabel = 18; - public static readonly RULE_expr = 19; - public static readonly RULE_matchSumExpr = 20; - public static readonly RULE_matchSumCase = 21; - public static readonly RULE_matchSumVariant = 22; - public static readonly RULE_declarationOrExpr = 23; - public static readonly RULE_lambda = 24; - public static readonly RULE_lambdaUnsugared = 25; - public static readonly RULE_lambdaTupleSugar = 26; - public static readonly RULE_identOrHole = 27; - public static readonly RULE_parameter = 28; - public static readonly RULE_identOrStar = 29; - public static readonly RULE_argList = 30; - public static readonly RULE_recElem = 31; - public static readonly RULE_normalCallName = 32; - public static readonly RULE_nameAfterDot = 33; - public static readonly RULE_operator = 34; - public static readonly RULE_literal = 35; - public static readonly RULE_qualId = 36; - public static readonly RULE_simpleId = 37; - public static readonly RULE_identifier = 38; + public static readonly RULE_typeDefHead = 6; + public static readonly RULE_sumTypeDefinition = 7; + public static readonly RULE_typeSumVariant = 8; + public static readonly RULE_nondetOperDef = 9; + public static readonly RULE_qualifier = 10; + public static readonly RULE_importMod = 11; + public static readonly RULE_exportMod = 12; + public static readonly RULE_instanceMod = 13; + public static readonly RULE_moduleName = 14; + public static readonly RULE_name = 15; + public static readonly RULE_qualifiedName = 16; + public static readonly RULE_fromSource = 17; + public static readonly RULE_type = 18; + public static readonly RULE_typeVar = 19; + public static readonly RULE_row = 20; + public static readonly RULE_rowLabel = 21; + public static readonly RULE_expr = 22; + public static readonly RULE_matchSumExpr = 23; + public static readonly RULE_matchSumCase = 24; + public static readonly RULE_matchSumVariant = 25; + public static readonly RULE_declarationOrExpr = 26; + public static readonly RULE_lambda = 27; + public static readonly RULE_lambdaUnsugared = 28; + public static readonly RULE_lambdaTupleSugar = 29; + public static readonly RULE_identOrHole = 30; + public static readonly RULE_parameter = 31; + public static readonly RULE_identOrStar = 32; + public static readonly RULE_argList = 33; + public static readonly RULE_recElem = 34; + public static readonly RULE_normalCallName = 35; + public static readonly RULE_nameAfterDot = 36; + public static readonly RULE_operator = 37; + public static readonly RULE_literal = 38; + public static readonly RULE_qualId = 39; + public static readonly RULE_simpleId = 40; + public static readonly RULE_identifier = 41; // tslint:disable:no-trailing-whitespace public static readonly ruleNames: string[] = [ "modules", "module", "documentedDeclaration", "declaration", "operDef", - "typeDef", "typeSumVariant", "nondetOperDef", "qualifier", "importMod", - "exportMod", "instanceMod", "moduleName", "name", "qualifiedName", "fromSource", - "type", "row", "rowLabel", "expr", "matchSumExpr", "matchSumCase", "matchSumVariant", - "declarationOrExpr", "lambda", "lambdaUnsugared", "lambdaTupleSugar", - "identOrHole", "parameter", "identOrStar", "argList", "recElem", "normalCallName", - "nameAfterDot", "operator", "literal", "qualId", "simpleId", "identifier", + "typeDef", "typeDefHead", "sumTypeDefinition", "typeSumVariant", "nondetOperDef", + "qualifier", "importMod", "exportMod", "instanceMod", "moduleName", "name", + "qualifiedName", "fromSource", "type", "typeVar", "row", "rowLabel", "expr", + "matchSumExpr", "matchSumCase", "matchSumVariant", "declarationOrExpr", + "lambda", "lambdaUnsugared", "lambdaTupleSugar", "identOrHole", "parameter", + "identOrStar", "argList", "recElem", "normalCallName", "nameAfterDot", + "operator", "literal", "qualId", "simpleId", "identifier", ]; private static readonly _LITERAL_NAMES: Array = [ undefined, "'module'", "'{'", "'}'", "'const'", "':'", "'var'", "'assume'", - "','", "';'", "'type'", "'|'", "'nondet'", "'val'", "'def'", "'pure'", - "'action'", "'run'", "'temporal'", "'import'", "'.'", "'from'", "'as'", - "'export'", "'->'", "'=>'", "'['", "']'", "'int'", "'str'", "'bool'", - "'^'", "'''", "'all'", "'any'", "'if'", "'else'", "'_'", "'...'", "'::'", - undefined, undefined, undefined, "'and'", "'or'", "'iff'", "'implies'", - "'Set'", "'List'", "'Map'", "'match'", "'+'", "'-'", "'*'", "'/'", "'%'", - "'>'", "'<'", "'>='", "'<='", "'!='", "'=='", "'='", "'('", "')'", + "','", "';'", "'type'", "'['", "']'", "'|'", "'nondet'", "'val'", "'def'", + "'pure'", "'action'", "'run'", "'temporal'", "'import'", "'.'", "'from'", + "'as'", "'export'", "'->'", "'=>'", "'int'", "'str'", "'bool'", "'^'", + "'''", "'all'", "'any'", "'if'", "'else'", "'_'", "'...'", "'::'", undefined, + undefined, undefined, "'and'", "'or'", "'iff'", "'implies'", "'Map'", + "'match'", "'+'", "'-'", "'*'", "'/'", "'%'", "'>'", "'<'", "'>='", "'<='", + "'!='", "'=='", "'='", "'('", "')'", "'Set'", "'List'", ]; private static readonly _SYMBOLIC_NAMES: Array = [ undefined, undefined, undefined, undefined, undefined, undefined, undefined, @@ -171,9 +175,9 @@ export class QuintParser extends Parser { undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, "STRING", "BOOL", - "INT", "AND", "OR", "IFF", "IMPLIES", "SET", "LIST", "MAP", "MATCH", "PLUS", - "MINUS", "MUL", "DIV", "MOD", "GT", "LT", "GE", "LE", "NE", "EQ", "ASGN", - "LPAREN", "RPAREN", "LOW_ID", "CAP_ID", "DOCCOMMENT", "LINE_COMMENT", + "INT", "AND", "OR", "IFF", "IMPLIES", "MAP", "MATCH", "PLUS", "MINUS", + "MUL", "DIV", "MOD", "GT", "LT", "GE", "LE", "NE", "EQ", "ASGN", "LPAREN", + "RPAREN", "SET", "LIST", "LOW_ID", "CAP_ID", "DOCCOMMENT", "LINE_COMMENT", "COMMENT", "WS", ]; public static readonly VOCABULARY: Vocabulary = new VocabularyImpl(QuintParser._LITERAL_NAMES, QuintParser._SYMBOLIC_NAMES, []); @@ -210,21 +214,21 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 79; + this.state = 85; this._errHandler.sync(this); _la = this._input.LA(1); do { { { - this.state = 78; + this.state = 84; this.module(); } } - this.state = 81; + this.state = 87; this._errHandler.sync(this); _la = this._input.LA(1); } while (_la === QuintParser.T__0 || _la === QuintParser.DOCCOMMENT); - this.state = 83; + this.state = 89; this.match(QuintParser.EOF); } } @@ -250,41 +254,41 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 88; + this.state = 94; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.DOCCOMMENT) { { { - this.state = 85; + this.state = 91; this.match(QuintParser.DOCCOMMENT); } } - this.state = 90; + this.state = 96; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 91; + this.state = 97; this.match(QuintParser.T__0); - this.state = 92; + this.state = 98; this.qualId(); - this.state = 93; + this.state = 99; this.match(QuintParser.T__1); - this.state = 97; + this.state = 103; this._errHandler.sync(this); _la = this._input.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__3) | (1 << QuintParser.T__5) | (1 << QuintParser.T__6) | (1 << QuintParser.T__9) | (1 << QuintParser.T__12) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__22))) !== 0) || _la === QuintParser.DOCCOMMENT) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__3) | (1 << QuintParser.T__5) | (1 << QuintParser.T__6) | (1 << QuintParser.T__9) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19) | (1 << QuintParser.T__20) | (1 << QuintParser.T__24))) !== 0) || _la === QuintParser.DOCCOMMENT) { { { - this.state = 94; + this.state = 100; this.documentedDeclaration(); } } - this.state = 99; + this.state = 105; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 100; + this.state = 106; this.match(QuintParser.T__2); } } @@ -310,21 +314,21 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 105; + this.state = 111; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.DOCCOMMENT) { { { - this.state = 102; + this.state = 108; this.match(QuintParser.DOCCOMMENT); } } - this.state = 107; + this.state = 113; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 108; + this.state = 114; this.declaration(); } } @@ -347,20 +351,20 @@ export class QuintParser extends Parser { let _localctx: DeclarationContext = new DeclarationContext(this._ctx, this.state); this.enterRule(_localctx, 6, QuintParser.RULE_declaration); try { - this.state = 130; + this.state = 136; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 4, this._ctx) ) { case 1: _localctx = new ConstContext(_localctx); this.enterOuterAlt(_localctx, 1); { - this.state = 110; + this.state = 116; this.match(QuintParser.T__3); - this.state = 111; + this.state = 117; this.qualId(); - this.state = 112; + this.state = 118; this.match(QuintParser.T__4); - this.state = 113; + this.state = 119; this.type(0); } break; @@ -369,13 +373,13 @@ export class QuintParser extends Parser { _localctx = new VarContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 115; + this.state = 121; this.match(QuintParser.T__5); - this.state = 116; + this.state = 122; this.qualId(); - this.state = 117; + this.state = 123; this.match(QuintParser.T__4); - this.state = 118; + this.state = 124; this.type(0); } break; @@ -384,13 +388,13 @@ export class QuintParser extends Parser { _localctx = new AssumeContext(_localctx); this.enterOuterAlt(_localctx, 3); { - this.state = 120; + this.state = 126; this.match(QuintParser.T__6); - this.state = 121; + this.state = 127; this.identOrHole(); - this.state = 122; + this.state = 128; this.match(QuintParser.ASGN); - this.state = 123; + this.state = 129; this.expr(0); } break; @@ -399,7 +403,7 @@ export class QuintParser extends Parser { _localctx = new InstanceContext(_localctx); this.enterOuterAlt(_localctx, 4); { - this.state = 125; + this.state = 131; this.instanceMod(); } break; @@ -408,7 +412,7 @@ export class QuintParser extends Parser { _localctx = new OperContext(_localctx); this.enterOuterAlt(_localctx, 5); { - this.state = 126; + this.state = 132; this.operDef(); } break; @@ -417,7 +421,7 @@ export class QuintParser extends Parser { _localctx = new TypeDefsContext(_localctx); this.enterOuterAlt(_localctx, 6); { - this.state = 127; + this.state = 133; this.typeDef(); } break; @@ -426,7 +430,7 @@ export class QuintParser extends Parser { _localctx = new ImportDefContext(_localctx); this.enterOuterAlt(_localctx, 7); { - this.state = 128; + this.state = 134; this.importMod(); } break; @@ -435,7 +439,7 @@ export class QuintParser extends Parser { _localctx = new ExportDefContext(_localctx); this.enterOuterAlt(_localctx, 8); { - this.state = 129; + this.state = 135; this.exportMod(); } break; @@ -463,53 +467,53 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 132; + this.state = 138; this.qualifier(); - this.state = 133; + this.state = 139; this.normalCallName(); - this.state = 170; + this.state = 176; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 9, this._ctx) ) { case 1: { - this.state = 134; + this.state = 140; this.match(QuintParser.LPAREN); - this.state = 143; + this.state = 149; this._errHandler.sync(this); _la = this._input.LA(1); if (((((_la - 37)) & ~0x1F) === 0 && ((1 << (_la - 37)) & ((1 << (QuintParser.T__36 - 37)) | (1 << (QuintParser.LOW_ID - 37)) | (1 << (QuintParser.CAP_ID - 37)))) !== 0)) { { - this.state = 135; + this.state = 141; this.parameter(); - this.state = 140; + this.state = 146; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 136; + this.state = 142; this.match(QuintParser.T__7); - this.state = 137; + this.state = 143; this.parameter(); } } - this.state = 142; + this.state = 148; this._errHandler.sync(this); _la = this._input.LA(1); } } } - this.state = 145; + this.state = 151; this.match(QuintParser.RPAREN); - this.state = 148; + this.state = 154; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__4) { { - this.state = 146; + this.state = 152; this.match(QuintParser.T__4); - this.state = 147; + this.state = 153; this.type(0); } } @@ -519,72 +523,72 @@ export class QuintParser extends Parser { case 2: { - this.state = 150; + this.state = 156; this.match(QuintParser.T__4); - this.state = 151; + this.state = 157; this.type(0); } break; case 3: { - this.state = 152; + this.state = 158; this.match(QuintParser.LPAREN); { - this.state = 153; + this.state = 159; this.parameter(); - this.state = 154; + this.state = 160; this.match(QuintParser.T__4); - this.state = 155; + this.state = 161; this.type(0); - this.state = 163; + this.state = 169; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 156; + this.state = 162; this.match(QuintParser.T__7); - this.state = 157; + this.state = 163; this.parameter(); - this.state = 158; + this.state = 164; this.match(QuintParser.T__4); - this.state = 159; + this.state = 165; this.type(0); } } - this.state = 165; + this.state = 171; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 166; + this.state = 172; this.match(QuintParser.RPAREN); - this.state = 167; + this.state = 173; this.match(QuintParser.T__4); - this.state = 168; + this.state = 174; this.type(0); } break; } - this.state = 174; + this.state = 180; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.ASGN) { { - this.state = 172; + this.state = 178; this.match(QuintParser.ASGN); - this.state = 173; + this.state = 179; this.expr(0); } } - this.state = 177; + this.state = 183; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__8) { { - this.state = 176; + this.state = 182; this.match(QuintParser.T__8); } } @@ -609,18 +613,17 @@ export class QuintParser extends Parser { public typeDef(): TypeDefContext { let _localctx: TypeDefContext = new TypeDefContext(this._ctx, this.state); this.enterRule(_localctx, 10, QuintParser.RULE_typeDef); - let _la: number; try { - this.state = 200; + this.state = 197; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 14, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 12, this._ctx) ) { case 1: _localctx = new TypeAbstractDefContext(_localctx); this.enterOuterAlt(_localctx, 1); { - this.state = 179; + this.state = 185; this.match(QuintParser.T__9); - this.state = 180; + this.state = 186; this.qualId(); } break; @@ -629,13 +632,13 @@ export class QuintParser extends Parser { _localctx = new TypeAliasDefContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 181; + this.state = 187; this.match(QuintParser.T__9); - this.state = 182; - this.qualId(); - this.state = 183; + this.state = 188; + this.typeDefHead(); + this.state = 189; this.match(QuintParser.ASGN); - this.state = 184; + this.state = 190; this.type(0); } break; @@ -644,42 +647,126 @@ export class QuintParser extends Parser { _localctx = new TypeSumDefContext(_localctx); this.enterOuterAlt(_localctx, 3); { - this.state = 186; + this.state = 192; this.match(QuintParser.T__9); - this.state = 187; - (_localctx as TypeSumDefContext)._typeName = this.qualId(); - this.state = 188; + this.state = 193; + this.typeDefHead(); + this.state = 194; this.match(QuintParser.ASGN); - this.state = 190; - this._errHandler.sync(this); - _la = this._input.LA(1); - if (_la === QuintParser.T__10) { - { - this.state = 189; - this.match(QuintParser.T__10); - } + this.state = 195; + this.sumTypeDefinition(); } - - this.state = 192; - this.typeSumVariant(); - this.state = 197; + break; + } + } + catch (re) { + if (re instanceof RecognitionException) { + _localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return _localctx; + } + // @RuleVersion(0) + public typeDefHead(): TypeDefHeadContext { + let _localctx: TypeDefHeadContext = new TypeDefHeadContext(this._ctx, this.state); + this.enterRule(_localctx, 12, QuintParser.RULE_typeDefHead); + let _la: number; + try { + this.enterOuterAlt(_localctx, 1); + { + this.state = 199; + _localctx._typeName = this.qualId(); + this.state = 211; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === QuintParser.T__10) { + { + this.state = 200; + this.match(QuintParser.T__10); + this.state = 201; + _localctx._typeVar = this.typeVar(); + _localctx._typeVars.push(_localctx._typeVar); + this.state = 206; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la === QuintParser.T__10) { + while (_la === QuintParser.T__7) { { { - this.state = 193; - this.match(QuintParser.T__10); - this.state = 194; - this.typeSumVariant(); + this.state = 202; + this.match(QuintParser.T__7); + this.state = 203; + _localctx._typeVar = this.typeVar(); + _localctx._typeVars.push(_localctx._typeVar); } } - this.state = 199; + this.state = 208; this._errHandler.sync(this); _la = this._input.LA(1); } + this.state = 209; + this.match(QuintParser.T__11); } - break; + } + + } + } + catch (re) { + if (re instanceof RecognitionException) { + _localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return _localctx; + } + // @RuleVersion(0) + public sumTypeDefinition(): SumTypeDefinitionContext { + let _localctx: SumTypeDefinitionContext = new SumTypeDefinitionContext(this._ctx, this.state); + this.enterRule(_localctx, 14, QuintParser.RULE_sumTypeDefinition); + let _la: number; + try { + this.enterOuterAlt(_localctx, 1); + { + this.state = 214; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === QuintParser.T__12) { + { + this.state = 213; + this.match(QuintParser.T__12); + } + } + + this.state = 216; + this.typeSumVariant(); + this.state = 221; + this._errHandler.sync(this); + _la = this._input.LA(1); + while (_la === QuintParser.T__12) { + { + { + this.state = 217; + this.match(QuintParser.T__12); + this.state = 218; + this.typeSumVariant(); + } + } + this.state = 223; + this._errHandler.sync(this); + _la = this._input.LA(1); + } } } catch (re) { @@ -699,23 +786,23 @@ export class QuintParser extends Parser { // @RuleVersion(0) public typeSumVariant(): TypeSumVariantContext { let _localctx: TypeSumVariantContext = new TypeSumVariantContext(this._ctx, this.state); - this.enterRule(_localctx, 12, QuintParser.RULE_typeSumVariant); + this.enterRule(_localctx, 16, QuintParser.RULE_typeSumVariant); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 202; + this.state = 224; _localctx._sumLabel = this.simpleId("variant label"); - this.state = 207; + this.state = 229; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.LPAREN) { { - this.state = 203; + this.state = 225; this.match(QuintParser.LPAREN); - this.state = 204; + this.state = 226; this.type(0); - this.state = 205; + this.state = 227; this.match(QuintParser.RPAREN); } } @@ -739,37 +826,37 @@ export class QuintParser extends Parser { // @RuleVersion(0) public nondetOperDef(): NondetOperDefContext { let _localctx: NondetOperDefContext = new NondetOperDefContext(this._ctx, this.state); - this.enterRule(_localctx, 14, QuintParser.RULE_nondetOperDef); + this.enterRule(_localctx, 18, QuintParser.RULE_nondetOperDef); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 209; - this.match(QuintParser.T__11); - this.state = 210; + this.state = 231; + this.match(QuintParser.T__13); + this.state = 232; this.qualId(); - this.state = 213; + this.state = 235; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__4) { { - this.state = 211; + this.state = 233; this.match(QuintParser.T__4); - this.state = 212; + this.state = 234; this.type(0); } } - this.state = 215; + this.state = 237; this.match(QuintParser.ASGN); - this.state = 216; + this.state = 238; this.expr(0); - this.state = 218; + this.state = 240; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__8) { { - this.state = 217; + this.state = 239; this.match(QuintParser.T__8); } } @@ -793,68 +880,68 @@ export class QuintParser extends Parser { // @RuleVersion(0) public qualifier(): QualifierContext { let _localctx: QualifierContext = new QualifierContext(this._ctx, this.state); - this.enterRule(_localctx, 16, QuintParser.RULE_qualifier); + this.enterRule(_localctx, 20, QuintParser.RULE_qualifier); try { - this.state = 229; + this.state = 251; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 18, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 20, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 220; - this.match(QuintParser.T__12); + this.state = 242; + this.match(QuintParser.T__14); } break; case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 221; - this.match(QuintParser.T__13); + this.state = 243; + this.match(QuintParser.T__15); } break; case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 222; + this.state = 244; + this.match(QuintParser.T__16); + this.state = 245; this.match(QuintParser.T__14); - this.state = 223; - this.match(QuintParser.T__12); } break; case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 224; - this.match(QuintParser.T__14); - this.state = 225; - this.match(QuintParser.T__13); + this.state = 246; + this.match(QuintParser.T__16); + this.state = 247; + this.match(QuintParser.T__15); } break; case 5: this.enterOuterAlt(_localctx, 5); { - this.state = 226; - this.match(QuintParser.T__15); + this.state = 248; + this.match(QuintParser.T__17); } break; case 6: this.enterOuterAlt(_localctx, 6); { - this.state = 227; - this.match(QuintParser.T__16); + this.state = 249; + this.match(QuintParser.T__18); } break; case 7: this.enterOuterAlt(_localctx, 7); { - this.state = 228; - this.match(QuintParser.T__17); + this.state = 250; + this.match(QuintParser.T__19); } break; } @@ -876,31 +963,31 @@ export class QuintParser extends Parser { // @RuleVersion(0) public importMod(): ImportModContext { let _localctx: ImportModContext = new ImportModContext(this._ctx, this.state); - this.enterRule(_localctx, 18, QuintParser.RULE_importMod); + this.enterRule(_localctx, 22, QuintParser.RULE_importMod); let _la: number; try { - this.state = 249; + this.state = 271; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 22, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 24, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 231; - this.match(QuintParser.T__18); - this.state = 232; + this.state = 253; + this.match(QuintParser.T__20); + this.state = 254; this.name(); - this.state = 233; - this.match(QuintParser.T__19); - this.state = 234; + this.state = 255; + this.match(QuintParser.T__21); + this.state = 256; this.identOrStar(); - this.state = 237; + this.state = 259; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__20) { + if (_la === QuintParser.T__22) { { - this.state = 235; - this.match(QuintParser.T__20); - this.state = 236; + this.state = 257; + this.match(QuintParser.T__22); + this.state = 258; this.fromSource(); } } @@ -911,30 +998,30 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 239; - this.match(QuintParser.T__18); - this.state = 240; + this.state = 261; + this.match(QuintParser.T__20); + this.state = 262; this.name(); - this.state = 243; + this.state = 265; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__21) { + if (_la === QuintParser.T__23) { { - this.state = 241; - this.match(QuintParser.T__21); - this.state = 242; + this.state = 263; + this.match(QuintParser.T__23); + this.state = 264; this.name(); } } - this.state = 247; + this.state = 269; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__20) { + if (_la === QuintParser.T__22) { { - this.state = 245; - this.match(QuintParser.T__20); - this.state = 246; + this.state = 267; + this.match(QuintParser.T__22); + this.state = 268; this.fromSource(); } } @@ -960,22 +1047,22 @@ export class QuintParser extends Parser { // @RuleVersion(0) public exportMod(): ExportModContext { let _localctx: ExportModContext = new ExportModContext(this._ctx, this.state); - this.enterRule(_localctx, 20, QuintParser.RULE_exportMod); + this.enterRule(_localctx, 24, QuintParser.RULE_exportMod); let _la: number; try { - this.state = 262; + this.state = 284; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 24, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 26, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 251; - this.match(QuintParser.T__22); - this.state = 252; + this.state = 273; + this.match(QuintParser.T__24); + this.state = 274; this.name(); - this.state = 253; - this.match(QuintParser.T__19); - this.state = 254; + this.state = 275; + this.match(QuintParser.T__21); + this.state = 276; this.identOrStar(); } break; @@ -983,18 +1070,18 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 256; - this.match(QuintParser.T__22); - this.state = 257; + this.state = 278; + this.match(QuintParser.T__24); + this.state = 279; this.name(); - this.state = 260; + this.state = 282; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__21) { + if (_la === QuintParser.T__23) { { - this.state = 258; - this.match(QuintParser.T__21); - this.state = 259; + this.state = 280; + this.match(QuintParser.T__23); + this.state = 281; this.name(); } } @@ -1020,63 +1107,63 @@ export class QuintParser extends Parser { // @RuleVersion(0) public instanceMod(): InstanceModContext { let _localctx: InstanceModContext = new InstanceModContext(this._ctx, this.state); - this.enterRule(_localctx, 22, QuintParser.RULE_instanceMod); + this.enterRule(_localctx, 26, QuintParser.RULE_instanceMod); let _la: number; try { - this.state = 310; + this.state = 332; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 29, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 31, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 264; - this.match(QuintParser.T__18); - this.state = 265; + this.state = 286; + this.match(QuintParser.T__20); + this.state = 287; this.moduleName(); - this.state = 266; + this.state = 288; this.match(QuintParser.LPAREN); { - this.state = 267; + this.state = 289; this.name(); - this.state = 268; + this.state = 290; this.match(QuintParser.ASGN); - this.state = 269; + this.state = 291; this.expr(0); - this.state = 277; + this.state = 299; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 270; + this.state = 292; this.match(QuintParser.T__7); - this.state = 271; + this.state = 293; this.name(); - this.state = 272; + this.state = 294; this.match(QuintParser.ASGN); - this.state = 273; + this.state = 295; this.expr(0); } } - this.state = 279; + this.state = 301; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 280; + this.state = 302; this.match(QuintParser.RPAREN); - this.state = 281; - this.match(QuintParser.T__19); - this.state = 282; + this.state = 303; + this.match(QuintParser.T__21); + this.state = 304; this.match(QuintParser.MUL); - this.state = 285; + this.state = 307; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__20) { + if (_la === QuintParser.T__22) { { - this.state = 283; - this.match(QuintParser.T__20); - this.state = 284; + this.state = 305; + this.match(QuintParser.T__22); + this.state = 306; this.fromSource(); } } @@ -1087,54 +1174,54 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 287; - this.match(QuintParser.T__18); - this.state = 288; + this.state = 309; + this.match(QuintParser.T__20); + this.state = 310; this.moduleName(); - this.state = 289; + this.state = 311; this.match(QuintParser.LPAREN); { - this.state = 290; + this.state = 312; this.name(); - this.state = 291; + this.state = 313; this.match(QuintParser.ASGN); - this.state = 292; + this.state = 314; this.expr(0); - this.state = 300; + this.state = 322; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 293; + this.state = 315; this.match(QuintParser.T__7); - this.state = 294; + this.state = 316; this.name(); - this.state = 295; + this.state = 317; this.match(QuintParser.ASGN); - this.state = 296; + this.state = 318; this.expr(0); } } - this.state = 302; + this.state = 324; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 303; + this.state = 325; this.match(QuintParser.RPAREN); - this.state = 304; - this.match(QuintParser.T__21); - this.state = 305; + this.state = 326; + this.match(QuintParser.T__23); + this.state = 327; this.qualifiedName(); - this.state = 308; + this.state = 330; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__20) { + if (_la === QuintParser.T__22) { { - this.state = 306; - this.match(QuintParser.T__20); - this.state = 307; + this.state = 328; + this.match(QuintParser.T__22); + this.state = 329; this.fromSource(); } } @@ -1160,11 +1247,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public moduleName(): ModuleNameContext { let _localctx: ModuleNameContext = new ModuleNameContext(this._ctx, this.state); - this.enterRule(_localctx, 24, QuintParser.RULE_moduleName); + this.enterRule(_localctx, 28, QuintParser.RULE_moduleName); try { this.enterOuterAlt(_localctx, 1); { - this.state = 312; + this.state = 334; this.qualId(); } } @@ -1185,11 +1272,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public name(): NameContext { let _localctx: NameContext = new NameContext(this._ctx, this.state); - this.enterRule(_localctx, 26, QuintParser.RULE_name); + this.enterRule(_localctx, 30, QuintParser.RULE_name); try { this.enterOuterAlt(_localctx, 1); { - this.state = 314; + this.state = 336; this.qualId(); } } @@ -1210,11 +1297,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public qualifiedName(): QualifiedNameContext { let _localctx: QualifiedNameContext = new QualifiedNameContext(this._ctx, this.state); - this.enterRule(_localctx, 28, QuintParser.RULE_qualifiedName); + this.enterRule(_localctx, 32, QuintParser.RULE_qualifiedName); try { this.enterOuterAlt(_localctx, 1); { - this.state = 316; + this.state = 338; this.qualId(); } } @@ -1235,11 +1322,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public fromSource(): FromSourceContext { let _localctx: FromSourceContext = new FromSourceContext(this._ctx, this.state); - this.enterRule(_localctx, 30, QuintParser.RULE_fromSource); + this.enterRule(_localctx, 34, QuintParser.RULE_fromSource); try { this.enterOuterAlt(_localctx, 1); { - this.state = 318; + this.state = 340; this.match(QuintParser.STRING); } } @@ -1270,68 +1357,68 @@ export class QuintParser extends Parser { let _parentState: number = this.state; let _localctx: TypeContext = new TypeContext(this._ctx, _parentState); let _prevctx: TypeContext = _localctx; - let _startState: number = 32; - this.enterRecursionRule(_localctx, 32, QuintParser.RULE_type, _p); + let _startState: number = 36; + this.enterRecursionRule(_localctx, 36, QuintParser.RULE_type, _p); let _la: number; try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 377; + this.state = 400; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 35, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 38, this._ctx) ) { case 1: { _localctx = new TypeOperContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 321; + this.state = 343; this.match(QuintParser.LPAREN); - this.state = 330; + this.state = 352; this._errHandler.sync(this); _la = this._input.LA(1); - if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__27) | (1 << QuintParser.T__28) | (1 << QuintParser.T__29))) !== 0) || ((((_la - 47)) & ~0x1F) === 0 && ((1 << (_la - 47)) & ((1 << (QuintParser.SET - 47)) | (1 << (QuintParser.LIST - 47)) | (1 << (QuintParser.LPAREN - 47)) | (1 << (QuintParser.LOW_ID - 47)) | (1 << (QuintParser.CAP_ID - 47)))) !== 0)) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__27) | (1 << QuintParser.T__28) | (1 << QuintParser.T__29))) !== 0) || ((((_la - 61)) & ~0x1F) === 0 && ((1 << (_la - 61)) & ((1 << (QuintParser.LPAREN - 61)) | (1 << (QuintParser.SET - 61)) | (1 << (QuintParser.LIST - 61)) | (1 << (QuintParser.LOW_ID - 61)) | (1 << (QuintParser.CAP_ID - 61)))) !== 0)) { { - this.state = 322; + this.state = 344; this.type(0); - this.state = 327; + this.state = 349; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 30, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 32, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 323; + this.state = 345; this.match(QuintParser.T__7); - this.state = 324; + this.state = 346; this.type(0); } } } - this.state = 329; + this.state = 351; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 30, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 32, this._ctx); } } } - this.state = 333; + this.state = 355; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 332; + this.state = 354; this.match(QuintParser.T__7); } } - this.state = 335; + this.state = 357; this.match(QuintParser.RPAREN); - this.state = 336; - this.match(QuintParser.T__24); - this.state = 337; - this.type(11); + this.state = 358; + this.match(QuintParser.T__26); + this.state = 359; + this.type(12); } break; @@ -1340,14 +1427,14 @@ export class QuintParser extends Parser { _localctx = new TypeSetContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 338; + this.state = 360; this.match(QuintParser.SET); - this.state = 339; - this.match(QuintParser.T__25); - this.state = 340; + this.state = 361; + this.match(QuintParser.T__10); + this.state = 362; this.type(0); - this.state = 341; - this.match(QuintParser.T__26); + this.state = 363; + this.match(QuintParser.T__11); } break; @@ -1356,14 +1443,14 @@ export class QuintParser extends Parser { _localctx = new TypeListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 343; + this.state = 365; this.match(QuintParser.LIST); - this.state = 344; - this.match(QuintParser.T__25); - this.state = 345; + this.state = 366; + this.match(QuintParser.T__10); + this.state = 367; this.type(0); - this.state = 346; - this.match(QuintParser.T__26); + this.state = 368; + this.match(QuintParser.T__11); } break; @@ -1372,43 +1459,43 @@ export class QuintParser extends Parser { _localctx = new TypeTupleContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 348; + this.state = 370; this.match(QuintParser.LPAREN); - this.state = 349; + this.state = 371; this.type(0); - this.state = 350; + this.state = 372; this.match(QuintParser.T__7); - this.state = 351; + this.state = 373; this.type(0); - this.state = 356; + this.state = 378; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 33, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 35, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 352; + this.state = 374; this.match(QuintParser.T__7); - this.state = 353; + this.state = 375; this.type(0); } } } - this.state = 358; + this.state = 380; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 33, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 35, this._ctx); } - this.state = 360; + this.state = 382; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 359; + this.state = 381; this.match(QuintParser.T__7); } } - this.state = 362; + this.state = 384; this.match(QuintParser.RPAREN); } break; @@ -1418,11 +1505,19 @@ export class QuintParser extends Parser { _localctx = new TypeRecContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 364; + this.state = 386; this.match(QuintParser.T__1); - this.state = 365; - this.row(); - this.state = 366; + this.state = 388; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === QuintParser.T__12 || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { + { + this.state = 387; + this.row(); + } + } + + this.state = 390; this.match(QuintParser.T__2); } break; @@ -1432,7 +1527,7 @@ export class QuintParser extends Parser { _localctx = new TypeIntContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 368; + this.state = 391; this.match(QuintParser.T__27); } break; @@ -1442,7 +1537,7 @@ export class QuintParser extends Parser { _localctx = new TypeStrContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 369; + this.state = 392; this.match(QuintParser.T__28); } break; @@ -1452,18 +1547,18 @@ export class QuintParser extends Parser { _localctx = new TypeBoolContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 370; + this.state = 393; this.match(QuintParser.T__29); } break; case 9: { - _localctx = new TypeVarContext(_localctx); + _localctx = new TypeVarCaseContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 371; - this.match(QuintParser.LOW_ID); + this.state = 394; + this.typeVar(); } break; @@ -1472,7 +1567,7 @@ export class QuintParser extends Parser { _localctx = new TypeConstContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 372; + this.state = 395; this.qualId(); } break; @@ -1482,19 +1577,19 @@ export class QuintParser extends Parser { _localctx = new TypeParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 373; + this.state = 396; this.match(QuintParser.LPAREN); - this.state = 374; + this.state = 397; this.type(0); - this.state = 375; + this.state = 398; this.match(QuintParser.RPAREN); } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 387; + this.state = 422; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 37, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 41, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { if (this._parseListeners != null) { @@ -1502,44 +1597,82 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 385; + this.state = 420; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 36, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 40, this._ctx) ) { case 1: { _localctx = new TypeFunContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 379; + this.state = 402; + if (!(this.precpred(this._ctx, 14))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); + } + this.state = 403; + this.match(QuintParser.T__25); + this.state = 404; + this.type(14); + } + break; + + case 2: + { + _localctx = new TypeOperContext(new TypeContext(_parentctx, _parentState)); + this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); + this.state = 405; if (!(this.precpred(this._ctx, 13))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 13)"); } - this.state = 380; - this.match(QuintParser.T__23); - this.state = 381; + this.state = 406; + this.match(QuintParser.T__26); + this.state = 407; this.type(13); } break; - case 2: + case 3: { - _localctx = new TypeOperContext(new TypeContext(_parentctx, _parentState)); + _localctx = new TypeAppContext(new TypeContext(_parentctx, _parentState)); + (_localctx as TypeAppContext)._typeCtor = _prevctx; this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 382; - if (!(this.precpred(this._ctx, 12))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 12)"); + this.state = 408; + if (!(this.precpred(this._ctx, 1))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 1)"); + } + { + this.state = 409; + this.match(QuintParser.T__10); + this.state = 410; + (_localctx as TypeAppContext)._type = this.type(0); + (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); + this.state = 415; + this._errHandler.sync(this); + _la = this._input.LA(1); + while (_la === QuintParser.T__7) { + { + { + this.state = 411; + this.match(QuintParser.T__7); + this.state = 412; + (_localctx as TypeAppContext)._type = this.type(0); + (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); + } + } + this.state = 417; + this._errHandler.sync(this); + _la = this._input.LA(1); + } + this.state = 418; + this.match(QuintParser.T__11); } - this.state = 383; - this.match(QuintParser.T__24); - this.state = 384; - this.type(12); } break; } } } - this.state = 389; + this.state = 424; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 37, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 41, this._ctx); } } } @@ -1558,91 +1691,106 @@ export class QuintParser extends Parser { return _localctx; } // @RuleVersion(0) + public typeVar(): TypeVarContext { + let _localctx: TypeVarContext = new TypeVarContext(this._ctx, this.state); + this.enterRule(_localctx, 38, QuintParser.RULE_typeVar); + try { + this.enterOuterAlt(_localctx, 1); + { + this.state = 425; + this.match(QuintParser.LOW_ID); + } + } + catch (re) { + if (re instanceof RecognitionException) { + _localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return _localctx; + } + // @RuleVersion(0) public row(): RowContext { let _localctx: RowContext = new RowContext(this._ctx, this.state); - this.enterRule(_localctx, 34, QuintParser.RULE_row); - let _la: number; + this.enterRule(_localctx, 40, QuintParser.RULE_row); try { let _alt: number; - this.state = 413; + this.state = 448; this._errHandler.sync(this); switch (this._input.LA(1)) { - case QuintParser.T__2: case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 397; + { + this.state = 427; + this.rowLabel(); + this.state = 428; + this.match(QuintParser.T__4); + this.state = 429; + this.type(0); + } + this.state = 438; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 42, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 390; + this.state = 431; + this.match(QuintParser.T__7); + this.state = 432; this.rowLabel(); - this.state = 391; + this.state = 433; this.match(QuintParser.T__4); - this.state = 392; + this.state = 434; this.type(0); - this.state = 393; - this.match(QuintParser.T__7); } } } - this.state = 399; + this.state = 440; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 42, this._ctx); } - this.state = 409; + this.state = 444; this._errHandler.sync(this); - _la = this._input.LA(1); - if (_la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { - { + switch (this._input.LA(1)) { + case QuintParser.T__7: { - this.state = 400; - this.rowLabel(); - this.state = 401; - this.match(QuintParser.T__4); - this.state = 402; - this.type(0); + this.state = 441; + this.match(QuintParser.T__7); } - this.state = 407; - this._errHandler.sync(this); - switch (this._input.LA(1)) { - case QuintParser.T__7: - { - this.state = 404; - this.match(QuintParser.T__7); - } - break; - case QuintParser.T__10: - { - this.state = 405; - this.match(QuintParser.T__10); - { - this.state = 406; - _localctx._rowVar = this.identifier(); - } - } - break; - case QuintParser.T__2: - break; - default: - break; + break; + case QuintParser.T__12: + { + this.state = 442; + this.match(QuintParser.T__12); + { + this.state = 443; + _localctx._rowVar = this.identifier(); } } + break; + case QuintParser.T__2: + break; + default: + break; } - } break; - case QuintParser.T__10: + case QuintParser.T__12: this.enterOuterAlt(_localctx, 2); { - this.state = 411; - this.match(QuintParser.T__10); + this.state = 446; + this.match(QuintParser.T__12); { - this.state = 412; + this.state = 447; _localctx._rowVar = this.identifier(); } } @@ -1668,11 +1816,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public rowLabel(): RowLabelContext { let _localctx: RowLabelContext = new RowLabelContext(this._ctx, this.state); - this.enterRule(_localctx, 36, QuintParser.RULE_rowLabel); + this.enterRule(_localctx, 42, QuintParser.RULE_rowLabel); try { this.enterOuterAlt(_localctx, 1); { - this.state = 415; + this.state = 450; this.simpleId("record"); } } @@ -1703,23 +1851,23 @@ export class QuintParser extends Parser { let _parentState: number = this.state; let _localctx: ExprContext = new ExprContext(this._ctx, _parentState); let _prevctx: ExprContext = _localctx; - let _startState: number = 38; - this.enterRecursionRule(_localctx, 38, QuintParser.RULE_expr, _p); + let _startState: number = 44; + this.enterRecursionRule(_localctx, 44, QuintParser.RULE_expr, _p); let _la: number; try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 567; + this.state = 602; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 59, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 62, this._ctx) ) { case 1: { _localctx = new LambdaConsContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 418; + this.state = 453; this.lambda(); } break; @@ -1729,21 +1877,21 @@ export class QuintParser extends Parser { _localctx = new OperAppContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 419; + this.state = 454; this.normalCallName(); - this.state = 420; + this.state = 455; this.match(QuintParser.LPAREN); - this.state = 422; + this.state = 457; this._errHandler.sync(this); _la = this._input.LA(1); - if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__11) | (1 << QuintParser.T__12) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__25))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 421; + this.state = 456; this.argList(); } } - this.state = 424; + this.state = 459; this.match(QuintParser.RPAREN); } break; @@ -1753,9 +1901,9 @@ export class QuintParser extends Parser { _localctx = new UminusContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 426; + this.state = 461; this.match(QuintParser.MINUS); - this.state = 427; + this.state = 462; this.expr(25); } break; @@ -1765,13 +1913,13 @@ export class QuintParser extends Parser { _localctx = new AsgnContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 428; + this.state = 463; this.qualId(); - this.state = 429; + this.state = 464; this.match(QuintParser.T__31); - this.state = 430; + this.state = 465; this.match(QuintParser.ASGN); - this.state = 431; + this.state = 466; this.expr(21); } break; @@ -1781,41 +1929,41 @@ export class QuintParser extends Parser { _localctx = new AndExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 433; + this.state = 468; this.match(QuintParser.AND); - this.state = 434; + this.state = 469; this.match(QuintParser.T__1); - this.state = 435; + this.state = 470; this.expr(0); - this.state = 440; + this.state = 475; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 43, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 46, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 436; + this.state = 471; this.match(QuintParser.T__7); - this.state = 437; + this.state = 472; this.expr(0); } } } - this.state = 442; + this.state = 477; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 43, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 46, this._ctx); } - this.state = 444; + this.state = 479; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 443; + this.state = 478; this.match(QuintParser.T__7); } } - this.state = 446; + this.state = 481; this.match(QuintParser.T__2); } break; @@ -1825,41 +1973,41 @@ export class QuintParser extends Parser { _localctx = new OrExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 448; + this.state = 483; this.match(QuintParser.OR); - this.state = 449; + this.state = 484; this.match(QuintParser.T__1); - this.state = 450; + this.state = 485; this.expr(0); - this.state = 455; + this.state = 490; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 45, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 48, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 451; + this.state = 486; this.match(QuintParser.T__7); - this.state = 452; + this.state = 487; this.expr(0); } } } - this.state = 457; + this.state = 492; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 45, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 48, this._ctx); } - this.state = 459; + this.state = 494; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 458; + this.state = 493; this.match(QuintParser.T__7); } } - this.state = 461; + this.state = 496; this.match(QuintParser.T__2); } break; @@ -1869,7 +2017,7 @@ export class QuintParser extends Parser { _localctx = new MatchContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 463; + this.state = 498; this.matchSumExpr(); } break; @@ -1879,41 +2027,41 @@ export class QuintParser extends Parser { _localctx = new ActionAllContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 464; + this.state = 499; this.match(QuintParser.T__32); - this.state = 465; + this.state = 500; this.match(QuintParser.T__1); - this.state = 466; + this.state = 501; this.expr(0); - this.state = 471; + this.state = 506; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 47, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 50, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 467; + this.state = 502; this.match(QuintParser.T__7); - this.state = 468; + this.state = 503; this.expr(0); } } } - this.state = 473; + this.state = 508; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 47, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 50, this._ctx); } - this.state = 475; + this.state = 510; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 474; + this.state = 509; this.match(QuintParser.T__7); } } - this.state = 477; + this.state = 512; this.match(QuintParser.T__2); } break; @@ -1923,41 +2071,41 @@ export class QuintParser extends Parser { _localctx = new ActionAnyContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 479; + this.state = 514; this.match(QuintParser.T__33); - this.state = 480; + this.state = 515; this.match(QuintParser.T__1); - this.state = 481; + this.state = 516; this.expr(0); - this.state = 486; + this.state = 521; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 52, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 482; + this.state = 517; this.match(QuintParser.T__7); - this.state = 483; + this.state = 518; this.expr(0); } } } - this.state = 488; + this.state = 523; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 52, this._ctx); } - this.state = 490; + this.state = 525; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 489; + this.state = 524; this.match(QuintParser.T__7); } } - this.state = 492; + this.state = 527; this.match(QuintParser.T__2); } break; @@ -1967,31 +2115,31 @@ export class QuintParser extends Parser { _localctx = new LiteralOrIdContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 498; + this.state = 533; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 494; + this.state = 529; this.qualId(); } break; case QuintParser.INT: { - this.state = 495; + this.state = 530; this.match(QuintParser.INT); } break; case QuintParser.BOOL: { - this.state = 496; + this.state = 531; this.match(QuintParser.BOOL); } break; case QuintParser.STRING: { - this.state = 497; + this.state = 532; this.match(QuintParser.STRING); } break; @@ -2006,43 +2154,43 @@ export class QuintParser extends Parser { _localctx = new TupleContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 500; + this.state = 535; this.match(QuintParser.LPAREN); - this.state = 501; + this.state = 536; this.expr(0); - this.state = 502; + this.state = 537; this.match(QuintParser.T__7); - this.state = 503; + this.state = 538; this.expr(0); - this.state = 508; + this.state = 543; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 52, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 55, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 504; + this.state = 539; this.match(QuintParser.T__7); - this.state = 505; + this.state = 540; this.expr(0); } } } - this.state = 510; + this.state = 545; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 52, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 55, this._ctx); } - this.state = 512; + this.state = 547; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 511; + this.state = 546; this.match(QuintParser.T__7); } } - this.state = 514; + this.state = 549; this.match(QuintParser.RPAREN); } break; @@ -2052,39 +2200,39 @@ export class QuintParser extends Parser { _localctx = new RecordContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 516; + this.state = 551; this.match(QuintParser.T__1); - this.state = 517; + this.state = 552; this.recElem(); - this.state = 522; + this.state = 557; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 54, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 57, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 518; + this.state = 553; this.match(QuintParser.T__7); - this.state = 519; + this.state = 554; this.recElem(); } } } - this.state = 524; + this.state = 559; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 54, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 57, this._ctx); } - this.state = 526; + this.state = 561; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 525; + this.state = 560; this.match(QuintParser.T__7); } } - this.state = 528; + this.state = 563; this.match(QuintParser.T__2); } break; @@ -2094,48 +2242,48 @@ export class QuintParser extends Parser { _localctx = new ListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 530; - this.match(QuintParser.T__25); - this.state = 539; + this.state = 565; + this.match(QuintParser.T__10); + this.state = 574; this._errHandler.sync(this); _la = this._input.LA(1); - if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__11) | (1 << QuintParser.T__12) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__25))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 531; + this.state = 566; this.expr(0); - this.state = 536; + this.state = 571; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 56, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 59, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 532; + this.state = 567; this.match(QuintParser.T__7); - this.state = 533; + this.state = 568; this.expr(0); } } } - this.state = 538; + this.state = 573; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 56, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 59, this._ctx); } } } - this.state = 542; + this.state = 577; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 541; + this.state = 576; this.match(QuintParser.T__7); } } - this.state = 544; - this.match(QuintParser.T__26); + this.state = 579; + this.match(QuintParser.T__11); } break; @@ -2144,19 +2292,19 @@ export class QuintParser extends Parser { _localctx = new IfElseContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 545; + this.state = 580; this.match(QuintParser.T__34); - this.state = 546; + this.state = 581; this.match(QuintParser.LPAREN); - this.state = 547; + this.state = 582; this.expr(0); - this.state = 548; + this.state = 583; this.match(QuintParser.RPAREN); - this.state = 549; + this.state = 584; this.expr(0); - this.state = 550; + this.state = 585; this.match(QuintParser.T__35); - this.state = 551; + this.state = 586; this.expr(5); } break; @@ -2166,9 +2314,9 @@ export class QuintParser extends Parser { _localctx = new LetInContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 553; + this.state = 588; this.operDef(); - this.state = 554; + this.state = 589; this.expr(4); } break; @@ -2178,9 +2326,9 @@ export class QuintParser extends Parser { _localctx = new NondetContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 556; + this.state = 591; this.nondetOperDef(); - this.state = 557; + this.state = 592; this.expr(3); } break; @@ -2190,11 +2338,11 @@ export class QuintParser extends Parser { _localctx = new ParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 559; + this.state = 594; this.match(QuintParser.LPAREN); - this.state = 560; + this.state = 595; this.expr(0); - this.state = 561; + this.state = 596; this.match(QuintParser.RPAREN); } break; @@ -2204,19 +2352,19 @@ export class QuintParser extends Parser { _localctx = new BracesContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 563; + this.state = 598; this.match(QuintParser.T__1); - this.state = 564; + this.state = 599; this.expr(0); - this.state = 565; + this.state = 600; this.match(QuintParser.T__2); } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 618; + this.state = 653; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 63, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 66, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { if (this._parseListeners != null) { @@ -2224,20 +2372,20 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 616; + this.state = 651; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 62, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 65, this._ctx) ) { case 1: { _localctx = new PowContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 569; + this.state = 604; if (!(this.precpred(this._ctx, 26))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 26)"); } - this.state = 570; + this.state = 605; (_localctx as PowContext)._op = this.match(QuintParser.T__30); - this.state = 571; + this.state = 606; this.expr(26); } break; @@ -2246,14 +2394,14 @@ export class QuintParser extends Parser { { _localctx = new MultDivContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 572; + this.state = 607; if (!(this.precpred(this._ctx, 24))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 24)"); } - this.state = 573; + this.state = 608; (_localctx as MultDivContext)._op = this._input.LT(1); _la = this._input.LA(1); - if (!(((((_la - 53)) & ~0x1F) === 0 && ((1 << (_la - 53)) & ((1 << (QuintParser.MUL - 53)) | (1 << (QuintParser.DIV - 53)) | (1 << (QuintParser.MOD - 53)))) !== 0))) { + if (!(((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & ((1 << (QuintParser.MUL - 51)) | (1 << (QuintParser.DIV - 51)) | (1 << (QuintParser.MOD - 51)))) !== 0))) { (_localctx as MultDivContext)._op = this._errHandler.recoverInline(this); } else { if (this._input.LA(1) === Token.EOF) { @@ -2263,7 +2411,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 574; + this.state = 609; this.expr(25); } break; @@ -2272,11 +2420,11 @@ export class QuintParser extends Parser { { _localctx = new PlusMinusContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 575; + this.state = 610; if (!(this.precpred(this._ctx, 23))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 23)"); } - this.state = 576; + this.state = 611; (_localctx as PlusMinusContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(_la === QuintParser.PLUS || _la === QuintParser.MINUS)) { @@ -2289,7 +2437,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 577; + this.state = 612; this.expr(24); } break; @@ -2298,14 +2446,14 @@ export class QuintParser extends Parser { { _localctx = new RelationsContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 578; + this.state = 613; if (!(this.precpred(this._ctx, 22))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 22)"); } - this.state = 579; + this.state = 614; (_localctx as RelationsContext)._op = this._input.LT(1); _la = this._input.LA(1); - if (!(((((_la - 56)) & ~0x1F) === 0 && ((1 << (_la - 56)) & ((1 << (QuintParser.GT - 56)) | (1 << (QuintParser.LT - 56)) | (1 << (QuintParser.GE - 56)) | (1 << (QuintParser.LE - 56)) | (1 << (QuintParser.NE - 56)) | (1 << (QuintParser.EQ - 56)))) !== 0))) { + if (!(((((_la - 54)) & ~0x1F) === 0 && ((1 << (_la - 54)) & ((1 << (QuintParser.GT - 54)) | (1 << (QuintParser.LT - 54)) | (1 << (QuintParser.GE - 54)) | (1 << (QuintParser.LE - 54)) | (1 << (QuintParser.NE - 54)) | (1 << (QuintParser.EQ - 54)))) !== 0))) { (_localctx as RelationsContext)._op = this._errHandler.recoverInline(this); } else { if (this._input.LA(1) === Token.EOF) { @@ -2315,7 +2463,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 580; + this.state = 615; this.expr(23); } break; @@ -2324,13 +2472,13 @@ export class QuintParser extends Parser { { _localctx = new ErrorEqContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 581; + this.state = 616; if (!(this.precpred(this._ctx, 20))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 20)"); } - this.state = 582; + this.state = 617; this.match(QuintParser.ASGN); - this.state = 583; + this.state = 618; this.expr(21); const m = "[QNT006] unexpected '=', did you mean '=='?" @@ -2343,13 +2491,13 @@ export class QuintParser extends Parser { { _localctx = new AndContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 586; + this.state = 621; if (!(this.precpred(this._ctx, 18))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 18)"); } - this.state = 587; + this.state = 622; this.match(QuintParser.AND); - this.state = 588; + this.state = 623; this.expr(19); } break; @@ -2358,13 +2506,13 @@ export class QuintParser extends Parser { { _localctx = new OrContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 589; + this.state = 624; if (!(this.precpred(this._ctx, 16))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 16)"); } - this.state = 590; + this.state = 625; this.match(QuintParser.OR); - this.state = 591; + this.state = 626; this.expr(17); } break; @@ -2373,13 +2521,13 @@ export class QuintParser extends Parser { { _localctx = new IffContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 592; + this.state = 627; if (!(this.precpred(this._ctx, 15))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 15)"); } - this.state = 593; + this.state = 628; this.match(QuintParser.IFF); - this.state = 594; + this.state = 629; this.expr(16); } break; @@ -2388,13 +2536,13 @@ export class QuintParser extends Parser { { _localctx = new ImpliesContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 595; + this.state = 630; if (!(this.precpred(this._ctx, 14))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); } - this.state = 596; + this.state = 631; this.match(QuintParser.IMPLIES); - this.state = 597; + this.state = 632; this.expr(15); } break; @@ -2403,13 +2551,13 @@ export class QuintParser extends Parser { { _localctx = new PairContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 598; + this.state = 633; if (!(this.precpred(this._ctx, 8))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 8)"); } - this.state = 599; - this.match(QuintParser.T__23); - this.state = 600; + this.state = 634; + this.match(QuintParser.T__25); + this.state = 635; this.expr(9); } break; @@ -2418,32 +2566,32 @@ export class QuintParser extends Parser { { _localctx = new DotCallContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 601; + this.state = 636; if (!(this.precpred(this._ctx, 30))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 30)"); } - this.state = 602; - this.match(QuintParser.T__19); - this.state = 603; + this.state = 637; + this.match(QuintParser.T__21); + this.state = 638; this.nameAfterDot(); - this.state = 609; + this.state = 644; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 61, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 64, this._ctx) ) { case 1: { - this.state = 604; + this.state = 639; this.match(QuintParser.LPAREN); - this.state = 606; + this.state = 641; this._errHandler.sync(this); _la = this._input.LA(1); - if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__11) | (1 << QuintParser.T__12) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__25))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 605; + this.state = 640; this.argList(); } } - this.state = 608; + this.state = 643; this.match(QuintParser.RPAREN); } break; @@ -2455,24 +2603,24 @@ export class QuintParser extends Parser { { _localctx = new ListAppContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 611; + this.state = 646; if (!(this.precpred(this._ctx, 27))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 27)"); } - this.state = 612; - this.match(QuintParser.T__25); - this.state = 613; + this.state = 647; + this.match(QuintParser.T__10); + this.state = 648; this.expr(0); - this.state = 614; - this.match(QuintParser.T__26); + this.state = 649; + this.match(QuintParser.T__11); } break; } } } - this.state = 620; + this.state = 655; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 63, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 66, this._ctx); } } } @@ -2493,48 +2641,48 @@ export class QuintParser extends Parser { // @RuleVersion(0) public matchSumExpr(): MatchSumExprContext { let _localctx: MatchSumExprContext = new MatchSumExprContext(this._ctx, this.state); - this.enterRule(_localctx, 40, QuintParser.RULE_matchSumExpr); + this.enterRule(_localctx, 46, QuintParser.RULE_matchSumExpr); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 621; + this.state = 656; this.match(QuintParser.MATCH); - this.state = 622; + this.state = 657; this.expr(0); - this.state = 623; + this.state = 658; this.match(QuintParser.T__1); - this.state = 625; + this.state = 660; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__10) { + if (_la === QuintParser.T__12) { { - this.state = 624; - this.match(QuintParser.T__10); + this.state = 659; + this.match(QuintParser.T__12); } } - this.state = 627; + this.state = 662; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); - this.state = 632; + this.state = 667; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la === QuintParser.T__10) { + while (_la === QuintParser.T__12) { { { - this.state = 628; - this.match(QuintParser.T__10); - this.state = 629; + this.state = 663; + this.match(QuintParser.T__12); + this.state = 664; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); } } - this.state = 634; + this.state = 669; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 635; + this.state = 670; this.match(QuintParser.T__2); } } @@ -2555,32 +2703,32 @@ export class QuintParser extends Parser { // @RuleVersion(0) public matchSumCase(): MatchSumCaseContext { let _localctx: MatchSumCaseContext = new MatchSumCaseContext(this._ctx, this.state); - this.enterRule(_localctx, 42, QuintParser.RULE_matchSumCase); + this.enterRule(_localctx, 48, QuintParser.RULE_matchSumCase); try { this.enterOuterAlt(_localctx, 1); { - this.state = 639; + this.state = 674; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 637; + this.state = 672; _localctx._variantMatch = this.matchSumVariant(); } break; case QuintParser.T__36: { - this.state = 638; + this.state = 673; _localctx._wildCardMatch = this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 641; - this.match(QuintParser.T__24); - this.state = 642; + this.state = 676; + this.match(QuintParser.T__26); + this.state = 677; this.expr(0); } } @@ -2601,42 +2749,42 @@ export class QuintParser extends Parser { // @RuleVersion(0) public matchSumVariant(): MatchSumVariantContext { let _localctx: MatchSumVariantContext = new MatchSumVariantContext(this._ctx, this.state); - this.enterRule(_localctx, 44, QuintParser.RULE_matchSumVariant); + this.enterRule(_localctx, 50, QuintParser.RULE_matchSumVariant); let _la: number; try { this.enterOuterAlt(_localctx, 1); { { - this.state = 644; + this.state = 679; _localctx._variantLabel = this.simpleId("variant label"); } - this.state = 651; + this.state = 686; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.LPAREN) { { - this.state = 645; + this.state = 680; this.match(QuintParser.LPAREN); - this.state = 648; + this.state = 683; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 646; + this.state = 681; _localctx._variantParam = this.simpleId("match case parameter"); } break; case QuintParser.T__36: { - this.state = 647; + this.state = 682; this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 650; + this.state = 685; this.match(QuintParser.RPAREN); } } @@ -2660,17 +2808,17 @@ export class QuintParser extends Parser { // @RuleVersion(0) public declarationOrExpr(): DeclarationOrExprContext { let _localctx: DeclarationOrExprContext = new DeclarationOrExprContext(this._ctx, this.state); - this.enterRule(_localctx, 46, QuintParser.RULE_declarationOrExpr); + this.enterRule(_localctx, 52, QuintParser.RULE_declarationOrExpr); try { - this.state = 662; + this.state = 697; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 69, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 72, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 653; + this.state = 688; this.declaration(); - this.state = 654; + this.state = 689; this.match(QuintParser.EOF); } break; @@ -2678,9 +2826,9 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 656; + this.state = 691; this.expr(0); - this.state = 657; + this.state = 692; this.match(QuintParser.EOF); } break; @@ -2688,9 +2836,9 @@ export class QuintParser extends Parser { case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 659; + this.state = 694; this.match(QuintParser.DOCCOMMENT); - this.state = 660; + this.state = 695; this.match(QuintParser.EOF); } break; @@ -2698,7 +2846,7 @@ export class QuintParser extends Parser { case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 661; + this.state = 696; this.match(QuintParser.EOF); } break; @@ -2721,15 +2869,15 @@ export class QuintParser extends Parser { // @RuleVersion(0) public lambda(): LambdaContext { let _localctx: LambdaContext = new LambdaContext(this._ctx, this.state); - this.enterRule(_localctx, 48, QuintParser.RULE_lambda); + this.enterRule(_localctx, 54, QuintParser.RULE_lambda); try { - this.state = 666; + this.state = 701; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 70, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 73, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 664; + this.state = 699; this.lambdaUnsugared(); } break; @@ -2737,7 +2885,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 665; + this.state = 700; this.lambdaTupleSugar(); } break; @@ -2760,10 +2908,10 @@ export class QuintParser extends Parser { // @RuleVersion(0) public lambdaUnsugared(): LambdaUnsugaredContext { let _localctx: LambdaUnsugaredContext = new LambdaUnsugaredContext(this._ctx, this.state); - this.enterRule(_localctx, 50, QuintParser.RULE_lambdaUnsugared); + this.enterRule(_localctx, 56, QuintParser.RULE_lambdaUnsugared); let _la: number; try { - this.state = 685; + this.state = 720; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: @@ -2771,42 +2919,42 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 668; + this.state = 703; this.parameter(); - this.state = 669; - this.match(QuintParser.T__24); - this.state = 670; + this.state = 704; + this.match(QuintParser.T__26); + this.state = 705; this.expr(0); } break; case QuintParser.LPAREN: this.enterOuterAlt(_localctx, 2); { - this.state = 672; + this.state = 707; this.match(QuintParser.LPAREN); - this.state = 673; + this.state = 708; this.parameter(); - this.state = 678; + this.state = 713; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 674; + this.state = 709; this.match(QuintParser.T__7); - this.state = 675; + this.state = 710; this.parameter(); } } - this.state = 680; + this.state = 715; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 681; + this.state = 716; this.match(QuintParser.RPAREN); - this.state = 682; - this.match(QuintParser.T__24); - this.state = 683; + this.state = 717; + this.match(QuintParser.T__26); + this.state = 718; this.expr(0); } break; @@ -2831,40 +2979,40 @@ export class QuintParser extends Parser { // @RuleVersion(0) public lambdaTupleSugar(): LambdaTupleSugarContext { let _localctx: LambdaTupleSugarContext = new LambdaTupleSugarContext(this._ctx, this.state); - this.enterRule(_localctx, 52, QuintParser.RULE_lambdaTupleSugar); + this.enterRule(_localctx, 58, QuintParser.RULE_lambdaTupleSugar); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 687; + this.state = 722; this.match(QuintParser.LPAREN); - this.state = 688; + this.state = 723; this.match(QuintParser.LPAREN); - this.state = 689; + this.state = 724; this.parameter(); - this.state = 692; + this.state = 727; this._errHandler.sync(this); _la = this._input.LA(1); do { { { - this.state = 690; + this.state = 725; this.match(QuintParser.T__7); - this.state = 691; + this.state = 726; this.parameter(); } } - this.state = 694; + this.state = 729; this._errHandler.sync(this); _la = this._input.LA(1); } while (_la === QuintParser.T__7); - this.state = 696; + this.state = 731; this.match(QuintParser.RPAREN); - this.state = 697; + this.state = 732; this.match(QuintParser.RPAREN); - this.state = 698; - this.match(QuintParser.T__24); - this.state = 699; + this.state = 733; + this.match(QuintParser.T__26); + this.state = 734; this.expr(0); } } @@ -2885,15 +3033,15 @@ export class QuintParser extends Parser { // @RuleVersion(0) public identOrHole(): IdentOrHoleContext { let _localctx: IdentOrHoleContext = new IdentOrHoleContext(this._ctx, this.state); - this.enterRule(_localctx, 54, QuintParser.RULE_identOrHole); + this.enterRule(_localctx, 60, QuintParser.RULE_identOrHole); try { - this.state = 703; + this.state = 738; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: this.enterOuterAlt(_localctx, 1); { - this.state = 701; + this.state = 736; this.match(QuintParser.T__36); } break; @@ -2901,7 +3049,7 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 702; + this.state = 737; this.qualId(); } break; @@ -2926,11 +3074,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public parameter(): ParameterContext { let _localctx: ParameterContext = new ParameterContext(this._ctx, this.state); - this.enterRule(_localctx, 56, QuintParser.RULE_parameter); + this.enterRule(_localctx, 62, QuintParser.RULE_parameter); try { this.enterOuterAlt(_localctx, 1); { - this.state = 705; + this.state = 740; this.identOrHole(); } } @@ -2951,15 +3099,15 @@ export class QuintParser extends Parser { // @RuleVersion(0) public identOrStar(): IdentOrStarContext { let _localctx: IdentOrStarContext = new IdentOrStarContext(this._ctx, this.state); - this.enterRule(_localctx, 58, QuintParser.RULE_identOrStar); + this.enterRule(_localctx, 64, QuintParser.RULE_identOrStar); try { - this.state = 709; + this.state = 744; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.MUL: this.enterOuterAlt(_localctx, 1); { - this.state = 707; + this.state = 742; this.match(QuintParser.MUL); } break; @@ -2967,7 +3115,7 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 708; + this.state = 743; this.qualId(); } break; @@ -2992,26 +3140,26 @@ export class QuintParser extends Parser { // @RuleVersion(0) public argList(): ArgListContext { let _localctx: ArgListContext = new ArgListContext(this._ctx, this.state); - this.enterRule(_localctx, 60, QuintParser.RULE_argList); + this.enterRule(_localctx, 66, QuintParser.RULE_argList); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 711; + this.state = 746; this.expr(0); - this.state = 716; + this.state = 751; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 712; + this.state = 747; this.match(QuintParser.T__7); - this.state = 713; + this.state = 748; this.expr(0); } } - this.state = 718; + this.state = 753; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -3034,29 +3182,29 @@ export class QuintParser extends Parser { // @RuleVersion(0) public recElem(): RecElemContext { let _localctx: RecElemContext = new RecElemContext(this._ctx, this.state); - this.enterRule(_localctx, 62, QuintParser.RULE_recElem); + this.enterRule(_localctx, 68, QuintParser.RULE_recElem); try { - this.state = 725; + this.state = 760; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 719; + this.state = 754; this.simpleId("record"); - this.state = 720; + this.state = 755; this.match(QuintParser.T__4); - this.state = 721; + this.state = 756; this.expr(0); } break; case QuintParser.T__37: this.enterOuterAlt(_localctx, 2); { - this.state = 723; + this.state = 758; this.match(QuintParser.T__37); - this.state = 724; + this.state = 759; this.expr(0); } break; @@ -3081,17 +3229,17 @@ export class QuintParser extends Parser { // @RuleVersion(0) public normalCallName(): NormalCallNameContext { let _localctx: NormalCallNameContext = new NormalCallNameContext(this._ctx, this.state); - this.enterRule(_localctx, 64, QuintParser.RULE_normalCallName); + this.enterRule(_localctx, 70, QuintParser.RULE_normalCallName); let _la: number; try { - this.state = 729; + this.state = 764; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 727; + this.state = 762; this.qualId(); } break; @@ -3099,15 +3247,15 @@ export class QuintParser extends Parser { case QuintParser.OR: case QuintParser.IFF: case QuintParser.IMPLIES: + case QuintParser.MAP: case QuintParser.SET: case QuintParser.LIST: - case QuintParser.MAP: this.enterOuterAlt(_localctx, 2); { - this.state = 728; + this.state = 763; _localctx._op = this._input.LT(1); _la = this._input.LA(1); - if (!(((((_la - 43)) & ~0x1F) === 0 && ((1 << (_la - 43)) & ((1 << (QuintParser.AND - 43)) | (1 << (QuintParser.OR - 43)) | (1 << (QuintParser.IFF - 43)) | (1 << (QuintParser.IMPLIES - 43)) | (1 << (QuintParser.SET - 43)) | (1 << (QuintParser.LIST - 43)) | (1 << (QuintParser.MAP - 43)))) !== 0))) { + if (!(((((_la - 43)) & ~0x1F) === 0 && ((1 << (_la - 43)) & ((1 << (QuintParser.AND - 43)) | (1 << (QuintParser.OR - 43)) | (1 << (QuintParser.IFF - 43)) | (1 << (QuintParser.IMPLIES - 43)) | (1 << (QuintParser.MAP - 43)) | (1 << (QuintParser.SET - 43)) | (1 << (QuintParser.LIST - 43)))) !== 0))) { _localctx._op = this._errHandler.recoverInline(this); } else { if (this._input.LA(1) === Token.EOF) { @@ -3140,17 +3288,17 @@ export class QuintParser extends Parser { // @RuleVersion(0) public nameAfterDot(): NameAfterDotContext { let _localctx: NameAfterDotContext = new NameAfterDotContext(this._ctx, this.state); - this.enterRule(_localctx, 66, QuintParser.RULE_nameAfterDot); + this.enterRule(_localctx, 72, QuintParser.RULE_nameAfterDot); let _la: number; try { - this.state = 733; + this.state = 768; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 731; + this.state = 766; this.qualId(); } break; @@ -3160,7 +3308,7 @@ export class QuintParser extends Parser { case QuintParser.IMPLIES: this.enterOuterAlt(_localctx, 2); { - this.state = 732; + this.state = 767; _localctx._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 43)) & ~0x1F) === 0 && ((1 << (_la - 43)) & ((1 << (QuintParser.AND - 43)) | (1 << (QuintParser.OR - 43)) | (1 << (QuintParser.IFF - 43)) | (1 << (QuintParser.IMPLIES - 43)))) !== 0))) { @@ -3196,12 +3344,12 @@ export class QuintParser extends Parser { // @RuleVersion(0) public operator(): OperatorContext { let _localctx: OperatorContext = new OperatorContext(this._ctx, this.state); - this.enterRule(_localctx, 68, QuintParser.RULE_operator); + this.enterRule(_localctx, 74, QuintParser.RULE_operator); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 735; + this.state = 770; _la = this._input.LA(1); if (!(((((_la - 31)) & ~0x1F) === 0 && ((1 << (_la - 31)) & ((1 << (QuintParser.T__30 - 31)) | (1 << (QuintParser.AND - 31)) | (1 << (QuintParser.OR - 31)) | (1 << (QuintParser.IFF - 31)) | (1 << (QuintParser.IMPLIES - 31)) | (1 << (QuintParser.PLUS - 31)) | (1 << (QuintParser.MINUS - 31)) | (1 << (QuintParser.MUL - 31)) | (1 << (QuintParser.DIV - 31)) | (1 << (QuintParser.MOD - 31)) | (1 << (QuintParser.GT - 31)) | (1 << (QuintParser.LT - 31)) | (1 << (QuintParser.GE - 31)) | (1 << (QuintParser.LE - 31)) | (1 << (QuintParser.NE - 31)) | (1 << (QuintParser.EQ - 31)))) !== 0))) { this._errHandler.recoverInline(this); @@ -3232,12 +3380,12 @@ export class QuintParser extends Parser { // @RuleVersion(0) public literal(): LiteralContext { let _localctx: LiteralContext = new LiteralContext(this._ctx, this.state); - this.enterRule(_localctx, 70, QuintParser.RULE_literal); + this.enterRule(_localctx, 76, QuintParser.RULE_literal); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 737; + this.state = 772; _la = this._input.LA(1); if (!(((((_la - 40)) & ~0x1F) === 0 && ((1 << (_la - 40)) & ((1 << (QuintParser.STRING - 40)) | (1 << (QuintParser.BOOL - 40)) | (1 << (QuintParser.INT - 40)))) !== 0))) { this._errHandler.recoverInline(this); @@ -3268,30 +3416,30 @@ export class QuintParser extends Parser { // @RuleVersion(0) public qualId(): QualIdContext { let _localctx: QualIdContext = new QualIdContext(this._ctx, this.state); - this.enterRule(_localctx, 72, QuintParser.RULE_qualId); + this.enterRule(_localctx, 78, QuintParser.RULE_qualId); try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 739; + this.state = 774; this.identifier(); - this.state = 744; + this.state = 779; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 80, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 83, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 740; + this.state = 775; this.match(QuintParser.T__38); - this.state = 741; + this.state = 776; this.identifier(); } } } - this.state = 746; + this.state = 781; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 80, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 83, this._ctx); } } } @@ -3312,15 +3460,15 @@ export class QuintParser extends Parser { // @RuleVersion(0) public simpleId(context: string): SimpleIdContext { let _localctx: SimpleIdContext = new SimpleIdContext(this._ctx, this.state, context); - this.enterRule(_localctx, 74, QuintParser.RULE_simpleId); + this.enterRule(_localctx, 80, QuintParser.RULE_simpleId); try { - this.state = 751; + this.state = 786; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 81, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 84, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 747; + this.state = 782; this.identifier(); } break; @@ -3328,7 +3476,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 748; + this.state = 783; _localctx._qualId = this.qualId(); const err = quintErrorToString( @@ -3359,12 +3507,12 @@ export class QuintParser extends Parser { // @RuleVersion(0) public identifier(): IdentifierContext { let _localctx: IdentifierContext = new IdentifierContext(this._ctx, this.state); - this.enterRule(_localctx, 76, QuintParser.RULE_identifier); + this.enterRule(_localctx, 82, QuintParser.RULE_identifier); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 753; + this.state = 788; _la = this._input.LA(1); if (!(_la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID)) { this._errHandler.recoverInline(this); @@ -3395,10 +3543,10 @@ export class QuintParser extends Parser { public sempred(_localctx: RuleContext, ruleIndex: number, predIndex: number): boolean { switch (ruleIndex) { - case 16: + case 18: return this.type_sempred(_localctx as TypeContext, predIndex); - case 19: + case 22: return this.expr_sempred(_localctx as ExprContext, predIndex); } return true; @@ -3406,49 +3554,52 @@ export class QuintParser extends Parser { private type_sempred(_localctx: TypeContext, predIndex: number): boolean { switch (predIndex) { case 0: - return this.precpred(this._ctx, 13); + return this.precpred(this._ctx, 14); case 1: - return this.precpred(this._ctx, 12); + return this.precpred(this._ctx, 13); + + case 2: + return this.precpred(this._ctx, 1); } return true; } private expr_sempred(_localctx: ExprContext, predIndex: number): boolean { switch (predIndex) { - case 2: + case 3: return this.precpred(this._ctx, 26); - case 3: + case 4: return this.precpred(this._ctx, 24); - case 4: + case 5: return this.precpred(this._ctx, 23); - case 5: + case 6: return this.precpred(this._ctx, 22); - case 6: + case 7: return this.precpred(this._ctx, 20); - case 7: + case 8: return this.precpred(this._ctx, 18); - case 8: + case 9: return this.precpred(this._ctx, 16); - case 9: + case 10: return this.precpred(this._ctx, 15); - case 10: + case 11: return this.precpred(this._ctx, 14); - case 11: + case 12: return this.precpred(this._ctx, 8); - case 12: + case 13: return this.precpred(this._ctx, 30); - case 13: + case 14: return this.precpred(this._ctx, 27); } return true; @@ -3456,405 +3607,423 @@ export class QuintParser extends Parser { private static readonly _serializedATNSegments: number = 2; private static readonly _serializedATNSegment0: string = - "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03H\u02F6\x04\x02" + + "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03H\u0319\x04\x02" + "\t\x02\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06\x04\x07" + "\t\x07\x04\b\t\b\x04\t\t\t\x04\n\t\n\x04\v\t\v\x04\f\t\f\x04\r\t\r\x04" + "\x0E\t\x0E\x04\x0F\t\x0F\x04\x10\t\x10\x04\x11\t\x11\x04\x12\t\x12\x04" + "\x13\t\x13\x04\x14\t\x14\x04\x15\t\x15\x04\x16\t\x16\x04\x17\t\x17\x04" + "\x18\t\x18\x04\x19\t\x19\x04\x1A\t\x1A\x04\x1B\t\x1B\x04\x1C\t\x1C\x04" + "\x1D\t\x1D\x04\x1E\t\x1E\x04\x1F\t\x1F\x04 \t \x04!\t!\x04\"\t\"\x04#" + - "\t#\x04$\t$\x04%\t%\x04&\t&\x04\'\t\'\x04(\t(\x03\x02\x06\x02R\n\x02\r" + - "\x02\x0E\x02S\x03\x02\x03\x02\x03\x03\x07\x03Y\n\x03\f\x03\x0E\x03\\\v" + - "\x03\x03\x03\x03\x03\x03\x03\x03\x03\x07\x03b\n\x03\f\x03\x0E\x03e\v\x03" + - "\x03\x03\x03\x03\x03\x04\x07\x04j\n\x04\f\x04\x0E\x04m\v\x04\x03\x04\x03" + - "\x04\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03" + - "\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03" + - "\x05\x03\x05\x03\x05\x05\x05\x85\n\x05\x03\x06\x03\x06\x03\x06\x03\x06" + - "\x03\x06\x03\x06\x07\x06\x8D\n\x06\f\x06\x0E\x06\x90\v\x06\x05\x06\x92" + - "\n\x06\x03\x06\x03\x06\x03\x06\x05\x06\x97\n\x06\x03\x06\x03\x06\x03\x06" + - "\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x07\x06" + - "\xA4\n\x06\f\x06\x0E\x06\xA7\v\x06\x03\x06\x03\x06\x03\x06\x03\x06\x05" + - "\x06\xAD\n\x06\x03\x06\x03\x06\x05\x06\xB1\n\x06\x03\x06\x05\x06\xB4\n" + - "\x06\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03" + - "\x07\x03\x07\x03\x07\x05\x07\xC1\n\x07\x03\x07\x03\x07\x03\x07\x07\x07" + - "\xC6\n\x07\f\x07\x0E\x07\xC9\v\x07\x05\x07\xCB\n\x07\x03\b\x03\b\x03\b" + - "\x03\b\x03\b\x05\b\xD2\n\b\x03\t\x03\t\x03\t\x03\t\x05\t\xD8\n\t\x03\t" + - "\x03\t\x03\t\x05\t\xDD\n\t\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03" + - "\n\x03\n\x05\n\xE8\n\n\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x05\v\xF0\n" + - "\v\x03\v\x03\v\x03\v\x03\v\x05\v\xF6\n\v\x03\v\x03\v\x05\v\xFA\n\v\x05" + - "\v\xFC\n\v\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x05\f" + - "\u0107\n\f\x05\f\u0109\n\f\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03" + - "\r\x03\r\x03\r\x03\r\x07\r\u0116\n\r\f\r\x0E\r\u0119\v\r\x03\r\x03\r\x03" + - "\r\x03\r\x03\r\x05\r\u0120\n\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03" + - "\r\x03\r\x03\r\x03\r\x03\r\x07\r\u012D\n\r\f\r\x0E\r\u0130\v\r\x03\r\x03" + - "\r\x03\r\x03\r\x03\r\x05\r\u0137\n\r\x05\r\u0139\n\r\x03\x0E\x03\x0E\x03" + - "\x0F\x03\x0F\x03\x10\x03\x10\x03\x11\x03\x11\x03\x12\x03\x12\x03\x12\x03" + - "\x12\x03\x12\x07\x12\u0148\n\x12\f\x12\x0E\x12\u014B\v\x12\x05\x12\u014D" + - "\n\x12\x03\x12\x05\x12\u0150\n\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03" + - "\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03" + - "\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x07\x12\u0165\n\x12\f\x12" + - "\x0E\x12\u0168\v\x12\x03\x12\x05\x12\u016B\n\x12\x03\x12\x03\x12\x03\x12" + - "\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12" + - "\x03\x12\x03\x12\x03\x12\x05\x12\u017C\n\x12\x03\x12\x03\x12\x03\x12\x03" + - "\x12\x03\x12\x03\x12\x07\x12\u0184\n\x12\f\x12\x0E\x12\u0187\v\x12\x03" + - "\x13\x03\x13\x03\x13\x03\x13\x03\x13\x07\x13\u018E\n\x13\f\x13\x0E\x13" + - "\u0191\v\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x05" + - "\x13\u019A\n\x13\x05\x13\u019C\n\x13\x03\x13\x03\x13\x05\x13\u01A0\n\x13" + - "\x03\x14\x03\x14\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x05\x15\u01A9" + - "\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15" + - "\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15\u01B9\n\x15\f" + - "\x15\x0E\x15\u01BC\v\x15\x03\x15\x05\x15\u01BF\n\x15\x03\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15\u01C8\n\x15\f\x15\x0E\x15" + - "\u01CB\v\x15\x03\x15\x05\x15\u01CE\n\x15\x03\x15\x03\x15\x03\x15\x03\x15" + - "\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15\u01D8\n\x15\f\x15\x0E\x15\u01DB" + - "\v\x15\x03\x15\x05\x15\u01DE\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x07\x15\u01E7\n\x15\f\x15\x0E\x15\u01EA\v\x15\x03" + - "\x15\x05\x15\u01ED\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15" + - "\x05\x15\u01F5\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07" + - "\x15\u01FD\n\x15\f\x15\x0E\x15\u0200\v\x15\x03\x15\x05\x15\u0203\n\x15" + - "\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15\u020B\n\x15\f" + - "\x15\x0E\x15\u020E\v\x15\x03\x15\x05\x15\u0211\n\x15\x03\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x03\x15\x07\x15\u0219\n\x15\f\x15\x0E\x15\u021C\v" + - "\x15\x05\x15\u021E\n\x15\x03\x15\x05\x15\u0221\n\x15\x03\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x05\x15\u023A\n\x15\x03\x15\x03\x15\x03\x15\x03\x15" + - "\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15" + - "\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15" + - "\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15" + - "\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x05\x15\u0261\n\x15\x03" + - "\x15\x05\x15\u0264\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15" + - "\u026B\n\x15\f\x15\x0E\x15\u026E\v\x15\x03\x16\x03\x16\x03\x16\x03\x16" + - "\x05\x16\u0274\n\x16\x03\x16\x03\x16\x03\x16\x07\x16\u0279\n\x16\f\x16" + - "\x0E\x16\u027C\v\x16\x03\x16\x03\x16\x03\x17\x03\x17\x05\x17\u0282\n\x17" + - "\x03\x17\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u028B" + - "\n\x18\x03\x18\x05\x18\u028E\n\x18\x03\x19\x03\x19\x03\x19\x03\x19\x03" + - "\x19\x03\x19\x03\x19\x03\x19\x03\x19\x05\x19\u0299\n\x19\x03\x1A\x03\x1A" + - "\x05\x1A\u029D\n\x1A\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03" + - "\x1B\x03\x1B\x07\x1B\u02A7\n\x1B\f\x1B\x0E\x1B\u02AA\v\x1B\x03\x1B\x03" + - "\x1B\x03\x1B\x03\x1B\x05\x1B\u02B0\n\x1B\x03\x1C\x03\x1C\x03\x1C\x03\x1C" + - "\x03\x1C\x06\x1C\u02B7\n\x1C\r\x1C\x0E\x1C\u02B8\x03\x1C\x03\x1C\x03\x1C" + - "\x03\x1C\x03\x1C\x03\x1D\x03\x1D\x05\x1D\u02C2\n\x1D\x03\x1E\x03\x1E\x03" + - "\x1F\x03\x1F\x05\x1F\u02C8\n\x1F\x03 \x03 \x03 \x07 \u02CD\n \f \x0E " + - "\u02D0\v \x03!\x03!\x03!\x03!\x03!\x03!\x05!\u02D8\n!\x03\"\x03\"\x05" + - "\"\u02DC\n\"\x03#\x03#\x05#\u02E0\n#\x03$\x03$\x03%\x03%\x03&\x03&\x03" + - "&\x07&\u02E9\n&\f&\x0E&\u02EC\v&\x03\'\x03\'\x03\'\x03\'\x05\'\u02F2\n" + - "\'\x03(\x03(\x03(\x02\x02\x04\"()\x02\x02\x04\x02\x06\x02\b\x02\n\x02" + - "\f\x02\x0E\x02\x10\x02\x12\x02\x14\x02\x16\x02\x18\x02\x1A\x02\x1C\x02" + - "\x1E\x02 \x02\"\x02$\x02&\x02(\x02*\x02,\x02.\x020\x022\x024\x026\x02" + - "8\x02:\x02<\x02>\x02@\x02B\x02D\x02F\x02H\x02J\x02L\x02N\x02\x02\n\x03" + - "\x0279\x03\x0256\x03\x02:?\x03\x02-3\x03\x02-0\x05\x02!!-05?\x03\x02*" + - ",\x03\x02CD\x02\u0356\x02Q\x03\x02\x02\x02\x04Z\x03\x02\x02\x02\x06k\x03" + - "\x02\x02\x02\b\x84\x03\x02\x02\x02\n\x86\x03\x02\x02\x02\f\xCA\x03\x02" + - "\x02\x02\x0E\xCC\x03\x02\x02\x02\x10\xD3\x03\x02\x02\x02\x12\xE7\x03\x02" + - "\x02\x02\x14\xFB\x03\x02\x02\x02\x16\u0108\x03\x02\x02\x02\x18\u0138\x03" + - "\x02\x02\x02\x1A\u013A\x03\x02\x02\x02\x1C\u013C\x03\x02\x02\x02\x1E\u013E" + - "\x03\x02\x02\x02 \u0140\x03\x02\x02\x02\"\u017B\x03\x02\x02\x02$\u019F" + - "\x03\x02\x02\x02&\u01A1\x03\x02\x02\x02(\u0239\x03\x02\x02\x02*\u026F" + - "\x03\x02\x02\x02,\u0281\x03\x02\x02\x02.\u0286\x03\x02\x02\x020\u0298" + - "\x03\x02\x02\x022\u029C\x03\x02\x02\x024\u02AF\x03\x02\x02\x026\u02B1" + - "\x03\x02\x02\x028\u02C1\x03\x02\x02\x02:\u02C3\x03\x02\x02\x02<\u02C7" + - "\x03\x02\x02\x02>\u02C9\x03\x02\x02\x02@\u02D7\x03\x02\x02\x02B\u02DB" + - "\x03\x02\x02\x02D\u02DF\x03\x02\x02\x02F\u02E1\x03\x02\x02\x02H\u02E3" + - "\x03\x02\x02\x02J\u02E5\x03\x02\x02\x02L\u02F1\x03\x02\x02\x02N\u02F3" + - "\x03\x02\x02\x02PR\x05\x04\x03\x02QP\x03\x02\x02\x02RS\x03\x02\x02\x02" + - "SQ\x03\x02\x02\x02ST\x03\x02\x02\x02TU\x03\x02\x02\x02UV\x07\x02\x02\x03" + - "V\x03\x03\x02\x02\x02WY\x07E\x02\x02XW\x03\x02\x02\x02Y\\\x03\x02\x02" + - "\x02ZX\x03\x02\x02\x02Z[\x03\x02\x02\x02[]\x03\x02\x02\x02\\Z\x03\x02" + - "\x02\x02]^\x07\x03\x02\x02^_\x05J&\x02_c\x07\x04\x02\x02`b\x05\x06\x04" + - "\x02a`\x03\x02\x02\x02be\x03\x02\x02\x02ca\x03\x02\x02\x02cd\x03\x02\x02" + - "\x02df\x03\x02\x02\x02ec\x03\x02\x02\x02fg\x07\x05\x02\x02g\x05\x03\x02" + - "\x02\x02hj\x07E\x02\x02ih\x03\x02\x02\x02jm\x03\x02\x02\x02ki\x03\x02" + - "\x02\x02kl\x03\x02\x02\x02ln\x03\x02\x02\x02mk\x03\x02\x02\x02no\x05\b" + - "\x05\x02o\x07\x03\x02\x02\x02pq\x07\x06\x02\x02qr\x05J&\x02rs\x07\x07" + - "\x02\x02st\x05\"\x12\x02t\x85\x03\x02\x02\x02uv\x07\b\x02\x02vw\x05J&" + - "\x02wx\x07\x07\x02\x02xy\x05\"\x12\x02y\x85\x03\x02\x02\x02z{\x07\t\x02" + - "\x02{|\x058\x1D\x02|}\x07@\x02\x02}~\x05(\x15\x02~\x85\x03\x02\x02\x02" + - "\x7F\x85\x05\x18\r\x02\x80\x85\x05\n\x06\x02\x81\x85\x05\f\x07\x02\x82" + - "\x85\x05\x14\v\x02\x83\x85\x05\x16\f\x02\x84p\x03\x02\x02\x02\x84u\x03" + - "\x02\x02\x02\x84z\x03\x02\x02\x02\x84\x7F\x03\x02\x02\x02\x84\x80\x03" + - "\x02\x02\x02\x84\x81\x03\x02\x02\x02\x84\x82\x03\x02\x02\x02\x84\x83\x03" + - "\x02\x02\x02\x85\t\x03\x02\x02\x02\x86\x87\x05\x12\n\x02\x87\xAC\x05B" + - "\"\x02\x88\x91\x07A\x02\x02\x89\x8E\x05:\x1E\x02\x8A\x8B\x07\n\x02\x02" + - "\x8B\x8D\x05:\x1E\x02\x8C\x8A\x03\x02\x02\x02\x8D\x90\x03\x02\x02\x02" + - "\x8E\x8C\x03\x02\x02\x02\x8E\x8F\x03\x02\x02\x02\x8F\x92\x03\x02\x02\x02" + - "\x90\x8E\x03\x02\x02\x02\x91\x89\x03\x02\x02\x02\x91\x92\x03\x02\x02\x02" + - "\x92\x93\x03\x02\x02\x02\x93\x96\x07B\x02\x02\x94\x95\x07\x07\x02\x02" + - "\x95\x97\x05\"\x12\x02\x96\x94\x03\x02\x02\x02\x96\x97\x03\x02\x02\x02" + - "\x97\xAD\x03\x02\x02\x02\x98\x99\x07\x07\x02\x02\x99\xAD\x05\"\x12\x02" + - "\x9A\x9B\x07A\x02\x02\x9B\x9C\x05:\x1E\x02\x9C\x9D\x07\x07\x02\x02\x9D" + - "\xA5\x05\"\x12\x02\x9E\x9F\x07\n\x02\x02\x9F\xA0\x05:\x1E\x02\xA0\xA1" + - "\x07\x07\x02\x02\xA1\xA2\x05\"\x12\x02\xA2\xA4\x03\x02\x02\x02\xA3\x9E" + - "\x03\x02\x02\x02\xA4\xA7\x03\x02\x02\x02\xA5\xA3\x03\x02\x02\x02\xA5\xA6" + - "\x03\x02\x02\x02\xA6\xA8\x03\x02\x02\x02\xA7\xA5\x03\x02\x02\x02\xA8\xA9" + - "\x07B\x02\x02\xA9\xAA\x07\x07\x02\x02\xAA\xAB\x05\"\x12\x02\xAB\xAD\x03" + - "\x02\x02\x02\xAC\x88\x03\x02\x02\x02\xAC\x98\x03\x02\x02\x02\xAC\x9A\x03" + - "\x02\x02\x02\xAC\xAD\x03\x02\x02\x02\xAD\xB0\x03\x02\x02\x02\xAE\xAF\x07" + - "@\x02\x02\xAF\xB1\x05(\x15\x02\xB0\xAE\x03\x02\x02\x02\xB0\xB1\x03\x02" + - "\x02\x02\xB1\xB3\x03\x02\x02\x02\xB2\xB4\x07\v\x02\x02\xB3\xB2\x03\x02" + - "\x02\x02\xB3\xB4\x03\x02\x02\x02\xB4\v\x03\x02\x02\x02\xB5\xB6\x07\f\x02" + - "\x02\xB6\xCB\x05J&\x02\xB7\xB8\x07\f\x02\x02\xB8\xB9\x05J&\x02\xB9\xBA" + - "\x07@\x02\x02\xBA\xBB\x05\"\x12\x02\xBB\xCB\x03\x02\x02\x02\xBC\xBD\x07" + - "\f\x02\x02\xBD\xBE\x05J&\x02\xBE\xC0\x07@\x02\x02\xBF\xC1\x07\r\x02\x02" + - "\xC0\xBF\x03\x02\x02\x02\xC0\xC1\x03\x02\x02\x02\xC1\xC2\x03\x02\x02\x02" + - "\xC2\xC7\x05\x0E\b\x02\xC3\xC4\x07\r\x02\x02\xC4\xC6\x05\x0E\b\x02\xC5" + - "\xC3\x03\x02\x02\x02\xC6\xC9\x03\x02\x02\x02\xC7\xC5\x03\x02\x02\x02\xC7" + - "\xC8\x03\x02\x02\x02\xC8\xCB\x03\x02\x02\x02\xC9\xC7\x03\x02\x02\x02\xCA" + - "\xB5\x03\x02\x02\x02\xCA\xB7\x03\x02\x02\x02\xCA\xBC\x03\x02\x02\x02\xCB" + - "\r\x03\x02\x02\x02\xCC\xD1\x05L\'\x02\xCD\xCE\x07A\x02\x02\xCE\xCF\x05" + - "\"\x12\x02\xCF\xD0\x07B\x02\x02\xD0\xD2\x03\x02\x02\x02\xD1\xCD\x03\x02" + - "\x02\x02\xD1\xD2\x03\x02\x02\x02\xD2\x0F\x03\x02\x02\x02\xD3\xD4\x07\x0E" + - "\x02\x02\xD4\xD7\x05J&\x02\xD5\xD6\x07\x07\x02\x02\xD6\xD8\x05\"\x12\x02" + - "\xD7\xD5\x03\x02\x02\x02\xD7\xD8\x03\x02\x02\x02\xD8\xD9\x03\x02\x02\x02" + - "\xD9\xDA\x07@\x02\x02\xDA\xDC\x05(\x15\x02\xDB\xDD\x07\v\x02\x02\xDC\xDB" + - "\x03\x02\x02\x02\xDC\xDD\x03\x02\x02\x02\xDD\x11\x03\x02\x02\x02\xDE\xE8" + - "\x07\x0F\x02\x02\xDF\xE8\x07\x10\x02\x02\xE0\xE1\x07\x11\x02\x02\xE1\xE8" + - "\x07\x0F\x02\x02\xE2\xE3\x07\x11\x02\x02\xE3\xE8\x07\x10\x02\x02\xE4\xE8" + - "\x07\x12\x02\x02\xE5\xE8\x07\x13\x02\x02\xE6\xE8\x07\x14\x02\x02\xE7\xDE" + - "\x03\x02\x02\x02\xE7\xDF\x03\x02\x02\x02\xE7\xE0\x03\x02\x02\x02\xE7\xE2" + - "\x03\x02\x02\x02\xE7\xE4\x03\x02\x02\x02\xE7\xE5\x03\x02\x02\x02\xE7\xE6" + - "\x03\x02\x02\x02\xE8\x13\x03\x02\x02\x02\xE9\xEA\x07\x15\x02\x02\xEA\xEB" + - "\x05\x1C\x0F\x02\xEB\xEC\x07\x16\x02\x02\xEC\xEF\x05<\x1F\x02\xED\xEE" + - "\x07\x17\x02\x02\xEE\xF0\x05 \x11\x02\xEF\xED\x03\x02\x02\x02\xEF\xF0" + - "\x03\x02\x02\x02\xF0\xFC\x03\x02\x02\x02\xF1\xF2\x07\x15\x02\x02\xF2\xF5" + - "\x05\x1C\x0F\x02\xF3\xF4\x07\x18\x02\x02\xF4\xF6\x05\x1C\x0F\x02\xF5\xF3" + - "\x03\x02\x02\x02\xF5\xF6\x03\x02\x02\x02\xF6\xF9\x03\x02\x02\x02\xF7\xF8" + - "\x07\x17\x02\x02\xF8\xFA\x05 \x11\x02\xF9\xF7\x03\x02\x02\x02\xF9\xFA" + - "\x03\x02\x02\x02\xFA\xFC\x03\x02\x02\x02\xFB\xE9\x03\x02\x02\x02\xFB\xF1" + - "\x03\x02\x02\x02\xFC\x15\x03\x02\x02\x02\xFD\xFE\x07\x19\x02\x02\xFE\xFF" + - "\x05\x1C\x0F\x02\xFF\u0100\x07\x16\x02\x02\u0100\u0101\x05<\x1F\x02\u0101" + - "\u0109\x03\x02\x02\x02\u0102\u0103\x07\x19\x02\x02\u0103\u0106\x05\x1C" + - "\x0F\x02\u0104\u0105\x07\x18\x02\x02\u0105\u0107\x05\x1C\x0F\x02\u0106" + - "\u0104\x03\x02\x02\x02\u0106\u0107\x03\x02\x02\x02\u0107\u0109\x03\x02" + - "\x02\x02\u0108\xFD\x03\x02\x02\x02\u0108\u0102\x03\x02\x02\x02\u0109\x17" + - "\x03\x02\x02\x02\u010A\u010B\x07\x15\x02\x02\u010B\u010C\x05\x1A\x0E\x02" + - "\u010C\u010D\x07A\x02\x02\u010D\u010E\x05\x1C\x0F\x02\u010E\u010F\x07" + - "@\x02\x02\u010F\u0117\x05(\x15\x02\u0110\u0111\x07\n\x02\x02\u0111\u0112" + - "\x05\x1C\x0F\x02\u0112\u0113\x07@\x02\x02\u0113\u0114\x05(\x15\x02\u0114" + - "\u0116\x03\x02\x02\x02\u0115\u0110\x03\x02\x02\x02\u0116\u0119\x03\x02" + - "\x02\x02\u0117\u0115\x03\x02\x02\x02\u0117\u0118\x03\x02\x02\x02\u0118" + - "\u011A\x03\x02\x02\x02\u0119\u0117\x03\x02\x02\x02\u011A\u011B\x07B\x02" + - "\x02\u011B\u011C\x07\x16\x02\x02\u011C\u011F\x077\x02\x02\u011D\u011E" + - "\x07\x17\x02\x02\u011E\u0120\x05 \x11\x02\u011F\u011D\x03\x02\x02\x02" + - "\u011F\u0120\x03\x02\x02\x02\u0120\u0139\x03\x02\x02\x02\u0121\u0122\x07" + - "\x15\x02\x02\u0122\u0123\x05\x1A\x0E\x02\u0123\u0124\x07A\x02\x02\u0124" + - "\u0125\x05\x1C\x0F\x02\u0125\u0126\x07@\x02\x02\u0126\u012E\x05(\x15\x02" + - "\u0127\u0128\x07\n\x02\x02\u0128\u0129\x05\x1C\x0F\x02\u0129\u012A\x07" + - "@\x02\x02\u012A\u012B\x05(\x15\x02\u012B\u012D\x03\x02\x02\x02\u012C\u0127" + - "\x03\x02\x02\x02\u012D\u0130\x03\x02\x02\x02\u012E\u012C\x03\x02\x02\x02" + - "\u012E\u012F\x03\x02\x02\x02\u012F\u0131\x03\x02\x02\x02\u0130\u012E\x03" + - "\x02\x02\x02\u0131\u0132\x07B\x02\x02\u0132\u0133\x07\x18\x02\x02\u0133" + - "\u0136\x05\x1E\x10\x02\u0134\u0135\x07\x17\x02\x02\u0135\u0137\x05 \x11" + - "\x02\u0136\u0134\x03\x02\x02\x02\u0136\u0137\x03\x02\x02\x02\u0137\u0139" + - "\x03\x02\x02\x02\u0138\u010A\x03\x02\x02\x02\u0138\u0121\x03\x02\x02\x02" + - "\u0139\x19\x03\x02\x02\x02\u013A\u013B\x05J&\x02\u013B\x1B\x03\x02\x02" + - "\x02\u013C\u013D\x05J&\x02\u013D\x1D\x03\x02\x02\x02\u013E\u013F\x05J" + - "&\x02\u013F\x1F\x03\x02\x02\x02\u0140\u0141\x07*\x02\x02\u0141!\x03\x02" + - "\x02\x02\u0142\u0143\b\x12\x01\x02\u0143\u014C\x07A\x02\x02\u0144\u0149" + - "\x05\"\x12\x02\u0145\u0146\x07\n\x02\x02\u0146\u0148\x05\"\x12\x02\u0147" + - "\u0145\x03\x02\x02\x02\u0148\u014B\x03\x02\x02\x02\u0149\u0147\x03\x02" + - "\x02\x02\u0149\u014A\x03\x02\x02\x02\u014A\u014D\x03\x02\x02\x02\u014B" + - "\u0149\x03\x02\x02\x02\u014C\u0144\x03\x02\x02\x02\u014C\u014D\x03\x02" + - "\x02\x02\u014D\u014F\x03\x02\x02\x02\u014E\u0150\x07\n\x02\x02\u014F\u014E" + - "\x03\x02\x02\x02\u014F\u0150\x03\x02\x02\x02\u0150\u0151\x03\x02\x02\x02" + - "\u0151\u0152\x07B\x02\x02\u0152\u0153\x07\x1B\x02\x02\u0153\u017C\x05" + - "\"\x12\r\u0154\u0155\x071\x02\x02\u0155\u0156\x07\x1C\x02\x02\u0156\u0157" + - "\x05\"\x12\x02\u0157\u0158\x07\x1D\x02\x02\u0158\u017C\x03\x02\x02\x02" + - "\u0159\u015A\x072\x02\x02\u015A\u015B\x07\x1C\x02\x02\u015B\u015C\x05" + - "\"\x12\x02\u015C\u015D\x07\x1D\x02\x02\u015D\u017C\x03\x02\x02\x02\u015E" + - "\u015F\x07A\x02\x02\u015F\u0160\x05\"\x12\x02\u0160\u0161\x07\n\x02\x02" + - "\u0161\u0166\x05\"\x12\x02\u0162\u0163\x07\n\x02\x02\u0163\u0165\x05\"" + - "\x12\x02\u0164\u0162\x03\x02\x02\x02\u0165\u0168\x03\x02\x02\x02\u0166" + - "\u0164\x03\x02\x02\x02\u0166\u0167\x03\x02\x02\x02\u0167\u016A\x03\x02" + - "\x02\x02\u0168\u0166\x03\x02\x02\x02\u0169\u016B\x07\n\x02\x02\u016A\u0169" + - "\x03\x02\x02\x02\u016A\u016B\x03\x02\x02\x02\u016B\u016C\x03\x02\x02\x02" + - "\u016C\u016D\x07B\x02\x02\u016D\u017C\x03\x02\x02\x02\u016E\u016F\x07" + - "\x04\x02\x02\u016F\u0170\x05$\x13\x02\u0170\u0171\x07\x05\x02\x02\u0171" + - "\u017C\x03\x02\x02\x02\u0172\u017C\x07\x1E\x02\x02\u0173\u017C\x07\x1F" + - "\x02\x02\u0174\u017C\x07 \x02\x02\u0175\u017C\x07C\x02\x02\u0176\u017C" + - "\x05J&\x02\u0177\u0178\x07A\x02\x02\u0178\u0179\x05\"\x12\x02\u0179\u017A" + - "\x07B\x02\x02\u017A\u017C\x03\x02\x02\x02\u017B\u0142\x03\x02\x02\x02" + - "\u017B\u0154\x03\x02\x02\x02\u017B\u0159\x03\x02\x02\x02\u017B\u015E\x03" + - "\x02\x02\x02\u017B\u016E\x03\x02\x02\x02\u017B\u0172\x03\x02\x02\x02\u017B" + - "\u0173\x03\x02\x02\x02\u017B\u0174\x03\x02\x02\x02\u017B\u0175\x03\x02" + - "\x02\x02\u017B\u0176\x03\x02\x02\x02\u017B\u0177\x03\x02\x02\x02\u017C" + - "\u0185\x03\x02\x02\x02\u017D\u017E\f\x0F\x02\x02\u017E\u017F\x07\x1A\x02" + - "\x02\u017F\u0184\x05\"\x12\x0F\u0180\u0181\f\x0E\x02\x02\u0181\u0182\x07" + - "\x1B\x02\x02\u0182\u0184\x05\"\x12\x0E\u0183\u017D\x03\x02\x02\x02\u0183" + - "\u0180\x03\x02\x02\x02\u0184\u0187\x03\x02\x02\x02\u0185\u0183\x03\x02" + - "\x02\x02\u0185\u0186\x03\x02\x02\x02\u0186#\x03\x02\x02\x02\u0187\u0185" + - "\x03\x02\x02\x02\u0188\u0189\x05&\x14\x02\u0189\u018A\x07\x07\x02\x02" + - "\u018A\u018B\x05\"\x12\x02\u018B\u018C\x07\n\x02\x02\u018C\u018E\x03\x02" + - "\x02\x02\u018D\u0188\x03\x02\x02\x02\u018E\u0191\x03\x02\x02\x02\u018F" + - "\u018D\x03\x02\x02\x02\u018F\u0190\x03\x02\x02\x02\u0190\u019B\x03\x02" + - "\x02\x02\u0191\u018F\x03\x02\x02\x02\u0192\u0193\x05&\x14\x02\u0193\u0194" + - "\x07\x07\x02\x02\u0194\u0195\x05\"\x12\x02\u0195\u0199\x03\x02\x02\x02" + - "\u0196\u019A\x07\n\x02\x02\u0197\u0198\x07\r\x02\x02\u0198\u019A\x05N" + - "(\x02\u0199\u0196\x03\x02\x02\x02\u0199\u0197\x03\x02\x02\x02\u0199\u019A" + - "\x03\x02\x02\x02\u019A\u019C\x03\x02\x02\x02\u019B\u0192\x03\x02\x02\x02" + - "\u019B\u019C\x03\x02\x02\x02\u019C\u01A0\x03\x02\x02\x02\u019D\u019E\x07" + - "\r\x02\x02\u019E\u01A0\x05N(\x02\u019F\u018F\x03\x02\x02\x02\u019F\u019D" + - "\x03\x02\x02\x02\u01A0%\x03\x02\x02\x02\u01A1\u01A2\x05L\'\x02\u01A2\'" + - "\x03\x02\x02\x02\u01A3\u01A4\b\x15\x01\x02\u01A4\u023A\x052\x1A\x02\u01A5" + - "\u01A6\x05B\"\x02\u01A6\u01A8\x07A\x02\x02\u01A7\u01A9\x05> \x02\u01A8" + - "\u01A7\x03\x02\x02\x02\u01A8\u01A9\x03\x02\x02\x02\u01A9\u01AA\x03\x02" + - "\x02\x02\u01AA\u01AB\x07B\x02\x02\u01AB\u023A\x03\x02\x02\x02\u01AC\u01AD" + - "\x076\x02\x02\u01AD\u023A\x05(\x15\x1B\u01AE\u01AF\x05J&\x02\u01AF\u01B0" + - "\x07\"\x02\x02\u01B0\u01B1\x07@\x02\x02\u01B1\u01B2\x05(\x15\x17\u01B2" + - "\u023A\x03\x02\x02\x02\u01B3\u01B4\x07-\x02\x02\u01B4\u01B5\x07\x04\x02" + - "\x02\u01B5\u01BA\x05(\x15\x02\u01B6\u01B7\x07\n\x02\x02\u01B7\u01B9\x05" + - "(\x15\x02\u01B8\u01B6\x03\x02\x02\x02\u01B9\u01BC\x03\x02\x02\x02\u01BA" + - "\u01B8\x03\x02\x02\x02\u01BA\u01BB\x03\x02\x02\x02\u01BB\u01BE\x03\x02" + - "\x02\x02\u01BC\u01BA\x03\x02\x02\x02\u01BD\u01BF\x07\n\x02\x02\u01BE\u01BD" + - "\x03\x02\x02\x02\u01BE\u01BF\x03\x02\x02\x02\u01BF\u01C0\x03\x02\x02\x02" + - "\u01C0\u01C1\x07\x05\x02\x02\u01C1\u023A\x03\x02\x02\x02\u01C2\u01C3\x07" + - ".\x02\x02\u01C3\u01C4\x07\x04\x02\x02\u01C4\u01C9\x05(\x15\x02\u01C5\u01C6" + - "\x07\n\x02\x02\u01C6\u01C8\x05(\x15\x02\u01C7\u01C5\x03\x02\x02\x02\u01C8" + - "\u01CB\x03\x02\x02\x02\u01C9\u01C7\x03\x02\x02\x02\u01C9\u01CA\x03\x02" + - "\x02\x02\u01CA\u01CD\x03\x02\x02\x02\u01CB\u01C9\x03\x02\x02\x02\u01CC" + - "\u01CE\x07\n\x02\x02\u01CD\u01CC\x03\x02\x02\x02\u01CD\u01CE\x03\x02\x02" + - "\x02\u01CE\u01CF\x03\x02\x02\x02\u01CF\u01D0\x07\x05\x02\x02\u01D0\u023A" + - "\x03\x02\x02\x02\u01D1\u023A\x05*\x16\x02\u01D2\u01D3\x07#\x02\x02\u01D3" + - "\u01D4\x07\x04\x02\x02\u01D4\u01D9\x05(\x15\x02\u01D5\u01D6\x07\n\x02" + - "\x02\u01D6\u01D8\x05(\x15\x02\u01D7\u01D5\x03\x02\x02\x02\u01D8\u01DB" + - "\x03\x02\x02\x02\u01D9\u01D7\x03\x02\x02\x02\u01D9\u01DA\x03\x02\x02\x02" + - "\u01DA\u01DD\x03\x02\x02\x02\u01DB\u01D9\x03\x02\x02\x02\u01DC\u01DE\x07" + - "\n\x02\x02\u01DD\u01DC\x03\x02\x02\x02\u01DD\u01DE\x03\x02\x02\x02\u01DE" + - "\u01DF\x03\x02\x02\x02\u01DF\u01E0\x07\x05\x02\x02\u01E0\u023A\x03\x02" + - "\x02\x02\u01E1\u01E2\x07$\x02\x02\u01E2\u01E3\x07\x04\x02\x02\u01E3\u01E8" + - "\x05(\x15\x02\u01E4\u01E5\x07\n\x02\x02\u01E5\u01E7\x05(\x15\x02\u01E6" + - "\u01E4\x03\x02\x02\x02\u01E7\u01EA\x03\x02\x02\x02\u01E8\u01E6\x03\x02" + - "\x02\x02\u01E8\u01E9\x03\x02\x02\x02\u01E9\u01EC\x03\x02\x02\x02\u01EA" + - "\u01E8\x03\x02\x02\x02\u01EB\u01ED\x07\n\x02\x02\u01EC\u01EB\x03\x02\x02" + - "\x02\u01EC\u01ED\x03\x02\x02\x02\u01ED\u01EE\x03\x02\x02\x02\u01EE\u01EF" + - "\x07\x05\x02\x02\u01EF\u023A\x03\x02\x02\x02\u01F0\u01F5\x05J&\x02\u01F1" + - "\u01F5\x07,\x02\x02\u01F2\u01F5\x07+\x02\x02\u01F3\u01F5\x07*\x02\x02" + - "\u01F4\u01F0\x03\x02\x02\x02\u01F4\u01F1\x03\x02\x02\x02\u01F4\u01F2\x03" + - "\x02\x02\x02\u01F4\u01F3\x03\x02\x02\x02\u01F5\u023A\x03\x02\x02\x02\u01F6" + - "\u01F7\x07A\x02\x02\u01F7\u01F8\x05(\x15\x02"; + "\t#\x04$\t$\x04%\t%\x04&\t&\x04\'\t\'\x04(\t(\x04)\t)\x04*\t*\x04+\t+" + + "\x03\x02\x06\x02X\n\x02\r\x02\x0E\x02Y\x03\x02\x03\x02\x03\x03\x07\x03" + + "_\n\x03\f\x03\x0E\x03b\v\x03\x03\x03\x03\x03\x03\x03\x03\x03\x07\x03h" + + "\n\x03\f\x03\x0E\x03k\v\x03\x03\x03\x03\x03\x03\x04\x07\x04p\n\x04\f\x04" + + "\x0E\x04s\v\x04\x03\x04\x03\x04\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05" + + "\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05" + + "\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x05\x05\x8B\n\x05\x03" + + "\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x07\x06\x93\n\x06\f\x06\x0E" + + "\x06\x96\v\x06\x05\x06\x98\n\x06\x03\x06\x03\x06\x03\x06\x05\x06\x9D\n" + + "\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03" + + "\x06\x03\x06\x03\x06\x07\x06\xAA\n\x06\f\x06\x0E\x06\xAD\v\x06\x03\x06" + + "\x03\x06\x03\x06\x03\x06\x05\x06\xB3\n\x06\x03\x06\x03\x06\x05\x06\xB7" + + "\n\x06\x03\x06\x05\x06\xBA\n\x06\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07" + + "\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x05\x07\xC8\n" + + "\x07\x03\b\x03\b\x03\b\x03\b\x03\b\x07\b\xCF\n\b\f\b\x0E\b\xD2\v\b\x03" + + "\b\x03\b\x05\b\xD6\n\b\x03\t\x05\t\xD9\n\t\x03\t\x03\t\x03\t\x07\t\xDE" + + "\n\t\f\t\x0E\t\xE1\v\t\x03\n\x03\n\x03\n\x03\n\x03\n\x05\n\xE8\n\n\x03" + + "\v\x03\v\x03\v\x03\v\x05\v\xEE\n\v\x03\v\x03\v\x03\v\x05\v\xF3\n\v\x03" + + "\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x05\f\xFE\n\f\x03\r" + + "\x03\r\x03\r\x03\r\x03\r\x03\r\x05\r\u0106\n\r\x03\r\x03\r\x03\r\x03\r" + + "\x05\r\u010C\n\r\x03\r\x03\r\x05\r\u0110\n\r\x05\r\u0112\n\r\x03\x0E\x03" + + "\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x05\x0E\u011D" + + "\n\x0E\x05\x0E\u011F\n\x0E\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03" + + "\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x07\x0F\u012C\n\x0F\f\x0F" + + "\x0E\x0F\u012F\v\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x05\x0F\u0136" + + "\n\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F" + + "\x03\x0F\x03\x0F\x03\x0F\x07\x0F\u0143\n\x0F\f\x0F\x0E\x0F\u0146\v\x0F" + + "\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x05\x0F\u014D\n\x0F\x05\x0F\u014F" + + "\n\x0F\x03\x10\x03\x10\x03\x11\x03\x11\x03\x12\x03\x12\x03\x13\x03\x13" + + "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u015E\n\x14\f\x14\x0E" + + "\x14\u0161\v\x14\x05\x14\u0163\n\x14\x03\x14\x05\x14\u0166\n\x14\x03\x14" + + "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + + "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + + "\x07\x14\u017B\n\x14\f\x14\x0E\x14\u017E\v\x14\x03\x14\x05\x14\u0181\n" + + "\x14\x03\x14\x03\x14\x03\x14\x03\x14\x05\x14\u0187\n\x14\x03\x14\x03\x14" + + "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x05\x14" + + "\u0193\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03" + + "\x14\x03\x14\x03\x14\x03\x14\x07\x14\u01A0\n\x14\f\x14\x0E\x14\u01A3\v" + + "\x14\x03\x14\x03\x14\x07\x14\u01A7\n\x14\f\x14\x0E\x14\u01AA\v\x14\x03" + + "\x15\x03\x15\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03" + + "\x16\x03\x16\x07\x16\u01B7\n\x16\f\x16\x0E\x16\u01BA\v\x16\x03\x16\x03" + + "\x16\x03\x16\x05\x16\u01BF\n\x16\x03\x16\x03\x16\x05\x16\u01C3\n\x16\x03" + + "\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u01CC\n\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u01DC\n\x18\f\x18\x0E" + + "\x18\u01DF\v\x18\x03\x18\x05\x18\u01E2\n\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x07\x18\u01EB\n\x18\f\x18\x0E\x18\u01EE\v" + + "\x18\x03\x18\x05\x18\u01F1\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x07\x18\u01FB\n\x18\f\x18\x0E\x18\u01FE\v\x18" + + "\x03\x18\x05\x18\u0201\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x07\x18\u020A\n\x18\f\x18\x0E\x18\u020D\v\x18\x03\x18\x05" + + "\x18\u0210\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18" + + "\u0218\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0220" + + "\n\x18\f\x18\x0E\x18\u0223\v\x18\x03\x18\x05\x18\u0226\n\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u022E\n\x18\f\x18\x0E\x18" + + "\u0231\v\x18\x03\x18\x05\x18\u0234\n\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x07\x18\u023C\n\x18\f\x18\x0E\x18\u023F\v\x18\x05\x18" + + "\u0241\n\x18\x03\x18\x05\x18\u0244\n\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x05\x18\u025D\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u0284\n\x18\x03\x18\x05\x18" + + "\u0287\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u028E\n\x18" + + "\f\x18\x0E\x18\u0291\v\x18\x03\x19\x03\x19\x03\x19\x03\x19\x05\x19\u0297" + + "\n\x19\x03\x19\x03\x19\x03\x19\x07\x19\u029C\n\x19\f\x19\x0E\x19\u029F" + + "\v\x19\x03\x19\x03\x19\x03\x1A\x03\x1A\x05\x1A\u02A5\n\x1A\x03\x1A\x03" + + "\x1A\x03\x1A\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x05\x1B\u02AE\n\x1B\x03\x1B" + + "\x05\x1B\u02B1\n\x1B\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03" + + "\x1C\x03\x1C\x03\x1C\x05\x1C\u02BC\n\x1C\x03\x1D\x03\x1D\x05\x1D\u02C0" + + "\n\x1D\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E" + + "\x07\x1E\u02CA\n\x1E\f\x1E\x0E\x1E\u02CD\v\x1E\x03\x1E\x03\x1E\x03\x1E" + + "\x03\x1E\x05\x1E\u02D3\n\x1E\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x06" + + "\x1F\u02DA\n\x1F\r\x1F\x0E\x1F\u02DB\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03" + + "\x1F\x03 \x03 \x05 \u02E5\n \x03!\x03!\x03\"\x03\"\x05\"\u02EB\n\"\x03" + + "#\x03#\x03#\x07#\u02F0\n#\f#\x0E#\u02F3\v#\x03$\x03$\x03$\x03$\x03$\x03" + + "$\x05$\u02FB\n$\x03%\x03%\x05%\u02FF\n%\x03&\x03&\x05&\u0303\n&\x03\'" + + "\x03\'\x03(\x03(\x03)\x03)\x03)\x07)\u030C\n)\f)\x0E)\u030F\v)\x03*\x03" + + "*\x03*\x03*\x05*\u0315\n*\x03+\x03+\x03+\x02\x02\x04&.,\x02\x02\x04\x02" + + "\x06\x02\b\x02\n\x02\f\x02\x0E\x02\x10\x02\x12\x02\x14\x02\x16\x02\x18" + + "\x02\x1A\x02\x1C\x02\x1E\x02 \x02\"\x02$\x02&\x02(\x02*\x02,\x02.\x02" + + "0\x022\x024\x026\x028\x02:\x02<\x02>\x02@\x02B\x02D\x02F\x02H\x02J\x02" + + "L\x02N\x02P\x02R\x02T\x02\x02\n\x03\x0257\x03\x0234\x03\x028=\x04\x02" + + "-1AB\x03\x02-0\x05\x02!!-03=\x03\x02*,\x03\x02CD\x02\u037A\x02W\x03\x02" + + "\x02\x02\x04`\x03\x02\x02\x02\x06q\x03\x02\x02\x02\b\x8A\x03\x02\x02\x02" + + "\n\x8C\x03\x02\x02\x02\f\xC7\x03\x02\x02\x02\x0E\xC9\x03\x02\x02\x02\x10" + + "\xD8\x03\x02\x02\x02\x12\xE2\x03\x02\x02\x02\x14\xE9\x03\x02\x02\x02\x16" + + "\xFD\x03\x02\x02\x02\x18\u0111\x03\x02\x02\x02\x1A\u011E\x03\x02\x02\x02" + + "\x1C\u014E\x03\x02\x02\x02\x1E\u0150\x03\x02\x02\x02 \u0152\x03\x02\x02" + + "\x02\"\u0154\x03\x02\x02\x02$\u0156\x03\x02\x02\x02&\u0192\x03\x02\x02" + + "\x02(\u01AB\x03\x02\x02\x02*\u01C2\x03\x02\x02\x02,\u01C4\x03\x02\x02" + + "\x02.\u025C\x03\x02\x02\x020\u0292\x03\x02\x02\x022\u02A4\x03\x02\x02" + + "\x024\u02A9\x03\x02\x02\x026\u02BB\x03\x02\x02\x028\u02BF\x03\x02\x02" + + "\x02:\u02D2\x03\x02\x02\x02<\u02D4\x03\x02\x02\x02>\u02E4\x03\x02\x02" + + "\x02@\u02E6\x03\x02\x02\x02B\u02EA\x03\x02\x02\x02D\u02EC\x03\x02\x02" + + "\x02F\u02FA\x03\x02\x02\x02H\u02FE\x03\x02\x02\x02J\u0302\x03\x02\x02" + + "\x02L\u0304\x03\x02\x02\x02N\u0306\x03\x02\x02\x02P\u0308\x03\x02\x02" + + "\x02R\u0314\x03\x02\x02\x02T\u0316\x03\x02\x02\x02VX\x05\x04\x03\x02W" + + "V\x03\x02\x02\x02XY\x03\x02\x02\x02YW\x03\x02\x02\x02YZ\x03\x02\x02\x02" + + "Z[\x03\x02\x02\x02[\\\x07\x02\x02\x03\\\x03\x03\x02\x02\x02]_\x07E\x02" + + "\x02^]\x03\x02\x02\x02_b\x03\x02\x02\x02`^\x03\x02\x02\x02`a\x03\x02\x02" + + "\x02ac\x03\x02\x02\x02b`\x03\x02\x02\x02cd\x07\x03\x02\x02de\x05P)\x02" + + "ei\x07\x04\x02\x02fh\x05\x06\x04\x02gf\x03\x02\x02\x02hk\x03\x02\x02\x02" + + "ig\x03\x02\x02\x02ij\x03\x02\x02\x02jl\x03\x02\x02\x02ki\x03\x02\x02\x02" + + "lm\x07\x05\x02\x02m\x05\x03\x02\x02\x02np\x07E\x02\x02on\x03\x02\x02\x02" + + "ps\x03\x02\x02\x02qo\x03\x02\x02\x02qr\x03\x02\x02\x02rt\x03\x02\x02\x02" + + "sq\x03\x02\x02\x02tu\x05\b\x05\x02u\x07\x03\x02\x02\x02vw\x07\x06\x02" + + "\x02wx\x05P)\x02xy\x07\x07\x02\x02yz\x05&\x14\x02z\x8B\x03\x02\x02\x02" + + "{|\x07\b\x02\x02|}\x05P)\x02}~\x07\x07\x02\x02~\x7F\x05&\x14\x02\x7F\x8B" + + "\x03\x02\x02\x02\x80\x81\x07\t\x02\x02\x81\x82\x05> \x02\x82\x83\x07>" + + "\x02\x02\x83\x84\x05.\x18\x02\x84\x8B\x03\x02\x02\x02\x85\x8B\x05\x1C" + + "\x0F\x02\x86\x8B\x05\n\x06\x02\x87\x8B\x05\f\x07\x02\x88\x8B\x05\x18\r" + + "\x02\x89\x8B\x05\x1A\x0E\x02\x8Av\x03\x02\x02\x02\x8A{\x03\x02\x02\x02" + + "\x8A\x80\x03\x02\x02\x02\x8A\x85\x03\x02\x02\x02\x8A\x86\x03\x02\x02\x02" + + "\x8A\x87\x03\x02\x02\x02\x8A\x88\x03\x02\x02\x02\x8A\x89\x03\x02\x02\x02" + + "\x8B\t\x03\x02\x02\x02\x8C\x8D\x05\x16\f\x02\x8D\xB2\x05H%\x02\x8E\x97" + + "\x07?\x02\x02\x8F\x94\x05@!\x02\x90\x91\x07\n\x02\x02\x91\x93\x05@!\x02" + + "\x92\x90\x03\x02\x02\x02\x93\x96\x03\x02\x02\x02\x94\x92\x03\x02\x02\x02" + + "\x94\x95\x03\x02\x02\x02\x95\x98\x03\x02\x02\x02\x96\x94\x03\x02\x02\x02" + + "\x97\x8F\x03\x02\x02\x02\x97\x98\x03\x02\x02\x02\x98\x99\x03\x02\x02\x02" + + "\x99\x9C\x07@\x02\x02\x9A\x9B\x07\x07\x02\x02\x9B\x9D\x05&\x14\x02\x9C" + + "\x9A\x03\x02\x02\x02\x9C\x9D\x03\x02\x02\x02\x9D\xB3\x03\x02\x02\x02\x9E" + + "\x9F\x07\x07\x02\x02\x9F\xB3\x05&\x14\x02\xA0\xA1\x07?\x02\x02\xA1\xA2" + + "\x05@!\x02\xA2\xA3\x07\x07\x02\x02\xA3\xAB\x05&\x14\x02\xA4\xA5\x07\n" + + "\x02\x02\xA5\xA6\x05@!\x02\xA6\xA7\x07\x07\x02\x02\xA7\xA8\x05&\x14\x02" + + "\xA8\xAA\x03\x02\x02\x02\xA9\xA4\x03\x02\x02\x02\xAA\xAD\x03\x02\x02\x02" + + "\xAB\xA9\x03\x02\x02\x02\xAB\xAC\x03\x02\x02\x02\xAC\xAE\x03\x02\x02\x02" + + "\xAD\xAB\x03\x02\x02\x02\xAE\xAF\x07@\x02\x02\xAF\xB0\x07\x07\x02\x02" + + "\xB0\xB1\x05&\x14\x02\xB1\xB3\x03\x02\x02\x02\xB2\x8E\x03\x02\x02\x02" + + "\xB2\x9E\x03\x02\x02\x02\xB2\xA0\x03\x02\x02\x02\xB2\xB3\x03\x02\x02\x02" + + "\xB3\xB6\x03\x02\x02\x02\xB4\xB5\x07>\x02\x02\xB5\xB7\x05.\x18\x02\xB6" + + "\xB4\x03\x02\x02\x02\xB6\xB7\x03\x02\x02\x02\xB7\xB9\x03\x02\x02\x02\xB8" + + "\xBA\x07\v\x02\x02\xB9\xB8\x03\x02\x02\x02\xB9\xBA\x03\x02\x02\x02\xBA" + + "\v\x03\x02\x02\x02\xBB\xBC\x07\f\x02\x02\xBC\xC8\x05P)\x02\xBD\xBE\x07" + + "\f\x02\x02\xBE\xBF\x05\x0E\b\x02\xBF\xC0\x07>\x02\x02\xC0\xC1\x05&\x14" + + "\x02\xC1\xC8\x03\x02\x02\x02\xC2\xC3\x07\f\x02\x02\xC3\xC4\x05\x0E\b\x02" + + "\xC4\xC5\x07>\x02\x02\xC5\xC6\x05\x10\t\x02\xC6\xC8\x03\x02\x02\x02\xC7" + + "\xBB\x03\x02\x02\x02\xC7\xBD\x03\x02\x02\x02\xC7\xC2\x03\x02\x02\x02\xC8" + + "\r\x03\x02\x02\x02\xC9\xD5\x05P)\x02\xCA\xCB\x07\r\x02\x02\xCB\xD0\x05" + + "(\x15\x02\xCC\xCD\x07\n\x02\x02\xCD\xCF\x05(\x15\x02\xCE\xCC\x03\x02\x02" + + "\x02\xCF\xD2\x03\x02\x02\x02\xD0\xCE\x03\x02\x02\x02\xD0\xD1\x03\x02\x02" + + "\x02\xD1\xD3\x03\x02\x02\x02\xD2\xD0\x03\x02\x02\x02\xD3\xD4\x07\x0E\x02" + + "\x02\xD4\xD6\x03\x02\x02\x02\xD5\xCA\x03\x02\x02\x02\xD5\xD6\x03\x02\x02" + + "\x02\xD6\x0F\x03\x02\x02\x02\xD7\xD9\x07\x0F\x02\x02\xD8\xD7\x03\x02\x02" + + "\x02\xD8\xD9\x03\x02\x02\x02\xD9\xDA\x03\x02\x02\x02\xDA\xDF\x05\x12\n" + + "\x02\xDB\xDC\x07\x0F\x02\x02\xDC\xDE\x05\x12\n\x02\xDD\xDB\x03\x02\x02" + + "\x02\xDE\xE1\x03\x02\x02\x02\xDF\xDD\x03\x02\x02\x02\xDF\xE0\x03\x02\x02" + + "\x02\xE0\x11\x03\x02\x02\x02\xE1\xDF\x03\x02\x02\x02\xE2\xE7\x05R*\x02" + + "\xE3\xE4\x07?\x02\x02\xE4\xE5\x05&\x14\x02\xE5\xE6\x07@\x02\x02\xE6\xE8" + + "\x03\x02\x02\x02\xE7\xE3\x03\x02\x02\x02\xE7\xE8\x03\x02\x02\x02\xE8\x13" + + "\x03\x02\x02\x02\xE9\xEA\x07\x10\x02\x02\xEA\xED\x05P)\x02\xEB\xEC\x07" + + "\x07\x02\x02\xEC\xEE\x05&\x14\x02\xED\xEB\x03\x02\x02\x02\xED\xEE\x03" + + "\x02\x02\x02\xEE\xEF\x03\x02\x02\x02\xEF\xF0\x07>\x02\x02\xF0\xF2\x05" + + ".\x18\x02\xF1\xF3\x07\v\x02\x02\xF2\xF1\x03\x02\x02\x02\xF2\xF3\x03\x02" + + "\x02\x02\xF3\x15\x03\x02\x02\x02\xF4\xFE\x07\x11\x02\x02\xF5\xFE\x07\x12" + + "\x02\x02\xF6\xF7\x07\x13\x02\x02\xF7\xFE\x07\x11\x02\x02\xF8\xF9\x07\x13" + + "\x02\x02\xF9\xFE\x07\x12\x02\x02\xFA\xFE\x07\x14\x02\x02\xFB\xFE\x07\x15" + + "\x02\x02\xFC\xFE\x07\x16\x02\x02\xFD\xF4\x03\x02\x02\x02\xFD\xF5\x03\x02" + + "\x02\x02\xFD\xF6\x03\x02\x02\x02\xFD\xF8\x03\x02\x02\x02\xFD\xFA\x03\x02" + + "\x02\x02\xFD\xFB\x03\x02\x02\x02\xFD\xFC\x03\x02\x02\x02\xFE\x17\x03\x02" + + "\x02\x02\xFF\u0100\x07\x17\x02\x02\u0100\u0101\x05 \x11\x02\u0101\u0102" + + "\x07\x18\x02\x02\u0102\u0105\x05B\"\x02\u0103\u0104\x07\x19\x02\x02\u0104" + + "\u0106\x05$\x13\x02\u0105\u0103\x03\x02\x02\x02\u0105\u0106\x03\x02\x02" + + "\x02\u0106\u0112\x03\x02\x02\x02\u0107\u0108\x07\x17\x02\x02\u0108\u010B" + + "\x05 \x11\x02\u0109\u010A\x07\x1A\x02\x02\u010A\u010C\x05 \x11\x02\u010B" + + "\u0109\x03\x02\x02\x02\u010B\u010C\x03\x02\x02\x02\u010C\u010F\x03\x02" + + "\x02\x02\u010D\u010E\x07\x19\x02\x02\u010E\u0110\x05$\x13\x02\u010F\u010D" + + "\x03\x02\x02\x02\u010F\u0110\x03\x02\x02\x02\u0110\u0112\x03\x02\x02\x02" + + "\u0111\xFF\x03\x02\x02\x02\u0111\u0107\x03\x02\x02\x02\u0112\x19\x03\x02" + + "\x02\x02\u0113\u0114\x07\x1B\x02\x02\u0114\u0115\x05 \x11\x02\u0115\u0116" + + "\x07\x18\x02\x02\u0116\u0117\x05B\"\x02\u0117\u011F\x03\x02\x02\x02\u0118" + + "\u0119\x07\x1B\x02\x02\u0119\u011C\x05 \x11\x02\u011A\u011B\x07\x1A\x02" + + "\x02\u011B\u011D\x05 \x11\x02\u011C\u011A\x03\x02\x02\x02\u011C\u011D" + + "\x03\x02\x02\x02\u011D\u011F\x03\x02\x02\x02\u011E\u0113\x03\x02\x02\x02" + + "\u011E\u0118\x03\x02\x02\x02\u011F\x1B\x03\x02\x02\x02\u0120\u0121\x07" + + "\x17\x02\x02\u0121\u0122\x05\x1E\x10\x02\u0122\u0123\x07?\x02\x02\u0123" + + "\u0124\x05 \x11\x02\u0124\u0125\x07>\x02\x02\u0125\u012D\x05.\x18\x02" + + "\u0126\u0127\x07\n\x02\x02\u0127\u0128\x05 \x11\x02\u0128\u0129\x07>\x02" + + "\x02\u0129\u012A\x05.\x18\x02\u012A\u012C\x03\x02\x02\x02\u012B\u0126" + + "\x03\x02\x02\x02\u012C\u012F\x03\x02\x02\x02\u012D\u012B\x03\x02\x02\x02" + + "\u012D\u012E\x03\x02\x02\x02\u012E\u0130\x03\x02\x02\x02\u012F\u012D\x03" + + "\x02\x02\x02\u0130\u0131\x07@\x02\x02\u0131\u0132\x07\x18\x02\x02\u0132" + + "\u0135\x075\x02\x02\u0133\u0134\x07\x19\x02\x02\u0134\u0136\x05$\x13\x02" + + "\u0135\u0133\x03\x02\x02\x02\u0135\u0136\x03\x02\x02\x02\u0136\u014F\x03" + + "\x02\x02\x02\u0137\u0138\x07\x17\x02\x02\u0138\u0139\x05\x1E\x10\x02\u0139" + + "\u013A\x07?\x02\x02\u013A\u013B\x05 \x11\x02\u013B\u013C\x07>\x02\x02" + + "\u013C\u0144\x05.\x18\x02\u013D\u013E\x07\n\x02\x02\u013E\u013F\x05 \x11" + + "\x02\u013F\u0140\x07>\x02\x02\u0140\u0141\x05.\x18\x02\u0141\u0143\x03" + + "\x02\x02\x02\u0142\u013D\x03\x02\x02\x02\u0143\u0146\x03\x02\x02\x02\u0144" + + "\u0142\x03\x02\x02\x02\u0144\u0145\x03\x02\x02\x02\u0145\u0147\x03\x02" + + "\x02\x02\u0146\u0144\x03\x02\x02\x02\u0147\u0148\x07@\x02\x02\u0148\u0149" + + "\x07\x1A\x02\x02\u0149\u014C\x05\"\x12\x02\u014A\u014B\x07\x19\x02\x02" + + "\u014B\u014D\x05$\x13\x02\u014C\u014A\x03\x02\x02\x02\u014C\u014D\x03" + + "\x02\x02\x02\u014D\u014F\x03\x02\x02\x02\u014E\u0120\x03\x02\x02\x02\u014E" + + "\u0137\x03\x02\x02\x02\u014F\x1D\x03\x02\x02\x02\u0150\u0151\x05P)\x02" + + "\u0151\x1F\x03\x02\x02\x02\u0152\u0153\x05P)\x02\u0153!\x03\x02\x02\x02" + + "\u0154\u0155\x05P)\x02\u0155#\x03\x02\x02\x02\u0156\u0157\x07*\x02\x02" + + "\u0157%\x03\x02\x02\x02\u0158\u0159\b\x14\x01\x02\u0159\u0162\x07?\x02" + + "\x02\u015A\u015F\x05&\x14\x02\u015B\u015C\x07\n\x02\x02\u015C\u015E\x05" + + "&\x14\x02\u015D\u015B\x03\x02\x02\x02\u015E\u0161\x03\x02\x02\x02\u015F" + + "\u015D\x03\x02\x02\x02\u015F\u0160\x03\x02\x02\x02\u0160\u0163\x03\x02" + + "\x02\x02\u0161\u015F\x03\x02\x02\x02\u0162\u015A\x03\x02\x02\x02\u0162" + + "\u0163\x03\x02\x02\x02\u0163\u0165\x03\x02\x02\x02\u0164\u0166\x07\n\x02" + + "\x02\u0165\u0164\x03\x02\x02\x02\u0165\u0166\x03\x02\x02\x02\u0166\u0167" + + "\x03\x02\x02\x02\u0167\u0168\x07@\x02\x02\u0168\u0169\x07\x1D\x02\x02" + + "\u0169\u0193\x05&\x14\x0E\u016A\u016B\x07A\x02\x02\u016B\u016C\x07\r\x02" + + "\x02\u016C\u016D\x05&\x14\x02\u016D\u016E\x07\x0E\x02\x02\u016E\u0193" + + "\x03\x02\x02\x02\u016F\u0170\x07B\x02\x02\u0170\u0171\x07\r\x02\x02\u0171" + + "\u0172\x05&\x14\x02\u0172\u0173\x07\x0E\x02\x02\u0173\u0193\x03\x02\x02" + + "\x02\u0174\u0175\x07?\x02\x02\u0175\u0176\x05&\x14\x02\u0176\u0177\x07" + + "\n\x02\x02\u0177\u017C\x05&\x14\x02\u0178\u0179\x07\n\x02\x02\u0179\u017B" + + "\x05&\x14\x02\u017A\u0178\x03\x02\x02\x02\u017B\u017E\x03\x02\x02\x02" + + "\u017C\u017A\x03\x02\x02\x02\u017C\u017D\x03\x02\x02\x02\u017D\u0180\x03" + + "\x02\x02\x02\u017E\u017C\x03\x02\x02\x02\u017F\u0181\x07\n\x02\x02\u0180" + + "\u017F\x03\x02\x02\x02\u0180\u0181\x03\x02\x02\x02\u0181\u0182\x03\x02" + + "\x02\x02\u0182\u0183\x07@\x02\x02\u0183\u0193\x03\x02\x02\x02\u0184\u0186" + + "\x07\x04\x02\x02\u0185\u0187\x05*\x16\x02\u0186\u0185\x03\x02\x02\x02" + + "\u0186\u0187\x03\x02\x02\x02\u0187\u0188\x03\x02\x02\x02\u0188\u0193\x07" + + "\x05\x02\x02\u0189\u0193\x07\x1E\x02\x02\u018A\u0193\x07\x1F\x02\x02\u018B" + + "\u0193\x07 \x02\x02\u018C\u0193\x05(\x15\x02\u018D\u0193\x05P)\x02\u018E" + + "\u018F\x07?\x02\x02\u018F\u0190\x05&\x14\x02\u0190\u0191\x07@\x02\x02" + + "\u0191\u0193\x03\x02\x02\x02\u0192\u0158\x03\x02\x02\x02\u0192\u016A\x03" + + "\x02\x02\x02\u0192\u016F\x03\x02\x02\x02\u0192\u0174\x03\x02\x02\x02\u0192" + + "\u0184\x03\x02\x02\x02\u0192\u0189\x03\x02\x02\x02\u0192\u018A\x03\x02" + + "\x02\x02\u0192\u018B\x03\x02\x02\x02\u0192\u018C\x03\x02\x02\x02\u0192" + + "\u018D\x03\x02\x02\x02\u0192\u018E\x03\x02\x02\x02\u0193\u01A8\x03\x02" + + "\x02\x02\u0194\u0195\f\x10\x02\x02\u0195\u0196\x07\x1C\x02\x02\u0196\u01A7" + + "\x05&\x14\x10\u0197\u0198\f\x0F\x02\x02\u0198\u0199\x07\x1D\x02\x02\u0199" + + "\u01A7\x05&\x14\x0F\u019A\u019B\f\x03\x02\x02\u019B\u019C\x07\r\x02\x02" + + "\u019C\u01A1\x05&\x14\x02\u019D\u019E\x07\n\x02\x02\u019E\u01A0\x05&\x14" + + "\x02\u019F\u019D\x03\x02\x02\x02\u01A0\u01A3\x03\x02\x02\x02\u01A1\u019F" + + "\x03\x02\x02\x02\u01A1\u01A2\x03\x02\x02\x02\u01A2\u01A4\x03\x02\x02\x02" + + "\u01A3\u01A1\x03\x02\x02\x02\u01A4\u01A5\x07\x0E\x02\x02\u01A5\u01A7\x03" + + "\x02\x02\x02\u01A6\u0194\x03\x02\x02\x02\u01A6\u0197\x03\x02\x02\x02\u01A6" + + "\u019A\x03\x02\x02\x02\u01A7\u01AA\x03\x02\x02\x02\u01A8\u01A6\x03\x02" + + "\x02\x02\u01A8\u01A9\x03\x02\x02\x02\u01A9\'\x03\x02\x02\x02\u01AA\u01A8" + + "\x03\x02\x02\x02\u01AB\u01AC\x07C\x02\x02\u01AC)\x03\x02\x02\x02\u01AD" + + "\u01AE\x05,\x17\x02\u01AE\u01AF\x07\x07\x02\x02\u01AF\u01B0\x05&\x14\x02" + + "\u01B0\u01B8\x03\x02\x02\x02\u01B1\u01B2\x07\n\x02\x02\u01B2\u01B3\x05" + + ",\x17\x02\u01B3\u01B4\x07\x07\x02\x02\u01B4\u01B5\x05&\x14\x02\u01B5\u01B7" + + "\x03\x02\x02\x02\u01B6\u01B1\x03\x02\x02\x02\u01B7\u01BA\x03\x02\x02\x02" + + "\u01B8\u01B6\x03\x02\x02\x02\u01B8\u01B9\x03\x02\x02\x02\u01B9\u01BE\x03" + + "\x02\x02\x02\u01BA\u01B8\x03\x02\x02\x02\u01BB\u01BF\x07\n\x02\x02\u01BC" + + "\u01BD\x07\x0F\x02\x02\u01BD\u01BF\x05T+\x02\u01BE\u01BB\x03\x02\x02\x02" + + "\u01BE\u01BC\x03\x02\x02\x02\u01BE\u01BF\x03\x02\x02\x02\u01BF\u01C3\x03" + + "\x02\x02\x02\u01C0\u01C1\x07\x0F\x02\x02\u01C1\u01C3\x05T+\x02\u01C2\u01AD" + + "\x03\x02\x02\x02\u01C2\u01C0\x03\x02\x02\x02\u01C3+\x03\x02\x02\x02\u01C4" + + "\u01C5\x05R*\x02\u01C5-\x03\x02\x02\x02\u01C6\u01C7\b\x18\x01\x02\u01C7" + + "\u025D\x058\x1D\x02\u01C8\u01C9\x05H%\x02\u01C9\u01CB\x07?\x02\x02\u01CA" + + "\u01CC\x05D#\x02\u01CB\u01CA\x03\x02\x02\x02\u01CB\u01CC\x03\x02\x02\x02" + + "\u01CC\u01CD\x03\x02\x02\x02\u01CD\u01CE\x07@\x02\x02\u01CE\u025D\x03" + + "\x02\x02\x02\u01CF\u01D0\x074\x02\x02\u01D0\u025D\x05.\x18\x1B\u01D1\u01D2" + + "\x05P)\x02\u01D2\u01D3\x07\"\x02\x02\u01D3\u01D4\x07>\x02\x02\u01D4\u01D5" + + "\x05.\x18\x17\u01D5\u025D\x03\x02\x02\x02\u01D6\u01D7\x07-\x02\x02\u01D7" + + "\u01D8\x07\x04\x02\x02\u01D8\u01DD\x05.\x18\x02\u01D9\u01DA\x07\n\x02" + + "\x02\u01DA\u01DC\x05.\x18\x02\u01DB\u01D9\x03\x02\x02\x02\u01DC\u01DF" + + "\x03\x02\x02\x02\u01DD\u01DB\x03\x02\x02\x02\u01DD\u01DE\x03\x02\x02\x02" + + "\u01DE\u01E1\x03\x02\x02\x02\u01DF\u01DD\x03\x02\x02\x02\u01E0\u01E2\x07" + + "\n\x02\x02\u01E1\u01E0\x03\x02\x02\x02\u01E1\u01E2\x03\x02\x02\x02\u01E2" + + "\u01E3\x03\x02\x02\x02\u01E3\u01E4\x07\x05\x02\x02\u01E4\u025D\x03\x02" + + "\x02\x02\u01E5\u01E6\x07.\x02\x02\u01E6\u01E7\x07\x04\x02\x02\u01E7\u01EC" + + "\x05.\x18\x02\u01E8\u01E9\x07\n\x02\x02\u01E9\u01EB\x05.\x18\x02\u01EA" + + "\u01E8\x03\x02\x02\x02\u01EB\u01EE\x03\x02\x02\x02\u01EC\u01EA\x03\x02" + + "\x02\x02\u01EC\u01ED\x03\x02\x02\x02\u01ED\u01F0\x03\x02\x02\x02\u01EE" + + "\u01EC\x03\x02\x02\x02\u01EF\u01F1\x07\n\x02\x02\u01F0\u01EF\x03\x02\x02" + + "\x02\u01F0"; private static readonly _serializedATNSegment1: string = - "\u01F8\u01F9\x07\n\x02\x02\u01F9\u01FE\x05(\x15\x02\u01FA\u01FB\x07\n" + - "\x02\x02\u01FB\u01FD\x05(\x15\x02\u01FC\u01FA\x03\x02\x02\x02\u01FD\u0200" + - "\x03\x02\x02\x02\u01FE\u01FC\x03\x02\x02\x02\u01FE\u01FF\x03\x02\x02\x02" + - "\u01FF\u0202\x03\x02\x02\x02\u0200\u01FE\x03\x02\x02\x02\u0201\u0203\x07" + - "\n\x02\x02\u0202\u0201\x03\x02\x02\x02\u0202\u0203\x03\x02\x02\x02\u0203" + - "\u0204\x03\x02\x02\x02\u0204\u0205\x07B\x02\x02\u0205\u023A\x03\x02\x02" + - "\x02\u0206\u0207\x07\x04\x02\x02\u0207\u020C\x05@!\x02\u0208\u0209\x07" + - "\n\x02\x02\u0209\u020B\x05@!\x02\u020A\u0208\x03\x02\x02\x02\u020B\u020E" + - "\x03\x02\x02\x02\u020C\u020A\x03\x02\x02\x02\u020C\u020D\x03\x02\x02\x02" + - "\u020D\u0210\x03\x02\x02\x02\u020E\u020C\x03\x02\x02\x02\u020F\u0211\x07" + - "\n\x02\x02\u0210\u020F\x03\x02\x02\x02\u0210\u0211\x03\x02\x02\x02\u0211" + - "\u0212\x03\x02\x02\x02\u0212\u0213\x07\x05\x02\x02\u0213\u023A\x03\x02" + - "\x02\x02\u0214\u021D\x07\x1C\x02\x02\u0215\u021A\x05(\x15\x02\u0216\u0217" + - "\x07\n\x02\x02\u0217\u0219\x05(\x15\x02\u0218\u0216\x03\x02\x02\x02\u0219" + - "\u021C\x03\x02\x02\x02\u021A\u0218\x03\x02\x02\x02\u021A\u021B\x03\x02" + - "\x02\x02\u021B\u021E\x03\x02\x02\x02\u021C\u021A\x03\x02\x02\x02\u021D" + - "\u0215\x03\x02\x02\x02\u021D\u021E\x03\x02\x02\x02\u021E\u0220\x03\x02" + - "\x02\x02\u021F\u0221\x07\n\x02\x02\u0220\u021F\x03\x02\x02\x02\u0220\u0221" + - "\x03\x02\x02\x02\u0221\u0222\x03\x02\x02\x02\u0222\u023A\x07\x1D\x02\x02" + - "\u0223\u0224\x07%\x02\x02\u0224\u0225\x07A\x02\x02\u0225\u0226\x05(\x15" + - "\x02\u0226\u0227\x07B\x02\x02\u0227\u0228\x05(\x15\x02\u0228\u0229\x07" + - "&\x02\x02\u0229\u022A\x05(\x15\x07\u022A\u023A\x03\x02\x02\x02\u022B\u022C" + - "\x05\n\x06\x02\u022C\u022D\x05(\x15\x06\u022D\u023A\x03\x02\x02\x02\u022E" + - "\u022F\x05\x10\t\x02\u022F\u0230\x05(\x15\x05\u0230\u023A\x03\x02\x02" + - "\x02\u0231\u0232\x07A\x02\x02\u0232\u0233\x05(\x15\x02\u0233\u0234\x07" + - "B\x02\x02\u0234\u023A\x03\x02\x02\x02\u0235\u0236\x07\x04\x02\x02\u0236" + - "\u0237\x05(\x15\x02\u0237\u0238\x07\x05\x02\x02\u0238\u023A\x03\x02\x02" + - "\x02\u0239\u01A3\x03\x02\x02\x02\u0239\u01A5\x03\x02\x02\x02\u0239\u01AC" + - "\x03\x02\x02\x02\u0239\u01AE\x03\x02\x02\x02\u0239\u01B3\x03\x02\x02\x02" + - "\u0239\u01C2\x03\x02\x02\x02\u0239\u01D1\x03\x02\x02\x02\u0239\u01D2\x03" + - "\x02\x02\x02\u0239\u01E1\x03\x02\x02\x02\u0239\u01F4\x03\x02\x02\x02\u0239" + - "\u01F6\x03\x02\x02\x02\u0239\u0206\x03\x02\x02\x02\u0239\u0214\x03\x02" + - "\x02\x02\u0239\u0223\x03\x02\x02\x02\u0239\u022B\x03\x02\x02\x02\u0239" + - "\u022E\x03\x02\x02\x02\u0239\u0231\x03\x02\x02\x02\u0239\u0235\x03\x02" + - "\x02\x02\u023A\u026C\x03\x02\x02\x02\u023B\u023C\f\x1C\x02\x02\u023C\u023D" + - "\x07!\x02\x02\u023D\u026B\x05(\x15\x1C\u023E\u023F\f\x1A\x02\x02\u023F" + - "\u0240\t\x02\x02\x02\u0240\u026B\x05(\x15\x1B\u0241\u0242\f\x19\x02\x02" + - "\u0242\u0243\t\x03\x02\x02\u0243\u026B\x05(\x15\x1A\u0244\u0245\f\x18" + - "\x02\x02\u0245\u0246\t\x04\x02\x02\u0246\u026B\x05(\x15\x19\u0247\u0248" + - "\f\x16\x02\x02\u0248\u0249\x07@\x02\x02\u0249\u024A\x05(\x15\x17\u024A" + - "\u024B\b\x15\x01\x02\u024B\u026B\x03\x02\x02\x02\u024C\u024D\f\x14\x02" + - "\x02\u024D\u024E\x07-\x02\x02\u024E\u026B\x05(\x15\x15\u024F\u0250\f\x12" + - "\x02\x02\u0250\u0251\x07.\x02\x02\u0251\u026B\x05(\x15\x13\u0252\u0253" + - "\f\x11\x02\x02\u0253\u0254\x07/\x02\x02\u0254\u026B\x05(\x15\x12\u0255" + - "\u0256\f\x10\x02\x02\u0256\u0257\x070\x02\x02\u0257\u026B\x05(\x15\x11" + - "\u0258\u0259\f\n\x02\x02\u0259\u025A\x07\x1A\x02\x02\u025A\u026B\x05(" + - "\x15\v\u025B\u025C\f \x02\x02\u025C\u025D\x07\x16\x02\x02\u025D\u0263" + - "\x05D#\x02\u025E\u0260\x07A\x02\x02\u025F\u0261\x05> \x02\u0260\u025F" + - "\x03\x02\x02\x02\u0260\u0261\x03\x02\x02\x02\u0261\u0262\x03\x02\x02\x02" + - "\u0262\u0264\x07B\x02\x02\u0263\u025E\x03\x02\x02\x02\u0263\u0264\x03" + - "\x02\x02\x02\u0264\u026B\x03\x02\x02\x02\u0265\u0266\f\x1D\x02\x02\u0266" + - "\u0267\x07\x1C\x02\x02\u0267\u0268\x05(\x15\x02\u0268\u0269\x07\x1D\x02" + - "\x02\u0269\u026B\x03\x02\x02\x02\u026A\u023B\x03\x02\x02\x02\u026A\u023E" + - "\x03\x02\x02\x02\u026A\u0241\x03\x02\x02\x02\u026A\u0244\x03\x02\x02\x02" + - "\u026A\u0247\x03\x02\x02\x02\u026A\u024C\x03\x02\x02\x02\u026A\u024F\x03" + - "\x02\x02\x02\u026A\u0252\x03\x02\x02\x02\u026A\u0255\x03\x02\x02\x02\u026A" + - "\u0258\x03\x02\x02\x02\u026A\u025B\x03\x02\x02\x02\u026A\u0265\x03\x02" + - "\x02\x02\u026B\u026E\x03\x02\x02\x02\u026C\u026A\x03\x02\x02\x02\u026C" + - "\u026D\x03\x02\x02\x02\u026D)\x03\x02\x02\x02\u026E\u026C\x03\x02\x02" + - "\x02\u026F\u0270\x074\x02\x02\u0270\u0271\x05(\x15\x02\u0271\u0273\x07" + - "\x04\x02\x02\u0272\u0274\x07\r\x02\x02\u0273\u0272\x03\x02\x02\x02\u0273" + - "\u0274\x03\x02\x02\x02\u0274\u0275\x03\x02\x02\x02\u0275\u027A\x05,\x17" + - "\x02\u0276\u0277\x07\r\x02\x02\u0277\u0279\x05,\x17\x02\u0278\u0276\x03" + - "\x02\x02\x02\u0279\u027C\x03\x02\x02\x02\u027A\u0278\x03\x02\x02\x02\u027A" + - "\u027B\x03\x02\x02\x02\u027B\u027D\x03\x02\x02\x02\u027C\u027A\x03\x02" + - "\x02\x02\u027D\u027E\x07\x05\x02\x02\u027E+\x03\x02\x02\x02\u027F\u0282" + - "\x05.\x18\x02\u0280\u0282\x07\'\x02\x02\u0281\u027F\x03\x02\x02\x02\u0281" + - "\u0280\x03\x02\x02\x02\u0282\u0283\x03\x02\x02\x02\u0283\u0284\x07\x1B" + - "\x02\x02\u0284\u0285\x05(\x15\x02\u0285-\x03\x02\x02\x02\u0286\u028D\x05" + - "L\'\x02\u0287\u028A\x07A\x02\x02\u0288\u028B\x05L\'\x02\u0289\u028B\x07" + - "\'\x02\x02\u028A\u0288\x03\x02\x02\x02\u028A\u0289\x03\x02\x02\x02\u028B" + - "\u028C\x03\x02\x02\x02\u028C\u028E\x07B\x02\x02\u028D\u0287\x03\x02\x02" + - "\x02\u028D\u028E\x03\x02\x02\x02\u028E/\x03\x02\x02\x02\u028F\u0290\x05" + - "\b\x05\x02\u0290\u0291\x07\x02\x02\x03\u0291\u0299\x03\x02\x02\x02\u0292" + - "\u0293\x05(\x15\x02\u0293\u0294\x07\x02\x02\x03\u0294\u0299\x03\x02\x02" + - "\x02\u0295\u0296\x07E\x02\x02\u0296\u0299\x07\x02\x02\x03\u0297\u0299" + - "\x07\x02\x02\x03\u0298\u028F\x03\x02\x02\x02\u0298\u0292\x03\x02\x02\x02" + - "\u0298\u0295\x03\x02\x02\x02\u0298\u0297\x03\x02\x02\x02\u02991\x03\x02" + - "\x02\x02\u029A\u029D\x054\x1B\x02\u029B\u029D\x056\x1C\x02\u029C\u029A" + - "\x03\x02\x02\x02\u029C\u029B\x03\x02\x02\x02\u029D3\x03\x02\x02\x02\u029E" + - "\u029F\x05:\x1E\x02\u029F\u02A0\x07\x1B\x02\x02\u02A0\u02A1\x05(\x15\x02" + - "\u02A1\u02B0\x03\x02\x02\x02\u02A2\u02A3\x07A\x02\x02\u02A3\u02A8\x05" + - ":\x1E\x02\u02A4\u02A5\x07\n\x02\x02\u02A5\u02A7\x05:\x1E\x02\u02A6\u02A4" + - "\x03\x02\x02\x02\u02A7\u02AA\x03\x02\x02\x02\u02A8\u02A6\x03\x02\x02\x02" + - "\u02A8\u02A9\x03\x02\x02\x02\u02A9\u02AB\x03\x02\x02\x02\u02AA\u02A8\x03" + - "\x02\x02\x02\u02AB\u02AC\x07B\x02\x02\u02AC\u02AD\x07\x1B\x02\x02\u02AD" + - "\u02AE\x05(\x15\x02\u02AE\u02B0\x03\x02\x02\x02\u02AF\u029E\x03\x02\x02" + - "\x02\u02AF\u02A2\x03\x02\x02\x02\u02B05\x03\x02\x02\x02\u02B1\u02B2\x07" + - "A\x02\x02\u02B2\u02B3\x07A\x02\x02\u02B3\u02B6\x05:\x1E\x02\u02B4\u02B5" + - "\x07\n\x02\x02\u02B5\u02B7\x05:\x1E\x02\u02B6\u02B4\x03\x02\x02\x02\u02B7" + - "\u02B8\x03\x02\x02\x02\u02B8\u02B6\x03\x02\x02\x02\u02B8\u02B9\x03\x02" + - "\x02\x02\u02B9\u02BA\x03\x02\x02\x02\u02BA\u02BB\x07B\x02\x02\u02BB\u02BC" + - "\x07B\x02\x02\u02BC\u02BD\x07\x1B\x02\x02\u02BD\u02BE\x05(\x15\x02\u02BE" + - "7\x03\x02\x02\x02\u02BF\u02C2\x07\'\x02\x02\u02C0\u02C2\x05J&\x02\u02C1" + - "\u02BF\x03\x02\x02\x02\u02C1\u02C0\x03\x02\x02\x02\u02C29\x03\x02\x02" + - "\x02\u02C3\u02C4\x058\x1D\x02\u02C4;\x03\x02\x02\x02\u02C5\u02C8\x077" + - "\x02\x02\u02C6\u02C8\x05J&\x02\u02C7\u02C5\x03\x02\x02\x02\u02C7\u02C6" + - "\x03\x02\x02\x02\u02C8=\x03\x02\x02\x02\u02C9\u02CE\x05(\x15\x02\u02CA" + - "\u02CB\x07\n\x02\x02\u02CB\u02CD\x05(\x15\x02\u02CC\u02CA\x03\x02\x02" + - "\x02\u02CD\u02D0\x03\x02\x02\x02\u02CE\u02CC\x03\x02\x02\x02\u02CE\u02CF" + - "\x03\x02\x02\x02\u02CF?\x03\x02\x02\x02\u02D0\u02CE\x03\x02\x02\x02\u02D1" + - "\u02D2\x05L\'\x02\u02D2\u02D3\x07\x07\x02\x02\u02D3\u02D4\x05(\x15\x02" + - "\u02D4\u02D8\x03\x02\x02\x02\u02D5\u02D6\x07(\x02\x02\u02D6\u02D8\x05" + - "(\x15\x02\u02D7\u02D1\x03\x02\x02\x02\u02D7\u02D5\x03\x02\x02\x02\u02D8" + - "A\x03\x02\x02\x02\u02D9\u02DC\x05J&\x02\u02DA\u02DC\t\x05\x02\x02\u02DB" + - "\u02D9\x03\x02\x02\x02\u02DB\u02DA\x03\x02\x02\x02\u02DCC\x03\x02\x02" + - "\x02\u02DD\u02E0\x05J&\x02\u02DE\u02E0\t\x06\x02\x02\u02DF\u02DD\x03\x02" + - "\x02\x02\u02DF\u02DE\x03\x02\x02\x02\u02E0E\x03\x02\x02\x02\u02E1\u02E2" + - "\t\x07\x02\x02\u02E2G\x03\x02\x02\x02\u02E3\u02E4\t\b\x02\x02\u02E4I\x03" + - "\x02\x02\x02\u02E5\u02EA\x05N(\x02\u02E6\u02E7\x07)\x02\x02\u02E7\u02E9" + - "\x05N(\x02\u02E8\u02E6\x03\x02\x02\x02\u02E9\u02EC\x03\x02\x02\x02\u02EA" + - "\u02E8\x03\x02\x02\x02\u02EA\u02EB\x03\x02\x02\x02\u02EBK\x03\x02\x02" + - "\x02\u02EC\u02EA\x03\x02\x02\x02\u02ED\u02F2\x05N(\x02\u02EE\u02EF\x05" + - "J&\x02\u02EF\u02F0\b\'\x01\x02\u02F0\u02F2\x03\x02\x02\x02\u02F1\u02ED" + - "\x03\x02\x02\x02\u02F1\u02EE\x03\x02\x02\x02\u02F2M\x03\x02\x02\x02\u02F3" + - "\u02F4\t\t\x02\x02\u02F4O\x03\x02\x02\x02TSZck\x84\x8E\x91\x96\xA5\xAC" + - "\xB0\xB3\xC0\xC7\xCA\xD1\xD7\xDC\xE7\xEF\xF5\xF9\xFB\u0106\u0108\u0117" + - "\u011F\u012E\u0136\u0138\u0149\u014C\u014F\u0166\u016A\u017B\u0183\u0185" + - "\u018F\u0199\u019B\u019F\u01A8\u01BA\u01BE\u01C9\u01CD\u01D9\u01DD\u01E8" + - "\u01EC\u01F4\u01FE\u0202\u020C\u0210\u021A\u021D\u0220\u0239\u0260\u0263" + - "\u026A\u026C\u0273\u027A\u0281\u028A\u028D\u0298\u029C\u02A8\u02AF\u02B8" + - "\u02C1\u02C7\u02CE\u02D7\u02DB\u02DF\u02EA\u02F1"; + "\u01F1\x03\x02\x02\x02\u01F1\u01F2\x03\x02\x02\x02\u01F2\u01F3\x07\x05" + + "\x02\x02\u01F3\u025D\x03\x02\x02\x02\u01F4\u025D\x050\x19\x02\u01F5\u01F6" + + "\x07#\x02\x02\u01F6\u01F7\x07\x04\x02\x02\u01F7\u01FC\x05.\x18\x02\u01F8" + + "\u01F9\x07\n\x02\x02\u01F9\u01FB\x05.\x18\x02\u01FA\u01F8\x03\x02\x02" + + "\x02\u01FB\u01FE\x03\x02\x02\x02\u01FC\u01FA\x03\x02\x02\x02\u01FC\u01FD" + + "\x03\x02\x02\x02\u01FD\u0200\x03\x02\x02\x02\u01FE\u01FC\x03\x02\x02\x02" + + "\u01FF\u0201\x07\n\x02\x02\u0200\u01FF\x03\x02\x02\x02\u0200\u0201\x03" + + "\x02\x02\x02\u0201\u0202\x03\x02\x02\x02\u0202\u0203\x07\x05\x02\x02\u0203" + + "\u025D\x03\x02\x02\x02\u0204\u0205\x07$\x02\x02\u0205\u0206\x07\x04\x02" + + "\x02\u0206\u020B\x05.\x18\x02\u0207\u0208\x07\n\x02\x02\u0208\u020A\x05" + + ".\x18\x02\u0209\u0207\x03\x02\x02\x02\u020A\u020D\x03\x02\x02\x02\u020B" + + "\u0209\x03\x02\x02\x02\u020B\u020C\x03\x02\x02\x02\u020C\u020F\x03\x02" + + "\x02\x02\u020D\u020B\x03\x02\x02\x02\u020E\u0210\x07\n\x02\x02\u020F\u020E" + + "\x03\x02\x02\x02\u020F\u0210\x03\x02\x02\x02\u0210\u0211\x03\x02\x02\x02" + + "\u0211\u0212\x07\x05\x02\x02\u0212\u025D\x03\x02\x02\x02\u0213\u0218\x05" + + "P)\x02\u0214\u0218\x07,\x02\x02\u0215\u0218\x07+\x02\x02\u0216\u0218\x07" + + "*\x02\x02\u0217\u0213\x03\x02\x02\x02\u0217\u0214\x03\x02\x02\x02\u0217" + + "\u0215\x03\x02\x02\x02\u0217\u0216\x03\x02\x02\x02\u0218\u025D\x03\x02" + + "\x02\x02\u0219\u021A\x07?\x02\x02\u021A\u021B\x05.\x18\x02\u021B\u021C" + + "\x07\n\x02\x02\u021C\u0221\x05.\x18\x02\u021D\u021E\x07\n\x02\x02\u021E" + + "\u0220\x05.\x18\x02\u021F\u021D\x03\x02\x02\x02\u0220\u0223\x03\x02\x02" + + "\x02\u0221\u021F\x03\x02\x02\x02\u0221\u0222\x03\x02\x02\x02\u0222\u0225" + + "\x03\x02\x02\x02\u0223\u0221\x03\x02\x02\x02\u0224\u0226\x07\n\x02\x02" + + "\u0225\u0224\x03\x02\x02\x02\u0225\u0226\x03\x02\x02\x02\u0226\u0227\x03" + + "\x02\x02\x02\u0227\u0228\x07@\x02\x02\u0228\u025D\x03\x02\x02\x02\u0229" + + "\u022A\x07\x04\x02\x02\u022A\u022F\x05F$\x02\u022B\u022C\x07\n\x02\x02" + + "\u022C\u022E\x05F$\x02\u022D\u022B\x03\x02\x02\x02\u022E\u0231\x03\x02" + + "\x02\x02\u022F\u022D\x03\x02\x02\x02\u022F\u0230\x03\x02\x02\x02\u0230" + + "\u0233\x03\x02\x02\x02\u0231\u022F\x03\x02\x02\x02\u0232\u0234\x07\n\x02" + + "\x02\u0233\u0232\x03\x02\x02\x02\u0233\u0234\x03\x02\x02\x02\u0234\u0235" + + "\x03\x02\x02\x02\u0235\u0236\x07\x05\x02\x02\u0236\u025D\x03\x02\x02\x02" + + "\u0237\u0240\x07\r\x02\x02\u0238\u023D\x05.\x18\x02\u0239\u023A\x07\n" + + "\x02\x02\u023A\u023C\x05.\x18\x02\u023B\u0239\x03\x02\x02\x02\u023C\u023F" + + "\x03\x02\x02\x02\u023D\u023B\x03\x02\x02\x02\u023D\u023E\x03\x02\x02\x02" + + "\u023E\u0241\x03\x02\x02\x02\u023F\u023D\x03\x02\x02\x02\u0240\u0238\x03" + + "\x02\x02\x02\u0240\u0241\x03\x02\x02\x02\u0241\u0243\x03\x02\x02\x02\u0242" + + "\u0244\x07\n\x02\x02\u0243\u0242\x03\x02\x02\x02\u0243\u0244\x03\x02\x02" + + "\x02\u0244\u0245\x03\x02\x02\x02\u0245\u025D\x07\x0E\x02\x02\u0246\u0247" + + "\x07%\x02\x02\u0247\u0248\x07?\x02\x02\u0248\u0249\x05.\x18\x02\u0249" + + "\u024A\x07@\x02\x02\u024A\u024B\x05.\x18\x02\u024B\u024C\x07&\x02\x02" + + "\u024C\u024D\x05.\x18\x07\u024D\u025D\x03\x02\x02\x02\u024E\u024F\x05" + + "\n\x06\x02\u024F\u0250\x05.\x18\x06\u0250\u025D\x03\x02\x02\x02\u0251" + + "\u0252\x05\x14\v\x02\u0252\u0253\x05.\x18\x05\u0253\u025D\x03\x02\x02" + + "\x02\u0254\u0255\x07?\x02\x02\u0255\u0256\x05.\x18\x02\u0256\u0257\x07" + + "@\x02\x02\u0257\u025D\x03\x02\x02\x02\u0258\u0259\x07\x04\x02\x02\u0259" + + "\u025A\x05.\x18\x02\u025A\u025B\x07\x05\x02\x02\u025B\u025D\x03\x02\x02" + + "\x02\u025C\u01C6\x03\x02\x02\x02\u025C\u01C8\x03\x02\x02\x02\u025C\u01CF" + + "\x03\x02\x02\x02\u025C\u01D1\x03\x02\x02\x02\u025C\u01D6\x03\x02\x02\x02" + + "\u025C\u01E5\x03\x02\x02\x02\u025C\u01F4\x03\x02\x02\x02\u025C\u01F5\x03" + + "\x02\x02\x02\u025C\u0204\x03\x02\x02\x02\u025C\u0217\x03\x02\x02\x02\u025C" + + "\u0219\x03\x02\x02\x02\u025C\u0229\x03\x02\x02\x02\u025C\u0237\x03\x02" + + "\x02\x02\u025C\u0246\x03\x02\x02\x02\u025C\u024E\x03\x02\x02\x02\u025C" + + "\u0251\x03\x02\x02\x02\u025C\u0254\x03\x02\x02\x02\u025C\u0258\x03\x02" + + "\x02\x02\u025D\u028F\x03\x02\x02\x02\u025E\u025F\f\x1C\x02\x02\u025F\u0260" + + "\x07!\x02\x02\u0260\u028E\x05.\x18\x1C\u0261\u0262\f\x1A\x02\x02\u0262" + + "\u0263\t\x02\x02\x02\u0263\u028E\x05.\x18\x1B\u0264\u0265\f\x19\x02\x02" + + "\u0265\u0266\t\x03\x02\x02\u0266\u028E\x05.\x18\x1A\u0267\u0268\f\x18" + + "\x02\x02\u0268\u0269\t\x04\x02\x02\u0269\u028E\x05.\x18\x19\u026A\u026B" + + "\f\x16\x02\x02\u026B\u026C\x07>\x02\x02\u026C\u026D\x05.\x18\x17\u026D" + + "\u026E\b\x18\x01\x02\u026E\u028E\x03\x02\x02\x02\u026F\u0270\f\x14\x02" + + "\x02\u0270\u0271\x07-\x02\x02\u0271\u028E\x05.\x18\x15\u0272\u0273\f\x12" + + "\x02\x02\u0273\u0274\x07.\x02\x02\u0274\u028E\x05.\x18\x13\u0275\u0276" + + "\f\x11\x02\x02\u0276\u0277\x07/\x02\x02\u0277\u028E\x05.\x18\x12\u0278" + + "\u0279\f\x10\x02\x02\u0279\u027A\x070\x02\x02\u027A\u028E\x05.\x18\x11" + + "\u027B\u027C\f\n\x02\x02\u027C\u027D\x07\x1C\x02\x02\u027D\u028E\x05." + + "\x18\v\u027E\u027F\f \x02\x02\u027F\u0280\x07\x18\x02\x02\u0280\u0286" + + "\x05J&\x02\u0281\u0283\x07?\x02\x02\u0282\u0284\x05D#\x02\u0283\u0282" + + "\x03\x02\x02\x02\u0283\u0284\x03\x02\x02\x02\u0284\u0285\x03\x02\x02\x02" + + "\u0285\u0287\x07@\x02\x02\u0286\u0281\x03\x02\x02\x02\u0286\u0287\x03" + + "\x02\x02\x02\u0287\u028E\x03\x02\x02\x02\u0288\u0289\f\x1D\x02\x02\u0289" + + "\u028A\x07\r\x02\x02\u028A\u028B\x05.\x18\x02\u028B\u028C\x07\x0E\x02" + + "\x02\u028C\u028E\x03\x02\x02\x02\u028D\u025E\x03\x02\x02\x02\u028D\u0261" + + "\x03\x02\x02\x02\u028D\u0264\x03\x02\x02\x02\u028D\u0267\x03\x02\x02\x02" + + "\u028D\u026A\x03\x02\x02\x02\u028D\u026F\x03\x02\x02\x02\u028D\u0272\x03" + + "\x02\x02\x02\u028D\u0275\x03\x02\x02\x02\u028D\u0278\x03\x02\x02\x02\u028D" + + "\u027B\x03\x02\x02\x02\u028D\u027E\x03\x02\x02\x02\u028D\u0288\x03\x02" + + "\x02\x02\u028E\u0291\x03\x02\x02\x02\u028F\u028D\x03\x02\x02\x02\u028F" + + "\u0290\x03\x02\x02\x02\u0290/\x03\x02\x02\x02\u0291\u028F\x03\x02\x02" + + "\x02\u0292\u0293\x072\x02\x02\u0293\u0294\x05.\x18\x02\u0294\u0296\x07" + + "\x04\x02\x02\u0295\u0297\x07\x0F\x02\x02\u0296\u0295\x03\x02\x02\x02\u0296" + + "\u0297\x03\x02\x02\x02\u0297\u0298\x03\x02\x02\x02\u0298\u029D\x052\x1A" + + "\x02\u0299\u029A\x07\x0F\x02\x02\u029A\u029C\x052\x1A\x02\u029B\u0299" + + "\x03\x02\x02\x02\u029C\u029F\x03\x02\x02\x02\u029D\u029B\x03\x02\x02\x02" + + "\u029D\u029E\x03\x02\x02\x02\u029E\u02A0\x03\x02\x02\x02\u029F\u029D\x03" + + "\x02\x02\x02\u02A0\u02A1\x07\x05\x02\x02\u02A11\x03\x02\x02\x02\u02A2" + + "\u02A5\x054\x1B\x02\u02A3\u02A5\x07\'\x02\x02\u02A4\u02A2\x03\x02\x02" + + "\x02\u02A4\u02A3\x03\x02\x02\x02\u02A5\u02A6\x03\x02\x02\x02\u02A6\u02A7" + + "\x07\x1D\x02\x02\u02A7\u02A8\x05.\x18\x02\u02A83\x03\x02\x02\x02\u02A9" + + "\u02B0\x05R*\x02\u02AA\u02AD\x07?\x02\x02\u02AB\u02AE\x05R*\x02\u02AC" + + "\u02AE\x07\'\x02\x02\u02AD\u02AB\x03\x02\x02\x02\u02AD\u02AC\x03\x02\x02" + + "\x02\u02AE\u02AF\x03\x02\x02\x02\u02AF\u02B1\x07@\x02\x02\u02B0\u02AA" + + "\x03\x02\x02\x02\u02B0\u02B1\x03\x02\x02\x02\u02B15\x03\x02\x02\x02\u02B2" + + "\u02B3\x05\b\x05\x02\u02B3\u02B4\x07\x02\x02\x03\u02B4\u02BC\x03\x02\x02" + + "\x02\u02B5\u02B6\x05.\x18\x02\u02B6\u02B7\x07\x02\x02\x03\u02B7\u02BC" + + "\x03\x02\x02\x02\u02B8\u02B9\x07E\x02\x02\u02B9\u02BC\x07\x02\x02\x03" + + "\u02BA\u02BC\x07\x02\x02\x03\u02BB\u02B2\x03\x02\x02\x02\u02BB\u02B5\x03" + + "\x02\x02\x02\u02BB\u02B8\x03\x02\x02\x02\u02BB\u02BA\x03\x02\x02\x02\u02BC" + + "7\x03\x02\x02\x02\u02BD\u02C0\x05:\x1E\x02\u02BE\u02C0\x05<\x1F\x02\u02BF" + + "\u02BD\x03\x02\x02\x02\u02BF\u02BE\x03\x02\x02\x02\u02C09\x03\x02\x02" + + "\x02\u02C1\u02C2\x05@!\x02\u02C2\u02C3\x07\x1D\x02\x02\u02C3\u02C4\x05" + + ".\x18\x02\u02C4\u02D3\x03\x02\x02\x02\u02C5\u02C6\x07?\x02\x02\u02C6\u02CB" + + "\x05@!\x02\u02C7\u02C8\x07\n\x02\x02\u02C8\u02CA\x05@!\x02\u02C9\u02C7" + + "\x03\x02\x02\x02\u02CA\u02CD\x03\x02\x02\x02\u02CB\u02C9\x03\x02\x02\x02" + + "\u02CB\u02CC\x03\x02\x02\x02\u02CC\u02CE\x03\x02\x02\x02\u02CD\u02CB\x03" + + "\x02\x02\x02\u02CE\u02CF\x07@\x02\x02\u02CF\u02D0\x07\x1D\x02\x02\u02D0" + + "\u02D1\x05.\x18\x02\u02D1\u02D3\x03\x02\x02\x02\u02D2\u02C1\x03\x02\x02" + + "\x02\u02D2\u02C5\x03\x02\x02\x02\u02D3;\x03\x02\x02\x02\u02D4\u02D5\x07" + + "?\x02\x02\u02D5\u02D6\x07?\x02\x02\u02D6\u02D9\x05@!\x02\u02D7\u02D8\x07" + + "\n\x02\x02\u02D8\u02DA\x05@!\x02\u02D9\u02D7\x03\x02\x02\x02\u02DA\u02DB" + + "\x03\x02\x02\x02\u02DB\u02D9\x03\x02\x02\x02\u02DB\u02DC\x03\x02\x02\x02" + + "\u02DC\u02DD\x03\x02\x02\x02\u02DD\u02DE\x07@\x02\x02\u02DE\u02DF\x07" + + "@\x02\x02\u02DF\u02E0\x07\x1D\x02\x02\u02E0\u02E1\x05.\x18\x02\u02E1=" + + "\x03\x02\x02\x02\u02E2\u02E5\x07\'\x02\x02\u02E3\u02E5\x05P)\x02\u02E4" + + "\u02E2\x03\x02\x02\x02\u02E4\u02E3\x03\x02\x02\x02\u02E5?\x03\x02\x02" + + "\x02\u02E6\u02E7\x05> \x02\u02E7A\x03\x02\x02\x02\u02E8\u02EB\x075\x02" + + "\x02\u02E9\u02EB\x05P)\x02\u02EA\u02E8\x03\x02\x02\x02\u02EA\u02E9\x03" + + "\x02\x02\x02\u02EBC\x03\x02\x02\x02\u02EC\u02F1\x05.\x18\x02\u02ED\u02EE" + + "\x07\n\x02\x02\u02EE\u02F0\x05.\x18\x02\u02EF\u02ED\x03\x02\x02\x02\u02F0" + + "\u02F3\x03\x02\x02\x02\u02F1\u02EF\x03\x02\x02\x02\u02F1\u02F2\x03\x02" + + "\x02\x02\u02F2E\x03\x02\x02\x02\u02F3\u02F1\x03\x02\x02\x02\u02F4\u02F5" + + "\x05R*\x02\u02F5\u02F6\x07\x07\x02\x02\u02F6\u02F7\x05.\x18\x02\u02F7" + + "\u02FB\x03\x02\x02\x02\u02F8\u02F9\x07(\x02\x02\u02F9\u02FB\x05.\x18\x02" + + "\u02FA\u02F4\x03\x02\x02\x02\u02FA\u02F8\x03\x02\x02\x02\u02FBG\x03\x02" + + "\x02\x02\u02FC\u02FF\x05P)\x02\u02FD\u02FF\t\x05\x02\x02\u02FE\u02FC\x03" + + "\x02\x02\x02\u02FE\u02FD\x03\x02\x02\x02\u02FFI\x03\x02\x02\x02\u0300" + + "\u0303\x05P)\x02\u0301\u0303\t\x06\x02\x02\u0302\u0300\x03\x02\x02\x02" + + "\u0302\u0301\x03\x02\x02\x02\u0303K\x03\x02\x02\x02\u0304\u0305\t\x07" + + "\x02\x02\u0305M\x03\x02\x02\x02\u0306\u0307\t\b\x02\x02\u0307O\x03\x02" + + "\x02\x02\u0308\u030D\x05T+\x02\u0309\u030A\x07)\x02\x02\u030A\u030C\x05" + + "T+\x02\u030B\u0309\x03\x02\x02\x02\u030C\u030F\x03\x02\x02\x02\u030D\u030B" + + "\x03\x02\x02\x02\u030D\u030E\x03\x02\x02\x02\u030EQ\x03\x02\x02\x02\u030F" + + "\u030D\x03\x02\x02\x02\u0310\u0315\x05T+\x02\u0311\u0312\x05P)\x02\u0312" + + "\u0313\b*\x01\x02\u0313\u0315\x03\x02\x02\x02\u0314\u0310\x03\x02\x02" + + "\x02\u0314\u0311\x03\x02\x02\x02\u0315S\x03\x02\x02\x02\u0316\u0317\t" + + "\t\x02\x02\u0317U\x03\x02\x02\x02WY`iq\x8A\x94\x97\x9C\xAB\xB2\xB6\xB9" + + "\xC7\xD0\xD5\xD8\xDF\xE7\xED\xF2\xFD\u0105\u010B\u010F\u0111\u011C\u011E" + + "\u012D\u0135\u0144\u014C\u014E\u015F\u0162\u0165\u017C\u0180\u0186\u0192" + + "\u01A1\u01A6\u01A8\u01B8\u01BE\u01C2\u01CB\u01DD\u01E1\u01EC\u01F0\u01FC" + + "\u0200\u020B\u020F\u0217\u0221\u0225\u022F\u0233\u023D\u0240\u0243\u025C" + + "\u0283\u0286\u028D\u028F\u0296\u029D\u02A4\u02AD\u02B0\u02BB\u02BF\u02CB" + + "\u02D2\u02DB\u02E4\u02EA\u02F1\u02FA\u02FE\u0302\u030D\u0314"; public static readonly _serializedATN: string = Utils.join( [ QuintParser._serializedATNSegment0, @@ -4356,8 +4525,8 @@ export class TypeAbstractDefContext extends TypeDefContext { } } export class TypeAliasDefContext extends TypeDefContext { - public qualId(): QualIdContext { - return this.getRuleContext(0, QualIdContext); + public typeDefHead(): TypeDefHeadContext { + return this.getRuleContext(0, TypeDefHeadContext); } public ASGN(): TerminalNode { return this.getToken(QuintParser.ASGN, 0); } public type(): TypeContext { @@ -4389,19 +4558,12 @@ export class TypeAliasDefContext extends TypeDefContext { } } export class TypeSumDefContext extends TypeDefContext { - public _typeName!: QualIdContext; - public ASGN(): TerminalNode { return this.getToken(QuintParser.ASGN, 0); } - public typeSumVariant(): TypeSumVariantContext[]; - public typeSumVariant(i: number): TypeSumVariantContext; - public typeSumVariant(i?: number): TypeSumVariantContext | TypeSumVariantContext[] { - if (i === undefined) { - return this.getRuleContexts(TypeSumVariantContext); - } else { - return this.getRuleContext(i, TypeSumVariantContext); - } + public typeDefHead(): TypeDefHeadContext { + return this.getRuleContext(0, TypeDefHeadContext); } - public qualId(): QualIdContext { - return this.getRuleContext(0, QualIdContext); + public ASGN(): TerminalNode { return this.getToken(QuintParser.ASGN, 0); } + public sumTypeDefinition(): SumTypeDefinitionContext { + return this.getRuleContext(0, SumTypeDefinitionContext); } constructor(ctx: TypeDefContext) { super(ctx.parent, ctx.invokingState); @@ -4430,6 +4592,88 @@ export class TypeSumDefContext extends TypeDefContext { } +export class TypeDefHeadContext extends ParserRuleContext { + public _typeName!: QualIdContext; + public _typeVar!: TypeVarContext; + public _typeVars: TypeVarContext[] = []; + public qualId(): QualIdContext { + return this.getRuleContext(0, QualIdContext); + } + public typeVar(): TypeVarContext[]; + public typeVar(i: number): TypeVarContext; + public typeVar(i?: number): TypeVarContext | TypeVarContext[] { + if (i === undefined) { + return this.getRuleContexts(TypeVarContext); + } else { + return this.getRuleContext(i, TypeVarContext); + } + } + constructor(parent: ParserRuleContext | undefined, invokingState: number) { + super(parent, invokingState); + } + // @Override + public get ruleIndex(): number { return QuintParser.RULE_typeDefHead; } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterTypeDefHead) { + listener.enterTypeDefHead(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitTypeDefHead) { + listener.exitTypeDefHead(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitTypeDefHead) { + return visitor.visitTypeDefHead(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class SumTypeDefinitionContext extends ParserRuleContext { + public typeSumVariant(): TypeSumVariantContext[]; + public typeSumVariant(i: number): TypeSumVariantContext; + public typeSumVariant(i?: number): TypeSumVariantContext | TypeSumVariantContext[] { + if (i === undefined) { + return this.getRuleContexts(TypeSumVariantContext); + } else { + return this.getRuleContext(i, TypeSumVariantContext); + } + } + constructor(parent: ParserRuleContext | undefined, invokingState: number) { + super(parent, invokingState); + } + // @Override + public get ruleIndex(): number { return QuintParser.RULE_sumTypeDefinition; } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterSumTypeDefinition) { + listener.enterSumTypeDefinition(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitSumTypeDefinition) { + listener.exitSumTypeDefinition(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitSumTypeDefinition) { + return visitor.visitSumTypeDefinition(this); + } else { + return visitor.visitChildren(this); + } + } +} + + export class TypeSumVariantContext extends ParserRuleContext { public _sumLabel!: SimpleIdContext; public simpleId(): SimpleIdContext { @@ -4995,8 +5239,8 @@ export class TypeTupleContext extends TypeContext { } } export class TypeRecContext extends TypeContext { - public row(): RowContext { - return this.getRuleContext(0, RowContext); + public row(): RowContext | undefined { + return this.tryGetRuleContext(0, RowContext); } constructor(ctx: TypeContext) { super(ctx.parent, ctx.invokingState); @@ -5101,28 +5345,30 @@ export class TypeBoolContext extends TypeContext { } } } -export class TypeVarContext extends TypeContext { - public LOW_ID(): TerminalNode { return this.getToken(QuintParser.LOW_ID, 0); } +export class TypeVarCaseContext extends TypeContext { + public typeVar(): TypeVarContext { + return this.getRuleContext(0, TypeVarContext); + } constructor(ctx: TypeContext) { super(ctx.parent, ctx.invokingState); this.copyFrom(ctx); } // @Override public enterRule(listener: QuintListener): void { - if (listener.enterTypeVar) { - listener.enterTypeVar(this); + if (listener.enterTypeVarCase) { + listener.enterTypeVarCase(this); } } // @Override public exitRule(listener: QuintListener): void { - if (listener.exitTypeVar) { - listener.exitTypeVar(this); + if (listener.exitTypeVarCase) { + listener.exitTypeVarCase(this); } } // @Override public accept(visitor: QuintVisitor): Result { - if (visitor.visitTypeVar) { - return visitor.visitTypeVar(this); + if (visitor.visitTypeVarCase) { + return visitor.visitTypeVarCase(this); } else { return visitor.visitChildren(this); } @@ -5188,6 +5434,74 @@ export class TypeParenContext extends TypeContext { } } } +export class TypeAppContext extends TypeContext { + public _typeCtor!: TypeContext; + public _type!: TypeContext; + public _typeArg: TypeContext[] = []; + public type(): TypeContext[]; + public type(i: number): TypeContext; + public type(i?: number): TypeContext | TypeContext[] { + if (i === undefined) { + return this.getRuleContexts(TypeContext); + } else { + return this.getRuleContext(i, TypeContext); + } + } + constructor(ctx: TypeContext) { + super(ctx.parent, ctx.invokingState); + this.copyFrom(ctx); + } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterTypeApp) { + listener.enterTypeApp(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitTypeApp) { + listener.exitTypeApp(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitTypeApp) { + return visitor.visitTypeApp(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class TypeVarContext extends ParserRuleContext { + public LOW_ID(): TerminalNode { return this.getToken(QuintParser.LOW_ID, 0); } + constructor(parent: ParserRuleContext | undefined, invokingState: number) { + super(parent, invokingState); + } + // @Override + public get ruleIndex(): number { return QuintParser.RULE_typeVar; } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterTypeVar) { + listener.enterTypeVar(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitTypeVar) { + listener.exitTypeVar(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitTypeVar) { + return visitor.visitTypeVar(this); + } else { + return visitor.visitChildren(this); + } + } +} export class RowContext extends ParserRuleContext { diff --git a/quint/src/generated/QuintVisitor.ts b/quint/src/generated/QuintVisitor.ts index 19a707994..4d01a74d9 100644 --- a/quint/src/generated/QuintVisitor.ts +++ b/quint/src/generated/QuintVisitor.ts @@ -18,9 +18,10 @@ import { TypeRecContext } from "./QuintParser"; import { TypeIntContext } from "./QuintParser"; import { TypeStrContext } from "./QuintParser"; import { TypeBoolContext } from "./QuintParser"; -import { TypeVarContext } from "./QuintParser"; +import { TypeVarCaseContext } from "./QuintParser"; import { TypeConstContext } from "./QuintParser"; import { TypeParenContext } from "./QuintParser"; +import { TypeAppContext } from "./QuintParser"; import { TypeAbstractDefContext } from "./QuintParser"; import { TypeAliasDefContext } from "./QuintParser"; import { TypeSumDefContext } from "./QuintParser"; @@ -68,6 +69,8 @@ import { DocumentedDeclarationContext } from "./QuintParser"; import { DeclarationContext } from "./QuintParser"; import { OperDefContext } from "./QuintParser"; import { TypeDefContext } from "./QuintParser"; +import { TypeDefHeadContext } from "./QuintParser"; +import { SumTypeDefinitionContext } from "./QuintParser"; import { TypeSumVariantContext } from "./QuintParser"; import { NondetOperDefContext } from "./QuintParser"; import { QualifierContext } from "./QuintParser"; @@ -79,6 +82,7 @@ import { NameContext } from "./QuintParser"; import { QualifiedNameContext } from "./QuintParser"; import { FromSourceContext } from "./QuintParser"; import { TypeContext } from "./QuintParser"; +import { TypeVarContext } from "./QuintParser"; import { RowContext } from "./QuintParser"; import { RowLabelContext } from "./QuintParser"; import { ExprContext } from "./QuintParser"; @@ -184,12 +188,12 @@ export interface QuintVisitor extends ParseTreeVisitor { visitTypeBool?: (ctx: TypeBoolContext) => Result; /** - * Visit a parse tree produced by the `typeVar` + * Visit a parse tree produced by the `typeVarCase` * labeled alternative in `QuintParser.type`. * @param ctx the parse tree * @return the visitor result */ - visitTypeVar?: (ctx: TypeVarContext) => Result; + visitTypeVarCase?: (ctx: TypeVarCaseContext) => Result; /** * Visit a parse tree produced by the `typeConst` @@ -207,6 +211,14 @@ export interface QuintVisitor extends ParseTreeVisitor { */ visitTypeParen?: (ctx: TypeParenContext) => Result; + /** + * Visit a parse tree produced by the `typeApp` + * labeled alternative in `QuintParser.type`. + * @param ctx the parse tree + * @return the visitor result + */ + visitTypeApp?: (ctx: TypeAppContext) => Result; + /** * Visit a parse tree produced by the `typeAbstractDef` * labeled alternative in `QuintParser.typeDef`. @@ -577,6 +589,20 @@ export interface QuintVisitor extends ParseTreeVisitor { */ visitTypeDef?: (ctx: TypeDefContext) => Result; + /** + * Visit a parse tree produced by `QuintParser.typeDefHead`. + * @param ctx the parse tree + * @return the visitor result + */ + visitTypeDefHead?: (ctx: TypeDefHeadContext) => Result; + + /** + * Visit a parse tree produced by `QuintParser.sumTypeDefinition`. + * @param ctx the parse tree + * @return the visitor result + */ + visitSumTypeDefinition?: (ctx: SumTypeDefinitionContext) => Result; + /** * Visit a parse tree produced by `QuintParser.typeSumVariant`. * @param ctx the parse tree @@ -654,6 +680,13 @@ export interface QuintVisitor extends ParseTreeVisitor { */ visitType?: (ctx: TypeContext) => Result; + /** + * Visit a parse tree produced by `QuintParser.typeVar`. + * @param ctx the parse tree + * @return the visitor result + */ + visitTypeVar?: (ctx: TypeVarContext) => Result; + /** * Visit a parse tree produced by `QuintParser.row`. * @param ctx the parse tree diff --git a/quint/src/graphics.ts b/quint/src/graphics.ts index b8602e60e..53985dd18 100644 --- a/quint/src/graphics.ts +++ b/quint/src/graphics.ts @@ -203,6 +203,9 @@ export function prettyQuintType(type: QuintType): Doc { case 'sum': { return prettySumRow(type.fields) } + case 'app': + case 'abs': + throw new Error('TODO This should be impossible?') } } diff --git a/quint/src/ir/IRTransformer.ts b/quint/src/ir/IRTransformer.ts index 2e733d0dd..3f3eb6963 100644 --- a/quint/src/ir/IRTransformer.ts +++ b/quint/src/ir/IRTransformer.ts @@ -86,6 +86,10 @@ export class IRTransformer { exitRecordType?: (type: t.QuintRecordType) => t.QuintRecordType enterSumType?: (type: t.QuintSumType) => t.QuintSumType exitSumType?: (type: t.QuintSumType) => t.QuintSumType + enterAbsType?: (type: t.QuintAbsType) => t.QuintAbsType + exitAbsType?: (type: t.QuintAbsType) => t.QuintAbsType + enterAppType?: (type: t.QuintAppType) => t.QuintAppType + exitAppType?: (type: t.QuintAppType) => t.QuintAppType /** Row types */ enterRow?: (row: t.Row) => t.Row @@ -254,6 +258,37 @@ export function transformType(transformer: IRTransformer, type: t.QuintType): t. } } break + + case 'abs': + { + if (transformer.enterAbsType) { + newType = transformer.enterAbsType(newType) + } + + newType.vars = newType.vars.map(v => transformType(transformer, v) as t.QuintVarType) + newType.body = transformType(transformer, newType.body) + + if (transformer.exitAbsType) { + newType = transformer.exitAbsType(newType) + } + } + break + + case 'app': + { + if (transformer.enterAppType) { + newType = transformer.enterAppType(newType) + } + + newType.ctor = transformType(transformer, newType.ctor) + newType.args = newType.args.map(v => transformType(transformer, v)) + + if (transformer.exitAppType) { + newType = transformer.exitAppType(newType) + } + } + break + default: unreachable(newType) } diff --git a/quint/src/ir/IRVisitor.ts b/quint/src/ir/IRVisitor.ts index 609b62105..282f048ec 100644 --- a/quint/src/ir/IRVisitor.ts +++ b/quint/src/ir/IRVisitor.ts @@ -93,6 +93,10 @@ export interface IRVisitor { exitRecordType?: (_type: t.QuintRecordType) => void enterSumType?: (_type: t.QuintSumType) => void exitSumType?: (_type: t.QuintSumType) => void + enterAppType?: (_type: t.QuintAppType) => void + exitAppType?: (_type: t.QuintAppType) => void + enterAbsType?: (_type: t.QuintAbsType) => void + exitAbsType?: (_type: t.QuintAbsType) => void /** Row types */ enterRow?: (_row: t.Row) => void @@ -245,6 +249,20 @@ export function walkType(visitor: IRVisitor, type: t.QuintType): void { visitor.exitSumType?.(type) break + case 'abs': + visitor.enterAbsType?.(type) + type.vars.map(t => walkType(visitor, t)) + walkType(visitor, type.body) + visitor.exitAbsType?.(type) + break + + case 'app': + visitor.enterAppType?.(type) + walkType(visitor, type.ctor) + type.args.map(t => walkType(visitor, t)) + visitor.exitAppType?.(type) + break + default: unreachable(type) } diff --git a/quint/src/ir/IRprinting.ts b/quint/src/ir/IRprinting.ts index f2ea096f6..274ce939e 100644 --- a/quint/src/ir/IRprinting.ts +++ b/quint/src/ir/IRprinting.ts @@ -187,6 +187,16 @@ export function typeToString(type: QuintType): string { case 'sum': { return sumToString(type) } + case 'abs': { + const vars = type.vars.map(typeToString).join(', ') + const body = typeToString(type.body) + return `Λ(${vars}).${body}` + } + case 'app': { + const abs = typeToString(type.ctor) + const args = type.args.map(typeToString).join(', ') + return `${abs}[${args}]` + } } } diff --git a/quint/src/ir/quintTypes.ts b/quint/src/ir/quintTypes.ts index af87b4408..133f6aeb8 100644 --- a/quint/src/ir/quintTypes.ts +++ b/quint/src/ir/quintTypes.ts @@ -98,17 +98,27 @@ export function sumType(labelTypePairs: [string, QuintType][], rowVar?: string, return { kind: 'sum', fields: { kind: 'row', fields, other }, id } } -/// Type abstraction: Λτ.Τ +/** Type abstraction + * + * In System-F, this corresponds to Λτ1.(...(Λτ2.(Τ)). + */ export interface QuintAbsType extends WithOptionalId { kind: 'abs' - vars: QuintVarType + vars: QuintVarType[] /** The bound variables */ + body: QuintType /** The body of the abstraction */ } -/// Type application: (Λτ.Τ)υ +/** Type application: (Λτ.Τ)υ + * + * In system-F, this corresponds to (Λτ.Τ)υ + * + * Type application is only well well-formed if `ctor` is (resolved to) an + * n-ary type abstraction, and `args.length === n` + */ export interface QuintAppType extends WithOptionalId { kind: 'app' - abs: QuintAbsType - arg: QuintType + ctor: QuintType /** The type "constructor" applied */ + args: QuintType[] /** The arguments to which the constructor is applied */ } /** diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index f1e38a236..b90220d2a 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -19,9 +19,12 @@ import { } from '../ir/quintIr' import { ConcreteFixedRow, + QuintAbsType, + QuintAppType, QuintConstType, QuintSumType, QuintType, + QuintVarType, Row, RowField, isUnitType, @@ -36,6 +39,7 @@ import { zip } from '../util' import { QuintError } from '../quintError' import { lowercaseTypeError, tooManySpreadsError } from './parseErrors' import { Loc } from '../ErrorMessage' +import { fail } from 'assert' /** * An ANTLR4 listener that constructs QuintIr objects out of the abstract @@ -363,36 +367,49 @@ export class ToIrListener implements QuintListener { this.declarationStack.push(def) } - // type Alias = set(int) + // TODO + // type Alias = Set(int) exitTypeAliasDef(ctx: p.TypeAliasDefContext) { - const name = ctx.qualId()!.text - const type = this.popType().value const id = this.getId(ctx) + const defHead = ctx.typeDefHead() + const name = defHead._typeName.text + // NOTE: `rhs` must precede `typeVariables` due to the stack order! + const rhs = this.popType().unwrap(() => + fail('internal error: type alias declaration parsed with no right hand side') + ) + const typeVariables: QuintVarType[] = this.popTypeDefHeadTypeVars(defHead) + if (name[0].match('[a-z]')) { this.errors.push(lowercaseTypeError(id, name)) } - const def: QuintTypeDef = { - id, - kind: 'typedef', - name, - type, - } + const type: QuintType = + typeVariables.length === 0 + ? rhs // A monomorphic type declaration + : { id: this.getId(ctx), kind: 'abs', vars: typeVariables, body: rhs } // A polymorphic type declaration + const def: QuintTypeDef = { id, kind: 'typedef', name, type } this.declarationStack.push(def) } // type T = | A | B(t1) | C(t2) exitTypeSumDef(ctx: p.TypeSumDefContext) { - const name = ctx._typeName!.text! const id = this.getId(ctx) + const defHead = ctx.typeDefHead() + const name = defHead._typeName.text + const typeVars = this.popTypeDefHeadTypeVars(defHead) + // Build the type declaraion const fields: RowField[] = popMany(this.variantStack, this.variantStack.length, this.undefinedVariant(ctx)) const row: ConcreteFixedRow = { kind: 'row', fields, other: { kind: 'empty' } } - const type: QuintSumType = { id, kind: 'sum', fields: row } - const typeName: QuintConstType = { id, kind: 'const', name } + const sumType: QuintSumType = { id, kind: 'sum', fields: row } + const type: QuintSumType | QuintAbsType = + typeVars.length === 0 + ? sumType // A monomorphic type + : { id: this.getId(ctx), kind: 'abs', vars: typeVars, body: sumType } // A polymorphic type + const def: QuintTypeDef = { id: id, name, @@ -400,6 +417,13 @@ export class ToIrListener implements QuintListener { type, } + // Used for annotations in the variant constructors + const typeConst: QuintConstType = { id, kind: 'const', name } + const constructorReturnType: QuintConstType | QuintAppType = + typeVars.length === 0 + ? typeConst // For a monomorphic type annotation + : { id: this.getId(ctx), kind: 'app', ctor: typeConst, args: typeVars } // A polymorphic type annotation + // Generate all the variant constructors implied by a variant type definition // a variant constructor is an operator that injects an expression // into the sum type by wrapping it in a label @@ -423,7 +447,7 @@ export class ToIrListener implements QuintListener { // val a: T = A(42) // val b: T = B // ``` - const constructors: QuintOpDef[] = zip(fields, ctx.typeSumVariant()).map( + const constructors: QuintOpDef[] = zip(fields, ctx.sumTypeDefinition().typeSumVariant()).map( ([{ fieldName, fieldType }, variantCtx]) => { // Mangle the parameter name to avoid clashes // This shouldn't be visible to users @@ -448,7 +472,7 @@ export class ToIrListener implements QuintListener { // a variant pairing a label with the unit. const wrappedExpr = unitValue(this.getId(variantCtx._sumLabel)) - typeAnnotation = typeName + typeAnnotation = constructorReturnType expr = { id: this.getId(variantCtx), kind: 'app', @@ -474,7 +498,7 @@ export class ToIrListener implements QuintListener { args: [label, wrappedExpr], } - typeAnnotation = { kind: 'oper', args: [fieldType], res: typeName } + typeAnnotation = { kind: 'oper', args: [fieldType], res: constructorReturnType } expr = { id: this.getId(variantCtx), kind: 'lambda', params, qualifier, expr: variant } } @@ -485,6 +509,26 @@ export class ToIrListener implements QuintListener { this.declarationStack.push(def, ...constructors) } + // Pop all the type variables in the head of a type def from the type stack + // E.g., for a type def like + // + // type Foo[a,b,c] = ... + // + // Return the type variables [a, b, c] + private popTypeDefHeadTypeVars(ctx: p.TypeDefHeadContext): QuintVarType[] { + return ( + ctx._typeVars + .map( + _ => + this.popType().unwrap(() => + fail('internal error: type parameter parsed with no type variable') + ) as QuintVarType + ) + // The stack stores the variables in reverse order + .reverse() + ) + } + exitTypeSumVariant(ctx: p.TypeSumVariantContext) { const fieldName = ctx._sumLabel!.text! const poppedType = this.popType().value @@ -1047,6 +1091,21 @@ export class ToIrListener implements QuintListener { this.typeStack.push({ id, kind: 'const', name }) } + exitTypeApp(ctx: p.TypeAppContext) { + const id = this.getId(ctx) + const args: QuintType[] = ctx._typeArg + .map(_ => + // We require that there is one parsed type for each typeArg recorded + this.popType().unwrap() + ) // The stack stores the arguments in reverse order + .reverse() + // The next type on the stack after the args should be the applied + // type constructor + const ctor = this.popType().unwrap() + this.typeStack.push({ id, kind: 'app', ctor, args }) + } + + // TODO: replace with general type application // a set type, e.g., set(int) exitTypeSet(ctx: p.TypeSetContext) { const last = this.popType().unwrap() @@ -1054,6 +1113,7 @@ export class ToIrListener implements QuintListener { this.typeStack.push({ id, kind: 'set', elem: last }) } + // TODO: replace with general type application // a list type, e.g., list(int) exitTypeList(ctx: p.TypeListContext) { const top = this.popType().unwrap() diff --git a/quint/src/quintError.ts b/quint/src/quintError.ts index b67b9a1e2..2fccad980 100644 --- a/quint/src/quintError.ts +++ b/quint/src/quintError.ts @@ -47,6 +47,8 @@ export type ErrorCode = | 'QNT008' /* QNT009: Missing arguments or parameters. You should omit the parentheses */ | 'QNT009' + /* QNT010: Lower case simple identifiers */ + | 'QNT010' /* QNT012: '...' may be used once in '{ ...record, }' */ | 'QNT012' /* QNT013: import ... from : could not load */ diff --git a/quint/src/types/base.ts b/quint/src/types/base.ts index 1414556a0..607b13554 100644 --- a/quint/src/types/base.ts +++ b/quint/src/types/base.ts @@ -29,6 +29,7 @@ export interface TypeScheme { export type Signature = (_arity: number) => TypeScheme +// TODO: Why aren't we noting type variables in the schema here? export function toScheme(type: QuintType): TypeScheme { return { typeVariables: new Set([]), rowVariables: new Set([]), type } } diff --git a/quint/src/types/constraintGenerator.ts b/quint/src/types/constraintGenerator.ts index e17bdcafa..9b3382cd4 100644 --- a/quint/src/types/constraintGenerator.ts +++ b/quint/src/types/constraintGenerator.ts @@ -391,6 +391,7 @@ export class ConstraintGeneratorVisitor implements IRVisitor { } } + // This is like application (via unification)? private newInstance(t: TypeScheme): QuintType { const typeNames = Array.from(t.typeVariables) const rowNames = Array.from(t.rowVariables) @@ -416,6 +417,7 @@ export class ConstraintGeneratorVisitor implements IRVisitor { ) } + // TODO: This is abstraction private quantify(type: QuintType): TypeScheme { const freeNames = this.currentFreeNames() const nonFreeNames = { diff --git a/quint/src/types/substitutions.ts b/quint/src/types/substitutions.ts index 49fbe496e..a1f4f9c73 100644 --- a/quint/src/types/substitutions.ts +++ b/quint/src/types/substitutions.ts @@ -98,7 +98,12 @@ export function applySubstitution(table: LookupTable, subs: Substitutions, t: Qu fields: applySubstitutionToRow(table, subs, t.fields) as ConcreteFixedRow, } - // The basic types have no variables, so cannot + case 'abs': + throw new Error(`Not yet implemented: https://github.com/informalsystems/quint/issues/1298`) + case 'app': + throw new Error(`Not yet implemented: https://github.com/informalsystems/quint/issues/1298`) + + // The basic types have no variables, so don't require substitution case 'int': case 'bool': case 'str': diff --git a/quint/test/ir/IRVisitor.test.ts b/quint/test/ir/IRVisitor.test.ts index 290fc921f..c3c41d5a3 100644 --- a/quint/test/ir/IRVisitor.test.ts +++ b/quint/test/ir/IRVisitor.test.ts @@ -855,5 +855,52 @@ describe('walkModule', () => { assert.deepEqual(visitor.entered.map(typeToString), enteredTypes) assert.deepEqual(visitor.exited.map(typeToString), exitedTypes) }) + + it('finds type abstractions', () => { + const quintModule = buildModuleWithDecls(['type StrMap[a] = str -> a']) + + class TestVisitor implements IRVisitor { + entered: QuintType[] = [] + exited: QuintType[] = [] + + enterAbsType(type: QuintType): void { + this.entered.push(type) + } + + exitAbsType(type: QuintType): void { + this.exited.push(type) + } + } + + const expectedTypes = ['Λ(a).(str -> a)'] + + const visitor = new TestVisitor() + walkModule(visitor, quintModule) + assert.deepEqual(visitor.entered.map(typeToString), expectedTypes) + assert.deepEqual(visitor.exited.map(typeToString), expectedTypes) + }) + + it('finds type applications', () => { + const quintModule = buildModuleWithDecls(['val strMap: StrMap[int] = Map("a" -> 1, "b" -> 2)']) + class TestVisitor implements IRVisitor { + entered: QuintType[] = [] + exited: QuintType[] = [] + + enterAppType(type: QuintType): void { + this.entered.push(type) + } + + exitAppType(type: QuintType): void { + this.exited.push(type) + } + } + + const expectedTypes = ['StrMap[int]'] + + const visitor = new TestVisitor() + walkModule(visitor, quintModule) + assert.deepEqual(visitor.entered.map(typeToString), expectedTypes) + assert.deepEqual(visitor.exited.map(typeToString), expectedTypes) + }) }) }) diff --git a/quint/test/ir/IRprinting.test.ts b/quint/test/ir/IRprinting.test.ts index dc8df1eb0..f5035f22c 100644 --- a/quint/test/ir/IRprinting.test.ts +++ b/quint/test/ir/IRprinting.test.ts @@ -249,4 +249,10 @@ describe('typeToString', () => { const expectedType = '(A(int) | B)' assert.deepEqual(typeToString(type), expectedType) }) + + it('pretty prints type applications', () => { + const input = 'Result[ok, err]' + const type = buildType(input) + assert.deepEqual(typeToString(type), input) + }) }) diff --git a/quint/test/parsing/quintParserFrontend.test.ts b/quint/test/parsing/quintParserFrontend.test.ts index 42f7d55b7..dbead2601 100644 --- a/quint/test/parsing/quintParserFrontend.test.ts +++ b/quint/test/parsing/quintParserFrontend.test.ts @@ -103,7 +103,7 @@ describe('parsing', () => { readQuint('SuperSpec'), 'mocked_path/testFixture/SuperSpec.qnt' ) - assert.isEmpty(result.errors) + assert.deepEqual(result.errors, []) }) it('parses SuperSpec correctly', () => { @@ -118,6 +118,10 @@ describe('parsing', () => { parseAndCompare('_1043sumTypeDecl') }) + it('parses polymorphic type declarations', () => { + parseAndCompare('_1045polymorphicTypeDecl') + }) + it('parses match expressions', () => { parseAndCompare('_1044matchExpression') }) diff --git a/quint/test/types/parser.test.ts b/quint/test/types/parser.test.ts index 762a55f53..133c0c011 100644 --- a/quint/test/types/parser.test.ts +++ b/quint/test/types/parser.test.ts @@ -96,20 +96,29 @@ describe('parseType', () => { ) }) + it('parses type application', () => { + const type = parseType('Foo[int, bool, str]') + + assert.isTrue(type.isRight()) + type.map(value => + assert.deepEqual(value, { + kind: 'app', + ctor: { kind: 'const', name: 'Foo', id: 1n }, + args: [ + { kind: 'int', id: 2n }, + { kind: 'bool', id: 3n }, + { kind: 'str', id: 4n }, + ], + id: 5n, + }) + ) + }) + it('throws error when type is invalid', () => { - const type = parseType('Set[bool, int]') + const type = parseType('Set(int)') assert.isTrue(type.isLeft()) - type.mapLeft(error => - assert.sameDeepMembers(error, [ - { - // TODO We should not expect a '=>' here, - // but do because of https://github.com/informalsystems/quint/issues/456 - explanation: "mismatched input ',' expecting {'->', '=>', ']'}", - locs: [{ start: { line: 0, col: 8, index: 8 }, end: { line: 0, col: 8, index: 8 } }], - }, - ]) - ) + type.mapLeft(error => assert.deepEqual(error[0].explanation, "missing '[' at '('")) }) it('throws error when row separators are invalid', () => { @@ -121,7 +130,7 @@ describe('parseType', () => { { // TODO We should not expect a '=>' here, // but do because of https://github.com/informalsystems/quint/issues/456 - explanation: "mismatched input '|' expecting {',', '->', '=>'}", + explanation: "mismatched input '|' expecting '}'", locs: [{ start: { line: 0, col: 11, index: 11 }, end: { line: 0, col: 11, index: 11 } }], }, ]) diff --git a/quint/testFixture/_1025importeeWithError.json b/quint/testFixture/_1025importeeWithError.json index 32b335531..0849ac06c 100644 --- a/quint/testFixture/_1025importeeWithError.json +++ b/quint/testFixture/_1025importeeWithError.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"I","declarations":[{"id":9,"kind":"def","name":"x","qualifier":"val","expr":{"id":8,"kind":"let","opdef":{"id":3,"kind":"def","name":"y","qualifier":"val","expr":{"id":2,"kind":"bool","value":true}},"expr":{"id":4,"kind":"let","opdef":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true}},"expr":{"id":7,"kind":"name","name":"__undefinedExprGenerated"}}}}]}],"table":{"7":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true},"depth":1}},"errors":[{"explanation":"[QNT000] mismatched input '}' expecting {'{', 'nondet', 'val', 'def', 'pure', 'action', 'run', 'temporal', '[', 'all', 'any', 'if', '_', STRING, BOOL, INT, 'and', 'or', 'iff', 'implies', 'Set', 'List', 'Map', 'match', '-', '(', LOW_ID, CAP_ID}","locs":[{"source":"mocked_path/testFixture/_1025importeeWithError.qnt","start":{"line":3,"col":0,"index":45},"end":{"line":3,"col":0,"index":45}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"I","declarations":[{"id":9,"kind":"def","name":"x","qualifier":"val","expr":{"id":8,"kind":"let","opdef":{"id":3,"kind":"def","name":"y","qualifier":"val","expr":{"id":2,"kind":"bool","value":true}},"expr":{"id":4,"kind":"let","opdef":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true}},"expr":{"id":7,"kind":"name","name":"__undefinedExprGenerated"}}}}]}],"table":{"7":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true},"depth":1}},"errors":[{"explanation":"[QNT000] mismatched input '}' expecting {'{', '[', 'nondet', 'val', 'def', 'pure', 'action', 'run', 'temporal', 'all', 'any', 'if', '_', STRING, BOOL, INT, 'and', 'or', 'iff', 'implies', 'Map', 'match', '-', '(', 'Set', 'List', LOW_ID, CAP_ID}","locs":[{"source":"mocked_path/testFixture/_1025importeeWithError.qnt","start":{"line":3,"col":0,"index":45},"end":{"line":3,"col":0,"index":45}}]}]} \ No newline at end of file From a7ac9db67a78eab924efd952ba89c64fd288911f Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 24 Jan 2024 21:51:03 -0500 Subject: [PATCH 210/388] Ass missing test fixtures --- quint/testFixture/_1045polymorphicTypeDecl.json | 1 + quint/testFixture/_1045polymorphicTypeDecl.map.json | 1 + quint/testFixture/_1045polymorphicTypeDecl.qnt | 7 +++++++ 3 files changed, 9 insertions(+) create mode 100644 quint/testFixture/_1045polymorphicTypeDecl.json create mode 100644 quint/testFixture/_1045polymorphicTypeDecl.map.json create mode 100644 quint/testFixture/_1045polymorphicTypeDecl.qnt diff --git a/quint/testFixture/_1045polymorphicTypeDecl.json b/quint/testFixture/_1045polymorphicTypeDecl.json new file mode 100644 index 000000000..1bdc18f98 --- /dev/null +++ b/quint/testFixture/_1045polymorphicTypeDecl.json @@ -0,0 +1 @@ +{"stage":"parsing","warnings":[],"modules":[{"id":35,"name":"m","declarations":[{"id":14,"kind":"typedef","name":"MapApp","type":{"id":15,"kind":"abs","vars":[{"id":7,"kind":"var","name":"a"},{"id":8,"kind":"var","name":"b"}],"body":{"id":13,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":11,"kind":"fun","arg":{"id":9,"kind":"var","name":"a"},"res":{"id":10,"kind":"var","name":"b"}}},{"fieldName":"1","fieldType":{"id":12,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}}}},{"id":20,"name":"Result","kind":"typedef","type":{"id":21,"kind":"abs","vars":[{"id":16,"kind":"var","name":"ok"},{"id":17,"kind":"var","name":"err"}],"body":{"id":20,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":18,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":19,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}}}},{"id":5,"kind":"typedef","name":"MonoPair","type":{"id":6,"kind":"abs","vars":[{"id":1,"kind":"var","name":"a"}],"body":{"id":4,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":2,"kind":"var","name":"a"}},{"fieldName":"1","fieldType":{"id":3,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}}}},{"id":28,"kind":"def","name":"Ok","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":18,"kind":"var","name":"ok"}],"res":{"id":22,"kind":"app","ctor":{"id":20,"kind":"const","name":"Result"},"args":[{"id":16,"kind":"var","name":"ok"},{"id":17,"kind":"var","name":"err"}]}},"expr":{"id":27,"kind":"lambda","params":[{"id":24,"name":"__OkParam"}],"qualifier":"def","expr":{"id":26,"kind":"app","opcode":"variant","args":[{"id":23,"kind":"str","value":"Ok"},{"kind":"name","name":"__OkParam","id":25}]}}},{"id":34,"kind":"def","name":"Err","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":19,"kind":"var","name":"err"}],"res":{"id":22,"kind":"app","ctor":{"id":20,"kind":"const","name":"Result"},"args":[{"id":16,"kind":"var","name":"ok"},{"id":17,"kind":"var","name":"err"}]}},"expr":{"id":33,"kind":"lambda","params":[{"id":30,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":32,"kind":"app","opcode":"variant","args":[{"id":29,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":31}]}}}]}],"table":{"20":{"id":20,"name":"Result","kind":"typedef","type":{"id":21,"kind":"abs","vars":[{"id":16,"kind":"var","name":"ok"},{"id":17,"kind":"var","name":"err"}],"body":{"id":20,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":18,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":19,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}}}},"25":{"id":24,"name":"__OkParam","kind":"param"},"31":{"id":30,"name":"__ErrParam","kind":"param"}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1045polymorphicTypeDecl.map.json b/quint/testFixture/_1045polymorphicTypeDecl.map.json new file mode 100644 index 000000000..b83f0ae3a --- /dev/null +++ b/quint/testFixture/_1045polymorphicTypeDecl.map.json @@ -0,0 +1 @@ +{"sourceIndex":{"0":"mocked_path/testFixture/_1045polymorphicTypeDecl.qnt"},"map":{"1":[0,{"line":1,"col":16,"index":27},{"line":1,"col":16,"index":27}],"2":[0,{"line":1,"col":22,"index":33},{"line":1,"col":22,"index":33}],"3":[0,{"line":1,"col":25,"index":36},{"line":1,"col":25,"index":36}],"4":[0,{"line":1,"col":21,"index":32},{"line":1,"col":26,"index":37}],"5":[0,{"line":1,"col":2,"index":13},{"line":1,"col":26,"index":37}],"6":[0,{"line":1,"col":2,"index":13},{"line":1,"col":26,"index":37}],"7":[0,{"line":2,"col":14,"index":53},{"line":2,"col":14,"index":53}],"8":[0,{"line":2,"col":17,"index":56},{"line":2,"col":17,"index":56}],"9":[0,{"line":2,"col":23,"index":62},{"line":2,"col":23,"index":62}],"10":[0,{"line":2,"col":28,"index":67},{"line":2,"col":28,"index":67}],"11":[0,{"line":2,"col":23,"index":62},{"line":2,"col":28,"index":67}],"12":[0,{"line":2,"col":31,"index":70},{"line":2,"col":31,"index":70}],"13":[0,{"line":2,"col":22,"index":61},{"line":2,"col":32,"index":71}],"14":[0,{"line":2,"col":2,"index":41},{"line":2,"col":32,"index":71}],"15":[0,{"line":2,"col":2,"index":41},{"line":2,"col":32,"index":71}],"16":[0,{"line":3,"col":14,"index":87},{"line":3,"col":15,"index":88}],"17":[0,{"line":3,"col":18,"index":91},{"line":3,"col":20,"index":93}],"18":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"19":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"20":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"21":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"22":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"23":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"24":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"25":[0,{"line":4,"col":6,"index":104},{"line":4,"col":7,"index":105}],"26":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"27":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"28":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"29":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"30":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"31":[0,{"line":5,"col":6,"index":117},{"line":5,"col":8,"index":119}],"32":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"33":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"34":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"35":[0,{"line":0,"col":0,"index":0},{"line":6,"col":126,"index":126}]}} \ No newline at end of file diff --git a/quint/testFixture/_1045polymorphicTypeDecl.qnt b/quint/testFixture/_1045polymorphicTypeDecl.qnt new file mode 100644 index 000000000..423c76fe0 --- /dev/null +++ b/quint/testFixture/_1045polymorphicTypeDecl.qnt @@ -0,0 +1,7 @@ +module m { + type MonoPair[a] = (a, a) + type MapApp[a, b] = (a -> b, a) + type Result[ok, err] = + | Ok(ok) + | Err(err) +} From cd592bbbb5ff59033369c593820a8b54cf0623a7 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 24 Jan 2024 21:55:09 -0500 Subject: [PATCH 211/388] Add abs and app to server completion --- vscode/quint-vscode/server/src/complete.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/vscode/quint-vscode/server/src/complete.ts b/vscode/quint-vscode/server/src/complete.ts index 4d899eeeb..e823d9660 100644 --- a/vscode/quint-vscode/server/src/complete.ts +++ b/vscode/quint-vscode/server/src/complete.ts @@ -219,6 +219,8 @@ function getSuggestedBuiltinsForType(type: QuintType): { name: string }[] { case 'oper': // no suggestions from here on case 'var': case 'sum': + case 'abs': + case 'app': return [] } } From 323305899cc43bb5d5fd3e742bb86fa0fe7ade18 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 24 Jan 2024 22:25:04 -0500 Subject: [PATCH 212/388] Add missing graphics case --- quint/src/graphics.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/quint/src/graphics.ts b/quint/src/graphics.ts index 53985dd18..ad11919a9 100644 --- a/quint/src/graphics.ts +++ b/quint/src/graphics.ts @@ -9,7 +9,7 @@ */ import chalk from 'chalk' -import { strict as assert } from 'assert' +import { fail, strict as assert } from 'assert' import { Doc, braces, @@ -204,8 +204,10 @@ export function prettyQuintType(type: QuintType): Doc { return prettySumRow(type.fields) } case 'app': + const args = type.args.map(prettyQuintType) + return group([prettyQuintType(type), text('['), ...args, text(']')]) case 'abs': - throw new Error('TODO This should be impossible?') + fail('internal error: type abstraction should never be printed for users in graphics') } } From c79a8cf1e0845e3ddb3610c13cd600b5ad741403 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 24 Jan 2024 22:52:32 -0500 Subject: [PATCH 213/388] Cleanup and comment correction --- quint/src/parsing/ToIrListener.ts | 12 +++++++++--- quint/src/quintError.ts | 2 -- quint/src/types/constraintGenerator.ts | 2 -- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index b90220d2a..9ae21c8b5 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -367,8 +367,10 @@ export class ToIrListener implements QuintListener { this.declarationStack.push(def) } - // TODO - // type Alias = Set(int) + // E.g., + // + // - type Alias = Set(int) + // - type Constr[a, b] = (Set(a), Set(b)) exitTypeAliasDef(ctx: p.TypeAliasDefContext) { const id = this.getId(ctx) @@ -393,7 +395,10 @@ export class ToIrListener implements QuintListener { this.declarationStack.push(def) } - // type T = | A | B(t1) | C(t2) + // E.g., + // + // - type T = | A | B(t1) | C(t2) + // - type Result[ok, err] = | Ok(ok) | Err(err) exitTypeSumDef(ctx: p.TypeSumDefContext) { const id = this.getId(ctx) @@ -1091,6 +1096,7 @@ export class ToIrListener implements QuintListener { this.typeStack.push({ id, kind: 'const', name }) } + // E.g., Result[int, str] exitTypeApp(ctx: p.TypeAppContext) { const id = this.getId(ctx) const args: QuintType[] = ctx._typeArg diff --git a/quint/src/quintError.ts b/quint/src/quintError.ts index 2fccad980..b67b9a1e2 100644 --- a/quint/src/quintError.ts +++ b/quint/src/quintError.ts @@ -47,8 +47,6 @@ export type ErrorCode = | 'QNT008' /* QNT009: Missing arguments or parameters. You should omit the parentheses */ | 'QNT009' - /* QNT010: Lower case simple identifiers */ - | 'QNT010' /* QNT012: '...' may be used once in '{ ...record, }' */ | 'QNT012' /* QNT013: import ... from : could not load */ diff --git a/quint/src/types/constraintGenerator.ts b/quint/src/types/constraintGenerator.ts index 9b3382cd4..e17bdcafa 100644 --- a/quint/src/types/constraintGenerator.ts +++ b/quint/src/types/constraintGenerator.ts @@ -391,7 +391,6 @@ export class ConstraintGeneratorVisitor implements IRVisitor { } } - // This is like application (via unification)? private newInstance(t: TypeScheme): QuintType { const typeNames = Array.from(t.typeVariables) const rowNames = Array.from(t.rowVariables) @@ -417,7 +416,6 @@ export class ConstraintGeneratorVisitor implements IRVisitor { ) } - // TODO: This is abstraction private quantify(type: QuintType): TypeScheme { const freeNames = this.currentFreeNames() const nonFreeNames = { From fa7a65615224103e13e5d33d858fab79c9f4d58d Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 25 Jan 2024 08:38:45 -0500 Subject: [PATCH 214/388] Fix lints --- quint/src/graphics.ts | 5 +++-- quint/src/runtime/impl/compilerImpl.ts | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/quint/src/graphics.ts b/quint/src/graphics.ts index ad11919a9..1bcfb5575 100644 --- a/quint/src/graphics.ts +++ b/quint/src/graphics.ts @@ -8,8 +8,8 @@ * See LICENSE in the project root for license information. */ +import { strict as assert, fail } from 'assert' import chalk from 'chalk' -import { fail, strict as assert } from 'assert' import { Doc, braces, @@ -203,9 +203,10 @@ export function prettyQuintType(type: QuintType): Doc { case 'sum': { return prettySumRow(type.fields) } - case 'app': + case 'app': { const args = type.args.map(prettyQuintType) return group([prettyQuintType(type), text('['), ...args, text(']')]) + } case 'abs': fail('internal error: type abstraction should never be printed for users in graphics') } diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 9c50081b8..1e08509e2 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -1407,7 +1407,8 @@ export class CompilerVisitor implements IRVisitor { }, } }) - // In case the case of reps, we have multiple copies of the same action. This is why all occurrences have the same id. + // In case the case of reps, we have multiple copies of the same action. + // This is why all occurrences have the same id. return this.chainAllOrThen(actions, 'then', _ => app.args[1].id) }) .join() From 02567d323890cc0d1cec46b821cee655b6f969b8 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 25 Jan 2024 08:44:25 -0500 Subject: [PATCH 215/388] Update quint/src/parsing/ToIrListener.ts Co-authored-by: Gabriela Moreira --- quint/src/parsing/ToIrListener.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index 9ae21c8b5..ffa81a062 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -369,8 +369,8 @@ export class ToIrListener implements QuintListener { // E.g., // - // - type Alias = Set(int) - // - type Constr[a, b] = (Set(a), Set(b)) + // - type Alias = Set[int] + // - type Constr[a, b] = (Set[a], Set[b]) exitTypeAliasDef(ctx: p.TypeAliasDefContext) { const id = this.getId(ctx) From 0316cd85b363d097f4e3b256c33cc22d822cb2dc Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 25 Jan 2024 08:44:37 -0500 Subject: [PATCH 216/388] Update quint/src/ir/quintTypes.ts Co-authored-by: Gabriela Moreira --- quint/src/ir/quintTypes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/ir/quintTypes.ts b/quint/src/ir/quintTypes.ts index 133f6aeb8..cddd85672 100644 --- a/quint/src/ir/quintTypes.ts +++ b/quint/src/ir/quintTypes.ts @@ -110,7 +110,7 @@ export interface QuintAbsType extends WithOptionalId { /** Type application: (Λτ.Τ)υ * - * In system-F, this corresponds to (Λτ.Τ)υ + * In System-F, this corresponds to (Λτ.Τ)υ * * Type application is only well well-formed if `ctor` is (resolved to) an * n-ary type abstraction, and `args.length === n` From eca5e836f8ccb5375105eea8163c79adb79e3069 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 25 Jan 2024 20:20:51 -0500 Subject: [PATCH 217/388] Add explanatory comment --- quint/src/types/base.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/quint/src/types/base.ts b/quint/src/types/base.ts index 607b13554..23f357f21 100644 --- a/quint/src/types/base.ts +++ b/quint/src/types/base.ts @@ -29,7 +29,8 @@ export interface TypeScheme { export type Signature = (_arity: number) => TypeScheme -// TODO: Why aren't we noting type variables in the schema here? +// Does not bind any type variables in `type`, which we take to assume +// that `type` has no free variables in the context. export function toScheme(type: QuintType): TypeScheme { return { typeVariables: new Set([]), rowVariables: new Set([]), type } } From 4e63d54470746e65b8d19bfb40060379bf417b50 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 26 Jan 2024 10:02:35 -0500 Subject: [PATCH 218/388] Add changelog entry --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 55600156c..537bcec52 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added ### Changed + +- Improved error reporting for runtime errors during simulation (#1349). + ### Deprecated ### Removed ### Fixed From a6e3baac8cdd5f9492cefc245fdc6a83d78ab15d Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 26 Jan 2024 10:03:07 -0500 Subject: [PATCH 219/388] Release v0.18.2 --- CHANGELOG.md | 9 +++++++++ quint/package-lock.json | 4 ++-- quint/package.json | 16 +++++++++++++--- quint/src/version.ts | 2 +- 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 537bcec52..0e5cd0750 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.18.2 -- 2024-01-26 + ### Added ### Changed diff --git a/quint/package-lock.json b/quint/package-lock.json index b86cf5d2e..8895afdbb 100644 --- a/quint/package-lock.json +++ b/quint/package-lock.json @@ -1,12 +1,12 @@ { "name": "@informalsystems/quint", - "version": "0.18.1", + "version": "0.18.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint", - "version": "0.18.1", + "version": "0.18.2", "license": "Apache 2.0", "dependencies": { "@grpc/grpc-js": "^1.8.14", diff --git a/quint/package.json b/quint/package.json index dc71566b5..11a87c0c9 100644 --- a/quint/package.json +++ b/quint/package.json @@ -1,8 +1,14 @@ { "name": "@informalsystems/quint", - "version": "0.18.1", + "version": "0.18.2", "description": "Core tool for the Quint specification language", - "keywords": ["temporal", "logic", "formal", "specification", "verification"], + "keywords": [ + "temporal", + "logic", + "formal", + "specification", + "verification" + ], "homepage": "https://github.com/informalsystems/quint", "bugs": "https://github.com/informalsystems/quint/issues", "license": "Apache 2.0", @@ -29,7 +35,11 @@ "bin": { "quint": "dist/src/cli.js" }, - "files": ["README.md", "dist/**/*", "test/**/*.ts"], + "files": [ + "README.md", + "dist/**/*", + "test/**/*.ts" + ], "engines": { "node": ">=18" }, diff --git a/quint/src/version.ts b/quint/src/version.ts index 9e6c4eefb..72277b158 100644 --- a/quint/src/version.ts +++ b/quint/src/version.ts @@ -1,2 +1,2 @@ // Generated by genversion. -export const version = '0.18.1' +export const version = '0.18.2' From ca9a2da4c86c94a6ecda24daf0a8fd744a25c93e Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 26 Jan 2024 10:24:25 -0500 Subject: [PATCH 220/388] VSCode Release v0.13.2 --- vscode/quint-vscode/CHANGELOG.md | 9 +++++++++ vscode/quint-vscode/package-lock.json | 4 ++-- vscode/quint-vscode/package.json | 2 +- vscode/quint-vscode/server/package-lock.json | 18 +++++++++--------- vscode/quint-vscode/server/package.json | 4 ++-- 5 files changed, 23 insertions(+), 14 deletions(-) diff --git a/vscode/quint-vscode/CHANGELOG.md b/vscode/quint-vscode/CHANGELOG.md index 38cfc2d55..75173fcbf 100644 --- a/vscode/quint-vscode/CHANGELOG.md +++ b/vscode/quint-vscode/CHANGELOG.md @@ -14,6 +14,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed ### Security +## v0.13.2 -- 2024-01-26 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + ## v0.13.1 -- 2024-01-16 ### Added diff --git a/vscode/quint-vscode/package-lock.json b/vscode/quint-vscode/package-lock.json index 9aa7ebee9..e94ab4fd7 100644 --- a/vscode/quint-vscode/package-lock.json +++ b/vscode/quint-vscode/package-lock.json @@ -1,12 +1,12 @@ { "name": "quint-vscode", - "version": "0.13.1", + "version": "0.13.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "quint-vscode", - "version": "0.13.1", + "version": "0.13.2", "hasInstallScript": true, "dependencies": { "vscode-languageclient": "^7.0.0" diff --git a/vscode/quint-vscode/package.json b/vscode/quint-vscode/package.json index b4b0221bb..74a68f0c3 100644 --- a/vscode/quint-vscode/package.json +++ b/vscode/quint-vscode/package.json @@ -3,7 +3,7 @@ "displayName": "Quint", "description": "Language support for Quint specifications", "icon": "quint-logo-vscode.png", - "version": "0.13.1", + "version": "0.13.2", "publisher": "informal", "engines": { "vscode": "^1.52.0" diff --git a/vscode/quint-vscode/server/package-lock.json b/vscode/quint-vscode/server/package-lock.json index c7a4a6808..ca849a944 100644 --- a/vscode/quint-vscode/server/package-lock.json +++ b/vscode/quint-vscode/server/package-lock.json @@ -1,15 +1,15 @@ { "name": "@informalsystems/quint-language-server", - "version": "0.13.1", + "version": "0.13.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint-language-server", - "version": "0.13.1", + "version": "0.13.2", "license": "Apache 2.0", "dependencies": { - "@informalsystems/quint": "^0.18.1", + "@informalsystems/quint": "^0.18.2", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" @@ -476,9 +476,9 @@ "dev": true }, "node_modules/@informalsystems/quint": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.18.1.tgz", - "integrity": "sha512-fxYaMf3gVQBz1Pyj/0Mpn1mftCAjlfiMJ2IJ1pQ3RJNV4hNeAx29vYxpr2nojWdtz+UShOC63jguuYKa8kxNqg==", + "version": "0.18.2", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.18.2.tgz", + "integrity": "sha512-kW89VtdAU+VAkhGW7gb0xyyy1925tPysbGlSxbThty3wIij9AXgP4kowu4LTRvyBFKjPCfJJDoFso9pKZeujbw==", "dependencies": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", @@ -7207,9 +7207,9 @@ "dev": true }, "@informalsystems/quint": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.18.1.tgz", - "integrity": "sha512-fxYaMf3gVQBz1Pyj/0Mpn1mftCAjlfiMJ2IJ1pQ3RJNV4hNeAx29vYxpr2nojWdtz+UShOC63jguuYKa8kxNqg==", + "version": "0.18.2", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.18.2.tgz", + "integrity": "sha512-kW89VtdAU+VAkhGW7gb0xyyy1925tPysbGlSxbThty3wIij9AXgP4kowu4LTRvyBFKjPCfJJDoFso9pKZeujbw==", "requires": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", diff --git a/vscode/quint-vscode/server/package.json b/vscode/quint-vscode/server/package.json index ae36975f3..a1c880a36 100644 --- a/vscode/quint-vscode/server/package.json +++ b/vscode/quint-vscode/server/package.json @@ -1,7 +1,7 @@ { "name": "@informalsystems/quint-language-server", "description": "Language Server for the Quint specification language", - "version": "0.13.1", + "version": "0.13.2", "author": "Informal Systems", "contributors": [ { @@ -43,7 +43,7 @@ "test/**/*.ts" ], "dependencies": { - "@informalsystems/quint": "^0.18.1", + "@informalsystems/quint": "^0.18.2", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" From cd15d6cb428ca6e109b070f00d662b2c79f73aa9 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 30 Jan 2024 14:32:17 -0500 Subject: [PATCH 221/388] Include result data in typechecking error outcome This was meant to be included, and ensures we have more helpful error data when diagnosing erroneous outcomes. --- quint/src/cliCommands.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index 1742eebab..3a3bbe1b1 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -255,12 +255,12 @@ export function mkErrorMessage(sourceMap: SourceMap): (_: QuintError) => ErrorMe */ export async function typecheck(parsed: ParsedStage): Promise> { const { table, modules, sourceMap } = parsed - const typechecking = { ...parsed, stage: 'typechecking' as stage } const [errorMap, result] = analyzeModules(table, modules) + const typechecking = { ...parsed, ...result, stage: 'typechecking' as stage } if (errorMap.length === 0) { - return right({ ...typechecking, ...result }) + return right(typechecking) } else { const errors = errorMap.map(mkErrorMessage(sourceMap)) return cliErr('typechecking failed', { ...typechecking, errors }) From f14daed800b287f61fd65c5114cc6ff31eba06ae Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 30 Jan 2024 19:52:27 -0500 Subject: [PATCH 222/388] Add regression test for #1356 --- quint/test/effects/inferrer.test.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/quint/test/effects/inferrer.test.ts b/quint/test/effects/inferrer.test.ts index 188e635cc..25afaf776 100644 --- a/quint/test/effects/inferrer.test.ts +++ b/quint/test/effects/inferrer.test.ts @@ -207,6 +207,19 @@ describe('inferEffects', () => { assert.deepEqual(effectForDef(defs, effects, 'CoolAction'), expectedEffect) }) + it('avoids invalid cyclical binding error (regression on #1356)', () => { + const defs = [ + `pure def foo(s: int, g: int => int): int = { + val r = if (true) s else g(s) + g(r) + }`, + ] + + const [errors, _] = inferEffectsForDefs(defs) + + assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) + }) + it('returns error when operator signature is not unifiable with args', () => { const defs = [`def a = S.map(p => x' = p)`] From 251ed27d7f5f6637cfe129e88508e0ad4c8381ee Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 30 Jan 2024 19:52:43 -0500 Subject: [PATCH 223/388] Use our zip util --- quint/src/effects/inferrer.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/quint/src/effects/inferrer.ts b/quint/src/effects/inferrer.ts index addf5ebc5..e31f08e69 100644 --- a/quint/src/effects/inferrer.ts +++ b/quint/src/effects/inferrer.ts @@ -37,7 +37,7 @@ import { Error, ErrorTree, buildErrorLeaf, buildErrorTree, errorTreeToString } f import { getSignatures, standardPropagation } from './builtinSignatures' import { FreshVarGenerator } from '../FreshVarGenerator' import { effectToString } from './printing' -import { zip } from 'lodash' +import { zip } from '../util' import { addNamespaces } from './namespaces' export type EffectInferenceResult = [Map, Map] @@ -185,11 +185,6 @@ export class EffectInferrer implements IRVisitor { effects, expr.args.map(a => a.id) ).forEach(([effect, id]) => { - if (!effect || !id) { - // Impossible: effects and expr.args are the same length - throw new Error(`Expected ${expr.args.length} effects, but got ${effects.length}`) - } - const r = applySubstitution(s, effect).map(toScheme) this.addToResults(id, r) }) From 49301095f0513c0c52664a21c9fccbb809b00b3f Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 1 Feb 2024 17:17:01 -0500 Subject: [PATCH 224/388] Simplify effect inference --- quint/src/effects/inferrer.ts | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/quint/src/effects/inferrer.ts b/quint/src/effects/inferrer.ts index e31f08e69..b4450a948 100644 --- a/quint/src/effects/inferrer.ts +++ b/quint/src/effects/inferrer.ts @@ -149,23 +149,13 @@ export class EffectInferrer implements IRVisitor { } this.location = `Trying to infer effect for operator application in ${expressionToString(expr)}` - const paramsResult = mergeInMany( - expr.args.map((a: QuintEx) => { - return this.fetchResult(a.id).map(e => this.newInstance(e)) - }) - ) - const resultEffect: Effect = { kind: 'variable', name: this.freshVarGenerator.freshVar('_e') } - const arrowEffect = paramsResult - .map(params => { - const effect: Effect = { - kind: 'arrow', - params, - result: resultEffect, - } + // Fetch all the effects for the arguments + const argEffects = mergeInMany(expr.args.map((a: QuintEx) => this.fetchResult(a.id).map(e => e.effect))) - return effect - }) + const resultEffect: Effect = { kind: 'variable', name: this.freshVarGenerator.freshVar('_e') } + const arrowEffect = argEffects + .map((params: Effect[]): Effect => ({ kind: 'arrow', params, result: resultEffect })) .chain(e => applySubstitution(this.substitutions, e)) this.effectForName(expr.opcode, expr.id, expr.args.length) @@ -180,7 +170,7 @@ export class EffectInferrer implements IRVisitor { .chain(s => { this.substitutions = s - paramsResult.map(effects => + argEffects.map(effects => zip( effects, expr.args.map(a => a.id) From 065b254221fee9444033239ed783dce4f888a346 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 1 Feb 2024 18:11:29 -0500 Subject: [PATCH 225/388] Correct unification of "effect entities" Closes #1356 Accomplished by removing an erroneous occurs check. --- quint/src/effects/base.ts | 21 +++++++-- quint/test/effects/base.test.ts | 75 +++++++++++++++------------------ 2 files changed, 50 insertions(+), 46 deletions(-) diff --git a/quint/src/effects/base.ts b/quint/src/effects/base.ts index 1b466a7c0..2676b4dd6 100644 --- a/quint/src/effects/base.ts +++ b/quint/src/effects/base.ts @@ -178,10 +178,23 @@ function bindEffect(name: string, effect: Effect): Either } function bindEntity(name: string, entity: Entity): Either { - if (entityNames(entity).includes(name)) { - return left(`Can't bind ${name} to ${entityToString(entity)}: cyclical binding`) - } else { - return right([{ kind: 'entity', name, value: entity }]) + switch (entity.kind) { + case 'concrete': + case 'variable': + return right([{ kind: 'entity', name, value: entity }]) + case 'union': + if (entityNames(entity).includes(name)) { + // An entity variable (which always stands for a set of state variables) + // unifies with the union of entities that may include include itself, + // iff the variables unify. + // + // I.e.: + // + // (v1 =.= v1 ∪ ... ∪ vn) <=> (v1 =.= ... =.= vn) + return right(entity.entities.map(e => ({ kind: 'entity', name, value: e }))) + } else { + return right([{ kind: 'entity', name, value: entity }]) + } } } diff --git a/quint/test/effects/base.test.ts b/quint/test/effects/base.test.ts index 0176016d4..65839a132 100644 --- a/quint/test/effects/base.test.ts +++ b/quint/test/effects/base.test.ts @@ -375,48 +375,39 @@ describe('unify', () => { assert.isTrue(result.isLeft()) }) - it('returs error when entity names are cyclical', () => { - const e1 = parseEffectOrThrow('Read[v1]') - const e2 = parseEffectOrThrow('Read[v1, v2]') - - const result = unify(e1, e2) - - result.mapLeft(e => - assert.deepEqual(e, { - location: 'Trying to unify Read[v1] and Read[v1, v2]', - children: [ - { - location: 'Trying to unify entities [v1] and [v1, v2]', - message: "Can't bind v1 to v1, v2: cyclical binding", - children: [], - }, - ], - }) - ) - - assert.isTrue(result.isLeft()) - }) - - it('returs error when entity names are cyclical in other way', () => { - const e1 = parseEffectOrThrow('Temporal[v1, v2]') - const e2 = parseEffectOrThrow('Temporal[v1]') - - const result = unify(e1, e2) - - result.mapLeft(e => - assert.deepEqual(e, { - location: 'Trying to unify Temporal[v1, v2] and Temporal[v1]', - children: [ - { - location: 'Trying to unify entities [v1, v2] and [v1]', - message: "Can't bind v1 to v1, v2: cyclical binding", - children: [], - }, - ], - }) - ) - - assert.isTrue(result.isLeft()) + it('can unify entities when a single variable in the lhs appears in a union on the rhs', () => { + // E.g., given the unification problem + // + // v1 =.= v1 ∪ v2 + // + // We should be able to form a valid substitution iff v1 =.= v2, since + // this then simplifies to + // + // v1 =.= v1 + // + // NOTE: This test was inverted after an incorrect occurs check was + // causing erroneous effect checking failures, as reported in + // https://github.com/informalsystems/quint/issues/1356 + // + // Occurs checks are called for to prevent the attempt to unify a free + // variable with a term that includes that variable as a subterm. E.g., `X + // =.= foo(a, X)`, which can never be resolved into a ground term. + // However, despite appearances, the unification of so called "entity + // unions", as in the example above is not such a case. Each "entity + // variable" stands for a set of possible state variables. As such, the + // unification problem above can be expanded to + // + // v1 ∪ {} =.= v1 ∪ v2 ∪ {} + // + // Which helps make clear why the unification succeeds iff v1 =.= v2. + const read1 = parseEffectOrThrow('Read[v1]') + const read2 = parseEffectOrThrow('Read[v1, v2]') + assert.isTrue(unify(read1, read2).isRight()) + + // Check the symmetrical case. + const temporal1 = parseEffectOrThrow('Temporal[v1, v2]') + const temporal2 = parseEffectOrThrow('Temporal[v1]') + assert.isTrue(unify(temporal1, temporal2).isRight()) }) }) }) From cdde148a24920432c31c24ed9c12d1912e479aa9 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 1 Feb 2024 18:33:17 -0500 Subject: [PATCH 226/388] Clean up logic and comments --- quint/src/effects/base.ts | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/quint/src/effects/base.ts b/quint/src/effects/base.ts index 2676b4dd6..73b5bf94f 100644 --- a/quint/src/effects/base.ts +++ b/quint/src/effects/base.ts @@ -81,11 +81,11 @@ export interface StateVariable { * entity variable or a combination of other entities. */ export type Entity = - /* A list of state variables */ + /* A set of state variables, represented as a list */ | { kind: 'concrete'; stateVariables: StateVariable[] } - /* A variable representing some entity */ + /* A variable representing some set of entities */ | { kind: 'variable'; name: string; reference?: bigint } - /* A combination of entities */ + /* The union of sets of entities, represented as a list */ | { kind: 'union'; entities: Entity[] } /* @@ -177,23 +177,35 @@ function bindEffect(name: string, effect: Effect): Either } } -function bindEntity(name: string, entity: Entity): Either { +function bindEntity(name: string, entity: Entity): Substitutions { switch (entity.kind) { case 'concrete': case 'variable': - return right([{ kind: 'entity', name, value: entity }]) + return [{ kind: 'entity', name, value: entity }] case 'union': if (entityNames(entity).includes(name)) { // An entity variable (which always stands for a set of state variables) - // unifies with the union of entities that may include include itself, - // iff the variables unify. + // unifies with the union of n sets of entities that may include itself, + // iff it unifies with each set. // // I.e.: // // (v1 =.= v1 ∪ ... ∪ vn) <=> (v1 =.= ... =.= vn) - return right(entity.entities.map(e => ({ kind: 'entity', name, value: e }))) + // + // We call this function recursively because, in the general case, + // occurrences of `v1` may be nested, as in: + // + // v1 =.= v1 ∪ (v2 ∪ (v3 ∪ v1)) ∪ v4 + // + // In practice, we are flattening unions before we call this function, + // but solving the general case ensures we preserve correct behavior + // even if this function is used on its own, without incurring any + // notable overhead when `entities` is already flat. + return entity.entities.flatMap(e => bindEntity(name, e)) } else { - return right([{ kind: 'entity', name, value: entity }]) + // Otherwise, the variable may be bound to the union of the entities + // without qualification. + return [{ kind: 'entity', name, value: entity }] } } } @@ -334,9 +346,9 @@ export function unifyEntities(va: Entity, vb: Entity): Either buildErrorLeaf(location, msg)) + return right(bindEntity(v1.name, v2)) } else if (v2.kind === 'variable') { - return bindEntity(v2.name, v1).mapLeft(msg => buildErrorLeaf(location, msg)) + return right(bindEntity(v2.name, v1)) } else if (isEqual(v1, v2)) { return right([]) } else if (v1.kind === 'union' && v2.kind === 'concrete') { From 65d06ef7e55b46e2db8c27944d2b60474343eb87 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 7 Feb 2024 16:38:17 -0500 Subject: [PATCH 227/388] Update quint/test/effects/base.test.ts Co-authored-by: Gabriela Moreira --- quint/test/effects/base.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/test/effects/base.test.ts b/quint/test/effects/base.test.ts index 65839a132..d17ec5164 100644 --- a/quint/test/effects/base.test.ts +++ b/quint/test/effects/base.test.ts @@ -383,7 +383,7 @@ describe('unify', () => { // We should be able to form a valid substitution iff v1 =.= v2, since // this then simplifies to // - // v1 =.= v1 + // v1 =.= v1 =.= v2 // // NOTE: This test was inverted after an incorrect occurs check was // causing erroneous effect checking failures, as reported in From 4ffa585a466886e6ab6f5a78b75b1c7ba3543a93 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 1 Feb 2024 18:45:15 -0500 Subject: [PATCH 228/388] Update changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e5cd0750..055f8a8e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Deprecated ### Removed ### Fixed + +- Erroneous effect checking failure resulting from invalid occurs check. This + error prevented some valid specs from being simulated or verified (#1359). + ### Security ## v0.18.2 -- 2024-01-26 From f009af2d7b1e8c254d6a065ce1ffe545fe7a5e7b Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 7 Feb 2024 16:40:49 -0500 Subject: [PATCH 229/388] Revert "Simplify effect inference" This reverts commit 49301095f0513c0c52664a21c9fccbb809b00b3f. --- quint/src/effects/inferrer.ts | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/quint/src/effects/inferrer.ts b/quint/src/effects/inferrer.ts index b4450a948..e31f08e69 100644 --- a/quint/src/effects/inferrer.ts +++ b/quint/src/effects/inferrer.ts @@ -149,13 +149,23 @@ export class EffectInferrer implements IRVisitor { } this.location = `Trying to infer effect for operator application in ${expressionToString(expr)}` - - // Fetch all the effects for the arguments - const argEffects = mergeInMany(expr.args.map((a: QuintEx) => this.fetchResult(a.id).map(e => e.effect))) + const paramsResult = mergeInMany( + expr.args.map((a: QuintEx) => { + return this.fetchResult(a.id).map(e => this.newInstance(e)) + }) + ) const resultEffect: Effect = { kind: 'variable', name: this.freshVarGenerator.freshVar('_e') } - const arrowEffect = argEffects - .map((params: Effect[]): Effect => ({ kind: 'arrow', params, result: resultEffect })) + const arrowEffect = paramsResult + .map(params => { + const effect: Effect = { + kind: 'arrow', + params, + result: resultEffect, + } + + return effect + }) .chain(e => applySubstitution(this.substitutions, e)) this.effectForName(expr.opcode, expr.id, expr.args.length) @@ -170,7 +180,7 @@ export class EffectInferrer implements IRVisitor { .chain(s => { this.substitutions = s - argEffects.map(effects => + paramsResult.map(effects => zip( effects, expr.args.map(a => a.id) From 4af1dd8444574db71f030983c567f597366a4a4f Mon Sep 17 00:00:00 2001 From: bugarela Date: Thu, 8 Feb 2024 08:49:34 -0300 Subject: [PATCH 230/388] Ensure ITF is produced also on successful runs --- quint/io-cli-tests.md | 19 +++++++++++++++++++ quint/src/cliCommands.ts | 20 ++++++++++---------- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/quint/io-cli-tests.md b/quint/io-cli-tests.md index 915fa5ae4..3f3d3e663 100644 --- a/quint/io-cli-tests.md +++ b/quint/io-cli-tests.md @@ -683,6 +683,25 @@ rm out-itf-example.itf.json ] ``` +### Run without violation outputs ITF + + +``` +quint run --out-itf=out-itf-example.itf.json --max-steps=5 --seed=123 ../examples/solidity/Coin/coin.qnt +cat out-itf-example.itf.json | jq '.states[0]."balances"."#map"[0]' +rm out-itf-example.itf.json +``` + + +``` +[ + "alice", + { + "#bigint": "0" + } +] +``` + ### Test outputs ITF TODO: output states after fix: https://github.com/informalsystems/quint/issues/288 diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index 3a3bbe1b1..a23b3178d 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -549,6 +549,16 @@ export async function runSimulator(prev: TypecheckedStage): Promise Date: Thu, 8 Feb 2024 08:54:19 -0300 Subject: [PATCH 231/388] Add CHANGELOG entry --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 055f8a8e9..059c992fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Erroneous effect checking failure resulting from invalid occurs check. This error prevented some valid specs from being simulated or verified (#1359). +- Regression on ITF production, where we stopped producing ITF traces on + successful runs (#1362) ### Security From a8020faaa29fd961c0d48033efda34c0fcd0c978 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 8 Feb 2024 16:48:44 -0500 Subject: [PATCH 232/388] Release v0.18.3 --- CHANGELOG.md | 9 +++++++++ quint/package-lock.json | 4 ++-- quint/package.json | 2 +- quint/src/version.ts | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 059c992fc..fd011a24d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.18.3 -- 2024-02-08 + ### Added ### Changed ### Deprecated diff --git a/quint/package-lock.json b/quint/package-lock.json index 8895afdbb..76a99dd10 100644 --- a/quint/package-lock.json +++ b/quint/package-lock.json @@ -1,12 +1,12 @@ { "name": "@informalsystems/quint", - "version": "0.18.2", + "version": "0.18.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint", - "version": "0.18.2", + "version": "0.18.3", "license": "Apache 2.0", "dependencies": { "@grpc/grpc-js": "^1.8.14", diff --git a/quint/package.json b/quint/package.json index 11a87c0c9..0cb51a8d0 100644 --- a/quint/package.json +++ b/quint/package.json @@ -1,6 +1,6 @@ { "name": "@informalsystems/quint", - "version": "0.18.2", + "version": "0.18.3", "description": "Core tool for the Quint specification language", "keywords": [ "temporal", diff --git a/quint/src/version.ts b/quint/src/version.ts index 72277b158..8172abdfa 100644 --- a/quint/src/version.ts +++ b/quint/src/version.ts @@ -1,2 +1,2 @@ // Generated by genversion. -export const version = '0.18.2' +export const version = '0.18.3' From 1d537de7107aedf13f11affacaee2a13f01007b9 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 8 Feb 2024 17:07:40 -0500 Subject: [PATCH 233/388] VSCode Release v0.13.7 --- vscode/quint-vscode/CHANGELOG.md | 45 ++++++++++++++++++++ vscode/quint-vscode/package-lock.json | 4 +- vscode/quint-vscode/package.json | 2 +- vscode/quint-vscode/server/package-lock.json | 18 ++++---- vscode/quint-vscode/server/package.json | 4 +- 5 files changed, 59 insertions(+), 14 deletions(-) diff --git a/vscode/quint-vscode/CHANGELOG.md b/vscode/quint-vscode/CHANGELOG.md index 75173fcbf..2c8eb0c06 100644 --- a/vscode/quint-vscode/CHANGELOG.md +++ b/vscode/quint-vscode/CHANGELOG.md @@ -14,6 +14,51 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed ### Security +## v0.13.7 -- 2024-02-08 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.13.6 -- 2024-02-08 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.13.5 -- 2024-02-08 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.13.4 -- 2024-02-08 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.13.3 -- 2024-02-08 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + ## v0.13.2 -- 2024-01-26 ### Added diff --git a/vscode/quint-vscode/package-lock.json b/vscode/quint-vscode/package-lock.json index e94ab4fd7..1b7f69401 100644 --- a/vscode/quint-vscode/package-lock.json +++ b/vscode/quint-vscode/package-lock.json @@ -1,12 +1,12 @@ { "name": "quint-vscode", - "version": "0.13.2", + "version": "0.13.7", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "quint-vscode", - "version": "0.13.2", + "version": "0.13.7", "hasInstallScript": true, "dependencies": { "vscode-languageclient": "^7.0.0" diff --git a/vscode/quint-vscode/package.json b/vscode/quint-vscode/package.json index 74a68f0c3..10eb198ad 100644 --- a/vscode/quint-vscode/package.json +++ b/vscode/quint-vscode/package.json @@ -3,7 +3,7 @@ "displayName": "Quint", "description": "Language support for Quint specifications", "icon": "quint-logo-vscode.png", - "version": "0.13.2", + "version": "0.13.7", "publisher": "informal", "engines": { "vscode": "^1.52.0" diff --git a/vscode/quint-vscode/server/package-lock.json b/vscode/quint-vscode/server/package-lock.json index ca849a944..d0ffde05d 100644 --- a/vscode/quint-vscode/server/package-lock.json +++ b/vscode/quint-vscode/server/package-lock.json @@ -1,15 +1,15 @@ { "name": "@informalsystems/quint-language-server", - "version": "0.13.2", + "version": "0.13.7", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint-language-server", - "version": "0.13.2", + "version": "0.13.7", "license": "Apache 2.0", "dependencies": { - "@informalsystems/quint": "^0.18.2", + "@informalsystems/quint": "^0.18.3", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" @@ -476,9 +476,9 @@ "dev": true }, "node_modules/@informalsystems/quint": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.18.2.tgz", - "integrity": "sha512-kW89VtdAU+VAkhGW7gb0xyyy1925tPysbGlSxbThty3wIij9AXgP4kowu4LTRvyBFKjPCfJJDoFso9pKZeujbw==", + "version": "0.18.3", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.18.3.tgz", + "integrity": "sha512-NemkxVijY7DC9dyVQwp/S3K0PhbDjGVRZx2RmXlt9x8kUt0I1RgYtqChc0Za39tl/p9Tu+CbB1Pa2KEJyw2JXA==", "dependencies": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", @@ -7207,9 +7207,9 @@ "dev": true }, "@informalsystems/quint": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.18.2.tgz", - "integrity": "sha512-kW89VtdAU+VAkhGW7gb0xyyy1925tPysbGlSxbThty3wIij9AXgP4kowu4LTRvyBFKjPCfJJDoFso9pKZeujbw==", + "version": "0.18.3", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.18.3.tgz", + "integrity": "sha512-NemkxVijY7DC9dyVQwp/S3K0PhbDjGVRZx2RmXlt9x8kUt0I1RgYtqChc0Za39tl/p9Tu+CbB1Pa2KEJyw2JXA==", "requires": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", diff --git a/vscode/quint-vscode/server/package.json b/vscode/quint-vscode/server/package.json index a1c880a36..f416bbaa8 100644 --- a/vscode/quint-vscode/server/package.json +++ b/vscode/quint-vscode/server/package.json @@ -1,7 +1,7 @@ { "name": "@informalsystems/quint-language-server", "description": "Language Server for the Quint specification language", - "version": "0.13.2", + "version": "0.13.7", "author": "Informal Systems", "contributors": [ { @@ -43,7 +43,7 @@ "test/**/*.ts" ], "dependencies": { - "@informalsystems/quint": "^0.18.2", + "@informalsystems/quint": "^0.18.3", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" From d442edfc0fbb0aeff71b10a4e821feaa4c139fff Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 15 Feb 2024 12:08:27 -0500 Subject: [PATCH 234/388] Clean up operDef grammar Keeping the exact same meaning, but greater clarity on the rules. --- quint/src/generated/Quint.g4 | 30 +- quint/src/generated/Quint.interp | 2 +- quint/src/generated/QuintParser.ts | 1871 ++++++++++++++-------------- 3 files changed, 970 insertions(+), 933 deletions(-) diff --git a/quint/src/generated/Quint.g4 b/quint/src/generated/Quint.g4 index 95154347f..d027fc90d 100644 --- a/quint/src/generated/Quint.g4 +++ b/quint/src/generated/Quint.g4 @@ -39,17 +39,25 @@ declaration : 'const' qualId ':' type # const ; // An operator definition. -// We embed two kinds of parameters right in this rule. -// Otherwise, the parser would start recognizing parameters everywhere. -operDef : qualifier normalCallName - ( /* ML-like parameter lists */ - '(' (parameter (',' parameter)*)? ')' (':' type)? - | ':' type - /* C-like parameter lists */ - | '(' (parameter ':' type (',' parameter ':' type)*) ')' ':' type - )? - ('=' expr)? ';'? - ; +operDef + : qualifier normalCallName + // Unannotated parameter list + ('(' (parameter (',' parameter)*)? ')')? + // Optional type annotation using the deprecated format + // TODO: Remove as per https://github.com/informalsystems/quint/issues/923 + (':' type)? + // We support header declaration with no implementation for documentation genaration + ('=' expr)? + // Optionally terminated with a semicolon + ';'? + | qualifier normalCallName + // Fully annotated parameter lists + '(' (parameter ':' type (',' parameter ':' type)*) ')' ':' type + // We support header declaration with no implementation for documentation genaration + ('=' expr)? + // Optionally terminated with a semicolon + ';'? + ; typeDef : 'type' qualId # typeAbstractDef diff --git a/quint/src/generated/Quint.interp b/quint/src/generated/Quint.interp index 781eec423..20af851ff 100644 --- a/quint/src/generated/Quint.interp +++ b/quint/src/generated/Quint.interp @@ -190,4 +190,4 @@ identifier atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 793, 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, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 3, 2, 6, 2, 88, 10, 2, 13, 2, 14, 2, 89, 3, 2, 3, 2, 3, 3, 7, 3, 95, 10, 3, 12, 3, 14, 3, 98, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 104, 10, 3, 12, 3, 14, 3, 107, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 112, 10, 4, 12, 4, 14, 4, 115, 11, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 139, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 147, 10, 6, 12, 6, 14, 6, 150, 11, 6, 5, 6, 152, 10, 6, 3, 6, 3, 6, 3, 6, 5, 6, 157, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 170, 10, 6, 12, 6, 14, 6, 173, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 179, 10, 6, 3, 6, 3, 6, 5, 6, 183, 10, 6, 3, 6, 5, 6, 186, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 200, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 207, 10, 8, 12, 8, 14, 8, 210, 11, 8, 3, 8, 3, 8, 5, 8, 214, 10, 8, 3, 9, 5, 9, 217, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 222, 10, 9, 12, 9, 14, 9, 225, 11, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 232, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 238, 10, 11, 3, 11, 3, 11, 3, 11, 5, 11, 243, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 254, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 262, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 268, 10, 13, 3, 13, 3, 13, 5, 13, 272, 10, 13, 5, 13, 274, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 285, 10, 14, 5, 14, 287, 10, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 300, 10, 15, 12, 15, 14, 15, 303, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 310, 10, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 323, 10, 15, 12, 15, 14, 15, 326, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 333, 10, 15, 5, 15, 335, 10, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 350, 10, 20, 12, 20, 14, 20, 353, 11, 20, 5, 20, 355, 10, 20, 3, 20, 5, 20, 358, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 379, 10, 20, 12, 20, 14, 20, 382, 11, 20, 3, 20, 5, 20, 385, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 391, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 403, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 416, 10, 20, 12, 20, 14, 20, 419, 11, 20, 3, 20, 3, 20, 7, 20, 423, 10, 20, 12, 20, 14, 20, 426, 11, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 439, 10, 22, 12, 22, 14, 22, 442, 11, 22, 3, 22, 3, 22, 3, 22, 5, 22, 447, 10, 22, 3, 22, 3, 22, 5, 22, 451, 10, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 460, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 476, 10, 24, 12, 24, 14, 24, 479, 11, 24, 3, 24, 5, 24, 482, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 491, 10, 24, 12, 24, 14, 24, 494, 11, 24, 3, 24, 5, 24, 497, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 507, 10, 24, 12, 24, 14, 24, 510, 11, 24, 3, 24, 5, 24, 513, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 522, 10, 24, 12, 24, 14, 24, 525, 11, 24, 3, 24, 5, 24, 528, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 536, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 544, 10, 24, 12, 24, 14, 24, 547, 11, 24, 3, 24, 5, 24, 550, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 558, 10, 24, 12, 24, 14, 24, 561, 11, 24, 3, 24, 5, 24, 564, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 572, 10, 24, 12, 24, 14, 24, 575, 11, 24, 5, 24, 577, 10, 24, 3, 24, 5, 24, 580, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 605, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 644, 10, 24, 3, 24, 5, 24, 647, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 654, 10, 24, 12, 24, 14, 24, 657, 11, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 663, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 668, 10, 25, 12, 25, 14, 25, 671, 11, 25, 3, 25, 3, 25, 3, 26, 3, 26, 5, 26, 677, 10, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 686, 10, 27, 3, 27, 5, 27, 689, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 700, 10, 28, 3, 29, 3, 29, 5, 29, 704, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 714, 10, 30, 12, 30, 14, 30, 717, 11, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 723, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 6, 31, 730, 10, 31, 13, 31, 14, 31, 731, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 5, 32, 741, 10, 32, 3, 33, 3, 33, 3, 34, 3, 34, 5, 34, 747, 10, 34, 3, 35, 3, 35, 3, 35, 7, 35, 752, 10, 35, 12, 35, 14, 35, 755, 11, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 5, 36, 763, 10, 36, 3, 37, 3, 37, 5, 37, 767, 10, 37, 3, 38, 3, 38, 5, 38, 771, 10, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 7, 41, 780, 10, 41, 12, 41, 14, 41, 783, 11, 41, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 789, 10, 42, 3, 43, 3, 43, 3, 43, 2, 2, 4, 38, 46, 44, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 68, 2, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 2, 10, 3, 2, 53, 55, 3, 2, 51, 52, 3, 2, 56, 61, 4, 2, 45, 49, 65, 66, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 51, 61, 3, 2, 42, 44, 3, 2, 67, 68, 2, 890, 2, 87, 3, 2, 2, 2, 4, 96, 3, 2, 2, 2, 6, 113, 3, 2, 2, 2, 8, 138, 3, 2, 2, 2, 10, 140, 3, 2, 2, 2, 12, 199, 3, 2, 2, 2, 14, 201, 3, 2, 2, 2, 16, 216, 3, 2, 2, 2, 18, 226, 3, 2, 2, 2, 20, 233, 3, 2, 2, 2, 22, 253, 3, 2, 2, 2, 24, 273, 3, 2, 2, 2, 26, 286, 3, 2, 2, 2, 28, 334, 3, 2, 2, 2, 30, 336, 3, 2, 2, 2, 32, 338, 3, 2, 2, 2, 34, 340, 3, 2, 2, 2, 36, 342, 3, 2, 2, 2, 38, 402, 3, 2, 2, 2, 40, 427, 3, 2, 2, 2, 42, 450, 3, 2, 2, 2, 44, 452, 3, 2, 2, 2, 46, 604, 3, 2, 2, 2, 48, 658, 3, 2, 2, 2, 50, 676, 3, 2, 2, 2, 52, 681, 3, 2, 2, 2, 54, 699, 3, 2, 2, 2, 56, 703, 3, 2, 2, 2, 58, 722, 3, 2, 2, 2, 60, 724, 3, 2, 2, 2, 62, 740, 3, 2, 2, 2, 64, 742, 3, 2, 2, 2, 66, 746, 3, 2, 2, 2, 68, 748, 3, 2, 2, 2, 70, 762, 3, 2, 2, 2, 72, 766, 3, 2, 2, 2, 74, 770, 3, 2, 2, 2, 76, 772, 3, 2, 2, 2, 78, 774, 3, 2, 2, 2, 80, 776, 3, 2, 2, 2, 82, 788, 3, 2, 2, 2, 84, 790, 3, 2, 2, 2, 86, 88, 5, 4, 3, 2, 87, 86, 3, 2, 2, 2, 88, 89, 3, 2, 2, 2, 89, 87, 3, 2, 2, 2, 89, 90, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 92, 7, 2, 2, 3, 92, 3, 3, 2, 2, 2, 93, 95, 7, 69, 2, 2, 94, 93, 3, 2, 2, 2, 95, 98, 3, 2, 2, 2, 96, 94, 3, 2, 2, 2, 96, 97, 3, 2, 2, 2, 97, 99, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 99, 100, 7, 3, 2, 2, 100, 101, 5, 80, 41, 2, 101, 105, 7, 4, 2, 2, 102, 104, 5, 6, 4, 2, 103, 102, 3, 2, 2, 2, 104, 107, 3, 2, 2, 2, 105, 103, 3, 2, 2, 2, 105, 106, 3, 2, 2, 2, 106, 108, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 108, 109, 7, 5, 2, 2, 109, 5, 3, 2, 2, 2, 110, 112, 7, 69, 2, 2, 111, 110, 3, 2, 2, 2, 112, 115, 3, 2, 2, 2, 113, 111, 3, 2, 2, 2, 113, 114, 3, 2, 2, 2, 114, 116, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 116, 117, 5, 8, 5, 2, 117, 7, 3, 2, 2, 2, 118, 119, 7, 6, 2, 2, 119, 120, 5, 80, 41, 2, 120, 121, 7, 7, 2, 2, 121, 122, 5, 38, 20, 2, 122, 139, 3, 2, 2, 2, 123, 124, 7, 8, 2, 2, 124, 125, 5, 80, 41, 2, 125, 126, 7, 7, 2, 2, 126, 127, 5, 38, 20, 2, 127, 139, 3, 2, 2, 2, 128, 129, 7, 9, 2, 2, 129, 130, 5, 62, 32, 2, 130, 131, 7, 62, 2, 2, 131, 132, 5, 46, 24, 2, 132, 139, 3, 2, 2, 2, 133, 139, 5, 28, 15, 2, 134, 139, 5, 10, 6, 2, 135, 139, 5, 12, 7, 2, 136, 139, 5, 24, 13, 2, 137, 139, 5, 26, 14, 2, 138, 118, 3, 2, 2, 2, 138, 123, 3, 2, 2, 2, 138, 128, 3, 2, 2, 2, 138, 133, 3, 2, 2, 2, 138, 134, 3, 2, 2, 2, 138, 135, 3, 2, 2, 2, 138, 136, 3, 2, 2, 2, 138, 137, 3, 2, 2, 2, 139, 9, 3, 2, 2, 2, 140, 141, 5, 22, 12, 2, 141, 178, 5, 72, 37, 2, 142, 151, 7, 63, 2, 2, 143, 148, 5, 64, 33, 2, 144, 145, 7, 10, 2, 2, 145, 147, 5, 64, 33, 2, 146, 144, 3, 2, 2, 2, 147, 150, 3, 2, 2, 2, 148, 146, 3, 2, 2, 2, 148, 149, 3, 2, 2, 2, 149, 152, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 151, 143, 3, 2, 2, 2, 151, 152, 3, 2, 2, 2, 152, 153, 3, 2, 2, 2, 153, 156, 7, 64, 2, 2, 154, 155, 7, 7, 2, 2, 155, 157, 5, 38, 20, 2, 156, 154, 3, 2, 2, 2, 156, 157, 3, 2, 2, 2, 157, 179, 3, 2, 2, 2, 158, 159, 7, 7, 2, 2, 159, 179, 5, 38, 20, 2, 160, 161, 7, 63, 2, 2, 161, 162, 5, 64, 33, 2, 162, 163, 7, 7, 2, 2, 163, 171, 5, 38, 20, 2, 164, 165, 7, 10, 2, 2, 165, 166, 5, 64, 33, 2, 166, 167, 7, 7, 2, 2, 167, 168, 5, 38, 20, 2, 168, 170, 3, 2, 2, 2, 169, 164, 3, 2, 2, 2, 170, 173, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 171, 172, 3, 2, 2, 2, 172, 174, 3, 2, 2, 2, 173, 171, 3, 2, 2, 2, 174, 175, 7, 64, 2, 2, 175, 176, 7, 7, 2, 2, 176, 177, 5, 38, 20, 2, 177, 179, 3, 2, 2, 2, 178, 142, 3, 2, 2, 2, 178, 158, 3, 2, 2, 2, 178, 160, 3, 2, 2, 2, 178, 179, 3, 2, 2, 2, 179, 182, 3, 2, 2, 2, 180, 181, 7, 62, 2, 2, 181, 183, 5, 46, 24, 2, 182, 180, 3, 2, 2, 2, 182, 183, 3, 2, 2, 2, 183, 185, 3, 2, 2, 2, 184, 186, 7, 11, 2, 2, 185, 184, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 11, 3, 2, 2, 2, 187, 188, 7, 12, 2, 2, 188, 200, 5, 80, 41, 2, 189, 190, 7, 12, 2, 2, 190, 191, 5, 14, 8, 2, 191, 192, 7, 62, 2, 2, 192, 193, 5, 38, 20, 2, 193, 200, 3, 2, 2, 2, 194, 195, 7, 12, 2, 2, 195, 196, 5, 14, 8, 2, 196, 197, 7, 62, 2, 2, 197, 198, 5, 16, 9, 2, 198, 200, 3, 2, 2, 2, 199, 187, 3, 2, 2, 2, 199, 189, 3, 2, 2, 2, 199, 194, 3, 2, 2, 2, 200, 13, 3, 2, 2, 2, 201, 213, 5, 80, 41, 2, 202, 203, 7, 13, 2, 2, 203, 208, 5, 40, 21, 2, 204, 205, 7, 10, 2, 2, 205, 207, 5, 40, 21, 2, 206, 204, 3, 2, 2, 2, 207, 210, 3, 2, 2, 2, 208, 206, 3, 2, 2, 2, 208, 209, 3, 2, 2, 2, 209, 211, 3, 2, 2, 2, 210, 208, 3, 2, 2, 2, 211, 212, 7, 14, 2, 2, 212, 214, 3, 2, 2, 2, 213, 202, 3, 2, 2, 2, 213, 214, 3, 2, 2, 2, 214, 15, 3, 2, 2, 2, 215, 217, 7, 15, 2, 2, 216, 215, 3, 2, 2, 2, 216, 217, 3, 2, 2, 2, 217, 218, 3, 2, 2, 2, 218, 223, 5, 18, 10, 2, 219, 220, 7, 15, 2, 2, 220, 222, 5, 18, 10, 2, 221, 219, 3, 2, 2, 2, 222, 225, 3, 2, 2, 2, 223, 221, 3, 2, 2, 2, 223, 224, 3, 2, 2, 2, 224, 17, 3, 2, 2, 2, 225, 223, 3, 2, 2, 2, 226, 231, 5, 82, 42, 2, 227, 228, 7, 63, 2, 2, 228, 229, 5, 38, 20, 2, 229, 230, 7, 64, 2, 2, 230, 232, 3, 2, 2, 2, 231, 227, 3, 2, 2, 2, 231, 232, 3, 2, 2, 2, 232, 19, 3, 2, 2, 2, 233, 234, 7, 16, 2, 2, 234, 237, 5, 80, 41, 2, 235, 236, 7, 7, 2, 2, 236, 238, 5, 38, 20, 2, 237, 235, 3, 2, 2, 2, 237, 238, 3, 2, 2, 2, 238, 239, 3, 2, 2, 2, 239, 240, 7, 62, 2, 2, 240, 242, 5, 46, 24, 2, 241, 243, 7, 11, 2, 2, 242, 241, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 21, 3, 2, 2, 2, 244, 254, 7, 17, 2, 2, 245, 254, 7, 18, 2, 2, 246, 247, 7, 19, 2, 2, 247, 254, 7, 17, 2, 2, 248, 249, 7, 19, 2, 2, 249, 254, 7, 18, 2, 2, 250, 254, 7, 20, 2, 2, 251, 254, 7, 21, 2, 2, 252, 254, 7, 22, 2, 2, 253, 244, 3, 2, 2, 2, 253, 245, 3, 2, 2, 2, 253, 246, 3, 2, 2, 2, 253, 248, 3, 2, 2, 2, 253, 250, 3, 2, 2, 2, 253, 251, 3, 2, 2, 2, 253, 252, 3, 2, 2, 2, 254, 23, 3, 2, 2, 2, 255, 256, 7, 23, 2, 2, 256, 257, 5, 32, 17, 2, 257, 258, 7, 24, 2, 2, 258, 261, 5, 66, 34, 2, 259, 260, 7, 25, 2, 2, 260, 262, 5, 36, 19, 2, 261, 259, 3, 2, 2, 2, 261, 262, 3, 2, 2, 2, 262, 274, 3, 2, 2, 2, 263, 264, 7, 23, 2, 2, 264, 267, 5, 32, 17, 2, 265, 266, 7, 26, 2, 2, 266, 268, 5, 32, 17, 2, 267, 265, 3, 2, 2, 2, 267, 268, 3, 2, 2, 2, 268, 271, 3, 2, 2, 2, 269, 270, 7, 25, 2, 2, 270, 272, 5, 36, 19, 2, 271, 269, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 274, 3, 2, 2, 2, 273, 255, 3, 2, 2, 2, 273, 263, 3, 2, 2, 2, 274, 25, 3, 2, 2, 2, 275, 276, 7, 27, 2, 2, 276, 277, 5, 32, 17, 2, 277, 278, 7, 24, 2, 2, 278, 279, 5, 66, 34, 2, 279, 287, 3, 2, 2, 2, 280, 281, 7, 27, 2, 2, 281, 284, 5, 32, 17, 2, 282, 283, 7, 26, 2, 2, 283, 285, 5, 32, 17, 2, 284, 282, 3, 2, 2, 2, 284, 285, 3, 2, 2, 2, 285, 287, 3, 2, 2, 2, 286, 275, 3, 2, 2, 2, 286, 280, 3, 2, 2, 2, 287, 27, 3, 2, 2, 2, 288, 289, 7, 23, 2, 2, 289, 290, 5, 30, 16, 2, 290, 291, 7, 63, 2, 2, 291, 292, 5, 32, 17, 2, 292, 293, 7, 62, 2, 2, 293, 301, 5, 46, 24, 2, 294, 295, 7, 10, 2, 2, 295, 296, 5, 32, 17, 2, 296, 297, 7, 62, 2, 2, 297, 298, 5, 46, 24, 2, 298, 300, 3, 2, 2, 2, 299, 294, 3, 2, 2, 2, 300, 303, 3, 2, 2, 2, 301, 299, 3, 2, 2, 2, 301, 302, 3, 2, 2, 2, 302, 304, 3, 2, 2, 2, 303, 301, 3, 2, 2, 2, 304, 305, 7, 64, 2, 2, 305, 306, 7, 24, 2, 2, 306, 309, 7, 53, 2, 2, 307, 308, 7, 25, 2, 2, 308, 310, 5, 36, 19, 2, 309, 307, 3, 2, 2, 2, 309, 310, 3, 2, 2, 2, 310, 335, 3, 2, 2, 2, 311, 312, 7, 23, 2, 2, 312, 313, 5, 30, 16, 2, 313, 314, 7, 63, 2, 2, 314, 315, 5, 32, 17, 2, 315, 316, 7, 62, 2, 2, 316, 324, 5, 46, 24, 2, 317, 318, 7, 10, 2, 2, 318, 319, 5, 32, 17, 2, 319, 320, 7, 62, 2, 2, 320, 321, 5, 46, 24, 2, 321, 323, 3, 2, 2, 2, 322, 317, 3, 2, 2, 2, 323, 326, 3, 2, 2, 2, 324, 322, 3, 2, 2, 2, 324, 325, 3, 2, 2, 2, 325, 327, 3, 2, 2, 2, 326, 324, 3, 2, 2, 2, 327, 328, 7, 64, 2, 2, 328, 329, 7, 26, 2, 2, 329, 332, 5, 34, 18, 2, 330, 331, 7, 25, 2, 2, 331, 333, 5, 36, 19, 2, 332, 330, 3, 2, 2, 2, 332, 333, 3, 2, 2, 2, 333, 335, 3, 2, 2, 2, 334, 288, 3, 2, 2, 2, 334, 311, 3, 2, 2, 2, 335, 29, 3, 2, 2, 2, 336, 337, 5, 80, 41, 2, 337, 31, 3, 2, 2, 2, 338, 339, 5, 80, 41, 2, 339, 33, 3, 2, 2, 2, 340, 341, 5, 80, 41, 2, 341, 35, 3, 2, 2, 2, 342, 343, 7, 42, 2, 2, 343, 37, 3, 2, 2, 2, 344, 345, 8, 20, 1, 2, 345, 354, 7, 63, 2, 2, 346, 351, 5, 38, 20, 2, 347, 348, 7, 10, 2, 2, 348, 350, 5, 38, 20, 2, 349, 347, 3, 2, 2, 2, 350, 353, 3, 2, 2, 2, 351, 349, 3, 2, 2, 2, 351, 352, 3, 2, 2, 2, 352, 355, 3, 2, 2, 2, 353, 351, 3, 2, 2, 2, 354, 346, 3, 2, 2, 2, 354, 355, 3, 2, 2, 2, 355, 357, 3, 2, 2, 2, 356, 358, 7, 10, 2, 2, 357, 356, 3, 2, 2, 2, 357, 358, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 360, 7, 64, 2, 2, 360, 361, 7, 29, 2, 2, 361, 403, 5, 38, 20, 14, 362, 363, 7, 65, 2, 2, 363, 364, 7, 13, 2, 2, 364, 365, 5, 38, 20, 2, 365, 366, 7, 14, 2, 2, 366, 403, 3, 2, 2, 2, 367, 368, 7, 66, 2, 2, 368, 369, 7, 13, 2, 2, 369, 370, 5, 38, 20, 2, 370, 371, 7, 14, 2, 2, 371, 403, 3, 2, 2, 2, 372, 373, 7, 63, 2, 2, 373, 374, 5, 38, 20, 2, 374, 375, 7, 10, 2, 2, 375, 380, 5, 38, 20, 2, 376, 377, 7, 10, 2, 2, 377, 379, 5, 38, 20, 2, 378, 376, 3, 2, 2, 2, 379, 382, 3, 2, 2, 2, 380, 378, 3, 2, 2, 2, 380, 381, 3, 2, 2, 2, 381, 384, 3, 2, 2, 2, 382, 380, 3, 2, 2, 2, 383, 385, 7, 10, 2, 2, 384, 383, 3, 2, 2, 2, 384, 385, 3, 2, 2, 2, 385, 386, 3, 2, 2, 2, 386, 387, 7, 64, 2, 2, 387, 403, 3, 2, 2, 2, 388, 390, 7, 4, 2, 2, 389, 391, 5, 42, 22, 2, 390, 389, 3, 2, 2, 2, 390, 391, 3, 2, 2, 2, 391, 392, 3, 2, 2, 2, 392, 403, 7, 5, 2, 2, 393, 403, 7, 30, 2, 2, 394, 403, 7, 31, 2, 2, 395, 403, 7, 32, 2, 2, 396, 403, 5, 40, 21, 2, 397, 403, 5, 80, 41, 2, 398, 399, 7, 63, 2, 2, 399, 400, 5, 38, 20, 2, 400, 401, 7, 64, 2, 2, 401, 403, 3, 2, 2, 2, 402, 344, 3, 2, 2, 2, 402, 362, 3, 2, 2, 2, 402, 367, 3, 2, 2, 2, 402, 372, 3, 2, 2, 2, 402, 388, 3, 2, 2, 2, 402, 393, 3, 2, 2, 2, 402, 394, 3, 2, 2, 2, 402, 395, 3, 2, 2, 2, 402, 396, 3, 2, 2, 2, 402, 397, 3, 2, 2, 2, 402, 398, 3, 2, 2, 2, 403, 424, 3, 2, 2, 2, 404, 405, 12, 16, 2, 2, 405, 406, 7, 28, 2, 2, 406, 423, 5, 38, 20, 16, 407, 408, 12, 15, 2, 2, 408, 409, 7, 29, 2, 2, 409, 423, 5, 38, 20, 15, 410, 411, 12, 3, 2, 2, 411, 412, 7, 13, 2, 2, 412, 417, 5, 38, 20, 2, 413, 414, 7, 10, 2, 2, 414, 416, 5, 38, 20, 2, 415, 413, 3, 2, 2, 2, 416, 419, 3, 2, 2, 2, 417, 415, 3, 2, 2, 2, 417, 418, 3, 2, 2, 2, 418, 420, 3, 2, 2, 2, 419, 417, 3, 2, 2, 2, 420, 421, 7, 14, 2, 2, 421, 423, 3, 2, 2, 2, 422, 404, 3, 2, 2, 2, 422, 407, 3, 2, 2, 2, 422, 410, 3, 2, 2, 2, 423, 426, 3, 2, 2, 2, 424, 422, 3, 2, 2, 2, 424, 425, 3, 2, 2, 2, 425, 39, 3, 2, 2, 2, 426, 424, 3, 2, 2, 2, 427, 428, 7, 67, 2, 2, 428, 41, 3, 2, 2, 2, 429, 430, 5, 44, 23, 2, 430, 431, 7, 7, 2, 2, 431, 432, 5, 38, 20, 2, 432, 440, 3, 2, 2, 2, 433, 434, 7, 10, 2, 2, 434, 435, 5, 44, 23, 2, 435, 436, 7, 7, 2, 2, 436, 437, 5, 38, 20, 2, 437, 439, 3, 2, 2, 2, 438, 433, 3, 2, 2, 2, 439, 442, 3, 2, 2, 2, 440, 438, 3, 2, 2, 2, 440, 441, 3, 2, 2, 2, 441, 446, 3, 2, 2, 2, 442, 440, 3, 2, 2, 2, 443, 447, 7, 10, 2, 2, 444, 445, 7, 15, 2, 2, 445, 447, 5, 84, 43, 2, 446, 443, 3, 2, 2, 2, 446, 444, 3, 2, 2, 2, 446, 447, 3, 2, 2, 2, 447, 451, 3, 2, 2, 2, 448, 449, 7, 15, 2, 2, 449, 451, 5, 84, 43, 2, 450, 429, 3, 2, 2, 2, 450, 448, 3, 2, 2, 2, 451, 43, 3, 2, 2, 2, 452, 453, 5, 82, 42, 2, 453, 45, 3, 2, 2, 2, 454, 455, 8, 24, 1, 2, 455, 605, 5, 56, 29, 2, 456, 457, 5, 72, 37, 2, 457, 459, 7, 63, 2, 2, 458, 460, 5, 68, 35, 2, 459, 458, 3, 2, 2, 2, 459, 460, 3, 2, 2, 2, 460, 461, 3, 2, 2, 2, 461, 462, 7, 64, 2, 2, 462, 605, 3, 2, 2, 2, 463, 464, 7, 52, 2, 2, 464, 605, 5, 46, 24, 27, 465, 466, 5, 80, 41, 2, 466, 467, 7, 34, 2, 2, 467, 468, 7, 62, 2, 2, 468, 469, 5, 46, 24, 23, 469, 605, 3, 2, 2, 2, 470, 471, 7, 45, 2, 2, 471, 472, 7, 4, 2, 2, 472, 477, 5, 46, 24, 2, 473, 474, 7, 10, 2, 2, 474, 476, 5, 46, 24, 2, 475, 473, 3, 2, 2, 2, 476, 479, 3, 2, 2, 2, 477, 475, 3, 2, 2, 2, 477, 478, 3, 2, 2, 2, 478, 481, 3, 2, 2, 2, 479, 477, 3, 2, 2, 2, 480, 482, 7, 10, 2, 2, 481, 480, 3, 2, 2, 2, 481, 482, 3, 2, 2, 2, 482, 483, 3, 2, 2, 2, 483, 484, 7, 5, 2, 2, 484, 605, 3, 2, 2, 2, 485, 486, 7, 46, 2, 2, 486, 487, 7, 4, 2, 2, 487, 492, 5, 46, 24, 2, 488, 489, 7, 10, 2, 2, 489, 491, 5, 46, 24, 2, 490, 488, 3, 2, 2, 2, 491, 494, 3, 2, 2, 2, 492, 490, 3, 2, 2, 2, 492, 493, 3, 2, 2, 2, 493, 496, 3, 2, 2, 2, 494, 492, 3, 2, 2, 2, 495, 497, 7, 10, 2, 2, 496, 495, 3, 2, 2, 2, 496, 497, 3, 2, 2, 2, 497, 498, 3, 2, 2, 2, 498, 499, 7, 5, 2, 2, 499, 605, 3, 2, 2, 2, 500, 605, 5, 48, 25, 2, 501, 502, 7, 35, 2, 2, 502, 503, 7, 4, 2, 2, 503, 508, 5, 46, 24, 2, 504, 505, 7, 10, 2, 2, 505, 507, 5, 46, 24, 2, 506, 504, 3, 2, 2, 2, 507, 510, 3, 2, 2, 2, 508, 506, 3, 2, 2, 2, 508, 509, 3, 2, 2, 2, 509, 512, 3, 2, 2, 2, 510, 508, 3, 2, 2, 2, 511, 513, 7, 10, 2, 2, 512, 511, 3, 2, 2, 2, 512, 513, 3, 2, 2, 2, 513, 514, 3, 2, 2, 2, 514, 515, 7, 5, 2, 2, 515, 605, 3, 2, 2, 2, 516, 517, 7, 36, 2, 2, 517, 518, 7, 4, 2, 2, 518, 523, 5, 46, 24, 2, 519, 520, 7, 10, 2, 2, 520, 522, 5, 46, 24, 2, 521, 519, 3, 2, 2, 2, 522, 525, 3, 2, 2, 2, 523, 521, 3, 2, 2, 2, 523, 524, 3, 2, 2, 2, 524, 527, 3, 2, 2, 2, 525, 523, 3, 2, 2, 2, 526, 528, 7, 10, 2, 2, 527, 526, 3, 2, 2, 2, 527, 528, 3, 2, 2, 2, 528, 529, 3, 2, 2, 2, 529, 530, 7, 5, 2, 2, 530, 605, 3, 2, 2, 2, 531, 536, 5, 80, 41, 2, 532, 536, 7, 44, 2, 2, 533, 536, 7, 43, 2, 2, 534, 536, 7, 42, 2, 2, 535, 531, 3, 2, 2, 2, 535, 532, 3, 2, 2, 2, 535, 533, 3, 2, 2, 2, 535, 534, 3, 2, 2, 2, 536, 605, 3, 2, 2, 2, 537, 538, 7, 63, 2, 2, 538, 539, 5, 46, 24, 2, 539, 540, 7, 10, 2, 2, 540, 545, 5, 46, 24, 2, 541, 542, 7, 10, 2, 2, 542, 544, 5, 46, 24, 2, 543, 541, 3, 2, 2, 2, 544, 547, 3, 2, 2, 2, 545, 543, 3, 2, 2, 2, 545, 546, 3, 2, 2, 2, 546, 549, 3, 2, 2, 2, 547, 545, 3, 2, 2, 2, 548, 550, 7, 10, 2, 2, 549, 548, 3, 2, 2, 2, 549, 550, 3, 2, 2, 2, 550, 551, 3, 2, 2, 2, 551, 552, 7, 64, 2, 2, 552, 605, 3, 2, 2, 2, 553, 554, 7, 4, 2, 2, 554, 559, 5, 70, 36, 2, 555, 556, 7, 10, 2, 2, 556, 558, 5, 70, 36, 2, 557, 555, 3, 2, 2, 2, 558, 561, 3, 2, 2, 2, 559, 557, 3, 2, 2, 2, 559, 560, 3, 2, 2, 2, 560, 563, 3, 2, 2, 2, 561, 559, 3, 2, 2, 2, 562, 564, 7, 10, 2, 2, 563, 562, 3, 2, 2, 2, 563, 564, 3, 2, 2, 2, 564, 565, 3, 2, 2, 2, 565, 566, 7, 5, 2, 2, 566, 605, 3, 2, 2, 2, 567, 576, 7, 13, 2, 2, 568, 573, 5, 46, 24, 2, 569, 570, 7, 10, 2, 2, 570, 572, 5, 46, 24, 2, 571, 569, 3, 2, 2, 2, 572, 575, 3, 2, 2, 2, 573, 571, 3, 2, 2, 2, 573, 574, 3, 2, 2, 2, 574, 577, 3, 2, 2, 2, 575, 573, 3, 2, 2, 2, 576, 568, 3, 2, 2, 2, 576, 577, 3, 2, 2, 2, 577, 579, 3, 2, 2, 2, 578, 580, 7, 10, 2, 2, 579, 578, 3, 2, 2, 2, 579, 580, 3, 2, 2, 2, 580, 581, 3, 2, 2, 2, 581, 605, 7, 14, 2, 2, 582, 583, 7, 37, 2, 2, 583, 584, 7, 63, 2, 2, 584, 585, 5, 46, 24, 2, 585, 586, 7, 64, 2, 2, 586, 587, 5, 46, 24, 2, 587, 588, 7, 38, 2, 2, 588, 589, 5, 46, 24, 7, 589, 605, 3, 2, 2, 2, 590, 591, 5, 10, 6, 2, 591, 592, 5, 46, 24, 6, 592, 605, 3, 2, 2, 2, 593, 594, 5, 20, 11, 2, 594, 595, 5, 46, 24, 5, 595, 605, 3, 2, 2, 2, 596, 597, 7, 63, 2, 2, 597, 598, 5, 46, 24, 2, 598, 599, 7, 64, 2, 2, 599, 605, 3, 2, 2, 2, 600, 601, 7, 4, 2, 2, 601, 602, 5, 46, 24, 2, 602, 603, 7, 5, 2, 2, 603, 605, 3, 2, 2, 2, 604, 454, 3, 2, 2, 2, 604, 456, 3, 2, 2, 2, 604, 463, 3, 2, 2, 2, 604, 465, 3, 2, 2, 2, 604, 470, 3, 2, 2, 2, 604, 485, 3, 2, 2, 2, 604, 500, 3, 2, 2, 2, 604, 501, 3, 2, 2, 2, 604, 516, 3, 2, 2, 2, 604, 535, 3, 2, 2, 2, 604, 537, 3, 2, 2, 2, 604, 553, 3, 2, 2, 2, 604, 567, 3, 2, 2, 2, 604, 582, 3, 2, 2, 2, 604, 590, 3, 2, 2, 2, 604, 593, 3, 2, 2, 2, 604, 596, 3, 2, 2, 2, 604, 600, 3, 2, 2, 2, 605, 655, 3, 2, 2, 2, 606, 607, 12, 28, 2, 2, 607, 608, 7, 33, 2, 2, 608, 654, 5, 46, 24, 28, 609, 610, 12, 26, 2, 2, 610, 611, 9, 2, 2, 2, 611, 654, 5, 46, 24, 27, 612, 613, 12, 25, 2, 2, 613, 614, 9, 3, 2, 2, 614, 654, 5, 46, 24, 26, 615, 616, 12, 24, 2, 2, 616, 617, 9, 4, 2, 2, 617, 654, 5, 46, 24, 25, 618, 619, 12, 22, 2, 2, 619, 620, 7, 62, 2, 2, 620, 621, 5, 46, 24, 23, 621, 622, 8, 24, 1, 2, 622, 654, 3, 2, 2, 2, 623, 624, 12, 20, 2, 2, 624, 625, 7, 45, 2, 2, 625, 654, 5, 46, 24, 21, 626, 627, 12, 18, 2, 2, 627, 628, 7, 46, 2, 2, 628, 654, 5, 46, 24, 19, 629, 630, 12, 17, 2, 2, 630, 631, 7, 47, 2, 2, 631, 654, 5, 46, 24, 18, 632, 633, 12, 16, 2, 2, 633, 634, 7, 48, 2, 2, 634, 654, 5, 46, 24, 17, 635, 636, 12, 10, 2, 2, 636, 637, 7, 28, 2, 2, 637, 654, 5, 46, 24, 11, 638, 639, 12, 32, 2, 2, 639, 640, 7, 24, 2, 2, 640, 646, 5, 74, 38, 2, 641, 643, 7, 63, 2, 2, 642, 644, 5, 68, 35, 2, 643, 642, 3, 2, 2, 2, 643, 644, 3, 2, 2, 2, 644, 645, 3, 2, 2, 2, 645, 647, 7, 64, 2, 2, 646, 641, 3, 2, 2, 2, 646, 647, 3, 2, 2, 2, 647, 654, 3, 2, 2, 2, 648, 649, 12, 29, 2, 2, 649, 650, 7, 13, 2, 2, 650, 651, 5, 46, 24, 2, 651, 652, 7, 14, 2, 2, 652, 654, 3, 2, 2, 2, 653, 606, 3, 2, 2, 2, 653, 609, 3, 2, 2, 2, 653, 612, 3, 2, 2, 2, 653, 615, 3, 2, 2, 2, 653, 618, 3, 2, 2, 2, 653, 623, 3, 2, 2, 2, 653, 626, 3, 2, 2, 2, 653, 629, 3, 2, 2, 2, 653, 632, 3, 2, 2, 2, 653, 635, 3, 2, 2, 2, 653, 638, 3, 2, 2, 2, 653, 648, 3, 2, 2, 2, 654, 657, 3, 2, 2, 2, 655, 653, 3, 2, 2, 2, 655, 656, 3, 2, 2, 2, 656, 47, 3, 2, 2, 2, 657, 655, 3, 2, 2, 2, 658, 659, 7, 50, 2, 2, 659, 660, 5, 46, 24, 2, 660, 662, 7, 4, 2, 2, 661, 663, 7, 15, 2, 2, 662, 661, 3, 2, 2, 2, 662, 663, 3, 2, 2, 2, 663, 664, 3, 2, 2, 2, 664, 669, 5, 50, 26, 2, 665, 666, 7, 15, 2, 2, 666, 668, 5, 50, 26, 2, 667, 665, 3, 2, 2, 2, 668, 671, 3, 2, 2, 2, 669, 667, 3, 2, 2, 2, 669, 670, 3, 2, 2, 2, 670, 672, 3, 2, 2, 2, 671, 669, 3, 2, 2, 2, 672, 673, 7, 5, 2, 2, 673, 49, 3, 2, 2, 2, 674, 677, 5, 52, 27, 2, 675, 677, 7, 39, 2, 2, 676, 674, 3, 2, 2, 2, 676, 675, 3, 2, 2, 2, 677, 678, 3, 2, 2, 2, 678, 679, 7, 29, 2, 2, 679, 680, 5, 46, 24, 2, 680, 51, 3, 2, 2, 2, 681, 688, 5, 82, 42, 2, 682, 685, 7, 63, 2, 2, 683, 686, 5, 82, 42, 2, 684, 686, 7, 39, 2, 2, 685, 683, 3, 2, 2, 2, 685, 684, 3, 2, 2, 2, 686, 687, 3, 2, 2, 2, 687, 689, 7, 64, 2, 2, 688, 682, 3, 2, 2, 2, 688, 689, 3, 2, 2, 2, 689, 53, 3, 2, 2, 2, 690, 691, 5, 8, 5, 2, 691, 692, 7, 2, 2, 3, 692, 700, 3, 2, 2, 2, 693, 694, 5, 46, 24, 2, 694, 695, 7, 2, 2, 3, 695, 700, 3, 2, 2, 2, 696, 697, 7, 69, 2, 2, 697, 700, 7, 2, 2, 3, 698, 700, 7, 2, 2, 3, 699, 690, 3, 2, 2, 2, 699, 693, 3, 2, 2, 2, 699, 696, 3, 2, 2, 2, 699, 698, 3, 2, 2, 2, 700, 55, 3, 2, 2, 2, 701, 704, 5, 58, 30, 2, 702, 704, 5, 60, 31, 2, 703, 701, 3, 2, 2, 2, 703, 702, 3, 2, 2, 2, 704, 57, 3, 2, 2, 2, 705, 706, 5, 64, 33, 2, 706, 707, 7, 29, 2, 2, 707, 708, 5, 46, 24, 2, 708, 723, 3, 2, 2, 2, 709, 710, 7, 63, 2, 2, 710, 715, 5, 64, 33, 2, 711, 712, 7, 10, 2, 2, 712, 714, 5, 64, 33, 2, 713, 711, 3, 2, 2, 2, 714, 717, 3, 2, 2, 2, 715, 713, 3, 2, 2, 2, 715, 716, 3, 2, 2, 2, 716, 718, 3, 2, 2, 2, 717, 715, 3, 2, 2, 2, 718, 719, 7, 64, 2, 2, 719, 720, 7, 29, 2, 2, 720, 721, 5, 46, 24, 2, 721, 723, 3, 2, 2, 2, 722, 705, 3, 2, 2, 2, 722, 709, 3, 2, 2, 2, 723, 59, 3, 2, 2, 2, 724, 725, 7, 63, 2, 2, 725, 726, 7, 63, 2, 2, 726, 729, 5, 64, 33, 2, 727, 728, 7, 10, 2, 2, 728, 730, 5, 64, 33, 2, 729, 727, 3, 2, 2, 2, 730, 731, 3, 2, 2, 2, 731, 729, 3, 2, 2, 2, 731, 732, 3, 2, 2, 2, 732, 733, 3, 2, 2, 2, 733, 734, 7, 64, 2, 2, 734, 735, 7, 64, 2, 2, 735, 736, 7, 29, 2, 2, 736, 737, 5, 46, 24, 2, 737, 61, 3, 2, 2, 2, 738, 741, 7, 39, 2, 2, 739, 741, 5, 80, 41, 2, 740, 738, 3, 2, 2, 2, 740, 739, 3, 2, 2, 2, 741, 63, 3, 2, 2, 2, 742, 743, 5, 62, 32, 2, 743, 65, 3, 2, 2, 2, 744, 747, 7, 53, 2, 2, 745, 747, 5, 80, 41, 2, 746, 744, 3, 2, 2, 2, 746, 745, 3, 2, 2, 2, 747, 67, 3, 2, 2, 2, 748, 753, 5, 46, 24, 2, 749, 750, 7, 10, 2, 2, 750, 752, 5, 46, 24, 2, 751, 749, 3, 2, 2, 2, 752, 755, 3, 2, 2, 2, 753, 751, 3, 2, 2, 2, 753, 754, 3, 2, 2, 2, 754, 69, 3, 2, 2, 2, 755, 753, 3, 2, 2, 2, 756, 757, 5, 82, 42, 2, 757, 758, 7, 7, 2, 2, 758, 759, 5, 46, 24, 2, 759, 763, 3, 2, 2, 2, 760, 761, 7, 40, 2, 2, 761, 763, 5, 46, 24, 2, 762, 756, 3, 2, 2, 2, 762, 760, 3, 2, 2, 2, 763, 71, 3, 2, 2, 2, 764, 767, 5, 80, 41, 2, 765, 767, 9, 5, 2, 2, 766, 764, 3, 2, 2, 2, 766, 765, 3, 2, 2, 2, 767, 73, 3, 2, 2, 2, 768, 771, 5, 80, 41, 2, 769, 771, 9, 6, 2, 2, 770, 768, 3, 2, 2, 2, 770, 769, 3, 2, 2, 2, 771, 75, 3, 2, 2, 2, 772, 773, 9, 7, 2, 2, 773, 77, 3, 2, 2, 2, 774, 775, 9, 8, 2, 2, 775, 79, 3, 2, 2, 2, 776, 781, 5, 84, 43, 2, 777, 778, 7, 41, 2, 2, 778, 780, 5, 84, 43, 2, 779, 777, 3, 2, 2, 2, 780, 783, 3, 2, 2, 2, 781, 779, 3, 2, 2, 2, 781, 782, 3, 2, 2, 2, 782, 81, 3, 2, 2, 2, 783, 781, 3, 2, 2, 2, 784, 789, 5, 84, 43, 2, 785, 786, 5, 80, 41, 2, 786, 787, 8, 42, 1, 2, 787, 789, 3, 2, 2, 2, 788, 784, 3, 2, 2, 2, 788, 785, 3, 2, 2, 2, 789, 83, 3, 2, 2, 2, 790, 791, 9, 9, 2, 2, 791, 85, 3, 2, 2, 2, 87, 89, 96, 105, 113, 138, 148, 151, 156, 171, 178, 182, 185, 199, 208, 213, 216, 223, 231, 237, 242, 253, 261, 267, 271, 273, 284, 286, 301, 309, 324, 332, 334, 351, 354, 357, 380, 384, 390, 402, 417, 422, 424, 440, 446, 450, 459, 477, 481, 492, 496, 508, 512, 523, 527, 535, 545, 549, 559, 563, 573, 576, 579, 604, 643, 646, 653, 655, 662, 669, 676, 685, 688, 699, 703, 715, 722, 731, 740, 746, 753, 762, 766, 770, 781, 788] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 801, 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, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 3, 2, 6, 2, 88, 10, 2, 13, 2, 14, 2, 89, 3, 2, 3, 2, 3, 3, 7, 3, 95, 10, 3, 12, 3, 14, 3, 98, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 104, 10, 3, 12, 3, 14, 3, 107, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 112, 10, 4, 12, 4, 14, 4, 115, 11, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 139, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 147, 10, 6, 12, 6, 14, 6, 150, 11, 6, 5, 6, 152, 10, 6, 3, 6, 5, 6, 155, 10, 6, 3, 6, 3, 6, 5, 6, 159, 10, 6, 3, 6, 3, 6, 5, 6, 163, 10, 6, 3, 6, 5, 6, 166, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 179, 10, 6, 12, 6, 14, 6, 182, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 189, 10, 6, 3, 6, 5, 6, 192, 10, 6, 5, 6, 194, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 208, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 215, 10, 8, 12, 8, 14, 8, 218, 11, 8, 3, 8, 3, 8, 5, 8, 222, 10, 8, 3, 9, 5, 9, 225, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 230, 10, 9, 12, 9, 14, 9, 233, 11, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 240, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 246, 10, 11, 3, 11, 3, 11, 3, 11, 5, 11, 251, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 262, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 270, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 276, 10, 13, 3, 13, 3, 13, 5, 13, 280, 10, 13, 5, 13, 282, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 293, 10, 14, 5, 14, 295, 10, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 308, 10, 15, 12, 15, 14, 15, 311, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 318, 10, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 331, 10, 15, 12, 15, 14, 15, 334, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 341, 10, 15, 5, 15, 343, 10, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 358, 10, 20, 12, 20, 14, 20, 361, 11, 20, 5, 20, 363, 10, 20, 3, 20, 5, 20, 366, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 387, 10, 20, 12, 20, 14, 20, 390, 11, 20, 3, 20, 5, 20, 393, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 399, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 411, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 424, 10, 20, 12, 20, 14, 20, 427, 11, 20, 3, 20, 3, 20, 7, 20, 431, 10, 20, 12, 20, 14, 20, 434, 11, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 447, 10, 22, 12, 22, 14, 22, 450, 11, 22, 3, 22, 3, 22, 3, 22, 5, 22, 455, 10, 22, 3, 22, 3, 22, 5, 22, 459, 10, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 468, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 484, 10, 24, 12, 24, 14, 24, 487, 11, 24, 3, 24, 5, 24, 490, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 499, 10, 24, 12, 24, 14, 24, 502, 11, 24, 3, 24, 5, 24, 505, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 515, 10, 24, 12, 24, 14, 24, 518, 11, 24, 3, 24, 5, 24, 521, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 530, 10, 24, 12, 24, 14, 24, 533, 11, 24, 3, 24, 5, 24, 536, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 544, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 552, 10, 24, 12, 24, 14, 24, 555, 11, 24, 3, 24, 5, 24, 558, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 566, 10, 24, 12, 24, 14, 24, 569, 11, 24, 3, 24, 5, 24, 572, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 580, 10, 24, 12, 24, 14, 24, 583, 11, 24, 5, 24, 585, 10, 24, 3, 24, 5, 24, 588, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 613, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 652, 10, 24, 3, 24, 5, 24, 655, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 662, 10, 24, 12, 24, 14, 24, 665, 11, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 671, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 676, 10, 25, 12, 25, 14, 25, 679, 11, 25, 3, 25, 3, 25, 3, 26, 3, 26, 5, 26, 685, 10, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 694, 10, 27, 3, 27, 5, 27, 697, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 708, 10, 28, 3, 29, 3, 29, 5, 29, 712, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 722, 10, 30, 12, 30, 14, 30, 725, 11, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 731, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 6, 31, 738, 10, 31, 13, 31, 14, 31, 739, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 5, 32, 749, 10, 32, 3, 33, 3, 33, 3, 34, 3, 34, 5, 34, 755, 10, 34, 3, 35, 3, 35, 3, 35, 7, 35, 760, 10, 35, 12, 35, 14, 35, 763, 11, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 5, 36, 771, 10, 36, 3, 37, 3, 37, 5, 37, 775, 10, 37, 3, 38, 3, 38, 5, 38, 779, 10, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 7, 41, 788, 10, 41, 12, 41, 14, 41, 791, 11, 41, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 797, 10, 42, 3, 43, 3, 43, 3, 43, 2, 2, 4, 38, 46, 44, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 68, 2, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 2, 10, 3, 2, 53, 55, 3, 2, 51, 52, 3, 2, 56, 61, 4, 2, 45, 49, 65, 66, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 51, 61, 3, 2, 42, 44, 3, 2, 67, 68, 2, 899, 2, 87, 3, 2, 2, 2, 4, 96, 3, 2, 2, 2, 6, 113, 3, 2, 2, 2, 8, 138, 3, 2, 2, 2, 10, 193, 3, 2, 2, 2, 12, 207, 3, 2, 2, 2, 14, 209, 3, 2, 2, 2, 16, 224, 3, 2, 2, 2, 18, 234, 3, 2, 2, 2, 20, 241, 3, 2, 2, 2, 22, 261, 3, 2, 2, 2, 24, 281, 3, 2, 2, 2, 26, 294, 3, 2, 2, 2, 28, 342, 3, 2, 2, 2, 30, 344, 3, 2, 2, 2, 32, 346, 3, 2, 2, 2, 34, 348, 3, 2, 2, 2, 36, 350, 3, 2, 2, 2, 38, 410, 3, 2, 2, 2, 40, 435, 3, 2, 2, 2, 42, 458, 3, 2, 2, 2, 44, 460, 3, 2, 2, 2, 46, 612, 3, 2, 2, 2, 48, 666, 3, 2, 2, 2, 50, 684, 3, 2, 2, 2, 52, 689, 3, 2, 2, 2, 54, 707, 3, 2, 2, 2, 56, 711, 3, 2, 2, 2, 58, 730, 3, 2, 2, 2, 60, 732, 3, 2, 2, 2, 62, 748, 3, 2, 2, 2, 64, 750, 3, 2, 2, 2, 66, 754, 3, 2, 2, 2, 68, 756, 3, 2, 2, 2, 70, 770, 3, 2, 2, 2, 72, 774, 3, 2, 2, 2, 74, 778, 3, 2, 2, 2, 76, 780, 3, 2, 2, 2, 78, 782, 3, 2, 2, 2, 80, 784, 3, 2, 2, 2, 82, 796, 3, 2, 2, 2, 84, 798, 3, 2, 2, 2, 86, 88, 5, 4, 3, 2, 87, 86, 3, 2, 2, 2, 88, 89, 3, 2, 2, 2, 89, 87, 3, 2, 2, 2, 89, 90, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 92, 7, 2, 2, 3, 92, 3, 3, 2, 2, 2, 93, 95, 7, 69, 2, 2, 94, 93, 3, 2, 2, 2, 95, 98, 3, 2, 2, 2, 96, 94, 3, 2, 2, 2, 96, 97, 3, 2, 2, 2, 97, 99, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 99, 100, 7, 3, 2, 2, 100, 101, 5, 80, 41, 2, 101, 105, 7, 4, 2, 2, 102, 104, 5, 6, 4, 2, 103, 102, 3, 2, 2, 2, 104, 107, 3, 2, 2, 2, 105, 103, 3, 2, 2, 2, 105, 106, 3, 2, 2, 2, 106, 108, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 108, 109, 7, 5, 2, 2, 109, 5, 3, 2, 2, 2, 110, 112, 7, 69, 2, 2, 111, 110, 3, 2, 2, 2, 112, 115, 3, 2, 2, 2, 113, 111, 3, 2, 2, 2, 113, 114, 3, 2, 2, 2, 114, 116, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 116, 117, 5, 8, 5, 2, 117, 7, 3, 2, 2, 2, 118, 119, 7, 6, 2, 2, 119, 120, 5, 80, 41, 2, 120, 121, 7, 7, 2, 2, 121, 122, 5, 38, 20, 2, 122, 139, 3, 2, 2, 2, 123, 124, 7, 8, 2, 2, 124, 125, 5, 80, 41, 2, 125, 126, 7, 7, 2, 2, 126, 127, 5, 38, 20, 2, 127, 139, 3, 2, 2, 2, 128, 129, 7, 9, 2, 2, 129, 130, 5, 62, 32, 2, 130, 131, 7, 62, 2, 2, 131, 132, 5, 46, 24, 2, 132, 139, 3, 2, 2, 2, 133, 139, 5, 28, 15, 2, 134, 139, 5, 10, 6, 2, 135, 139, 5, 12, 7, 2, 136, 139, 5, 24, 13, 2, 137, 139, 5, 26, 14, 2, 138, 118, 3, 2, 2, 2, 138, 123, 3, 2, 2, 2, 138, 128, 3, 2, 2, 2, 138, 133, 3, 2, 2, 2, 138, 134, 3, 2, 2, 2, 138, 135, 3, 2, 2, 2, 138, 136, 3, 2, 2, 2, 138, 137, 3, 2, 2, 2, 139, 9, 3, 2, 2, 2, 140, 141, 5, 22, 12, 2, 141, 154, 5, 72, 37, 2, 142, 151, 7, 63, 2, 2, 143, 148, 5, 64, 33, 2, 144, 145, 7, 10, 2, 2, 145, 147, 5, 64, 33, 2, 146, 144, 3, 2, 2, 2, 147, 150, 3, 2, 2, 2, 148, 146, 3, 2, 2, 2, 148, 149, 3, 2, 2, 2, 149, 152, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 151, 143, 3, 2, 2, 2, 151, 152, 3, 2, 2, 2, 152, 153, 3, 2, 2, 2, 153, 155, 7, 64, 2, 2, 154, 142, 3, 2, 2, 2, 154, 155, 3, 2, 2, 2, 155, 158, 3, 2, 2, 2, 156, 157, 7, 7, 2, 2, 157, 159, 5, 38, 20, 2, 158, 156, 3, 2, 2, 2, 158, 159, 3, 2, 2, 2, 159, 162, 3, 2, 2, 2, 160, 161, 7, 62, 2, 2, 161, 163, 5, 46, 24, 2, 162, 160, 3, 2, 2, 2, 162, 163, 3, 2, 2, 2, 163, 165, 3, 2, 2, 2, 164, 166, 7, 11, 2, 2, 165, 164, 3, 2, 2, 2, 165, 166, 3, 2, 2, 2, 166, 194, 3, 2, 2, 2, 167, 168, 5, 22, 12, 2, 168, 169, 5, 72, 37, 2, 169, 170, 7, 63, 2, 2, 170, 171, 5, 64, 33, 2, 171, 172, 7, 7, 2, 2, 172, 180, 5, 38, 20, 2, 173, 174, 7, 10, 2, 2, 174, 175, 5, 64, 33, 2, 175, 176, 7, 7, 2, 2, 176, 177, 5, 38, 20, 2, 177, 179, 3, 2, 2, 2, 178, 173, 3, 2, 2, 2, 179, 182, 3, 2, 2, 2, 180, 178, 3, 2, 2, 2, 180, 181, 3, 2, 2, 2, 181, 183, 3, 2, 2, 2, 182, 180, 3, 2, 2, 2, 183, 184, 7, 64, 2, 2, 184, 185, 7, 7, 2, 2, 185, 188, 5, 38, 20, 2, 186, 187, 7, 62, 2, 2, 187, 189, 5, 46, 24, 2, 188, 186, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 191, 3, 2, 2, 2, 190, 192, 7, 11, 2, 2, 191, 190, 3, 2, 2, 2, 191, 192, 3, 2, 2, 2, 192, 194, 3, 2, 2, 2, 193, 140, 3, 2, 2, 2, 193, 167, 3, 2, 2, 2, 194, 11, 3, 2, 2, 2, 195, 196, 7, 12, 2, 2, 196, 208, 5, 80, 41, 2, 197, 198, 7, 12, 2, 2, 198, 199, 5, 14, 8, 2, 199, 200, 7, 62, 2, 2, 200, 201, 5, 38, 20, 2, 201, 208, 3, 2, 2, 2, 202, 203, 7, 12, 2, 2, 203, 204, 5, 14, 8, 2, 204, 205, 7, 62, 2, 2, 205, 206, 5, 16, 9, 2, 206, 208, 3, 2, 2, 2, 207, 195, 3, 2, 2, 2, 207, 197, 3, 2, 2, 2, 207, 202, 3, 2, 2, 2, 208, 13, 3, 2, 2, 2, 209, 221, 5, 80, 41, 2, 210, 211, 7, 13, 2, 2, 211, 216, 5, 40, 21, 2, 212, 213, 7, 10, 2, 2, 213, 215, 5, 40, 21, 2, 214, 212, 3, 2, 2, 2, 215, 218, 3, 2, 2, 2, 216, 214, 3, 2, 2, 2, 216, 217, 3, 2, 2, 2, 217, 219, 3, 2, 2, 2, 218, 216, 3, 2, 2, 2, 219, 220, 7, 14, 2, 2, 220, 222, 3, 2, 2, 2, 221, 210, 3, 2, 2, 2, 221, 222, 3, 2, 2, 2, 222, 15, 3, 2, 2, 2, 223, 225, 7, 15, 2, 2, 224, 223, 3, 2, 2, 2, 224, 225, 3, 2, 2, 2, 225, 226, 3, 2, 2, 2, 226, 231, 5, 18, 10, 2, 227, 228, 7, 15, 2, 2, 228, 230, 5, 18, 10, 2, 229, 227, 3, 2, 2, 2, 230, 233, 3, 2, 2, 2, 231, 229, 3, 2, 2, 2, 231, 232, 3, 2, 2, 2, 232, 17, 3, 2, 2, 2, 233, 231, 3, 2, 2, 2, 234, 239, 5, 82, 42, 2, 235, 236, 7, 63, 2, 2, 236, 237, 5, 38, 20, 2, 237, 238, 7, 64, 2, 2, 238, 240, 3, 2, 2, 2, 239, 235, 3, 2, 2, 2, 239, 240, 3, 2, 2, 2, 240, 19, 3, 2, 2, 2, 241, 242, 7, 16, 2, 2, 242, 245, 5, 80, 41, 2, 243, 244, 7, 7, 2, 2, 244, 246, 5, 38, 20, 2, 245, 243, 3, 2, 2, 2, 245, 246, 3, 2, 2, 2, 246, 247, 3, 2, 2, 2, 247, 248, 7, 62, 2, 2, 248, 250, 5, 46, 24, 2, 249, 251, 7, 11, 2, 2, 250, 249, 3, 2, 2, 2, 250, 251, 3, 2, 2, 2, 251, 21, 3, 2, 2, 2, 252, 262, 7, 17, 2, 2, 253, 262, 7, 18, 2, 2, 254, 255, 7, 19, 2, 2, 255, 262, 7, 17, 2, 2, 256, 257, 7, 19, 2, 2, 257, 262, 7, 18, 2, 2, 258, 262, 7, 20, 2, 2, 259, 262, 7, 21, 2, 2, 260, 262, 7, 22, 2, 2, 261, 252, 3, 2, 2, 2, 261, 253, 3, 2, 2, 2, 261, 254, 3, 2, 2, 2, 261, 256, 3, 2, 2, 2, 261, 258, 3, 2, 2, 2, 261, 259, 3, 2, 2, 2, 261, 260, 3, 2, 2, 2, 262, 23, 3, 2, 2, 2, 263, 264, 7, 23, 2, 2, 264, 265, 5, 32, 17, 2, 265, 266, 7, 24, 2, 2, 266, 269, 5, 66, 34, 2, 267, 268, 7, 25, 2, 2, 268, 270, 5, 36, 19, 2, 269, 267, 3, 2, 2, 2, 269, 270, 3, 2, 2, 2, 270, 282, 3, 2, 2, 2, 271, 272, 7, 23, 2, 2, 272, 275, 5, 32, 17, 2, 273, 274, 7, 26, 2, 2, 274, 276, 5, 32, 17, 2, 275, 273, 3, 2, 2, 2, 275, 276, 3, 2, 2, 2, 276, 279, 3, 2, 2, 2, 277, 278, 7, 25, 2, 2, 278, 280, 5, 36, 19, 2, 279, 277, 3, 2, 2, 2, 279, 280, 3, 2, 2, 2, 280, 282, 3, 2, 2, 2, 281, 263, 3, 2, 2, 2, 281, 271, 3, 2, 2, 2, 282, 25, 3, 2, 2, 2, 283, 284, 7, 27, 2, 2, 284, 285, 5, 32, 17, 2, 285, 286, 7, 24, 2, 2, 286, 287, 5, 66, 34, 2, 287, 295, 3, 2, 2, 2, 288, 289, 7, 27, 2, 2, 289, 292, 5, 32, 17, 2, 290, 291, 7, 26, 2, 2, 291, 293, 5, 32, 17, 2, 292, 290, 3, 2, 2, 2, 292, 293, 3, 2, 2, 2, 293, 295, 3, 2, 2, 2, 294, 283, 3, 2, 2, 2, 294, 288, 3, 2, 2, 2, 295, 27, 3, 2, 2, 2, 296, 297, 7, 23, 2, 2, 297, 298, 5, 30, 16, 2, 298, 299, 7, 63, 2, 2, 299, 300, 5, 32, 17, 2, 300, 301, 7, 62, 2, 2, 301, 309, 5, 46, 24, 2, 302, 303, 7, 10, 2, 2, 303, 304, 5, 32, 17, 2, 304, 305, 7, 62, 2, 2, 305, 306, 5, 46, 24, 2, 306, 308, 3, 2, 2, 2, 307, 302, 3, 2, 2, 2, 308, 311, 3, 2, 2, 2, 309, 307, 3, 2, 2, 2, 309, 310, 3, 2, 2, 2, 310, 312, 3, 2, 2, 2, 311, 309, 3, 2, 2, 2, 312, 313, 7, 64, 2, 2, 313, 314, 7, 24, 2, 2, 314, 317, 7, 53, 2, 2, 315, 316, 7, 25, 2, 2, 316, 318, 5, 36, 19, 2, 317, 315, 3, 2, 2, 2, 317, 318, 3, 2, 2, 2, 318, 343, 3, 2, 2, 2, 319, 320, 7, 23, 2, 2, 320, 321, 5, 30, 16, 2, 321, 322, 7, 63, 2, 2, 322, 323, 5, 32, 17, 2, 323, 324, 7, 62, 2, 2, 324, 332, 5, 46, 24, 2, 325, 326, 7, 10, 2, 2, 326, 327, 5, 32, 17, 2, 327, 328, 7, 62, 2, 2, 328, 329, 5, 46, 24, 2, 329, 331, 3, 2, 2, 2, 330, 325, 3, 2, 2, 2, 331, 334, 3, 2, 2, 2, 332, 330, 3, 2, 2, 2, 332, 333, 3, 2, 2, 2, 333, 335, 3, 2, 2, 2, 334, 332, 3, 2, 2, 2, 335, 336, 7, 64, 2, 2, 336, 337, 7, 26, 2, 2, 337, 340, 5, 34, 18, 2, 338, 339, 7, 25, 2, 2, 339, 341, 5, 36, 19, 2, 340, 338, 3, 2, 2, 2, 340, 341, 3, 2, 2, 2, 341, 343, 3, 2, 2, 2, 342, 296, 3, 2, 2, 2, 342, 319, 3, 2, 2, 2, 343, 29, 3, 2, 2, 2, 344, 345, 5, 80, 41, 2, 345, 31, 3, 2, 2, 2, 346, 347, 5, 80, 41, 2, 347, 33, 3, 2, 2, 2, 348, 349, 5, 80, 41, 2, 349, 35, 3, 2, 2, 2, 350, 351, 7, 42, 2, 2, 351, 37, 3, 2, 2, 2, 352, 353, 8, 20, 1, 2, 353, 362, 7, 63, 2, 2, 354, 359, 5, 38, 20, 2, 355, 356, 7, 10, 2, 2, 356, 358, 5, 38, 20, 2, 357, 355, 3, 2, 2, 2, 358, 361, 3, 2, 2, 2, 359, 357, 3, 2, 2, 2, 359, 360, 3, 2, 2, 2, 360, 363, 3, 2, 2, 2, 361, 359, 3, 2, 2, 2, 362, 354, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 365, 3, 2, 2, 2, 364, 366, 7, 10, 2, 2, 365, 364, 3, 2, 2, 2, 365, 366, 3, 2, 2, 2, 366, 367, 3, 2, 2, 2, 367, 368, 7, 64, 2, 2, 368, 369, 7, 29, 2, 2, 369, 411, 5, 38, 20, 14, 370, 371, 7, 65, 2, 2, 371, 372, 7, 13, 2, 2, 372, 373, 5, 38, 20, 2, 373, 374, 7, 14, 2, 2, 374, 411, 3, 2, 2, 2, 375, 376, 7, 66, 2, 2, 376, 377, 7, 13, 2, 2, 377, 378, 5, 38, 20, 2, 378, 379, 7, 14, 2, 2, 379, 411, 3, 2, 2, 2, 380, 381, 7, 63, 2, 2, 381, 382, 5, 38, 20, 2, 382, 383, 7, 10, 2, 2, 383, 388, 5, 38, 20, 2, 384, 385, 7, 10, 2, 2, 385, 387, 5, 38, 20, 2, 386, 384, 3, 2, 2, 2, 387, 390, 3, 2, 2, 2, 388, 386, 3, 2, 2, 2, 388, 389, 3, 2, 2, 2, 389, 392, 3, 2, 2, 2, 390, 388, 3, 2, 2, 2, 391, 393, 7, 10, 2, 2, 392, 391, 3, 2, 2, 2, 392, 393, 3, 2, 2, 2, 393, 394, 3, 2, 2, 2, 394, 395, 7, 64, 2, 2, 395, 411, 3, 2, 2, 2, 396, 398, 7, 4, 2, 2, 397, 399, 5, 42, 22, 2, 398, 397, 3, 2, 2, 2, 398, 399, 3, 2, 2, 2, 399, 400, 3, 2, 2, 2, 400, 411, 7, 5, 2, 2, 401, 411, 7, 30, 2, 2, 402, 411, 7, 31, 2, 2, 403, 411, 7, 32, 2, 2, 404, 411, 5, 40, 21, 2, 405, 411, 5, 80, 41, 2, 406, 407, 7, 63, 2, 2, 407, 408, 5, 38, 20, 2, 408, 409, 7, 64, 2, 2, 409, 411, 3, 2, 2, 2, 410, 352, 3, 2, 2, 2, 410, 370, 3, 2, 2, 2, 410, 375, 3, 2, 2, 2, 410, 380, 3, 2, 2, 2, 410, 396, 3, 2, 2, 2, 410, 401, 3, 2, 2, 2, 410, 402, 3, 2, 2, 2, 410, 403, 3, 2, 2, 2, 410, 404, 3, 2, 2, 2, 410, 405, 3, 2, 2, 2, 410, 406, 3, 2, 2, 2, 411, 432, 3, 2, 2, 2, 412, 413, 12, 16, 2, 2, 413, 414, 7, 28, 2, 2, 414, 431, 5, 38, 20, 16, 415, 416, 12, 15, 2, 2, 416, 417, 7, 29, 2, 2, 417, 431, 5, 38, 20, 15, 418, 419, 12, 3, 2, 2, 419, 420, 7, 13, 2, 2, 420, 425, 5, 38, 20, 2, 421, 422, 7, 10, 2, 2, 422, 424, 5, 38, 20, 2, 423, 421, 3, 2, 2, 2, 424, 427, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 428, 3, 2, 2, 2, 427, 425, 3, 2, 2, 2, 428, 429, 7, 14, 2, 2, 429, 431, 3, 2, 2, 2, 430, 412, 3, 2, 2, 2, 430, 415, 3, 2, 2, 2, 430, 418, 3, 2, 2, 2, 431, 434, 3, 2, 2, 2, 432, 430, 3, 2, 2, 2, 432, 433, 3, 2, 2, 2, 433, 39, 3, 2, 2, 2, 434, 432, 3, 2, 2, 2, 435, 436, 7, 67, 2, 2, 436, 41, 3, 2, 2, 2, 437, 438, 5, 44, 23, 2, 438, 439, 7, 7, 2, 2, 439, 440, 5, 38, 20, 2, 440, 448, 3, 2, 2, 2, 441, 442, 7, 10, 2, 2, 442, 443, 5, 44, 23, 2, 443, 444, 7, 7, 2, 2, 444, 445, 5, 38, 20, 2, 445, 447, 3, 2, 2, 2, 446, 441, 3, 2, 2, 2, 447, 450, 3, 2, 2, 2, 448, 446, 3, 2, 2, 2, 448, 449, 3, 2, 2, 2, 449, 454, 3, 2, 2, 2, 450, 448, 3, 2, 2, 2, 451, 455, 7, 10, 2, 2, 452, 453, 7, 15, 2, 2, 453, 455, 5, 84, 43, 2, 454, 451, 3, 2, 2, 2, 454, 452, 3, 2, 2, 2, 454, 455, 3, 2, 2, 2, 455, 459, 3, 2, 2, 2, 456, 457, 7, 15, 2, 2, 457, 459, 5, 84, 43, 2, 458, 437, 3, 2, 2, 2, 458, 456, 3, 2, 2, 2, 459, 43, 3, 2, 2, 2, 460, 461, 5, 82, 42, 2, 461, 45, 3, 2, 2, 2, 462, 463, 8, 24, 1, 2, 463, 613, 5, 56, 29, 2, 464, 465, 5, 72, 37, 2, 465, 467, 7, 63, 2, 2, 466, 468, 5, 68, 35, 2, 467, 466, 3, 2, 2, 2, 467, 468, 3, 2, 2, 2, 468, 469, 3, 2, 2, 2, 469, 470, 7, 64, 2, 2, 470, 613, 3, 2, 2, 2, 471, 472, 7, 52, 2, 2, 472, 613, 5, 46, 24, 27, 473, 474, 5, 80, 41, 2, 474, 475, 7, 34, 2, 2, 475, 476, 7, 62, 2, 2, 476, 477, 5, 46, 24, 23, 477, 613, 3, 2, 2, 2, 478, 479, 7, 45, 2, 2, 479, 480, 7, 4, 2, 2, 480, 485, 5, 46, 24, 2, 481, 482, 7, 10, 2, 2, 482, 484, 5, 46, 24, 2, 483, 481, 3, 2, 2, 2, 484, 487, 3, 2, 2, 2, 485, 483, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 489, 3, 2, 2, 2, 487, 485, 3, 2, 2, 2, 488, 490, 7, 10, 2, 2, 489, 488, 3, 2, 2, 2, 489, 490, 3, 2, 2, 2, 490, 491, 3, 2, 2, 2, 491, 492, 7, 5, 2, 2, 492, 613, 3, 2, 2, 2, 493, 494, 7, 46, 2, 2, 494, 495, 7, 4, 2, 2, 495, 500, 5, 46, 24, 2, 496, 497, 7, 10, 2, 2, 497, 499, 5, 46, 24, 2, 498, 496, 3, 2, 2, 2, 499, 502, 3, 2, 2, 2, 500, 498, 3, 2, 2, 2, 500, 501, 3, 2, 2, 2, 501, 504, 3, 2, 2, 2, 502, 500, 3, 2, 2, 2, 503, 505, 7, 10, 2, 2, 504, 503, 3, 2, 2, 2, 504, 505, 3, 2, 2, 2, 505, 506, 3, 2, 2, 2, 506, 507, 7, 5, 2, 2, 507, 613, 3, 2, 2, 2, 508, 613, 5, 48, 25, 2, 509, 510, 7, 35, 2, 2, 510, 511, 7, 4, 2, 2, 511, 516, 5, 46, 24, 2, 512, 513, 7, 10, 2, 2, 513, 515, 5, 46, 24, 2, 514, 512, 3, 2, 2, 2, 515, 518, 3, 2, 2, 2, 516, 514, 3, 2, 2, 2, 516, 517, 3, 2, 2, 2, 517, 520, 3, 2, 2, 2, 518, 516, 3, 2, 2, 2, 519, 521, 7, 10, 2, 2, 520, 519, 3, 2, 2, 2, 520, 521, 3, 2, 2, 2, 521, 522, 3, 2, 2, 2, 522, 523, 7, 5, 2, 2, 523, 613, 3, 2, 2, 2, 524, 525, 7, 36, 2, 2, 525, 526, 7, 4, 2, 2, 526, 531, 5, 46, 24, 2, 527, 528, 7, 10, 2, 2, 528, 530, 5, 46, 24, 2, 529, 527, 3, 2, 2, 2, 530, 533, 3, 2, 2, 2, 531, 529, 3, 2, 2, 2, 531, 532, 3, 2, 2, 2, 532, 535, 3, 2, 2, 2, 533, 531, 3, 2, 2, 2, 534, 536, 7, 10, 2, 2, 535, 534, 3, 2, 2, 2, 535, 536, 3, 2, 2, 2, 536, 537, 3, 2, 2, 2, 537, 538, 7, 5, 2, 2, 538, 613, 3, 2, 2, 2, 539, 544, 5, 80, 41, 2, 540, 544, 7, 44, 2, 2, 541, 544, 7, 43, 2, 2, 542, 544, 7, 42, 2, 2, 543, 539, 3, 2, 2, 2, 543, 540, 3, 2, 2, 2, 543, 541, 3, 2, 2, 2, 543, 542, 3, 2, 2, 2, 544, 613, 3, 2, 2, 2, 545, 546, 7, 63, 2, 2, 546, 547, 5, 46, 24, 2, 547, 548, 7, 10, 2, 2, 548, 553, 5, 46, 24, 2, 549, 550, 7, 10, 2, 2, 550, 552, 5, 46, 24, 2, 551, 549, 3, 2, 2, 2, 552, 555, 3, 2, 2, 2, 553, 551, 3, 2, 2, 2, 553, 554, 3, 2, 2, 2, 554, 557, 3, 2, 2, 2, 555, 553, 3, 2, 2, 2, 556, 558, 7, 10, 2, 2, 557, 556, 3, 2, 2, 2, 557, 558, 3, 2, 2, 2, 558, 559, 3, 2, 2, 2, 559, 560, 7, 64, 2, 2, 560, 613, 3, 2, 2, 2, 561, 562, 7, 4, 2, 2, 562, 567, 5, 70, 36, 2, 563, 564, 7, 10, 2, 2, 564, 566, 5, 70, 36, 2, 565, 563, 3, 2, 2, 2, 566, 569, 3, 2, 2, 2, 567, 565, 3, 2, 2, 2, 567, 568, 3, 2, 2, 2, 568, 571, 3, 2, 2, 2, 569, 567, 3, 2, 2, 2, 570, 572, 7, 10, 2, 2, 571, 570, 3, 2, 2, 2, 571, 572, 3, 2, 2, 2, 572, 573, 3, 2, 2, 2, 573, 574, 7, 5, 2, 2, 574, 613, 3, 2, 2, 2, 575, 584, 7, 13, 2, 2, 576, 581, 5, 46, 24, 2, 577, 578, 7, 10, 2, 2, 578, 580, 5, 46, 24, 2, 579, 577, 3, 2, 2, 2, 580, 583, 3, 2, 2, 2, 581, 579, 3, 2, 2, 2, 581, 582, 3, 2, 2, 2, 582, 585, 3, 2, 2, 2, 583, 581, 3, 2, 2, 2, 584, 576, 3, 2, 2, 2, 584, 585, 3, 2, 2, 2, 585, 587, 3, 2, 2, 2, 586, 588, 7, 10, 2, 2, 587, 586, 3, 2, 2, 2, 587, 588, 3, 2, 2, 2, 588, 589, 3, 2, 2, 2, 589, 613, 7, 14, 2, 2, 590, 591, 7, 37, 2, 2, 591, 592, 7, 63, 2, 2, 592, 593, 5, 46, 24, 2, 593, 594, 7, 64, 2, 2, 594, 595, 5, 46, 24, 2, 595, 596, 7, 38, 2, 2, 596, 597, 5, 46, 24, 7, 597, 613, 3, 2, 2, 2, 598, 599, 5, 10, 6, 2, 599, 600, 5, 46, 24, 6, 600, 613, 3, 2, 2, 2, 601, 602, 5, 20, 11, 2, 602, 603, 5, 46, 24, 5, 603, 613, 3, 2, 2, 2, 604, 605, 7, 63, 2, 2, 605, 606, 5, 46, 24, 2, 606, 607, 7, 64, 2, 2, 607, 613, 3, 2, 2, 2, 608, 609, 7, 4, 2, 2, 609, 610, 5, 46, 24, 2, 610, 611, 7, 5, 2, 2, 611, 613, 3, 2, 2, 2, 612, 462, 3, 2, 2, 2, 612, 464, 3, 2, 2, 2, 612, 471, 3, 2, 2, 2, 612, 473, 3, 2, 2, 2, 612, 478, 3, 2, 2, 2, 612, 493, 3, 2, 2, 2, 612, 508, 3, 2, 2, 2, 612, 509, 3, 2, 2, 2, 612, 524, 3, 2, 2, 2, 612, 543, 3, 2, 2, 2, 612, 545, 3, 2, 2, 2, 612, 561, 3, 2, 2, 2, 612, 575, 3, 2, 2, 2, 612, 590, 3, 2, 2, 2, 612, 598, 3, 2, 2, 2, 612, 601, 3, 2, 2, 2, 612, 604, 3, 2, 2, 2, 612, 608, 3, 2, 2, 2, 613, 663, 3, 2, 2, 2, 614, 615, 12, 28, 2, 2, 615, 616, 7, 33, 2, 2, 616, 662, 5, 46, 24, 28, 617, 618, 12, 26, 2, 2, 618, 619, 9, 2, 2, 2, 619, 662, 5, 46, 24, 27, 620, 621, 12, 25, 2, 2, 621, 622, 9, 3, 2, 2, 622, 662, 5, 46, 24, 26, 623, 624, 12, 24, 2, 2, 624, 625, 9, 4, 2, 2, 625, 662, 5, 46, 24, 25, 626, 627, 12, 22, 2, 2, 627, 628, 7, 62, 2, 2, 628, 629, 5, 46, 24, 23, 629, 630, 8, 24, 1, 2, 630, 662, 3, 2, 2, 2, 631, 632, 12, 20, 2, 2, 632, 633, 7, 45, 2, 2, 633, 662, 5, 46, 24, 21, 634, 635, 12, 18, 2, 2, 635, 636, 7, 46, 2, 2, 636, 662, 5, 46, 24, 19, 637, 638, 12, 17, 2, 2, 638, 639, 7, 47, 2, 2, 639, 662, 5, 46, 24, 18, 640, 641, 12, 16, 2, 2, 641, 642, 7, 48, 2, 2, 642, 662, 5, 46, 24, 17, 643, 644, 12, 10, 2, 2, 644, 645, 7, 28, 2, 2, 645, 662, 5, 46, 24, 11, 646, 647, 12, 32, 2, 2, 647, 648, 7, 24, 2, 2, 648, 654, 5, 74, 38, 2, 649, 651, 7, 63, 2, 2, 650, 652, 5, 68, 35, 2, 651, 650, 3, 2, 2, 2, 651, 652, 3, 2, 2, 2, 652, 653, 3, 2, 2, 2, 653, 655, 7, 64, 2, 2, 654, 649, 3, 2, 2, 2, 654, 655, 3, 2, 2, 2, 655, 662, 3, 2, 2, 2, 656, 657, 12, 29, 2, 2, 657, 658, 7, 13, 2, 2, 658, 659, 5, 46, 24, 2, 659, 660, 7, 14, 2, 2, 660, 662, 3, 2, 2, 2, 661, 614, 3, 2, 2, 2, 661, 617, 3, 2, 2, 2, 661, 620, 3, 2, 2, 2, 661, 623, 3, 2, 2, 2, 661, 626, 3, 2, 2, 2, 661, 631, 3, 2, 2, 2, 661, 634, 3, 2, 2, 2, 661, 637, 3, 2, 2, 2, 661, 640, 3, 2, 2, 2, 661, 643, 3, 2, 2, 2, 661, 646, 3, 2, 2, 2, 661, 656, 3, 2, 2, 2, 662, 665, 3, 2, 2, 2, 663, 661, 3, 2, 2, 2, 663, 664, 3, 2, 2, 2, 664, 47, 3, 2, 2, 2, 665, 663, 3, 2, 2, 2, 666, 667, 7, 50, 2, 2, 667, 668, 5, 46, 24, 2, 668, 670, 7, 4, 2, 2, 669, 671, 7, 15, 2, 2, 670, 669, 3, 2, 2, 2, 670, 671, 3, 2, 2, 2, 671, 672, 3, 2, 2, 2, 672, 677, 5, 50, 26, 2, 673, 674, 7, 15, 2, 2, 674, 676, 5, 50, 26, 2, 675, 673, 3, 2, 2, 2, 676, 679, 3, 2, 2, 2, 677, 675, 3, 2, 2, 2, 677, 678, 3, 2, 2, 2, 678, 680, 3, 2, 2, 2, 679, 677, 3, 2, 2, 2, 680, 681, 7, 5, 2, 2, 681, 49, 3, 2, 2, 2, 682, 685, 5, 52, 27, 2, 683, 685, 7, 39, 2, 2, 684, 682, 3, 2, 2, 2, 684, 683, 3, 2, 2, 2, 685, 686, 3, 2, 2, 2, 686, 687, 7, 29, 2, 2, 687, 688, 5, 46, 24, 2, 688, 51, 3, 2, 2, 2, 689, 696, 5, 82, 42, 2, 690, 693, 7, 63, 2, 2, 691, 694, 5, 82, 42, 2, 692, 694, 7, 39, 2, 2, 693, 691, 3, 2, 2, 2, 693, 692, 3, 2, 2, 2, 694, 695, 3, 2, 2, 2, 695, 697, 7, 64, 2, 2, 696, 690, 3, 2, 2, 2, 696, 697, 3, 2, 2, 2, 697, 53, 3, 2, 2, 2, 698, 699, 5, 8, 5, 2, 699, 700, 7, 2, 2, 3, 700, 708, 3, 2, 2, 2, 701, 702, 5, 46, 24, 2, 702, 703, 7, 2, 2, 3, 703, 708, 3, 2, 2, 2, 704, 705, 7, 69, 2, 2, 705, 708, 7, 2, 2, 3, 706, 708, 7, 2, 2, 3, 707, 698, 3, 2, 2, 2, 707, 701, 3, 2, 2, 2, 707, 704, 3, 2, 2, 2, 707, 706, 3, 2, 2, 2, 708, 55, 3, 2, 2, 2, 709, 712, 5, 58, 30, 2, 710, 712, 5, 60, 31, 2, 711, 709, 3, 2, 2, 2, 711, 710, 3, 2, 2, 2, 712, 57, 3, 2, 2, 2, 713, 714, 5, 64, 33, 2, 714, 715, 7, 29, 2, 2, 715, 716, 5, 46, 24, 2, 716, 731, 3, 2, 2, 2, 717, 718, 7, 63, 2, 2, 718, 723, 5, 64, 33, 2, 719, 720, 7, 10, 2, 2, 720, 722, 5, 64, 33, 2, 721, 719, 3, 2, 2, 2, 722, 725, 3, 2, 2, 2, 723, 721, 3, 2, 2, 2, 723, 724, 3, 2, 2, 2, 724, 726, 3, 2, 2, 2, 725, 723, 3, 2, 2, 2, 726, 727, 7, 64, 2, 2, 727, 728, 7, 29, 2, 2, 728, 729, 5, 46, 24, 2, 729, 731, 3, 2, 2, 2, 730, 713, 3, 2, 2, 2, 730, 717, 3, 2, 2, 2, 731, 59, 3, 2, 2, 2, 732, 733, 7, 63, 2, 2, 733, 734, 7, 63, 2, 2, 734, 737, 5, 64, 33, 2, 735, 736, 7, 10, 2, 2, 736, 738, 5, 64, 33, 2, 737, 735, 3, 2, 2, 2, 738, 739, 3, 2, 2, 2, 739, 737, 3, 2, 2, 2, 739, 740, 3, 2, 2, 2, 740, 741, 3, 2, 2, 2, 741, 742, 7, 64, 2, 2, 742, 743, 7, 64, 2, 2, 743, 744, 7, 29, 2, 2, 744, 745, 5, 46, 24, 2, 745, 61, 3, 2, 2, 2, 746, 749, 7, 39, 2, 2, 747, 749, 5, 80, 41, 2, 748, 746, 3, 2, 2, 2, 748, 747, 3, 2, 2, 2, 749, 63, 3, 2, 2, 2, 750, 751, 5, 62, 32, 2, 751, 65, 3, 2, 2, 2, 752, 755, 7, 53, 2, 2, 753, 755, 5, 80, 41, 2, 754, 752, 3, 2, 2, 2, 754, 753, 3, 2, 2, 2, 755, 67, 3, 2, 2, 2, 756, 761, 5, 46, 24, 2, 757, 758, 7, 10, 2, 2, 758, 760, 5, 46, 24, 2, 759, 757, 3, 2, 2, 2, 760, 763, 3, 2, 2, 2, 761, 759, 3, 2, 2, 2, 761, 762, 3, 2, 2, 2, 762, 69, 3, 2, 2, 2, 763, 761, 3, 2, 2, 2, 764, 765, 5, 82, 42, 2, 765, 766, 7, 7, 2, 2, 766, 767, 5, 46, 24, 2, 767, 771, 3, 2, 2, 2, 768, 769, 7, 40, 2, 2, 769, 771, 5, 46, 24, 2, 770, 764, 3, 2, 2, 2, 770, 768, 3, 2, 2, 2, 771, 71, 3, 2, 2, 2, 772, 775, 5, 80, 41, 2, 773, 775, 9, 5, 2, 2, 774, 772, 3, 2, 2, 2, 774, 773, 3, 2, 2, 2, 775, 73, 3, 2, 2, 2, 776, 779, 5, 80, 41, 2, 777, 779, 9, 6, 2, 2, 778, 776, 3, 2, 2, 2, 778, 777, 3, 2, 2, 2, 779, 75, 3, 2, 2, 2, 780, 781, 9, 7, 2, 2, 781, 77, 3, 2, 2, 2, 782, 783, 9, 8, 2, 2, 783, 79, 3, 2, 2, 2, 784, 789, 5, 84, 43, 2, 785, 786, 7, 41, 2, 2, 786, 788, 5, 84, 43, 2, 787, 785, 3, 2, 2, 2, 788, 791, 3, 2, 2, 2, 789, 787, 3, 2, 2, 2, 789, 790, 3, 2, 2, 2, 790, 81, 3, 2, 2, 2, 791, 789, 3, 2, 2, 2, 792, 797, 5, 84, 43, 2, 793, 794, 5, 80, 41, 2, 794, 795, 8, 42, 1, 2, 795, 797, 3, 2, 2, 2, 796, 792, 3, 2, 2, 2, 796, 793, 3, 2, 2, 2, 797, 83, 3, 2, 2, 2, 798, 799, 9, 9, 2, 2, 799, 85, 3, 2, 2, 2, 90, 89, 96, 105, 113, 138, 148, 151, 154, 158, 162, 165, 180, 188, 191, 193, 207, 216, 221, 224, 231, 239, 245, 250, 261, 269, 275, 279, 281, 292, 294, 309, 317, 332, 340, 342, 359, 362, 365, 388, 392, 398, 410, 425, 430, 432, 448, 454, 458, 467, 485, 489, 500, 504, 516, 520, 531, 535, 543, 553, 557, 567, 571, 581, 584, 587, 612, 651, 654, 661, 663, 670, 677, 684, 693, 696, 707, 711, 723, 730, 739, 748, 754, 761, 770, 774, 778, 789, 796] \ No newline at end of file diff --git a/quint/src/generated/QuintParser.ts b/quint/src/generated/QuintParser.ts index 53294b225..b243c6b7d 100644 --- a/quint/src/generated/QuintParser.ts +++ b/quint/src/generated/QuintParser.ts @@ -465,134 +465,158 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 8, QuintParser.RULE_operDef); let _la: number; try { - this.enterOuterAlt(_localctx, 1); - { - this.state = 138; - this.qualifier(); - this.state = 139; - this.normalCallName(); - this.state = 176; + this.state = 191; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 9, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 14, this._ctx) ) { case 1: + this.enterOuterAlt(_localctx, 1); { - this.state = 140; - this.match(QuintParser.LPAREN); - this.state = 149; + this.state = 138; + this.qualifier(); + this.state = 139; + this.normalCallName(); + this.state = 152; this._errHandler.sync(this); - _la = this._input.LA(1); - if (((((_la - 37)) & ~0x1F) === 0 && ((1 << (_la - 37)) & ((1 << (QuintParser.T__36 - 37)) | (1 << (QuintParser.LOW_ID - 37)) | (1 << (QuintParser.CAP_ID - 37)))) !== 0)) { + switch ( this.interpreter.adaptivePredict(this._input, 7, this._ctx) ) { + case 1: { - this.state = 141; - this.parameter(); - this.state = 146; + this.state = 140; + this.match(QuintParser.LPAREN); + this.state = 149; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la === QuintParser.T__7) { + if (((((_la - 37)) & ~0x1F) === 0 && ((1 << (_la - 37)) & ((1 << (QuintParser.T__36 - 37)) | (1 << (QuintParser.LOW_ID - 37)) | (1 << (QuintParser.CAP_ID - 37)))) !== 0)) { { - { - this.state = 142; - this.match(QuintParser.T__7); - this.state = 143; + this.state = 141; this.parameter(); - } - } - this.state = 148; + this.state = 146; this._errHandler.sync(this); _la = this._input.LA(1); + while (_la === QuintParser.T__7) { + { + { + this.state = 142; + this.match(QuintParser.T__7); + this.state = 143; + this.parameter(); + } + } + this.state = 148; + this._errHandler.sync(this); + _la = this._input.LA(1); + } + } } + + this.state = 151; + this.match(QuintParser.RPAREN); } + break; } - - this.state = 151; - this.match(QuintParser.RPAREN); - this.state = 154; + this.state = 156; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__4) { { - this.state = 152; + this.state = 154; this.match(QuintParser.T__4); - this.state = 153; + this.state = 155; this.type(0); } } + this.state = 160; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === QuintParser.ASGN) { + { + this.state = 158; + this.match(QuintParser.ASGN); + this.state = 159; + this.expr(0); + } + } + + this.state = 163; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === QuintParser.T__8) { + { + this.state = 162; + this.match(QuintParser.T__8); + } } - break; - case 2: - { - this.state = 156; - this.match(QuintParser.T__4); - this.state = 157; - this.type(0); } break; - case 3: + case 2: + this.enterOuterAlt(_localctx, 2); { - this.state = 158; + this.state = 165; + this.qualifier(); + this.state = 166; + this.normalCallName(); + this.state = 167; this.match(QuintParser.LPAREN); { - this.state = 159; + this.state = 168; this.parameter(); - this.state = 160; + this.state = 169; this.match(QuintParser.T__4); - this.state = 161; + this.state = 170; this.type(0); - this.state = 169; + this.state = 178; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 162; + this.state = 171; this.match(QuintParser.T__7); - this.state = 163; + this.state = 172; this.parameter(); - this.state = 164; + this.state = 173; this.match(QuintParser.T__4); - this.state = 165; + this.state = 174; this.type(0); } } - this.state = 171; + this.state = 180; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 172; + this.state = 181; this.match(QuintParser.RPAREN); - this.state = 173; + this.state = 182; this.match(QuintParser.T__4); - this.state = 174; + this.state = 183; this.type(0); + this.state = 186; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === QuintParser.ASGN) { + { + this.state = 184; + this.match(QuintParser.ASGN); + this.state = 185; + this.expr(0); + } } - break; - } - this.state = 180; - this._errHandler.sync(this); - _la = this._input.LA(1); - if (_la === QuintParser.ASGN) { - { - this.state = 178; - this.match(QuintParser.ASGN); - this.state = 179; - this.expr(0); - } - } - this.state = 183; - this._errHandler.sync(this); - _la = this._input.LA(1); - if (_la === QuintParser.T__8) { - { - this.state = 182; - this.match(QuintParser.T__8); + this.state = 189; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === QuintParser.T__8) { + { + this.state = 188; + this.match(QuintParser.T__8); + } } - } + } + break; } } catch (re) { @@ -614,16 +638,16 @@ export class QuintParser extends Parser { let _localctx: TypeDefContext = new TypeDefContext(this._ctx, this.state); this.enterRule(_localctx, 10, QuintParser.RULE_typeDef); try { - this.state = 197; + this.state = 205; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 12, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 15, this._ctx) ) { case 1: _localctx = new TypeAbstractDefContext(_localctx); this.enterOuterAlt(_localctx, 1); { - this.state = 185; + this.state = 193; this.match(QuintParser.T__9); - this.state = 186; + this.state = 194; this.qualId(); } break; @@ -632,13 +656,13 @@ export class QuintParser extends Parser { _localctx = new TypeAliasDefContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 187; + this.state = 195; this.match(QuintParser.T__9); - this.state = 188; + this.state = 196; this.typeDefHead(); - this.state = 189; + this.state = 197; this.match(QuintParser.ASGN); - this.state = 190; + this.state = 198; this.type(0); } break; @@ -647,13 +671,13 @@ export class QuintParser extends Parser { _localctx = new TypeSumDefContext(_localctx); this.enterOuterAlt(_localctx, 3); { - this.state = 192; + this.state = 200; this.match(QuintParser.T__9); - this.state = 193; + this.state = 201; this.typeDefHead(); - this.state = 194; + this.state = 202; this.match(QuintParser.ASGN); - this.state = 195; + this.state = 203; this.sumTypeDefinition(); } break; @@ -681,36 +705,36 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 199; + this.state = 207; _localctx._typeName = this.qualId(); - this.state = 211; + this.state = 219; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__10) { { - this.state = 200; + this.state = 208; this.match(QuintParser.T__10); - this.state = 201; + this.state = 209; _localctx._typeVar = this.typeVar(); _localctx._typeVars.push(_localctx._typeVar); - this.state = 206; + this.state = 214; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 202; + this.state = 210; this.match(QuintParser.T__7); - this.state = 203; + this.state = 211; _localctx._typeVar = this.typeVar(); _localctx._typeVars.push(_localctx._typeVar); } } - this.state = 208; + this.state = 216; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 209; + this.state = 217; this.match(QuintParser.T__11); } } @@ -739,31 +763,31 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 214; + this.state = 222; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__12) { { - this.state = 213; + this.state = 221; this.match(QuintParser.T__12); } } - this.state = 216; + this.state = 224; this.typeSumVariant(); - this.state = 221; + this.state = 229; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__12) { { { - this.state = 217; + this.state = 225; this.match(QuintParser.T__12); - this.state = 218; + this.state = 226; this.typeSumVariant(); } } - this.state = 223; + this.state = 231; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -791,18 +815,18 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 224; + this.state = 232; _localctx._sumLabel = this.simpleId("variant label"); - this.state = 229; + this.state = 237; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.LPAREN) { { - this.state = 225; + this.state = 233; this.match(QuintParser.LPAREN); - this.state = 226; + this.state = 234; this.type(0); - this.state = 227; + this.state = 235; this.match(QuintParser.RPAREN); } } @@ -831,32 +855,32 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 231; + this.state = 239; this.match(QuintParser.T__13); - this.state = 232; + this.state = 240; this.qualId(); - this.state = 235; + this.state = 243; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__4) { { - this.state = 233; + this.state = 241; this.match(QuintParser.T__4); - this.state = 234; + this.state = 242; this.type(0); } } - this.state = 237; + this.state = 245; this.match(QuintParser.ASGN); - this.state = 238; + this.state = 246; this.expr(0); - this.state = 240; + this.state = 248; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__8) { { - this.state = 239; + this.state = 247; this.match(QuintParser.T__8); } } @@ -882,13 +906,13 @@ export class QuintParser extends Parser { let _localctx: QualifierContext = new QualifierContext(this._ctx, this.state); this.enterRule(_localctx, 20, QuintParser.RULE_qualifier); try { - this.state = 251; + this.state = 259; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 20, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 23, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 242; + this.state = 250; this.match(QuintParser.T__14); } break; @@ -896,7 +920,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 243; + this.state = 251; this.match(QuintParser.T__15); } break; @@ -904,9 +928,9 @@ export class QuintParser extends Parser { case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 244; + this.state = 252; this.match(QuintParser.T__16); - this.state = 245; + this.state = 253; this.match(QuintParser.T__14); } break; @@ -914,9 +938,9 @@ export class QuintParser extends Parser { case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 246; + this.state = 254; this.match(QuintParser.T__16); - this.state = 247; + this.state = 255; this.match(QuintParser.T__15); } break; @@ -924,7 +948,7 @@ export class QuintParser extends Parser { case 5: this.enterOuterAlt(_localctx, 5); { - this.state = 248; + this.state = 256; this.match(QuintParser.T__17); } break; @@ -932,7 +956,7 @@ export class QuintParser extends Parser { case 6: this.enterOuterAlt(_localctx, 6); { - this.state = 249; + this.state = 257; this.match(QuintParser.T__18); } break; @@ -940,7 +964,7 @@ export class QuintParser extends Parser { case 7: this.enterOuterAlt(_localctx, 7); { - this.state = 250; + this.state = 258; this.match(QuintParser.T__19); } break; @@ -966,28 +990,28 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 22, QuintParser.RULE_importMod); let _la: number; try { - this.state = 271; + this.state = 279; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 24, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 27, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 253; + this.state = 261; this.match(QuintParser.T__20); - this.state = 254; + this.state = 262; this.name(); - this.state = 255; + this.state = 263; this.match(QuintParser.T__21); - this.state = 256; + this.state = 264; this.identOrStar(); - this.state = 259; + this.state = 267; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__22) { { - this.state = 257; + this.state = 265; this.match(QuintParser.T__22); - this.state = 258; + this.state = 266; this.fromSource(); } } @@ -998,30 +1022,30 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 261; + this.state = 269; this.match(QuintParser.T__20); - this.state = 262; + this.state = 270; this.name(); - this.state = 265; + this.state = 273; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__23) { { - this.state = 263; + this.state = 271; this.match(QuintParser.T__23); - this.state = 264; + this.state = 272; this.name(); } } - this.state = 269; + this.state = 277; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__22) { { - this.state = 267; + this.state = 275; this.match(QuintParser.T__22); - this.state = 268; + this.state = 276; this.fromSource(); } } @@ -1050,19 +1074,19 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 24, QuintParser.RULE_exportMod); let _la: number; try { - this.state = 284; + this.state = 292; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 26, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 29, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 273; + this.state = 281; this.match(QuintParser.T__24); - this.state = 274; + this.state = 282; this.name(); - this.state = 275; + this.state = 283; this.match(QuintParser.T__21); - this.state = 276; + this.state = 284; this.identOrStar(); } break; @@ -1070,18 +1094,18 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 278; + this.state = 286; this.match(QuintParser.T__24); - this.state = 279; + this.state = 287; this.name(); - this.state = 282; + this.state = 290; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__23) { { - this.state = 280; + this.state = 288; this.match(QuintParser.T__23); - this.state = 281; + this.state = 289; this.name(); } } @@ -1110,60 +1134,60 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 26, QuintParser.RULE_instanceMod); let _la: number; try { - this.state = 332; + this.state = 340; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 31, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 34, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 286; + this.state = 294; this.match(QuintParser.T__20); - this.state = 287; + this.state = 295; this.moduleName(); - this.state = 288; + this.state = 296; this.match(QuintParser.LPAREN); { - this.state = 289; + this.state = 297; this.name(); - this.state = 290; + this.state = 298; this.match(QuintParser.ASGN); - this.state = 291; - this.expr(0); this.state = 299; + this.expr(0); + this.state = 307; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 292; + this.state = 300; this.match(QuintParser.T__7); - this.state = 293; + this.state = 301; this.name(); - this.state = 294; + this.state = 302; this.match(QuintParser.ASGN); - this.state = 295; + this.state = 303; this.expr(0); } } - this.state = 301; + this.state = 309; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 302; + this.state = 310; this.match(QuintParser.RPAREN); - this.state = 303; + this.state = 311; this.match(QuintParser.T__21); - this.state = 304; + this.state = 312; this.match(QuintParser.MUL); - this.state = 307; + this.state = 315; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__22) { { - this.state = 305; + this.state = 313; this.match(QuintParser.T__22); - this.state = 306; + this.state = 314; this.fromSource(); } } @@ -1174,54 +1198,54 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 309; + this.state = 317; this.match(QuintParser.T__20); - this.state = 310; + this.state = 318; this.moduleName(); - this.state = 311; + this.state = 319; this.match(QuintParser.LPAREN); { - this.state = 312; + this.state = 320; this.name(); - this.state = 313; + this.state = 321; this.match(QuintParser.ASGN); - this.state = 314; - this.expr(0); this.state = 322; + this.expr(0); + this.state = 330; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 315; + this.state = 323; this.match(QuintParser.T__7); - this.state = 316; + this.state = 324; this.name(); - this.state = 317; + this.state = 325; this.match(QuintParser.ASGN); - this.state = 318; + this.state = 326; this.expr(0); } } - this.state = 324; + this.state = 332; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 325; + this.state = 333; this.match(QuintParser.RPAREN); - this.state = 326; + this.state = 334; this.match(QuintParser.T__23); - this.state = 327; + this.state = 335; this.qualifiedName(); - this.state = 330; + this.state = 338; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__22) { { - this.state = 328; + this.state = 336; this.match(QuintParser.T__22); - this.state = 329; + this.state = 337; this.fromSource(); } } @@ -1251,7 +1275,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 334; + this.state = 342; this.qualId(); } } @@ -1276,7 +1300,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 336; + this.state = 344; this.qualId(); } } @@ -1301,7 +1325,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 338; + this.state = 346; this.qualId(); } } @@ -1326,7 +1350,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 340; + this.state = 348; this.match(QuintParser.STRING); } } @@ -1364,60 +1388,60 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 400; + this.state = 408; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 38, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 41, this._ctx) ) { case 1: { _localctx = new TypeOperContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 343; + this.state = 351; this.match(QuintParser.LPAREN); - this.state = 352; + this.state = 360; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__27) | (1 << QuintParser.T__28) | (1 << QuintParser.T__29))) !== 0) || ((((_la - 61)) & ~0x1F) === 0 && ((1 << (_la - 61)) & ((1 << (QuintParser.LPAREN - 61)) | (1 << (QuintParser.SET - 61)) | (1 << (QuintParser.LIST - 61)) | (1 << (QuintParser.LOW_ID - 61)) | (1 << (QuintParser.CAP_ID - 61)))) !== 0)) { { - this.state = 344; + this.state = 352; this.type(0); - this.state = 349; + this.state = 357; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 32, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 35, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 345; + this.state = 353; this.match(QuintParser.T__7); - this.state = 346; + this.state = 354; this.type(0); } } } - this.state = 351; + this.state = 359; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 32, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 35, this._ctx); } } } - this.state = 355; + this.state = 363; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 354; + this.state = 362; this.match(QuintParser.T__7); } } - this.state = 357; + this.state = 365; this.match(QuintParser.RPAREN); - this.state = 358; + this.state = 366; this.match(QuintParser.T__26); - this.state = 359; + this.state = 367; this.type(12); } break; @@ -1427,13 +1451,13 @@ export class QuintParser extends Parser { _localctx = new TypeSetContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 360; + this.state = 368; this.match(QuintParser.SET); - this.state = 361; + this.state = 369; this.match(QuintParser.T__10); - this.state = 362; + this.state = 370; this.type(0); - this.state = 363; + this.state = 371; this.match(QuintParser.T__11); } break; @@ -1443,13 +1467,13 @@ export class QuintParser extends Parser { _localctx = new TypeListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 365; + this.state = 373; this.match(QuintParser.LIST); - this.state = 366; + this.state = 374; this.match(QuintParser.T__10); - this.state = 367; + this.state = 375; this.type(0); - this.state = 368; + this.state = 376; this.match(QuintParser.T__11); } break; @@ -1459,43 +1483,43 @@ export class QuintParser extends Parser { _localctx = new TypeTupleContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 370; + this.state = 378; this.match(QuintParser.LPAREN); - this.state = 371; + this.state = 379; this.type(0); - this.state = 372; + this.state = 380; this.match(QuintParser.T__7); - this.state = 373; + this.state = 381; this.type(0); - this.state = 378; + this.state = 386; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 35, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 374; + this.state = 382; this.match(QuintParser.T__7); - this.state = 375; + this.state = 383; this.type(0); } } } - this.state = 380; + this.state = 388; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 35, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); } - this.state = 382; + this.state = 390; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 381; + this.state = 389; this.match(QuintParser.T__7); } } - this.state = 384; + this.state = 392; this.match(QuintParser.RPAREN); } break; @@ -1505,19 +1529,19 @@ export class QuintParser extends Parser { _localctx = new TypeRecContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 386; + this.state = 394; this.match(QuintParser.T__1); - this.state = 388; + this.state = 396; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__12 || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 387; + this.state = 395; this.row(); } } - this.state = 390; + this.state = 398; this.match(QuintParser.T__2); } break; @@ -1527,7 +1551,7 @@ export class QuintParser extends Parser { _localctx = new TypeIntContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 391; + this.state = 399; this.match(QuintParser.T__27); } break; @@ -1537,7 +1561,7 @@ export class QuintParser extends Parser { _localctx = new TypeStrContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 392; + this.state = 400; this.match(QuintParser.T__28); } break; @@ -1547,7 +1571,7 @@ export class QuintParser extends Parser { _localctx = new TypeBoolContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 393; + this.state = 401; this.match(QuintParser.T__29); } break; @@ -1557,7 +1581,7 @@ export class QuintParser extends Parser { _localctx = new TypeVarCaseContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 394; + this.state = 402; this.typeVar(); } break; @@ -1567,7 +1591,7 @@ export class QuintParser extends Parser { _localctx = new TypeConstContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 395; + this.state = 403; this.qualId(); } break; @@ -1577,19 +1601,19 @@ export class QuintParser extends Parser { _localctx = new TypeParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 396; + this.state = 404; this.match(QuintParser.LPAREN); - this.state = 397; + this.state = 405; this.type(0); - this.state = 398; + this.state = 406; this.match(QuintParser.RPAREN); } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 422; + this.state = 430; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 41, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 44, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { if (this._parseListeners != null) { @@ -1597,20 +1621,20 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 420; + this.state = 428; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 40, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 43, this._ctx) ) { case 1: { _localctx = new TypeFunContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 402; + this.state = 410; if (!(this.precpred(this._ctx, 14))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); } - this.state = 403; + this.state = 411; this.match(QuintParser.T__25); - this.state = 404; + this.state = 412; this.type(14); } break; @@ -1619,13 +1643,13 @@ export class QuintParser extends Parser { { _localctx = new TypeOperContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 405; + this.state = 413; if (!(this.precpred(this._ctx, 13))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 13)"); } - this.state = 406; + this.state = 414; this.match(QuintParser.T__26); - this.state = 407; + this.state = 415; this.type(13); } break; @@ -1635,34 +1659,34 @@ export class QuintParser extends Parser { _localctx = new TypeAppContext(new TypeContext(_parentctx, _parentState)); (_localctx as TypeAppContext)._typeCtor = _prevctx; this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 408; + this.state = 416; if (!(this.precpred(this._ctx, 1))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 1)"); } { - this.state = 409; + this.state = 417; this.match(QuintParser.T__10); - this.state = 410; + this.state = 418; (_localctx as TypeAppContext)._type = this.type(0); (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); - this.state = 415; + this.state = 423; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 411; + this.state = 419; this.match(QuintParser.T__7); - this.state = 412; + this.state = 420; (_localctx as TypeAppContext)._type = this.type(0); (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); } } - this.state = 417; + this.state = 425; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 418; + this.state = 426; this.match(QuintParser.T__11); } } @@ -1670,9 +1694,9 @@ export class QuintParser extends Parser { } } } - this.state = 424; + this.state = 432; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 41, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 44, this._ctx); } } } @@ -1697,7 +1721,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 425; + this.state = 433; this.match(QuintParser.LOW_ID); } } @@ -1721,7 +1745,7 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 40, QuintParser.RULE_row); try { let _alt: number; - this.state = 448; + this.state = 456; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: @@ -1729,50 +1753,50 @@ export class QuintParser extends Parser { this.enterOuterAlt(_localctx, 1); { { - this.state = 427; + this.state = 435; this.rowLabel(); - this.state = 428; + this.state = 436; this.match(QuintParser.T__4); - this.state = 429; + this.state = 437; this.type(0); } - this.state = 438; + this.state = 446; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 42, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 45, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 431; + this.state = 439; this.match(QuintParser.T__7); - this.state = 432; + this.state = 440; this.rowLabel(); - this.state = 433; + this.state = 441; this.match(QuintParser.T__4); - this.state = 434; + this.state = 442; this.type(0); } } } - this.state = 440; + this.state = 448; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 42, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 45, this._ctx); } - this.state = 444; + this.state = 452; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__7: { - this.state = 441; + this.state = 449; this.match(QuintParser.T__7); } break; case QuintParser.T__12: { - this.state = 442; + this.state = 450; this.match(QuintParser.T__12); { - this.state = 443; + this.state = 451; _localctx._rowVar = this.identifier(); } } @@ -1787,10 +1811,10 @@ export class QuintParser extends Parser { case QuintParser.T__12: this.enterOuterAlt(_localctx, 2); { - this.state = 446; + this.state = 454; this.match(QuintParser.T__12); { - this.state = 447; + this.state = 455; _localctx._rowVar = this.identifier(); } } @@ -1820,7 +1844,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 450; + this.state = 458; this.simpleId("record"); } } @@ -1858,16 +1882,16 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 602; + this.state = 610; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 62, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 65, this._ctx) ) { case 1: { _localctx = new LambdaConsContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 453; + this.state = 461; this.lambda(); } break; @@ -1877,21 +1901,21 @@ export class QuintParser extends Parser { _localctx = new OperAppContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 454; + this.state = 462; this.normalCallName(); - this.state = 455; + this.state = 463; this.match(QuintParser.LPAREN); - this.state = 457; + this.state = 465; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 456; + this.state = 464; this.argList(); } } - this.state = 459; + this.state = 467; this.match(QuintParser.RPAREN); } break; @@ -1901,9 +1925,9 @@ export class QuintParser extends Parser { _localctx = new UminusContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 461; + this.state = 469; this.match(QuintParser.MINUS); - this.state = 462; + this.state = 470; this.expr(25); } break; @@ -1913,13 +1937,13 @@ export class QuintParser extends Parser { _localctx = new AsgnContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 463; + this.state = 471; this.qualId(); - this.state = 464; + this.state = 472; this.match(QuintParser.T__31); - this.state = 465; + this.state = 473; this.match(QuintParser.ASGN); - this.state = 466; + this.state = 474; this.expr(21); } break; @@ -1929,41 +1953,41 @@ export class QuintParser extends Parser { _localctx = new AndExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 468; + this.state = 476; this.match(QuintParser.AND); - this.state = 469; + this.state = 477; this.match(QuintParser.T__1); - this.state = 470; + this.state = 478; this.expr(0); - this.state = 475; + this.state = 483; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 46, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 471; + this.state = 479; this.match(QuintParser.T__7); - this.state = 472; + this.state = 480; this.expr(0); } } } - this.state = 477; + this.state = 485; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 46, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); } - this.state = 479; + this.state = 487; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 478; + this.state = 486; this.match(QuintParser.T__7); } } - this.state = 481; + this.state = 489; this.match(QuintParser.T__2); } break; @@ -1973,41 +1997,41 @@ export class QuintParser extends Parser { _localctx = new OrExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 483; + this.state = 491; this.match(QuintParser.OR); - this.state = 484; + this.state = 492; this.match(QuintParser.T__1); - this.state = 485; + this.state = 493; this.expr(0); - this.state = 490; + this.state = 498; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 48, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 51, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 486; + this.state = 494; this.match(QuintParser.T__7); - this.state = 487; + this.state = 495; this.expr(0); } } } - this.state = 492; + this.state = 500; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 48, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 51, this._ctx); } - this.state = 494; + this.state = 502; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 493; + this.state = 501; this.match(QuintParser.T__7); } } - this.state = 496; + this.state = 504; this.match(QuintParser.T__2); } break; @@ -2017,7 +2041,7 @@ export class QuintParser extends Parser { _localctx = new MatchContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 498; + this.state = 506; this.matchSumExpr(); } break; @@ -2027,41 +2051,41 @@ export class QuintParser extends Parser { _localctx = new ActionAllContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 499; + this.state = 507; this.match(QuintParser.T__32); - this.state = 500; + this.state = 508; this.match(QuintParser.T__1); - this.state = 501; + this.state = 509; this.expr(0); - this.state = 506; + this.state = 514; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 50, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 53, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 502; + this.state = 510; this.match(QuintParser.T__7); - this.state = 503; + this.state = 511; this.expr(0); } } } - this.state = 508; + this.state = 516; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 50, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 53, this._ctx); } - this.state = 510; + this.state = 518; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 509; + this.state = 517; this.match(QuintParser.T__7); } } - this.state = 512; + this.state = 520; this.match(QuintParser.T__2); } break; @@ -2071,41 +2095,41 @@ export class QuintParser extends Parser { _localctx = new ActionAnyContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 514; + this.state = 522; this.match(QuintParser.T__33); - this.state = 515; + this.state = 523; this.match(QuintParser.T__1); - this.state = 516; + this.state = 524; this.expr(0); - this.state = 521; + this.state = 529; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 52, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 55, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 517; + this.state = 525; this.match(QuintParser.T__7); - this.state = 518; + this.state = 526; this.expr(0); } } } - this.state = 523; + this.state = 531; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 52, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 55, this._ctx); } - this.state = 525; + this.state = 533; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 524; + this.state = 532; this.match(QuintParser.T__7); } } - this.state = 527; + this.state = 535; this.match(QuintParser.T__2); } break; @@ -2115,31 +2139,31 @@ export class QuintParser extends Parser { _localctx = new LiteralOrIdContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 533; + this.state = 541; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 529; + this.state = 537; this.qualId(); } break; case QuintParser.INT: { - this.state = 530; + this.state = 538; this.match(QuintParser.INT); } break; case QuintParser.BOOL: { - this.state = 531; + this.state = 539; this.match(QuintParser.BOOL); } break; case QuintParser.STRING: { - this.state = 532; + this.state = 540; this.match(QuintParser.STRING); } break; @@ -2154,43 +2178,43 @@ export class QuintParser extends Parser { _localctx = new TupleContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 535; + this.state = 543; this.match(QuintParser.LPAREN); - this.state = 536; + this.state = 544; this.expr(0); - this.state = 537; + this.state = 545; this.match(QuintParser.T__7); - this.state = 538; + this.state = 546; this.expr(0); - this.state = 543; + this.state = 551; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 55, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 58, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 539; + this.state = 547; this.match(QuintParser.T__7); - this.state = 540; + this.state = 548; this.expr(0); } } } - this.state = 545; + this.state = 553; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 55, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 58, this._ctx); } - this.state = 547; + this.state = 555; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 546; + this.state = 554; this.match(QuintParser.T__7); } } - this.state = 549; + this.state = 557; this.match(QuintParser.RPAREN); } break; @@ -2200,39 +2224,39 @@ export class QuintParser extends Parser { _localctx = new RecordContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 551; + this.state = 559; this.match(QuintParser.T__1); - this.state = 552; + this.state = 560; this.recElem(); - this.state = 557; + this.state = 565; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 57, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 60, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 553; + this.state = 561; this.match(QuintParser.T__7); - this.state = 554; + this.state = 562; this.recElem(); } } } - this.state = 559; + this.state = 567; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 57, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 60, this._ctx); } - this.state = 561; + this.state = 569; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 560; + this.state = 568; this.match(QuintParser.T__7); } } - this.state = 563; + this.state = 571; this.match(QuintParser.T__2); } break; @@ -2242,47 +2266,47 @@ export class QuintParser extends Parser { _localctx = new ListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 565; + this.state = 573; this.match(QuintParser.T__10); - this.state = 574; + this.state = 582; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 566; + this.state = 574; this.expr(0); - this.state = 571; + this.state = 579; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 59, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 62, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 567; + this.state = 575; this.match(QuintParser.T__7); - this.state = 568; + this.state = 576; this.expr(0); } } } - this.state = 573; + this.state = 581; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 59, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 62, this._ctx); } } } - this.state = 577; + this.state = 585; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 576; + this.state = 584; this.match(QuintParser.T__7); } } - this.state = 579; + this.state = 587; this.match(QuintParser.T__11); } break; @@ -2292,19 +2316,19 @@ export class QuintParser extends Parser { _localctx = new IfElseContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 580; + this.state = 588; this.match(QuintParser.T__34); - this.state = 581; + this.state = 589; this.match(QuintParser.LPAREN); - this.state = 582; + this.state = 590; this.expr(0); - this.state = 583; + this.state = 591; this.match(QuintParser.RPAREN); - this.state = 584; + this.state = 592; this.expr(0); - this.state = 585; + this.state = 593; this.match(QuintParser.T__35); - this.state = 586; + this.state = 594; this.expr(5); } break; @@ -2314,9 +2338,9 @@ export class QuintParser extends Parser { _localctx = new LetInContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 588; + this.state = 596; this.operDef(); - this.state = 589; + this.state = 597; this.expr(4); } break; @@ -2326,9 +2350,9 @@ export class QuintParser extends Parser { _localctx = new NondetContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 591; + this.state = 599; this.nondetOperDef(); - this.state = 592; + this.state = 600; this.expr(3); } break; @@ -2338,11 +2362,11 @@ export class QuintParser extends Parser { _localctx = new ParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 594; + this.state = 602; this.match(QuintParser.LPAREN); - this.state = 595; + this.state = 603; this.expr(0); - this.state = 596; + this.state = 604; this.match(QuintParser.RPAREN); } break; @@ -2352,19 +2376,19 @@ export class QuintParser extends Parser { _localctx = new BracesContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 598; + this.state = 606; this.match(QuintParser.T__1); - this.state = 599; + this.state = 607; this.expr(0); - this.state = 600; + this.state = 608; this.match(QuintParser.T__2); } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 653; + this.state = 661; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 66, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 69, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { if (this._parseListeners != null) { @@ -2372,20 +2396,20 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 651; + this.state = 659; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 65, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 68, this._ctx) ) { case 1: { _localctx = new PowContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 604; + this.state = 612; if (!(this.precpred(this._ctx, 26))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 26)"); } - this.state = 605; + this.state = 613; (_localctx as PowContext)._op = this.match(QuintParser.T__30); - this.state = 606; + this.state = 614; this.expr(26); } break; @@ -2394,11 +2418,11 @@ export class QuintParser extends Parser { { _localctx = new MultDivContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 607; + this.state = 615; if (!(this.precpred(this._ctx, 24))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 24)"); } - this.state = 608; + this.state = 616; (_localctx as MultDivContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & ((1 << (QuintParser.MUL - 51)) | (1 << (QuintParser.DIV - 51)) | (1 << (QuintParser.MOD - 51)))) !== 0))) { @@ -2411,7 +2435,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 609; + this.state = 617; this.expr(25); } break; @@ -2420,11 +2444,11 @@ export class QuintParser extends Parser { { _localctx = new PlusMinusContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 610; + this.state = 618; if (!(this.precpred(this._ctx, 23))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 23)"); } - this.state = 611; + this.state = 619; (_localctx as PlusMinusContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(_la === QuintParser.PLUS || _la === QuintParser.MINUS)) { @@ -2437,7 +2461,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 612; + this.state = 620; this.expr(24); } break; @@ -2446,11 +2470,11 @@ export class QuintParser extends Parser { { _localctx = new RelationsContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 613; + this.state = 621; if (!(this.precpred(this._ctx, 22))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 22)"); } - this.state = 614; + this.state = 622; (_localctx as RelationsContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 54)) & ~0x1F) === 0 && ((1 << (_la - 54)) & ((1 << (QuintParser.GT - 54)) | (1 << (QuintParser.LT - 54)) | (1 << (QuintParser.GE - 54)) | (1 << (QuintParser.LE - 54)) | (1 << (QuintParser.NE - 54)) | (1 << (QuintParser.EQ - 54)))) !== 0))) { @@ -2463,7 +2487,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 615; + this.state = 623; this.expr(23); } break; @@ -2472,13 +2496,13 @@ export class QuintParser extends Parser { { _localctx = new ErrorEqContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 616; + this.state = 624; if (!(this.precpred(this._ctx, 20))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 20)"); } - this.state = 617; + this.state = 625; this.match(QuintParser.ASGN); - this.state = 618; + this.state = 626; this.expr(21); const m = "[QNT006] unexpected '=', did you mean '=='?" @@ -2491,13 +2515,13 @@ export class QuintParser extends Parser { { _localctx = new AndContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 621; + this.state = 629; if (!(this.precpred(this._ctx, 18))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 18)"); } - this.state = 622; + this.state = 630; this.match(QuintParser.AND); - this.state = 623; + this.state = 631; this.expr(19); } break; @@ -2506,13 +2530,13 @@ export class QuintParser extends Parser { { _localctx = new OrContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 624; + this.state = 632; if (!(this.precpred(this._ctx, 16))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 16)"); } - this.state = 625; + this.state = 633; this.match(QuintParser.OR); - this.state = 626; + this.state = 634; this.expr(17); } break; @@ -2521,13 +2545,13 @@ export class QuintParser extends Parser { { _localctx = new IffContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 627; + this.state = 635; if (!(this.precpred(this._ctx, 15))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 15)"); } - this.state = 628; + this.state = 636; this.match(QuintParser.IFF); - this.state = 629; + this.state = 637; this.expr(16); } break; @@ -2536,13 +2560,13 @@ export class QuintParser extends Parser { { _localctx = new ImpliesContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 630; + this.state = 638; if (!(this.precpred(this._ctx, 14))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); } - this.state = 631; + this.state = 639; this.match(QuintParser.IMPLIES); - this.state = 632; + this.state = 640; this.expr(15); } break; @@ -2551,13 +2575,13 @@ export class QuintParser extends Parser { { _localctx = new PairContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 633; + this.state = 641; if (!(this.precpred(this._ctx, 8))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 8)"); } - this.state = 634; + this.state = 642; this.match(QuintParser.T__25); - this.state = 635; + this.state = 643; this.expr(9); } break; @@ -2566,32 +2590,32 @@ export class QuintParser extends Parser { { _localctx = new DotCallContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 636; + this.state = 644; if (!(this.precpred(this._ctx, 30))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 30)"); } - this.state = 637; + this.state = 645; this.match(QuintParser.T__21); - this.state = 638; + this.state = 646; this.nameAfterDot(); - this.state = 644; + this.state = 652; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 64, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 67, this._ctx) ) { case 1: { - this.state = 639; + this.state = 647; this.match(QuintParser.LPAREN); - this.state = 641; + this.state = 649; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 640; + this.state = 648; this.argList(); } } - this.state = 643; + this.state = 651; this.match(QuintParser.RPAREN); } break; @@ -2603,24 +2627,24 @@ export class QuintParser extends Parser { { _localctx = new ListAppContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 646; + this.state = 654; if (!(this.precpred(this._ctx, 27))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 27)"); } - this.state = 647; + this.state = 655; this.match(QuintParser.T__10); - this.state = 648; + this.state = 656; this.expr(0); - this.state = 649; + this.state = 657; this.match(QuintParser.T__11); } break; } } } - this.state = 655; + this.state = 663; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 66, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 69, this._ctx); } } } @@ -2646,43 +2670,43 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 656; + this.state = 664; this.match(QuintParser.MATCH); - this.state = 657; + this.state = 665; this.expr(0); - this.state = 658; + this.state = 666; this.match(QuintParser.T__1); - this.state = 660; + this.state = 668; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__12) { { - this.state = 659; + this.state = 667; this.match(QuintParser.T__12); } } - this.state = 662; + this.state = 670; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); - this.state = 667; + this.state = 675; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__12) { { { - this.state = 663; + this.state = 671; this.match(QuintParser.T__12); - this.state = 664; + this.state = 672; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); } } - this.state = 669; + this.state = 677; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 670; + this.state = 678; this.match(QuintParser.T__2); } } @@ -2707,28 +2731,28 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 674; + this.state = 682; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 672; + this.state = 680; _localctx._variantMatch = this.matchSumVariant(); } break; case QuintParser.T__36: { - this.state = 673; + this.state = 681; _localctx._wildCardMatch = this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 676; + this.state = 684; this.match(QuintParser.T__26); - this.state = 677; + this.state = 685; this.expr(0); } } @@ -2755,36 +2779,36 @@ export class QuintParser extends Parser { this.enterOuterAlt(_localctx, 1); { { - this.state = 679; + this.state = 687; _localctx._variantLabel = this.simpleId("variant label"); } - this.state = 686; + this.state = 694; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.LPAREN) { { - this.state = 680; + this.state = 688; this.match(QuintParser.LPAREN); - this.state = 683; + this.state = 691; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 681; + this.state = 689; _localctx._variantParam = this.simpleId("match case parameter"); } break; case QuintParser.T__36: { - this.state = 682; + this.state = 690; this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 685; + this.state = 693; this.match(QuintParser.RPAREN); } } @@ -2810,15 +2834,15 @@ export class QuintParser extends Parser { let _localctx: DeclarationOrExprContext = new DeclarationOrExprContext(this._ctx, this.state); this.enterRule(_localctx, 52, QuintParser.RULE_declarationOrExpr); try { - this.state = 697; + this.state = 705; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 72, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 75, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 688; + this.state = 696; this.declaration(); - this.state = 689; + this.state = 697; this.match(QuintParser.EOF); } break; @@ -2826,9 +2850,9 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 691; + this.state = 699; this.expr(0); - this.state = 692; + this.state = 700; this.match(QuintParser.EOF); } break; @@ -2836,9 +2860,9 @@ export class QuintParser extends Parser { case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 694; + this.state = 702; this.match(QuintParser.DOCCOMMENT); - this.state = 695; + this.state = 703; this.match(QuintParser.EOF); } break; @@ -2846,7 +2870,7 @@ export class QuintParser extends Parser { case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 696; + this.state = 704; this.match(QuintParser.EOF); } break; @@ -2871,13 +2895,13 @@ export class QuintParser extends Parser { let _localctx: LambdaContext = new LambdaContext(this._ctx, this.state); this.enterRule(_localctx, 54, QuintParser.RULE_lambda); try { - this.state = 701; + this.state = 709; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 73, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 76, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 699; + this.state = 707; this.lambdaUnsugared(); } break; @@ -2885,7 +2909,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 700; + this.state = 708; this.lambdaTupleSugar(); } break; @@ -2911,7 +2935,7 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 56, QuintParser.RULE_lambdaUnsugared); let _la: number; try { - this.state = 720; + this.state = 728; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: @@ -2919,42 +2943,42 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 703; + this.state = 711; this.parameter(); - this.state = 704; + this.state = 712; this.match(QuintParser.T__26); - this.state = 705; + this.state = 713; this.expr(0); } break; case QuintParser.LPAREN: this.enterOuterAlt(_localctx, 2); { - this.state = 707; + this.state = 715; this.match(QuintParser.LPAREN); - this.state = 708; + this.state = 716; this.parameter(); - this.state = 713; + this.state = 721; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 709; + this.state = 717; this.match(QuintParser.T__7); - this.state = 710; + this.state = 718; this.parameter(); } } - this.state = 715; + this.state = 723; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 716; + this.state = 724; this.match(QuintParser.RPAREN); - this.state = 717; + this.state = 725; this.match(QuintParser.T__26); - this.state = 718; + this.state = 726; this.expr(0); } break; @@ -2984,35 +3008,35 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 722; + this.state = 730; this.match(QuintParser.LPAREN); - this.state = 723; + this.state = 731; this.match(QuintParser.LPAREN); - this.state = 724; + this.state = 732; this.parameter(); - this.state = 727; + this.state = 735; this._errHandler.sync(this); _la = this._input.LA(1); do { { { - this.state = 725; + this.state = 733; this.match(QuintParser.T__7); - this.state = 726; + this.state = 734; this.parameter(); } } - this.state = 729; + this.state = 737; this._errHandler.sync(this); _la = this._input.LA(1); } while (_la === QuintParser.T__7); - this.state = 731; + this.state = 739; this.match(QuintParser.RPAREN); - this.state = 732; + this.state = 740; this.match(QuintParser.RPAREN); - this.state = 733; + this.state = 741; this.match(QuintParser.T__26); - this.state = 734; + this.state = 742; this.expr(0); } } @@ -3035,13 +3059,13 @@ export class QuintParser extends Parser { let _localctx: IdentOrHoleContext = new IdentOrHoleContext(this._ctx, this.state); this.enterRule(_localctx, 60, QuintParser.RULE_identOrHole); try { - this.state = 738; + this.state = 746; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: this.enterOuterAlt(_localctx, 1); { - this.state = 736; + this.state = 744; this.match(QuintParser.T__36); } break; @@ -3049,7 +3073,7 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 737; + this.state = 745; this.qualId(); } break; @@ -3078,7 +3102,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 740; + this.state = 748; this.identOrHole(); } } @@ -3101,13 +3125,13 @@ export class QuintParser extends Parser { let _localctx: IdentOrStarContext = new IdentOrStarContext(this._ctx, this.state); this.enterRule(_localctx, 64, QuintParser.RULE_identOrStar); try { - this.state = 744; + this.state = 752; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.MUL: this.enterOuterAlt(_localctx, 1); { - this.state = 742; + this.state = 750; this.match(QuintParser.MUL); } break; @@ -3115,7 +3139,7 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 743; + this.state = 751; this.qualId(); } break; @@ -3145,21 +3169,21 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 746; + this.state = 754; this.expr(0); - this.state = 751; + this.state = 759; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 747; + this.state = 755; this.match(QuintParser.T__7); - this.state = 748; + this.state = 756; this.expr(0); } } - this.state = 753; + this.state = 761; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -3184,27 +3208,27 @@ export class QuintParser extends Parser { let _localctx: RecElemContext = new RecElemContext(this._ctx, this.state); this.enterRule(_localctx, 68, QuintParser.RULE_recElem); try { - this.state = 760; + this.state = 768; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 754; + this.state = 762; this.simpleId("record"); - this.state = 755; + this.state = 763; this.match(QuintParser.T__4); - this.state = 756; + this.state = 764; this.expr(0); } break; case QuintParser.T__37: this.enterOuterAlt(_localctx, 2); { - this.state = 758; + this.state = 766; this.match(QuintParser.T__37); - this.state = 759; + this.state = 767; this.expr(0); } break; @@ -3232,14 +3256,14 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 70, QuintParser.RULE_normalCallName); let _la: number; try { - this.state = 764; + this.state = 772; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 762; + this.state = 770; this.qualId(); } break; @@ -3252,7 +3276,7 @@ export class QuintParser extends Parser { case QuintParser.LIST: this.enterOuterAlt(_localctx, 2); { - this.state = 763; + this.state = 771; _localctx._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 43)) & ~0x1F) === 0 && ((1 << (_la - 43)) & ((1 << (QuintParser.AND - 43)) | (1 << (QuintParser.OR - 43)) | (1 << (QuintParser.IFF - 43)) | (1 << (QuintParser.IMPLIES - 43)) | (1 << (QuintParser.MAP - 43)) | (1 << (QuintParser.SET - 43)) | (1 << (QuintParser.LIST - 43)))) !== 0))) { @@ -3291,14 +3315,14 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 72, QuintParser.RULE_nameAfterDot); let _la: number; try { - this.state = 768; + this.state = 776; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 766; + this.state = 774; this.qualId(); } break; @@ -3308,7 +3332,7 @@ export class QuintParser extends Parser { case QuintParser.IMPLIES: this.enterOuterAlt(_localctx, 2); { - this.state = 767; + this.state = 775; _localctx._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 43)) & ~0x1F) === 0 && ((1 << (_la - 43)) & ((1 << (QuintParser.AND - 43)) | (1 << (QuintParser.OR - 43)) | (1 << (QuintParser.IFF - 43)) | (1 << (QuintParser.IMPLIES - 43)))) !== 0))) { @@ -3349,7 +3373,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 770; + this.state = 778; _la = this._input.LA(1); if (!(((((_la - 31)) & ~0x1F) === 0 && ((1 << (_la - 31)) & ((1 << (QuintParser.T__30 - 31)) | (1 << (QuintParser.AND - 31)) | (1 << (QuintParser.OR - 31)) | (1 << (QuintParser.IFF - 31)) | (1 << (QuintParser.IMPLIES - 31)) | (1 << (QuintParser.PLUS - 31)) | (1 << (QuintParser.MINUS - 31)) | (1 << (QuintParser.MUL - 31)) | (1 << (QuintParser.DIV - 31)) | (1 << (QuintParser.MOD - 31)) | (1 << (QuintParser.GT - 31)) | (1 << (QuintParser.LT - 31)) | (1 << (QuintParser.GE - 31)) | (1 << (QuintParser.LE - 31)) | (1 << (QuintParser.NE - 31)) | (1 << (QuintParser.EQ - 31)))) !== 0))) { this._errHandler.recoverInline(this); @@ -3385,7 +3409,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 772; + this.state = 780; _la = this._input.LA(1); if (!(((((_la - 40)) & ~0x1F) === 0 && ((1 << (_la - 40)) & ((1 << (QuintParser.STRING - 40)) | (1 << (QuintParser.BOOL - 40)) | (1 << (QuintParser.INT - 40)))) !== 0))) { this._errHandler.recoverInline(this); @@ -3421,25 +3445,25 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 774; + this.state = 782; this.identifier(); - this.state = 779; + this.state = 787; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 83, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 86, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 775; + this.state = 783; this.match(QuintParser.T__38); - this.state = 776; + this.state = 784; this.identifier(); } } } - this.state = 781; + this.state = 789; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 83, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 86, this._ctx); } } } @@ -3462,13 +3486,13 @@ export class QuintParser extends Parser { let _localctx: SimpleIdContext = new SimpleIdContext(this._ctx, this.state, context); this.enterRule(_localctx, 80, QuintParser.RULE_simpleId); try { - this.state = 786; + this.state = 794; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 84, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 87, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 782; + this.state = 790; this.identifier(); } break; @@ -3476,7 +3500,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 783; + this.state = 791; _localctx._qualId = this.qualId(); const err = quintErrorToString( @@ -3512,7 +3536,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 788; + this.state = 796; _la = this._input.LA(1); if (!(_la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID)) { this._errHandler.recoverInline(this); @@ -3607,7 +3631,7 @@ export class QuintParser extends Parser { private static readonly _serializedATNSegments: number = 2; private static readonly _serializedATNSegment0: string = - "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03H\u0319\x04\x02" + + "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03H\u0321\x04\x02" + "\t\x02\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06\x04\x07" + "\t\x07\x04\b\t\b\x04\t\t\t\x04\n\t\n\x04\v\t\v\x04\f\t\f\x04\r\t\r\x04" + "\x0E\t\x0E\x04\x0F\t\x0F\x04\x10\t\x10\x04\x11\t\x11\x04\x12\t\x12\x04" + @@ -3622,99 +3646,100 @@ export class QuintParser extends Parser { "\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05" + "\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x05\x05\x8B\n\x05\x03" + "\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x07\x06\x93\n\x06\f\x06\x0E" + - "\x06\x96\v\x06\x05\x06\x98\n\x06\x03\x06\x03\x06\x03\x06\x05\x06\x9D\n" + - "\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03" + - "\x06\x03\x06\x03\x06\x07\x06\xAA\n\x06\f\x06\x0E\x06\xAD\v\x06\x03\x06" + - "\x03\x06\x03\x06\x03\x06\x05\x06\xB3\n\x06\x03\x06\x03\x06\x05\x06\xB7" + - "\n\x06\x03\x06\x05\x06\xBA\n\x06\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07" + - "\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x05\x07\xC8\n" + - "\x07\x03\b\x03\b\x03\b\x03\b\x03\b\x07\b\xCF\n\b\f\b\x0E\b\xD2\v\b\x03" + - "\b\x03\b\x05\b\xD6\n\b\x03\t\x05\t\xD9\n\t\x03\t\x03\t\x03\t\x07\t\xDE" + - "\n\t\f\t\x0E\t\xE1\v\t\x03\n\x03\n\x03\n\x03\n\x03\n\x05\n\xE8\n\n\x03" + - "\v\x03\v\x03\v\x03\v\x05\v\xEE\n\v\x03\v\x03\v\x03\v\x05\v\xF3\n\v\x03" + - "\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x05\f\xFE\n\f\x03\r" + - "\x03\r\x03\r\x03\r\x03\r\x03\r\x05\r\u0106\n\r\x03\r\x03\r\x03\r\x03\r" + - "\x05\r\u010C\n\r\x03\r\x03\r\x05\r\u0110\n\r\x05\r\u0112\n\r\x03\x0E\x03" + - "\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x05\x0E\u011D" + - "\n\x0E\x05\x0E\u011F\n\x0E\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03" + - "\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x07\x0F\u012C\n\x0F\f\x0F" + - "\x0E\x0F\u012F\v\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x05\x0F\u0136" + - "\n\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F" + - "\x03\x0F\x03\x0F\x03\x0F\x07\x0F\u0143\n\x0F\f\x0F\x0E\x0F\u0146\v\x0F" + - "\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x05\x0F\u014D\n\x0F\x05\x0F\u014F" + - "\n\x0F\x03\x10\x03\x10\x03\x11\x03\x11\x03\x12\x03\x12\x03\x13\x03\x13" + - "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u015E\n\x14\f\x14\x0E" + - "\x14\u0161\v\x14\x05\x14\u0163\n\x14\x03\x14\x05\x14\u0166\n\x14\x03\x14" + - "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + - "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + - "\x07\x14\u017B\n\x14\f\x14\x0E\x14\u017E\v\x14\x03\x14\x05\x14\u0181\n" + - "\x14\x03\x14\x03\x14\x03\x14\x03\x14\x05\x14\u0187\n\x14\x03\x14\x03\x14" + - "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x05\x14" + - "\u0193\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03" + - "\x14\x03\x14\x03\x14\x03\x14\x07\x14\u01A0\n\x14\f\x14\x0E\x14\u01A3\v" + - "\x14\x03\x14\x03\x14\x07\x14\u01A7\n\x14\f\x14\x0E\x14\u01AA\v\x14\x03" + + "\x06\x96\v\x06\x05\x06\x98\n\x06\x03\x06\x05\x06\x9B\n\x06\x03\x06\x03" + + "\x06\x05\x06\x9F\n\x06\x03\x06\x03\x06\x05\x06\xA3\n\x06\x03\x06\x05\x06" + + "\xA6\n\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03" + + "\x06\x03\x06\x03\x06\x03\x06\x07\x06\xB3\n\x06\f\x06\x0E\x06\xB6\v\x06" + + "\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x05\x06\xBD\n\x06\x03\x06\x05" + + "\x06\xC0\n\x06\x05\x06\xC2\n\x06\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07" + + "\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x05\x07\xD0\n" + + "\x07\x03\b\x03\b\x03\b\x03\b\x03\b\x07\b\xD7\n\b\f\b\x0E\b\xDA\v\b\x03" + + "\b\x03\b\x05\b\xDE\n\b\x03\t\x05\t\xE1\n\t\x03\t\x03\t\x03\t\x07\t\xE6" + + "\n\t\f\t\x0E\t\xE9\v\t\x03\n\x03\n\x03\n\x03\n\x03\n\x05\n\xF0\n\n\x03" + + "\v\x03\v\x03\v\x03\v\x05\v\xF6\n\v\x03\v\x03\v\x03\v\x05\v\xFB\n\v\x03" + + "\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x05\f\u0106\n\f\x03" + + "\r\x03\r\x03\r\x03\r\x03\r\x03\r\x05\r\u010E\n\r\x03\r\x03\r\x03\r\x03" + + "\r\x05\r\u0114\n\r\x03\r\x03\r\x05\r\u0118\n\r\x05\r\u011A\n\r\x03\x0E" + + "\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x05\x0E" + + "\u0125\n\x0E\x05\x0E\u0127\n\x0E\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F" + + "\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x07\x0F\u0134\n\x0F\f" + + "\x0F\x0E\x0F\u0137\v\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x05\x0F" + + "\u013E\n\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03" + + "\x0F\x03\x0F\x03\x0F\x03\x0F\x07\x0F\u014B\n\x0F\f\x0F\x0E\x0F\u014E\v" + + "\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x05\x0F\u0155\n\x0F\x05\x0F" + + "\u0157\n\x0F\x03\x10\x03\x10\x03\x11\x03\x11\x03\x12\x03\x12\x03\x13\x03" + + "\x13\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u0166\n\x14\f\x14" + + "\x0E\x14\u0169\v\x14\x05\x14\u016B\n\x14\x03\x14\x05\x14\u016E\n\x14\x03" + + "\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03" + + "\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03" + + "\x14\x07\x14\u0183\n\x14\f\x14\x0E\x14\u0186\v\x14\x03\x14\x05\x14\u0189" + + "\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x05\x14\u018F\n\x14\x03\x14\x03" + + "\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x05" + + "\x14\u019B\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + + "\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u01A8\n\x14\f\x14\x0E\x14\u01AB" + + "\v\x14\x03\x14\x03\x14\x07\x14\u01AF\n\x14\f\x14\x0E\x14\u01B2\v\x14\x03" + "\x15\x03\x15\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03" + - "\x16\x03\x16\x07\x16\u01B7\n\x16\f\x16\x0E\x16\u01BA\v\x16\x03\x16\x03" + - "\x16\x03\x16\x05\x16\u01BF\n\x16\x03\x16\x03\x16\x05\x16\u01C3\n\x16\x03" + - "\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u01CC\n\x18" + + "\x16\x03\x16\x07\x16\u01BF\n\x16\f\x16\x0E\x16\u01C2\v\x16\x03\x16\x03" + + "\x16\x03\x16\x05\x16\u01C7\n\x16\x03\x16\x03\x16\x05\x16\u01CB\n\x16\x03" + + "\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u01D4\n\x18" + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u01DC\n\x18\f\x18\x0E" + - "\x18\u01DF\v\x18\x03\x18\x05\x18\u01E2\n\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x07\x18\u01EB\n\x18\f\x18\x0E\x18\u01EE\v" + - "\x18\x03\x18\x05\x18\u01F1\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x07\x18\u01FB\n\x18\f\x18\x0E\x18\u01FE\v\x18" + - "\x03\x18\x05\x18\u0201\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x07\x18\u020A\n\x18\f\x18\x0E\x18\u020D\v\x18\x03\x18\x05" + - "\x18\u0210\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18" + - "\u0218\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0220" + - "\n\x18\f\x18\x0E\x18\u0223\v\x18\x03\x18\x05\x18\u0226\n\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u022E\n\x18\f\x18\x0E\x18" + - "\u0231\v\x18\x03\x18\x05\x18\u0234\n\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x07\x18\u023C\n\x18\f\x18\x0E\x18\u023F\v\x18\x05\x18" + - "\u0241\n\x18\x03\x18\x05\x18\u0244\n\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u01E4\n\x18\f\x18\x0E" + + "\x18\u01E7\v\x18\x03\x18\x05\x18\u01EA\n\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x07\x18\u01F3\n\x18\f\x18\x0E\x18\u01F6\v" + + "\x18\x03\x18\x05\x18\u01F9\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x07\x18\u0203\n\x18\f\x18\x0E\x18\u0206\v\x18" + + "\x03\x18\x05\x18\u0209\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x07\x18\u0212\n\x18\f\x18\x0E\x18\u0215\v\x18\x03\x18\x05" + + "\x18\u0218\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18" + + "\u0220\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0228" + + "\n\x18\f\x18\x0E\x18\u022B\v\x18\x03\x18\x05\x18\u022E\n\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0236\n\x18\f\x18\x0E\x18" + + "\u0239\v\x18\x03\x18\x05\x18\u023C\n\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x07\x18\u0244\n\x18\f\x18\x0E\x18\u0247\v\x18\x05\x18" + + "\u0249\n\x18\x03\x18\x05\x18\u024C\n\x18\x03\x18\x03\x18\x03\x18\x03\x18" + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x05\x18\u025D\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x03\x18\x05\x18\u0265\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u0284\n\x18\x03\x18\x05\x18" + - "\u0287\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u028E\n\x18" + - "\f\x18\x0E\x18\u0291\v\x18\x03\x19\x03\x19\x03\x19\x03\x19\x05\x19\u0297" + - "\n\x19\x03\x19\x03\x19\x03\x19\x07\x19\u029C\n\x19\f\x19\x0E\x19\u029F" + - "\v\x19\x03\x19\x03\x19\x03\x1A\x03\x1A\x05\x1A\u02A5\n\x1A\x03\x1A\x03" + - "\x1A\x03\x1A\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x05\x1B\u02AE\n\x1B\x03\x1B" + - "\x05\x1B\u02B1\n\x1B\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03" + - "\x1C\x03\x1C\x03\x1C\x05\x1C\u02BC\n\x1C\x03\x1D\x03\x1D\x05\x1D\u02C0" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u028C\n\x18\x03\x18\x05\x18" + + "\u028F\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0296\n\x18" + + "\f\x18\x0E\x18\u0299\v\x18\x03\x19\x03\x19\x03\x19\x03\x19\x05\x19\u029F" + + "\n\x19\x03\x19\x03\x19\x03\x19\x07\x19\u02A4\n\x19\f\x19\x0E\x19\u02A7" + + "\v\x19\x03\x19\x03\x19\x03\x1A\x03\x1A\x05\x1A\u02AD\n\x1A\x03\x1A\x03" + + "\x1A\x03\x1A\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x05\x1B\u02B6\n\x1B\x03\x1B" + + "\x05\x1B\u02B9\n\x1B\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03" + + "\x1C\x03\x1C\x03\x1C\x05\x1C\u02C4\n\x1C\x03\x1D\x03\x1D\x05\x1D\u02C8" + "\n\x1D\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E" + - "\x07\x1E\u02CA\n\x1E\f\x1E\x0E\x1E\u02CD\v\x1E\x03\x1E\x03\x1E\x03\x1E" + - "\x03\x1E\x05\x1E\u02D3\n\x1E\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x06" + - "\x1F\u02DA\n\x1F\r\x1F\x0E\x1F\u02DB\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03" + - "\x1F\x03 \x03 \x05 \u02E5\n \x03!\x03!\x03\"\x03\"\x05\"\u02EB\n\"\x03" + - "#\x03#\x03#\x07#\u02F0\n#\f#\x0E#\u02F3\v#\x03$\x03$\x03$\x03$\x03$\x03" + - "$\x05$\u02FB\n$\x03%\x03%\x05%\u02FF\n%\x03&\x03&\x05&\u0303\n&\x03\'" + - "\x03\'\x03(\x03(\x03)\x03)\x03)\x07)\u030C\n)\f)\x0E)\u030F\v)\x03*\x03" + - "*\x03*\x03*\x05*\u0315\n*\x03+\x03+\x03+\x02\x02\x04&.,\x02\x02\x04\x02" + + "\x07\x1E\u02D2\n\x1E\f\x1E\x0E\x1E\u02D5\v\x1E\x03\x1E\x03\x1E\x03\x1E" + + "\x03\x1E\x05\x1E\u02DB\n\x1E\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x06" + + "\x1F\u02E2\n\x1F\r\x1F\x0E\x1F\u02E3\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03" + + "\x1F\x03 \x03 \x05 \u02ED\n \x03!\x03!\x03\"\x03\"\x05\"\u02F3\n\"\x03" + + "#\x03#\x03#\x07#\u02F8\n#\f#\x0E#\u02FB\v#\x03$\x03$\x03$\x03$\x03$\x03" + + "$\x05$\u0303\n$\x03%\x03%\x05%\u0307\n%\x03&\x03&\x05&\u030B\n&\x03\'" + + "\x03\'\x03(\x03(\x03)\x03)\x03)\x07)\u0314\n)\f)\x0E)\u0317\v)\x03*\x03" + + "*\x03*\x03*\x05*\u031D\n*\x03+\x03+\x03+\x02\x02\x04&.,\x02\x02\x04\x02" + "\x06\x02\b\x02\n\x02\f\x02\x0E\x02\x10\x02\x12\x02\x14\x02\x16\x02\x18" + "\x02\x1A\x02\x1C\x02\x1E\x02 \x02\"\x02$\x02&\x02(\x02*\x02,\x02.\x02" + "0\x022\x024\x026\x028\x02:\x02<\x02>\x02@\x02B\x02D\x02F\x02H\x02J\x02" + "L\x02N\x02P\x02R\x02T\x02\x02\n\x03\x0257\x03\x0234\x03\x028=\x04\x02" + - "-1AB\x03\x02-0\x05\x02!!-03=\x03\x02*,\x03\x02CD\x02\u037A\x02W\x03\x02" + + "-1AB\x03\x02-0\x05\x02!!-03=\x03\x02*,\x03\x02CD\x02\u0383\x02W\x03\x02" + "\x02\x02\x04`\x03\x02\x02\x02\x06q\x03\x02\x02\x02\b\x8A\x03\x02\x02\x02" + - "\n\x8C\x03\x02\x02\x02\f\xC7\x03\x02\x02\x02\x0E\xC9\x03\x02\x02\x02\x10" + - "\xD8\x03\x02\x02\x02\x12\xE2\x03\x02\x02\x02\x14\xE9\x03\x02\x02\x02\x16" + - "\xFD\x03\x02\x02\x02\x18\u0111\x03\x02\x02\x02\x1A\u011E\x03\x02\x02\x02" + - "\x1C\u014E\x03\x02\x02\x02\x1E\u0150\x03\x02\x02\x02 \u0152\x03\x02\x02" + - "\x02\"\u0154\x03\x02\x02\x02$\u0156\x03\x02\x02\x02&\u0192\x03\x02\x02" + - "\x02(\u01AB\x03\x02\x02\x02*\u01C2\x03\x02\x02\x02,\u01C4\x03\x02\x02" + - "\x02.\u025C\x03\x02\x02\x020\u0292\x03\x02\x02\x022\u02A4\x03\x02\x02" + - "\x024\u02A9\x03\x02\x02\x026\u02BB\x03\x02\x02\x028\u02BF\x03\x02\x02" + - "\x02:\u02D2\x03\x02\x02\x02<\u02D4\x03\x02\x02\x02>\u02E4\x03\x02\x02" + - "\x02@\u02E6\x03\x02\x02\x02B\u02EA\x03\x02\x02\x02D\u02EC\x03\x02\x02" + - "\x02F\u02FA\x03\x02\x02\x02H\u02FE\x03\x02\x02\x02J\u0302\x03\x02\x02" + - "\x02L\u0304\x03\x02\x02\x02N\u0306\x03\x02\x02\x02P\u0308\x03\x02\x02" + - "\x02R\u0314\x03\x02\x02\x02T\u0316\x03\x02\x02\x02VX\x05\x04\x03\x02W" + - "V\x03\x02\x02\x02XY\x03\x02\x02\x02YW\x03\x02\x02\x02YZ\x03\x02\x02\x02" + + "\n\xC1\x03\x02\x02\x02\f\xCF\x03\x02\x02\x02\x0E\xD1\x03\x02\x02\x02\x10" + + "\xE0\x03\x02\x02\x02\x12\xEA\x03\x02\x02\x02\x14\xF1\x03\x02\x02\x02\x16" + + "\u0105\x03\x02\x02\x02\x18\u0119\x03\x02\x02\x02\x1A\u0126\x03\x02\x02" + + "\x02\x1C\u0156\x03\x02\x02\x02\x1E\u0158\x03\x02\x02\x02 \u015A\x03\x02" + + "\x02\x02\"\u015C\x03\x02\x02\x02$\u015E\x03\x02\x02\x02&\u019A\x03\x02" + + "\x02\x02(\u01B3\x03\x02\x02\x02*\u01CA\x03\x02\x02\x02,\u01CC\x03\x02" + + "\x02\x02.\u0264\x03\x02\x02\x020\u029A\x03\x02\x02\x022\u02AC\x03\x02" + + "\x02\x024\u02B1\x03\x02\x02\x026\u02C3\x03\x02\x02\x028\u02C7\x03\x02" + + "\x02\x02:\u02DA\x03\x02\x02\x02<\u02DC\x03\x02\x02\x02>\u02EC\x03\x02" + + "\x02\x02@\u02EE\x03\x02\x02\x02B\u02F2\x03\x02\x02\x02D\u02F4\x03\x02" + + "\x02\x02F\u0302\x03\x02\x02\x02H\u0306\x03\x02\x02\x02J\u030A\x03\x02" + + "\x02\x02L\u030C\x03\x02\x02\x02N\u030E\x03\x02\x02\x02P\u0310\x03\x02" + + "\x02\x02R\u031C\x03\x02\x02\x02T\u031E\x03\x02\x02\x02VX\x05\x04\x03\x02" + + "WV\x03\x02\x02\x02XY\x03\x02\x02\x02YW\x03\x02\x02\x02YZ\x03\x02\x02\x02" + "Z[\x03\x02\x02\x02[\\\x07\x02\x02\x03\\\x03\x03\x02\x02\x02]_\x07E\x02" + "\x02^]\x03\x02\x02\x02_b\x03\x02\x02\x02`^\x03\x02\x02\x02`a\x03\x02\x02" + "\x02ac\x03\x02\x02\x02b`\x03\x02\x02\x02cd\x07\x03\x02\x02de\x05P)\x02" + @@ -3731,299 +3756,303 @@ export class QuintParser extends Parser { "\x02\x89\x8B\x05\x1A\x0E\x02\x8Av\x03\x02\x02\x02\x8A{\x03\x02\x02\x02" + "\x8A\x80\x03\x02\x02\x02\x8A\x85\x03\x02\x02\x02\x8A\x86\x03\x02\x02\x02" + "\x8A\x87\x03\x02\x02\x02\x8A\x88\x03\x02\x02\x02\x8A\x89\x03\x02\x02\x02" + - "\x8B\t\x03\x02\x02\x02\x8C\x8D\x05\x16\f\x02\x8D\xB2\x05H%\x02\x8E\x97" + + "\x8B\t\x03\x02\x02\x02\x8C\x8D\x05\x16\f\x02\x8D\x9A\x05H%\x02\x8E\x97" + "\x07?\x02\x02\x8F\x94\x05@!\x02\x90\x91\x07\n\x02\x02\x91\x93\x05@!\x02" + "\x92\x90\x03\x02\x02\x02\x93\x96\x03\x02\x02\x02\x94\x92\x03\x02\x02\x02" + "\x94\x95\x03\x02\x02\x02\x95\x98\x03\x02\x02\x02\x96\x94\x03\x02\x02\x02" + "\x97\x8F\x03\x02\x02\x02\x97\x98\x03\x02\x02\x02\x98\x99\x03\x02\x02\x02" + - "\x99\x9C\x07@\x02\x02\x9A\x9B\x07\x07\x02\x02\x9B\x9D\x05&\x14\x02\x9C" + - "\x9A\x03\x02\x02\x02\x9C\x9D\x03\x02\x02\x02\x9D\xB3\x03\x02\x02\x02\x9E" + - "\x9F\x07\x07\x02\x02\x9F\xB3\x05&\x14\x02\xA0\xA1\x07?\x02\x02\xA1\xA2" + - "\x05@!\x02\xA2\xA3\x07\x07\x02\x02\xA3\xAB\x05&\x14\x02\xA4\xA5\x07\n" + - "\x02\x02\xA5\xA6\x05@!\x02\xA6\xA7\x07\x07\x02\x02\xA7\xA8\x05&\x14\x02" + - "\xA8\xAA\x03\x02\x02\x02\xA9\xA4\x03\x02\x02\x02\xAA\xAD\x03\x02\x02\x02" + - "\xAB\xA9\x03\x02\x02\x02\xAB\xAC\x03\x02\x02\x02\xAC\xAE\x03\x02\x02\x02" + - "\xAD\xAB\x03\x02\x02\x02\xAE\xAF\x07@\x02\x02\xAF\xB0\x07\x07\x02\x02" + - "\xB0\xB1\x05&\x14\x02\xB1\xB3\x03\x02\x02\x02\xB2\x8E\x03\x02\x02\x02" + - "\xB2\x9E\x03\x02\x02\x02\xB2\xA0\x03\x02\x02\x02\xB2\xB3\x03\x02\x02\x02" + - "\xB3\xB6\x03\x02\x02\x02\xB4\xB5\x07>\x02\x02\xB5\xB7\x05.\x18\x02\xB6" + - "\xB4\x03\x02\x02\x02\xB6\xB7\x03\x02\x02\x02\xB7\xB9\x03\x02\x02\x02\xB8" + - "\xBA\x07\v\x02\x02\xB9\xB8\x03\x02\x02\x02\xB9\xBA\x03\x02\x02\x02\xBA" + - "\v\x03\x02\x02\x02\xBB\xBC\x07\f\x02\x02\xBC\xC8\x05P)\x02\xBD\xBE\x07" + - "\f\x02\x02\xBE\xBF\x05\x0E\b\x02\xBF\xC0\x07>\x02\x02\xC0\xC1\x05&\x14" + - "\x02\xC1\xC8\x03\x02\x02\x02\xC2\xC3\x07\f\x02\x02\xC3\xC4\x05\x0E\b\x02" + - "\xC4\xC5\x07>\x02\x02\xC5\xC6\x05\x10\t\x02\xC6\xC8\x03\x02\x02\x02\xC7" + - "\xBB\x03\x02\x02\x02\xC7\xBD\x03\x02\x02\x02\xC7\xC2\x03\x02\x02\x02\xC8" + - "\r\x03\x02\x02\x02\xC9\xD5\x05P)\x02\xCA\xCB\x07\r\x02\x02\xCB\xD0\x05" + - "(\x15\x02\xCC\xCD\x07\n\x02\x02\xCD\xCF\x05(\x15\x02\xCE\xCC\x03\x02\x02" + - "\x02\xCF\xD2\x03\x02\x02\x02\xD0\xCE\x03\x02\x02\x02\xD0\xD1\x03\x02\x02" + - "\x02\xD1\xD3\x03\x02\x02\x02\xD2\xD0\x03\x02\x02\x02\xD3\xD4\x07\x0E\x02" + - "\x02\xD4\xD6\x03\x02\x02\x02\xD5\xCA\x03\x02\x02\x02\xD5\xD6\x03\x02\x02" + - "\x02\xD6\x0F\x03\x02\x02\x02\xD7\xD9\x07\x0F\x02\x02\xD8\xD7\x03\x02\x02" + - "\x02\xD8\xD9\x03\x02\x02\x02\xD9\xDA\x03\x02\x02\x02\xDA\xDF\x05\x12\n" + - "\x02\xDB\xDC\x07\x0F\x02\x02\xDC\xDE\x05\x12\n\x02\xDD\xDB\x03\x02\x02" + - "\x02\xDE\xE1\x03\x02\x02\x02\xDF\xDD\x03\x02\x02\x02\xDF\xE0\x03\x02\x02" + - "\x02\xE0\x11\x03\x02\x02\x02\xE1\xDF\x03\x02\x02\x02\xE2\xE7\x05R*\x02" + - "\xE3\xE4\x07?\x02\x02\xE4\xE5\x05&\x14\x02\xE5\xE6\x07@\x02\x02\xE6\xE8" + - "\x03\x02\x02\x02\xE7\xE3\x03\x02\x02\x02\xE7\xE8\x03\x02\x02\x02\xE8\x13" + - "\x03\x02\x02\x02\xE9\xEA\x07\x10\x02\x02\xEA\xED\x05P)\x02\xEB\xEC\x07" + - "\x07\x02\x02\xEC\xEE\x05&\x14\x02\xED\xEB\x03\x02\x02\x02\xED\xEE\x03" + - "\x02\x02\x02\xEE\xEF\x03\x02\x02\x02\xEF\xF0\x07>\x02\x02\xF0\xF2\x05" + - ".\x18\x02\xF1\xF3\x07\v\x02\x02\xF2\xF1\x03\x02\x02\x02\xF2\xF3\x03\x02" + - "\x02\x02\xF3\x15\x03\x02\x02\x02\xF4\xFE\x07\x11\x02\x02\xF5\xFE\x07\x12" + - "\x02\x02\xF6\xF7\x07\x13\x02\x02\xF7\xFE\x07\x11\x02\x02\xF8\xF9\x07\x13" + - "\x02\x02\xF9\xFE\x07\x12\x02\x02\xFA\xFE\x07\x14\x02\x02\xFB\xFE\x07\x15" + - "\x02\x02\xFC\xFE\x07\x16\x02\x02\xFD\xF4\x03\x02\x02\x02\xFD\xF5\x03\x02" + - "\x02\x02\xFD\xF6\x03\x02\x02\x02\xFD\xF8\x03\x02\x02\x02\xFD\xFA\x03\x02" + - "\x02\x02\xFD\xFB\x03\x02\x02\x02\xFD\xFC\x03\x02\x02\x02\xFE\x17\x03\x02" + - "\x02\x02\xFF\u0100\x07\x17\x02\x02\u0100\u0101\x05 \x11\x02\u0101\u0102" + - "\x07\x18\x02\x02\u0102\u0105\x05B\"\x02\u0103\u0104\x07\x19\x02\x02\u0104" + - "\u0106\x05$\x13\x02\u0105\u0103\x03\x02\x02\x02\u0105\u0106\x03\x02\x02" + - "\x02\u0106\u0112\x03\x02\x02\x02\u0107\u0108\x07\x17\x02\x02\u0108\u010B" + - "\x05 \x11\x02\u0109\u010A\x07\x1A\x02\x02\u010A\u010C\x05 \x11\x02\u010B" + - "\u0109\x03\x02\x02\x02\u010B\u010C\x03\x02\x02\x02\u010C\u010F\x03\x02" + - "\x02\x02\u010D\u010E\x07\x19\x02\x02\u010E\u0110\x05$\x13\x02\u010F\u010D" + - "\x03\x02\x02\x02\u010F\u0110\x03\x02\x02\x02\u0110\u0112\x03\x02\x02\x02" + - "\u0111\xFF\x03\x02\x02\x02\u0111\u0107\x03\x02\x02\x02\u0112\x19\x03\x02" + - "\x02\x02\u0113\u0114\x07\x1B\x02\x02\u0114\u0115\x05 \x11\x02\u0115\u0116" + - "\x07\x18\x02\x02\u0116\u0117\x05B\"\x02\u0117\u011F\x03\x02\x02\x02\u0118" + - "\u0119\x07\x1B\x02\x02\u0119\u011C\x05 \x11\x02\u011A\u011B\x07\x1A\x02" + - "\x02\u011B\u011D\x05 \x11\x02\u011C\u011A\x03\x02\x02\x02\u011C\u011D" + - "\x03\x02\x02\x02\u011D\u011F\x03\x02\x02\x02\u011E\u0113\x03\x02\x02\x02" + - "\u011E\u0118\x03\x02\x02\x02\u011F\x1B\x03\x02\x02\x02\u0120\u0121\x07" + - "\x17\x02\x02\u0121\u0122\x05\x1E\x10\x02\u0122\u0123\x07?\x02\x02\u0123" + - "\u0124\x05 \x11\x02\u0124\u0125\x07>\x02\x02\u0125\u012D\x05.\x18\x02" + - "\u0126\u0127\x07\n\x02\x02\u0127\u0128\x05 \x11\x02\u0128\u0129\x07>\x02" + - "\x02\u0129\u012A\x05.\x18\x02\u012A\u012C\x03\x02\x02\x02\u012B\u0126" + - "\x03\x02\x02\x02\u012C\u012F\x03\x02\x02\x02\u012D\u012B\x03\x02\x02\x02" + - "\u012D\u012E\x03\x02\x02\x02\u012E\u0130\x03\x02\x02\x02\u012F\u012D\x03" + - "\x02\x02\x02\u0130\u0131\x07@\x02\x02\u0131\u0132\x07\x18\x02\x02\u0132" + - "\u0135\x075\x02\x02\u0133\u0134\x07\x19\x02\x02\u0134\u0136\x05$\x13\x02" + - "\u0135\u0133\x03\x02\x02\x02\u0135\u0136\x03\x02\x02\x02\u0136\u014F\x03" + - "\x02\x02\x02\u0137\u0138\x07\x17\x02\x02\u0138\u0139\x05\x1E\x10\x02\u0139" + - "\u013A\x07?\x02\x02\u013A\u013B\x05 \x11\x02\u013B\u013C\x07>\x02\x02" + - "\u013C\u0144\x05.\x18\x02\u013D\u013E\x07\n\x02\x02\u013E\u013F\x05 \x11" + - "\x02\u013F\u0140\x07>\x02\x02\u0140\u0141\x05.\x18\x02\u0141\u0143\x03" + - "\x02\x02\x02\u0142\u013D\x03\x02\x02\x02\u0143\u0146\x03\x02\x02\x02\u0144" + - "\u0142\x03\x02\x02\x02\u0144\u0145\x03\x02\x02\x02\u0145\u0147\x03\x02" + - "\x02\x02\u0146\u0144\x03\x02\x02\x02\u0147\u0148\x07@\x02\x02\u0148\u0149" + - "\x07\x1A\x02\x02\u0149\u014C\x05\"\x12\x02\u014A\u014B\x07\x19\x02\x02" + - "\u014B\u014D\x05$\x13\x02\u014C\u014A\x03\x02\x02\x02\u014C\u014D\x03" + - "\x02\x02\x02\u014D\u014F\x03\x02\x02\x02\u014E\u0120\x03\x02\x02\x02\u014E" + - "\u0137\x03\x02\x02\x02\u014F\x1D\x03\x02\x02\x02\u0150\u0151\x05P)\x02" + - "\u0151\x1F\x03\x02\x02\x02\u0152\u0153\x05P)\x02\u0153!\x03\x02\x02\x02" + - "\u0154\u0155\x05P)\x02\u0155#\x03\x02\x02\x02\u0156\u0157\x07*\x02\x02" + - "\u0157%\x03\x02\x02\x02\u0158\u0159\b\x14\x01\x02\u0159\u0162\x07?\x02" + - "\x02\u015A\u015F\x05&\x14\x02\u015B\u015C\x07\n\x02\x02\u015C\u015E\x05" + - "&\x14\x02\u015D\u015B\x03\x02\x02\x02\u015E\u0161\x03\x02\x02\x02\u015F" + - "\u015D\x03\x02\x02\x02\u015F\u0160\x03\x02\x02\x02\u0160\u0163\x03\x02" + - "\x02\x02\u0161\u015F\x03\x02\x02\x02\u0162\u015A\x03\x02\x02\x02\u0162" + - "\u0163\x03\x02\x02\x02\u0163\u0165\x03\x02\x02\x02\u0164\u0166\x07\n\x02" + - "\x02\u0165\u0164\x03\x02\x02\x02\u0165\u0166\x03\x02\x02\x02\u0166\u0167" + - "\x03\x02\x02\x02\u0167\u0168\x07@\x02\x02\u0168\u0169\x07\x1D\x02\x02" + - "\u0169\u0193\x05&\x14\x0E\u016A\u016B\x07A\x02\x02\u016B\u016C\x07\r\x02" + - "\x02\u016C\u016D\x05&\x14\x02\u016D\u016E\x07\x0E\x02\x02\u016E\u0193" + - "\x03\x02\x02\x02\u016F\u0170\x07B\x02\x02\u0170\u0171\x07\r\x02\x02\u0171" + - "\u0172\x05&\x14\x02\u0172\u0173\x07\x0E\x02\x02\u0173\u0193\x03\x02\x02" + - "\x02\u0174\u0175\x07?\x02\x02\u0175\u0176\x05&\x14\x02\u0176\u0177\x07" + - "\n\x02\x02\u0177\u017C\x05&\x14\x02\u0178\u0179\x07\n\x02\x02\u0179\u017B" + - "\x05&\x14\x02\u017A\u0178\x03\x02\x02\x02\u017B\u017E\x03\x02\x02\x02" + - "\u017C\u017A\x03\x02\x02\x02\u017C\u017D\x03\x02\x02\x02\u017D\u0180\x03" + - "\x02\x02\x02\u017E\u017C\x03\x02\x02\x02\u017F\u0181\x07\n\x02\x02\u0180" + - "\u017F\x03\x02\x02\x02\u0180\u0181\x03\x02\x02\x02\u0181\u0182\x03\x02" + - "\x02\x02\u0182\u0183\x07@\x02\x02\u0183\u0193\x03\x02\x02\x02\u0184\u0186" + - "\x07\x04\x02\x02\u0185\u0187\x05*\x16\x02\u0186\u0185\x03\x02\x02\x02" + - "\u0186\u0187\x03\x02\x02\x02\u0187\u0188\x03\x02\x02\x02\u0188\u0193\x07" + - "\x05\x02\x02\u0189\u0193\x07\x1E\x02\x02\u018A\u0193\x07\x1F\x02\x02\u018B" + - "\u0193\x07 \x02\x02\u018C\u0193\x05(\x15\x02\u018D\u0193\x05P)\x02\u018E" + - "\u018F\x07?\x02\x02\u018F\u0190\x05&\x14\x02\u0190\u0191\x07@\x02\x02" + - "\u0191\u0193\x03\x02\x02\x02\u0192\u0158\x03\x02\x02\x02\u0192\u016A\x03" + - "\x02\x02\x02\u0192\u016F\x03\x02\x02\x02\u0192\u0174\x03\x02\x02\x02\u0192" + - "\u0184\x03\x02\x02\x02\u0192\u0189\x03\x02\x02\x02\u0192\u018A\x03\x02" + - "\x02\x02\u0192\u018B\x03\x02\x02\x02\u0192\u018C\x03\x02\x02\x02\u0192" + - "\u018D\x03\x02\x02\x02\u0192\u018E\x03\x02\x02\x02\u0193\u01A8\x03\x02" + - "\x02\x02\u0194\u0195\f\x10\x02\x02\u0195\u0196\x07\x1C\x02\x02\u0196\u01A7" + - "\x05&\x14\x10\u0197\u0198\f\x0F\x02\x02\u0198\u0199\x07\x1D\x02\x02\u0199" + - "\u01A7\x05&\x14\x0F\u019A\u019B\f\x03\x02\x02\u019B\u019C\x07\r\x02\x02" + - "\u019C\u01A1\x05&\x14\x02\u019D\u019E\x07\n\x02\x02\u019E\u01A0\x05&\x14" + - "\x02\u019F\u019D\x03\x02\x02\x02\u01A0\u01A3\x03\x02\x02\x02\u01A1\u019F" + - "\x03\x02\x02\x02\u01A1\u01A2\x03\x02\x02\x02\u01A2\u01A4\x03\x02\x02\x02" + - "\u01A3\u01A1\x03\x02\x02\x02\u01A4\u01A5\x07\x0E\x02\x02\u01A5\u01A7\x03" + - "\x02\x02\x02\u01A6\u0194\x03\x02\x02\x02\u01A6\u0197\x03\x02\x02\x02\u01A6" + - "\u019A\x03\x02\x02\x02\u01A7\u01AA\x03\x02\x02\x02\u01A8\u01A6\x03\x02" + - "\x02\x02\u01A8\u01A9\x03\x02\x02\x02\u01A9\'\x03\x02\x02\x02\u01AA\u01A8" + - "\x03\x02\x02\x02\u01AB\u01AC\x07C\x02\x02\u01AC)\x03\x02\x02\x02\u01AD" + - "\u01AE\x05,\x17\x02\u01AE\u01AF\x07\x07\x02\x02\u01AF\u01B0\x05&\x14\x02" + - "\u01B0\u01B8\x03\x02\x02\x02\u01B1\u01B2\x07\n\x02\x02\u01B2\u01B3\x05" + - ",\x17\x02\u01B3\u01B4\x07\x07\x02\x02\u01B4\u01B5\x05&\x14\x02\u01B5\u01B7" + - "\x03\x02\x02\x02\u01B6\u01B1\x03\x02\x02\x02\u01B7\u01BA\x03\x02\x02\x02" + - "\u01B8\u01B6\x03\x02\x02\x02\u01B8\u01B9\x03\x02\x02\x02\u01B9\u01BE\x03" + - "\x02\x02\x02\u01BA\u01B8\x03\x02\x02\x02\u01BB\u01BF\x07\n\x02\x02\u01BC" + - "\u01BD\x07\x0F\x02\x02\u01BD\u01BF\x05T+\x02\u01BE\u01BB\x03\x02\x02\x02" + - "\u01BE\u01BC\x03\x02\x02\x02\u01BE\u01BF\x03\x02\x02\x02\u01BF\u01C3\x03" + - "\x02\x02\x02\u01C0\u01C1\x07\x0F\x02\x02\u01C1\u01C3\x05T+\x02\u01C2\u01AD" + - "\x03\x02\x02\x02\u01C2\u01C0\x03\x02\x02\x02\u01C3+\x03\x02\x02\x02\u01C4" + - "\u01C5\x05R*\x02\u01C5-\x03\x02\x02\x02\u01C6\u01C7\b\x18\x01\x02\u01C7" + - "\u025D\x058\x1D\x02\u01C8\u01C9\x05H%\x02\u01C9\u01CB\x07?\x02\x02\u01CA" + - "\u01CC\x05D#\x02\u01CB\u01CA\x03\x02\x02\x02\u01CB\u01CC\x03\x02\x02\x02" + - "\u01CC\u01CD\x03\x02\x02\x02\u01CD\u01CE\x07@\x02\x02\u01CE\u025D\x03" + - "\x02\x02\x02\u01CF\u01D0\x074\x02\x02\u01D0\u025D\x05.\x18\x1B\u01D1\u01D2" + - "\x05P)\x02\u01D2\u01D3\x07\"\x02\x02\u01D3\u01D4\x07>\x02\x02\u01D4\u01D5" + - "\x05.\x18\x17\u01D5\u025D\x03\x02\x02\x02\u01D6\u01D7\x07-\x02\x02\u01D7" + - "\u01D8\x07\x04\x02\x02\u01D8\u01DD\x05.\x18\x02\u01D9\u01DA\x07\n\x02" + - "\x02\u01DA\u01DC\x05.\x18\x02\u01DB\u01D9\x03\x02\x02\x02\u01DC\u01DF" + - "\x03\x02\x02\x02\u01DD\u01DB\x03\x02\x02\x02\u01DD\u01DE\x03\x02\x02\x02" + - "\u01DE\u01E1\x03\x02\x02\x02\u01DF\u01DD\x03\x02\x02\x02\u01E0\u01E2\x07" + - "\n\x02\x02\u01E1\u01E0\x03\x02\x02\x02\u01E1\u01E2\x03\x02\x02\x02\u01E2" + - "\u01E3\x03\x02\x02\x02\u01E3\u01E4\x07\x05\x02\x02\u01E4\u025D\x03\x02" + - "\x02\x02\u01E5\u01E6\x07.\x02\x02\u01E6\u01E7\x07\x04\x02\x02\u01E7\u01EC" + - "\x05.\x18\x02\u01E8\u01E9\x07\n\x02\x02\u01E9\u01EB\x05.\x18\x02\u01EA" + - "\u01E8\x03\x02\x02\x02\u01EB\u01EE\x03\x02\x02\x02\u01EC\u01EA\x03\x02" + - "\x02\x02\u01EC\u01ED\x03\x02\x02\x02\u01ED\u01F0\x03\x02\x02\x02\u01EE" + - "\u01EC\x03\x02\x02\x02\u01EF\u01F1\x07\n\x02\x02\u01F0\u01EF\x03\x02\x02" + - "\x02\u01F0"; + "\x99\x9B\x07@\x02\x02\x9A\x8E\x03\x02\x02\x02\x9A\x9B\x03\x02\x02\x02" + + "\x9B\x9E\x03\x02\x02\x02\x9C\x9D\x07\x07\x02\x02\x9D\x9F\x05&\x14\x02" + + "\x9E\x9C\x03\x02\x02\x02\x9E\x9F\x03\x02\x02\x02\x9F\xA2\x03\x02\x02\x02" + + "\xA0\xA1\x07>\x02\x02\xA1\xA3\x05.\x18\x02\xA2\xA0\x03\x02\x02\x02\xA2" + + "\xA3\x03\x02\x02\x02\xA3\xA5\x03\x02\x02\x02\xA4\xA6\x07\v\x02\x02\xA5" + + "\xA4\x03\x02\x02\x02\xA5\xA6\x03\x02\x02\x02\xA6\xC2\x03\x02\x02\x02\xA7" + + "\xA8\x05\x16\f\x02\xA8\xA9\x05H%\x02\xA9\xAA\x07?\x02\x02\xAA\xAB\x05" + + "@!\x02\xAB\xAC\x07\x07\x02\x02\xAC\xB4\x05&\x14\x02\xAD\xAE\x07\n\x02" + + "\x02\xAE\xAF\x05@!\x02\xAF\xB0\x07\x07\x02\x02\xB0\xB1\x05&\x14\x02\xB1" + + "\xB3\x03\x02\x02\x02\xB2\xAD\x03\x02\x02\x02\xB3\xB6\x03\x02\x02\x02\xB4" + + "\xB2\x03\x02\x02\x02\xB4\xB5\x03\x02\x02\x02\xB5\xB7\x03\x02\x02\x02\xB6" + + "\xB4\x03\x02\x02\x02\xB7\xB8\x07@\x02\x02\xB8\xB9\x07\x07\x02\x02\xB9" + + "\xBC\x05&\x14\x02\xBA\xBB\x07>\x02\x02\xBB\xBD\x05.\x18\x02\xBC\xBA\x03" + + "\x02\x02\x02\xBC\xBD\x03\x02\x02\x02\xBD\xBF\x03\x02\x02\x02\xBE\xC0\x07" + + "\v\x02\x02\xBF\xBE\x03\x02\x02\x02\xBF\xC0\x03\x02\x02\x02\xC0\xC2\x03" + + "\x02\x02\x02\xC1\x8C\x03\x02\x02\x02\xC1\xA7\x03\x02\x02\x02\xC2\v\x03" + + "\x02\x02\x02\xC3\xC4\x07\f\x02\x02\xC4\xD0\x05P)\x02\xC5\xC6\x07\f\x02" + + "\x02\xC6\xC7\x05\x0E\b\x02\xC7\xC8\x07>\x02\x02\xC8\xC9\x05&\x14\x02\xC9" + + "\xD0\x03\x02\x02\x02\xCA\xCB\x07\f\x02\x02\xCB\xCC\x05\x0E\b\x02\xCC\xCD" + + "\x07>\x02\x02\xCD\xCE\x05\x10\t\x02\xCE\xD0\x03\x02\x02\x02\xCF\xC3\x03" + + "\x02\x02\x02\xCF\xC5\x03\x02\x02\x02\xCF\xCA\x03\x02\x02\x02\xD0\r\x03" + + "\x02\x02\x02\xD1\xDD\x05P)\x02\xD2\xD3\x07\r\x02\x02\xD3\xD8\x05(\x15" + + "\x02\xD4\xD5\x07\n\x02\x02\xD5\xD7\x05(\x15\x02\xD6\xD4\x03\x02\x02\x02" + + "\xD7\xDA\x03\x02\x02\x02\xD8\xD6\x03\x02\x02\x02\xD8\xD9\x03\x02\x02\x02" + + "\xD9\xDB\x03\x02\x02\x02\xDA\xD8\x03\x02\x02\x02\xDB\xDC\x07\x0E\x02\x02" + + "\xDC\xDE\x03\x02\x02\x02\xDD\xD2\x03\x02\x02\x02\xDD\xDE\x03\x02\x02\x02" + + "\xDE\x0F\x03\x02\x02\x02\xDF\xE1\x07\x0F\x02\x02\xE0\xDF\x03\x02\x02\x02" + + "\xE0\xE1\x03\x02\x02\x02\xE1\xE2\x03\x02\x02\x02\xE2\xE7\x05\x12\n\x02" + + "\xE3\xE4\x07\x0F\x02\x02\xE4\xE6\x05\x12\n\x02\xE5\xE3\x03\x02\x02\x02" + + "\xE6\xE9\x03\x02\x02\x02\xE7\xE5\x03\x02\x02\x02\xE7\xE8\x03\x02\x02\x02" + + "\xE8\x11\x03\x02\x02\x02\xE9\xE7\x03\x02\x02\x02\xEA\xEF\x05R*\x02\xEB" + + "\xEC\x07?\x02\x02\xEC\xED\x05&\x14\x02\xED\xEE\x07@\x02\x02\xEE\xF0\x03" + + "\x02\x02\x02\xEF\xEB\x03\x02\x02\x02\xEF\xF0\x03\x02\x02\x02\xF0\x13\x03" + + "\x02\x02\x02\xF1\xF2\x07\x10\x02\x02\xF2\xF5\x05P)\x02\xF3\xF4\x07\x07" + + "\x02\x02\xF4\xF6\x05&\x14\x02\xF5\xF3\x03\x02\x02\x02\xF5\xF6\x03\x02" + + "\x02\x02\xF6\xF7\x03\x02\x02\x02\xF7\xF8\x07>\x02\x02\xF8\xFA\x05.\x18" + + "\x02\xF9\xFB\x07\v\x02\x02\xFA\xF9\x03\x02\x02\x02\xFA\xFB\x03\x02\x02" + + "\x02\xFB\x15\x03\x02\x02\x02\xFC\u0106\x07\x11\x02\x02\xFD\u0106\x07\x12" + + "\x02\x02\xFE\xFF\x07\x13\x02\x02\xFF\u0106\x07\x11\x02\x02\u0100\u0101" + + "\x07\x13\x02\x02\u0101\u0106\x07\x12\x02\x02\u0102\u0106\x07\x14\x02\x02" + + "\u0103\u0106\x07\x15\x02\x02\u0104\u0106\x07\x16\x02\x02\u0105\xFC\x03" + + "\x02\x02\x02\u0105\xFD\x03\x02\x02\x02\u0105\xFE\x03\x02\x02\x02\u0105" + + "\u0100\x03\x02\x02\x02\u0105\u0102\x03\x02\x02\x02\u0105\u0103\x03\x02" + + "\x02\x02\u0105\u0104\x03\x02\x02\x02\u0106\x17\x03\x02\x02\x02\u0107\u0108" + + "\x07\x17\x02\x02\u0108\u0109\x05 \x11\x02\u0109\u010A\x07\x18\x02\x02" + + "\u010A\u010D\x05B\"\x02\u010B\u010C\x07\x19\x02\x02\u010C\u010E\x05$\x13" + + "\x02\u010D\u010B\x03\x02\x02\x02\u010D\u010E\x03\x02\x02\x02\u010E\u011A" + + "\x03\x02\x02\x02\u010F\u0110\x07\x17\x02\x02\u0110\u0113\x05 \x11\x02" + + "\u0111\u0112\x07\x1A\x02\x02\u0112\u0114\x05 \x11\x02\u0113\u0111\x03" + + "\x02\x02\x02\u0113\u0114\x03\x02\x02\x02\u0114\u0117\x03\x02\x02\x02\u0115" + + "\u0116\x07\x19\x02\x02\u0116\u0118\x05$\x13\x02\u0117\u0115\x03\x02\x02" + + "\x02\u0117\u0118\x03\x02\x02\x02\u0118\u011A\x03\x02\x02\x02\u0119\u0107" + + "\x03\x02\x02\x02\u0119\u010F\x03\x02\x02\x02\u011A\x19\x03\x02\x02\x02" + + "\u011B\u011C\x07\x1B\x02\x02\u011C\u011D\x05 \x11\x02\u011D\u011E\x07" + + "\x18\x02\x02\u011E\u011F\x05B\"\x02\u011F\u0127\x03\x02\x02\x02\u0120" + + "\u0121\x07\x1B\x02\x02\u0121\u0124\x05 \x11\x02\u0122\u0123\x07\x1A\x02" + + "\x02\u0123\u0125\x05 \x11\x02\u0124\u0122\x03\x02\x02\x02\u0124\u0125" + + "\x03\x02\x02\x02\u0125\u0127\x03\x02\x02\x02\u0126\u011B\x03\x02\x02\x02" + + "\u0126\u0120\x03\x02\x02\x02\u0127\x1B\x03\x02\x02\x02\u0128\u0129\x07" + + "\x17\x02\x02\u0129\u012A\x05\x1E\x10\x02\u012A\u012B\x07?\x02\x02\u012B" + + "\u012C\x05 \x11\x02\u012C\u012D\x07>\x02\x02\u012D\u0135\x05.\x18\x02" + + "\u012E\u012F\x07\n\x02\x02\u012F\u0130\x05 \x11\x02\u0130\u0131\x07>\x02" + + "\x02\u0131\u0132\x05.\x18\x02\u0132\u0134\x03\x02\x02\x02\u0133\u012E" + + "\x03\x02\x02\x02\u0134\u0137\x03\x02\x02\x02\u0135\u0133\x03\x02\x02\x02" + + "\u0135\u0136\x03\x02\x02\x02\u0136\u0138\x03\x02\x02\x02\u0137\u0135\x03" + + "\x02\x02\x02\u0138\u0139\x07@\x02\x02\u0139\u013A\x07\x18\x02\x02\u013A" + + "\u013D\x075\x02\x02\u013B\u013C\x07\x19\x02\x02\u013C\u013E\x05$\x13\x02" + + "\u013D\u013B\x03\x02\x02\x02\u013D\u013E\x03\x02\x02\x02\u013E\u0157\x03" + + "\x02\x02\x02\u013F\u0140\x07\x17\x02\x02\u0140\u0141\x05\x1E\x10\x02\u0141" + + "\u0142\x07?\x02\x02\u0142\u0143\x05 \x11\x02\u0143\u0144\x07>\x02\x02" + + "\u0144\u014C\x05.\x18\x02\u0145\u0146\x07\n\x02\x02\u0146\u0147\x05 \x11" + + "\x02\u0147\u0148\x07>\x02\x02\u0148\u0149\x05.\x18\x02\u0149\u014B\x03" + + "\x02\x02\x02\u014A\u0145\x03\x02\x02\x02\u014B\u014E\x03\x02\x02\x02\u014C" + + "\u014A\x03\x02\x02\x02\u014C\u014D\x03\x02\x02\x02\u014D\u014F\x03\x02" + + "\x02\x02\u014E\u014C\x03\x02\x02\x02\u014F\u0150\x07@\x02\x02\u0150\u0151" + + "\x07\x1A\x02\x02\u0151\u0154\x05\"\x12\x02\u0152\u0153\x07\x19\x02\x02" + + "\u0153\u0155\x05$\x13\x02\u0154\u0152\x03\x02\x02\x02\u0154\u0155\x03" + + "\x02\x02\x02\u0155\u0157\x03\x02\x02\x02\u0156\u0128\x03\x02\x02\x02\u0156" + + "\u013F\x03\x02\x02\x02\u0157\x1D\x03\x02\x02\x02\u0158\u0159\x05P)\x02" + + "\u0159\x1F\x03\x02\x02\x02\u015A\u015B\x05P)\x02\u015B!\x03\x02\x02\x02" + + "\u015C\u015D\x05P)\x02\u015D#\x03\x02\x02\x02\u015E\u015F\x07*\x02\x02" + + "\u015F%\x03\x02\x02\x02\u0160\u0161\b\x14\x01\x02\u0161\u016A\x07?\x02" + + "\x02\u0162\u0167\x05&\x14\x02\u0163\u0164\x07\n\x02\x02\u0164\u0166\x05" + + "&\x14\x02\u0165\u0163\x03\x02\x02\x02\u0166\u0169\x03\x02\x02\x02\u0167" + + "\u0165\x03\x02\x02\x02\u0167\u0168\x03\x02\x02\x02\u0168\u016B\x03\x02" + + "\x02\x02\u0169\u0167\x03\x02\x02\x02\u016A\u0162\x03\x02\x02\x02\u016A" + + "\u016B\x03\x02\x02\x02\u016B\u016D\x03\x02\x02\x02\u016C\u016E\x07\n\x02" + + "\x02\u016D\u016C\x03\x02\x02\x02\u016D\u016E\x03\x02\x02\x02\u016E\u016F" + + "\x03\x02\x02\x02\u016F\u0170\x07@\x02\x02\u0170\u0171\x07\x1D\x02\x02" + + "\u0171\u019B\x05&\x14\x0E\u0172\u0173\x07A\x02\x02\u0173\u0174\x07\r\x02" + + "\x02\u0174\u0175\x05&\x14\x02\u0175\u0176\x07\x0E\x02\x02\u0176\u019B" + + "\x03\x02\x02\x02\u0177\u0178\x07B\x02\x02\u0178\u0179\x07\r\x02\x02\u0179" + + "\u017A\x05&\x14\x02\u017A\u017B\x07\x0E\x02\x02\u017B\u019B\x03\x02\x02" + + "\x02\u017C\u017D\x07?\x02\x02\u017D\u017E\x05&\x14\x02\u017E\u017F\x07" + + "\n\x02\x02\u017F\u0184\x05&\x14\x02\u0180\u0181\x07\n\x02\x02\u0181\u0183" + + "\x05&\x14\x02\u0182\u0180\x03\x02\x02\x02\u0183\u0186\x03\x02\x02\x02" + + "\u0184\u0182\x03\x02\x02\x02\u0184\u0185\x03\x02\x02\x02\u0185\u0188\x03" + + "\x02\x02\x02\u0186\u0184\x03\x02\x02\x02\u0187\u0189\x07\n\x02\x02\u0188" + + "\u0187\x03\x02\x02\x02\u0188\u0189\x03\x02\x02\x02\u0189\u018A\x03\x02" + + "\x02\x02\u018A\u018B\x07@\x02\x02\u018B\u019B\x03\x02\x02\x02\u018C\u018E" + + "\x07\x04\x02\x02\u018D\u018F\x05*\x16\x02\u018E\u018D\x03\x02\x02\x02" + + "\u018E\u018F\x03\x02\x02\x02\u018F\u0190\x03\x02\x02\x02\u0190\u019B\x07" + + "\x05\x02\x02\u0191\u019B\x07\x1E\x02\x02\u0192\u019B\x07\x1F\x02\x02\u0193" + + "\u019B\x07 \x02\x02\u0194\u019B\x05(\x15\x02\u0195\u019B\x05P)\x02\u0196" + + "\u0197\x07?\x02\x02\u0197\u0198\x05&\x14\x02\u0198\u0199\x07@\x02\x02" + + "\u0199\u019B\x03\x02\x02\x02\u019A\u0160\x03\x02\x02\x02\u019A\u0172\x03" + + "\x02\x02\x02\u019A\u0177\x03\x02\x02\x02\u019A\u017C\x03\x02\x02\x02\u019A" + + "\u018C\x03\x02\x02\x02\u019A\u0191\x03\x02\x02\x02\u019A\u0192\x03\x02" + + "\x02\x02\u019A\u0193\x03\x02\x02\x02\u019A\u0194\x03\x02\x02\x02\u019A" + + "\u0195\x03\x02\x02\x02\u019A\u0196\x03\x02\x02\x02\u019B\u01B0\x03\x02" + + "\x02\x02\u019C\u019D\f\x10\x02\x02\u019D\u019E\x07\x1C\x02\x02\u019E\u01AF" + + "\x05&\x14\x10\u019F\u01A0\f\x0F\x02\x02\u01A0\u01A1\x07\x1D\x02\x02\u01A1" + + "\u01AF\x05&\x14\x0F\u01A2\u01A3\f\x03\x02\x02\u01A3\u01A4\x07\r\x02\x02" + + "\u01A4\u01A9\x05&\x14\x02\u01A5\u01A6\x07\n\x02\x02\u01A6\u01A8\x05&\x14" + + "\x02\u01A7\u01A5\x03\x02\x02\x02\u01A8\u01AB\x03\x02\x02\x02\u01A9\u01A7" + + "\x03\x02\x02\x02\u01A9\u01AA\x03\x02\x02\x02\u01AA\u01AC\x03\x02\x02\x02" + + "\u01AB\u01A9\x03\x02\x02\x02\u01AC\u01AD\x07\x0E\x02\x02\u01AD\u01AF\x03" + + "\x02\x02\x02\u01AE\u019C\x03\x02\x02\x02\u01AE\u019F\x03\x02\x02\x02\u01AE" + + "\u01A2\x03\x02\x02\x02\u01AF\u01B2\x03\x02\x02\x02\u01B0\u01AE\x03\x02" + + "\x02\x02\u01B0\u01B1\x03\x02\x02\x02\u01B1\'\x03\x02\x02\x02\u01B2\u01B0" + + "\x03\x02\x02\x02\u01B3\u01B4\x07C\x02\x02\u01B4)\x03\x02\x02\x02\u01B5" + + "\u01B6\x05,\x17\x02\u01B6\u01B7\x07\x07\x02\x02\u01B7\u01B8\x05&\x14\x02" + + "\u01B8\u01C0\x03\x02\x02\x02\u01B9\u01BA\x07\n\x02\x02\u01BA\u01BB\x05" + + ",\x17\x02\u01BB\u01BC\x07\x07\x02\x02\u01BC\u01BD\x05&\x14\x02\u01BD\u01BF" + + "\x03\x02\x02\x02\u01BE\u01B9\x03\x02\x02\x02\u01BF\u01C2\x03\x02\x02\x02" + + "\u01C0\u01BE\x03\x02\x02\x02\u01C0\u01C1\x03\x02\x02\x02\u01C1\u01C6\x03" + + "\x02\x02\x02\u01C2\u01C0\x03\x02\x02\x02\u01C3\u01C7\x07\n\x02\x02\u01C4" + + "\u01C5\x07\x0F\x02\x02\u01C5\u01C7\x05T+\x02\u01C6\u01C3\x03\x02\x02\x02" + + "\u01C6\u01C4\x03\x02\x02\x02\u01C6\u01C7\x03\x02\x02\x02\u01C7\u01CB\x03" + + "\x02\x02\x02\u01C8\u01C9\x07\x0F\x02\x02\u01C9\u01CB\x05T+\x02\u01CA\u01B5" + + "\x03\x02\x02\x02\u01CA\u01C8\x03\x02\x02\x02\u01CB+\x03\x02\x02\x02\u01CC" + + "\u01CD\x05R*\x02\u01CD-\x03\x02\x02\x02\u01CE\u01CF\b\x18\x01\x02\u01CF" + + "\u0265\x058\x1D\x02\u01D0\u01D1\x05H%\x02\u01D1\u01D3\x07?\x02\x02\u01D2" + + "\u01D4\x05D#\x02\u01D3\u01D2\x03\x02\x02\x02\u01D3\u01D4\x03\x02\x02\x02" + + "\u01D4\u01D5\x03\x02\x02\x02\u01D5\u01D6\x07@\x02\x02\u01D6\u0265\x03" + + "\x02\x02\x02\u01D7\u01D8\x074\x02\x02\u01D8\u0265\x05.\x18\x1B\u01D9\u01DA" + + "\x05P)\x02\u01DA\u01DB\x07\"\x02\x02\u01DB\u01DC\x07>\x02\x02\u01DC\u01DD" + + "\x05.\x18\x17\u01DD\u0265\x03\x02\x02\x02\u01DE\u01DF\x07-\x02\x02\u01DF" + + "\u01E0\x07\x04\x02\x02\u01E0\u01E5\x05.\x18\x02\u01E1\u01E2\x07\n\x02" + + "\x02\u01E2\u01E4\x05.\x18\x02\u01E3\u01E1\x03\x02\x02\x02\u01E4\u01E7" + + "\x03\x02\x02\x02\u01E5\u01E3\x03\x02\x02\x02\u01E5\u01E6\x03\x02\x02\x02" + + "\u01E6\u01E9\x03\x02\x02\x02\u01E7\u01E5\x03\x02\x02\x02\u01E8\u01EA\x07" + + "\n\x02\x02\u01E9\u01E8\x03\x02\x02\x02\u01E9\u01EA\x03\x02\x02\x02\u01EA" + + "\u01EB\x03\x02\x02\x02\u01EB\u01EC\x07\x05\x02\x02\u01EC\u0265\x03\x02" + + "\x02\x02\u01ED\u01EE\x07.\x02\x02"; private static readonly _serializedATNSegment1: string = - "\u01F1\x03\x02\x02\x02\u01F1\u01F2\x03\x02\x02\x02\u01F2\u01F3\x07\x05" + - "\x02\x02\u01F3\u025D\x03\x02\x02\x02\u01F4\u025D\x050\x19\x02\u01F5\u01F6" + - "\x07#\x02\x02\u01F6\u01F7\x07\x04\x02\x02\u01F7\u01FC\x05.\x18\x02\u01F8" + - "\u01F9\x07\n\x02\x02\u01F9\u01FB\x05.\x18\x02\u01FA\u01F8\x03\x02\x02" + - "\x02\u01FB\u01FE\x03\x02\x02\x02\u01FC\u01FA\x03\x02\x02\x02\u01FC\u01FD" + - "\x03\x02\x02\x02\u01FD\u0200\x03\x02\x02\x02\u01FE\u01FC\x03\x02\x02\x02" + - "\u01FF\u0201\x07\n\x02\x02\u0200\u01FF\x03\x02\x02\x02\u0200\u0201\x03" + - "\x02\x02\x02\u0201\u0202\x03\x02\x02\x02\u0202\u0203\x07\x05\x02\x02\u0203" + - "\u025D\x03\x02\x02\x02\u0204\u0205\x07$\x02\x02\u0205\u0206\x07\x04\x02" + - "\x02\u0206\u020B\x05.\x18\x02\u0207\u0208\x07\n\x02\x02\u0208\u020A\x05" + - ".\x18\x02\u0209\u0207\x03\x02\x02\x02\u020A\u020D\x03\x02\x02\x02\u020B" + - "\u0209\x03\x02\x02\x02\u020B\u020C\x03\x02\x02\x02\u020C\u020F\x03\x02" + - "\x02\x02\u020D\u020B\x03\x02\x02\x02\u020E\u0210\x07\n\x02\x02\u020F\u020E" + - "\x03\x02\x02\x02\u020F\u0210\x03\x02\x02\x02\u0210\u0211\x03\x02\x02\x02" + - "\u0211\u0212\x07\x05\x02\x02\u0212\u025D\x03\x02\x02\x02\u0213\u0218\x05" + - "P)\x02\u0214\u0218\x07,\x02\x02\u0215\u0218\x07+\x02\x02\u0216\u0218\x07" + - "*\x02\x02\u0217\u0213\x03\x02\x02\x02\u0217\u0214\x03\x02\x02\x02\u0217" + - "\u0215\x03\x02\x02\x02\u0217\u0216\x03\x02\x02\x02\u0218\u025D\x03\x02" + - "\x02\x02\u0219\u021A\x07?\x02\x02\u021A\u021B\x05.\x18\x02\u021B\u021C" + - "\x07\n\x02\x02\u021C\u0221\x05.\x18\x02\u021D\u021E\x07\n\x02\x02\u021E" + - "\u0220\x05.\x18\x02\u021F\u021D\x03\x02\x02\x02\u0220\u0223\x03\x02\x02" + - "\x02\u0221\u021F\x03\x02\x02\x02\u0221\u0222\x03\x02\x02\x02\u0222\u0225" + - "\x03\x02\x02\x02\u0223\u0221\x03\x02\x02\x02\u0224\u0226\x07\n\x02\x02" + - "\u0225\u0224\x03\x02\x02\x02\u0225\u0226\x03\x02\x02\x02\u0226\u0227\x03" + - "\x02\x02\x02\u0227\u0228\x07@\x02\x02\u0228\u025D\x03\x02\x02\x02\u0229" + - "\u022A\x07\x04\x02\x02\u022A\u022F\x05F$\x02\u022B\u022C\x07\n\x02\x02" + - "\u022C\u022E\x05F$\x02\u022D\u022B\x03\x02\x02\x02\u022E\u0231\x03\x02" + - "\x02\x02\u022F\u022D\x03\x02\x02\x02\u022F\u0230\x03\x02\x02\x02\u0230" + - "\u0233\x03\x02\x02\x02\u0231\u022F\x03\x02\x02\x02\u0232\u0234\x07\n\x02" + - "\x02\u0233\u0232\x03\x02\x02\x02\u0233\u0234\x03\x02\x02\x02\u0234\u0235" + - "\x03\x02\x02\x02\u0235\u0236\x07\x05\x02\x02\u0236\u025D\x03\x02\x02\x02" + - "\u0237\u0240\x07\r\x02\x02\u0238\u023D\x05.\x18\x02\u0239\u023A\x07\n" + - "\x02\x02\u023A\u023C\x05.\x18\x02\u023B\u0239\x03\x02\x02\x02\u023C\u023F" + - "\x03\x02\x02\x02\u023D\u023B\x03\x02\x02\x02\u023D\u023E\x03\x02\x02\x02" + - "\u023E\u0241\x03\x02\x02\x02\u023F\u023D\x03\x02\x02\x02\u0240\u0238\x03" + - "\x02\x02\x02\u0240\u0241\x03\x02\x02\x02\u0241\u0243\x03\x02\x02\x02\u0242" + - "\u0244\x07\n\x02\x02\u0243\u0242\x03\x02\x02\x02\u0243\u0244\x03\x02\x02" + - "\x02\u0244\u0245\x03\x02\x02\x02\u0245\u025D\x07\x0E\x02\x02\u0246\u0247" + - "\x07%\x02\x02\u0247\u0248\x07?\x02\x02\u0248\u0249\x05.\x18\x02\u0249" + - "\u024A\x07@\x02\x02\u024A\u024B\x05.\x18\x02\u024B\u024C\x07&\x02\x02" + - "\u024C\u024D\x05.\x18\x07\u024D\u025D\x03\x02\x02\x02\u024E\u024F\x05" + - "\n\x06\x02\u024F\u0250\x05.\x18\x06\u0250\u025D\x03\x02\x02\x02\u0251" + - "\u0252\x05\x14\v\x02\u0252\u0253\x05.\x18\x05\u0253\u025D\x03\x02\x02" + - "\x02\u0254\u0255\x07?\x02\x02\u0255\u0256\x05.\x18\x02\u0256\u0257\x07" + - "@\x02\x02\u0257\u025D\x03\x02\x02\x02\u0258\u0259\x07\x04\x02\x02\u0259" + - "\u025A\x05.\x18\x02\u025A\u025B\x07\x05\x02\x02\u025B\u025D\x03\x02\x02" + - "\x02\u025C\u01C6\x03\x02\x02\x02\u025C\u01C8\x03\x02\x02\x02\u025C\u01CF" + - "\x03\x02\x02\x02\u025C\u01D1\x03\x02\x02\x02\u025C\u01D6\x03\x02\x02\x02" + - "\u025C\u01E5\x03\x02\x02\x02\u025C\u01F4\x03\x02\x02\x02\u025C\u01F5\x03" + - "\x02\x02\x02\u025C\u0204\x03\x02\x02\x02\u025C\u0217\x03\x02\x02\x02\u025C" + - "\u0219\x03\x02\x02\x02\u025C\u0229\x03\x02\x02\x02\u025C\u0237\x03\x02" + - "\x02\x02\u025C\u0246\x03\x02\x02\x02\u025C\u024E\x03\x02\x02\x02\u025C" + - "\u0251\x03\x02\x02\x02\u025C\u0254\x03\x02\x02\x02\u025C\u0258\x03\x02" + - "\x02\x02\u025D\u028F\x03\x02\x02\x02\u025E\u025F\f\x1C\x02\x02\u025F\u0260" + - "\x07!\x02\x02\u0260\u028E\x05.\x18\x1C\u0261\u0262\f\x1A\x02\x02\u0262" + - "\u0263\t\x02\x02\x02\u0263\u028E\x05.\x18\x1B\u0264\u0265\f\x19\x02\x02" + - "\u0265\u0266\t\x03\x02\x02\u0266\u028E\x05.\x18\x1A\u0267\u0268\f\x18" + - "\x02\x02\u0268\u0269\t\x04\x02\x02\u0269\u028E\x05.\x18\x19\u026A\u026B" + - "\f\x16\x02\x02\u026B\u026C\x07>\x02\x02\u026C\u026D\x05.\x18\x17\u026D" + - "\u026E\b\x18\x01\x02\u026E\u028E\x03\x02\x02\x02\u026F\u0270\f\x14\x02" + - "\x02\u0270\u0271\x07-\x02\x02\u0271\u028E\x05.\x18\x15\u0272\u0273\f\x12" + - "\x02\x02\u0273\u0274\x07.\x02\x02\u0274\u028E\x05.\x18\x13\u0275\u0276" + - "\f\x11\x02\x02\u0276\u0277\x07/\x02\x02\u0277\u028E\x05.\x18\x12\u0278" + - "\u0279\f\x10\x02\x02\u0279\u027A\x070\x02\x02\u027A\u028E\x05.\x18\x11" + - "\u027B\u027C\f\n\x02\x02\u027C\u027D\x07\x1C\x02\x02\u027D\u028E\x05." + - "\x18\v\u027E\u027F\f \x02\x02\u027F\u0280\x07\x18\x02\x02\u0280\u0286" + - "\x05J&\x02\u0281\u0283\x07?\x02\x02\u0282\u0284\x05D#\x02\u0283\u0282" + - "\x03\x02\x02\x02\u0283\u0284\x03\x02\x02\x02\u0284\u0285\x03\x02\x02\x02" + - "\u0285\u0287\x07@\x02\x02\u0286\u0281\x03\x02\x02\x02\u0286\u0287\x03" + - "\x02\x02\x02\u0287\u028E\x03\x02\x02\x02\u0288\u0289\f\x1D\x02\x02\u0289" + - "\u028A\x07\r\x02\x02\u028A\u028B\x05.\x18\x02\u028B\u028C\x07\x0E\x02" + - "\x02\u028C\u028E\x03\x02\x02\x02\u028D\u025E\x03\x02\x02\x02\u028D\u0261" + - "\x03\x02\x02\x02\u028D\u0264\x03\x02\x02\x02\u028D\u0267\x03\x02\x02\x02" + - "\u028D\u026A\x03\x02\x02\x02\u028D\u026F\x03\x02\x02\x02\u028D\u0272\x03" + - "\x02\x02\x02\u028D\u0275\x03\x02\x02\x02\u028D\u0278\x03\x02\x02\x02\u028D" + - "\u027B\x03\x02\x02\x02\u028D\u027E\x03\x02\x02\x02\u028D\u0288\x03\x02" + - "\x02\x02\u028E\u0291\x03\x02\x02\x02\u028F\u028D\x03\x02\x02\x02\u028F" + - "\u0290\x03\x02\x02\x02\u0290/\x03\x02\x02\x02\u0291\u028F\x03\x02\x02" + - "\x02\u0292\u0293\x072\x02\x02\u0293\u0294\x05.\x18\x02\u0294\u0296\x07" + - "\x04\x02\x02\u0295\u0297\x07\x0F\x02\x02\u0296\u0295\x03\x02\x02\x02\u0296" + - "\u0297\x03\x02\x02\x02\u0297\u0298\x03\x02\x02\x02\u0298\u029D\x052\x1A" + - "\x02\u0299\u029A\x07\x0F\x02\x02\u029A\u029C\x052\x1A\x02\u029B\u0299" + - "\x03\x02\x02\x02\u029C\u029F\x03\x02\x02\x02\u029D\u029B\x03\x02\x02\x02" + - "\u029D\u029E\x03\x02\x02\x02\u029E\u02A0\x03\x02\x02\x02\u029F\u029D\x03" + - "\x02\x02\x02\u02A0\u02A1\x07\x05\x02\x02\u02A11\x03\x02\x02\x02\u02A2" + - "\u02A5\x054\x1B\x02\u02A3\u02A5\x07\'\x02\x02\u02A4\u02A2\x03\x02\x02" + - "\x02\u02A4\u02A3\x03\x02\x02\x02\u02A5\u02A6\x03\x02\x02\x02\u02A6\u02A7" + - "\x07\x1D\x02\x02\u02A7\u02A8\x05.\x18\x02\u02A83\x03\x02\x02\x02\u02A9" + - "\u02B0\x05R*\x02\u02AA\u02AD\x07?\x02\x02\u02AB\u02AE\x05R*\x02\u02AC" + - "\u02AE\x07\'\x02\x02\u02AD\u02AB\x03\x02\x02\x02\u02AD\u02AC\x03\x02\x02" + - "\x02\u02AE\u02AF\x03\x02\x02\x02\u02AF\u02B1\x07@\x02\x02\u02B0\u02AA" + - "\x03\x02\x02\x02\u02B0\u02B1\x03\x02\x02\x02\u02B15\x03\x02\x02\x02\u02B2" + - "\u02B3\x05\b\x05\x02\u02B3\u02B4\x07\x02\x02\x03\u02B4\u02BC\x03\x02\x02" + - "\x02\u02B5\u02B6\x05.\x18\x02\u02B6\u02B7\x07\x02\x02\x03\u02B7\u02BC" + - "\x03\x02\x02\x02\u02B8\u02B9\x07E\x02\x02\u02B9\u02BC\x07\x02\x02\x03" + - "\u02BA\u02BC\x07\x02\x02\x03\u02BB\u02B2\x03\x02\x02\x02\u02BB\u02B5\x03" + - "\x02\x02\x02\u02BB\u02B8\x03\x02\x02\x02\u02BB\u02BA\x03\x02\x02\x02\u02BC" + - "7\x03\x02\x02\x02\u02BD\u02C0\x05:\x1E\x02\u02BE\u02C0\x05<\x1F\x02\u02BF" + - "\u02BD\x03\x02\x02\x02\u02BF\u02BE\x03\x02\x02\x02\u02C09\x03\x02\x02" + - "\x02\u02C1\u02C2\x05@!\x02\u02C2\u02C3\x07\x1D\x02\x02\u02C3\u02C4\x05" + - ".\x18\x02\u02C4\u02D3\x03\x02\x02\x02\u02C5\u02C6\x07?\x02\x02\u02C6\u02CB" + - "\x05@!\x02\u02C7\u02C8\x07\n\x02\x02\u02C8\u02CA\x05@!\x02\u02C9\u02C7" + - "\x03\x02\x02\x02\u02CA\u02CD\x03\x02\x02\x02\u02CB\u02C9\x03\x02\x02\x02" + - "\u02CB\u02CC\x03\x02\x02\x02\u02CC\u02CE\x03\x02\x02\x02\u02CD\u02CB\x03" + - "\x02\x02\x02\u02CE\u02CF\x07@\x02\x02\u02CF\u02D0\x07\x1D\x02\x02\u02D0" + - "\u02D1\x05.\x18\x02\u02D1\u02D3\x03\x02\x02\x02\u02D2\u02C1\x03\x02\x02" + - "\x02\u02D2\u02C5\x03\x02\x02\x02\u02D3;\x03\x02\x02\x02\u02D4\u02D5\x07" + - "?\x02\x02\u02D5\u02D6\x07?\x02\x02\u02D6\u02D9\x05@!\x02\u02D7\u02D8\x07" + - "\n\x02\x02\u02D8\u02DA\x05@!\x02\u02D9\u02D7\x03\x02\x02\x02\u02DA\u02DB" + - "\x03\x02\x02\x02\u02DB\u02D9\x03\x02\x02\x02\u02DB\u02DC\x03\x02\x02\x02" + - "\u02DC\u02DD\x03\x02\x02\x02\u02DD\u02DE\x07@\x02\x02\u02DE\u02DF\x07" + - "@\x02\x02\u02DF\u02E0\x07\x1D\x02\x02\u02E0\u02E1\x05.\x18\x02\u02E1=" + - "\x03\x02\x02\x02\u02E2\u02E5\x07\'\x02\x02\u02E3\u02E5\x05P)\x02\u02E4" + - "\u02E2\x03\x02\x02\x02\u02E4\u02E3\x03\x02\x02\x02\u02E5?\x03\x02\x02" + - "\x02\u02E6\u02E7\x05> \x02\u02E7A\x03\x02\x02\x02\u02E8\u02EB\x075\x02" + - "\x02\u02E9\u02EB\x05P)\x02\u02EA\u02E8\x03\x02\x02\x02\u02EA\u02E9\x03" + - "\x02\x02\x02\u02EBC\x03\x02\x02\x02\u02EC\u02F1\x05.\x18\x02\u02ED\u02EE" + - "\x07\n\x02\x02\u02EE\u02F0\x05.\x18\x02\u02EF\u02ED\x03\x02\x02\x02\u02F0" + - "\u02F3\x03\x02\x02\x02\u02F1\u02EF\x03\x02\x02\x02\u02F1\u02F2\x03\x02" + - "\x02\x02\u02F2E\x03\x02\x02\x02\u02F3\u02F1\x03\x02\x02\x02\u02F4\u02F5" + - "\x05R*\x02\u02F5\u02F6\x07\x07\x02\x02\u02F6\u02F7\x05.\x18\x02\u02F7" + - "\u02FB\x03\x02\x02\x02\u02F8\u02F9\x07(\x02\x02\u02F9\u02FB\x05.\x18\x02" + - "\u02FA\u02F4\x03\x02\x02\x02\u02FA\u02F8\x03\x02\x02\x02\u02FBG\x03\x02" + - "\x02\x02\u02FC\u02FF\x05P)\x02\u02FD\u02FF\t\x05\x02\x02\u02FE\u02FC\x03" + - "\x02\x02\x02\u02FE\u02FD\x03\x02\x02\x02\u02FFI\x03\x02\x02\x02\u0300" + - "\u0303\x05P)\x02\u0301\u0303\t\x06\x02\x02\u0302\u0300\x03\x02\x02\x02" + - "\u0302\u0301\x03\x02\x02\x02\u0303K\x03\x02\x02\x02\u0304\u0305\t\x07" + - "\x02\x02\u0305M\x03\x02\x02\x02\u0306\u0307\t\b\x02\x02\u0307O\x03\x02" + - "\x02\x02\u0308\u030D\x05T+\x02\u0309\u030A\x07)\x02\x02\u030A\u030C\x05" + - "T+\x02\u030B\u0309\x03\x02\x02\x02\u030C\u030F\x03\x02\x02\x02\u030D\u030B" + - "\x03\x02\x02\x02\u030D\u030E\x03\x02\x02\x02\u030EQ\x03\x02\x02\x02\u030F" + - "\u030D\x03\x02\x02\x02\u0310\u0315\x05T+\x02\u0311\u0312\x05P)\x02\u0312" + - "\u0313\b*\x01\x02\u0313\u0315\x03\x02\x02\x02\u0314\u0310\x03\x02\x02" + - "\x02\u0314\u0311\x03\x02\x02\x02\u0315S\x03\x02\x02\x02\u0316\u0317\t" + - "\t\x02\x02\u0317U\x03\x02\x02\x02WY`iq\x8A\x94\x97\x9C\xAB\xB2\xB6\xB9" + - "\xC7\xD0\xD5\xD8\xDF\xE7\xED\xF2\xFD\u0105\u010B\u010F\u0111\u011C\u011E" + - "\u012D\u0135\u0144\u014C\u014E\u015F\u0162\u0165\u017C\u0180\u0186\u0192" + - "\u01A1\u01A6\u01A8\u01B8\u01BE\u01C2\u01CB\u01DD\u01E1\u01EC\u01F0\u01FC" + - "\u0200\u020B\u020F\u0217\u0221\u0225\u022F\u0233\u023D\u0240\u0243\u025C" + - "\u0283\u0286\u028D\u028F\u0296\u029D\u02A4\u02AD\u02B0\u02BB\u02BF\u02CB" + - "\u02D2\u02DB\u02E4\u02EA\u02F1\u02FA\u02FE\u0302\u030D\u0314"; + "\u01EE\u01EF\x07\x04\x02\x02\u01EF\u01F4\x05.\x18\x02\u01F0\u01F1\x07" + + "\n\x02\x02\u01F1\u01F3\x05.\x18\x02\u01F2\u01F0\x03\x02\x02\x02\u01F3" + + "\u01F6\x03\x02\x02\x02\u01F4\u01F2\x03\x02\x02\x02\u01F4\u01F5\x03\x02" + + "\x02\x02\u01F5\u01F8\x03\x02\x02\x02\u01F6\u01F4\x03\x02\x02\x02\u01F7" + + "\u01F9\x07\n\x02\x02\u01F8\u01F7\x03\x02\x02\x02\u01F8\u01F9\x03\x02\x02" + + "\x02\u01F9\u01FA\x03\x02\x02\x02\u01FA\u01FB\x07\x05\x02\x02\u01FB\u0265" + + "\x03\x02\x02\x02\u01FC\u0265\x050\x19\x02\u01FD\u01FE\x07#\x02\x02\u01FE" + + "\u01FF\x07\x04\x02\x02\u01FF\u0204\x05.\x18\x02\u0200\u0201\x07\n\x02" + + "\x02\u0201\u0203\x05.\x18\x02\u0202\u0200\x03\x02\x02\x02\u0203\u0206" + + "\x03\x02\x02\x02\u0204\u0202\x03\x02\x02\x02\u0204\u0205\x03\x02\x02\x02" + + "\u0205\u0208\x03\x02\x02\x02\u0206\u0204\x03\x02\x02\x02\u0207\u0209\x07" + + "\n\x02\x02\u0208\u0207\x03\x02\x02\x02\u0208\u0209\x03\x02\x02\x02\u0209" + + "\u020A\x03\x02\x02\x02\u020A\u020B\x07\x05\x02\x02\u020B\u0265\x03\x02" + + "\x02\x02\u020C\u020D\x07$\x02\x02\u020D\u020E\x07\x04\x02\x02\u020E\u0213" + + "\x05.\x18\x02\u020F\u0210\x07\n\x02\x02\u0210\u0212\x05.\x18\x02\u0211" + + "\u020F\x03\x02\x02\x02\u0212\u0215\x03\x02\x02\x02\u0213\u0211\x03\x02" + + "\x02\x02\u0213\u0214\x03\x02\x02\x02\u0214\u0217\x03\x02\x02\x02\u0215" + + "\u0213\x03\x02\x02\x02\u0216\u0218\x07\n\x02\x02\u0217\u0216\x03\x02\x02" + + "\x02\u0217\u0218\x03\x02\x02\x02\u0218\u0219\x03\x02\x02\x02\u0219\u021A" + + "\x07\x05\x02\x02\u021A\u0265\x03\x02\x02\x02\u021B\u0220\x05P)\x02\u021C" + + "\u0220\x07,\x02\x02\u021D\u0220\x07+\x02\x02\u021E\u0220\x07*\x02\x02" + + "\u021F\u021B\x03\x02\x02\x02\u021F\u021C\x03\x02\x02\x02\u021F\u021D\x03" + + "\x02\x02\x02\u021F\u021E\x03\x02\x02\x02\u0220\u0265\x03\x02\x02\x02\u0221" + + "\u0222\x07?\x02\x02\u0222\u0223\x05.\x18\x02\u0223\u0224\x07\n\x02\x02" + + "\u0224\u0229\x05.\x18\x02\u0225\u0226\x07\n\x02\x02\u0226\u0228\x05.\x18" + + "\x02\u0227\u0225\x03\x02\x02\x02\u0228\u022B\x03\x02\x02\x02\u0229\u0227" + + "\x03\x02\x02\x02\u0229\u022A\x03\x02\x02\x02\u022A\u022D\x03\x02\x02\x02" + + "\u022B\u0229\x03\x02\x02\x02\u022C\u022E\x07\n\x02\x02\u022D\u022C\x03" + + "\x02\x02\x02\u022D\u022E\x03\x02\x02\x02\u022E\u022F\x03\x02\x02\x02\u022F" + + "\u0230\x07@\x02\x02\u0230\u0265\x03\x02\x02\x02\u0231\u0232\x07\x04\x02" + + "\x02\u0232\u0237\x05F$\x02\u0233\u0234\x07\n\x02\x02\u0234\u0236\x05F" + + "$\x02\u0235\u0233\x03\x02\x02\x02\u0236\u0239\x03\x02\x02\x02\u0237\u0235" + + "\x03\x02\x02\x02\u0237\u0238\x03\x02\x02\x02\u0238\u023B\x03\x02\x02\x02" + + "\u0239\u0237\x03\x02\x02\x02\u023A\u023C\x07\n\x02\x02\u023B\u023A\x03" + + "\x02\x02\x02\u023B\u023C\x03\x02\x02\x02\u023C\u023D\x03\x02\x02\x02\u023D" + + "\u023E\x07\x05\x02\x02\u023E\u0265\x03\x02\x02\x02\u023F\u0248\x07\r\x02" + + "\x02\u0240\u0245\x05.\x18\x02\u0241\u0242\x07\n\x02\x02\u0242\u0244\x05" + + ".\x18\x02\u0243\u0241\x03\x02\x02\x02\u0244\u0247\x03\x02\x02\x02\u0245" + + "\u0243\x03\x02\x02\x02\u0245\u0246\x03\x02\x02\x02\u0246\u0249\x03\x02" + + "\x02\x02\u0247\u0245\x03\x02\x02\x02\u0248\u0240\x03\x02\x02\x02\u0248" + + "\u0249\x03\x02\x02\x02\u0249\u024B\x03\x02\x02\x02\u024A\u024C\x07\n\x02" + + "\x02\u024B\u024A\x03\x02\x02\x02\u024B\u024C\x03\x02\x02\x02\u024C\u024D" + + "\x03\x02\x02\x02\u024D\u0265\x07\x0E\x02\x02\u024E\u024F\x07%\x02\x02" + + "\u024F\u0250\x07?\x02\x02\u0250\u0251\x05.\x18\x02\u0251\u0252\x07@\x02" + + "\x02\u0252\u0253\x05.\x18\x02\u0253\u0254\x07&\x02\x02\u0254\u0255\x05" + + ".\x18\x07\u0255\u0265\x03\x02\x02\x02\u0256\u0257\x05\n\x06\x02\u0257" + + "\u0258\x05.\x18\x06\u0258\u0265\x03\x02\x02\x02\u0259\u025A\x05\x14\v" + + "\x02\u025A\u025B\x05.\x18\x05\u025B\u0265\x03\x02\x02\x02\u025C\u025D" + + "\x07?\x02\x02\u025D\u025E\x05.\x18\x02\u025E\u025F\x07@\x02\x02\u025F" + + "\u0265\x03\x02\x02\x02\u0260\u0261\x07\x04\x02\x02\u0261\u0262\x05.\x18" + + "\x02\u0262\u0263\x07\x05\x02\x02\u0263\u0265\x03\x02\x02\x02\u0264\u01CE" + + "\x03\x02\x02\x02\u0264\u01D0\x03\x02\x02\x02\u0264\u01D7\x03\x02\x02\x02" + + "\u0264\u01D9\x03\x02\x02\x02\u0264\u01DE\x03\x02\x02\x02\u0264\u01ED\x03" + + "\x02\x02\x02\u0264\u01FC\x03\x02\x02\x02\u0264\u01FD\x03\x02\x02\x02\u0264" + + "\u020C\x03\x02\x02\x02\u0264\u021F\x03\x02\x02\x02\u0264\u0221\x03\x02" + + "\x02\x02\u0264\u0231\x03\x02\x02\x02\u0264\u023F\x03\x02\x02\x02\u0264" + + "\u024E\x03\x02\x02\x02\u0264\u0256\x03\x02\x02\x02\u0264\u0259\x03\x02" + + "\x02\x02\u0264\u025C\x03\x02\x02\x02\u0264\u0260\x03\x02\x02\x02\u0265" + + "\u0297\x03\x02\x02\x02\u0266\u0267\f\x1C\x02\x02\u0267\u0268\x07!\x02" + + "\x02\u0268\u0296\x05.\x18\x1C\u0269\u026A\f\x1A\x02\x02\u026A\u026B\t" + + "\x02\x02\x02\u026B\u0296\x05.\x18\x1B\u026C\u026D\f\x19\x02\x02\u026D" + + "\u026E\t\x03\x02\x02\u026E\u0296\x05.\x18\x1A\u026F\u0270\f\x18\x02\x02" + + "\u0270\u0271\t\x04\x02\x02\u0271\u0296\x05.\x18\x19\u0272\u0273\f\x16" + + "\x02\x02\u0273\u0274\x07>\x02\x02\u0274\u0275\x05.\x18\x17\u0275\u0276" + + "\b\x18\x01\x02\u0276\u0296\x03\x02\x02\x02\u0277\u0278\f\x14\x02\x02\u0278" + + "\u0279\x07-\x02\x02\u0279\u0296\x05.\x18\x15\u027A\u027B\f\x12\x02\x02" + + "\u027B\u027C\x07.\x02\x02\u027C\u0296\x05.\x18\x13\u027D\u027E\f\x11\x02" + + "\x02\u027E\u027F\x07/\x02\x02\u027F\u0296\x05.\x18\x12\u0280\u0281\f\x10" + + "\x02\x02\u0281\u0282\x070\x02\x02\u0282\u0296\x05.\x18\x11\u0283\u0284" + + "\f\n\x02\x02\u0284\u0285\x07\x1C\x02\x02\u0285\u0296\x05.\x18\v\u0286" + + "\u0287\f \x02\x02\u0287\u0288\x07\x18\x02\x02\u0288\u028E\x05J&\x02\u0289" + + "\u028B\x07?\x02\x02\u028A\u028C\x05D#\x02\u028B\u028A\x03\x02\x02\x02" + + "\u028B\u028C\x03\x02\x02\x02\u028C\u028D\x03\x02\x02\x02\u028D\u028F\x07" + + "@\x02\x02\u028E\u0289\x03\x02\x02\x02\u028E\u028F\x03\x02\x02\x02\u028F" + + "\u0296\x03\x02\x02\x02\u0290\u0291\f\x1D\x02\x02\u0291\u0292\x07\r\x02" + + "\x02\u0292\u0293\x05.\x18\x02\u0293\u0294\x07\x0E\x02\x02\u0294\u0296" + + "\x03\x02\x02\x02\u0295\u0266\x03\x02\x02\x02\u0295\u0269\x03\x02\x02\x02" + + "\u0295\u026C\x03\x02\x02\x02\u0295\u026F\x03\x02\x02\x02\u0295\u0272\x03" + + "\x02\x02\x02\u0295\u0277\x03\x02\x02\x02\u0295\u027A\x03\x02\x02\x02\u0295" + + "\u027D\x03\x02\x02\x02\u0295\u0280\x03\x02\x02\x02\u0295\u0283\x03\x02" + + "\x02\x02\u0295\u0286\x03\x02\x02\x02\u0295\u0290\x03\x02\x02\x02\u0296" + + "\u0299\x03\x02\x02\x02\u0297\u0295\x03\x02\x02\x02\u0297\u0298\x03\x02" + + "\x02\x02\u0298/\x03\x02\x02\x02\u0299\u0297\x03\x02\x02\x02\u029A\u029B" + + "\x072\x02\x02\u029B\u029C\x05.\x18\x02\u029C\u029E\x07\x04\x02\x02\u029D" + + "\u029F\x07\x0F\x02\x02\u029E\u029D\x03\x02\x02\x02\u029E\u029F\x03\x02" + + "\x02\x02\u029F\u02A0\x03\x02\x02\x02\u02A0\u02A5\x052\x1A\x02\u02A1\u02A2" + + "\x07\x0F\x02\x02\u02A2\u02A4\x052\x1A\x02\u02A3\u02A1\x03\x02\x02\x02" + + "\u02A4\u02A7\x03\x02\x02\x02\u02A5\u02A3\x03\x02\x02\x02\u02A5\u02A6\x03" + + "\x02\x02\x02\u02A6\u02A8\x03\x02\x02\x02\u02A7\u02A5\x03\x02\x02\x02\u02A8" + + "\u02A9\x07\x05\x02\x02\u02A91\x03\x02\x02\x02\u02AA\u02AD\x054\x1B\x02" + + "\u02AB\u02AD\x07\'\x02\x02\u02AC\u02AA\x03\x02\x02\x02\u02AC\u02AB\x03" + + "\x02\x02\x02\u02AD\u02AE\x03\x02\x02\x02\u02AE\u02AF\x07\x1D\x02\x02\u02AF" + + "\u02B0\x05.\x18\x02\u02B03\x03\x02\x02\x02\u02B1\u02B8\x05R*\x02\u02B2" + + "\u02B5\x07?\x02\x02\u02B3\u02B6\x05R*\x02\u02B4\u02B6\x07\'\x02\x02\u02B5" + + "\u02B3\x03\x02\x02\x02\u02B5\u02B4\x03\x02\x02\x02\u02B6\u02B7\x03\x02" + + "\x02\x02\u02B7\u02B9\x07@\x02\x02\u02B8\u02B2\x03\x02\x02\x02\u02B8\u02B9" + + "\x03\x02\x02\x02\u02B95\x03\x02\x02\x02\u02BA\u02BB\x05\b\x05\x02\u02BB" + + "\u02BC\x07\x02\x02\x03\u02BC\u02C4\x03\x02\x02\x02\u02BD\u02BE\x05.\x18" + + "\x02\u02BE\u02BF\x07\x02\x02\x03\u02BF\u02C4\x03\x02\x02\x02\u02C0\u02C1" + + "\x07E\x02\x02\u02C1\u02C4\x07\x02\x02\x03\u02C2\u02C4\x07\x02\x02\x03" + + "\u02C3\u02BA\x03\x02\x02\x02\u02C3\u02BD\x03\x02\x02\x02\u02C3\u02C0\x03" + + "\x02\x02\x02\u02C3\u02C2\x03\x02\x02\x02\u02C47\x03\x02\x02\x02\u02C5" + + "\u02C8\x05:\x1E\x02\u02C6\u02C8\x05<\x1F\x02\u02C7\u02C5\x03\x02\x02\x02" + + "\u02C7\u02C6\x03\x02\x02\x02\u02C89\x03\x02\x02\x02\u02C9\u02CA\x05@!" + + "\x02\u02CA\u02CB\x07\x1D\x02\x02\u02CB\u02CC\x05.\x18\x02\u02CC\u02DB" + + "\x03\x02\x02\x02\u02CD\u02CE\x07?\x02\x02\u02CE\u02D3\x05@!\x02\u02CF" + + "\u02D0\x07\n\x02\x02\u02D0\u02D2\x05@!\x02\u02D1\u02CF\x03\x02\x02\x02" + + "\u02D2\u02D5\x03\x02\x02\x02\u02D3\u02D1\x03\x02\x02\x02\u02D3\u02D4\x03" + + "\x02\x02\x02\u02D4\u02D6\x03\x02\x02\x02\u02D5\u02D3\x03\x02\x02\x02\u02D6" + + "\u02D7\x07@\x02\x02\u02D7\u02D8\x07\x1D\x02\x02\u02D8\u02D9\x05.\x18\x02" + + "\u02D9\u02DB\x03\x02\x02\x02\u02DA\u02C9\x03\x02\x02\x02\u02DA\u02CD\x03" + + "\x02\x02\x02\u02DB;\x03\x02\x02\x02\u02DC\u02DD\x07?\x02\x02\u02DD\u02DE" + + "\x07?\x02\x02\u02DE\u02E1\x05@!\x02\u02DF\u02E0\x07\n\x02\x02\u02E0\u02E2" + + "\x05@!\x02\u02E1\u02DF\x03\x02\x02\x02\u02E2\u02E3\x03\x02\x02\x02\u02E3" + + "\u02E1\x03\x02\x02\x02\u02E3\u02E4\x03\x02\x02\x02\u02E4\u02E5\x03\x02" + + "\x02\x02\u02E5\u02E6\x07@\x02\x02\u02E6\u02E7\x07@\x02\x02\u02E7\u02E8" + + "\x07\x1D\x02\x02\u02E8\u02E9\x05.\x18\x02\u02E9=\x03\x02\x02\x02\u02EA" + + "\u02ED\x07\'\x02\x02\u02EB\u02ED\x05P)\x02\u02EC\u02EA\x03\x02\x02\x02" + + "\u02EC\u02EB\x03\x02\x02\x02\u02ED?\x03\x02\x02\x02\u02EE\u02EF\x05> " + + "\x02\u02EFA\x03\x02\x02\x02\u02F0\u02F3\x075\x02\x02\u02F1\u02F3\x05P" + + ")\x02\u02F2\u02F0\x03\x02\x02\x02\u02F2\u02F1\x03\x02\x02\x02\u02F3C\x03" + + "\x02\x02\x02\u02F4\u02F9\x05.\x18\x02\u02F5\u02F6\x07\n\x02\x02\u02F6" + + "\u02F8\x05.\x18\x02\u02F7\u02F5\x03\x02\x02\x02\u02F8\u02FB\x03\x02\x02" + + "\x02\u02F9\u02F7\x03\x02\x02\x02\u02F9\u02FA\x03\x02\x02\x02\u02FAE\x03" + + "\x02\x02\x02\u02FB\u02F9\x03\x02\x02\x02\u02FC\u02FD\x05R*\x02\u02FD\u02FE" + + "\x07\x07\x02\x02\u02FE\u02FF\x05.\x18\x02\u02FF\u0303\x03\x02\x02\x02" + + "\u0300\u0301\x07(\x02\x02\u0301\u0303\x05.\x18\x02\u0302\u02FC\x03\x02" + + "\x02\x02\u0302\u0300\x03\x02\x02\x02\u0303G\x03\x02\x02\x02\u0304\u0307" + + "\x05P)\x02\u0305\u0307\t\x05\x02\x02\u0306\u0304\x03\x02\x02\x02\u0306" + + "\u0305\x03\x02\x02\x02\u0307I\x03\x02\x02\x02\u0308\u030B\x05P)\x02\u0309" + + "\u030B\t\x06\x02\x02\u030A\u0308\x03\x02\x02\x02\u030A\u0309\x03\x02\x02" + + "\x02\u030BK\x03\x02\x02\x02\u030C\u030D\t\x07\x02\x02\u030DM\x03\x02\x02" + + "\x02\u030E\u030F\t\b\x02\x02\u030FO\x03\x02\x02\x02\u0310\u0315\x05T+" + + "\x02\u0311\u0312\x07)\x02\x02\u0312\u0314\x05T+\x02\u0313\u0311\x03\x02" + + "\x02\x02\u0314\u0317\x03\x02\x02\x02\u0315\u0313\x03\x02\x02\x02\u0315" + + "\u0316\x03\x02\x02\x02\u0316Q\x03\x02\x02\x02\u0317\u0315\x03\x02\x02" + + "\x02\u0318\u031D\x05T+\x02\u0319\u031A\x05P)\x02\u031A\u031B\b*\x01\x02" + + "\u031B\u031D\x03\x02\x02\x02\u031C\u0318\x03\x02\x02\x02\u031C\u0319\x03" + + "\x02\x02\x02\u031DS\x03\x02\x02\x02\u031E\u031F\t\t\x02\x02\u031FU\x03" + + "\x02\x02\x02ZY`iq\x8A\x94\x97\x9A\x9E\xA2\xA5\xB4\xBC\xBF\xC1\xCF\xD8" + + "\xDD\xE0\xE7\xEF\xF5\xFA\u0105\u010D\u0113\u0117\u0119\u0124\u0126\u0135" + + "\u013D\u014C\u0154\u0156\u0167\u016A\u016D\u0184\u0188\u018E\u019A\u01A9" + + "\u01AE\u01B0\u01C0\u01C6\u01CA\u01D3\u01E5\u01E9\u01F4\u01F8\u0204\u0208" + + "\u0213\u0217\u021F\u0229\u022D\u0237\u023B\u0245\u0248\u024B\u0264\u028B" + + "\u028E\u0295\u0297\u029E\u02A5\u02AC\u02B5\u02B8\u02C3\u02C7\u02D3\u02DA" + + "\u02E3\u02EC\u02F2\u02F9\u0302\u0306\u030A\u0315\u031C"; public static readonly _serializedATN: string = Utils.join( [ QuintParser._serializedATNSegment0, From c653b1c8f6c5f0da9cf11823fe23d18e6b05db1b Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 15 Feb 2024 13:49:05 -0500 Subject: [PATCH 235/388] Clean up ToIrListener Remove unneeded mutable vars and checks. --- quint/src/parsing/ToIrListener.ts | 35 +++++++------------------------ 1 file changed, 7 insertions(+), 28 deletions(-) diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index ffa81a062..56053b2e1 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -230,36 +230,15 @@ export class ToIrListener implements QuintListener { // does not have a representation for this at the moment { id: this.getId(ctx), kind: 'bool', value: true } - // extract the qualifier - let qualifier: OpQualifier = 'def' - if (ctx.qualifier()) { - const qtext = ctx.qualifier().text - // case distinction to make the type checker happy - if ( - qtext === 'pureval' || - qtext === 'puredef' || - qtext === 'val' || - qtext === 'def' || - qtext === 'action' || - qtext === 'run' || - qtext === 'temporal' - ) { - qualifier = qtext - } - } + // The grammar should guarantee we only parse valid OpQualifiers here + const qualifier: OpQualifier = ctx.qualifier().text as OpQualifier - let body = expr + const body: QuintEx = + params.length === 0 + ? expr + : // if the definition has parameters, introduce a lambda + { id: this.getId(ctx), kind: 'lambda', params, qualifier, expr } - if (params.length > 0) { - // if the definition has parameters, introduce a lambda - body = { - id: this.getId(ctx), - kind: 'lambda', - params, - qualifier, - expr, - } - } const def: QuintOpDef = { id: this.getId(ctx), kind: 'def', From 5955315c76042f64ff20aa56c324e83d4bd9759f Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 16 Feb 2024 00:15:24 -0500 Subject: [PATCH 236/388] Parse type annotations into operator params --- quint/src/generated/Quint.g4 | 29 +- quint/src/generated/Quint.interp | 3 +- quint/src/generated/QuintListener.ts | 40 + quint/src/generated/QuintParser.ts | 2156 ++++++++++++---------- quint/src/generated/QuintVisitor.ts | 26 + quint/src/ir/quintIr.ts | 2 +- quint/src/parsing/ToIrListener.ts | 117 +- quint/test/ir/IRFinder.test.ts | 9 +- quint/test/types/inferrer.test.ts | 4 +- quint/testFixture/SuperSpec.json | 2 +- quint/testFixture/SuperSpec.map.json | 2 +- quint/testFixture/_1030const.json | 2 +- quint/testFixture/_1030const.map.json | 2 +- quint/testFixture/_1031instance.json | 2 +- quint/testFixture/_1031instance.map.json | 2 +- quint/testFixture/modulesAndJunk.json | 2 +- 16 files changed, 1309 insertions(+), 1091 deletions(-) diff --git a/quint/src/generated/Quint.g4 b/quint/src/generated/Quint.g4 index d027fc90d..ce8359885 100644 --- a/quint/src/generated/Quint.g4 +++ b/quint/src/generated/Quint.g4 @@ -25,7 +25,7 @@ documentedDeclaration : DOCCOMMENT* declaration; // a module declaration declaration : 'const' qualId ':' type # const | 'var' qualId ':' type # var - | 'assume' identOrHole '=' expr # assume + | 'assume' (assumeName=identOrHole) '=' expr # assume | instanceMod # instance | operDef # oper | typeDef # typeDefs @@ -41,22 +41,25 @@ declaration : 'const' qualId ':' type # const // An operator definition. operDef : qualifier normalCallName - // Unannotated parameter list - ('(' (parameter (',' parameter)*)? ')')? - // Optional type annotation using the deprecated format - // TODO: Remove as per https://github.com/informalsystems/quint/issues/923 - (':' type)? + // Fully-annotated parameter list with at least one parameter + '(' (annotOperParam+=annotatedParameter (',' annotOperParam+=annotatedParameter)*) ')' + // Mandatory annotation for return type + ':' type // We support header declaration with no implementation for documentation genaration ('=' expr)? // Optionally terminated with a semicolon ';'? - | qualifier normalCallName - // Fully annotated parameter lists - '(' (parameter ':' type (',' parameter ':' type)*) ')' ':' type + # annotatedOperDef + | qualifier normalCallName // TODO: Remove as per https://github.com/informalsystems/quint/issues/923 + // Unannotated parameter list + ('(' (operParam+=parameter (',' operParam+=parameter)*)? ')')? + // Optional type annotation using the deprecated format + (':' annotatedRetType=type)? // We support header declaration with no implementation for documentation genaration ('=' expr)? // Optionally terminated with a semicolon ';'? + # deprecatedOperDef ; typeDef @@ -213,10 +216,12 @@ lambdaUnsugared : parameter '=>' expr lambdaTupleSugar : '(' '(' parameter (',' parameter)+ ')' ')' '=>' expr; // an identifier or a hole '_' -identOrHole : '_' | qualId - ; +identOrHole : '_' | qualId; -parameter: identOrHole; +// TODO: Combine these into a single rule that support optionally annotated parameters +// Requires https://github.com/informalsystems/quint/issues/923 +parameter: paramName=identOrHole; +annotatedParameter: paramName=identOrHole ':' type; // an identifier or a star '*' identOrStar : '*' | qualId diff --git a/quint/src/generated/Quint.interp b/quint/src/generated/Quint.interp index 20af851ff..7f37f7d5e 100644 --- a/quint/src/generated/Quint.interp +++ b/quint/src/generated/Quint.interp @@ -177,6 +177,7 @@ lambdaUnsugared lambdaTupleSugar identOrHole parameter +annotatedParameter identOrStar argList recElem @@ -190,4 +191,4 @@ identifier atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 801, 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, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 3, 2, 6, 2, 88, 10, 2, 13, 2, 14, 2, 89, 3, 2, 3, 2, 3, 3, 7, 3, 95, 10, 3, 12, 3, 14, 3, 98, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 104, 10, 3, 12, 3, 14, 3, 107, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 112, 10, 4, 12, 4, 14, 4, 115, 11, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 139, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 147, 10, 6, 12, 6, 14, 6, 150, 11, 6, 5, 6, 152, 10, 6, 3, 6, 5, 6, 155, 10, 6, 3, 6, 3, 6, 5, 6, 159, 10, 6, 3, 6, 3, 6, 5, 6, 163, 10, 6, 3, 6, 5, 6, 166, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 179, 10, 6, 12, 6, 14, 6, 182, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 189, 10, 6, 3, 6, 5, 6, 192, 10, 6, 5, 6, 194, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 208, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 215, 10, 8, 12, 8, 14, 8, 218, 11, 8, 3, 8, 3, 8, 5, 8, 222, 10, 8, 3, 9, 5, 9, 225, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 230, 10, 9, 12, 9, 14, 9, 233, 11, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 240, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 246, 10, 11, 3, 11, 3, 11, 3, 11, 5, 11, 251, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 262, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 270, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 276, 10, 13, 3, 13, 3, 13, 5, 13, 280, 10, 13, 5, 13, 282, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 293, 10, 14, 5, 14, 295, 10, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 308, 10, 15, 12, 15, 14, 15, 311, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 318, 10, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 331, 10, 15, 12, 15, 14, 15, 334, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 341, 10, 15, 5, 15, 343, 10, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 358, 10, 20, 12, 20, 14, 20, 361, 11, 20, 5, 20, 363, 10, 20, 3, 20, 5, 20, 366, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 387, 10, 20, 12, 20, 14, 20, 390, 11, 20, 3, 20, 5, 20, 393, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 399, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 411, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 424, 10, 20, 12, 20, 14, 20, 427, 11, 20, 3, 20, 3, 20, 7, 20, 431, 10, 20, 12, 20, 14, 20, 434, 11, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 447, 10, 22, 12, 22, 14, 22, 450, 11, 22, 3, 22, 3, 22, 3, 22, 5, 22, 455, 10, 22, 3, 22, 3, 22, 5, 22, 459, 10, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 468, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 484, 10, 24, 12, 24, 14, 24, 487, 11, 24, 3, 24, 5, 24, 490, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 499, 10, 24, 12, 24, 14, 24, 502, 11, 24, 3, 24, 5, 24, 505, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 515, 10, 24, 12, 24, 14, 24, 518, 11, 24, 3, 24, 5, 24, 521, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 530, 10, 24, 12, 24, 14, 24, 533, 11, 24, 3, 24, 5, 24, 536, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 544, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 552, 10, 24, 12, 24, 14, 24, 555, 11, 24, 3, 24, 5, 24, 558, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 566, 10, 24, 12, 24, 14, 24, 569, 11, 24, 3, 24, 5, 24, 572, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 580, 10, 24, 12, 24, 14, 24, 583, 11, 24, 5, 24, 585, 10, 24, 3, 24, 5, 24, 588, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 613, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 652, 10, 24, 3, 24, 5, 24, 655, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 662, 10, 24, 12, 24, 14, 24, 665, 11, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 671, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 676, 10, 25, 12, 25, 14, 25, 679, 11, 25, 3, 25, 3, 25, 3, 26, 3, 26, 5, 26, 685, 10, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 694, 10, 27, 3, 27, 5, 27, 697, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 708, 10, 28, 3, 29, 3, 29, 5, 29, 712, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 722, 10, 30, 12, 30, 14, 30, 725, 11, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 731, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 6, 31, 738, 10, 31, 13, 31, 14, 31, 739, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 5, 32, 749, 10, 32, 3, 33, 3, 33, 3, 34, 3, 34, 5, 34, 755, 10, 34, 3, 35, 3, 35, 3, 35, 7, 35, 760, 10, 35, 12, 35, 14, 35, 763, 11, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 5, 36, 771, 10, 36, 3, 37, 3, 37, 5, 37, 775, 10, 37, 3, 38, 3, 38, 5, 38, 779, 10, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 7, 41, 788, 10, 41, 12, 41, 14, 41, 791, 11, 41, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 797, 10, 42, 3, 43, 3, 43, 3, 43, 2, 2, 4, 38, 46, 44, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 68, 2, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 2, 10, 3, 2, 53, 55, 3, 2, 51, 52, 3, 2, 56, 61, 4, 2, 45, 49, 65, 66, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 51, 61, 3, 2, 42, 44, 3, 2, 67, 68, 2, 899, 2, 87, 3, 2, 2, 2, 4, 96, 3, 2, 2, 2, 6, 113, 3, 2, 2, 2, 8, 138, 3, 2, 2, 2, 10, 193, 3, 2, 2, 2, 12, 207, 3, 2, 2, 2, 14, 209, 3, 2, 2, 2, 16, 224, 3, 2, 2, 2, 18, 234, 3, 2, 2, 2, 20, 241, 3, 2, 2, 2, 22, 261, 3, 2, 2, 2, 24, 281, 3, 2, 2, 2, 26, 294, 3, 2, 2, 2, 28, 342, 3, 2, 2, 2, 30, 344, 3, 2, 2, 2, 32, 346, 3, 2, 2, 2, 34, 348, 3, 2, 2, 2, 36, 350, 3, 2, 2, 2, 38, 410, 3, 2, 2, 2, 40, 435, 3, 2, 2, 2, 42, 458, 3, 2, 2, 2, 44, 460, 3, 2, 2, 2, 46, 612, 3, 2, 2, 2, 48, 666, 3, 2, 2, 2, 50, 684, 3, 2, 2, 2, 52, 689, 3, 2, 2, 2, 54, 707, 3, 2, 2, 2, 56, 711, 3, 2, 2, 2, 58, 730, 3, 2, 2, 2, 60, 732, 3, 2, 2, 2, 62, 748, 3, 2, 2, 2, 64, 750, 3, 2, 2, 2, 66, 754, 3, 2, 2, 2, 68, 756, 3, 2, 2, 2, 70, 770, 3, 2, 2, 2, 72, 774, 3, 2, 2, 2, 74, 778, 3, 2, 2, 2, 76, 780, 3, 2, 2, 2, 78, 782, 3, 2, 2, 2, 80, 784, 3, 2, 2, 2, 82, 796, 3, 2, 2, 2, 84, 798, 3, 2, 2, 2, 86, 88, 5, 4, 3, 2, 87, 86, 3, 2, 2, 2, 88, 89, 3, 2, 2, 2, 89, 87, 3, 2, 2, 2, 89, 90, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 92, 7, 2, 2, 3, 92, 3, 3, 2, 2, 2, 93, 95, 7, 69, 2, 2, 94, 93, 3, 2, 2, 2, 95, 98, 3, 2, 2, 2, 96, 94, 3, 2, 2, 2, 96, 97, 3, 2, 2, 2, 97, 99, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 99, 100, 7, 3, 2, 2, 100, 101, 5, 80, 41, 2, 101, 105, 7, 4, 2, 2, 102, 104, 5, 6, 4, 2, 103, 102, 3, 2, 2, 2, 104, 107, 3, 2, 2, 2, 105, 103, 3, 2, 2, 2, 105, 106, 3, 2, 2, 2, 106, 108, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 108, 109, 7, 5, 2, 2, 109, 5, 3, 2, 2, 2, 110, 112, 7, 69, 2, 2, 111, 110, 3, 2, 2, 2, 112, 115, 3, 2, 2, 2, 113, 111, 3, 2, 2, 2, 113, 114, 3, 2, 2, 2, 114, 116, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 116, 117, 5, 8, 5, 2, 117, 7, 3, 2, 2, 2, 118, 119, 7, 6, 2, 2, 119, 120, 5, 80, 41, 2, 120, 121, 7, 7, 2, 2, 121, 122, 5, 38, 20, 2, 122, 139, 3, 2, 2, 2, 123, 124, 7, 8, 2, 2, 124, 125, 5, 80, 41, 2, 125, 126, 7, 7, 2, 2, 126, 127, 5, 38, 20, 2, 127, 139, 3, 2, 2, 2, 128, 129, 7, 9, 2, 2, 129, 130, 5, 62, 32, 2, 130, 131, 7, 62, 2, 2, 131, 132, 5, 46, 24, 2, 132, 139, 3, 2, 2, 2, 133, 139, 5, 28, 15, 2, 134, 139, 5, 10, 6, 2, 135, 139, 5, 12, 7, 2, 136, 139, 5, 24, 13, 2, 137, 139, 5, 26, 14, 2, 138, 118, 3, 2, 2, 2, 138, 123, 3, 2, 2, 2, 138, 128, 3, 2, 2, 2, 138, 133, 3, 2, 2, 2, 138, 134, 3, 2, 2, 2, 138, 135, 3, 2, 2, 2, 138, 136, 3, 2, 2, 2, 138, 137, 3, 2, 2, 2, 139, 9, 3, 2, 2, 2, 140, 141, 5, 22, 12, 2, 141, 154, 5, 72, 37, 2, 142, 151, 7, 63, 2, 2, 143, 148, 5, 64, 33, 2, 144, 145, 7, 10, 2, 2, 145, 147, 5, 64, 33, 2, 146, 144, 3, 2, 2, 2, 147, 150, 3, 2, 2, 2, 148, 146, 3, 2, 2, 2, 148, 149, 3, 2, 2, 2, 149, 152, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 151, 143, 3, 2, 2, 2, 151, 152, 3, 2, 2, 2, 152, 153, 3, 2, 2, 2, 153, 155, 7, 64, 2, 2, 154, 142, 3, 2, 2, 2, 154, 155, 3, 2, 2, 2, 155, 158, 3, 2, 2, 2, 156, 157, 7, 7, 2, 2, 157, 159, 5, 38, 20, 2, 158, 156, 3, 2, 2, 2, 158, 159, 3, 2, 2, 2, 159, 162, 3, 2, 2, 2, 160, 161, 7, 62, 2, 2, 161, 163, 5, 46, 24, 2, 162, 160, 3, 2, 2, 2, 162, 163, 3, 2, 2, 2, 163, 165, 3, 2, 2, 2, 164, 166, 7, 11, 2, 2, 165, 164, 3, 2, 2, 2, 165, 166, 3, 2, 2, 2, 166, 194, 3, 2, 2, 2, 167, 168, 5, 22, 12, 2, 168, 169, 5, 72, 37, 2, 169, 170, 7, 63, 2, 2, 170, 171, 5, 64, 33, 2, 171, 172, 7, 7, 2, 2, 172, 180, 5, 38, 20, 2, 173, 174, 7, 10, 2, 2, 174, 175, 5, 64, 33, 2, 175, 176, 7, 7, 2, 2, 176, 177, 5, 38, 20, 2, 177, 179, 3, 2, 2, 2, 178, 173, 3, 2, 2, 2, 179, 182, 3, 2, 2, 2, 180, 178, 3, 2, 2, 2, 180, 181, 3, 2, 2, 2, 181, 183, 3, 2, 2, 2, 182, 180, 3, 2, 2, 2, 183, 184, 7, 64, 2, 2, 184, 185, 7, 7, 2, 2, 185, 188, 5, 38, 20, 2, 186, 187, 7, 62, 2, 2, 187, 189, 5, 46, 24, 2, 188, 186, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 191, 3, 2, 2, 2, 190, 192, 7, 11, 2, 2, 191, 190, 3, 2, 2, 2, 191, 192, 3, 2, 2, 2, 192, 194, 3, 2, 2, 2, 193, 140, 3, 2, 2, 2, 193, 167, 3, 2, 2, 2, 194, 11, 3, 2, 2, 2, 195, 196, 7, 12, 2, 2, 196, 208, 5, 80, 41, 2, 197, 198, 7, 12, 2, 2, 198, 199, 5, 14, 8, 2, 199, 200, 7, 62, 2, 2, 200, 201, 5, 38, 20, 2, 201, 208, 3, 2, 2, 2, 202, 203, 7, 12, 2, 2, 203, 204, 5, 14, 8, 2, 204, 205, 7, 62, 2, 2, 205, 206, 5, 16, 9, 2, 206, 208, 3, 2, 2, 2, 207, 195, 3, 2, 2, 2, 207, 197, 3, 2, 2, 2, 207, 202, 3, 2, 2, 2, 208, 13, 3, 2, 2, 2, 209, 221, 5, 80, 41, 2, 210, 211, 7, 13, 2, 2, 211, 216, 5, 40, 21, 2, 212, 213, 7, 10, 2, 2, 213, 215, 5, 40, 21, 2, 214, 212, 3, 2, 2, 2, 215, 218, 3, 2, 2, 2, 216, 214, 3, 2, 2, 2, 216, 217, 3, 2, 2, 2, 217, 219, 3, 2, 2, 2, 218, 216, 3, 2, 2, 2, 219, 220, 7, 14, 2, 2, 220, 222, 3, 2, 2, 2, 221, 210, 3, 2, 2, 2, 221, 222, 3, 2, 2, 2, 222, 15, 3, 2, 2, 2, 223, 225, 7, 15, 2, 2, 224, 223, 3, 2, 2, 2, 224, 225, 3, 2, 2, 2, 225, 226, 3, 2, 2, 2, 226, 231, 5, 18, 10, 2, 227, 228, 7, 15, 2, 2, 228, 230, 5, 18, 10, 2, 229, 227, 3, 2, 2, 2, 230, 233, 3, 2, 2, 2, 231, 229, 3, 2, 2, 2, 231, 232, 3, 2, 2, 2, 232, 17, 3, 2, 2, 2, 233, 231, 3, 2, 2, 2, 234, 239, 5, 82, 42, 2, 235, 236, 7, 63, 2, 2, 236, 237, 5, 38, 20, 2, 237, 238, 7, 64, 2, 2, 238, 240, 3, 2, 2, 2, 239, 235, 3, 2, 2, 2, 239, 240, 3, 2, 2, 2, 240, 19, 3, 2, 2, 2, 241, 242, 7, 16, 2, 2, 242, 245, 5, 80, 41, 2, 243, 244, 7, 7, 2, 2, 244, 246, 5, 38, 20, 2, 245, 243, 3, 2, 2, 2, 245, 246, 3, 2, 2, 2, 246, 247, 3, 2, 2, 2, 247, 248, 7, 62, 2, 2, 248, 250, 5, 46, 24, 2, 249, 251, 7, 11, 2, 2, 250, 249, 3, 2, 2, 2, 250, 251, 3, 2, 2, 2, 251, 21, 3, 2, 2, 2, 252, 262, 7, 17, 2, 2, 253, 262, 7, 18, 2, 2, 254, 255, 7, 19, 2, 2, 255, 262, 7, 17, 2, 2, 256, 257, 7, 19, 2, 2, 257, 262, 7, 18, 2, 2, 258, 262, 7, 20, 2, 2, 259, 262, 7, 21, 2, 2, 260, 262, 7, 22, 2, 2, 261, 252, 3, 2, 2, 2, 261, 253, 3, 2, 2, 2, 261, 254, 3, 2, 2, 2, 261, 256, 3, 2, 2, 2, 261, 258, 3, 2, 2, 2, 261, 259, 3, 2, 2, 2, 261, 260, 3, 2, 2, 2, 262, 23, 3, 2, 2, 2, 263, 264, 7, 23, 2, 2, 264, 265, 5, 32, 17, 2, 265, 266, 7, 24, 2, 2, 266, 269, 5, 66, 34, 2, 267, 268, 7, 25, 2, 2, 268, 270, 5, 36, 19, 2, 269, 267, 3, 2, 2, 2, 269, 270, 3, 2, 2, 2, 270, 282, 3, 2, 2, 2, 271, 272, 7, 23, 2, 2, 272, 275, 5, 32, 17, 2, 273, 274, 7, 26, 2, 2, 274, 276, 5, 32, 17, 2, 275, 273, 3, 2, 2, 2, 275, 276, 3, 2, 2, 2, 276, 279, 3, 2, 2, 2, 277, 278, 7, 25, 2, 2, 278, 280, 5, 36, 19, 2, 279, 277, 3, 2, 2, 2, 279, 280, 3, 2, 2, 2, 280, 282, 3, 2, 2, 2, 281, 263, 3, 2, 2, 2, 281, 271, 3, 2, 2, 2, 282, 25, 3, 2, 2, 2, 283, 284, 7, 27, 2, 2, 284, 285, 5, 32, 17, 2, 285, 286, 7, 24, 2, 2, 286, 287, 5, 66, 34, 2, 287, 295, 3, 2, 2, 2, 288, 289, 7, 27, 2, 2, 289, 292, 5, 32, 17, 2, 290, 291, 7, 26, 2, 2, 291, 293, 5, 32, 17, 2, 292, 290, 3, 2, 2, 2, 292, 293, 3, 2, 2, 2, 293, 295, 3, 2, 2, 2, 294, 283, 3, 2, 2, 2, 294, 288, 3, 2, 2, 2, 295, 27, 3, 2, 2, 2, 296, 297, 7, 23, 2, 2, 297, 298, 5, 30, 16, 2, 298, 299, 7, 63, 2, 2, 299, 300, 5, 32, 17, 2, 300, 301, 7, 62, 2, 2, 301, 309, 5, 46, 24, 2, 302, 303, 7, 10, 2, 2, 303, 304, 5, 32, 17, 2, 304, 305, 7, 62, 2, 2, 305, 306, 5, 46, 24, 2, 306, 308, 3, 2, 2, 2, 307, 302, 3, 2, 2, 2, 308, 311, 3, 2, 2, 2, 309, 307, 3, 2, 2, 2, 309, 310, 3, 2, 2, 2, 310, 312, 3, 2, 2, 2, 311, 309, 3, 2, 2, 2, 312, 313, 7, 64, 2, 2, 313, 314, 7, 24, 2, 2, 314, 317, 7, 53, 2, 2, 315, 316, 7, 25, 2, 2, 316, 318, 5, 36, 19, 2, 317, 315, 3, 2, 2, 2, 317, 318, 3, 2, 2, 2, 318, 343, 3, 2, 2, 2, 319, 320, 7, 23, 2, 2, 320, 321, 5, 30, 16, 2, 321, 322, 7, 63, 2, 2, 322, 323, 5, 32, 17, 2, 323, 324, 7, 62, 2, 2, 324, 332, 5, 46, 24, 2, 325, 326, 7, 10, 2, 2, 326, 327, 5, 32, 17, 2, 327, 328, 7, 62, 2, 2, 328, 329, 5, 46, 24, 2, 329, 331, 3, 2, 2, 2, 330, 325, 3, 2, 2, 2, 331, 334, 3, 2, 2, 2, 332, 330, 3, 2, 2, 2, 332, 333, 3, 2, 2, 2, 333, 335, 3, 2, 2, 2, 334, 332, 3, 2, 2, 2, 335, 336, 7, 64, 2, 2, 336, 337, 7, 26, 2, 2, 337, 340, 5, 34, 18, 2, 338, 339, 7, 25, 2, 2, 339, 341, 5, 36, 19, 2, 340, 338, 3, 2, 2, 2, 340, 341, 3, 2, 2, 2, 341, 343, 3, 2, 2, 2, 342, 296, 3, 2, 2, 2, 342, 319, 3, 2, 2, 2, 343, 29, 3, 2, 2, 2, 344, 345, 5, 80, 41, 2, 345, 31, 3, 2, 2, 2, 346, 347, 5, 80, 41, 2, 347, 33, 3, 2, 2, 2, 348, 349, 5, 80, 41, 2, 349, 35, 3, 2, 2, 2, 350, 351, 7, 42, 2, 2, 351, 37, 3, 2, 2, 2, 352, 353, 8, 20, 1, 2, 353, 362, 7, 63, 2, 2, 354, 359, 5, 38, 20, 2, 355, 356, 7, 10, 2, 2, 356, 358, 5, 38, 20, 2, 357, 355, 3, 2, 2, 2, 358, 361, 3, 2, 2, 2, 359, 357, 3, 2, 2, 2, 359, 360, 3, 2, 2, 2, 360, 363, 3, 2, 2, 2, 361, 359, 3, 2, 2, 2, 362, 354, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 365, 3, 2, 2, 2, 364, 366, 7, 10, 2, 2, 365, 364, 3, 2, 2, 2, 365, 366, 3, 2, 2, 2, 366, 367, 3, 2, 2, 2, 367, 368, 7, 64, 2, 2, 368, 369, 7, 29, 2, 2, 369, 411, 5, 38, 20, 14, 370, 371, 7, 65, 2, 2, 371, 372, 7, 13, 2, 2, 372, 373, 5, 38, 20, 2, 373, 374, 7, 14, 2, 2, 374, 411, 3, 2, 2, 2, 375, 376, 7, 66, 2, 2, 376, 377, 7, 13, 2, 2, 377, 378, 5, 38, 20, 2, 378, 379, 7, 14, 2, 2, 379, 411, 3, 2, 2, 2, 380, 381, 7, 63, 2, 2, 381, 382, 5, 38, 20, 2, 382, 383, 7, 10, 2, 2, 383, 388, 5, 38, 20, 2, 384, 385, 7, 10, 2, 2, 385, 387, 5, 38, 20, 2, 386, 384, 3, 2, 2, 2, 387, 390, 3, 2, 2, 2, 388, 386, 3, 2, 2, 2, 388, 389, 3, 2, 2, 2, 389, 392, 3, 2, 2, 2, 390, 388, 3, 2, 2, 2, 391, 393, 7, 10, 2, 2, 392, 391, 3, 2, 2, 2, 392, 393, 3, 2, 2, 2, 393, 394, 3, 2, 2, 2, 394, 395, 7, 64, 2, 2, 395, 411, 3, 2, 2, 2, 396, 398, 7, 4, 2, 2, 397, 399, 5, 42, 22, 2, 398, 397, 3, 2, 2, 2, 398, 399, 3, 2, 2, 2, 399, 400, 3, 2, 2, 2, 400, 411, 7, 5, 2, 2, 401, 411, 7, 30, 2, 2, 402, 411, 7, 31, 2, 2, 403, 411, 7, 32, 2, 2, 404, 411, 5, 40, 21, 2, 405, 411, 5, 80, 41, 2, 406, 407, 7, 63, 2, 2, 407, 408, 5, 38, 20, 2, 408, 409, 7, 64, 2, 2, 409, 411, 3, 2, 2, 2, 410, 352, 3, 2, 2, 2, 410, 370, 3, 2, 2, 2, 410, 375, 3, 2, 2, 2, 410, 380, 3, 2, 2, 2, 410, 396, 3, 2, 2, 2, 410, 401, 3, 2, 2, 2, 410, 402, 3, 2, 2, 2, 410, 403, 3, 2, 2, 2, 410, 404, 3, 2, 2, 2, 410, 405, 3, 2, 2, 2, 410, 406, 3, 2, 2, 2, 411, 432, 3, 2, 2, 2, 412, 413, 12, 16, 2, 2, 413, 414, 7, 28, 2, 2, 414, 431, 5, 38, 20, 16, 415, 416, 12, 15, 2, 2, 416, 417, 7, 29, 2, 2, 417, 431, 5, 38, 20, 15, 418, 419, 12, 3, 2, 2, 419, 420, 7, 13, 2, 2, 420, 425, 5, 38, 20, 2, 421, 422, 7, 10, 2, 2, 422, 424, 5, 38, 20, 2, 423, 421, 3, 2, 2, 2, 424, 427, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 428, 3, 2, 2, 2, 427, 425, 3, 2, 2, 2, 428, 429, 7, 14, 2, 2, 429, 431, 3, 2, 2, 2, 430, 412, 3, 2, 2, 2, 430, 415, 3, 2, 2, 2, 430, 418, 3, 2, 2, 2, 431, 434, 3, 2, 2, 2, 432, 430, 3, 2, 2, 2, 432, 433, 3, 2, 2, 2, 433, 39, 3, 2, 2, 2, 434, 432, 3, 2, 2, 2, 435, 436, 7, 67, 2, 2, 436, 41, 3, 2, 2, 2, 437, 438, 5, 44, 23, 2, 438, 439, 7, 7, 2, 2, 439, 440, 5, 38, 20, 2, 440, 448, 3, 2, 2, 2, 441, 442, 7, 10, 2, 2, 442, 443, 5, 44, 23, 2, 443, 444, 7, 7, 2, 2, 444, 445, 5, 38, 20, 2, 445, 447, 3, 2, 2, 2, 446, 441, 3, 2, 2, 2, 447, 450, 3, 2, 2, 2, 448, 446, 3, 2, 2, 2, 448, 449, 3, 2, 2, 2, 449, 454, 3, 2, 2, 2, 450, 448, 3, 2, 2, 2, 451, 455, 7, 10, 2, 2, 452, 453, 7, 15, 2, 2, 453, 455, 5, 84, 43, 2, 454, 451, 3, 2, 2, 2, 454, 452, 3, 2, 2, 2, 454, 455, 3, 2, 2, 2, 455, 459, 3, 2, 2, 2, 456, 457, 7, 15, 2, 2, 457, 459, 5, 84, 43, 2, 458, 437, 3, 2, 2, 2, 458, 456, 3, 2, 2, 2, 459, 43, 3, 2, 2, 2, 460, 461, 5, 82, 42, 2, 461, 45, 3, 2, 2, 2, 462, 463, 8, 24, 1, 2, 463, 613, 5, 56, 29, 2, 464, 465, 5, 72, 37, 2, 465, 467, 7, 63, 2, 2, 466, 468, 5, 68, 35, 2, 467, 466, 3, 2, 2, 2, 467, 468, 3, 2, 2, 2, 468, 469, 3, 2, 2, 2, 469, 470, 7, 64, 2, 2, 470, 613, 3, 2, 2, 2, 471, 472, 7, 52, 2, 2, 472, 613, 5, 46, 24, 27, 473, 474, 5, 80, 41, 2, 474, 475, 7, 34, 2, 2, 475, 476, 7, 62, 2, 2, 476, 477, 5, 46, 24, 23, 477, 613, 3, 2, 2, 2, 478, 479, 7, 45, 2, 2, 479, 480, 7, 4, 2, 2, 480, 485, 5, 46, 24, 2, 481, 482, 7, 10, 2, 2, 482, 484, 5, 46, 24, 2, 483, 481, 3, 2, 2, 2, 484, 487, 3, 2, 2, 2, 485, 483, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 489, 3, 2, 2, 2, 487, 485, 3, 2, 2, 2, 488, 490, 7, 10, 2, 2, 489, 488, 3, 2, 2, 2, 489, 490, 3, 2, 2, 2, 490, 491, 3, 2, 2, 2, 491, 492, 7, 5, 2, 2, 492, 613, 3, 2, 2, 2, 493, 494, 7, 46, 2, 2, 494, 495, 7, 4, 2, 2, 495, 500, 5, 46, 24, 2, 496, 497, 7, 10, 2, 2, 497, 499, 5, 46, 24, 2, 498, 496, 3, 2, 2, 2, 499, 502, 3, 2, 2, 2, 500, 498, 3, 2, 2, 2, 500, 501, 3, 2, 2, 2, 501, 504, 3, 2, 2, 2, 502, 500, 3, 2, 2, 2, 503, 505, 7, 10, 2, 2, 504, 503, 3, 2, 2, 2, 504, 505, 3, 2, 2, 2, 505, 506, 3, 2, 2, 2, 506, 507, 7, 5, 2, 2, 507, 613, 3, 2, 2, 2, 508, 613, 5, 48, 25, 2, 509, 510, 7, 35, 2, 2, 510, 511, 7, 4, 2, 2, 511, 516, 5, 46, 24, 2, 512, 513, 7, 10, 2, 2, 513, 515, 5, 46, 24, 2, 514, 512, 3, 2, 2, 2, 515, 518, 3, 2, 2, 2, 516, 514, 3, 2, 2, 2, 516, 517, 3, 2, 2, 2, 517, 520, 3, 2, 2, 2, 518, 516, 3, 2, 2, 2, 519, 521, 7, 10, 2, 2, 520, 519, 3, 2, 2, 2, 520, 521, 3, 2, 2, 2, 521, 522, 3, 2, 2, 2, 522, 523, 7, 5, 2, 2, 523, 613, 3, 2, 2, 2, 524, 525, 7, 36, 2, 2, 525, 526, 7, 4, 2, 2, 526, 531, 5, 46, 24, 2, 527, 528, 7, 10, 2, 2, 528, 530, 5, 46, 24, 2, 529, 527, 3, 2, 2, 2, 530, 533, 3, 2, 2, 2, 531, 529, 3, 2, 2, 2, 531, 532, 3, 2, 2, 2, 532, 535, 3, 2, 2, 2, 533, 531, 3, 2, 2, 2, 534, 536, 7, 10, 2, 2, 535, 534, 3, 2, 2, 2, 535, 536, 3, 2, 2, 2, 536, 537, 3, 2, 2, 2, 537, 538, 7, 5, 2, 2, 538, 613, 3, 2, 2, 2, 539, 544, 5, 80, 41, 2, 540, 544, 7, 44, 2, 2, 541, 544, 7, 43, 2, 2, 542, 544, 7, 42, 2, 2, 543, 539, 3, 2, 2, 2, 543, 540, 3, 2, 2, 2, 543, 541, 3, 2, 2, 2, 543, 542, 3, 2, 2, 2, 544, 613, 3, 2, 2, 2, 545, 546, 7, 63, 2, 2, 546, 547, 5, 46, 24, 2, 547, 548, 7, 10, 2, 2, 548, 553, 5, 46, 24, 2, 549, 550, 7, 10, 2, 2, 550, 552, 5, 46, 24, 2, 551, 549, 3, 2, 2, 2, 552, 555, 3, 2, 2, 2, 553, 551, 3, 2, 2, 2, 553, 554, 3, 2, 2, 2, 554, 557, 3, 2, 2, 2, 555, 553, 3, 2, 2, 2, 556, 558, 7, 10, 2, 2, 557, 556, 3, 2, 2, 2, 557, 558, 3, 2, 2, 2, 558, 559, 3, 2, 2, 2, 559, 560, 7, 64, 2, 2, 560, 613, 3, 2, 2, 2, 561, 562, 7, 4, 2, 2, 562, 567, 5, 70, 36, 2, 563, 564, 7, 10, 2, 2, 564, 566, 5, 70, 36, 2, 565, 563, 3, 2, 2, 2, 566, 569, 3, 2, 2, 2, 567, 565, 3, 2, 2, 2, 567, 568, 3, 2, 2, 2, 568, 571, 3, 2, 2, 2, 569, 567, 3, 2, 2, 2, 570, 572, 7, 10, 2, 2, 571, 570, 3, 2, 2, 2, 571, 572, 3, 2, 2, 2, 572, 573, 3, 2, 2, 2, 573, 574, 7, 5, 2, 2, 574, 613, 3, 2, 2, 2, 575, 584, 7, 13, 2, 2, 576, 581, 5, 46, 24, 2, 577, 578, 7, 10, 2, 2, 578, 580, 5, 46, 24, 2, 579, 577, 3, 2, 2, 2, 580, 583, 3, 2, 2, 2, 581, 579, 3, 2, 2, 2, 581, 582, 3, 2, 2, 2, 582, 585, 3, 2, 2, 2, 583, 581, 3, 2, 2, 2, 584, 576, 3, 2, 2, 2, 584, 585, 3, 2, 2, 2, 585, 587, 3, 2, 2, 2, 586, 588, 7, 10, 2, 2, 587, 586, 3, 2, 2, 2, 587, 588, 3, 2, 2, 2, 588, 589, 3, 2, 2, 2, 589, 613, 7, 14, 2, 2, 590, 591, 7, 37, 2, 2, 591, 592, 7, 63, 2, 2, 592, 593, 5, 46, 24, 2, 593, 594, 7, 64, 2, 2, 594, 595, 5, 46, 24, 2, 595, 596, 7, 38, 2, 2, 596, 597, 5, 46, 24, 7, 597, 613, 3, 2, 2, 2, 598, 599, 5, 10, 6, 2, 599, 600, 5, 46, 24, 6, 600, 613, 3, 2, 2, 2, 601, 602, 5, 20, 11, 2, 602, 603, 5, 46, 24, 5, 603, 613, 3, 2, 2, 2, 604, 605, 7, 63, 2, 2, 605, 606, 5, 46, 24, 2, 606, 607, 7, 64, 2, 2, 607, 613, 3, 2, 2, 2, 608, 609, 7, 4, 2, 2, 609, 610, 5, 46, 24, 2, 610, 611, 7, 5, 2, 2, 611, 613, 3, 2, 2, 2, 612, 462, 3, 2, 2, 2, 612, 464, 3, 2, 2, 2, 612, 471, 3, 2, 2, 2, 612, 473, 3, 2, 2, 2, 612, 478, 3, 2, 2, 2, 612, 493, 3, 2, 2, 2, 612, 508, 3, 2, 2, 2, 612, 509, 3, 2, 2, 2, 612, 524, 3, 2, 2, 2, 612, 543, 3, 2, 2, 2, 612, 545, 3, 2, 2, 2, 612, 561, 3, 2, 2, 2, 612, 575, 3, 2, 2, 2, 612, 590, 3, 2, 2, 2, 612, 598, 3, 2, 2, 2, 612, 601, 3, 2, 2, 2, 612, 604, 3, 2, 2, 2, 612, 608, 3, 2, 2, 2, 613, 663, 3, 2, 2, 2, 614, 615, 12, 28, 2, 2, 615, 616, 7, 33, 2, 2, 616, 662, 5, 46, 24, 28, 617, 618, 12, 26, 2, 2, 618, 619, 9, 2, 2, 2, 619, 662, 5, 46, 24, 27, 620, 621, 12, 25, 2, 2, 621, 622, 9, 3, 2, 2, 622, 662, 5, 46, 24, 26, 623, 624, 12, 24, 2, 2, 624, 625, 9, 4, 2, 2, 625, 662, 5, 46, 24, 25, 626, 627, 12, 22, 2, 2, 627, 628, 7, 62, 2, 2, 628, 629, 5, 46, 24, 23, 629, 630, 8, 24, 1, 2, 630, 662, 3, 2, 2, 2, 631, 632, 12, 20, 2, 2, 632, 633, 7, 45, 2, 2, 633, 662, 5, 46, 24, 21, 634, 635, 12, 18, 2, 2, 635, 636, 7, 46, 2, 2, 636, 662, 5, 46, 24, 19, 637, 638, 12, 17, 2, 2, 638, 639, 7, 47, 2, 2, 639, 662, 5, 46, 24, 18, 640, 641, 12, 16, 2, 2, 641, 642, 7, 48, 2, 2, 642, 662, 5, 46, 24, 17, 643, 644, 12, 10, 2, 2, 644, 645, 7, 28, 2, 2, 645, 662, 5, 46, 24, 11, 646, 647, 12, 32, 2, 2, 647, 648, 7, 24, 2, 2, 648, 654, 5, 74, 38, 2, 649, 651, 7, 63, 2, 2, 650, 652, 5, 68, 35, 2, 651, 650, 3, 2, 2, 2, 651, 652, 3, 2, 2, 2, 652, 653, 3, 2, 2, 2, 653, 655, 7, 64, 2, 2, 654, 649, 3, 2, 2, 2, 654, 655, 3, 2, 2, 2, 655, 662, 3, 2, 2, 2, 656, 657, 12, 29, 2, 2, 657, 658, 7, 13, 2, 2, 658, 659, 5, 46, 24, 2, 659, 660, 7, 14, 2, 2, 660, 662, 3, 2, 2, 2, 661, 614, 3, 2, 2, 2, 661, 617, 3, 2, 2, 2, 661, 620, 3, 2, 2, 2, 661, 623, 3, 2, 2, 2, 661, 626, 3, 2, 2, 2, 661, 631, 3, 2, 2, 2, 661, 634, 3, 2, 2, 2, 661, 637, 3, 2, 2, 2, 661, 640, 3, 2, 2, 2, 661, 643, 3, 2, 2, 2, 661, 646, 3, 2, 2, 2, 661, 656, 3, 2, 2, 2, 662, 665, 3, 2, 2, 2, 663, 661, 3, 2, 2, 2, 663, 664, 3, 2, 2, 2, 664, 47, 3, 2, 2, 2, 665, 663, 3, 2, 2, 2, 666, 667, 7, 50, 2, 2, 667, 668, 5, 46, 24, 2, 668, 670, 7, 4, 2, 2, 669, 671, 7, 15, 2, 2, 670, 669, 3, 2, 2, 2, 670, 671, 3, 2, 2, 2, 671, 672, 3, 2, 2, 2, 672, 677, 5, 50, 26, 2, 673, 674, 7, 15, 2, 2, 674, 676, 5, 50, 26, 2, 675, 673, 3, 2, 2, 2, 676, 679, 3, 2, 2, 2, 677, 675, 3, 2, 2, 2, 677, 678, 3, 2, 2, 2, 678, 680, 3, 2, 2, 2, 679, 677, 3, 2, 2, 2, 680, 681, 7, 5, 2, 2, 681, 49, 3, 2, 2, 2, 682, 685, 5, 52, 27, 2, 683, 685, 7, 39, 2, 2, 684, 682, 3, 2, 2, 2, 684, 683, 3, 2, 2, 2, 685, 686, 3, 2, 2, 2, 686, 687, 7, 29, 2, 2, 687, 688, 5, 46, 24, 2, 688, 51, 3, 2, 2, 2, 689, 696, 5, 82, 42, 2, 690, 693, 7, 63, 2, 2, 691, 694, 5, 82, 42, 2, 692, 694, 7, 39, 2, 2, 693, 691, 3, 2, 2, 2, 693, 692, 3, 2, 2, 2, 694, 695, 3, 2, 2, 2, 695, 697, 7, 64, 2, 2, 696, 690, 3, 2, 2, 2, 696, 697, 3, 2, 2, 2, 697, 53, 3, 2, 2, 2, 698, 699, 5, 8, 5, 2, 699, 700, 7, 2, 2, 3, 700, 708, 3, 2, 2, 2, 701, 702, 5, 46, 24, 2, 702, 703, 7, 2, 2, 3, 703, 708, 3, 2, 2, 2, 704, 705, 7, 69, 2, 2, 705, 708, 7, 2, 2, 3, 706, 708, 7, 2, 2, 3, 707, 698, 3, 2, 2, 2, 707, 701, 3, 2, 2, 2, 707, 704, 3, 2, 2, 2, 707, 706, 3, 2, 2, 2, 708, 55, 3, 2, 2, 2, 709, 712, 5, 58, 30, 2, 710, 712, 5, 60, 31, 2, 711, 709, 3, 2, 2, 2, 711, 710, 3, 2, 2, 2, 712, 57, 3, 2, 2, 2, 713, 714, 5, 64, 33, 2, 714, 715, 7, 29, 2, 2, 715, 716, 5, 46, 24, 2, 716, 731, 3, 2, 2, 2, 717, 718, 7, 63, 2, 2, 718, 723, 5, 64, 33, 2, 719, 720, 7, 10, 2, 2, 720, 722, 5, 64, 33, 2, 721, 719, 3, 2, 2, 2, 722, 725, 3, 2, 2, 2, 723, 721, 3, 2, 2, 2, 723, 724, 3, 2, 2, 2, 724, 726, 3, 2, 2, 2, 725, 723, 3, 2, 2, 2, 726, 727, 7, 64, 2, 2, 727, 728, 7, 29, 2, 2, 728, 729, 5, 46, 24, 2, 729, 731, 3, 2, 2, 2, 730, 713, 3, 2, 2, 2, 730, 717, 3, 2, 2, 2, 731, 59, 3, 2, 2, 2, 732, 733, 7, 63, 2, 2, 733, 734, 7, 63, 2, 2, 734, 737, 5, 64, 33, 2, 735, 736, 7, 10, 2, 2, 736, 738, 5, 64, 33, 2, 737, 735, 3, 2, 2, 2, 738, 739, 3, 2, 2, 2, 739, 737, 3, 2, 2, 2, 739, 740, 3, 2, 2, 2, 740, 741, 3, 2, 2, 2, 741, 742, 7, 64, 2, 2, 742, 743, 7, 64, 2, 2, 743, 744, 7, 29, 2, 2, 744, 745, 5, 46, 24, 2, 745, 61, 3, 2, 2, 2, 746, 749, 7, 39, 2, 2, 747, 749, 5, 80, 41, 2, 748, 746, 3, 2, 2, 2, 748, 747, 3, 2, 2, 2, 749, 63, 3, 2, 2, 2, 750, 751, 5, 62, 32, 2, 751, 65, 3, 2, 2, 2, 752, 755, 7, 53, 2, 2, 753, 755, 5, 80, 41, 2, 754, 752, 3, 2, 2, 2, 754, 753, 3, 2, 2, 2, 755, 67, 3, 2, 2, 2, 756, 761, 5, 46, 24, 2, 757, 758, 7, 10, 2, 2, 758, 760, 5, 46, 24, 2, 759, 757, 3, 2, 2, 2, 760, 763, 3, 2, 2, 2, 761, 759, 3, 2, 2, 2, 761, 762, 3, 2, 2, 2, 762, 69, 3, 2, 2, 2, 763, 761, 3, 2, 2, 2, 764, 765, 5, 82, 42, 2, 765, 766, 7, 7, 2, 2, 766, 767, 5, 46, 24, 2, 767, 771, 3, 2, 2, 2, 768, 769, 7, 40, 2, 2, 769, 771, 5, 46, 24, 2, 770, 764, 3, 2, 2, 2, 770, 768, 3, 2, 2, 2, 771, 71, 3, 2, 2, 2, 772, 775, 5, 80, 41, 2, 773, 775, 9, 5, 2, 2, 774, 772, 3, 2, 2, 2, 774, 773, 3, 2, 2, 2, 775, 73, 3, 2, 2, 2, 776, 779, 5, 80, 41, 2, 777, 779, 9, 6, 2, 2, 778, 776, 3, 2, 2, 2, 778, 777, 3, 2, 2, 2, 779, 75, 3, 2, 2, 2, 780, 781, 9, 7, 2, 2, 781, 77, 3, 2, 2, 2, 782, 783, 9, 8, 2, 2, 783, 79, 3, 2, 2, 2, 784, 789, 5, 84, 43, 2, 785, 786, 7, 41, 2, 2, 786, 788, 5, 84, 43, 2, 787, 785, 3, 2, 2, 2, 788, 791, 3, 2, 2, 2, 789, 787, 3, 2, 2, 2, 789, 790, 3, 2, 2, 2, 790, 81, 3, 2, 2, 2, 791, 789, 3, 2, 2, 2, 792, 797, 5, 84, 43, 2, 793, 794, 5, 80, 41, 2, 794, 795, 8, 42, 1, 2, 795, 797, 3, 2, 2, 2, 796, 792, 3, 2, 2, 2, 796, 793, 3, 2, 2, 2, 797, 83, 3, 2, 2, 2, 798, 799, 9, 9, 2, 2, 799, 85, 3, 2, 2, 2, 90, 89, 96, 105, 113, 138, 148, 151, 154, 158, 162, 165, 180, 188, 191, 193, 207, 216, 221, 224, 231, 239, 245, 250, 261, 269, 275, 279, 281, 292, 294, 309, 317, 332, 340, 342, 359, 362, 365, 388, 392, 398, 410, 425, 430, 432, 448, 454, 458, 467, 485, 489, 500, 504, 516, 520, 531, 535, 543, 553, 557, 567, 571, 581, 584, 587, 612, 651, 654, 661, 663, 670, 677, 684, 693, 696, 707, 711, 723, 730, 739, 748, 754, 761, 770, 774, 778, 789, 796] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 802, 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, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 3, 2, 6, 2, 90, 10, 2, 13, 2, 14, 2, 91, 3, 2, 3, 2, 3, 3, 7, 3, 97, 10, 3, 12, 3, 14, 3, 100, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 106, 10, 3, 12, 3, 14, 3, 109, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 114, 10, 4, 12, 4, 14, 4, 117, 11, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 141, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 149, 10, 6, 12, 6, 14, 6, 152, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 159, 10, 6, 3, 6, 5, 6, 162, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 170, 10, 6, 12, 6, 14, 6, 173, 11, 6, 5, 6, 175, 10, 6, 3, 6, 5, 6, 178, 10, 6, 3, 6, 3, 6, 5, 6, 182, 10, 6, 3, 6, 3, 6, 5, 6, 186, 10, 6, 3, 6, 5, 6, 189, 10, 6, 5, 6, 191, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 205, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 212, 10, 8, 12, 8, 14, 8, 215, 11, 8, 3, 8, 3, 8, 5, 8, 219, 10, 8, 3, 9, 5, 9, 222, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 227, 10, 9, 12, 9, 14, 9, 230, 11, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 237, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 243, 10, 11, 3, 11, 3, 11, 3, 11, 5, 11, 248, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 259, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 267, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 273, 10, 13, 3, 13, 3, 13, 5, 13, 277, 10, 13, 5, 13, 279, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 290, 10, 14, 5, 14, 292, 10, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 305, 10, 15, 12, 15, 14, 15, 308, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 315, 10, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 328, 10, 15, 12, 15, 14, 15, 331, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 338, 10, 15, 5, 15, 340, 10, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 355, 10, 20, 12, 20, 14, 20, 358, 11, 20, 5, 20, 360, 10, 20, 3, 20, 5, 20, 363, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 384, 10, 20, 12, 20, 14, 20, 387, 11, 20, 3, 20, 5, 20, 390, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 396, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 408, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 421, 10, 20, 12, 20, 14, 20, 424, 11, 20, 3, 20, 3, 20, 7, 20, 428, 10, 20, 12, 20, 14, 20, 431, 11, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 444, 10, 22, 12, 22, 14, 22, 447, 11, 22, 3, 22, 3, 22, 3, 22, 5, 22, 452, 10, 22, 3, 22, 3, 22, 5, 22, 456, 10, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 465, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 481, 10, 24, 12, 24, 14, 24, 484, 11, 24, 3, 24, 5, 24, 487, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 496, 10, 24, 12, 24, 14, 24, 499, 11, 24, 3, 24, 5, 24, 502, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 512, 10, 24, 12, 24, 14, 24, 515, 11, 24, 3, 24, 5, 24, 518, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 527, 10, 24, 12, 24, 14, 24, 530, 11, 24, 3, 24, 5, 24, 533, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 541, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 549, 10, 24, 12, 24, 14, 24, 552, 11, 24, 3, 24, 5, 24, 555, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 563, 10, 24, 12, 24, 14, 24, 566, 11, 24, 3, 24, 5, 24, 569, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 577, 10, 24, 12, 24, 14, 24, 580, 11, 24, 5, 24, 582, 10, 24, 3, 24, 5, 24, 585, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 610, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 649, 10, 24, 3, 24, 5, 24, 652, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 659, 10, 24, 12, 24, 14, 24, 662, 11, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 668, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 673, 10, 25, 12, 25, 14, 25, 676, 11, 25, 3, 25, 3, 25, 3, 26, 3, 26, 5, 26, 682, 10, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 691, 10, 27, 3, 27, 5, 27, 694, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 705, 10, 28, 3, 29, 3, 29, 5, 29, 709, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 719, 10, 30, 12, 30, 14, 30, 722, 11, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 728, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 6, 31, 735, 10, 31, 13, 31, 14, 31, 736, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 5, 32, 746, 10, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 5, 35, 756, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 761, 10, 36, 12, 36, 14, 36, 764, 11, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 772, 10, 37, 3, 38, 3, 38, 5, 38, 776, 10, 38, 3, 39, 3, 39, 5, 39, 780, 10, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 7, 42, 789, 10, 42, 12, 42, 14, 42, 792, 11, 42, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 798, 10, 43, 3, 44, 3, 44, 3, 44, 2, 2, 4, 38, 46, 45, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 68, 2, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 86, 2, 2, 10, 3, 2, 53, 55, 3, 2, 51, 52, 3, 2, 56, 61, 4, 2, 45, 49, 65, 66, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 51, 61, 3, 2, 42, 44, 3, 2, 67, 68, 2, 899, 2, 89, 3, 2, 2, 2, 4, 98, 3, 2, 2, 2, 6, 115, 3, 2, 2, 2, 8, 140, 3, 2, 2, 2, 10, 190, 3, 2, 2, 2, 12, 204, 3, 2, 2, 2, 14, 206, 3, 2, 2, 2, 16, 221, 3, 2, 2, 2, 18, 231, 3, 2, 2, 2, 20, 238, 3, 2, 2, 2, 22, 258, 3, 2, 2, 2, 24, 278, 3, 2, 2, 2, 26, 291, 3, 2, 2, 2, 28, 339, 3, 2, 2, 2, 30, 341, 3, 2, 2, 2, 32, 343, 3, 2, 2, 2, 34, 345, 3, 2, 2, 2, 36, 347, 3, 2, 2, 2, 38, 407, 3, 2, 2, 2, 40, 432, 3, 2, 2, 2, 42, 455, 3, 2, 2, 2, 44, 457, 3, 2, 2, 2, 46, 609, 3, 2, 2, 2, 48, 663, 3, 2, 2, 2, 50, 681, 3, 2, 2, 2, 52, 686, 3, 2, 2, 2, 54, 704, 3, 2, 2, 2, 56, 708, 3, 2, 2, 2, 58, 727, 3, 2, 2, 2, 60, 729, 3, 2, 2, 2, 62, 745, 3, 2, 2, 2, 64, 747, 3, 2, 2, 2, 66, 749, 3, 2, 2, 2, 68, 755, 3, 2, 2, 2, 70, 757, 3, 2, 2, 2, 72, 771, 3, 2, 2, 2, 74, 775, 3, 2, 2, 2, 76, 779, 3, 2, 2, 2, 78, 781, 3, 2, 2, 2, 80, 783, 3, 2, 2, 2, 82, 785, 3, 2, 2, 2, 84, 797, 3, 2, 2, 2, 86, 799, 3, 2, 2, 2, 88, 90, 5, 4, 3, 2, 89, 88, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 89, 3, 2, 2, 2, 91, 92, 3, 2, 2, 2, 92, 93, 3, 2, 2, 2, 93, 94, 7, 2, 2, 3, 94, 3, 3, 2, 2, 2, 95, 97, 7, 69, 2, 2, 96, 95, 3, 2, 2, 2, 97, 100, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 98, 99, 3, 2, 2, 2, 99, 101, 3, 2, 2, 2, 100, 98, 3, 2, 2, 2, 101, 102, 7, 3, 2, 2, 102, 103, 5, 82, 42, 2, 103, 107, 7, 4, 2, 2, 104, 106, 5, 6, 4, 2, 105, 104, 3, 2, 2, 2, 106, 109, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 107, 108, 3, 2, 2, 2, 108, 110, 3, 2, 2, 2, 109, 107, 3, 2, 2, 2, 110, 111, 7, 5, 2, 2, 111, 5, 3, 2, 2, 2, 112, 114, 7, 69, 2, 2, 113, 112, 3, 2, 2, 2, 114, 117, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 115, 116, 3, 2, 2, 2, 116, 118, 3, 2, 2, 2, 117, 115, 3, 2, 2, 2, 118, 119, 5, 8, 5, 2, 119, 7, 3, 2, 2, 2, 120, 121, 7, 6, 2, 2, 121, 122, 5, 82, 42, 2, 122, 123, 7, 7, 2, 2, 123, 124, 5, 38, 20, 2, 124, 141, 3, 2, 2, 2, 125, 126, 7, 8, 2, 2, 126, 127, 5, 82, 42, 2, 127, 128, 7, 7, 2, 2, 128, 129, 5, 38, 20, 2, 129, 141, 3, 2, 2, 2, 130, 131, 7, 9, 2, 2, 131, 132, 5, 62, 32, 2, 132, 133, 7, 62, 2, 2, 133, 134, 5, 46, 24, 2, 134, 141, 3, 2, 2, 2, 135, 141, 5, 28, 15, 2, 136, 141, 5, 10, 6, 2, 137, 141, 5, 12, 7, 2, 138, 141, 5, 24, 13, 2, 139, 141, 5, 26, 14, 2, 140, 120, 3, 2, 2, 2, 140, 125, 3, 2, 2, 2, 140, 130, 3, 2, 2, 2, 140, 135, 3, 2, 2, 2, 140, 136, 3, 2, 2, 2, 140, 137, 3, 2, 2, 2, 140, 138, 3, 2, 2, 2, 140, 139, 3, 2, 2, 2, 141, 9, 3, 2, 2, 2, 142, 143, 5, 22, 12, 2, 143, 144, 5, 74, 38, 2, 144, 145, 7, 63, 2, 2, 145, 150, 5, 66, 34, 2, 146, 147, 7, 10, 2, 2, 147, 149, 5, 66, 34, 2, 148, 146, 3, 2, 2, 2, 149, 152, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 150, 151, 3, 2, 2, 2, 151, 153, 3, 2, 2, 2, 152, 150, 3, 2, 2, 2, 153, 154, 7, 64, 2, 2, 154, 155, 7, 7, 2, 2, 155, 158, 5, 38, 20, 2, 156, 157, 7, 62, 2, 2, 157, 159, 5, 46, 24, 2, 158, 156, 3, 2, 2, 2, 158, 159, 3, 2, 2, 2, 159, 161, 3, 2, 2, 2, 160, 162, 7, 11, 2, 2, 161, 160, 3, 2, 2, 2, 161, 162, 3, 2, 2, 2, 162, 191, 3, 2, 2, 2, 163, 164, 5, 22, 12, 2, 164, 177, 5, 74, 38, 2, 165, 174, 7, 63, 2, 2, 166, 171, 5, 64, 33, 2, 167, 168, 7, 10, 2, 2, 168, 170, 5, 64, 33, 2, 169, 167, 3, 2, 2, 2, 170, 173, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 171, 172, 3, 2, 2, 2, 172, 175, 3, 2, 2, 2, 173, 171, 3, 2, 2, 2, 174, 166, 3, 2, 2, 2, 174, 175, 3, 2, 2, 2, 175, 176, 3, 2, 2, 2, 176, 178, 7, 64, 2, 2, 177, 165, 3, 2, 2, 2, 177, 178, 3, 2, 2, 2, 178, 181, 3, 2, 2, 2, 179, 180, 7, 7, 2, 2, 180, 182, 5, 38, 20, 2, 181, 179, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 185, 3, 2, 2, 2, 183, 184, 7, 62, 2, 2, 184, 186, 5, 46, 24, 2, 185, 183, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 188, 3, 2, 2, 2, 187, 189, 7, 11, 2, 2, 188, 187, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 191, 3, 2, 2, 2, 190, 142, 3, 2, 2, 2, 190, 163, 3, 2, 2, 2, 191, 11, 3, 2, 2, 2, 192, 193, 7, 12, 2, 2, 193, 205, 5, 82, 42, 2, 194, 195, 7, 12, 2, 2, 195, 196, 5, 14, 8, 2, 196, 197, 7, 62, 2, 2, 197, 198, 5, 38, 20, 2, 198, 205, 3, 2, 2, 2, 199, 200, 7, 12, 2, 2, 200, 201, 5, 14, 8, 2, 201, 202, 7, 62, 2, 2, 202, 203, 5, 16, 9, 2, 203, 205, 3, 2, 2, 2, 204, 192, 3, 2, 2, 2, 204, 194, 3, 2, 2, 2, 204, 199, 3, 2, 2, 2, 205, 13, 3, 2, 2, 2, 206, 218, 5, 82, 42, 2, 207, 208, 7, 13, 2, 2, 208, 213, 5, 40, 21, 2, 209, 210, 7, 10, 2, 2, 210, 212, 5, 40, 21, 2, 211, 209, 3, 2, 2, 2, 212, 215, 3, 2, 2, 2, 213, 211, 3, 2, 2, 2, 213, 214, 3, 2, 2, 2, 214, 216, 3, 2, 2, 2, 215, 213, 3, 2, 2, 2, 216, 217, 7, 14, 2, 2, 217, 219, 3, 2, 2, 2, 218, 207, 3, 2, 2, 2, 218, 219, 3, 2, 2, 2, 219, 15, 3, 2, 2, 2, 220, 222, 7, 15, 2, 2, 221, 220, 3, 2, 2, 2, 221, 222, 3, 2, 2, 2, 222, 223, 3, 2, 2, 2, 223, 228, 5, 18, 10, 2, 224, 225, 7, 15, 2, 2, 225, 227, 5, 18, 10, 2, 226, 224, 3, 2, 2, 2, 227, 230, 3, 2, 2, 2, 228, 226, 3, 2, 2, 2, 228, 229, 3, 2, 2, 2, 229, 17, 3, 2, 2, 2, 230, 228, 3, 2, 2, 2, 231, 236, 5, 84, 43, 2, 232, 233, 7, 63, 2, 2, 233, 234, 5, 38, 20, 2, 234, 235, 7, 64, 2, 2, 235, 237, 3, 2, 2, 2, 236, 232, 3, 2, 2, 2, 236, 237, 3, 2, 2, 2, 237, 19, 3, 2, 2, 2, 238, 239, 7, 16, 2, 2, 239, 242, 5, 82, 42, 2, 240, 241, 7, 7, 2, 2, 241, 243, 5, 38, 20, 2, 242, 240, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 244, 3, 2, 2, 2, 244, 245, 7, 62, 2, 2, 245, 247, 5, 46, 24, 2, 246, 248, 7, 11, 2, 2, 247, 246, 3, 2, 2, 2, 247, 248, 3, 2, 2, 2, 248, 21, 3, 2, 2, 2, 249, 259, 7, 17, 2, 2, 250, 259, 7, 18, 2, 2, 251, 252, 7, 19, 2, 2, 252, 259, 7, 17, 2, 2, 253, 254, 7, 19, 2, 2, 254, 259, 7, 18, 2, 2, 255, 259, 7, 20, 2, 2, 256, 259, 7, 21, 2, 2, 257, 259, 7, 22, 2, 2, 258, 249, 3, 2, 2, 2, 258, 250, 3, 2, 2, 2, 258, 251, 3, 2, 2, 2, 258, 253, 3, 2, 2, 2, 258, 255, 3, 2, 2, 2, 258, 256, 3, 2, 2, 2, 258, 257, 3, 2, 2, 2, 259, 23, 3, 2, 2, 2, 260, 261, 7, 23, 2, 2, 261, 262, 5, 32, 17, 2, 262, 263, 7, 24, 2, 2, 263, 266, 5, 68, 35, 2, 264, 265, 7, 25, 2, 2, 265, 267, 5, 36, 19, 2, 266, 264, 3, 2, 2, 2, 266, 267, 3, 2, 2, 2, 267, 279, 3, 2, 2, 2, 268, 269, 7, 23, 2, 2, 269, 272, 5, 32, 17, 2, 270, 271, 7, 26, 2, 2, 271, 273, 5, 32, 17, 2, 272, 270, 3, 2, 2, 2, 272, 273, 3, 2, 2, 2, 273, 276, 3, 2, 2, 2, 274, 275, 7, 25, 2, 2, 275, 277, 5, 36, 19, 2, 276, 274, 3, 2, 2, 2, 276, 277, 3, 2, 2, 2, 277, 279, 3, 2, 2, 2, 278, 260, 3, 2, 2, 2, 278, 268, 3, 2, 2, 2, 279, 25, 3, 2, 2, 2, 280, 281, 7, 27, 2, 2, 281, 282, 5, 32, 17, 2, 282, 283, 7, 24, 2, 2, 283, 284, 5, 68, 35, 2, 284, 292, 3, 2, 2, 2, 285, 286, 7, 27, 2, 2, 286, 289, 5, 32, 17, 2, 287, 288, 7, 26, 2, 2, 288, 290, 5, 32, 17, 2, 289, 287, 3, 2, 2, 2, 289, 290, 3, 2, 2, 2, 290, 292, 3, 2, 2, 2, 291, 280, 3, 2, 2, 2, 291, 285, 3, 2, 2, 2, 292, 27, 3, 2, 2, 2, 293, 294, 7, 23, 2, 2, 294, 295, 5, 30, 16, 2, 295, 296, 7, 63, 2, 2, 296, 297, 5, 32, 17, 2, 297, 298, 7, 62, 2, 2, 298, 306, 5, 46, 24, 2, 299, 300, 7, 10, 2, 2, 300, 301, 5, 32, 17, 2, 301, 302, 7, 62, 2, 2, 302, 303, 5, 46, 24, 2, 303, 305, 3, 2, 2, 2, 304, 299, 3, 2, 2, 2, 305, 308, 3, 2, 2, 2, 306, 304, 3, 2, 2, 2, 306, 307, 3, 2, 2, 2, 307, 309, 3, 2, 2, 2, 308, 306, 3, 2, 2, 2, 309, 310, 7, 64, 2, 2, 310, 311, 7, 24, 2, 2, 311, 314, 7, 53, 2, 2, 312, 313, 7, 25, 2, 2, 313, 315, 5, 36, 19, 2, 314, 312, 3, 2, 2, 2, 314, 315, 3, 2, 2, 2, 315, 340, 3, 2, 2, 2, 316, 317, 7, 23, 2, 2, 317, 318, 5, 30, 16, 2, 318, 319, 7, 63, 2, 2, 319, 320, 5, 32, 17, 2, 320, 321, 7, 62, 2, 2, 321, 329, 5, 46, 24, 2, 322, 323, 7, 10, 2, 2, 323, 324, 5, 32, 17, 2, 324, 325, 7, 62, 2, 2, 325, 326, 5, 46, 24, 2, 326, 328, 3, 2, 2, 2, 327, 322, 3, 2, 2, 2, 328, 331, 3, 2, 2, 2, 329, 327, 3, 2, 2, 2, 329, 330, 3, 2, 2, 2, 330, 332, 3, 2, 2, 2, 331, 329, 3, 2, 2, 2, 332, 333, 7, 64, 2, 2, 333, 334, 7, 26, 2, 2, 334, 337, 5, 34, 18, 2, 335, 336, 7, 25, 2, 2, 336, 338, 5, 36, 19, 2, 337, 335, 3, 2, 2, 2, 337, 338, 3, 2, 2, 2, 338, 340, 3, 2, 2, 2, 339, 293, 3, 2, 2, 2, 339, 316, 3, 2, 2, 2, 340, 29, 3, 2, 2, 2, 341, 342, 5, 82, 42, 2, 342, 31, 3, 2, 2, 2, 343, 344, 5, 82, 42, 2, 344, 33, 3, 2, 2, 2, 345, 346, 5, 82, 42, 2, 346, 35, 3, 2, 2, 2, 347, 348, 7, 42, 2, 2, 348, 37, 3, 2, 2, 2, 349, 350, 8, 20, 1, 2, 350, 359, 7, 63, 2, 2, 351, 356, 5, 38, 20, 2, 352, 353, 7, 10, 2, 2, 353, 355, 5, 38, 20, 2, 354, 352, 3, 2, 2, 2, 355, 358, 3, 2, 2, 2, 356, 354, 3, 2, 2, 2, 356, 357, 3, 2, 2, 2, 357, 360, 3, 2, 2, 2, 358, 356, 3, 2, 2, 2, 359, 351, 3, 2, 2, 2, 359, 360, 3, 2, 2, 2, 360, 362, 3, 2, 2, 2, 361, 363, 7, 10, 2, 2, 362, 361, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 364, 3, 2, 2, 2, 364, 365, 7, 64, 2, 2, 365, 366, 7, 29, 2, 2, 366, 408, 5, 38, 20, 14, 367, 368, 7, 65, 2, 2, 368, 369, 7, 13, 2, 2, 369, 370, 5, 38, 20, 2, 370, 371, 7, 14, 2, 2, 371, 408, 3, 2, 2, 2, 372, 373, 7, 66, 2, 2, 373, 374, 7, 13, 2, 2, 374, 375, 5, 38, 20, 2, 375, 376, 7, 14, 2, 2, 376, 408, 3, 2, 2, 2, 377, 378, 7, 63, 2, 2, 378, 379, 5, 38, 20, 2, 379, 380, 7, 10, 2, 2, 380, 385, 5, 38, 20, 2, 381, 382, 7, 10, 2, 2, 382, 384, 5, 38, 20, 2, 383, 381, 3, 2, 2, 2, 384, 387, 3, 2, 2, 2, 385, 383, 3, 2, 2, 2, 385, 386, 3, 2, 2, 2, 386, 389, 3, 2, 2, 2, 387, 385, 3, 2, 2, 2, 388, 390, 7, 10, 2, 2, 389, 388, 3, 2, 2, 2, 389, 390, 3, 2, 2, 2, 390, 391, 3, 2, 2, 2, 391, 392, 7, 64, 2, 2, 392, 408, 3, 2, 2, 2, 393, 395, 7, 4, 2, 2, 394, 396, 5, 42, 22, 2, 395, 394, 3, 2, 2, 2, 395, 396, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, 408, 7, 5, 2, 2, 398, 408, 7, 30, 2, 2, 399, 408, 7, 31, 2, 2, 400, 408, 7, 32, 2, 2, 401, 408, 5, 40, 21, 2, 402, 408, 5, 82, 42, 2, 403, 404, 7, 63, 2, 2, 404, 405, 5, 38, 20, 2, 405, 406, 7, 64, 2, 2, 406, 408, 3, 2, 2, 2, 407, 349, 3, 2, 2, 2, 407, 367, 3, 2, 2, 2, 407, 372, 3, 2, 2, 2, 407, 377, 3, 2, 2, 2, 407, 393, 3, 2, 2, 2, 407, 398, 3, 2, 2, 2, 407, 399, 3, 2, 2, 2, 407, 400, 3, 2, 2, 2, 407, 401, 3, 2, 2, 2, 407, 402, 3, 2, 2, 2, 407, 403, 3, 2, 2, 2, 408, 429, 3, 2, 2, 2, 409, 410, 12, 16, 2, 2, 410, 411, 7, 28, 2, 2, 411, 428, 5, 38, 20, 16, 412, 413, 12, 15, 2, 2, 413, 414, 7, 29, 2, 2, 414, 428, 5, 38, 20, 15, 415, 416, 12, 3, 2, 2, 416, 417, 7, 13, 2, 2, 417, 422, 5, 38, 20, 2, 418, 419, 7, 10, 2, 2, 419, 421, 5, 38, 20, 2, 420, 418, 3, 2, 2, 2, 421, 424, 3, 2, 2, 2, 422, 420, 3, 2, 2, 2, 422, 423, 3, 2, 2, 2, 423, 425, 3, 2, 2, 2, 424, 422, 3, 2, 2, 2, 425, 426, 7, 14, 2, 2, 426, 428, 3, 2, 2, 2, 427, 409, 3, 2, 2, 2, 427, 412, 3, 2, 2, 2, 427, 415, 3, 2, 2, 2, 428, 431, 3, 2, 2, 2, 429, 427, 3, 2, 2, 2, 429, 430, 3, 2, 2, 2, 430, 39, 3, 2, 2, 2, 431, 429, 3, 2, 2, 2, 432, 433, 7, 67, 2, 2, 433, 41, 3, 2, 2, 2, 434, 435, 5, 44, 23, 2, 435, 436, 7, 7, 2, 2, 436, 437, 5, 38, 20, 2, 437, 445, 3, 2, 2, 2, 438, 439, 7, 10, 2, 2, 439, 440, 5, 44, 23, 2, 440, 441, 7, 7, 2, 2, 441, 442, 5, 38, 20, 2, 442, 444, 3, 2, 2, 2, 443, 438, 3, 2, 2, 2, 444, 447, 3, 2, 2, 2, 445, 443, 3, 2, 2, 2, 445, 446, 3, 2, 2, 2, 446, 451, 3, 2, 2, 2, 447, 445, 3, 2, 2, 2, 448, 452, 7, 10, 2, 2, 449, 450, 7, 15, 2, 2, 450, 452, 5, 86, 44, 2, 451, 448, 3, 2, 2, 2, 451, 449, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 452, 456, 3, 2, 2, 2, 453, 454, 7, 15, 2, 2, 454, 456, 5, 86, 44, 2, 455, 434, 3, 2, 2, 2, 455, 453, 3, 2, 2, 2, 456, 43, 3, 2, 2, 2, 457, 458, 5, 84, 43, 2, 458, 45, 3, 2, 2, 2, 459, 460, 8, 24, 1, 2, 460, 610, 5, 56, 29, 2, 461, 462, 5, 74, 38, 2, 462, 464, 7, 63, 2, 2, 463, 465, 5, 70, 36, 2, 464, 463, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, 466, 3, 2, 2, 2, 466, 467, 7, 64, 2, 2, 467, 610, 3, 2, 2, 2, 468, 469, 7, 52, 2, 2, 469, 610, 5, 46, 24, 27, 470, 471, 5, 82, 42, 2, 471, 472, 7, 34, 2, 2, 472, 473, 7, 62, 2, 2, 473, 474, 5, 46, 24, 23, 474, 610, 3, 2, 2, 2, 475, 476, 7, 45, 2, 2, 476, 477, 7, 4, 2, 2, 477, 482, 5, 46, 24, 2, 478, 479, 7, 10, 2, 2, 479, 481, 5, 46, 24, 2, 480, 478, 3, 2, 2, 2, 481, 484, 3, 2, 2, 2, 482, 480, 3, 2, 2, 2, 482, 483, 3, 2, 2, 2, 483, 486, 3, 2, 2, 2, 484, 482, 3, 2, 2, 2, 485, 487, 7, 10, 2, 2, 486, 485, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 489, 7, 5, 2, 2, 489, 610, 3, 2, 2, 2, 490, 491, 7, 46, 2, 2, 491, 492, 7, 4, 2, 2, 492, 497, 5, 46, 24, 2, 493, 494, 7, 10, 2, 2, 494, 496, 5, 46, 24, 2, 495, 493, 3, 2, 2, 2, 496, 499, 3, 2, 2, 2, 497, 495, 3, 2, 2, 2, 497, 498, 3, 2, 2, 2, 498, 501, 3, 2, 2, 2, 499, 497, 3, 2, 2, 2, 500, 502, 7, 10, 2, 2, 501, 500, 3, 2, 2, 2, 501, 502, 3, 2, 2, 2, 502, 503, 3, 2, 2, 2, 503, 504, 7, 5, 2, 2, 504, 610, 3, 2, 2, 2, 505, 610, 5, 48, 25, 2, 506, 507, 7, 35, 2, 2, 507, 508, 7, 4, 2, 2, 508, 513, 5, 46, 24, 2, 509, 510, 7, 10, 2, 2, 510, 512, 5, 46, 24, 2, 511, 509, 3, 2, 2, 2, 512, 515, 3, 2, 2, 2, 513, 511, 3, 2, 2, 2, 513, 514, 3, 2, 2, 2, 514, 517, 3, 2, 2, 2, 515, 513, 3, 2, 2, 2, 516, 518, 7, 10, 2, 2, 517, 516, 3, 2, 2, 2, 517, 518, 3, 2, 2, 2, 518, 519, 3, 2, 2, 2, 519, 520, 7, 5, 2, 2, 520, 610, 3, 2, 2, 2, 521, 522, 7, 36, 2, 2, 522, 523, 7, 4, 2, 2, 523, 528, 5, 46, 24, 2, 524, 525, 7, 10, 2, 2, 525, 527, 5, 46, 24, 2, 526, 524, 3, 2, 2, 2, 527, 530, 3, 2, 2, 2, 528, 526, 3, 2, 2, 2, 528, 529, 3, 2, 2, 2, 529, 532, 3, 2, 2, 2, 530, 528, 3, 2, 2, 2, 531, 533, 7, 10, 2, 2, 532, 531, 3, 2, 2, 2, 532, 533, 3, 2, 2, 2, 533, 534, 3, 2, 2, 2, 534, 535, 7, 5, 2, 2, 535, 610, 3, 2, 2, 2, 536, 541, 5, 82, 42, 2, 537, 541, 7, 44, 2, 2, 538, 541, 7, 43, 2, 2, 539, 541, 7, 42, 2, 2, 540, 536, 3, 2, 2, 2, 540, 537, 3, 2, 2, 2, 540, 538, 3, 2, 2, 2, 540, 539, 3, 2, 2, 2, 541, 610, 3, 2, 2, 2, 542, 543, 7, 63, 2, 2, 543, 544, 5, 46, 24, 2, 544, 545, 7, 10, 2, 2, 545, 550, 5, 46, 24, 2, 546, 547, 7, 10, 2, 2, 547, 549, 5, 46, 24, 2, 548, 546, 3, 2, 2, 2, 549, 552, 3, 2, 2, 2, 550, 548, 3, 2, 2, 2, 550, 551, 3, 2, 2, 2, 551, 554, 3, 2, 2, 2, 552, 550, 3, 2, 2, 2, 553, 555, 7, 10, 2, 2, 554, 553, 3, 2, 2, 2, 554, 555, 3, 2, 2, 2, 555, 556, 3, 2, 2, 2, 556, 557, 7, 64, 2, 2, 557, 610, 3, 2, 2, 2, 558, 559, 7, 4, 2, 2, 559, 564, 5, 72, 37, 2, 560, 561, 7, 10, 2, 2, 561, 563, 5, 72, 37, 2, 562, 560, 3, 2, 2, 2, 563, 566, 3, 2, 2, 2, 564, 562, 3, 2, 2, 2, 564, 565, 3, 2, 2, 2, 565, 568, 3, 2, 2, 2, 566, 564, 3, 2, 2, 2, 567, 569, 7, 10, 2, 2, 568, 567, 3, 2, 2, 2, 568, 569, 3, 2, 2, 2, 569, 570, 3, 2, 2, 2, 570, 571, 7, 5, 2, 2, 571, 610, 3, 2, 2, 2, 572, 581, 7, 13, 2, 2, 573, 578, 5, 46, 24, 2, 574, 575, 7, 10, 2, 2, 575, 577, 5, 46, 24, 2, 576, 574, 3, 2, 2, 2, 577, 580, 3, 2, 2, 2, 578, 576, 3, 2, 2, 2, 578, 579, 3, 2, 2, 2, 579, 582, 3, 2, 2, 2, 580, 578, 3, 2, 2, 2, 581, 573, 3, 2, 2, 2, 581, 582, 3, 2, 2, 2, 582, 584, 3, 2, 2, 2, 583, 585, 7, 10, 2, 2, 584, 583, 3, 2, 2, 2, 584, 585, 3, 2, 2, 2, 585, 586, 3, 2, 2, 2, 586, 610, 7, 14, 2, 2, 587, 588, 7, 37, 2, 2, 588, 589, 7, 63, 2, 2, 589, 590, 5, 46, 24, 2, 590, 591, 7, 64, 2, 2, 591, 592, 5, 46, 24, 2, 592, 593, 7, 38, 2, 2, 593, 594, 5, 46, 24, 7, 594, 610, 3, 2, 2, 2, 595, 596, 5, 10, 6, 2, 596, 597, 5, 46, 24, 6, 597, 610, 3, 2, 2, 2, 598, 599, 5, 20, 11, 2, 599, 600, 5, 46, 24, 5, 600, 610, 3, 2, 2, 2, 601, 602, 7, 63, 2, 2, 602, 603, 5, 46, 24, 2, 603, 604, 7, 64, 2, 2, 604, 610, 3, 2, 2, 2, 605, 606, 7, 4, 2, 2, 606, 607, 5, 46, 24, 2, 607, 608, 7, 5, 2, 2, 608, 610, 3, 2, 2, 2, 609, 459, 3, 2, 2, 2, 609, 461, 3, 2, 2, 2, 609, 468, 3, 2, 2, 2, 609, 470, 3, 2, 2, 2, 609, 475, 3, 2, 2, 2, 609, 490, 3, 2, 2, 2, 609, 505, 3, 2, 2, 2, 609, 506, 3, 2, 2, 2, 609, 521, 3, 2, 2, 2, 609, 540, 3, 2, 2, 2, 609, 542, 3, 2, 2, 2, 609, 558, 3, 2, 2, 2, 609, 572, 3, 2, 2, 2, 609, 587, 3, 2, 2, 2, 609, 595, 3, 2, 2, 2, 609, 598, 3, 2, 2, 2, 609, 601, 3, 2, 2, 2, 609, 605, 3, 2, 2, 2, 610, 660, 3, 2, 2, 2, 611, 612, 12, 28, 2, 2, 612, 613, 7, 33, 2, 2, 613, 659, 5, 46, 24, 28, 614, 615, 12, 26, 2, 2, 615, 616, 9, 2, 2, 2, 616, 659, 5, 46, 24, 27, 617, 618, 12, 25, 2, 2, 618, 619, 9, 3, 2, 2, 619, 659, 5, 46, 24, 26, 620, 621, 12, 24, 2, 2, 621, 622, 9, 4, 2, 2, 622, 659, 5, 46, 24, 25, 623, 624, 12, 22, 2, 2, 624, 625, 7, 62, 2, 2, 625, 626, 5, 46, 24, 23, 626, 627, 8, 24, 1, 2, 627, 659, 3, 2, 2, 2, 628, 629, 12, 20, 2, 2, 629, 630, 7, 45, 2, 2, 630, 659, 5, 46, 24, 21, 631, 632, 12, 18, 2, 2, 632, 633, 7, 46, 2, 2, 633, 659, 5, 46, 24, 19, 634, 635, 12, 17, 2, 2, 635, 636, 7, 47, 2, 2, 636, 659, 5, 46, 24, 18, 637, 638, 12, 16, 2, 2, 638, 639, 7, 48, 2, 2, 639, 659, 5, 46, 24, 17, 640, 641, 12, 10, 2, 2, 641, 642, 7, 28, 2, 2, 642, 659, 5, 46, 24, 11, 643, 644, 12, 32, 2, 2, 644, 645, 7, 24, 2, 2, 645, 651, 5, 76, 39, 2, 646, 648, 7, 63, 2, 2, 647, 649, 5, 70, 36, 2, 648, 647, 3, 2, 2, 2, 648, 649, 3, 2, 2, 2, 649, 650, 3, 2, 2, 2, 650, 652, 7, 64, 2, 2, 651, 646, 3, 2, 2, 2, 651, 652, 3, 2, 2, 2, 652, 659, 3, 2, 2, 2, 653, 654, 12, 29, 2, 2, 654, 655, 7, 13, 2, 2, 655, 656, 5, 46, 24, 2, 656, 657, 7, 14, 2, 2, 657, 659, 3, 2, 2, 2, 658, 611, 3, 2, 2, 2, 658, 614, 3, 2, 2, 2, 658, 617, 3, 2, 2, 2, 658, 620, 3, 2, 2, 2, 658, 623, 3, 2, 2, 2, 658, 628, 3, 2, 2, 2, 658, 631, 3, 2, 2, 2, 658, 634, 3, 2, 2, 2, 658, 637, 3, 2, 2, 2, 658, 640, 3, 2, 2, 2, 658, 643, 3, 2, 2, 2, 658, 653, 3, 2, 2, 2, 659, 662, 3, 2, 2, 2, 660, 658, 3, 2, 2, 2, 660, 661, 3, 2, 2, 2, 661, 47, 3, 2, 2, 2, 662, 660, 3, 2, 2, 2, 663, 664, 7, 50, 2, 2, 664, 665, 5, 46, 24, 2, 665, 667, 7, 4, 2, 2, 666, 668, 7, 15, 2, 2, 667, 666, 3, 2, 2, 2, 667, 668, 3, 2, 2, 2, 668, 669, 3, 2, 2, 2, 669, 674, 5, 50, 26, 2, 670, 671, 7, 15, 2, 2, 671, 673, 5, 50, 26, 2, 672, 670, 3, 2, 2, 2, 673, 676, 3, 2, 2, 2, 674, 672, 3, 2, 2, 2, 674, 675, 3, 2, 2, 2, 675, 677, 3, 2, 2, 2, 676, 674, 3, 2, 2, 2, 677, 678, 7, 5, 2, 2, 678, 49, 3, 2, 2, 2, 679, 682, 5, 52, 27, 2, 680, 682, 7, 39, 2, 2, 681, 679, 3, 2, 2, 2, 681, 680, 3, 2, 2, 2, 682, 683, 3, 2, 2, 2, 683, 684, 7, 29, 2, 2, 684, 685, 5, 46, 24, 2, 685, 51, 3, 2, 2, 2, 686, 693, 5, 84, 43, 2, 687, 690, 7, 63, 2, 2, 688, 691, 5, 84, 43, 2, 689, 691, 7, 39, 2, 2, 690, 688, 3, 2, 2, 2, 690, 689, 3, 2, 2, 2, 691, 692, 3, 2, 2, 2, 692, 694, 7, 64, 2, 2, 693, 687, 3, 2, 2, 2, 693, 694, 3, 2, 2, 2, 694, 53, 3, 2, 2, 2, 695, 696, 5, 8, 5, 2, 696, 697, 7, 2, 2, 3, 697, 705, 3, 2, 2, 2, 698, 699, 5, 46, 24, 2, 699, 700, 7, 2, 2, 3, 700, 705, 3, 2, 2, 2, 701, 702, 7, 69, 2, 2, 702, 705, 7, 2, 2, 3, 703, 705, 7, 2, 2, 3, 704, 695, 3, 2, 2, 2, 704, 698, 3, 2, 2, 2, 704, 701, 3, 2, 2, 2, 704, 703, 3, 2, 2, 2, 705, 55, 3, 2, 2, 2, 706, 709, 5, 58, 30, 2, 707, 709, 5, 60, 31, 2, 708, 706, 3, 2, 2, 2, 708, 707, 3, 2, 2, 2, 709, 57, 3, 2, 2, 2, 710, 711, 5, 64, 33, 2, 711, 712, 7, 29, 2, 2, 712, 713, 5, 46, 24, 2, 713, 728, 3, 2, 2, 2, 714, 715, 7, 63, 2, 2, 715, 720, 5, 64, 33, 2, 716, 717, 7, 10, 2, 2, 717, 719, 5, 64, 33, 2, 718, 716, 3, 2, 2, 2, 719, 722, 3, 2, 2, 2, 720, 718, 3, 2, 2, 2, 720, 721, 3, 2, 2, 2, 721, 723, 3, 2, 2, 2, 722, 720, 3, 2, 2, 2, 723, 724, 7, 64, 2, 2, 724, 725, 7, 29, 2, 2, 725, 726, 5, 46, 24, 2, 726, 728, 3, 2, 2, 2, 727, 710, 3, 2, 2, 2, 727, 714, 3, 2, 2, 2, 728, 59, 3, 2, 2, 2, 729, 730, 7, 63, 2, 2, 730, 731, 7, 63, 2, 2, 731, 734, 5, 64, 33, 2, 732, 733, 7, 10, 2, 2, 733, 735, 5, 64, 33, 2, 734, 732, 3, 2, 2, 2, 735, 736, 3, 2, 2, 2, 736, 734, 3, 2, 2, 2, 736, 737, 3, 2, 2, 2, 737, 738, 3, 2, 2, 2, 738, 739, 7, 64, 2, 2, 739, 740, 7, 64, 2, 2, 740, 741, 7, 29, 2, 2, 741, 742, 5, 46, 24, 2, 742, 61, 3, 2, 2, 2, 743, 746, 7, 39, 2, 2, 744, 746, 5, 82, 42, 2, 745, 743, 3, 2, 2, 2, 745, 744, 3, 2, 2, 2, 746, 63, 3, 2, 2, 2, 747, 748, 5, 62, 32, 2, 748, 65, 3, 2, 2, 2, 749, 750, 5, 62, 32, 2, 750, 751, 7, 7, 2, 2, 751, 752, 5, 38, 20, 2, 752, 67, 3, 2, 2, 2, 753, 756, 7, 53, 2, 2, 754, 756, 5, 82, 42, 2, 755, 753, 3, 2, 2, 2, 755, 754, 3, 2, 2, 2, 756, 69, 3, 2, 2, 2, 757, 762, 5, 46, 24, 2, 758, 759, 7, 10, 2, 2, 759, 761, 5, 46, 24, 2, 760, 758, 3, 2, 2, 2, 761, 764, 3, 2, 2, 2, 762, 760, 3, 2, 2, 2, 762, 763, 3, 2, 2, 2, 763, 71, 3, 2, 2, 2, 764, 762, 3, 2, 2, 2, 765, 766, 5, 84, 43, 2, 766, 767, 7, 7, 2, 2, 767, 768, 5, 46, 24, 2, 768, 772, 3, 2, 2, 2, 769, 770, 7, 40, 2, 2, 770, 772, 5, 46, 24, 2, 771, 765, 3, 2, 2, 2, 771, 769, 3, 2, 2, 2, 772, 73, 3, 2, 2, 2, 773, 776, 5, 82, 42, 2, 774, 776, 9, 5, 2, 2, 775, 773, 3, 2, 2, 2, 775, 774, 3, 2, 2, 2, 776, 75, 3, 2, 2, 2, 777, 780, 5, 82, 42, 2, 778, 780, 9, 6, 2, 2, 779, 777, 3, 2, 2, 2, 779, 778, 3, 2, 2, 2, 780, 77, 3, 2, 2, 2, 781, 782, 9, 7, 2, 2, 782, 79, 3, 2, 2, 2, 783, 784, 9, 8, 2, 2, 784, 81, 3, 2, 2, 2, 785, 790, 5, 86, 44, 2, 786, 787, 7, 41, 2, 2, 787, 789, 5, 86, 44, 2, 788, 786, 3, 2, 2, 2, 789, 792, 3, 2, 2, 2, 790, 788, 3, 2, 2, 2, 790, 791, 3, 2, 2, 2, 791, 83, 3, 2, 2, 2, 792, 790, 3, 2, 2, 2, 793, 798, 5, 86, 44, 2, 794, 795, 5, 82, 42, 2, 795, 796, 8, 43, 1, 2, 796, 798, 3, 2, 2, 2, 797, 793, 3, 2, 2, 2, 797, 794, 3, 2, 2, 2, 798, 85, 3, 2, 2, 2, 799, 800, 9, 9, 2, 2, 800, 87, 3, 2, 2, 2, 90, 91, 98, 107, 115, 140, 150, 158, 161, 171, 174, 177, 181, 185, 188, 190, 204, 213, 218, 221, 228, 236, 242, 247, 258, 266, 272, 276, 278, 289, 291, 306, 314, 329, 337, 339, 356, 359, 362, 385, 389, 395, 407, 422, 427, 429, 445, 451, 455, 464, 482, 486, 497, 501, 513, 517, 528, 532, 540, 550, 554, 564, 568, 578, 581, 584, 609, 648, 651, 658, 660, 667, 674, 681, 690, 693, 704, 708, 720, 727, 736, 745, 755, 762, 771, 775, 779, 790, 797] \ No newline at end of file diff --git a/quint/src/generated/QuintListener.ts b/quint/src/generated/QuintListener.ts index 3894383e6..7eade795d 100644 --- a/quint/src/generated/QuintListener.ts +++ b/quint/src/generated/QuintListener.ts @@ -55,6 +55,8 @@ import { LetInContext } from "./QuintParser"; import { NondetContext } from "./QuintParser"; import { ParenContext } from "./QuintParser"; import { BracesContext } from "./QuintParser"; +import { AnnotatedOperDefContext } from "./QuintParser"; +import { DeprecatedOperDefContext } from "./QuintParser"; import { ConstContext } from "./QuintParser"; import { VarContext } from "./QuintParser"; import { AssumeContext } from "./QuintParser"; @@ -95,6 +97,7 @@ import { LambdaUnsugaredContext } from "./QuintParser"; import { LambdaTupleSugarContext } from "./QuintParser"; import { IdentOrHoleContext } from "./QuintParser"; import { ParameterContext } from "./QuintParser"; +import { AnnotatedParameterContext } from "./QuintParser"; import { IdentOrStarContext } from "./QuintParser"; import { ArgListContext } from "./QuintParser"; import { RecElemContext } from "./QuintParser"; @@ -710,6 +713,32 @@ export interface QuintListener extends ParseTreeListener { */ exitBraces?: (ctx: BracesContext) => void; + /** + * Enter a parse tree produced by the `annotatedOperDef` + * labeled alternative in `QuintParser.operDef`. + * @param ctx the parse tree + */ + enterAnnotatedOperDef?: (ctx: AnnotatedOperDefContext) => void; + /** + * Exit a parse tree produced by the `annotatedOperDef` + * labeled alternative in `QuintParser.operDef`. + * @param ctx the parse tree + */ + exitAnnotatedOperDef?: (ctx: AnnotatedOperDefContext) => void; + + /** + * Enter a parse tree produced by the `deprecatedOperDef` + * labeled alternative in `QuintParser.operDef`. + * @param ctx the parse tree + */ + enterDeprecatedOperDef?: (ctx: DeprecatedOperDefContext) => void; + /** + * Exit a parse tree produced by the `deprecatedOperDef` + * labeled alternative in `QuintParser.operDef`. + * @param ctx the parse tree + */ + exitDeprecatedOperDef?: (ctx: DeprecatedOperDefContext) => void; + /** * Enter a parse tree produced by the `const` * labeled alternative in `QuintParser.declaration`. @@ -1166,6 +1195,17 @@ export interface QuintListener extends ParseTreeListener { */ exitParameter?: (ctx: ParameterContext) => void; + /** + * Enter a parse tree produced by `QuintParser.annotatedParameter`. + * @param ctx the parse tree + */ + enterAnnotatedParameter?: (ctx: AnnotatedParameterContext) => void; + /** + * Exit a parse tree produced by `QuintParser.annotatedParameter`. + * @param ctx the parse tree + */ + exitAnnotatedParameter?: (ctx: AnnotatedParameterContext) => void; + /** * Enter a parse tree produced by `QuintParser.identOrStar`. * @param ctx the parse tree diff --git a/quint/src/generated/QuintParser.ts b/quint/src/generated/QuintParser.ts index b243c6b7d..d73133d0f 100644 --- a/quint/src/generated/QuintParser.ts +++ b/quint/src/generated/QuintParser.ts @@ -136,16 +136,17 @@ export class QuintParser extends Parser { public static readonly RULE_lambdaTupleSugar = 29; public static readonly RULE_identOrHole = 30; public static readonly RULE_parameter = 31; - public static readonly RULE_identOrStar = 32; - public static readonly RULE_argList = 33; - public static readonly RULE_recElem = 34; - public static readonly RULE_normalCallName = 35; - public static readonly RULE_nameAfterDot = 36; - public static readonly RULE_operator = 37; - public static readonly RULE_literal = 38; - public static readonly RULE_qualId = 39; - public static readonly RULE_simpleId = 40; - public static readonly RULE_identifier = 41; + public static readonly RULE_annotatedParameter = 32; + public static readonly RULE_identOrStar = 33; + public static readonly RULE_argList = 34; + public static readonly RULE_recElem = 35; + public static readonly RULE_normalCallName = 36; + public static readonly RULE_nameAfterDot = 37; + public static readonly RULE_operator = 38; + public static readonly RULE_literal = 39; + public static readonly RULE_qualId = 40; + public static readonly RULE_simpleId = 41; + public static readonly RULE_identifier = 42; // tslint:disable:no-trailing-whitespace public static readonly ruleNames: string[] = [ "modules", "module", "documentedDeclaration", "declaration", "operDef", @@ -154,8 +155,8 @@ export class QuintParser extends Parser { "qualifiedName", "fromSource", "type", "typeVar", "row", "rowLabel", "expr", "matchSumExpr", "matchSumCase", "matchSumVariant", "declarationOrExpr", "lambda", "lambdaUnsugared", "lambdaTupleSugar", "identOrHole", "parameter", - "identOrStar", "argList", "recElem", "normalCallName", "nameAfterDot", - "operator", "literal", "qualId", "simpleId", "identifier", + "annotatedParameter", "identOrStar", "argList", "recElem", "normalCallName", + "nameAfterDot", "operator", "literal", "qualId", "simpleId", "identifier", ]; private static readonly _LITERAL_NAMES: Array = [ @@ -214,21 +215,21 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 85; + this.state = 87; this._errHandler.sync(this); _la = this._input.LA(1); do { { { - this.state = 84; + this.state = 86; this.module(); } } - this.state = 87; + this.state = 89; this._errHandler.sync(this); _la = this._input.LA(1); } while (_la === QuintParser.T__0 || _la === QuintParser.DOCCOMMENT); - this.state = 89; + this.state = 91; this.match(QuintParser.EOF); } } @@ -254,41 +255,41 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 94; + this.state = 96; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.DOCCOMMENT) { { { - this.state = 91; + this.state = 93; this.match(QuintParser.DOCCOMMENT); } } - this.state = 96; + this.state = 98; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 97; + this.state = 99; this.match(QuintParser.T__0); - this.state = 98; + this.state = 100; this.qualId(); - this.state = 99; + this.state = 101; this.match(QuintParser.T__1); - this.state = 103; + this.state = 105; this._errHandler.sync(this); _la = this._input.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__3) | (1 << QuintParser.T__5) | (1 << QuintParser.T__6) | (1 << QuintParser.T__9) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19) | (1 << QuintParser.T__20) | (1 << QuintParser.T__24))) !== 0) || _la === QuintParser.DOCCOMMENT) { { { - this.state = 100; + this.state = 102; this.documentedDeclaration(); } } - this.state = 105; + this.state = 107; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 106; + this.state = 108; this.match(QuintParser.T__2); } } @@ -314,21 +315,21 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 111; + this.state = 113; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.DOCCOMMENT) { { { - this.state = 108; + this.state = 110; this.match(QuintParser.DOCCOMMENT); } } - this.state = 113; + this.state = 115; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 114; + this.state = 116; this.declaration(); } } @@ -351,20 +352,20 @@ export class QuintParser extends Parser { let _localctx: DeclarationContext = new DeclarationContext(this._ctx, this.state); this.enterRule(_localctx, 6, QuintParser.RULE_declaration); try { - this.state = 136; + this.state = 138; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 4, this._ctx) ) { case 1: _localctx = new ConstContext(_localctx); this.enterOuterAlt(_localctx, 1); { - this.state = 116; + this.state = 118; this.match(QuintParser.T__3); - this.state = 117; + this.state = 119; this.qualId(); - this.state = 118; + this.state = 120; this.match(QuintParser.T__4); - this.state = 119; + this.state = 121; this.type(0); } break; @@ -373,13 +374,13 @@ export class QuintParser extends Parser { _localctx = new VarContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 121; + this.state = 123; this.match(QuintParser.T__5); - this.state = 122; + this.state = 124; this.qualId(); - this.state = 123; + this.state = 125; this.match(QuintParser.T__4); - this.state = 124; + this.state = 126; this.type(0); } break; @@ -388,13 +389,15 @@ export class QuintParser extends Parser { _localctx = new AssumeContext(_localctx); this.enterOuterAlt(_localctx, 3); { - this.state = 126; - this.match(QuintParser.T__6); - this.state = 127; - this.identOrHole(); this.state = 128; - this.match(QuintParser.ASGN); + this.match(QuintParser.T__6); + { this.state = 129; + (_localctx as AssumeContext)._assumeName = this.identOrHole(); + } + this.state = 130; + this.match(QuintParser.ASGN); + this.state = 131; this.expr(0); } break; @@ -403,7 +406,7 @@ export class QuintParser extends Parser { _localctx = new InstanceContext(_localctx); this.enterOuterAlt(_localctx, 4); { - this.state = 131; + this.state = 133; this.instanceMod(); } break; @@ -412,7 +415,7 @@ export class QuintParser extends Parser { _localctx = new OperContext(_localctx); this.enterOuterAlt(_localctx, 5); { - this.state = 132; + this.state = 134; this.operDef(); } break; @@ -421,7 +424,7 @@ export class QuintParser extends Parser { _localctx = new TypeDefsContext(_localctx); this.enterOuterAlt(_localctx, 6); { - this.state = 133; + this.state = 135; this.typeDef(); } break; @@ -430,7 +433,7 @@ export class QuintParser extends Parser { _localctx = new ImportDefContext(_localctx); this.enterOuterAlt(_localctx, 7); { - this.state = 134; + this.state = 136; this.importMod(); } break; @@ -439,7 +442,7 @@ export class QuintParser extends Parser { _localctx = new ExportDefContext(_localctx); this.enterOuterAlt(_localctx, 8); { - this.state = 135; + this.state = 137; this.exportMod(); } break; @@ -465,84 +468,65 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 8, QuintParser.RULE_operDef); let _la: number; try { - this.state = 191; + this.state = 188; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 14, this._ctx) ) { case 1: + _localctx = new AnnotatedOperDefContext(_localctx); this.enterOuterAlt(_localctx, 1); { - this.state = 138; + this.state = 140; this.qualifier(); - this.state = 139; + this.state = 141; this.normalCallName(); - this.state = 152; + this.state = 142; + this.match(QuintParser.LPAREN); + { + this.state = 143; + (_localctx as AnnotatedOperDefContext)._annotatedParameter = this.annotatedParameter(); + (_localctx as AnnotatedOperDefContext)._annotOperParam.push((_localctx as AnnotatedOperDefContext)._annotatedParameter); + this.state = 148; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 7, this._ctx) ) { - case 1: + _la = this._input.LA(1); + while (_la === QuintParser.T__7) { { - this.state = 140; - this.match(QuintParser.LPAREN); - this.state = 149; - this._errHandler.sync(this); - _la = this._input.LA(1); - if (((((_la - 37)) & ~0x1F) === 0 && ((1 << (_la - 37)) & ((1 << (QuintParser.T__36 - 37)) | (1 << (QuintParser.LOW_ID - 37)) | (1 << (QuintParser.CAP_ID - 37)))) !== 0)) { - { - this.state = 141; - this.parameter(); - this.state = 146; - this._errHandler.sync(this); - _la = this._input.LA(1); - while (_la === QuintParser.T__7) { - { - { - this.state = 142; - this.match(QuintParser.T__7); - this.state = 143; - this.parameter(); - } - } - this.state = 148; - this._errHandler.sync(this); - _la = this._input.LA(1); - } - } + { + this.state = 144; + this.match(QuintParser.T__7); + this.state = 145; + (_localctx as AnnotatedOperDefContext)._annotatedParameter = this.annotatedParameter(); + (_localctx as AnnotatedOperDefContext)._annotOperParam.push((_localctx as AnnotatedOperDefContext)._annotatedParameter); } - - this.state = 151; - this.match(QuintParser.RPAREN); } - break; + this.state = 150; + this._errHandler.sync(this); + _la = this._input.LA(1); } - this.state = 156; - this._errHandler.sync(this); - _la = this._input.LA(1); - if (_la === QuintParser.T__4) { - { - this.state = 154; - this.match(QuintParser.T__4); - this.state = 155; - this.type(0); - } } - - this.state = 160; + this.state = 151; + this.match(QuintParser.RPAREN); + this.state = 152; + this.match(QuintParser.T__4); + this.state = 153; + this.type(0); + this.state = 156; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.ASGN) { { - this.state = 158; + this.state = 154; this.match(QuintParser.ASGN); - this.state = 159; + this.state = 155; this.expr(0); } } - this.state = 163; + this.state = 159; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__8) { { - this.state = 162; + this.state = 158; this.match(QuintParser.T__8); } } @@ -551,66 +535,83 @@ export class QuintParser extends Parser { break; case 2: + _localctx = new DeprecatedOperDefContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 165; + this.state = 161; this.qualifier(); - this.state = 166; + this.state = 162; this.normalCallName(); - this.state = 167; - this.match(QuintParser.LPAREN); - { - this.state = 168; - this.parameter(); - this.state = 169; - this.match(QuintParser.T__4); - this.state = 170; - this.type(0); - this.state = 178; + this.state = 175; this._errHandler.sync(this); - _la = this._input.LA(1); - while (_la === QuintParser.T__7) { - { + switch ( this.interpreter.adaptivePredict(this._input, 10, this._ctx) ) { + case 1: { - this.state = 171; - this.match(QuintParser.T__7); + this.state = 163; + this.match(QuintParser.LPAREN); this.state = 172; - this.parameter(); - this.state = 173; - this.match(QuintParser.T__4); - this.state = 174; - this.type(0); - } - } - this.state = 180; this._errHandler.sync(this); _la = this._input.LA(1); + if (((((_la - 37)) & ~0x1F) === 0 && ((1 << (_la - 37)) & ((1 << (QuintParser.T__36 - 37)) | (1 << (QuintParser.LOW_ID - 37)) | (1 << (QuintParser.CAP_ID - 37)))) !== 0)) { + { + this.state = 164; + (_localctx as DeprecatedOperDefContext)._parameter = this.parameter(); + (_localctx as DeprecatedOperDefContext)._operParam.push((_localctx as DeprecatedOperDefContext)._parameter); + this.state = 169; + this._errHandler.sync(this); + _la = this._input.LA(1); + while (_la === QuintParser.T__7) { + { + { + this.state = 165; + this.match(QuintParser.T__7); + this.state = 166; + (_localctx as DeprecatedOperDefContext)._parameter = this.parameter(); + (_localctx as DeprecatedOperDefContext)._operParam.push((_localctx as DeprecatedOperDefContext)._parameter); + } + } + this.state = 171; + this._errHandler.sync(this); + _la = this._input.LA(1); + } + } + } + + this.state = 174; + this.match(QuintParser.RPAREN); + } + break; } + this.state = 179; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === QuintParser.T__4) { + { + this.state = 177; + this.match(QuintParser.T__4); + this.state = 178; + (_localctx as DeprecatedOperDefContext)._annotatedRetType = this.type(0); + } } - this.state = 181; - this.match(QuintParser.RPAREN); - this.state = 182; - this.match(QuintParser.T__4); + this.state = 183; - this.type(0); - this.state = 186; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.ASGN) { { - this.state = 184; + this.state = 181; this.match(QuintParser.ASGN); - this.state = 185; + this.state = 182; this.expr(0); } } - this.state = 189; + this.state = 186; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__8) { { - this.state = 188; + this.state = 185; this.match(QuintParser.T__8); } } @@ -638,16 +639,16 @@ export class QuintParser extends Parser { let _localctx: TypeDefContext = new TypeDefContext(this._ctx, this.state); this.enterRule(_localctx, 10, QuintParser.RULE_typeDef); try { - this.state = 205; + this.state = 202; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 15, this._ctx) ) { case 1: _localctx = new TypeAbstractDefContext(_localctx); this.enterOuterAlt(_localctx, 1); { - this.state = 193; + this.state = 190; this.match(QuintParser.T__9); - this.state = 194; + this.state = 191; this.qualId(); } break; @@ -656,13 +657,13 @@ export class QuintParser extends Parser { _localctx = new TypeAliasDefContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 195; + this.state = 192; this.match(QuintParser.T__9); - this.state = 196; + this.state = 193; this.typeDefHead(); - this.state = 197; + this.state = 194; this.match(QuintParser.ASGN); - this.state = 198; + this.state = 195; this.type(0); } break; @@ -671,13 +672,13 @@ export class QuintParser extends Parser { _localctx = new TypeSumDefContext(_localctx); this.enterOuterAlt(_localctx, 3); { - this.state = 200; + this.state = 197; this.match(QuintParser.T__9); - this.state = 201; + this.state = 198; this.typeDefHead(); - this.state = 202; + this.state = 199; this.match(QuintParser.ASGN); - this.state = 203; + this.state = 200; this.sumTypeDefinition(); } break; @@ -705,36 +706,36 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 207; + this.state = 204; _localctx._typeName = this.qualId(); - this.state = 219; + this.state = 216; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__10) { { - this.state = 208; + this.state = 205; this.match(QuintParser.T__10); - this.state = 209; + this.state = 206; _localctx._typeVar = this.typeVar(); _localctx._typeVars.push(_localctx._typeVar); - this.state = 214; + this.state = 211; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 210; + this.state = 207; this.match(QuintParser.T__7); - this.state = 211; + this.state = 208; _localctx._typeVar = this.typeVar(); _localctx._typeVars.push(_localctx._typeVar); } } - this.state = 216; + this.state = 213; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 217; + this.state = 214; this.match(QuintParser.T__11); } } @@ -763,31 +764,31 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 222; + this.state = 219; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__12) { { - this.state = 221; + this.state = 218; this.match(QuintParser.T__12); } } - this.state = 224; + this.state = 221; this.typeSumVariant(); - this.state = 229; + this.state = 226; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__12) { { { - this.state = 225; + this.state = 222; this.match(QuintParser.T__12); - this.state = 226; + this.state = 223; this.typeSumVariant(); } } - this.state = 231; + this.state = 228; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -815,18 +816,18 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 232; + this.state = 229; _localctx._sumLabel = this.simpleId("variant label"); - this.state = 237; + this.state = 234; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.LPAREN) { { - this.state = 233; + this.state = 230; this.match(QuintParser.LPAREN); - this.state = 234; + this.state = 231; this.type(0); - this.state = 235; + this.state = 232; this.match(QuintParser.RPAREN); } } @@ -855,32 +856,32 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 239; + this.state = 236; this.match(QuintParser.T__13); - this.state = 240; + this.state = 237; this.qualId(); - this.state = 243; + this.state = 240; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__4) { { - this.state = 241; + this.state = 238; this.match(QuintParser.T__4); - this.state = 242; + this.state = 239; this.type(0); } } - this.state = 245; + this.state = 242; this.match(QuintParser.ASGN); - this.state = 246; + this.state = 243; this.expr(0); - this.state = 248; + this.state = 245; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__8) { { - this.state = 247; + this.state = 244; this.match(QuintParser.T__8); } } @@ -906,13 +907,13 @@ export class QuintParser extends Parser { let _localctx: QualifierContext = new QualifierContext(this._ctx, this.state); this.enterRule(_localctx, 20, QuintParser.RULE_qualifier); try { - this.state = 259; + this.state = 256; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 23, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 250; + this.state = 247; this.match(QuintParser.T__14); } break; @@ -920,7 +921,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 251; + this.state = 248; this.match(QuintParser.T__15); } break; @@ -928,9 +929,9 @@ export class QuintParser extends Parser { case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 252; + this.state = 249; this.match(QuintParser.T__16); - this.state = 253; + this.state = 250; this.match(QuintParser.T__14); } break; @@ -938,9 +939,9 @@ export class QuintParser extends Parser { case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 254; + this.state = 251; this.match(QuintParser.T__16); - this.state = 255; + this.state = 252; this.match(QuintParser.T__15); } break; @@ -948,7 +949,7 @@ export class QuintParser extends Parser { case 5: this.enterOuterAlt(_localctx, 5); { - this.state = 256; + this.state = 253; this.match(QuintParser.T__17); } break; @@ -956,7 +957,7 @@ export class QuintParser extends Parser { case 6: this.enterOuterAlt(_localctx, 6); { - this.state = 257; + this.state = 254; this.match(QuintParser.T__18); } break; @@ -964,7 +965,7 @@ export class QuintParser extends Parser { case 7: this.enterOuterAlt(_localctx, 7); { - this.state = 258; + this.state = 255; this.match(QuintParser.T__19); } break; @@ -990,28 +991,28 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 22, QuintParser.RULE_importMod); let _la: number; try { - this.state = 279; + this.state = 276; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 27, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 261; + this.state = 258; this.match(QuintParser.T__20); - this.state = 262; + this.state = 259; this.name(); - this.state = 263; + this.state = 260; this.match(QuintParser.T__21); - this.state = 264; + this.state = 261; this.identOrStar(); - this.state = 267; + this.state = 264; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__22) { { - this.state = 265; + this.state = 262; this.match(QuintParser.T__22); - this.state = 266; + this.state = 263; this.fromSource(); } } @@ -1022,30 +1023,30 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 269; + this.state = 266; this.match(QuintParser.T__20); - this.state = 270; + this.state = 267; this.name(); - this.state = 273; + this.state = 270; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__23) { { - this.state = 271; + this.state = 268; this.match(QuintParser.T__23); - this.state = 272; + this.state = 269; this.name(); } } - this.state = 277; + this.state = 274; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__22) { { - this.state = 275; + this.state = 272; this.match(QuintParser.T__22); - this.state = 276; + this.state = 273; this.fromSource(); } } @@ -1074,19 +1075,19 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 24, QuintParser.RULE_exportMod); let _la: number; try { - this.state = 292; + this.state = 289; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 29, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 281; + this.state = 278; this.match(QuintParser.T__24); - this.state = 282; + this.state = 279; this.name(); - this.state = 283; + this.state = 280; this.match(QuintParser.T__21); - this.state = 284; + this.state = 281; this.identOrStar(); } break; @@ -1094,18 +1095,18 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 286; + this.state = 283; this.match(QuintParser.T__24); - this.state = 287; + this.state = 284; this.name(); - this.state = 290; + this.state = 287; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__23) { { - this.state = 288; + this.state = 285; this.match(QuintParser.T__23); - this.state = 289; + this.state = 286; this.name(); } } @@ -1134,60 +1135,60 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 26, QuintParser.RULE_instanceMod); let _la: number; try { - this.state = 340; + this.state = 337; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 34, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 294; + this.state = 291; this.match(QuintParser.T__20); - this.state = 295; + this.state = 292; this.moduleName(); - this.state = 296; + this.state = 293; this.match(QuintParser.LPAREN); { - this.state = 297; + this.state = 294; this.name(); - this.state = 298; + this.state = 295; this.match(QuintParser.ASGN); - this.state = 299; + this.state = 296; this.expr(0); - this.state = 307; + this.state = 304; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 300; + this.state = 297; this.match(QuintParser.T__7); - this.state = 301; + this.state = 298; this.name(); - this.state = 302; + this.state = 299; this.match(QuintParser.ASGN); - this.state = 303; + this.state = 300; this.expr(0); } } - this.state = 309; + this.state = 306; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 310; + this.state = 307; this.match(QuintParser.RPAREN); - this.state = 311; + this.state = 308; this.match(QuintParser.T__21); - this.state = 312; + this.state = 309; this.match(QuintParser.MUL); - this.state = 315; + this.state = 312; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__22) { { - this.state = 313; + this.state = 310; this.match(QuintParser.T__22); - this.state = 314; + this.state = 311; this.fromSource(); } } @@ -1198,54 +1199,54 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 317; + this.state = 314; this.match(QuintParser.T__20); - this.state = 318; + this.state = 315; this.moduleName(); - this.state = 319; + this.state = 316; this.match(QuintParser.LPAREN); { - this.state = 320; + this.state = 317; this.name(); - this.state = 321; + this.state = 318; this.match(QuintParser.ASGN); - this.state = 322; + this.state = 319; this.expr(0); - this.state = 330; + this.state = 327; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 323; + this.state = 320; this.match(QuintParser.T__7); - this.state = 324; + this.state = 321; this.name(); - this.state = 325; + this.state = 322; this.match(QuintParser.ASGN); - this.state = 326; + this.state = 323; this.expr(0); } } - this.state = 332; + this.state = 329; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 333; + this.state = 330; this.match(QuintParser.RPAREN); - this.state = 334; + this.state = 331; this.match(QuintParser.T__23); - this.state = 335; + this.state = 332; this.qualifiedName(); - this.state = 338; + this.state = 335; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__22) { { - this.state = 336; + this.state = 333; this.match(QuintParser.T__22); - this.state = 337; + this.state = 334; this.fromSource(); } } @@ -1275,7 +1276,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 342; + this.state = 339; this.qualId(); } } @@ -1300,7 +1301,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 344; + this.state = 341; this.qualId(); } } @@ -1325,7 +1326,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 346; + this.state = 343; this.qualId(); } } @@ -1350,7 +1351,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 348; + this.state = 345; this.match(QuintParser.STRING); } } @@ -1388,7 +1389,7 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 408; + this.state = 405; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 41, this._ctx) ) { case 1: @@ -1397,51 +1398,51 @@ export class QuintParser extends Parser { this._ctx = _localctx; _prevctx = _localctx; - this.state = 351; + this.state = 348; this.match(QuintParser.LPAREN); - this.state = 360; + this.state = 357; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__27) | (1 << QuintParser.T__28) | (1 << QuintParser.T__29))) !== 0) || ((((_la - 61)) & ~0x1F) === 0 && ((1 << (_la - 61)) & ((1 << (QuintParser.LPAREN - 61)) | (1 << (QuintParser.SET - 61)) | (1 << (QuintParser.LIST - 61)) | (1 << (QuintParser.LOW_ID - 61)) | (1 << (QuintParser.CAP_ID - 61)))) !== 0)) { { - this.state = 352; + this.state = 349; this.type(0); - this.state = 357; + this.state = 354; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 35, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 353; + this.state = 350; this.match(QuintParser.T__7); - this.state = 354; + this.state = 351; this.type(0); } } } - this.state = 359; + this.state = 356; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 35, this._ctx); } } } - this.state = 363; + this.state = 360; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 362; + this.state = 359; this.match(QuintParser.T__7); } } - this.state = 365; + this.state = 362; this.match(QuintParser.RPAREN); - this.state = 366; + this.state = 363; this.match(QuintParser.T__26); - this.state = 367; + this.state = 364; this.type(12); } break; @@ -1451,13 +1452,13 @@ export class QuintParser extends Parser { _localctx = new TypeSetContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 368; + this.state = 365; this.match(QuintParser.SET); - this.state = 369; + this.state = 366; this.match(QuintParser.T__10); - this.state = 370; + this.state = 367; this.type(0); - this.state = 371; + this.state = 368; this.match(QuintParser.T__11); } break; @@ -1467,13 +1468,13 @@ export class QuintParser extends Parser { _localctx = new TypeListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 373; + this.state = 370; this.match(QuintParser.LIST); - this.state = 374; + this.state = 371; this.match(QuintParser.T__10); - this.state = 375; + this.state = 372; this.type(0); - this.state = 376; + this.state = 373; this.match(QuintParser.T__11); } break; @@ -1483,43 +1484,43 @@ export class QuintParser extends Parser { _localctx = new TypeTupleContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 378; + this.state = 375; this.match(QuintParser.LPAREN); - this.state = 379; + this.state = 376; this.type(0); - this.state = 380; + this.state = 377; this.match(QuintParser.T__7); - this.state = 381; + this.state = 378; this.type(0); - this.state = 386; + this.state = 383; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 382; + this.state = 379; this.match(QuintParser.T__7); - this.state = 383; + this.state = 380; this.type(0); } } } - this.state = 388; + this.state = 385; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); } - this.state = 390; + this.state = 387; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 389; + this.state = 386; this.match(QuintParser.T__7); } } - this.state = 392; + this.state = 389; this.match(QuintParser.RPAREN); } break; @@ -1529,19 +1530,19 @@ export class QuintParser extends Parser { _localctx = new TypeRecContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 394; + this.state = 391; this.match(QuintParser.T__1); - this.state = 396; + this.state = 393; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__12 || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 395; + this.state = 392; this.row(); } } - this.state = 398; + this.state = 395; this.match(QuintParser.T__2); } break; @@ -1551,7 +1552,7 @@ export class QuintParser extends Parser { _localctx = new TypeIntContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 399; + this.state = 396; this.match(QuintParser.T__27); } break; @@ -1561,7 +1562,7 @@ export class QuintParser extends Parser { _localctx = new TypeStrContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 400; + this.state = 397; this.match(QuintParser.T__28); } break; @@ -1571,7 +1572,7 @@ export class QuintParser extends Parser { _localctx = new TypeBoolContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 401; + this.state = 398; this.match(QuintParser.T__29); } break; @@ -1581,7 +1582,7 @@ export class QuintParser extends Parser { _localctx = new TypeVarCaseContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 402; + this.state = 399; this.typeVar(); } break; @@ -1591,7 +1592,7 @@ export class QuintParser extends Parser { _localctx = new TypeConstContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 403; + this.state = 400; this.qualId(); } break; @@ -1601,17 +1602,17 @@ export class QuintParser extends Parser { _localctx = new TypeParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 404; + this.state = 401; this.match(QuintParser.LPAREN); - this.state = 405; + this.state = 402; this.type(0); - this.state = 406; + this.state = 403; this.match(QuintParser.RPAREN); } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 430; + this.state = 427; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 44, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -1621,20 +1622,20 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 428; + this.state = 425; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 43, this._ctx) ) { case 1: { _localctx = new TypeFunContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 410; + this.state = 407; if (!(this.precpred(this._ctx, 14))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); } - this.state = 411; + this.state = 408; this.match(QuintParser.T__25); - this.state = 412; + this.state = 409; this.type(14); } break; @@ -1643,13 +1644,13 @@ export class QuintParser extends Parser { { _localctx = new TypeOperContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 413; + this.state = 410; if (!(this.precpred(this._ctx, 13))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 13)"); } - this.state = 414; + this.state = 411; this.match(QuintParser.T__26); - this.state = 415; + this.state = 412; this.type(13); } break; @@ -1659,34 +1660,34 @@ export class QuintParser extends Parser { _localctx = new TypeAppContext(new TypeContext(_parentctx, _parentState)); (_localctx as TypeAppContext)._typeCtor = _prevctx; this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 416; + this.state = 413; if (!(this.precpred(this._ctx, 1))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 1)"); } { - this.state = 417; + this.state = 414; this.match(QuintParser.T__10); - this.state = 418; + this.state = 415; (_localctx as TypeAppContext)._type = this.type(0); (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); - this.state = 423; + this.state = 420; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 419; + this.state = 416; this.match(QuintParser.T__7); - this.state = 420; + this.state = 417; (_localctx as TypeAppContext)._type = this.type(0); (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); } } - this.state = 425; + this.state = 422; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 426; + this.state = 423; this.match(QuintParser.T__11); } } @@ -1694,7 +1695,7 @@ export class QuintParser extends Parser { } } } - this.state = 432; + this.state = 429; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 44, this._ctx); } @@ -1721,7 +1722,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 433; + this.state = 430; this.match(QuintParser.LOW_ID); } } @@ -1745,7 +1746,7 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 40, QuintParser.RULE_row); try { let _alt: number; - this.state = 456; + this.state = 453; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: @@ -1753,50 +1754,50 @@ export class QuintParser extends Parser { this.enterOuterAlt(_localctx, 1); { { - this.state = 435; + this.state = 432; this.rowLabel(); - this.state = 436; + this.state = 433; this.match(QuintParser.T__4); - this.state = 437; + this.state = 434; this.type(0); } - this.state = 446; + this.state = 443; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 45, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 439; + this.state = 436; this.match(QuintParser.T__7); - this.state = 440; + this.state = 437; this.rowLabel(); - this.state = 441; + this.state = 438; this.match(QuintParser.T__4); - this.state = 442; + this.state = 439; this.type(0); } } } - this.state = 448; + this.state = 445; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 45, this._ctx); } - this.state = 452; + this.state = 449; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__7: { - this.state = 449; + this.state = 446; this.match(QuintParser.T__7); } break; case QuintParser.T__12: { - this.state = 450; + this.state = 447; this.match(QuintParser.T__12); { - this.state = 451; + this.state = 448; _localctx._rowVar = this.identifier(); } } @@ -1811,10 +1812,10 @@ export class QuintParser extends Parser { case QuintParser.T__12: this.enterOuterAlt(_localctx, 2); { - this.state = 454; + this.state = 451; this.match(QuintParser.T__12); { - this.state = 455; + this.state = 452; _localctx._rowVar = this.identifier(); } } @@ -1844,7 +1845,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 458; + this.state = 455; this.simpleId("record"); } } @@ -1882,7 +1883,7 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 610; + this.state = 607; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 65, this._ctx) ) { case 1: @@ -1891,7 +1892,7 @@ export class QuintParser extends Parser { this._ctx = _localctx; _prevctx = _localctx; - this.state = 461; + this.state = 458; this.lambda(); } break; @@ -1901,21 +1902,21 @@ export class QuintParser extends Parser { _localctx = new OperAppContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 462; + this.state = 459; this.normalCallName(); - this.state = 463; + this.state = 460; this.match(QuintParser.LPAREN); - this.state = 465; + this.state = 462; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 464; + this.state = 461; this.argList(); } } - this.state = 467; + this.state = 464; this.match(QuintParser.RPAREN); } break; @@ -1925,9 +1926,9 @@ export class QuintParser extends Parser { _localctx = new UminusContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 469; + this.state = 466; this.match(QuintParser.MINUS); - this.state = 470; + this.state = 467; this.expr(25); } break; @@ -1937,13 +1938,13 @@ export class QuintParser extends Parser { _localctx = new AsgnContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 471; + this.state = 468; this.qualId(); - this.state = 472; + this.state = 469; this.match(QuintParser.T__31); - this.state = 473; + this.state = 470; this.match(QuintParser.ASGN); - this.state = 474; + this.state = 471; this.expr(21); } break; @@ -1953,41 +1954,41 @@ export class QuintParser extends Parser { _localctx = new AndExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 476; + this.state = 473; this.match(QuintParser.AND); - this.state = 477; + this.state = 474; this.match(QuintParser.T__1); - this.state = 478; + this.state = 475; this.expr(0); - this.state = 483; + this.state = 480; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 479; + this.state = 476; this.match(QuintParser.T__7); - this.state = 480; + this.state = 477; this.expr(0); } } } - this.state = 485; + this.state = 482; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); } - this.state = 487; + this.state = 484; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 486; + this.state = 483; this.match(QuintParser.T__7); } } - this.state = 489; + this.state = 486; this.match(QuintParser.T__2); } break; @@ -1997,41 +1998,41 @@ export class QuintParser extends Parser { _localctx = new OrExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 491; + this.state = 488; this.match(QuintParser.OR); - this.state = 492; + this.state = 489; this.match(QuintParser.T__1); - this.state = 493; + this.state = 490; this.expr(0); - this.state = 498; + this.state = 495; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 51, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 494; + this.state = 491; this.match(QuintParser.T__7); - this.state = 495; + this.state = 492; this.expr(0); } } } - this.state = 500; + this.state = 497; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 51, this._ctx); } - this.state = 502; + this.state = 499; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 501; + this.state = 498; this.match(QuintParser.T__7); } } - this.state = 504; + this.state = 501; this.match(QuintParser.T__2); } break; @@ -2041,7 +2042,7 @@ export class QuintParser extends Parser { _localctx = new MatchContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 506; + this.state = 503; this.matchSumExpr(); } break; @@ -2051,41 +2052,41 @@ export class QuintParser extends Parser { _localctx = new ActionAllContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 507; + this.state = 504; this.match(QuintParser.T__32); - this.state = 508; + this.state = 505; this.match(QuintParser.T__1); - this.state = 509; + this.state = 506; this.expr(0); - this.state = 514; + this.state = 511; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 53, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 510; + this.state = 507; this.match(QuintParser.T__7); - this.state = 511; + this.state = 508; this.expr(0); } } } - this.state = 516; + this.state = 513; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 53, this._ctx); } - this.state = 518; + this.state = 515; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 517; + this.state = 514; this.match(QuintParser.T__7); } } - this.state = 520; + this.state = 517; this.match(QuintParser.T__2); } break; @@ -2095,41 +2096,41 @@ export class QuintParser extends Parser { _localctx = new ActionAnyContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 522; + this.state = 519; this.match(QuintParser.T__33); - this.state = 523; + this.state = 520; this.match(QuintParser.T__1); - this.state = 524; + this.state = 521; this.expr(0); - this.state = 529; + this.state = 526; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 55, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 525; + this.state = 522; this.match(QuintParser.T__7); - this.state = 526; + this.state = 523; this.expr(0); } } } - this.state = 531; + this.state = 528; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 55, this._ctx); } - this.state = 533; + this.state = 530; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 532; + this.state = 529; this.match(QuintParser.T__7); } } - this.state = 535; + this.state = 532; this.match(QuintParser.T__2); } break; @@ -2139,31 +2140,31 @@ export class QuintParser extends Parser { _localctx = new LiteralOrIdContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 541; + this.state = 538; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 537; + this.state = 534; this.qualId(); } break; case QuintParser.INT: { - this.state = 538; + this.state = 535; this.match(QuintParser.INT); } break; case QuintParser.BOOL: { - this.state = 539; + this.state = 536; this.match(QuintParser.BOOL); } break; case QuintParser.STRING: { - this.state = 540; + this.state = 537; this.match(QuintParser.STRING); } break; @@ -2178,43 +2179,43 @@ export class QuintParser extends Parser { _localctx = new TupleContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 543; + this.state = 540; this.match(QuintParser.LPAREN); - this.state = 544; + this.state = 541; this.expr(0); - this.state = 545; + this.state = 542; this.match(QuintParser.T__7); - this.state = 546; + this.state = 543; this.expr(0); - this.state = 551; + this.state = 548; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 58, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 547; + this.state = 544; this.match(QuintParser.T__7); - this.state = 548; + this.state = 545; this.expr(0); } } } - this.state = 553; + this.state = 550; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 58, this._ctx); } - this.state = 555; + this.state = 552; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 554; + this.state = 551; this.match(QuintParser.T__7); } } - this.state = 557; + this.state = 554; this.match(QuintParser.RPAREN); } break; @@ -2224,39 +2225,39 @@ export class QuintParser extends Parser { _localctx = new RecordContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 559; + this.state = 556; this.match(QuintParser.T__1); - this.state = 560; + this.state = 557; this.recElem(); - this.state = 565; + this.state = 562; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 60, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 561; + this.state = 558; this.match(QuintParser.T__7); - this.state = 562; + this.state = 559; this.recElem(); } } } - this.state = 567; + this.state = 564; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 60, this._ctx); } - this.state = 569; + this.state = 566; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 568; + this.state = 565; this.match(QuintParser.T__7); } } - this.state = 571; + this.state = 568; this.match(QuintParser.T__2); } break; @@ -2266,47 +2267,47 @@ export class QuintParser extends Parser { _localctx = new ListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 573; + this.state = 570; this.match(QuintParser.T__10); - this.state = 582; + this.state = 579; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 574; + this.state = 571; this.expr(0); - this.state = 579; + this.state = 576; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 62, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 575; + this.state = 572; this.match(QuintParser.T__7); - this.state = 576; + this.state = 573; this.expr(0); } } } - this.state = 581; + this.state = 578; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 62, this._ctx); } } } - this.state = 585; + this.state = 582; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 584; + this.state = 581; this.match(QuintParser.T__7); } } - this.state = 587; + this.state = 584; this.match(QuintParser.T__11); } break; @@ -2316,19 +2317,19 @@ export class QuintParser extends Parser { _localctx = new IfElseContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 588; + this.state = 585; this.match(QuintParser.T__34); - this.state = 589; + this.state = 586; this.match(QuintParser.LPAREN); - this.state = 590; + this.state = 587; this.expr(0); - this.state = 591; + this.state = 588; this.match(QuintParser.RPAREN); - this.state = 592; + this.state = 589; this.expr(0); - this.state = 593; + this.state = 590; this.match(QuintParser.T__35); - this.state = 594; + this.state = 591; this.expr(5); } break; @@ -2338,9 +2339,9 @@ export class QuintParser extends Parser { _localctx = new LetInContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 596; + this.state = 593; this.operDef(); - this.state = 597; + this.state = 594; this.expr(4); } break; @@ -2350,9 +2351,9 @@ export class QuintParser extends Parser { _localctx = new NondetContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 599; + this.state = 596; this.nondetOperDef(); - this.state = 600; + this.state = 597; this.expr(3); } break; @@ -2362,11 +2363,11 @@ export class QuintParser extends Parser { _localctx = new ParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 602; + this.state = 599; this.match(QuintParser.LPAREN); - this.state = 603; + this.state = 600; this.expr(0); - this.state = 604; + this.state = 601; this.match(QuintParser.RPAREN); } break; @@ -2376,17 +2377,17 @@ export class QuintParser extends Parser { _localctx = new BracesContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 606; + this.state = 603; this.match(QuintParser.T__1); - this.state = 607; + this.state = 604; this.expr(0); - this.state = 608; + this.state = 605; this.match(QuintParser.T__2); } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 661; + this.state = 658; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 69, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -2396,20 +2397,20 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 659; + this.state = 656; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 68, this._ctx) ) { case 1: { _localctx = new PowContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 612; + this.state = 609; if (!(this.precpred(this._ctx, 26))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 26)"); } - this.state = 613; + this.state = 610; (_localctx as PowContext)._op = this.match(QuintParser.T__30); - this.state = 614; + this.state = 611; this.expr(26); } break; @@ -2418,11 +2419,11 @@ export class QuintParser extends Parser { { _localctx = new MultDivContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 615; + this.state = 612; if (!(this.precpred(this._ctx, 24))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 24)"); } - this.state = 616; + this.state = 613; (_localctx as MultDivContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & ((1 << (QuintParser.MUL - 51)) | (1 << (QuintParser.DIV - 51)) | (1 << (QuintParser.MOD - 51)))) !== 0))) { @@ -2435,7 +2436,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 617; + this.state = 614; this.expr(25); } break; @@ -2444,11 +2445,11 @@ export class QuintParser extends Parser { { _localctx = new PlusMinusContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 618; + this.state = 615; if (!(this.precpred(this._ctx, 23))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 23)"); } - this.state = 619; + this.state = 616; (_localctx as PlusMinusContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(_la === QuintParser.PLUS || _la === QuintParser.MINUS)) { @@ -2461,7 +2462,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 620; + this.state = 617; this.expr(24); } break; @@ -2470,11 +2471,11 @@ export class QuintParser extends Parser { { _localctx = new RelationsContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 621; + this.state = 618; if (!(this.precpred(this._ctx, 22))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 22)"); } - this.state = 622; + this.state = 619; (_localctx as RelationsContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 54)) & ~0x1F) === 0 && ((1 << (_la - 54)) & ((1 << (QuintParser.GT - 54)) | (1 << (QuintParser.LT - 54)) | (1 << (QuintParser.GE - 54)) | (1 << (QuintParser.LE - 54)) | (1 << (QuintParser.NE - 54)) | (1 << (QuintParser.EQ - 54)))) !== 0))) { @@ -2487,7 +2488,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 623; + this.state = 620; this.expr(23); } break; @@ -2496,13 +2497,13 @@ export class QuintParser extends Parser { { _localctx = new ErrorEqContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 624; + this.state = 621; if (!(this.precpred(this._ctx, 20))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 20)"); } - this.state = 625; + this.state = 622; this.match(QuintParser.ASGN); - this.state = 626; + this.state = 623; this.expr(21); const m = "[QNT006] unexpected '=', did you mean '=='?" @@ -2515,13 +2516,13 @@ export class QuintParser extends Parser { { _localctx = new AndContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 629; + this.state = 626; if (!(this.precpred(this._ctx, 18))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 18)"); } - this.state = 630; + this.state = 627; this.match(QuintParser.AND); - this.state = 631; + this.state = 628; this.expr(19); } break; @@ -2530,13 +2531,13 @@ export class QuintParser extends Parser { { _localctx = new OrContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 632; + this.state = 629; if (!(this.precpred(this._ctx, 16))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 16)"); } - this.state = 633; + this.state = 630; this.match(QuintParser.OR); - this.state = 634; + this.state = 631; this.expr(17); } break; @@ -2545,13 +2546,13 @@ export class QuintParser extends Parser { { _localctx = new IffContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 635; + this.state = 632; if (!(this.precpred(this._ctx, 15))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 15)"); } - this.state = 636; + this.state = 633; this.match(QuintParser.IFF); - this.state = 637; + this.state = 634; this.expr(16); } break; @@ -2560,13 +2561,13 @@ export class QuintParser extends Parser { { _localctx = new ImpliesContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 638; + this.state = 635; if (!(this.precpred(this._ctx, 14))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); } - this.state = 639; + this.state = 636; this.match(QuintParser.IMPLIES); - this.state = 640; + this.state = 637; this.expr(15); } break; @@ -2575,13 +2576,13 @@ export class QuintParser extends Parser { { _localctx = new PairContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 641; + this.state = 638; if (!(this.precpred(this._ctx, 8))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 8)"); } - this.state = 642; + this.state = 639; this.match(QuintParser.T__25); - this.state = 643; + this.state = 640; this.expr(9); } break; @@ -2590,32 +2591,32 @@ export class QuintParser extends Parser { { _localctx = new DotCallContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 644; + this.state = 641; if (!(this.precpred(this._ctx, 30))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 30)"); } - this.state = 645; + this.state = 642; this.match(QuintParser.T__21); - this.state = 646; + this.state = 643; this.nameAfterDot(); - this.state = 652; + this.state = 649; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 67, this._ctx) ) { case 1: { - this.state = 647; + this.state = 644; this.match(QuintParser.LPAREN); - this.state = 649; + this.state = 646; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 648; + this.state = 645; this.argList(); } } - this.state = 651; + this.state = 648; this.match(QuintParser.RPAREN); } break; @@ -2627,22 +2628,22 @@ export class QuintParser extends Parser { { _localctx = new ListAppContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 654; + this.state = 651; if (!(this.precpred(this._ctx, 27))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 27)"); } - this.state = 655; + this.state = 652; this.match(QuintParser.T__10); - this.state = 656; + this.state = 653; this.expr(0); - this.state = 657; + this.state = 654; this.match(QuintParser.T__11); } break; } } } - this.state = 663; + this.state = 660; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 69, this._ctx); } @@ -2670,43 +2671,43 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 664; + this.state = 661; this.match(QuintParser.MATCH); - this.state = 665; + this.state = 662; this.expr(0); - this.state = 666; + this.state = 663; this.match(QuintParser.T__1); - this.state = 668; + this.state = 665; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__12) { { - this.state = 667; + this.state = 664; this.match(QuintParser.T__12); } } - this.state = 670; + this.state = 667; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); - this.state = 675; + this.state = 672; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__12) { { { - this.state = 671; + this.state = 668; this.match(QuintParser.T__12); - this.state = 672; + this.state = 669; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); } } - this.state = 677; + this.state = 674; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 678; + this.state = 675; this.match(QuintParser.T__2); } } @@ -2731,28 +2732,28 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 682; + this.state = 679; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 680; + this.state = 677; _localctx._variantMatch = this.matchSumVariant(); } break; case QuintParser.T__36: { - this.state = 681; + this.state = 678; _localctx._wildCardMatch = this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 684; + this.state = 681; this.match(QuintParser.T__26); - this.state = 685; + this.state = 682; this.expr(0); } } @@ -2779,36 +2780,36 @@ export class QuintParser extends Parser { this.enterOuterAlt(_localctx, 1); { { - this.state = 687; + this.state = 684; _localctx._variantLabel = this.simpleId("variant label"); } - this.state = 694; + this.state = 691; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.LPAREN) { { - this.state = 688; + this.state = 685; this.match(QuintParser.LPAREN); - this.state = 691; + this.state = 688; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 689; + this.state = 686; _localctx._variantParam = this.simpleId("match case parameter"); } break; case QuintParser.T__36: { - this.state = 690; + this.state = 687; this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 693; + this.state = 690; this.match(QuintParser.RPAREN); } } @@ -2834,15 +2835,15 @@ export class QuintParser extends Parser { let _localctx: DeclarationOrExprContext = new DeclarationOrExprContext(this._ctx, this.state); this.enterRule(_localctx, 52, QuintParser.RULE_declarationOrExpr); try { - this.state = 705; + this.state = 702; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 75, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 696; + this.state = 693; this.declaration(); - this.state = 697; + this.state = 694; this.match(QuintParser.EOF); } break; @@ -2850,9 +2851,9 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 699; + this.state = 696; this.expr(0); - this.state = 700; + this.state = 697; this.match(QuintParser.EOF); } break; @@ -2860,9 +2861,9 @@ export class QuintParser extends Parser { case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 702; + this.state = 699; this.match(QuintParser.DOCCOMMENT); - this.state = 703; + this.state = 700; this.match(QuintParser.EOF); } break; @@ -2870,7 +2871,7 @@ export class QuintParser extends Parser { case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 704; + this.state = 701; this.match(QuintParser.EOF); } break; @@ -2895,13 +2896,13 @@ export class QuintParser extends Parser { let _localctx: LambdaContext = new LambdaContext(this._ctx, this.state); this.enterRule(_localctx, 54, QuintParser.RULE_lambda); try { - this.state = 709; + this.state = 706; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 76, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 707; + this.state = 704; this.lambdaUnsugared(); } break; @@ -2909,7 +2910,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 708; + this.state = 705; this.lambdaTupleSugar(); } break; @@ -2935,7 +2936,7 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 56, QuintParser.RULE_lambdaUnsugared); let _la: number; try { - this.state = 728; + this.state = 725; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: @@ -2943,42 +2944,42 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 711; + this.state = 708; this.parameter(); - this.state = 712; + this.state = 709; this.match(QuintParser.T__26); - this.state = 713; + this.state = 710; this.expr(0); } break; case QuintParser.LPAREN: this.enterOuterAlt(_localctx, 2); { - this.state = 715; + this.state = 712; this.match(QuintParser.LPAREN); - this.state = 716; + this.state = 713; this.parameter(); - this.state = 721; + this.state = 718; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 717; + this.state = 714; this.match(QuintParser.T__7); - this.state = 718; + this.state = 715; this.parameter(); } } - this.state = 723; + this.state = 720; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 724; + this.state = 721; this.match(QuintParser.RPAREN); - this.state = 725; + this.state = 722; this.match(QuintParser.T__26); - this.state = 726; + this.state = 723; this.expr(0); } break; @@ -3008,35 +3009,35 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 730; + this.state = 727; this.match(QuintParser.LPAREN); - this.state = 731; + this.state = 728; this.match(QuintParser.LPAREN); - this.state = 732; + this.state = 729; this.parameter(); - this.state = 735; + this.state = 732; this._errHandler.sync(this); _la = this._input.LA(1); do { { { - this.state = 733; + this.state = 730; this.match(QuintParser.T__7); - this.state = 734; + this.state = 731; this.parameter(); } } - this.state = 737; + this.state = 734; this._errHandler.sync(this); _la = this._input.LA(1); } while (_la === QuintParser.T__7); - this.state = 739; + this.state = 736; this.match(QuintParser.RPAREN); - this.state = 740; + this.state = 737; this.match(QuintParser.RPAREN); - this.state = 741; + this.state = 738; this.match(QuintParser.T__26); - this.state = 742; + this.state = 739; this.expr(0); } } @@ -3059,13 +3060,13 @@ export class QuintParser extends Parser { let _localctx: IdentOrHoleContext = new IdentOrHoleContext(this._ctx, this.state); this.enterRule(_localctx, 60, QuintParser.RULE_identOrHole); try { - this.state = 746; + this.state = 743; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: this.enterOuterAlt(_localctx, 1); { - this.state = 744; + this.state = 741; this.match(QuintParser.T__36); } break; @@ -3073,7 +3074,7 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 745; + this.state = 742; this.qualId(); } break; @@ -3102,8 +3103,37 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { + this.state = 745; + _localctx._paramName = this.identOrHole(); + } + } + catch (re) { + if (re instanceof RecognitionException) { + _localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return _localctx; + } + // @RuleVersion(0) + public annotatedParameter(): AnnotatedParameterContext { + let _localctx: AnnotatedParameterContext = new AnnotatedParameterContext(this._ctx, this.state); + this.enterRule(_localctx, 64, QuintParser.RULE_annotatedParameter); + try { + this.enterOuterAlt(_localctx, 1); + { + this.state = 747; + _localctx._paramName = this.identOrHole(); this.state = 748; - this.identOrHole(); + this.match(QuintParser.T__4); + this.state = 749; + this.type(0); } } catch (re) { @@ -3123,15 +3153,15 @@ export class QuintParser extends Parser { // @RuleVersion(0) public identOrStar(): IdentOrStarContext { let _localctx: IdentOrStarContext = new IdentOrStarContext(this._ctx, this.state); - this.enterRule(_localctx, 64, QuintParser.RULE_identOrStar); + this.enterRule(_localctx, 66, QuintParser.RULE_identOrStar); try { - this.state = 752; + this.state = 753; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.MUL: this.enterOuterAlt(_localctx, 1); { - this.state = 750; + this.state = 751; this.match(QuintParser.MUL); } break; @@ -3139,7 +3169,7 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 751; + this.state = 752; this.qualId(); } break; @@ -3164,26 +3194,26 @@ export class QuintParser extends Parser { // @RuleVersion(0) public argList(): ArgListContext { let _localctx: ArgListContext = new ArgListContext(this._ctx, this.state); - this.enterRule(_localctx, 66, QuintParser.RULE_argList); + this.enterRule(_localctx, 68, QuintParser.RULE_argList); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 754; + this.state = 755; this.expr(0); - this.state = 759; + this.state = 760; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 755; - this.match(QuintParser.T__7); this.state = 756; + this.match(QuintParser.T__7); + this.state = 757; this.expr(0); } } - this.state = 761; + this.state = 762; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -3206,29 +3236,29 @@ export class QuintParser extends Parser { // @RuleVersion(0) public recElem(): RecElemContext { let _localctx: RecElemContext = new RecElemContext(this._ctx, this.state); - this.enterRule(_localctx, 68, QuintParser.RULE_recElem); + this.enterRule(_localctx, 70, QuintParser.RULE_recElem); try { - this.state = 768; + this.state = 769; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 762; - this.simpleId("record"); this.state = 763; - this.match(QuintParser.T__4); + this.simpleId("record"); this.state = 764; + this.match(QuintParser.T__4); + this.state = 765; this.expr(0); } break; case QuintParser.T__37: this.enterOuterAlt(_localctx, 2); { - this.state = 766; - this.match(QuintParser.T__37); this.state = 767; + this.match(QuintParser.T__37); + this.state = 768; this.expr(0); } break; @@ -3253,17 +3283,17 @@ export class QuintParser extends Parser { // @RuleVersion(0) public normalCallName(): NormalCallNameContext { let _localctx: NormalCallNameContext = new NormalCallNameContext(this._ctx, this.state); - this.enterRule(_localctx, 70, QuintParser.RULE_normalCallName); + this.enterRule(_localctx, 72, QuintParser.RULE_normalCallName); let _la: number; try { - this.state = 772; + this.state = 773; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 770; + this.state = 771; this.qualId(); } break; @@ -3276,7 +3306,7 @@ export class QuintParser extends Parser { case QuintParser.LIST: this.enterOuterAlt(_localctx, 2); { - this.state = 771; + this.state = 772; _localctx._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 43)) & ~0x1F) === 0 && ((1 << (_la - 43)) & ((1 << (QuintParser.AND - 43)) | (1 << (QuintParser.OR - 43)) | (1 << (QuintParser.IFF - 43)) | (1 << (QuintParser.IMPLIES - 43)) | (1 << (QuintParser.MAP - 43)) | (1 << (QuintParser.SET - 43)) | (1 << (QuintParser.LIST - 43)))) !== 0))) { @@ -3312,17 +3342,17 @@ export class QuintParser extends Parser { // @RuleVersion(0) public nameAfterDot(): NameAfterDotContext { let _localctx: NameAfterDotContext = new NameAfterDotContext(this._ctx, this.state); - this.enterRule(_localctx, 72, QuintParser.RULE_nameAfterDot); + this.enterRule(_localctx, 74, QuintParser.RULE_nameAfterDot); let _la: number; try { - this.state = 776; + this.state = 777; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 774; + this.state = 775; this.qualId(); } break; @@ -3332,7 +3362,7 @@ export class QuintParser extends Parser { case QuintParser.IMPLIES: this.enterOuterAlt(_localctx, 2); { - this.state = 775; + this.state = 776; _localctx._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 43)) & ~0x1F) === 0 && ((1 << (_la - 43)) & ((1 << (QuintParser.AND - 43)) | (1 << (QuintParser.OR - 43)) | (1 << (QuintParser.IFF - 43)) | (1 << (QuintParser.IMPLIES - 43)))) !== 0))) { @@ -3368,12 +3398,12 @@ export class QuintParser extends Parser { // @RuleVersion(0) public operator(): OperatorContext { let _localctx: OperatorContext = new OperatorContext(this._ctx, this.state); - this.enterRule(_localctx, 74, QuintParser.RULE_operator); + this.enterRule(_localctx, 76, QuintParser.RULE_operator); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 778; + this.state = 779; _la = this._input.LA(1); if (!(((((_la - 31)) & ~0x1F) === 0 && ((1 << (_la - 31)) & ((1 << (QuintParser.T__30 - 31)) | (1 << (QuintParser.AND - 31)) | (1 << (QuintParser.OR - 31)) | (1 << (QuintParser.IFF - 31)) | (1 << (QuintParser.IMPLIES - 31)) | (1 << (QuintParser.PLUS - 31)) | (1 << (QuintParser.MINUS - 31)) | (1 << (QuintParser.MUL - 31)) | (1 << (QuintParser.DIV - 31)) | (1 << (QuintParser.MOD - 31)) | (1 << (QuintParser.GT - 31)) | (1 << (QuintParser.LT - 31)) | (1 << (QuintParser.GE - 31)) | (1 << (QuintParser.LE - 31)) | (1 << (QuintParser.NE - 31)) | (1 << (QuintParser.EQ - 31)))) !== 0))) { this._errHandler.recoverInline(this); @@ -3404,12 +3434,12 @@ export class QuintParser extends Parser { // @RuleVersion(0) public literal(): LiteralContext { let _localctx: LiteralContext = new LiteralContext(this._ctx, this.state); - this.enterRule(_localctx, 76, QuintParser.RULE_literal); + this.enterRule(_localctx, 78, QuintParser.RULE_literal); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 780; + this.state = 781; _la = this._input.LA(1); if (!(((((_la - 40)) & ~0x1F) === 0 && ((1 << (_la - 40)) & ((1 << (QuintParser.STRING - 40)) | (1 << (QuintParser.BOOL - 40)) | (1 << (QuintParser.INT - 40)))) !== 0))) { this._errHandler.recoverInline(this); @@ -3440,28 +3470,28 @@ export class QuintParser extends Parser { // @RuleVersion(0) public qualId(): QualIdContext { let _localctx: QualIdContext = new QualIdContext(this._ctx, this.state); - this.enterRule(_localctx, 78, QuintParser.RULE_qualId); + this.enterRule(_localctx, 80, QuintParser.RULE_qualId); try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 782; + this.state = 783; this.identifier(); - this.state = 787; + this.state = 788; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 86, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 783; - this.match(QuintParser.T__38); this.state = 784; + this.match(QuintParser.T__38); + this.state = 785; this.identifier(); } } } - this.state = 789; + this.state = 790; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 86, this._ctx); } @@ -3484,15 +3514,15 @@ export class QuintParser extends Parser { // @RuleVersion(0) public simpleId(context: string): SimpleIdContext { let _localctx: SimpleIdContext = new SimpleIdContext(this._ctx, this.state, context); - this.enterRule(_localctx, 80, QuintParser.RULE_simpleId); + this.enterRule(_localctx, 82, QuintParser.RULE_simpleId); try { - this.state = 794; + this.state = 795; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 87, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 790; + this.state = 791; this.identifier(); } break; @@ -3500,7 +3530,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 791; + this.state = 792; _localctx._qualId = this.qualId(); const err = quintErrorToString( @@ -3531,12 +3561,12 @@ export class QuintParser extends Parser { // @RuleVersion(0) public identifier(): IdentifierContext { let _localctx: IdentifierContext = new IdentifierContext(this._ctx, this.state); - this.enterRule(_localctx, 82, QuintParser.RULE_identifier); + this.enterRule(_localctx, 84, QuintParser.RULE_identifier); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 796; + this.state = 797; _la = this._input.LA(1); if (!(_la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID)) { this._errHandler.recoverInline(this); @@ -3631,7 +3661,7 @@ export class QuintParser extends Parser { private static readonly _serializedATNSegments: number = 2; private static readonly _serializedATNSegment0: string = - "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03H\u0321\x04\x02" + + "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03H\u0322\x04\x02" + "\t\x02\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06\x04\x07" + "\t\x07\x04\b\t\b\x04\t\t\t\x04\n\t\n\x04\v\t\v\x04\f\t\f\x04\r\t\r\x04" + "\x0E\t\x0E\x04\x0F\t\x0F\x04\x10\t\x10\x04\x11\t\x11\x04\x12\t\x12\x04" + @@ -3639,420 +3669,420 @@ export class QuintParser extends Parser { "\x18\t\x18\x04\x19\t\x19\x04\x1A\t\x1A\x04\x1B\t\x1B\x04\x1C\t\x1C\x04" + "\x1D\t\x1D\x04\x1E\t\x1E\x04\x1F\t\x1F\x04 \t \x04!\t!\x04\"\t\"\x04#" + "\t#\x04$\t$\x04%\t%\x04&\t&\x04\'\t\'\x04(\t(\x04)\t)\x04*\t*\x04+\t+" + - "\x03\x02\x06\x02X\n\x02\r\x02\x0E\x02Y\x03\x02\x03\x02\x03\x03\x07\x03" + - "_\n\x03\f\x03\x0E\x03b\v\x03\x03\x03\x03\x03\x03\x03\x03\x03\x07\x03h" + - "\n\x03\f\x03\x0E\x03k\v\x03\x03\x03\x03\x03\x03\x04\x07\x04p\n\x04\f\x04" + - "\x0E\x04s\v\x04\x03\x04\x03\x04\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05" + + "\x04,\t,\x03\x02\x06\x02Z\n\x02\r\x02\x0E\x02[\x03\x02\x03\x02\x03\x03" + + "\x07\x03a\n\x03\f\x03\x0E\x03d\v\x03\x03\x03\x03\x03\x03\x03\x03\x03\x07" + + "\x03j\n\x03\f\x03\x0E\x03m\v\x03\x03\x03\x03\x03\x03\x04\x07\x04r\n\x04" + + "\f\x04\x0E\x04u\v\x04\x03\x04\x03\x04\x03\x05\x03\x05\x03\x05\x03\x05" + "\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05" + - "\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x05\x05\x8B\n\x05\x03" + - "\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x07\x06\x93\n\x06\f\x06\x0E" + - "\x06\x96\v\x06\x05\x06\x98\n\x06\x03\x06\x05\x06\x9B\n\x06\x03\x06\x03" + - "\x06\x05\x06\x9F\n\x06\x03\x06\x03\x06\x05\x06\xA3\n\x06\x03\x06\x05\x06" + - "\xA6\n\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03" + - "\x06\x03\x06\x03\x06\x03\x06\x07\x06\xB3\n\x06\f\x06\x0E\x06\xB6\v\x06" + - "\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x05\x06\xBD\n\x06\x03\x06\x05" + - "\x06\xC0\n\x06\x05\x06\xC2\n\x06\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07" + - "\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x05\x07\xD0\n" + - "\x07\x03\b\x03\b\x03\b\x03\b\x03\b\x07\b\xD7\n\b\f\b\x0E\b\xDA\v\b\x03" + - "\b\x03\b\x05\b\xDE\n\b\x03\t\x05\t\xE1\n\t\x03\t\x03\t\x03\t\x07\t\xE6" + - "\n\t\f\t\x0E\t\xE9\v\t\x03\n\x03\n\x03\n\x03\n\x03\n\x05\n\xF0\n\n\x03" + - "\v\x03\v\x03\v\x03\v\x05\v\xF6\n\v\x03\v\x03\v\x03\v\x05\v\xFB\n\v\x03" + - "\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x05\f\u0106\n\f\x03" + - "\r\x03\r\x03\r\x03\r\x03\r\x03\r\x05\r\u010E\n\r\x03\r\x03\r\x03\r\x03" + - "\r\x05\r\u0114\n\r\x03\r\x03\r\x05\r\u0118\n\r\x05\r\u011A\n\r\x03\x0E" + - "\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x05\x0E" + - "\u0125\n\x0E\x05\x0E\u0127\n\x0E\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F" + - "\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x07\x0F\u0134\n\x0F\f" + - "\x0F\x0E\x0F\u0137\v\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x05\x0F" + - "\u013E\n\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03" + - "\x0F\x03\x0F\x03\x0F\x03\x0F\x07\x0F\u014B\n\x0F\f\x0F\x0E\x0F\u014E\v" + - "\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x05\x0F\u0155\n\x0F\x05\x0F" + - "\u0157\n\x0F\x03\x10\x03\x10\x03\x11\x03\x11\x03\x12\x03\x12\x03\x13\x03" + - "\x13\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u0166\n\x14\f\x14" + - "\x0E\x14\u0169\v\x14\x05\x14\u016B\n\x14\x03\x14\x05\x14\u016E\n\x14\x03" + - "\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03" + - "\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03" + - "\x14\x07\x14\u0183\n\x14\f\x14\x0E\x14\u0186\v\x14\x03\x14\x05\x14\u0189" + - "\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x05\x14\u018F\n\x14\x03\x14\x03" + - "\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x05" + - "\x14\u019B\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + - "\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u01A8\n\x14\f\x14\x0E\x14\u01AB" + - "\v\x14\x03\x14\x03\x14\x07\x14\u01AF\n\x14\f\x14\x0E\x14\u01B2\v\x14\x03" + - "\x15\x03\x15\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03" + - "\x16\x03\x16\x07\x16\u01BF\n\x16\f\x16\x0E\x16\u01C2\v\x16\x03\x16\x03" + - "\x16\x03\x16\x05\x16\u01C7\n\x16\x03\x16\x03\x16\x05\x16\u01CB\n\x16\x03" + - "\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u01D4\n\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u01E4\n\x18\f\x18\x0E" + - "\x18\u01E7\v\x18\x03\x18\x05\x18\u01EA\n\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x07\x18\u01F3\n\x18\f\x18\x0E\x18\u01F6\v" + - "\x18\x03\x18\x05\x18\u01F9\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x07\x18\u0203\n\x18\f\x18\x0E\x18\u0206\v\x18" + - "\x03\x18\x05\x18\u0209\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x07\x18\u0212\n\x18\f\x18\x0E\x18\u0215\v\x18\x03\x18\x05" + - "\x18\u0218\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18" + - "\u0220\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0228" + - "\n\x18\f\x18\x0E\x18\u022B\v\x18\x03\x18\x05\x18\u022E\n\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0236\n\x18\f\x18\x0E\x18" + - "\u0239\v\x18\x03\x18\x05\x18\u023C\n\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x07\x18\u0244\n\x18\f\x18\x0E\x18\u0247\v\x18\x05\x18" + - "\u0249\n\x18\x03\x18\x05\x18\u024C\n\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x05\x05\x8D\n" + + "\x05\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x07\x06\x95\n\x06" + + "\f\x06\x0E\x06\x98\v\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x05\x06" + + "\x9F\n\x06\x03\x06\x05\x06\xA2\n\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03" + + "\x06\x03\x06\x07\x06\xAA\n\x06\f\x06\x0E\x06\xAD\v\x06\x05\x06\xAF\n\x06" + + "\x03\x06\x05\x06\xB2\n\x06\x03\x06\x03\x06\x05\x06\xB6\n\x06\x03\x06\x03" + + "\x06\x05\x06\xBA\n\x06\x03\x06\x05\x06\xBD\n\x06\x05\x06\xBF\n\x06\x03" + + "\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03" + + "\x07\x03\x07\x03\x07\x05\x07\xCD\n\x07\x03\b\x03\b\x03\b\x03\b\x03\b\x07" + + "\b\xD4\n\b\f\b\x0E\b\xD7\v\b\x03\b\x03\b\x05\b\xDB\n\b\x03\t\x05\t\xDE" + + "\n\t\x03\t\x03\t\x03\t\x07\t\xE3\n\t\f\t\x0E\t\xE6\v\t\x03\n\x03\n\x03" + + "\n\x03\n\x03\n\x05\n\xED\n\n\x03\v\x03\v\x03\v\x03\v\x05\v\xF3\n\v\x03" + + "\v\x03\v\x03\v\x05\v\xF8\n\v\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f" + + "\x03\f\x03\f\x05\f\u0103\n\f\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x05\r" + + "\u010B\n\r\x03\r\x03\r\x03\r\x03\r\x05\r\u0111\n\r\x03\r\x03\r\x05\r\u0115" + + "\n\r\x05\r\u0117\n\r\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03" + + "\x0E\x03\x0E\x03\x0E\x05\x0E\u0122\n\x0E\x05\x0E\u0124\n\x0E\x03\x0F\x03" + + "\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03" + + "\x0F\x07\x0F\u0131\n\x0F\f\x0F\x0E\x0F\u0134\v\x0F\x03\x0F\x03\x0F\x03" + + "\x0F\x03\x0F\x03\x0F\x05\x0F\u013B\n\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F" + + "\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x07\x0F\u0148" + + "\n\x0F\f\x0F\x0E\x0F\u014B\v\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F" + + "\x05\x0F\u0152\n\x0F\x05\x0F\u0154\n\x0F\x03\x10\x03\x10\x03\x11\x03\x11" + + "\x03\x12\x03\x12\x03\x13\x03\x13\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + + "\x07\x14\u0163\n\x14\f\x14\x0E\x14\u0166\v\x14\x05\x14\u0168\n\x14\x03" + + "\x14\x05\x14\u016B\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + + "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + + "\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u0180\n\x14\f\x14\x0E\x14\u0183" + + "\v\x14\x03\x14\x05\x14\u0186\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x05" + + "\x14\u018C\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + + "\x03\x14\x03\x14\x03\x14\x05\x14\u0198\n\x14\x03\x14\x03\x14\x03\x14\x03" + + "\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u01A5" + + "\n\x14\f\x14\x0E\x14\u01A8\v\x14\x03\x14\x03\x14\x07\x14\u01AC\n\x14\f" + + "\x14\x0E\x14\u01AF\v\x14\x03\x15\x03\x15\x03\x16\x03\x16\x03\x16\x03\x16" + + "\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x07\x16\u01BC\n\x16\f\x16\x0E" + + "\x16\u01BF\v\x16\x03\x16\x03\x16\x03\x16\x05\x16\u01C4\n\x16\x03\x16\x03" + + "\x16\x05\x16\u01C8\n\x16\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x05\x18\u01D1\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07" + + "\x18\u01E1\n\x18\f\x18\x0E\x18\u01E4\v\x18\x03\x18\x05\x18\u01E7\n\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u01F0" + + "\n\x18\f\x18\x0E\x18\u01F3\v\x18\x03\x18\x05\x18\u01F6\n\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0200\n\x18" + + "\f\x18\x0E\x18\u0203\v\x18\x03\x18\x05\x18\u0206\n\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u020F\n\x18\f\x18\x0E" + + "\x18\u0212\v\x18\x03\x18\x05\x18\u0215\n\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x05\x18\u021D\n\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x07\x18\u0225\n\x18\f\x18\x0E\x18\u0228\v\x18\x03\x18" + + "\x05\x18\u022B\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07" + + "\x18\u0233\n\x18\f\x18\x0E\x18\u0236\v\x18\x03\x18\x05\x18\u0239\n\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0241\n\x18\f" + + "\x18\x0E\x18\u0244\v\x18\x05\x18\u0246\n\x18\x03\x18\x05\x18\u0249\n\x18" + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x05\x18\u0265\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u0262\n\x18\x03\x18\x03" + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u028C\n\x18\x03\x18\x05\x18" + - "\u028F\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0296\n\x18" + - "\f\x18\x0E\x18\u0299\v\x18\x03\x19\x03\x19\x03\x19\x03\x19\x05\x19\u029F" + - "\n\x19\x03\x19\x03\x19\x03\x19\x07\x19\u02A4\n\x19\f\x19\x0E\x19\u02A7" + - "\v\x19\x03\x19\x03\x19\x03\x1A\x03\x1A\x05\x1A\u02AD\n\x1A\x03\x1A\x03" + - "\x1A\x03\x1A\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x05\x1B\u02B6\n\x1B\x03\x1B" + - "\x05\x1B\u02B9\n\x1B\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03" + - "\x1C\x03\x1C\x03\x1C\x05\x1C\u02C4\n\x1C\x03\x1D\x03\x1D\x05\x1D\u02C8" + - "\n\x1D\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E" + - "\x07\x1E\u02D2\n\x1E\f\x1E\x0E\x1E\u02D5\v\x1E\x03\x1E\x03\x1E\x03\x1E" + - "\x03\x1E\x05\x1E\u02DB\n\x1E\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x06" + - "\x1F\u02E2\n\x1F\r\x1F\x0E\x1F\u02E3\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03" + - "\x1F\x03 \x03 \x05 \u02ED\n \x03!\x03!\x03\"\x03\"\x05\"\u02F3\n\"\x03" + - "#\x03#\x03#\x07#\u02F8\n#\f#\x0E#\u02FB\v#\x03$\x03$\x03$\x03$\x03$\x03" + - "$\x05$\u0303\n$\x03%\x03%\x05%\u0307\n%\x03&\x03&\x05&\u030B\n&\x03\'" + - "\x03\'\x03(\x03(\x03)\x03)\x03)\x07)\u0314\n)\f)\x0E)\u0317\v)\x03*\x03" + - "*\x03*\x03*\x05*\u031D\n*\x03+\x03+\x03+\x02\x02\x04&.,\x02\x02\x04\x02" + - "\x06\x02\b\x02\n\x02\f\x02\x0E\x02\x10\x02\x12\x02\x14\x02\x16\x02\x18" + - "\x02\x1A\x02\x1C\x02\x1E\x02 \x02\"\x02$\x02&\x02(\x02*\x02,\x02.\x02" + - "0\x022\x024\x026\x028\x02:\x02<\x02>\x02@\x02B\x02D\x02F\x02H\x02J\x02" + - "L\x02N\x02P\x02R\x02T\x02\x02\n\x03\x0257\x03\x0234\x03\x028=\x04\x02" + - "-1AB\x03\x02-0\x05\x02!!-03=\x03\x02*,\x03\x02CD\x02\u0383\x02W\x03\x02" + - "\x02\x02\x04`\x03\x02\x02\x02\x06q\x03\x02\x02\x02\b\x8A\x03\x02\x02\x02" + - "\n\xC1\x03\x02\x02\x02\f\xCF\x03\x02\x02\x02\x0E\xD1\x03\x02\x02\x02\x10" + - "\xE0\x03\x02\x02\x02\x12\xEA\x03\x02\x02\x02\x14\xF1\x03\x02\x02\x02\x16" + - "\u0105\x03\x02\x02\x02\x18\u0119\x03\x02\x02\x02\x1A\u0126\x03\x02\x02" + - "\x02\x1C\u0156\x03\x02\x02\x02\x1E\u0158\x03\x02\x02\x02 \u015A\x03\x02" + - "\x02\x02\"\u015C\x03\x02\x02\x02$\u015E\x03\x02\x02\x02&\u019A\x03\x02" + - "\x02\x02(\u01B3\x03\x02\x02\x02*\u01CA\x03\x02\x02\x02,\u01CC\x03\x02" + - "\x02\x02.\u0264\x03\x02\x02\x020\u029A\x03\x02\x02\x022\u02AC\x03\x02" + - "\x02\x024\u02B1\x03\x02\x02\x026\u02C3\x03\x02\x02\x028\u02C7\x03\x02" + - "\x02\x02:\u02DA\x03\x02\x02\x02<\u02DC\x03\x02\x02\x02>\u02EC\x03\x02" + - "\x02\x02@\u02EE\x03\x02\x02\x02B\u02F2\x03\x02\x02\x02D\u02F4\x03\x02" + - "\x02\x02F\u0302\x03\x02\x02\x02H\u0306\x03\x02\x02\x02J\u030A\x03\x02" + - "\x02\x02L\u030C\x03\x02\x02\x02N\u030E\x03\x02\x02\x02P\u0310\x03\x02" + - "\x02\x02R\u031C\x03\x02\x02\x02T\u031E\x03\x02\x02\x02VX\x05\x04\x03\x02" + - "WV\x03\x02\x02\x02XY\x03\x02\x02\x02YW\x03\x02\x02\x02YZ\x03\x02\x02\x02" + - "Z[\x03\x02\x02\x02[\\\x07\x02\x02\x03\\\x03\x03\x02\x02\x02]_\x07E\x02" + - "\x02^]\x03\x02\x02\x02_b\x03\x02\x02\x02`^\x03\x02\x02\x02`a\x03\x02\x02" + - "\x02ac\x03\x02\x02\x02b`\x03\x02\x02\x02cd\x07\x03\x02\x02de\x05P)\x02" + - "ei\x07\x04\x02\x02fh\x05\x06\x04\x02gf\x03\x02\x02\x02hk\x03\x02\x02\x02" + - "ig\x03\x02\x02\x02ij\x03\x02\x02\x02jl\x03\x02\x02\x02ki\x03\x02\x02\x02" + - "lm\x07\x05\x02\x02m\x05\x03\x02\x02\x02np\x07E\x02\x02on\x03\x02\x02\x02" + - "ps\x03\x02\x02\x02qo\x03\x02\x02\x02qr\x03\x02\x02\x02rt\x03\x02\x02\x02" + - "sq\x03\x02\x02\x02tu\x05\b\x05\x02u\x07\x03\x02\x02\x02vw\x07\x06\x02" + - "\x02wx\x05P)\x02xy\x07\x07\x02\x02yz\x05&\x14\x02z\x8B\x03\x02\x02\x02" + - "{|\x07\b\x02\x02|}\x05P)\x02}~\x07\x07\x02\x02~\x7F\x05&\x14\x02\x7F\x8B" + - "\x03\x02\x02\x02\x80\x81\x07\t\x02\x02\x81\x82\x05> \x02\x82\x83\x07>" + - "\x02\x02\x83\x84\x05.\x18\x02\x84\x8B\x03\x02\x02\x02\x85\x8B\x05\x1C" + - "\x0F\x02\x86\x8B\x05\n\x06\x02\x87\x8B\x05\f\x07\x02\x88\x8B\x05\x18\r" + - "\x02\x89\x8B\x05\x1A\x0E\x02\x8Av\x03\x02\x02\x02\x8A{\x03\x02\x02\x02" + - "\x8A\x80\x03\x02\x02\x02\x8A\x85\x03\x02\x02\x02\x8A\x86\x03\x02\x02\x02" + - "\x8A\x87\x03\x02\x02\x02\x8A\x88\x03\x02\x02\x02\x8A\x89\x03\x02\x02\x02" + - "\x8B\t\x03\x02\x02\x02\x8C\x8D\x05\x16\f\x02\x8D\x9A\x05H%\x02\x8E\x97" + - "\x07?\x02\x02\x8F\x94\x05@!\x02\x90\x91\x07\n\x02\x02\x91\x93\x05@!\x02" + - "\x92\x90\x03\x02\x02\x02\x93\x96\x03\x02\x02\x02\x94\x92\x03\x02\x02\x02" + - "\x94\x95\x03\x02\x02\x02\x95\x98\x03\x02\x02\x02\x96\x94\x03\x02\x02\x02" + - "\x97\x8F\x03\x02\x02\x02\x97\x98\x03\x02\x02\x02\x98\x99\x03\x02\x02\x02" + - "\x99\x9B\x07@\x02\x02\x9A\x8E\x03\x02\x02\x02\x9A\x9B\x03\x02\x02\x02" + - "\x9B\x9E\x03\x02\x02\x02\x9C\x9D\x07\x07\x02\x02\x9D\x9F\x05&\x14\x02" + - "\x9E\x9C\x03\x02\x02\x02\x9E\x9F\x03\x02\x02\x02\x9F\xA2\x03\x02\x02\x02" + - "\xA0\xA1\x07>\x02\x02\xA1\xA3\x05.\x18\x02\xA2\xA0\x03\x02\x02\x02\xA2" + - "\xA3\x03\x02\x02\x02\xA3\xA5\x03\x02\x02\x02\xA4\xA6\x07\v\x02\x02\xA5" + - "\xA4\x03\x02\x02\x02\xA5\xA6\x03\x02\x02\x02\xA6\xC2\x03\x02\x02\x02\xA7" + - "\xA8\x05\x16\f\x02\xA8\xA9\x05H%\x02\xA9\xAA\x07?\x02\x02\xAA\xAB\x05" + - "@!\x02\xAB\xAC\x07\x07\x02\x02\xAC\xB4\x05&\x14\x02\xAD\xAE\x07\n\x02" + - "\x02\xAE\xAF\x05@!\x02\xAF\xB0\x07\x07\x02\x02\xB0\xB1\x05&\x14\x02\xB1" + - "\xB3\x03\x02\x02\x02\xB2\xAD\x03\x02\x02\x02\xB3\xB6\x03\x02\x02\x02\xB4" + - "\xB2\x03\x02\x02\x02\xB4\xB5\x03\x02\x02\x02\xB5\xB7\x03\x02\x02\x02\xB6" + - "\xB4\x03\x02\x02\x02\xB7\xB8\x07@\x02\x02\xB8\xB9\x07\x07\x02\x02\xB9" + - "\xBC\x05&\x14\x02\xBA\xBB\x07>\x02\x02\xBB\xBD\x05.\x18\x02\xBC\xBA\x03" + - "\x02\x02\x02\xBC\xBD\x03\x02\x02\x02\xBD\xBF\x03\x02\x02\x02\xBE\xC0\x07" + - "\v\x02\x02\xBF\xBE\x03\x02\x02\x02\xBF\xC0\x03\x02\x02\x02\xC0\xC2\x03" + - "\x02\x02\x02\xC1\x8C\x03\x02\x02\x02\xC1\xA7\x03\x02\x02\x02\xC2\v\x03" + - "\x02\x02\x02\xC3\xC4\x07\f\x02\x02\xC4\xD0\x05P)\x02\xC5\xC6\x07\f\x02" + - "\x02\xC6\xC7\x05\x0E\b\x02\xC7\xC8\x07>\x02\x02\xC8\xC9\x05&\x14\x02\xC9" + - "\xD0\x03\x02\x02\x02\xCA\xCB\x07\f\x02\x02\xCB\xCC\x05\x0E\b\x02\xCC\xCD" + - "\x07>\x02\x02\xCD\xCE\x05\x10\t\x02\xCE\xD0\x03\x02\x02\x02\xCF\xC3\x03" + - "\x02\x02\x02\xCF\xC5\x03\x02\x02\x02\xCF\xCA\x03\x02\x02\x02\xD0\r\x03" + - "\x02\x02\x02\xD1\xDD\x05P)\x02\xD2\xD3\x07\r\x02\x02\xD3\xD8\x05(\x15" + - "\x02\xD4\xD5\x07\n\x02\x02\xD5\xD7\x05(\x15\x02\xD6\xD4\x03\x02\x02\x02" + - "\xD7\xDA\x03\x02\x02\x02\xD8\xD6\x03\x02\x02\x02\xD8\xD9\x03\x02\x02\x02" + - "\xD9\xDB\x03\x02\x02\x02\xDA\xD8\x03\x02\x02\x02\xDB\xDC\x07\x0E\x02\x02" + - "\xDC\xDE\x03\x02\x02\x02\xDD\xD2\x03\x02\x02\x02\xDD\xDE\x03\x02\x02\x02" + - "\xDE\x0F\x03\x02\x02\x02\xDF\xE1\x07\x0F\x02\x02\xE0\xDF\x03\x02\x02\x02" + - "\xE0\xE1\x03\x02\x02\x02\xE1\xE2\x03\x02\x02\x02\xE2\xE7\x05\x12\n\x02" + - "\xE3\xE4\x07\x0F\x02\x02\xE4\xE6\x05\x12\n\x02\xE5\xE3\x03\x02\x02\x02" + - "\xE6\xE9\x03\x02\x02\x02\xE7\xE5\x03\x02\x02\x02\xE7\xE8\x03\x02\x02\x02" + - "\xE8\x11\x03\x02\x02\x02\xE9\xE7\x03\x02\x02\x02\xEA\xEF\x05R*\x02\xEB" + - "\xEC\x07?\x02\x02\xEC\xED\x05&\x14\x02\xED\xEE\x07@\x02\x02\xEE\xF0\x03" + - "\x02\x02\x02\xEF\xEB\x03\x02\x02\x02\xEF\xF0\x03\x02\x02\x02\xF0\x13\x03" + - "\x02\x02\x02\xF1\xF2\x07\x10\x02\x02\xF2\xF5\x05P)\x02\xF3\xF4\x07\x07" + - "\x02\x02\xF4\xF6\x05&\x14\x02\xF5\xF3\x03\x02\x02\x02\xF5\xF6\x03\x02" + - "\x02\x02\xF6\xF7\x03\x02\x02\x02\xF7\xF8\x07>\x02\x02\xF8\xFA\x05.\x18" + - "\x02\xF9\xFB\x07\v\x02\x02\xFA\xF9\x03\x02\x02\x02\xFA\xFB\x03\x02\x02" + - "\x02\xFB\x15\x03\x02\x02\x02\xFC\u0106\x07\x11\x02\x02\xFD\u0106\x07\x12" + - "\x02\x02\xFE\xFF\x07\x13\x02\x02\xFF\u0106\x07\x11\x02\x02\u0100\u0101" + - "\x07\x13\x02\x02\u0101\u0106\x07\x12\x02\x02\u0102\u0106\x07\x14\x02\x02" + - "\u0103\u0106\x07\x15\x02\x02\u0104\u0106\x07\x16\x02\x02\u0105\xFC\x03" + - "\x02\x02\x02\u0105\xFD\x03\x02\x02\x02\u0105\xFE\x03\x02\x02\x02\u0105" + - "\u0100\x03\x02\x02\x02\u0105\u0102\x03\x02\x02\x02\u0105\u0103\x03\x02" + - "\x02\x02\u0105\u0104\x03\x02\x02\x02\u0106\x17\x03\x02\x02\x02\u0107\u0108" + - "\x07\x17\x02\x02\u0108\u0109\x05 \x11\x02\u0109\u010A\x07\x18\x02\x02" + - "\u010A\u010D\x05B\"\x02\u010B\u010C\x07\x19\x02\x02\u010C\u010E\x05$\x13" + - "\x02\u010D\u010B\x03\x02\x02\x02\u010D\u010E\x03\x02\x02\x02\u010E\u011A" + - "\x03\x02\x02\x02\u010F\u0110\x07\x17\x02\x02\u0110\u0113\x05 \x11\x02" + - "\u0111\u0112\x07\x1A\x02\x02\u0112\u0114\x05 \x11\x02\u0113\u0111\x03" + - "\x02\x02\x02\u0113\u0114\x03\x02\x02\x02\u0114\u0117\x03\x02\x02\x02\u0115" + - "\u0116\x07\x19\x02\x02\u0116\u0118\x05$\x13\x02\u0117\u0115\x03\x02\x02" + - "\x02\u0117\u0118\x03\x02\x02\x02\u0118\u011A\x03\x02\x02\x02\u0119\u0107" + - "\x03\x02\x02\x02\u0119\u010F\x03\x02\x02\x02\u011A\x19\x03\x02\x02\x02" + - "\u011B\u011C\x07\x1B\x02\x02\u011C\u011D\x05 \x11\x02\u011D\u011E\x07" + - "\x18\x02\x02\u011E\u011F\x05B\"\x02\u011F\u0127\x03\x02\x02\x02\u0120" + - "\u0121\x07\x1B\x02\x02\u0121\u0124\x05 \x11\x02\u0122\u0123\x07\x1A\x02" + - "\x02\u0123\u0125\x05 \x11\x02\u0124\u0122\x03\x02\x02\x02\u0124\u0125" + - "\x03\x02\x02\x02\u0125\u0127\x03\x02\x02\x02\u0126\u011B\x03\x02\x02\x02" + - "\u0126\u0120\x03\x02\x02\x02\u0127\x1B\x03\x02\x02\x02\u0128\u0129\x07" + - "\x17\x02\x02\u0129\u012A\x05\x1E\x10\x02\u012A\u012B\x07?\x02\x02\u012B" + - "\u012C\x05 \x11\x02\u012C\u012D\x07>\x02\x02\u012D\u0135\x05.\x18\x02" + - "\u012E\u012F\x07\n\x02\x02\u012F\u0130\x05 \x11\x02\u0130\u0131\x07>\x02" + - "\x02\u0131\u0132\x05.\x18\x02\u0132\u0134\x03\x02\x02\x02\u0133\u012E" + - "\x03\x02\x02\x02\u0134\u0137\x03\x02\x02\x02\u0135\u0133\x03\x02\x02\x02" + - "\u0135\u0136\x03\x02\x02\x02\u0136\u0138\x03\x02\x02\x02\u0137\u0135\x03" + - "\x02\x02\x02\u0138\u0139\x07@\x02\x02\u0139\u013A\x07\x18\x02\x02\u013A" + - "\u013D\x075\x02\x02\u013B\u013C\x07\x19\x02\x02\u013C\u013E\x05$\x13\x02" + - "\u013D\u013B\x03\x02\x02\x02\u013D\u013E\x03\x02\x02\x02\u013E\u0157\x03" + - "\x02\x02\x02\u013F\u0140\x07\x17\x02\x02\u0140\u0141\x05\x1E\x10\x02\u0141" + - "\u0142\x07?\x02\x02\u0142\u0143\x05 \x11\x02\u0143\u0144\x07>\x02\x02" + - "\u0144\u014C\x05.\x18\x02\u0145\u0146\x07\n\x02\x02\u0146\u0147\x05 \x11" + - "\x02\u0147\u0148\x07>\x02\x02\u0148\u0149\x05.\x18\x02\u0149\u014B\x03" + - "\x02\x02\x02\u014A\u0145\x03\x02\x02\x02\u014B\u014E\x03\x02\x02\x02\u014C" + - "\u014A\x03\x02\x02\x02\u014C\u014D\x03\x02\x02\x02\u014D\u014F\x03\x02" + - "\x02\x02\u014E\u014C\x03\x02\x02\x02\u014F\u0150\x07@\x02\x02\u0150\u0151" + - "\x07\x1A\x02\x02\u0151\u0154\x05\"\x12\x02\u0152\u0153\x07\x19\x02\x02" + - "\u0153\u0155\x05$\x13\x02\u0154\u0152\x03\x02\x02\x02\u0154\u0155\x03" + - "\x02\x02\x02\u0155\u0157\x03\x02\x02\x02\u0156\u0128\x03\x02\x02\x02\u0156" + - "\u013F\x03\x02\x02\x02\u0157\x1D\x03\x02\x02\x02\u0158\u0159\x05P)\x02" + - "\u0159\x1F\x03\x02\x02\x02\u015A\u015B\x05P)\x02\u015B!\x03\x02\x02\x02" + - "\u015C\u015D\x05P)\x02\u015D#\x03\x02\x02\x02\u015E\u015F\x07*\x02\x02" + - "\u015F%\x03\x02\x02\x02\u0160\u0161\b\x14\x01\x02\u0161\u016A\x07?\x02" + - "\x02\u0162\u0167\x05&\x14\x02\u0163\u0164\x07\n\x02\x02\u0164\u0166\x05" + - "&\x14\x02\u0165\u0163\x03\x02\x02\x02\u0166\u0169\x03\x02\x02\x02\u0167" + - "\u0165\x03\x02\x02\x02\u0167\u0168\x03\x02\x02\x02\u0168\u016B\x03\x02" + - "\x02\x02\u0169\u0167\x03\x02\x02\x02\u016A\u0162\x03\x02\x02\x02\u016A" + - "\u016B\x03\x02\x02\x02\u016B\u016D\x03\x02\x02\x02\u016C\u016E\x07\n\x02" + - "\x02\u016D\u016C\x03\x02\x02\x02\u016D\u016E\x03\x02\x02\x02\u016E\u016F" + - "\x03\x02\x02\x02\u016F\u0170\x07@\x02\x02\u0170\u0171\x07\x1D\x02\x02" + - "\u0171\u019B\x05&\x14\x0E\u0172\u0173\x07A\x02\x02\u0173\u0174\x07\r\x02" + - "\x02\u0174\u0175\x05&\x14\x02\u0175\u0176\x07\x0E\x02\x02\u0176\u019B" + - "\x03\x02\x02\x02\u0177\u0178\x07B\x02\x02\u0178\u0179\x07\r\x02\x02\u0179" + - "\u017A\x05&\x14\x02\u017A\u017B\x07\x0E\x02\x02\u017B\u019B\x03\x02\x02" + - "\x02\u017C\u017D\x07?\x02\x02\u017D\u017E\x05&\x14\x02\u017E\u017F\x07" + - "\n\x02\x02\u017F\u0184\x05&\x14\x02\u0180\u0181\x07\n\x02\x02\u0181\u0183" + - "\x05&\x14\x02\u0182\u0180\x03\x02\x02\x02\u0183\u0186\x03\x02\x02\x02" + - "\u0184\u0182\x03\x02\x02\x02\u0184\u0185\x03\x02\x02\x02\u0185\u0188\x03" + - "\x02\x02\x02\u0186\u0184\x03\x02\x02\x02\u0187\u0189\x07\n\x02\x02\u0188" + - "\u0187\x03\x02\x02\x02\u0188\u0189\x03\x02\x02\x02\u0189\u018A\x03\x02" + - "\x02\x02\u018A\u018B\x07@\x02\x02\u018B\u019B\x03\x02\x02\x02\u018C\u018E" + - "\x07\x04\x02\x02\u018D\u018F\x05*\x16\x02\u018E\u018D\x03\x02\x02\x02" + - "\u018E\u018F\x03\x02\x02\x02\u018F\u0190\x03\x02\x02\x02\u0190\u019B\x07" + - "\x05\x02\x02\u0191\u019B\x07\x1E\x02\x02\u0192\u019B\x07\x1F\x02\x02\u0193" + - "\u019B\x07 \x02\x02\u0194\u019B\x05(\x15\x02\u0195\u019B\x05P)\x02\u0196" + - "\u0197\x07?\x02\x02\u0197\u0198\x05&\x14\x02\u0198\u0199\x07@\x02\x02" + - "\u0199\u019B\x03\x02\x02\x02\u019A\u0160\x03\x02\x02\x02\u019A\u0172\x03" + - "\x02\x02\x02\u019A\u0177\x03\x02\x02\x02\u019A\u017C\x03\x02\x02\x02\u019A" + - "\u018C\x03\x02\x02\x02\u019A\u0191\x03\x02\x02\x02\u019A\u0192\x03\x02" + - "\x02\x02\u019A\u0193\x03\x02\x02\x02\u019A\u0194\x03\x02\x02\x02\u019A" + - "\u0195\x03\x02\x02\x02\u019A\u0196\x03\x02\x02\x02\u019B\u01B0\x03\x02" + - "\x02\x02\u019C\u019D\f\x10\x02\x02\u019D\u019E\x07\x1C\x02\x02\u019E\u01AF" + - "\x05&\x14\x10\u019F\u01A0\f\x0F\x02\x02\u01A0\u01A1\x07\x1D\x02\x02\u01A1" + - "\u01AF\x05&\x14\x0F\u01A2\u01A3\f\x03\x02\x02\u01A3\u01A4\x07\r\x02\x02" + - "\u01A4\u01A9\x05&\x14\x02\u01A5\u01A6\x07\n\x02\x02\u01A6\u01A8\x05&\x14" + - "\x02\u01A7\u01A5\x03\x02\x02\x02\u01A8\u01AB\x03\x02\x02\x02\u01A9\u01A7" + - "\x03\x02\x02\x02\u01A9\u01AA\x03\x02\x02\x02\u01AA\u01AC\x03\x02\x02\x02" + - "\u01AB\u01A9\x03\x02\x02\x02\u01AC\u01AD\x07\x0E\x02\x02\u01AD\u01AF\x03" + - "\x02\x02\x02\u01AE\u019C\x03\x02\x02\x02\u01AE\u019F\x03\x02\x02\x02\u01AE" + - "\u01A2\x03\x02\x02\x02\u01AF\u01B2\x03\x02\x02\x02\u01B0\u01AE\x03\x02" + - "\x02\x02\u01B0\u01B1\x03\x02\x02\x02\u01B1\'\x03\x02\x02\x02\u01B2\u01B0" + - "\x03\x02\x02\x02\u01B3\u01B4\x07C\x02\x02\u01B4)\x03\x02\x02\x02\u01B5" + - "\u01B6\x05,\x17\x02\u01B6\u01B7\x07\x07\x02\x02\u01B7\u01B8\x05&\x14\x02" + - "\u01B8\u01C0\x03\x02\x02\x02\u01B9\u01BA\x07\n\x02\x02\u01BA\u01BB\x05" + - ",\x17\x02\u01BB\u01BC\x07\x07\x02\x02\u01BC\u01BD\x05&\x14\x02\u01BD\u01BF" + - "\x03\x02\x02\x02\u01BE\u01B9\x03\x02\x02\x02\u01BF\u01C2\x03\x02\x02\x02" + - "\u01C0\u01BE\x03\x02\x02\x02\u01C0\u01C1\x03\x02\x02\x02\u01C1\u01C6\x03" + - "\x02\x02\x02\u01C2\u01C0\x03\x02\x02\x02\u01C3\u01C7\x07\n\x02\x02\u01C4" + - "\u01C5\x07\x0F\x02\x02\u01C5\u01C7\x05T+\x02\u01C6\u01C3\x03\x02\x02\x02" + - "\u01C6\u01C4\x03\x02\x02\x02\u01C6\u01C7\x03\x02\x02\x02\u01C7\u01CB\x03" + - "\x02\x02\x02\u01C8\u01C9\x07\x0F\x02\x02\u01C9\u01CB\x05T+\x02\u01CA\u01B5" + - "\x03\x02\x02\x02\u01CA\u01C8\x03\x02\x02\x02\u01CB+\x03\x02\x02\x02\u01CC" + - "\u01CD\x05R*\x02\u01CD-\x03\x02\x02\x02\u01CE\u01CF\b\x18\x01\x02\u01CF" + - "\u0265\x058\x1D\x02\u01D0\u01D1\x05H%\x02\u01D1\u01D3\x07?\x02\x02\u01D2" + - "\u01D4\x05D#\x02\u01D3\u01D2\x03\x02\x02\x02\u01D3\u01D4\x03\x02\x02\x02" + - "\u01D4\u01D5\x03\x02\x02\x02\u01D5\u01D6\x07@\x02\x02\u01D6\u0265\x03" + - "\x02\x02\x02\u01D7\u01D8\x074\x02\x02\u01D8\u0265\x05.\x18\x1B\u01D9\u01DA" + - "\x05P)\x02\u01DA\u01DB\x07\"\x02\x02\u01DB\u01DC\x07>\x02\x02\u01DC\u01DD" + - "\x05.\x18\x17\u01DD\u0265\x03\x02\x02\x02\u01DE\u01DF\x07-\x02\x02\u01DF" + - "\u01E0\x07\x04\x02\x02\u01E0\u01E5\x05.\x18\x02\u01E1\u01E2\x07\n\x02" + - "\x02\u01E2\u01E4\x05.\x18\x02\u01E3\u01E1\x03\x02\x02\x02\u01E4\u01E7" + - "\x03\x02\x02\x02\u01E5\u01E3\x03\x02\x02\x02\u01E5\u01E6\x03\x02\x02\x02" + - "\u01E6\u01E9\x03\x02\x02\x02\u01E7\u01E5\x03\x02\x02\x02\u01E8\u01EA\x07" + - "\n\x02\x02\u01E9\u01E8\x03\x02\x02\x02\u01E9\u01EA\x03\x02\x02\x02\u01EA" + - "\u01EB\x03\x02\x02\x02\u01EB\u01EC\x07\x05\x02\x02\u01EC\u0265\x03\x02" + - "\x02\x02\u01ED\u01EE\x07.\x02\x02"; + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05" + + "\x18\u0289\n\x18\x03\x18\x05\x18\u028C\n\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x07\x18\u0293\n\x18\f\x18\x0E\x18\u0296\v\x18\x03\x19\x03" + + "\x19\x03\x19\x03\x19\x05\x19\u029C\n\x19\x03\x19\x03\x19\x03\x19\x07\x19" + + "\u02A1\n\x19\f\x19\x0E\x19\u02A4\v\x19\x03\x19\x03\x19\x03\x1A\x03\x1A" + + "\x05\x1A\u02AA\n\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1B\x03\x1B\x03\x1B\x03" + + "\x1B\x05\x1B\u02B3\n\x1B\x03\x1B\x05\x1B\u02B6\n\x1B\x03\x1C\x03\x1C\x03" + + "\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x05\x1C\u02C1\n\x1C" + + "\x03\x1D\x03\x1D\x05\x1D\u02C5\n\x1D\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03" + + "\x1E\x03\x1E\x03\x1E\x03\x1E\x07\x1E\u02CF\n\x1E\f\x1E\x0E\x1E\u02D2\v" + + "\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x05\x1E\u02D8\n\x1E\x03\x1F\x03\x1F" + + "\x03\x1F\x03\x1F\x03\x1F\x06\x1F\u02DF\n\x1F\r\x1F\x0E\x1F\u02E0\x03\x1F" + + "\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03 \x03 \x05 \u02EA\n \x03!\x03!\x03" + + "\"\x03\"\x03\"\x03\"\x03#\x03#\x05#\u02F4\n#\x03$\x03$\x03$\x07$\u02F9" + + "\n$\f$\x0E$\u02FC\v$\x03%\x03%\x03%\x03%\x03%\x03%\x05%\u0304\n%\x03&" + + "\x03&\x05&\u0308\n&\x03\'\x03\'\x05\'\u030C\n\'\x03(\x03(\x03)\x03)\x03" + + "*\x03*\x03*\x07*\u0315\n*\f*\x0E*\u0318\v*\x03+\x03+\x03+\x03+\x05+\u031E" + + "\n+\x03,\x03,\x03,\x02\x02\x04&.-\x02\x02\x04\x02\x06\x02\b\x02\n\x02" + + "\f\x02\x0E\x02\x10\x02\x12\x02\x14\x02\x16\x02\x18\x02\x1A\x02\x1C\x02" + + "\x1E\x02 \x02\"\x02$\x02&\x02(\x02*\x02,\x02.\x020\x022\x024\x026\x02" + + "8\x02:\x02<\x02>\x02@\x02B\x02D\x02F\x02H\x02J\x02L\x02N\x02P\x02R\x02" + + "T\x02V\x02\x02\n\x03\x0257\x03\x0234\x03\x028=\x04\x02-1AB\x03\x02-0\x05" + + "\x02!!-03=\x03\x02*,\x03\x02CD\x02\u0383\x02Y\x03\x02\x02\x02\x04b\x03" + + "\x02\x02\x02\x06s\x03\x02\x02\x02\b\x8C\x03\x02\x02\x02\n\xBE\x03\x02" + + "\x02\x02\f\xCC\x03\x02\x02\x02\x0E\xCE\x03\x02\x02\x02\x10\xDD\x03\x02" + + "\x02\x02\x12\xE7\x03\x02\x02\x02\x14\xEE\x03\x02\x02\x02\x16\u0102\x03" + + "\x02\x02\x02\x18\u0116\x03\x02\x02\x02\x1A\u0123\x03\x02\x02\x02\x1C\u0153" + + "\x03\x02\x02\x02\x1E\u0155\x03\x02\x02\x02 \u0157\x03\x02\x02\x02\"\u0159" + + "\x03\x02\x02\x02$\u015B\x03\x02\x02\x02&\u0197\x03\x02\x02\x02(\u01B0" + + "\x03\x02\x02\x02*\u01C7\x03\x02\x02\x02,\u01C9\x03\x02\x02\x02.\u0261" + + "\x03\x02\x02\x020\u0297\x03\x02\x02\x022\u02A9\x03\x02\x02\x024\u02AE" + + "\x03\x02\x02\x026\u02C0\x03\x02\x02\x028\u02C4\x03\x02\x02\x02:\u02D7" + + "\x03\x02\x02\x02<\u02D9\x03\x02\x02\x02>\u02E9\x03\x02\x02\x02@\u02EB" + + "\x03\x02\x02\x02B\u02ED\x03\x02\x02\x02D\u02F3\x03\x02\x02\x02F\u02F5" + + "\x03\x02\x02\x02H\u0303\x03\x02\x02\x02J\u0307\x03\x02\x02\x02L\u030B" + + "\x03\x02\x02\x02N\u030D\x03\x02\x02\x02P\u030F\x03\x02\x02\x02R\u0311" + + "\x03\x02\x02\x02T\u031D\x03\x02\x02\x02V\u031F\x03\x02\x02\x02XZ\x05\x04" + + "\x03\x02YX\x03\x02\x02\x02Z[\x03\x02\x02\x02[Y\x03\x02\x02\x02[\\\x03" + + "\x02\x02\x02\\]\x03\x02\x02\x02]^\x07\x02\x02\x03^\x03\x03\x02\x02\x02" + + "_a\x07E\x02\x02`_\x03\x02\x02\x02ad\x03\x02\x02\x02b`\x03\x02\x02\x02" + + "bc\x03\x02\x02\x02ce\x03\x02\x02\x02db\x03\x02\x02\x02ef\x07\x03\x02\x02" + + "fg\x05R*\x02gk\x07\x04\x02\x02hj\x05\x06\x04\x02ih\x03\x02\x02\x02jm\x03" + + "\x02\x02\x02ki\x03\x02\x02\x02kl\x03\x02\x02\x02ln\x03\x02\x02\x02mk\x03" + + "\x02\x02\x02no\x07\x05\x02\x02o\x05\x03\x02\x02\x02pr\x07E\x02\x02qp\x03" + + "\x02\x02\x02ru\x03\x02\x02\x02sq\x03\x02\x02\x02st\x03\x02\x02\x02tv\x03" + + "\x02\x02\x02us\x03\x02\x02\x02vw\x05\b\x05\x02w\x07\x03\x02\x02\x02xy" + + "\x07\x06\x02\x02yz\x05R*\x02z{\x07\x07\x02\x02{|\x05&\x14\x02|\x8D\x03" + + "\x02\x02\x02}~\x07\b\x02\x02~\x7F\x05R*\x02\x7F\x80\x07\x07\x02\x02\x80" + + "\x81\x05&\x14\x02\x81\x8D\x03\x02\x02\x02\x82\x83\x07\t\x02\x02\x83\x84" + + "\x05> \x02\x84\x85\x07>\x02\x02\x85\x86\x05.\x18\x02\x86\x8D\x03\x02\x02" + + "\x02\x87\x8D\x05\x1C\x0F\x02\x88\x8D\x05\n\x06\x02\x89\x8D\x05\f\x07\x02" + + "\x8A\x8D\x05\x18\r\x02\x8B\x8D\x05\x1A\x0E\x02\x8Cx\x03\x02\x02\x02\x8C" + + "}\x03\x02\x02\x02\x8C\x82\x03\x02\x02\x02\x8C\x87\x03\x02\x02\x02\x8C" + + "\x88\x03\x02\x02\x02\x8C\x89\x03\x02\x02\x02\x8C\x8A\x03\x02\x02\x02\x8C" + + "\x8B\x03\x02\x02\x02\x8D\t\x03\x02\x02\x02\x8E\x8F\x05\x16\f\x02\x8F\x90" + + "\x05J&\x02\x90\x91\x07?\x02\x02\x91\x96\x05B\"\x02\x92\x93\x07\n\x02\x02" + + "\x93\x95\x05B\"\x02\x94\x92\x03\x02\x02\x02\x95\x98\x03\x02\x02\x02\x96" + + "\x94\x03\x02\x02\x02\x96\x97\x03\x02\x02\x02\x97\x99\x03\x02\x02\x02\x98" + + "\x96\x03\x02\x02\x02\x99\x9A\x07@\x02\x02\x9A\x9B\x07\x07\x02\x02\x9B" + + "\x9E\x05&\x14\x02\x9C\x9D\x07>\x02\x02\x9D\x9F\x05.\x18\x02\x9E\x9C\x03" + + "\x02\x02\x02\x9E\x9F\x03\x02\x02\x02\x9F\xA1\x03\x02\x02\x02\xA0\xA2\x07" + + "\v\x02\x02\xA1\xA0\x03\x02\x02\x02\xA1\xA2\x03\x02\x02\x02\xA2\xBF\x03" + + "\x02\x02\x02\xA3\xA4\x05\x16\f\x02\xA4\xB1\x05J&\x02\xA5\xAE\x07?\x02" + + "\x02\xA6\xAB\x05@!\x02\xA7\xA8\x07\n\x02\x02\xA8\xAA\x05@!\x02\xA9\xA7" + + "\x03\x02\x02\x02\xAA\xAD\x03\x02\x02\x02\xAB\xA9\x03\x02\x02\x02\xAB\xAC" + + "\x03\x02\x02\x02\xAC\xAF\x03\x02\x02\x02\xAD\xAB\x03\x02\x02\x02\xAE\xA6" + + "\x03\x02\x02\x02\xAE\xAF\x03\x02\x02\x02\xAF\xB0\x03\x02\x02\x02\xB0\xB2" + + "\x07@\x02\x02\xB1\xA5\x03\x02\x02\x02\xB1\xB2\x03\x02\x02\x02\xB2\xB5" + + "\x03\x02\x02\x02\xB3\xB4\x07\x07\x02\x02\xB4\xB6\x05&\x14\x02\xB5\xB3" + + "\x03\x02\x02\x02\xB5\xB6\x03\x02\x02\x02\xB6\xB9\x03\x02\x02\x02\xB7\xB8" + + "\x07>\x02\x02\xB8\xBA\x05.\x18\x02\xB9\xB7\x03\x02\x02\x02\xB9\xBA\x03" + + "\x02\x02\x02\xBA\xBC\x03\x02\x02\x02\xBB\xBD\x07\v\x02\x02\xBC\xBB\x03" + + "\x02\x02\x02\xBC\xBD\x03\x02\x02\x02\xBD\xBF\x03\x02\x02\x02\xBE\x8E\x03" + + "\x02\x02\x02\xBE\xA3\x03\x02\x02\x02\xBF\v\x03\x02\x02\x02\xC0\xC1\x07" + + "\f\x02\x02\xC1\xCD\x05R*\x02\xC2\xC3\x07\f\x02\x02\xC3\xC4\x05\x0E\b\x02" + + "\xC4\xC5\x07>\x02\x02\xC5\xC6\x05&\x14\x02\xC6\xCD\x03\x02\x02\x02\xC7" + + "\xC8\x07\f\x02\x02\xC8\xC9\x05\x0E\b\x02\xC9\xCA\x07>\x02\x02\xCA\xCB" + + "\x05\x10\t\x02\xCB\xCD\x03\x02\x02\x02\xCC\xC0\x03\x02\x02\x02\xCC\xC2" + + "\x03\x02\x02\x02\xCC\xC7\x03\x02\x02\x02\xCD\r\x03\x02\x02\x02\xCE\xDA" + + "\x05R*\x02\xCF\xD0\x07\r\x02\x02\xD0\xD5\x05(\x15\x02\xD1\xD2\x07\n\x02" + + "\x02\xD2\xD4\x05(\x15\x02\xD3\xD1\x03\x02\x02\x02\xD4\xD7\x03\x02\x02" + + "\x02\xD5\xD3\x03\x02\x02\x02\xD5\xD6\x03\x02\x02\x02\xD6\xD8\x03\x02\x02" + + "\x02\xD7\xD5\x03\x02\x02\x02\xD8\xD9\x07\x0E\x02\x02\xD9\xDB\x03\x02\x02" + + "\x02\xDA\xCF\x03\x02\x02\x02\xDA\xDB\x03\x02\x02\x02\xDB\x0F\x03\x02\x02" + + "\x02\xDC\xDE\x07\x0F\x02\x02\xDD\xDC\x03\x02\x02\x02\xDD\xDE\x03\x02\x02" + + "\x02\xDE\xDF\x03\x02\x02\x02\xDF\xE4\x05\x12\n\x02\xE0\xE1\x07\x0F\x02" + + "\x02\xE1\xE3\x05\x12\n\x02\xE2\xE0\x03\x02\x02\x02\xE3\xE6\x03\x02\x02" + + "\x02\xE4\xE2\x03\x02\x02\x02\xE4\xE5\x03\x02\x02\x02\xE5\x11\x03\x02\x02" + + "\x02\xE6\xE4\x03\x02\x02\x02\xE7\xEC\x05T+\x02\xE8\xE9\x07?\x02\x02\xE9" + + "\xEA\x05&\x14\x02\xEA\xEB\x07@\x02\x02\xEB\xED\x03\x02\x02\x02\xEC\xE8" + + "\x03\x02\x02\x02\xEC\xED\x03\x02\x02\x02\xED\x13\x03\x02\x02\x02\xEE\xEF" + + "\x07\x10\x02\x02\xEF\xF2\x05R*\x02\xF0\xF1\x07\x07\x02\x02\xF1\xF3\x05" + + "&\x14\x02\xF2\xF0\x03\x02\x02\x02\xF2\xF3\x03\x02\x02\x02\xF3\xF4\x03" + + "\x02\x02\x02\xF4\xF5\x07>\x02\x02\xF5\xF7\x05.\x18\x02\xF6\xF8\x07\v\x02" + + "\x02\xF7\xF6\x03\x02\x02\x02\xF7\xF8\x03\x02\x02\x02\xF8\x15\x03\x02\x02" + + "\x02\xF9\u0103\x07\x11\x02\x02\xFA\u0103\x07\x12\x02\x02\xFB\xFC\x07\x13" + + "\x02\x02\xFC\u0103\x07\x11\x02\x02\xFD\xFE\x07\x13\x02\x02\xFE\u0103\x07" + + "\x12\x02\x02\xFF\u0103\x07\x14\x02\x02\u0100\u0103\x07\x15\x02\x02\u0101" + + "\u0103\x07\x16\x02\x02\u0102\xF9\x03\x02\x02\x02\u0102\xFA\x03\x02\x02" + + "\x02\u0102\xFB\x03\x02\x02\x02\u0102\xFD\x03\x02\x02\x02\u0102\xFF\x03" + + "\x02\x02\x02\u0102\u0100\x03\x02\x02\x02\u0102\u0101\x03\x02\x02\x02\u0103" + + "\x17\x03\x02\x02\x02\u0104\u0105\x07\x17\x02\x02\u0105\u0106\x05 \x11" + + "\x02\u0106\u0107\x07\x18\x02\x02\u0107\u010A\x05D#\x02\u0108\u0109\x07" + + "\x19\x02\x02\u0109\u010B\x05$\x13\x02\u010A\u0108\x03\x02\x02\x02\u010A" + + "\u010B\x03\x02\x02\x02\u010B\u0117\x03\x02\x02\x02\u010C\u010D\x07\x17" + + "\x02\x02\u010D\u0110\x05 \x11\x02\u010E\u010F\x07\x1A\x02\x02\u010F\u0111" + + "\x05 \x11\x02\u0110\u010E\x03\x02\x02\x02\u0110\u0111\x03\x02\x02\x02" + + "\u0111\u0114\x03\x02\x02\x02\u0112\u0113\x07\x19\x02\x02\u0113\u0115\x05" + + "$\x13\x02\u0114\u0112\x03\x02\x02\x02\u0114\u0115\x03\x02\x02\x02\u0115" + + "\u0117\x03\x02\x02\x02\u0116\u0104\x03\x02\x02\x02\u0116\u010C\x03\x02" + + "\x02\x02\u0117\x19\x03\x02\x02\x02\u0118\u0119\x07\x1B\x02\x02\u0119\u011A" + + "\x05 \x11\x02\u011A\u011B\x07\x18\x02\x02\u011B\u011C\x05D#\x02\u011C" + + "\u0124\x03\x02\x02\x02\u011D\u011E\x07\x1B\x02\x02\u011E\u0121\x05 \x11" + + "\x02\u011F\u0120\x07\x1A\x02\x02\u0120\u0122\x05 \x11\x02\u0121\u011F" + + "\x03\x02\x02\x02\u0121\u0122\x03\x02\x02\x02\u0122\u0124\x03\x02\x02\x02" + + "\u0123\u0118\x03\x02\x02\x02\u0123\u011D\x03\x02\x02\x02\u0124\x1B\x03" + + "\x02\x02\x02\u0125\u0126\x07\x17\x02\x02\u0126\u0127\x05\x1E\x10\x02\u0127" + + "\u0128\x07?\x02\x02\u0128\u0129\x05 \x11\x02\u0129\u012A\x07>\x02\x02" + + "\u012A\u0132\x05.\x18\x02\u012B\u012C\x07\n\x02\x02\u012C\u012D\x05 \x11" + + "\x02\u012D\u012E\x07>\x02\x02\u012E\u012F\x05.\x18\x02\u012F\u0131\x03" + + "\x02\x02\x02\u0130\u012B\x03\x02\x02\x02\u0131\u0134\x03\x02\x02\x02\u0132" + + "\u0130\x03\x02\x02\x02\u0132\u0133\x03\x02\x02\x02\u0133\u0135\x03\x02" + + "\x02\x02\u0134\u0132\x03\x02\x02\x02\u0135\u0136\x07@\x02\x02\u0136\u0137" + + "\x07\x18\x02\x02\u0137\u013A\x075\x02\x02\u0138\u0139\x07\x19\x02\x02" + + "\u0139\u013B\x05$\x13\x02\u013A\u0138\x03\x02\x02\x02\u013A\u013B\x03" + + "\x02\x02\x02\u013B\u0154\x03\x02\x02\x02\u013C\u013D\x07\x17\x02\x02\u013D" + + "\u013E\x05\x1E\x10\x02\u013E\u013F\x07?\x02\x02\u013F\u0140\x05 \x11\x02" + + "\u0140\u0141\x07>\x02\x02\u0141\u0149\x05.\x18\x02\u0142\u0143\x07\n\x02" + + "\x02\u0143\u0144\x05 \x11\x02\u0144\u0145\x07>\x02\x02\u0145\u0146\x05" + + ".\x18\x02\u0146\u0148\x03\x02\x02\x02\u0147\u0142\x03\x02\x02\x02\u0148" + + "\u014B\x03\x02\x02\x02\u0149\u0147\x03\x02\x02\x02\u0149\u014A\x03\x02" + + "\x02\x02\u014A\u014C\x03\x02\x02\x02\u014B\u0149\x03\x02\x02\x02\u014C" + + "\u014D\x07@\x02\x02\u014D\u014E\x07\x1A\x02\x02\u014E\u0151\x05\"\x12" + + "\x02\u014F\u0150\x07\x19\x02\x02\u0150\u0152\x05$\x13\x02\u0151\u014F" + + "\x03\x02\x02\x02\u0151\u0152\x03\x02\x02\x02\u0152\u0154\x03\x02\x02\x02" + + "\u0153\u0125\x03\x02\x02\x02\u0153\u013C\x03\x02\x02\x02\u0154\x1D\x03" + + "\x02\x02\x02\u0155\u0156\x05R*\x02\u0156\x1F\x03\x02\x02\x02\u0157\u0158" + + "\x05R*\x02\u0158!\x03\x02\x02\x02\u0159\u015A\x05R*\x02\u015A#\x03\x02" + + "\x02\x02\u015B\u015C\x07*\x02\x02\u015C%\x03\x02\x02\x02\u015D\u015E\b" + + "\x14\x01\x02\u015E\u0167\x07?\x02\x02\u015F\u0164\x05&\x14\x02\u0160\u0161" + + "\x07\n\x02\x02\u0161\u0163\x05&\x14\x02\u0162\u0160\x03\x02\x02\x02\u0163" + + "\u0166\x03\x02\x02\x02\u0164\u0162\x03\x02\x02\x02\u0164\u0165\x03\x02" + + "\x02\x02\u0165\u0168\x03\x02\x02\x02\u0166\u0164\x03\x02\x02\x02\u0167" + + "\u015F\x03\x02\x02\x02\u0167\u0168\x03\x02\x02\x02\u0168\u016A\x03\x02" + + "\x02\x02\u0169\u016B\x07\n\x02\x02\u016A\u0169\x03\x02\x02\x02\u016A\u016B" + + "\x03\x02\x02\x02\u016B\u016C\x03\x02\x02\x02\u016C\u016D\x07@\x02\x02" + + "\u016D\u016E\x07\x1D\x02\x02\u016E\u0198\x05&\x14\x0E\u016F\u0170\x07" + + "A\x02\x02\u0170\u0171\x07\r\x02\x02\u0171\u0172\x05&\x14\x02\u0172\u0173" + + "\x07\x0E\x02\x02\u0173\u0198\x03\x02\x02\x02\u0174\u0175\x07B\x02\x02" + + "\u0175\u0176\x07\r\x02\x02\u0176\u0177\x05&\x14\x02\u0177\u0178\x07\x0E" + + "\x02\x02\u0178\u0198\x03\x02\x02\x02\u0179\u017A\x07?\x02\x02\u017A\u017B" + + "\x05&\x14\x02\u017B\u017C\x07\n\x02\x02\u017C\u0181\x05&\x14\x02\u017D" + + "\u017E\x07\n\x02\x02\u017E\u0180\x05&\x14\x02\u017F\u017D\x03\x02\x02" + + "\x02\u0180\u0183\x03\x02\x02\x02\u0181\u017F\x03\x02\x02\x02\u0181\u0182" + + "\x03\x02\x02\x02\u0182\u0185\x03\x02\x02\x02\u0183\u0181\x03\x02\x02\x02" + + "\u0184\u0186\x07\n\x02\x02\u0185\u0184\x03\x02\x02\x02\u0185\u0186\x03" + + "\x02\x02\x02\u0186\u0187\x03\x02\x02\x02\u0187\u0188\x07@\x02\x02\u0188" + + "\u0198\x03\x02\x02\x02\u0189\u018B\x07\x04\x02\x02\u018A\u018C\x05*\x16" + + "\x02\u018B\u018A\x03\x02\x02\x02\u018B\u018C\x03\x02\x02\x02\u018C\u018D" + + "\x03\x02\x02\x02\u018D\u0198\x07\x05\x02\x02\u018E\u0198\x07\x1E\x02\x02" + + "\u018F\u0198\x07\x1F\x02\x02\u0190\u0198\x07 \x02\x02\u0191\u0198\x05" + + "(\x15\x02\u0192\u0198\x05R*\x02\u0193\u0194\x07?\x02\x02\u0194\u0195\x05" + + "&\x14\x02\u0195\u0196\x07@\x02\x02\u0196\u0198\x03\x02\x02\x02\u0197\u015D" + + "\x03\x02\x02\x02\u0197\u016F\x03\x02\x02\x02\u0197\u0174\x03\x02\x02\x02" + + "\u0197\u0179\x03\x02\x02\x02\u0197\u0189\x03\x02\x02\x02\u0197\u018E\x03" + + "\x02\x02\x02\u0197\u018F\x03\x02\x02\x02\u0197\u0190\x03\x02\x02\x02\u0197" + + "\u0191\x03\x02\x02\x02\u0197\u0192\x03\x02\x02\x02\u0197\u0193\x03\x02" + + "\x02\x02\u0198\u01AD\x03\x02\x02\x02\u0199\u019A\f\x10\x02\x02\u019A\u019B" + + "\x07\x1C\x02\x02\u019B\u01AC\x05&\x14\x10\u019C\u019D\f\x0F\x02\x02\u019D" + + "\u019E\x07\x1D\x02\x02\u019E\u01AC\x05&\x14\x0F\u019F\u01A0\f\x03\x02" + + "\x02\u01A0\u01A1\x07\r\x02\x02\u01A1\u01A6\x05&\x14\x02\u01A2\u01A3\x07" + + "\n\x02\x02\u01A3\u01A5\x05&\x14\x02\u01A4\u01A2\x03\x02\x02\x02\u01A5" + + "\u01A8\x03\x02\x02\x02\u01A6\u01A4\x03\x02\x02\x02\u01A6\u01A7\x03\x02" + + "\x02\x02\u01A7\u01A9\x03\x02\x02\x02\u01A8\u01A6\x03\x02\x02\x02\u01A9" + + "\u01AA\x07\x0E\x02\x02\u01AA\u01AC\x03\x02\x02\x02\u01AB\u0199\x03\x02" + + "\x02\x02\u01AB\u019C\x03\x02\x02\x02\u01AB\u019F\x03\x02\x02\x02\u01AC" + + "\u01AF\x03\x02\x02\x02\u01AD\u01AB\x03\x02\x02\x02\u01AD\u01AE\x03\x02" + + "\x02\x02\u01AE\'\x03\x02\x02\x02\u01AF\u01AD\x03\x02\x02\x02\u01B0\u01B1" + + "\x07C\x02\x02\u01B1)\x03\x02\x02\x02\u01B2\u01B3\x05,\x17\x02\u01B3\u01B4" + + "\x07\x07\x02\x02\u01B4\u01B5\x05&\x14\x02\u01B5\u01BD\x03\x02\x02\x02" + + "\u01B6\u01B7\x07\n\x02\x02\u01B7\u01B8\x05,\x17\x02\u01B8\u01B9\x07\x07" + + "\x02\x02\u01B9\u01BA\x05&\x14\x02\u01BA\u01BC\x03\x02\x02\x02\u01BB\u01B6" + + "\x03\x02\x02\x02\u01BC\u01BF\x03\x02\x02\x02\u01BD\u01BB\x03\x02\x02\x02" + + "\u01BD\u01BE\x03\x02\x02\x02\u01BE\u01C3\x03\x02\x02\x02\u01BF\u01BD\x03" + + "\x02\x02\x02\u01C0\u01C4\x07\n\x02\x02\u01C1\u01C2\x07\x0F\x02\x02\u01C2" + + "\u01C4\x05V,\x02\u01C3\u01C0\x03\x02\x02\x02\u01C3\u01C1\x03\x02\x02\x02" + + "\u01C3\u01C4\x03\x02\x02\x02\u01C4\u01C8\x03\x02\x02\x02\u01C5\u01C6\x07" + + "\x0F\x02\x02\u01C6\u01C8\x05V,\x02\u01C7\u01B2\x03\x02\x02\x02\u01C7\u01C5" + + "\x03\x02\x02\x02\u01C8+\x03\x02\x02\x02\u01C9\u01CA\x05T+\x02\u01CA-\x03" + + "\x02\x02\x02\u01CB\u01CC\b\x18\x01\x02\u01CC\u0262\x058\x1D\x02\u01CD" + + "\u01CE\x05J&\x02\u01CE\u01D0\x07?\x02\x02\u01CF\u01D1\x05F$\x02\u01D0" + + "\u01CF\x03\x02\x02\x02\u01D0\u01D1\x03\x02\x02\x02\u01D1\u01D2\x03\x02" + + "\x02\x02\u01D2\u01D3\x07@\x02\x02\u01D3\u0262\x03\x02\x02\x02\u01D4\u01D5" + + "\x074\x02\x02\u01D5\u0262\x05.\x18\x1B\u01D6\u01D7\x05R*\x02\u01D7\u01D8" + + "\x07\"\x02\x02\u01D8\u01D9\x07>\x02\x02\u01D9\u01DA\x05.\x18\x17\u01DA" + + "\u0262\x03\x02\x02\x02\u01DB\u01DC\x07-\x02\x02\u01DC\u01DD\x07\x04\x02" + + "\x02\u01DD\u01E2\x05.\x18\x02\u01DE\u01DF\x07\n\x02\x02\u01DF\u01E1\x05" + + ".\x18\x02\u01E0\u01DE\x03\x02\x02\x02\u01E1\u01E4\x03\x02\x02\x02\u01E2" + + "\u01E0\x03\x02\x02\x02\u01E2\u01E3\x03\x02\x02\x02\u01E3\u01E6\x03\x02" + + "\x02\x02\u01E4\u01E2\x03\x02\x02\x02\u01E5\u01E7\x07\n\x02\x02\u01E6\u01E5" + + "\x03\x02\x02\x02\u01E6\u01E7\x03\x02\x02\x02\u01E7\u01E8\x03\x02\x02\x02" + + "\u01E8\u01E9\x07\x05\x02\x02\u01E9\u0262\x03\x02\x02\x02\u01EA\u01EB\x07" + + ".\x02\x02\u01EB\u01EC\x07\x04\x02\x02\u01EC\u01F1\x05.\x18\x02\u01ED\u01EE" + + "\x07\n\x02\x02\u01EE\u01F0"; private static readonly _serializedATNSegment1: string = - "\u01EE\u01EF\x07\x04\x02\x02\u01EF\u01F4\x05.\x18\x02\u01F0\u01F1\x07" + - "\n\x02\x02\u01F1\u01F3\x05.\x18\x02\u01F2\u01F0\x03\x02\x02\x02\u01F3" + - "\u01F6\x03\x02\x02\x02\u01F4\u01F2\x03\x02\x02\x02\u01F4\u01F5\x03\x02" + - "\x02\x02\u01F5\u01F8\x03\x02\x02\x02\u01F6\u01F4\x03\x02\x02\x02\u01F7" + - "\u01F9\x07\n\x02\x02\u01F8\u01F7\x03\x02\x02\x02\u01F8\u01F9\x03\x02\x02" + - "\x02\u01F9\u01FA\x03\x02\x02\x02\u01FA\u01FB\x07\x05\x02\x02\u01FB\u0265" + - "\x03\x02\x02\x02\u01FC\u0265\x050\x19\x02\u01FD\u01FE\x07#\x02\x02\u01FE" + - "\u01FF\x07\x04\x02\x02\u01FF\u0204\x05.\x18\x02\u0200\u0201\x07\n\x02" + - "\x02\u0201\u0203\x05.\x18\x02\u0202\u0200\x03\x02\x02\x02\u0203\u0206" + - "\x03\x02\x02\x02\u0204\u0202\x03\x02\x02\x02\u0204\u0205\x03\x02\x02\x02" + - "\u0205\u0208\x03\x02\x02\x02\u0206\u0204\x03\x02\x02\x02\u0207\u0209\x07" + - "\n\x02\x02\u0208\u0207\x03\x02\x02\x02\u0208\u0209\x03\x02\x02\x02\u0209" + - "\u020A\x03\x02\x02\x02\u020A\u020B\x07\x05\x02\x02\u020B\u0265\x03\x02" + - "\x02\x02\u020C\u020D\x07$\x02\x02\u020D\u020E\x07\x04\x02\x02\u020E\u0213" + - "\x05.\x18\x02\u020F\u0210\x07\n\x02\x02\u0210\u0212\x05.\x18\x02\u0211" + - "\u020F\x03\x02\x02\x02\u0212\u0215\x03\x02\x02\x02\u0213\u0211\x03\x02" + - "\x02\x02\u0213\u0214\x03\x02\x02\x02\u0214\u0217\x03\x02\x02\x02\u0215" + - "\u0213\x03\x02\x02\x02\u0216\u0218\x07\n\x02\x02\u0217\u0216\x03\x02\x02" + - "\x02\u0217\u0218\x03\x02\x02\x02\u0218\u0219\x03\x02\x02\x02\u0219\u021A" + - "\x07\x05\x02\x02\u021A\u0265\x03\x02\x02\x02\u021B\u0220\x05P)\x02\u021C" + - "\u0220\x07,\x02\x02\u021D\u0220\x07+\x02\x02\u021E\u0220\x07*\x02\x02" + - "\u021F\u021B\x03\x02\x02\x02\u021F\u021C\x03\x02\x02\x02\u021F\u021D\x03" + - "\x02\x02\x02\u021F\u021E\x03\x02\x02\x02\u0220\u0265\x03\x02\x02\x02\u0221" + - "\u0222\x07?\x02\x02\u0222\u0223\x05.\x18\x02\u0223\u0224\x07\n\x02\x02" + - "\u0224\u0229\x05.\x18\x02\u0225\u0226\x07\n\x02\x02\u0226\u0228\x05.\x18" + - "\x02\u0227\u0225\x03\x02\x02\x02\u0228\u022B\x03\x02\x02\x02\u0229\u0227" + - "\x03\x02\x02\x02\u0229\u022A\x03\x02\x02\x02\u022A\u022D\x03\x02\x02\x02" + - "\u022B\u0229\x03\x02\x02\x02\u022C\u022E\x07\n\x02\x02\u022D\u022C\x03" + - "\x02\x02\x02\u022D\u022E\x03\x02\x02\x02\u022E\u022F\x03\x02\x02\x02\u022F" + - "\u0230\x07@\x02\x02\u0230\u0265\x03\x02\x02\x02\u0231\u0232\x07\x04\x02" + - "\x02\u0232\u0237\x05F$\x02\u0233\u0234\x07\n\x02\x02\u0234\u0236\x05F" + - "$\x02\u0235\u0233\x03\x02\x02\x02\u0236\u0239\x03\x02\x02\x02\u0237\u0235" + - "\x03\x02\x02\x02\u0237\u0238\x03\x02\x02\x02\u0238\u023B\x03\x02\x02\x02" + - "\u0239\u0237\x03\x02\x02\x02\u023A\u023C\x07\n\x02\x02\u023B\u023A\x03" + - "\x02\x02\x02\u023B\u023C\x03\x02\x02\x02\u023C\u023D\x03\x02\x02\x02\u023D" + - "\u023E\x07\x05\x02\x02\u023E\u0265\x03\x02\x02\x02\u023F\u0248\x07\r\x02" + - "\x02\u0240\u0245\x05.\x18\x02\u0241\u0242\x07\n\x02\x02\u0242\u0244\x05" + - ".\x18\x02\u0243\u0241\x03\x02\x02\x02\u0244\u0247\x03\x02\x02\x02\u0245" + - "\u0243\x03\x02\x02\x02\u0245\u0246\x03\x02\x02\x02\u0246\u0249\x03\x02" + - "\x02\x02\u0247\u0245\x03\x02\x02\x02\u0248\u0240\x03\x02\x02\x02\u0248" + - "\u0249\x03\x02\x02\x02\u0249\u024B\x03\x02\x02\x02\u024A\u024C\x07\n\x02" + - "\x02\u024B\u024A\x03\x02\x02\x02\u024B\u024C\x03\x02\x02\x02\u024C\u024D" + - "\x03\x02\x02\x02\u024D\u0265\x07\x0E\x02\x02\u024E\u024F\x07%\x02\x02" + - "\u024F\u0250\x07?\x02\x02\u0250\u0251\x05.\x18\x02\u0251\u0252\x07@\x02" + - "\x02\u0252\u0253\x05.\x18\x02\u0253\u0254\x07&\x02\x02\u0254\u0255\x05" + - ".\x18\x07\u0255\u0265\x03\x02\x02\x02\u0256\u0257\x05\n\x06\x02\u0257" + - "\u0258\x05.\x18\x06\u0258\u0265\x03\x02\x02\x02\u0259\u025A\x05\x14\v" + - "\x02\u025A\u025B\x05.\x18\x05\u025B\u0265\x03\x02\x02\x02\u025C\u025D" + - "\x07?\x02\x02\u025D\u025E\x05.\x18\x02\u025E\u025F\x07@\x02\x02\u025F" + - "\u0265\x03\x02\x02\x02\u0260\u0261\x07\x04\x02\x02\u0261\u0262\x05.\x18" + - "\x02\u0262\u0263\x07\x05\x02\x02\u0263\u0265\x03\x02\x02\x02\u0264\u01CE" + - "\x03\x02\x02\x02\u0264\u01D0\x03\x02\x02\x02\u0264\u01D7\x03\x02\x02\x02" + - "\u0264\u01D9\x03\x02\x02\x02\u0264\u01DE\x03\x02\x02\x02\u0264\u01ED\x03" + - "\x02\x02\x02\u0264\u01FC\x03\x02\x02\x02\u0264\u01FD\x03\x02\x02\x02\u0264" + - "\u020C\x03\x02\x02\x02\u0264\u021F\x03\x02\x02\x02\u0264\u0221\x03\x02" + - "\x02\x02\u0264\u0231\x03\x02\x02\x02\u0264\u023F\x03\x02\x02\x02\u0264" + - "\u024E\x03\x02\x02\x02\u0264\u0256\x03\x02\x02\x02\u0264\u0259\x03\x02" + - "\x02\x02\u0264\u025C\x03\x02\x02\x02\u0264\u0260\x03\x02\x02\x02\u0265" + - "\u0297\x03\x02\x02\x02\u0266\u0267\f\x1C\x02\x02\u0267\u0268\x07!\x02" + - "\x02\u0268\u0296\x05.\x18\x1C\u0269\u026A\f\x1A\x02\x02\u026A\u026B\t" + - "\x02\x02\x02\u026B\u0296\x05.\x18\x1B\u026C\u026D\f\x19\x02\x02\u026D" + - "\u026E\t\x03\x02\x02\u026E\u0296\x05.\x18\x1A\u026F\u0270\f\x18\x02\x02" + - "\u0270\u0271\t\x04\x02\x02\u0271\u0296\x05.\x18\x19\u0272\u0273\f\x16" + - "\x02\x02\u0273\u0274\x07>\x02\x02\u0274\u0275\x05.\x18\x17\u0275\u0276" + - "\b\x18\x01\x02\u0276\u0296\x03\x02\x02\x02\u0277\u0278\f\x14\x02\x02\u0278" + - "\u0279\x07-\x02\x02\u0279\u0296\x05.\x18\x15\u027A\u027B\f\x12\x02\x02" + - "\u027B\u027C\x07.\x02\x02\u027C\u0296\x05.\x18\x13\u027D\u027E\f\x11\x02" + - "\x02\u027E\u027F\x07/\x02\x02\u027F\u0296\x05.\x18\x12\u0280\u0281\f\x10" + - "\x02\x02\u0281\u0282\x070\x02\x02\u0282\u0296\x05.\x18\x11\u0283\u0284" + - "\f\n\x02\x02\u0284\u0285\x07\x1C\x02\x02\u0285\u0296\x05.\x18\v\u0286" + - "\u0287\f \x02\x02\u0287\u0288\x07\x18\x02\x02\u0288\u028E\x05J&\x02\u0289" + - "\u028B\x07?\x02\x02\u028A\u028C\x05D#\x02\u028B\u028A\x03\x02\x02\x02" + - "\u028B\u028C\x03\x02\x02\x02\u028C\u028D\x03\x02\x02\x02\u028D\u028F\x07" + - "@\x02\x02\u028E\u0289\x03\x02\x02\x02\u028E\u028F\x03\x02\x02\x02\u028F" + - "\u0296\x03\x02\x02\x02\u0290\u0291\f\x1D\x02\x02\u0291\u0292\x07\r\x02" + - "\x02\u0292\u0293\x05.\x18\x02\u0293\u0294\x07\x0E\x02\x02\u0294\u0296" + - "\x03\x02\x02\x02\u0295\u0266\x03\x02\x02\x02\u0295\u0269\x03\x02\x02\x02" + - "\u0295\u026C\x03\x02\x02\x02\u0295\u026F\x03\x02\x02\x02\u0295\u0272\x03" + - "\x02\x02\x02\u0295\u0277\x03\x02\x02\x02\u0295\u027A\x03\x02\x02\x02\u0295" + - "\u027D\x03\x02\x02\x02\u0295\u0280\x03\x02\x02\x02\u0295\u0283\x03\x02" + - "\x02\x02\u0295\u0286\x03\x02\x02\x02\u0295\u0290\x03\x02\x02\x02\u0296" + - "\u0299\x03\x02\x02\x02\u0297\u0295\x03\x02\x02\x02\u0297\u0298\x03\x02" + - "\x02\x02\u0298/\x03\x02\x02\x02\u0299\u0297\x03\x02\x02\x02\u029A\u029B" + - "\x072\x02\x02\u029B\u029C\x05.\x18\x02\u029C\u029E\x07\x04\x02\x02\u029D" + - "\u029F\x07\x0F\x02\x02\u029E\u029D\x03\x02\x02\x02\u029E\u029F\x03\x02" + - "\x02\x02\u029F\u02A0\x03\x02\x02\x02\u02A0\u02A5\x052\x1A\x02\u02A1\u02A2" + - "\x07\x0F\x02\x02\u02A2\u02A4\x052\x1A\x02\u02A3\u02A1\x03\x02\x02\x02" + - "\u02A4\u02A7\x03\x02\x02\x02\u02A5\u02A3\x03\x02\x02\x02\u02A5\u02A6\x03" + - "\x02\x02\x02\u02A6\u02A8\x03\x02\x02\x02\u02A7\u02A5\x03\x02\x02\x02\u02A8" + - "\u02A9\x07\x05\x02\x02\u02A91\x03\x02\x02\x02\u02AA\u02AD\x054\x1B\x02" + - "\u02AB\u02AD\x07\'\x02\x02\u02AC\u02AA\x03\x02\x02\x02\u02AC\u02AB\x03" + - "\x02\x02\x02\u02AD\u02AE\x03\x02\x02\x02\u02AE\u02AF\x07\x1D\x02\x02\u02AF" + - "\u02B0\x05.\x18\x02\u02B03\x03\x02\x02\x02\u02B1\u02B8\x05R*\x02\u02B2" + - "\u02B5\x07?\x02\x02\u02B3\u02B6\x05R*\x02\u02B4\u02B6\x07\'\x02\x02\u02B5" + - "\u02B3\x03\x02\x02\x02\u02B5\u02B4\x03\x02\x02\x02\u02B6\u02B7\x03\x02" + - "\x02\x02\u02B7\u02B9\x07@\x02\x02\u02B8\u02B2\x03\x02\x02\x02\u02B8\u02B9" + - "\x03\x02\x02\x02\u02B95\x03\x02\x02\x02\u02BA\u02BB\x05\b\x05\x02\u02BB" + - "\u02BC\x07\x02\x02\x03\u02BC\u02C4\x03\x02\x02\x02\u02BD\u02BE\x05.\x18" + - "\x02\u02BE\u02BF\x07\x02\x02\x03\u02BF\u02C4\x03\x02\x02\x02\u02C0\u02C1" + - "\x07E\x02\x02\u02C1\u02C4\x07\x02\x02\x03\u02C2\u02C4\x07\x02\x02\x03" + - "\u02C3\u02BA\x03\x02\x02\x02\u02C3\u02BD\x03\x02\x02\x02\u02C3\u02C0\x03" + - "\x02\x02\x02\u02C3\u02C2\x03\x02\x02\x02\u02C47\x03\x02\x02\x02\u02C5" + - "\u02C8\x05:\x1E\x02\u02C6\u02C8\x05<\x1F\x02\u02C7\u02C5\x03\x02\x02\x02" + - "\u02C7\u02C6\x03\x02\x02\x02\u02C89\x03\x02\x02\x02\u02C9\u02CA\x05@!" + - "\x02\u02CA\u02CB\x07\x1D\x02\x02\u02CB\u02CC\x05.\x18\x02\u02CC\u02DB" + - "\x03\x02\x02\x02\u02CD\u02CE\x07?\x02\x02\u02CE\u02D3\x05@!\x02\u02CF" + - "\u02D0\x07\n\x02\x02\u02D0\u02D2\x05@!\x02\u02D1\u02CF\x03\x02\x02\x02" + - "\u02D2\u02D5\x03\x02\x02\x02\u02D3\u02D1\x03\x02\x02\x02\u02D3\u02D4\x03" + - "\x02\x02\x02\u02D4\u02D6\x03\x02\x02\x02\u02D5\u02D3\x03\x02\x02\x02\u02D6" + - "\u02D7\x07@\x02\x02\u02D7\u02D8\x07\x1D\x02\x02\u02D8\u02D9\x05.\x18\x02" + - "\u02D9\u02DB\x03\x02\x02\x02\u02DA\u02C9\x03\x02\x02\x02\u02DA\u02CD\x03" + - "\x02\x02\x02\u02DB;\x03\x02\x02\x02\u02DC\u02DD\x07?\x02\x02\u02DD\u02DE" + - "\x07?\x02\x02\u02DE\u02E1\x05@!\x02\u02DF\u02E0\x07\n\x02\x02\u02E0\u02E2" + - "\x05@!\x02\u02E1\u02DF\x03\x02\x02\x02\u02E2\u02E3\x03\x02\x02\x02\u02E3" + - "\u02E1\x03\x02\x02\x02\u02E3\u02E4\x03\x02\x02\x02\u02E4\u02E5\x03\x02" + - "\x02\x02\u02E5\u02E6\x07@\x02\x02\u02E6\u02E7\x07@\x02\x02\u02E7\u02E8" + - "\x07\x1D\x02\x02\u02E8\u02E9\x05.\x18\x02\u02E9=\x03\x02\x02\x02\u02EA" + - "\u02ED\x07\'\x02\x02\u02EB\u02ED\x05P)\x02\u02EC\u02EA\x03\x02\x02\x02" + - "\u02EC\u02EB\x03\x02\x02\x02\u02ED?\x03\x02\x02\x02\u02EE\u02EF\x05> " + - "\x02\u02EFA\x03\x02\x02\x02\u02F0\u02F3\x075\x02\x02\u02F1\u02F3\x05P" + - ")\x02\u02F2\u02F0\x03\x02\x02\x02\u02F2\u02F1\x03\x02\x02\x02\u02F3C\x03" + - "\x02\x02\x02\u02F4\u02F9\x05.\x18\x02\u02F5\u02F6\x07\n\x02\x02\u02F6" + - "\u02F8\x05.\x18\x02\u02F7\u02F5\x03\x02\x02\x02\u02F8\u02FB\x03\x02\x02" + - "\x02\u02F9\u02F7\x03\x02\x02\x02\u02F9\u02FA\x03\x02\x02\x02\u02FAE\x03" + - "\x02\x02\x02\u02FB\u02F9\x03\x02\x02\x02\u02FC\u02FD\x05R*\x02\u02FD\u02FE" + - "\x07\x07\x02\x02\u02FE\u02FF\x05.\x18\x02\u02FF\u0303\x03\x02\x02\x02" + - "\u0300\u0301\x07(\x02\x02\u0301\u0303\x05.\x18\x02\u0302\u02FC\x03\x02" + - "\x02\x02\u0302\u0300\x03\x02\x02\x02\u0303G\x03\x02\x02\x02\u0304\u0307" + - "\x05P)\x02\u0305\u0307\t\x05\x02\x02\u0306\u0304\x03\x02\x02\x02\u0306" + - "\u0305\x03\x02\x02\x02\u0307I\x03\x02\x02\x02\u0308\u030B\x05P)\x02\u0309" + - "\u030B\t\x06\x02\x02\u030A\u0308\x03\x02\x02\x02\u030A\u0309\x03\x02\x02" + - "\x02\u030BK\x03\x02\x02\x02\u030C\u030D\t\x07\x02\x02\u030DM\x03\x02\x02" + - "\x02\u030E\u030F\t\b\x02\x02\u030FO\x03\x02\x02\x02\u0310\u0315\x05T+" + - "\x02\u0311\u0312\x07)\x02\x02\u0312\u0314\x05T+\x02\u0313\u0311\x03\x02" + - "\x02\x02\u0314\u0317\x03\x02\x02\x02\u0315\u0313\x03\x02\x02\x02\u0315" + - "\u0316\x03\x02\x02\x02\u0316Q\x03\x02\x02\x02\u0317\u0315\x03\x02\x02" + - "\x02\u0318\u031D\x05T+\x02\u0319\u031A\x05P)\x02\u031A\u031B\b*\x01\x02" + - "\u031B\u031D\x03\x02\x02\x02\u031C\u0318\x03\x02\x02\x02\u031C\u0319\x03" + - "\x02\x02\x02\u031DS\x03\x02\x02\x02\u031E\u031F\t\t\x02\x02\u031FU\x03" + - "\x02\x02\x02ZY`iq\x8A\x94\x97\x9A\x9E\xA2\xA5\xB4\xBC\xBF\xC1\xCF\xD8" + - "\xDD\xE0\xE7\xEF\xF5\xFA\u0105\u010D\u0113\u0117\u0119\u0124\u0126\u0135" + - "\u013D\u014C\u0154\u0156\u0167\u016A\u016D\u0184\u0188\u018E\u019A\u01A9" + - "\u01AE\u01B0\u01C0\u01C6\u01CA\u01D3\u01E5\u01E9\u01F4\u01F8\u0204\u0208" + - "\u0213\u0217\u021F\u0229\u022D\u0237\u023B\u0245\u0248\u024B\u0264\u028B" + - "\u028E\u0295\u0297\u029E\u02A5\u02AC\u02B5\u02B8\u02C3\u02C7\u02D3\u02DA" + - "\u02E3\u02EC\u02F2\u02F9\u0302\u0306\u030A\u0315\u031C"; + "\x05.\x18\x02\u01EF\u01ED\x03\x02\x02\x02\u01F0\u01F3\x03\x02\x02\x02" + + "\u01F1\u01EF\x03\x02\x02\x02\u01F1\u01F2\x03\x02\x02\x02\u01F2\u01F5\x03" + + "\x02\x02\x02\u01F3\u01F1\x03\x02\x02\x02\u01F4\u01F6\x07\n\x02\x02\u01F5" + + "\u01F4\x03\x02\x02\x02\u01F5\u01F6\x03\x02\x02\x02\u01F6\u01F7\x03\x02" + + "\x02\x02\u01F7\u01F8\x07\x05\x02\x02\u01F8\u0262\x03\x02\x02\x02\u01F9" + + "\u0262\x050\x19\x02\u01FA\u01FB\x07#\x02\x02\u01FB\u01FC\x07\x04\x02\x02" + + "\u01FC\u0201\x05.\x18\x02\u01FD\u01FE\x07\n\x02\x02\u01FE\u0200\x05.\x18" + + "\x02\u01FF\u01FD\x03\x02\x02\x02\u0200\u0203\x03\x02\x02\x02\u0201\u01FF" + + "\x03\x02\x02\x02\u0201\u0202\x03\x02\x02\x02\u0202\u0205\x03\x02\x02\x02" + + "\u0203\u0201\x03\x02\x02\x02\u0204\u0206\x07\n\x02\x02\u0205\u0204\x03" + + "\x02\x02\x02\u0205\u0206\x03\x02\x02\x02\u0206\u0207\x03\x02\x02\x02\u0207" + + "\u0208\x07\x05\x02\x02\u0208\u0262\x03\x02\x02\x02\u0209\u020A\x07$\x02" + + "\x02\u020A\u020B\x07\x04\x02\x02\u020B\u0210\x05.\x18\x02\u020C\u020D" + + "\x07\n\x02\x02\u020D\u020F\x05.\x18\x02\u020E\u020C\x03\x02\x02\x02\u020F" + + "\u0212\x03\x02\x02\x02\u0210\u020E\x03\x02\x02\x02\u0210\u0211\x03\x02" + + "\x02\x02\u0211\u0214\x03\x02\x02\x02\u0212\u0210\x03\x02\x02\x02\u0213" + + "\u0215\x07\n\x02\x02\u0214\u0213\x03\x02\x02\x02\u0214\u0215\x03\x02\x02" + + "\x02\u0215\u0216\x03\x02\x02\x02\u0216\u0217\x07\x05\x02\x02\u0217\u0262" + + "\x03\x02\x02\x02\u0218\u021D\x05R*\x02\u0219\u021D\x07,\x02\x02\u021A" + + "\u021D\x07+\x02\x02\u021B\u021D\x07*\x02\x02\u021C\u0218\x03\x02\x02\x02" + + "\u021C\u0219\x03\x02\x02\x02\u021C\u021A\x03\x02\x02\x02\u021C\u021B\x03" + + "\x02\x02\x02\u021D\u0262\x03\x02\x02\x02\u021E\u021F\x07?\x02\x02\u021F" + + "\u0220\x05.\x18\x02\u0220\u0221\x07\n\x02\x02\u0221\u0226\x05.\x18\x02" + + "\u0222\u0223\x07\n\x02\x02\u0223\u0225\x05.\x18\x02\u0224\u0222\x03\x02" + + "\x02\x02\u0225\u0228\x03\x02\x02\x02\u0226\u0224\x03\x02\x02\x02\u0226" + + "\u0227\x03\x02\x02\x02\u0227\u022A\x03\x02\x02\x02\u0228\u0226\x03\x02" + + "\x02\x02\u0229\u022B\x07\n\x02\x02\u022A\u0229\x03\x02\x02\x02\u022A\u022B" + + "\x03\x02\x02\x02\u022B\u022C\x03\x02\x02\x02\u022C\u022D\x07@\x02\x02" + + "\u022D\u0262\x03\x02\x02\x02\u022E\u022F\x07\x04\x02\x02\u022F\u0234\x05" + + "H%\x02\u0230\u0231\x07\n\x02\x02\u0231\u0233\x05H%\x02\u0232\u0230\x03" + + "\x02\x02\x02\u0233\u0236\x03\x02\x02\x02\u0234\u0232\x03\x02\x02\x02\u0234" + + "\u0235\x03\x02\x02\x02\u0235\u0238\x03\x02\x02\x02\u0236\u0234\x03\x02" + + "\x02\x02\u0237\u0239\x07\n\x02\x02\u0238\u0237\x03\x02\x02\x02\u0238\u0239" + + "\x03\x02\x02\x02\u0239\u023A\x03\x02\x02\x02\u023A\u023B\x07\x05\x02\x02" + + "\u023B\u0262\x03\x02\x02\x02\u023C\u0245\x07\r\x02\x02\u023D\u0242\x05" + + ".\x18\x02\u023E\u023F\x07\n\x02\x02\u023F\u0241\x05.\x18\x02\u0240\u023E" + + "\x03\x02\x02\x02\u0241\u0244\x03\x02\x02\x02\u0242\u0240\x03\x02\x02\x02" + + "\u0242\u0243\x03\x02\x02\x02\u0243\u0246\x03\x02\x02\x02\u0244\u0242\x03" + + "\x02\x02\x02\u0245\u023D\x03\x02\x02\x02\u0245\u0246\x03\x02\x02\x02\u0246" + + "\u0248\x03\x02\x02\x02\u0247\u0249\x07\n\x02\x02\u0248\u0247\x03\x02\x02" + + "\x02\u0248\u0249\x03\x02\x02\x02\u0249\u024A\x03\x02\x02\x02\u024A\u0262" + + "\x07\x0E\x02\x02\u024B\u024C\x07%\x02\x02\u024C\u024D\x07?\x02\x02\u024D" + + "\u024E\x05.\x18\x02\u024E\u024F\x07@\x02\x02\u024F\u0250\x05.\x18\x02" + + "\u0250\u0251\x07&\x02\x02\u0251\u0252\x05.\x18\x07\u0252\u0262\x03\x02" + + "\x02\x02\u0253\u0254\x05\n\x06\x02\u0254\u0255\x05.\x18\x06\u0255\u0262" + + "\x03\x02\x02\x02\u0256\u0257\x05\x14\v\x02\u0257\u0258\x05.\x18\x05\u0258" + + "\u0262\x03\x02\x02\x02\u0259\u025A\x07?\x02\x02\u025A\u025B\x05.\x18\x02" + + "\u025B\u025C\x07@\x02\x02\u025C\u0262\x03\x02\x02\x02\u025D\u025E\x07" + + "\x04\x02\x02\u025E\u025F\x05.\x18\x02\u025F\u0260\x07\x05\x02\x02\u0260" + + "\u0262\x03\x02\x02\x02\u0261\u01CB\x03\x02\x02\x02\u0261\u01CD\x03\x02" + + "\x02\x02\u0261\u01D4\x03\x02\x02\x02\u0261\u01D6\x03\x02\x02\x02\u0261" + + "\u01DB\x03\x02\x02\x02\u0261\u01EA\x03\x02\x02\x02\u0261\u01F9\x03\x02" + + "\x02\x02\u0261\u01FA\x03\x02\x02\x02\u0261\u0209\x03\x02\x02\x02\u0261" + + "\u021C\x03\x02\x02\x02\u0261\u021E\x03\x02\x02\x02\u0261\u022E\x03\x02" + + "\x02\x02\u0261\u023C\x03\x02\x02\x02\u0261\u024B\x03\x02\x02\x02\u0261" + + "\u0253\x03\x02\x02\x02\u0261\u0256\x03\x02\x02\x02\u0261\u0259\x03\x02" + + "\x02\x02\u0261\u025D\x03\x02\x02\x02\u0262\u0294\x03\x02\x02\x02\u0263" + + "\u0264\f\x1C\x02\x02\u0264\u0265\x07!\x02\x02\u0265\u0293\x05.\x18\x1C" + + "\u0266\u0267\f\x1A\x02\x02\u0267\u0268\t\x02\x02\x02\u0268\u0293\x05." + + "\x18\x1B\u0269\u026A\f\x19\x02\x02\u026A\u026B\t\x03\x02\x02\u026B\u0293" + + "\x05.\x18\x1A\u026C\u026D\f\x18\x02\x02\u026D\u026E\t\x04\x02\x02\u026E" + + "\u0293\x05.\x18\x19\u026F\u0270\f\x16\x02\x02\u0270\u0271\x07>\x02\x02" + + "\u0271\u0272\x05.\x18\x17\u0272\u0273\b\x18\x01\x02\u0273\u0293\x03\x02" + + "\x02\x02\u0274\u0275\f\x14\x02\x02\u0275\u0276\x07-\x02\x02\u0276\u0293" + + "\x05.\x18\x15\u0277\u0278\f\x12\x02\x02\u0278\u0279\x07.\x02\x02\u0279" + + "\u0293\x05.\x18\x13\u027A\u027B\f\x11\x02\x02\u027B\u027C\x07/\x02\x02" + + "\u027C\u0293\x05.\x18\x12\u027D\u027E\f\x10\x02\x02\u027E\u027F\x070\x02" + + "\x02\u027F\u0293\x05.\x18\x11\u0280\u0281\f\n\x02\x02\u0281\u0282\x07" + + "\x1C\x02\x02\u0282\u0293\x05.\x18\v\u0283\u0284\f \x02\x02\u0284\u0285" + + "\x07\x18\x02\x02\u0285\u028B\x05L\'\x02\u0286\u0288\x07?\x02\x02\u0287" + + "\u0289\x05F$\x02\u0288\u0287\x03\x02\x02\x02\u0288\u0289\x03\x02\x02\x02" + + "\u0289\u028A\x03\x02\x02\x02\u028A\u028C\x07@\x02\x02\u028B\u0286\x03" + + "\x02\x02\x02\u028B\u028C\x03\x02\x02\x02\u028C\u0293\x03\x02\x02\x02\u028D" + + "\u028E\f\x1D\x02\x02\u028E\u028F\x07\r\x02\x02\u028F\u0290\x05.\x18\x02" + + "\u0290\u0291\x07\x0E\x02\x02\u0291\u0293\x03\x02\x02\x02\u0292\u0263\x03" + + "\x02\x02\x02\u0292\u0266\x03\x02\x02\x02\u0292\u0269\x03\x02\x02\x02\u0292" + + "\u026C\x03\x02\x02\x02\u0292\u026F\x03\x02\x02\x02\u0292\u0274\x03\x02" + + "\x02\x02\u0292\u0277\x03\x02\x02\x02\u0292\u027A\x03\x02\x02\x02\u0292" + + "\u027D\x03\x02\x02\x02\u0292\u0280\x03\x02\x02\x02\u0292\u0283\x03\x02" + + "\x02\x02\u0292\u028D\x03\x02\x02\x02\u0293\u0296\x03\x02\x02\x02\u0294" + + "\u0292\x03\x02\x02\x02\u0294\u0295\x03\x02\x02\x02\u0295/\x03\x02\x02" + + "\x02\u0296\u0294\x03\x02\x02\x02\u0297\u0298\x072\x02\x02\u0298\u0299" + + "\x05.\x18\x02\u0299\u029B\x07\x04\x02\x02\u029A\u029C\x07\x0F\x02\x02" + + "\u029B\u029A\x03\x02\x02\x02\u029B\u029C\x03\x02\x02\x02\u029C\u029D\x03" + + "\x02\x02\x02\u029D\u02A2\x052\x1A\x02\u029E\u029F\x07\x0F\x02\x02\u029F" + + "\u02A1\x052\x1A\x02\u02A0\u029E\x03\x02\x02\x02\u02A1\u02A4\x03\x02\x02" + + "\x02\u02A2\u02A0\x03\x02\x02\x02\u02A2\u02A3\x03\x02\x02\x02\u02A3\u02A5" + + "\x03\x02\x02\x02\u02A4\u02A2\x03\x02\x02\x02\u02A5\u02A6\x07\x05\x02\x02" + + "\u02A61\x03\x02\x02\x02\u02A7\u02AA\x054\x1B\x02\u02A8\u02AA\x07\'\x02" + + "\x02\u02A9\u02A7\x03\x02\x02\x02\u02A9\u02A8\x03\x02\x02\x02\u02AA\u02AB" + + "\x03\x02\x02\x02\u02AB\u02AC\x07\x1D\x02\x02\u02AC\u02AD\x05.\x18\x02" + + "\u02AD3\x03\x02\x02\x02\u02AE\u02B5\x05T+\x02\u02AF\u02B2\x07?\x02\x02" + + "\u02B0\u02B3\x05T+\x02\u02B1\u02B3\x07\'\x02\x02\u02B2\u02B0\x03\x02\x02" + + "\x02\u02B2\u02B1\x03\x02\x02\x02\u02B3\u02B4\x03\x02\x02\x02\u02B4\u02B6" + + "\x07@\x02\x02\u02B5\u02AF\x03\x02\x02\x02\u02B5\u02B6\x03\x02\x02\x02" + + "\u02B65\x03\x02\x02\x02\u02B7\u02B8\x05\b\x05\x02\u02B8\u02B9\x07\x02" + + "\x02\x03\u02B9\u02C1\x03\x02\x02\x02\u02BA\u02BB\x05.\x18\x02\u02BB\u02BC" + + "\x07\x02\x02\x03\u02BC\u02C1\x03\x02\x02\x02\u02BD\u02BE\x07E\x02\x02" + + "\u02BE\u02C1\x07\x02\x02\x03\u02BF\u02C1\x07\x02\x02\x03\u02C0\u02B7\x03" + + "\x02\x02\x02\u02C0\u02BA\x03\x02\x02\x02\u02C0\u02BD\x03\x02\x02\x02\u02C0" + + "\u02BF\x03\x02\x02\x02\u02C17\x03\x02\x02\x02\u02C2\u02C5\x05:\x1E\x02" + + "\u02C3\u02C5\x05<\x1F\x02\u02C4\u02C2\x03\x02\x02\x02\u02C4\u02C3\x03" + + "\x02\x02\x02\u02C59\x03\x02\x02\x02\u02C6\u02C7\x05@!\x02\u02C7\u02C8" + + "\x07\x1D\x02\x02\u02C8\u02C9\x05.\x18\x02\u02C9\u02D8\x03\x02\x02\x02" + + "\u02CA\u02CB\x07?\x02\x02\u02CB\u02D0\x05@!\x02\u02CC\u02CD\x07\n\x02" + + "\x02\u02CD\u02CF\x05@!\x02\u02CE\u02CC\x03\x02\x02\x02\u02CF\u02D2\x03" + + "\x02\x02\x02\u02D0\u02CE\x03\x02\x02\x02\u02D0\u02D1\x03\x02\x02\x02\u02D1" + + "\u02D3\x03\x02\x02\x02\u02D2\u02D0\x03\x02\x02\x02\u02D3\u02D4\x07@\x02" + + "\x02\u02D4\u02D5\x07\x1D\x02\x02\u02D5\u02D6\x05.\x18\x02\u02D6\u02D8" + + "\x03\x02\x02\x02\u02D7\u02C6\x03\x02\x02\x02\u02D7\u02CA\x03\x02\x02\x02" + + "\u02D8;\x03\x02\x02\x02\u02D9\u02DA\x07?\x02\x02\u02DA\u02DB\x07?\x02" + + "\x02\u02DB\u02DE\x05@!\x02\u02DC\u02DD\x07\n\x02\x02\u02DD\u02DF\x05@" + + "!\x02\u02DE\u02DC\x03\x02\x02\x02\u02DF\u02E0\x03\x02\x02\x02\u02E0\u02DE" + + "\x03\x02\x02\x02\u02E0\u02E1\x03\x02\x02\x02\u02E1\u02E2\x03\x02\x02\x02" + + "\u02E2\u02E3\x07@\x02\x02\u02E3\u02E4\x07@\x02\x02\u02E4\u02E5\x07\x1D" + + "\x02\x02\u02E5\u02E6\x05.\x18\x02\u02E6=\x03\x02\x02\x02\u02E7\u02EA\x07" + + "\'\x02\x02\u02E8\u02EA\x05R*\x02\u02E9\u02E7\x03\x02\x02\x02\u02E9\u02E8" + + "\x03\x02\x02\x02\u02EA?\x03\x02\x02\x02\u02EB\u02EC\x05> \x02\u02ECA\x03" + + "\x02\x02\x02\u02ED\u02EE\x05> \x02\u02EE\u02EF\x07\x07\x02\x02\u02EF\u02F0" + + "\x05&\x14\x02\u02F0C\x03\x02\x02\x02\u02F1\u02F4\x075\x02\x02\u02F2\u02F4" + + "\x05R*\x02\u02F3\u02F1\x03\x02\x02\x02\u02F3\u02F2\x03\x02\x02\x02\u02F4" + + "E\x03\x02\x02\x02\u02F5\u02FA\x05.\x18\x02\u02F6\u02F7\x07\n\x02\x02\u02F7" + + "\u02F9\x05.\x18\x02\u02F8\u02F6\x03\x02\x02\x02\u02F9\u02FC\x03\x02\x02" + + "\x02\u02FA\u02F8\x03\x02\x02\x02\u02FA\u02FB\x03\x02\x02\x02\u02FBG\x03" + + "\x02\x02\x02\u02FC\u02FA\x03\x02\x02\x02\u02FD\u02FE\x05T+\x02\u02FE\u02FF" + + "\x07\x07\x02\x02\u02FF\u0300\x05.\x18\x02\u0300\u0304\x03\x02\x02\x02" + + "\u0301\u0302\x07(\x02\x02\u0302\u0304\x05.\x18\x02\u0303\u02FD\x03\x02" + + "\x02\x02\u0303\u0301\x03\x02\x02\x02\u0304I\x03\x02\x02\x02\u0305\u0308" + + "\x05R*\x02\u0306\u0308\t\x05\x02\x02\u0307\u0305\x03\x02\x02\x02\u0307" + + "\u0306\x03\x02\x02\x02\u0308K\x03\x02\x02\x02\u0309\u030C\x05R*\x02\u030A" + + "\u030C\t\x06\x02\x02\u030B\u0309\x03\x02\x02\x02\u030B\u030A\x03\x02\x02" + + "\x02\u030CM\x03\x02\x02\x02\u030D\u030E\t\x07\x02\x02\u030EO\x03\x02\x02" + + "\x02\u030F\u0310\t\b\x02\x02\u0310Q\x03\x02\x02\x02\u0311\u0316\x05V," + + "\x02\u0312\u0313\x07)\x02\x02\u0313\u0315\x05V,\x02\u0314\u0312\x03\x02" + + "\x02\x02\u0315\u0318\x03\x02\x02\x02\u0316\u0314\x03\x02\x02\x02\u0316" + + "\u0317\x03\x02\x02\x02\u0317S\x03\x02\x02\x02\u0318\u0316\x03\x02\x02" + + "\x02\u0319\u031E\x05V,\x02\u031A\u031B\x05R*\x02\u031B\u031C\b+\x01\x02" + + "\u031C\u031E\x03\x02\x02\x02\u031D\u0319\x03\x02\x02\x02\u031D\u031A\x03" + + "\x02\x02\x02\u031EU\x03\x02\x02\x02\u031F\u0320\t\t\x02\x02\u0320W\x03" + + "\x02\x02\x02Z[bks\x8C\x96\x9E\xA1\xAB\xAE\xB1\xB5\xB9\xBC\xBE\xCC\xD5" + + "\xDA\xDD\xE4\xEC\xF2\xF7\u0102\u010A\u0110\u0114\u0116\u0121\u0123\u0132" + + "\u013A\u0149\u0151\u0153\u0164\u0167\u016A\u0181\u0185\u018B\u0197\u01A6" + + "\u01AB\u01AD\u01BD\u01C3\u01C7\u01D0\u01E2\u01E6\u01F1\u01F5\u0201\u0205" + + "\u0210\u0214\u021C\u0226\u022A\u0234\u0238\u0242\u0245\u0248\u0261\u0288" + + "\u028B\u0292\u0294\u029B\u02A2\u02A9\u02B2\u02B5\u02C0\u02C4\u02D0\u02D7" + + "\u02E0\u02E9\u02F3\u02FA\u0303\u0307\u030B\u0316\u031D"; public static readonly _serializedATN: string = Utils.join( [ QuintParser._serializedATNSegment0, @@ -4276,13 +4306,14 @@ export class VarContext extends DeclarationContext { } } export class AssumeContext extends DeclarationContext { - public identOrHole(): IdentOrHoleContext { - return this.getRuleContext(0, IdentOrHoleContext); - } + public _assumeName!: IdentOrHoleContext; public ASGN(): TerminalNode { return this.getToken(QuintParser.ASGN, 0); } public expr(): ExprContext { return this.getRuleContext(0, ExprContext); } + public identOrHole(): IdentOrHoleContext | undefined { + return this.tryGetRuleContext(0, IdentOrHoleContext); + } constructor(ctx: DeclarationContext) { super(ctx.parent, ctx.invokingState); this.copyFrom(ctx); @@ -4456,27 +4487,86 @@ export class ExportDefContext extends DeclarationContext { export class OperDefContext extends ParserRuleContext { + constructor(parent: ParserRuleContext | undefined, invokingState: number) { + super(parent, invokingState); + } + // @Override + public get ruleIndex(): number { return QuintParser.RULE_operDef; } + public copyFrom(ctx: OperDefContext): void { + super.copyFrom(ctx); + } +} +export class AnnotatedOperDefContext extends OperDefContext { + public _annotatedParameter!: AnnotatedParameterContext; + public _annotOperParam: AnnotatedParameterContext[] = []; public qualifier(): QualifierContext { return this.getRuleContext(0, QualifierContext); } public normalCallName(): NormalCallNameContext { return this.getRuleContext(0, NormalCallNameContext); } - public LPAREN(): TerminalNode | undefined { return this.tryGetToken(QuintParser.LPAREN, 0); } - public RPAREN(): TerminalNode | undefined { return this.tryGetToken(QuintParser.RPAREN, 0); } - public type(): TypeContext[]; - public type(i: number): TypeContext; - public type(i?: number): TypeContext | TypeContext[] { + public LPAREN(): TerminalNode { return this.getToken(QuintParser.LPAREN, 0); } + public RPAREN(): TerminalNode { return this.getToken(QuintParser.RPAREN, 0); } + public type(): TypeContext { + return this.getRuleContext(0, TypeContext); + } + public annotatedParameter(): AnnotatedParameterContext[]; + public annotatedParameter(i: number): AnnotatedParameterContext; + public annotatedParameter(i?: number): AnnotatedParameterContext | AnnotatedParameterContext[] { if (i === undefined) { - return this.getRuleContexts(TypeContext); + return this.getRuleContexts(AnnotatedParameterContext); } else { - return this.getRuleContext(i, TypeContext); + return this.getRuleContext(i, AnnotatedParameterContext); + } + } + public ASGN(): TerminalNode | undefined { return this.tryGetToken(QuintParser.ASGN, 0); } + public expr(): ExprContext | undefined { + return this.tryGetRuleContext(0, ExprContext); + } + constructor(ctx: OperDefContext) { + super(ctx.parent, ctx.invokingState); + this.copyFrom(ctx); + } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterAnnotatedOperDef) { + listener.enterAnnotatedOperDef(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitAnnotatedOperDef) { + listener.exitAnnotatedOperDef(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitAnnotatedOperDef) { + return visitor.visitAnnotatedOperDef(this); + } else { + return visitor.visitChildren(this); } } +} +export class DeprecatedOperDefContext extends OperDefContext { + public _parameter!: ParameterContext; + public _operParam: ParameterContext[] = []; + public _annotatedRetType!: TypeContext; + public qualifier(): QualifierContext { + return this.getRuleContext(0, QualifierContext); + } + public normalCallName(): NormalCallNameContext { + return this.getRuleContext(0, NormalCallNameContext); + } + public LPAREN(): TerminalNode | undefined { return this.tryGetToken(QuintParser.LPAREN, 0); } + public RPAREN(): TerminalNode | undefined { return this.tryGetToken(QuintParser.RPAREN, 0); } public ASGN(): TerminalNode | undefined { return this.tryGetToken(QuintParser.ASGN, 0); } public expr(): ExprContext | undefined { return this.tryGetRuleContext(0, ExprContext); } + public type(): TypeContext | undefined { + return this.tryGetRuleContext(0, TypeContext); + } public parameter(): ParameterContext[]; public parameter(i: number): ParameterContext; public parameter(i?: number): ParameterContext | ParameterContext[] { @@ -4486,27 +4576,26 @@ export class OperDefContext extends ParserRuleContext { return this.getRuleContext(i, ParameterContext); } } - constructor(parent: ParserRuleContext | undefined, invokingState: number) { - super(parent, invokingState); + constructor(ctx: OperDefContext) { + super(ctx.parent, ctx.invokingState); + this.copyFrom(ctx); } // @Override - public get ruleIndex(): number { return QuintParser.RULE_operDef; } - // @Override public enterRule(listener: QuintListener): void { - if (listener.enterOperDef) { - listener.enterOperDef(this); + if (listener.enterDeprecatedOperDef) { + listener.enterDeprecatedOperDef(this); } } // @Override public exitRule(listener: QuintListener): void { - if (listener.exitOperDef) { - listener.exitOperDef(this); + if (listener.exitDeprecatedOperDef) { + listener.exitDeprecatedOperDef(this); } } // @Override public accept(visitor: QuintVisitor): Result { - if (visitor.visitOperDef) { - return visitor.visitOperDef(this); + if (visitor.visitDeprecatedOperDef) { + return visitor.visitDeprecatedOperDef(this); } else { return visitor.visitChildren(this); } @@ -6997,6 +7086,7 @@ export class IdentOrHoleContext extends ParserRuleContext { export class ParameterContext extends ParserRuleContext { + public _paramName!: IdentOrHoleContext; public identOrHole(): IdentOrHoleContext { return this.getRuleContext(0, IdentOrHoleContext); } @@ -7028,6 +7118,42 @@ export class ParameterContext extends ParserRuleContext { } +export class AnnotatedParameterContext extends ParserRuleContext { + public _paramName!: IdentOrHoleContext; + public type(): TypeContext { + return this.getRuleContext(0, TypeContext); + } + public identOrHole(): IdentOrHoleContext { + return this.getRuleContext(0, IdentOrHoleContext); + } + constructor(parent: ParserRuleContext | undefined, invokingState: number) { + super(parent, invokingState); + } + // @Override + public get ruleIndex(): number { return QuintParser.RULE_annotatedParameter; } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterAnnotatedParameter) { + listener.enterAnnotatedParameter(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitAnnotatedParameter) { + listener.exitAnnotatedParameter(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitAnnotatedParameter) { + return visitor.visitAnnotatedParameter(this); + } else { + return visitor.visitChildren(this); + } + } +} + + export class IdentOrStarContext extends ParserRuleContext { public MUL(): TerminalNode | undefined { return this.tryGetToken(QuintParser.MUL, 0); } public qualId(): QualIdContext | undefined { diff --git a/quint/src/generated/QuintVisitor.ts b/quint/src/generated/QuintVisitor.ts index 4d01a74d9..7b5cc3ea0 100644 --- a/quint/src/generated/QuintVisitor.ts +++ b/quint/src/generated/QuintVisitor.ts @@ -55,6 +55,8 @@ import { LetInContext } from "./QuintParser"; import { NondetContext } from "./QuintParser"; import { ParenContext } from "./QuintParser"; import { BracesContext } from "./QuintParser"; +import { AnnotatedOperDefContext } from "./QuintParser"; +import { DeprecatedOperDefContext } from "./QuintParser"; import { ConstContext } from "./QuintParser"; import { VarContext } from "./QuintParser"; import { AssumeContext } from "./QuintParser"; @@ -95,6 +97,7 @@ import { LambdaUnsugaredContext } from "./QuintParser"; import { LambdaTupleSugarContext } from "./QuintParser"; import { IdentOrHoleContext } from "./QuintParser"; import { ParameterContext } from "./QuintParser"; +import { AnnotatedParameterContext } from "./QuintParser"; import { IdentOrStarContext } from "./QuintParser"; import { ArgListContext } from "./QuintParser"; import { RecElemContext } from "./QuintParser"; @@ -483,6 +486,22 @@ export interface QuintVisitor extends ParseTreeVisitor { */ visitBraces?: (ctx: BracesContext) => Result; + /** + * Visit a parse tree produced by the `annotatedOperDef` + * labeled alternative in `QuintParser.operDef`. + * @param ctx the parse tree + * @return the visitor result + */ + visitAnnotatedOperDef?: (ctx: AnnotatedOperDefContext) => Result; + + /** + * Visit a parse tree produced by the `deprecatedOperDef` + * labeled alternative in `QuintParser.operDef`. + * @param ctx the parse tree + * @return the visitor result + */ + visitDeprecatedOperDef?: (ctx: DeprecatedOperDefContext) => Result; + /** * Visit a parse tree produced by the `const` * labeled alternative in `QuintParser.declaration`. @@ -771,6 +790,13 @@ export interface QuintVisitor extends ParseTreeVisitor { */ visitParameter?: (ctx: ParameterContext) => Result; + /** + * Visit a parse tree produced by `QuintParser.annotatedParameter`. + * @param ctx the parse tree + * @return the visitor result + */ + visitAnnotatedParameter?: (ctx: AnnotatedParameterContext) => Result; + /** * Visit a parse tree produced by `QuintParser.identOrStar`. * @param ctx the parse tree diff --git a/quint/src/ir/quintIr.ts b/quint/src/ir/quintIr.ts index b9e148e52..0b0bb2bd3 100644 --- a/quint/src/ir/quintIr.ts +++ b/quint/src/ir/quintIr.ts @@ -218,7 +218,7 @@ export const builtinOpCodes = [ export type QuintBuiltinOpcode = (typeof builtinOpCodes)[number] -export interface QuintLambdaParameter extends WithId { +export interface QuintLambdaParameter extends WithId, WithOptionalTypeAnnotation { /** The name of the formal parameter */ name: string } diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index 56053b2e1..7bb1d3bd2 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -16,6 +16,7 @@ import { QuintName, QuintOpDef, QuintStr, + isAnnotatedDef, } from '../ir/quintIr' import { ConcreteFixedRow, @@ -39,7 +40,7 @@ import { zip } from '../util' import { QuintError } from '../quintError' import { lowercaseTypeError, tooManySpreadsError } from './parseErrors' import { Loc } from '../ErrorMessage' -import { fail } from 'assert' +import assert, { fail } from 'assert' /** * An ANTLR4 listener that constructs QuintIr objects out of the abstract @@ -85,8 +86,6 @@ export class ToIrListener implements QuintListener { protected exprStack: QuintEx[] = [] // the stack of parameter lists protected paramStack: QuintLambdaParameter[] = [] - // stack of names used as parameters and assumptions - protected identOrHoleStack: string[] = [] // the stack for imported names protected identOrStarStack: string[] = [] // the stack of rows for records @@ -220,10 +219,47 @@ export class ToIrListener implements QuintListener { /** **************** translate operator definititons **********************/ // translate a top-level or nested operator definition - exitOperDef(ctx: p.OperDefContext) { + exitAnnotatedOperDef(ctx: p.AnnotatedOperDefContext) { const name = ctx.normalCallName().text - const [params, typeTag] = this.processOpDefParams(ctx) - // get the definition body + + const params = ctx._annotOperParam + .map(_ => popOrFail(this.paramStack, 'violated grammar of annotated AnnotatedOperDef')) + .reverse() + const res = this.popType().unwrap(() => 'violated grammar of annotated params return type') + const args = params.map(p => { + assert(isAnnotatedDef(p), 'violated grammar of annotated param type') + return p.typeAnnotation + }) + const typeAnnotation: QuintType = { kind: 'oper', args, res } + + this.putDeclarationOnStack(ctx, name, params, just(typeAnnotation)) + } + + // TODO Mark as deprecated, then remove + // See https://github.com/informalsystems/quint/issues/923 + exitDeprecatedOperDef(ctx: p.DeprecatedOperDefContext) { + const name = ctx.normalCallName().text + + // The deprecated annotation grammar + const typeAnnotation: Maybe = ctx._annotatedRetType ? this.popType() : none() + const params = ctx._operParam + .map(_ => popOrFail(this.paramStack, 'violated grammar of non-annotated params')) + .reverse() + // TODO Enable after builtins are fixed + // if (params.length > 0 && typeAnnotation.isJust()) { + // console.warn( + // 'post-operator-head annotations are deprecated; see https://github.com/informalsystems/quint/issues/923' + // ) + // } + this.putDeclarationOnStack(ctx, name, params, typeAnnotation) + } + + private putDeclarationOnStack( + ctx: p.DeprecatedOperDefContext | p.AnnotatedOperDefContext, + name: string, + params: QuintLambdaParameter[], + typeAnnotation: Maybe + ) { const expr: QuintEx = ctx.expr() ? this.exprStack.pop() ?? this.undefinedExpr(ctx)() : // This is only a definition header, use a default body since the IR @@ -236,7 +272,7 @@ export class ToIrListener implements QuintListener { const body: QuintEx = params.length === 0 ? expr - : // if the definition has parameters, introduce a lambda + : // If the definition has parameters, introduce a lambda { id: this.getId(ctx), kind: 'lambda', params, qualifier, expr } const def: QuintOpDef = { @@ -246,42 +282,16 @@ export class ToIrListener implements QuintListener { qualifier, expr: body, } - if (typeTag.isJust()) { - def.typeAnnotation = typeTag.value + if (typeAnnotation.isJust()) { + def.typeAnnotation = typeAnnotation.value } this.declarationStack.push(def) } - // The definition parameters may be of two kinds: C-like and ML-like. - // Handle them here. - processOpDefParams(ctx: p.OperDefContext): [QuintLambdaParameter[], Maybe] { - const params = popMany(this.paramStack, ctx.parameter().length, this.undefinedParam(ctx)) - // types of the parameters and of the result - const ntypes = ctx.type().length - if (ntypes === 0) { - return [params, none()] - } else if (ntypes > 1) { - // a C-like signature, combine it into an operator type - const types = popMany(this.typeStack, ntypes, this.undefinedType(ctx)) - const id = this.getId(ctx) - const fullType: Maybe = just({ - id, - kind: 'oper', - args: types.slice(0, -1), - res: types[types.length - 1], - }) - return [params, fullType] - } else { - // the only type is on the stack - const fullType = this.popType() - return [params, fullType] - } - } - // assume name = expr - exitAssume(ctx: any) { + exitAssume(ctx: p.AssumeContext) { const expr = this.exprStack.pop()! - const name = this.identOrHoleStack.pop()! + const name = ctx._assumeName.text const id = this.getId(ctx) const assume: QuintDef = { id, @@ -725,24 +735,22 @@ export class ToIrListener implements QuintListener { this.exprStack.push(untupledLambda) } - // a single parameter in a lambda expression: an identifier or '_' - exitIdentOrHole(ctx: p.IdentOrHoleContext) { - if (ctx.text === '_') { - // a hole '_' - this.identOrHoleStack.push('_') - } else { - // a variable name - this.identOrHoleStack.push(ctx.qualId()!.text) - } - } - exitParameter(ctx: p.ParameterContext) { - const name = popMany(this.identOrHoleStack, 1, () => '_')[0] - + const name = ctx._paramName.text const id = this.getId(ctx) this.paramStack.push({ id, name }) } + // TODO Consolidate with `exitParameter`, see https://github.com/informalsystems/quint/issues/923 + exitAnnotatedParameter(ctx: p.AnnotatedParameterContext) { + const name = ctx._paramName.text + const id = this.getId(ctx) + const typeAnnotation = this.popType().unwrap(() => + fail('internal error: the grammar guarantees a type should be on the stack') + ) + this.paramStack.push({ id, name, typeAnnotation }) + } + // an identifier or star '*' in import exitIdentOrStar(ctx: p.IdentOrStarContext) { if (ctx.text === '*') { @@ -1222,6 +1230,7 @@ export class ToIrListener implements QuintListener { } // pop a type + // XXX private popType(): Maybe { // the user has specified a type const tp = this.typeStack.pop() @@ -1353,3 +1362,11 @@ function unitValue(id: bigint): QuintBuiltinApp { args: [], } } + +function popOrFail(stack: T[], msg: string): T { + const x = stack.pop() + if (typeof x === 'undefined') { + fail(`internal error: violated grammar guarantee ${msg}`) + } + return x +} diff --git a/quint/test/ir/IRFinder.test.ts b/quint/test/ir/IRFinder.test.ts index e62a76d3d..312e3077c 100644 --- a/quint/test/ir/IRFinder.test.ts +++ b/quint/test/ir/IRFinder.test.ts @@ -64,12 +64,15 @@ describe('findParameterWithId', () => { const modules = [buildModuleWithDecls(['pure def x(a: int): int = a'])] it('finds definition for existing id', () => { - const def = findParameterWithId(modules, 1n) - + const def = findParameterWithId(modules, 2n) assert.isDefined(def) assert.deepEqual(def, { - id: 1n, + id: 2n, name: 'a', + typeAnnotation: { + id: 1n, + kind: 'int', + }, }) }) diff --git a/quint/test/types/inferrer.test.ts b/quint/test/types/inferrer.test.ts index 6c7970584..246adbc49 100644 --- a/quint/test/types/inferrer.test.ts +++ b/quint/test/types/inferrer.test.ts @@ -360,14 +360,14 @@ module B { const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) // _printUpdatedStringTypes(stringTypes) assert.sameDeepMembers(stringTypes, [ - [1n, '(int -> str)'], + [4n, '(int -> str)'], [6n, '(int -> str)'], [7n, 'Set[int]'], [8n, 'Set[int]'], [9n, 'int'], [10n, 'int'], + [11n, '((int -> str)) => int'], [12n, '((int -> str)) => int'], - [13n, '((int -> str)) => int'], ]) }) diff --git a/quint/testFixture/SuperSpec.json b/quint/testFixture/SuperSpec.json index ae6f5ec08..49d90a0d9 100644 --- a/quint/testFixture/SuperSpec.json +++ b/quint/testFixture/SuperSpec.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":524,"name":"withConsts","declarations":[{"id":100,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":99,"kind":"app","opcode":"isub","args":[{"id":97,"kind":"int","value":1},{"id":98,"kind":"int","value":2}]}},{"id":104,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":103,"kind":"app","opcode":"imul","args":[{"id":101,"kind":"int","value":2},{"id":102,"kind":"int","value":3}]}},{"id":108,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":107,"kind":"app","opcode":"idiv","args":[{"id":105,"kind":"int","value":2},{"id":106,"kind":"int","value":3}]}},{"id":112,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":111,"kind":"app","opcode":"imod","args":[{"id":109,"kind":"int","value":2},{"id":110,"kind":"int","value":3}]}},{"id":116,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":115,"kind":"app","opcode":"ipow","args":[{"id":113,"kind":"int","value":2},{"id":114,"kind":"int","value":3}]}},{"id":119,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":118,"kind":"app","opcode":"iuminus","args":[{"id":117,"kind":"int","value":100}]}},{"id":123,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":122,"kind":"app","opcode":"igt","args":[{"id":120,"kind":"int","value":2},{"id":121,"kind":"int","value":3}]}},{"id":127,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":126,"kind":"app","opcode":"igte","args":[{"id":124,"kind":"int","value":2},{"id":125,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},{"id":131,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":130,"kind":"app","opcode":"ilt","args":[{"id":128,"kind":"int","value":2},{"id":129,"kind":"int","value":3}]}},{"id":135,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":134,"kind":"app","opcode":"ilte","args":[{"id":132,"kind":"int","value":2},{"id":133,"kind":"int","value":3}]}},{"id":139,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":138,"kind":"app","opcode":"eq","args":[{"id":136,"kind":"int","value":2},{"id":137,"kind":"int","value":3}]}},{"id":143,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":142,"kind":"app","opcode":"neq","args":[{"id":140,"kind":"int","value":2},{"id":141,"kind":"int","value":3}]}},{"id":149,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":148,"kind":"app","opcode":"eq","args":[{"id":146,"kind":"app","opcode":"iadd","args":[{"id":144,"kind":"int","value":2},{"id":145,"kind":"int","value":2}]},{"id":147,"kind":"int","value":4}]}},{"id":153,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":152,"kind":"app","opcode":"in","args":[{"id":150,"kind":"int","value":1},{"id":151,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},{"id":165,"kind":"def","name":"withType","qualifier":"val","expr":{"id":164,"kind":"app","opcode":"Set","args":[{"id":162,"kind":"int","value":1},{"id":163,"kind":"int","value":2}]},"typeAnnotation":{"id":161,"kind":"set","elem":{"id":160,"kind":"int"}}},{"id":166,"kind":"typedef","name":"PROC"},{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},{"id":174,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":173,"kind":"int","value":42}},{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},{"kind":"var","name":"k","typeAnnotation":{"id":217,"kind":"int"},"id":218},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22},{"id":240,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":239,"kind":"app","opcode":"and","args":[{"id":237,"kind":"bool","value":false},{"id":238,"kind":"bool","value":true}]}},{"id":244,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":243,"kind":"app","opcode":"or","args":[{"id":241,"kind":"bool","value":false},{"id":242,"kind":"bool","value":true}]}},{"id":248,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":247,"kind":"app","opcode":"implies","args":[{"id":245,"kind":"bool","value":false},{"id":246,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26},{"id":281,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":280,"kind":"app","opcode":"and","args":[{"id":277,"kind":"bool","value":false},{"id":278,"kind":"bool","value":true},{"id":279,"kind":"bool","value":false}]}},{"id":286,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":285,"kind":"app","opcode":"actionAll","args":[{"id":282,"kind":"bool","value":false},{"id":283,"kind":"bool","value":true},{"id":284,"kind":"bool","value":false}]}},{"id":291,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":290,"kind":"app","opcode":"or","args":[{"id":287,"kind":"bool","value":false},{"id":288,"kind":"bool","value":true},{"id":289,"kind":"bool","value":false}]}},{"id":296,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":295,"kind":"app","opcode":"actionAny","args":[{"id":292,"kind":"bool","value":false},{"id":293,"kind":"bool","value":true},{"id":294,"kind":"bool","value":false}]}},{"id":301,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":300,"kind":"app","opcode":"ite","args":[{"id":297,"kind":"bool","value":true},{"id":298,"kind":"int","value":1},{"id":299,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319},{"kind":"const","name":"MyFunFun","typeAnnotation":{"id":31,"kind":"fun","arg":{"id":29,"kind":"fun","arg":{"id":27,"kind":"int"},"res":{"id":28,"kind":"str"}},"res":{"id":30,"kind":"bool"}},"id":32},{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}}},{"id":340,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":339,"kind":"app","opcode":"in","args":[{"id":337,"kind":"int","value":1},{"id":338,"kind":"app","opcode":"Set","args":[]}]}},{"kind":"const","name":"MyOperator","typeAnnotation":{"id":36,"kind":"oper","args":[{"id":33,"kind":"int"},{"id":34,"kind":"str"}],"res":{"id":35,"kind":"bool"}},"id":37},{"id":405,"kind":"def","name":"one","qualifier":"val","expr":{"id":404,"kind":"app","opcode":"head","args":[{"id":403,"kind":"app","opcode":"List","args":[{"id":401,"kind":"int","value":1},{"id":402,"kind":"int","value":2}]}]}},{"id":410,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":409,"kind":"app","opcode":"Tup","args":[{"id":406,"kind":"int","value":1},{"id":407,"kind":"int","value":2},{"id":408,"kind":"int","value":3}]}},{"id":415,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":414,"kind":"app","opcode":"Tup","args":[{"id":411,"kind":"int","value":1},{"id":412,"kind":"int","value":2},{"id":413,"kind":"int","value":3}]}},{"id":419,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":418,"kind":"app","opcode":"Tup","args":[{"id":416,"kind":"int","value":4},{"id":417,"kind":"int","value":5}]}},{"kind":"const","name":"MyOperatorWithComma","typeAnnotation":{"id":41,"kind":"oper","args":[{"id":38,"kind":"int"},{"id":39,"kind":"str"}],"res":{"id":40,"kind":"bool"}},"id":42},{"id":424,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":423,"kind":"app","opcode":"List","args":[{"id":420,"kind":"int","value":1},{"id":421,"kind":"int","value":2},{"id":422,"kind":"int","value":3}]}},{"id":429,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"List","args":[{"id":425,"kind":"int","value":1},{"id":426,"kind":"int","value":2},{"id":427,"kind":"int","value":3}]}},{"id":436,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":435,"kind":"app","opcode":"nth","args":[{"id":433,"kind":"app","opcode":"List","args":[{"id":430,"kind":"int","value":2},{"id":431,"kind":"int","value":3},{"id":432,"kind":"int","value":4}]},{"id":434,"kind":"int","value":2}]}},{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]}},{"id":448,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Rec","args":[{"id":443,"kind":"str","value":"name"},{"id":444,"kind":"str","value":"igor"},{"id":445,"kind":"str","value":"year"},{"id":446,"kind":"int","value":1981}]}},{"id":461,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":460,"kind":"app","opcode":"Set","args":[{"id":457,"kind":"int","value":1},{"id":458,"kind":"int","value":2},{"id":459,"kind":"int","value":3}]}},{"kind":"const","name":"MyTuple","typeAnnotation":{"id":46,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":43,"kind":"int"}},{"fieldName":"1","fieldType":{"id":44,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":45,"kind":"str"}}],"other":{"kind":"empty"}}},"id":47},{"id":491,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":490,"kind":"app","opcode":"in","args":[{"id":488,"kind":"int","value":2},{"id":489,"kind":"app","opcode":"Set","args":[]}]}},{"id":495,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":494,"kind":"app","opcode":"subseteq","args":[{"id":492,"kind":"app","opcode":"Set","args":[]},{"id":493,"kind":"app","opcode":"Set","args":[]}]}},{"id":504,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":503,"kind":"app","opcode":"in","args":[{"id":497,"kind":"app","opcode":"Set","args":[{"id":496,"kind":"int","value":1}]},{"id":502,"kind":"app","opcode":"powerset","args":[{"id":501,"kind":"app","opcode":"Set","args":[{"id":498,"kind":"int","value":1},{"id":499,"kind":"int","value":2},{"id":500,"kind":"int","value":3}]}]}]}},{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}}},{"id":518,"kind":"typedef","name":"UNINTERPRETED_TYPE"},{"kind":"const","name":"MyTupleWithComma","typeAnnotation":{"id":51,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":48,"kind":"int"}},{"fieldName":"1","fieldType":{"id":49,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":50,"kind":"str"}}],"other":{"kind":"empty"}}},"id":52},{"kind":"const","name":"MyRecord","typeAnnotation":{"id":56,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":53,"kind":"int"}},{"fieldName":"b","fieldType":{"id":54,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":55,"kind":"str"}}],"other":{"kind":"empty"}}},"id":57},{"kind":"const","name":"MyRecordWithComma","typeAnnotation":{"id":61,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":58,"kind":"int"}},{"fieldName":"b","fieldType":{"id":59,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":60,"kind":"str"}}],"other":{"kind":"empty"}}},"id":62},{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},{"kind":"var","name":"i","typeAnnotation":{"id":89,"kind":"int"},"id":90},{"kind":"var","name":"j","typeAnnotation":{"id":91,"kind":"bool"},"id":92},{"id":96,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":95,"kind":"app","opcode":"iadd","args":[{"id":93,"kind":"int","value":1},{"id":94,"kind":"int","value":2}]}},{"id":159,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":158,"kind":"app","opcode":"exists","args":[{"id":154,"kind":"name","name":"Bool"},{"id":157,"kind":"lambda","params":[{"id":155,"name":"x"}],"qualifier":"def","expr":{"id":156,"kind":"name","name":"x"}}]}},{"id":170,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":169,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":168,"kind":"set","elem":{"id":167,"kind":"const","name":"PROC"}}},{"id":181,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":180,"kind":"lambda","params":[{"id":175,"name":"x"},{"id":176,"name":"y"}],"qualifier":"puredef","expr":{"id":179,"kind":"app","opcode":"iadd","args":[{"id":177,"kind":"name","name":"x"},{"id":178,"kind":"name","name":"y"}]}}},{"id":187,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":186,"kind":"lambda","params":[{"id":182,"name":"factor"}],"qualifier":"def","expr":{"id":185,"kind":"app","opcode":"imul","args":[{"id":183,"kind":"name","name":"factor"},{"id":184,"kind":"name","name":"n"}]}}},{"id":193,"kind":"def","name":"A","qualifier":"action","expr":{"id":192,"kind":"lambda","params":[{"id":188,"name":"x"}],"qualifier":"action","expr":{"id":191,"kind":"app","opcode":"assign","args":[{"id":190,"kind":"name","name":"n"},{"id":189,"kind":"name","name":"x"}]}}},{"id":198,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":197,"kind":"lambda","params":[{"id":194,"name":"x"}],"qualifier":"puredef","expr":{"id":196,"kind":"app","opcode":"not","args":[{"id":195,"kind":"name","name":"x"}]}}},{"id":209,"kind":"def","name":"H","qualifier":"def","expr":{"id":208,"kind":"lambda","params":[{"id":199,"name":"x"},{"id":200,"name":"y"}],"qualifier":"def","expr":{"id":207,"kind":"app","opcode":"iadd","args":[{"id":205,"kind":"name","name":"x"},{"id":206,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":204,"kind":"oper","args":[{"id":201,"kind":"int"},{"id":202,"kind":"int"}],"res":{"id":203,"kind":"int"}}},{"id":216,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":215,"kind":"lambda","params":[{"id":210,"name":"x"}],"qualifier":"def","expr":{"id":214,"kind":"name","name":"x"}},"typeAnnotation":{"id":213,"kind":"oper","args":[{"id":211,"kind":"var","name":"a"}],"res":{"id":212,"kind":"var","name":"a"}}},{"id":222,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":221,"kind":"app","opcode":"assign","args":[{"id":220,"kind":"name","name":"k"},{"id":219,"kind":"int","value":3}]}},{"id":236,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":235,"kind":"lambda","params":[{"id":223,"name":"x"},{"id":225,"name":"y"}],"qualifier":"puredef","expr":{"id":233,"kind":"app","opcode":"ite","args":[{"id":230,"kind":"app","opcode":"ilt","args":[{"id":228,"kind":"name","name":"x"},{"id":229,"kind":"name","name":"y"}]},{"id":231,"kind":"name","name":"x"},{"id":232,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":234,"kind":"oper","args":[{"id":224,"kind":"int"},{"id":226,"kind":"int"}],"res":{"id":227,"kind":"int"}}},{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}}},{"id":315,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":314,"kind":"lambda","params":[{"id":302,"name":"x"},{"id":303,"name":"y"}],"qualifier":"def","expr":{"id":313,"kind":"app","opcode":"ite","args":[{"id":306,"kind":"app","opcode":"ilt","args":[{"id":304,"kind":"name","name":"x"},{"id":305,"kind":"int","value":10}]},{"id":309,"kind":"app","opcode":"iadd","args":[{"id":307,"kind":"name","name":"y"},{"id":308,"kind":"int","value":5}]},{"id":312,"kind":"app","opcode":"imod","args":[{"id":310,"kind":"name","name":"y"},{"id":311,"kind":"int","value":5}]}]}}},{"id":323,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"get","args":[{"id":320,"kind":"name","name":"f1"},{"id":321,"kind":"str","value":"a"}]}},{"id":332,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":331,"kind":"app","opcode":"MyOper","args":[{"id":329,"kind":"str","value":"a"},{"id":330,"kind":"int","value":42}]}},{"id":336,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":335,"kind":"app","opcode":"MyOper","args":[{"id":333,"kind":"str","value":"a"},{"id":334,"kind":"int","value":42}]}},{"id":348,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":347,"kind":"app","opcode":"filter","args":[{"id":341,"kind":"name","name":"S"},{"id":346,"kind":"lambda","params":[{"id":342,"name":"x"}],"qualifier":"def","expr":{"id":345,"kind":"app","opcode":"igt","args":[{"id":343,"kind":"name","name":"x"},{"id":344,"kind":"int","value":10}]}}]}},{"id":386,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":385,"kind":"app","opcode":"filter","args":[{"id":381,"kind":"name","name":"S"},{"id":384,"kind":"lambda","params":[{"id":382,"name":"_"}],"qualifier":"def","expr":{"id":383,"kind":"bool","value":true}}]}},{"id":394,"kind":"def","name":"f","qualifier":"val","expr":{"id":393,"kind":"app","opcode":"mapBy","args":[{"id":387,"kind":"name","name":"S"},{"id":392,"kind":"lambda","params":[{"id":388,"name":"x"}],"qualifier":"def","expr":{"id":391,"kind":"app","opcode":"iadd","args":[{"id":389,"kind":"name","name":"x"},{"id":390,"kind":"int","value":1}]}}]}},{"id":400,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":399,"kind":"app","opcode":"exclude","args":[{"id":395,"kind":"name","name":"S"},{"id":398,"kind":"app","opcode":"Set","args":[{"id":396,"kind":"int","value":3},{"id":397,"kind":"int","value":4}]}]}},{"id":456,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":455,"kind":"app","opcode":"with","args":[{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"name","name":"test_record"},{"id":450,"kind":"str","value":"name"},{"id":449,"kind":"str","value":"quint"}]},{"id":452,"kind":"str","value":"year"},{"id":451,"kind":"int","value":2023}]}},{"id":472,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":471,"kind":"let","opdef":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]}},"expr":{"id":470,"kind":"app","opcode":"field","args":[{"id":468,"kind":"name","name":"my_rec"},{"id":469,"kind":"str","value":"a"}]}}},{"id":481,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":480,"kind":"let","opdef":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]}},"expr":{"id":479,"kind":"app","opcode":"item","args":[{"id":477,"kind":"name","name":"my_tup"},{"id":478,"kind":"int","value":2}]}}},{"id":487,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":486,"kind":"lambda","params":[{"id":482,"name":"s"}],"qualifier":"def","expr":{"id":485,"kind":"app","opcode":"eq","args":[{"id":483,"kind":"name","name":"s"},{"id":484,"kind":"app","opcode":"List","args":[]}]}}},{"id":508,"kind":"assume","name":"positive","assumption":{"id":507,"kind":"app","opcode":"igt","args":[{"id":505,"kind":"name","name":"N"},{"id":506,"kind":"int","value":0}]}},{"id":512,"kind":"assume","name":"_","assumption":{"id":511,"kind":"app","opcode":"neq","args":[{"id":509,"kind":"name","name":"N"},{"id":510,"kind":"int","value":0}]}},{"id":513,"kind":"import","defName":"foo","protoName":"M1"},{"id":514,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":519,"kind":"const","name":"INT_SET"},"id":520},{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},{"id":74,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":73,"kind":"lambda","params":[{"id":70,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":72,"kind":"app","opcode":"variant","args":[{"id":69,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":71}]}}},{"id":80,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":79,"kind":"lambda","params":[{"id":76,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":78,"kind":"app","opcode":"variant","args":[{"id":75,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":77}]}}},{"id":86,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":85,"kind":"lambda","params":[{"id":82,"name":"__DogParam"}],"qualifier":"def","expr":{"id":84,"kind":"app","opcode":"variant","args":[{"id":81,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":83}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":87,"kind":"const","name":"MyUnionType"},"id":88},{"id":260,"kind":"def","name":"G","qualifier":"def","expr":{"id":259,"kind":"lambda","params":[{"id":253,"name":"x"}],"qualifier":"def","expr":{"id":258,"kind":"app","opcode":"and","args":[{"id":255,"kind":"app","opcode":"F","args":[{"id":254,"kind":"name","name":"x"}]},{"id":257,"kind":"app","opcode":"not","args":[{"id":256,"kind":"name","name":"x"}]}]}}},{"id":268,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":267,"kind":"lambda","params":[{"id":261,"name":"x"}],"qualifier":"def","expr":{"id":266,"kind":"app","opcode":"and","args":[{"id":263,"kind":"app","opcode":"F","args":[{"id":262,"kind":"name","name":"x"}]},{"id":265,"kind":"app","opcode":"not","args":[{"id":264,"kind":"name","name":"x"}]}]}}},{"id":276,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":275,"kind":"lambda","params":[{"id":269,"name":"x"}],"qualifier":"def","expr":{"id":274,"kind":"app","opcode":"or","args":[{"id":271,"kind":"app","opcode":"F","args":[{"id":270,"kind":"name","name":"x"}]},{"id":273,"kind":"app","opcode":"not","args":[{"id":272,"kind":"name","name":"x"}]}]}}},{"id":368,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":367,"kind":"app","opcode":"map","args":[{"id":351,"kind":"app","opcode":"tuples","args":[{"id":349,"kind":"name","name":"S"},{"id":350,"kind":"name","name":"MySet"}]},{"id":366,"kind":"lambda","params":[{"id":357,"name":"quintTupledLambdaParam357"}],"qualifier":"def","expr":{"id":362,"kind":"let","opdef":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]}},"expr":{"id":358,"kind":"let","opdef":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]}},"expr":{"id":356,"kind":"app","opcode":"iadd","args":[{"id":354,"kind":"name","name":"s"},{"id":355,"kind":"name","name":"mys"}]}}}}]}},{"id":380,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":379,"kind":"let","opdef":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]}},"expr":{"id":378,"kind":"app","opcode":"actionAll","args":[{"id":374,"kind":"app","opcode":"igt","args":[{"id":372,"kind":"name","name":"x"},{"id":373,"kind":"int","value":10}]},{"id":377,"kind":"app","opcode":"assign","args":[{"id":376,"kind":"name","name":"k"},{"id":375,"kind":"name","name":"x"}]}]}}}]}],"table":{"68":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"71":{"id":70,"name":"__CircleParam","kind":"param"},"77":{"id":76,"name":"__RectangleParam","kind":"param"},"83":{"id":82,"name":"__DogParam","kind":"param"},"87":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"156":{"id":155,"name":"x","kind":"param"},"167":{"id":166,"kind":"typedef","name":"PROC"},"177":{"id":175,"name":"x","kind":"param"},"178":{"id":176,"name":"y","kind":"param"},"183":{"id":182,"name":"factor","kind":"param"},"184":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"189":{"id":188,"name":"x","kind":"param"},"190":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"195":{"id":194,"name":"x","kind":"param"},"205":{"id":199,"name":"x","kind":"param"},"206":{"id":200,"name":"y","kind":"param"},"214":{"id":210,"name":"x","kind":"param"},"220":{"kind":"var","name":"k","typeAnnotation":{"id":217,"kind":"int"},"id":218},"228":{"id":223,"name":"x","kind":"param"},"229":{"id":225,"name":"y","kind":"param"},"231":{"id":223,"name":"x","kind":"param"},"232":{"id":225,"name":"y","kind":"param"},"250":{"id":249,"name":"x","kind":"param"},"254":{"id":253,"name":"x","kind":"param"},"255":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"256":{"id":253,"name":"x","kind":"param"},"262":{"id":261,"name":"x","kind":"param"},"263":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"264":{"id":261,"name":"x","kind":"param"},"270":{"id":269,"name":"x","kind":"param"},"271":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"272":{"id":269,"name":"x","kind":"param"},"304":{"id":302,"name":"x","kind":"param"},"307":{"id":303,"name":"y","kind":"param"},"310":{"id":303,"name":"y","kind":"param"},"320":{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319},"331":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"335":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"341":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"343":{"id":342,"name":"x","kind":"param"},"349":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"350":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},"354":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]},"depth":1},"355":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]},"depth":1},"360":{"id":357,"name":"quintTupledLambdaParam357","kind":"param"},"364":{"id":357,"name":"quintTupledLambdaParam357","kind":"param"},"369":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"372":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"375":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"376":{"kind":"var","name":"k","typeAnnotation":{"id":217,"kind":"int"},"id":218},"381":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"387":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"389":{"id":388,"name":"x","kind":"param"},"395":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"453":{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]},"depth":0},"468":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]},"depth":1},"477":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]},"depth":1},"483":{"id":482,"name":"s","kind":"param"},"505":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"509":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"519":{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}}},"521":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"522":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":521,"importedFrom":{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":523,"name":"withConsts","declarations":[{"id":100,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":99,"kind":"app","opcode":"isub","args":[{"id":97,"kind":"int","value":1},{"id":98,"kind":"int","value":2}]}},{"id":104,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":103,"kind":"app","opcode":"imul","args":[{"id":101,"kind":"int","value":2},{"id":102,"kind":"int","value":3}]}},{"id":108,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":107,"kind":"app","opcode":"idiv","args":[{"id":105,"kind":"int","value":2},{"id":106,"kind":"int","value":3}]}},{"id":112,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":111,"kind":"app","opcode":"imod","args":[{"id":109,"kind":"int","value":2},{"id":110,"kind":"int","value":3}]}},{"id":116,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":115,"kind":"app","opcode":"ipow","args":[{"id":113,"kind":"int","value":2},{"id":114,"kind":"int","value":3}]}},{"id":119,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":118,"kind":"app","opcode":"iuminus","args":[{"id":117,"kind":"int","value":100}]}},{"id":123,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":122,"kind":"app","opcode":"igt","args":[{"id":120,"kind":"int","value":2},{"id":121,"kind":"int","value":3}]}},{"id":127,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":126,"kind":"app","opcode":"igte","args":[{"id":124,"kind":"int","value":2},{"id":125,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},{"id":131,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":130,"kind":"app","opcode":"ilt","args":[{"id":128,"kind":"int","value":2},{"id":129,"kind":"int","value":3}]}},{"id":135,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":134,"kind":"app","opcode":"ilte","args":[{"id":132,"kind":"int","value":2},{"id":133,"kind":"int","value":3}]}},{"id":139,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":138,"kind":"app","opcode":"eq","args":[{"id":136,"kind":"int","value":2},{"id":137,"kind":"int","value":3}]}},{"id":143,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":142,"kind":"app","opcode":"neq","args":[{"id":140,"kind":"int","value":2},{"id":141,"kind":"int","value":3}]}},{"id":149,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":148,"kind":"app","opcode":"eq","args":[{"id":146,"kind":"app","opcode":"iadd","args":[{"id":144,"kind":"int","value":2},{"id":145,"kind":"int","value":2}]},{"id":147,"kind":"int","value":4}]}},{"id":153,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":152,"kind":"app","opcode":"in","args":[{"id":150,"kind":"int","value":1},{"id":151,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},{"id":165,"kind":"def","name":"withType","qualifier":"val","expr":{"id":164,"kind":"app","opcode":"Set","args":[{"id":162,"kind":"int","value":1},{"id":163,"kind":"int","value":2}]},"typeAnnotation":{"id":161,"kind":"set","elem":{"id":160,"kind":"int"}}},{"id":166,"kind":"typedef","name":"PROC"},{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},{"id":174,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":173,"kind":"int","value":42}},{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},{"kind":"var","name":"k","typeAnnotation":{"id":217,"kind":"int"},"id":218},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22},{"id":239,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":238,"kind":"app","opcode":"and","args":[{"id":236,"kind":"bool","value":false},{"id":237,"kind":"bool","value":true}]}},{"id":243,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":242,"kind":"app","opcode":"or","args":[{"id":240,"kind":"bool","value":false},{"id":241,"kind":"bool","value":true}]}},{"id":247,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":246,"kind":"app","opcode":"implies","args":[{"id":244,"kind":"bool","value":false},{"id":245,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26},{"id":280,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":279,"kind":"app","opcode":"and","args":[{"id":276,"kind":"bool","value":false},{"id":277,"kind":"bool","value":true},{"id":278,"kind":"bool","value":false}]}},{"id":285,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":284,"kind":"app","opcode":"actionAll","args":[{"id":281,"kind":"bool","value":false},{"id":282,"kind":"bool","value":true},{"id":283,"kind":"bool","value":false}]}},{"id":290,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":289,"kind":"app","opcode":"or","args":[{"id":286,"kind":"bool","value":false},{"id":287,"kind":"bool","value":true},{"id":288,"kind":"bool","value":false}]}},{"id":295,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":294,"kind":"app","opcode":"actionAny","args":[{"id":291,"kind":"bool","value":false},{"id":292,"kind":"bool","value":true},{"id":293,"kind":"bool","value":false}]}},{"id":300,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":299,"kind":"app","opcode":"ite","args":[{"id":296,"kind":"bool","value":true},{"id":297,"kind":"int","value":1},{"id":298,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":317,"kind":"fun","arg":{"id":315,"kind":"str"},"res":{"id":316,"kind":"int"}},"id":318},{"kind":"const","name":"MyFunFun","typeAnnotation":{"id":31,"kind":"fun","arg":{"id":29,"kind":"fun","arg":{"id":27,"kind":"int"},"res":{"id":28,"kind":"str"}},"res":{"id":30,"kind":"bool"}},"id":32},{"id":327,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":326,"kind":"lambda","params":[{"id":323,"name":"a"},{"id":324,"name":"b"}],"qualifier":"def","expr":{"id":325,"kind":"int","value":1}}},{"id":339,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":338,"kind":"app","opcode":"in","args":[{"id":336,"kind":"int","value":1},{"id":337,"kind":"app","opcode":"Set","args":[]}]}},{"kind":"const","name":"MyOperator","typeAnnotation":{"id":36,"kind":"oper","args":[{"id":33,"kind":"int"},{"id":34,"kind":"str"}],"res":{"id":35,"kind":"bool"}},"id":37},{"id":404,"kind":"def","name":"one","qualifier":"val","expr":{"id":403,"kind":"app","opcode":"head","args":[{"id":402,"kind":"app","opcode":"List","args":[{"id":400,"kind":"int","value":1},{"id":401,"kind":"int","value":2}]}]}},{"id":409,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":408,"kind":"app","opcode":"Tup","args":[{"id":405,"kind":"int","value":1},{"id":406,"kind":"int","value":2},{"id":407,"kind":"int","value":3}]}},{"id":414,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":413,"kind":"app","opcode":"Tup","args":[{"id":410,"kind":"int","value":1},{"id":411,"kind":"int","value":2},{"id":412,"kind":"int","value":3}]}},{"id":418,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":417,"kind":"app","opcode":"Tup","args":[{"id":415,"kind":"int","value":4},{"id":416,"kind":"int","value":5}]}},{"kind":"const","name":"MyOperatorWithComma","typeAnnotation":{"id":41,"kind":"oper","args":[{"id":38,"kind":"int"},{"id":39,"kind":"str"}],"res":{"id":40,"kind":"bool"}},"id":42},{"id":423,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":422,"kind":"app","opcode":"List","args":[{"id":419,"kind":"int","value":1},{"id":420,"kind":"int","value":2},{"id":421,"kind":"int","value":3}]}},{"id":428,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":427,"kind":"app","opcode":"List","args":[{"id":424,"kind":"int","value":1},{"id":425,"kind":"int","value":2},{"id":426,"kind":"int","value":3}]}},{"id":435,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":434,"kind":"app","opcode":"nth","args":[{"id":432,"kind":"app","opcode":"List","args":[{"id":429,"kind":"int","value":2},{"id":430,"kind":"int","value":3},{"id":431,"kind":"int","value":4}]},{"id":433,"kind":"int","value":2}]}},{"id":441,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":440,"kind":"app","opcode":"Rec","args":[{"id":437,"kind":"str","value":"name"},{"id":436,"kind":"str","value":"igor"},{"id":439,"kind":"str","value":"year"},{"id":438,"kind":"int","value":1981}]}},{"id":447,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":446,"kind":"app","opcode":"Rec","args":[{"id":442,"kind":"str","value":"name"},{"id":443,"kind":"str","value":"igor"},{"id":444,"kind":"str","value":"year"},{"id":445,"kind":"int","value":1981}]}},{"id":460,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":459,"kind":"app","opcode":"Set","args":[{"id":456,"kind":"int","value":1},{"id":457,"kind":"int","value":2},{"id":458,"kind":"int","value":3}]}},{"kind":"const","name":"MyTuple","typeAnnotation":{"id":46,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":43,"kind":"int"}},{"fieldName":"1","fieldType":{"id":44,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":45,"kind":"str"}}],"other":{"kind":"empty"}}},"id":47},{"id":490,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":489,"kind":"app","opcode":"in","args":[{"id":487,"kind":"int","value":2},{"id":488,"kind":"app","opcode":"Set","args":[]}]}},{"id":494,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":493,"kind":"app","opcode":"subseteq","args":[{"id":491,"kind":"app","opcode":"Set","args":[]},{"id":492,"kind":"app","opcode":"Set","args":[]}]}},{"id":503,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":502,"kind":"app","opcode":"in","args":[{"id":496,"kind":"app","opcode":"Set","args":[{"id":495,"kind":"int","value":1}]},{"id":501,"kind":"app","opcode":"powerset","args":[{"id":500,"kind":"app","opcode":"Set","args":[{"id":497,"kind":"int","value":1},{"id":498,"kind":"int","value":2},{"id":499,"kind":"int","value":3}]}]}]}},{"id":516,"kind":"typedef","name":"INT_SET","type":{"id":515,"kind":"set","elem":{"id":514,"kind":"int"}}},{"id":517,"kind":"typedef","name":"UNINTERPRETED_TYPE"},{"kind":"const","name":"MyTupleWithComma","typeAnnotation":{"id":51,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":48,"kind":"int"}},{"fieldName":"1","fieldType":{"id":49,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":50,"kind":"str"}}],"other":{"kind":"empty"}}},"id":52},{"kind":"const","name":"MyRecord","typeAnnotation":{"id":56,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":53,"kind":"int"}},{"fieldName":"b","fieldType":{"id":54,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":55,"kind":"str"}}],"other":{"kind":"empty"}}},"id":57},{"kind":"const","name":"MyRecordWithComma","typeAnnotation":{"id":61,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":58,"kind":"int"}},{"fieldName":"b","fieldType":{"id":59,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":60,"kind":"str"}}],"other":{"kind":"empty"}}},"id":62},{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},{"kind":"var","name":"i","typeAnnotation":{"id":89,"kind":"int"},"id":90},{"kind":"var","name":"j","typeAnnotation":{"id":91,"kind":"bool"},"id":92},{"id":96,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":95,"kind":"app","opcode":"iadd","args":[{"id":93,"kind":"int","value":1},{"id":94,"kind":"int","value":2}]}},{"id":159,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":158,"kind":"app","opcode":"exists","args":[{"id":154,"kind":"name","name":"Bool"},{"id":157,"kind":"lambda","params":[{"id":155,"name":"x"}],"qualifier":"def","expr":{"id":156,"kind":"name","name":"x"}}]}},{"id":170,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":169,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":168,"kind":"set","elem":{"id":167,"kind":"const","name":"PROC"}}},{"id":181,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":180,"kind":"lambda","params":[{"id":175,"name":"x"},{"id":176,"name":"y"}],"qualifier":"puredef","expr":{"id":179,"kind":"app","opcode":"iadd","args":[{"id":177,"kind":"name","name":"x"},{"id":178,"kind":"name","name":"y"}]}}},{"id":187,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":186,"kind":"lambda","params":[{"id":182,"name":"factor"}],"qualifier":"def","expr":{"id":185,"kind":"app","opcode":"imul","args":[{"id":183,"kind":"name","name":"factor"},{"id":184,"kind":"name","name":"n"}]}}},{"id":193,"kind":"def","name":"A","qualifier":"action","expr":{"id":192,"kind":"lambda","params":[{"id":188,"name":"x"}],"qualifier":"action","expr":{"id":191,"kind":"app","opcode":"assign","args":[{"id":190,"kind":"name","name":"n"},{"id":189,"kind":"name","name":"x"}]}}},{"id":198,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":197,"kind":"lambda","params":[{"id":194,"name":"x"}],"qualifier":"puredef","expr":{"id":196,"kind":"app","opcode":"not","args":[{"id":195,"kind":"name","name":"x"}]}}},{"id":209,"kind":"def","name":"H","qualifier":"def","expr":{"id":208,"kind":"lambda","params":[{"id":199,"name":"x"},{"id":200,"name":"y"}],"qualifier":"def","expr":{"id":207,"kind":"app","opcode":"iadd","args":[{"id":205,"kind":"name","name":"x"},{"id":206,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":204,"kind":"oper","args":[{"id":201,"kind":"int"},{"id":202,"kind":"int"}],"res":{"id":203,"kind":"int"}}},{"id":216,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":215,"kind":"lambda","params":[{"id":210,"name":"x"}],"qualifier":"def","expr":{"id":214,"kind":"name","name":"x"}},"typeAnnotation":{"id":213,"kind":"oper","args":[{"id":211,"kind":"var","name":"a"}],"res":{"id":212,"kind":"var","name":"a"}}},{"id":222,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":221,"kind":"app","opcode":"assign","args":[{"id":220,"kind":"name","name":"k"},{"id":219,"kind":"int","value":3}]}},{"id":235,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":234,"kind":"lambda","params":[{"id":224,"name":"x","typeAnnotation":{"id":223,"kind":"int"}},{"id":226,"name":"y","typeAnnotation":{"id":225,"kind":"int"}}],"qualifier":"puredef","expr":{"id":233,"kind":"app","opcode":"ite","args":[{"id":230,"kind":"app","opcode":"ilt","args":[{"id":228,"kind":"name","name":"x"},{"id":229,"kind":"name","name":"y"}]},{"id":231,"kind":"name","name":"x"},{"id":232,"kind":"name","name":"y"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":223,"kind":"int"},{"id":225,"kind":"int"}],"res":{"id":227,"kind":"int"}}},{"id":251,"kind":"def","name":"F","qualifier":"def","expr":{"id":250,"kind":"lambda","params":[{"id":248,"name":"x"}],"qualifier":"def","expr":{"id":249,"kind":"name","name":"x"}}},{"id":314,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":313,"kind":"lambda","params":[{"id":301,"name":"x"},{"id":302,"name":"y"}],"qualifier":"def","expr":{"id":312,"kind":"app","opcode":"ite","args":[{"id":305,"kind":"app","opcode":"ilt","args":[{"id":303,"kind":"name","name":"x"},{"id":304,"kind":"int","value":10}]},{"id":308,"kind":"app","opcode":"iadd","args":[{"id":306,"kind":"name","name":"y"},{"id":307,"kind":"int","value":5}]},{"id":311,"kind":"app","opcode":"imod","args":[{"id":309,"kind":"name","name":"y"},{"id":310,"kind":"int","value":5}]}]}}},{"id":322,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":321,"kind":"app","opcode":"get","args":[{"id":319,"kind":"name","name":"f1"},{"id":320,"kind":"str","value":"a"}]}},{"id":331,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":330,"kind":"app","opcode":"MyOper","args":[{"id":328,"kind":"str","value":"a"},{"id":329,"kind":"int","value":42}]}},{"id":335,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":334,"kind":"app","opcode":"MyOper","args":[{"id":332,"kind":"str","value":"a"},{"id":333,"kind":"int","value":42}]}},{"id":347,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":346,"kind":"app","opcode":"filter","args":[{"id":340,"kind":"name","name":"S"},{"id":345,"kind":"lambda","params":[{"id":341,"name":"x"}],"qualifier":"def","expr":{"id":344,"kind":"app","opcode":"igt","args":[{"id":342,"kind":"name","name":"x"},{"id":343,"kind":"int","value":10}]}}]}},{"id":385,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":384,"kind":"app","opcode":"filter","args":[{"id":380,"kind":"name","name":"S"},{"id":383,"kind":"lambda","params":[{"id":381,"name":"_"}],"qualifier":"def","expr":{"id":382,"kind":"bool","value":true}}]}},{"id":393,"kind":"def","name":"f","qualifier":"val","expr":{"id":392,"kind":"app","opcode":"mapBy","args":[{"id":386,"kind":"name","name":"S"},{"id":391,"kind":"lambda","params":[{"id":387,"name":"x"}],"qualifier":"def","expr":{"id":390,"kind":"app","opcode":"iadd","args":[{"id":388,"kind":"name","name":"x"},{"id":389,"kind":"int","value":1}]}}]}},{"id":399,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":398,"kind":"app","opcode":"exclude","args":[{"id":394,"kind":"name","name":"S"},{"id":397,"kind":"app","opcode":"Set","args":[{"id":395,"kind":"int","value":3},{"id":396,"kind":"int","value":4}]}]}},{"id":455,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"app","opcode":"with","args":[{"id":452,"kind":"name","name":"test_record"},{"id":449,"kind":"str","value":"name"},{"id":448,"kind":"str","value":"quint"}]},{"id":451,"kind":"str","value":"year"},{"id":450,"kind":"int","value":2023}]}},{"id":471,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":470,"kind":"let","opdef":{"id":466,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":465,"kind":"app","opcode":"Rec","args":[{"id":462,"kind":"str","value":"a"},{"id":461,"kind":"int","value":1},{"id":464,"kind":"str","value":"b"},{"id":463,"kind":"str","value":"foo"}]}},"expr":{"id":469,"kind":"app","opcode":"field","args":[{"id":467,"kind":"name","name":"my_rec"},{"id":468,"kind":"str","value":"a"}]}}},{"id":480,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":479,"kind":"let","opdef":{"id":475,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":474,"kind":"app","opcode":"Tup","args":[{"id":472,"kind":"str","value":"a"},{"id":473,"kind":"int","value":3}]}},"expr":{"id":478,"kind":"app","opcode":"item","args":[{"id":476,"kind":"name","name":"my_tup"},{"id":477,"kind":"int","value":2}]}}},{"id":486,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":485,"kind":"lambda","params":[{"id":481,"name":"s"}],"qualifier":"def","expr":{"id":484,"kind":"app","opcode":"eq","args":[{"id":482,"kind":"name","name":"s"},{"id":483,"kind":"app","opcode":"List","args":[]}]}}},{"id":507,"kind":"assume","name":"positive","assumption":{"id":506,"kind":"app","opcode":"igt","args":[{"id":504,"kind":"name","name":"N"},{"id":505,"kind":"int","value":0}]}},{"id":511,"kind":"assume","name":"_","assumption":{"id":510,"kind":"app","opcode":"neq","args":[{"id":508,"kind":"name","name":"N"},{"id":509,"kind":"int","value":0}]}},{"id":512,"kind":"import","defName":"foo","protoName":"M1"},{"id":513,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":518,"kind":"const","name":"INT_SET"},"id":519},{"id":522,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":521,"name":"N"},{"id":520,"kind":"name","name":"N"}]],"identityOverride":false},{"id":74,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":73,"kind":"lambda","params":[{"id":70,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":72,"kind":"app","opcode":"variant","args":[{"id":69,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":71}]}}},{"id":80,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":79,"kind":"lambda","params":[{"id":76,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":78,"kind":"app","opcode":"variant","args":[{"id":75,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":77}]}}},{"id":86,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":85,"kind":"lambda","params":[{"id":82,"name":"__DogParam"}],"qualifier":"def","expr":{"id":84,"kind":"app","opcode":"variant","args":[{"id":81,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":83}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":87,"kind":"const","name":"MyUnionType"},"id":88},{"id":259,"kind":"def","name":"G","qualifier":"def","expr":{"id":258,"kind":"lambda","params":[{"id":252,"name":"x"}],"qualifier":"def","expr":{"id":257,"kind":"app","opcode":"and","args":[{"id":254,"kind":"app","opcode":"F","args":[{"id":253,"kind":"name","name":"x"}]},{"id":256,"kind":"app","opcode":"not","args":[{"id":255,"kind":"name","name":"x"}]}]}}},{"id":267,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":266,"kind":"lambda","params":[{"id":260,"name":"x"}],"qualifier":"def","expr":{"id":265,"kind":"app","opcode":"and","args":[{"id":262,"kind":"app","opcode":"F","args":[{"id":261,"kind":"name","name":"x"}]},{"id":264,"kind":"app","opcode":"not","args":[{"id":263,"kind":"name","name":"x"}]}]}}},{"id":275,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":274,"kind":"lambda","params":[{"id":268,"name":"x"}],"qualifier":"def","expr":{"id":273,"kind":"app","opcode":"or","args":[{"id":270,"kind":"app","opcode":"F","args":[{"id":269,"kind":"name","name":"x"}]},{"id":272,"kind":"app","opcode":"not","args":[{"id":271,"kind":"name","name":"x"}]}]}}},{"id":367,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":366,"kind":"app","opcode":"map","args":[{"id":350,"kind":"app","opcode":"tuples","args":[{"id":348,"kind":"name","name":"S"},{"id":349,"kind":"name","name":"MySet"}]},{"id":365,"kind":"lambda","params":[{"id":356,"name":"quintTupledLambdaParam356"}],"qualifier":"def","expr":{"id":361,"kind":"let","opdef":{"id":352,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":362,"kind":"app","opcode":"item","args":[{"id":363,"kind":"name","name":"quintTupledLambdaParam356"},{"id":364,"kind":"int","value":2}]}},"expr":{"id":357,"kind":"let","opdef":{"id":351,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":358,"kind":"app","opcode":"item","args":[{"id":359,"kind":"name","name":"quintTupledLambdaParam356"},{"id":360,"kind":"int","value":1}]}},"expr":{"id":355,"kind":"app","opcode":"iadd","args":[{"id":353,"kind":"name","name":"s"},{"id":354,"kind":"name","name":"mys"}]}}}}]}},{"id":379,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":378,"kind":"let","opdef":{"id":370,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":369,"kind":"app","opcode":"oneOf","args":[{"id":368,"kind":"name","name":"S"}]}},"expr":{"id":377,"kind":"app","opcode":"actionAll","args":[{"id":373,"kind":"app","opcode":"igt","args":[{"id":371,"kind":"name","name":"x"},{"id":372,"kind":"int","value":10}]},{"id":376,"kind":"app","opcode":"assign","args":[{"id":375,"kind":"name","name":"k"},{"id":374,"kind":"name","name":"x"}]}]}}}]}],"table":{"68":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"71":{"id":70,"name":"__CircleParam","kind":"param"},"77":{"id":76,"name":"__RectangleParam","kind":"param"},"83":{"id":82,"name":"__DogParam","kind":"param"},"87":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"156":{"id":155,"name":"x","kind":"param"},"167":{"id":166,"kind":"typedef","name":"PROC"},"177":{"id":175,"name":"x","kind":"param"},"178":{"id":176,"name":"y","kind":"param"},"183":{"id":182,"name":"factor","kind":"param"},"184":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"189":{"id":188,"name":"x","kind":"param"},"190":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"195":{"id":194,"name":"x","kind":"param"},"205":{"id":199,"name":"x","kind":"param"},"206":{"id":200,"name":"y","kind":"param"},"214":{"id":210,"name":"x","kind":"param"},"220":{"kind":"var","name":"k","typeAnnotation":{"id":217,"kind":"int"},"id":218},"228":{"id":224,"name":"x","typeAnnotation":{"id":223,"kind":"int"},"kind":"param"},"229":{"id":226,"name":"y","typeAnnotation":{"id":225,"kind":"int"},"kind":"param"},"231":{"id":224,"name":"x","typeAnnotation":{"id":223,"kind":"int"},"kind":"param"},"232":{"id":226,"name":"y","typeAnnotation":{"id":225,"kind":"int"},"kind":"param"},"249":{"id":248,"name":"x","kind":"param"},"253":{"id":252,"name":"x","kind":"param"},"254":{"id":251,"kind":"def","name":"F","qualifier":"def","expr":{"id":250,"kind":"lambda","params":[{"id":248,"name":"x"}],"qualifier":"def","expr":{"id":249,"kind":"name","name":"x"}},"depth":0},"255":{"id":252,"name":"x","kind":"param"},"261":{"id":260,"name":"x","kind":"param"},"262":{"id":251,"kind":"def","name":"F","qualifier":"def","expr":{"id":250,"kind":"lambda","params":[{"id":248,"name":"x"}],"qualifier":"def","expr":{"id":249,"kind":"name","name":"x"}},"depth":0},"263":{"id":260,"name":"x","kind":"param"},"269":{"id":268,"name":"x","kind":"param"},"270":{"id":251,"kind":"def","name":"F","qualifier":"def","expr":{"id":250,"kind":"lambda","params":[{"id":248,"name":"x"}],"qualifier":"def","expr":{"id":249,"kind":"name","name":"x"}},"depth":0},"271":{"id":268,"name":"x","kind":"param"},"303":{"id":301,"name":"x","kind":"param"},"306":{"id":302,"name":"y","kind":"param"},"309":{"id":302,"name":"y","kind":"param"},"319":{"kind":"var","name":"f1","typeAnnotation":{"id":317,"kind":"fun","arg":{"id":315,"kind":"str"},"res":{"id":316,"kind":"int"}},"id":318},"330":{"id":327,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":326,"kind":"lambda","params":[{"id":323,"name":"a"},{"id":324,"name":"b"}],"qualifier":"def","expr":{"id":325,"kind":"int","value":1}},"depth":0},"334":{"id":327,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":326,"kind":"lambda","params":[{"id":323,"name":"a"},{"id":324,"name":"b"}],"qualifier":"def","expr":{"id":325,"kind":"int","value":1}},"depth":0},"340":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"342":{"id":341,"name":"x","kind":"param"},"348":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"349":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},"353":{"id":351,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":358,"kind":"app","opcode":"item","args":[{"id":359,"kind":"name","name":"quintTupledLambdaParam356"},{"id":360,"kind":"int","value":1}]},"depth":1},"354":{"id":352,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":362,"kind":"app","opcode":"item","args":[{"id":363,"kind":"name","name":"quintTupledLambdaParam356"},{"id":364,"kind":"int","value":2}]},"depth":1},"359":{"id":356,"name":"quintTupledLambdaParam356","kind":"param"},"363":{"id":356,"name":"quintTupledLambdaParam356","kind":"param"},"368":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"371":{"id":370,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":369,"kind":"app","opcode":"oneOf","args":[{"id":368,"kind":"name","name":"S"}]},"depth":1},"374":{"id":370,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":369,"kind":"app","opcode":"oneOf","args":[{"id":368,"kind":"name","name":"S"}]},"depth":1},"375":{"kind":"var","name":"k","typeAnnotation":{"id":217,"kind":"int"},"id":218},"380":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"386":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"388":{"id":387,"name":"x","kind":"param"},"394":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"452":{"id":441,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":440,"kind":"app","opcode":"Rec","args":[{"id":437,"kind":"str","value":"name"},{"id":436,"kind":"str","value":"igor"},{"id":439,"kind":"str","value":"year"},{"id":438,"kind":"int","value":1981}]},"depth":0},"467":{"id":466,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":465,"kind":"app","opcode":"Rec","args":[{"id":462,"kind":"str","value":"a"},{"id":461,"kind":"int","value":1},{"id":464,"kind":"str","value":"b"},{"id":463,"kind":"str","value":"foo"}]},"depth":1},"476":{"id":475,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":474,"kind":"app","opcode":"Tup","args":[{"id":472,"kind":"str","value":"a"},{"id":473,"kind":"int","value":3}]},"depth":1},"482":{"id":481,"name":"s","kind":"param"},"504":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"508":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"518":{"id":516,"kind":"typedef","name":"INT_SET","type":{"id":515,"kind":"set","elem":{"id":514,"kind":"int"}}},"520":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"521":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":520,"importedFrom":{"id":522,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":521,"name":"N"},{"id":520,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/SuperSpec.map.json b/quint/testFixture/SuperSpec.map.json index 221260965..f79f12375 100644 --- a/quint/testFixture/SuperSpec.map.json +++ b/quint/testFixture/SuperSpec.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/SuperSpec.qnt"},"map":{"1":[0,{"line":1,"col":12,"index":24},{"line":1,"col":12,"index":24}],"2":[0,{"line":1,"col":2,"index":14},{"line":1,"col":12,"index":24}],"3":[0,{"line":0,"col":0,"index":0},{"line":2,"col":26,"index":26}],"4":[0,{"line":5,"col":12,"index":53},{"line":5,"col":12,"index":53}],"5":[0,{"line":5,"col":2,"index":43},{"line":5,"col":12,"index":53}],"6":[0,{"line":4,"col":0,"index":29},{"line":6,"col":26,"index":55}],"7":[0,{"line":9,"col":11,"index":84},{"line":9,"col":13,"index":86}],"8":[0,{"line":9,"col":2,"index":75},{"line":9,"col":13,"index":86}],"9":[0,{"line":10,"col":9,"index":97},{"line":10,"col":11,"index":99}],"10":[0,{"line":10,"col":2,"index":90},{"line":10,"col":11,"index":99}],"11":[0,{"line":8,"col":0,"index":58},{"line":11,"col":43,"index":101}],"12":[0,{"line":16,"col":11,"index":186},{"line":16,"col":13,"index":188}],"13":[0,{"line":16,"col":2,"index":177},{"line":16,"col":13,"index":188}],"14":[0,{"line":17,"col":15,"index":205},{"line":17,"col":17,"index":207}],"15":[0,{"line":17,"col":11,"index":201},{"line":17,"col":18,"index":208}],"16":[0,{"line":17,"col":2,"index":192},{"line":17,"col":18,"index":208}],"17":[0,{"line":18,"col":19,"index":229},{"line":18,"col":21,"index":231}],"18":[0,{"line":18,"col":15,"index":225},{"line":18,"col":22,"index":232}],"19":[0,{"line":18,"col":2,"index":212},{"line":18,"col":22,"index":232}],"20":[0,{"line":19,"col":20,"index":254},{"line":19,"col":23,"index":257}],"21":[0,{"line":19,"col":15,"index":249},{"line":19,"col":24,"index":258}],"22":[0,{"line":19,"col":2,"index":236},{"line":19,"col":24,"index":258}],"23":[0,{"line":20,"col":15,"index":275},{"line":20,"col":17,"index":277}],"24":[0,{"line":20,"col":22,"index":282},{"line":20,"col":24,"index":284}],"25":[0,{"line":20,"col":15,"index":275},{"line":20,"col":24,"index":284}],"26":[0,{"line":20,"col":2,"index":262},{"line":20,"col":24,"index":284}],"27":[0,{"line":21,"col":19,"index":305},{"line":21,"col":21,"index":307}],"28":[0,{"line":21,"col":26,"index":312},{"line":21,"col":28,"index":314}],"29":[0,{"line":21,"col":19,"index":305},{"line":21,"col":28,"index":314}],"30":[0,{"line":21,"col":34,"index":320},{"line":21,"col":37,"index":323}],"31":[0,{"line":21,"col":18,"index":304},{"line":21,"col":37,"index":323}],"32":[0,{"line":21,"col":2,"index":288},{"line":21,"col":37,"index":323}],"33":[0,{"line":22,"col":21,"index":346},{"line":22,"col":23,"index":348}],"34":[0,{"line":22,"col":26,"index":351},{"line":22,"col":28,"index":353}],"35":[0,{"line":22,"col":34,"index":359},{"line":22,"col":37,"index":362}],"36":[0,{"line":22,"col":20,"index":345},{"line":22,"col":37,"index":362}],"37":[0,{"line":22,"col":2,"index":327},{"line":22,"col":37,"index":362}],"38":[0,{"line":23,"col":30,"index":394},{"line":23,"col":32,"index":396}],"39":[0,{"line":23,"col":35,"index":399},{"line":23,"col":37,"index":401}],"40":[0,{"line":23,"col":45,"index":409},{"line":23,"col":48,"index":412}],"41":[0,{"line":23,"col":29,"index":393},{"line":23,"col":48,"index":412}],"42":[0,{"line":23,"col":2,"index":366},{"line":23,"col":48,"index":412}],"43":[0,{"line":24,"col":18,"index":432},{"line":24,"col":20,"index":434}],"44":[0,{"line":24,"col":23,"index":437},{"line":24,"col":26,"index":440}],"45":[0,{"line":24,"col":29,"index":443},{"line":24,"col":31,"index":445}],"46":[0,{"line":24,"col":17,"index":431},{"line":24,"col":32,"index":446}],"47":[0,{"line":24,"col":2,"index":416},{"line":24,"col":32,"index":446}],"48":[0,{"line":25,"col":27,"index":475},{"line":25,"col":29,"index":477}],"49":[0,{"line":25,"col":32,"index":480},{"line":25,"col":35,"index":483}],"50":[0,{"line":25,"col":38,"index":486},{"line":25,"col":40,"index":488}],"51":[0,{"line":25,"col":26,"index":474},{"line":25,"col":43,"index":491}],"52":[0,{"line":25,"col":2,"index":450},{"line":25,"col":43,"index":491}],"53":[0,{"line":28,"col":23,"index":580},{"line":28,"col":25,"index":582}],"54":[0,{"line":28,"col":31,"index":588},{"line":28,"col":34,"index":591}],"55":[0,{"line":28,"col":40,"index":597},{"line":28,"col":42,"index":599}],"56":[0,{"line":28,"col":18,"index":575},{"line":28,"col":44,"index":601}],"57":[0,{"line":28,"col":2,"index":559},{"line":28,"col":44,"index":601}],"58":[0,{"line":29,"col":32,"index":635},{"line":29,"col":34,"index":637}],"59":[0,{"line":29,"col":40,"index":643},{"line":29,"col":43,"index":646}],"60":[0,{"line":29,"col":49,"index":652},{"line":29,"col":51,"index":654}],"61":[0,{"line":29,"col":27,"index":630},{"line":29,"col":54,"index":657}],"62":[0,{"line":29,"col":2,"index":605},{"line":29,"col":54,"index":657}],"63":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"64":[0,{"line":34,"col":26,"index":777},{"line":34,"col":28,"index":779}],"65":[0,{"line":34,"col":39,"index":790},{"line":34,"col":41,"index":792}],"66":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"67":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"68":[0,{"line":32,"col":2,"index":712},{"line":35,"col":102,"index":812}],"69":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"70":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"71":[0,{"line":33,"col":8,"index":739},{"line":33,"col":13,"index":744}],"72":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"73":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"74":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"75":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"76":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"77":[0,{"line":34,"col":8,"index":759},{"line":34,"col":16,"index":767}],"78":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"79":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"80":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"81":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"82":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"83":[0,{"line":35,"col":8,"index":805},{"line":35,"col":10,"index":807}],"84":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"85":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"86":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"87":[0,{"line":36,"col":17,"index":831},{"line":36,"col":27,"index":841}],"88":[0,{"line":36,"col":2,"index":816},{"line":36,"col":27,"index":841}],"89":[0,{"line":41,"col":9,"index":955},{"line":41,"col":11,"index":957}],"90":[0,{"line":41,"col":2,"index":948},{"line":41,"col":11,"index":957}],"91":[0,{"line":42,"col":9,"index":968},{"line":42,"col":12,"index":971}],"92":[0,{"line":42,"col":2,"index":961},{"line":42,"col":12,"index":971}],"93":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":19,"index":1140}],"94":[0,{"line":47,"col":23,"index":1144},{"line":47,"col":23,"index":1144}],"95":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":23,"index":1144}],"96":[0,{"line":47,"col":2,"index":1123},{"line":47,"col":23,"index":1144}],"97":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":19,"index":1165}],"98":[0,{"line":48,"col":23,"index":1169},{"line":48,"col":23,"index":1169}],"99":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":23,"index":1169}],"100":[0,{"line":48,"col":2,"index":1148},{"line":48,"col":23,"index":1169}],"101":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":19,"index":1190}],"102":[0,{"line":49,"col":23,"index":1194},{"line":49,"col":23,"index":1194}],"103":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":23,"index":1194}],"104":[0,{"line":49,"col":2,"index":1173},{"line":49,"col":23,"index":1194}],"105":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":19,"index":1215}],"106":[0,{"line":50,"col":23,"index":1219},{"line":50,"col":23,"index":1219}],"107":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":23,"index":1219}],"108":[0,{"line":50,"col":2,"index":1198},{"line":50,"col":23,"index":1219}],"109":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":19,"index":1240}],"110":[0,{"line":51,"col":23,"index":1244},{"line":51,"col":23,"index":1244}],"111":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":23,"index":1244}],"112":[0,{"line":51,"col":2,"index":1223},{"line":51,"col":23,"index":1244}],"113":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":19,"index":1265}],"114":[0,{"line":52,"col":21,"index":1267},{"line":52,"col":21,"index":1267}],"115":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":21,"index":1267}],"116":[0,{"line":52,"col":2,"index":1248},{"line":52,"col":21,"index":1267}],"117":[0,{"line":53,"col":16,"index":1285},{"line":53,"col":18,"index":1287}],"118":[0,{"line":53,"col":15,"index":1284},{"line":53,"col":18,"index":1287}],"119":[0,{"line":53,"col":2,"index":1271},{"line":53,"col":18,"index":1287}],"120":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":18,"index":1307}],"121":[0,{"line":54,"col":22,"index":1311},{"line":54,"col":22,"index":1311}],"122":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":22,"index":1311}],"123":[0,{"line":54,"col":2,"index":1291},{"line":54,"col":22,"index":1311}],"124":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":18,"index":1331}],"125":[0,{"line":55,"col":23,"index":1336},{"line":55,"col":23,"index":1336}],"126":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":23,"index":1336}],"127":[0,{"line":55,"col":2,"index":1315},{"line":55,"col":23,"index":1336}],"128":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":18,"index":1356}],"129":[0,{"line":56,"col":22,"index":1360},{"line":56,"col":22,"index":1360}],"130":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":22,"index":1360}],"131":[0,{"line":56,"col":2,"index":1340},{"line":56,"col":22,"index":1360}],"132":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":18,"index":1380}],"133":[0,{"line":57,"col":23,"index":1385},{"line":57,"col":23,"index":1385}],"134":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":23,"index":1385}],"135":[0,{"line":57,"col":2,"index":1364},{"line":57,"col":23,"index":1385}],"136":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":20,"index":1407}],"137":[0,{"line":58,"col":25,"index":1412},{"line":58,"col":25,"index":1412}],"138":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":25,"index":1412}],"139":[0,{"line":58,"col":2,"index":1389},{"line":58,"col":25,"index":1412}],"140":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":18,"index":1432}],"141":[0,{"line":59,"col":23,"index":1437},{"line":59,"col":23,"index":1437}],"142":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":23,"index":1437}],"143":[0,{"line":59,"col":2,"index":1416},{"line":59,"col":23,"index":1437}],"144":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":6,"index":1464}],"145":[0,{"line":61,"col":10,"index":1468},{"line":61,"col":10,"index":1468}],"146":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":10,"index":1468}],"147":[0,{"line":61,"col":15,"index":1473},{"line":61,"col":15,"index":1473}],"148":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":15,"index":1473}],"149":[0,{"line":60,"col":2,"index":1441},{"line":62,"col":38,"index":1477}],"150":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":25,"index":1504}],"151":[0,{"line":63,"col":30,"index":1509},{"line":63,"col":32,"index":1511}],"152":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":33,"index":1512}],"153":[0,{"line":63,"col":2,"index":1481},{"line":63,"col":33,"index":1512}],"154":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":26,"index":1540}],"155":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":35,"index":1549}],"156":[0,{"line":64,"col":40,"index":1554},{"line":64,"col":40,"index":1554}],"157":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":40,"index":1554}],"158":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":41,"index":1555}],"159":[0,{"line":64,"col":2,"index":1516},{"line":64,"col":41,"index":1555}],"160":[0,{"line":67,"col":20,"index":1594},{"line":67,"col":22,"index":1596}],"161":[0,{"line":67,"col":16,"index":1590},{"line":67,"col":23,"index":1597}],"162":[0,{"line":67,"col":31,"index":1605},{"line":67,"col":31,"index":1605}],"163":[0,{"line":67,"col":34,"index":1608},{"line":67,"col":34,"index":1608}],"164":[0,{"line":67,"col":27,"index":1601},{"line":67,"col":35,"index":1609}],"165":[0,{"line":67,"col":2,"index":1576},{"line":67,"col":35,"index":1609}],"166":[0,{"line":69,"col":2,"index":1648},{"line":69,"col":10,"index":1656}],"167":[0,{"line":70,"col":33,"index":1691},{"line":70,"col":36,"index":1694}],"168":[0,{"line":70,"col":29,"index":1687},{"line":70,"col":37,"index":1695}],"169":[0,{"line":70,"col":41,"index":1699},{"line":70,"col":45,"index":1703}],"170":[0,{"line":70,"col":2,"index":1660},{"line":70,"col":45,"index":1703}],"171":[0,{"line":73,"col":9,"index":1741},{"line":73,"col":11,"index":1743}],"172":[0,{"line":73,"col":2,"index":1734},{"line":73,"col":11,"index":1743}],"173":[0,{"line":74,"col":25,"index":1770},{"line":74,"col":26,"index":1771}],"174":[0,{"line":74,"col":2,"index":1747},{"line":74,"col":26,"index":1771}],"175":[0,{"line":75,"col":15,"index":1788},{"line":75,"col":15,"index":1788}],"176":[0,{"line":75,"col":18,"index":1791},{"line":75,"col":18,"index":1791}],"177":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":23,"index":1796}],"178":[0,{"line":75,"col":27,"index":1800},{"line":75,"col":27,"index":1800}],"179":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":27,"index":1800}],"180":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"181":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"182":[0,{"line":76,"col":10,"index":1812},{"line":76,"col":15,"index":1817}],"183":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":25,"index":1827}],"184":[0,{"line":76,"col":29,"index":1831},{"line":76,"col":29,"index":1831}],"185":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":29,"index":1831}],"186":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"187":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"188":[0,{"line":77,"col":11,"index":1844},{"line":77,"col":11,"index":1844}],"189":[0,{"line":77,"col":21,"index":1854},{"line":77,"col":21,"index":1854}],"190":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"191":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"192":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"193":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"194":[0,{"line":78,"col":13,"index":1869},{"line":78,"col":13,"index":1869}],"195":[0,{"line":78,"col":22,"index":1878},{"line":78,"col":22,"index":1878}],"196":[0,{"line":78,"col":18,"index":1874},{"line":78,"col":23,"index":1879}],"197":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"198":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"199":[0,{"line":81,"col":8,"index":1911},{"line":81,"col":8,"index":1911}],"200":[0,{"line":81,"col":11,"index":1914},{"line":81,"col":11,"index":1914}],"201":[0,{"line":81,"col":16,"index":1919},{"line":81,"col":18,"index":1921}],"202":[0,{"line":81,"col":21,"index":1924},{"line":81,"col":23,"index":1926}],"203":[0,{"line":81,"col":29,"index":1932},{"line":81,"col":31,"index":1934}],"204":[0,{"line":81,"col":15,"index":1918},{"line":81,"col":31,"index":1934}],"205":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":6,"index":1946}],"206":[0,{"line":82,"col":10,"index":1950},{"line":82,"col":10,"index":1950}],"207":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":10,"index":1950}],"208":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"209":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"210":[0,{"line":85,"col":10,"index":1997},{"line":85,"col":10,"index":1997}],"211":[0,{"line":85,"col":15,"index":2002},{"line":85,"col":15,"index":2002}],"212":[0,{"line":85,"col":21,"index":2008},{"line":85,"col":21,"index":2008}],"213":[0,{"line":85,"col":14,"index":2001},{"line":85,"col":21,"index":2008}],"214":[0,{"line":86,"col":6,"index":2020},{"line":86,"col":6,"index":2020}],"215":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"216":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"217":[0,{"line":89,"col":9,"index":2036},{"line":89,"col":11,"index":2038}],"218":[0,{"line":89,"col":2,"index":2029},{"line":89,"col":11,"index":2038}],"219":[0,{"line":90,"col":21,"index":2061},{"line":90,"col":21,"index":2061}],"220":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"221":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"222":[0,{"line":90,"col":2,"index":2042},{"line":90,"col":21,"index":2061}],"223":[0,{"line":93,"col":15,"index":2113},{"line":93,"col":15,"index":2113}],"224":[0,{"line":93,"col":18,"index":2116},{"line":93,"col":20,"index":2118}],"225":[0,{"line":93,"col":23,"index":2121},{"line":93,"col":23,"index":2121}],"226":[0,{"line":93,"col":26,"index":2124},{"line":93,"col":28,"index":2126}],"227":[0,{"line":93,"col":32,"index":2130},{"line":93,"col":34,"index":2132}],"228":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":8,"index":2146}],"229":[0,{"line":94,"col":12,"index":2150},{"line":94,"col":12,"index":2150}],"230":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":12,"index":2150}],"231":[0,{"line":95,"col":4,"index":2157},{"line":95,"col":4,"index":2157}],"232":[0,{"line":96,"col":9,"index":2168},{"line":96,"col":9,"index":2168}],"233":[0,{"line":94,"col":4,"index":2142},{"line":96,"col":30,"index":2168}],"234":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"235":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"236":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"237":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":21,"index":2220}],"238":[0,{"line":101,"col":27,"index":2226},{"line":101,"col":30,"index":2229}],"239":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":30,"index":2229}],"240":[0,{"line":101,"col":2,"index":2201},{"line":101,"col":30,"index":2229}],"241":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":20,"index":2251}],"242":[0,{"line":102,"col":25,"index":2256},{"line":102,"col":28,"index":2259}],"243":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":28,"index":2259}],"244":[0,{"line":102,"col":2,"index":2233},{"line":102,"col":28,"index":2259}],"245":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":25,"index":2286}],"246":[0,{"line":103,"col":35,"index":2296},{"line":103,"col":38,"index":2299}],"247":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":38,"index":2299}],"248":[0,{"line":103,"col":2,"index":2263},{"line":103,"col":38,"index":2299}],"249":[0,{"line":104,"col":8,"index":2309},{"line":104,"col":8,"index":2309}],"250":[0,{"line":104,"col":13,"index":2314},{"line":104,"col":13,"index":2314}],"251":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"252":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"253":[0,{"line":105,"col":8,"index":2324},{"line":105,"col":8,"index":2324}],"254":[0,{"line":105,"col":15,"index":2331},{"line":105,"col":15,"index":2331}],"255":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":16,"index":2332}],"256":[0,{"line":105,"col":26,"index":2342},{"line":105,"col":26,"index":2342}],"257":[0,{"line":105,"col":22,"index":2338},{"line":105,"col":27,"index":2343}],"258":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":27,"index":2343}],"259":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"260":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"261":[0,{"line":106,"col":19,"index":2364},{"line":106,"col":19,"index":2364}],"262":[0,{"line":106,"col":26,"index":2371},{"line":106,"col":26,"index":2371}],"263":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":27,"index":2372}],"264":[0,{"line":106,"col":37,"index":2382},{"line":106,"col":37,"index":2382}],"265":[0,{"line":106,"col":33,"index":2378},{"line":106,"col":38,"index":2383}],"266":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":38,"index":2383}],"267":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"268":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"269":[0,{"line":107,"col":18,"index":2403},{"line":107,"col":18,"index":2403}],"270":[0,{"line":107,"col":25,"index":2410},{"line":107,"col":25,"index":2410}],"271":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":26,"index":2411}],"272":[0,{"line":107,"col":35,"index":2420},{"line":107,"col":35,"index":2420}],"273":[0,{"line":107,"col":31,"index":2416},{"line":107,"col":36,"index":2421}],"274":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":36,"index":2421}],"275":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"276":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"277":[0,{"line":110,"col":6,"index":2459},{"line":110,"col":10,"index":2463}],"278":[0,{"line":111,"col":6,"index":2472},{"line":111,"col":9,"index":2475}],"279":[0,{"line":112,"col":6,"index":2484},{"line":112,"col":10,"index":2488}],"280":[0,{"line":109,"col":23,"index":2447},{"line":113,"col":68,"index":2492}],"281":[0,{"line":109,"col":2,"index":2426},{"line":113,"col":68,"index":2492}],"282":[0,{"line":116,"col":6,"index":2534},{"line":116,"col":10,"index":2538}],"283":[0,{"line":117,"col":6,"index":2547},{"line":117,"col":9,"index":2550}],"284":[0,{"line":118,"col":6,"index":2559},{"line":118,"col":10,"index":2563}],"285":[0,{"line":115,"col":27,"index":2522},{"line":119,"col":72,"index":2567}],"286":[0,{"line":115,"col":2,"index":2497},{"line":119,"col":72,"index":2567}],"287":[0,{"line":122,"col":6,"index":2603},{"line":122,"col":10,"index":2607}],"288":[0,{"line":123,"col":6,"index":2616},{"line":123,"col":9,"index":2619}],"289":[0,{"line":124,"col":6,"index":2628},{"line":124,"col":10,"index":2632}],"290":[0,{"line":121,"col":22,"index":2592},{"line":125,"col":66,"index":2636}],"291":[0,{"line":121,"col":2,"index":2572},{"line":125,"col":66,"index":2636}],"292":[0,{"line":128,"col":6,"index":2677},{"line":128,"col":10,"index":2681}],"293":[0,{"line":129,"col":6,"index":2690},{"line":129,"col":9,"index":2693}],"294":[0,{"line":130,"col":6,"index":2702},{"line":130,"col":10,"index":2706}],"295":[0,{"line":127,"col":26,"index":2665},{"line":131,"col":71,"index":2710}],"296":[0,{"line":127,"col":2,"index":2641},{"line":131,"col":71,"index":2710}],"297":[0,{"line":133,"col":21,"index":2734},{"line":133,"col":24,"index":2737}],"298":[0,{"line":133,"col":27,"index":2740},{"line":133,"col":27,"index":2740}],"299":[0,{"line":133,"col":34,"index":2747},{"line":133,"col":34,"index":2747}],"300":[0,{"line":133,"col":17,"index":2730},{"line":133,"col":34,"index":2747}],"301":[0,{"line":133,"col":2,"index":2715},{"line":133,"col":34,"index":2747}],"302":[0,{"line":134,"col":16,"index":2765},{"line":134,"col":16,"index":2765}],"303":[0,{"line":134,"col":19,"index":2768},{"line":134,"col":19,"index":2768}],"304":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":28,"index":2777}],"305":[0,{"line":134,"col":32,"index":2781},{"line":134,"col":33,"index":2782}],"306":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":33,"index":2782}],"307":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":36,"index":2785}],"308":[0,{"line":134,"col":40,"index":2789},{"line":134,"col":40,"index":2789}],"309":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":40,"index":2789}],"310":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":47,"index":2796}],"311":[0,{"line":134,"col":51,"index":2800},{"line":134,"col":51,"index":2800}],"312":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":51,"index":2800}],"313":[0,{"line":134,"col":24,"index":2773},{"line":134,"col":51,"index":2800}],"314":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"315":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"316":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":12,"index":2841}],"317":[0,{"line":137,"col":17,"index":2846},{"line":137,"col":19,"index":2848}],"318":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":19,"index":2848}],"319":[0,{"line":137,"col":2,"index":2831},{"line":137,"col":19,"index":2848}],"320":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":16,"index":2866}],"321":[0,{"line":138,"col":22,"index":2872},{"line":138,"col":24,"index":2874}],"322":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":25,"index":2875}],"323":[0,{"line":138,"col":2,"index":2852},{"line":138,"col":25,"index":2875}],"324":[0,{"line":141,"col":13,"index":2939},{"line":141,"col":13,"index":2939}],"325":[0,{"line":141,"col":16,"index":2942},{"line":141,"col":16,"index":2942}],"326":[0,{"line":141,"col":21,"index":2947},{"line":141,"col":21,"index":2947}],"327":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"328":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"329":[0,{"line":142,"col":31,"index":2980},{"line":142,"col":33,"index":2982}],"330":[0,{"line":142,"col":36,"index":2985},{"line":142,"col":37,"index":2986}],"331":[0,{"line":142,"col":24,"index":2973},{"line":142,"col":38,"index":2987}],"332":[0,{"line":142,"col":2,"index":2951},{"line":142,"col":38,"index":2987}],"333":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":24,"index":3013}],"334":[0,{"line":143,"col":33,"index":3022},{"line":143,"col":34,"index":3023}],"335":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":35,"index":3024}],"336":[0,{"line":143,"col":2,"index":2991},{"line":143,"col":35,"index":3024}],"337":[0,{"line":145,"col":19,"index":3102},{"line":145,"col":19,"index":3102}],"338":[0,{"line":145,"col":22,"index":3105},{"line":145,"col":26,"index":3109}],"339":[0,{"line":145,"col":16,"index":3099},{"line":145,"col":27,"index":3110}],"340":[0,{"line":145,"col":2,"index":3085},{"line":145,"col":27,"index":3110}],"341":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":22,"index":3279}],"342":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":31,"index":3288}],"343":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":36,"index":3293}],"344":[0,{"line":150,"col":40,"index":3297},{"line":150,"col":41,"index":3298}],"345":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":41,"index":3298}],"346":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":41,"index":3298}],"347":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":42,"index":3299}],"348":[0,{"line":150,"col":2,"index":3259},{"line":150,"col":42,"index":3299}],"349":[0,{"line":152,"col":25,"index":3356},{"line":152,"col":25,"index":3356}],"350":[0,{"line":152,"col":28,"index":3359},{"line":152,"col":32,"index":3363}],"351":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":33,"index":3364}],"352":[0,{"line":152,"col":42,"index":3373},{"line":152,"col":42,"index":3373}],"353":[0,{"line":152,"col":45,"index":3376},{"line":152,"col":47,"index":3378}],"354":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":54,"index":3385}],"355":[0,{"line":152,"col":58,"index":3389},{"line":152,"col":60,"index":3391}],"356":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":60,"index":3391}],"357":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"358":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"359":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"360":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"361":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"362":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"363":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"364":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"365":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"366":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"367":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":62,"index":3393}],"368":[0,{"line":152,"col":2,"index":3333},{"line":152,"col":62,"index":3393}],"369":[0,{"line":155,"col":21,"index":3458},{"line":155,"col":21,"index":3458}],"370":[0,{"line":155,"col":15,"index":3452},{"line":155,"col":22,"index":3459}],"371":[0,{"line":155,"col":4,"index":3441},{"line":155,"col":22,"index":3459}],"372":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":6,"index":3477}],"373":[0,{"line":157,"col":10,"index":3481},{"line":157,"col":11,"index":3482}],"374":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":11,"index":3482}],"375":[0,{"line":158,"col":11,"index":3496},{"line":158,"col":11,"index":3496}],"376":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"377":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"378":[0,{"line":156,"col":4,"index":3465},{"line":159,"col":41,"index":3502}],"379":[0,{"line":155,"col":4,"index":3441},{"line":159,"col":65,"index":3502}],"380":[0,{"line":154,"col":2,"index":3414},{"line":160,"col":94,"index":3506}],"381":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":22,"index":3545}],"382":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":31,"index":3554}],"383":[0,{"line":162,"col":36,"index":3559},{"line":162,"col":39,"index":3562}],"384":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":39,"index":3562}],"385":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":40,"index":3563}],"386":[0,{"line":162,"col":2,"index":3525},{"line":162,"col":40,"index":3563}],"387":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":10,"index":3576}],"388":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":18,"index":3584}],"389":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":23,"index":3589}],"390":[0,{"line":164,"col":27,"index":3593},{"line":164,"col":27,"index":3593}],"391":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":27,"index":3593}],"392":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":27,"index":3593}],"393":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":28,"index":3594}],"394":[0,{"line":164,"col":2,"index":3568},{"line":164,"col":28,"index":3594}],"395":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":23,"index":3620}],"396":[0,{"line":166,"col":37,"index":3634},{"line":166,"col":37,"index":3634}],"397":[0,{"line":166,"col":40,"index":3637},{"line":166,"col":40,"index":3637}],"398":[0,{"line":166,"col":33,"index":3630},{"line":166,"col":41,"index":3638}],"399":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":42,"index":3639}],"400":[0,{"line":166,"col":2,"index":3599},{"line":166,"col":42,"index":3639}],"401":[0,{"line":169,"col":17,"index":3698},{"line":169,"col":17,"index":3698}],"402":[0,{"line":169,"col":20,"index":3701},{"line":169,"col":20,"index":3701}],"403":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":21,"index":3702}],"404":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":28,"index":3709}],"405":[0,{"line":169,"col":2,"index":3683},{"line":169,"col":28,"index":3709}],"406":[0,{"line":172,"col":20,"index":3753},{"line":172,"col":20,"index":3753}],"407":[0,{"line":172,"col":23,"index":3756},{"line":172,"col":23,"index":3756}],"408":[0,{"line":172,"col":26,"index":3759},{"line":172,"col":26,"index":3759}],"409":[0,{"line":172,"col":19,"index":3752},{"line":172,"col":27,"index":3760}],"410":[0,{"line":172,"col":2,"index":3735},{"line":172,"col":27,"index":3760}],"411":[0,{"line":173,"col":24,"index":3786},{"line":173,"col":24,"index":3786}],"412":[0,{"line":173,"col":27,"index":3789},{"line":173,"col":27,"index":3789}],"413":[0,{"line":173,"col":30,"index":3792},{"line":173,"col":30,"index":3792}],"414":[0,{"line":173,"col":20,"index":3782},{"line":173,"col":31,"index":3793}],"415":[0,{"line":173,"col":2,"index":3764},{"line":173,"col":31,"index":3793}],"416":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":18,"index":3813}],"417":[0,{"line":174,"col":23,"index":3818},{"line":174,"col":23,"index":3818}],"418":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":23,"index":3818}],"419":[0,{"line":174,"col":2,"index":3797},{"line":174,"col":23,"index":3818}],"420":[0,{"line":175,"col":19,"index":3839},{"line":175,"col":19,"index":3839}],"421":[0,{"line":175,"col":22,"index":3842},{"line":175,"col":22,"index":3842}],"422":[0,{"line":175,"col":25,"index":3845},{"line":175,"col":25,"index":3845}],"423":[0,{"line":175,"col":18,"index":3838},{"line":175,"col":26,"index":3846}],"424":[0,{"line":175,"col":2,"index":3822},{"line":175,"col":26,"index":3846}],"425":[0,{"line":176,"col":24,"index":3872},{"line":176,"col":24,"index":3872}],"426":[0,{"line":176,"col":27,"index":3875},{"line":176,"col":27,"index":3875}],"427":[0,{"line":176,"col":30,"index":3878},{"line":176,"col":30,"index":3878}],"428":[0,{"line":176,"col":19,"index":3867},{"line":176,"col":31,"index":3879}],"429":[0,{"line":176,"col":2,"index":3850},{"line":176,"col":31,"index":3879}],"430":[0,{"line":177,"col":23,"index":3904},{"line":177,"col":23,"index":3904}],"431":[0,{"line":177,"col":26,"index":3907},{"line":177,"col":26,"index":3907}],"432":[0,{"line":177,"col":29,"index":3910},{"line":177,"col":29,"index":3910}],"433":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":30,"index":3911}],"434":[0,{"line":177,"col":32,"index":3913},{"line":177,"col":32,"index":3913}],"435":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":33,"index":3914}],"436":[0,{"line":177,"col":2,"index":3883},{"line":177,"col":33,"index":3914}],"437":[0,{"line":178,"col":28,"index":3944},{"line":178,"col":33,"index":3949}],"438":[0,{"line":178,"col":22,"index":3938},{"line":178,"col":33,"index":3949}],"439":[0,{"line":178,"col":42,"index":3958},{"line":178,"col":45,"index":3961}],"440":[0,{"line":178,"col":36,"index":3952},{"line":178,"col":45,"index":3961}],"441":[0,{"line":178,"col":20,"index":3936},{"line":178,"col":47,"index":3963}],"442":[0,{"line":178,"col":2,"index":3918},{"line":178,"col":47,"index":3963}],"443":[0,{"line":179,"col":25,"index":3990},{"line":179,"col":30,"index":3995}],"444":[0,{"line":179,"col":33,"index":3998},{"line":179,"col":38,"index":4003}],"445":[0,{"line":179,"col":41,"index":4006},{"line":179,"col":46,"index":4011}],"446":[0,{"line":179,"col":49,"index":4014},{"line":179,"col":52,"index":4017}],"447":[0,{"line":179,"col":21,"index":3986},{"line":179,"col":53,"index":4018}],"448":[0,{"line":179,"col":2,"index":3967},{"line":179,"col":53,"index":4018}],"449":[0,{"line":180,"col":29,"index":4049},{"line":180,"col":35,"index":4055}],"450":[0,{"line":180,"col":23,"index":4043},{"line":180,"col":35,"index":4055}],"451":[0,{"line":180,"col":44,"index":4064},{"line":180,"col":47,"index":4067}],"452":[0,{"line":180,"col":38,"index":4058},{"line":180,"col":47,"index":4067}],"453":[0,{"line":180,"col":53,"index":4073},{"line":180,"col":63,"index":4083}],"454":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"455":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"456":[0,{"line":180,"col":2,"index":4022},{"line":180,"col":65,"index":4085}],"457":[0,{"line":181,"col":21,"index":4108},{"line":181,"col":21,"index":4108}],"458":[0,{"line":181,"col":24,"index":4111},{"line":181,"col":24,"index":4111}],"459":[0,{"line":181,"col":27,"index":4114},{"line":181,"col":27,"index":4114}],"460":[0,{"line":181,"col":17,"index":4104},{"line":181,"col":28,"index":4115}],"461":[0,{"line":181,"col":2,"index":4089},{"line":181,"col":28,"index":4115}],"462":[0,{"line":185,"col":22,"index":4187},{"line":185,"col":22,"index":4187}],"463":[0,{"line":185,"col":19,"index":4184},{"line":185,"col":22,"index":4187}],"464":[0,{"line":185,"col":28,"index":4193},{"line":185,"col":32,"index":4197}],"465":[0,{"line":185,"col":25,"index":4190},{"line":185,"col":32,"index":4197}],"466":[0,{"line":185,"col":17,"index":4182},{"line":185,"col":34,"index":4199}],"467":[0,{"line":185,"col":4,"index":4169},{"line":185,"col":34,"index":4199}],"468":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":9,"index":4210}],"469":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"470":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"471":[0,{"line":185,"col":4,"index":4169},{"line":186,"col":47,"index":4212}],"472":[0,{"line":184,"col":2,"index":4149},{"line":186,"col":65,"index":4212}],"473":[0,{"line":189,"col":21,"index":4253},{"line":189,"col":23,"index":4255}],"474":[0,{"line":189,"col":26,"index":4258},{"line":189,"col":26,"index":4258}],"475":[0,{"line":189,"col":17,"index":4249},{"line":189,"col":27,"index":4259}],"476":[0,{"line":189,"col":4,"index":4236},{"line":189,"col":27,"index":4259}],"477":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":9,"index":4270}],"478":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"479":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"480":[0,{"line":189,"col":4,"index":4236},{"line":190,"col":41,"index":4273}],"481":[0,{"line":188,"col":2,"index":4217},{"line":190,"col":58,"index":4273}],"482":[0,{"line":192,"col":14,"index":4290},{"line":192,"col":14,"index":4290}],"483":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":19,"index":4295}],"484":[0,{"line":192,"col":24,"index":4300},{"line":192,"col":25,"index":4301}],"485":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":25,"index":4301}],"486":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"487":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"488":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":19,"index":4349}],"489":[0,{"line":195,"col":24,"index":4354},{"line":195,"col":28,"index":4358}],"490":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":29,"index":4359}],"491":[0,{"line":195,"col":2,"index":4332},{"line":195,"col":29,"index":4359}],"492":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":27,"index":4388}],"493":[0,{"line":196,"col":38,"index":4399},{"line":196,"col":42,"index":4403}],"494":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":43,"index":4404}],"495":[0,{"line":196,"col":2,"index":4363},{"line":196,"col":43,"index":4404}],"496":[0,{"line":197,"col":22,"index":4428},{"line":197,"col":22,"index":4428}],"497":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":23,"index":4429}],"498":[0,{"line":197,"col":41,"index":4447},{"line":197,"col":41,"index":4447}],"499":[0,{"line":197,"col":43,"index":4449},{"line":197,"col":43,"index":4449}],"500":[0,{"line":197,"col":45,"index":4451},{"line":197,"col":45,"index":4451}],"501":[0,{"line":197,"col":37,"index":4443},{"line":197,"col":46,"index":4452}],"502":[0,{"line":197,"col":28,"index":4434},{"line":197,"col":47,"index":4453}],"503":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":48,"index":4454}],"504":[0,{"line":197,"col":2,"index":4408},{"line":197,"col":48,"index":4454}],"505":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":20,"index":4501}],"506":[0,{"line":200,"col":24,"index":4505},{"line":200,"col":24,"index":4505}],"507":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":24,"index":4505}],"508":[0,{"line":200,"col":2,"index":4483},{"line":200,"col":24,"index":4505}],"509":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":13,"index":4549}],"510":[0,{"line":202,"col":18,"index":4554},{"line":202,"col":18,"index":4554}],"511":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":18,"index":4554}],"512":[0,{"line":202,"col":2,"index":4538},{"line":202,"col":18,"index":4554}],"513":[0,{"line":205,"col":2,"index":4572},{"line":205,"col":14,"index":4584}],"514":[0,{"line":206,"col":2,"index":4588},{"line":206,"col":12,"index":4598}],"515":[0,{"line":209,"col":21,"index":4636},{"line":209,"col":23,"index":4638}],"516":[0,{"line":209,"col":17,"index":4632},{"line":209,"col":24,"index":4639}],"517":[0,{"line":209,"col":2,"index":4617},{"line":209,"col":24,"index":4639}],"518":[0,{"line":211,"col":2,"index":4644},{"line":211,"col":24,"index":4666}],"519":[0,{"line":213,"col":10,"index":4679},{"line":213,"col":16,"index":4685}],"520":[0,{"line":213,"col":2,"index":4671},{"line":213,"col":16,"index":4685}],"521":[0,{"line":221,"col":19,"index":4906},{"line":221,"col":19,"index":4906}],"522":[0,{"line":221,"col":15,"index":4902},{"line":221,"col":15,"index":4902}],"523":[0,{"line":221,"col":2,"index":4889},{"line":221,"col":29,"index":4916}],"524":[0,{"line":14,"col":0,"index":140},{"line":225,"col":4855,"index":4995}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/SuperSpec.qnt"},"map":{"1":[0,{"line":1,"col":12,"index":24},{"line":1,"col":12,"index":24}],"2":[0,{"line":1,"col":2,"index":14},{"line":1,"col":12,"index":24}],"3":[0,{"line":0,"col":0,"index":0},{"line":2,"col":26,"index":26}],"4":[0,{"line":5,"col":12,"index":53},{"line":5,"col":12,"index":53}],"5":[0,{"line":5,"col":2,"index":43},{"line":5,"col":12,"index":53}],"6":[0,{"line":4,"col":0,"index":29},{"line":6,"col":26,"index":55}],"7":[0,{"line":9,"col":11,"index":84},{"line":9,"col":13,"index":86}],"8":[0,{"line":9,"col":2,"index":75},{"line":9,"col":13,"index":86}],"9":[0,{"line":10,"col":9,"index":97},{"line":10,"col":11,"index":99}],"10":[0,{"line":10,"col":2,"index":90},{"line":10,"col":11,"index":99}],"11":[0,{"line":8,"col":0,"index":58},{"line":11,"col":43,"index":101}],"12":[0,{"line":16,"col":11,"index":186},{"line":16,"col":13,"index":188}],"13":[0,{"line":16,"col":2,"index":177},{"line":16,"col":13,"index":188}],"14":[0,{"line":17,"col":15,"index":205},{"line":17,"col":17,"index":207}],"15":[0,{"line":17,"col":11,"index":201},{"line":17,"col":18,"index":208}],"16":[0,{"line":17,"col":2,"index":192},{"line":17,"col":18,"index":208}],"17":[0,{"line":18,"col":19,"index":229},{"line":18,"col":21,"index":231}],"18":[0,{"line":18,"col":15,"index":225},{"line":18,"col":22,"index":232}],"19":[0,{"line":18,"col":2,"index":212},{"line":18,"col":22,"index":232}],"20":[0,{"line":19,"col":20,"index":254},{"line":19,"col":23,"index":257}],"21":[0,{"line":19,"col":15,"index":249},{"line":19,"col":24,"index":258}],"22":[0,{"line":19,"col":2,"index":236},{"line":19,"col":24,"index":258}],"23":[0,{"line":20,"col":15,"index":275},{"line":20,"col":17,"index":277}],"24":[0,{"line":20,"col":22,"index":282},{"line":20,"col":24,"index":284}],"25":[0,{"line":20,"col":15,"index":275},{"line":20,"col":24,"index":284}],"26":[0,{"line":20,"col":2,"index":262},{"line":20,"col":24,"index":284}],"27":[0,{"line":21,"col":19,"index":305},{"line":21,"col":21,"index":307}],"28":[0,{"line":21,"col":26,"index":312},{"line":21,"col":28,"index":314}],"29":[0,{"line":21,"col":19,"index":305},{"line":21,"col":28,"index":314}],"30":[0,{"line":21,"col":34,"index":320},{"line":21,"col":37,"index":323}],"31":[0,{"line":21,"col":18,"index":304},{"line":21,"col":37,"index":323}],"32":[0,{"line":21,"col":2,"index":288},{"line":21,"col":37,"index":323}],"33":[0,{"line":22,"col":21,"index":346},{"line":22,"col":23,"index":348}],"34":[0,{"line":22,"col":26,"index":351},{"line":22,"col":28,"index":353}],"35":[0,{"line":22,"col":34,"index":359},{"line":22,"col":37,"index":362}],"36":[0,{"line":22,"col":20,"index":345},{"line":22,"col":37,"index":362}],"37":[0,{"line":22,"col":2,"index":327},{"line":22,"col":37,"index":362}],"38":[0,{"line":23,"col":30,"index":394},{"line":23,"col":32,"index":396}],"39":[0,{"line":23,"col":35,"index":399},{"line":23,"col":37,"index":401}],"40":[0,{"line":23,"col":45,"index":409},{"line":23,"col":48,"index":412}],"41":[0,{"line":23,"col":29,"index":393},{"line":23,"col":48,"index":412}],"42":[0,{"line":23,"col":2,"index":366},{"line":23,"col":48,"index":412}],"43":[0,{"line":24,"col":18,"index":432},{"line":24,"col":20,"index":434}],"44":[0,{"line":24,"col":23,"index":437},{"line":24,"col":26,"index":440}],"45":[0,{"line":24,"col":29,"index":443},{"line":24,"col":31,"index":445}],"46":[0,{"line":24,"col":17,"index":431},{"line":24,"col":32,"index":446}],"47":[0,{"line":24,"col":2,"index":416},{"line":24,"col":32,"index":446}],"48":[0,{"line":25,"col":27,"index":475},{"line":25,"col":29,"index":477}],"49":[0,{"line":25,"col":32,"index":480},{"line":25,"col":35,"index":483}],"50":[0,{"line":25,"col":38,"index":486},{"line":25,"col":40,"index":488}],"51":[0,{"line":25,"col":26,"index":474},{"line":25,"col":43,"index":491}],"52":[0,{"line":25,"col":2,"index":450},{"line":25,"col":43,"index":491}],"53":[0,{"line":28,"col":23,"index":580},{"line":28,"col":25,"index":582}],"54":[0,{"line":28,"col":31,"index":588},{"line":28,"col":34,"index":591}],"55":[0,{"line":28,"col":40,"index":597},{"line":28,"col":42,"index":599}],"56":[0,{"line":28,"col":18,"index":575},{"line":28,"col":44,"index":601}],"57":[0,{"line":28,"col":2,"index":559},{"line":28,"col":44,"index":601}],"58":[0,{"line":29,"col":32,"index":635},{"line":29,"col":34,"index":637}],"59":[0,{"line":29,"col":40,"index":643},{"line":29,"col":43,"index":646}],"60":[0,{"line":29,"col":49,"index":652},{"line":29,"col":51,"index":654}],"61":[0,{"line":29,"col":27,"index":630},{"line":29,"col":54,"index":657}],"62":[0,{"line":29,"col":2,"index":605},{"line":29,"col":54,"index":657}],"63":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"64":[0,{"line":34,"col":26,"index":777},{"line":34,"col":28,"index":779}],"65":[0,{"line":34,"col":39,"index":790},{"line":34,"col":41,"index":792}],"66":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"67":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"68":[0,{"line":32,"col":2,"index":712},{"line":35,"col":102,"index":812}],"69":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"70":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"71":[0,{"line":33,"col":8,"index":739},{"line":33,"col":13,"index":744}],"72":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"73":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"74":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"75":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"76":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"77":[0,{"line":34,"col":8,"index":759},{"line":34,"col":16,"index":767}],"78":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"79":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"80":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"81":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"82":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"83":[0,{"line":35,"col":8,"index":805},{"line":35,"col":10,"index":807}],"84":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"85":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"86":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"87":[0,{"line":36,"col":17,"index":831},{"line":36,"col":27,"index":841}],"88":[0,{"line":36,"col":2,"index":816},{"line":36,"col":27,"index":841}],"89":[0,{"line":41,"col":9,"index":955},{"line":41,"col":11,"index":957}],"90":[0,{"line":41,"col":2,"index":948},{"line":41,"col":11,"index":957}],"91":[0,{"line":42,"col":9,"index":968},{"line":42,"col":12,"index":971}],"92":[0,{"line":42,"col":2,"index":961},{"line":42,"col":12,"index":971}],"93":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":19,"index":1140}],"94":[0,{"line":47,"col":23,"index":1144},{"line":47,"col":23,"index":1144}],"95":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":23,"index":1144}],"96":[0,{"line":47,"col":2,"index":1123},{"line":47,"col":23,"index":1144}],"97":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":19,"index":1165}],"98":[0,{"line":48,"col":23,"index":1169},{"line":48,"col":23,"index":1169}],"99":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":23,"index":1169}],"100":[0,{"line":48,"col":2,"index":1148},{"line":48,"col":23,"index":1169}],"101":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":19,"index":1190}],"102":[0,{"line":49,"col":23,"index":1194},{"line":49,"col":23,"index":1194}],"103":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":23,"index":1194}],"104":[0,{"line":49,"col":2,"index":1173},{"line":49,"col":23,"index":1194}],"105":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":19,"index":1215}],"106":[0,{"line":50,"col":23,"index":1219},{"line":50,"col":23,"index":1219}],"107":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":23,"index":1219}],"108":[0,{"line":50,"col":2,"index":1198},{"line":50,"col":23,"index":1219}],"109":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":19,"index":1240}],"110":[0,{"line":51,"col":23,"index":1244},{"line":51,"col":23,"index":1244}],"111":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":23,"index":1244}],"112":[0,{"line":51,"col":2,"index":1223},{"line":51,"col":23,"index":1244}],"113":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":19,"index":1265}],"114":[0,{"line":52,"col":21,"index":1267},{"line":52,"col":21,"index":1267}],"115":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":21,"index":1267}],"116":[0,{"line":52,"col":2,"index":1248},{"line":52,"col":21,"index":1267}],"117":[0,{"line":53,"col":16,"index":1285},{"line":53,"col":18,"index":1287}],"118":[0,{"line":53,"col":15,"index":1284},{"line":53,"col":18,"index":1287}],"119":[0,{"line":53,"col":2,"index":1271},{"line":53,"col":18,"index":1287}],"120":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":18,"index":1307}],"121":[0,{"line":54,"col":22,"index":1311},{"line":54,"col":22,"index":1311}],"122":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":22,"index":1311}],"123":[0,{"line":54,"col":2,"index":1291},{"line":54,"col":22,"index":1311}],"124":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":18,"index":1331}],"125":[0,{"line":55,"col":23,"index":1336},{"line":55,"col":23,"index":1336}],"126":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":23,"index":1336}],"127":[0,{"line":55,"col":2,"index":1315},{"line":55,"col":23,"index":1336}],"128":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":18,"index":1356}],"129":[0,{"line":56,"col":22,"index":1360},{"line":56,"col":22,"index":1360}],"130":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":22,"index":1360}],"131":[0,{"line":56,"col":2,"index":1340},{"line":56,"col":22,"index":1360}],"132":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":18,"index":1380}],"133":[0,{"line":57,"col":23,"index":1385},{"line":57,"col":23,"index":1385}],"134":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":23,"index":1385}],"135":[0,{"line":57,"col":2,"index":1364},{"line":57,"col":23,"index":1385}],"136":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":20,"index":1407}],"137":[0,{"line":58,"col":25,"index":1412},{"line":58,"col":25,"index":1412}],"138":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":25,"index":1412}],"139":[0,{"line":58,"col":2,"index":1389},{"line":58,"col":25,"index":1412}],"140":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":18,"index":1432}],"141":[0,{"line":59,"col":23,"index":1437},{"line":59,"col":23,"index":1437}],"142":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":23,"index":1437}],"143":[0,{"line":59,"col":2,"index":1416},{"line":59,"col":23,"index":1437}],"144":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":6,"index":1464}],"145":[0,{"line":61,"col":10,"index":1468},{"line":61,"col":10,"index":1468}],"146":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":10,"index":1468}],"147":[0,{"line":61,"col":15,"index":1473},{"line":61,"col":15,"index":1473}],"148":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":15,"index":1473}],"149":[0,{"line":60,"col":2,"index":1441},{"line":62,"col":38,"index":1477}],"150":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":25,"index":1504}],"151":[0,{"line":63,"col":30,"index":1509},{"line":63,"col":32,"index":1511}],"152":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":33,"index":1512}],"153":[0,{"line":63,"col":2,"index":1481},{"line":63,"col":33,"index":1512}],"154":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":26,"index":1540}],"155":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":35,"index":1549}],"156":[0,{"line":64,"col":40,"index":1554},{"line":64,"col":40,"index":1554}],"157":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":40,"index":1554}],"158":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":41,"index":1555}],"159":[0,{"line":64,"col":2,"index":1516},{"line":64,"col":41,"index":1555}],"160":[0,{"line":67,"col":20,"index":1594},{"line":67,"col":22,"index":1596}],"161":[0,{"line":67,"col":16,"index":1590},{"line":67,"col":23,"index":1597}],"162":[0,{"line":67,"col":31,"index":1605},{"line":67,"col":31,"index":1605}],"163":[0,{"line":67,"col":34,"index":1608},{"line":67,"col":34,"index":1608}],"164":[0,{"line":67,"col":27,"index":1601},{"line":67,"col":35,"index":1609}],"165":[0,{"line":67,"col":2,"index":1576},{"line":67,"col":35,"index":1609}],"166":[0,{"line":69,"col":2,"index":1648},{"line":69,"col":10,"index":1656}],"167":[0,{"line":70,"col":33,"index":1691},{"line":70,"col":36,"index":1694}],"168":[0,{"line":70,"col":29,"index":1687},{"line":70,"col":37,"index":1695}],"169":[0,{"line":70,"col":41,"index":1699},{"line":70,"col":45,"index":1703}],"170":[0,{"line":70,"col":2,"index":1660},{"line":70,"col":45,"index":1703}],"171":[0,{"line":73,"col":9,"index":1741},{"line":73,"col":11,"index":1743}],"172":[0,{"line":73,"col":2,"index":1734},{"line":73,"col":11,"index":1743}],"173":[0,{"line":74,"col":25,"index":1770},{"line":74,"col":26,"index":1771}],"174":[0,{"line":74,"col":2,"index":1747},{"line":74,"col":26,"index":1771}],"175":[0,{"line":75,"col":15,"index":1788},{"line":75,"col":15,"index":1788}],"176":[0,{"line":75,"col":18,"index":1791},{"line":75,"col":18,"index":1791}],"177":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":23,"index":1796}],"178":[0,{"line":75,"col":27,"index":1800},{"line":75,"col":27,"index":1800}],"179":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":27,"index":1800}],"180":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"181":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"182":[0,{"line":76,"col":10,"index":1812},{"line":76,"col":15,"index":1817}],"183":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":25,"index":1827}],"184":[0,{"line":76,"col":29,"index":1831},{"line":76,"col":29,"index":1831}],"185":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":29,"index":1831}],"186":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"187":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"188":[0,{"line":77,"col":11,"index":1844},{"line":77,"col":11,"index":1844}],"189":[0,{"line":77,"col":21,"index":1854},{"line":77,"col":21,"index":1854}],"190":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"191":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"192":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"193":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"194":[0,{"line":78,"col":13,"index":1869},{"line":78,"col":13,"index":1869}],"195":[0,{"line":78,"col":22,"index":1878},{"line":78,"col":22,"index":1878}],"196":[0,{"line":78,"col":18,"index":1874},{"line":78,"col":23,"index":1879}],"197":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"198":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"199":[0,{"line":81,"col":8,"index":1911},{"line":81,"col":8,"index":1911}],"200":[0,{"line":81,"col":11,"index":1914},{"line":81,"col":11,"index":1914}],"201":[0,{"line":81,"col":16,"index":1919},{"line":81,"col":18,"index":1921}],"202":[0,{"line":81,"col":21,"index":1924},{"line":81,"col":23,"index":1926}],"203":[0,{"line":81,"col":29,"index":1932},{"line":81,"col":31,"index":1934}],"204":[0,{"line":81,"col":15,"index":1918},{"line":81,"col":31,"index":1934}],"205":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":6,"index":1946}],"206":[0,{"line":82,"col":10,"index":1950},{"line":82,"col":10,"index":1950}],"207":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":10,"index":1950}],"208":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"209":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"210":[0,{"line":85,"col":10,"index":1997},{"line":85,"col":10,"index":1997}],"211":[0,{"line":85,"col":15,"index":2002},{"line":85,"col":15,"index":2002}],"212":[0,{"line":85,"col":21,"index":2008},{"line":85,"col":21,"index":2008}],"213":[0,{"line":85,"col":14,"index":2001},{"line":85,"col":21,"index":2008}],"214":[0,{"line":86,"col":6,"index":2020},{"line":86,"col":6,"index":2020}],"215":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"216":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"217":[0,{"line":89,"col":9,"index":2036},{"line":89,"col":11,"index":2038}],"218":[0,{"line":89,"col":2,"index":2029},{"line":89,"col":11,"index":2038}],"219":[0,{"line":90,"col":21,"index":2061},{"line":90,"col":21,"index":2061}],"220":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"221":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"222":[0,{"line":90,"col":2,"index":2042},{"line":90,"col":21,"index":2061}],"223":[0,{"line":93,"col":18,"index":2116},{"line":93,"col":20,"index":2118}],"224":[0,{"line":93,"col":15,"index":2113},{"line":93,"col":20,"index":2118}],"225":[0,{"line":93,"col":26,"index":2124},{"line":93,"col":28,"index":2126}],"226":[0,{"line":93,"col":23,"index":2121},{"line":93,"col":28,"index":2126}],"227":[0,{"line":93,"col":32,"index":2130},{"line":93,"col":34,"index":2132}],"228":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":8,"index":2146}],"229":[0,{"line":94,"col":12,"index":2150},{"line":94,"col":12,"index":2150}],"230":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":12,"index":2150}],"231":[0,{"line":95,"col":4,"index":2157},{"line":95,"col":4,"index":2157}],"232":[0,{"line":96,"col":9,"index":2168},{"line":96,"col":9,"index":2168}],"233":[0,{"line":94,"col":4,"index":2142},{"line":96,"col":30,"index":2168}],"234":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"235":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"236":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":21,"index":2220}],"237":[0,{"line":101,"col":27,"index":2226},{"line":101,"col":30,"index":2229}],"238":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":30,"index":2229}],"239":[0,{"line":101,"col":2,"index":2201},{"line":101,"col":30,"index":2229}],"240":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":20,"index":2251}],"241":[0,{"line":102,"col":25,"index":2256},{"line":102,"col":28,"index":2259}],"242":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":28,"index":2259}],"243":[0,{"line":102,"col":2,"index":2233},{"line":102,"col":28,"index":2259}],"244":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":25,"index":2286}],"245":[0,{"line":103,"col":35,"index":2296},{"line":103,"col":38,"index":2299}],"246":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":38,"index":2299}],"247":[0,{"line":103,"col":2,"index":2263},{"line":103,"col":38,"index":2299}],"248":[0,{"line":104,"col":8,"index":2309},{"line":104,"col":8,"index":2309}],"249":[0,{"line":104,"col":13,"index":2314},{"line":104,"col":13,"index":2314}],"250":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"251":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"252":[0,{"line":105,"col":8,"index":2324},{"line":105,"col":8,"index":2324}],"253":[0,{"line":105,"col":15,"index":2331},{"line":105,"col":15,"index":2331}],"254":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":16,"index":2332}],"255":[0,{"line":105,"col":26,"index":2342},{"line":105,"col":26,"index":2342}],"256":[0,{"line":105,"col":22,"index":2338},{"line":105,"col":27,"index":2343}],"257":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":27,"index":2343}],"258":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"259":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"260":[0,{"line":106,"col":19,"index":2364},{"line":106,"col":19,"index":2364}],"261":[0,{"line":106,"col":26,"index":2371},{"line":106,"col":26,"index":2371}],"262":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":27,"index":2372}],"263":[0,{"line":106,"col":37,"index":2382},{"line":106,"col":37,"index":2382}],"264":[0,{"line":106,"col":33,"index":2378},{"line":106,"col":38,"index":2383}],"265":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":38,"index":2383}],"266":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"267":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"268":[0,{"line":107,"col":18,"index":2403},{"line":107,"col":18,"index":2403}],"269":[0,{"line":107,"col":25,"index":2410},{"line":107,"col":25,"index":2410}],"270":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":26,"index":2411}],"271":[0,{"line":107,"col":35,"index":2420},{"line":107,"col":35,"index":2420}],"272":[0,{"line":107,"col":31,"index":2416},{"line":107,"col":36,"index":2421}],"273":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":36,"index":2421}],"274":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"275":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"276":[0,{"line":110,"col":6,"index":2459},{"line":110,"col":10,"index":2463}],"277":[0,{"line":111,"col":6,"index":2472},{"line":111,"col":9,"index":2475}],"278":[0,{"line":112,"col":6,"index":2484},{"line":112,"col":10,"index":2488}],"279":[0,{"line":109,"col":23,"index":2447},{"line":113,"col":68,"index":2492}],"280":[0,{"line":109,"col":2,"index":2426},{"line":113,"col":68,"index":2492}],"281":[0,{"line":116,"col":6,"index":2534},{"line":116,"col":10,"index":2538}],"282":[0,{"line":117,"col":6,"index":2547},{"line":117,"col":9,"index":2550}],"283":[0,{"line":118,"col":6,"index":2559},{"line":118,"col":10,"index":2563}],"284":[0,{"line":115,"col":27,"index":2522},{"line":119,"col":72,"index":2567}],"285":[0,{"line":115,"col":2,"index":2497},{"line":119,"col":72,"index":2567}],"286":[0,{"line":122,"col":6,"index":2603},{"line":122,"col":10,"index":2607}],"287":[0,{"line":123,"col":6,"index":2616},{"line":123,"col":9,"index":2619}],"288":[0,{"line":124,"col":6,"index":2628},{"line":124,"col":10,"index":2632}],"289":[0,{"line":121,"col":22,"index":2592},{"line":125,"col":66,"index":2636}],"290":[0,{"line":121,"col":2,"index":2572},{"line":125,"col":66,"index":2636}],"291":[0,{"line":128,"col":6,"index":2677},{"line":128,"col":10,"index":2681}],"292":[0,{"line":129,"col":6,"index":2690},{"line":129,"col":9,"index":2693}],"293":[0,{"line":130,"col":6,"index":2702},{"line":130,"col":10,"index":2706}],"294":[0,{"line":127,"col":26,"index":2665},{"line":131,"col":71,"index":2710}],"295":[0,{"line":127,"col":2,"index":2641},{"line":131,"col":71,"index":2710}],"296":[0,{"line":133,"col":21,"index":2734},{"line":133,"col":24,"index":2737}],"297":[0,{"line":133,"col":27,"index":2740},{"line":133,"col":27,"index":2740}],"298":[0,{"line":133,"col":34,"index":2747},{"line":133,"col":34,"index":2747}],"299":[0,{"line":133,"col":17,"index":2730},{"line":133,"col":34,"index":2747}],"300":[0,{"line":133,"col":2,"index":2715},{"line":133,"col":34,"index":2747}],"301":[0,{"line":134,"col":16,"index":2765},{"line":134,"col":16,"index":2765}],"302":[0,{"line":134,"col":19,"index":2768},{"line":134,"col":19,"index":2768}],"303":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":28,"index":2777}],"304":[0,{"line":134,"col":32,"index":2781},{"line":134,"col":33,"index":2782}],"305":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":33,"index":2782}],"306":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":36,"index":2785}],"307":[0,{"line":134,"col":40,"index":2789},{"line":134,"col":40,"index":2789}],"308":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":40,"index":2789}],"309":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":47,"index":2796}],"310":[0,{"line":134,"col":51,"index":2800},{"line":134,"col":51,"index":2800}],"311":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":51,"index":2800}],"312":[0,{"line":134,"col":24,"index":2773},{"line":134,"col":51,"index":2800}],"313":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"314":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"315":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":12,"index":2841}],"316":[0,{"line":137,"col":17,"index":2846},{"line":137,"col":19,"index":2848}],"317":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":19,"index":2848}],"318":[0,{"line":137,"col":2,"index":2831},{"line":137,"col":19,"index":2848}],"319":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":16,"index":2866}],"320":[0,{"line":138,"col":22,"index":2872},{"line":138,"col":24,"index":2874}],"321":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":25,"index":2875}],"322":[0,{"line":138,"col":2,"index":2852},{"line":138,"col":25,"index":2875}],"323":[0,{"line":141,"col":13,"index":2939},{"line":141,"col":13,"index":2939}],"324":[0,{"line":141,"col":16,"index":2942},{"line":141,"col":16,"index":2942}],"325":[0,{"line":141,"col":21,"index":2947},{"line":141,"col":21,"index":2947}],"326":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"327":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"328":[0,{"line":142,"col":31,"index":2980},{"line":142,"col":33,"index":2982}],"329":[0,{"line":142,"col":36,"index":2985},{"line":142,"col":37,"index":2986}],"330":[0,{"line":142,"col":24,"index":2973},{"line":142,"col":38,"index":2987}],"331":[0,{"line":142,"col":2,"index":2951},{"line":142,"col":38,"index":2987}],"332":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":24,"index":3013}],"333":[0,{"line":143,"col":33,"index":3022},{"line":143,"col":34,"index":3023}],"334":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":35,"index":3024}],"335":[0,{"line":143,"col":2,"index":2991},{"line":143,"col":35,"index":3024}],"336":[0,{"line":145,"col":19,"index":3102},{"line":145,"col":19,"index":3102}],"337":[0,{"line":145,"col":22,"index":3105},{"line":145,"col":26,"index":3109}],"338":[0,{"line":145,"col":16,"index":3099},{"line":145,"col":27,"index":3110}],"339":[0,{"line":145,"col":2,"index":3085},{"line":145,"col":27,"index":3110}],"340":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":22,"index":3279}],"341":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":31,"index":3288}],"342":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":36,"index":3293}],"343":[0,{"line":150,"col":40,"index":3297},{"line":150,"col":41,"index":3298}],"344":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":41,"index":3298}],"345":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":41,"index":3298}],"346":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":42,"index":3299}],"347":[0,{"line":150,"col":2,"index":3259},{"line":150,"col":42,"index":3299}],"348":[0,{"line":152,"col":25,"index":3356},{"line":152,"col":25,"index":3356}],"349":[0,{"line":152,"col":28,"index":3359},{"line":152,"col":32,"index":3363}],"350":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":33,"index":3364}],"351":[0,{"line":152,"col":42,"index":3373},{"line":152,"col":42,"index":3373}],"352":[0,{"line":152,"col":45,"index":3376},{"line":152,"col":47,"index":3378}],"353":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":54,"index":3385}],"354":[0,{"line":152,"col":58,"index":3389},{"line":152,"col":60,"index":3391}],"355":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":60,"index":3391}],"356":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"357":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"358":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"359":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"360":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"361":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"362":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"363":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"364":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"365":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"366":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":62,"index":3393}],"367":[0,{"line":152,"col":2,"index":3333},{"line":152,"col":62,"index":3393}],"368":[0,{"line":155,"col":21,"index":3458},{"line":155,"col":21,"index":3458}],"369":[0,{"line":155,"col":15,"index":3452},{"line":155,"col":22,"index":3459}],"370":[0,{"line":155,"col":4,"index":3441},{"line":155,"col":22,"index":3459}],"371":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":6,"index":3477}],"372":[0,{"line":157,"col":10,"index":3481},{"line":157,"col":11,"index":3482}],"373":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":11,"index":3482}],"374":[0,{"line":158,"col":11,"index":3496},{"line":158,"col":11,"index":3496}],"375":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"376":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"377":[0,{"line":156,"col":4,"index":3465},{"line":159,"col":41,"index":3502}],"378":[0,{"line":155,"col":4,"index":3441},{"line":159,"col":65,"index":3502}],"379":[0,{"line":154,"col":2,"index":3414},{"line":160,"col":94,"index":3506}],"380":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":22,"index":3545}],"381":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":31,"index":3554}],"382":[0,{"line":162,"col":36,"index":3559},{"line":162,"col":39,"index":3562}],"383":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":39,"index":3562}],"384":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":40,"index":3563}],"385":[0,{"line":162,"col":2,"index":3525},{"line":162,"col":40,"index":3563}],"386":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":10,"index":3576}],"387":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":18,"index":3584}],"388":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":23,"index":3589}],"389":[0,{"line":164,"col":27,"index":3593},{"line":164,"col":27,"index":3593}],"390":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":27,"index":3593}],"391":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":27,"index":3593}],"392":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":28,"index":3594}],"393":[0,{"line":164,"col":2,"index":3568},{"line":164,"col":28,"index":3594}],"394":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":23,"index":3620}],"395":[0,{"line":166,"col":37,"index":3634},{"line":166,"col":37,"index":3634}],"396":[0,{"line":166,"col":40,"index":3637},{"line":166,"col":40,"index":3637}],"397":[0,{"line":166,"col":33,"index":3630},{"line":166,"col":41,"index":3638}],"398":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":42,"index":3639}],"399":[0,{"line":166,"col":2,"index":3599},{"line":166,"col":42,"index":3639}],"400":[0,{"line":169,"col":17,"index":3698},{"line":169,"col":17,"index":3698}],"401":[0,{"line":169,"col":20,"index":3701},{"line":169,"col":20,"index":3701}],"402":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":21,"index":3702}],"403":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":28,"index":3709}],"404":[0,{"line":169,"col":2,"index":3683},{"line":169,"col":28,"index":3709}],"405":[0,{"line":172,"col":20,"index":3753},{"line":172,"col":20,"index":3753}],"406":[0,{"line":172,"col":23,"index":3756},{"line":172,"col":23,"index":3756}],"407":[0,{"line":172,"col":26,"index":3759},{"line":172,"col":26,"index":3759}],"408":[0,{"line":172,"col":19,"index":3752},{"line":172,"col":27,"index":3760}],"409":[0,{"line":172,"col":2,"index":3735},{"line":172,"col":27,"index":3760}],"410":[0,{"line":173,"col":24,"index":3786},{"line":173,"col":24,"index":3786}],"411":[0,{"line":173,"col":27,"index":3789},{"line":173,"col":27,"index":3789}],"412":[0,{"line":173,"col":30,"index":3792},{"line":173,"col":30,"index":3792}],"413":[0,{"line":173,"col":20,"index":3782},{"line":173,"col":31,"index":3793}],"414":[0,{"line":173,"col":2,"index":3764},{"line":173,"col":31,"index":3793}],"415":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":18,"index":3813}],"416":[0,{"line":174,"col":23,"index":3818},{"line":174,"col":23,"index":3818}],"417":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":23,"index":3818}],"418":[0,{"line":174,"col":2,"index":3797},{"line":174,"col":23,"index":3818}],"419":[0,{"line":175,"col":19,"index":3839},{"line":175,"col":19,"index":3839}],"420":[0,{"line":175,"col":22,"index":3842},{"line":175,"col":22,"index":3842}],"421":[0,{"line":175,"col":25,"index":3845},{"line":175,"col":25,"index":3845}],"422":[0,{"line":175,"col":18,"index":3838},{"line":175,"col":26,"index":3846}],"423":[0,{"line":175,"col":2,"index":3822},{"line":175,"col":26,"index":3846}],"424":[0,{"line":176,"col":24,"index":3872},{"line":176,"col":24,"index":3872}],"425":[0,{"line":176,"col":27,"index":3875},{"line":176,"col":27,"index":3875}],"426":[0,{"line":176,"col":30,"index":3878},{"line":176,"col":30,"index":3878}],"427":[0,{"line":176,"col":19,"index":3867},{"line":176,"col":31,"index":3879}],"428":[0,{"line":176,"col":2,"index":3850},{"line":176,"col":31,"index":3879}],"429":[0,{"line":177,"col":23,"index":3904},{"line":177,"col":23,"index":3904}],"430":[0,{"line":177,"col":26,"index":3907},{"line":177,"col":26,"index":3907}],"431":[0,{"line":177,"col":29,"index":3910},{"line":177,"col":29,"index":3910}],"432":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":30,"index":3911}],"433":[0,{"line":177,"col":32,"index":3913},{"line":177,"col":32,"index":3913}],"434":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":33,"index":3914}],"435":[0,{"line":177,"col":2,"index":3883},{"line":177,"col":33,"index":3914}],"436":[0,{"line":178,"col":28,"index":3944},{"line":178,"col":33,"index":3949}],"437":[0,{"line":178,"col":22,"index":3938},{"line":178,"col":33,"index":3949}],"438":[0,{"line":178,"col":42,"index":3958},{"line":178,"col":45,"index":3961}],"439":[0,{"line":178,"col":36,"index":3952},{"line":178,"col":45,"index":3961}],"440":[0,{"line":178,"col":20,"index":3936},{"line":178,"col":47,"index":3963}],"441":[0,{"line":178,"col":2,"index":3918},{"line":178,"col":47,"index":3963}],"442":[0,{"line":179,"col":25,"index":3990},{"line":179,"col":30,"index":3995}],"443":[0,{"line":179,"col":33,"index":3998},{"line":179,"col":38,"index":4003}],"444":[0,{"line":179,"col":41,"index":4006},{"line":179,"col":46,"index":4011}],"445":[0,{"line":179,"col":49,"index":4014},{"line":179,"col":52,"index":4017}],"446":[0,{"line":179,"col":21,"index":3986},{"line":179,"col":53,"index":4018}],"447":[0,{"line":179,"col":2,"index":3967},{"line":179,"col":53,"index":4018}],"448":[0,{"line":180,"col":29,"index":4049},{"line":180,"col":35,"index":4055}],"449":[0,{"line":180,"col":23,"index":4043},{"line":180,"col":35,"index":4055}],"450":[0,{"line":180,"col":44,"index":4064},{"line":180,"col":47,"index":4067}],"451":[0,{"line":180,"col":38,"index":4058},{"line":180,"col":47,"index":4067}],"452":[0,{"line":180,"col":53,"index":4073},{"line":180,"col":63,"index":4083}],"453":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"454":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"455":[0,{"line":180,"col":2,"index":4022},{"line":180,"col":65,"index":4085}],"456":[0,{"line":181,"col":21,"index":4108},{"line":181,"col":21,"index":4108}],"457":[0,{"line":181,"col":24,"index":4111},{"line":181,"col":24,"index":4111}],"458":[0,{"line":181,"col":27,"index":4114},{"line":181,"col":27,"index":4114}],"459":[0,{"line":181,"col":17,"index":4104},{"line":181,"col":28,"index":4115}],"460":[0,{"line":181,"col":2,"index":4089},{"line":181,"col":28,"index":4115}],"461":[0,{"line":185,"col":22,"index":4187},{"line":185,"col":22,"index":4187}],"462":[0,{"line":185,"col":19,"index":4184},{"line":185,"col":22,"index":4187}],"463":[0,{"line":185,"col":28,"index":4193},{"line":185,"col":32,"index":4197}],"464":[0,{"line":185,"col":25,"index":4190},{"line":185,"col":32,"index":4197}],"465":[0,{"line":185,"col":17,"index":4182},{"line":185,"col":34,"index":4199}],"466":[0,{"line":185,"col":4,"index":4169},{"line":185,"col":34,"index":4199}],"467":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":9,"index":4210}],"468":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"469":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"470":[0,{"line":185,"col":4,"index":4169},{"line":186,"col":47,"index":4212}],"471":[0,{"line":184,"col":2,"index":4149},{"line":186,"col":65,"index":4212}],"472":[0,{"line":189,"col":21,"index":4253},{"line":189,"col":23,"index":4255}],"473":[0,{"line":189,"col":26,"index":4258},{"line":189,"col":26,"index":4258}],"474":[0,{"line":189,"col":17,"index":4249},{"line":189,"col":27,"index":4259}],"475":[0,{"line":189,"col":4,"index":4236},{"line":189,"col":27,"index":4259}],"476":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":9,"index":4270}],"477":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"478":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"479":[0,{"line":189,"col":4,"index":4236},{"line":190,"col":41,"index":4273}],"480":[0,{"line":188,"col":2,"index":4217},{"line":190,"col":58,"index":4273}],"481":[0,{"line":192,"col":14,"index":4290},{"line":192,"col":14,"index":4290}],"482":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":19,"index":4295}],"483":[0,{"line":192,"col":24,"index":4300},{"line":192,"col":25,"index":4301}],"484":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":25,"index":4301}],"485":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"486":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"487":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":19,"index":4349}],"488":[0,{"line":195,"col":24,"index":4354},{"line":195,"col":28,"index":4358}],"489":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":29,"index":4359}],"490":[0,{"line":195,"col":2,"index":4332},{"line":195,"col":29,"index":4359}],"491":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":27,"index":4388}],"492":[0,{"line":196,"col":38,"index":4399},{"line":196,"col":42,"index":4403}],"493":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":43,"index":4404}],"494":[0,{"line":196,"col":2,"index":4363},{"line":196,"col":43,"index":4404}],"495":[0,{"line":197,"col":22,"index":4428},{"line":197,"col":22,"index":4428}],"496":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":23,"index":4429}],"497":[0,{"line":197,"col":41,"index":4447},{"line":197,"col":41,"index":4447}],"498":[0,{"line":197,"col":43,"index":4449},{"line":197,"col":43,"index":4449}],"499":[0,{"line":197,"col":45,"index":4451},{"line":197,"col":45,"index":4451}],"500":[0,{"line":197,"col":37,"index":4443},{"line":197,"col":46,"index":4452}],"501":[0,{"line":197,"col":28,"index":4434},{"line":197,"col":47,"index":4453}],"502":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":48,"index":4454}],"503":[0,{"line":197,"col":2,"index":4408},{"line":197,"col":48,"index":4454}],"504":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":20,"index":4501}],"505":[0,{"line":200,"col":24,"index":4505},{"line":200,"col":24,"index":4505}],"506":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":24,"index":4505}],"507":[0,{"line":200,"col":2,"index":4483},{"line":200,"col":24,"index":4505}],"508":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":13,"index":4549}],"509":[0,{"line":202,"col":18,"index":4554},{"line":202,"col":18,"index":4554}],"510":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":18,"index":4554}],"511":[0,{"line":202,"col":2,"index":4538},{"line":202,"col":18,"index":4554}],"512":[0,{"line":205,"col":2,"index":4572},{"line":205,"col":14,"index":4584}],"513":[0,{"line":206,"col":2,"index":4588},{"line":206,"col":12,"index":4598}],"514":[0,{"line":209,"col":21,"index":4636},{"line":209,"col":23,"index":4638}],"515":[0,{"line":209,"col":17,"index":4632},{"line":209,"col":24,"index":4639}],"516":[0,{"line":209,"col":2,"index":4617},{"line":209,"col":24,"index":4639}],"517":[0,{"line":211,"col":2,"index":4644},{"line":211,"col":24,"index":4666}],"518":[0,{"line":213,"col":10,"index":4679},{"line":213,"col":16,"index":4685}],"519":[0,{"line":213,"col":2,"index":4671},{"line":213,"col":16,"index":4685}],"520":[0,{"line":221,"col":19,"index":4906},{"line":221,"col":19,"index":4906}],"521":[0,{"line":221,"col":15,"index":4902},{"line":221,"col":15,"index":4902}],"522":[0,{"line":221,"col":2,"index":4889},{"line":221,"col":29,"index":4916}],"523":[0,{"line":14,"col":0,"index":140},{"line":225,"col":4855,"index":4995}]}} \ No newline at end of file diff --git a/quint/testFixture/_1030const.json b/quint/testFixture/_1030const.json index 7bba23e4b..a2a4bb5b0 100644 --- a/quint/testFixture/_1030const.json +++ b/quint/testFixture/_1030const.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":12,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2},{"id":11,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":10,"kind":"lambda","params":[{"id":3,"name":"i"}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"iadd","args":[{"id":6,"kind":"name","name":"i"},{"id":7,"kind":"name","name":"N"}]}},"typeAnnotation":{"id":9,"kind":"oper","args":[{"id":4,"kind":"int"}],"res":{"id":5,"kind":"int"}}}]}],"table":{"6":{"id":3,"name":"i","kind":"param"},"7":{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2},{"id":10,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":4,"name":"i","typeAnnotation":{"id":3,"kind":"int"}}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"iadd","args":[{"id":6,"kind":"name","name":"i"},{"id":7,"kind":"name","name":"N"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"int"}],"res":{"id":5,"kind":"int"}}}]}],"table":{"6":{"id":4,"name":"i","typeAnnotation":{"id":3,"kind":"int"},"kind":"param"},"7":{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1030const.map.json b/quint/testFixture/_1030const.map.json index b97f687e8..c9eabe4f7 100644 --- a/quint/testFixture/_1030const.map.json +++ b/quint/testFixture/_1030const.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1030const.qnt"},"map":{"1":[0,{"line":1,"col":11,"index":22},{"line":1,"col":13,"index":24}],"2":[0,{"line":1,"col":2,"index":13},{"line":1,"col":13,"index":24}],"3":[0,{"line":3,"col":15,"index":42},{"line":3,"col":15,"index":42}],"4":[0,{"line":3,"col":18,"index":45},{"line":3,"col":20,"index":47}],"5":[0,{"line":3,"col":24,"index":51},{"line":3,"col":26,"index":53}],"6":[0,{"line":3,"col":30,"index":57},{"line":3,"col":30,"index":57}],"7":[0,{"line":3,"col":34,"index":61},{"line":3,"col":34,"index":61}],"8":[0,{"line":3,"col":30,"index":57},{"line":3,"col":34,"index":61}],"9":[0,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"10":[0,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"11":[0,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"12":[0,{"line":0,"col":0,"index":0},{"line":4,"col":63,"index":63}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1030const.qnt"},"map":{"1":[0,{"line":1,"col":11,"index":22},{"line":1,"col":13,"index":24}],"2":[0,{"line":1,"col":2,"index":13},{"line":1,"col":13,"index":24}],"3":[0,{"line":3,"col":18,"index":45},{"line":3,"col":20,"index":47}],"4":[0,{"line":3,"col":15,"index":42},{"line":3,"col":20,"index":47}],"5":[0,{"line":3,"col":24,"index":51},{"line":3,"col":26,"index":53}],"6":[0,{"line":3,"col":30,"index":57},{"line":3,"col":30,"index":57}],"7":[0,{"line":3,"col":34,"index":61},{"line":3,"col":34,"index":61}],"8":[0,{"line":3,"col":30,"index":57},{"line":3,"col":34,"index":61}],"9":[0,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"10":[0,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"11":[0,{"line":0,"col":0,"index":0},{"line":4,"col":63,"index":63}]}} \ No newline at end of file diff --git a/quint/testFixture/_1031instance.json b/quint/testFixture/_1031instance.json index 14ad07a68..788b99601 100644 --- a/quint/testFixture/_1031instance.json +++ b/quint/testFixture/_1031instance.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":19,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9},{"id":18,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":17,"kind":"lambda","params":[{"id":10,"name":"i"}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"typeAnnotation":{"id":16,"kind":"oper","args":[{"id":11,"kind":"int"}],"res":{"id":12,"kind":"int"}}}]},{"id":7,"name":"inst","declarations":[{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},{"id":6,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"foo","args":[{"id":4,"kind":"int","value":6}]}}]}],"table":{"2":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":1,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"5":{"id":18,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":17,"kind":"lambda","params":[{"id":10,"name":"i"}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"depth":0,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"13":{"id":10,"name":"i","kind":"param"},"14":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":18,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9},{"id":17,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":16,"kind":"lambda","params":[{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"}}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":10,"kind":"int"}],"res":{"id":12,"kind":"int"}}}]},{"id":7,"name":"inst","declarations":[{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},{"id":6,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"foo","args":[{"id":4,"kind":"int","value":6}]}}]}],"table":{"2":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":1,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"5":{"id":17,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":16,"kind":"lambda","params":[{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"}}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"depth":0,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"13":{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"},"kind":"param"},"14":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1031instance.map.json b/quint/testFixture/_1031instance.map.json index d0f6ed830..8b27a9271 100644 --- a/quint/testFixture/_1031instance.map.json +++ b/quint/testFixture/_1031instance.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1031instance.qnt","7":"mocked_path/testFixture/_1030const.qnt"},"map":{"1":[0,{"line":1,"col":15,"index":29},{"line":1,"col":15,"index":29}],"2":[0,{"line":1,"col":11,"index":25},{"line":1,"col":11,"index":25}],"3":[0,{"line":1,"col":2,"index":16},{"line":1,"col":38,"index":52}],"4":[0,{"line":3,"col":21,"index":76},{"line":3,"col":21,"index":76}],"5":[0,{"line":3,"col":17,"index":72},{"line":3,"col":22,"index":77}],"6":[0,{"line":3,"col":2,"index":57},{"line":3,"col":22,"index":77}],"7":[0,{"line":0,"col":0,"index":0},{"line":4,"col":79,"index":79}],"8":[7,{"line":1,"col":11,"index":22},{"line":1,"col":13,"index":24}],"9":[7,{"line":1,"col":2,"index":13},{"line":1,"col":13,"index":24}],"10":[7,{"line":3,"col":15,"index":42},{"line":3,"col":15,"index":42}],"11":[7,{"line":3,"col":18,"index":45},{"line":3,"col":20,"index":47}],"12":[7,{"line":3,"col":24,"index":51},{"line":3,"col":26,"index":53}],"13":[7,{"line":3,"col":30,"index":57},{"line":3,"col":30,"index":57}],"14":[7,{"line":3,"col":34,"index":61},{"line":3,"col":34,"index":61}],"15":[7,{"line":3,"col":30,"index":57},{"line":3,"col":34,"index":61}],"16":[7,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"17":[7,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"18":[7,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"19":[7,{"line":0,"col":0,"index":0},{"line":4,"col":63,"index":63}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1031instance.qnt","7":"mocked_path/testFixture/_1030const.qnt"},"map":{"1":[0,{"line":1,"col":15,"index":29},{"line":1,"col":15,"index":29}],"2":[0,{"line":1,"col":11,"index":25},{"line":1,"col":11,"index":25}],"3":[0,{"line":1,"col":2,"index":16},{"line":1,"col":38,"index":52}],"4":[0,{"line":3,"col":21,"index":76},{"line":3,"col":21,"index":76}],"5":[0,{"line":3,"col":17,"index":72},{"line":3,"col":22,"index":77}],"6":[0,{"line":3,"col":2,"index":57},{"line":3,"col":22,"index":77}],"7":[0,{"line":0,"col":0,"index":0},{"line":4,"col":79,"index":79}],"8":[7,{"line":1,"col":11,"index":22},{"line":1,"col":13,"index":24}],"9":[7,{"line":1,"col":2,"index":13},{"line":1,"col":13,"index":24}],"10":[7,{"line":3,"col":18,"index":45},{"line":3,"col":20,"index":47}],"11":[7,{"line":3,"col":15,"index":42},{"line":3,"col":20,"index":47}],"12":[7,{"line":3,"col":24,"index":51},{"line":3,"col":26,"index":53}],"13":[7,{"line":3,"col":30,"index":57},{"line":3,"col":30,"index":57}],"14":[7,{"line":3,"col":34,"index":61},{"line":3,"col":34,"index":61}],"15":[7,{"line":3,"col":30,"index":57},{"line":3,"col":34,"index":61}],"16":[7,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"17":[7,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"18":[7,{"line":0,"col":0,"index":0},{"line":4,"col":63,"index":63}]}} \ No newline at end of file diff --git a/quint/testFixture/modulesAndJunk.json b/quint/testFixture/modulesAndJunk.json index c36b97412..7ae45fde9 100644 --- a/quint/testFixture/modulesAndJunk.json +++ b/quint/testFixture/modulesAndJunk.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":14,"name":"bar","declarations":[{"id":13,"kind":"def","name":"baz","qualifier":"def","expr":{"id":12,"kind":"lambda","params":[{"id":5,"name":"x"}],"qualifier":"def","expr":{"id":10,"kind":"app","opcode":"iadd","args":[{"id":8,"kind":"name","name":"x"},{"id":9,"kind":"int","value":1}]}},"typeAnnotation":{"id":11,"kind":"oper","args":[{"id":6,"kind":"int"}],"res":{"id":7,"kind":"int"}}}]},{"id":4,"name":"foo","declarations":[{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":1}}]}],"table":{"8":{"id":5,"name":"x","kind":"param"}},"errors":[{"explanation":"[QNT000] extraneous input 'the' expecting {, 'module', DOCCOMMENT}","locs":[{"source":"mocked_path/testFixture/modulesAndJunk.qnt","start":{"line":8,"col":0,"index":75},"end":{"line":8,"col":2,"index":77}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":13,"name":"bar","declarations":[{"id":12,"kind":"def","name":"baz","qualifier":"def","expr":{"id":11,"kind":"lambda","params":[{"id":6,"name":"x","typeAnnotation":{"id":5,"kind":"int"}}],"qualifier":"def","expr":{"id":10,"kind":"app","opcode":"iadd","args":[{"id":8,"kind":"name","name":"x"},{"id":9,"kind":"int","value":1}]}},"typeAnnotation":{"kind":"oper","args":[{"id":5,"kind":"int"}],"res":{"id":7,"kind":"int"}}}]},{"id":4,"name":"foo","declarations":[{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":1}}]}],"table":{"8":{"id":6,"name":"x","typeAnnotation":{"id":5,"kind":"int"},"kind":"param"}},"errors":[{"explanation":"[QNT000] extraneous input 'the' expecting {, 'module', DOCCOMMENT}","locs":[{"source":"mocked_path/testFixture/modulesAndJunk.qnt","start":{"line":8,"col":0,"index":75},"end":{"line":8,"col":2,"index":77}}]}]} \ No newline at end of file From 5cc737a2528d591687c4a40ed259e85aef7a4505 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 16 Feb 2024 06:23:26 -0500 Subject: [PATCH 237/388] Constrain annotated params to their types --- quint/src/types/constraintGenerator.ts | 8 ++++++-- quint/test/types/inferrer.test.ts | 20 ++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/quint/src/types/constraintGenerator.ts b/quint/src/types/constraintGenerator.ts index e17bdcafa..8bbb9ef14 100644 --- a/quint/src/types/constraintGenerator.ts +++ b/quint/src/types/constraintGenerator.ts @@ -30,7 +30,7 @@ import { QuintVar, isAnnotatedDef, } from '../ir/quintIr' -import { QuintType, rowNames, typeNames } from '../ir/quintTypes' +import { QuintType, QuintVarType, rowNames, typeNames } from '../ir/quintTypes' import { expressionToString, rowToString, typeToString } from '../ir/IRprinting' import { Either, left, mergeInMany, right } from '@sweet-monads/either' import { Error, ErrorTree, buildErrorLeaf, buildErrorTree, errorTreeToString } from '../errorTree' @@ -253,7 +253,11 @@ export class ConstraintGeneratorVisitor implements IRVisitor { expr.params.forEach(p => { const varName = p.name === '_' ? this.freshVarGenerator.freshVar('_t') : `t_${p.name}_${p.id}` paramNames.typeVariables.add(varName) - this.addToResults(p.id, right(toScheme({ kind: 'var', name: varName }))) + const paramTypeVar: QuintVarType = { kind: 'var', name: varName } + this.addToResults(p.id, right(toScheme(paramTypeVar))) + if (p.typeAnnotation) { + this.constraints.push({ kind: 'eq', types: [paramTypeVar, p.typeAnnotation], sourceId: p.id }) + } }) this.freeNames.push(paramNames) diff --git a/quint/test/types/inferrer.test.ts b/quint/test/types/inferrer.test.ts index 246adbc49..112415dbc 100644 --- a/quint/test/types/inferrer.test.ts +++ b/quint/test/types/inferrer.test.ts @@ -419,4 +419,24 @@ module B { ] ) }) + + it('prioritizes solving constraints from type annotations', () => { + // Regression test for https://github.com/informalsystems/quint/issues/1177 + // The point is that we expect to report an error trying to unify a string with a + const defs = [ + `pure def foo(s: str): int = { + val x = 1.in(s) // We SHOULD identify an error here, since s is annotated as a str + val y = s + 1 // and NOT identify an error here, incorrectly expecting s to be a set + y +}`, + ] + + const [errors] = inferTypesForDefs(defs) + const msgs: string[] = [...errors.values()].map(errorTreeToString) + const expectedMessage = `Couldn't unify set and str +Trying to unify Set[int] and str +Trying to unify (_t0, Set[_t0]) => bool and (int, str) => _t1 +` + assert.equal(msgs[0], expectedMessage) + }) }) From 830d3567e4a6ffb47d75e8d25e5446f0c082a7ca Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 16 Feb 2024 06:24:11 -0500 Subject: [PATCH 238/388] Fix generality check --- quint/src/types/constraintGenerator.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/quint/src/types/constraintGenerator.ts b/quint/src/types/constraintGenerator.ts index 8bbb9ef14..f92f96a9b 100644 --- a/quint/src/types/constraintGenerator.ts +++ b/quint/src/types/constraintGenerator.ts @@ -460,10 +460,13 @@ function checkAnnotationGenerality( return right(subs) } - // Look for type/row variables in the annotation that are bound by `subs` + // Find type and row variables in the annotation that are bound to non-variable types in the substitutions. + // This indicates that they are inferred to have a concrete type. const names = typeNames(typeAnnotation) - const tooGeneralTypes = subs.filter(s => s.kind === 'type' && names.typeVariables.has(s.name)) - const tooGeneralRows = subs.filter(s => s.kind === 'row' && names.rowVariables.has(s.name)) + const tooGeneralTypes = subs.filter( + s => s.kind === 'type' && s.value.kind !== 'var' && names.typeVariables.has(s.name) + ) + const tooGeneralRows = subs.filter(s => s.kind === 'row' && s.value.kind !== 'var' && names.rowVariables.has(s.name)) const errors = [...tooGeneralTypes, ...tooGeneralRows].map(s => { const expected = s.kind === 'type' ? typeToString(s.value) : rowToString(s.value) From fafd623b4ad7cf4cfeb4fd12744d395c157dc169 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 16 Feb 2024 06:59:17 -0500 Subject: [PATCH 239/388] Remove old comment --- quint/src/parsing/ToIrListener.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index 7bb1d3bd2..d01e96843 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -1230,7 +1230,6 @@ export class ToIrListener implements QuintListener { } // pop a type - // XXX private popType(): Maybe { // the user has specified a type const tp = this.typeStack.pop() From a146a8bef82cd1777c85674f08d0d8aafdcc84e9 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 16 Feb 2024 06:59:26 -0500 Subject: [PATCH 240/388] Add changelog entry --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fd011a24d..2960af69a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Deprecated ### Removed ### Fixed + +- Fixed type checker to account for type constraints on annotated operator + parameters when checking operator bodies (#1177). + ### Security ## v0.18.1 -- 2024-01-16 From 88e7bbe1ead3aa4121b3ad0ec61480939bbed673 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 16 Feb 2024 11:28:58 -0500 Subject: [PATCH 241/388] Update quint/src/parsing/ToIrListener.ts Co-authored-by: Gabriela Moreira --- quint/src/parsing/ToIrListener.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index d01e96843..c5c443a22 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -223,7 +223,7 @@ export class ToIrListener implements QuintListener { const name = ctx.normalCallName().text const params = ctx._annotOperParam - .map(_ => popOrFail(this.paramStack, 'violated grammar of annotated AnnotatedOperDef')) + .map(_ => popOrFail(this.paramStack, 'annotated AnnotatedOperDef')) .reverse() const res = this.popType().unwrap(() => 'violated grammar of annotated params return type') const args = params.map(p => { From 1fc862de2c43fb835445ed48a7a57eab4b38b7a9 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 16 Feb 2024 12:20:40 -0500 Subject: [PATCH 242/388] Format fix --- quint/src/parsing/ToIrListener.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index c5c443a22..f14f48e58 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -222,9 +222,7 @@ export class ToIrListener implements QuintListener { exitAnnotatedOperDef(ctx: p.AnnotatedOperDefContext) { const name = ctx.normalCallName().text - const params = ctx._annotOperParam - .map(_ => popOrFail(this.paramStack, 'annotated AnnotatedOperDef')) - .reverse() + const params = ctx._annotOperParam.map(_ => popOrFail(this.paramStack, 'annotated AnnotatedOperDef')).reverse() const res = this.popType().unwrap(() => 'violated grammar of annotated params return type') const args = params.map(p => { assert(isAnnotatedDef(p), 'violated grammar of annotated param type') From 4c760dee90f61ab5143c5ffd03ebe6d309440a7f Mon Sep 17 00:00:00 2001 From: OakenKnight Date: Wed, 21 Feb 2024 13:12:23 +0100 Subject: [PATCH 243/388] Fixed Runtime error in cosmwasm/Zero-to-hero example caused by lambda nesting issue reported in issue #1042 --- examples/cosmwasm/zero-to-hero/vote.qnt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/cosmwasm/zero-to-hero/vote.qnt b/examples/cosmwasm/zero-to-hero/vote.qnt index 88e686fbd..61adf5a58 100644 --- a/examples/cosmwasm/zero-to-hero/vote.qnt +++ b/examples/cosmwasm/zero-to-hero/vote.qnt @@ -513,5 +513,5 @@ module state { // already submitted ballots in `ballots`, but `execute_vote` adjusts // the sum differently based on whether such a ballot is present.] val invAllBallotsPositive = query_all_polls(state).polls.listForall(poll => - poll.options.listForall(opt => opt._2 >= 0)) + poll.options.listForall2(opt => opt._2 >= 0)) } From 0c0b5d9659bd69eac0647ec8d28b488b4b18dd82 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 21 Feb 2024 14:00:32 -0500 Subject: [PATCH 244/388] Update README.md As per suggestion from @ivan-gavran --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 0a67bf8a7..99ae97722 100644 --- a/README.md +++ b/README.md @@ -257,6 +257,10 @@ Cosmos in 2023. - Join the [Quint discussions on GitHub](https://github.com/informalsystems/quint/discussions) - [Contribute your spell](./examples/spells/contribute-your-spell.md) to the collection of Quint spells - [Contribute](./CONTRIBUTING.md) to the development of Quint +- Join or co-design meetings: We hold fortnightly meetings with users and those + interested in contributing to the design and development of Quint. Contact us if + you would like an invitation. + ## Documentation From a2747aedbec9b5fbdf5f01d84fda7d9ac8c6d005 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 27 Feb 2024 10:05:18 -0500 Subject: [PATCH 245/388] Limit node to current major with LTS Prevents triggering an error from the deprecated punycode dependency coming from node-fetch. --- quint/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/package.json b/quint/package.json index 0cb51a8d0..970566b5d 100644 --- a/quint/package.json +++ b/quint/package.json @@ -41,7 +41,7 @@ "test/**/*.ts" ], "engines": { - "node": ">=18" + "node": "18 - 20" }, "repository": { "type": "git", From cf2830ad2ee176170e7c2a3627a402bebd9ccfbc Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 27 Feb 2024 10:33:49 -0500 Subject: [PATCH 246/388] Remove dependency on node-fetch --- quint/package-lock.json | 9477 +++++++----------------------------- quint/package.json | 1 - quint/src/quintVerifier.ts | 3 +- 3 files changed, 1814 insertions(+), 7667 deletions(-) diff --git a/quint/package-lock.json b/quint/package-lock.json index 76a99dd10..dd192ef04 100644 --- a/quint/package-lock.json +++ b/quint/package-lock.json @@ -1,7 +1,7 @@ { "name": "@informalsystems/quint", "version": "0.18.3", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -24,7 +24,6 @@ "line-column": "^1.0.2", "lodash": "^4.17.21", "lodash.isequal": "^4.5.0", - "node-fetch": "^2.6.13", "seedrandom": "^3.0.5", "tar": "^6.1.14", "yargs": "^17.2.1" @@ -63,77 +62,145 @@ "typescript": "^4.8.2" }, "engines": { - "node": ">=18" + "node": "18 - 20" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" } }, - "node_modules/@ampproject/remapping/node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.18.6" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, "node_modules/@babel/compat-data": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz", - "integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.7.tgz", - "integrity": "sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.20.7", - "@babel/helpers": "^7.20.7", - "@babel/parser": "^7.20.7", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7", - "convert-source-map": "^1.7.0", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", + "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -143,23 +210,30 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", - "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dev": true, "dependencies": { - "@babel/types": "^7.20.7", + "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { @@ -167,171 +241,168 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.7.tgz", - "integrity": "sha512-FNdu7r67fqMUSVuQpFQGE6BPdhJIhitoxhGzDbAXNcA07uoVG37fOiMk3OSV8rEICuyG6t8LGkd9EE64qIEoIA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "dependencies": { - "@babel/types": "^7.20.2" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz", - "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", + "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", "dev": true, "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -410,9 +481,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", - "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -422,34 +493,34 @@ } }, "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", + "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.20.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.8.tgz", - "integrity": "sha512-/RNkaYDeCy4MjyV70+QkSHhxbvj2JO/5Ft2Pa880qJOG8tWrqcT/wXUuCCv43yogfqPzHL77Xu101KQPf4clnQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "debug": "^4.1.0", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", + "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -466,13 +537,13 @@ } }, "node_modules/@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", + "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -517,23 +588,23 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", - "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", - "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.1", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -549,20 +620,20 @@ } }, "node_modules/@eslint/js": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", - "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@grpc/grpc-js": { - "version": "1.8.14", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.14.tgz", - "integrity": "sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.1.tgz", + "integrity": "sha512-55ONqFytZExfOIjF1RjXPcVmT/jJqFzbbDqxK9jmRV4nxiYWtL9hENSW1Jfx0SdZfrvoqd44YJ/GJTqfRrawSQ==", "dependencies": { - "@grpc/proto-loader": "^0.7.0", + "@grpc/proto-loader": "^0.7.8", "@types/node": ">=12.12.47" }, "engines": { @@ -570,14 +641,13 @@ } }, "node_modules/@grpc/proto-loader": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.7.tgz", - "integrity": "sha512-1TIeXOi8TuSCQprPItwoMymZXxWT0CPxUhkrkeCUH+D8U7QDwQ6b7SUz2MaLuWM2llT+J/TVFLmQI5KtML3BhQ==", + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.10.tgz", + "integrity": "sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==", "dependencies": { - "@types/long": "^4.0.1", "lodash.camelcase": "^4.3.0", - "long": "^4.0.0", - "protobufjs": "^7.0.0", + "long": "^5.0.0", + "protobufjs": "^7.2.4", "yargs": "^17.7.2" }, "bin": { @@ -588,13 +658,13 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { @@ -615,9 +685,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, "node_modules/@istanbuljs/load-nyc-config": { @@ -729,9 +799,9 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.4.tgz", + "integrity": "sha512-Oud2QPM5dHviZNn4y/WhhYKSXksv+1xLEIsNrAbGcFzUN3ubqWRFT5gwPchNc5NuzILOU4tPBDTZ4VwhL8Y7cw==", "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.1", @@ -743,9 +813,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "engines": { "node": ">=6.0.0" @@ -761,19 +831,19 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.23.tgz", + "integrity": "sha512-9/4foRoUKp8s96tSkh8DlAAc5A0Ty8vLXld+l9gjKKY6ckwI8G15f0hskGmuLZu78ZlGa1vtsfOa+lnB4vG6Jg==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@nodelib/fs.scandir": { @@ -812,12 +882,11 @@ } }, "node_modules/@octokit/endpoint": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.0.tgz", - "integrity": "sha512-szrQhiqJ88gghWY2Htt8MqUDO6++E/EIXqJ2ZEp5ma3uGS46o7LZAzSLt49myB7rT+Hfw5Y6gO3LmOxGzHijAQ==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.4.tgz", + "integrity": "sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw==", "dependencies": { - "@octokit/types": "^11.0.0", - "is-plain-object": "^5.0.0", + "@octokit/types": "^12.0.0", "universal-user-agent": "^6.0.0" }, "engines": { @@ -825,19 +894,18 @@ } }, "node_modules/@octokit/openapi-types": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", - "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", + "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==" }, "node_modules/@octokit/request": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.1.tgz", - "integrity": "sha512-8N+tdUz4aCqQmXl8FpHYfKG9GelDFd7XGVzyN8rc6WxVlYcfpHECnuRkgquzz+WzvHTK62co5di8gSXnzASZPQ==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.2.0.tgz", + "integrity": "sha512-exPif6x5uwLqv1N1irkLG1zZNJkOtj8bZxuVHd71U5Ftuxf2wGNvAJyNBcPbPC+EBzwYEbBDdSFb8EPcjpYxPQ==", "dependencies": { "@octokit/endpoint": "^9.0.0", "@octokit/request-error": "^5.0.0", - "@octokit/types": "^11.1.0", - "is-plain-object": "^5.0.0", + "@octokit/types": "^12.0.0", "universal-user-agent": "^6.0.0" }, "engines": { @@ -845,11 +913,11 @@ } }, "node_modules/@octokit/request-error": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.0.tgz", - "integrity": "sha512-1ue0DH0Lif5iEqT52+Rf/hf0RmGO9NWFjrzmrkArpG9trFfDM/efx00BJHdLGuro4BR/gECxCU2Twf5OKrRFsQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.1.tgz", + "integrity": "sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==", "dependencies": { - "@octokit/types": "^11.0.0", + "@octokit/types": "^12.0.0", "deprecation": "^2.0.0", "once": "^1.4.0" }, @@ -858,11 +926,11 @@ } }, "node_modules/@octokit/types": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-11.1.0.tgz", - "integrity": "sha512-Fz0+7GyLm/bHt8fwEqgvRBWwIV1S6wRRyq+V6exRKLVWaKGsuy6H9QFYeBVDV7rK6fO3XwHgQOPxv+cLj2zpXQ==", + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", + "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", "dependencies": { - "@octokit/openapi-types": "^18.0.0" + "@octokit/openapi-types": "^20.0.0" } }, "node_modules/@protobufjs/aspromise": { @@ -959,36 +1027,36 @@ "dev": true }, "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, "node_modules/@types/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", + "version": "4.3.12", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.12.tgz", + "integrity": "sha512-zNKDHG/1yxm8Il6uCCVsm+dRdEsJlFoDu73X17y09bId6UwoYww+vFBsAcRzl8knM1sab3Dp1VRikFQwDOtDDw==", "dev": true }, "node_modules/@types/debug": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", - "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "dev": true, "dependencies": { "@types/ms": "*" } }, "node_modules/@types/json-bigint": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/json-bigint/-/json-bigint-1.0.1.tgz", - "integrity": "sha512-zpchZLNsNuzJHi6v64UBoFWAvQlPhch7XAi36FkH6tL1bbbmimIF+cS7vwkzY4u5RaSWMoflQfu+TshMPPw8uw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/json-bigint/-/json-bigint-1.0.4.tgz", + "integrity": "sha512-ydHooXLbOmxBbubnA7Eh+RpBzuaIiQjh8WGJYQB50JFGFrdxW7JzVlyEV7fAXw0T2sqJ1ysTneJbiyNLqZRAag==", "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "node_modules/@types/json5": { @@ -998,37 +1066,32 @@ "dev": true }, "node_modules/@types/line-column": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/line-column/-/line-column-1.0.0.tgz", - "integrity": "sha512-wbw+IDRw/xY/RGy+BL6f4Eey4jsUgHQrMuA4Qj0CSG3x/7C2Oc57pmRoM2z3M4DkylWRz+G1pfX06sCXQm0J+w==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/line-column/-/line-column-1.0.2.tgz", + "integrity": "sha512-099oFQmp/Tlf20xW5XI5R4F69N6lF/zQ09XDzc3R5BOLFlqIotgKoNIyj0HD4fQLWcGDreDJv8k/BkLJscrDrw==" }, "node_modules/@types/lodash": { - "version": "4.14.191", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", - "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==", + "version": "4.14.202", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", + "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", "dev": true }, "node_modules/@types/lodash.isequal": { - "version": "4.5.6", - "resolved": "https://registry.npmjs.org/@types/lodash.isequal/-/lodash.isequal-4.5.6.tgz", - "integrity": "sha512-Ww4UGSe3DmtvLLJm2F16hDwEQSv7U0Rr8SujLUA2wHI2D2dm8kPu6Et+/y303LfjTIwSBKXB/YTUcAKpem/XEg==", + "version": "4.5.8", + "resolved": "https://registry.npmjs.org/@types/lodash.isequal/-/lodash.isequal-4.5.8.tgz", + "integrity": "sha512-uput6pg4E/tj2LGxCZo9+y27JNyB2OZuuI/T5F+ylVDYuqICLG2/ktjxx0v6GvVntAf8TvEzeQLcV0ffRirXuA==", "dev": true, "dependencies": { "@types/lodash": "*" } }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" - }, "node_modules/@types/mdast": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", - "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", "dev": true, "dependencies": { - "@types/unist": "*" + "@types/unist": "^2" } }, "node_modules/@types/mocha": { @@ -1038,90 +1101,85 @@ "dev": true }, "node_modules/@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", "dev": true }, "node_modules/@types/node": { - "version": "18.16.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.0.tgz", - "integrity": "sha512-BsAaKhB+7X+H4GnSjGhJG9Qi8Tw+inU9nJDwmD5CgOmBLEI6ArdhikpLX7DjbjDRDTbqZzU2LSQNZg8WGPiSZQ==" + "version": "18.19.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.18.tgz", + "integrity": "sha512-80CP7B8y4PzZF0GWx15/gVWRrB5y/bIjNI84NK3cmQJu0WZwvmj2WMA5LcofQFVfLqqCSp545+U2LsrVzX36Zg==", + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/node-fetch": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz", - "integrity": "sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==", + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", "dev": true, "dependencies": { "@types/node": "*", - "form-data": "^3.0.0" + "form-data": "^4.0.0" } }, "node_modules/@types/seedrandom": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.4.tgz", - "integrity": "sha512-/rWdxeiuZenlawrHU+XV6ZHMTKOqrC2hMfeDfLTIWJhDZP5aVqXRysduYHBbhD7CeJO6FJr/D2uBVXB7GT6v7w==" + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.8.tgz", + "integrity": "sha512-TY1eezMU2zH2ozQoAFAQFOPpvP15g+ZgSfTZt31AUUH/Rxtnz3H+A/Sv1Snw2/amp//omibc+AEkTaA8KUeOLQ==" }, "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, "node_modules/@types/tar": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@types/tar/-/tar-6.1.5.tgz", - "integrity": "sha512-qm2I/RlZij5RofuY7vohTpYNaYcrSQlN2MyjucQc7ZweDwaEWkdN/EeNh6e9zjK6uEm6PwjdMXkcj05BxZdX1Q==", + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/@types/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-ThA1WD8aDdVU4VLuyq5NEqriwXErF5gEIJeyT6gHBWU7JtSmW2a5qjNv3/vR82O20mW+1vhmeZJfBQPT3HCugg==", "dev": true, "dependencies": { "@types/node": "*", "minipass": "^4.0.0" } }, - "node_modules/@types/tar/node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", "dev": true }, "node_modules/@types/yargs": { - "version": "17.0.17", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.17.tgz", - "integrity": "sha512-72bWxFKTK6uwWJAVT+3rF6Jo6RTojiJ27FQo8Rf60AL+VZbzoVPnMFhKsUnbjR8A3BTCYQ7Mv3hnl8T0A+CX9g==", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.47.0.tgz", - "integrity": "sha512-AHZtlXAMGkDmyLuLZsRpH3p4G/1iARIwc/T0vIem2YB+xW6pZaXYXzCBnZSF/5fdM97R9QqZWZ+h3iW10XgevQ==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.47.0", - "@typescript-eslint/type-utils": "5.47.0", - "@typescript-eslint/utils": "5.47.0", + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" }, @@ -1143,14 +1201,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.47.0.tgz", - "integrity": "sha512-udPU4ckK+R1JWCGdQC4Qa27NtBg7w020ffHqGyAK8pAgOVuNw7YaKXGChk+udh+iiGIJf6/E/0xhVXyPAbsczw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.47.0", - "@typescript-eslint/types": "5.47.0", - "@typescript-eslint/typescript-estree": "5.47.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "debug": "^4.3.4" }, "engines": { @@ -1170,13 +1228,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.47.0.tgz", - "integrity": "sha512-dvJab4bFf7JVvjPuh3sfBUWsiD73aiftKBpWSfi3sUkysDQ4W8x+ZcFpNp7Kgv0weldhpmMOZBjx1wKN8uWvAw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.47.0", - "@typescript-eslint/visitor-keys": "5.47.0" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1187,13 +1245,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.47.0.tgz", - "integrity": "sha512-1J+DFFrYoDUXQE1b7QjrNGARZE6uVhBqIvdaXTe5IN+NmEyD68qXR1qX1g2u4voA+nCaelQyG8w30SAOihhEYg==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.47.0", - "@typescript-eslint/utils": "5.47.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -1214,9 +1272,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.47.0.tgz", - "integrity": "sha512-eslFG0Qy8wpGzDdYKu58CEr3WLkjwC5Usa6XbuV89ce/yN5RITLe1O8e+WFEuxnfftHiJImkkOBADj58ahRxSg==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1227,13 +1285,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.47.0.tgz", - "integrity": "sha512-LxfKCG4bsRGq60Sqqu+34QT5qT2TEAHvSCCJ321uBWywgE2dS0LKcu5u+3sMGo+Vy9UmLOhdTw5JHzePV/1y4Q==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.47.0", - "@typescript-eslint/visitor-keys": "5.47.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1254,18 +1312,18 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.47.0.tgz", - "integrity": "sha512-U9xcc0N7xINrCdGVPwABjbAKqx4GK67xuMV87toI+HUqgXj26m6RBp9UshEXcTrgCkdGYFzgKLt8kxu49RilDw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.47.0", - "@typescript-eslint/types": "5.47.0", - "@typescript-eslint/typescript-estree": "5.47.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", "semver": "^7.3.7" }, "engines": { @@ -1280,12 +1338,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.47.0.tgz", - "integrity": "sha512-ByPi5iMa6QqDXe/GmT/hR6MZtVPi0SqMQPDx15FczCBXJo/7M8T88xReOALAfpBLm+zxpPfmhuEvPb577JRAEg==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.47.0", + "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -1296,10 +1354,16 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "node_modules/acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1318,9 +1382,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", "dev": true, "engines": { "node": ">=0.4.0" @@ -1470,16 +1534,32 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "is-string": "^1.0.7" }, "engines": { @@ -1498,15 +1578,53 @@ "node": ">=8" } }, + "node_modules/array.prototype.filter": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz", + "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz", + "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -1517,14 +1635,14 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -1535,16 +1653,38 @@ } }, "node_modules/array.prototype.tosorted": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", - "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", + "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.1.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/assertion-error": { @@ -1566,17 +1706,41 @@ } }, "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", "dev": true }, + "node_modules/asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/babel-eslint": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", @@ -1624,9 +1788,9 @@ "dev": true }, "node_modules/bignumber.js": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", - "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", "engines": { "node": "*" } @@ -1669,9 +1833,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "dev": true, "funding": [ { @@ -1681,13 +1845,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -1712,13 +1880,19 @@ } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1743,9 +1917,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001441", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz", - "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==", + "version": "1.0.30001591", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001591.tgz", + "integrity": "sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ==", "dev": true, "funding": [ { @@ -1755,22 +1929,26 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, "node_modules/chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", + "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", "dev": true, "dependencies": { "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", "pathval": "^1.1.1", - "type-detect": "^4.0.5" + "type-detect": "^4.0.8" }, "engines": { "node": ">=4" @@ -1808,10 +1986,13 @@ "dev": true }, "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, "engines": { "node": "*" } @@ -1991,18 +2172,6 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/copyfiles/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/copyfiles/node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -2119,12 +2288,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/define-properties": { + "node_modules/define-data-property": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -2197,10 +2384,25 @@ "node": ">=6.0.0" } }, + "node_modules/ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "dev": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "version": "1.4.682", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.682.tgz", + "integrity": "sha512-oCglfs8yYKs9RQjJFOHonSnhikPK3y+0SvSYc/YpYJV//6rqc0/hbwd0c7vgK4vrl6y2gJAwjkhkSGWK+z4KRA==", "dev": true }, "node_modules/emoji-regex": { @@ -2214,36 +2416,52 @@ "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==" }, "node_modules/es-abstract": { - "version": "1.20.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", - "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.4.tgz", + "integrity": "sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.7", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.2", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", + "hasown": "^2.0.1", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "unbox-primitive": "^1.0.2" + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.0", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.1", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -2252,14 +2470,81 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-shim-unscopables": { + "node_modules/es-array-method-boxes-properly": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dev": true, "dependencies": { - "has": "^1.0.3" - } + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz", + "integrity": "sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==", + "dev": true, + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.4", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.2", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } }, "node_modules/es-to-primitive": { "version": "1.2.1", @@ -2285,9 +2570,9 @@ "dev": true }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "engines": { "node": ">=6" } @@ -2305,27 +2590,28 @@ } }, "node_modules/eslint": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", - "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.39.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.0", - "espree": "^9.5.1", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -2333,22 +2619,19 @@ "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -2464,9 +2747,9 @@ } }, "node_modules/eslint-config-esnext/node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -2673,6 +2956,18 @@ "node": ">= 0.8.0" } }, + "node_modules/eslint-config-esnext/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/eslint-config-esnext/node_modules/optionator": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", @@ -2730,9 +3025,9 @@ } }, "node_modules/eslint-config-esnext/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -2917,9 +3212,9 @@ } }, "node_modules/eslint-config-node/node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -3126,6 +3421,18 @@ "node": ">= 0.8.0" } }, + "node_modules/eslint-config-node/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/eslint-config-node/node_modules/optionator": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", @@ -3183,9 +3490,9 @@ } }, "node_modules/eslint-config-node/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -3270,9 +3577,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", - "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -3384,9 +3691,9 @@ } }, "node_modules/eslint-config-react-native/node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -3606,6 +3913,18 @@ "node": ">= 0.8.0" } }, + "node_modules/eslint-config-react-native/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/eslint-config-react-native/node_modules/optionator": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", @@ -3663,9 +3982,9 @@ } }, "node_modules/eslint-config-react-native/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -3852,9 +4171,9 @@ } }, "node_modules/eslint-config-recommended/node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -4061,6 +4380,18 @@ "node": ">= 0.8.0" } }, + "node_modules/eslint-config-recommended/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/eslint-config-recommended/node_modules/optionator": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", @@ -4118,9 +4449,9 @@ } }, "node_modules/eslint-config-recommended/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -4205,13 +4536,14 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "dependencies": { "debug": "^3.2.7", - "resolve": "^1.20.0" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -4224,9 +4556,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -4283,49 +4615,29 @@ "eslint": ">=4.19.1" } }, - "node_modules/eslint-plugin-es/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" @@ -4335,12 +4647,12 @@ } }, "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import/node_modules/doctrine": { @@ -4355,11 +4667,14 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } }, "node_modules/eslint-plugin-json": { "version": "3.1.0", @@ -4394,34 +4709,10 @@ "eslint": ">=5.16.0" } }, - "node_modules/eslint-plugin-node/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-plugin-node/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/eslint-plugin-node/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -4440,15 +4731,16 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.31.11", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz", - "integrity": "sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw==", + "version": "7.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", "dev": true, "dependencies": { "array-includes": "^3.1.6", "array.prototype.flatmap": "^1.3.1", "array.prototype.tosorted": "^1.1.1", "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.12", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", @@ -4457,8 +4749,8 @@ "object.hasown": "^1.1.2", "object.values": "^1.1.6", "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.3", - "semver": "^6.3.0", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.1", "string.prototype.matchall": "^4.0.8" }, "engines": { @@ -4487,12 +4779,12 @@ } }, "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -4504,9 +4796,9 @@ } }, "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -4565,36 +4857,33 @@ } }, "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^2.0.0" + "eslint-visitor-keys": "^1.1.0" }, "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" } }, "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, "engines": { - "node": ">=10" + "node": ">=4" } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4604,9 +4893,9 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -4620,14 +4909,14 @@ } }, "node_modules/espree": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", - "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4718,9 +5007,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -4758,9 +5047,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", - "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -4802,6 +5091,36 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -4866,12 +5185,13 @@ } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { @@ -4879,11 +5199,20 @@ } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/foreground-child": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", @@ -4898,9 +5227,9 @@ } }, "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, "dependencies": { "asynckit": "^0.4.0", @@ -4965,9 +5294,9 @@ "dev": true }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -4979,21 +5308,24 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -5027,12 +5359,13 @@ } }, "node_modules/genversion": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/genversion/-/genversion-3.1.1.tgz", - "integrity": "sha512-/H861PMsihhjgX2qqhTN8egM11V04imhA+3JRFY3jjPua2Sy1NqaqqQPjSP8rdM9jZoKpFhVj9g3Fs9XPCjBYQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/genversion/-/genversion-3.2.0.tgz", + "integrity": "sha512-OIYSX6XYA8PHecLDCTri30hadSZfAjZ8Iq1+BBDXqLWP4dRLuJNLoNjsSWtTpw97IccK2LDWzkEstxAB8GdN7g==", "dev": true, "dependencies": { "commander": "^7.2.0", + "ejs": "^3.1.9", "find-package": "^1.0.0" }, "bin": { @@ -5051,23 +5384,28 @@ } }, "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, "engines": { "node": "*" } }, "node_modules/get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5083,13 +5421,14 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -5099,15 +5438,15 @@ } }, "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, @@ -5131,9 +5470,9 @@ } }, "node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -5145,6 +5484,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -5178,29 +5532,17 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -5219,12 +5561,24 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5243,12 +5597,12 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -5282,10 +5636,22 @@ "node": ">=8" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "node_modules/hasown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, "bin": { "he": "bin/he" @@ -5310,18 +5676,18 @@ } }, "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, "engines": { "node": ">= 4" } }, "node_modules/immutable": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", - "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==" + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==" }, "node_modules/import-fresh": { "version": "3.3.0", @@ -5398,19 +5764,50 @@ } }, "node_modules/internal-slot": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", - "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { "node": ">= 0.4" } }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -5487,12 +5884,12 @@ } }, "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5522,6 +5919,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -5530,6 +5939,21 @@ "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -5542,10 +5966,19 @@ "node": ">=0.10.0" } }, - "node_modules/is-negative-zero": { + "node_modules/is-map": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "engines": { "node": ">= 0.4" @@ -5599,14 +6032,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -5623,13 +6048,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5677,6 +6114,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -5695,6 +6147,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -5707,6 +6168,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -5739,9 +6213,9 @@ } }, "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "engines": { "node": ">=8" @@ -5775,9 +6249,9 @@ } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -5801,17 +6275,32 @@ } }, "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "dependencies": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/istanbul-lib-source-maps": { @@ -5829,9 +6318,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -5841,14 +6330,35 @@ "node": ">=8" } }, - "node_modules/js-sdsl": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", - "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "node_modules/jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/js-tokens": { @@ -5889,6 +6399,12 @@ "bignumber.js": "^9.0.0" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -5902,9 +6418,9 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.2.tgz", - "integrity": "sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "bin": { "json5": "lib/cli.js" @@ -5914,24 +6430,35 @@ } }, "node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", "dev": true }, "node_modules/jsx-ast-utils": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", - "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dev": true, "dependencies": { - "array-includes": "^3.1.5", - "object.assign": "^4.1.3" + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" }, "engines": { "node": ">=4.0" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kleur": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", @@ -6022,9 +6549,9 @@ } }, "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" }, "node_modules/loose-envify": { "version": "1.4.0", @@ -6039,12 +6566,12 @@ } }, "node_modules/loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, "dependencies": { - "get-func-name": "^2.0.0" + "get-func-name": "^2.0.1" } }, "node_modules/lru-cache": { @@ -6072,9 +6599,9 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -6087,9 +6614,9 @@ "dev": true }, "node_modules/mdast-util-from-markdown": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", - "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", + "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", "dev": true, "dependencies": { "@types/mdast": "^3.0.0", @@ -6111,10 +6638,13 @@ } }, "node_modules/mdast-util-to-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", - "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" @@ -6130,9 +6660,9 @@ } }, "node_modules/micromark": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", - "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", + "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", "dev": true, "funding": [ { @@ -6165,9 +6695,9 @@ } }, "node_modules/micromark-core-commonmark": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz", - "integrity": "sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", "dev": true, "funding": [ { @@ -6199,9 +6729,9 @@ } }, "node_modules/micromark-factory-destination": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz", - "integrity": "sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", + "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", "dev": true, "funding": [ { @@ -6220,9 +6750,9 @@ } }, "node_modules/micromark-factory-label": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz", - "integrity": "sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", + "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", "dev": true, "funding": [ { @@ -6242,9 +6772,9 @@ } }, "node_modules/micromark-factory-space": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz", - "integrity": "sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", "dev": true, "funding": [ { @@ -6262,9 +6792,9 @@ } }, "node_modules/micromark-factory-title": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz", - "integrity": "sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", + "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", "dev": true, "funding": [ { @@ -6280,14 +6810,13 @@ "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "micromark-util-types": "^1.0.0" } }, "node_modules/micromark-factory-whitespace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz", - "integrity": "sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", + "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", "dev": true, "funding": [ { @@ -6307,9 +6836,9 @@ } }, "node_modules/micromark-util-character": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.1.0.tgz", - "integrity": "sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", "dev": true, "funding": [ { @@ -6327,9 +6856,9 @@ } }, "node_modules/micromark-util-chunked": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz", - "integrity": "sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", "dev": true, "funding": [ { @@ -6346,9 +6875,9 @@ } }, "node_modules/micromark-util-classify-character": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz", - "integrity": "sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", "dev": true, "funding": [ { @@ -6367,9 +6896,9 @@ } }, "node_modules/micromark-util-combine-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz", - "integrity": "sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", + "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", "dev": true, "funding": [ { @@ -6387,9 +6916,9 @@ } }, "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz", - "integrity": "sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", "dev": true, "funding": [ { @@ -6406,9 +6935,9 @@ } }, "node_modules/micromark-util-decode-string": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz", - "integrity": "sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", + "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", "dev": true, "funding": [ { @@ -6428,9 +6957,9 @@ } }, "node_modules/micromark-util-encode": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz", - "integrity": "sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", "dev": true, "funding": [ { @@ -6444,9 +6973,9 @@ ] }, "node_modules/micromark-util-html-tag-name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz", - "integrity": "sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", + "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", "dev": true, "funding": [ { @@ -6460,9 +6989,9 @@ ] }, "node_modules/micromark-util-normalize-identifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz", - "integrity": "sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", "dev": true, "funding": [ { @@ -6479,9 +7008,9 @@ } }, "node_modules/micromark-util-resolve-all": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz", - "integrity": "sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", "dev": true, "funding": [ { @@ -6498,9 +7027,9 @@ } }, "node_modules/micromark-util-sanitize-uri": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz", - "integrity": "sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", "dev": true, "funding": [ { @@ -6519,9 +7048,9 @@ } }, "node_modules/micromark-util-subtokenize": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz", - "integrity": "sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", + "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", "dev": true, "funding": [ { @@ -6541,9 +7070,9 @@ } }, "node_modules/micromark-util-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz", - "integrity": "sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", "dev": true, "funding": [ { @@ -6557,9 +7086,9 @@ ] }, "node_modules/micromark-util-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.0.2.tgz", - "integrity": "sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", "dev": true, "funding": [ { @@ -6628,18 +7157,19 @@ } }, "node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "dev": true, "engines": { "node": ">=8" } @@ -6673,21 +7203,20 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "bin": { "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.3.0.tgz", + "integrity": "sha512-uF2XJs+7xSLsrmIvn37i/wnc91nw7XjOQB8ccyx5aEgdnohr7n+rEiZP23WkCYHjilR6+EboEnbq/ZQDz4LSbg==", "dev": true, "dependencies": { "ansi-colors": "4.1.1", @@ -6697,13 +7226,12 @@ "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.2.0", + "glob": "8.1.0", "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", "minimatch": "5.0.1", "ms": "2.1.3", - "nanoid": "3.3.3", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", @@ -6718,10 +7246,6 @@ }, "engines": { "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" } }, "node_modules/mocha/node_modules/brace-expansion": { @@ -6744,6 +7268,25 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/mocha/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/mocha/node_modules/minimatch": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", @@ -6816,18 +7359,6 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, - "node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -6846,25 +7377,6 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "node_modules/node-fetch": { - "version": "2.6.13", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.13.tgz", - "integrity": "sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/node-preload": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", @@ -6878,9 +7390,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", - "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, "node_modules/noms": { @@ -7080,9 +7592,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7098,13 +7610,13 @@ } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, @@ -7116,28 +7628,28 @@ } }, "node_modules/object.entries": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", - "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -7146,28 +7658,41 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.groupby": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.2.tgz", + "integrity": "sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==", + "dev": true, + "dependencies": { + "array.prototype.filter": "^1.0.3", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0" + } + }, "node_modules/object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", + "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", "dev": true, "dependencies": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -7200,17 +7725,17 @@ } }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -7454,6 +7979,15 @@ "node": ">=8" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -7517,9 +8051,9 @@ } }, "node_modules/protobufjs": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.3.tgz", - "integrity": "sha512-TtpvOqwB5Gdz/PQmOjgsrGH1nHjAQVCN7JG4A6r1sXRWESL5rNMAiRcBQlCAdKxZcAbstExQePYG8xof/JVRgg==", + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", + "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", "hasInstallScript": true, "dependencies": { "@protobufjs/aspromise": "^1.1.2", @@ -7539,20 +8073,10 @@ "node": ">=12.0.0" } }, - "node_modules/protobufjs/node_modules/@types/node": { - "version": "20.1.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.0.tgz", - "integrity": "sha512-O+z53uwx64xY7D6roOi4+jApDGFg0qn6WHcxe5QeqjMaTezBO/mxdfFXIVAVVyNWKx84OmPB3L8kbVYOTeN34A==" - }, - "node_modules/protobufjs/node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - }, "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "engines": { "node": ">=6" @@ -7623,15 +8147,37 @@ "node": ">=8.10.0" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz", + "integrity": "sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0", + "get-intrinsic": "^1.2.3", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -7665,9 +8211,9 @@ } }, "node_modules/remark-parse": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz", - "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", + "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", "dev": true, "dependencies": { "@types/mdast": "^3.0.0", @@ -7694,12 +8240,12 @@ "dev": true }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -7813,6 +8359,30 @@ "node": ">=6" } }, + "node_modules/safe-array-concat": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", + "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -7834,15 +8404,18 @@ ] }, "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7859,9 +8432,9 @@ "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" }, "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -7906,6 +8479,38 @@ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, + "node_modules/set-function-length": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -7928,14 +8533,18 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", + "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8058,47 +8667,65 @@ } }, "node_modules/string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", "side-channel": "^1.0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8225,9 +8852,9 @@ } }, "node_modules/tar": { - "version": "6.1.14", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.14.tgz", - "integrity": "sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -8240,15 +8867,12 @@ "node": ">=10" } }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "engines": { - "node": ">=10" + "node": ">=8" } }, "node_modules/tar/node_modules/yallist": { @@ -8293,9 +8917,9 @@ } }, "node_modules/through2/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "dependencies": { "core-util-is": "~1.0.0", @@ -8355,15 +8979,10 @@ "node": ">=8.0" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, "node_modules/trough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", - "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", "dev": true, "funding": { "type": "github", @@ -8371,9 +8990,9 @@ } }, "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", @@ -8423,13 +9042,13 @@ } }, "node_modules/tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "dependencies": { "@types/json5": "^0.0.29", - "json5": "^1.0.1", + "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } @@ -8477,9 +9096,9 @@ } }, "node_modules/txm": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/txm/-/txm-8.1.0.tgz", - "integrity": "sha512-mVDmoN13jYX3igNcnS+TEJJmMIRLjn0wch/wOI23z5IkCKiw9xinv1WkugB55j57W8MfuEk/psVVO4BWMfZxfA==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/txm/-/txm-8.2.0.tgz", + "integrity": "sha512-ALNu1KIbUMXlsl/UacjfhbtG4CWK07JYtf0KNf8aXhoixmtgMj2MdOit5er6V8qh5eTIvtB6+AexIQMLZhSz6Q==", "dev": true, "dependencies": { "async": "^3.2.1", @@ -8497,9 +9116,9 @@ } }, "node_modules/txm/node_modules/supports-color": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.3.1.tgz", - "integrity": "sha512-knBY82pjmnIzK3NifMo3RxEIRD9E0kIzV4BKcyTZ9+9kWgLMxd4PrsTSMoFQUabgRBbF8KOLRDCyKgNV+iK44Q==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", + "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", "dev": true, "engines": { "node": ">=12" @@ -8541,6 +9160,79 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", + "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -8551,9 +9243,9 @@ } }, "node_modules/typescript": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", - "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -8578,6 +9270,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, "node_modules/unified": { "version": "10.1.2", "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", @@ -8598,9 +9295,9 @@ } }, "node_modules/unist-util-stringify-position": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", - "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", "dev": true, "dependencies": { "@types/unist": "^2.0.0" @@ -8611,9 +9308,9 @@ } }, "node_modules/universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==" }, "node_modules/untildify": { "version": "4.0.0", @@ -8625,9 +9322,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "funding": [ { @@ -8637,6 +9334,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { @@ -8644,7 +9345,7 @@ "picocolors": "^1.0.0" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -8693,9 +9394,9 @@ } }, "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", + "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", "dev": true }, "node_modules/v8-compile-cache-lib": { @@ -8705,9 +9406,9 @@ "dev": true }, "node_modules/vfile": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.6.tgz", - "integrity": "sha512-ADBsmerdGBs2WYckrLBEmuETSPyTD4TuLxTrw0DvjirxW1ra4ZwkbzG8ndsv3Q57smvHxo677MHaQrY9yxH8cA==", + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", "dev": true, "dependencies": { "@types/unist": "^2.0.0", @@ -8721,9 +9422,9 @@ } }, "node_modules/vfile-message": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.3.tgz", - "integrity": "sha512-0yaU+rj2gKAyEk12ffdSbBfjnnj+b1zqTBv3OQCTn8yEB02bsPizwdBPrLJjHnK+cU9EMMcUnNv938XcZIkmdA==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", "dev": true, "dependencies": { "@types/unist": "^2.0.0", @@ -8748,15 +9449,15 @@ } }, "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", - "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz", + "integrity": "sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==", "dev": true }, "node_modules/vscode-languageserver-types": { - "version": "3.17.2", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2.tgz", - "integrity": "sha512-zHhCWatviizPIq9B7Vh9uvrH6x3sK8itC84HkamnBWoDFJtzBf7SWlpLCZUit72b3os45h6RWQNC9xHRDF8dRA==", + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", "dev": true }, "node_modules/vscode-nls": { @@ -8766,25 +9467,11 @@ "dev": true }, "node_modules/vscode-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", - "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", "dev": true }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -8816,16 +9503,82 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "dev": true }, + "node_modules/which-typed-array": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", + "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -8882,6 +9635,18 @@ "typedarray-to-buffer": "^3.1.5" } }, + "node_modules/write/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -9008,6621 +9773,5 @@ "url": "https://github.com/sponsors/sindresorhus" } } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } - } - }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/compat-data": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz", - "integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==", - "dev": true - }, - "@babel/core": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.7.tgz", - "integrity": "sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.20.7", - "@babel/helpers": "^7.20.7", - "@babel/parser": "^7.20.7", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", - "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", - "dev": true, - "requires": { - "@babel/types": "^7.20.7", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", - "dev": true, - "requires": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.7.tgz", - "integrity": "sha512-FNdu7r67fqMUSVuQpFQGE6BPdhJIhitoxhGzDbAXNcA07uoVG37fOiMk3OSV8rEICuyG6t8LGkd9EE64qIEoIA==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" - } - }, - "@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "dev": true, - "requires": { - "@babel/types": "^7.20.2" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true - }, - "@babel/helpers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz", - "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==", - "dev": true, - "requires": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" - } - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", - "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", - "dev": true - }, - "@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - } - }, - "@babel/traverse": { - "version": "7.20.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.8.tgz", - "integrity": "sha512-/RNkaYDeCy4MjyV70+QkSHhxbvj2JO/5Ft2Pa880qJOG8tWrqcT/wXUuCCv43yogfqPzHL77Xu101KQPf4clnQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - } - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } - } - }, - "@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.3.0" - } - }, - "@eslint-community/regexpp": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", - "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", - "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.5.1", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - } - }, - "@eslint/js": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", - "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==", - "dev": true - }, - "@grpc/grpc-js": { - "version": "1.8.14", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.14.tgz", - "integrity": "sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A==", - "requires": { - "@grpc/proto-loader": "^0.7.0", - "@types/node": ">=12.12.47" - } - }, - "@grpc/proto-loader": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.7.tgz", - "integrity": "sha512-1TIeXOi8TuSCQprPItwoMymZXxWT0CPxUhkrkeCUH+D8U7QDwQ6b7SUz2MaLuWM2llT+J/TVFLmQI5KtML3BhQ==", - "requires": { - "@types/long": "^4.0.1", - "lodash.camelcase": "^4.3.0", - "long": "^4.0.0", - "protobufjs": "^7.0.0", - "yargs": "^17.7.2" - } - }, - "@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@octokit/endpoint": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.0.tgz", - "integrity": "sha512-szrQhiqJ88gghWY2Htt8MqUDO6++E/EIXqJ2ZEp5ma3uGS46o7LZAzSLt49myB7rT+Hfw5Y6gO3LmOxGzHijAQ==", - "requires": { - "@octokit/types": "^11.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/openapi-types": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", - "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" - }, - "@octokit/request": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.1.tgz", - "integrity": "sha512-8N+tdUz4aCqQmXl8FpHYfKG9GelDFd7XGVzyN8rc6WxVlYcfpHECnuRkgquzz+WzvHTK62co5di8gSXnzASZPQ==", - "requires": { - "@octokit/endpoint": "^9.0.0", - "@octokit/request-error": "^5.0.0", - "@octokit/types": "^11.1.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/request-error": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.0.tgz", - "integrity": "sha512-1ue0DH0Lif5iEqT52+Rf/hf0RmGO9NWFjrzmrkArpG9trFfDM/efx00BJHdLGuro4BR/gECxCU2Twf5OKrRFsQ==", - "requires": { - "@octokit/types": "^11.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "@octokit/types": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-11.1.0.tgz", - "integrity": "sha512-Fz0+7GyLm/bHt8fwEqgvRBWwIV1S6wRRyq+V6exRKLVWaKGsuy6H9QFYeBVDV7rK6fO3XwHgQOPxv+cLj2zpXQ==", - "requires": { - "@octokit/openapi-types": "^18.0.0" - } - }, - "@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" - }, - "@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" - }, - "@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "requires": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" - }, - "@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" - }, - "@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" - }, - "@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" - }, - "@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" - }, - "@sweet-monads/either": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@sweet-monads/either/-/either-3.2.0.tgz", - "integrity": "sha512-n+nR0b60GRTKb+D76qhTf4NEBXU9zfpigYYEtKtSYbV+5+i5gxr9jFd64pYkY2O7hVsb/G7nspbAeFni/i1ltA==", - "requires": { - "@sweet-monads/interfaces": "^3.2.0" - } - }, - "@sweet-monads/interfaces": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@sweet-monads/interfaces/-/interfaces-3.3.0.tgz", - "integrity": "sha512-66akGvjPD4lizQy+w4JSltJilc2w/QPdw8lPAniLJGHwyjmrw9xMJLx76Q/GDnbCU59Werses4aZJLWOlJrL5A==" - }, - "@sweet-monads/maybe": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@sweet-monads/maybe/-/maybe-3.2.0.tgz", - "integrity": "sha512-/t+K0D/kBfkYOkZaePEsrK868at0M9UIEVgehcM0xscrCSZhKWGteE41vl2XJQqh8WyiFo/mZ5y7eAPSYzS+pg==", - "requires": { - "@sweet-monads/interfaces": "^3.2.0" - } - }, - "@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true - }, - "@types/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", - "dev": true - }, - "@types/debug": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", - "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", - "dev": true, - "requires": { - "@types/ms": "*" - } - }, - "@types/json-bigint": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/json-bigint/-/json-bigint-1.0.1.tgz", - "integrity": "sha512-zpchZLNsNuzJHi6v64UBoFWAvQlPhch7XAi36FkH6tL1bbbmimIF+cS7vwkzY4u5RaSWMoflQfu+TshMPPw8uw==", - "dev": true - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "@types/line-column": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/line-column/-/line-column-1.0.0.tgz", - "integrity": "sha512-wbw+IDRw/xY/RGy+BL6f4Eey4jsUgHQrMuA4Qj0CSG3x/7C2Oc57pmRoM2z3M4DkylWRz+G1pfX06sCXQm0J+w==" - }, - "@types/lodash": { - "version": "4.14.191", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", - "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==", - "dev": true - }, - "@types/lodash.isequal": { - "version": "4.5.6", - "resolved": "https://registry.npmjs.org/@types/lodash.isequal/-/lodash.isequal-4.5.6.tgz", - "integrity": "sha512-Ww4UGSe3DmtvLLJm2F16hDwEQSv7U0Rr8SujLUA2wHI2D2dm8kPu6Et+/y303LfjTIwSBKXB/YTUcAKpem/XEg==", - "dev": true, - "requires": { - "@types/lodash": "*" - } - }, - "@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" - }, - "@types/mdast": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", - "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", - "dev": true, - "requires": { - "@types/unist": "*" - } - }, - "@types/mocha": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.3.tgz", - "integrity": "sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw==", - "dev": true - }, - "@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", - "dev": true - }, - "@types/node": { - "version": "18.16.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.0.tgz", - "integrity": "sha512-BsAaKhB+7X+H4GnSjGhJG9Qi8Tw+inU9nJDwmD5CgOmBLEI6ArdhikpLX7DjbjDRDTbqZzU2LSQNZg8WGPiSZQ==" - }, - "@types/node-fetch": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz", - "integrity": "sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==", - "dev": true, - "requires": { - "@types/node": "*", - "form-data": "^3.0.0" - } - }, - "@types/seedrandom": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.4.tgz", - "integrity": "sha512-/rWdxeiuZenlawrHU+XV6ZHMTKOqrC2hMfeDfLTIWJhDZP5aVqXRysduYHBbhD7CeJO6FJr/D2uBVXB7GT6v7w==" - }, - "@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", - "dev": true - }, - "@types/tar": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@types/tar/-/tar-6.1.5.tgz", - "integrity": "sha512-qm2I/RlZij5RofuY7vohTpYNaYcrSQlN2MyjucQc7ZweDwaEWkdN/EeNh6e9zjK6uEm6PwjdMXkcj05BxZdX1Q==", - "dev": true, - "requires": { - "@types/node": "*", - "minipass": "^4.0.0" - }, - "dependencies": { - "minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", - "dev": true - } - } - }, - "@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", - "dev": true - }, - "@types/yargs": { - "version": "17.0.17", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.17.tgz", - "integrity": "sha512-72bWxFKTK6uwWJAVT+3rF6Jo6RTojiJ27FQo8Rf60AL+VZbzoVPnMFhKsUnbjR8A3BTCYQ7Mv3hnl8T0A+CX9g==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.47.0.tgz", - "integrity": "sha512-AHZtlXAMGkDmyLuLZsRpH3p4G/1iARIwc/T0vIem2YB+xW6pZaXYXzCBnZSF/5fdM97R9QqZWZ+h3iW10XgevQ==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.47.0", - "@typescript-eslint/type-utils": "5.47.0", - "@typescript-eslint/utils": "5.47.0", - "debug": "^4.3.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/parser": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.47.0.tgz", - "integrity": "sha512-udPU4ckK+R1JWCGdQC4Qa27NtBg7w020ffHqGyAK8pAgOVuNw7YaKXGChk+udh+iiGIJf6/E/0xhVXyPAbsczw==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.47.0", - "@typescript-eslint/types": "5.47.0", - "@typescript-eslint/typescript-estree": "5.47.0", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.47.0.tgz", - "integrity": "sha512-dvJab4bFf7JVvjPuh3sfBUWsiD73aiftKBpWSfi3sUkysDQ4W8x+ZcFpNp7Kgv0weldhpmMOZBjx1wKN8uWvAw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.47.0", - "@typescript-eslint/visitor-keys": "5.47.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.47.0.tgz", - "integrity": "sha512-1J+DFFrYoDUXQE1b7QjrNGARZE6uVhBqIvdaXTe5IN+NmEyD68qXR1qX1g2u4voA+nCaelQyG8w30SAOihhEYg==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "5.47.0", - "@typescript-eslint/utils": "5.47.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/types": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.47.0.tgz", - "integrity": "sha512-eslFG0Qy8wpGzDdYKu58CEr3WLkjwC5Usa6XbuV89ce/yN5RITLe1O8e+WFEuxnfftHiJImkkOBADj58ahRxSg==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.47.0.tgz", - "integrity": "sha512-LxfKCG4bsRGq60Sqqu+34QT5qT2TEAHvSCCJ321uBWywgE2dS0LKcu5u+3sMGo+Vy9UmLOhdTw5JHzePV/1y4Q==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.47.0", - "@typescript-eslint/visitor-keys": "5.47.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/utils": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.47.0.tgz", - "integrity": "sha512-U9xcc0N7xINrCdGVPwABjbAKqx4GK67xuMV87toI+HUqgXj26m6RBp9UshEXcTrgCkdGYFzgKLt8kxu49RilDw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.47.0", - "@typescript-eslint/types": "5.47.0", - "@typescript-eslint/typescript-estree": "5.47.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", - "semver": "^7.3.7" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.47.0.tgz", - "integrity": "sha512-ByPi5iMa6QqDXe/GmT/hR6MZtVPi0SqMQPDx15FczCBXJo/7M8T88xReOALAfpBLm+zxpPfmhuEvPb577JRAEg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.47.0", - "eslint-visitor-keys": "^3.3.0" - } - }, - "acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "antlr4ts": { - "version": "0.5.0-alpha.4", - "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", - "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==" - }, - "antlr4ts-cli": { - "version": "0.5.0-alpha.4", - "resolved": "https://registry.npmjs.org/antlr4ts-cli/-/antlr4ts-cli-0.5.0-alpha.4.tgz", - "integrity": "sha512-lVPVBTA2CVHRYILSKilL6Jd4hAumhSZZWA7UbQNQrmaSSj7dPmmYaN4bOmZG79cOy0lS00i4LY68JZZjZMWVrw==", - "dev": true - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "requires": { - "default-require-extensions": "^3.0.0" - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "is-string": "^1.0.7" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.tosorted": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", - "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" - } - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, - "async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "babel-eslint": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", - "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "bignumber.js": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", - "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==" - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - } - }, - "caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "requires": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001441", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz", - "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==", - "dev": true - }, - "chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "dev": true - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true - }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "copyfiles": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz", - "integrity": "sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==", - "dev": true, - "requires": { - "glob": "^7.0.5", - "minimatch": "^3.0.3", - "mkdirp": "^1.0.4", - "noms": "0.0.0", - "through2": "^2.0.1", - "untildify": "^4.0.0", - "yargs": "^16.1.0" - }, - "dependencies": { - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - } - } - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true - }, - "decode-named-character-reference": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", - "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", - "dev": true, - "requires": { - "character-entities": "^2.0.0" - } - }, - "deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "default-require-extensions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", - "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", - "dev": true, - "requires": { - "strip-bom": "^4.0.0" - } - }, - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true - }, - "deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" - }, - "dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true - }, - "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true - }, - "diff-match-patch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", - "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "eol": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz", - "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==" - }, - "es-abstract": { - "version": "1.20.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", - "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "unbox-primitive": "^1.0.2" - } - }, - "es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", - "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.39.0", - "@humanwhocodes/config-array": "^0.11.8", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.0", - "espree": "^9.5.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "dependencies": { - "eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - } - } - }, - "eslint-config-esnext": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-esnext/-/eslint-config-esnext-4.1.0.tgz", - "integrity": "sha512-GhfVEXdqYKEIIj7j+Fw2SQdL9qyZMekgXfq6PyXM66cQw0B435ddjz3P3kxOBVihMRJ0xGYjosaveQz5Y6z0uA==", - "dev": true, - "requires": { - "babel-eslint": "^10.0.1", - "eslint": "^6.8.0", - "eslint-plugin-babel": "^5.2.1", - "eslint-plugin-import": "^2.14.0" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "eslint-config-node": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-node/-/eslint-config-node-4.1.0.tgz", - "integrity": "sha512-Wz17xV5O2WFG8fGdMYEBdbiL6TL7YNJSJvSX9V4sXQownewfYmoqlly7wxqLkOUv/57pq6LnnotMiQQrrPjCqQ==", - "dev": true, - "requires": { - "eslint": "^6.8.0", - "eslint-config-esnext": "^4.1.0" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "eslint-config-prettier": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", - "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", - "dev": true, - "requires": {} - }, - "eslint-config-react-native": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-react-native/-/eslint-config-react-native-4.1.0.tgz", - "integrity": "sha512-kNND+cs+ztawH7wgajf/K6FfNshjlDsFDAkkFZF9HAXDgH1w1sNMIfTfwzufg0hOcSK7rbiL4qbG/gg/oR507Q==", - "dev": true, - "requires": { - "eslint": "^6.8.0", - "eslint-config-esnext": "^4.1.0", - "eslint-plugin-react": "^7.19.0", - "eslint-plugin-react-native": "^3.8.1" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - } - }, - "eslint-plugin-react-native": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-native/-/eslint-plugin-react-native-3.11.0.tgz", - "integrity": "sha512-7F3OTwrtQPfPFd+VygqKA2VZ0f2fz0M4gJmry/TRE18JBb94/OtMxwbL7Oqwu7FGyrdeIOWnXQbBAveMcSTZIA==", - "dev": true, - "requires": { - "@babel/traverse": "^7.7.4", - "eslint-plugin-react-native-globals": "^0.1.1" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "eslint-config-recommended": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-recommended/-/eslint-config-recommended-4.1.0.tgz", - "integrity": "sha512-2evA0SX1VqtyFiExmBI2WAO4XQCKlr7wmNELE8rcT5PyZY2ixsY881ofVZWKuI/dywpgLiES1gR/XUQcnVLRzQ==", - "dev": true, - "requires": { - "eslint": "^6.8.0", - "eslint-config-esnext": "^4.1.0", - "eslint-config-node": "^4.1.0", - "eslint-config-react-native": "^4.1.0" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "resolve": "^1.20.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", - "dev": true, - "requires": { - "debug": "^3.2.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-plugin-babel": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-babel/-/eslint-plugin-babel-5.3.1.tgz", - "integrity": "sha512-VsQEr6NH3dj664+EyxJwO4FCYm/00JhYb3Sk3ft8o+fpKuIfQ9TaW6uVUfvwMXHcf/lsnRIoyFPsLMyiWCSL/g==", - "dev": true, - "requires": { - "eslint-rule-composer": "^0.3.0" - } - }, - "eslint-plugin-es": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", - "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", - "dev": true, - "requires": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "dependencies": { - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", - "dev": true, - "requires": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "eslint-plugin-json": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-json/-/eslint-plugin-json-3.1.0.tgz", - "integrity": "sha512-MrlG2ynFEHe7wDGwbUuFPsaT2b1uhuEFhJ+W1f1u+1C2EkXmTYJp4B1aAdQQ8M+CC3t//N/oRKiIVw14L2HR1g==", - "dev": true, - "requires": { - "lodash": "^4.17.21", - "vscode-json-languageservice": "^4.1.6" - } - }, - "eslint-plugin-node": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", - "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", - "dev": true, - "requires": { - "eslint-plugin-es": "^3.0.0", - "eslint-utils": "^2.0.0", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" - }, - "dependencies": { - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "eslint-plugin-promise": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", - "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", - "dev": true, - "requires": {} - }, - "eslint-plugin-react": { - "version": "7.31.11", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz", - "integrity": "sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw==", - "dev": true, - "requires": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", - "doctrine": "^2.1.0", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.3", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.8" - }, - "dependencies": { - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "eslint-plugin-react-native-globals": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-native-globals/-/eslint-plugin-react-native-globals-0.1.2.tgz", - "integrity": "sha512-9aEPf1JEpiTjcFAmmyw8eiIXmcNZOqaZyHO77wgm0/dWfT/oxC1SrIq8ET38pMxHYrcB6Uew+TzUVsBeczF88g==", - "dev": true - }, - "eslint-plugin-unused-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-2.0.0.tgz", - "integrity": "sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==", - "dev": true, - "requires": { - "eslint-rule-composer": "^0.3.0" - } - }, - "eslint-rule-composer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", - "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", - "dev": true - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "dependencies": { - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - } - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", - "dev": true - }, - "espree": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", - "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastq": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", - "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - } - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-package": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-package/-/find-package-1.0.0.tgz", - "integrity": "sha512-yVn71XCCaNgxz58ERTl8nA/8YYtIQDY9mHSrgFBfiFtdNNfY0h183Vh8BRkKxD8x9TUw3ec290uJKhDVxqGZBw==", - "dev": true, - "requires": { - "parents": "^1.0.1" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - } - }, - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - } - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "genversion": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/genversion/-/genversion-3.1.1.tgz", - "integrity": "sha512-/H861PMsihhjgX2qqhTN8egM11V04imhA+3JRFY3jjPua2Sy1NqaqqQPjSP8rdM9jZoKpFhVj9g3Fs9XPCjBYQ==", - "dev": true, - "requires": { - "commander": "^7.2.0", - "find-package": "^1.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "requires": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true - }, - "immutable": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", - "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==" - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - } - }, - "internal-slot": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", - "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true - }, - "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "dev": true - }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", - "requires": { - "isarray": "1.0.0" - } - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "requires": { - "append-transform": "^2.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-processinfo": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", - "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", - "dev": true, - "requires": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.3", - "istanbul-lib-coverage": "^3.2.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^8.3.2" - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "js-sdsl": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", - "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "requires": { - "bignumber.js": "^9.0.0" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "json5": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.2.tgz", - "integrity": "sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==", - "dev": true - }, - "jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "jsx-ast-utils": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", - "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", - "dev": true, - "requires": { - "array-includes": "^3.1.5", - "object.assign": "^4.1.3" - } - }, - "kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "line-column": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/line-column/-/line-column-1.0.2.tgz", - "integrity": "sha512-Ktrjk5noGYlHsVnYWh62FLVs4hTb8A3e+vucNZMgPeAOITdshMSgv4cCZQeRDjm7+goqmo6+liZwTXo+U3sVww==", - "requires": { - "isarray": "^1.0.0", - "isobject": "^2.0.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", - "dev": true, - "requires": { - "get-func-name": "^2.0.0" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "mdast-util-from-markdown": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", - "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", - "dev": true, - "requires": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "mdast-util-to-string": "^3.1.0", - "micromark": "^3.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-decode-string": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-stringify-position": "^3.0.0", - "uvu": "^0.5.0" - } - }, - "mdast-util-to-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", - "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromark": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", - "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", - "dev": true, - "requires": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "micromark-core-commonmark": "^1.0.1", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "micromark-core-commonmark": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz", - "integrity": "sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==", - "dev": true, - "requires": { - "decode-named-character-reference": "^1.0.0", - "micromark-factory-destination": "^1.0.0", - "micromark-factory-label": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-factory-title": "^1.0.0", - "micromark-factory-whitespace": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-html-tag-name": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "micromark-factory-destination": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz", - "integrity": "sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==", - "dev": true, - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-factory-label": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz", - "integrity": "sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==", - "dev": true, - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "micromark-factory-space": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz", - "integrity": "sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==", - "dev": true, - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-factory-title": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz", - "integrity": "sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==", - "dev": true, - "requires": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "micromark-factory-whitespace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz", - "integrity": "sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==", - "dev": true, - "requires": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-character": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.1.0.tgz", - "integrity": "sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==", - "dev": true, - "requires": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-chunked": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz", - "integrity": "sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==", - "dev": true, - "requires": { - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-classify-character": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz", - "integrity": "sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==", - "dev": true, - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-combine-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz", - "integrity": "sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==", - "dev": true, - "requires": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-decode-numeric-character-reference": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz", - "integrity": "sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==", - "dev": true, - "requires": { - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-decode-string": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz", - "integrity": "sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==", - "dev": true, - "requires": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-encode": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz", - "integrity": "sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==", - "dev": true - }, - "micromark-util-html-tag-name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz", - "integrity": "sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==", - "dev": true - }, - "micromark-util-normalize-identifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz", - "integrity": "sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==", - "dev": true, - "requires": { - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-resolve-all": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz", - "integrity": "sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==", - "dev": true, - "requires": { - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-sanitize-uri": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz", - "integrity": "sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==", - "dev": true, - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-subtokenize": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz", - "integrity": "sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==", - "dev": true, - "requires": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "micromark-util-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz", - "integrity": "sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==", - "dev": true - }, - "micromark-util-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.0.2.tgz", - "integrity": "sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "dev": true - }, - "minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==" - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - }, - "mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "dev": true, - "requires": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - } - } - }, - "mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-fetch": { - "version": "2.6.13", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.13.tgz", - "integrity": "sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "requires": { - "process-on-spawn": "^1.0.0" - } - }, - "node-releases": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", - "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", - "dev": true - }, - "noms": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", - "integrity": "sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "~1.0.31" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "requires": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "dependencies": { - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true - }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "object.entries": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", - "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", - "dev": true, - "requires": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parents": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", - "integrity": "sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==", - "dev": true, - "requires": { - "path-platform": "~0.11.15" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-platform": { - "version": "0.11.15", - "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", - "integrity": "sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "dev": true, - "requires": { - "fromentries": "^1.2.0" - } - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "protobufjs": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.3.tgz", - "integrity": "sha512-TtpvOqwB5Gdz/PQmOjgsrGH1nHjAQVCN7JG4A6r1sXRWESL5rNMAiRcBQlCAdKxZcAbstExQePYG8xof/JVRgg==", - "requires": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "dependencies": { - "@types/node": { - "version": "20.1.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.0.tgz", - "integrity": "sha512-O+z53uwx64xY7D6roOi4+jApDGFg0qn6WHcxe5QeqjMaTezBO/mxdfFXIVAVVyNWKx84OmPB3L8kbVYOTeN34A==" - }, - "long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - } - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - } - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, - "remark-parse": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz", - "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", - "dev": true, - "requires": { - "@types/mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "unified": "^10.0.0" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dev": true, - "requires": { - "mri": "^1.1.0" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "seedrandom": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "requires": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4" - } - }, - "string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "tar": { - "version": "6.1.14", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.14.tgz", - "integrity": "sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw==", - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "trough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", - "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", - "dev": true - }, - "ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - } - } - }, - "tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - } - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "txm": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/txm/-/txm-8.1.0.tgz", - "integrity": "sha512-mVDmoN13jYX3igNcnS+TEJJmMIRLjn0wch/wOI23z5IkCKiw9xinv1WkugB55j57W8MfuEk/psVVO4BWMfZxfA==", - "dev": true, - "requires": { - "async": "^3.2.1", - "diff-match-patch": "^1.0.5", - "kleur": "^4.1.4", - "remark-parse": "^10.0.1", - "supports-color": "^9.1.0", - "unified": "^10.1.1" - }, - "dependencies": { - "supports-color": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.3.1.tgz", - "integrity": "sha512-knBY82pjmnIzK3NifMo3RxEIRD9E0kIzV4BKcyTZ9+9kWgLMxd4PrsTSMoFQUabgRBbF8KOLRDCyKgNV+iK44Q==", - "dev": true - } - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", - "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", - "dev": true - }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "unified": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", - "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "bail": "^2.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^5.0.0" - } - }, - "unist-util-stringify-position": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", - "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0" - } - }, - "universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" - }, - "untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - }, - "uvu": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", - "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", - "dev": true, - "requires": { - "dequal": "^2.0.0", - "diff": "^5.0.0", - "kleur": "^4.0.3", - "sade": "^1.7.3" - } - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "vfile": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.6.tgz", - "integrity": "sha512-ADBsmerdGBs2WYckrLBEmuETSPyTD4TuLxTrw0DvjirxW1ra4ZwkbzG8ndsv3Q57smvHxo677MHaQrY9yxH8cA==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - } - }, - "vfile-message": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.3.tgz", - "integrity": "sha512-0yaU+rj2gKAyEk12ffdSbBfjnnj+b1zqTBv3OQCTn8yEB02bsPizwdBPrLJjHnK+cU9EMMcUnNv938XcZIkmdA==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - } - }, - "vscode-json-languageservice": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-4.2.1.tgz", - "integrity": "sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA==", - "dev": true, - "requires": { - "jsonc-parser": "^3.0.0", - "vscode-languageserver-textdocument": "^1.0.3", - "vscode-languageserver-types": "^3.16.0", - "vscode-nls": "^5.0.0", - "vscode-uri": "^3.0.3" - } - }, - "vscode-languageserver-textdocument": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", - "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==", - "dev": true - }, - "vscode-languageserver-types": { - "version": "3.17.2", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2.tgz", - "integrity": "sha512-zHhCWatviizPIq9B7Vh9uvrH6x3sK8itC84HkamnBWoDFJtzBf7SWlpLCZUit72b3os45h6RWQNC9xHRDF8dRA==", - "dev": true - }, - "vscode-nls": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-5.2.0.tgz", - "integrity": "sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==", - "dev": true - }, - "vscode-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", - "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==", - "dev": true - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", - "dev": true - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "dependencies": { - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" - } - } - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true - }, - "yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "requires": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true - } - } - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } } } diff --git a/quint/package.json b/quint/package.json index 970566b5d..4bee3265d 100644 --- a/quint/package.json +++ b/quint/package.json @@ -63,7 +63,6 @@ "line-column": "^1.0.2", "lodash": "^4.17.21", "lodash.isequal": "^4.5.0", - "node-fetch": "^2.6.13", "seedrandom": "^3.0.5", "tar": "^6.1.14", "yargs": "^17.2.1" diff --git a/quint/src/quintVerifier.ts b/quint/src/quintVerifier.ts index d1e943206..be2f54bde 100644 --- a/quint/src/quintVerifier.ts +++ b/quint/src/quintVerifier.ts @@ -21,7 +21,6 @@ import fs from 'fs' import os from 'os' // TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 // import semver from 'semver' -import fetch from 'node-fetch' import { pipeline } from 'stream/promises' import child_process from 'child_process' import * as tar from 'tar' @@ -277,7 +276,7 @@ function downloadAndUnpackApalache(): Promise> { return fetch(url) .then( // unpack response body - res => pipeline(res.body, tar.extract({ cwd: apalacheDistDir(), strict: true })), + res => pipeline(res.body!, tar.extract({ cwd: apalacheDistDir(), strict: true })), error => err(`Error fetching ${url}: ${error}`) ) .then( From cc1ffab2e93a13af6bdac793ddbeea739c16511a Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 28 Feb 2024 18:34:32 -0500 Subject: [PATCH 247/388] Fix visitor and transformer for params Followup for #1371 I forgot to add visitor logic for the parameter type annotations --- quint/src/ir/IRTransformer.ts | 3 +++ quint/src/ir/IRVisitor.ts | 6 +++++- quint/test/ir/IRTransformer.test.ts | 20 ++++++++++++++++++++ quint/test/ir/IRVisitor.test.ts | 20 ++++++++++++++++++++ 4 files changed, 48 insertions(+), 1 deletion(-) diff --git a/quint/src/ir/IRTransformer.ts b/quint/src/ir/IRTransformer.ts index 3f3eb6963..5cf1389c1 100644 --- a/quint/src/ir/IRTransformer.ts +++ b/quint/src/ir/IRTransformer.ts @@ -483,6 +483,9 @@ function transformExpression(transformer: IRTransformer, expr: ir.QuintEx): ir.Q newExpr = transformer.enterLambda(newExpr) } + newExpr.params = newExpr.params.map(p => + p.typeAnnotation ? { ...p, typeAnnotation: transformType(transformer, p.typeAnnotation) } : p + ) newExpr.expr = transformExpression(transformer, newExpr.expr) if (transformer.exitLambda) { diff --git a/quint/src/ir/IRVisitor.ts b/quint/src/ir/IRVisitor.ts index 282f048ec..879eb112b 100644 --- a/quint/src/ir/IRVisitor.ts +++ b/quint/src/ir/IRVisitor.ts @@ -456,7 +456,11 @@ export function walkExpression(visitor: IRVisitor, expr: ir.QuintEx): void { if (visitor.enterLambda) { visitor.enterLambda(expr) } - + expr.params.forEach(p => { + if (p.typeAnnotation) { + walkType(visitor, p.typeAnnotation) + } + }) walkExpression(visitor, expr.expr) if (visitor.exitLambda) { diff --git a/quint/test/ir/IRTransformer.test.ts b/quint/test/ir/IRTransformer.test.ts index c01ce0d51..70b210cbc 100644 --- a/quint/test/ir/IRTransformer.test.ts +++ b/quint/test/ir/IRTransformer.test.ts @@ -41,6 +41,26 @@ describe('enterExpr', () => { assert.deepEqual(moduleToString(result), moduleToString(expectedModule)) }) + + it('transforms paramater type annotations', () => { + class TestTransformer implements IRTransformer { + exitType(_: QuintType): QuintType { + return { kind: 'var', name: 'trans' } + } + } + + const transformer = new TestTransformer() + + const m = buildModuleWithDecls(['def foo(x: int, b: int, c: str): int = 42']) + + const transformedDecl = transformModule(transformer, m).declarations[0] + assert(transformedDecl.kind === 'def') + assert(transformedDecl.expr.kind === 'lambda') + transformedDecl.expr.params.forEach(p => { + assert(p.typeAnnotation) + assert.deepEqual(p.typeAnnotation, { kind: 'var', name: 'trans' }) + }) + }) }) describe('enterDecl', () => { diff --git a/quint/test/ir/IRVisitor.test.ts b/quint/test/ir/IRVisitor.test.ts index c3c41d5a3..6c9da5333 100644 --- a/quint/test/ir/IRVisitor.test.ts +++ b/quint/test/ir/IRVisitor.test.ts @@ -902,5 +902,25 @@ describe('walkModule', () => { assert.deepEqual(visitor.entered.map(typeToString), expectedTypes) assert.deepEqual(visitor.exited.map(typeToString), expectedTypes) }) + + it('finds paramater type annotations', () => { + class TestVisitor implements IRVisitor { + typesVisited: QuintType[] = [] + exitType(t: QuintType) { + this.typesVisited.push(t) + } + } + + const visitor = new TestVisitor() + + const m = buildModuleWithDecls(['def foo(x: int, b: str): bool = true']) + walkModule(visitor, m) + const actualTypes = visitor.typesVisited.map(typeToString) + // `int` and `str` should each show up TWICE: + // - once from of the lambda type annotations + // - once from of the parameter type annotation + const expectedTypes = ['int', 'str', 'bool', '(int, str) => bool', 'int', 'str'] + assert.deepEqual(actualTypes, expectedTypes) + }) }) }) From 5502f12ddb03ada79d3e115a2b4fc4a052d9b0e1 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 2 Feb 2024 14:01:51 -0500 Subject: [PATCH 248/388] Remove type abstraction Also includes some incidental cleanup. --- quint/src/generated/Quint.g4 | 2 +- quint/src/generated/Quint.interp | 2 +- quint/src/generated/QuintParser.ts | 246 +++++++++--------- quint/src/graphics.ts | 2 - quint/src/ir/IRTransformer.ts | 18 -- quint/src/ir/IRVisitor.ts | 9 - quint/src/ir/IRprinting.ts | 5 - quint/src/ir/quintTypes.ts | 23 +- quint/src/parsing/ToIrListener.ts | 29 +-- quint/src/quintAnalyzer.ts | 10 +- quint/src/types/constraintGenerator.ts | 31 ++- quint/src/types/inferrer.ts | 5 +- quint/src/types/substitutions.ts | 8 +- quint/test/ir/IRVisitor.test.ts | 24 -- quint/test/types/inferrer.test.ts | 18 ++ .../testFixture/_1045polymorphicTypeDecl.json | 2 +- .../_1045polymorphicTypeDecl.map.json | 2 +- 17 files changed, 195 insertions(+), 241 deletions(-) diff --git a/quint/src/generated/Quint.g4 b/quint/src/generated/Quint.g4 index ce8359885..a205cc230 100644 --- a/quint/src/generated/Quint.g4 +++ b/quint/src/generated/Quint.g4 @@ -127,7 +127,7 @@ type | typeVar # typeVarCase | qualId # typeConst | '(' type ')' # typeParen - | typeCtor=type ('[' typeArg+=type (',' typeArg+=type)* ']') # typeApp + | typeCtor=qualId ('[' typeArg+=type (',' typeArg+=type)* ']') # typeApp ; typeVar: LOW_ID; diff --git a/quint/src/generated/Quint.interp b/quint/src/generated/Quint.interp index 7f37f7d5e..85206e0b9 100644 --- a/quint/src/generated/Quint.interp +++ b/quint/src/generated/Quint.interp @@ -191,4 +191,4 @@ identifier atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 802, 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, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 3, 2, 6, 2, 90, 10, 2, 13, 2, 14, 2, 91, 3, 2, 3, 2, 3, 3, 7, 3, 97, 10, 3, 12, 3, 14, 3, 100, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 106, 10, 3, 12, 3, 14, 3, 109, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 114, 10, 4, 12, 4, 14, 4, 117, 11, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 141, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 149, 10, 6, 12, 6, 14, 6, 152, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 159, 10, 6, 3, 6, 5, 6, 162, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 170, 10, 6, 12, 6, 14, 6, 173, 11, 6, 5, 6, 175, 10, 6, 3, 6, 5, 6, 178, 10, 6, 3, 6, 3, 6, 5, 6, 182, 10, 6, 3, 6, 3, 6, 5, 6, 186, 10, 6, 3, 6, 5, 6, 189, 10, 6, 5, 6, 191, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 205, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 212, 10, 8, 12, 8, 14, 8, 215, 11, 8, 3, 8, 3, 8, 5, 8, 219, 10, 8, 3, 9, 5, 9, 222, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 227, 10, 9, 12, 9, 14, 9, 230, 11, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 237, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 243, 10, 11, 3, 11, 3, 11, 3, 11, 5, 11, 248, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 259, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 267, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 273, 10, 13, 3, 13, 3, 13, 5, 13, 277, 10, 13, 5, 13, 279, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 290, 10, 14, 5, 14, 292, 10, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 305, 10, 15, 12, 15, 14, 15, 308, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 315, 10, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 328, 10, 15, 12, 15, 14, 15, 331, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 338, 10, 15, 5, 15, 340, 10, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 355, 10, 20, 12, 20, 14, 20, 358, 11, 20, 5, 20, 360, 10, 20, 3, 20, 5, 20, 363, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 384, 10, 20, 12, 20, 14, 20, 387, 11, 20, 3, 20, 5, 20, 390, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 396, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 408, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 421, 10, 20, 12, 20, 14, 20, 424, 11, 20, 3, 20, 3, 20, 7, 20, 428, 10, 20, 12, 20, 14, 20, 431, 11, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 444, 10, 22, 12, 22, 14, 22, 447, 11, 22, 3, 22, 3, 22, 3, 22, 5, 22, 452, 10, 22, 3, 22, 3, 22, 5, 22, 456, 10, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 465, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 481, 10, 24, 12, 24, 14, 24, 484, 11, 24, 3, 24, 5, 24, 487, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 496, 10, 24, 12, 24, 14, 24, 499, 11, 24, 3, 24, 5, 24, 502, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 512, 10, 24, 12, 24, 14, 24, 515, 11, 24, 3, 24, 5, 24, 518, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 527, 10, 24, 12, 24, 14, 24, 530, 11, 24, 3, 24, 5, 24, 533, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 541, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 549, 10, 24, 12, 24, 14, 24, 552, 11, 24, 3, 24, 5, 24, 555, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 563, 10, 24, 12, 24, 14, 24, 566, 11, 24, 3, 24, 5, 24, 569, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 577, 10, 24, 12, 24, 14, 24, 580, 11, 24, 5, 24, 582, 10, 24, 3, 24, 5, 24, 585, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 610, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 649, 10, 24, 3, 24, 5, 24, 652, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 659, 10, 24, 12, 24, 14, 24, 662, 11, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 668, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 673, 10, 25, 12, 25, 14, 25, 676, 11, 25, 3, 25, 3, 25, 3, 26, 3, 26, 5, 26, 682, 10, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 691, 10, 27, 3, 27, 5, 27, 694, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 705, 10, 28, 3, 29, 3, 29, 5, 29, 709, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 719, 10, 30, 12, 30, 14, 30, 722, 11, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 728, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 6, 31, 735, 10, 31, 13, 31, 14, 31, 736, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 5, 32, 746, 10, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 5, 35, 756, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 761, 10, 36, 12, 36, 14, 36, 764, 11, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 772, 10, 37, 3, 38, 3, 38, 5, 38, 776, 10, 38, 3, 39, 3, 39, 5, 39, 780, 10, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 7, 42, 789, 10, 42, 12, 42, 14, 42, 792, 11, 42, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 798, 10, 43, 3, 44, 3, 44, 3, 44, 2, 2, 4, 38, 46, 45, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 68, 2, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 86, 2, 2, 10, 3, 2, 53, 55, 3, 2, 51, 52, 3, 2, 56, 61, 4, 2, 45, 49, 65, 66, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 51, 61, 3, 2, 42, 44, 3, 2, 67, 68, 2, 899, 2, 89, 3, 2, 2, 2, 4, 98, 3, 2, 2, 2, 6, 115, 3, 2, 2, 2, 8, 140, 3, 2, 2, 2, 10, 190, 3, 2, 2, 2, 12, 204, 3, 2, 2, 2, 14, 206, 3, 2, 2, 2, 16, 221, 3, 2, 2, 2, 18, 231, 3, 2, 2, 2, 20, 238, 3, 2, 2, 2, 22, 258, 3, 2, 2, 2, 24, 278, 3, 2, 2, 2, 26, 291, 3, 2, 2, 2, 28, 339, 3, 2, 2, 2, 30, 341, 3, 2, 2, 2, 32, 343, 3, 2, 2, 2, 34, 345, 3, 2, 2, 2, 36, 347, 3, 2, 2, 2, 38, 407, 3, 2, 2, 2, 40, 432, 3, 2, 2, 2, 42, 455, 3, 2, 2, 2, 44, 457, 3, 2, 2, 2, 46, 609, 3, 2, 2, 2, 48, 663, 3, 2, 2, 2, 50, 681, 3, 2, 2, 2, 52, 686, 3, 2, 2, 2, 54, 704, 3, 2, 2, 2, 56, 708, 3, 2, 2, 2, 58, 727, 3, 2, 2, 2, 60, 729, 3, 2, 2, 2, 62, 745, 3, 2, 2, 2, 64, 747, 3, 2, 2, 2, 66, 749, 3, 2, 2, 2, 68, 755, 3, 2, 2, 2, 70, 757, 3, 2, 2, 2, 72, 771, 3, 2, 2, 2, 74, 775, 3, 2, 2, 2, 76, 779, 3, 2, 2, 2, 78, 781, 3, 2, 2, 2, 80, 783, 3, 2, 2, 2, 82, 785, 3, 2, 2, 2, 84, 797, 3, 2, 2, 2, 86, 799, 3, 2, 2, 2, 88, 90, 5, 4, 3, 2, 89, 88, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 89, 3, 2, 2, 2, 91, 92, 3, 2, 2, 2, 92, 93, 3, 2, 2, 2, 93, 94, 7, 2, 2, 3, 94, 3, 3, 2, 2, 2, 95, 97, 7, 69, 2, 2, 96, 95, 3, 2, 2, 2, 97, 100, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 98, 99, 3, 2, 2, 2, 99, 101, 3, 2, 2, 2, 100, 98, 3, 2, 2, 2, 101, 102, 7, 3, 2, 2, 102, 103, 5, 82, 42, 2, 103, 107, 7, 4, 2, 2, 104, 106, 5, 6, 4, 2, 105, 104, 3, 2, 2, 2, 106, 109, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 107, 108, 3, 2, 2, 2, 108, 110, 3, 2, 2, 2, 109, 107, 3, 2, 2, 2, 110, 111, 7, 5, 2, 2, 111, 5, 3, 2, 2, 2, 112, 114, 7, 69, 2, 2, 113, 112, 3, 2, 2, 2, 114, 117, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 115, 116, 3, 2, 2, 2, 116, 118, 3, 2, 2, 2, 117, 115, 3, 2, 2, 2, 118, 119, 5, 8, 5, 2, 119, 7, 3, 2, 2, 2, 120, 121, 7, 6, 2, 2, 121, 122, 5, 82, 42, 2, 122, 123, 7, 7, 2, 2, 123, 124, 5, 38, 20, 2, 124, 141, 3, 2, 2, 2, 125, 126, 7, 8, 2, 2, 126, 127, 5, 82, 42, 2, 127, 128, 7, 7, 2, 2, 128, 129, 5, 38, 20, 2, 129, 141, 3, 2, 2, 2, 130, 131, 7, 9, 2, 2, 131, 132, 5, 62, 32, 2, 132, 133, 7, 62, 2, 2, 133, 134, 5, 46, 24, 2, 134, 141, 3, 2, 2, 2, 135, 141, 5, 28, 15, 2, 136, 141, 5, 10, 6, 2, 137, 141, 5, 12, 7, 2, 138, 141, 5, 24, 13, 2, 139, 141, 5, 26, 14, 2, 140, 120, 3, 2, 2, 2, 140, 125, 3, 2, 2, 2, 140, 130, 3, 2, 2, 2, 140, 135, 3, 2, 2, 2, 140, 136, 3, 2, 2, 2, 140, 137, 3, 2, 2, 2, 140, 138, 3, 2, 2, 2, 140, 139, 3, 2, 2, 2, 141, 9, 3, 2, 2, 2, 142, 143, 5, 22, 12, 2, 143, 144, 5, 74, 38, 2, 144, 145, 7, 63, 2, 2, 145, 150, 5, 66, 34, 2, 146, 147, 7, 10, 2, 2, 147, 149, 5, 66, 34, 2, 148, 146, 3, 2, 2, 2, 149, 152, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 150, 151, 3, 2, 2, 2, 151, 153, 3, 2, 2, 2, 152, 150, 3, 2, 2, 2, 153, 154, 7, 64, 2, 2, 154, 155, 7, 7, 2, 2, 155, 158, 5, 38, 20, 2, 156, 157, 7, 62, 2, 2, 157, 159, 5, 46, 24, 2, 158, 156, 3, 2, 2, 2, 158, 159, 3, 2, 2, 2, 159, 161, 3, 2, 2, 2, 160, 162, 7, 11, 2, 2, 161, 160, 3, 2, 2, 2, 161, 162, 3, 2, 2, 2, 162, 191, 3, 2, 2, 2, 163, 164, 5, 22, 12, 2, 164, 177, 5, 74, 38, 2, 165, 174, 7, 63, 2, 2, 166, 171, 5, 64, 33, 2, 167, 168, 7, 10, 2, 2, 168, 170, 5, 64, 33, 2, 169, 167, 3, 2, 2, 2, 170, 173, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 171, 172, 3, 2, 2, 2, 172, 175, 3, 2, 2, 2, 173, 171, 3, 2, 2, 2, 174, 166, 3, 2, 2, 2, 174, 175, 3, 2, 2, 2, 175, 176, 3, 2, 2, 2, 176, 178, 7, 64, 2, 2, 177, 165, 3, 2, 2, 2, 177, 178, 3, 2, 2, 2, 178, 181, 3, 2, 2, 2, 179, 180, 7, 7, 2, 2, 180, 182, 5, 38, 20, 2, 181, 179, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 185, 3, 2, 2, 2, 183, 184, 7, 62, 2, 2, 184, 186, 5, 46, 24, 2, 185, 183, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 188, 3, 2, 2, 2, 187, 189, 7, 11, 2, 2, 188, 187, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 191, 3, 2, 2, 2, 190, 142, 3, 2, 2, 2, 190, 163, 3, 2, 2, 2, 191, 11, 3, 2, 2, 2, 192, 193, 7, 12, 2, 2, 193, 205, 5, 82, 42, 2, 194, 195, 7, 12, 2, 2, 195, 196, 5, 14, 8, 2, 196, 197, 7, 62, 2, 2, 197, 198, 5, 38, 20, 2, 198, 205, 3, 2, 2, 2, 199, 200, 7, 12, 2, 2, 200, 201, 5, 14, 8, 2, 201, 202, 7, 62, 2, 2, 202, 203, 5, 16, 9, 2, 203, 205, 3, 2, 2, 2, 204, 192, 3, 2, 2, 2, 204, 194, 3, 2, 2, 2, 204, 199, 3, 2, 2, 2, 205, 13, 3, 2, 2, 2, 206, 218, 5, 82, 42, 2, 207, 208, 7, 13, 2, 2, 208, 213, 5, 40, 21, 2, 209, 210, 7, 10, 2, 2, 210, 212, 5, 40, 21, 2, 211, 209, 3, 2, 2, 2, 212, 215, 3, 2, 2, 2, 213, 211, 3, 2, 2, 2, 213, 214, 3, 2, 2, 2, 214, 216, 3, 2, 2, 2, 215, 213, 3, 2, 2, 2, 216, 217, 7, 14, 2, 2, 217, 219, 3, 2, 2, 2, 218, 207, 3, 2, 2, 2, 218, 219, 3, 2, 2, 2, 219, 15, 3, 2, 2, 2, 220, 222, 7, 15, 2, 2, 221, 220, 3, 2, 2, 2, 221, 222, 3, 2, 2, 2, 222, 223, 3, 2, 2, 2, 223, 228, 5, 18, 10, 2, 224, 225, 7, 15, 2, 2, 225, 227, 5, 18, 10, 2, 226, 224, 3, 2, 2, 2, 227, 230, 3, 2, 2, 2, 228, 226, 3, 2, 2, 2, 228, 229, 3, 2, 2, 2, 229, 17, 3, 2, 2, 2, 230, 228, 3, 2, 2, 2, 231, 236, 5, 84, 43, 2, 232, 233, 7, 63, 2, 2, 233, 234, 5, 38, 20, 2, 234, 235, 7, 64, 2, 2, 235, 237, 3, 2, 2, 2, 236, 232, 3, 2, 2, 2, 236, 237, 3, 2, 2, 2, 237, 19, 3, 2, 2, 2, 238, 239, 7, 16, 2, 2, 239, 242, 5, 82, 42, 2, 240, 241, 7, 7, 2, 2, 241, 243, 5, 38, 20, 2, 242, 240, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 244, 3, 2, 2, 2, 244, 245, 7, 62, 2, 2, 245, 247, 5, 46, 24, 2, 246, 248, 7, 11, 2, 2, 247, 246, 3, 2, 2, 2, 247, 248, 3, 2, 2, 2, 248, 21, 3, 2, 2, 2, 249, 259, 7, 17, 2, 2, 250, 259, 7, 18, 2, 2, 251, 252, 7, 19, 2, 2, 252, 259, 7, 17, 2, 2, 253, 254, 7, 19, 2, 2, 254, 259, 7, 18, 2, 2, 255, 259, 7, 20, 2, 2, 256, 259, 7, 21, 2, 2, 257, 259, 7, 22, 2, 2, 258, 249, 3, 2, 2, 2, 258, 250, 3, 2, 2, 2, 258, 251, 3, 2, 2, 2, 258, 253, 3, 2, 2, 2, 258, 255, 3, 2, 2, 2, 258, 256, 3, 2, 2, 2, 258, 257, 3, 2, 2, 2, 259, 23, 3, 2, 2, 2, 260, 261, 7, 23, 2, 2, 261, 262, 5, 32, 17, 2, 262, 263, 7, 24, 2, 2, 263, 266, 5, 68, 35, 2, 264, 265, 7, 25, 2, 2, 265, 267, 5, 36, 19, 2, 266, 264, 3, 2, 2, 2, 266, 267, 3, 2, 2, 2, 267, 279, 3, 2, 2, 2, 268, 269, 7, 23, 2, 2, 269, 272, 5, 32, 17, 2, 270, 271, 7, 26, 2, 2, 271, 273, 5, 32, 17, 2, 272, 270, 3, 2, 2, 2, 272, 273, 3, 2, 2, 2, 273, 276, 3, 2, 2, 2, 274, 275, 7, 25, 2, 2, 275, 277, 5, 36, 19, 2, 276, 274, 3, 2, 2, 2, 276, 277, 3, 2, 2, 2, 277, 279, 3, 2, 2, 2, 278, 260, 3, 2, 2, 2, 278, 268, 3, 2, 2, 2, 279, 25, 3, 2, 2, 2, 280, 281, 7, 27, 2, 2, 281, 282, 5, 32, 17, 2, 282, 283, 7, 24, 2, 2, 283, 284, 5, 68, 35, 2, 284, 292, 3, 2, 2, 2, 285, 286, 7, 27, 2, 2, 286, 289, 5, 32, 17, 2, 287, 288, 7, 26, 2, 2, 288, 290, 5, 32, 17, 2, 289, 287, 3, 2, 2, 2, 289, 290, 3, 2, 2, 2, 290, 292, 3, 2, 2, 2, 291, 280, 3, 2, 2, 2, 291, 285, 3, 2, 2, 2, 292, 27, 3, 2, 2, 2, 293, 294, 7, 23, 2, 2, 294, 295, 5, 30, 16, 2, 295, 296, 7, 63, 2, 2, 296, 297, 5, 32, 17, 2, 297, 298, 7, 62, 2, 2, 298, 306, 5, 46, 24, 2, 299, 300, 7, 10, 2, 2, 300, 301, 5, 32, 17, 2, 301, 302, 7, 62, 2, 2, 302, 303, 5, 46, 24, 2, 303, 305, 3, 2, 2, 2, 304, 299, 3, 2, 2, 2, 305, 308, 3, 2, 2, 2, 306, 304, 3, 2, 2, 2, 306, 307, 3, 2, 2, 2, 307, 309, 3, 2, 2, 2, 308, 306, 3, 2, 2, 2, 309, 310, 7, 64, 2, 2, 310, 311, 7, 24, 2, 2, 311, 314, 7, 53, 2, 2, 312, 313, 7, 25, 2, 2, 313, 315, 5, 36, 19, 2, 314, 312, 3, 2, 2, 2, 314, 315, 3, 2, 2, 2, 315, 340, 3, 2, 2, 2, 316, 317, 7, 23, 2, 2, 317, 318, 5, 30, 16, 2, 318, 319, 7, 63, 2, 2, 319, 320, 5, 32, 17, 2, 320, 321, 7, 62, 2, 2, 321, 329, 5, 46, 24, 2, 322, 323, 7, 10, 2, 2, 323, 324, 5, 32, 17, 2, 324, 325, 7, 62, 2, 2, 325, 326, 5, 46, 24, 2, 326, 328, 3, 2, 2, 2, 327, 322, 3, 2, 2, 2, 328, 331, 3, 2, 2, 2, 329, 327, 3, 2, 2, 2, 329, 330, 3, 2, 2, 2, 330, 332, 3, 2, 2, 2, 331, 329, 3, 2, 2, 2, 332, 333, 7, 64, 2, 2, 333, 334, 7, 26, 2, 2, 334, 337, 5, 34, 18, 2, 335, 336, 7, 25, 2, 2, 336, 338, 5, 36, 19, 2, 337, 335, 3, 2, 2, 2, 337, 338, 3, 2, 2, 2, 338, 340, 3, 2, 2, 2, 339, 293, 3, 2, 2, 2, 339, 316, 3, 2, 2, 2, 340, 29, 3, 2, 2, 2, 341, 342, 5, 82, 42, 2, 342, 31, 3, 2, 2, 2, 343, 344, 5, 82, 42, 2, 344, 33, 3, 2, 2, 2, 345, 346, 5, 82, 42, 2, 346, 35, 3, 2, 2, 2, 347, 348, 7, 42, 2, 2, 348, 37, 3, 2, 2, 2, 349, 350, 8, 20, 1, 2, 350, 359, 7, 63, 2, 2, 351, 356, 5, 38, 20, 2, 352, 353, 7, 10, 2, 2, 353, 355, 5, 38, 20, 2, 354, 352, 3, 2, 2, 2, 355, 358, 3, 2, 2, 2, 356, 354, 3, 2, 2, 2, 356, 357, 3, 2, 2, 2, 357, 360, 3, 2, 2, 2, 358, 356, 3, 2, 2, 2, 359, 351, 3, 2, 2, 2, 359, 360, 3, 2, 2, 2, 360, 362, 3, 2, 2, 2, 361, 363, 7, 10, 2, 2, 362, 361, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 364, 3, 2, 2, 2, 364, 365, 7, 64, 2, 2, 365, 366, 7, 29, 2, 2, 366, 408, 5, 38, 20, 14, 367, 368, 7, 65, 2, 2, 368, 369, 7, 13, 2, 2, 369, 370, 5, 38, 20, 2, 370, 371, 7, 14, 2, 2, 371, 408, 3, 2, 2, 2, 372, 373, 7, 66, 2, 2, 373, 374, 7, 13, 2, 2, 374, 375, 5, 38, 20, 2, 375, 376, 7, 14, 2, 2, 376, 408, 3, 2, 2, 2, 377, 378, 7, 63, 2, 2, 378, 379, 5, 38, 20, 2, 379, 380, 7, 10, 2, 2, 380, 385, 5, 38, 20, 2, 381, 382, 7, 10, 2, 2, 382, 384, 5, 38, 20, 2, 383, 381, 3, 2, 2, 2, 384, 387, 3, 2, 2, 2, 385, 383, 3, 2, 2, 2, 385, 386, 3, 2, 2, 2, 386, 389, 3, 2, 2, 2, 387, 385, 3, 2, 2, 2, 388, 390, 7, 10, 2, 2, 389, 388, 3, 2, 2, 2, 389, 390, 3, 2, 2, 2, 390, 391, 3, 2, 2, 2, 391, 392, 7, 64, 2, 2, 392, 408, 3, 2, 2, 2, 393, 395, 7, 4, 2, 2, 394, 396, 5, 42, 22, 2, 395, 394, 3, 2, 2, 2, 395, 396, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, 408, 7, 5, 2, 2, 398, 408, 7, 30, 2, 2, 399, 408, 7, 31, 2, 2, 400, 408, 7, 32, 2, 2, 401, 408, 5, 40, 21, 2, 402, 408, 5, 82, 42, 2, 403, 404, 7, 63, 2, 2, 404, 405, 5, 38, 20, 2, 405, 406, 7, 64, 2, 2, 406, 408, 3, 2, 2, 2, 407, 349, 3, 2, 2, 2, 407, 367, 3, 2, 2, 2, 407, 372, 3, 2, 2, 2, 407, 377, 3, 2, 2, 2, 407, 393, 3, 2, 2, 2, 407, 398, 3, 2, 2, 2, 407, 399, 3, 2, 2, 2, 407, 400, 3, 2, 2, 2, 407, 401, 3, 2, 2, 2, 407, 402, 3, 2, 2, 2, 407, 403, 3, 2, 2, 2, 408, 429, 3, 2, 2, 2, 409, 410, 12, 16, 2, 2, 410, 411, 7, 28, 2, 2, 411, 428, 5, 38, 20, 16, 412, 413, 12, 15, 2, 2, 413, 414, 7, 29, 2, 2, 414, 428, 5, 38, 20, 15, 415, 416, 12, 3, 2, 2, 416, 417, 7, 13, 2, 2, 417, 422, 5, 38, 20, 2, 418, 419, 7, 10, 2, 2, 419, 421, 5, 38, 20, 2, 420, 418, 3, 2, 2, 2, 421, 424, 3, 2, 2, 2, 422, 420, 3, 2, 2, 2, 422, 423, 3, 2, 2, 2, 423, 425, 3, 2, 2, 2, 424, 422, 3, 2, 2, 2, 425, 426, 7, 14, 2, 2, 426, 428, 3, 2, 2, 2, 427, 409, 3, 2, 2, 2, 427, 412, 3, 2, 2, 2, 427, 415, 3, 2, 2, 2, 428, 431, 3, 2, 2, 2, 429, 427, 3, 2, 2, 2, 429, 430, 3, 2, 2, 2, 430, 39, 3, 2, 2, 2, 431, 429, 3, 2, 2, 2, 432, 433, 7, 67, 2, 2, 433, 41, 3, 2, 2, 2, 434, 435, 5, 44, 23, 2, 435, 436, 7, 7, 2, 2, 436, 437, 5, 38, 20, 2, 437, 445, 3, 2, 2, 2, 438, 439, 7, 10, 2, 2, 439, 440, 5, 44, 23, 2, 440, 441, 7, 7, 2, 2, 441, 442, 5, 38, 20, 2, 442, 444, 3, 2, 2, 2, 443, 438, 3, 2, 2, 2, 444, 447, 3, 2, 2, 2, 445, 443, 3, 2, 2, 2, 445, 446, 3, 2, 2, 2, 446, 451, 3, 2, 2, 2, 447, 445, 3, 2, 2, 2, 448, 452, 7, 10, 2, 2, 449, 450, 7, 15, 2, 2, 450, 452, 5, 86, 44, 2, 451, 448, 3, 2, 2, 2, 451, 449, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 452, 456, 3, 2, 2, 2, 453, 454, 7, 15, 2, 2, 454, 456, 5, 86, 44, 2, 455, 434, 3, 2, 2, 2, 455, 453, 3, 2, 2, 2, 456, 43, 3, 2, 2, 2, 457, 458, 5, 84, 43, 2, 458, 45, 3, 2, 2, 2, 459, 460, 8, 24, 1, 2, 460, 610, 5, 56, 29, 2, 461, 462, 5, 74, 38, 2, 462, 464, 7, 63, 2, 2, 463, 465, 5, 70, 36, 2, 464, 463, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, 466, 3, 2, 2, 2, 466, 467, 7, 64, 2, 2, 467, 610, 3, 2, 2, 2, 468, 469, 7, 52, 2, 2, 469, 610, 5, 46, 24, 27, 470, 471, 5, 82, 42, 2, 471, 472, 7, 34, 2, 2, 472, 473, 7, 62, 2, 2, 473, 474, 5, 46, 24, 23, 474, 610, 3, 2, 2, 2, 475, 476, 7, 45, 2, 2, 476, 477, 7, 4, 2, 2, 477, 482, 5, 46, 24, 2, 478, 479, 7, 10, 2, 2, 479, 481, 5, 46, 24, 2, 480, 478, 3, 2, 2, 2, 481, 484, 3, 2, 2, 2, 482, 480, 3, 2, 2, 2, 482, 483, 3, 2, 2, 2, 483, 486, 3, 2, 2, 2, 484, 482, 3, 2, 2, 2, 485, 487, 7, 10, 2, 2, 486, 485, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 489, 7, 5, 2, 2, 489, 610, 3, 2, 2, 2, 490, 491, 7, 46, 2, 2, 491, 492, 7, 4, 2, 2, 492, 497, 5, 46, 24, 2, 493, 494, 7, 10, 2, 2, 494, 496, 5, 46, 24, 2, 495, 493, 3, 2, 2, 2, 496, 499, 3, 2, 2, 2, 497, 495, 3, 2, 2, 2, 497, 498, 3, 2, 2, 2, 498, 501, 3, 2, 2, 2, 499, 497, 3, 2, 2, 2, 500, 502, 7, 10, 2, 2, 501, 500, 3, 2, 2, 2, 501, 502, 3, 2, 2, 2, 502, 503, 3, 2, 2, 2, 503, 504, 7, 5, 2, 2, 504, 610, 3, 2, 2, 2, 505, 610, 5, 48, 25, 2, 506, 507, 7, 35, 2, 2, 507, 508, 7, 4, 2, 2, 508, 513, 5, 46, 24, 2, 509, 510, 7, 10, 2, 2, 510, 512, 5, 46, 24, 2, 511, 509, 3, 2, 2, 2, 512, 515, 3, 2, 2, 2, 513, 511, 3, 2, 2, 2, 513, 514, 3, 2, 2, 2, 514, 517, 3, 2, 2, 2, 515, 513, 3, 2, 2, 2, 516, 518, 7, 10, 2, 2, 517, 516, 3, 2, 2, 2, 517, 518, 3, 2, 2, 2, 518, 519, 3, 2, 2, 2, 519, 520, 7, 5, 2, 2, 520, 610, 3, 2, 2, 2, 521, 522, 7, 36, 2, 2, 522, 523, 7, 4, 2, 2, 523, 528, 5, 46, 24, 2, 524, 525, 7, 10, 2, 2, 525, 527, 5, 46, 24, 2, 526, 524, 3, 2, 2, 2, 527, 530, 3, 2, 2, 2, 528, 526, 3, 2, 2, 2, 528, 529, 3, 2, 2, 2, 529, 532, 3, 2, 2, 2, 530, 528, 3, 2, 2, 2, 531, 533, 7, 10, 2, 2, 532, 531, 3, 2, 2, 2, 532, 533, 3, 2, 2, 2, 533, 534, 3, 2, 2, 2, 534, 535, 7, 5, 2, 2, 535, 610, 3, 2, 2, 2, 536, 541, 5, 82, 42, 2, 537, 541, 7, 44, 2, 2, 538, 541, 7, 43, 2, 2, 539, 541, 7, 42, 2, 2, 540, 536, 3, 2, 2, 2, 540, 537, 3, 2, 2, 2, 540, 538, 3, 2, 2, 2, 540, 539, 3, 2, 2, 2, 541, 610, 3, 2, 2, 2, 542, 543, 7, 63, 2, 2, 543, 544, 5, 46, 24, 2, 544, 545, 7, 10, 2, 2, 545, 550, 5, 46, 24, 2, 546, 547, 7, 10, 2, 2, 547, 549, 5, 46, 24, 2, 548, 546, 3, 2, 2, 2, 549, 552, 3, 2, 2, 2, 550, 548, 3, 2, 2, 2, 550, 551, 3, 2, 2, 2, 551, 554, 3, 2, 2, 2, 552, 550, 3, 2, 2, 2, 553, 555, 7, 10, 2, 2, 554, 553, 3, 2, 2, 2, 554, 555, 3, 2, 2, 2, 555, 556, 3, 2, 2, 2, 556, 557, 7, 64, 2, 2, 557, 610, 3, 2, 2, 2, 558, 559, 7, 4, 2, 2, 559, 564, 5, 72, 37, 2, 560, 561, 7, 10, 2, 2, 561, 563, 5, 72, 37, 2, 562, 560, 3, 2, 2, 2, 563, 566, 3, 2, 2, 2, 564, 562, 3, 2, 2, 2, 564, 565, 3, 2, 2, 2, 565, 568, 3, 2, 2, 2, 566, 564, 3, 2, 2, 2, 567, 569, 7, 10, 2, 2, 568, 567, 3, 2, 2, 2, 568, 569, 3, 2, 2, 2, 569, 570, 3, 2, 2, 2, 570, 571, 7, 5, 2, 2, 571, 610, 3, 2, 2, 2, 572, 581, 7, 13, 2, 2, 573, 578, 5, 46, 24, 2, 574, 575, 7, 10, 2, 2, 575, 577, 5, 46, 24, 2, 576, 574, 3, 2, 2, 2, 577, 580, 3, 2, 2, 2, 578, 576, 3, 2, 2, 2, 578, 579, 3, 2, 2, 2, 579, 582, 3, 2, 2, 2, 580, 578, 3, 2, 2, 2, 581, 573, 3, 2, 2, 2, 581, 582, 3, 2, 2, 2, 582, 584, 3, 2, 2, 2, 583, 585, 7, 10, 2, 2, 584, 583, 3, 2, 2, 2, 584, 585, 3, 2, 2, 2, 585, 586, 3, 2, 2, 2, 586, 610, 7, 14, 2, 2, 587, 588, 7, 37, 2, 2, 588, 589, 7, 63, 2, 2, 589, 590, 5, 46, 24, 2, 590, 591, 7, 64, 2, 2, 591, 592, 5, 46, 24, 2, 592, 593, 7, 38, 2, 2, 593, 594, 5, 46, 24, 7, 594, 610, 3, 2, 2, 2, 595, 596, 5, 10, 6, 2, 596, 597, 5, 46, 24, 6, 597, 610, 3, 2, 2, 2, 598, 599, 5, 20, 11, 2, 599, 600, 5, 46, 24, 5, 600, 610, 3, 2, 2, 2, 601, 602, 7, 63, 2, 2, 602, 603, 5, 46, 24, 2, 603, 604, 7, 64, 2, 2, 604, 610, 3, 2, 2, 2, 605, 606, 7, 4, 2, 2, 606, 607, 5, 46, 24, 2, 607, 608, 7, 5, 2, 2, 608, 610, 3, 2, 2, 2, 609, 459, 3, 2, 2, 2, 609, 461, 3, 2, 2, 2, 609, 468, 3, 2, 2, 2, 609, 470, 3, 2, 2, 2, 609, 475, 3, 2, 2, 2, 609, 490, 3, 2, 2, 2, 609, 505, 3, 2, 2, 2, 609, 506, 3, 2, 2, 2, 609, 521, 3, 2, 2, 2, 609, 540, 3, 2, 2, 2, 609, 542, 3, 2, 2, 2, 609, 558, 3, 2, 2, 2, 609, 572, 3, 2, 2, 2, 609, 587, 3, 2, 2, 2, 609, 595, 3, 2, 2, 2, 609, 598, 3, 2, 2, 2, 609, 601, 3, 2, 2, 2, 609, 605, 3, 2, 2, 2, 610, 660, 3, 2, 2, 2, 611, 612, 12, 28, 2, 2, 612, 613, 7, 33, 2, 2, 613, 659, 5, 46, 24, 28, 614, 615, 12, 26, 2, 2, 615, 616, 9, 2, 2, 2, 616, 659, 5, 46, 24, 27, 617, 618, 12, 25, 2, 2, 618, 619, 9, 3, 2, 2, 619, 659, 5, 46, 24, 26, 620, 621, 12, 24, 2, 2, 621, 622, 9, 4, 2, 2, 622, 659, 5, 46, 24, 25, 623, 624, 12, 22, 2, 2, 624, 625, 7, 62, 2, 2, 625, 626, 5, 46, 24, 23, 626, 627, 8, 24, 1, 2, 627, 659, 3, 2, 2, 2, 628, 629, 12, 20, 2, 2, 629, 630, 7, 45, 2, 2, 630, 659, 5, 46, 24, 21, 631, 632, 12, 18, 2, 2, 632, 633, 7, 46, 2, 2, 633, 659, 5, 46, 24, 19, 634, 635, 12, 17, 2, 2, 635, 636, 7, 47, 2, 2, 636, 659, 5, 46, 24, 18, 637, 638, 12, 16, 2, 2, 638, 639, 7, 48, 2, 2, 639, 659, 5, 46, 24, 17, 640, 641, 12, 10, 2, 2, 641, 642, 7, 28, 2, 2, 642, 659, 5, 46, 24, 11, 643, 644, 12, 32, 2, 2, 644, 645, 7, 24, 2, 2, 645, 651, 5, 76, 39, 2, 646, 648, 7, 63, 2, 2, 647, 649, 5, 70, 36, 2, 648, 647, 3, 2, 2, 2, 648, 649, 3, 2, 2, 2, 649, 650, 3, 2, 2, 2, 650, 652, 7, 64, 2, 2, 651, 646, 3, 2, 2, 2, 651, 652, 3, 2, 2, 2, 652, 659, 3, 2, 2, 2, 653, 654, 12, 29, 2, 2, 654, 655, 7, 13, 2, 2, 655, 656, 5, 46, 24, 2, 656, 657, 7, 14, 2, 2, 657, 659, 3, 2, 2, 2, 658, 611, 3, 2, 2, 2, 658, 614, 3, 2, 2, 2, 658, 617, 3, 2, 2, 2, 658, 620, 3, 2, 2, 2, 658, 623, 3, 2, 2, 2, 658, 628, 3, 2, 2, 2, 658, 631, 3, 2, 2, 2, 658, 634, 3, 2, 2, 2, 658, 637, 3, 2, 2, 2, 658, 640, 3, 2, 2, 2, 658, 643, 3, 2, 2, 2, 658, 653, 3, 2, 2, 2, 659, 662, 3, 2, 2, 2, 660, 658, 3, 2, 2, 2, 660, 661, 3, 2, 2, 2, 661, 47, 3, 2, 2, 2, 662, 660, 3, 2, 2, 2, 663, 664, 7, 50, 2, 2, 664, 665, 5, 46, 24, 2, 665, 667, 7, 4, 2, 2, 666, 668, 7, 15, 2, 2, 667, 666, 3, 2, 2, 2, 667, 668, 3, 2, 2, 2, 668, 669, 3, 2, 2, 2, 669, 674, 5, 50, 26, 2, 670, 671, 7, 15, 2, 2, 671, 673, 5, 50, 26, 2, 672, 670, 3, 2, 2, 2, 673, 676, 3, 2, 2, 2, 674, 672, 3, 2, 2, 2, 674, 675, 3, 2, 2, 2, 675, 677, 3, 2, 2, 2, 676, 674, 3, 2, 2, 2, 677, 678, 7, 5, 2, 2, 678, 49, 3, 2, 2, 2, 679, 682, 5, 52, 27, 2, 680, 682, 7, 39, 2, 2, 681, 679, 3, 2, 2, 2, 681, 680, 3, 2, 2, 2, 682, 683, 3, 2, 2, 2, 683, 684, 7, 29, 2, 2, 684, 685, 5, 46, 24, 2, 685, 51, 3, 2, 2, 2, 686, 693, 5, 84, 43, 2, 687, 690, 7, 63, 2, 2, 688, 691, 5, 84, 43, 2, 689, 691, 7, 39, 2, 2, 690, 688, 3, 2, 2, 2, 690, 689, 3, 2, 2, 2, 691, 692, 3, 2, 2, 2, 692, 694, 7, 64, 2, 2, 693, 687, 3, 2, 2, 2, 693, 694, 3, 2, 2, 2, 694, 53, 3, 2, 2, 2, 695, 696, 5, 8, 5, 2, 696, 697, 7, 2, 2, 3, 697, 705, 3, 2, 2, 2, 698, 699, 5, 46, 24, 2, 699, 700, 7, 2, 2, 3, 700, 705, 3, 2, 2, 2, 701, 702, 7, 69, 2, 2, 702, 705, 7, 2, 2, 3, 703, 705, 7, 2, 2, 3, 704, 695, 3, 2, 2, 2, 704, 698, 3, 2, 2, 2, 704, 701, 3, 2, 2, 2, 704, 703, 3, 2, 2, 2, 705, 55, 3, 2, 2, 2, 706, 709, 5, 58, 30, 2, 707, 709, 5, 60, 31, 2, 708, 706, 3, 2, 2, 2, 708, 707, 3, 2, 2, 2, 709, 57, 3, 2, 2, 2, 710, 711, 5, 64, 33, 2, 711, 712, 7, 29, 2, 2, 712, 713, 5, 46, 24, 2, 713, 728, 3, 2, 2, 2, 714, 715, 7, 63, 2, 2, 715, 720, 5, 64, 33, 2, 716, 717, 7, 10, 2, 2, 717, 719, 5, 64, 33, 2, 718, 716, 3, 2, 2, 2, 719, 722, 3, 2, 2, 2, 720, 718, 3, 2, 2, 2, 720, 721, 3, 2, 2, 2, 721, 723, 3, 2, 2, 2, 722, 720, 3, 2, 2, 2, 723, 724, 7, 64, 2, 2, 724, 725, 7, 29, 2, 2, 725, 726, 5, 46, 24, 2, 726, 728, 3, 2, 2, 2, 727, 710, 3, 2, 2, 2, 727, 714, 3, 2, 2, 2, 728, 59, 3, 2, 2, 2, 729, 730, 7, 63, 2, 2, 730, 731, 7, 63, 2, 2, 731, 734, 5, 64, 33, 2, 732, 733, 7, 10, 2, 2, 733, 735, 5, 64, 33, 2, 734, 732, 3, 2, 2, 2, 735, 736, 3, 2, 2, 2, 736, 734, 3, 2, 2, 2, 736, 737, 3, 2, 2, 2, 737, 738, 3, 2, 2, 2, 738, 739, 7, 64, 2, 2, 739, 740, 7, 64, 2, 2, 740, 741, 7, 29, 2, 2, 741, 742, 5, 46, 24, 2, 742, 61, 3, 2, 2, 2, 743, 746, 7, 39, 2, 2, 744, 746, 5, 82, 42, 2, 745, 743, 3, 2, 2, 2, 745, 744, 3, 2, 2, 2, 746, 63, 3, 2, 2, 2, 747, 748, 5, 62, 32, 2, 748, 65, 3, 2, 2, 2, 749, 750, 5, 62, 32, 2, 750, 751, 7, 7, 2, 2, 751, 752, 5, 38, 20, 2, 752, 67, 3, 2, 2, 2, 753, 756, 7, 53, 2, 2, 754, 756, 5, 82, 42, 2, 755, 753, 3, 2, 2, 2, 755, 754, 3, 2, 2, 2, 756, 69, 3, 2, 2, 2, 757, 762, 5, 46, 24, 2, 758, 759, 7, 10, 2, 2, 759, 761, 5, 46, 24, 2, 760, 758, 3, 2, 2, 2, 761, 764, 3, 2, 2, 2, 762, 760, 3, 2, 2, 2, 762, 763, 3, 2, 2, 2, 763, 71, 3, 2, 2, 2, 764, 762, 3, 2, 2, 2, 765, 766, 5, 84, 43, 2, 766, 767, 7, 7, 2, 2, 767, 768, 5, 46, 24, 2, 768, 772, 3, 2, 2, 2, 769, 770, 7, 40, 2, 2, 770, 772, 5, 46, 24, 2, 771, 765, 3, 2, 2, 2, 771, 769, 3, 2, 2, 2, 772, 73, 3, 2, 2, 2, 773, 776, 5, 82, 42, 2, 774, 776, 9, 5, 2, 2, 775, 773, 3, 2, 2, 2, 775, 774, 3, 2, 2, 2, 776, 75, 3, 2, 2, 2, 777, 780, 5, 82, 42, 2, 778, 780, 9, 6, 2, 2, 779, 777, 3, 2, 2, 2, 779, 778, 3, 2, 2, 2, 780, 77, 3, 2, 2, 2, 781, 782, 9, 7, 2, 2, 782, 79, 3, 2, 2, 2, 783, 784, 9, 8, 2, 2, 784, 81, 3, 2, 2, 2, 785, 790, 5, 86, 44, 2, 786, 787, 7, 41, 2, 2, 787, 789, 5, 86, 44, 2, 788, 786, 3, 2, 2, 2, 789, 792, 3, 2, 2, 2, 790, 788, 3, 2, 2, 2, 790, 791, 3, 2, 2, 2, 791, 83, 3, 2, 2, 2, 792, 790, 3, 2, 2, 2, 793, 798, 5, 86, 44, 2, 794, 795, 5, 82, 42, 2, 795, 796, 8, 43, 1, 2, 796, 798, 3, 2, 2, 2, 797, 793, 3, 2, 2, 2, 797, 794, 3, 2, 2, 2, 798, 85, 3, 2, 2, 2, 799, 800, 9, 9, 2, 2, 800, 87, 3, 2, 2, 2, 90, 91, 98, 107, 115, 140, 150, 158, 161, 171, 174, 177, 181, 185, 188, 190, 204, 213, 218, 221, 228, 236, 242, 247, 258, 266, 272, 276, 278, 289, 291, 306, 314, 329, 337, 339, 356, 359, 362, 385, 389, 395, 407, 422, 427, 429, 445, 451, 455, 464, 482, 486, 497, 501, 513, 517, 528, 532, 540, 550, 554, 564, 568, 578, 581, 584, 609, 648, 651, 658, 660, 667, 674, 681, 690, 693, 704, 708, 720, 727, 736, 745, 755, 762, 771, 775, 779, 790, 797] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 802, 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, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 3, 2, 6, 2, 90, 10, 2, 13, 2, 14, 2, 91, 3, 2, 3, 2, 3, 3, 7, 3, 97, 10, 3, 12, 3, 14, 3, 100, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 106, 10, 3, 12, 3, 14, 3, 109, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 114, 10, 4, 12, 4, 14, 4, 117, 11, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 141, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 149, 10, 6, 12, 6, 14, 6, 152, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 159, 10, 6, 3, 6, 5, 6, 162, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 170, 10, 6, 12, 6, 14, 6, 173, 11, 6, 5, 6, 175, 10, 6, 3, 6, 5, 6, 178, 10, 6, 3, 6, 3, 6, 5, 6, 182, 10, 6, 3, 6, 3, 6, 5, 6, 186, 10, 6, 3, 6, 5, 6, 189, 10, 6, 5, 6, 191, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 205, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 212, 10, 8, 12, 8, 14, 8, 215, 11, 8, 3, 8, 3, 8, 5, 8, 219, 10, 8, 3, 9, 5, 9, 222, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 227, 10, 9, 12, 9, 14, 9, 230, 11, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 237, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 243, 10, 11, 3, 11, 3, 11, 3, 11, 5, 11, 248, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 259, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 267, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 273, 10, 13, 3, 13, 3, 13, 5, 13, 277, 10, 13, 5, 13, 279, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 290, 10, 14, 5, 14, 292, 10, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 305, 10, 15, 12, 15, 14, 15, 308, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 315, 10, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 328, 10, 15, 12, 15, 14, 15, 331, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 338, 10, 15, 5, 15, 340, 10, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 355, 10, 20, 12, 20, 14, 20, 358, 11, 20, 5, 20, 360, 10, 20, 3, 20, 5, 20, 363, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 384, 10, 20, 12, 20, 14, 20, 387, 11, 20, 3, 20, 5, 20, 390, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 396, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 413, 10, 20, 12, 20, 14, 20, 416, 11, 20, 3, 20, 3, 20, 5, 20, 420, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 428, 10, 20, 12, 20, 14, 20, 431, 11, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 444, 10, 22, 12, 22, 14, 22, 447, 11, 22, 3, 22, 3, 22, 3, 22, 5, 22, 452, 10, 22, 3, 22, 3, 22, 5, 22, 456, 10, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 465, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 481, 10, 24, 12, 24, 14, 24, 484, 11, 24, 3, 24, 5, 24, 487, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 496, 10, 24, 12, 24, 14, 24, 499, 11, 24, 3, 24, 5, 24, 502, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 512, 10, 24, 12, 24, 14, 24, 515, 11, 24, 3, 24, 5, 24, 518, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 527, 10, 24, 12, 24, 14, 24, 530, 11, 24, 3, 24, 5, 24, 533, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 541, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 549, 10, 24, 12, 24, 14, 24, 552, 11, 24, 3, 24, 5, 24, 555, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 563, 10, 24, 12, 24, 14, 24, 566, 11, 24, 3, 24, 5, 24, 569, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 577, 10, 24, 12, 24, 14, 24, 580, 11, 24, 5, 24, 582, 10, 24, 3, 24, 5, 24, 585, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 610, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 649, 10, 24, 3, 24, 5, 24, 652, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 659, 10, 24, 12, 24, 14, 24, 662, 11, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 668, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 673, 10, 25, 12, 25, 14, 25, 676, 11, 25, 3, 25, 3, 25, 3, 26, 3, 26, 5, 26, 682, 10, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 691, 10, 27, 3, 27, 5, 27, 694, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 705, 10, 28, 3, 29, 3, 29, 5, 29, 709, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 719, 10, 30, 12, 30, 14, 30, 722, 11, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 728, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 6, 31, 735, 10, 31, 13, 31, 14, 31, 736, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 5, 32, 746, 10, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 5, 35, 756, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 761, 10, 36, 12, 36, 14, 36, 764, 11, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 772, 10, 37, 3, 38, 3, 38, 5, 38, 776, 10, 38, 3, 39, 3, 39, 5, 39, 780, 10, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 7, 42, 789, 10, 42, 12, 42, 14, 42, 792, 11, 42, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 798, 10, 43, 3, 44, 3, 44, 3, 44, 2, 2, 4, 38, 46, 45, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 68, 2, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 86, 2, 2, 10, 3, 2, 53, 55, 3, 2, 51, 52, 3, 2, 56, 61, 4, 2, 45, 49, 65, 66, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 51, 61, 3, 2, 42, 44, 3, 2, 67, 68, 2, 899, 2, 89, 3, 2, 2, 2, 4, 98, 3, 2, 2, 2, 6, 115, 3, 2, 2, 2, 8, 140, 3, 2, 2, 2, 10, 190, 3, 2, 2, 2, 12, 204, 3, 2, 2, 2, 14, 206, 3, 2, 2, 2, 16, 221, 3, 2, 2, 2, 18, 231, 3, 2, 2, 2, 20, 238, 3, 2, 2, 2, 22, 258, 3, 2, 2, 2, 24, 278, 3, 2, 2, 2, 26, 291, 3, 2, 2, 2, 28, 339, 3, 2, 2, 2, 30, 341, 3, 2, 2, 2, 32, 343, 3, 2, 2, 2, 34, 345, 3, 2, 2, 2, 36, 347, 3, 2, 2, 2, 38, 419, 3, 2, 2, 2, 40, 432, 3, 2, 2, 2, 42, 455, 3, 2, 2, 2, 44, 457, 3, 2, 2, 2, 46, 609, 3, 2, 2, 2, 48, 663, 3, 2, 2, 2, 50, 681, 3, 2, 2, 2, 52, 686, 3, 2, 2, 2, 54, 704, 3, 2, 2, 2, 56, 708, 3, 2, 2, 2, 58, 727, 3, 2, 2, 2, 60, 729, 3, 2, 2, 2, 62, 745, 3, 2, 2, 2, 64, 747, 3, 2, 2, 2, 66, 749, 3, 2, 2, 2, 68, 755, 3, 2, 2, 2, 70, 757, 3, 2, 2, 2, 72, 771, 3, 2, 2, 2, 74, 775, 3, 2, 2, 2, 76, 779, 3, 2, 2, 2, 78, 781, 3, 2, 2, 2, 80, 783, 3, 2, 2, 2, 82, 785, 3, 2, 2, 2, 84, 797, 3, 2, 2, 2, 86, 799, 3, 2, 2, 2, 88, 90, 5, 4, 3, 2, 89, 88, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 89, 3, 2, 2, 2, 91, 92, 3, 2, 2, 2, 92, 93, 3, 2, 2, 2, 93, 94, 7, 2, 2, 3, 94, 3, 3, 2, 2, 2, 95, 97, 7, 69, 2, 2, 96, 95, 3, 2, 2, 2, 97, 100, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 98, 99, 3, 2, 2, 2, 99, 101, 3, 2, 2, 2, 100, 98, 3, 2, 2, 2, 101, 102, 7, 3, 2, 2, 102, 103, 5, 82, 42, 2, 103, 107, 7, 4, 2, 2, 104, 106, 5, 6, 4, 2, 105, 104, 3, 2, 2, 2, 106, 109, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 107, 108, 3, 2, 2, 2, 108, 110, 3, 2, 2, 2, 109, 107, 3, 2, 2, 2, 110, 111, 7, 5, 2, 2, 111, 5, 3, 2, 2, 2, 112, 114, 7, 69, 2, 2, 113, 112, 3, 2, 2, 2, 114, 117, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 115, 116, 3, 2, 2, 2, 116, 118, 3, 2, 2, 2, 117, 115, 3, 2, 2, 2, 118, 119, 5, 8, 5, 2, 119, 7, 3, 2, 2, 2, 120, 121, 7, 6, 2, 2, 121, 122, 5, 82, 42, 2, 122, 123, 7, 7, 2, 2, 123, 124, 5, 38, 20, 2, 124, 141, 3, 2, 2, 2, 125, 126, 7, 8, 2, 2, 126, 127, 5, 82, 42, 2, 127, 128, 7, 7, 2, 2, 128, 129, 5, 38, 20, 2, 129, 141, 3, 2, 2, 2, 130, 131, 7, 9, 2, 2, 131, 132, 5, 62, 32, 2, 132, 133, 7, 62, 2, 2, 133, 134, 5, 46, 24, 2, 134, 141, 3, 2, 2, 2, 135, 141, 5, 28, 15, 2, 136, 141, 5, 10, 6, 2, 137, 141, 5, 12, 7, 2, 138, 141, 5, 24, 13, 2, 139, 141, 5, 26, 14, 2, 140, 120, 3, 2, 2, 2, 140, 125, 3, 2, 2, 2, 140, 130, 3, 2, 2, 2, 140, 135, 3, 2, 2, 2, 140, 136, 3, 2, 2, 2, 140, 137, 3, 2, 2, 2, 140, 138, 3, 2, 2, 2, 140, 139, 3, 2, 2, 2, 141, 9, 3, 2, 2, 2, 142, 143, 5, 22, 12, 2, 143, 144, 5, 74, 38, 2, 144, 145, 7, 63, 2, 2, 145, 150, 5, 66, 34, 2, 146, 147, 7, 10, 2, 2, 147, 149, 5, 66, 34, 2, 148, 146, 3, 2, 2, 2, 149, 152, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 150, 151, 3, 2, 2, 2, 151, 153, 3, 2, 2, 2, 152, 150, 3, 2, 2, 2, 153, 154, 7, 64, 2, 2, 154, 155, 7, 7, 2, 2, 155, 158, 5, 38, 20, 2, 156, 157, 7, 62, 2, 2, 157, 159, 5, 46, 24, 2, 158, 156, 3, 2, 2, 2, 158, 159, 3, 2, 2, 2, 159, 161, 3, 2, 2, 2, 160, 162, 7, 11, 2, 2, 161, 160, 3, 2, 2, 2, 161, 162, 3, 2, 2, 2, 162, 191, 3, 2, 2, 2, 163, 164, 5, 22, 12, 2, 164, 177, 5, 74, 38, 2, 165, 174, 7, 63, 2, 2, 166, 171, 5, 64, 33, 2, 167, 168, 7, 10, 2, 2, 168, 170, 5, 64, 33, 2, 169, 167, 3, 2, 2, 2, 170, 173, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 171, 172, 3, 2, 2, 2, 172, 175, 3, 2, 2, 2, 173, 171, 3, 2, 2, 2, 174, 166, 3, 2, 2, 2, 174, 175, 3, 2, 2, 2, 175, 176, 3, 2, 2, 2, 176, 178, 7, 64, 2, 2, 177, 165, 3, 2, 2, 2, 177, 178, 3, 2, 2, 2, 178, 181, 3, 2, 2, 2, 179, 180, 7, 7, 2, 2, 180, 182, 5, 38, 20, 2, 181, 179, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 185, 3, 2, 2, 2, 183, 184, 7, 62, 2, 2, 184, 186, 5, 46, 24, 2, 185, 183, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 188, 3, 2, 2, 2, 187, 189, 7, 11, 2, 2, 188, 187, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 191, 3, 2, 2, 2, 190, 142, 3, 2, 2, 2, 190, 163, 3, 2, 2, 2, 191, 11, 3, 2, 2, 2, 192, 193, 7, 12, 2, 2, 193, 205, 5, 82, 42, 2, 194, 195, 7, 12, 2, 2, 195, 196, 5, 14, 8, 2, 196, 197, 7, 62, 2, 2, 197, 198, 5, 38, 20, 2, 198, 205, 3, 2, 2, 2, 199, 200, 7, 12, 2, 2, 200, 201, 5, 14, 8, 2, 201, 202, 7, 62, 2, 2, 202, 203, 5, 16, 9, 2, 203, 205, 3, 2, 2, 2, 204, 192, 3, 2, 2, 2, 204, 194, 3, 2, 2, 2, 204, 199, 3, 2, 2, 2, 205, 13, 3, 2, 2, 2, 206, 218, 5, 82, 42, 2, 207, 208, 7, 13, 2, 2, 208, 213, 5, 40, 21, 2, 209, 210, 7, 10, 2, 2, 210, 212, 5, 40, 21, 2, 211, 209, 3, 2, 2, 2, 212, 215, 3, 2, 2, 2, 213, 211, 3, 2, 2, 2, 213, 214, 3, 2, 2, 2, 214, 216, 3, 2, 2, 2, 215, 213, 3, 2, 2, 2, 216, 217, 7, 14, 2, 2, 217, 219, 3, 2, 2, 2, 218, 207, 3, 2, 2, 2, 218, 219, 3, 2, 2, 2, 219, 15, 3, 2, 2, 2, 220, 222, 7, 15, 2, 2, 221, 220, 3, 2, 2, 2, 221, 222, 3, 2, 2, 2, 222, 223, 3, 2, 2, 2, 223, 228, 5, 18, 10, 2, 224, 225, 7, 15, 2, 2, 225, 227, 5, 18, 10, 2, 226, 224, 3, 2, 2, 2, 227, 230, 3, 2, 2, 2, 228, 226, 3, 2, 2, 2, 228, 229, 3, 2, 2, 2, 229, 17, 3, 2, 2, 2, 230, 228, 3, 2, 2, 2, 231, 236, 5, 84, 43, 2, 232, 233, 7, 63, 2, 2, 233, 234, 5, 38, 20, 2, 234, 235, 7, 64, 2, 2, 235, 237, 3, 2, 2, 2, 236, 232, 3, 2, 2, 2, 236, 237, 3, 2, 2, 2, 237, 19, 3, 2, 2, 2, 238, 239, 7, 16, 2, 2, 239, 242, 5, 82, 42, 2, 240, 241, 7, 7, 2, 2, 241, 243, 5, 38, 20, 2, 242, 240, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 244, 3, 2, 2, 2, 244, 245, 7, 62, 2, 2, 245, 247, 5, 46, 24, 2, 246, 248, 7, 11, 2, 2, 247, 246, 3, 2, 2, 2, 247, 248, 3, 2, 2, 2, 248, 21, 3, 2, 2, 2, 249, 259, 7, 17, 2, 2, 250, 259, 7, 18, 2, 2, 251, 252, 7, 19, 2, 2, 252, 259, 7, 17, 2, 2, 253, 254, 7, 19, 2, 2, 254, 259, 7, 18, 2, 2, 255, 259, 7, 20, 2, 2, 256, 259, 7, 21, 2, 2, 257, 259, 7, 22, 2, 2, 258, 249, 3, 2, 2, 2, 258, 250, 3, 2, 2, 2, 258, 251, 3, 2, 2, 2, 258, 253, 3, 2, 2, 2, 258, 255, 3, 2, 2, 2, 258, 256, 3, 2, 2, 2, 258, 257, 3, 2, 2, 2, 259, 23, 3, 2, 2, 2, 260, 261, 7, 23, 2, 2, 261, 262, 5, 32, 17, 2, 262, 263, 7, 24, 2, 2, 263, 266, 5, 68, 35, 2, 264, 265, 7, 25, 2, 2, 265, 267, 5, 36, 19, 2, 266, 264, 3, 2, 2, 2, 266, 267, 3, 2, 2, 2, 267, 279, 3, 2, 2, 2, 268, 269, 7, 23, 2, 2, 269, 272, 5, 32, 17, 2, 270, 271, 7, 26, 2, 2, 271, 273, 5, 32, 17, 2, 272, 270, 3, 2, 2, 2, 272, 273, 3, 2, 2, 2, 273, 276, 3, 2, 2, 2, 274, 275, 7, 25, 2, 2, 275, 277, 5, 36, 19, 2, 276, 274, 3, 2, 2, 2, 276, 277, 3, 2, 2, 2, 277, 279, 3, 2, 2, 2, 278, 260, 3, 2, 2, 2, 278, 268, 3, 2, 2, 2, 279, 25, 3, 2, 2, 2, 280, 281, 7, 27, 2, 2, 281, 282, 5, 32, 17, 2, 282, 283, 7, 24, 2, 2, 283, 284, 5, 68, 35, 2, 284, 292, 3, 2, 2, 2, 285, 286, 7, 27, 2, 2, 286, 289, 5, 32, 17, 2, 287, 288, 7, 26, 2, 2, 288, 290, 5, 32, 17, 2, 289, 287, 3, 2, 2, 2, 289, 290, 3, 2, 2, 2, 290, 292, 3, 2, 2, 2, 291, 280, 3, 2, 2, 2, 291, 285, 3, 2, 2, 2, 292, 27, 3, 2, 2, 2, 293, 294, 7, 23, 2, 2, 294, 295, 5, 30, 16, 2, 295, 296, 7, 63, 2, 2, 296, 297, 5, 32, 17, 2, 297, 298, 7, 62, 2, 2, 298, 306, 5, 46, 24, 2, 299, 300, 7, 10, 2, 2, 300, 301, 5, 32, 17, 2, 301, 302, 7, 62, 2, 2, 302, 303, 5, 46, 24, 2, 303, 305, 3, 2, 2, 2, 304, 299, 3, 2, 2, 2, 305, 308, 3, 2, 2, 2, 306, 304, 3, 2, 2, 2, 306, 307, 3, 2, 2, 2, 307, 309, 3, 2, 2, 2, 308, 306, 3, 2, 2, 2, 309, 310, 7, 64, 2, 2, 310, 311, 7, 24, 2, 2, 311, 314, 7, 53, 2, 2, 312, 313, 7, 25, 2, 2, 313, 315, 5, 36, 19, 2, 314, 312, 3, 2, 2, 2, 314, 315, 3, 2, 2, 2, 315, 340, 3, 2, 2, 2, 316, 317, 7, 23, 2, 2, 317, 318, 5, 30, 16, 2, 318, 319, 7, 63, 2, 2, 319, 320, 5, 32, 17, 2, 320, 321, 7, 62, 2, 2, 321, 329, 5, 46, 24, 2, 322, 323, 7, 10, 2, 2, 323, 324, 5, 32, 17, 2, 324, 325, 7, 62, 2, 2, 325, 326, 5, 46, 24, 2, 326, 328, 3, 2, 2, 2, 327, 322, 3, 2, 2, 2, 328, 331, 3, 2, 2, 2, 329, 327, 3, 2, 2, 2, 329, 330, 3, 2, 2, 2, 330, 332, 3, 2, 2, 2, 331, 329, 3, 2, 2, 2, 332, 333, 7, 64, 2, 2, 333, 334, 7, 26, 2, 2, 334, 337, 5, 34, 18, 2, 335, 336, 7, 25, 2, 2, 336, 338, 5, 36, 19, 2, 337, 335, 3, 2, 2, 2, 337, 338, 3, 2, 2, 2, 338, 340, 3, 2, 2, 2, 339, 293, 3, 2, 2, 2, 339, 316, 3, 2, 2, 2, 340, 29, 3, 2, 2, 2, 341, 342, 5, 82, 42, 2, 342, 31, 3, 2, 2, 2, 343, 344, 5, 82, 42, 2, 344, 33, 3, 2, 2, 2, 345, 346, 5, 82, 42, 2, 346, 35, 3, 2, 2, 2, 347, 348, 7, 42, 2, 2, 348, 37, 3, 2, 2, 2, 349, 350, 8, 20, 1, 2, 350, 359, 7, 63, 2, 2, 351, 356, 5, 38, 20, 2, 352, 353, 7, 10, 2, 2, 353, 355, 5, 38, 20, 2, 354, 352, 3, 2, 2, 2, 355, 358, 3, 2, 2, 2, 356, 354, 3, 2, 2, 2, 356, 357, 3, 2, 2, 2, 357, 360, 3, 2, 2, 2, 358, 356, 3, 2, 2, 2, 359, 351, 3, 2, 2, 2, 359, 360, 3, 2, 2, 2, 360, 362, 3, 2, 2, 2, 361, 363, 7, 10, 2, 2, 362, 361, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 364, 3, 2, 2, 2, 364, 365, 7, 64, 2, 2, 365, 366, 7, 29, 2, 2, 366, 420, 5, 38, 20, 14, 367, 368, 7, 65, 2, 2, 368, 369, 7, 13, 2, 2, 369, 370, 5, 38, 20, 2, 370, 371, 7, 14, 2, 2, 371, 420, 3, 2, 2, 2, 372, 373, 7, 66, 2, 2, 373, 374, 7, 13, 2, 2, 374, 375, 5, 38, 20, 2, 375, 376, 7, 14, 2, 2, 376, 420, 3, 2, 2, 2, 377, 378, 7, 63, 2, 2, 378, 379, 5, 38, 20, 2, 379, 380, 7, 10, 2, 2, 380, 385, 5, 38, 20, 2, 381, 382, 7, 10, 2, 2, 382, 384, 5, 38, 20, 2, 383, 381, 3, 2, 2, 2, 384, 387, 3, 2, 2, 2, 385, 383, 3, 2, 2, 2, 385, 386, 3, 2, 2, 2, 386, 389, 3, 2, 2, 2, 387, 385, 3, 2, 2, 2, 388, 390, 7, 10, 2, 2, 389, 388, 3, 2, 2, 2, 389, 390, 3, 2, 2, 2, 390, 391, 3, 2, 2, 2, 391, 392, 7, 64, 2, 2, 392, 420, 3, 2, 2, 2, 393, 395, 7, 4, 2, 2, 394, 396, 5, 42, 22, 2, 395, 394, 3, 2, 2, 2, 395, 396, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, 420, 7, 5, 2, 2, 398, 420, 7, 30, 2, 2, 399, 420, 7, 31, 2, 2, 400, 420, 7, 32, 2, 2, 401, 420, 5, 40, 21, 2, 402, 420, 5, 82, 42, 2, 403, 404, 7, 63, 2, 2, 404, 405, 5, 38, 20, 2, 405, 406, 7, 64, 2, 2, 406, 420, 3, 2, 2, 2, 407, 408, 5, 82, 42, 2, 408, 409, 7, 13, 2, 2, 409, 414, 5, 38, 20, 2, 410, 411, 7, 10, 2, 2, 411, 413, 5, 38, 20, 2, 412, 410, 3, 2, 2, 2, 413, 416, 3, 2, 2, 2, 414, 412, 3, 2, 2, 2, 414, 415, 3, 2, 2, 2, 415, 417, 3, 2, 2, 2, 416, 414, 3, 2, 2, 2, 417, 418, 7, 14, 2, 2, 418, 420, 3, 2, 2, 2, 419, 349, 3, 2, 2, 2, 419, 367, 3, 2, 2, 2, 419, 372, 3, 2, 2, 2, 419, 377, 3, 2, 2, 2, 419, 393, 3, 2, 2, 2, 419, 398, 3, 2, 2, 2, 419, 399, 3, 2, 2, 2, 419, 400, 3, 2, 2, 2, 419, 401, 3, 2, 2, 2, 419, 402, 3, 2, 2, 2, 419, 403, 3, 2, 2, 2, 419, 407, 3, 2, 2, 2, 420, 429, 3, 2, 2, 2, 421, 422, 12, 16, 2, 2, 422, 423, 7, 28, 2, 2, 423, 428, 5, 38, 20, 16, 424, 425, 12, 15, 2, 2, 425, 426, 7, 29, 2, 2, 426, 428, 5, 38, 20, 15, 427, 421, 3, 2, 2, 2, 427, 424, 3, 2, 2, 2, 428, 431, 3, 2, 2, 2, 429, 427, 3, 2, 2, 2, 429, 430, 3, 2, 2, 2, 430, 39, 3, 2, 2, 2, 431, 429, 3, 2, 2, 2, 432, 433, 7, 67, 2, 2, 433, 41, 3, 2, 2, 2, 434, 435, 5, 44, 23, 2, 435, 436, 7, 7, 2, 2, 436, 437, 5, 38, 20, 2, 437, 445, 3, 2, 2, 2, 438, 439, 7, 10, 2, 2, 439, 440, 5, 44, 23, 2, 440, 441, 7, 7, 2, 2, 441, 442, 5, 38, 20, 2, 442, 444, 3, 2, 2, 2, 443, 438, 3, 2, 2, 2, 444, 447, 3, 2, 2, 2, 445, 443, 3, 2, 2, 2, 445, 446, 3, 2, 2, 2, 446, 451, 3, 2, 2, 2, 447, 445, 3, 2, 2, 2, 448, 452, 7, 10, 2, 2, 449, 450, 7, 15, 2, 2, 450, 452, 5, 86, 44, 2, 451, 448, 3, 2, 2, 2, 451, 449, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 452, 456, 3, 2, 2, 2, 453, 454, 7, 15, 2, 2, 454, 456, 5, 86, 44, 2, 455, 434, 3, 2, 2, 2, 455, 453, 3, 2, 2, 2, 456, 43, 3, 2, 2, 2, 457, 458, 5, 84, 43, 2, 458, 45, 3, 2, 2, 2, 459, 460, 8, 24, 1, 2, 460, 610, 5, 56, 29, 2, 461, 462, 5, 74, 38, 2, 462, 464, 7, 63, 2, 2, 463, 465, 5, 70, 36, 2, 464, 463, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, 466, 3, 2, 2, 2, 466, 467, 7, 64, 2, 2, 467, 610, 3, 2, 2, 2, 468, 469, 7, 52, 2, 2, 469, 610, 5, 46, 24, 27, 470, 471, 5, 82, 42, 2, 471, 472, 7, 34, 2, 2, 472, 473, 7, 62, 2, 2, 473, 474, 5, 46, 24, 23, 474, 610, 3, 2, 2, 2, 475, 476, 7, 45, 2, 2, 476, 477, 7, 4, 2, 2, 477, 482, 5, 46, 24, 2, 478, 479, 7, 10, 2, 2, 479, 481, 5, 46, 24, 2, 480, 478, 3, 2, 2, 2, 481, 484, 3, 2, 2, 2, 482, 480, 3, 2, 2, 2, 482, 483, 3, 2, 2, 2, 483, 486, 3, 2, 2, 2, 484, 482, 3, 2, 2, 2, 485, 487, 7, 10, 2, 2, 486, 485, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 489, 7, 5, 2, 2, 489, 610, 3, 2, 2, 2, 490, 491, 7, 46, 2, 2, 491, 492, 7, 4, 2, 2, 492, 497, 5, 46, 24, 2, 493, 494, 7, 10, 2, 2, 494, 496, 5, 46, 24, 2, 495, 493, 3, 2, 2, 2, 496, 499, 3, 2, 2, 2, 497, 495, 3, 2, 2, 2, 497, 498, 3, 2, 2, 2, 498, 501, 3, 2, 2, 2, 499, 497, 3, 2, 2, 2, 500, 502, 7, 10, 2, 2, 501, 500, 3, 2, 2, 2, 501, 502, 3, 2, 2, 2, 502, 503, 3, 2, 2, 2, 503, 504, 7, 5, 2, 2, 504, 610, 3, 2, 2, 2, 505, 610, 5, 48, 25, 2, 506, 507, 7, 35, 2, 2, 507, 508, 7, 4, 2, 2, 508, 513, 5, 46, 24, 2, 509, 510, 7, 10, 2, 2, 510, 512, 5, 46, 24, 2, 511, 509, 3, 2, 2, 2, 512, 515, 3, 2, 2, 2, 513, 511, 3, 2, 2, 2, 513, 514, 3, 2, 2, 2, 514, 517, 3, 2, 2, 2, 515, 513, 3, 2, 2, 2, 516, 518, 7, 10, 2, 2, 517, 516, 3, 2, 2, 2, 517, 518, 3, 2, 2, 2, 518, 519, 3, 2, 2, 2, 519, 520, 7, 5, 2, 2, 520, 610, 3, 2, 2, 2, 521, 522, 7, 36, 2, 2, 522, 523, 7, 4, 2, 2, 523, 528, 5, 46, 24, 2, 524, 525, 7, 10, 2, 2, 525, 527, 5, 46, 24, 2, 526, 524, 3, 2, 2, 2, 527, 530, 3, 2, 2, 2, 528, 526, 3, 2, 2, 2, 528, 529, 3, 2, 2, 2, 529, 532, 3, 2, 2, 2, 530, 528, 3, 2, 2, 2, 531, 533, 7, 10, 2, 2, 532, 531, 3, 2, 2, 2, 532, 533, 3, 2, 2, 2, 533, 534, 3, 2, 2, 2, 534, 535, 7, 5, 2, 2, 535, 610, 3, 2, 2, 2, 536, 541, 5, 82, 42, 2, 537, 541, 7, 44, 2, 2, 538, 541, 7, 43, 2, 2, 539, 541, 7, 42, 2, 2, 540, 536, 3, 2, 2, 2, 540, 537, 3, 2, 2, 2, 540, 538, 3, 2, 2, 2, 540, 539, 3, 2, 2, 2, 541, 610, 3, 2, 2, 2, 542, 543, 7, 63, 2, 2, 543, 544, 5, 46, 24, 2, 544, 545, 7, 10, 2, 2, 545, 550, 5, 46, 24, 2, 546, 547, 7, 10, 2, 2, 547, 549, 5, 46, 24, 2, 548, 546, 3, 2, 2, 2, 549, 552, 3, 2, 2, 2, 550, 548, 3, 2, 2, 2, 550, 551, 3, 2, 2, 2, 551, 554, 3, 2, 2, 2, 552, 550, 3, 2, 2, 2, 553, 555, 7, 10, 2, 2, 554, 553, 3, 2, 2, 2, 554, 555, 3, 2, 2, 2, 555, 556, 3, 2, 2, 2, 556, 557, 7, 64, 2, 2, 557, 610, 3, 2, 2, 2, 558, 559, 7, 4, 2, 2, 559, 564, 5, 72, 37, 2, 560, 561, 7, 10, 2, 2, 561, 563, 5, 72, 37, 2, 562, 560, 3, 2, 2, 2, 563, 566, 3, 2, 2, 2, 564, 562, 3, 2, 2, 2, 564, 565, 3, 2, 2, 2, 565, 568, 3, 2, 2, 2, 566, 564, 3, 2, 2, 2, 567, 569, 7, 10, 2, 2, 568, 567, 3, 2, 2, 2, 568, 569, 3, 2, 2, 2, 569, 570, 3, 2, 2, 2, 570, 571, 7, 5, 2, 2, 571, 610, 3, 2, 2, 2, 572, 581, 7, 13, 2, 2, 573, 578, 5, 46, 24, 2, 574, 575, 7, 10, 2, 2, 575, 577, 5, 46, 24, 2, 576, 574, 3, 2, 2, 2, 577, 580, 3, 2, 2, 2, 578, 576, 3, 2, 2, 2, 578, 579, 3, 2, 2, 2, 579, 582, 3, 2, 2, 2, 580, 578, 3, 2, 2, 2, 581, 573, 3, 2, 2, 2, 581, 582, 3, 2, 2, 2, 582, 584, 3, 2, 2, 2, 583, 585, 7, 10, 2, 2, 584, 583, 3, 2, 2, 2, 584, 585, 3, 2, 2, 2, 585, 586, 3, 2, 2, 2, 586, 610, 7, 14, 2, 2, 587, 588, 7, 37, 2, 2, 588, 589, 7, 63, 2, 2, 589, 590, 5, 46, 24, 2, 590, 591, 7, 64, 2, 2, 591, 592, 5, 46, 24, 2, 592, 593, 7, 38, 2, 2, 593, 594, 5, 46, 24, 7, 594, 610, 3, 2, 2, 2, 595, 596, 5, 10, 6, 2, 596, 597, 5, 46, 24, 6, 597, 610, 3, 2, 2, 2, 598, 599, 5, 20, 11, 2, 599, 600, 5, 46, 24, 5, 600, 610, 3, 2, 2, 2, 601, 602, 7, 63, 2, 2, 602, 603, 5, 46, 24, 2, 603, 604, 7, 64, 2, 2, 604, 610, 3, 2, 2, 2, 605, 606, 7, 4, 2, 2, 606, 607, 5, 46, 24, 2, 607, 608, 7, 5, 2, 2, 608, 610, 3, 2, 2, 2, 609, 459, 3, 2, 2, 2, 609, 461, 3, 2, 2, 2, 609, 468, 3, 2, 2, 2, 609, 470, 3, 2, 2, 2, 609, 475, 3, 2, 2, 2, 609, 490, 3, 2, 2, 2, 609, 505, 3, 2, 2, 2, 609, 506, 3, 2, 2, 2, 609, 521, 3, 2, 2, 2, 609, 540, 3, 2, 2, 2, 609, 542, 3, 2, 2, 2, 609, 558, 3, 2, 2, 2, 609, 572, 3, 2, 2, 2, 609, 587, 3, 2, 2, 2, 609, 595, 3, 2, 2, 2, 609, 598, 3, 2, 2, 2, 609, 601, 3, 2, 2, 2, 609, 605, 3, 2, 2, 2, 610, 660, 3, 2, 2, 2, 611, 612, 12, 28, 2, 2, 612, 613, 7, 33, 2, 2, 613, 659, 5, 46, 24, 28, 614, 615, 12, 26, 2, 2, 615, 616, 9, 2, 2, 2, 616, 659, 5, 46, 24, 27, 617, 618, 12, 25, 2, 2, 618, 619, 9, 3, 2, 2, 619, 659, 5, 46, 24, 26, 620, 621, 12, 24, 2, 2, 621, 622, 9, 4, 2, 2, 622, 659, 5, 46, 24, 25, 623, 624, 12, 22, 2, 2, 624, 625, 7, 62, 2, 2, 625, 626, 5, 46, 24, 23, 626, 627, 8, 24, 1, 2, 627, 659, 3, 2, 2, 2, 628, 629, 12, 20, 2, 2, 629, 630, 7, 45, 2, 2, 630, 659, 5, 46, 24, 21, 631, 632, 12, 18, 2, 2, 632, 633, 7, 46, 2, 2, 633, 659, 5, 46, 24, 19, 634, 635, 12, 17, 2, 2, 635, 636, 7, 47, 2, 2, 636, 659, 5, 46, 24, 18, 637, 638, 12, 16, 2, 2, 638, 639, 7, 48, 2, 2, 639, 659, 5, 46, 24, 17, 640, 641, 12, 10, 2, 2, 641, 642, 7, 28, 2, 2, 642, 659, 5, 46, 24, 11, 643, 644, 12, 32, 2, 2, 644, 645, 7, 24, 2, 2, 645, 651, 5, 76, 39, 2, 646, 648, 7, 63, 2, 2, 647, 649, 5, 70, 36, 2, 648, 647, 3, 2, 2, 2, 648, 649, 3, 2, 2, 2, 649, 650, 3, 2, 2, 2, 650, 652, 7, 64, 2, 2, 651, 646, 3, 2, 2, 2, 651, 652, 3, 2, 2, 2, 652, 659, 3, 2, 2, 2, 653, 654, 12, 29, 2, 2, 654, 655, 7, 13, 2, 2, 655, 656, 5, 46, 24, 2, 656, 657, 7, 14, 2, 2, 657, 659, 3, 2, 2, 2, 658, 611, 3, 2, 2, 2, 658, 614, 3, 2, 2, 2, 658, 617, 3, 2, 2, 2, 658, 620, 3, 2, 2, 2, 658, 623, 3, 2, 2, 2, 658, 628, 3, 2, 2, 2, 658, 631, 3, 2, 2, 2, 658, 634, 3, 2, 2, 2, 658, 637, 3, 2, 2, 2, 658, 640, 3, 2, 2, 2, 658, 643, 3, 2, 2, 2, 658, 653, 3, 2, 2, 2, 659, 662, 3, 2, 2, 2, 660, 658, 3, 2, 2, 2, 660, 661, 3, 2, 2, 2, 661, 47, 3, 2, 2, 2, 662, 660, 3, 2, 2, 2, 663, 664, 7, 50, 2, 2, 664, 665, 5, 46, 24, 2, 665, 667, 7, 4, 2, 2, 666, 668, 7, 15, 2, 2, 667, 666, 3, 2, 2, 2, 667, 668, 3, 2, 2, 2, 668, 669, 3, 2, 2, 2, 669, 674, 5, 50, 26, 2, 670, 671, 7, 15, 2, 2, 671, 673, 5, 50, 26, 2, 672, 670, 3, 2, 2, 2, 673, 676, 3, 2, 2, 2, 674, 672, 3, 2, 2, 2, 674, 675, 3, 2, 2, 2, 675, 677, 3, 2, 2, 2, 676, 674, 3, 2, 2, 2, 677, 678, 7, 5, 2, 2, 678, 49, 3, 2, 2, 2, 679, 682, 5, 52, 27, 2, 680, 682, 7, 39, 2, 2, 681, 679, 3, 2, 2, 2, 681, 680, 3, 2, 2, 2, 682, 683, 3, 2, 2, 2, 683, 684, 7, 29, 2, 2, 684, 685, 5, 46, 24, 2, 685, 51, 3, 2, 2, 2, 686, 693, 5, 84, 43, 2, 687, 690, 7, 63, 2, 2, 688, 691, 5, 84, 43, 2, 689, 691, 7, 39, 2, 2, 690, 688, 3, 2, 2, 2, 690, 689, 3, 2, 2, 2, 691, 692, 3, 2, 2, 2, 692, 694, 7, 64, 2, 2, 693, 687, 3, 2, 2, 2, 693, 694, 3, 2, 2, 2, 694, 53, 3, 2, 2, 2, 695, 696, 5, 8, 5, 2, 696, 697, 7, 2, 2, 3, 697, 705, 3, 2, 2, 2, 698, 699, 5, 46, 24, 2, 699, 700, 7, 2, 2, 3, 700, 705, 3, 2, 2, 2, 701, 702, 7, 69, 2, 2, 702, 705, 7, 2, 2, 3, 703, 705, 7, 2, 2, 3, 704, 695, 3, 2, 2, 2, 704, 698, 3, 2, 2, 2, 704, 701, 3, 2, 2, 2, 704, 703, 3, 2, 2, 2, 705, 55, 3, 2, 2, 2, 706, 709, 5, 58, 30, 2, 707, 709, 5, 60, 31, 2, 708, 706, 3, 2, 2, 2, 708, 707, 3, 2, 2, 2, 709, 57, 3, 2, 2, 2, 710, 711, 5, 64, 33, 2, 711, 712, 7, 29, 2, 2, 712, 713, 5, 46, 24, 2, 713, 728, 3, 2, 2, 2, 714, 715, 7, 63, 2, 2, 715, 720, 5, 64, 33, 2, 716, 717, 7, 10, 2, 2, 717, 719, 5, 64, 33, 2, 718, 716, 3, 2, 2, 2, 719, 722, 3, 2, 2, 2, 720, 718, 3, 2, 2, 2, 720, 721, 3, 2, 2, 2, 721, 723, 3, 2, 2, 2, 722, 720, 3, 2, 2, 2, 723, 724, 7, 64, 2, 2, 724, 725, 7, 29, 2, 2, 725, 726, 5, 46, 24, 2, 726, 728, 3, 2, 2, 2, 727, 710, 3, 2, 2, 2, 727, 714, 3, 2, 2, 2, 728, 59, 3, 2, 2, 2, 729, 730, 7, 63, 2, 2, 730, 731, 7, 63, 2, 2, 731, 734, 5, 64, 33, 2, 732, 733, 7, 10, 2, 2, 733, 735, 5, 64, 33, 2, 734, 732, 3, 2, 2, 2, 735, 736, 3, 2, 2, 2, 736, 734, 3, 2, 2, 2, 736, 737, 3, 2, 2, 2, 737, 738, 3, 2, 2, 2, 738, 739, 7, 64, 2, 2, 739, 740, 7, 64, 2, 2, 740, 741, 7, 29, 2, 2, 741, 742, 5, 46, 24, 2, 742, 61, 3, 2, 2, 2, 743, 746, 7, 39, 2, 2, 744, 746, 5, 82, 42, 2, 745, 743, 3, 2, 2, 2, 745, 744, 3, 2, 2, 2, 746, 63, 3, 2, 2, 2, 747, 748, 5, 62, 32, 2, 748, 65, 3, 2, 2, 2, 749, 750, 5, 62, 32, 2, 750, 751, 7, 7, 2, 2, 751, 752, 5, 38, 20, 2, 752, 67, 3, 2, 2, 2, 753, 756, 7, 53, 2, 2, 754, 756, 5, 82, 42, 2, 755, 753, 3, 2, 2, 2, 755, 754, 3, 2, 2, 2, 756, 69, 3, 2, 2, 2, 757, 762, 5, 46, 24, 2, 758, 759, 7, 10, 2, 2, 759, 761, 5, 46, 24, 2, 760, 758, 3, 2, 2, 2, 761, 764, 3, 2, 2, 2, 762, 760, 3, 2, 2, 2, 762, 763, 3, 2, 2, 2, 763, 71, 3, 2, 2, 2, 764, 762, 3, 2, 2, 2, 765, 766, 5, 84, 43, 2, 766, 767, 7, 7, 2, 2, 767, 768, 5, 46, 24, 2, 768, 772, 3, 2, 2, 2, 769, 770, 7, 40, 2, 2, 770, 772, 5, 46, 24, 2, 771, 765, 3, 2, 2, 2, 771, 769, 3, 2, 2, 2, 772, 73, 3, 2, 2, 2, 773, 776, 5, 82, 42, 2, 774, 776, 9, 5, 2, 2, 775, 773, 3, 2, 2, 2, 775, 774, 3, 2, 2, 2, 776, 75, 3, 2, 2, 2, 777, 780, 5, 82, 42, 2, 778, 780, 9, 6, 2, 2, 779, 777, 3, 2, 2, 2, 779, 778, 3, 2, 2, 2, 780, 77, 3, 2, 2, 2, 781, 782, 9, 7, 2, 2, 782, 79, 3, 2, 2, 2, 783, 784, 9, 8, 2, 2, 784, 81, 3, 2, 2, 2, 785, 790, 5, 86, 44, 2, 786, 787, 7, 41, 2, 2, 787, 789, 5, 86, 44, 2, 788, 786, 3, 2, 2, 2, 789, 792, 3, 2, 2, 2, 790, 788, 3, 2, 2, 2, 790, 791, 3, 2, 2, 2, 791, 83, 3, 2, 2, 2, 792, 790, 3, 2, 2, 2, 793, 798, 5, 86, 44, 2, 794, 795, 5, 82, 42, 2, 795, 796, 8, 43, 1, 2, 796, 798, 3, 2, 2, 2, 797, 793, 3, 2, 2, 2, 797, 794, 3, 2, 2, 2, 798, 85, 3, 2, 2, 2, 799, 800, 9, 9, 2, 2, 800, 87, 3, 2, 2, 2, 90, 91, 98, 107, 115, 140, 150, 158, 161, 171, 174, 177, 181, 185, 188, 190, 204, 213, 218, 221, 228, 236, 242, 247, 258, 266, 272, 276, 278, 289, 291, 306, 314, 329, 337, 339, 356, 359, 362, 385, 389, 395, 414, 419, 427, 429, 445, 451, 455, 464, 482, 486, 497, 501, 513, 517, 528, 532, 540, 550, 554, 564, 568, 578, 581, 584, 609, 648, 651, 658, 660, 667, 674, 681, 690, 693, 704, 708, 720, 727, 736, 745, 755, 762, 771, 775, 779, 790, 797] \ No newline at end of file diff --git a/quint/src/generated/QuintParser.ts b/quint/src/generated/QuintParser.ts index d73133d0f..f2ba2709c 100644 --- a/quint/src/generated/QuintParser.ts +++ b/quint/src/generated/QuintParser.ts @@ -1389,9 +1389,9 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 405; + this.state = 417; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 41, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 42, this._ctx) ) { case 1: { _localctx = new TypeOperContext(_localctx); @@ -1610,6 +1610,42 @@ export class QuintParser extends Parser { this.match(QuintParser.RPAREN); } break; + + case 12: + { + _localctx = new TypeAppContext(_localctx); + this._ctx = _localctx; + _prevctx = _localctx; + this.state = 405; + (_localctx as TypeAppContext)._typeCtor = this.qualId(); + { + this.state = 406; + this.match(QuintParser.T__10); + this.state = 407; + (_localctx as TypeAppContext)._type = this.type(0); + (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); + this.state = 412; + this._errHandler.sync(this); + _la = this._input.LA(1); + while (_la === QuintParser.T__7) { + { + { + this.state = 408; + this.match(QuintParser.T__7); + this.state = 409; + (_localctx as TypeAppContext)._type = this.type(0); + (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); + } + } + this.state = 414; + this._errHandler.sync(this); + _la = this._input.LA(1); + } + this.state = 415; + this.match(QuintParser.T__11); + } + } + break; } this._ctx._stop = this._input.tryLT(-1); this.state = 427; @@ -1629,13 +1665,13 @@ export class QuintParser extends Parser { { _localctx = new TypeFunContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 407; + this.state = 419; if (!(this.precpred(this._ctx, 14))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); } - this.state = 408; + this.state = 420; this.match(QuintParser.T__25); - this.state = 409; + this.state = 421; this.type(14); } break; @@ -1644,54 +1680,16 @@ export class QuintParser extends Parser { { _localctx = new TypeOperContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 410; + this.state = 422; if (!(this.precpred(this._ctx, 13))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 13)"); } - this.state = 411; + this.state = 423; this.match(QuintParser.T__26); - this.state = 412; + this.state = 424; this.type(13); } break; - - case 3: - { - _localctx = new TypeAppContext(new TypeContext(_parentctx, _parentState)); - (_localctx as TypeAppContext)._typeCtor = _prevctx; - this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 413; - if (!(this.precpred(this._ctx, 1))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 1)"); - } - { - this.state = 414; - this.match(QuintParser.T__10); - this.state = 415; - (_localctx as TypeAppContext)._type = this.type(0); - (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); - this.state = 420; - this._errHandler.sync(this); - _la = this._input.LA(1); - while (_la === QuintParser.T__7) { - { - { - this.state = 416; - this.match(QuintParser.T__7); - this.state = 417; - (_localctx as TypeAppContext)._type = this.type(0); - (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); - } - } - this.state = 422; - this._errHandler.sync(this); - _la = this._input.LA(1); - } - this.state = 423; - this.match(QuintParser.T__11); - } - } - break; } } } @@ -3612,48 +3610,45 @@ export class QuintParser extends Parser { case 1: return this.precpred(this._ctx, 13); - - case 2: - return this.precpred(this._ctx, 1); } return true; } private expr_sempred(_localctx: ExprContext, predIndex: number): boolean { switch (predIndex) { - case 3: + case 2: return this.precpred(this._ctx, 26); - case 4: + case 3: return this.precpred(this._ctx, 24); - case 5: + case 4: return this.precpred(this._ctx, 23); - case 6: + case 5: return this.precpred(this._ctx, 22); - case 7: + case 6: return this.precpred(this._ctx, 20); - case 8: + case 7: return this.precpred(this._ctx, 18); - case 9: + case 8: return this.precpred(this._ctx, 16); - case 10: + case 9: return this.precpred(this._ctx, 15); - case 11: + case 10: return this.precpred(this._ctx, 14); - case 12: + case 11: return this.precpred(this._ctx, 8); - case 13: + case 12: return this.precpred(this._ctx, 30); - case 14: + case 13: return this.precpred(this._ctx, 27); } return true; @@ -3704,17 +3699,17 @@ export class QuintParser extends Parser { "\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u0180\n\x14\f\x14\x0E\x14\u0183" + "\v\x14\x03\x14\x05\x14\u0186\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x05" + "\x14\u018C\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + - "\x03\x14\x03\x14\x03\x14\x05\x14\u0198\n\x14\x03\x14\x03\x14\x03\x14\x03" + - "\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u01A5" + - "\n\x14\f\x14\x0E\x14\u01A8\v\x14\x03\x14\x03\x14\x07\x14\u01AC\n\x14\f" + - "\x14\x0E\x14\u01AF\v\x14\x03\x15\x03\x15\x03\x16\x03\x16\x03\x16\x03\x16" + - "\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x07\x16\u01BC\n\x16\f\x16\x0E" + - "\x16\u01BF\v\x16\x03\x16\x03\x16\x03\x16\x05\x16\u01C4\n\x16\x03\x16\x03" + - "\x16\x05\x16\u01C8\n\x16\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x05\x18\u01D1\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07" + - "\x18\u01E1\n\x18\f\x18\x0E\x18\u01E4\v\x18\x03\x18\x05\x18\u01E7\n\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u01F0" + + "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14" + + "\u019D\n\x14\f\x14\x0E\x14\u01A0\v\x14\x03\x14\x03\x14\x05\x14\u01A4\n" + + "\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u01AC\n\x14" + + "\f\x14\x0E\x14\u01AF\v\x14\x03\x15\x03\x15\x03\x16\x03\x16\x03\x16\x03" + + "\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x07\x16\u01BC\n\x16\f\x16" + + "\x0E\x16\u01BF\v\x16\x03\x16\x03\x16\x03\x16\x05\x16\u01C4\n\x16\x03\x16" + + "\x03\x16\x05\x16\u01C8\n\x16\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x05\x18\u01D1\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x07\x18\u01E1\n\x18\f\x18\x0E\x18\u01E4\v\x18\x03\x18\x05\x18\u01E7\n" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u01F0" + "\n\x18\f\x18\x0E\x18\u01F3\v\x18\x03\x18\x05\x18\u01F6\n\x18\x03\x18\x03" + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0200\n\x18" + "\f\x18\x0E\x18\u0203\v\x18\x03\x18\x05\x18\u0206\n\x18\x03\x18\x03\x18" + @@ -3760,7 +3755,7 @@ export class QuintParser extends Parser { "\x02\x02\x12\xE7\x03\x02\x02\x02\x14\xEE\x03\x02\x02\x02\x16\u0102\x03" + "\x02\x02\x02\x18\u0116\x03\x02\x02\x02\x1A\u0123\x03\x02\x02\x02\x1C\u0153" + "\x03\x02\x02\x02\x1E\u0155\x03\x02\x02\x02 \u0157\x03\x02\x02\x02\"\u0159" + - "\x03\x02\x02\x02$\u015B\x03\x02\x02\x02&\u0197\x03\x02\x02\x02(\u01B0" + + "\x03\x02\x02\x02$\u015B\x03\x02\x02\x02&\u01A3\x03\x02\x02\x02(\u01B0" + "\x03\x02\x02\x02*\u01C7\x03\x02\x02\x02,\u01C9\x03\x02\x02\x02.\u0261" + "\x03\x02\x02\x020\u0297\x03\x02\x02\x022\u02A9\x03\x02\x02\x024\u02AE" + "\x03\x02\x02\x026\u02C0\x03\x02\x02\x028\u02C4\x03\x02\x02\x02:\u02D7" + @@ -3878,64 +3873,64 @@ export class QuintParser extends Parser { "\u015F\x03\x02\x02\x02\u0167\u0168\x03\x02\x02\x02\u0168\u016A\x03\x02" + "\x02\x02\u0169\u016B\x07\n\x02\x02\u016A\u0169\x03\x02\x02\x02\u016A\u016B" + "\x03\x02\x02\x02\u016B\u016C\x03\x02\x02\x02\u016C\u016D\x07@\x02\x02" + - "\u016D\u016E\x07\x1D\x02\x02\u016E\u0198\x05&\x14\x0E\u016F\u0170\x07" + + "\u016D\u016E\x07\x1D\x02\x02\u016E\u01A4\x05&\x14\x0E\u016F\u0170\x07" + "A\x02\x02\u0170\u0171\x07\r\x02\x02\u0171\u0172\x05&\x14\x02\u0172\u0173" + - "\x07\x0E\x02\x02\u0173\u0198\x03\x02\x02\x02\u0174\u0175\x07B\x02\x02" + + "\x07\x0E\x02\x02\u0173\u01A4\x03\x02\x02\x02\u0174\u0175\x07B\x02\x02" + "\u0175\u0176\x07\r\x02\x02\u0176\u0177\x05&\x14\x02\u0177\u0178\x07\x0E" + - "\x02\x02\u0178\u0198\x03\x02\x02\x02\u0179\u017A\x07?\x02\x02\u017A\u017B" + + "\x02\x02\u0178\u01A4\x03\x02\x02\x02\u0179\u017A\x07?\x02\x02\u017A\u017B" + "\x05&\x14\x02\u017B\u017C\x07\n\x02\x02\u017C\u0181\x05&\x14\x02\u017D" + "\u017E\x07\n\x02\x02\u017E\u0180\x05&\x14\x02\u017F\u017D\x03\x02\x02" + "\x02\u0180\u0183\x03\x02\x02\x02\u0181\u017F\x03\x02\x02\x02\u0181\u0182" + "\x03\x02\x02\x02\u0182\u0185\x03\x02\x02\x02\u0183\u0181\x03\x02\x02\x02" + "\u0184\u0186\x07\n\x02\x02\u0185\u0184\x03\x02\x02\x02\u0185\u0186\x03" + "\x02\x02\x02\u0186\u0187\x03\x02\x02\x02\u0187\u0188\x07@\x02\x02\u0188" + - "\u0198\x03\x02\x02\x02\u0189\u018B\x07\x04\x02\x02\u018A\u018C\x05*\x16" + + "\u01A4\x03\x02\x02\x02\u0189\u018B\x07\x04\x02\x02\u018A\u018C\x05*\x16" + "\x02\u018B\u018A\x03\x02\x02\x02\u018B\u018C\x03\x02\x02\x02\u018C\u018D" + - "\x03\x02\x02\x02\u018D\u0198\x07\x05\x02\x02\u018E\u0198\x07\x1E\x02\x02" + - "\u018F\u0198\x07\x1F\x02\x02\u0190\u0198\x07 \x02\x02\u0191\u0198\x05" + - "(\x15\x02\u0192\u0198\x05R*\x02\u0193\u0194\x07?\x02\x02\u0194\u0195\x05" + - "&\x14\x02\u0195\u0196\x07@\x02\x02\u0196\u0198\x03\x02\x02\x02\u0197\u015D" + - "\x03\x02\x02\x02\u0197\u016F\x03\x02\x02\x02\u0197\u0174\x03\x02\x02\x02" + - "\u0197\u0179\x03\x02\x02\x02\u0197\u0189\x03\x02\x02\x02\u0197\u018E\x03" + - "\x02\x02\x02\u0197\u018F\x03\x02\x02\x02\u0197\u0190\x03\x02\x02\x02\u0197" + - "\u0191\x03\x02\x02\x02\u0197\u0192\x03\x02\x02\x02\u0197\u0193\x03\x02" + - "\x02\x02\u0198\u01AD\x03\x02\x02\x02\u0199\u019A\f\x10\x02\x02\u019A\u019B" + - "\x07\x1C\x02\x02\u019B\u01AC\x05&\x14\x10\u019C\u019D\f\x0F\x02\x02\u019D" + - "\u019E\x07\x1D\x02\x02\u019E\u01AC\x05&\x14\x0F\u019F\u01A0\f\x03\x02" + - "\x02\u01A0\u01A1\x07\r\x02\x02\u01A1\u01A6\x05&\x14\x02\u01A2\u01A3\x07" + - "\n\x02\x02\u01A3\u01A5\x05&\x14\x02\u01A4\u01A2\x03\x02\x02\x02\u01A5" + - "\u01A8\x03\x02\x02\x02\u01A6\u01A4\x03\x02\x02\x02\u01A6\u01A7\x03\x02" + - "\x02\x02\u01A7\u01A9\x03\x02\x02\x02\u01A8\u01A6\x03\x02\x02\x02\u01A9" + - "\u01AA\x07\x0E\x02\x02\u01AA\u01AC\x03\x02\x02\x02\u01AB\u0199\x03\x02" + - "\x02\x02\u01AB\u019C\x03\x02\x02\x02\u01AB\u019F\x03\x02\x02\x02\u01AC" + - "\u01AF\x03\x02\x02\x02\u01AD\u01AB\x03\x02\x02\x02\u01AD\u01AE\x03\x02" + - "\x02\x02\u01AE\'\x03\x02\x02\x02\u01AF\u01AD\x03\x02\x02\x02\u01B0\u01B1" + - "\x07C\x02\x02\u01B1)\x03\x02\x02\x02\u01B2\u01B3\x05,\x17\x02\u01B3\u01B4" + - "\x07\x07\x02\x02\u01B4\u01B5\x05&\x14\x02\u01B5\u01BD\x03\x02\x02\x02" + - "\u01B6\u01B7\x07\n\x02\x02\u01B7\u01B8\x05,\x17\x02\u01B8\u01B9\x07\x07" + - "\x02\x02\u01B9\u01BA\x05&\x14\x02\u01BA\u01BC\x03\x02\x02\x02\u01BB\u01B6" + - "\x03\x02\x02\x02\u01BC\u01BF\x03\x02\x02\x02\u01BD\u01BB\x03\x02\x02\x02" + - "\u01BD\u01BE\x03\x02\x02\x02\u01BE\u01C3\x03\x02\x02\x02\u01BF\u01BD\x03" + - "\x02\x02\x02\u01C0\u01C4\x07\n\x02\x02\u01C1\u01C2\x07\x0F\x02\x02\u01C2" + - "\u01C4\x05V,\x02\u01C3\u01C0\x03\x02\x02\x02\u01C3\u01C1\x03\x02\x02\x02" + - "\u01C3\u01C4\x03\x02\x02\x02\u01C4\u01C8\x03\x02\x02\x02\u01C5\u01C6\x07" + - "\x0F\x02\x02\u01C6\u01C8\x05V,\x02\u01C7\u01B2\x03\x02\x02\x02\u01C7\u01C5" + - "\x03\x02\x02\x02\u01C8+\x03\x02\x02\x02\u01C9\u01CA\x05T+\x02\u01CA-\x03" + - "\x02\x02\x02\u01CB\u01CC\b\x18\x01\x02\u01CC\u0262\x058\x1D\x02\u01CD" + - "\u01CE\x05J&\x02\u01CE\u01D0\x07?\x02\x02\u01CF\u01D1\x05F$\x02\u01D0" + - "\u01CF\x03\x02\x02\x02\u01D0\u01D1\x03\x02\x02\x02\u01D1\u01D2\x03\x02" + - "\x02\x02\u01D2\u01D3\x07@\x02\x02\u01D3\u0262\x03\x02\x02\x02\u01D4\u01D5" + - "\x074\x02\x02\u01D5\u0262\x05.\x18\x1B\u01D6\u01D7\x05R*\x02\u01D7\u01D8" + - "\x07\"\x02\x02\u01D8\u01D9\x07>\x02\x02\u01D9\u01DA\x05.\x18\x17\u01DA" + - "\u0262\x03\x02\x02\x02\u01DB\u01DC\x07-\x02\x02\u01DC\u01DD\x07\x04\x02" + - "\x02\u01DD\u01E2\x05.\x18\x02\u01DE\u01DF\x07\n\x02\x02\u01DF\u01E1\x05" + - ".\x18\x02\u01E0\u01DE\x03\x02\x02\x02\u01E1\u01E4\x03\x02\x02\x02\u01E2" + - "\u01E0\x03\x02\x02\x02\u01E2\u01E3\x03\x02\x02\x02\u01E3\u01E6\x03\x02" + - "\x02\x02\u01E4\u01E2\x03\x02\x02\x02\u01E5\u01E7\x07\n\x02\x02\u01E6\u01E5" + - "\x03\x02\x02\x02\u01E6\u01E7\x03\x02\x02\x02\u01E7\u01E8\x03\x02\x02\x02" + - "\u01E8\u01E9\x07\x05\x02\x02\u01E9\u0262\x03\x02\x02\x02\u01EA\u01EB\x07" + - ".\x02\x02\u01EB\u01EC\x07\x04\x02\x02\u01EC\u01F1\x05.\x18\x02\u01ED\u01EE" + - "\x07\n\x02\x02\u01EE\u01F0"; + "\x03\x02\x02\x02\u018D\u01A4\x07\x05\x02\x02\u018E\u01A4\x07\x1E\x02\x02" + + "\u018F\u01A4\x07\x1F\x02\x02\u0190\u01A4\x07 \x02\x02\u0191\u01A4\x05" + + "(\x15\x02\u0192\u01A4\x05R*\x02\u0193\u0194\x07?\x02\x02\u0194\u0195\x05" + + "&\x14\x02\u0195\u0196\x07@\x02\x02\u0196\u01A4\x03\x02\x02\x02\u0197\u0198" + + "\x05R*\x02\u0198\u0199\x07\r\x02\x02\u0199\u019E\x05&\x14\x02\u019A\u019B" + + "\x07\n\x02\x02\u019B\u019D\x05&\x14\x02\u019C\u019A\x03\x02\x02\x02\u019D" + + "\u01A0\x03\x02\x02\x02\u019E\u019C\x03\x02\x02\x02\u019E\u019F\x03\x02" + + "\x02\x02\u019F\u01A1\x03\x02\x02\x02\u01A0\u019E\x03\x02\x02\x02\u01A1" + + "\u01A2\x07\x0E\x02\x02\u01A2\u01A4\x03\x02\x02\x02\u01A3\u015D\x03\x02" + + "\x02\x02\u01A3\u016F\x03\x02\x02\x02\u01A3\u0174\x03\x02\x02\x02\u01A3" + + "\u0179\x03\x02\x02\x02\u01A3\u0189\x03\x02\x02\x02\u01A3\u018E\x03\x02" + + "\x02\x02\u01A3\u018F\x03\x02\x02\x02\u01A3\u0190\x03\x02\x02\x02\u01A3" + + "\u0191\x03\x02\x02\x02\u01A3\u0192\x03\x02\x02\x02\u01A3\u0193\x03\x02" + + "\x02\x02\u01A3\u0197\x03\x02\x02\x02\u01A4\u01AD\x03\x02\x02\x02\u01A5" + + "\u01A6\f\x10\x02\x02\u01A6\u01A7\x07\x1C\x02\x02\u01A7\u01AC\x05&\x14" + + "\x10\u01A8\u01A9\f\x0F\x02\x02\u01A9\u01AA\x07\x1D\x02\x02\u01AA\u01AC" + + "\x05&\x14\x0F\u01AB\u01A5\x03\x02\x02\x02\u01AB\u01A8\x03\x02\x02\x02" + + "\u01AC\u01AF\x03\x02\x02\x02\u01AD\u01AB\x03\x02\x02\x02\u01AD\u01AE\x03" + + "\x02\x02\x02\u01AE\'\x03\x02\x02\x02\u01AF\u01AD\x03\x02\x02\x02\u01B0" + + "\u01B1\x07C\x02\x02\u01B1)\x03\x02\x02\x02\u01B2\u01B3\x05,\x17\x02\u01B3" + + "\u01B4\x07\x07\x02\x02\u01B4\u01B5\x05&\x14\x02\u01B5\u01BD\x03\x02\x02" + + "\x02\u01B6\u01B7\x07\n\x02\x02\u01B7\u01B8\x05,\x17\x02\u01B8\u01B9\x07" + + "\x07\x02\x02\u01B9\u01BA\x05&\x14\x02\u01BA\u01BC\x03\x02\x02\x02\u01BB" + + "\u01B6\x03\x02\x02\x02\u01BC\u01BF\x03\x02\x02\x02\u01BD\u01BB\x03\x02" + + "\x02\x02\u01BD\u01BE\x03\x02\x02\x02\u01BE\u01C3\x03\x02\x02\x02\u01BF" + + "\u01BD\x03\x02\x02\x02\u01C0\u01C4\x07\n\x02\x02\u01C1\u01C2\x07\x0F\x02" + + "\x02\u01C2\u01C4\x05V,\x02\u01C3\u01C0\x03\x02\x02\x02\u01C3\u01C1\x03" + + "\x02\x02\x02\u01C3\u01C4\x03\x02\x02\x02\u01C4\u01C8\x03\x02\x02\x02\u01C5" + + "\u01C6\x07\x0F\x02\x02\u01C6\u01C8\x05V,\x02\u01C7\u01B2\x03\x02\x02\x02" + + "\u01C7\u01C5\x03\x02\x02\x02\u01C8+\x03\x02\x02\x02\u01C9\u01CA\x05T+" + + "\x02\u01CA-\x03\x02\x02\x02\u01CB\u01CC\b\x18\x01\x02\u01CC\u0262\x05" + + "8\x1D\x02\u01CD\u01CE\x05J&\x02\u01CE\u01D0\x07?\x02\x02\u01CF\u01D1\x05" + + "F$\x02\u01D0\u01CF\x03\x02\x02\x02\u01D0\u01D1\x03\x02\x02\x02\u01D1\u01D2" + + "\x03\x02\x02\x02\u01D2\u01D3\x07@\x02\x02\u01D3\u0262\x03\x02\x02\x02" + + "\u01D4\u01D5\x074\x02\x02\u01D5\u0262\x05.\x18\x1B\u01D6\u01D7\x05R*\x02" + + "\u01D7\u01D8\x07\"\x02\x02\u01D8\u01D9\x07>\x02\x02\u01D9\u01DA\x05.\x18" + + "\x17\u01DA\u0262\x03\x02\x02\x02\u01DB\u01DC\x07-\x02\x02\u01DC\u01DD" + + "\x07\x04\x02\x02\u01DD\u01E2\x05.\x18\x02\u01DE\u01DF\x07\n\x02\x02\u01DF" + + "\u01E1\x05.\x18\x02\u01E0\u01DE\x03\x02\x02\x02\u01E1\u01E4\x03\x02\x02" + + "\x02\u01E2\u01E0\x03\x02\x02\x02\u01E2\u01E3\x03\x02\x02\x02\u01E3\u01E6" + + "\x03\x02\x02\x02\u01E4\u01E2\x03\x02\x02\x02\u01E5\u01E7\x07\n\x02\x02" + + "\u01E6\u01E5\x03\x02\x02\x02\u01E6\u01E7\x03\x02\x02\x02\u01E7\u01E8\x03" + + "\x02\x02\x02\u01E8\u01E9\x07\x05\x02\x02\u01E9\u0262\x03\x02\x02\x02\u01EA" + + "\u01EB\x07.\x02\x02\u01EB\u01EC\x07\x04\x02\x02\u01EC\u01F1\x05.\x18\x02" + + "\u01ED\u01EE\x07\n\x02\x02\u01EE\u01F0"; private static readonly _serializedATNSegment1: string = "\x05.\x18\x02\u01EF\u01ED\x03\x02\x02\x02\u01F0\u01F3\x03\x02\x02\x02" + "\u01F1\u01EF\x03\x02\x02\x02\u01F1\u01F2\x03\x02\x02\x02\u01F2\u01F5\x03" + @@ -4078,7 +4073,7 @@ export class QuintParser extends Parser { "\x02\x02\x02\u031EU\x03\x02\x02\x02\u031F\u0320\t\t\x02\x02\u0320W\x03" + "\x02\x02\x02Z[bks\x8C\x96\x9E\xA1\xAB\xAE\xB1\xB5\xB9\xBC\xBE\xCC\xD5" + "\xDA\xDD\xE4\xEC\xF2\xF7\u0102\u010A\u0110\u0114\u0116\u0121\u0123\u0132" + - "\u013A\u0149\u0151\u0153\u0164\u0167\u016A\u0181\u0185\u018B\u0197\u01A6" + + "\u013A\u0149\u0151\u0153\u0164\u0167\u016A\u0181\u0185\u018B\u019E\u01A3" + "\u01AB\u01AD\u01BD\u01C3\u01C7\u01D0\u01E2\u01E6\u01F1\u01F5\u0201\u0205" + "\u0210\u0214\u021C\u0226\u022A\u0234\u0238\u0242\u0245\u0248\u0261\u0288" + "\u028B\u0292\u0294\u029B\u02A2\u02A9\u02B2\u02B5\u02C0\u02C4\u02D0\u02D7" + @@ -5553,9 +5548,12 @@ export class TypeParenContext extends TypeContext { } } export class TypeAppContext extends TypeContext { - public _typeCtor!: TypeContext; + public _typeCtor!: QualIdContext; public _type!: TypeContext; public _typeArg: TypeContext[] = []; + public qualId(): QualIdContext { + return this.getRuleContext(0, QualIdContext); + } public type(): TypeContext[]; public type(i: number): TypeContext; public type(i?: number): TypeContext | TypeContext[] { diff --git a/quint/src/graphics.ts b/quint/src/graphics.ts index 1bcfb5575..d1fcbcb15 100644 --- a/quint/src/graphics.ts +++ b/quint/src/graphics.ts @@ -207,8 +207,6 @@ export function prettyQuintType(type: QuintType): Doc { const args = type.args.map(prettyQuintType) return group([prettyQuintType(type), text('['), ...args, text(']')]) } - case 'abs': - fail('internal error: type abstraction should never be printed for users in graphics') } } diff --git a/quint/src/ir/IRTransformer.ts b/quint/src/ir/IRTransformer.ts index 5cf1389c1..e095b7347 100644 --- a/quint/src/ir/IRTransformer.ts +++ b/quint/src/ir/IRTransformer.ts @@ -86,8 +86,6 @@ export class IRTransformer { exitRecordType?: (type: t.QuintRecordType) => t.QuintRecordType enterSumType?: (type: t.QuintSumType) => t.QuintSumType exitSumType?: (type: t.QuintSumType) => t.QuintSumType - enterAbsType?: (type: t.QuintAbsType) => t.QuintAbsType - exitAbsType?: (type: t.QuintAbsType) => t.QuintAbsType enterAppType?: (type: t.QuintAppType) => t.QuintAppType exitAppType?: (type: t.QuintAppType) => t.QuintAppType @@ -259,28 +257,12 @@ export function transformType(transformer: IRTransformer, type: t.QuintType): t. } break - case 'abs': - { - if (transformer.enterAbsType) { - newType = transformer.enterAbsType(newType) - } - - newType.vars = newType.vars.map(v => transformType(transformer, v) as t.QuintVarType) - newType.body = transformType(transformer, newType.body) - - if (transformer.exitAbsType) { - newType = transformer.exitAbsType(newType) - } - } - break - case 'app': { if (transformer.enterAppType) { newType = transformer.enterAppType(newType) } - newType.ctor = transformType(transformer, newType.ctor) newType.args = newType.args.map(v => transformType(transformer, v)) if (transformer.exitAppType) { diff --git a/quint/src/ir/IRVisitor.ts b/quint/src/ir/IRVisitor.ts index 879eb112b..f321ef8df 100644 --- a/quint/src/ir/IRVisitor.ts +++ b/quint/src/ir/IRVisitor.ts @@ -95,8 +95,6 @@ export interface IRVisitor { exitSumType?: (_type: t.QuintSumType) => void enterAppType?: (_type: t.QuintAppType) => void exitAppType?: (_type: t.QuintAppType) => void - enterAbsType?: (_type: t.QuintAbsType) => void - exitAbsType?: (_type: t.QuintAbsType) => void /** Row types */ enterRow?: (_row: t.Row) => void @@ -249,13 +247,6 @@ export function walkType(visitor: IRVisitor, type: t.QuintType): void { visitor.exitSumType?.(type) break - case 'abs': - visitor.enterAbsType?.(type) - type.vars.map(t => walkType(visitor, t)) - walkType(visitor, type.body) - visitor.exitAbsType?.(type) - break - case 'app': visitor.enterAppType?.(type) walkType(visitor, type.ctor) diff --git a/quint/src/ir/IRprinting.ts b/quint/src/ir/IRprinting.ts index 274ce939e..16acc3e0e 100644 --- a/quint/src/ir/IRprinting.ts +++ b/quint/src/ir/IRprinting.ts @@ -187,11 +187,6 @@ export function typeToString(type: QuintType): string { case 'sum': { return sumToString(type) } - case 'abs': { - const vars = type.vars.map(typeToString).join(', ') - const body = typeToString(type.body) - return `Λ(${vars}).${body}` - } case 'app': { const abs = typeToString(type.ctor) const args = type.args.map(typeToString).join(', ') diff --git a/quint/src/ir/quintTypes.ts b/quint/src/ir/quintTypes.ts index cddd85672..f8322d67a 100644 --- a/quint/src/ir/quintTypes.ts +++ b/quint/src/ir/quintTypes.ts @@ -98,26 +98,20 @@ export function sumType(labelTypePairs: [string, QuintType][], rowVar?: string, return { kind: 'sum', fields: { kind: 'row', fields, other }, id } } -/** Type abstraction +/** + * Type application * - * In System-F, this corresponds to Λτ1.(...(Λτ2.(Τ)). - */ -export interface QuintAbsType extends WithOptionalId { - kind: 'abs' - vars: QuintVarType[] /** The bound variables */ - body: QuintType /** The body of the abstraction */ -} - -/** Type application: (Λτ.Τ)υ + * E.g., * - * In System-F, this corresponds to (Λτ.Τ)υ + * ``` + * T[int, str] + * ``` * - * Type application is only well well-formed if `ctor` is (resolved to) an - * n-ary type abstraction, and `args.length === n` + * for a type constant `T`. */ export interface QuintAppType extends WithOptionalId { kind: 'app' - ctor: QuintType /** The type "constructor" applied */ + ctor: QuintConstType /** The type constructor applied */ args: QuintType[] /** The arguments to which the constructor is applied */ } @@ -137,7 +131,6 @@ export type QuintType = | QuintTupleType | QuintRecordType | QuintSumType - | QuintAbsType | QuintAppType /** diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index f14f48e58..0b6b296de 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -20,7 +20,6 @@ import { } from '../ir/quintIr' import { ConcreteFixedRow, - QuintAbsType, QuintAppType, QuintConstType, QuintSumType, @@ -364,19 +363,16 @@ export class ToIrListener implements QuintListener { const defHead = ctx.typeDefHead() const name = defHead._typeName.text // NOTE: `rhs` must precede `typeVariables` due to the stack order! - const rhs = this.popType().unwrap(() => + const type = this.popType().unwrap(() => fail('internal error: type alias declaration parsed with no right hand side') ) - const typeVariables: QuintVarType[] = this.popTypeDefHeadTypeVars(defHead) - if (name[0].match('[a-z]')) { this.errors.push(lowercaseTypeError(id, name)) } - const type: QuintType = - typeVariables.length === 0 - ? rhs // A monomorphic type declaration - : { id: this.getId(ctx), kind: 'abs', vars: typeVariables, body: rhs } // A polymorphic type declaration + // TODO: Check that variables have all been declared + // TODO: Add types to declaration + const _typeVariables: QuintVarType[] = this.popTypeDefHeadTypeVars(defHead) const def: QuintTypeDef = { id, kind: 'typedef', name, type } this.declarationStack.push(def) @@ -391,16 +387,13 @@ export class ToIrListener implements QuintListener { const defHead = ctx.typeDefHead() const name = defHead._typeName.text - const typeVars = this.popTypeDefHeadTypeVars(defHead) // Build the type declaraion const fields: RowField[] = popMany(this.variantStack, this.variantStack.length, this.undefinedVariant(ctx)) const row: ConcreteFixedRow = { kind: 'row', fields, other: { kind: 'empty' } } - const sumType: QuintSumType = { id, kind: 'sum', fields: row } - const type: QuintSumType | QuintAbsType = - typeVars.length === 0 - ? sumType // A monomorphic type - : { id: this.getId(ctx), kind: 'abs', vars: typeVars, body: sumType } // A polymorphic type + const type: QuintSumType = { id, kind: 'sum', fields: row } + // TODO: Check all vars in body are bound + const _typeVars = this.popTypeDefHeadTypeVars(defHead) const def: QuintTypeDef = { id: id, @@ -410,11 +403,7 @@ export class ToIrListener implements QuintListener { } // Used for annotations in the variant constructors - const typeConst: QuintConstType = { id, kind: 'const', name } - const constructorReturnType: QuintConstType | QuintAppType = - typeVars.length === 0 - ? typeConst // For a monomorphic type annotation - : { id: this.getId(ctx), kind: 'app', ctor: typeConst, args: typeVars } // A polymorphic type annotation + const constructorReturnType: QuintConstType = { id, kind: 'const', name } // Generate all the variant constructors implied by a variant type definition // a variant constructor is an operator that injects an expression @@ -1092,7 +1081,7 @@ export class ToIrListener implements QuintListener { .reverse() // The next type on the stack after the args should be the applied // type constructor - const ctor = this.popType().unwrap() + const ctor: QuintConstType = { id: this.getId(ctx), kind: 'const', name: ctx._typeCtor.text } this.typeStack.push({ id, kind: 'app', ctor, args }) } diff --git a/quint/src/quintAnalyzer.ts b/quint/src/quintAnalyzer.ts index 5d64b36ef..e7bc4b7c9 100644 --- a/quint/src/quintAnalyzer.ts +++ b/quint/src/quintAnalyzer.ts @@ -42,16 +42,16 @@ export type AnalysisResult = [QuintError[], AnalysisOutput] */ export function analyzeModules(lookupTable: LookupTable, quintModules: QuintModule[]): AnalysisResult { const analyzer = new QuintAnalyzer(lookupTable) - quintModules.map(m => analyzer.analyze(m)) + quintModules.map(m => analyzer.analyzeDeclarations(m.declarations)) return analyzer.getResult() } /** - * Analyzes a single Quint definition incrementally and returns the analysis result. + * Analyzes declarations incrementally and returns the analysis result. * * @param analysisOutput - The previous analysis output to be used as a starting point. * @param lookupTable - The lookup tables for the modules. - * @param declaration - The Quint declaration to be analyzed. + * @param declarations - The Quint declarations to be analyzed. * @returns A tuple with a list of errors and the analysis output. */ export function analyzeInc( @@ -90,10 +90,6 @@ class QuintAnalyzer { this.modeChecker = new ModeChecker(previousOutput?.modes) } - analyze(module: QuintModule): void { - this.analyzeDeclarations(module.declarations) - } - analyzeDeclarations(decls: QuintDeclaration[]): void { const [typeErrMap, types] = this.typeInferrer.inferTypes(decls) const [effectErrMap, effects] = this.effectInferrer.inferEffects(decls) diff --git a/quint/src/types/constraintGenerator.ts b/quint/src/types/constraintGenerator.ts index f92f96a9b..4ac413bcf 100644 --- a/quint/src/types/constraintGenerator.ts +++ b/quint/src/types/constraintGenerator.ts @@ -110,6 +110,23 @@ export class ConstraintGeneratorVisitor implements IRVisitor { // Nested lambdas add new entries to the stack, and pop them when exiting. private freeNames: { typeVariables: Set; rowVariables: Set }[] = [] + // int[a] + // + // TODO: Free type variables must also use the variables in the constructor + // + // type T[a] = Set[a] + // type U[a, b] = (Set[a], List[b]) + // + // U[int, int] + // val x = (Set(1,2), List(1,2)) + // val f : a => U[a, U[a, b]] = ... + // + // U[a, b] =.= U[int, int] /\ a =.= b /\ typeOf(x) =.= (Set[a], List[b]) + // + // type MapT[a,b] = (Set[a], a => b) => Set[b] + // + // def map(s: Set[a], f: a => b): Set[b] = ... + // getResult(): [Map, Map] { return [this.errors, this.types] } @@ -121,13 +138,11 @@ export class ConstraintGeneratorVisitor implements IRVisitor { exitDef(def: QuintDef) { if (this.constraints.length > 0) { this.solveConstraints().map(subs => { - if (!isAnnotatedDef(def)) { - return + if (isAnnotatedDef(def)) { + checkAnnotationGenerality(subs, def.typeAnnotation).mapLeft(err => + this.errors.set(def.typeAnnotation?.id ?? def.id, err) + ) } - - checkAnnotationGenerality(subs, def.typeAnnotation).mapLeft(err => - this.errors.set(def.typeAnnotation?.id ?? def.id, err) - ) }) } } @@ -193,7 +208,7 @@ export class ConstraintGeneratorVisitor implements IRVisitor { ) // We want `definedSignature` computed before the fresh variable `a` so that the - // numbering of ther fresh variables stays in order, with `a`, used for return types, + // numbering of their fresh variables stays in order, with `a`, used for return types, // bearing the highest number. const definedSignature = this.typeForName(e.opcode, e.id, e.args.length) const a: QuintType = { kind: 'var', name: this.freshVarGenerator.freshVar('_t') } @@ -300,6 +315,8 @@ export class ConstraintGeneratorVisitor implements IRVisitor { this.addToResults(e.id, this.fetchResult(e.expr.id)) } + // TODO: On type app exit, add constraints for the type operators? + // TODO: Need similar logic on exiting a type def (to create a scheme for a lambda) and exitOpDef(e: QuintOpDef) { if (this.errors.size !== 0) { return diff --git a/quint/src/types/inferrer.ts b/quint/src/types/inferrer.ts index 8889765e8..16d26f8c0 100644 --- a/quint/src/types/inferrer.ts +++ b/quint/src/types/inferrer.ts @@ -24,17 +24,18 @@ import { simplify } from './simplification' export type TypeInferenceResult = [Map, Map] +// TODO: Get rid of this class? It is very shallow. What do we need it for? export class TypeInferrer extends ConstraintGeneratorVisitor { constructor(table: LookupTable, types?: Map) { super(solveConstraint, table, types) } /** - * Infers an type for each expression in a list of QuintDeclarations + * Infers a type for each expression in a list of QuintDeclarations * * @param declarations: the list of QuintDeclarations to infer types for * - * @returns a map from expression ids to their types and a map from expression + * @returns a map from expression ids to their type schemes and a map from expression * ids to the corresponding error for any problematic expressions. */ inferTypes(declarations: QuintDeclaration[]): TypeInferenceResult { diff --git a/quint/src/types/substitutions.ts b/quint/src/types/substitutions.ts index a1f4f9c73..1e426b1dc 100644 --- a/quint/src/types/substitutions.ts +++ b/quint/src/types/substitutions.ts @@ -97,11 +97,11 @@ export function applySubstitution(table: LookupTable, subs: Substitutions, t: Qu // start as one, and applying substitions cannot result in a wider type fields: applySubstitutionToRow(table, subs, t.fields) as ConcreteFixedRow, } - - case 'abs': - throw new Error(`Not yet implemented: https://github.com/informalsystems/quint/issues/1298`) case 'app': - throw new Error(`Not yet implemented: https://github.com/informalsystems/quint/issues/1298`) + return { + ...t, + args: t.args.map(a => applySubstitution(table, subs, a)), + } // The basic types have no variables, so don't require substitution case 'int': diff --git a/quint/test/ir/IRVisitor.test.ts b/quint/test/ir/IRVisitor.test.ts index 6c9da5333..34b024d5b 100644 --- a/quint/test/ir/IRVisitor.test.ts +++ b/quint/test/ir/IRVisitor.test.ts @@ -856,30 +856,6 @@ describe('walkModule', () => { assert.deepEqual(visitor.exited.map(typeToString), exitedTypes) }) - it('finds type abstractions', () => { - const quintModule = buildModuleWithDecls(['type StrMap[a] = str -> a']) - - class TestVisitor implements IRVisitor { - entered: QuintType[] = [] - exited: QuintType[] = [] - - enterAbsType(type: QuintType): void { - this.entered.push(type) - } - - exitAbsType(type: QuintType): void { - this.exited.push(type) - } - } - - const expectedTypes = ['Λ(a).(str -> a)'] - - const visitor = new TestVisitor() - walkModule(visitor, quintModule) - assert.deepEqual(visitor.entered.map(typeToString), expectedTypes) - assert.deepEqual(visitor.exited.map(typeToString), expectedTypes) - }) - it('finds type applications', () => { const quintModule = buildModuleWithDecls(['val strMap: StrMap[int] = Map("a" -> 1, "b" -> 2)']) class TestVisitor implements IRVisitor { diff --git a/quint/test/types/inferrer.test.ts b/quint/test/types/inferrer.test.ts index 112415dbc..9fe0c58ba 100644 --- a/quint/test/types/inferrer.test.ts +++ b/quint/test/types/inferrer.test.ts @@ -395,6 +395,24 @@ module B { ) }) + it('checks correct polymorphic types', () => { + const defs = [ + 'type Result[ok, err] = Ok(ok) | Err(err)', + `def result_map(r: Result[a, e], f: a => b): Result[b, e] = + match r { + | Ok(x) => Ok(f(x)) + | Err(_) => r + }`, + ] + + const [errors, table] = inferTypesForDefs(defs) + assert.sameDeepMembers([...errors.entries()], []) + assert.sameDeepMembers( + [...table.entries()].map(([id, t]) => [id, typeSchemeToString(t)]), + [] + ) + }) + it('fails when types are not unifiable', () => { const defs = ['def a = 1.map(p => p + 10)'] diff --git a/quint/testFixture/_1045polymorphicTypeDecl.json b/quint/testFixture/_1045polymorphicTypeDecl.json index 1bdc18f98..e0af39456 100644 --- a/quint/testFixture/_1045polymorphicTypeDecl.json +++ b/quint/testFixture/_1045polymorphicTypeDecl.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":35,"name":"m","declarations":[{"id":14,"kind":"typedef","name":"MapApp","type":{"id":15,"kind":"abs","vars":[{"id":7,"kind":"var","name":"a"},{"id":8,"kind":"var","name":"b"}],"body":{"id":13,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":11,"kind":"fun","arg":{"id":9,"kind":"var","name":"a"},"res":{"id":10,"kind":"var","name":"b"}}},{"fieldName":"1","fieldType":{"id":12,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}}}},{"id":20,"name":"Result","kind":"typedef","type":{"id":21,"kind":"abs","vars":[{"id":16,"kind":"var","name":"ok"},{"id":17,"kind":"var","name":"err"}],"body":{"id":20,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":18,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":19,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}}}},{"id":5,"kind":"typedef","name":"MonoPair","type":{"id":6,"kind":"abs","vars":[{"id":1,"kind":"var","name":"a"}],"body":{"id":4,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":2,"kind":"var","name":"a"}},{"fieldName":"1","fieldType":{"id":3,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}}}},{"id":28,"kind":"def","name":"Ok","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":18,"kind":"var","name":"ok"}],"res":{"id":22,"kind":"app","ctor":{"id":20,"kind":"const","name":"Result"},"args":[{"id":16,"kind":"var","name":"ok"},{"id":17,"kind":"var","name":"err"}]}},"expr":{"id":27,"kind":"lambda","params":[{"id":24,"name":"__OkParam"}],"qualifier":"def","expr":{"id":26,"kind":"app","opcode":"variant","args":[{"id":23,"kind":"str","value":"Ok"},{"kind":"name","name":"__OkParam","id":25}]}}},{"id":34,"kind":"def","name":"Err","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":19,"kind":"var","name":"err"}],"res":{"id":22,"kind":"app","ctor":{"id":20,"kind":"const","name":"Result"},"args":[{"id":16,"kind":"var","name":"ok"},{"id":17,"kind":"var","name":"err"}]}},"expr":{"id":33,"kind":"lambda","params":[{"id":30,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":32,"kind":"app","opcode":"variant","args":[{"id":29,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":31}]}}}]}],"table":{"20":{"id":20,"name":"Result","kind":"typedef","type":{"id":21,"kind":"abs","vars":[{"id":16,"kind":"var","name":"ok"},{"id":17,"kind":"var","name":"err"}],"body":{"id":20,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":18,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":19,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}}}},"25":{"id":24,"name":"__OkParam","kind":"param"},"31":{"id":30,"name":"__ErrParam","kind":"param"}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":31,"name":"m","declarations":[{"id":13,"kind":"typedef","name":"MapApp","type":{"id":12,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":10,"kind":"fun","arg":{"id":8,"kind":"var","name":"a"},"res":{"id":9,"kind":"var","name":"b"}}},{"fieldName":"1","fieldType":{"id":11,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}}},{"id":18,"name":"Result","kind":"typedef","type":{"id":18,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":16,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":17,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}}},{"id":5,"kind":"typedef","name":"MonoPair","type":{"id":4,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":2,"kind":"var","name":"a"}},{"fieldName":"1","fieldType":{"id":3,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}}},{"id":24,"kind":"def","name":"Ok","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":16,"kind":"var","name":"ok"}],"res":{"id":18,"kind":"const","name":"Result"}},"expr":{"id":23,"kind":"lambda","params":[{"id":20,"name":"__OkParam"}],"qualifier":"def","expr":{"id":22,"kind":"app","opcode":"variant","args":[{"id":19,"kind":"str","value":"Ok"},{"kind":"name","name":"__OkParam","id":21}]}}},{"id":30,"kind":"def","name":"Err","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":17,"kind":"var","name":"err"}],"res":{"id":18,"kind":"const","name":"Result"}},"expr":{"id":29,"kind":"lambda","params":[{"id":26,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":28,"kind":"app","opcode":"variant","args":[{"id":25,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":27}]}}}]}],"table":{"18":{"id":18,"name":"Result","kind":"typedef","type":{"id":18,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":16,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":17,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}}},"21":{"id":20,"name":"__OkParam","kind":"param"},"27":{"id":26,"name":"__ErrParam","kind":"param"}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1045polymorphicTypeDecl.map.json b/quint/testFixture/_1045polymorphicTypeDecl.map.json index b83f0ae3a..598ba96ac 100644 --- a/quint/testFixture/_1045polymorphicTypeDecl.map.json +++ b/quint/testFixture/_1045polymorphicTypeDecl.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1045polymorphicTypeDecl.qnt"},"map":{"1":[0,{"line":1,"col":16,"index":27},{"line":1,"col":16,"index":27}],"2":[0,{"line":1,"col":22,"index":33},{"line":1,"col":22,"index":33}],"3":[0,{"line":1,"col":25,"index":36},{"line":1,"col":25,"index":36}],"4":[0,{"line":1,"col":21,"index":32},{"line":1,"col":26,"index":37}],"5":[0,{"line":1,"col":2,"index":13},{"line":1,"col":26,"index":37}],"6":[0,{"line":1,"col":2,"index":13},{"line":1,"col":26,"index":37}],"7":[0,{"line":2,"col":14,"index":53},{"line":2,"col":14,"index":53}],"8":[0,{"line":2,"col":17,"index":56},{"line":2,"col":17,"index":56}],"9":[0,{"line":2,"col":23,"index":62},{"line":2,"col":23,"index":62}],"10":[0,{"line":2,"col":28,"index":67},{"line":2,"col":28,"index":67}],"11":[0,{"line":2,"col":23,"index":62},{"line":2,"col":28,"index":67}],"12":[0,{"line":2,"col":31,"index":70},{"line":2,"col":31,"index":70}],"13":[0,{"line":2,"col":22,"index":61},{"line":2,"col":32,"index":71}],"14":[0,{"line":2,"col":2,"index":41},{"line":2,"col":32,"index":71}],"15":[0,{"line":2,"col":2,"index":41},{"line":2,"col":32,"index":71}],"16":[0,{"line":3,"col":14,"index":87},{"line":3,"col":15,"index":88}],"17":[0,{"line":3,"col":18,"index":91},{"line":3,"col":20,"index":93}],"18":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"19":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"20":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"21":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"22":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"23":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"24":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"25":[0,{"line":4,"col":6,"index":104},{"line":4,"col":7,"index":105}],"26":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"27":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"28":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"29":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"30":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"31":[0,{"line":5,"col":6,"index":117},{"line":5,"col":8,"index":119}],"32":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"33":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"34":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"35":[0,{"line":0,"col":0,"index":0},{"line":6,"col":126,"index":126}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1045polymorphicTypeDecl.qnt"},"map":{"1":[0,{"line":1,"col":16,"index":27},{"line":1,"col":16,"index":27}],"2":[0,{"line":1,"col":22,"index":33},{"line":1,"col":22,"index":33}],"3":[0,{"line":1,"col":25,"index":36},{"line":1,"col":25,"index":36}],"4":[0,{"line":1,"col":21,"index":32},{"line":1,"col":26,"index":37}],"5":[0,{"line":1,"col":2,"index":13},{"line":1,"col":26,"index":37}],"6":[0,{"line":2,"col":14,"index":53},{"line":2,"col":14,"index":53}],"7":[0,{"line":2,"col":17,"index":56},{"line":2,"col":17,"index":56}],"8":[0,{"line":2,"col":23,"index":62},{"line":2,"col":23,"index":62}],"9":[0,{"line":2,"col":28,"index":67},{"line":2,"col":28,"index":67}],"10":[0,{"line":2,"col":23,"index":62},{"line":2,"col":28,"index":67}],"11":[0,{"line":2,"col":31,"index":70},{"line":2,"col":31,"index":70}],"12":[0,{"line":2,"col":22,"index":61},{"line":2,"col":32,"index":71}],"13":[0,{"line":2,"col":2,"index":41},{"line":2,"col":32,"index":71}],"14":[0,{"line":3,"col":14,"index":87},{"line":3,"col":15,"index":88}],"15":[0,{"line":3,"col":18,"index":91},{"line":3,"col":20,"index":93}],"16":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"17":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"18":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"19":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"20":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"21":[0,{"line":4,"col":6,"index":104},{"line":4,"col":7,"index":105}],"22":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"23":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"24":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"25":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"26":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"27":[0,{"line":5,"col":6,"index":117},{"line":5,"col":8,"index":119}],"28":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"29":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"30":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"31":[0,{"line":0,"col":0,"index":0},{"line":6,"col":126,"index":126}]}} \ No newline at end of file From 081a1f69b692a4306763cd7fdccf268352997f74 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 20 Feb 2024 22:15:28 -0500 Subject: [PATCH 249/388] Add type paramaters to type declarations --- quint/src/generated/Quint.g4 | 2 +- quint/src/generated/Quint.interp | 2 +- quint/src/generated/QuintParser.ts | 1576 ++++++++--------- quint/src/ir/quintIr.ts | 8 +- quint/src/parsing/ToIrListener.ts | 69 +- quint/src/parsing/parseErrors.ts | 16 + quint/src/quintError.ts | 2 + quint/test/names/resolver.test.ts | 2 +- .../test/parsing/quintParserFrontend.test.ts | 18 + quint/testFixture/SuperSpec.json | 2 +- quint/testFixture/_1043sumTypeDecl.json | 2 +- quint/testFixture/_1044matchExpression.json | 2 +- .../testFixture/_1045polymorphicTypeDecl.json | 2 +- .../_1045polymorphicTypeDecl.map.json | 2 +- 14 files changed, 872 insertions(+), 833 deletions(-) diff --git a/quint/src/generated/Quint.g4 b/quint/src/generated/Quint.g4 index a205cc230..5e571e491 100644 --- a/quint/src/generated/Quint.g4 +++ b/quint/src/generated/Quint.g4 @@ -68,7 +68,7 @@ typeDef | 'type' typeDefHead '=' sumTypeDefinition # typeSumDef ; -typeDefHead : typeName=qualId ('[' typeVars+=typeVar(',' typeVars+=typeVar)* ']')?; +typeDefHead : typeName=qualId ('[' typeVars+=LOW_ID(',' typeVars+=LOW_ID)* ']')?; sumTypeDefinition : '|'? typeSumVariant ('|' typeSumVariant)* ; diff --git a/quint/src/generated/Quint.interp b/quint/src/generated/Quint.interp index 85206e0b9..f54adf8d9 100644 --- a/quint/src/generated/Quint.interp +++ b/quint/src/generated/Quint.interp @@ -191,4 +191,4 @@ identifier atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 802, 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, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 3, 2, 6, 2, 90, 10, 2, 13, 2, 14, 2, 91, 3, 2, 3, 2, 3, 3, 7, 3, 97, 10, 3, 12, 3, 14, 3, 100, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 106, 10, 3, 12, 3, 14, 3, 109, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 114, 10, 4, 12, 4, 14, 4, 117, 11, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 141, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 149, 10, 6, 12, 6, 14, 6, 152, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 159, 10, 6, 3, 6, 5, 6, 162, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 170, 10, 6, 12, 6, 14, 6, 173, 11, 6, 5, 6, 175, 10, 6, 3, 6, 5, 6, 178, 10, 6, 3, 6, 3, 6, 5, 6, 182, 10, 6, 3, 6, 3, 6, 5, 6, 186, 10, 6, 3, 6, 5, 6, 189, 10, 6, 5, 6, 191, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 205, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 212, 10, 8, 12, 8, 14, 8, 215, 11, 8, 3, 8, 3, 8, 5, 8, 219, 10, 8, 3, 9, 5, 9, 222, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 227, 10, 9, 12, 9, 14, 9, 230, 11, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 237, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 243, 10, 11, 3, 11, 3, 11, 3, 11, 5, 11, 248, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 259, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 267, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 273, 10, 13, 3, 13, 3, 13, 5, 13, 277, 10, 13, 5, 13, 279, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 290, 10, 14, 5, 14, 292, 10, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 305, 10, 15, 12, 15, 14, 15, 308, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 315, 10, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 328, 10, 15, 12, 15, 14, 15, 331, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 338, 10, 15, 5, 15, 340, 10, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 355, 10, 20, 12, 20, 14, 20, 358, 11, 20, 5, 20, 360, 10, 20, 3, 20, 5, 20, 363, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 384, 10, 20, 12, 20, 14, 20, 387, 11, 20, 3, 20, 5, 20, 390, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 396, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 413, 10, 20, 12, 20, 14, 20, 416, 11, 20, 3, 20, 3, 20, 5, 20, 420, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 428, 10, 20, 12, 20, 14, 20, 431, 11, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 444, 10, 22, 12, 22, 14, 22, 447, 11, 22, 3, 22, 3, 22, 3, 22, 5, 22, 452, 10, 22, 3, 22, 3, 22, 5, 22, 456, 10, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 465, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 481, 10, 24, 12, 24, 14, 24, 484, 11, 24, 3, 24, 5, 24, 487, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 496, 10, 24, 12, 24, 14, 24, 499, 11, 24, 3, 24, 5, 24, 502, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 512, 10, 24, 12, 24, 14, 24, 515, 11, 24, 3, 24, 5, 24, 518, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 527, 10, 24, 12, 24, 14, 24, 530, 11, 24, 3, 24, 5, 24, 533, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 541, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 549, 10, 24, 12, 24, 14, 24, 552, 11, 24, 3, 24, 5, 24, 555, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 563, 10, 24, 12, 24, 14, 24, 566, 11, 24, 3, 24, 5, 24, 569, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 577, 10, 24, 12, 24, 14, 24, 580, 11, 24, 5, 24, 582, 10, 24, 3, 24, 5, 24, 585, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 610, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 649, 10, 24, 3, 24, 5, 24, 652, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 659, 10, 24, 12, 24, 14, 24, 662, 11, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 668, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 673, 10, 25, 12, 25, 14, 25, 676, 11, 25, 3, 25, 3, 25, 3, 26, 3, 26, 5, 26, 682, 10, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 691, 10, 27, 3, 27, 5, 27, 694, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 705, 10, 28, 3, 29, 3, 29, 5, 29, 709, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 719, 10, 30, 12, 30, 14, 30, 722, 11, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 728, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 6, 31, 735, 10, 31, 13, 31, 14, 31, 736, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 5, 32, 746, 10, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 5, 35, 756, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 761, 10, 36, 12, 36, 14, 36, 764, 11, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 772, 10, 37, 3, 38, 3, 38, 5, 38, 776, 10, 38, 3, 39, 3, 39, 5, 39, 780, 10, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 7, 42, 789, 10, 42, 12, 42, 14, 42, 792, 11, 42, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 798, 10, 43, 3, 44, 3, 44, 3, 44, 2, 2, 4, 38, 46, 45, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 68, 2, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 86, 2, 2, 10, 3, 2, 53, 55, 3, 2, 51, 52, 3, 2, 56, 61, 4, 2, 45, 49, 65, 66, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 51, 61, 3, 2, 42, 44, 3, 2, 67, 68, 2, 899, 2, 89, 3, 2, 2, 2, 4, 98, 3, 2, 2, 2, 6, 115, 3, 2, 2, 2, 8, 140, 3, 2, 2, 2, 10, 190, 3, 2, 2, 2, 12, 204, 3, 2, 2, 2, 14, 206, 3, 2, 2, 2, 16, 221, 3, 2, 2, 2, 18, 231, 3, 2, 2, 2, 20, 238, 3, 2, 2, 2, 22, 258, 3, 2, 2, 2, 24, 278, 3, 2, 2, 2, 26, 291, 3, 2, 2, 2, 28, 339, 3, 2, 2, 2, 30, 341, 3, 2, 2, 2, 32, 343, 3, 2, 2, 2, 34, 345, 3, 2, 2, 2, 36, 347, 3, 2, 2, 2, 38, 419, 3, 2, 2, 2, 40, 432, 3, 2, 2, 2, 42, 455, 3, 2, 2, 2, 44, 457, 3, 2, 2, 2, 46, 609, 3, 2, 2, 2, 48, 663, 3, 2, 2, 2, 50, 681, 3, 2, 2, 2, 52, 686, 3, 2, 2, 2, 54, 704, 3, 2, 2, 2, 56, 708, 3, 2, 2, 2, 58, 727, 3, 2, 2, 2, 60, 729, 3, 2, 2, 2, 62, 745, 3, 2, 2, 2, 64, 747, 3, 2, 2, 2, 66, 749, 3, 2, 2, 2, 68, 755, 3, 2, 2, 2, 70, 757, 3, 2, 2, 2, 72, 771, 3, 2, 2, 2, 74, 775, 3, 2, 2, 2, 76, 779, 3, 2, 2, 2, 78, 781, 3, 2, 2, 2, 80, 783, 3, 2, 2, 2, 82, 785, 3, 2, 2, 2, 84, 797, 3, 2, 2, 2, 86, 799, 3, 2, 2, 2, 88, 90, 5, 4, 3, 2, 89, 88, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 89, 3, 2, 2, 2, 91, 92, 3, 2, 2, 2, 92, 93, 3, 2, 2, 2, 93, 94, 7, 2, 2, 3, 94, 3, 3, 2, 2, 2, 95, 97, 7, 69, 2, 2, 96, 95, 3, 2, 2, 2, 97, 100, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 98, 99, 3, 2, 2, 2, 99, 101, 3, 2, 2, 2, 100, 98, 3, 2, 2, 2, 101, 102, 7, 3, 2, 2, 102, 103, 5, 82, 42, 2, 103, 107, 7, 4, 2, 2, 104, 106, 5, 6, 4, 2, 105, 104, 3, 2, 2, 2, 106, 109, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 107, 108, 3, 2, 2, 2, 108, 110, 3, 2, 2, 2, 109, 107, 3, 2, 2, 2, 110, 111, 7, 5, 2, 2, 111, 5, 3, 2, 2, 2, 112, 114, 7, 69, 2, 2, 113, 112, 3, 2, 2, 2, 114, 117, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 115, 116, 3, 2, 2, 2, 116, 118, 3, 2, 2, 2, 117, 115, 3, 2, 2, 2, 118, 119, 5, 8, 5, 2, 119, 7, 3, 2, 2, 2, 120, 121, 7, 6, 2, 2, 121, 122, 5, 82, 42, 2, 122, 123, 7, 7, 2, 2, 123, 124, 5, 38, 20, 2, 124, 141, 3, 2, 2, 2, 125, 126, 7, 8, 2, 2, 126, 127, 5, 82, 42, 2, 127, 128, 7, 7, 2, 2, 128, 129, 5, 38, 20, 2, 129, 141, 3, 2, 2, 2, 130, 131, 7, 9, 2, 2, 131, 132, 5, 62, 32, 2, 132, 133, 7, 62, 2, 2, 133, 134, 5, 46, 24, 2, 134, 141, 3, 2, 2, 2, 135, 141, 5, 28, 15, 2, 136, 141, 5, 10, 6, 2, 137, 141, 5, 12, 7, 2, 138, 141, 5, 24, 13, 2, 139, 141, 5, 26, 14, 2, 140, 120, 3, 2, 2, 2, 140, 125, 3, 2, 2, 2, 140, 130, 3, 2, 2, 2, 140, 135, 3, 2, 2, 2, 140, 136, 3, 2, 2, 2, 140, 137, 3, 2, 2, 2, 140, 138, 3, 2, 2, 2, 140, 139, 3, 2, 2, 2, 141, 9, 3, 2, 2, 2, 142, 143, 5, 22, 12, 2, 143, 144, 5, 74, 38, 2, 144, 145, 7, 63, 2, 2, 145, 150, 5, 66, 34, 2, 146, 147, 7, 10, 2, 2, 147, 149, 5, 66, 34, 2, 148, 146, 3, 2, 2, 2, 149, 152, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 150, 151, 3, 2, 2, 2, 151, 153, 3, 2, 2, 2, 152, 150, 3, 2, 2, 2, 153, 154, 7, 64, 2, 2, 154, 155, 7, 7, 2, 2, 155, 158, 5, 38, 20, 2, 156, 157, 7, 62, 2, 2, 157, 159, 5, 46, 24, 2, 158, 156, 3, 2, 2, 2, 158, 159, 3, 2, 2, 2, 159, 161, 3, 2, 2, 2, 160, 162, 7, 11, 2, 2, 161, 160, 3, 2, 2, 2, 161, 162, 3, 2, 2, 2, 162, 191, 3, 2, 2, 2, 163, 164, 5, 22, 12, 2, 164, 177, 5, 74, 38, 2, 165, 174, 7, 63, 2, 2, 166, 171, 5, 64, 33, 2, 167, 168, 7, 10, 2, 2, 168, 170, 5, 64, 33, 2, 169, 167, 3, 2, 2, 2, 170, 173, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 171, 172, 3, 2, 2, 2, 172, 175, 3, 2, 2, 2, 173, 171, 3, 2, 2, 2, 174, 166, 3, 2, 2, 2, 174, 175, 3, 2, 2, 2, 175, 176, 3, 2, 2, 2, 176, 178, 7, 64, 2, 2, 177, 165, 3, 2, 2, 2, 177, 178, 3, 2, 2, 2, 178, 181, 3, 2, 2, 2, 179, 180, 7, 7, 2, 2, 180, 182, 5, 38, 20, 2, 181, 179, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 185, 3, 2, 2, 2, 183, 184, 7, 62, 2, 2, 184, 186, 5, 46, 24, 2, 185, 183, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 188, 3, 2, 2, 2, 187, 189, 7, 11, 2, 2, 188, 187, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 191, 3, 2, 2, 2, 190, 142, 3, 2, 2, 2, 190, 163, 3, 2, 2, 2, 191, 11, 3, 2, 2, 2, 192, 193, 7, 12, 2, 2, 193, 205, 5, 82, 42, 2, 194, 195, 7, 12, 2, 2, 195, 196, 5, 14, 8, 2, 196, 197, 7, 62, 2, 2, 197, 198, 5, 38, 20, 2, 198, 205, 3, 2, 2, 2, 199, 200, 7, 12, 2, 2, 200, 201, 5, 14, 8, 2, 201, 202, 7, 62, 2, 2, 202, 203, 5, 16, 9, 2, 203, 205, 3, 2, 2, 2, 204, 192, 3, 2, 2, 2, 204, 194, 3, 2, 2, 2, 204, 199, 3, 2, 2, 2, 205, 13, 3, 2, 2, 2, 206, 218, 5, 82, 42, 2, 207, 208, 7, 13, 2, 2, 208, 213, 5, 40, 21, 2, 209, 210, 7, 10, 2, 2, 210, 212, 5, 40, 21, 2, 211, 209, 3, 2, 2, 2, 212, 215, 3, 2, 2, 2, 213, 211, 3, 2, 2, 2, 213, 214, 3, 2, 2, 2, 214, 216, 3, 2, 2, 2, 215, 213, 3, 2, 2, 2, 216, 217, 7, 14, 2, 2, 217, 219, 3, 2, 2, 2, 218, 207, 3, 2, 2, 2, 218, 219, 3, 2, 2, 2, 219, 15, 3, 2, 2, 2, 220, 222, 7, 15, 2, 2, 221, 220, 3, 2, 2, 2, 221, 222, 3, 2, 2, 2, 222, 223, 3, 2, 2, 2, 223, 228, 5, 18, 10, 2, 224, 225, 7, 15, 2, 2, 225, 227, 5, 18, 10, 2, 226, 224, 3, 2, 2, 2, 227, 230, 3, 2, 2, 2, 228, 226, 3, 2, 2, 2, 228, 229, 3, 2, 2, 2, 229, 17, 3, 2, 2, 2, 230, 228, 3, 2, 2, 2, 231, 236, 5, 84, 43, 2, 232, 233, 7, 63, 2, 2, 233, 234, 5, 38, 20, 2, 234, 235, 7, 64, 2, 2, 235, 237, 3, 2, 2, 2, 236, 232, 3, 2, 2, 2, 236, 237, 3, 2, 2, 2, 237, 19, 3, 2, 2, 2, 238, 239, 7, 16, 2, 2, 239, 242, 5, 82, 42, 2, 240, 241, 7, 7, 2, 2, 241, 243, 5, 38, 20, 2, 242, 240, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 244, 3, 2, 2, 2, 244, 245, 7, 62, 2, 2, 245, 247, 5, 46, 24, 2, 246, 248, 7, 11, 2, 2, 247, 246, 3, 2, 2, 2, 247, 248, 3, 2, 2, 2, 248, 21, 3, 2, 2, 2, 249, 259, 7, 17, 2, 2, 250, 259, 7, 18, 2, 2, 251, 252, 7, 19, 2, 2, 252, 259, 7, 17, 2, 2, 253, 254, 7, 19, 2, 2, 254, 259, 7, 18, 2, 2, 255, 259, 7, 20, 2, 2, 256, 259, 7, 21, 2, 2, 257, 259, 7, 22, 2, 2, 258, 249, 3, 2, 2, 2, 258, 250, 3, 2, 2, 2, 258, 251, 3, 2, 2, 2, 258, 253, 3, 2, 2, 2, 258, 255, 3, 2, 2, 2, 258, 256, 3, 2, 2, 2, 258, 257, 3, 2, 2, 2, 259, 23, 3, 2, 2, 2, 260, 261, 7, 23, 2, 2, 261, 262, 5, 32, 17, 2, 262, 263, 7, 24, 2, 2, 263, 266, 5, 68, 35, 2, 264, 265, 7, 25, 2, 2, 265, 267, 5, 36, 19, 2, 266, 264, 3, 2, 2, 2, 266, 267, 3, 2, 2, 2, 267, 279, 3, 2, 2, 2, 268, 269, 7, 23, 2, 2, 269, 272, 5, 32, 17, 2, 270, 271, 7, 26, 2, 2, 271, 273, 5, 32, 17, 2, 272, 270, 3, 2, 2, 2, 272, 273, 3, 2, 2, 2, 273, 276, 3, 2, 2, 2, 274, 275, 7, 25, 2, 2, 275, 277, 5, 36, 19, 2, 276, 274, 3, 2, 2, 2, 276, 277, 3, 2, 2, 2, 277, 279, 3, 2, 2, 2, 278, 260, 3, 2, 2, 2, 278, 268, 3, 2, 2, 2, 279, 25, 3, 2, 2, 2, 280, 281, 7, 27, 2, 2, 281, 282, 5, 32, 17, 2, 282, 283, 7, 24, 2, 2, 283, 284, 5, 68, 35, 2, 284, 292, 3, 2, 2, 2, 285, 286, 7, 27, 2, 2, 286, 289, 5, 32, 17, 2, 287, 288, 7, 26, 2, 2, 288, 290, 5, 32, 17, 2, 289, 287, 3, 2, 2, 2, 289, 290, 3, 2, 2, 2, 290, 292, 3, 2, 2, 2, 291, 280, 3, 2, 2, 2, 291, 285, 3, 2, 2, 2, 292, 27, 3, 2, 2, 2, 293, 294, 7, 23, 2, 2, 294, 295, 5, 30, 16, 2, 295, 296, 7, 63, 2, 2, 296, 297, 5, 32, 17, 2, 297, 298, 7, 62, 2, 2, 298, 306, 5, 46, 24, 2, 299, 300, 7, 10, 2, 2, 300, 301, 5, 32, 17, 2, 301, 302, 7, 62, 2, 2, 302, 303, 5, 46, 24, 2, 303, 305, 3, 2, 2, 2, 304, 299, 3, 2, 2, 2, 305, 308, 3, 2, 2, 2, 306, 304, 3, 2, 2, 2, 306, 307, 3, 2, 2, 2, 307, 309, 3, 2, 2, 2, 308, 306, 3, 2, 2, 2, 309, 310, 7, 64, 2, 2, 310, 311, 7, 24, 2, 2, 311, 314, 7, 53, 2, 2, 312, 313, 7, 25, 2, 2, 313, 315, 5, 36, 19, 2, 314, 312, 3, 2, 2, 2, 314, 315, 3, 2, 2, 2, 315, 340, 3, 2, 2, 2, 316, 317, 7, 23, 2, 2, 317, 318, 5, 30, 16, 2, 318, 319, 7, 63, 2, 2, 319, 320, 5, 32, 17, 2, 320, 321, 7, 62, 2, 2, 321, 329, 5, 46, 24, 2, 322, 323, 7, 10, 2, 2, 323, 324, 5, 32, 17, 2, 324, 325, 7, 62, 2, 2, 325, 326, 5, 46, 24, 2, 326, 328, 3, 2, 2, 2, 327, 322, 3, 2, 2, 2, 328, 331, 3, 2, 2, 2, 329, 327, 3, 2, 2, 2, 329, 330, 3, 2, 2, 2, 330, 332, 3, 2, 2, 2, 331, 329, 3, 2, 2, 2, 332, 333, 7, 64, 2, 2, 333, 334, 7, 26, 2, 2, 334, 337, 5, 34, 18, 2, 335, 336, 7, 25, 2, 2, 336, 338, 5, 36, 19, 2, 337, 335, 3, 2, 2, 2, 337, 338, 3, 2, 2, 2, 338, 340, 3, 2, 2, 2, 339, 293, 3, 2, 2, 2, 339, 316, 3, 2, 2, 2, 340, 29, 3, 2, 2, 2, 341, 342, 5, 82, 42, 2, 342, 31, 3, 2, 2, 2, 343, 344, 5, 82, 42, 2, 344, 33, 3, 2, 2, 2, 345, 346, 5, 82, 42, 2, 346, 35, 3, 2, 2, 2, 347, 348, 7, 42, 2, 2, 348, 37, 3, 2, 2, 2, 349, 350, 8, 20, 1, 2, 350, 359, 7, 63, 2, 2, 351, 356, 5, 38, 20, 2, 352, 353, 7, 10, 2, 2, 353, 355, 5, 38, 20, 2, 354, 352, 3, 2, 2, 2, 355, 358, 3, 2, 2, 2, 356, 354, 3, 2, 2, 2, 356, 357, 3, 2, 2, 2, 357, 360, 3, 2, 2, 2, 358, 356, 3, 2, 2, 2, 359, 351, 3, 2, 2, 2, 359, 360, 3, 2, 2, 2, 360, 362, 3, 2, 2, 2, 361, 363, 7, 10, 2, 2, 362, 361, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 364, 3, 2, 2, 2, 364, 365, 7, 64, 2, 2, 365, 366, 7, 29, 2, 2, 366, 420, 5, 38, 20, 14, 367, 368, 7, 65, 2, 2, 368, 369, 7, 13, 2, 2, 369, 370, 5, 38, 20, 2, 370, 371, 7, 14, 2, 2, 371, 420, 3, 2, 2, 2, 372, 373, 7, 66, 2, 2, 373, 374, 7, 13, 2, 2, 374, 375, 5, 38, 20, 2, 375, 376, 7, 14, 2, 2, 376, 420, 3, 2, 2, 2, 377, 378, 7, 63, 2, 2, 378, 379, 5, 38, 20, 2, 379, 380, 7, 10, 2, 2, 380, 385, 5, 38, 20, 2, 381, 382, 7, 10, 2, 2, 382, 384, 5, 38, 20, 2, 383, 381, 3, 2, 2, 2, 384, 387, 3, 2, 2, 2, 385, 383, 3, 2, 2, 2, 385, 386, 3, 2, 2, 2, 386, 389, 3, 2, 2, 2, 387, 385, 3, 2, 2, 2, 388, 390, 7, 10, 2, 2, 389, 388, 3, 2, 2, 2, 389, 390, 3, 2, 2, 2, 390, 391, 3, 2, 2, 2, 391, 392, 7, 64, 2, 2, 392, 420, 3, 2, 2, 2, 393, 395, 7, 4, 2, 2, 394, 396, 5, 42, 22, 2, 395, 394, 3, 2, 2, 2, 395, 396, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, 420, 7, 5, 2, 2, 398, 420, 7, 30, 2, 2, 399, 420, 7, 31, 2, 2, 400, 420, 7, 32, 2, 2, 401, 420, 5, 40, 21, 2, 402, 420, 5, 82, 42, 2, 403, 404, 7, 63, 2, 2, 404, 405, 5, 38, 20, 2, 405, 406, 7, 64, 2, 2, 406, 420, 3, 2, 2, 2, 407, 408, 5, 82, 42, 2, 408, 409, 7, 13, 2, 2, 409, 414, 5, 38, 20, 2, 410, 411, 7, 10, 2, 2, 411, 413, 5, 38, 20, 2, 412, 410, 3, 2, 2, 2, 413, 416, 3, 2, 2, 2, 414, 412, 3, 2, 2, 2, 414, 415, 3, 2, 2, 2, 415, 417, 3, 2, 2, 2, 416, 414, 3, 2, 2, 2, 417, 418, 7, 14, 2, 2, 418, 420, 3, 2, 2, 2, 419, 349, 3, 2, 2, 2, 419, 367, 3, 2, 2, 2, 419, 372, 3, 2, 2, 2, 419, 377, 3, 2, 2, 2, 419, 393, 3, 2, 2, 2, 419, 398, 3, 2, 2, 2, 419, 399, 3, 2, 2, 2, 419, 400, 3, 2, 2, 2, 419, 401, 3, 2, 2, 2, 419, 402, 3, 2, 2, 2, 419, 403, 3, 2, 2, 2, 419, 407, 3, 2, 2, 2, 420, 429, 3, 2, 2, 2, 421, 422, 12, 16, 2, 2, 422, 423, 7, 28, 2, 2, 423, 428, 5, 38, 20, 16, 424, 425, 12, 15, 2, 2, 425, 426, 7, 29, 2, 2, 426, 428, 5, 38, 20, 15, 427, 421, 3, 2, 2, 2, 427, 424, 3, 2, 2, 2, 428, 431, 3, 2, 2, 2, 429, 427, 3, 2, 2, 2, 429, 430, 3, 2, 2, 2, 430, 39, 3, 2, 2, 2, 431, 429, 3, 2, 2, 2, 432, 433, 7, 67, 2, 2, 433, 41, 3, 2, 2, 2, 434, 435, 5, 44, 23, 2, 435, 436, 7, 7, 2, 2, 436, 437, 5, 38, 20, 2, 437, 445, 3, 2, 2, 2, 438, 439, 7, 10, 2, 2, 439, 440, 5, 44, 23, 2, 440, 441, 7, 7, 2, 2, 441, 442, 5, 38, 20, 2, 442, 444, 3, 2, 2, 2, 443, 438, 3, 2, 2, 2, 444, 447, 3, 2, 2, 2, 445, 443, 3, 2, 2, 2, 445, 446, 3, 2, 2, 2, 446, 451, 3, 2, 2, 2, 447, 445, 3, 2, 2, 2, 448, 452, 7, 10, 2, 2, 449, 450, 7, 15, 2, 2, 450, 452, 5, 86, 44, 2, 451, 448, 3, 2, 2, 2, 451, 449, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 452, 456, 3, 2, 2, 2, 453, 454, 7, 15, 2, 2, 454, 456, 5, 86, 44, 2, 455, 434, 3, 2, 2, 2, 455, 453, 3, 2, 2, 2, 456, 43, 3, 2, 2, 2, 457, 458, 5, 84, 43, 2, 458, 45, 3, 2, 2, 2, 459, 460, 8, 24, 1, 2, 460, 610, 5, 56, 29, 2, 461, 462, 5, 74, 38, 2, 462, 464, 7, 63, 2, 2, 463, 465, 5, 70, 36, 2, 464, 463, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, 466, 3, 2, 2, 2, 466, 467, 7, 64, 2, 2, 467, 610, 3, 2, 2, 2, 468, 469, 7, 52, 2, 2, 469, 610, 5, 46, 24, 27, 470, 471, 5, 82, 42, 2, 471, 472, 7, 34, 2, 2, 472, 473, 7, 62, 2, 2, 473, 474, 5, 46, 24, 23, 474, 610, 3, 2, 2, 2, 475, 476, 7, 45, 2, 2, 476, 477, 7, 4, 2, 2, 477, 482, 5, 46, 24, 2, 478, 479, 7, 10, 2, 2, 479, 481, 5, 46, 24, 2, 480, 478, 3, 2, 2, 2, 481, 484, 3, 2, 2, 2, 482, 480, 3, 2, 2, 2, 482, 483, 3, 2, 2, 2, 483, 486, 3, 2, 2, 2, 484, 482, 3, 2, 2, 2, 485, 487, 7, 10, 2, 2, 486, 485, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 489, 7, 5, 2, 2, 489, 610, 3, 2, 2, 2, 490, 491, 7, 46, 2, 2, 491, 492, 7, 4, 2, 2, 492, 497, 5, 46, 24, 2, 493, 494, 7, 10, 2, 2, 494, 496, 5, 46, 24, 2, 495, 493, 3, 2, 2, 2, 496, 499, 3, 2, 2, 2, 497, 495, 3, 2, 2, 2, 497, 498, 3, 2, 2, 2, 498, 501, 3, 2, 2, 2, 499, 497, 3, 2, 2, 2, 500, 502, 7, 10, 2, 2, 501, 500, 3, 2, 2, 2, 501, 502, 3, 2, 2, 2, 502, 503, 3, 2, 2, 2, 503, 504, 7, 5, 2, 2, 504, 610, 3, 2, 2, 2, 505, 610, 5, 48, 25, 2, 506, 507, 7, 35, 2, 2, 507, 508, 7, 4, 2, 2, 508, 513, 5, 46, 24, 2, 509, 510, 7, 10, 2, 2, 510, 512, 5, 46, 24, 2, 511, 509, 3, 2, 2, 2, 512, 515, 3, 2, 2, 2, 513, 511, 3, 2, 2, 2, 513, 514, 3, 2, 2, 2, 514, 517, 3, 2, 2, 2, 515, 513, 3, 2, 2, 2, 516, 518, 7, 10, 2, 2, 517, 516, 3, 2, 2, 2, 517, 518, 3, 2, 2, 2, 518, 519, 3, 2, 2, 2, 519, 520, 7, 5, 2, 2, 520, 610, 3, 2, 2, 2, 521, 522, 7, 36, 2, 2, 522, 523, 7, 4, 2, 2, 523, 528, 5, 46, 24, 2, 524, 525, 7, 10, 2, 2, 525, 527, 5, 46, 24, 2, 526, 524, 3, 2, 2, 2, 527, 530, 3, 2, 2, 2, 528, 526, 3, 2, 2, 2, 528, 529, 3, 2, 2, 2, 529, 532, 3, 2, 2, 2, 530, 528, 3, 2, 2, 2, 531, 533, 7, 10, 2, 2, 532, 531, 3, 2, 2, 2, 532, 533, 3, 2, 2, 2, 533, 534, 3, 2, 2, 2, 534, 535, 7, 5, 2, 2, 535, 610, 3, 2, 2, 2, 536, 541, 5, 82, 42, 2, 537, 541, 7, 44, 2, 2, 538, 541, 7, 43, 2, 2, 539, 541, 7, 42, 2, 2, 540, 536, 3, 2, 2, 2, 540, 537, 3, 2, 2, 2, 540, 538, 3, 2, 2, 2, 540, 539, 3, 2, 2, 2, 541, 610, 3, 2, 2, 2, 542, 543, 7, 63, 2, 2, 543, 544, 5, 46, 24, 2, 544, 545, 7, 10, 2, 2, 545, 550, 5, 46, 24, 2, 546, 547, 7, 10, 2, 2, 547, 549, 5, 46, 24, 2, 548, 546, 3, 2, 2, 2, 549, 552, 3, 2, 2, 2, 550, 548, 3, 2, 2, 2, 550, 551, 3, 2, 2, 2, 551, 554, 3, 2, 2, 2, 552, 550, 3, 2, 2, 2, 553, 555, 7, 10, 2, 2, 554, 553, 3, 2, 2, 2, 554, 555, 3, 2, 2, 2, 555, 556, 3, 2, 2, 2, 556, 557, 7, 64, 2, 2, 557, 610, 3, 2, 2, 2, 558, 559, 7, 4, 2, 2, 559, 564, 5, 72, 37, 2, 560, 561, 7, 10, 2, 2, 561, 563, 5, 72, 37, 2, 562, 560, 3, 2, 2, 2, 563, 566, 3, 2, 2, 2, 564, 562, 3, 2, 2, 2, 564, 565, 3, 2, 2, 2, 565, 568, 3, 2, 2, 2, 566, 564, 3, 2, 2, 2, 567, 569, 7, 10, 2, 2, 568, 567, 3, 2, 2, 2, 568, 569, 3, 2, 2, 2, 569, 570, 3, 2, 2, 2, 570, 571, 7, 5, 2, 2, 571, 610, 3, 2, 2, 2, 572, 581, 7, 13, 2, 2, 573, 578, 5, 46, 24, 2, 574, 575, 7, 10, 2, 2, 575, 577, 5, 46, 24, 2, 576, 574, 3, 2, 2, 2, 577, 580, 3, 2, 2, 2, 578, 576, 3, 2, 2, 2, 578, 579, 3, 2, 2, 2, 579, 582, 3, 2, 2, 2, 580, 578, 3, 2, 2, 2, 581, 573, 3, 2, 2, 2, 581, 582, 3, 2, 2, 2, 582, 584, 3, 2, 2, 2, 583, 585, 7, 10, 2, 2, 584, 583, 3, 2, 2, 2, 584, 585, 3, 2, 2, 2, 585, 586, 3, 2, 2, 2, 586, 610, 7, 14, 2, 2, 587, 588, 7, 37, 2, 2, 588, 589, 7, 63, 2, 2, 589, 590, 5, 46, 24, 2, 590, 591, 7, 64, 2, 2, 591, 592, 5, 46, 24, 2, 592, 593, 7, 38, 2, 2, 593, 594, 5, 46, 24, 7, 594, 610, 3, 2, 2, 2, 595, 596, 5, 10, 6, 2, 596, 597, 5, 46, 24, 6, 597, 610, 3, 2, 2, 2, 598, 599, 5, 20, 11, 2, 599, 600, 5, 46, 24, 5, 600, 610, 3, 2, 2, 2, 601, 602, 7, 63, 2, 2, 602, 603, 5, 46, 24, 2, 603, 604, 7, 64, 2, 2, 604, 610, 3, 2, 2, 2, 605, 606, 7, 4, 2, 2, 606, 607, 5, 46, 24, 2, 607, 608, 7, 5, 2, 2, 608, 610, 3, 2, 2, 2, 609, 459, 3, 2, 2, 2, 609, 461, 3, 2, 2, 2, 609, 468, 3, 2, 2, 2, 609, 470, 3, 2, 2, 2, 609, 475, 3, 2, 2, 2, 609, 490, 3, 2, 2, 2, 609, 505, 3, 2, 2, 2, 609, 506, 3, 2, 2, 2, 609, 521, 3, 2, 2, 2, 609, 540, 3, 2, 2, 2, 609, 542, 3, 2, 2, 2, 609, 558, 3, 2, 2, 2, 609, 572, 3, 2, 2, 2, 609, 587, 3, 2, 2, 2, 609, 595, 3, 2, 2, 2, 609, 598, 3, 2, 2, 2, 609, 601, 3, 2, 2, 2, 609, 605, 3, 2, 2, 2, 610, 660, 3, 2, 2, 2, 611, 612, 12, 28, 2, 2, 612, 613, 7, 33, 2, 2, 613, 659, 5, 46, 24, 28, 614, 615, 12, 26, 2, 2, 615, 616, 9, 2, 2, 2, 616, 659, 5, 46, 24, 27, 617, 618, 12, 25, 2, 2, 618, 619, 9, 3, 2, 2, 619, 659, 5, 46, 24, 26, 620, 621, 12, 24, 2, 2, 621, 622, 9, 4, 2, 2, 622, 659, 5, 46, 24, 25, 623, 624, 12, 22, 2, 2, 624, 625, 7, 62, 2, 2, 625, 626, 5, 46, 24, 23, 626, 627, 8, 24, 1, 2, 627, 659, 3, 2, 2, 2, 628, 629, 12, 20, 2, 2, 629, 630, 7, 45, 2, 2, 630, 659, 5, 46, 24, 21, 631, 632, 12, 18, 2, 2, 632, 633, 7, 46, 2, 2, 633, 659, 5, 46, 24, 19, 634, 635, 12, 17, 2, 2, 635, 636, 7, 47, 2, 2, 636, 659, 5, 46, 24, 18, 637, 638, 12, 16, 2, 2, 638, 639, 7, 48, 2, 2, 639, 659, 5, 46, 24, 17, 640, 641, 12, 10, 2, 2, 641, 642, 7, 28, 2, 2, 642, 659, 5, 46, 24, 11, 643, 644, 12, 32, 2, 2, 644, 645, 7, 24, 2, 2, 645, 651, 5, 76, 39, 2, 646, 648, 7, 63, 2, 2, 647, 649, 5, 70, 36, 2, 648, 647, 3, 2, 2, 2, 648, 649, 3, 2, 2, 2, 649, 650, 3, 2, 2, 2, 650, 652, 7, 64, 2, 2, 651, 646, 3, 2, 2, 2, 651, 652, 3, 2, 2, 2, 652, 659, 3, 2, 2, 2, 653, 654, 12, 29, 2, 2, 654, 655, 7, 13, 2, 2, 655, 656, 5, 46, 24, 2, 656, 657, 7, 14, 2, 2, 657, 659, 3, 2, 2, 2, 658, 611, 3, 2, 2, 2, 658, 614, 3, 2, 2, 2, 658, 617, 3, 2, 2, 2, 658, 620, 3, 2, 2, 2, 658, 623, 3, 2, 2, 2, 658, 628, 3, 2, 2, 2, 658, 631, 3, 2, 2, 2, 658, 634, 3, 2, 2, 2, 658, 637, 3, 2, 2, 2, 658, 640, 3, 2, 2, 2, 658, 643, 3, 2, 2, 2, 658, 653, 3, 2, 2, 2, 659, 662, 3, 2, 2, 2, 660, 658, 3, 2, 2, 2, 660, 661, 3, 2, 2, 2, 661, 47, 3, 2, 2, 2, 662, 660, 3, 2, 2, 2, 663, 664, 7, 50, 2, 2, 664, 665, 5, 46, 24, 2, 665, 667, 7, 4, 2, 2, 666, 668, 7, 15, 2, 2, 667, 666, 3, 2, 2, 2, 667, 668, 3, 2, 2, 2, 668, 669, 3, 2, 2, 2, 669, 674, 5, 50, 26, 2, 670, 671, 7, 15, 2, 2, 671, 673, 5, 50, 26, 2, 672, 670, 3, 2, 2, 2, 673, 676, 3, 2, 2, 2, 674, 672, 3, 2, 2, 2, 674, 675, 3, 2, 2, 2, 675, 677, 3, 2, 2, 2, 676, 674, 3, 2, 2, 2, 677, 678, 7, 5, 2, 2, 678, 49, 3, 2, 2, 2, 679, 682, 5, 52, 27, 2, 680, 682, 7, 39, 2, 2, 681, 679, 3, 2, 2, 2, 681, 680, 3, 2, 2, 2, 682, 683, 3, 2, 2, 2, 683, 684, 7, 29, 2, 2, 684, 685, 5, 46, 24, 2, 685, 51, 3, 2, 2, 2, 686, 693, 5, 84, 43, 2, 687, 690, 7, 63, 2, 2, 688, 691, 5, 84, 43, 2, 689, 691, 7, 39, 2, 2, 690, 688, 3, 2, 2, 2, 690, 689, 3, 2, 2, 2, 691, 692, 3, 2, 2, 2, 692, 694, 7, 64, 2, 2, 693, 687, 3, 2, 2, 2, 693, 694, 3, 2, 2, 2, 694, 53, 3, 2, 2, 2, 695, 696, 5, 8, 5, 2, 696, 697, 7, 2, 2, 3, 697, 705, 3, 2, 2, 2, 698, 699, 5, 46, 24, 2, 699, 700, 7, 2, 2, 3, 700, 705, 3, 2, 2, 2, 701, 702, 7, 69, 2, 2, 702, 705, 7, 2, 2, 3, 703, 705, 7, 2, 2, 3, 704, 695, 3, 2, 2, 2, 704, 698, 3, 2, 2, 2, 704, 701, 3, 2, 2, 2, 704, 703, 3, 2, 2, 2, 705, 55, 3, 2, 2, 2, 706, 709, 5, 58, 30, 2, 707, 709, 5, 60, 31, 2, 708, 706, 3, 2, 2, 2, 708, 707, 3, 2, 2, 2, 709, 57, 3, 2, 2, 2, 710, 711, 5, 64, 33, 2, 711, 712, 7, 29, 2, 2, 712, 713, 5, 46, 24, 2, 713, 728, 3, 2, 2, 2, 714, 715, 7, 63, 2, 2, 715, 720, 5, 64, 33, 2, 716, 717, 7, 10, 2, 2, 717, 719, 5, 64, 33, 2, 718, 716, 3, 2, 2, 2, 719, 722, 3, 2, 2, 2, 720, 718, 3, 2, 2, 2, 720, 721, 3, 2, 2, 2, 721, 723, 3, 2, 2, 2, 722, 720, 3, 2, 2, 2, 723, 724, 7, 64, 2, 2, 724, 725, 7, 29, 2, 2, 725, 726, 5, 46, 24, 2, 726, 728, 3, 2, 2, 2, 727, 710, 3, 2, 2, 2, 727, 714, 3, 2, 2, 2, 728, 59, 3, 2, 2, 2, 729, 730, 7, 63, 2, 2, 730, 731, 7, 63, 2, 2, 731, 734, 5, 64, 33, 2, 732, 733, 7, 10, 2, 2, 733, 735, 5, 64, 33, 2, 734, 732, 3, 2, 2, 2, 735, 736, 3, 2, 2, 2, 736, 734, 3, 2, 2, 2, 736, 737, 3, 2, 2, 2, 737, 738, 3, 2, 2, 2, 738, 739, 7, 64, 2, 2, 739, 740, 7, 64, 2, 2, 740, 741, 7, 29, 2, 2, 741, 742, 5, 46, 24, 2, 742, 61, 3, 2, 2, 2, 743, 746, 7, 39, 2, 2, 744, 746, 5, 82, 42, 2, 745, 743, 3, 2, 2, 2, 745, 744, 3, 2, 2, 2, 746, 63, 3, 2, 2, 2, 747, 748, 5, 62, 32, 2, 748, 65, 3, 2, 2, 2, 749, 750, 5, 62, 32, 2, 750, 751, 7, 7, 2, 2, 751, 752, 5, 38, 20, 2, 752, 67, 3, 2, 2, 2, 753, 756, 7, 53, 2, 2, 754, 756, 5, 82, 42, 2, 755, 753, 3, 2, 2, 2, 755, 754, 3, 2, 2, 2, 756, 69, 3, 2, 2, 2, 757, 762, 5, 46, 24, 2, 758, 759, 7, 10, 2, 2, 759, 761, 5, 46, 24, 2, 760, 758, 3, 2, 2, 2, 761, 764, 3, 2, 2, 2, 762, 760, 3, 2, 2, 2, 762, 763, 3, 2, 2, 2, 763, 71, 3, 2, 2, 2, 764, 762, 3, 2, 2, 2, 765, 766, 5, 84, 43, 2, 766, 767, 7, 7, 2, 2, 767, 768, 5, 46, 24, 2, 768, 772, 3, 2, 2, 2, 769, 770, 7, 40, 2, 2, 770, 772, 5, 46, 24, 2, 771, 765, 3, 2, 2, 2, 771, 769, 3, 2, 2, 2, 772, 73, 3, 2, 2, 2, 773, 776, 5, 82, 42, 2, 774, 776, 9, 5, 2, 2, 775, 773, 3, 2, 2, 2, 775, 774, 3, 2, 2, 2, 776, 75, 3, 2, 2, 2, 777, 780, 5, 82, 42, 2, 778, 780, 9, 6, 2, 2, 779, 777, 3, 2, 2, 2, 779, 778, 3, 2, 2, 2, 780, 77, 3, 2, 2, 2, 781, 782, 9, 7, 2, 2, 782, 79, 3, 2, 2, 2, 783, 784, 9, 8, 2, 2, 784, 81, 3, 2, 2, 2, 785, 790, 5, 86, 44, 2, 786, 787, 7, 41, 2, 2, 787, 789, 5, 86, 44, 2, 788, 786, 3, 2, 2, 2, 789, 792, 3, 2, 2, 2, 790, 788, 3, 2, 2, 2, 790, 791, 3, 2, 2, 2, 791, 83, 3, 2, 2, 2, 792, 790, 3, 2, 2, 2, 793, 798, 5, 86, 44, 2, 794, 795, 5, 82, 42, 2, 795, 796, 8, 43, 1, 2, 796, 798, 3, 2, 2, 2, 797, 793, 3, 2, 2, 2, 797, 794, 3, 2, 2, 2, 798, 85, 3, 2, 2, 2, 799, 800, 9, 9, 2, 2, 800, 87, 3, 2, 2, 2, 90, 91, 98, 107, 115, 140, 150, 158, 161, 171, 174, 177, 181, 185, 188, 190, 204, 213, 218, 221, 228, 236, 242, 247, 258, 266, 272, 276, 278, 289, 291, 306, 314, 329, 337, 339, 356, 359, 362, 385, 389, 395, 414, 419, 427, 429, 445, 451, 455, 464, 482, 486, 497, 501, 513, 517, 528, 532, 540, 550, 554, 564, 568, 578, 581, 584, 609, 648, 651, 658, 660, 667, 674, 681, 690, 693, 704, 708, 720, 727, 736, 745, 755, 762, 771, 775, 779, 790, 797] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 801, 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, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 3, 2, 6, 2, 90, 10, 2, 13, 2, 14, 2, 91, 3, 2, 3, 2, 3, 3, 7, 3, 97, 10, 3, 12, 3, 14, 3, 100, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 106, 10, 3, 12, 3, 14, 3, 109, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 114, 10, 4, 12, 4, 14, 4, 117, 11, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 141, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 149, 10, 6, 12, 6, 14, 6, 152, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 159, 10, 6, 3, 6, 5, 6, 162, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 170, 10, 6, 12, 6, 14, 6, 173, 11, 6, 5, 6, 175, 10, 6, 3, 6, 5, 6, 178, 10, 6, 3, 6, 3, 6, 5, 6, 182, 10, 6, 3, 6, 3, 6, 5, 6, 186, 10, 6, 3, 6, 5, 6, 189, 10, 6, 5, 6, 191, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 205, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 212, 10, 8, 12, 8, 14, 8, 215, 11, 8, 3, 8, 5, 8, 218, 10, 8, 3, 9, 5, 9, 221, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 226, 10, 9, 12, 9, 14, 9, 229, 11, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 236, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 242, 10, 11, 3, 11, 3, 11, 3, 11, 5, 11, 247, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 258, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 266, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 272, 10, 13, 3, 13, 3, 13, 5, 13, 276, 10, 13, 5, 13, 278, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 289, 10, 14, 5, 14, 291, 10, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 304, 10, 15, 12, 15, 14, 15, 307, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 314, 10, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 327, 10, 15, 12, 15, 14, 15, 330, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 337, 10, 15, 5, 15, 339, 10, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 354, 10, 20, 12, 20, 14, 20, 357, 11, 20, 5, 20, 359, 10, 20, 3, 20, 5, 20, 362, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 383, 10, 20, 12, 20, 14, 20, 386, 11, 20, 3, 20, 5, 20, 389, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 395, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 412, 10, 20, 12, 20, 14, 20, 415, 11, 20, 3, 20, 3, 20, 5, 20, 419, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 427, 10, 20, 12, 20, 14, 20, 430, 11, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 443, 10, 22, 12, 22, 14, 22, 446, 11, 22, 3, 22, 3, 22, 3, 22, 5, 22, 451, 10, 22, 3, 22, 3, 22, 5, 22, 455, 10, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 464, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 480, 10, 24, 12, 24, 14, 24, 483, 11, 24, 3, 24, 5, 24, 486, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 495, 10, 24, 12, 24, 14, 24, 498, 11, 24, 3, 24, 5, 24, 501, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 511, 10, 24, 12, 24, 14, 24, 514, 11, 24, 3, 24, 5, 24, 517, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 526, 10, 24, 12, 24, 14, 24, 529, 11, 24, 3, 24, 5, 24, 532, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 540, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 548, 10, 24, 12, 24, 14, 24, 551, 11, 24, 3, 24, 5, 24, 554, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 562, 10, 24, 12, 24, 14, 24, 565, 11, 24, 3, 24, 5, 24, 568, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 576, 10, 24, 12, 24, 14, 24, 579, 11, 24, 5, 24, 581, 10, 24, 3, 24, 5, 24, 584, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 609, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 648, 10, 24, 3, 24, 5, 24, 651, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 658, 10, 24, 12, 24, 14, 24, 661, 11, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 667, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 672, 10, 25, 12, 25, 14, 25, 675, 11, 25, 3, 25, 3, 25, 3, 26, 3, 26, 5, 26, 681, 10, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 690, 10, 27, 3, 27, 5, 27, 693, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 704, 10, 28, 3, 29, 3, 29, 5, 29, 708, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 718, 10, 30, 12, 30, 14, 30, 721, 11, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 727, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 6, 31, 734, 10, 31, 13, 31, 14, 31, 735, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 5, 32, 745, 10, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 5, 35, 755, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 760, 10, 36, 12, 36, 14, 36, 763, 11, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 771, 10, 37, 3, 38, 3, 38, 5, 38, 775, 10, 38, 3, 39, 3, 39, 5, 39, 779, 10, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 7, 42, 788, 10, 42, 12, 42, 14, 42, 791, 11, 42, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 797, 10, 43, 3, 44, 3, 44, 3, 44, 2, 2, 4, 38, 46, 45, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 68, 2, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 86, 2, 2, 10, 3, 2, 53, 55, 3, 2, 51, 52, 3, 2, 56, 61, 4, 2, 45, 49, 65, 66, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 51, 61, 3, 2, 42, 44, 3, 2, 67, 68, 2, 898, 2, 89, 3, 2, 2, 2, 4, 98, 3, 2, 2, 2, 6, 115, 3, 2, 2, 2, 8, 140, 3, 2, 2, 2, 10, 190, 3, 2, 2, 2, 12, 204, 3, 2, 2, 2, 14, 206, 3, 2, 2, 2, 16, 220, 3, 2, 2, 2, 18, 230, 3, 2, 2, 2, 20, 237, 3, 2, 2, 2, 22, 257, 3, 2, 2, 2, 24, 277, 3, 2, 2, 2, 26, 290, 3, 2, 2, 2, 28, 338, 3, 2, 2, 2, 30, 340, 3, 2, 2, 2, 32, 342, 3, 2, 2, 2, 34, 344, 3, 2, 2, 2, 36, 346, 3, 2, 2, 2, 38, 418, 3, 2, 2, 2, 40, 431, 3, 2, 2, 2, 42, 454, 3, 2, 2, 2, 44, 456, 3, 2, 2, 2, 46, 608, 3, 2, 2, 2, 48, 662, 3, 2, 2, 2, 50, 680, 3, 2, 2, 2, 52, 685, 3, 2, 2, 2, 54, 703, 3, 2, 2, 2, 56, 707, 3, 2, 2, 2, 58, 726, 3, 2, 2, 2, 60, 728, 3, 2, 2, 2, 62, 744, 3, 2, 2, 2, 64, 746, 3, 2, 2, 2, 66, 748, 3, 2, 2, 2, 68, 754, 3, 2, 2, 2, 70, 756, 3, 2, 2, 2, 72, 770, 3, 2, 2, 2, 74, 774, 3, 2, 2, 2, 76, 778, 3, 2, 2, 2, 78, 780, 3, 2, 2, 2, 80, 782, 3, 2, 2, 2, 82, 784, 3, 2, 2, 2, 84, 796, 3, 2, 2, 2, 86, 798, 3, 2, 2, 2, 88, 90, 5, 4, 3, 2, 89, 88, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 89, 3, 2, 2, 2, 91, 92, 3, 2, 2, 2, 92, 93, 3, 2, 2, 2, 93, 94, 7, 2, 2, 3, 94, 3, 3, 2, 2, 2, 95, 97, 7, 69, 2, 2, 96, 95, 3, 2, 2, 2, 97, 100, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 98, 99, 3, 2, 2, 2, 99, 101, 3, 2, 2, 2, 100, 98, 3, 2, 2, 2, 101, 102, 7, 3, 2, 2, 102, 103, 5, 82, 42, 2, 103, 107, 7, 4, 2, 2, 104, 106, 5, 6, 4, 2, 105, 104, 3, 2, 2, 2, 106, 109, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 107, 108, 3, 2, 2, 2, 108, 110, 3, 2, 2, 2, 109, 107, 3, 2, 2, 2, 110, 111, 7, 5, 2, 2, 111, 5, 3, 2, 2, 2, 112, 114, 7, 69, 2, 2, 113, 112, 3, 2, 2, 2, 114, 117, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 115, 116, 3, 2, 2, 2, 116, 118, 3, 2, 2, 2, 117, 115, 3, 2, 2, 2, 118, 119, 5, 8, 5, 2, 119, 7, 3, 2, 2, 2, 120, 121, 7, 6, 2, 2, 121, 122, 5, 82, 42, 2, 122, 123, 7, 7, 2, 2, 123, 124, 5, 38, 20, 2, 124, 141, 3, 2, 2, 2, 125, 126, 7, 8, 2, 2, 126, 127, 5, 82, 42, 2, 127, 128, 7, 7, 2, 2, 128, 129, 5, 38, 20, 2, 129, 141, 3, 2, 2, 2, 130, 131, 7, 9, 2, 2, 131, 132, 5, 62, 32, 2, 132, 133, 7, 62, 2, 2, 133, 134, 5, 46, 24, 2, 134, 141, 3, 2, 2, 2, 135, 141, 5, 28, 15, 2, 136, 141, 5, 10, 6, 2, 137, 141, 5, 12, 7, 2, 138, 141, 5, 24, 13, 2, 139, 141, 5, 26, 14, 2, 140, 120, 3, 2, 2, 2, 140, 125, 3, 2, 2, 2, 140, 130, 3, 2, 2, 2, 140, 135, 3, 2, 2, 2, 140, 136, 3, 2, 2, 2, 140, 137, 3, 2, 2, 2, 140, 138, 3, 2, 2, 2, 140, 139, 3, 2, 2, 2, 141, 9, 3, 2, 2, 2, 142, 143, 5, 22, 12, 2, 143, 144, 5, 74, 38, 2, 144, 145, 7, 63, 2, 2, 145, 150, 5, 66, 34, 2, 146, 147, 7, 10, 2, 2, 147, 149, 5, 66, 34, 2, 148, 146, 3, 2, 2, 2, 149, 152, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 150, 151, 3, 2, 2, 2, 151, 153, 3, 2, 2, 2, 152, 150, 3, 2, 2, 2, 153, 154, 7, 64, 2, 2, 154, 155, 7, 7, 2, 2, 155, 158, 5, 38, 20, 2, 156, 157, 7, 62, 2, 2, 157, 159, 5, 46, 24, 2, 158, 156, 3, 2, 2, 2, 158, 159, 3, 2, 2, 2, 159, 161, 3, 2, 2, 2, 160, 162, 7, 11, 2, 2, 161, 160, 3, 2, 2, 2, 161, 162, 3, 2, 2, 2, 162, 191, 3, 2, 2, 2, 163, 164, 5, 22, 12, 2, 164, 177, 5, 74, 38, 2, 165, 174, 7, 63, 2, 2, 166, 171, 5, 64, 33, 2, 167, 168, 7, 10, 2, 2, 168, 170, 5, 64, 33, 2, 169, 167, 3, 2, 2, 2, 170, 173, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 171, 172, 3, 2, 2, 2, 172, 175, 3, 2, 2, 2, 173, 171, 3, 2, 2, 2, 174, 166, 3, 2, 2, 2, 174, 175, 3, 2, 2, 2, 175, 176, 3, 2, 2, 2, 176, 178, 7, 64, 2, 2, 177, 165, 3, 2, 2, 2, 177, 178, 3, 2, 2, 2, 178, 181, 3, 2, 2, 2, 179, 180, 7, 7, 2, 2, 180, 182, 5, 38, 20, 2, 181, 179, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 185, 3, 2, 2, 2, 183, 184, 7, 62, 2, 2, 184, 186, 5, 46, 24, 2, 185, 183, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 188, 3, 2, 2, 2, 187, 189, 7, 11, 2, 2, 188, 187, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 191, 3, 2, 2, 2, 190, 142, 3, 2, 2, 2, 190, 163, 3, 2, 2, 2, 191, 11, 3, 2, 2, 2, 192, 193, 7, 12, 2, 2, 193, 205, 5, 82, 42, 2, 194, 195, 7, 12, 2, 2, 195, 196, 5, 14, 8, 2, 196, 197, 7, 62, 2, 2, 197, 198, 5, 38, 20, 2, 198, 205, 3, 2, 2, 2, 199, 200, 7, 12, 2, 2, 200, 201, 5, 14, 8, 2, 201, 202, 7, 62, 2, 2, 202, 203, 5, 16, 9, 2, 203, 205, 3, 2, 2, 2, 204, 192, 3, 2, 2, 2, 204, 194, 3, 2, 2, 2, 204, 199, 3, 2, 2, 2, 205, 13, 3, 2, 2, 2, 206, 217, 5, 82, 42, 2, 207, 208, 7, 13, 2, 2, 208, 213, 7, 67, 2, 2, 209, 210, 7, 10, 2, 2, 210, 212, 7, 67, 2, 2, 211, 209, 3, 2, 2, 2, 212, 215, 3, 2, 2, 2, 213, 211, 3, 2, 2, 2, 213, 214, 3, 2, 2, 2, 214, 216, 3, 2, 2, 2, 215, 213, 3, 2, 2, 2, 216, 218, 7, 14, 2, 2, 217, 207, 3, 2, 2, 2, 217, 218, 3, 2, 2, 2, 218, 15, 3, 2, 2, 2, 219, 221, 7, 15, 2, 2, 220, 219, 3, 2, 2, 2, 220, 221, 3, 2, 2, 2, 221, 222, 3, 2, 2, 2, 222, 227, 5, 18, 10, 2, 223, 224, 7, 15, 2, 2, 224, 226, 5, 18, 10, 2, 225, 223, 3, 2, 2, 2, 226, 229, 3, 2, 2, 2, 227, 225, 3, 2, 2, 2, 227, 228, 3, 2, 2, 2, 228, 17, 3, 2, 2, 2, 229, 227, 3, 2, 2, 2, 230, 235, 5, 84, 43, 2, 231, 232, 7, 63, 2, 2, 232, 233, 5, 38, 20, 2, 233, 234, 7, 64, 2, 2, 234, 236, 3, 2, 2, 2, 235, 231, 3, 2, 2, 2, 235, 236, 3, 2, 2, 2, 236, 19, 3, 2, 2, 2, 237, 238, 7, 16, 2, 2, 238, 241, 5, 82, 42, 2, 239, 240, 7, 7, 2, 2, 240, 242, 5, 38, 20, 2, 241, 239, 3, 2, 2, 2, 241, 242, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 244, 7, 62, 2, 2, 244, 246, 5, 46, 24, 2, 245, 247, 7, 11, 2, 2, 246, 245, 3, 2, 2, 2, 246, 247, 3, 2, 2, 2, 247, 21, 3, 2, 2, 2, 248, 258, 7, 17, 2, 2, 249, 258, 7, 18, 2, 2, 250, 251, 7, 19, 2, 2, 251, 258, 7, 17, 2, 2, 252, 253, 7, 19, 2, 2, 253, 258, 7, 18, 2, 2, 254, 258, 7, 20, 2, 2, 255, 258, 7, 21, 2, 2, 256, 258, 7, 22, 2, 2, 257, 248, 3, 2, 2, 2, 257, 249, 3, 2, 2, 2, 257, 250, 3, 2, 2, 2, 257, 252, 3, 2, 2, 2, 257, 254, 3, 2, 2, 2, 257, 255, 3, 2, 2, 2, 257, 256, 3, 2, 2, 2, 258, 23, 3, 2, 2, 2, 259, 260, 7, 23, 2, 2, 260, 261, 5, 32, 17, 2, 261, 262, 7, 24, 2, 2, 262, 265, 5, 68, 35, 2, 263, 264, 7, 25, 2, 2, 264, 266, 5, 36, 19, 2, 265, 263, 3, 2, 2, 2, 265, 266, 3, 2, 2, 2, 266, 278, 3, 2, 2, 2, 267, 268, 7, 23, 2, 2, 268, 271, 5, 32, 17, 2, 269, 270, 7, 26, 2, 2, 270, 272, 5, 32, 17, 2, 271, 269, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 275, 3, 2, 2, 2, 273, 274, 7, 25, 2, 2, 274, 276, 5, 36, 19, 2, 275, 273, 3, 2, 2, 2, 275, 276, 3, 2, 2, 2, 276, 278, 3, 2, 2, 2, 277, 259, 3, 2, 2, 2, 277, 267, 3, 2, 2, 2, 278, 25, 3, 2, 2, 2, 279, 280, 7, 27, 2, 2, 280, 281, 5, 32, 17, 2, 281, 282, 7, 24, 2, 2, 282, 283, 5, 68, 35, 2, 283, 291, 3, 2, 2, 2, 284, 285, 7, 27, 2, 2, 285, 288, 5, 32, 17, 2, 286, 287, 7, 26, 2, 2, 287, 289, 5, 32, 17, 2, 288, 286, 3, 2, 2, 2, 288, 289, 3, 2, 2, 2, 289, 291, 3, 2, 2, 2, 290, 279, 3, 2, 2, 2, 290, 284, 3, 2, 2, 2, 291, 27, 3, 2, 2, 2, 292, 293, 7, 23, 2, 2, 293, 294, 5, 30, 16, 2, 294, 295, 7, 63, 2, 2, 295, 296, 5, 32, 17, 2, 296, 297, 7, 62, 2, 2, 297, 305, 5, 46, 24, 2, 298, 299, 7, 10, 2, 2, 299, 300, 5, 32, 17, 2, 300, 301, 7, 62, 2, 2, 301, 302, 5, 46, 24, 2, 302, 304, 3, 2, 2, 2, 303, 298, 3, 2, 2, 2, 304, 307, 3, 2, 2, 2, 305, 303, 3, 2, 2, 2, 305, 306, 3, 2, 2, 2, 306, 308, 3, 2, 2, 2, 307, 305, 3, 2, 2, 2, 308, 309, 7, 64, 2, 2, 309, 310, 7, 24, 2, 2, 310, 313, 7, 53, 2, 2, 311, 312, 7, 25, 2, 2, 312, 314, 5, 36, 19, 2, 313, 311, 3, 2, 2, 2, 313, 314, 3, 2, 2, 2, 314, 339, 3, 2, 2, 2, 315, 316, 7, 23, 2, 2, 316, 317, 5, 30, 16, 2, 317, 318, 7, 63, 2, 2, 318, 319, 5, 32, 17, 2, 319, 320, 7, 62, 2, 2, 320, 328, 5, 46, 24, 2, 321, 322, 7, 10, 2, 2, 322, 323, 5, 32, 17, 2, 323, 324, 7, 62, 2, 2, 324, 325, 5, 46, 24, 2, 325, 327, 3, 2, 2, 2, 326, 321, 3, 2, 2, 2, 327, 330, 3, 2, 2, 2, 328, 326, 3, 2, 2, 2, 328, 329, 3, 2, 2, 2, 329, 331, 3, 2, 2, 2, 330, 328, 3, 2, 2, 2, 331, 332, 7, 64, 2, 2, 332, 333, 7, 26, 2, 2, 333, 336, 5, 34, 18, 2, 334, 335, 7, 25, 2, 2, 335, 337, 5, 36, 19, 2, 336, 334, 3, 2, 2, 2, 336, 337, 3, 2, 2, 2, 337, 339, 3, 2, 2, 2, 338, 292, 3, 2, 2, 2, 338, 315, 3, 2, 2, 2, 339, 29, 3, 2, 2, 2, 340, 341, 5, 82, 42, 2, 341, 31, 3, 2, 2, 2, 342, 343, 5, 82, 42, 2, 343, 33, 3, 2, 2, 2, 344, 345, 5, 82, 42, 2, 345, 35, 3, 2, 2, 2, 346, 347, 7, 42, 2, 2, 347, 37, 3, 2, 2, 2, 348, 349, 8, 20, 1, 2, 349, 358, 7, 63, 2, 2, 350, 355, 5, 38, 20, 2, 351, 352, 7, 10, 2, 2, 352, 354, 5, 38, 20, 2, 353, 351, 3, 2, 2, 2, 354, 357, 3, 2, 2, 2, 355, 353, 3, 2, 2, 2, 355, 356, 3, 2, 2, 2, 356, 359, 3, 2, 2, 2, 357, 355, 3, 2, 2, 2, 358, 350, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 361, 3, 2, 2, 2, 360, 362, 7, 10, 2, 2, 361, 360, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 364, 7, 64, 2, 2, 364, 365, 7, 29, 2, 2, 365, 419, 5, 38, 20, 14, 366, 367, 7, 65, 2, 2, 367, 368, 7, 13, 2, 2, 368, 369, 5, 38, 20, 2, 369, 370, 7, 14, 2, 2, 370, 419, 3, 2, 2, 2, 371, 372, 7, 66, 2, 2, 372, 373, 7, 13, 2, 2, 373, 374, 5, 38, 20, 2, 374, 375, 7, 14, 2, 2, 375, 419, 3, 2, 2, 2, 376, 377, 7, 63, 2, 2, 377, 378, 5, 38, 20, 2, 378, 379, 7, 10, 2, 2, 379, 384, 5, 38, 20, 2, 380, 381, 7, 10, 2, 2, 381, 383, 5, 38, 20, 2, 382, 380, 3, 2, 2, 2, 383, 386, 3, 2, 2, 2, 384, 382, 3, 2, 2, 2, 384, 385, 3, 2, 2, 2, 385, 388, 3, 2, 2, 2, 386, 384, 3, 2, 2, 2, 387, 389, 7, 10, 2, 2, 388, 387, 3, 2, 2, 2, 388, 389, 3, 2, 2, 2, 389, 390, 3, 2, 2, 2, 390, 391, 7, 64, 2, 2, 391, 419, 3, 2, 2, 2, 392, 394, 7, 4, 2, 2, 393, 395, 5, 42, 22, 2, 394, 393, 3, 2, 2, 2, 394, 395, 3, 2, 2, 2, 395, 396, 3, 2, 2, 2, 396, 419, 7, 5, 2, 2, 397, 419, 7, 30, 2, 2, 398, 419, 7, 31, 2, 2, 399, 419, 7, 32, 2, 2, 400, 419, 5, 40, 21, 2, 401, 419, 5, 82, 42, 2, 402, 403, 7, 63, 2, 2, 403, 404, 5, 38, 20, 2, 404, 405, 7, 64, 2, 2, 405, 419, 3, 2, 2, 2, 406, 407, 5, 82, 42, 2, 407, 408, 7, 13, 2, 2, 408, 413, 5, 38, 20, 2, 409, 410, 7, 10, 2, 2, 410, 412, 5, 38, 20, 2, 411, 409, 3, 2, 2, 2, 412, 415, 3, 2, 2, 2, 413, 411, 3, 2, 2, 2, 413, 414, 3, 2, 2, 2, 414, 416, 3, 2, 2, 2, 415, 413, 3, 2, 2, 2, 416, 417, 7, 14, 2, 2, 417, 419, 3, 2, 2, 2, 418, 348, 3, 2, 2, 2, 418, 366, 3, 2, 2, 2, 418, 371, 3, 2, 2, 2, 418, 376, 3, 2, 2, 2, 418, 392, 3, 2, 2, 2, 418, 397, 3, 2, 2, 2, 418, 398, 3, 2, 2, 2, 418, 399, 3, 2, 2, 2, 418, 400, 3, 2, 2, 2, 418, 401, 3, 2, 2, 2, 418, 402, 3, 2, 2, 2, 418, 406, 3, 2, 2, 2, 419, 428, 3, 2, 2, 2, 420, 421, 12, 16, 2, 2, 421, 422, 7, 28, 2, 2, 422, 427, 5, 38, 20, 16, 423, 424, 12, 15, 2, 2, 424, 425, 7, 29, 2, 2, 425, 427, 5, 38, 20, 15, 426, 420, 3, 2, 2, 2, 426, 423, 3, 2, 2, 2, 427, 430, 3, 2, 2, 2, 428, 426, 3, 2, 2, 2, 428, 429, 3, 2, 2, 2, 429, 39, 3, 2, 2, 2, 430, 428, 3, 2, 2, 2, 431, 432, 7, 67, 2, 2, 432, 41, 3, 2, 2, 2, 433, 434, 5, 44, 23, 2, 434, 435, 7, 7, 2, 2, 435, 436, 5, 38, 20, 2, 436, 444, 3, 2, 2, 2, 437, 438, 7, 10, 2, 2, 438, 439, 5, 44, 23, 2, 439, 440, 7, 7, 2, 2, 440, 441, 5, 38, 20, 2, 441, 443, 3, 2, 2, 2, 442, 437, 3, 2, 2, 2, 443, 446, 3, 2, 2, 2, 444, 442, 3, 2, 2, 2, 444, 445, 3, 2, 2, 2, 445, 450, 3, 2, 2, 2, 446, 444, 3, 2, 2, 2, 447, 451, 7, 10, 2, 2, 448, 449, 7, 15, 2, 2, 449, 451, 5, 86, 44, 2, 450, 447, 3, 2, 2, 2, 450, 448, 3, 2, 2, 2, 450, 451, 3, 2, 2, 2, 451, 455, 3, 2, 2, 2, 452, 453, 7, 15, 2, 2, 453, 455, 5, 86, 44, 2, 454, 433, 3, 2, 2, 2, 454, 452, 3, 2, 2, 2, 455, 43, 3, 2, 2, 2, 456, 457, 5, 84, 43, 2, 457, 45, 3, 2, 2, 2, 458, 459, 8, 24, 1, 2, 459, 609, 5, 56, 29, 2, 460, 461, 5, 74, 38, 2, 461, 463, 7, 63, 2, 2, 462, 464, 5, 70, 36, 2, 463, 462, 3, 2, 2, 2, 463, 464, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, 466, 7, 64, 2, 2, 466, 609, 3, 2, 2, 2, 467, 468, 7, 52, 2, 2, 468, 609, 5, 46, 24, 27, 469, 470, 5, 82, 42, 2, 470, 471, 7, 34, 2, 2, 471, 472, 7, 62, 2, 2, 472, 473, 5, 46, 24, 23, 473, 609, 3, 2, 2, 2, 474, 475, 7, 45, 2, 2, 475, 476, 7, 4, 2, 2, 476, 481, 5, 46, 24, 2, 477, 478, 7, 10, 2, 2, 478, 480, 5, 46, 24, 2, 479, 477, 3, 2, 2, 2, 480, 483, 3, 2, 2, 2, 481, 479, 3, 2, 2, 2, 481, 482, 3, 2, 2, 2, 482, 485, 3, 2, 2, 2, 483, 481, 3, 2, 2, 2, 484, 486, 7, 10, 2, 2, 485, 484, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 7, 5, 2, 2, 488, 609, 3, 2, 2, 2, 489, 490, 7, 46, 2, 2, 490, 491, 7, 4, 2, 2, 491, 496, 5, 46, 24, 2, 492, 493, 7, 10, 2, 2, 493, 495, 5, 46, 24, 2, 494, 492, 3, 2, 2, 2, 495, 498, 3, 2, 2, 2, 496, 494, 3, 2, 2, 2, 496, 497, 3, 2, 2, 2, 497, 500, 3, 2, 2, 2, 498, 496, 3, 2, 2, 2, 499, 501, 7, 10, 2, 2, 500, 499, 3, 2, 2, 2, 500, 501, 3, 2, 2, 2, 501, 502, 3, 2, 2, 2, 502, 503, 7, 5, 2, 2, 503, 609, 3, 2, 2, 2, 504, 609, 5, 48, 25, 2, 505, 506, 7, 35, 2, 2, 506, 507, 7, 4, 2, 2, 507, 512, 5, 46, 24, 2, 508, 509, 7, 10, 2, 2, 509, 511, 5, 46, 24, 2, 510, 508, 3, 2, 2, 2, 511, 514, 3, 2, 2, 2, 512, 510, 3, 2, 2, 2, 512, 513, 3, 2, 2, 2, 513, 516, 3, 2, 2, 2, 514, 512, 3, 2, 2, 2, 515, 517, 7, 10, 2, 2, 516, 515, 3, 2, 2, 2, 516, 517, 3, 2, 2, 2, 517, 518, 3, 2, 2, 2, 518, 519, 7, 5, 2, 2, 519, 609, 3, 2, 2, 2, 520, 521, 7, 36, 2, 2, 521, 522, 7, 4, 2, 2, 522, 527, 5, 46, 24, 2, 523, 524, 7, 10, 2, 2, 524, 526, 5, 46, 24, 2, 525, 523, 3, 2, 2, 2, 526, 529, 3, 2, 2, 2, 527, 525, 3, 2, 2, 2, 527, 528, 3, 2, 2, 2, 528, 531, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 530, 532, 7, 10, 2, 2, 531, 530, 3, 2, 2, 2, 531, 532, 3, 2, 2, 2, 532, 533, 3, 2, 2, 2, 533, 534, 7, 5, 2, 2, 534, 609, 3, 2, 2, 2, 535, 540, 5, 82, 42, 2, 536, 540, 7, 44, 2, 2, 537, 540, 7, 43, 2, 2, 538, 540, 7, 42, 2, 2, 539, 535, 3, 2, 2, 2, 539, 536, 3, 2, 2, 2, 539, 537, 3, 2, 2, 2, 539, 538, 3, 2, 2, 2, 540, 609, 3, 2, 2, 2, 541, 542, 7, 63, 2, 2, 542, 543, 5, 46, 24, 2, 543, 544, 7, 10, 2, 2, 544, 549, 5, 46, 24, 2, 545, 546, 7, 10, 2, 2, 546, 548, 5, 46, 24, 2, 547, 545, 3, 2, 2, 2, 548, 551, 3, 2, 2, 2, 549, 547, 3, 2, 2, 2, 549, 550, 3, 2, 2, 2, 550, 553, 3, 2, 2, 2, 551, 549, 3, 2, 2, 2, 552, 554, 7, 10, 2, 2, 553, 552, 3, 2, 2, 2, 553, 554, 3, 2, 2, 2, 554, 555, 3, 2, 2, 2, 555, 556, 7, 64, 2, 2, 556, 609, 3, 2, 2, 2, 557, 558, 7, 4, 2, 2, 558, 563, 5, 72, 37, 2, 559, 560, 7, 10, 2, 2, 560, 562, 5, 72, 37, 2, 561, 559, 3, 2, 2, 2, 562, 565, 3, 2, 2, 2, 563, 561, 3, 2, 2, 2, 563, 564, 3, 2, 2, 2, 564, 567, 3, 2, 2, 2, 565, 563, 3, 2, 2, 2, 566, 568, 7, 10, 2, 2, 567, 566, 3, 2, 2, 2, 567, 568, 3, 2, 2, 2, 568, 569, 3, 2, 2, 2, 569, 570, 7, 5, 2, 2, 570, 609, 3, 2, 2, 2, 571, 580, 7, 13, 2, 2, 572, 577, 5, 46, 24, 2, 573, 574, 7, 10, 2, 2, 574, 576, 5, 46, 24, 2, 575, 573, 3, 2, 2, 2, 576, 579, 3, 2, 2, 2, 577, 575, 3, 2, 2, 2, 577, 578, 3, 2, 2, 2, 578, 581, 3, 2, 2, 2, 579, 577, 3, 2, 2, 2, 580, 572, 3, 2, 2, 2, 580, 581, 3, 2, 2, 2, 581, 583, 3, 2, 2, 2, 582, 584, 7, 10, 2, 2, 583, 582, 3, 2, 2, 2, 583, 584, 3, 2, 2, 2, 584, 585, 3, 2, 2, 2, 585, 609, 7, 14, 2, 2, 586, 587, 7, 37, 2, 2, 587, 588, 7, 63, 2, 2, 588, 589, 5, 46, 24, 2, 589, 590, 7, 64, 2, 2, 590, 591, 5, 46, 24, 2, 591, 592, 7, 38, 2, 2, 592, 593, 5, 46, 24, 7, 593, 609, 3, 2, 2, 2, 594, 595, 5, 10, 6, 2, 595, 596, 5, 46, 24, 6, 596, 609, 3, 2, 2, 2, 597, 598, 5, 20, 11, 2, 598, 599, 5, 46, 24, 5, 599, 609, 3, 2, 2, 2, 600, 601, 7, 63, 2, 2, 601, 602, 5, 46, 24, 2, 602, 603, 7, 64, 2, 2, 603, 609, 3, 2, 2, 2, 604, 605, 7, 4, 2, 2, 605, 606, 5, 46, 24, 2, 606, 607, 7, 5, 2, 2, 607, 609, 3, 2, 2, 2, 608, 458, 3, 2, 2, 2, 608, 460, 3, 2, 2, 2, 608, 467, 3, 2, 2, 2, 608, 469, 3, 2, 2, 2, 608, 474, 3, 2, 2, 2, 608, 489, 3, 2, 2, 2, 608, 504, 3, 2, 2, 2, 608, 505, 3, 2, 2, 2, 608, 520, 3, 2, 2, 2, 608, 539, 3, 2, 2, 2, 608, 541, 3, 2, 2, 2, 608, 557, 3, 2, 2, 2, 608, 571, 3, 2, 2, 2, 608, 586, 3, 2, 2, 2, 608, 594, 3, 2, 2, 2, 608, 597, 3, 2, 2, 2, 608, 600, 3, 2, 2, 2, 608, 604, 3, 2, 2, 2, 609, 659, 3, 2, 2, 2, 610, 611, 12, 28, 2, 2, 611, 612, 7, 33, 2, 2, 612, 658, 5, 46, 24, 28, 613, 614, 12, 26, 2, 2, 614, 615, 9, 2, 2, 2, 615, 658, 5, 46, 24, 27, 616, 617, 12, 25, 2, 2, 617, 618, 9, 3, 2, 2, 618, 658, 5, 46, 24, 26, 619, 620, 12, 24, 2, 2, 620, 621, 9, 4, 2, 2, 621, 658, 5, 46, 24, 25, 622, 623, 12, 22, 2, 2, 623, 624, 7, 62, 2, 2, 624, 625, 5, 46, 24, 23, 625, 626, 8, 24, 1, 2, 626, 658, 3, 2, 2, 2, 627, 628, 12, 20, 2, 2, 628, 629, 7, 45, 2, 2, 629, 658, 5, 46, 24, 21, 630, 631, 12, 18, 2, 2, 631, 632, 7, 46, 2, 2, 632, 658, 5, 46, 24, 19, 633, 634, 12, 17, 2, 2, 634, 635, 7, 47, 2, 2, 635, 658, 5, 46, 24, 18, 636, 637, 12, 16, 2, 2, 637, 638, 7, 48, 2, 2, 638, 658, 5, 46, 24, 17, 639, 640, 12, 10, 2, 2, 640, 641, 7, 28, 2, 2, 641, 658, 5, 46, 24, 11, 642, 643, 12, 32, 2, 2, 643, 644, 7, 24, 2, 2, 644, 650, 5, 76, 39, 2, 645, 647, 7, 63, 2, 2, 646, 648, 5, 70, 36, 2, 647, 646, 3, 2, 2, 2, 647, 648, 3, 2, 2, 2, 648, 649, 3, 2, 2, 2, 649, 651, 7, 64, 2, 2, 650, 645, 3, 2, 2, 2, 650, 651, 3, 2, 2, 2, 651, 658, 3, 2, 2, 2, 652, 653, 12, 29, 2, 2, 653, 654, 7, 13, 2, 2, 654, 655, 5, 46, 24, 2, 655, 656, 7, 14, 2, 2, 656, 658, 3, 2, 2, 2, 657, 610, 3, 2, 2, 2, 657, 613, 3, 2, 2, 2, 657, 616, 3, 2, 2, 2, 657, 619, 3, 2, 2, 2, 657, 622, 3, 2, 2, 2, 657, 627, 3, 2, 2, 2, 657, 630, 3, 2, 2, 2, 657, 633, 3, 2, 2, 2, 657, 636, 3, 2, 2, 2, 657, 639, 3, 2, 2, 2, 657, 642, 3, 2, 2, 2, 657, 652, 3, 2, 2, 2, 658, 661, 3, 2, 2, 2, 659, 657, 3, 2, 2, 2, 659, 660, 3, 2, 2, 2, 660, 47, 3, 2, 2, 2, 661, 659, 3, 2, 2, 2, 662, 663, 7, 50, 2, 2, 663, 664, 5, 46, 24, 2, 664, 666, 7, 4, 2, 2, 665, 667, 7, 15, 2, 2, 666, 665, 3, 2, 2, 2, 666, 667, 3, 2, 2, 2, 667, 668, 3, 2, 2, 2, 668, 673, 5, 50, 26, 2, 669, 670, 7, 15, 2, 2, 670, 672, 5, 50, 26, 2, 671, 669, 3, 2, 2, 2, 672, 675, 3, 2, 2, 2, 673, 671, 3, 2, 2, 2, 673, 674, 3, 2, 2, 2, 674, 676, 3, 2, 2, 2, 675, 673, 3, 2, 2, 2, 676, 677, 7, 5, 2, 2, 677, 49, 3, 2, 2, 2, 678, 681, 5, 52, 27, 2, 679, 681, 7, 39, 2, 2, 680, 678, 3, 2, 2, 2, 680, 679, 3, 2, 2, 2, 681, 682, 3, 2, 2, 2, 682, 683, 7, 29, 2, 2, 683, 684, 5, 46, 24, 2, 684, 51, 3, 2, 2, 2, 685, 692, 5, 84, 43, 2, 686, 689, 7, 63, 2, 2, 687, 690, 5, 84, 43, 2, 688, 690, 7, 39, 2, 2, 689, 687, 3, 2, 2, 2, 689, 688, 3, 2, 2, 2, 690, 691, 3, 2, 2, 2, 691, 693, 7, 64, 2, 2, 692, 686, 3, 2, 2, 2, 692, 693, 3, 2, 2, 2, 693, 53, 3, 2, 2, 2, 694, 695, 5, 8, 5, 2, 695, 696, 7, 2, 2, 3, 696, 704, 3, 2, 2, 2, 697, 698, 5, 46, 24, 2, 698, 699, 7, 2, 2, 3, 699, 704, 3, 2, 2, 2, 700, 701, 7, 69, 2, 2, 701, 704, 7, 2, 2, 3, 702, 704, 7, 2, 2, 3, 703, 694, 3, 2, 2, 2, 703, 697, 3, 2, 2, 2, 703, 700, 3, 2, 2, 2, 703, 702, 3, 2, 2, 2, 704, 55, 3, 2, 2, 2, 705, 708, 5, 58, 30, 2, 706, 708, 5, 60, 31, 2, 707, 705, 3, 2, 2, 2, 707, 706, 3, 2, 2, 2, 708, 57, 3, 2, 2, 2, 709, 710, 5, 64, 33, 2, 710, 711, 7, 29, 2, 2, 711, 712, 5, 46, 24, 2, 712, 727, 3, 2, 2, 2, 713, 714, 7, 63, 2, 2, 714, 719, 5, 64, 33, 2, 715, 716, 7, 10, 2, 2, 716, 718, 5, 64, 33, 2, 717, 715, 3, 2, 2, 2, 718, 721, 3, 2, 2, 2, 719, 717, 3, 2, 2, 2, 719, 720, 3, 2, 2, 2, 720, 722, 3, 2, 2, 2, 721, 719, 3, 2, 2, 2, 722, 723, 7, 64, 2, 2, 723, 724, 7, 29, 2, 2, 724, 725, 5, 46, 24, 2, 725, 727, 3, 2, 2, 2, 726, 709, 3, 2, 2, 2, 726, 713, 3, 2, 2, 2, 727, 59, 3, 2, 2, 2, 728, 729, 7, 63, 2, 2, 729, 730, 7, 63, 2, 2, 730, 733, 5, 64, 33, 2, 731, 732, 7, 10, 2, 2, 732, 734, 5, 64, 33, 2, 733, 731, 3, 2, 2, 2, 734, 735, 3, 2, 2, 2, 735, 733, 3, 2, 2, 2, 735, 736, 3, 2, 2, 2, 736, 737, 3, 2, 2, 2, 737, 738, 7, 64, 2, 2, 738, 739, 7, 64, 2, 2, 739, 740, 7, 29, 2, 2, 740, 741, 5, 46, 24, 2, 741, 61, 3, 2, 2, 2, 742, 745, 7, 39, 2, 2, 743, 745, 5, 82, 42, 2, 744, 742, 3, 2, 2, 2, 744, 743, 3, 2, 2, 2, 745, 63, 3, 2, 2, 2, 746, 747, 5, 62, 32, 2, 747, 65, 3, 2, 2, 2, 748, 749, 5, 62, 32, 2, 749, 750, 7, 7, 2, 2, 750, 751, 5, 38, 20, 2, 751, 67, 3, 2, 2, 2, 752, 755, 7, 53, 2, 2, 753, 755, 5, 82, 42, 2, 754, 752, 3, 2, 2, 2, 754, 753, 3, 2, 2, 2, 755, 69, 3, 2, 2, 2, 756, 761, 5, 46, 24, 2, 757, 758, 7, 10, 2, 2, 758, 760, 5, 46, 24, 2, 759, 757, 3, 2, 2, 2, 760, 763, 3, 2, 2, 2, 761, 759, 3, 2, 2, 2, 761, 762, 3, 2, 2, 2, 762, 71, 3, 2, 2, 2, 763, 761, 3, 2, 2, 2, 764, 765, 5, 84, 43, 2, 765, 766, 7, 7, 2, 2, 766, 767, 5, 46, 24, 2, 767, 771, 3, 2, 2, 2, 768, 769, 7, 40, 2, 2, 769, 771, 5, 46, 24, 2, 770, 764, 3, 2, 2, 2, 770, 768, 3, 2, 2, 2, 771, 73, 3, 2, 2, 2, 772, 775, 5, 82, 42, 2, 773, 775, 9, 5, 2, 2, 774, 772, 3, 2, 2, 2, 774, 773, 3, 2, 2, 2, 775, 75, 3, 2, 2, 2, 776, 779, 5, 82, 42, 2, 777, 779, 9, 6, 2, 2, 778, 776, 3, 2, 2, 2, 778, 777, 3, 2, 2, 2, 779, 77, 3, 2, 2, 2, 780, 781, 9, 7, 2, 2, 781, 79, 3, 2, 2, 2, 782, 783, 9, 8, 2, 2, 783, 81, 3, 2, 2, 2, 784, 789, 5, 86, 44, 2, 785, 786, 7, 41, 2, 2, 786, 788, 5, 86, 44, 2, 787, 785, 3, 2, 2, 2, 788, 791, 3, 2, 2, 2, 789, 787, 3, 2, 2, 2, 789, 790, 3, 2, 2, 2, 790, 83, 3, 2, 2, 2, 791, 789, 3, 2, 2, 2, 792, 797, 5, 86, 44, 2, 793, 794, 5, 82, 42, 2, 794, 795, 8, 43, 1, 2, 795, 797, 3, 2, 2, 2, 796, 792, 3, 2, 2, 2, 796, 793, 3, 2, 2, 2, 797, 85, 3, 2, 2, 2, 798, 799, 9, 9, 2, 2, 799, 87, 3, 2, 2, 2, 90, 91, 98, 107, 115, 140, 150, 158, 161, 171, 174, 177, 181, 185, 188, 190, 204, 213, 217, 220, 227, 235, 241, 246, 257, 265, 271, 275, 277, 288, 290, 305, 313, 328, 336, 338, 355, 358, 361, 384, 388, 394, 413, 418, 426, 428, 444, 450, 454, 463, 481, 485, 496, 500, 512, 516, 527, 531, 539, 549, 553, 563, 567, 577, 580, 583, 608, 647, 650, 657, 659, 666, 673, 680, 689, 692, 703, 707, 719, 726, 735, 744, 754, 761, 770, 774, 778, 789, 796] \ No newline at end of file diff --git a/quint/src/generated/QuintParser.ts b/quint/src/generated/QuintParser.ts index f2ba2709c..8cb906851 100644 --- a/quint/src/generated/QuintParser.ts +++ b/quint/src/generated/QuintParser.ts @@ -708,7 +708,7 @@ export class QuintParser extends Parser { { this.state = 204; _localctx._typeName = this.qualId(); - this.state = 216; + this.state = 215; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__10) { @@ -716,8 +716,8 @@ export class QuintParser extends Parser { this.state = 205; this.match(QuintParser.T__10); this.state = 206; - _localctx._typeVar = this.typeVar(); - _localctx._typeVars.push(_localctx._typeVar); + _localctx._LOW_ID = this.match(QuintParser.LOW_ID); + _localctx._typeVars.push(_localctx._LOW_ID); this.state = 211; this._errHandler.sync(this); _la = this._input.LA(1); @@ -727,8 +727,8 @@ export class QuintParser extends Parser { this.state = 207; this.match(QuintParser.T__7); this.state = 208; - _localctx._typeVar = this.typeVar(); - _localctx._typeVars.push(_localctx._typeVar); + _localctx._LOW_ID = this.match(QuintParser.LOW_ID); + _localctx._typeVars.push(_localctx._LOW_ID); } } this.state = 213; @@ -764,31 +764,31 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 219; + this.state = 218; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__12) { { - this.state = 218; + this.state = 217; this.match(QuintParser.T__12); } } - this.state = 221; + this.state = 220; this.typeSumVariant(); - this.state = 226; + this.state = 225; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__12) { { { - this.state = 222; + this.state = 221; this.match(QuintParser.T__12); - this.state = 223; + this.state = 222; this.typeSumVariant(); } } - this.state = 228; + this.state = 227; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -816,18 +816,18 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 229; + this.state = 228; _localctx._sumLabel = this.simpleId("variant label"); - this.state = 234; + this.state = 233; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.LPAREN) { { - this.state = 230; + this.state = 229; this.match(QuintParser.LPAREN); - this.state = 231; + this.state = 230; this.type(0); - this.state = 232; + this.state = 231; this.match(QuintParser.RPAREN); } } @@ -856,32 +856,32 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 236; + this.state = 235; this.match(QuintParser.T__13); - this.state = 237; + this.state = 236; this.qualId(); - this.state = 240; + this.state = 239; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__4) { { - this.state = 238; + this.state = 237; this.match(QuintParser.T__4); - this.state = 239; + this.state = 238; this.type(0); } } - this.state = 242; + this.state = 241; this.match(QuintParser.ASGN); - this.state = 243; + this.state = 242; this.expr(0); - this.state = 245; + this.state = 244; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__8) { { - this.state = 244; + this.state = 243; this.match(QuintParser.T__8); } } @@ -907,13 +907,13 @@ export class QuintParser extends Parser { let _localctx: QualifierContext = new QualifierContext(this._ctx, this.state); this.enterRule(_localctx, 20, QuintParser.RULE_qualifier); try { - this.state = 256; + this.state = 255; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 23, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 247; + this.state = 246; this.match(QuintParser.T__14); } break; @@ -921,7 +921,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 248; + this.state = 247; this.match(QuintParser.T__15); } break; @@ -929,9 +929,9 @@ export class QuintParser extends Parser { case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 249; + this.state = 248; this.match(QuintParser.T__16); - this.state = 250; + this.state = 249; this.match(QuintParser.T__14); } break; @@ -939,9 +939,9 @@ export class QuintParser extends Parser { case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 251; + this.state = 250; this.match(QuintParser.T__16); - this.state = 252; + this.state = 251; this.match(QuintParser.T__15); } break; @@ -949,7 +949,7 @@ export class QuintParser extends Parser { case 5: this.enterOuterAlt(_localctx, 5); { - this.state = 253; + this.state = 252; this.match(QuintParser.T__17); } break; @@ -957,7 +957,7 @@ export class QuintParser extends Parser { case 6: this.enterOuterAlt(_localctx, 6); { - this.state = 254; + this.state = 253; this.match(QuintParser.T__18); } break; @@ -965,7 +965,7 @@ export class QuintParser extends Parser { case 7: this.enterOuterAlt(_localctx, 7); { - this.state = 255; + this.state = 254; this.match(QuintParser.T__19); } break; @@ -991,28 +991,28 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 22, QuintParser.RULE_importMod); let _la: number; try { - this.state = 276; + this.state = 275; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 27, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 258; + this.state = 257; this.match(QuintParser.T__20); - this.state = 259; + this.state = 258; this.name(); - this.state = 260; + this.state = 259; this.match(QuintParser.T__21); - this.state = 261; + this.state = 260; this.identOrStar(); - this.state = 264; + this.state = 263; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__22) { { - this.state = 262; + this.state = 261; this.match(QuintParser.T__22); - this.state = 263; + this.state = 262; this.fromSource(); } } @@ -1023,30 +1023,30 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 266; + this.state = 265; this.match(QuintParser.T__20); - this.state = 267; + this.state = 266; this.name(); - this.state = 270; + this.state = 269; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__23) { { - this.state = 268; + this.state = 267; this.match(QuintParser.T__23); - this.state = 269; + this.state = 268; this.name(); } } - this.state = 274; + this.state = 273; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__22) { { - this.state = 272; + this.state = 271; this.match(QuintParser.T__22); - this.state = 273; + this.state = 272; this.fromSource(); } } @@ -1075,19 +1075,19 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 24, QuintParser.RULE_exportMod); let _la: number; try { - this.state = 289; + this.state = 288; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 29, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 278; + this.state = 277; this.match(QuintParser.T__24); - this.state = 279; + this.state = 278; this.name(); - this.state = 280; + this.state = 279; this.match(QuintParser.T__21); - this.state = 281; + this.state = 280; this.identOrStar(); } break; @@ -1095,18 +1095,18 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 283; + this.state = 282; this.match(QuintParser.T__24); - this.state = 284; + this.state = 283; this.name(); - this.state = 287; + this.state = 286; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__23) { { - this.state = 285; + this.state = 284; this.match(QuintParser.T__23); - this.state = 286; + this.state = 285; this.name(); } } @@ -1135,60 +1135,60 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 26, QuintParser.RULE_instanceMod); let _la: number; try { - this.state = 337; + this.state = 336; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 34, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 291; + this.state = 290; this.match(QuintParser.T__20); - this.state = 292; + this.state = 291; this.moduleName(); - this.state = 293; + this.state = 292; this.match(QuintParser.LPAREN); { - this.state = 294; + this.state = 293; this.name(); - this.state = 295; + this.state = 294; this.match(QuintParser.ASGN); - this.state = 296; + this.state = 295; this.expr(0); - this.state = 304; + this.state = 303; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 297; + this.state = 296; this.match(QuintParser.T__7); - this.state = 298; + this.state = 297; this.name(); - this.state = 299; + this.state = 298; this.match(QuintParser.ASGN); - this.state = 300; + this.state = 299; this.expr(0); } } - this.state = 306; + this.state = 305; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 307; + this.state = 306; this.match(QuintParser.RPAREN); - this.state = 308; + this.state = 307; this.match(QuintParser.T__21); - this.state = 309; + this.state = 308; this.match(QuintParser.MUL); - this.state = 312; + this.state = 311; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__22) { { - this.state = 310; + this.state = 309; this.match(QuintParser.T__22); - this.state = 311; + this.state = 310; this.fromSource(); } } @@ -1199,54 +1199,54 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 314; + this.state = 313; this.match(QuintParser.T__20); - this.state = 315; + this.state = 314; this.moduleName(); - this.state = 316; + this.state = 315; this.match(QuintParser.LPAREN); { - this.state = 317; + this.state = 316; this.name(); - this.state = 318; + this.state = 317; this.match(QuintParser.ASGN); - this.state = 319; + this.state = 318; this.expr(0); - this.state = 327; + this.state = 326; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 320; + this.state = 319; this.match(QuintParser.T__7); - this.state = 321; + this.state = 320; this.name(); - this.state = 322; + this.state = 321; this.match(QuintParser.ASGN); - this.state = 323; + this.state = 322; this.expr(0); } } - this.state = 329; + this.state = 328; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 330; + this.state = 329; this.match(QuintParser.RPAREN); - this.state = 331; + this.state = 330; this.match(QuintParser.T__23); - this.state = 332; + this.state = 331; this.qualifiedName(); - this.state = 335; + this.state = 334; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__22) { { - this.state = 333; + this.state = 332; this.match(QuintParser.T__22); - this.state = 334; + this.state = 333; this.fromSource(); } } @@ -1276,7 +1276,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 339; + this.state = 338; this.qualId(); } } @@ -1301,7 +1301,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 341; + this.state = 340; this.qualId(); } } @@ -1326,7 +1326,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 343; + this.state = 342; this.qualId(); } } @@ -1351,7 +1351,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 345; + this.state = 344; this.match(QuintParser.STRING); } } @@ -1389,7 +1389,7 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 417; + this.state = 416; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 42, this._ctx) ) { case 1: @@ -1398,51 +1398,51 @@ export class QuintParser extends Parser { this._ctx = _localctx; _prevctx = _localctx; - this.state = 348; + this.state = 347; this.match(QuintParser.LPAREN); - this.state = 357; + this.state = 356; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__27) | (1 << QuintParser.T__28) | (1 << QuintParser.T__29))) !== 0) || ((((_la - 61)) & ~0x1F) === 0 && ((1 << (_la - 61)) & ((1 << (QuintParser.LPAREN - 61)) | (1 << (QuintParser.SET - 61)) | (1 << (QuintParser.LIST - 61)) | (1 << (QuintParser.LOW_ID - 61)) | (1 << (QuintParser.CAP_ID - 61)))) !== 0)) { { - this.state = 349; + this.state = 348; this.type(0); - this.state = 354; + this.state = 353; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 35, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 350; + this.state = 349; this.match(QuintParser.T__7); - this.state = 351; + this.state = 350; this.type(0); } } } - this.state = 356; + this.state = 355; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 35, this._ctx); } } } - this.state = 360; + this.state = 359; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 359; + this.state = 358; this.match(QuintParser.T__7); } } - this.state = 362; + this.state = 361; this.match(QuintParser.RPAREN); - this.state = 363; + this.state = 362; this.match(QuintParser.T__26); - this.state = 364; + this.state = 363; this.type(12); } break; @@ -1452,13 +1452,13 @@ export class QuintParser extends Parser { _localctx = new TypeSetContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 365; + this.state = 364; this.match(QuintParser.SET); - this.state = 366; + this.state = 365; this.match(QuintParser.T__10); - this.state = 367; + this.state = 366; this.type(0); - this.state = 368; + this.state = 367; this.match(QuintParser.T__11); } break; @@ -1468,13 +1468,13 @@ export class QuintParser extends Parser { _localctx = new TypeListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 370; + this.state = 369; this.match(QuintParser.LIST); - this.state = 371; + this.state = 370; this.match(QuintParser.T__10); - this.state = 372; + this.state = 371; this.type(0); - this.state = 373; + this.state = 372; this.match(QuintParser.T__11); } break; @@ -1484,43 +1484,43 @@ export class QuintParser extends Parser { _localctx = new TypeTupleContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 375; + this.state = 374; this.match(QuintParser.LPAREN); - this.state = 376; + this.state = 375; this.type(0); - this.state = 377; + this.state = 376; this.match(QuintParser.T__7); - this.state = 378; + this.state = 377; this.type(0); - this.state = 383; + this.state = 382; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 379; + this.state = 378; this.match(QuintParser.T__7); - this.state = 380; + this.state = 379; this.type(0); } } } - this.state = 385; + this.state = 384; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); } - this.state = 387; + this.state = 386; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 386; + this.state = 385; this.match(QuintParser.T__7); } } - this.state = 389; + this.state = 388; this.match(QuintParser.RPAREN); } break; @@ -1530,19 +1530,19 @@ export class QuintParser extends Parser { _localctx = new TypeRecContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 391; + this.state = 390; this.match(QuintParser.T__1); - this.state = 393; + this.state = 392; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__12 || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 392; + this.state = 391; this.row(); } } - this.state = 395; + this.state = 394; this.match(QuintParser.T__2); } break; @@ -1552,7 +1552,7 @@ export class QuintParser extends Parser { _localctx = new TypeIntContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 396; + this.state = 395; this.match(QuintParser.T__27); } break; @@ -1562,7 +1562,7 @@ export class QuintParser extends Parser { _localctx = new TypeStrContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 397; + this.state = 396; this.match(QuintParser.T__28); } break; @@ -1572,7 +1572,7 @@ export class QuintParser extends Parser { _localctx = new TypeBoolContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 398; + this.state = 397; this.match(QuintParser.T__29); } break; @@ -1582,7 +1582,7 @@ export class QuintParser extends Parser { _localctx = new TypeVarCaseContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 399; + this.state = 398; this.typeVar(); } break; @@ -1592,7 +1592,7 @@ export class QuintParser extends Parser { _localctx = new TypeConstContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 400; + this.state = 399; this.qualId(); } break; @@ -1602,11 +1602,11 @@ export class QuintParser extends Parser { _localctx = new TypeParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 401; + this.state = 400; this.match(QuintParser.LPAREN); - this.state = 402; + this.state = 401; this.type(0); - this.state = 403; + this.state = 402; this.match(QuintParser.RPAREN); } break; @@ -1616,39 +1616,39 @@ export class QuintParser extends Parser { _localctx = new TypeAppContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 405; + this.state = 404; (_localctx as TypeAppContext)._typeCtor = this.qualId(); { - this.state = 406; + this.state = 405; this.match(QuintParser.T__10); - this.state = 407; + this.state = 406; (_localctx as TypeAppContext)._type = this.type(0); (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); - this.state = 412; + this.state = 411; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 408; + this.state = 407; this.match(QuintParser.T__7); - this.state = 409; + this.state = 408; (_localctx as TypeAppContext)._type = this.type(0); (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); } } - this.state = 414; + this.state = 413; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 415; + this.state = 414; this.match(QuintParser.T__11); } } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 427; + this.state = 426; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 44, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -1658,20 +1658,20 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 425; + this.state = 424; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 43, this._ctx) ) { case 1: { _localctx = new TypeFunContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 419; + this.state = 418; if (!(this.precpred(this._ctx, 14))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); } - this.state = 420; + this.state = 419; this.match(QuintParser.T__25); - this.state = 421; + this.state = 420; this.type(14); } break; @@ -1680,20 +1680,20 @@ export class QuintParser extends Parser { { _localctx = new TypeOperContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 422; + this.state = 421; if (!(this.precpred(this._ctx, 13))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 13)"); } - this.state = 423; + this.state = 422; this.match(QuintParser.T__26); - this.state = 424; + this.state = 423; this.type(13); } break; } } } - this.state = 429; + this.state = 428; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 44, this._ctx); } @@ -1720,7 +1720,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 430; + this.state = 429; this.match(QuintParser.LOW_ID); } } @@ -1744,7 +1744,7 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 40, QuintParser.RULE_row); try { let _alt: number; - this.state = 453; + this.state = 452; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: @@ -1752,50 +1752,50 @@ export class QuintParser extends Parser { this.enterOuterAlt(_localctx, 1); { { - this.state = 432; + this.state = 431; this.rowLabel(); - this.state = 433; + this.state = 432; this.match(QuintParser.T__4); - this.state = 434; + this.state = 433; this.type(0); } - this.state = 443; + this.state = 442; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 45, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 436; + this.state = 435; this.match(QuintParser.T__7); - this.state = 437; + this.state = 436; this.rowLabel(); - this.state = 438; + this.state = 437; this.match(QuintParser.T__4); - this.state = 439; + this.state = 438; this.type(0); } } } - this.state = 445; + this.state = 444; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 45, this._ctx); } - this.state = 449; + this.state = 448; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__7: { - this.state = 446; + this.state = 445; this.match(QuintParser.T__7); } break; case QuintParser.T__12: { - this.state = 447; + this.state = 446; this.match(QuintParser.T__12); { - this.state = 448; + this.state = 447; _localctx._rowVar = this.identifier(); } } @@ -1810,10 +1810,10 @@ export class QuintParser extends Parser { case QuintParser.T__12: this.enterOuterAlt(_localctx, 2); { - this.state = 451; + this.state = 450; this.match(QuintParser.T__12); { - this.state = 452; + this.state = 451; _localctx._rowVar = this.identifier(); } } @@ -1843,7 +1843,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 455; + this.state = 454; this.simpleId("record"); } } @@ -1881,7 +1881,7 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 607; + this.state = 606; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 65, this._ctx) ) { case 1: @@ -1890,7 +1890,7 @@ export class QuintParser extends Parser { this._ctx = _localctx; _prevctx = _localctx; - this.state = 458; + this.state = 457; this.lambda(); } break; @@ -1900,21 +1900,21 @@ export class QuintParser extends Parser { _localctx = new OperAppContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 459; + this.state = 458; this.normalCallName(); - this.state = 460; + this.state = 459; this.match(QuintParser.LPAREN); - this.state = 462; + this.state = 461; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 461; + this.state = 460; this.argList(); } } - this.state = 464; + this.state = 463; this.match(QuintParser.RPAREN); } break; @@ -1924,9 +1924,9 @@ export class QuintParser extends Parser { _localctx = new UminusContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 466; + this.state = 465; this.match(QuintParser.MINUS); - this.state = 467; + this.state = 466; this.expr(25); } break; @@ -1936,13 +1936,13 @@ export class QuintParser extends Parser { _localctx = new AsgnContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 468; + this.state = 467; this.qualId(); - this.state = 469; + this.state = 468; this.match(QuintParser.T__31); - this.state = 470; + this.state = 469; this.match(QuintParser.ASGN); - this.state = 471; + this.state = 470; this.expr(21); } break; @@ -1952,41 +1952,41 @@ export class QuintParser extends Parser { _localctx = new AndExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 473; + this.state = 472; this.match(QuintParser.AND); - this.state = 474; + this.state = 473; this.match(QuintParser.T__1); - this.state = 475; + this.state = 474; this.expr(0); - this.state = 480; + this.state = 479; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 476; + this.state = 475; this.match(QuintParser.T__7); - this.state = 477; + this.state = 476; this.expr(0); } } } - this.state = 482; + this.state = 481; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); } - this.state = 484; + this.state = 483; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 483; + this.state = 482; this.match(QuintParser.T__7); } } - this.state = 486; + this.state = 485; this.match(QuintParser.T__2); } break; @@ -1996,41 +1996,41 @@ export class QuintParser extends Parser { _localctx = new OrExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 488; + this.state = 487; this.match(QuintParser.OR); - this.state = 489; + this.state = 488; this.match(QuintParser.T__1); - this.state = 490; + this.state = 489; this.expr(0); - this.state = 495; + this.state = 494; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 51, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 491; + this.state = 490; this.match(QuintParser.T__7); - this.state = 492; + this.state = 491; this.expr(0); } } } - this.state = 497; + this.state = 496; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 51, this._ctx); } - this.state = 499; + this.state = 498; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 498; + this.state = 497; this.match(QuintParser.T__7); } } - this.state = 501; + this.state = 500; this.match(QuintParser.T__2); } break; @@ -2040,7 +2040,7 @@ export class QuintParser extends Parser { _localctx = new MatchContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 503; + this.state = 502; this.matchSumExpr(); } break; @@ -2050,41 +2050,41 @@ export class QuintParser extends Parser { _localctx = new ActionAllContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 504; + this.state = 503; this.match(QuintParser.T__32); - this.state = 505; + this.state = 504; this.match(QuintParser.T__1); - this.state = 506; + this.state = 505; this.expr(0); - this.state = 511; + this.state = 510; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 53, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 507; + this.state = 506; this.match(QuintParser.T__7); - this.state = 508; + this.state = 507; this.expr(0); } } } - this.state = 513; + this.state = 512; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 53, this._ctx); } - this.state = 515; + this.state = 514; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 514; + this.state = 513; this.match(QuintParser.T__7); } } - this.state = 517; + this.state = 516; this.match(QuintParser.T__2); } break; @@ -2094,41 +2094,41 @@ export class QuintParser extends Parser { _localctx = new ActionAnyContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 519; + this.state = 518; this.match(QuintParser.T__33); - this.state = 520; + this.state = 519; this.match(QuintParser.T__1); - this.state = 521; + this.state = 520; this.expr(0); - this.state = 526; + this.state = 525; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 55, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 522; + this.state = 521; this.match(QuintParser.T__7); - this.state = 523; + this.state = 522; this.expr(0); } } } - this.state = 528; + this.state = 527; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 55, this._ctx); } - this.state = 530; + this.state = 529; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 529; + this.state = 528; this.match(QuintParser.T__7); } } - this.state = 532; + this.state = 531; this.match(QuintParser.T__2); } break; @@ -2138,31 +2138,31 @@ export class QuintParser extends Parser { _localctx = new LiteralOrIdContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 538; + this.state = 537; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 534; + this.state = 533; this.qualId(); } break; case QuintParser.INT: { - this.state = 535; + this.state = 534; this.match(QuintParser.INT); } break; case QuintParser.BOOL: { - this.state = 536; + this.state = 535; this.match(QuintParser.BOOL); } break; case QuintParser.STRING: { - this.state = 537; + this.state = 536; this.match(QuintParser.STRING); } break; @@ -2177,43 +2177,43 @@ export class QuintParser extends Parser { _localctx = new TupleContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 540; + this.state = 539; this.match(QuintParser.LPAREN); - this.state = 541; + this.state = 540; this.expr(0); - this.state = 542; + this.state = 541; this.match(QuintParser.T__7); - this.state = 543; + this.state = 542; this.expr(0); - this.state = 548; + this.state = 547; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 58, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 544; + this.state = 543; this.match(QuintParser.T__7); - this.state = 545; + this.state = 544; this.expr(0); } } } - this.state = 550; + this.state = 549; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 58, this._ctx); } - this.state = 552; + this.state = 551; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 551; + this.state = 550; this.match(QuintParser.T__7); } } - this.state = 554; + this.state = 553; this.match(QuintParser.RPAREN); } break; @@ -2223,39 +2223,39 @@ export class QuintParser extends Parser { _localctx = new RecordContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 556; + this.state = 555; this.match(QuintParser.T__1); - this.state = 557; + this.state = 556; this.recElem(); - this.state = 562; + this.state = 561; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 60, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 558; + this.state = 557; this.match(QuintParser.T__7); - this.state = 559; + this.state = 558; this.recElem(); } } } - this.state = 564; + this.state = 563; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 60, this._ctx); } - this.state = 566; + this.state = 565; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 565; + this.state = 564; this.match(QuintParser.T__7); } } - this.state = 568; + this.state = 567; this.match(QuintParser.T__2); } break; @@ -2265,47 +2265,47 @@ export class QuintParser extends Parser { _localctx = new ListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 570; + this.state = 569; this.match(QuintParser.T__10); - this.state = 579; + this.state = 578; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 571; + this.state = 570; this.expr(0); - this.state = 576; + this.state = 575; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 62, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 572; + this.state = 571; this.match(QuintParser.T__7); - this.state = 573; + this.state = 572; this.expr(0); } } } - this.state = 578; + this.state = 577; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 62, this._ctx); } } } - this.state = 582; + this.state = 581; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 581; + this.state = 580; this.match(QuintParser.T__7); } } - this.state = 584; + this.state = 583; this.match(QuintParser.T__11); } break; @@ -2315,19 +2315,19 @@ export class QuintParser extends Parser { _localctx = new IfElseContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 585; + this.state = 584; this.match(QuintParser.T__34); - this.state = 586; + this.state = 585; this.match(QuintParser.LPAREN); - this.state = 587; + this.state = 586; this.expr(0); - this.state = 588; + this.state = 587; this.match(QuintParser.RPAREN); - this.state = 589; + this.state = 588; this.expr(0); - this.state = 590; + this.state = 589; this.match(QuintParser.T__35); - this.state = 591; + this.state = 590; this.expr(5); } break; @@ -2337,9 +2337,9 @@ export class QuintParser extends Parser { _localctx = new LetInContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 593; + this.state = 592; this.operDef(); - this.state = 594; + this.state = 593; this.expr(4); } break; @@ -2349,9 +2349,9 @@ export class QuintParser extends Parser { _localctx = new NondetContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 596; + this.state = 595; this.nondetOperDef(); - this.state = 597; + this.state = 596; this.expr(3); } break; @@ -2361,11 +2361,11 @@ export class QuintParser extends Parser { _localctx = new ParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 599; + this.state = 598; this.match(QuintParser.LPAREN); - this.state = 600; + this.state = 599; this.expr(0); - this.state = 601; + this.state = 600; this.match(QuintParser.RPAREN); } break; @@ -2375,17 +2375,17 @@ export class QuintParser extends Parser { _localctx = new BracesContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 603; + this.state = 602; this.match(QuintParser.T__1); - this.state = 604; + this.state = 603; this.expr(0); - this.state = 605; + this.state = 604; this.match(QuintParser.T__2); } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 658; + this.state = 657; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 69, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -2395,20 +2395,20 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 656; + this.state = 655; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 68, this._ctx) ) { case 1: { _localctx = new PowContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 609; + this.state = 608; if (!(this.precpred(this._ctx, 26))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 26)"); } - this.state = 610; + this.state = 609; (_localctx as PowContext)._op = this.match(QuintParser.T__30); - this.state = 611; + this.state = 610; this.expr(26); } break; @@ -2417,11 +2417,11 @@ export class QuintParser extends Parser { { _localctx = new MultDivContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 612; + this.state = 611; if (!(this.precpred(this._ctx, 24))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 24)"); } - this.state = 613; + this.state = 612; (_localctx as MultDivContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & ((1 << (QuintParser.MUL - 51)) | (1 << (QuintParser.DIV - 51)) | (1 << (QuintParser.MOD - 51)))) !== 0))) { @@ -2434,7 +2434,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 614; + this.state = 613; this.expr(25); } break; @@ -2443,11 +2443,11 @@ export class QuintParser extends Parser { { _localctx = new PlusMinusContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 615; + this.state = 614; if (!(this.precpred(this._ctx, 23))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 23)"); } - this.state = 616; + this.state = 615; (_localctx as PlusMinusContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(_la === QuintParser.PLUS || _la === QuintParser.MINUS)) { @@ -2460,7 +2460,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 617; + this.state = 616; this.expr(24); } break; @@ -2469,11 +2469,11 @@ export class QuintParser extends Parser { { _localctx = new RelationsContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 618; + this.state = 617; if (!(this.precpred(this._ctx, 22))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 22)"); } - this.state = 619; + this.state = 618; (_localctx as RelationsContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 54)) & ~0x1F) === 0 && ((1 << (_la - 54)) & ((1 << (QuintParser.GT - 54)) | (1 << (QuintParser.LT - 54)) | (1 << (QuintParser.GE - 54)) | (1 << (QuintParser.LE - 54)) | (1 << (QuintParser.NE - 54)) | (1 << (QuintParser.EQ - 54)))) !== 0))) { @@ -2486,7 +2486,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 620; + this.state = 619; this.expr(23); } break; @@ -2495,13 +2495,13 @@ export class QuintParser extends Parser { { _localctx = new ErrorEqContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 621; + this.state = 620; if (!(this.precpred(this._ctx, 20))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 20)"); } - this.state = 622; + this.state = 621; this.match(QuintParser.ASGN); - this.state = 623; + this.state = 622; this.expr(21); const m = "[QNT006] unexpected '=', did you mean '=='?" @@ -2514,13 +2514,13 @@ export class QuintParser extends Parser { { _localctx = new AndContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 626; + this.state = 625; if (!(this.precpred(this._ctx, 18))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 18)"); } - this.state = 627; + this.state = 626; this.match(QuintParser.AND); - this.state = 628; + this.state = 627; this.expr(19); } break; @@ -2529,13 +2529,13 @@ export class QuintParser extends Parser { { _localctx = new OrContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 629; + this.state = 628; if (!(this.precpred(this._ctx, 16))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 16)"); } - this.state = 630; + this.state = 629; this.match(QuintParser.OR); - this.state = 631; + this.state = 630; this.expr(17); } break; @@ -2544,13 +2544,13 @@ export class QuintParser extends Parser { { _localctx = new IffContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 632; + this.state = 631; if (!(this.precpred(this._ctx, 15))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 15)"); } - this.state = 633; + this.state = 632; this.match(QuintParser.IFF); - this.state = 634; + this.state = 633; this.expr(16); } break; @@ -2559,13 +2559,13 @@ export class QuintParser extends Parser { { _localctx = new ImpliesContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 635; + this.state = 634; if (!(this.precpred(this._ctx, 14))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); } - this.state = 636; + this.state = 635; this.match(QuintParser.IMPLIES); - this.state = 637; + this.state = 636; this.expr(15); } break; @@ -2574,13 +2574,13 @@ export class QuintParser extends Parser { { _localctx = new PairContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 638; + this.state = 637; if (!(this.precpred(this._ctx, 8))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 8)"); } - this.state = 639; + this.state = 638; this.match(QuintParser.T__25); - this.state = 640; + this.state = 639; this.expr(9); } break; @@ -2589,32 +2589,32 @@ export class QuintParser extends Parser { { _localctx = new DotCallContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 641; + this.state = 640; if (!(this.precpred(this._ctx, 30))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 30)"); } - this.state = 642; + this.state = 641; this.match(QuintParser.T__21); - this.state = 643; + this.state = 642; this.nameAfterDot(); - this.state = 649; + this.state = 648; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 67, this._ctx) ) { case 1: { - this.state = 644; + this.state = 643; this.match(QuintParser.LPAREN); - this.state = 646; + this.state = 645; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 645; + this.state = 644; this.argList(); } } - this.state = 648; + this.state = 647; this.match(QuintParser.RPAREN); } break; @@ -2626,22 +2626,22 @@ export class QuintParser extends Parser { { _localctx = new ListAppContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 651; + this.state = 650; if (!(this.precpred(this._ctx, 27))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 27)"); } - this.state = 652; + this.state = 651; this.match(QuintParser.T__10); - this.state = 653; + this.state = 652; this.expr(0); - this.state = 654; + this.state = 653; this.match(QuintParser.T__11); } break; } } } - this.state = 660; + this.state = 659; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 69, this._ctx); } @@ -2669,43 +2669,43 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 661; + this.state = 660; this.match(QuintParser.MATCH); - this.state = 662; + this.state = 661; this.expr(0); - this.state = 663; + this.state = 662; this.match(QuintParser.T__1); - this.state = 665; + this.state = 664; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__12) { { - this.state = 664; + this.state = 663; this.match(QuintParser.T__12); } } - this.state = 667; + this.state = 666; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); - this.state = 672; + this.state = 671; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__12) { { { - this.state = 668; + this.state = 667; this.match(QuintParser.T__12); - this.state = 669; + this.state = 668; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); } } - this.state = 674; + this.state = 673; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 675; + this.state = 674; this.match(QuintParser.T__2); } } @@ -2730,28 +2730,28 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 679; + this.state = 678; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 677; + this.state = 676; _localctx._variantMatch = this.matchSumVariant(); } break; case QuintParser.T__36: { - this.state = 678; + this.state = 677; _localctx._wildCardMatch = this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 681; + this.state = 680; this.match(QuintParser.T__26); - this.state = 682; + this.state = 681; this.expr(0); } } @@ -2778,36 +2778,36 @@ export class QuintParser extends Parser { this.enterOuterAlt(_localctx, 1); { { - this.state = 684; + this.state = 683; _localctx._variantLabel = this.simpleId("variant label"); } - this.state = 691; + this.state = 690; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.LPAREN) { { - this.state = 685; + this.state = 684; this.match(QuintParser.LPAREN); - this.state = 688; + this.state = 687; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 686; + this.state = 685; _localctx._variantParam = this.simpleId("match case parameter"); } break; case QuintParser.T__36: { - this.state = 687; + this.state = 686; this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 690; + this.state = 689; this.match(QuintParser.RPAREN); } } @@ -2833,15 +2833,15 @@ export class QuintParser extends Parser { let _localctx: DeclarationOrExprContext = new DeclarationOrExprContext(this._ctx, this.state); this.enterRule(_localctx, 52, QuintParser.RULE_declarationOrExpr); try { - this.state = 702; + this.state = 701; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 75, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 693; + this.state = 692; this.declaration(); - this.state = 694; + this.state = 693; this.match(QuintParser.EOF); } break; @@ -2849,9 +2849,9 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 696; + this.state = 695; this.expr(0); - this.state = 697; + this.state = 696; this.match(QuintParser.EOF); } break; @@ -2859,9 +2859,9 @@ export class QuintParser extends Parser { case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 699; + this.state = 698; this.match(QuintParser.DOCCOMMENT); - this.state = 700; + this.state = 699; this.match(QuintParser.EOF); } break; @@ -2869,7 +2869,7 @@ export class QuintParser extends Parser { case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 701; + this.state = 700; this.match(QuintParser.EOF); } break; @@ -2894,13 +2894,13 @@ export class QuintParser extends Parser { let _localctx: LambdaContext = new LambdaContext(this._ctx, this.state); this.enterRule(_localctx, 54, QuintParser.RULE_lambda); try { - this.state = 706; + this.state = 705; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 76, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 704; + this.state = 703; this.lambdaUnsugared(); } break; @@ -2908,7 +2908,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 705; + this.state = 704; this.lambdaTupleSugar(); } break; @@ -2934,7 +2934,7 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 56, QuintParser.RULE_lambdaUnsugared); let _la: number; try { - this.state = 725; + this.state = 724; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: @@ -2942,42 +2942,42 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 708; + this.state = 707; this.parameter(); - this.state = 709; + this.state = 708; this.match(QuintParser.T__26); - this.state = 710; + this.state = 709; this.expr(0); } break; case QuintParser.LPAREN: this.enterOuterAlt(_localctx, 2); { - this.state = 712; + this.state = 711; this.match(QuintParser.LPAREN); - this.state = 713; + this.state = 712; this.parameter(); - this.state = 718; + this.state = 717; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 714; + this.state = 713; this.match(QuintParser.T__7); - this.state = 715; + this.state = 714; this.parameter(); } } - this.state = 720; + this.state = 719; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 721; + this.state = 720; this.match(QuintParser.RPAREN); - this.state = 722; + this.state = 721; this.match(QuintParser.T__26); - this.state = 723; + this.state = 722; this.expr(0); } break; @@ -3007,35 +3007,35 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { + this.state = 726; + this.match(QuintParser.LPAREN); this.state = 727; this.match(QuintParser.LPAREN); this.state = 728; - this.match(QuintParser.LPAREN); - this.state = 729; this.parameter(); - this.state = 732; + this.state = 731; this._errHandler.sync(this); _la = this._input.LA(1); do { { { - this.state = 730; + this.state = 729; this.match(QuintParser.T__7); - this.state = 731; + this.state = 730; this.parameter(); } } - this.state = 734; + this.state = 733; this._errHandler.sync(this); _la = this._input.LA(1); } while (_la === QuintParser.T__7); + this.state = 735; + this.match(QuintParser.RPAREN); this.state = 736; this.match(QuintParser.RPAREN); this.state = 737; - this.match(QuintParser.RPAREN); - this.state = 738; this.match(QuintParser.T__26); - this.state = 739; + this.state = 738; this.expr(0); } } @@ -3058,13 +3058,13 @@ export class QuintParser extends Parser { let _localctx: IdentOrHoleContext = new IdentOrHoleContext(this._ctx, this.state); this.enterRule(_localctx, 60, QuintParser.RULE_identOrHole); try { - this.state = 743; + this.state = 742; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: this.enterOuterAlt(_localctx, 1); { - this.state = 741; + this.state = 740; this.match(QuintParser.T__36); } break; @@ -3072,7 +3072,7 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 742; + this.state = 741; this.qualId(); } break; @@ -3101,7 +3101,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 745; + this.state = 744; _localctx._paramName = this.identOrHole(); } } @@ -3126,11 +3126,11 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 747; + this.state = 746; _localctx._paramName = this.identOrHole(); - this.state = 748; + this.state = 747; this.match(QuintParser.T__4); - this.state = 749; + this.state = 748; this.type(0); } } @@ -3153,13 +3153,13 @@ export class QuintParser extends Parser { let _localctx: IdentOrStarContext = new IdentOrStarContext(this._ctx, this.state); this.enterRule(_localctx, 66, QuintParser.RULE_identOrStar); try { - this.state = 753; + this.state = 752; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.MUL: this.enterOuterAlt(_localctx, 1); { - this.state = 751; + this.state = 750; this.match(QuintParser.MUL); } break; @@ -3167,7 +3167,7 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 752; + this.state = 751; this.qualId(); } break; @@ -3197,21 +3197,21 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 755; + this.state = 754; this.expr(0); - this.state = 760; + this.state = 759; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 756; + this.state = 755; this.match(QuintParser.T__7); - this.state = 757; + this.state = 756; this.expr(0); } } - this.state = 762; + this.state = 761; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -3236,27 +3236,27 @@ export class QuintParser extends Parser { let _localctx: RecElemContext = new RecElemContext(this._ctx, this.state); this.enterRule(_localctx, 70, QuintParser.RULE_recElem); try { - this.state = 769; + this.state = 768; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 763; + this.state = 762; this.simpleId("record"); - this.state = 764; + this.state = 763; this.match(QuintParser.T__4); - this.state = 765; + this.state = 764; this.expr(0); } break; case QuintParser.T__37: this.enterOuterAlt(_localctx, 2); { - this.state = 767; + this.state = 766; this.match(QuintParser.T__37); - this.state = 768; + this.state = 767; this.expr(0); } break; @@ -3284,14 +3284,14 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 72, QuintParser.RULE_normalCallName); let _la: number; try { - this.state = 773; + this.state = 772; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 771; + this.state = 770; this.qualId(); } break; @@ -3304,7 +3304,7 @@ export class QuintParser extends Parser { case QuintParser.LIST: this.enterOuterAlt(_localctx, 2); { - this.state = 772; + this.state = 771; _localctx._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 43)) & ~0x1F) === 0 && ((1 << (_la - 43)) & ((1 << (QuintParser.AND - 43)) | (1 << (QuintParser.OR - 43)) | (1 << (QuintParser.IFF - 43)) | (1 << (QuintParser.IMPLIES - 43)) | (1 << (QuintParser.MAP - 43)) | (1 << (QuintParser.SET - 43)) | (1 << (QuintParser.LIST - 43)))) !== 0))) { @@ -3343,14 +3343,14 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 74, QuintParser.RULE_nameAfterDot); let _la: number; try { - this.state = 777; + this.state = 776; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 775; + this.state = 774; this.qualId(); } break; @@ -3360,7 +3360,7 @@ export class QuintParser extends Parser { case QuintParser.IMPLIES: this.enterOuterAlt(_localctx, 2); { - this.state = 776; + this.state = 775; _localctx._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 43)) & ~0x1F) === 0 && ((1 << (_la - 43)) & ((1 << (QuintParser.AND - 43)) | (1 << (QuintParser.OR - 43)) | (1 << (QuintParser.IFF - 43)) | (1 << (QuintParser.IMPLIES - 43)))) !== 0))) { @@ -3401,7 +3401,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 779; + this.state = 778; _la = this._input.LA(1); if (!(((((_la - 31)) & ~0x1F) === 0 && ((1 << (_la - 31)) & ((1 << (QuintParser.T__30 - 31)) | (1 << (QuintParser.AND - 31)) | (1 << (QuintParser.OR - 31)) | (1 << (QuintParser.IFF - 31)) | (1 << (QuintParser.IMPLIES - 31)) | (1 << (QuintParser.PLUS - 31)) | (1 << (QuintParser.MINUS - 31)) | (1 << (QuintParser.MUL - 31)) | (1 << (QuintParser.DIV - 31)) | (1 << (QuintParser.MOD - 31)) | (1 << (QuintParser.GT - 31)) | (1 << (QuintParser.LT - 31)) | (1 << (QuintParser.GE - 31)) | (1 << (QuintParser.LE - 31)) | (1 << (QuintParser.NE - 31)) | (1 << (QuintParser.EQ - 31)))) !== 0))) { this._errHandler.recoverInline(this); @@ -3437,7 +3437,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 781; + this.state = 780; _la = this._input.LA(1); if (!(((((_la - 40)) & ~0x1F) === 0 && ((1 << (_la - 40)) & ((1 << (QuintParser.STRING - 40)) | (1 << (QuintParser.BOOL - 40)) | (1 << (QuintParser.INT - 40)))) !== 0))) { this._errHandler.recoverInline(this); @@ -3473,23 +3473,23 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 783; + this.state = 782; this.identifier(); - this.state = 788; + this.state = 787; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 86, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 784; + this.state = 783; this.match(QuintParser.T__38); - this.state = 785; + this.state = 784; this.identifier(); } } } - this.state = 790; + this.state = 789; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 86, this._ctx); } @@ -3514,13 +3514,13 @@ export class QuintParser extends Parser { let _localctx: SimpleIdContext = new SimpleIdContext(this._ctx, this.state, context); this.enterRule(_localctx, 82, QuintParser.RULE_simpleId); try { - this.state = 795; + this.state = 794; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 87, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 791; + this.state = 790; this.identifier(); } break; @@ -3528,7 +3528,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 792; + this.state = 791; _localctx._qualId = this.qualId(); const err = quintErrorToString( @@ -3564,7 +3564,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 797; + this.state = 796; _la = this._input.LA(1); if (!(_la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID)) { this._errHandler.recoverInline(this); @@ -3656,7 +3656,7 @@ export class QuintParser extends Parser { private static readonly _serializedATNSegments: number = 2; private static readonly _serializedATNSegment0: string = - "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03H\u0322\x04\x02" + + "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03H\u0321\x04\x02" + "\t\x02\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06\x04\x07" + "\t\x07\x04\b\t\b\x04\t\t\t\x04\n\t\n\x04\v\t\v\x04\f\t\f\x04\r\t\r\x04" + "\x0E\t\x0E\x04\x0F\t\x0F\x04\x10\t\x10\x04\x11\t\x11\x04\x12\t\x12\x04" + @@ -3678,92 +3678,92 @@ export class QuintParser extends Parser { "\x06\x05\x06\xBA\n\x06\x03\x06\x05\x06\xBD\n\x06\x05\x06\xBF\n\x06\x03" + "\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03" + "\x07\x03\x07\x03\x07\x05\x07\xCD\n\x07\x03\b\x03\b\x03\b\x03\b\x03\b\x07" + - "\b\xD4\n\b\f\b\x0E\b\xD7\v\b\x03\b\x03\b\x05\b\xDB\n\b\x03\t\x05\t\xDE" + - "\n\t\x03\t\x03\t\x03\t\x07\t\xE3\n\t\f\t\x0E\t\xE6\v\t\x03\n\x03\n\x03" + - "\n\x03\n\x03\n\x05\n\xED\n\n\x03\v\x03\v\x03\v\x03\v\x05\v\xF3\n\v\x03" + - "\v\x03\v\x03\v\x05\v\xF8\n\v\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f" + - "\x03\f\x03\f\x05\f\u0103\n\f\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x05\r" + - "\u010B\n\r\x03\r\x03\r\x03\r\x03\r\x05\r\u0111\n\r\x03\r\x03\r\x05\r\u0115" + - "\n\r\x05\r\u0117\n\r\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03" + - "\x0E\x03\x0E\x03\x0E\x05\x0E\u0122\n\x0E\x05\x0E\u0124\n\x0E\x03\x0F\x03" + - "\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03" + - "\x0F\x07\x0F\u0131\n\x0F\f\x0F\x0E\x0F\u0134\v\x0F\x03\x0F\x03\x0F\x03" + - "\x0F\x03\x0F\x03\x0F\x05\x0F\u013B\n\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F" + - "\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x07\x0F\u0148" + - "\n\x0F\f\x0F\x0E\x0F\u014B\v\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F" + - "\x05\x0F\u0152\n\x0F\x05\x0F\u0154\n\x0F\x03\x10\x03\x10\x03\x11\x03\x11" + - "\x03\x12\x03\x12\x03\x13\x03\x13\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + - "\x07\x14\u0163\n\x14\f\x14\x0E\x14\u0166\v\x14\x05\x14\u0168\n\x14\x03" + - "\x14\x05\x14\u016B\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + + "\b\xD4\n\b\f\b\x0E\b\xD7\v\b\x03\b\x05\b\xDA\n\b\x03\t\x05\t\xDD\n\t\x03" + + "\t\x03\t\x03\t\x07\t\xE2\n\t\f\t\x0E\t\xE5\v\t\x03\n\x03\n\x03\n\x03\n" + + "\x03\n\x05\n\xEC\n\n\x03\v\x03\v\x03\v\x03\v\x05\v\xF2\n\v\x03\v\x03\v" + + "\x03\v\x05\v\xF7\n\v\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03" + + "\f\x05\f\u0102\n\f\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x05\r\u010A\n\r" + + "\x03\r\x03\r\x03\r\x03\r\x05\r\u0110\n\r\x03\r\x03\r\x05\r\u0114\n\r\x05" + + "\r\u0116\n\r\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03" + + "\x0E\x03\x0E\x05\x0E\u0121\n\x0E\x05\x0E\u0123\n\x0E\x03\x0F\x03\x0F\x03" + + "\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x07" + + "\x0F\u0130\n\x0F\f\x0F\x0E\x0F\u0133\v\x0F\x03\x0F\x03\x0F\x03\x0F\x03" + + "\x0F\x03\x0F\x05\x0F\u013A\n\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F" + + "\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x07\x0F\u0147\n\x0F\f" + + "\x0F\x0E\x0F\u014A\v\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x05\x0F" + + "\u0151\n\x0F\x05\x0F\u0153\n\x0F\x03\x10\x03\x10\x03\x11\x03\x11\x03\x12" + + "\x03\x12\x03\x13\x03\x13\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14" + + "\u0162\n\x14\f\x14\x0E\x14\u0165\v\x14\x05\x14\u0167\n\x14\x03\x14\x05" + + "\x14\u016A\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + - "\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u0180\n\x14\f\x14\x0E\x14\u0183" + - "\v\x14\x03\x14\x05\x14\u0186\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x05" + - "\x14\u018C\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + - "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14" + - "\u019D\n\x14\f\x14\x0E\x14\u01A0\v\x14\x03\x14\x03\x14\x05\x14\u01A4\n" + - "\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u01AC\n\x14" + - "\f\x14\x0E\x14\u01AF\v\x14\x03\x15\x03\x15\x03\x16\x03\x16\x03\x16\x03" + - "\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x07\x16\u01BC\n\x16\f\x16" + - "\x0E\x16\u01BF\v\x16\x03\x16\x03\x16\x03\x16\x05\x16\u01C4\n\x16\x03\x16" + - "\x03\x16\x05\x16\u01C8\n\x16\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x05\x18\u01D1\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x14\x03\x14\x03\x14\x07\x14\u017F\n\x14\f\x14\x0E\x14\u0182\v\x14" + + "\x03\x14\x05\x14\u0185\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x05\x14\u018B" + + "\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + + "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u019C" + + "\n\x14\f\x14\x0E\x14\u019F\v\x14\x03\x14\x03\x14\x05\x14\u01A3\n\x14\x03" + + "\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u01AB\n\x14\f\x14" + + "\x0E\x14\u01AE\v\x14\x03\x15\x03\x15\x03\x16\x03\x16\x03\x16\x03\x16\x03" + + "\x16\x03\x16\x03\x16\x03\x16\x03\x16\x07\x16\u01BB\n\x16\f\x16\x0E\x16" + + "\u01BE\v\x16\x03\x16\x03\x16\x03\x16\x05\x16\u01C3\n\x16\x03\x16\x03\x16" + + "\x05\x16\u01C7\n\x16\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x05\x18\u01D0\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18" + + "\u01E0\n\x18\f\x18\x0E\x18\u01E3\v\x18\x03\x18\x05\x18\u01E6\n\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u01EF\n\x18" + + "\f\x18\x0E\x18\u01F2\v\x18\x03\x18\x05\x18\u01F5\n\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u01FF\n\x18\f" + + "\x18\x0E\x18\u0202\v\x18\x03\x18\x05\x18\u0205\n\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u020E\n\x18\f\x18\x0E\x18" + + "\u0211\v\x18\x03\x18\x05\x18\u0214\n\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x05\x18\u021C\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x07\x18\u0224\n\x18\f\x18\x0E\x18\u0227\v\x18\x03\x18\x05" + + "\x18\u022A\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18" + + "\u0232\n\x18\f\x18\x0E\x18\u0235\v\x18\x03\x18\x05\x18\u0238\n\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0240\n\x18\f\x18" + + "\x0E\x18\u0243\v\x18\x05\x18\u0245\n\x18\x03\x18\x05\x18\u0248\n\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u0261\n\x18\x03\x18\x03\x18" + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x07\x18\u01E1\n\x18\f\x18\x0E\x18\u01E4\v\x18\x03\x18\x05\x18\u01E7\n" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u01F0" + - "\n\x18\f\x18\x0E\x18\u01F3\v\x18\x03\x18\x05\x18\u01F6\n\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0200\n\x18" + - "\f\x18\x0E\x18\u0203\v\x18\x03\x18\x05\x18\u0206\n\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u020F\n\x18\f\x18\x0E" + - "\x18\u0212\v\x18\x03\x18\x05\x18\u0215\n\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x05\x18\u021D\n\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x07\x18\u0225\n\x18\f\x18\x0E\x18\u0228\v\x18\x03\x18" + - "\x05\x18\u022B\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07" + - "\x18\u0233\n\x18\f\x18\x0E\x18\u0236\v\x18\x03\x18\x05\x18\u0239\n\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0241\n\x18\f" + - "\x18\x0E\x18\u0244\v\x18\x05\x18\u0246\n\x18\x03\x18\x05\x18\u0249\n\x18" + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u0262\n\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05" + - "\x18\u0289\n\x18\x03\x18\x05\x18\u028C\n\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x07\x18\u0293\n\x18\f\x18\x0E\x18\u0296\v\x18\x03\x19\x03" + - "\x19\x03\x19\x03\x19\x05\x19\u029C\n\x19\x03\x19\x03\x19\x03\x19\x07\x19" + - "\u02A1\n\x19\f\x19\x0E\x19\u02A4\v\x19\x03\x19\x03\x19\x03\x1A\x03\x1A" + - "\x05\x1A\u02AA\n\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1B\x03\x1B\x03\x1B\x03" + - "\x1B\x05\x1B\u02B3\n\x1B\x03\x1B\x05\x1B\u02B6\n\x1B\x03\x1C\x03\x1C\x03" + - "\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x05\x1C\u02C1\n\x1C" + - "\x03\x1D\x03\x1D\x05\x1D\u02C5\n\x1D\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03" + - "\x1E\x03\x1E\x03\x1E\x03\x1E\x07\x1E\u02CF\n\x1E\f\x1E\x0E\x1E\u02D2\v" + - "\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x05\x1E\u02D8\n\x1E\x03\x1F\x03\x1F" + - "\x03\x1F\x03\x1F\x03\x1F\x06\x1F\u02DF\n\x1F\r\x1F\x0E\x1F\u02E0\x03\x1F" + - "\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03 \x03 \x05 \u02EA\n \x03!\x03!\x03" + - "\"\x03\"\x03\"\x03\"\x03#\x03#\x05#\u02F4\n#\x03$\x03$\x03$\x07$\u02F9" + - "\n$\f$\x0E$\u02FC\v$\x03%\x03%\x03%\x03%\x03%\x03%\x05%\u0304\n%\x03&" + - "\x03&\x05&\u0308\n&\x03\'\x03\'\x05\'\u030C\n\'\x03(\x03(\x03)\x03)\x03" + - "*\x03*\x03*\x07*\u0315\n*\f*\x0E*\u0318\v*\x03+\x03+\x03+\x03+\x05+\u031E" + - "\n+\x03,\x03,\x03,\x02\x02\x04&.-\x02\x02\x04\x02\x06\x02\b\x02\n\x02" + - "\f\x02\x0E\x02\x10\x02\x12\x02\x14\x02\x16\x02\x18\x02\x1A\x02\x1C\x02" + - "\x1E\x02 \x02\"\x02$\x02&\x02(\x02*\x02,\x02.\x020\x022\x024\x026\x02" + - "8\x02:\x02<\x02>\x02@\x02B\x02D\x02F\x02H\x02J\x02L\x02N\x02P\x02R\x02" + - "T\x02V\x02\x02\n\x03\x0257\x03\x0234\x03\x028=\x04\x02-1AB\x03\x02-0\x05" + - "\x02!!-03=\x03\x02*,\x03\x02CD\x02\u0383\x02Y\x03\x02\x02\x02\x04b\x03" + - "\x02\x02\x02\x06s\x03\x02\x02\x02\b\x8C\x03\x02\x02\x02\n\xBE\x03\x02" + - "\x02\x02\f\xCC\x03\x02\x02\x02\x0E\xCE\x03\x02\x02\x02\x10\xDD\x03\x02" + - "\x02\x02\x12\xE7\x03\x02\x02\x02\x14\xEE\x03\x02\x02\x02\x16\u0102\x03" + - "\x02\x02\x02\x18\u0116\x03\x02\x02\x02\x1A\u0123\x03\x02\x02\x02\x1C\u0153" + - "\x03\x02\x02\x02\x1E\u0155\x03\x02\x02\x02 \u0157\x03\x02\x02\x02\"\u0159" + - "\x03\x02\x02\x02$\u015B\x03\x02\x02\x02&\u01A3\x03\x02\x02\x02(\u01B0" + - "\x03\x02\x02\x02*\u01C7\x03\x02\x02\x02,\u01C9\x03\x02\x02\x02.\u0261" + - "\x03\x02\x02\x020\u0297\x03\x02\x02\x022\u02A9\x03\x02\x02\x024\u02AE" + - "\x03\x02\x02\x026\u02C0\x03\x02\x02\x028\u02C4\x03\x02\x02\x02:\u02D7" + - "\x03\x02\x02\x02<\u02D9\x03\x02\x02\x02>\u02E9\x03\x02\x02\x02@\u02EB" + - "\x03\x02\x02\x02B\u02ED\x03\x02\x02\x02D\u02F3\x03\x02\x02\x02F\u02F5" + - "\x03\x02\x02\x02H\u0303\x03\x02\x02\x02J\u0307\x03\x02\x02\x02L\u030B" + - "\x03\x02\x02\x02N\u030D\x03\x02\x02\x02P\u030F\x03\x02\x02\x02R\u0311" + - "\x03\x02\x02\x02T\u031D\x03\x02\x02\x02V\u031F\x03\x02\x02\x02XZ\x05\x04" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18" + + "\u0288\n\x18\x03\x18\x05\x18\u028B\n\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x07\x18\u0292\n\x18\f\x18\x0E\x18\u0295\v\x18\x03\x19\x03\x19" + + "\x03\x19\x03\x19\x05\x19\u029B\n\x19\x03\x19\x03\x19\x03\x19\x07\x19\u02A0" + + "\n\x19\f\x19\x0E\x19\u02A3\v\x19\x03\x19\x03\x19\x03\x1A\x03\x1A\x05\x1A" + + "\u02A9\n\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x05" + + "\x1B\u02B2\n\x1B\x03\x1B\x05\x1B\u02B5\n\x1B\x03\x1C\x03\x1C\x03\x1C\x03" + + "\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x05\x1C\u02C0\n\x1C\x03\x1D" + + "\x03\x1D\x05\x1D\u02C4\n\x1D\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03" + + "\x1E\x03\x1E\x03\x1E\x07\x1E\u02CE\n\x1E\f\x1E\x0E\x1E\u02D1\v\x1E\x03" + + "\x1E\x03\x1E\x03\x1E\x03\x1E\x05\x1E\u02D7\n\x1E\x03\x1F\x03\x1F\x03\x1F" + + "\x03\x1F\x03\x1F\x06\x1F\u02DE\n\x1F\r\x1F\x0E\x1F\u02DF\x03\x1F\x03\x1F" + + "\x03\x1F\x03\x1F\x03\x1F\x03 \x03 \x05 \u02E9\n \x03!\x03!\x03\"\x03\"" + + "\x03\"\x03\"\x03#\x03#\x05#\u02F3\n#\x03$\x03$\x03$\x07$\u02F8\n$\f$\x0E" + + "$\u02FB\v$\x03%\x03%\x03%\x03%\x03%\x03%\x05%\u0303\n%\x03&\x03&\x05&" + + "\u0307\n&\x03\'\x03\'\x05\'\u030B\n\'\x03(\x03(\x03)\x03)\x03*\x03*\x03" + + "*\x07*\u0314\n*\f*\x0E*\u0317\v*\x03+\x03+\x03+\x03+\x05+\u031D\n+\x03" + + ",\x03,\x03,\x02\x02\x04&.-\x02\x02\x04\x02\x06\x02\b\x02\n\x02\f\x02\x0E" + + "\x02\x10\x02\x12\x02\x14\x02\x16\x02\x18\x02\x1A\x02\x1C\x02\x1E\x02 " + + "\x02\"\x02$\x02&\x02(\x02*\x02,\x02.\x020\x022\x024\x026\x028\x02:\x02" + + "<\x02>\x02@\x02B\x02D\x02F\x02H\x02J\x02L\x02N\x02P\x02R\x02T\x02V\x02" + + "\x02\n\x03\x0257\x03\x0234\x03\x028=\x04\x02-1AB\x03\x02-0\x05\x02!!-" + + "03=\x03\x02*,\x03\x02CD\x02\u0382\x02Y\x03\x02\x02\x02\x04b\x03\x02\x02" + + "\x02\x06s\x03\x02\x02\x02\b\x8C\x03\x02\x02\x02\n\xBE\x03\x02\x02\x02" + + "\f\xCC\x03\x02\x02\x02\x0E\xCE\x03\x02\x02\x02\x10\xDC\x03\x02\x02\x02" + + "\x12\xE6\x03\x02\x02\x02\x14\xED\x03\x02\x02\x02\x16\u0101\x03\x02\x02" + + "\x02\x18\u0115\x03\x02\x02\x02\x1A\u0122\x03\x02\x02\x02\x1C\u0152\x03" + + "\x02\x02\x02\x1E\u0154\x03\x02\x02\x02 \u0156\x03\x02\x02\x02\"\u0158" + + "\x03\x02\x02\x02$\u015A\x03\x02\x02\x02&\u01A2\x03\x02\x02\x02(\u01AF" + + "\x03\x02\x02\x02*\u01C6\x03\x02\x02\x02,\u01C8\x03\x02\x02\x02.\u0260" + + "\x03\x02\x02\x020\u0296\x03\x02\x02\x022\u02A8\x03\x02\x02\x024\u02AD" + + "\x03\x02\x02\x026\u02BF\x03\x02\x02\x028\u02C3\x03\x02\x02\x02:\u02D6" + + "\x03\x02\x02\x02<\u02D8\x03\x02\x02\x02>\u02E8\x03\x02\x02\x02@\u02EA" + + "\x03\x02\x02\x02B\u02EC\x03\x02\x02\x02D\u02F2\x03\x02\x02\x02F\u02F4" + + "\x03\x02\x02\x02H\u0302\x03\x02\x02\x02J\u0306\x03\x02\x02\x02L\u030A" + + "\x03\x02\x02\x02N\u030C\x03\x02\x02\x02P\u030E\x03\x02\x02\x02R\u0310" + + "\x03\x02\x02\x02T\u031C\x03\x02\x02\x02V\u031E\x03\x02\x02\x02XZ\x05\x04" + "\x03\x02YX\x03\x02\x02\x02Z[\x03\x02\x02\x02[Y\x03\x02\x02\x02[\\\x03" + "\x02\x02\x02\\]\x03\x02\x02\x02]^\x07\x02\x02\x03^\x03\x03\x02\x02\x02" + "_a\x07E\x02\x02`_\x03\x02\x02\x02ad\x03\x02\x02\x02b`\x03\x02\x02\x02" + @@ -3805,279 +3805,279 @@ export class QuintParser extends Parser { "\xC4\xC5\x07>\x02\x02\xC5\xC6\x05&\x14\x02\xC6\xCD\x03\x02\x02\x02\xC7" + "\xC8\x07\f\x02\x02\xC8\xC9\x05\x0E\b\x02\xC9\xCA\x07>\x02\x02\xCA\xCB" + "\x05\x10\t\x02\xCB\xCD\x03\x02\x02\x02\xCC\xC0\x03\x02\x02\x02\xCC\xC2" + - "\x03\x02\x02\x02\xCC\xC7\x03\x02\x02\x02\xCD\r\x03\x02\x02\x02\xCE\xDA" + - "\x05R*\x02\xCF\xD0\x07\r\x02\x02\xD0\xD5\x05(\x15\x02\xD1\xD2\x07\n\x02" + - "\x02\xD2\xD4\x05(\x15\x02\xD3\xD1\x03\x02\x02\x02\xD4\xD7\x03\x02\x02" + + "\x03\x02\x02\x02\xCC\xC7\x03\x02\x02\x02\xCD\r\x03\x02\x02\x02\xCE\xD9" + + "\x05R*\x02\xCF\xD0\x07\r\x02\x02\xD0\xD5\x07C\x02\x02\xD1\xD2\x07\n\x02" + + "\x02\xD2\xD4\x07C\x02\x02\xD3\xD1\x03\x02\x02\x02\xD4\xD7\x03\x02\x02" + "\x02\xD5\xD3\x03\x02\x02\x02\xD5\xD6\x03\x02\x02\x02\xD6\xD8\x03\x02\x02" + - "\x02\xD7\xD5\x03\x02\x02\x02\xD8\xD9\x07\x0E\x02\x02\xD9\xDB\x03\x02\x02" + - "\x02\xDA\xCF\x03\x02\x02\x02\xDA\xDB\x03\x02\x02\x02\xDB\x0F\x03\x02\x02" + - "\x02\xDC\xDE\x07\x0F\x02\x02\xDD\xDC\x03\x02\x02\x02\xDD\xDE\x03\x02\x02" + - "\x02\xDE\xDF\x03\x02\x02\x02\xDF\xE4\x05\x12\n\x02\xE0\xE1\x07\x0F\x02" + - "\x02\xE1\xE3\x05\x12\n\x02\xE2\xE0\x03\x02\x02\x02\xE3\xE6\x03\x02\x02" + - "\x02\xE4\xE2\x03\x02\x02\x02\xE4\xE5\x03\x02\x02\x02\xE5\x11\x03\x02\x02" + - "\x02\xE6\xE4\x03\x02\x02\x02\xE7\xEC\x05T+\x02\xE8\xE9\x07?\x02\x02\xE9" + - "\xEA\x05&\x14\x02\xEA\xEB\x07@\x02\x02\xEB\xED\x03\x02\x02\x02\xEC\xE8" + - "\x03\x02\x02\x02\xEC\xED\x03\x02\x02\x02\xED\x13\x03\x02\x02\x02\xEE\xEF" + - "\x07\x10\x02\x02\xEF\xF2\x05R*\x02\xF0\xF1\x07\x07\x02\x02\xF1\xF3\x05" + - "&\x14\x02\xF2\xF0\x03\x02\x02\x02\xF2\xF3\x03\x02\x02\x02\xF3\xF4\x03" + - "\x02\x02\x02\xF4\xF5\x07>\x02\x02\xF5\xF7\x05.\x18\x02\xF6\xF8\x07\v\x02" + - "\x02\xF7\xF6\x03\x02\x02\x02\xF7\xF8\x03\x02\x02\x02\xF8\x15\x03\x02\x02" + - "\x02\xF9\u0103\x07\x11\x02\x02\xFA\u0103\x07\x12\x02\x02\xFB\xFC\x07\x13" + - "\x02\x02\xFC\u0103\x07\x11\x02\x02\xFD\xFE\x07\x13\x02\x02\xFE\u0103\x07" + - "\x12\x02\x02\xFF\u0103\x07\x14\x02\x02\u0100\u0103\x07\x15\x02\x02\u0101" + - "\u0103\x07\x16\x02\x02\u0102\xF9\x03\x02\x02\x02\u0102\xFA\x03\x02\x02" + - "\x02\u0102\xFB\x03\x02\x02\x02\u0102\xFD\x03\x02\x02\x02\u0102\xFF\x03" + - "\x02\x02\x02\u0102\u0100\x03\x02\x02\x02\u0102\u0101\x03\x02\x02\x02\u0103" + - "\x17\x03\x02\x02\x02\u0104\u0105\x07\x17\x02\x02\u0105\u0106\x05 \x11" + - "\x02\u0106\u0107\x07\x18\x02\x02\u0107\u010A\x05D#\x02\u0108\u0109\x07" + - "\x19\x02\x02\u0109\u010B\x05$\x13\x02\u010A\u0108\x03\x02\x02\x02\u010A" + - "\u010B\x03\x02\x02\x02\u010B\u0117\x03\x02\x02\x02\u010C\u010D\x07\x17" + - "\x02\x02\u010D\u0110\x05 \x11\x02\u010E\u010F\x07\x1A\x02\x02\u010F\u0111" + - "\x05 \x11\x02\u0110\u010E\x03\x02\x02\x02\u0110\u0111\x03\x02\x02\x02" + - "\u0111\u0114\x03\x02\x02\x02\u0112\u0113\x07\x19\x02\x02\u0113\u0115\x05" + - "$\x13\x02\u0114\u0112\x03\x02\x02\x02\u0114\u0115\x03\x02\x02\x02\u0115" + - "\u0117\x03\x02\x02\x02\u0116\u0104\x03\x02\x02\x02\u0116\u010C\x03\x02" + - "\x02\x02\u0117\x19\x03\x02\x02\x02\u0118\u0119\x07\x1B\x02\x02\u0119\u011A" + - "\x05 \x11\x02\u011A\u011B\x07\x18\x02\x02\u011B\u011C\x05D#\x02\u011C" + - "\u0124\x03\x02\x02\x02\u011D\u011E\x07\x1B\x02\x02\u011E\u0121\x05 \x11" + - "\x02\u011F\u0120\x07\x1A\x02\x02\u0120\u0122\x05 \x11\x02\u0121\u011F" + - "\x03\x02\x02\x02\u0121\u0122\x03\x02\x02\x02\u0122\u0124\x03\x02\x02\x02" + - "\u0123\u0118\x03\x02\x02\x02\u0123\u011D\x03\x02\x02\x02\u0124\x1B\x03" + - "\x02\x02\x02\u0125\u0126\x07\x17\x02\x02\u0126\u0127\x05\x1E\x10\x02\u0127" + - "\u0128\x07?\x02\x02\u0128\u0129\x05 \x11\x02\u0129\u012A\x07>\x02\x02" + - "\u012A\u0132\x05.\x18\x02\u012B\u012C\x07\n\x02\x02\u012C\u012D\x05 \x11" + - "\x02\u012D\u012E\x07>\x02\x02\u012E\u012F\x05.\x18\x02\u012F\u0131\x03" + - "\x02\x02\x02\u0130\u012B\x03\x02\x02\x02\u0131\u0134\x03\x02\x02\x02\u0132" + - "\u0130\x03\x02\x02\x02\u0132\u0133\x03\x02\x02\x02\u0133\u0135\x03\x02" + - "\x02\x02\u0134\u0132\x03\x02\x02\x02\u0135\u0136\x07@\x02\x02\u0136\u0137" + - "\x07\x18\x02\x02\u0137\u013A\x075\x02\x02\u0138\u0139\x07\x19\x02\x02" + - "\u0139\u013B\x05$\x13\x02\u013A\u0138\x03\x02\x02\x02\u013A\u013B\x03" + - "\x02\x02\x02\u013B\u0154\x03\x02\x02\x02\u013C\u013D\x07\x17\x02\x02\u013D" + - "\u013E\x05\x1E\x10\x02\u013E\u013F\x07?\x02\x02\u013F\u0140\x05 \x11\x02" + - "\u0140\u0141\x07>\x02\x02\u0141\u0149\x05.\x18\x02\u0142\u0143\x07\n\x02" + - "\x02\u0143\u0144\x05 \x11\x02\u0144\u0145\x07>\x02\x02\u0145\u0146\x05" + - ".\x18\x02\u0146\u0148\x03\x02\x02\x02\u0147\u0142\x03\x02\x02\x02\u0148" + - "\u014B\x03\x02\x02\x02\u0149\u0147\x03\x02\x02\x02\u0149\u014A\x03\x02" + - "\x02\x02\u014A\u014C\x03\x02\x02\x02\u014B\u0149\x03\x02\x02\x02\u014C" + - "\u014D\x07@\x02\x02\u014D\u014E\x07\x1A\x02\x02\u014E\u0151\x05\"\x12" + - "\x02\u014F\u0150\x07\x19\x02\x02\u0150\u0152\x05$\x13\x02\u0151\u014F" + - "\x03\x02\x02\x02\u0151\u0152\x03\x02\x02\x02\u0152\u0154\x03\x02\x02\x02" + - "\u0153\u0125\x03\x02\x02\x02\u0153\u013C\x03\x02\x02\x02\u0154\x1D\x03" + - "\x02\x02\x02\u0155\u0156\x05R*\x02\u0156\x1F\x03\x02\x02\x02\u0157\u0158" + - "\x05R*\x02\u0158!\x03\x02\x02\x02\u0159\u015A\x05R*\x02\u015A#\x03\x02" + - "\x02\x02\u015B\u015C\x07*\x02\x02\u015C%\x03\x02\x02\x02\u015D\u015E\b" + - "\x14\x01\x02\u015E\u0167\x07?\x02\x02\u015F\u0164\x05&\x14\x02\u0160\u0161" + - "\x07\n\x02\x02\u0161\u0163\x05&\x14\x02\u0162\u0160\x03\x02\x02\x02\u0163" + - "\u0166\x03\x02\x02\x02\u0164\u0162\x03\x02\x02\x02\u0164\u0165\x03\x02" + - "\x02\x02\u0165\u0168\x03\x02\x02\x02\u0166\u0164\x03\x02\x02\x02\u0167" + - "\u015F\x03\x02\x02\x02\u0167\u0168\x03\x02\x02\x02\u0168\u016A\x03\x02" + - "\x02\x02\u0169\u016B\x07\n\x02\x02\u016A\u0169\x03\x02\x02\x02\u016A\u016B" + - "\x03\x02\x02\x02\u016B\u016C\x03\x02\x02\x02\u016C\u016D\x07@\x02\x02" + - "\u016D\u016E\x07\x1D\x02\x02\u016E\u01A4\x05&\x14\x0E\u016F\u0170\x07" + - "A\x02\x02\u0170\u0171\x07\r\x02\x02\u0171\u0172\x05&\x14\x02\u0172\u0173" + - "\x07\x0E\x02\x02\u0173\u01A4\x03\x02\x02\x02\u0174\u0175\x07B\x02\x02" + - "\u0175\u0176\x07\r\x02\x02\u0176\u0177\x05&\x14\x02\u0177\u0178\x07\x0E" + - "\x02\x02\u0178\u01A4\x03\x02\x02\x02\u0179\u017A\x07?\x02\x02\u017A\u017B" + - "\x05&\x14\x02\u017B\u017C\x07\n\x02\x02\u017C\u0181\x05&\x14\x02\u017D" + - "\u017E\x07\n\x02\x02\u017E\u0180\x05&\x14\x02\u017F\u017D\x03\x02\x02" + - "\x02\u0180\u0183\x03\x02\x02\x02\u0181\u017F\x03\x02\x02\x02\u0181\u0182" + - "\x03\x02\x02\x02\u0182\u0185\x03\x02\x02\x02\u0183\u0181\x03\x02\x02\x02" + - "\u0184\u0186\x07\n\x02\x02\u0185\u0184\x03\x02\x02\x02\u0185\u0186\x03" + - "\x02\x02\x02\u0186\u0187\x03\x02\x02\x02\u0187\u0188\x07@\x02\x02\u0188" + - "\u01A4\x03\x02\x02\x02\u0189\u018B\x07\x04\x02\x02\u018A\u018C\x05*\x16" + - "\x02\u018B\u018A\x03\x02\x02\x02\u018B\u018C\x03\x02\x02\x02\u018C\u018D" + - "\x03\x02\x02\x02\u018D\u01A4\x07\x05\x02\x02\u018E\u01A4\x07\x1E\x02\x02" + - "\u018F\u01A4\x07\x1F\x02\x02\u0190\u01A4\x07 \x02\x02\u0191\u01A4\x05" + - "(\x15\x02\u0192\u01A4\x05R*\x02\u0193\u0194\x07?\x02\x02\u0194\u0195\x05" + - "&\x14\x02\u0195\u0196\x07@\x02\x02\u0196\u01A4\x03\x02\x02\x02\u0197\u0198" + - "\x05R*\x02\u0198\u0199\x07\r\x02\x02\u0199\u019E\x05&\x14\x02\u019A\u019B" + - "\x07\n\x02\x02\u019B\u019D\x05&\x14\x02\u019C\u019A\x03\x02\x02\x02\u019D" + - "\u01A0\x03\x02\x02\x02\u019E\u019C\x03\x02\x02\x02\u019E\u019F\x03\x02" + - "\x02\x02\u019F\u01A1\x03\x02\x02\x02\u01A0\u019E\x03\x02\x02\x02\u01A1" + - "\u01A2\x07\x0E\x02\x02\u01A2\u01A4\x03\x02\x02\x02\u01A3\u015D\x03\x02" + - "\x02\x02\u01A3\u016F\x03\x02\x02\x02\u01A3\u0174\x03\x02\x02\x02\u01A3" + - "\u0179\x03\x02\x02\x02\u01A3\u0189\x03\x02\x02\x02\u01A3\u018E\x03\x02" + - "\x02\x02\u01A3\u018F\x03\x02\x02\x02\u01A3\u0190\x03\x02\x02\x02\u01A3" + - "\u0191\x03\x02\x02\x02\u01A3\u0192\x03\x02\x02\x02\u01A3\u0193\x03\x02" + - "\x02\x02\u01A3\u0197\x03\x02\x02\x02\u01A4\u01AD\x03\x02\x02\x02\u01A5" + - "\u01A6\f\x10\x02\x02\u01A6\u01A7\x07\x1C\x02\x02\u01A7\u01AC\x05&\x14" + - "\x10\u01A8\u01A9\f\x0F\x02\x02\u01A9\u01AA\x07\x1D\x02\x02\u01AA\u01AC" + - "\x05&\x14\x0F\u01AB\u01A5\x03\x02\x02\x02\u01AB\u01A8\x03\x02\x02\x02" + - "\u01AC\u01AF\x03\x02\x02\x02\u01AD\u01AB\x03\x02\x02\x02\u01AD\u01AE\x03" + - "\x02\x02\x02\u01AE\'\x03\x02\x02\x02\u01AF\u01AD\x03\x02\x02\x02\u01B0" + - "\u01B1\x07C\x02\x02\u01B1)\x03\x02\x02\x02\u01B2\u01B3\x05,\x17\x02\u01B3" + - "\u01B4\x07\x07\x02\x02\u01B4\u01B5\x05&\x14\x02\u01B5\u01BD\x03\x02\x02" + - "\x02\u01B6\u01B7\x07\n\x02\x02\u01B7\u01B8\x05,\x17\x02\u01B8\u01B9\x07" + - "\x07\x02\x02\u01B9\u01BA\x05&\x14\x02\u01BA\u01BC\x03\x02\x02\x02\u01BB" + - "\u01B6\x03\x02\x02\x02\u01BC\u01BF\x03\x02\x02\x02\u01BD\u01BB\x03\x02" + - "\x02\x02\u01BD\u01BE\x03\x02\x02\x02\u01BE\u01C3\x03\x02\x02\x02\u01BF" + - "\u01BD\x03\x02\x02\x02\u01C0\u01C4\x07\n\x02\x02\u01C1\u01C2\x07\x0F\x02" + - "\x02\u01C2\u01C4\x05V,\x02\u01C3\u01C0\x03\x02\x02\x02\u01C3\u01C1\x03" + - "\x02\x02\x02\u01C3\u01C4\x03\x02\x02\x02\u01C4\u01C8\x03\x02\x02\x02\u01C5" + - "\u01C6\x07\x0F\x02\x02\u01C6\u01C8\x05V,\x02\u01C7\u01B2\x03\x02\x02\x02" + - "\u01C7\u01C5\x03\x02\x02\x02\u01C8+\x03\x02\x02\x02\u01C9\u01CA\x05T+" + - "\x02\u01CA-\x03\x02\x02\x02\u01CB\u01CC\b\x18\x01\x02\u01CC\u0262\x05" + - "8\x1D\x02\u01CD\u01CE\x05J&\x02\u01CE\u01D0\x07?\x02\x02\u01CF\u01D1\x05" + - "F$\x02\u01D0\u01CF\x03\x02\x02\x02\u01D0\u01D1\x03\x02\x02\x02\u01D1\u01D2" + - "\x03\x02\x02\x02\u01D2\u01D3\x07@\x02\x02\u01D3\u0262\x03\x02\x02\x02" + - "\u01D4\u01D5\x074\x02\x02\u01D5\u0262\x05.\x18\x1B\u01D6\u01D7\x05R*\x02" + - "\u01D7\u01D8\x07\"\x02\x02\u01D8\u01D9\x07>\x02\x02\u01D9\u01DA\x05.\x18" + - "\x17\u01DA\u0262\x03\x02\x02\x02\u01DB\u01DC\x07-\x02\x02\u01DC\u01DD" + - "\x07\x04\x02\x02\u01DD\u01E2\x05.\x18\x02\u01DE\u01DF\x07\n\x02\x02\u01DF" + - "\u01E1\x05.\x18\x02\u01E0\u01DE\x03\x02\x02\x02\u01E1\u01E4\x03\x02\x02" + - "\x02\u01E2\u01E0\x03\x02\x02\x02\u01E2\u01E3\x03\x02\x02\x02\u01E3\u01E6" + - "\x03\x02\x02\x02\u01E4\u01E2\x03\x02\x02\x02\u01E5\u01E7\x07\n\x02\x02" + - "\u01E6\u01E5\x03\x02\x02\x02\u01E6\u01E7\x03\x02\x02\x02\u01E7\u01E8\x03" + - "\x02\x02\x02\u01E8\u01E9\x07\x05\x02\x02\u01E9\u0262\x03\x02\x02\x02\u01EA" + - "\u01EB\x07.\x02\x02\u01EB\u01EC\x07\x04\x02\x02\u01EC\u01F1\x05.\x18\x02" + - "\u01ED\u01EE\x07\n\x02\x02\u01EE\u01F0"; + "\x02\xD7\xD5\x03\x02\x02\x02\xD8\xDA\x07\x0E\x02\x02\xD9\xCF\x03\x02\x02" + + "\x02\xD9\xDA\x03\x02\x02\x02\xDA\x0F\x03\x02\x02\x02\xDB\xDD\x07\x0F\x02" + + "\x02\xDC\xDB\x03\x02\x02\x02\xDC\xDD\x03\x02\x02\x02\xDD\xDE\x03\x02\x02" + + "\x02\xDE\xE3\x05\x12\n\x02\xDF\xE0\x07\x0F\x02\x02\xE0\xE2\x05\x12\n\x02" + + "\xE1\xDF\x03\x02\x02\x02\xE2\xE5\x03\x02\x02\x02\xE3\xE1\x03\x02\x02\x02" + + "\xE3\xE4\x03\x02\x02\x02\xE4\x11\x03\x02\x02\x02\xE5\xE3\x03\x02\x02\x02" + + "\xE6\xEB\x05T+\x02\xE7\xE8\x07?\x02\x02\xE8\xE9\x05&\x14\x02\xE9\xEA\x07" + + "@\x02\x02\xEA\xEC\x03\x02\x02\x02\xEB\xE7\x03\x02\x02\x02\xEB\xEC\x03" + + "\x02\x02\x02\xEC\x13\x03\x02\x02\x02\xED\xEE\x07\x10\x02\x02\xEE\xF1\x05" + + "R*\x02\xEF\xF0\x07\x07\x02\x02\xF0\xF2\x05&\x14\x02\xF1\xEF\x03\x02\x02" + + "\x02\xF1\xF2\x03\x02\x02\x02\xF2\xF3\x03\x02\x02\x02\xF3\xF4\x07>\x02" + + "\x02\xF4\xF6\x05.\x18\x02\xF5\xF7\x07\v\x02\x02\xF6\xF5\x03\x02\x02\x02" + + "\xF6\xF7\x03\x02\x02\x02\xF7\x15\x03\x02\x02\x02\xF8\u0102\x07\x11\x02" + + "\x02\xF9\u0102\x07\x12\x02\x02\xFA\xFB\x07\x13\x02\x02\xFB\u0102\x07\x11" + + "\x02\x02\xFC\xFD\x07\x13\x02\x02\xFD\u0102\x07\x12\x02\x02\xFE\u0102\x07" + + "\x14\x02\x02\xFF\u0102\x07\x15\x02\x02\u0100\u0102\x07\x16\x02\x02\u0101" + + "\xF8\x03\x02\x02\x02\u0101\xF9\x03\x02\x02\x02\u0101\xFA\x03\x02\x02\x02" + + "\u0101\xFC\x03\x02\x02\x02\u0101\xFE\x03\x02\x02\x02\u0101\xFF\x03\x02" + + "\x02\x02\u0101\u0100\x03\x02\x02\x02\u0102\x17\x03\x02\x02\x02\u0103\u0104" + + "\x07\x17\x02\x02\u0104\u0105\x05 \x11\x02\u0105\u0106\x07\x18\x02\x02" + + "\u0106\u0109\x05D#\x02\u0107\u0108\x07\x19\x02\x02\u0108\u010A\x05$\x13" + + "\x02\u0109\u0107\x03\x02\x02\x02\u0109\u010A\x03\x02\x02\x02\u010A\u0116" + + "\x03\x02\x02\x02\u010B\u010C\x07\x17\x02\x02\u010C\u010F\x05 \x11\x02" + + "\u010D\u010E\x07\x1A\x02\x02\u010E\u0110\x05 \x11\x02\u010F\u010D\x03" + + "\x02\x02\x02\u010F\u0110\x03\x02\x02\x02\u0110\u0113\x03\x02\x02\x02\u0111" + + "\u0112\x07\x19\x02\x02\u0112\u0114\x05$\x13\x02\u0113\u0111\x03\x02\x02" + + "\x02\u0113\u0114\x03\x02\x02\x02\u0114\u0116\x03\x02\x02\x02\u0115\u0103" + + "\x03\x02\x02\x02\u0115\u010B\x03\x02\x02\x02\u0116\x19\x03\x02\x02\x02" + + "\u0117\u0118\x07\x1B\x02\x02\u0118\u0119\x05 \x11\x02\u0119\u011A\x07" + + "\x18\x02\x02\u011A\u011B\x05D#\x02\u011B\u0123\x03\x02\x02\x02\u011C\u011D" + + "\x07\x1B\x02\x02\u011D\u0120\x05 \x11\x02\u011E\u011F\x07\x1A\x02\x02" + + "\u011F\u0121\x05 \x11\x02\u0120\u011E\x03\x02\x02\x02\u0120\u0121\x03" + + "\x02\x02\x02\u0121\u0123\x03\x02\x02\x02\u0122\u0117\x03\x02\x02\x02\u0122" + + "\u011C\x03\x02\x02\x02\u0123\x1B\x03\x02\x02\x02\u0124\u0125\x07\x17\x02" + + "\x02\u0125\u0126\x05\x1E\x10\x02\u0126\u0127\x07?\x02\x02\u0127\u0128" + + "\x05 \x11\x02\u0128\u0129\x07>\x02\x02\u0129\u0131\x05.\x18\x02\u012A" + + "\u012B\x07\n\x02\x02\u012B\u012C\x05 \x11\x02\u012C\u012D\x07>\x02\x02" + + "\u012D\u012E\x05.\x18\x02\u012E\u0130\x03\x02\x02\x02\u012F\u012A\x03" + + "\x02\x02\x02\u0130\u0133\x03\x02\x02\x02\u0131\u012F\x03\x02\x02\x02\u0131" + + "\u0132\x03\x02\x02\x02\u0132\u0134\x03\x02\x02\x02\u0133\u0131\x03\x02" + + "\x02\x02\u0134\u0135\x07@\x02\x02\u0135\u0136\x07\x18\x02\x02\u0136\u0139" + + "\x075\x02\x02\u0137\u0138\x07\x19\x02\x02\u0138\u013A\x05$\x13\x02\u0139" + + "\u0137\x03\x02\x02\x02\u0139\u013A\x03\x02\x02\x02\u013A\u0153\x03\x02" + + "\x02\x02\u013B\u013C\x07\x17\x02\x02\u013C\u013D\x05\x1E\x10\x02\u013D" + + "\u013E\x07?\x02\x02\u013E\u013F\x05 \x11\x02\u013F\u0140\x07>\x02\x02" + + "\u0140\u0148\x05.\x18\x02\u0141\u0142\x07\n\x02\x02\u0142\u0143\x05 \x11" + + "\x02\u0143\u0144\x07>\x02\x02\u0144\u0145\x05.\x18\x02\u0145\u0147\x03" + + "\x02\x02\x02\u0146\u0141\x03\x02\x02\x02\u0147\u014A\x03\x02\x02\x02\u0148" + + "\u0146\x03\x02\x02\x02\u0148\u0149\x03\x02\x02\x02\u0149\u014B\x03\x02" + + "\x02\x02\u014A\u0148\x03\x02\x02\x02\u014B\u014C\x07@\x02\x02\u014C\u014D" + + "\x07\x1A\x02\x02\u014D\u0150\x05\"\x12\x02\u014E\u014F\x07\x19\x02\x02" + + "\u014F\u0151\x05$\x13\x02\u0150\u014E\x03\x02\x02\x02\u0150\u0151\x03" + + "\x02\x02\x02\u0151\u0153\x03\x02\x02\x02\u0152\u0124\x03\x02\x02\x02\u0152" + + "\u013B\x03\x02\x02\x02\u0153\x1D\x03\x02\x02\x02\u0154\u0155\x05R*\x02" + + "\u0155\x1F\x03\x02\x02\x02\u0156\u0157\x05R*\x02\u0157!\x03\x02\x02\x02" + + "\u0158\u0159\x05R*\x02\u0159#\x03\x02\x02\x02\u015A\u015B\x07*\x02\x02" + + "\u015B%\x03\x02\x02\x02\u015C\u015D\b\x14\x01\x02\u015D\u0166\x07?\x02" + + "\x02\u015E\u0163\x05&\x14\x02\u015F\u0160\x07\n\x02\x02\u0160\u0162\x05" + + "&\x14\x02\u0161\u015F\x03\x02\x02\x02\u0162\u0165\x03\x02\x02\x02\u0163" + + "\u0161\x03\x02\x02\x02\u0163\u0164\x03\x02\x02\x02\u0164\u0167\x03\x02" + + "\x02\x02\u0165\u0163\x03\x02\x02\x02\u0166\u015E\x03\x02\x02\x02\u0166" + + "\u0167\x03\x02\x02\x02\u0167\u0169\x03\x02\x02\x02\u0168\u016A\x07\n\x02" + + "\x02\u0169\u0168\x03\x02\x02\x02\u0169\u016A\x03\x02\x02\x02\u016A\u016B" + + "\x03\x02\x02\x02\u016B\u016C\x07@\x02\x02\u016C\u016D\x07\x1D\x02\x02" + + "\u016D\u01A3\x05&\x14\x0E\u016E\u016F\x07A\x02\x02\u016F\u0170\x07\r\x02" + + "\x02\u0170\u0171\x05&\x14\x02\u0171\u0172\x07\x0E\x02\x02\u0172\u01A3" + + "\x03\x02\x02\x02\u0173\u0174\x07B\x02\x02\u0174\u0175\x07\r\x02\x02\u0175" + + "\u0176\x05&\x14\x02\u0176\u0177\x07\x0E\x02\x02\u0177\u01A3\x03\x02\x02" + + "\x02\u0178\u0179\x07?\x02\x02\u0179\u017A\x05&\x14\x02\u017A\u017B\x07" + + "\n\x02\x02\u017B\u0180\x05&\x14\x02\u017C\u017D\x07\n\x02\x02\u017D\u017F" + + "\x05&\x14\x02\u017E\u017C\x03\x02\x02\x02\u017F\u0182\x03\x02\x02\x02" + + "\u0180\u017E\x03\x02\x02\x02\u0180\u0181\x03\x02\x02\x02\u0181\u0184\x03" + + "\x02\x02\x02\u0182\u0180\x03\x02\x02\x02\u0183\u0185\x07\n\x02\x02\u0184" + + "\u0183\x03\x02\x02\x02\u0184\u0185\x03\x02\x02\x02\u0185\u0186\x03\x02" + + "\x02\x02\u0186\u0187\x07@\x02\x02\u0187\u01A3\x03\x02\x02\x02\u0188\u018A" + + "\x07\x04\x02\x02\u0189\u018B\x05*\x16\x02\u018A\u0189\x03\x02\x02\x02" + + "\u018A\u018B\x03\x02\x02\x02\u018B\u018C\x03\x02\x02\x02\u018C\u01A3\x07" + + "\x05\x02\x02\u018D\u01A3\x07\x1E\x02\x02\u018E\u01A3\x07\x1F\x02\x02\u018F" + + "\u01A3\x07 \x02\x02\u0190\u01A3\x05(\x15\x02\u0191\u01A3\x05R*\x02\u0192" + + "\u0193\x07?\x02\x02\u0193\u0194\x05&\x14\x02\u0194\u0195\x07@\x02\x02" + + "\u0195\u01A3\x03\x02\x02\x02\u0196\u0197\x05R*\x02\u0197\u0198\x07\r\x02" + + "\x02\u0198\u019D\x05&\x14\x02\u0199\u019A\x07\n\x02\x02\u019A\u019C\x05" + + "&\x14\x02\u019B\u0199\x03\x02\x02\x02\u019C\u019F\x03\x02\x02\x02\u019D" + + "\u019B\x03\x02\x02\x02\u019D\u019E\x03\x02\x02\x02\u019E\u01A0\x03\x02" + + "\x02\x02\u019F\u019D\x03\x02\x02\x02\u01A0\u01A1\x07\x0E\x02\x02\u01A1" + + "\u01A3\x03\x02\x02\x02\u01A2\u015C\x03\x02\x02\x02\u01A2\u016E\x03\x02" + + "\x02\x02\u01A2\u0173\x03\x02\x02\x02\u01A2\u0178\x03\x02\x02\x02\u01A2" + + "\u0188\x03\x02\x02\x02\u01A2\u018D\x03\x02\x02\x02\u01A2\u018E\x03\x02" + + "\x02\x02\u01A2\u018F\x03\x02\x02\x02\u01A2\u0190\x03\x02\x02\x02\u01A2" + + "\u0191\x03\x02\x02\x02\u01A2\u0192\x03\x02\x02\x02\u01A2\u0196\x03\x02" + + "\x02\x02\u01A3\u01AC\x03\x02\x02\x02\u01A4\u01A5\f\x10\x02\x02\u01A5\u01A6" + + "\x07\x1C\x02\x02\u01A6\u01AB\x05&\x14\x10\u01A7\u01A8\f\x0F\x02\x02\u01A8" + + "\u01A9\x07\x1D\x02\x02\u01A9\u01AB\x05&\x14\x0F\u01AA\u01A4\x03\x02\x02" + + "\x02\u01AA\u01A7\x03\x02\x02\x02\u01AB\u01AE\x03\x02\x02\x02\u01AC\u01AA" + + "\x03\x02\x02\x02\u01AC\u01AD\x03\x02\x02\x02\u01AD\'\x03\x02\x02\x02\u01AE" + + "\u01AC\x03\x02\x02\x02\u01AF\u01B0\x07C\x02\x02\u01B0)\x03\x02\x02\x02" + + "\u01B1\u01B2\x05,\x17\x02\u01B2\u01B3\x07\x07\x02\x02\u01B3\u01B4\x05" + + "&\x14\x02\u01B4\u01BC\x03\x02\x02\x02\u01B5\u01B6\x07\n\x02\x02\u01B6" + + "\u01B7\x05,\x17\x02\u01B7\u01B8\x07\x07\x02\x02\u01B8\u01B9\x05&\x14\x02" + + "\u01B9\u01BB\x03\x02\x02\x02\u01BA\u01B5\x03\x02\x02\x02\u01BB\u01BE\x03" + + "\x02\x02\x02\u01BC\u01BA\x03\x02\x02\x02\u01BC\u01BD\x03\x02\x02\x02\u01BD" + + "\u01C2\x03\x02\x02\x02\u01BE\u01BC\x03\x02\x02\x02\u01BF\u01C3\x07\n\x02" + + "\x02\u01C0\u01C1\x07\x0F\x02\x02\u01C1\u01C3\x05V,\x02\u01C2\u01BF\x03" + + "\x02\x02\x02\u01C2\u01C0\x03\x02\x02\x02\u01C2\u01C3\x03\x02\x02\x02\u01C3" + + "\u01C7\x03\x02\x02\x02\u01C4\u01C5\x07\x0F\x02\x02\u01C5\u01C7\x05V,\x02" + + "\u01C6\u01B1\x03\x02\x02\x02\u01C6\u01C4\x03\x02\x02\x02\u01C7+\x03\x02" + + "\x02\x02\u01C8\u01C9\x05T+\x02\u01C9-\x03\x02\x02\x02\u01CA\u01CB\b\x18" + + "\x01\x02\u01CB\u0261\x058\x1D\x02\u01CC\u01CD\x05J&\x02\u01CD\u01CF\x07" + + "?\x02\x02\u01CE\u01D0\x05F$\x02\u01CF\u01CE\x03\x02\x02\x02\u01CF\u01D0" + + "\x03\x02\x02\x02\u01D0\u01D1\x03\x02\x02\x02\u01D1\u01D2\x07@\x02\x02" + + "\u01D2\u0261\x03\x02\x02\x02\u01D3\u01D4\x074\x02\x02\u01D4\u0261\x05" + + ".\x18\x1B\u01D5\u01D6\x05R*\x02\u01D6\u01D7\x07\"\x02\x02\u01D7\u01D8" + + "\x07>\x02\x02\u01D8\u01D9\x05.\x18\x17\u01D9\u0261\x03\x02\x02\x02\u01DA" + + "\u01DB\x07-\x02\x02\u01DB\u01DC\x07\x04\x02\x02\u01DC\u01E1\x05.\x18\x02" + + "\u01DD\u01DE\x07\n\x02\x02\u01DE\u01E0\x05.\x18\x02\u01DF\u01DD\x03\x02" + + "\x02\x02\u01E0\u01E3\x03\x02\x02\x02\u01E1\u01DF\x03\x02\x02\x02\u01E1" + + "\u01E2\x03\x02\x02\x02\u01E2\u01E5\x03\x02\x02\x02\u01E3\u01E1\x03\x02" + + "\x02\x02\u01E4\u01E6\x07\n\x02\x02\u01E5\u01E4\x03\x02\x02\x02\u01E5\u01E6" + + "\x03\x02\x02\x02\u01E6\u01E7\x03\x02\x02\x02\u01E7\u01E8\x07\x05\x02\x02" + + "\u01E8\u0261\x03\x02\x02\x02\u01E9\u01EA\x07.\x02\x02\u01EA\u01EB\x07" + + "\x04\x02\x02\u01EB\u01F0\x05.\x18\x02\u01EC\u01ED\x07\n\x02\x02\u01ED" + + "\u01EF\x05.\x18\x02\u01EE\u01EC\x03\x02"; private static readonly _serializedATNSegment1: string = - "\x05.\x18\x02\u01EF\u01ED\x03\x02\x02\x02\u01F0\u01F3\x03\x02\x02\x02" + - "\u01F1\u01EF\x03\x02\x02\x02\u01F1\u01F2\x03\x02\x02\x02\u01F2\u01F5\x03" + - "\x02\x02\x02\u01F3\u01F1\x03\x02\x02\x02\u01F4\u01F6\x07\n\x02\x02\u01F5" + - "\u01F4\x03\x02\x02\x02\u01F5\u01F6\x03\x02\x02\x02\u01F6\u01F7\x03\x02" + - "\x02\x02\u01F7\u01F8\x07\x05\x02\x02\u01F8\u0262\x03\x02\x02\x02\u01F9" + - "\u0262\x050\x19\x02\u01FA\u01FB\x07#\x02\x02\u01FB\u01FC\x07\x04\x02\x02" + - "\u01FC\u0201\x05.\x18\x02\u01FD\u01FE\x07\n\x02\x02\u01FE\u0200\x05.\x18" + - "\x02\u01FF\u01FD\x03\x02\x02\x02\u0200\u0203\x03\x02\x02\x02\u0201\u01FF" + - "\x03\x02\x02\x02\u0201\u0202\x03\x02\x02\x02\u0202\u0205\x03\x02\x02\x02" + - "\u0203\u0201\x03\x02\x02\x02\u0204\u0206\x07\n\x02\x02\u0205\u0204\x03" + - "\x02\x02\x02\u0205\u0206\x03\x02\x02\x02\u0206\u0207\x03\x02\x02\x02\u0207" + - "\u0208\x07\x05\x02\x02\u0208\u0262\x03\x02\x02\x02\u0209\u020A\x07$\x02" + - "\x02\u020A\u020B\x07\x04\x02\x02\u020B\u0210\x05.\x18\x02\u020C\u020D" + - "\x07\n\x02\x02\u020D\u020F\x05.\x18\x02\u020E\u020C\x03\x02\x02\x02\u020F" + - "\u0212\x03\x02\x02\x02\u0210\u020E\x03\x02\x02\x02\u0210\u0211\x03\x02" + - "\x02\x02\u0211\u0214\x03\x02\x02\x02\u0212\u0210\x03\x02\x02\x02\u0213" + - "\u0215\x07\n\x02\x02\u0214\u0213\x03\x02\x02\x02\u0214\u0215\x03\x02\x02" + - "\x02\u0215\u0216\x03\x02\x02\x02\u0216\u0217\x07\x05\x02\x02\u0217\u0262" + - "\x03\x02\x02\x02\u0218\u021D\x05R*\x02\u0219\u021D\x07,\x02\x02\u021A" + - "\u021D\x07+\x02\x02\u021B\u021D\x07*\x02\x02\u021C\u0218\x03\x02\x02\x02" + - "\u021C\u0219\x03\x02\x02\x02\u021C\u021A\x03\x02\x02\x02\u021C\u021B\x03" + - "\x02\x02\x02\u021D\u0262\x03\x02\x02\x02\u021E\u021F\x07?\x02\x02\u021F" + - "\u0220\x05.\x18\x02\u0220\u0221\x07\n\x02\x02\u0221\u0226\x05.\x18\x02" + - "\u0222\u0223\x07\n\x02\x02\u0223\u0225\x05.\x18\x02\u0224\u0222\x03\x02" + - "\x02\x02\u0225\u0228\x03\x02\x02\x02\u0226\u0224\x03\x02\x02\x02\u0226" + - "\u0227\x03\x02\x02\x02\u0227\u022A\x03\x02\x02\x02\u0228\u0226\x03\x02" + - "\x02\x02\u0229\u022B\x07\n\x02\x02\u022A\u0229\x03\x02\x02\x02\u022A\u022B" + - "\x03\x02\x02\x02\u022B\u022C\x03\x02\x02\x02\u022C\u022D\x07@\x02\x02" + - "\u022D\u0262\x03\x02\x02\x02\u022E\u022F\x07\x04\x02\x02\u022F\u0234\x05" + - "H%\x02\u0230\u0231\x07\n\x02\x02\u0231\u0233\x05H%\x02\u0232\u0230\x03" + - "\x02\x02\x02\u0233\u0236\x03\x02\x02\x02\u0234\u0232\x03\x02\x02\x02\u0234" + - "\u0235\x03\x02\x02\x02\u0235\u0238\x03\x02\x02\x02\u0236\u0234\x03\x02" + - "\x02\x02\u0237\u0239\x07\n\x02\x02\u0238\u0237\x03\x02\x02\x02\u0238\u0239" + - "\x03\x02\x02\x02\u0239\u023A\x03\x02\x02\x02\u023A\u023B\x07\x05\x02\x02" + - "\u023B\u0262\x03\x02\x02\x02\u023C\u0245\x07\r\x02\x02\u023D\u0242\x05" + - ".\x18\x02\u023E\u023F\x07\n\x02\x02\u023F\u0241\x05.\x18\x02\u0240\u023E" + - "\x03\x02\x02\x02\u0241\u0244\x03\x02\x02\x02\u0242\u0240\x03\x02\x02\x02" + - "\u0242\u0243\x03\x02\x02\x02\u0243\u0246\x03\x02\x02\x02\u0244\u0242\x03" + - "\x02\x02\x02\u0245\u023D\x03\x02\x02\x02\u0245\u0246\x03\x02\x02\x02\u0246" + - "\u0248\x03\x02\x02\x02\u0247\u0249\x07\n\x02\x02\u0248\u0247\x03\x02\x02" + - "\x02\u0248\u0249\x03\x02\x02\x02\u0249\u024A\x03\x02\x02\x02\u024A\u0262" + - "\x07\x0E\x02\x02\u024B\u024C\x07%\x02\x02\u024C\u024D\x07?\x02\x02\u024D" + - "\u024E\x05.\x18\x02\u024E\u024F\x07@\x02\x02\u024F\u0250\x05.\x18\x02" + - "\u0250\u0251\x07&\x02\x02\u0251\u0252\x05.\x18\x07\u0252\u0262\x03\x02" + - "\x02\x02\u0253\u0254\x05\n\x06\x02\u0254\u0255\x05.\x18\x06\u0255\u0262" + - "\x03\x02\x02\x02\u0256\u0257\x05\x14\v\x02\u0257\u0258\x05.\x18\x05\u0258" + - "\u0262\x03\x02\x02\x02\u0259\u025A\x07?\x02\x02\u025A\u025B\x05.\x18\x02" + - "\u025B\u025C\x07@\x02\x02\u025C\u0262\x03\x02\x02\x02\u025D\u025E\x07" + - "\x04\x02\x02\u025E\u025F\x05.\x18\x02\u025F\u0260\x07\x05\x02\x02\u0260" + - "\u0262\x03\x02\x02\x02\u0261\u01CB\x03\x02\x02\x02\u0261\u01CD\x03\x02" + - "\x02\x02\u0261\u01D4\x03\x02\x02\x02\u0261\u01D6\x03\x02\x02\x02\u0261" + - "\u01DB\x03\x02\x02\x02\u0261\u01EA\x03\x02\x02\x02\u0261\u01F9\x03\x02" + - "\x02\x02\u0261\u01FA\x03\x02\x02\x02\u0261\u0209\x03\x02\x02\x02\u0261" + - "\u021C\x03\x02\x02\x02\u0261\u021E\x03\x02\x02\x02\u0261\u022E\x03\x02" + - "\x02\x02\u0261\u023C\x03\x02\x02\x02\u0261\u024B\x03\x02\x02\x02\u0261" + - "\u0253\x03\x02\x02\x02\u0261\u0256\x03\x02\x02\x02\u0261\u0259\x03\x02" + - "\x02\x02\u0261\u025D\x03\x02\x02\x02\u0262\u0294\x03\x02\x02\x02\u0263" + - "\u0264\f\x1C\x02\x02\u0264\u0265\x07!\x02\x02\u0265\u0293\x05.\x18\x1C" + - "\u0266\u0267\f\x1A\x02\x02\u0267\u0268\t\x02\x02\x02\u0268\u0293\x05." + - "\x18\x1B\u0269\u026A\f\x19\x02\x02\u026A\u026B\t\x03\x02\x02\u026B\u0293" + - "\x05.\x18\x1A\u026C\u026D\f\x18\x02\x02\u026D\u026E\t\x04\x02\x02\u026E" + - "\u0293\x05.\x18\x19\u026F\u0270\f\x16\x02\x02\u0270\u0271\x07>\x02\x02" + - "\u0271\u0272\x05.\x18\x17\u0272\u0273\b\x18\x01\x02\u0273\u0293\x03\x02" + - "\x02\x02\u0274\u0275\f\x14\x02\x02\u0275\u0276\x07-\x02\x02\u0276\u0293" + - "\x05.\x18\x15\u0277\u0278\f\x12\x02\x02\u0278\u0279\x07.\x02\x02\u0279" + - "\u0293\x05.\x18\x13\u027A\u027B\f\x11\x02\x02\u027B\u027C\x07/\x02\x02" + - "\u027C\u0293\x05.\x18\x12\u027D\u027E\f\x10\x02\x02\u027E\u027F\x070\x02" + - "\x02\u027F\u0293\x05.\x18\x11\u0280\u0281\f\n\x02\x02\u0281\u0282\x07" + - "\x1C\x02\x02\u0282\u0293\x05.\x18\v\u0283\u0284\f \x02\x02\u0284\u0285" + - "\x07\x18\x02\x02\u0285\u028B\x05L\'\x02\u0286\u0288\x07?\x02\x02\u0287" + - "\u0289\x05F$\x02\u0288\u0287\x03\x02\x02\x02\u0288\u0289\x03\x02\x02\x02" + - "\u0289\u028A\x03\x02\x02\x02\u028A\u028C\x07@\x02\x02\u028B\u0286\x03" + - "\x02\x02\x02\u028B\u028C\x03\x02\x02\x02\u028C\u0293\x03\x02\x02\x02\u028D" + - "\u028E\f\x1D\x02\x02\u028E\u028F\x07\r\x02\x02\u028F\u0290\x05.\x18\x02" + - "\u0290\u0291\x07\x0E\x02\x02\u0291\u0293\x03\x02\x02\x02\u0292\u0263\x03" + - "\x02\x02\x02\u0292\u0266\x03\x02\x02\x02\u0292\u0269\x03\x02\x02\x02\u0292" + - "\u026C\x03\x02\x02\x02\u0292\u026F\x03\x02\x02\x02\u0292\u0274\x03\x02" + - "\x02\x02\u0292\u0277\x03\x02\x02\x02\u0292\u027A\x03\x02\x02\x02\u0292" + - "\u027D\x03\x02\x02\x02\u0292\u0280\x03\x02\x02\x02\u0292\u0283\x03\x02" + - "\x02\x02\u0292\u028D\x03\x02\x02\x02\u0293\u0296\x03\x02\x02\x02\u0294" + - "\u0292\x03\x02\x02\x02\u0294\u0295\x03\x02\x02\x02\u0295/\x03\x02\x02" + - "\x02\u0296\u0294\x03\x02\x02\x02\u0297\u0298\x072\x02\x02\u0298\u0299" + - "\x05.\x18\x02\u0299\u029B\x07\x04\x02\x02\u029A\u029C\x07\x0F\x02\x02" + - "\u029B\u029A\x03\x02\x02\x02\u029B\u029C\x03\x02\x02\x02\u029C\u029D\x03" + - "\x02\x02\x02\u029D\u02A2\x052\x1A\x02\u029E\u029F\x07\x0F\x02\x02\u029F" + - "\u02A1\x052\x1A\x02\u02A0\u029E\x03\x02\x02\x02\u02A1\u02A4\x03\x02\x02" + - "\x02\u02A2\u02A0\x03\x02\x02\x02\u02A2\u02A3\x03\x02\x02\x02\u02A3\u02A5" + - "\x03\x02\x02\x02\u02A4\u02A2\x03\x02\x02\x02\u02A5\u02A6\x07\x05\x02\x02" + - "\u02A61\x03\x02\x02\x02\u02A7\u02AA\x054\x1B\x02\u02A8\u02AA\x07\'\x02" + - "\x02\u02A9\u02A7\x03\x02\x02\x02\u02A9\u02A8\x03\x02\x02\x02\u02AA\u02AB" + - "\x03\x02\x02\x02\u02AB\u02AC\x07\x1D\x02\x02\u02AC\u02AD\x05.\x18\x02" + - "\u02AD3\x03\x02\x02\x02\u02AE\u02B5\x05T+\x02\u02AF\u02B2\x07?\x02\x02" + - "\u02B0\u02B3\x05T+\x02\u02B1\u02B3\x07\'\x02\x02\u02B2\u02B0\x03\x02\x02" + - "\x02\u02B2\u02B1\x03\x02\x02\x02\u02B3\u02B4\x03\x02\x02\x02\u02B4\u02B6" + - "\x07@\x02\x02\u02B5\u02AF\x03\x02\x02\x02\u02B5\u02B6\x03\x02\x02\x02" + - "\u02B65\x03\x02\x02\x02\u02B7\u02B8\x05\b\x05\x02\u02B8\u02B9\x07\x02" + - "\x02\x03\u02B9\u02C1\x03\x02\x02\x02\u02BA\u02BB\x05.\x18\x02\u02BB\u02BC" + - "\x07\x02\x02\x03\u02BC\u02C1\x03\x02\x02\x02\u02BD\u02BE\x07E\x02\x02" + - "\u02BE\u02C1\x07\x02\x02\x03\u02BF\u02C1\x07\x02\x02\x03\u02C0\u02B7\x03" + - "\x02\x02\x02\u02C0\u02BA\x03\x02\x02\x02\u02C0\u02BD\x03\x02\x02\x02\u02C0" + - "\u02BF\x03\x02\x02\x02\u02C17\x03\x02\x02\x02\u02C2\u02C5\x05:\x1E\x02" + - "\u02C3\u02C5\x05<\x1F\x02\u02C4\u02C2\x03\x02\x02\x02\u02C4\u02C3\x03" + - "\x02\x02\x02\u02C59\x03\x02\x02\x02\u02C6\u02C7\x05@!\x02\u02C7\u02C8" + - "\x07\x1D\x02\x02\u02C8\u02C9\x05.\x18\x02\u02C9\u02D8\x03\x02\x02\x02" + - "\u02CA\u02CB\x07?\x02\x02\u02CB\u02D0\x05@!\x02\u02CC\u02CD\x07\n\x02" + - "\x02\u02CD\u02CF\x05@!\x02\u02CE\u02CC\x03\x02\x02\x02\u02CF\u02D2\x03" + - "\x02\x02\x02\u02D0\u02CE\x03\x02\x02\x02\u02D0\u02D1\x03\x02\x02\x02\u02D1" + - "\u02D3\x03\x02\x02\x02\u02D2\u02D0\x03\x02\x02\x02\u02D3\u02D4\x07@\x02" + - "\x02\u02D4\u02D5\x07\x1D\x02\x02\u02D5\u02D6\x05.\x18\x02\u02D6\u02D8" + - "\x03\x02\x02\x02\u02D7\u02C6\x03\x02\x02\x02\u02D7\u02CA\x03\x02\x02\x02" + - "\u02D8;\x03\x02\x02\x02\u02D9\u02DA\x07?\x02\x02\u02DA\u02DB\x07?\x02" + - "\x02\u02DB\u02DE\x05@!\x02\u02DC\u02DD\x07\n\x02\x02\u02DD\u02DF\x05@" + - "!\x02\u02DE\u02DC\x03\x02\x02\x02\u02DF\u02E0\x03\x02\x02\x02\u02E0\u02DE" + - "\x03\x02\x02\x02\u02E0\u02E1\x03\x02\x02\x02\u02E1\u02E2\x03\x02\x02\x02" + - "\u02E2\u02E3\x07@\x02\x02\u02E3\u02E4\x07@\x02\x02\u02E4\u02E5\x07\x1D" + - "\x02\x02\u02E5\u02E6\x05.\x18\x02\u02E6=\x03\x02\x02\x02\u02E7\u02EA\x07" + - "\'\x02\x02\u02E8\u02EA\x05R*\x02\u02E9\u02E7\x03\x02\x02\x02\u02E9\u02E8" + - "\x03\x02\x02\x02\u02EA?\x03\x02\x02\x02\u02EB\u02EC\x05> \x02\u02ECA\x03" + - "\x02\x02\x02\u02ED\u02EE\x05> \x02\u02EE\u02EF\x07\x07\x02\x02\u02EF\u02F0" + - "\x05&\x14\x02\u02F0C\x03\x02\x02\x02\u02F1\u02F4\x075\x02\x02\u02F2\u02F4" + - "\x05R*\x02\u02F3\u02F1\x03\x02\x02\x02\u02F3\u02F2\x03\x02\x02\x02\u02F4" + - "E\x03\x02\x02\x02\u02F5\u02FA\x05.\x18\x02\u02F6\u02F7\x07\n\x02\x02\u02F7" + - "\u02F9\x05.\x18\x02\u02F8\u02F6\x03\x02\x02\x02\u02F9\u02FC\x03\x02\x02" + - "\x02\u02FA\u02F8\x03\x02\x02\x02\u02FA\u02FB\x03\x02\x02\x02\u02FBG\x03" + - "\x02\x02\x02\u02FC\u02FA\x03\x02\x02\x02\u02FD\u02FE\x05T+\x02\u02FE\u02FF" + - "\x07\x07\x02\x02\u02FF\u0300\x05.\x18\x02\u0300\u0304\x03\x02\x02\x02" + - "\u0301\u0302\x07(\x02\x02\u0302\u0304\x05.\x18\x02\u0303\u02FD\x03\x02" + - "\x02\x02\u0303\u0301\x03\x02\x02\x02\u0304I\x03\x02\x02\x02\u0305\u0308" + - "\x05R*\x02\u0306\u0308\t\x05\x02\x02\u0307\u0305\x03\x02\x02\x02\u0307" + - "\u0306\x03\x02\x02\x02\u0308K\x03\x02\x02\x02\u0309\u030C\x05R*\x02\u030A" + - "\u030C\t\x06\x02\x02\u030B\u0309\x03\x02\x02\x02\u030B\u030A\x03\x02\x02" + - "\x02\u030CM\x03\x02\x02\x02\u030D\u030E\t\x07\x02\x02\u030EO\x03\x02\x02" + - "\x02\u030F\u0310\t\b\x02\x02\u0310Q\x03\x02\x02\x02\u0311\u0316\x05V," + - "\x02\u0312\u0313\x07)\x02\x02\u0313\u0315\x05V,\x02\u0314\u0312\x03\x02" + - "\x02\x02\u0315\u0318\x03\x02\x02\x02\u0316\u0314\x03\x02\x02\x02\u0316" + - "\u0317\x03\x02\x02\x02\u0317S\x03\x02\x02\x02\u0318\u0316\x03\x02\x02" + - "\x02\u0319\u031E\x05V,\x02\u031A\u031B\x05R*\x02\u031B\u031C\b+\x01\x02" + - "\u031C\u031E\x03\x02\x02\x02\u031D\u0319\x03\x02\x02\x02\u031D\u031A\x03" + - "\x02\x02\x02\u031EU\x03\x02\x02\x02\u031F\u0320\t\t\x02\x02\u0320W\x03" + - "\x02\x02\x02Z[bks\x8C\x96\x9E\xA1\xAB\xAE\xB1\xB5\xB9\xBC\xBE\xCC\xD5" + - "\xDA\xDD\xE4\xEC\xF2\xF7\u0102\u010A\u0110\u0114\u0116\u0121\u0123\u0132" + - "\u013A\u0149\u0151\u0153\u0164\u0167\u016A\u0181\u0185\u018B\u019E\u01A3" + - "\u01AB\u01AD\u01BD\u01C3\u01C7\u01D0\u01E2\u01E6\u01F1\u01F5\u0201\u0205" + - "\u0210\u0214\u021C\u0226\u022A\u0234\u0238\u0242\u0245\u0248\u0261\u0288" + - "\u028B\u0292\u0294\u029B\u02A2\u02A9\u02B2\u02B5\u02C0\u02C4\u02D0\u02D7" + - "\u02E0\u02E9\u02F3\u02FA\u0303\u0307\u030B\u0316\u031D"; + "\x02\x02\u01EF\u01F2\x03\x02\x02\x02\u01F0\u01EE\x03\x02\x02\x02\u01F0" + + "\u01F1\x03\x02\x02\x02\u01F1\u01F4\x03\x02\x02\x02\u01F2\u01F0\x03\x02" + + "\x02\x02\u01F3\u01F5\x07\n\x02\x02\u01F4\u01F3\x03\x02\x02\x02\u01F4\u01F5" + + "\x03\x02\x02\x02\u01F5\u01F6\x03\x02\x02\x02\u01F6\u01F7\x07\x05\x02\x02" + + "\u01F7\u0261\x03\x02\x02\x02\u01F8\u0261\x050\x19\x02\u01F9\u01FA\x07" + + "#\x02\x02\u01FA\u01FB\x07\x04\x02\x02\u01FB\u0200\x05.\x18\x02\u01FC\u01FD" + + "\x07\n\x02\x02\u01FD\u01FF\x05.\x18\x02\u01FE\u01FC\x03\x02\x02\x02\u01FF" + + "\u0202\x03\x02\x02\x02\u0200\u01FE\x03\x02\x02\x02\u0200\u0201\x03\x02" + + "\x02\x02\u0201\u0204\x03\x02\x02\x02\u0202\u0200\x03\x02\x02\x02\u0203" + + "\u0205\x07\n\x02\x02\u0204\u0203\x03\x02\x02\x02\u0204\u0205\x03\x02\x02" + + "\x02\u0205\u0206\x03\x02\x02\x02\u0206\u0207\x07\x05\x02\x02\u0207\u0261" + + "\x03\x02\x02\x02\u0208\u0209\x07$\x02\x02\u0209\u020A\x07\x04\x02\x02" + + "\u020A\u020F\x05.\x18\x02\u020B\u020C\x07\n\x02\x02\u020C\u020E\x05.\x18" + + "\x02\u020D\u020B\x03\x02\x02\x02\u020E\u0211\x03\x02\x02\x02\u020F\u020D" + + "\x03\x02\x02\x02\u020F\u0210\x03\x02\x02\x02\u0210\u0213\x03\x02\x02\x02" + + "\u0211\u020F\x03\x02\x02\x02\u0212\u0214\x07\n\x02\x02\u0213\u0212\x03" + + "\x02\x02\x02\u0213\u0214\x03\x02\x02\x02\u0214\u0215\x03\x02\x02\x02\u0215" + + "\u0216\x07\x05\x02\x02\u0216\u0261\x03\x02\x02\x02\u0217\u021C\x05R*\x02" + + "\u0218\u021C\x07,\x02\x02\u0219\u021C\x07+\x02\x02\u021A\u021C\x07*\x02" + + "\x02\u021B\u0217\x03\x02\x02\x02\u021B\u0218\x03\x02\x02\x02\u021B\u0219" + + "\x03\x02\x02\x02\u021B\u021A\x03\x02\x02\x02\u021C\u0261\x03\x02\x02\x02" + + "\u021D\u021E\x07?\x02\x02\u021E\u021F\x05.\x18\x02\u021F\u0220\x07\n\x02" + + "\x02\u0220\u0225\x05.\x18\x02\u0221\u0222\x07\n\x02\x02\u0222\u0224\x05" + + ".\x18\x02\u0223\u0221\x03\x02\x02\x02\u0224\u0227\x03\x02\x02\x02\u0225" + + "\u0223\x03\x02\x02\x02\u0225\u0226\x03\x02\x02\x02\u0226\u0229\x03\x02" + + "\x02\x02\u0227\u0225\x03\x02\x02\x02\u0228\u022A\x07\n\x02\x02\u0229\u0228" + + "\x03\x02\x02\x02\u0229\u022A\x03\x02\x02\x02\u022A\u022B\x03\x02\x02\x02" + + "\u022B\u022C\x07@\x02\x02\u022C\u0261\x03\x02\x02\x02\u022D\u022E\x07" + + "\x04\x02\x02\u022E\u0233\x05H%\x02\u022F\u0230\x07\n\x02\x02\u0230\u0232" + + "\x05H%\x02\u0231\u022F\x03\x02\x02\x02\u0232\u0235\x03\x02\x02\x02\u0233" + + "\u0231\x03\x02\x02\x02\u0233\u0234\x03\x02\x02\x02\u0234\u0237\x03\x02" + + "\x02\x02\u0235\u0233\x03\x02\x02\x02\u0236\u0238\x07\n\x02\x02\u0237\u0236" + + "\x03\x02\x02\x02\u0237\u0238\x03\x02\x02\x02\u0238\u0239\x03\x02\x02\x02" + + "\u0239\u023A\x07\x05\x02\x02\u023A\u0261\x03\x02\x02\x02\u023B\u0244\x07" + + "\r\x02\x02\u023C\u0241\x05.\x18\x02\u023D\u023E\x07\n\x02\x02\u023E\u0240" + + "\x05.\x18\x02\u023F\u023D\x03\x02\x02\x02\u0240\u0243\x03\x02\x02\x02" + + "\u0241\u023F\x03\x02\x02\x02\u0241\u0242\x03\x02\x02\x02\u0242\u0245\x03" + + "\x02\x02\x02\u0243\u0241\x03\x02\x02\x02\u0244\u023C\x03\x02\x02\x02\u0244" + + "\u0245\x03\x02\x02\x02\u0245\u0247\x03\x02\x02\x02\u0246\u0248\x07\n\x02" + + "\x02\u0247\u0246\x03\x02\x02\x02\u0247\u0248\x03\x02\x02\x02\u0248\u0249" + + "\x03\x02\x02\x02\u0249\u0261\x07\x0E\x02\x02\u024A\u024B\x07%\x02\x02" + + "\u024B\u024C\x07?\x02\x02\u024C\u024D\x05.\x18\x02\u024D\u024E\x07@\x02" + + "\x02\u024E\u024F\x05.\x18\x02\u024F\u0250\x07&\x02\x02\u0250\u0251\x05" + + ".\x18\x07\u0251\u0261\x03\x02\x02\x02\u0252\u0253\x05\n\x06\x02\u0253" + + "\u0254\x05.\x18\x06\u0254\u0261\x03\x02\x02\x02\u0255\u0256\x05\x14\v" + + "\x02\u0256\u0257\x05.\x18\x05\u0257\u0261\x03\x02\x02\x02\u0258\u0259" + + "\x07?\x02\x02\u0259\u025A\x05.\x18\x02\u025A\u025B\x07@\x02\x02\u025B" + + "\u0261\x03\x02\x02\x02\u025C\u025D\x07\x04\x02\x02\u025D\u025E\x05.\x18" + + "\x02\u025E\u025F\x07\x05\x02\x02\u025F\u0261\x03\x02\x02\x02\u0260\u01CA" + + "\x03\x02\x02\x02\u0260\u01CC\x03\x02\x02\x02\u0260\u01D3\x03\x02\x02\x02" + + "\u0260\u01D5\x03\x02\x02\x02\u0260\u01DA\x03\x02\x02\x02\u0260\u01E9\x03" + + "\x02\x02\x02\u0260\u01F8\x03\x02\x02\x02\u0260\u01F9\x03\x02\x02\x02\u0260" + + "\u0208\x03\x02\x02\x02\u0260\u021B\x03\x02\x02\x02\u0260\u021D\x03\x02" + + "\x02\x02\u0260\u022D\x03\x02\x02\x02\u0260\u023B\x03\x02\x02\x02\u0260" + + "\u024A\x03\x02\x02\x02\u0260\u0252\x03\x02\x02\x02\u0260\u0255\x03\x02" + + "\x02\x02\u0260\u0258\x03\x02\x02\x02\u0260\u025C\x03\x02\x02\x02\u0261" + + "\u0293\x03\x02\x02\x02\u0262\u0263\f\x1C\x02\x02\u0263\u0264\x07!\x02" + + "\x02\u0264\u0292\x05.\x18\x1C\u0265\u0266\f\x1A\x02\x02\u0266\u0267\t" + + "\x02\x02\x02\u0267\u0292\x05.\x18\x1B\u0268\u0269\f\x19\x02\x02\u0269" + + "\u026A\t\x03\x02\x02\u026A\u0292\x05.\x18\x1A\u026B\u026C\f\x18\x02\x02" + + "\u026C\u026D\t\x04\x02\x02\u026D\u0292\x05.\x18\x19\u026E\u026F\f\x16" + + "\x02\x02\u026F\u0270\x07>\x02\x02\u0270\u0271\x05.\x18\x17\u0271\u0272" + + "\b\x18\x01\x02\u0272\u0292\x03\x02\x02\x02\u0273\u0274\f\x14\x02\x02\u0274" + + "\u0275\x07-\x02\x02\u0275\u0292\x05.\x18\x15\u0276\u0277\f\x12\x02\x02" + + "\u0277\u0278\x07.\x02\x02\u0278\u0292\x05.\x18\x13\u0279\u027A\f\x11\x02" + + "\x02\u027A\u027B\x07/\x02\x02\u027B\u0292\x05.\x18\x12\u027C\u027D\f\x10" + + "\x02\x02\u027D\u027E\x070\x02\x02\u027E\u0292\x05.\x18\x11\u027F\u0280" + + "\f\n\x02\x02\u0280\u0281\x07\x1C\x02\x02\u0281\u0292\x05.\x18\v\u0282" + + "\u0283\f \x02\x02\u0283\u0284\x07\x18\x02\x02\u0284\u028A\x05L\'\x02\u0285" + + "\u0287\x07?\x02\x02\u0286\u0288\x05F$\x02\u0287\u0286\x03\x02\x02\x02" + + "\u0287\u0288\x03\x02\x02\x02\u0288\u0289\x03\x02\x02\x02\u0289\u028B\x07" + + "@\x02\x02\u028A\u0285\x03\x02\x02\x02\u028A\u028B\x03\x02\x02\x02\u028B" + + "\u0292\x03\x02\x02\x02\u028C\u028D\f\x1D\x02\x02\u028D\u028E\x07\r\x02" + + "\x02\u028E\u028F\x05.\x18\x02\u028F\u0290\x07\x0E\x02\x02\u0290\u0292" + + "\x03\x02\x02\x02\u0291\u0262\x03\x02\x02\x02\u0291\u0265\x03\x02\x02\x02" + + "\u0291\u0268\x03\x02\x02\x02\u0291\u026B\x03\x02\x02\x02\u0291\u026E\x03" + + "\x02\x02\x02\u0291\u0273\x03\x02\x02\x02\u0291\u0276\x03\x02\x02\x02\u0291" + + "\u0279\x03\x02\x02\x02\u0291\u027C\x03\x02\x02\x02\u0291\u027F\x03\x02" + + "\x02\x02\u0291\u0282\x03\x02\x02\x02\u0291\u028C\x03\x02\x02\x02\u0292" + + "\u0295\x03\x02\x02\x02\u0293\u0291\x03\x02\x02\x02\u0293\u0294\x03\x02" + + "\x02\x02\u0294/\x03\x02\x02\x02\u0295\u0293\x03\x02\x02\x02\u0296\u0297" + + "\x072\x02\x02\u0297\u0298\x05.\x18\x02\u0298\u029A\x07\x04\x02\x02\u0299" + + "\u029B\x07\x0F\x02\x02\u029A\u0299\x03\x02\x02\x02\u029A\u029B\x03\x02" + + "\x02\x02\u029B\u029C\x03\x02\x02\x02\u029C\u02A1\x052\x1A\x02\u029D\u029E" + + "\x07\x0F\x02\x02\u029E\u02A0\x052\x1A\x02\u029F\u029D\x03\x02\x02\x02" + + "\u02A0\u02A3\x03\x02\x02\x02\u02A1\u029F\x03\x02\x02\x02\u02A1\u02A2\x03" + + "\x02\x02\x02\u02A2\u02A4\x03\x02\x02\x02\u02A3\u02A1\x03\x02\x02\x02\u02A4" + + "\u02A5\x07\x05\x02\x02\u02A51\x03\x02\x02\x02\u02A6\u02A9\x054\x1B\x02" + + "\u02A7\u02A9\x07\'\x02\x02\u02A8\u02A6\x03\x02\x02\x02\u02A8\u02A7\x03" + + "\x02\x02\x02\u02A9\u02AA\x03\x02\x02\x02\u02AA\u02AB\x07\x1D\x02\x02\u02AB" + + "\u02AC\x05.\x18\x02\u02AC3\x03\x02\x02\x02\u02AD\u02B4\x05T+\x02\u02AE" + + "\u02B1\x07?\x02\x02\u02AF\u02B2\x05T+\x02\u02B0\u02B2\x07\'\x02\x02\u02B1" + + "\u02AF\x03\x02\x02\x02\u02B1\u02B0\x03\x02\x02\x02\u02B2\u02B3\x03\x02" + + "\x02\x02\u02B3\u02B5\x07@\x02\x02\u02B4\u02AE\x03\x02\x02\x02\u02B4\u02B5" + + "\x03\x02\x02\x02\u02B55\x03\x02\x02\x02\u02B6\u02B7\x05\b\x05\x02\u02B7" + + "\u02B8\x07\x02\x02\x03\u02B8\u02C0\x03\x02\x02\x02\u02B9\u02BA\x05.\x18" + + "\x02\u02BA\u02BB\x07\x02\x02\x03\u02BB\u02C0\x03\x02\x02\x02\u02BC\u02BD" + + "\x07E\x02\x02\u02BD\u02C0\x07\x02\x02\x03\u02BE\u02C0\x07\x02\x02\x03" + + "\u02BF\u02B6\x03\x02\x02\x02\u02BF\u02B9\x03\x02\x02\x02\u02BF\u02BC\x03" + + "\x02\x02\x02\u02BF\u02BE\x03\x02\x02\x02\u02C07\x03\x02\x02\x02\u02C1" + + "\u02C4\x05:\x1E\x02\u02C2\u02C4\x05<\x1F\x02\u02C3\u02C1\x03\x02\x02\x02" + + "\u02C3\u02C2\x03\x02\x02\x02\u02C49\x03\x02\x02\x02\u02C5\u02C6\x05@!" + + "\x02\u02C6\u02C7\x07\x1D\x02\x02\u02C7\u02C8\x05.\x18\x02\u02C8\u02D7" + + "\x03\x02\x02\x02\u02C9\u02CA\x07?\x02\x02\u02CA\u02CF\x05@!\x02\u02CB" + + "\u02CC\x07\n\x02\x02\u02CC\u02CE\x05@!\x02\u02CD\u02CB\x03\x02\x02\x02" + + "\u02CE\u02D1\x03\x02\x02\x02\u02CF\u02CD\x03\x02\x02\x02\u02CF\u02D0\x03" + + "\x02\x02\x02\u02D0\u02D2\x03\x02\x02\x02\u02D1\u02CF\x03\x02\x02\x02\u02D2" + + "\u02D3\x07@\x02\x02\u02D3\u02D4\x07\x1D\x02\x02\u02D4\u02D5\x05.\x18\x02" + + "\u02D5\u02D7\x03\x02\x02\x02\u02D6\u02C5\x03\x02\x02\x02\u02D6\u02C9\x03" + + "\x02\x02\x02\u02D7;\x03\x02\x02\x02\u02D8\u02D9\x07?\x02\x02\u02D9\u02DA" + + "\x07?\x02\x02\u02DA\u02DD\x05@!\x02\u02DB\u02DC\x07\n\x02\x02\u02DC\u02DE" + + "\x05@!\x02\u02DD\u02DB\x03\x02\x02\x02\u02DE\u02DF\x03\x02\x02\x02\u02DF" + + "\u02DD\x03\x02\x02\x02\u02DF\u02E0\x03\x02\x02\x02\u02E0\u02E1\x03\x02" + + "\x02\x02\u02E1\u02E2\x07@\x02\x02\u02E2\u02E3\x07@\x02\x02\u02E3\u02E4" + + "\x07\x1D\x02\x02\u02E4\u02E5\x05.\x18\x02\u02E5=\x03\x02\x02\x02\u02E6" + + "\u02E9\x07\'\x02\x02\u02E7\u02E9\x05R*\x02\u02E8\u02E6\x03\x02\x02\x02" + + "\u02E8\u02E7\x03\x02\x02\x02\u02E9?\x03\x02\x02\x02\u02EA\u02EB\x05> " + + "\x02\u02EBA\x03\x02\x02\x02\u02EC\u02ED\x05> \x02\u02ED\u02EE\x07\x07" + + "\x02\x02\u02EE\u02EF\x05&\x14\x02\u02EFC\x03\x02\x02\x02\u02F0\u02F3\x07" + + "5\x02\x02\u02F1\u02F3\x05R*\x02\u02F2\u02F0\x03\x02\x02\x02\u02F2\u02F1" + + "\x03\x02\x02\x02\u02F3E\x03\x02\x02\x02\u02F4\u02F9\x05.\x18\x02\u02F5" + + "\u02F6\x07\n\x02\x02\u02F6\u02F8\x05.\x18\x02\u02F7\u02F5\x03\x02\x02" + + "\x02\u02F8\u02FB\x03\x02\x02\x02\u02F9\u02F7\x03\x02\x02\x02\u02F9\u02FA" + + "\x03\x02\x02\x02\u02FAG\x03\x02\x02\x02\u02FB\u02F9\x03\x02\x02\x02\u02FC" + + "\u02FD\x05T+\x02\u02FD\u02FE\x07\x07\x02\x02\u02FE\u02FF\x05.\x18\x02" + + "\u02FF\u0303\x03\x02\x02\x02\u0300\u0301\x07(\x02\x02\u0301\u0303\x05" + + ".\x18\x02\u0302\u02FC\x03\x02\x02\x02\u0302\u0300\x03\x02\x02\x02\u0303" + + "I\x03\x02\x02\x02\u0304\u0307\x05R*\x02\u0305\u0307\t\x05\x02\x02\u0306" + + "\u0304\x03\x02\x02\x02\u0306\u0305\x03\x02\x02\x02\u0307K\x03\x02\x02" + + "\x02\u0308\u030B\x05R*\x02\u0309\u030B\t\x06\x02\x02\u030A\u0308\x03\x02" + + "\x02\x02\u030A\u0309\x03\x02\x02\x02\u030BM\x03\x02\x02\x02\u030C\u030D" + + "\t\x07\x02\x02\u030DO\x03\x02\x02\x02\u030E\u030F\t\b\x02\x02\u030FQ\x03" + + "\x02\x02\x02\u0310\u0315\x05V,\x02\u0311\u0312\x07)\x02\x02\u0312\u0314" + + "\x05V,\x02\u0313\u0311\x03\x02\x02\x02\u0314\u0317\x03\x02\x02\x02\u0315" + + "\u0313\x03\x02\x02\x02\u0315\u0316\x03\x02\x02\x02\u0316S\x03\x02\x02" + + "\x02\u0317\u0315\x03\x02\x02\x02\u0318\u031D\x05V,\x02\u0319\u031A\x05" + + "R*\x02\u031A\u031B\b+\x01\x02\u031B\u031D\x03\x02\x02\x02\u031C\u0318" + + "\x03\x02\x02\x02\u031C\u0319\x03\x02\x02\x02\u031DU\x03\x02\x02\x02\u031E" + + "\u031F\t\t\x02\x02\u031FW\x03\x02\x02\x02Z[bks\x8C\x96\x9E\xA1\xAB\xAE" + + "\xB1\xB5\xB9\xBC\xBE\xCC\xD5\xD9\xDC\xE3\xEB\xF1\xF6\u0101\u0109\u010F" + + "\u0113\u0115\u0120\u0122\u0131\u0139\u0148\u0150\u0152\u0163\u0166\u0169" + + "\u0180\u0184\u018A\u019D\u01A2\u01AA\u01AC\u01BC\u01C2\u01C6\u01CF\u01E1" + + "\u01E5\u01F0\u01F4\u0200\u0204\u020F\u0213\u021B\u0225\u0229\u0233\u0237" + + "\u0241\u0244\u0247\u0260\u0287\u028A\u0291\u0293\u029A\u02A1\u02A8\u02B1" + + "\u02B4\u02BF\u02C3\u02CF\u02D6\u02DF\u02E8\u02F2\u02F9\u0302\u0306\u030A" + + "\u0315\u031C"; public static readonly _serializedATN: string = Utils.join( [ QuintParser._serializedATNSegment0, @@ -4707,18 +4707,18 @@ export class TypeSumDefContext extends TypeDefContext { export class TypeDefHeadContext extends ParserRuleContext { public _typeName!: QualIdContext; - public _typeVar!: TypeVarContext; - public _typeVars: TypeVarContext[] = []; + public _LOW_ID!: Token; + public _typeVars: Token[] = []; public qualId(): QualIdContext { return this.getRuleContext(0, QualIdContext); } - public typeVar(): TypeVarContext[]; - public typeVar(i: number): TypeVarContext; - public typeVar(i?: number): TypeVarContext | TypeVarContext[] { + public LOW_ID(): TerminalNode[]; + public LOW_ID(i: number): TerminalNode; + public LOW_ID(i?: number): TerminalNode | TerminalNode[] { if (i === undefined) { - return this.getRuleContexts(TypeVarContext); + return this.getTokens(QuintParser.LOW_ID); } else { - return this.getRuleContext(i, TypeVarContext); + return this.getToken(QuintParser.LOW_ID, i); } } constructor(parent: ParserRuleContext | undefined, invokingState: number) { diff --git a/quint/src/ir/quintIr.ts b/quint/src/ir/quintIr.ts index 0b0bb2bd3..d4c42e656 100644 --- a/quint/src/ir/quintIr.ts +++ b/quint/src/ir/quintIr.ts @@ -289,16 +289,20 @@ export interface QuintAssume extends WithId { assumption: QuintEx } -/** QuintTypeDefs represent both type aliases and abstract types +/** QuintTypeDefs represent declared type constructors and abstract types * * - Abstract types do not have an associated `type` - * - Type aliases always have an associated `type` + * - Type constructors aliases have an associated `type` and `n >= 0` type parameters */ export interface QuintTypeDef extends WithId { /** definition kind ('typedef') */ kind: 'typedef' /** name of a type alias */ name: string + /** type variables + * + * `typeof params === 'undefined'` is taken to mean the same as `params.length === 0` */ + params?: string[] /** type to associate with the alias (none for uninterpreted type) */ type?: QuintType } diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index 0b6b296de..46d60312c 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -24,10 +24,10 @@ import { QuintConstType, QuintSumType, QuintType, - QuintVarType, Row, RowField, isUnitType, + typeNames, unitType, } from '../ir/quintTypes' import { SourceMap } from './quintParserFrontend' @@ -37,7 +37,7 @@ import { TerminalNode } from 'antlr4ts/tree/TerminalNode' import { QuintTypeDef } from '../ir/quintIr' import { zip } from '../util' import { QuintError } from '../quintError' -import { lowercaseTypeError, tooManySpreadsError } from './parseErrors' +import { lowercaseTypeError, tooManySpreadsError, undeclaredTypeParamsError } from './parseErrors' import { Loc } from '../ErrorMessage' import assert, { fail } from 'assert' @@ -370,11 +370,14 @@ export class ToIrListener implements QuintListener { this.errors.push(lowercaseTypeError(id, name)) } - // TODO: Check that variables have all been declared - // TODO: Add types to declaration - const _typeVariables: QuintVarType[] = this.popTypeDefHeadTypeVars(defHead) + let defWithoutParams: QuintTypeDef = { id: id, kind: 'typedef', name, type } + const def: QuintTypeDef = + defHead._typeVars.length > 0 + ? { ...defWithoutParams, params: defHead._typeVars.map(t => t.text!) } + : defWithoutParams + + this.checkForUndeclaredTypeVariables(id, def) - const def: QuintTypeDef = { id, kind: 'typedef', name, type } this.declarationStack.push(def) } @@ -392,15 +395,14 @@ export class ToIrListener implements QuintListener { const fields: RowField[] = popMany(this.variantStack, this.variantStack.length, this.undefinedVariant(ctx)) const row: ConcreteFixedRow = { kind: 'row', fields, other: { kind: 'empty' } } const type: QuintSumType = { id, kind: 'sum', fields: row } - // TODO: Check all vars in body are bound - const _typeVars = this.popTypeDefHeadTypeVars(defHead) - const def: QuintTypeDef = { - id: id, - name, - kind: 'typedef', - type, - } + let defWithoutParams: QuintTypeDef = { id: id, kind: 'typedef', name, type } + const def: QuintTypeDef = + defHead._typeVars.length > 0 + ? { ...defWithoutParams, params: defHead._typeVars.map(t => t.text!) } + : defWithoutParams + + this.checkForUndeclaredTypeVariables(id, def) // Used for annotations in the variant constructors const constructorReturnType: QuintConstType = { id, kind: 'const', name } @@ -490,26 +492,6 @@ export class ToIrListener implements QuintListener { this.declarationStack.push(def, ...constructors) } - // Pop all the type variables in the head of a type def from the type stack - // E.g., for a type def like - // - // type Foo[a,b,c] = ... - // - // Return the type variables [a, b, c] - private popTypeDefHeadTypeVars(ctx: p.TypeDefHeadContext): QuintVarType[] { - return ( - ctx._typeVars - .map( - _ => - this.popType().unwrap(() => - fail('internal error: type parameter parsed with no type variable') - ) as QuintVarType - ) - // The stack stores the variables in reverse order - .reverse() - ) - } - exitTypeSumVariant(ctx: p.TypeSumVariantContext) { const fieldName = ctx._sumLabel!.text! const poppedType = this.popType().value @@ -521,6 +503,22 @@ export class ToIrListener implements QuintListener { this.variantStack.push({ fieldName, fieldType }) } + private checkForUndeclaredTypeVariables(id: bigint, typeDef: QuintTypeDef) { + if (!typeDef.type) { + return + } + + const typeVars = typeNames(typeDef.type) + const undeclaredTypeVariables: string[] = + // We are just checking if the type variables appearing in `type` are a subset of the type params + // but our version of node has no sensible set operations? + [...typeVars.typeVariables, ...typeVars.rowVariables].filter(v => !(typeDef.params ?? []).includes(v)) + + if (undeclaredTypeVariables.length > 0) { + this.errors.push(undeclaredTypeParamsError(id, undeclaredTypeVariables)) + } + } + // module Foo = Proto(x = a, y = b) // module Foo = Proto(x = a, y = b) from "" exitInstanceMod(ctx: p.InstanceModContext) { @@ -1082,7 +1080,8 @@ export class ToIrListener implements QuintListener { // The next type on the stack after the args should be the applied // type constructor const ctor: QuintConstType = { id: this.getId(ctx), kind: 'const', name: ctx._typeCtor.text } - this.typeStack.push({ id, kind: 'app', ctor, args }) + const typeApp: QuintAppType = { id, kind: 'app', ctor, args } + this.typeStack.push(typeApp) } // TODO: replace with general type application diff --git a/quint/src/parsing/parseErrors.ts b/quint/src/parsing/parseErrors.ts index 40a771e00..0572470c4 100644 --- a/quint/src/parsing/parseErrors.ts +++ b/quint/src/parsing/parseErrors.ts @@ -25,3 +25,19 @@ export function tooManySpreadsError(id: bigint): QuintError { data: {}, } } + +export function undeclaredTypeParamsError(id: bigint, unboundTypeVariables: string[]): QuintError { + return { + code: 'QNT014', + message: `the type variables ${unboundTypeVariables.join(', ')} are unbound. +E.g., in + + type T = List[a] + +type variable 'a' is unbound. To fix it, write + + type T[a] = List[a]`, + reference: id, + data: {}, + } +} diff --git a/quint/src/quintError.ts b/quint/src/quintError.ts index b67b9a1e2..57c18af1b 100644 --- a/quint/src/quintError.ts +++ b/quint/src/quintError.ts @@ -51,6 +51,8 @@ export type ErrorCode = | 'QNT012' /* QNT013: import ... from : could not load */ | 'QNT013' + /* QNT014: Type variables in a type declaration are not declared as parameters */ + | 'QNT014' /* QNT098: Cyclic imports */ | 'QNT098' /* QNT099: Found cyclic definitions */ diff --git a/quint/test/names/resolver.test.ts b/quint/test/names/resolver.test.ts index a8af5a48f..bf75af9b3 100644 --- a/quint/test/names/resolver.test.ts +++ b/quint/test/names/resolver.test.ts @@ -93,7 +93,7 @@ describe('resolveNames', () => { const result = resolveNamesForDefs([ 'const a: UNKNOWN_TYPE_0', 'var b: UNKNOWN_TYPE_1', - 'type C = Set[t]', + 'type C[t] = Set[t]', 'assume d = 1', ]) diff --git a/quint/test/parsing/quintParserFrontend.test.ts b/quint/test/parsing/quintParserFrontend.test.ts index dbead2601..1f2281e07 100644 --- a/quint/test/parsing/quintParserFrontend.test.ts +++ b/quint/test/parsing/quintParserFrontend.test.ts @@ -218,6 +218,24 @@ describe('syntax errors', () => { assert.equal(errors[0].message, `mismatched input ''' expecting STRING`) assert.equal(errors[0].code, 'QNT000') }) + + it('error on type declarations with undeclared variables', () => { + // we should use double quotes + const code = `module singleQuotes { type T = (List[a], Set[b]) }` + const [error] = parseErrorsFrom(defaultSourceName, code) + assert.deepEqual(error.code, 'QNT014') + assert.deepEqual( + error.message, + `the type variables a, b are unbound. +E.g., in + + type T = List[a] + +type variable 'a' is unbound. To fix it, write + + type T[a] = List[a]` + ) + }) }) // Test the JSON error output. Most of the tests here should migrate to the diff --git a/quint/testFixture/SuperSpec.json b/quint/testFixture/SuperSpec.json index 49d90a0d9..49df38868 100644 --- a/quint/testFixture/SuperSpec.json +++ b/quint/testFixture/SuperSpec.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":523,"name":"withConsts","declarations":[{"id":100,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":99,"kind":"app","opcode":"isub","args":[{"id":97,"kind":"int","value":1},{"id":98,"kind":"int","value":2}]}},{"id":104,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":103,"kind":"app","opcode":"imul","args":[{"id":101,"kind":"int","value":2},{"id":102,"kind":"int","value":3}]}},{"id":108,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":107,"kind":"app","opcode":"idiv","args":[{"id":105,"kind":"int","value":2},{"id":106,"kind":"int","value":3}]}},{"id":112,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":111,"kind":"app","opcode":"imod","args":[{"id":109,"kind":"int","value":2},{"id":110,"kind":"int","value":3}]}},{"id":116,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":115,"kind":"app","opcode":"ipow","args":[{"id":113,"kind":"int","value":2},{"id":114,"kind":"int","value":3}]}},{"id":119,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":118,"kind":"app","opcode":"iuminus","args":[{"id":117,"kind":"int","value":100}]}},{"id":123,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":122,"kind":"app","opcode":"igt","args":[{"id":120,"kind":"int","value":2},{"id":121,"kind":"int","value":3}]}},{"id":127,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":126,"kind":"app","opcode":"igte","args":[{"id":124,"kind":"int","value":2},{"id":125,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},{"id":131,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":130,"kind":"app","opcode":"ilt","args":[{"id":128,"kind":"int","value":2},{"id":129,"kind":"int","value":3}]}},{"id":135,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":134,"kind":"app","opcode":"ilte","args":[{"id":132,"kind":"int","value":2},{"id":133,"kind":"int","value":3}]}},{"id":139,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":138,"kind":"app","opcode":"eq","args":[{"id":136,"kind":"int","value":2},{"id":137,"kind":"int","value":3}]}},{"id":143,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":142,"kind":"app","opcode":"neq","args":[{"id":140,"kind":"int","value":2},{"id":141,"kind":"int","value":3}]}},{"id":149,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":148,"kind":"app","opcode":"eq","args":[{"id":146,"kind":"app","opcode":"iadd","args":[{"id":144,"kind":"int","value":2},{"id":145,"kind":"int","value":2}]},{"id":147,"kind":"int","value":4}]}},{"id":153,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":152,"kind":"app","opcode":"in","args":[{"id":150,"kind":"int","value":1},{"id":151,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},{"id":165,"kind":"def","name":"withType","qualifier":"val","expr":{"id":164,"kind":"app","opcode":"Set","args":[{"id":162,"kind":"int","value":1},{"id":163,"kind":"int","value":2}]},"typeAnnotation":{"id":161,"kind":"set","elem":{"id":160,"kind":"int"}}},{"id":166,"kind":"typedef","name":"PROC"},{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},{"id":174,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":173,"kind":"int","value":42}},{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},{"kind":"var","name":"k","typeAnnotation":{"id":217,"kind":"int"},"id":218},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22},{"id":239,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":238,"kind":"app","opcode":"and","args":[{"id":236,"kind":"bool","value":false},{"id":237,"kind":"bool","value":true}]}},{"id":243,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":242,"kind":"app","opcode":"or","args":[{"id":240,"kind":"bool","value":false},{"id":241,"kind":"bool","value":true}]}},{"id":247,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":246,"kind":"app","opcode":"implies","args":[{"id":244,"kind":"bool","value":false},{"id":245,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26},{"id":280,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":279,"kind":"app","opcode":"and","args":[{"id":276,"kind":"bool","value":false},{"id":277,"kind":"bool","value":true},{"id":278,"kind":"bool","value":false}]}},{"id":285,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":284,"kind":"app","opcode":"actionAll","args":[{"id":281,"kind":"bool","value":false},{"id":282,"kind":"bool","value":true},{"id":283,"kind":"bool","value":false}]}},{"id":290,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":289,"kind":"app","opcode":"or","args":[{"id":286,"kind":"bool","value":false},{"id":287,"kind":"bool","value":true},{"id":288,"kind":"bool","value":false}]}},{"id":295,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":294,"kind":"app","opcode":"actionAny","args":[{"id":291,"kind":"bool","value":false},{"id":292,"kind":"bool","value":true},{"id":293,"kind":"bool","value":false}]}},{"id":300,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":299,"kind":"app","opcode":"ite","args":[{"id":296,"kind":"bool","value":true},{"id":297,"kind":"int","value":1},{"id":298,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":317,"kind":"fun","arg":{"id":315,"kind":"str"},"res":{"id":316,"kind":"int"}},"id":318},{"kind":"const","name":"MyFunFun","typeAnnotation":{"id":31,"kind":"fun","arg":{"id":29,"kind":"fun","arg":{"id":27,"kind":"int"},"res":{"id":28,"kind":"str"}},"res":{"id":30,"kind":"bool"}},"id":32},{"id":327,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":326,"kind":"lambda","params":[{"id":323,"name":"a"},{"id":324,"name":"b"}],"qualifier":"def","expr":{"id":325,"kind":"int","value":1}}},{"id":339,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":338,"kind":"app","opcode":"in","args":[{"id":336,"kind":"int","value":1},{"id":337,"kind":"app","opcode":"Set","args":[]}]}},{"kind":"const","name":"MyOperator","typeAnnotation":{"id":36,"kind":"oper","args":[{"id":33,"kind":"int"},{"id":34,"kind":"str"}],"res":{"id":35,"kind":"bool"}},"id":37},{"id":404,"kind":"def","name":"one","qualifier":"val","expr":{"id":403,"kind":"app","opcode":"head","args":[{"id":402,"kind":"app","opcode":"List","args":[{"id":400,"kind":"int","value":1},{"id":401,"kind":"int","value":2}]}]}},{"id":409,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":408,"kind":"app","opcode":"Tup","args":[{"id":405,"kind":"int","value":1},{"id":406,"kind":"int","value":2},{"id":407,"kind":"int","value":3}]}},{"id":414,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":413,"kind":"app","opcode":"Tup","args":[{"id":410,"kind":"int","value":1},{"id":411,"kind":"int","value":2},{"id":412,"kind":"int","value":3}]}},{"id":418,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":417,"kind":"app","opcode":"Tup","args":[{"id":415,"kind":"int","value":4},{"id":416,"kind":"int","value":5}]}},{"kind":"const","name":"MyOperatorWithComma","typeAnnotation":{"id":41,"kind":"oper","args":[{"id":38,"kind":"int"},{"id":39,"kind":"str"}],"res":{"id":40,"kind":"bool"}},"id":42},{"id":423,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":422,"kind":"app","opcode":"List","args":[{"id":419,"kind":"int","value":1},{"id":420,"kind":"int","value":2},{"id":421,"kind":"int","value":3}]}},{"id":428,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":427,"kind":"app","opcode":"List","args":[{"id":424,"kind":"int","value":1},{"id":425,"kind":"int","value":2},{"id":426,"kind":"int","value":3}]}},{"id":435,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":434,"kind":"app","opcode":"nth","args":[{"id":432,"kind":"app","opcode":"List","args":[{"id":429,"kind":"int","value":2},{"id":430,"kind":"int","value":3},{"id":431,"kind":"int","value":4}]},{"id":433,"kind":"int","value":2}]}},{"id":441,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":440,"kind":"app","opcode":"Rec","args":[{"id":437,"kind":"str","value":"name"},{"id":436,"kind":"str","value":"igor"},{"id":439,"kind":"str","value":"year"},{"id":438,"kind":"int","value":1981}]}},{"id":447,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":446,"kind":"app","opcode":"Rec","args":[{"id":442,"kind":"str","value":"name"},{"id":443,"kind":"str","value":"igor"},{"id":444,"kind":"str","value":"year"},{"id":445,"kind":"int","value":1981}]}},{"id":460,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":459,"kind":"app","opcode":"Set","args":[{"id":456,"kind":"int","value":1},{"id":457,"kind":"int","value":2},{"id":458,"kind":"int","value":3}]}},{"kind":"const","name":"MyTuple","typeAnnotation":{"id":46,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":43,"kind":"int"}},{"fieldName":"1","fieldType":{"id":44,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":45,"kind":"str"}}],"other":{"kind":"empty"}}},"id":47},{"id":490,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":489,"kind":"app","opcode":"in","args":[{"id":487,"kind":"int","value":2},{"id":488,"kind":"app","opcode":"Set","args":[]}]}},{"id":494,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":493,"kind":"app","opcode":"subseteq","args":[{"id":491,"kind":"app","opcode":"Set","args":[]},{"id":492,"kind":"app","opcode":"Set","args":[]}]}},{"id":503,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":502,"kind":"app","opcode":"in","args":[{"id":496,"kind":"app","opcode":"Set","args":[{"id":495,"kind":"int","value":1}]},{"id":501,"kind":"app","opcode":"powerset","args":[{"id":500,"kind":"app","opcode":"Set","args":[{"id":497,"kind":"int","value":1},{"id":498,"kind":"int","value":2},{"id":499,"kind":"int","value":3}]}]}]}},{"id":516,"kind":"typedef","name":"INT_SET","type":{"id":515,"kind":"set","elem":{"id":514,"kind":"int"}}},{"id":517,"kind":"typedef","name":"UNINTERPRETED_TYPE"},{"kind":"const","name":"MyTupleWithComma","typeAnnotation":{"id":51,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":48,"kind":"int"}},{"fieldName":"1","fieldType":{"id":49,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":50,"kind":"str"}}],"other":{"kind":"empty"}}},"id":52},{"kind":"const","name":"MyRecord","typeAnnotation":{"id":56,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":53,"kind":"int"}},{"fieldName":"b","fieldType":{"id":54,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":55,"kind":"str"}}],"other":{"kind":"empty"}}},"id":57},{"kind":"const","name":"MyRecordWithComma","typeAnnotation":{"id":61,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":58,"kind":"int"}},{"fieldName":"b","fieldType":{"id":59,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":60,"kind":"str"}}],"other":{"kind":"empty"}}},"id":62},{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},{"kind":"var","name":"i","typeAnnotation":{"id":89,"kind":"int"},"id":90},{"kind":"var","name":"j","typeAnnotation":{"id":91,"kind":"bool"},"id":92},{"id":96,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":95,"kind":"app","opcode":"iadd","args":[{"id":93,"kind":"int","value":1},{"id":94,"kind":"int","value":2}]}},{"id":159,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":158,"kind":"app","opcode":"exists","args":[{"id":154,"kind":"name","name":"Bool"},{"id":157,"kind":"lambda","params":[{"id":155,"name":"x"}],"qualifier":"def","expr":{"id":156,"kind":"name","name":"x"}}]}},{"id":170,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":169,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":168,"kind":"set","elem":{"id":167,"kind":"const","name":"PROC"}}},{"id":181,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":180,"kind":"lambda","params":[{"id":175,"name":"x"},{"id":176,"name":"y"}],"qualifier":"puredef","expr":{"id":179,"kind":"app","opcode":"iadd","args":[{"id":177,"kind":"name","name":"x"},{"id":178,"kind":"name","name":"y"}]}}},{"id":187,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":186,"kind":"lambda","params":[{"id":182,"name":"factor"}],"qualifier":"def","expr":{"id":185,"kind":"app","opcode":"imul","args":[{"id":183,"kind":"name","name":"factor"},{"id":184,"kind":"name","name":"n"}]}}},{"id":193,"kind":"def","name":"A","qualifier":"action","expr":{"id":192,"kind":"lambda","params":[{"id":188,"name":"x"}],"qualifier":"action","expr":{"id":191,"kind":"app","opcode":"assign","args":[{"id":190,"kind":"name","name":"n"},{"id":189,"kind":"name","name":"x"}]}}},{"id":198,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":197,"kind":"lambda","params":[{"id":194,"name":"x"}],"qualifier":"puredef","expr":{"id":196,"kind":"app","opcode":"not","args":[{"id":195,"kind":"name","name":"x"}]}}},{"id":209,"kind":"def","name":"H","qualifier":"def","expr":{"id":208,"kind":"lambda","params":[{"id":199,"name":"x"},{"id":200,"name":"y"}],"qualifier":"def","expr":{"id":207,"kind":"app","opcode":"iadd","args":[{"id":205,"kind":"name","name":"x"},{"id":206,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":204,"kind":"oper","args":[{"id":201,"kind":"int"},{"id":202,"kind":"int"}],"res":{"id":203,"kind":"int"}}},{"id":216,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":215,"kind":"lambda","params":[{"id":210,"name":"x"}],"qualifier":"def","expr":{"id":214,"kind":"name","name":"x"}},"typeAnnotation":{"id":213,"kind":"oper","args":[{"id":211,"kind":"var","name":"a"}],"res":{"id":212,"kind":"var","name":"a"}}},{"id":222,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":221,"kind":"app","opcode":"assign","args":[{"id":220,"kind":"name","name":"k"},{"id":219,"kind":"int","value":3}]}},{"id":235,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":234,"kind":"lambda","params":[{"id":224,"name":"x","typeAnnotation":{"id":223,"kind":"int"}},{"id":226,"name":"y","typeAnnotation":{"id":225,"kind":"int"}}],"qualifier":"puredef","expr":{"id":233,"kind":"app","opcode":"ite","args":[{"id":230,"kind":"app","opcode":"ilt","args":[{"id":228,"kind":"name","name":"x"},{"id":229,"kind":"name","name":"y"}]},{"id":231,"kind":"name","name":"x"},{"id":232,"kind":"name","name":"y"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":223,"kind":"int"},{"id":225,"kind":"int"}],"res":{"id":227,"kind":"int"}}},{"id":251,"kind":"def","name":"F","qualifier":"def","expr":{"id":250,"kind":"lambda","params":[{"id":248,"name":"x"}],"qualifier":"def","expr":{"id":249,"kind":"name","name":"x"}}},{"id":314,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":313,"kind":"lambda","params":[{"id":301,"name":"x"},{"id":302,"name":"y"}],"qualifier":"def","expr":{"id":312,"kind":"app","opcode":"ite","args":[{"id":305,"kind":"app","opcode":"ilt","args":[{"id":303,"kind":"name","name":"x"},{"id":304,"kind":"int","value":10}]},{"id":308,"kind":"app","opcode":"iadd","args":[{"id":306,"kind":"name","name":"y"},{"id":307,"kind":"int","value":5}]},{"id":311,"kind":"app","opcode":"imod","args":[{"id":309,"kind":"name","name":"y"},{"id":310,"kind":"int","value":5}]}]}}},{"id":322,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":321,"kind":"app","opcode":"get","args":[{"id":319,"kind":"name","name":"f1"},{"id":320,"kind":"str","value":"a"}]}},{"id":331,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":330,"kind":"app","opcode":"MyOper","args":[{"id":328,"kind":"str","value":"a"},{"id":329,"kind":"int","value":42}]}},{"id":335,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":334,"kind":"app","opcode":"MyOper","args":[{"id":332,"kind":"str","value":"a"},{"id":333,"kind":"int","value":42}]}},{"id":347,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":346,"kind":"app","opcode":"filter","args":[{"id":340,"kind":"name","name":"S"},{"id":345,"kind":"lambda","params":[{"id":341,"name":"x"}],"qualifier":"def","expr":{"id":344,"kind":"app","opcode":"igt","args":[{"id":342,"kind":"name","name":"x"},{"id":343,"kind":"int","value":10}]}}]}},{"id":385,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":384,"kind":"app","opcode":"filter","args":[{"id":380,"kind":"name","name":"S"},{"id":383,"kind":"lambda","params":[{"id":381,"name":"_"}],"qualifier":"def","expr":{"id":382,"kind":"bool","value":true}}]}},{"id":393,"kind":"def","name":"f","qualifier":"val","expr":{"id":392,"kind":"app","opcode":"mapBy","args":[{"id":386,"kind":"name","name":"S"},{"id":391,"kind":"lambda","params":[{"id":387,"name":"x"}],"qualifier":"def","expr":{"id":390,"kind":"app","opcode":"iadd","args":[{"id":388,"kind":"name","name":"x"},{"id":389,"kind":"int","value":1}]}}]}},{"id":399,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":398,"kind":"app","opcode":"exclude","args":[{"id":394,"kind":"name","name":"S"},{"id":397,"kind":"app","opcode":"Set","args":[{"id":395,"kind":"int","value":3},{"id":396,"kind":"int","value":4}]}]}},{"id":455,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"app","opcode":"with","args":[{"id":452,"kind":"name","name":"test_record"},{"id":449,"kind":"str","value":"name"},{"id":448,"kind":"str","value":"quint"}]},{"id":451,"kind":"str","value":"year"},{"id":450,"kind":"int","value":2023}]}},{"id":471,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":470,"kind":"let","opdef":{"id":466,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":465,"kind":"app","opcode":"Rec","args":[{"id":462,"kind":"str","value":"a"},{"id":461,"kind":"int","value":1},{"id":464,"kind":"str","value":"b"},{"id":463,"kind":"str","value":"foo"}]}},"expr":{"id":469,"kind":"app","opcode":"field","args":[{"id":467,"kind":"name","name":"my_rec"},{"id":468,"kind":"str","value":"a"}]}}},{"id":480,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":479,"kind":"let","opdef":{"id":475,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":474,"kind":"app","opcode":"Tup","args":[{"id":472,"kind":"str","value":"a"},{"id":473,"kind":"int","value":3}]}},"expr":{"id":478,"kind":"app","opcode":"item","args":[{"id":476,"kind":"name","name":"my_tup"},{"id":477,"kind":"int","value":2}]}}},{"id":486,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":485,"kind":"lambda","params":[{"id":481,"name":"s"}],"qualifier":"def","expr":{"id":484,"kind":"app","opcode":"eq","args":[{"id":482,"kind":"name","name":"s"},{"id":483,"kind":"app","opcode":"List","args":[]}]}}},{"id":507,"kind":"assume","name":"positive","assumption":{"id":506,"kind":"app","opcode":"igt","args":[{"id":504,"kind":"name","name":"N"},{"id":505,"kind":"int","value":0}]}},{"id":511,"kind":"assume","name":"_","assumption":{"id":510,"kind":"app","opcode":"neq","args":[{"id":508,"kind":"name","name":"N"},{"id":509,"kind":"int","value":0}]}},{"id":512,"kind":"import","defName":"foo","protoName":"M1"},{"id":513,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":518,"kind":"const","name":"INT_SET"},"id":519},{"id":522,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":521,"name":"N"},{"id":520,"kind":"name","name":"N"}]],"identityOverride":false},{"id":74,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":73,"kind":"lambda","params":[{"id":70,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":72,"kind":"app","opcode":"variant","args":[{"id":69,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":71}]}}},{"id":80,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":79,"kind":"lambda","params":[{"id":76,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":78,"kind":"app","opcode":"variant","args":[{"id":75,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":77}]}}},{"id":86,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":85,"kind":"lambda","params":[{"id":82,"name":"__DogParam"}],"qualifier":"def","expr":{"id":84,"kind":"app","opcode":"variant","args":[{"id":81,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":83}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":87,"kind":"const","name":"MyUnionType"},"id":88},{"id":259,"kind":"def","name":"G","qualifier":"def","expr":{"id":258,"kind":"lambda","params":[{"id":252,"name":"x"}],"qualifier":"def","expr":{"id":257,"kind":"app","opcode":"and","args":[{"id":254,"kind":"app","opcode":"F","args":[{"id":253,"kind":"name","name":"x"}]},{"id":256,"kind":"app","opcode":"not","args":[{"id":255,"kind":"name","name":"x"}]}]}}},{"id":267,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":266,"kind":"lambda","params":[{"id":260,"name":"x"}],"qualifier":"def","expr":{"id":265,"kind":"app","opcode":"and","args":[{"id":262,"kind":"app","opcode":"F","args":[{"id":261,"kind":"name","name":"x"}]},{"id":264,"kind":"app","opcode":"not","args":[{"id":263,"kind":"name","name":"x"}]}]}}},{"id":275,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":274,"kind":"lambda","params":[{"id":268,"name":"x"}],"qualifier":"def","expr":{"id":273,"kind":"app","opcode":"or","args":[{"id":270,"kind":"app","opcode":"F","args":[{"id":269,"kind":"name","name":"x"}]},{"id":272,"kind":"app","opcode":"not","args":[{"id":271,"kind":"name","name":"x"}]}]}}},{"id":367,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":366,"kind":"app","opcode":"map","args":[{"id":350,"kind":"app","opcode":"tuples","args":[{"id":348,"kind":"name","name":"S"},{"id":349,"kind":"name","name":"MySet"}]},{"id":365,"kind":"lambda","params":[{"id":356,"name":"quintTupledLambdaParam356"}],"qualifier":"def","expr":{"id":361,"kind":"let","opdef":{"id":352,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":362,"kind":"app","opcode":"item","args":[{"id":363,"kind":"name","name":"quintTupledLambdaParam356"},{"id":364,"kind":"int","value":2}]}},"expr":{"id":357,"kind":"let","opdef":{"id":351,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":358,"kind":"app","opcode":"item","args":[{"id":359,"kind":"name","name":"quintTupledLambdaParam356"},{"id":360,"kind":"int","value":1}]}},"expr":{"id":355,"kind":"app","opcode":"iadd","args":[{"id":353,"kind":"name","name":"s"},{"id":354,"kind":"name","name":"mys"}]}}}}]}},{"id":379,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":378,"kind":"let","opdef":{"id":370,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":369,"kind":"app","opcode":"oneOf","args":[{"id":368,"kind":"name","name":"S"}]}},"expr":{"id":377,"kind":"app","opcode":"actionAll","args":[{"id":373,"kind":"app","opcode":"igt","args":[{"id":371,"kind":"name","name":"x"},{"id":372,"kind":"int","value":10}]},{"id":376,"kind":"app","opcode":"assign","args":[{"id":375,"kind":"name","name":"k"},{"id":374,"kind":"name","name":"x"}]}]}}}]}],"table":{"68":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"71":{"id":70,"name":"__CircleParam","kind":"param"},"77":{"id":76,"name":"__RectangleParam","kind":"param"},"83":{"id":82,"name":"__DogParam","kind":"param"},"87":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"156":{"id":155,"name":"x","kind":"param"},"167":{"id":166,"kind":"typedef","name":"PROC"},"177":{"id":175,"name":"x","kind":"param"},"178":{"id":176,"name":"y","kind":"param"},"183":{"id":182,"name":"factor","kind":"param"},"184":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"189":{"id":188,"name":"x","kind":"param"},"190":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"195":{"id":194,"name":"x","kind":"param"},"205":{"id":199,"name":"x","kind":"param"},"206":{"id":200,"name":"y","kind":"param"},"214":{"id":210,"name":"x","kind":"param"},"220":{"kind":"var","name":"k","typeAnnotation":{"id":217,"kind":"int"},"id":218},"228":{"id":224,"name":"x","typeAnnotation":{"id":223,"kind":"int"},"kind":"param"},"229":{"id":226,"name":"y","typeAnnotation":{"id":225,"kind":"int"},"kind":"param"},"231":{"id":224,"name":"x","typeAnnotation":{"id":223,"kind":"int"},"kind":"param"},"232":{"id":226,"name":"y","typeAnnotation":{"id":225,"kind":"int"},"kind":"param"},"249":{"id":248,"name":"x","kind":"param"},"253":{"id":252,"name":"x","kind":"param"},"254":{"id":251,"kind":"def","name":"F","qualifier":"def","expr":{"id":250,"kind":"lambda","params":[{"id":248,"name":"x"}],"qualifier":"def","expr":{"id":249,"kind":"name","name":"x"}},"depth":0},"255":{"id":252,"name":"x","kind":"param"},"261":{"id":260,"name":"x","kind":"param"},"262":{"id":251,"kind":"def","name":"F","qualifier":"def","expr":{"id":250,"kind":"lambda","params":[{"id":248,"name":"x"}],"qualifier":"def","expr":{"id":249,"kind":"name","name":"x"}},"depth":0},"263":{"id":260,"name":"x","kind":"param"},"269":{"id":268,"name":"x","kind":"param"},"270":{"id":251,"kind":"def","name":"F","qualifier":"def","expr":{"id":250,"kind":"lambda","params":[{"id":248,"name":"x"}],"qualifier":"def","expr":{"id":249,"kind":"name","name":"x"}},"depth":0},"271":{"id":268,"name":"x","kind":"param"},"303":{"id":301,"name":"x","kind":"param"},"306":{"id":302,"name":"y","kind":"param"},"309":{"id":302,"name":"y","kind":"param"},"319":{"kind":"var","name":"f1","typeAnnotation":{"id":317,"kind":"fun","arg":{"id":315,"kind":"str"},"res":{"id":316,"kind":"int"}},"id":318},"330":{"id":327,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":326,"kind":"lambda","params":[{"id":323,"name":"a"},{"id":324,"name":"b"}],"qualifier":"def","expr":{"id":325,"kind":"int","value":1}},"depth":0},"334":{"id":327,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":326,"kind":"lambda","params":[{"id":323,"name":"a"},{"id":324,"name":"b"}],"qualifier":"def","expr":{"id":325,"kind":"int","value":1}},"depth":0},"340":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"342":{"id":341,"name":"x","kind":"param"},"348":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"349":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},"353":{"id":351,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":358,"kind":"app","opcode":"item","args":[{"id":359,"kind":"name","name":"quintTupledLambdaParam356"},{"id":360,"kind":"int","value":1}]},"depth":1},"354":{"id":352,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":362,"kind":"app","opcode":"item","args":[{"id":363,"kind":"name","name":"quintTupledLambdaParam356"},{"id":364,"kind":"int","value":2}]},"depth":1},"359":{"id":356,"name":"quintTupledLambdaParam356","kind":"param"},"363":{"id":356,"name":"quintTupledLambdaParam356","kind":"param"},"368":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"371":{"id":370,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":369,"kind":"app","opcode":"oneOf","args":[{"id":368,"kind":"name","name":"S"}]},"depth":1},"374":{"id":370,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":369,"kind":"app","opcode":"oneOf","args":[{"id":368,"kind":"name","name":"S"}]},"depth":1},"375":{"kind":"var","name":"k","typeAnnotation":{"id":217,"kind":"int"},"id":218},"380":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"386":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"388":{"id":387,"name":"x","kind":"param"},"394":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"452":{"id":441,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":440,"kind":"app","opcode":"Rec","args":[{"id":437,"kind":"str","value":"name"},{"id":436,"kind":"str","value":"igor"},{"id":439,"kind":"str","value":"year"},{"id":438,"kind":"int","value":1981}]},"depth":0},"467":{"id":466,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":465,"kind":"app","opcode":"Rec","args":[{"id":462,"kind":"str","value":"a"},{"id":461,"kind":"int","value":1},{"id":464,"kind":"str","value":"b"},{"id":463,"kind":"str","value":"foo"}]},"depth":1},"476":{"id":475,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":474,"kind":"app","opcode":"Tup","args":[{"id":472,"kind":"str","value":"a"},{"id":473,"kind":"int","value":3}]},"depth":1},"482":{"id":481,"name":"s","kind":"param"},"504":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"508":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"518":{"id":516,"kind":"typedef","name":"INT_SET","type":{"id":515,"kind":"set","elem":{"id":514,"kind":"int"}}},"520":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"521":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":520,"importedFrom":{"id":522,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":521,"name":"N"},{"id":520,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":523,"name":"withConsts","declarations":[{"id":100,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":99,"kind":"app","opcode":"isub","args":[{"id":97,"kind":"int","value":1},{"id":98,"kind":"int","value":2}]}},{"id":104,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":103,"kind":"app","opcode":"imul","args":[{"id":101,"kind":"int","value":2},{"id":102,"kind":"int","value":3}]}},{"id":108,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":107,"kind":"app","opcode":"idiv","args":[{"id":105,"kind":"int","value":2},{"id":106,"kind":"int","value":3}]}},{"id":112,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":111,"kind":"app","opcode":"imod","args":[{"id":109,"kind":"int","value":2},{"id":110,"kind":"int","value":3}]}},{"id":116,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":115,"kind":"app","opcode":"ipow","args":[{"id":113,"kind":"int","value":2},{"id":114,"kind":"int","value":3}]}},{"id":119,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":118,"kind":"app","opcode":"iuminus","args":[{"id":117,"kind":"int","value":100}]}},{"id":123,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":122,"kind":"app","opcode":"igt","args":[{"id":120,"kind":"int","value":2},{"id":121,"kind":"int","value":3}]}},{"id":127,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":126,"kind":"app","opcode":"igte","args":[{"id":124,"kind":"int","value":2},{"id":125,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},{"id":131,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":130,"kind":"app","opcode":"ilt","args":[{"id":128,"kind":"int","value":2},{"id":129,"kind":"int","value":3}]}},{"id":135,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":134,"kind":"app","opcode":"ilte","args":[{"id":132,"kind":"int","value":2},{"id":133,"kind":"int","value":3}]}},{"id":139,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":138,"kind":"app","opcode":"eq","args":[{"id":136,"kind":"int","value":2},{"id":137,"kind":"int","value":3}]}},{"id":143,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":142,"kind":"app","opcode":"neq","args":[{"id":140,"kind":"int","value":2},{"id":141,"kind":"int","value":3}]}},{"id":149,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":148,"kind":"app","opcode":"eq","args":[{"id":146,"kind":"app","opcode":"iadd","args":[{"id":144,"kind":"int","value":2},{"id":145,"kind":"int","value":2}]},{"id":147,"kind":"int","value":4}]}},{"id":153,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":152,"kind":"app","opcode":"in","args":[{"id":150,"kind":"int","value":1},{"id":151,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},{"id":165,"kind":"def","name":"withType","qualifier":"val","expr":{"id":164,"kind":"app","opcode":"Set","args":[{"id":162,"kind":"int","value":1},{"id":163,"kind":"int","value":2}]},"typeAnnotation":{"id":161,"kind":"set","elem":{"id":160,"kind":"int"}}},{"id":166,"kind":"typedef","name":"PROC"},{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},{"id":174,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":173,"kind":"int","value":42}},{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},{"kind":"var","name":"k","typeAnnotation":{"id":217,"kind":"int"},"id":218},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22},{"id":239,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":238,"kind":"app","opcode":"and","args":[{"id":236,"kind":"bool","value":false},{"id":237,"kind":"bool","value":true}]}},{"id":243,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":242,"kind":"app","opcode":"or","args":[{"id":240,"kind":"bool","value":false},{"id":241,"kind":"bool","value":true}]}},{"id":247,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":246,"kind":"app","opcode":"implies","args":[{"id":244,"kind":"bool","value":false},{"id":245,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26},{"id":280,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":279,"kind":"app","opcode":"and","args":[{"id":276,"kind":"bool","value":false},{"id":277,"kind":"bool","value":true},{"id":278,"kind":"bool","value":false}]}},{"id":285,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":284,"kind":"app","opcode":"actionAll","args":[{"id":281,"kind":"bool","value":false},{"id":282,"kind":"bool","value":true},{"id":283,"kind":"bool","value":false}]}},{"id":290,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":289,"kind":"app","opcode":"or","args":[{"id":286,"kind":"bool","value":false},{"id":287,"kind":"bool","value":true},{"id":288,"kind":"bool","value":false}]}},{"id":295,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":294,"kind":"app","opcode":"actionAny","args":[{"id":291,"kind":"bool","value":false},{"id":292,"kind":"bool","value":true},{"id":293,"kind":"bool","value":false}]}},{"id":300,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":299,"kind":"app","opcode":"ite","args":[{"id":296,"kind":"bool","value":true},{"id":297,"kind":"int","value":1},{"id":298,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":317,"kind":"fun","arg":{"id":315,"kind":"str"},"res":{"id":316,"kind":"int"}},"id":318},{"kind":"const","name":"MyFunFun","typeAnnotation":{"id":31,"kind":"fun","arg":{"id":29,"kind":"fun","arg":{"id":27,"kind":"int"},"res":{"id":28,"kind":"str"}},"res":{"id":30,"kind":"bool"}},"id":32},{"id":327,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":326,"kind":"lambda","params":[{"id":323,"name":"a"},{"id":324,"name":"b"}],"qualifier":"def","expr":{"id":325,"kind":"int","value":1}}},{"id":339,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":338,"kind":"app","opcode":"in","args":[{"id":336,"kind":"int","value":1},{"id":337,"kind":"app","opcode":"Set","args":[]}]}},{"kind":"const","name":"MyOperator","typeAnnotation":{"id":36,"kind":"oper","args":[{"id":33,"kind":"int"},{"id":34,"kind":"str"}],"res":{"id":35,"kind":"bool"}},"id":37},{"id":404,"kind":"def","name":"one","qualifier":"val","expr":{"id":403,"kind":"app","opcode":"head","args":[{"id":402,"kind":"app","opcode":"List","args":[{"id":400,"kind":"int","value":1},{"id":401,"kind":"int","value":2}]}]}},{"id":409,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":408,"kind":"app","opcode":"Tup","args":[{"id":405,"kind":"int","value":1},{"id":406,"kind":"int","value":2},{"id":407,"kind":"int","value":3}]}},{"id":414,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":413,"kind":"app","opcode":"Tup","args":[{"id":410,"kind":"int","value":1},{"id":411,"kind":"int","value":2},{"id":412,"kind":"int","value":3}]}},{"id":418,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":417,"kind":"app","opcode":"Tup","args":[{"id":415,"kind":"int","value":4},{"id":416,"kind":"int","value":5}]}},{"kind":"const","name":"MyOperatorWithComma","typeAnnotation":{"id":41,"kind":"oper","args":[{"id":38,"kind":"int"},{"id":39,"kind":"str"}],"res":{"id":40,"kind":"bool"}},"id":42},{"id":423,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":422,"kind":"app","opcode":"List","args":[{"id":419,"kind":"int","value":1},{"id":420,"kind":"int","value":2},{"id":421,"kind":"int","value":3}]}},{"id":428,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":427,"kind":"app","opcode":"List","args":[{"id":424,"kind":"int","value":1},{"id":425,"kind":"int","value":2},{"id":426,"kind":"int","value":3}]}},{"id":435,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":434,"kind":"app","opcode":"nth","args":[{"id":432,"kind":"app","opcode":"List","args":[{"id":429,"kind":"int","value":2},{"id":430,"kind":"int","value":3},{"id":431,"kind":"int","value":4}]},{"id":433,"kind":"int","value":2}]}},{"id":441,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":440,"kind":"app","opcode":"Rec","args":[{"id":437,"kind":"str","value":"name"},{"id":436,"kind":"str","value":"igor"},{"id":439,"kind":"str","value":"year"},{"id":438,"kind":"int","value":1981}]}},{"id":447,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":446,"kind":"app","opcode":"Rec","args":[{"id":442,"kind":"str","value":"name"},{"id":443,"kind":"str","value":"igor"},{"id":444,"kind":"str","value":"year"},{"id":445,"kind":"int","value":1981}]}},{"id":460,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":459,"kind":"app","opcode":"Set","args":[{"id":456,"kind":"int","value":1},{"id":457,"kind":"int","value":2},{"id":458,"kind":"int","value":3}]}},{"kind":"const","name":"MyTuple","typeAnnotation":{"id":46,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":43,"kind":"int"}},{"fieldName":"1","fieldType":{"id":44,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":45,"kind":"str"}}],"other":{"kind":"empty"}}},"id":47},{"id":490,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":489,"kind":"app","opcode":"in","args":[{"id":487,"kind":"int","value":2},{"id":488,"kind":"app","opcode":"Set","args":[]}]}},{"id":494,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":493,"kind":"app","opcode":"subseteq","args":[{"id":491,"kind":"app","opcode":"Set","args":[]},{"id":492,"kind":"app","opcode":"Set","args":[]}]}},{"id":503,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":502,"kind":"app","opcode":"in","args":[{"id":496,"kind":"app","opcode":"Set","args":[{"id":495,"kind":"int","value":1}]},{"id":501,"kind":"app","opcode":"powerset","args":[{"id":500,"kind":"app","opcode":"Set","args":[{"id":497,"kind":"int","value":1},{"id":498,"kind":"int","value":2},{"id":499,"kind":"int","value":3}]}]}]}},{"id":516,"kind":"typedef","name":"INT_SET","type":{"id":515,"kind":"set","elem":{"id":514,"kind":"int"}}},{"id":517,"kind":"typedef","name":"UNINTERPRETED_TYPE"},{"kind":"const","name":"MyTupleWithComma","typeAnnotation":{"id":51,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":48,"kind":"int"}},{"fieldName":"1","fieldType":{"id":49,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":50,"kind":"str"}}],"other":{"kind":"empty"}}},"id":52},{"kind":"const","name":"MyRecord","typeAnnotation":{"id":56,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":53,"kind":"int"}},{"fieldName":"b","fieldType":{"id":54,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":55,"kind":"str"}}],"other":{"kind":"empty"}}},"id":57},{"kind":"const","name":"MyRecordWithComma","typeAnnotation":{"id":61,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":58,"kind":"int"}},{"fieldName":"b","fieldType":{"id":59,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":60,"kind":"str"}}],"other":{"kind":"empty"}}},"id":62},{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},{"kind":"var","name":"i","typeAnnotation":{"id":89,"kind":"int"},"id":90},{"kind":"var","name":"j","typeAnnotation":{"id":91,"kind":"bool"},"id":92},{"id":96,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":95,"kind":"app","opcode":"iadd","args":[{"id":93,"kind":"int","value":1},{"id":94,"kind":"int","value":2}]}},{"id":159,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":158,"kind":"app","opcode":"exists","args":[{"id":154,"kind":"name","name":"Bool"},{"id":157,"kind":"lambda","params":[{"id":155,"name":"x"}],"qualifier":"def","expr":{"id":156,"kind":"name","name":"x"}}]}},{"id":170,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":169,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":168,"kind":"set","elem":{"id":167,"kind":"const","name":"PROC"}}},{"id":181,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":180,"kind":"lambda","params":[{"id":175,"name":"x"},{"id":176,"name":"y"}],"qualifier":"puredef","expr":{"id":179,"kind":"app","opcode":"iadd","args":[{"id":177,"kind":"name","name":"x"},{"id":178,"kind":"name","name":"y"}]}}},{"id":187,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":186,"kind":"lambda","params":[{"id":182,"name":"factor"}],"qualifier":"def","expr":{"id":185,"kind":"app","opcode":"imul","args":[{"id":183,"kind":"name","name":"factor"},{"id":184,"kind":"name","name":"n"}]}}},{"id":193,"kind":"def","name":"A","qualifier":"action","expr":{"id":192,"kind":"lambda","params":[{"id":188,"name":"x"}],"qualifier":"action","expr":{"id":191,"kind":"app","opcode":"assign","args":[{"id":190,"kind":"name","name":"n"},{"id":189,"kind":"name","name":"x"}]}}},{"id":198,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":197,"kind":"lambda","params":[{"id":194,"name":"x"}],"qualifier":"puredef","expr":{"id":196,"kind":"app","opcode":"not","args":[{"id":195,"kind":"name","name":"x"}]}}},{"id":209,"kind":"def","name":"H","qualifier":"def","expr":{"id":208,"kind":"lambda","params":[{"id":199,"name":"x"},{"id":200,"name":"y"}],"qualifier":"def","expr":{"id":207,"kind":"app","opcode":"iadd","args":[{"id":205,"kind":"name","name":"x"},{"id":206,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":204,"kind":"oper","args":[{"id":201,"kind":"int"},{"id":202,"kind":"int"}],"res":{"id":203,"kind":"int"}}},{"id":216,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":215,"kind":"lambda","params":[{"id":210,"name":"x"}],"qualifier":"def","expr":{"id":214,"kind":"name","name":"x"}},"typeAnnotation":{"id":213,"kind":"oper","args":[{"id":211,"kind":"var","name":"a"}],"res":{"id":212,"kind":"var","name":"a"}}},{"id":222,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":221,"kind":"app","opcode":"assign","args":[{"id":220,"kind":"name","name":"k"},{"id":219,"kind":"int","value":3}]}},{"id":235,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":234,"kind":"lambda","params":[{"id":224,"name":"x","typeAnnotation":{"id":223,"kind":"int"}},{"id":226,"name":"y","typeAnnotation":{"id":225,"kind":"int"}}],"qualifier":"puredef","expr":{"id":233,"kind":"app","opcode":"ite","args":[{"id":230,"kind":"app","opcode":"ilt","args":[{"id":228,"kind":"name","name":"x"},{"id":229,"kind":"name","name":"y"}]},{"id":231,"kind":"name","name":"x"},{"id":232,"kind":"name","name":"y"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":223,"kind":"int"},{"id":225,"kind":"int"}],"res":{"id":227,"kind":"int"}}},{"id":251,"kind":"def","name":"F","qualifier":"def","expr":{"id":250,"kind":"lambda","params":[{"id":248,"name":"x"}],"qualifier":"def","expr":{"id":249,"kind":"name","name":"x"}}},{"id":314,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":313,"kind":"lambda","params":[{"id":301,"name":"x"},{"id":302,"name":"y"}],"qualifier":"def","expr":{"id":312,"kind":"app","opcode":"ite","args":[{"id":305,"kind":"app","opcode":"ilt","args":[{"id":303,"kind":"name","name":"x"},{"id":304,"kind":"int","value":10}]},{"id":308,"kind":"app","opcode":"iadd","args":[{"id":306,"kind":"name","name":"y"},{"id":307,"kind":"int","value":5}]},{"id":311,"kind":"app","opcode":"imod","args":[{"id":309,"kind":"name","name":"y"},{"id":310,"kind":"int","value":5}]}]}}},{"id":322,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":321,"kind":"app","opcode":"get","args":[{"id":319,"kind":"name","name":"f1"},{"id":320,"kind":"str","value":"a"}]}},{"id":331,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":330,"kind":"app","opcode":"MyOper","args":[{"id":328,"kind":"str","value":"a"},{"id":329,"kind":"int","value":42}]}},{"id":335,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":334,"kind":"app","opcode":"MyOper","args":[{"id":332,"kind":"str","value":"a"},{"id":333,"kind":"int","value":42}]}},{"id":347,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":346,"kind":"app","opcode":"filter","args":[{"id":340,"kind":"name","name":"S"},{"id":345,"kind":"lambda","params":[{"id":341,"name":"x"}],"qualifier":"def","expr":{"id":344,"kind":"app","opcode":"igt","args":[{"id":342,"kind":"name","name":"x"},{"id":343,"kind":"int","value":10}]}}]}},{"id":385,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":384,"kind":"app","opcode":"filter","args":[{"id":380,"kind":"name","name":"S"},{"id":383,"kind":"lambda","params":[{"id":381,"name":"_"}],"qualifier":"def","expr":{"id":382,"kind":"bool","value":true}}]}},{"id":393,"kind":"def","name":"f","qualifier":"val","expr":{"id":392,"kind":"app","opcode":"mapBy","args":[{"id":386,"kind":"name","name":"S"},{"id":391,"kind":"lambda","params":[{"id":387,"name":"x"}],"qualifier":"def","expr":{"id":390,"kind":"app","opcode":"iadd","args":[{"id":388,"kind":"name","name":"x"},{"id":389,"kind":"int","value":1}]}}]}},{"id":399,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":398,"kind":"app","opcode":"exclude","args":[{"id":394,"kind":"name","name":"S"},{"id":397,"kind":"app","opcode":"Set","args":[{"id":395,"kind":"int","value":3},{"id":396,"kind":"int","value":4}]}]}},{"id":455,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"app","opcode":"with","args":[{"id":452,"kind":"name","name":"test_record"},{"id":449,"kind":"str","value":"name"},{"id":448,"kind":"str","value":"quint"}]},{"id":451,"kind":"str","value":"year"},{"id":450,"kind":"int","value":2023}]}},{"id":471,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":470,"kind":"let","opdef":{"id":466,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":465,"kind":"app","opcode":"Rec","args":[{"id":462,"kind":"str","value":"a"},{"id":461,"kind":"int","value":1},{"id":464,"kind":"str","value":"b"},{"id":463,"kind":"str","value":"foo"}]}},"expr":{"id":469,"kind":"app","opcode":"field","args":[{"id":467,"kind":"name","name":"my_rec"},{"id":468,"kind":"str","value":"a"}]}}},{"id":480,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":479,"kind":"let","opdef":{"id":475,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":474,"kind":"app","opcode":"Tup","args":[{"id":472,"kind":"str","value":"a"},{"id":473,"kind":"int","value":3}]}},"expr":{"id":478,"kind":"app","opcode":"item","args":[{"id":476,"kind":"name","name":"my_tup"},{"id":477,"kind":"int","value":2}]}}},{"id":486,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":485,"kind":"lambda","params":[{"id":481,"name":"s"}],"qualifier":"def","expr":{"id":484,"kind":"app","opcode":"eq","args":[{"id":482,"kind":"name","name":"s"},{"id":483,"kind":"app","opcode":"List","args":[]}]}}},{"id":507,"kind":"assume","name":"positive","assumption":{"id":506,"kind":"app","opcode":"igt","args":[{"id":504,"kind":"name","name":"N"},{"id":505,"kind":"int","value":0}]}},{"id":511,"kind":"assume","name":"_","assumption":{"id":510,"kind":"app","opcode":"neq","args":[{"id":508,"kind":"name","name":"N"},{"id":509,"kind":"int","value":0}]}},{"id":512,"kind":"import","defName":"foo","protoName":"M1"},{"id":513,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":518,"kind":"const","name":"INT_SET"},"id":519},{"id":522,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":521,"name":"N"},{"id":520,"kind":"name","name":"N"}]],"identityOverride":false},{"id":74,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":73,"kind":"lambda","params":[{"id":70,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":72,"kind":"app","opcode":"variant","args":[{"id":69,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":71}]}}},{"id":80,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":79,"kind":"lambda","params":[{"id":76,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":78,"kind":"app","opcode":"variant","args":[{"id":75,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":77}]}}},{"id":86,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":85,"kind":"lambda","params":[{"id":82,"name":"__DogParam"}],"qualifier":"def","expr":{"id":84,"kind":"app","opcode":"variant","args":[{"id":81,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":83}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":87,"kind":"const","name":"MyUnionType"},"id":88},{"id":259,"kind":"def","name":"G","qualifier":"def","expr":{"id":258,"kind":"lambda","params":[{"id":252,"name":"x"}],"qualifier":"def","expr":{"id":257,"kind":"app","opcode":"and","args":[{"id":254,"kind":"app","opcode":"F","args":[{"id":253,"kind":"name","name":"x"}]},{"id":256,"kind":"app","opcode":"not","args":[{"id":255,"kind":"name","name":"x"}]}]}}},{"id":267,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":266,"kind":"lambda","params":[{"id":260,"name":"x"}],"qualifier":"def","expr":{"id":265,"kind":"app","opcode":"and","args":[{"id":262,"kind":"app","opcode":"F","args":[{"id":261,"kind":"name","name":"x"}]},{"id":264,"kind":"app","opcode":"not","args":[{"id":263,"kind":"name","name":"x"}]}]}}},{"id":275,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":274,"kind":"lambda","params":[{"id":268,"name":"x"}],"qualifier":"def","expr":{"id":273,"kind":"app","opcode":"or","args":[{"id":270,"kind":"app","opcode":"F","args":[{"id":269,"kind":"name","name":"x"}]},{"id":272,"kind":"app","opcode":"not","args":[{"id":271,"kind":"name","name":"x"}]}]}}},{"id":367,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":366,"kind":"app","opcode":"map","args":[{"id":350,"kind":"app","opcode":"tuples","args":[{"id":348,"kind":"name","name":"S"},{"id":349,"kind":"name","name":"MySet"}]},{"id":365,"kind":"lambda","params":[{"id":356,"name":"quintTupledLambdaParam356"}],"qualifier":"def","expr":{"id":361,"kind":"let","opdef":{"id":352,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":362,"kind":"app","opcode":"item","args":[{"id":363,"kind":"name","name":"quintTupledLambdaParam356"},{"id":364,"kind":"int","value":2}]}},"expr":{"id":357,"kind":"let","opdef":{"id":351,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":358,"kind":"app","opcode":"item","args":[{"id":359,"kind":"name","name":"quintTupledLambdaParam356"},{"id":360,"kind":"int","value":1}]}},"expr":{"id":355,"kind":"app","opcode":"iadd","args":[{"id":353,"kind":"name","name":"s"},{"id":354,"kind":"name","name":"mys"}]}}}}]}},{"id":379,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":378,"kind":"let","opdef":{"id":370,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":369,"kind":"app","opcode":"oneOf","args":[{"id":368,"kind":"name","name":"S"}]}},"expr":{"id":377,"kind":"app","opcode":"actionAll","args":[{"id":373,"kind":"app","opcode":"igt","args":[{"id":371,"kind":"name","name":"x"},{"id":372,"kind":"int","value":10}]},{"id":376,"kind":"app","opcode":"assign","args":[{"id":375,"kind":"name","name":"k"},{"id":374,"kind":"name","name":"x"}]}]}}}]}],"table":{"68":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"71":{"id":70,"name":"__CircleParam","kind":"param"},"77":{"id":76,"name":"__RectangleParam","kind":"param"},"83":{"id":82,"name":"__DogParam","kind":"param"},"87":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"156":{"id":155,"name":"x","kind":"param"},"167":{"id":166,"kind":"typedef","name":"PROC"},"177":{"id":175,"name":"x","kind":"param"},"178":{"id":176,"name":"y","kind":"param"},"183":{"id":182,"name":"factor","kind":"param"},"184":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"189":{"id":188,"name":"x","kind":"param"},"190":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"195":{"id":194,"name":"x","kind":"param"},"205":{"id":199,"name":"x","kind":"param"},"206":{"id":200,"name":"y","kind":"param"},"214":{"id":210,"name":"x","kind":"param"},"220":{"kind":"var","name":"k","typeAnnotation":{"id":217,"kind":"int"},"id":218},"228":{"id":224,"name":"x","typeAnnotation":{"id":223,"kind":"int"},"kind":"param"},"229":{"id":226,"name":"y","typeAnnotation":{"id":225,"kind":"int"},"kind":"param"},"231":{"id":224,"name":"x","typeAnnotation":{"id":223,"kind":"int"},"kind":"param"},"232":{"id":226,"name":"y","typeAnnotation":{"id":225,"kind":"int"},"kind":"param"},"249":{"id":248,"name":"x","kind":"param"},"253":{"id":252,"name":"x","kind":"param"},"254":{"id":251,"kind":"def","name":"F","qualifier":"def","expr":{"id":250,"kind":"lambda","params":[{"id":248,"name":"x"}],"qualifier":"def","expr":{"id":249,"kind":"name","name":"x"}},"depth":0},"255":{"id":252,"name":"x","kind":"param"},"261":{"id":260,"name":"x","kind":"param"},"262":{"id":251,"kind":"def","name":"F","qualifier":"def","expr":{"id":250,"kind":"lambda","params":[{"id":248,"name":"x"}],"qualifier":"def","expr":{"id":249,"kind":"name","name":"x"}},"depth":0},"263":{"id":260,"name":"x","kind":"param"},"269":{"id":268,"name":"x","kind":"param"},"270":{"id":251,"kind":"def","name":"F","qualifier":"def","expr":{"id":250,"kind":"lambda","params":[{"id":248,"name":"x"}],"qualifier":"def","expr":{"id":249,"kind":"name","name":"x"}},"depth":0},"271":{"id":268,"name":"x","kind":"param"},"303":{"id":301,"name":"x","kind":"param"},"306":{"id":302,"name":"y","kind":"param"},"309":{"id":302,"name":"y","kind":"param"},"319":{"kind":"var","name":"f1","typeAnnotation":{"id":317,"kind":"fun","arg":{"id":315,"kind":"str"},"res":{"id":316,"kind":"int"}},"id":318},"330":{"id":327,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":326,"kind":"lambda","params":[{"id":323,"name":"a"},{"id":324,"name":"b"}],"qualifier":"def","expr":{"id":325,"kind":"int","value":1}},"depth":0},"334":{"id":327,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":326,"kind":"lambda","params":[{"id":323,"name":"a"},{"id":324,"name":"b"}],"qualifier":"def","expr":{"id":325,"kind":"int","value":1}},"depth":0},"340":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"342":{"id":341,"name":"x","kind":"param"},"348":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"349":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},"353":{"id":351,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":358,"kind":"app","opcode":"item","args":[{"id":359,"kind":"name","name":"quintTupledLambdaParam356"},{"id":360,"kind":"int","value":1}]},"depth":1},"354":{"id":352,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":362,"kind":"app","opcode":"item","args":[{"id":363,"kind":"name","name":"quintTupledLambdaParam356"},{"id":364,"kind":"int","value":2}]},"depth":1},"359":{"id":356,"name":"quintTupledLambdaParam356","kind":"param"},"363":{"id":356,"name":"quintTupledLambdaParam356","kind":"param"},"368":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"371":{"id":370,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":369,"kind":"app","opcode":"oneOf","args":[{"id":368,"kind":"name","name":"S"}]},"depth":1},"374":{"id":370,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":369,"kind":"app","opcode":"oneOf","args":[{"id":368,"kind":"name","name":"S"}]},"depth":1},"375":{"kind":"var","name":"k","typeAnnotation":{"id":217,"kind":"int"},"id":218},"380":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"386":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"388":{"id":387,"name":"x","kind":"param"},"394":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"452":{"id":441,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":440,"kind":"app","opcode":"Rec","args":[{"id":437,"kind":"str","value":"name"},{"id":436,"kind":"str","value":"igor"},{"id":439,"kind":"str","value":"year"},{"id":438,"kind":"int","value":1981}]},"depth":0},"467":{"id":466,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":465,"kind":"app","opcode":"Rec","args":[{"id":462,"kind":"str","value":"a"},{"id":461,"kind":"int","value":1},{"id":464,"kind":"str","value":"b"},{"id":463,"kind":"str","value":"foo"}]},"depth":1},"476":{"id":475,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":474,"kind":"app","opcode":"Tup","args":[{"id":472,"kind":"str","value":"a"},{"id":473,"kind":"int","value":3}]},"depth":1},"482":{"id":481,"name":"s","kind":"param"},"504":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"508":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"518":{"id":516,"kind":"typedef","name":"INT_SET","type":{"id":515,"kind":"set","elem":{"id":514,"kind":"int"}}},"520":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"521":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":520,"importedFrom":{"id":522,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":521,"name":"N"},{"id":520,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1043sumTypeDecl.json b/quint/testFixture/_1043sumTypeDecl.json index 67982899d..86a24fb9f 100644 --- a/quint/testFixture/_1043sumTypeDecl.json +++ b/quint/testFixture/_1043sumTypeDecl.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":21,"name":"SumTypes","declarations":[{"id":3,"name":"T","kind":"typedef","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},{"id":13,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":3,"kind":"const","name":"T"}},"expr":{"id":12,"kind":"lambda","params":[{"id":9,"name":"__BParam"}],"qualifier":"def","expr":{"id":11,"kind":"app","opcode":"variant","args":[{"id":8,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":10}]}}},{"id":7,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":3,"kind":"const","name":"T"},"expr":{"id":6,"kind":"app","opcode":"variant","args":[{"id":4,"kind":"str","value":"A"},{"id":5,"kind":"app","opcode":"Rec","args":[]}]}},{"id":20,"kind":"def","name":"canConstructVariants","qualifier":"val","expr":{"id":19,"kind":"app","opcode":"List","args":[{"id":16,"kind":"name","name":"A"},{"id":18,"kind":"app","opcode":"B","args":[{"id":17,"kind":"int","value":2}]}]},"typeAnnotation":{"id":15,"kind":"list","elem":{"id":14,"kind":"const","name":"T"}}}]}],"table":{"3":{"id":3,"name":"T","kind":"typedef","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"10":{"id":9,"name":"__BParam","kind":"param"},"14":{"id":3,"name":"T","kind":"typedef","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"16":{"id":7,"kind":"def","name":"A","qualifier":"val","expr":{"id":6,"kind":"app","opcode":"variant","args":[{"id":4,"kind":"str","value":"A"},{"id":5,"kind":"app","opcode":"Rec","args":[]}]},"depth":0},"18":{"id":13,"kind":"def","name":"B","qualifier":"def","expr":{"id":12,"kind":"lambda","params":[{"id":9,"name":"__BParam"}],"qualifier":"def","expr":{"id":11,"kind":"app","opcode":"variant","args":[{"id":8,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":10}]}},"depth":0}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":21,"name":"SumTypes","declarations":[{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},{"id":13,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":3,"kind":"const","name":"T"}},"expr":{"id":12,"kind":"lambda","params":[{"id":9,"name":"__BParam"}],"qualifier":"def","expr":{"id":11,"kind":"app","opcode":"variant","args":[{"id":8,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":10}]}}},{"id":7,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":3,"kind":"const","name":"T"},"expr":{"id":6,"kind":"app","opcode":"variant","args":[{"id":4,"kind":"str","value":"A"},{"id":5,"kind":"app","opcode":"Rec","args":[]}]}},{"id":20,"kind":"def","name":"canConstructVariants","qualifier":"val","expr":{"id":19,"kind":"app","opcode":"List","args":[{"id":16,"kind":"name","name":"A"},{"id":18,"kind":"app","opcode":"B","args":[{"id":17,"kind":"int","value":2}]}]},"typeAnnotation":{"id":15,"kind":"list","elem":{"id":14,"kind":"const","name":"T"}}}]}],"table":{"3":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"10":{"id":9,"name":"__BParam","kind":"param"},"14":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"16":{"id":7,"kind":"def","name":"A","qualifier":"val","expr":{"id":6,"kind":"app","opcode":"variant","args":[{"id":4,"kind":"str","value":"A"},{"id":5,"kind":"app","opcode":"Rec","args":[]}]},"depth":0},"18":{"id":13,"kind":"def","name":"B","qualifier":"def","expr":{"id":12,"kind":"lambda","params":[{"id":9,"name":"__BParam"}],"qualifier":"def","expr":{"id":11,"kind":"app","opcode":"variant","args":[{"id":8,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":10}]}},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1044matchExpression.json b/quint/testFixture/_1044matchExpression.json index 6ceb3f033..24a0dc8ae 100644 --- a/quint/testFixture/_1044matchExpression.json +++ b/quint/testFixture/_1044matchExpression.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":40,"name":"SumTypes","declarations":[{"id":4,"name":"T","kind":"typedef","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},{"id":14,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}}},{"id":20,"kind":"def","name":"C","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"str"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":19,"kind":"lambda","params":[{"id":16,"name":"__CParam"}],"qualifier":"def","expr":{"id":18,"kind":"app","opcode":"variant","args":[{"id":15,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":17}]}}},{"id":8,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":4,"kind":"const","name":"T"},"expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]}},{"id":23,"kind":"def","name":"c","qualifier":"val","expr":{"id":22,"kind":"app","opcode":"C","args":[{"id":21,"kind":"str","value":"Foo"}]}},{"id":39,"kind":"def","name":"ex","qualifier":"val","expr":{"id":29,"kind":"app","opcode":"matchVariant","args":[{"id":24,"kind":"name","name":"c"},{"id":30,"kind":"str","value":"A"},{"id":31,"kind":"lambda","qualifier":"def","expr":{"id":25,"kind":"int","value":0},"params":[{"name":"_","id":32}]},{"id":33,"kind":"str","value":"B"},{"id":34,"kind":"lambda","qualifier":"def","expr":{"id":26,"kind":"name","name":"n"},"params":[{"name":"n","id":35}]},{"id":36,"kind":"str","value":"_"},{"id":37,"kind":"lambda","qualifier":"def","expr":{"id":28,"kind":"app","opcode":"iuminus","args":[{"id":27,"kind":"int","value":1}]},"params":[{"name":"_","id":38}]}]}}]}],"table":{"4":{"id":4,"name":"T","kind":"typedef","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},"11":{"id":10,"name":"__BParam","kind":"param"},"17":{"id":16,"name":"__CParam","kind":"param"},"22":{"id":20,"kind":"def","name":"C","qualifier":"def","expr":{"id":19,"kind":"lambda","params":[{"id":16,"name":"__CParam"}],"qualifier":"def","expr":{"id":18,"kind":"app","opcode":"variant","args":[{"id":15,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":17}]}},"depth":0},"24":{"id":23,"kind":"def","name":"c","qualifier":"val","expr":{"id":22,"kind":"app","opcode":"C","args":[{"id":21,"kind":"str","value":"Foo"}]},"depth":0},"26":{"name":"n","id":35,"kind":"param"}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":40,"name":"SumTypes","declarations":[{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},{"id":14,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}}},{"id":20,"kind":"def","name":"C","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"str"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":19,"kind":"lambda","params":[{"id":16,"name":"__CParam"}],"qualifier":"def","expr":{"id":18,"kind":"app","opcode":"variant","args":[{"id":15,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":17}]}}},{"id":8,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":4,"kind":"const","name":"T"},"expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]}},{"id":23,"kind":"def","name":"c","qualifier":"val","expr":{"id":22,"kind":"app","opcode":"C","args":[{"id":21,"kind":"str","value":"Foo"}]}},{"id":39,"kind":"def","name":"ex","qualifier":"val","expr":{"id":29,"kind":"app","opcode":"matchVariant","args":[{"id":24,"kind":"name","name":"c"},{"id":30,"kind":"str","value":"A"},{"id":31,"kind":"lambda","qualifier":"def","expr":{"id":25,"kind":"int","value":0},"params":[{"name":"_","id":32}]},{"id":33,"kind":"str","value":"B"},{"id":34,"kind":"lambda","qualifier":"def","expr":{"id":26,"kind":"name","name":"n"},"params":[{"name":"n","id":35}]},{"id":36,"kind":"str","value":"_"},{"id":37,"kind":"lambda","qualifier":"def","expr":{"id":28,"kind":"app","opcode":"iuminus","args":[{"id":27,"kind":"int","value":1}]},"params":[{"name":"_","id":38}]}]}}]}],"table":{"4":{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},"11":{"id":10,"name":"__BParam","kind":"param"},"17":{"id":16,"name":"__CParam","kind":"param"},"22":{"id":20,"kind":"def","name":"C","qualifier":"def","expr":{"id":19,"kind":"lambda","params":[{"id":16,"name":"__CParam"}],"qualifier":"def","expr":{"id":18,"kind":"app","opcode":"variant","args":[{"id":15,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":17}]}},"depth":0},"24":{"id":23,"kind":"def","name":"c","qualifier":"val","expr":{"id":22,"kind":"app","opcode":"C","args":[{"id":21,"kind":"str","value":"Foo"}]},"depth":0},"26":{"name":"n","id":35,"kind":"param"}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1045polymorphicTypeDecl.json b/quint/testFixture/_1045polymorphicTypeDecl.json index e0af39456..f3055bd2f 100644 --- a/quint/testFixture/_1045polymorphicTypeDecl.json +++ b/quint/testFixture/_1045polymorphicTypeDecl.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":31,"name":"m","declarations":[{"id":13,"kind":"typedef","name":"MapApp","type":{"id":12,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":10,"kind":"fun","arg":{"id":8,"kind":"var","name":"a"},"res":{"id":9,"kind":"var","name":"b"}}},{"fieldName":"1","fieldType":{"id":11,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}}},{"id":18,"name":"Result","kind":"typedef","type":{"id":18,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":16,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":17,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}}},{"id":5,"kind":"typedef","name":"MonoPair","type":{"id":4,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":2,"kind":"var","name":"a"}},{"fieldName":"1","fieldType":{"id":3,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}}},{"id":24,"kind":"def","name":"Ok","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":16,"kind":"var","name":"ok"}],"res":{"id":18,"kind":"const","name":"Result"}},"expr":{"id":23,"kind":"lambda","params":[{"id":20,"name":"__OkParam"}],"qualifier":"def","expr":{"id":22,"kind":"app","opcode":"variant","args":[{"id":19,"kind":"str","value":"Ok"},{"kind":"name","name":"__OkParam","id":21}]}}},{"id":30,"kind":"def","name":"Err","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":17,"kind":"var","name":"err"}],"res":{"id":18,"kind":"const","name":"Result"}},"expr":{"id":29,"kind":"lambda","params":[{"id":26,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":28,"kind":"app","opcode":"variant","args":[{"id":25,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":27}]}}}]}],"table":{"18":{"id":18,"name":"Result","kind":"typedef","type":{"id":18,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":16,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":17,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}}},"21":{"id":20,"name":"__OkParam","kind":"param"},"27":{"id":26,"name":"__ErrParam","kind":"param"}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":26,"name":"m","declarations":[{"id":10,"kind":"typedef","name":"MapApp","type":{"id":9,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":7,"kind":"fun","arg":{"id":5,"kind":"var","name":"a"},"res":{"id":6,"kind":"var","name":"b"}}},{"fieldName":"1","fieldType":{"id":8,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a","b"]},{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"]},{"id":4,"kind":"typedef","name":"MonoPair","type":{"id":3,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":1,"kind":"var","name":"a"}},{"fieldName":"1","fieldType":{"id":2,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a"]},{"id":19,"kind":"def","name":"Ok","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":11,"kind":"var","name":"ok"}],"res":{"id":13,"kind":"const","name":"Result"}},"expr":{"id":18,"kind":"lambda","params":[{"id":15,"name":"__OkParam"}],"qualifier":"def","expr":{"id":17,"kind":"app","opcode":"variant","args":[{"id":14,"kind":"str","value":"Ok"},{"kind":"name","name":"__OkParam","id":16}]}}},{"id":25,"kind":"def","name":"Err","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":12,"kind":"var","name":"err"}],"res":{"id":13,"kind":"const","name":"Result"}},"expr":{"id":24,"kind":"lambda","params":[{"id":21,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":23,"kind":"app","opcode":"variant","args":[{"id":20,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":22}]}}}]}],"table":{"13":{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"]},"16":{"id":15,"name":"__OkParam","kind":"param"},"22":{"id":21,"name":"__ErrParam","kind":"param"}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1045polymorphicTypeDecl.map.json b/quint/testFixture/_1045polymorphicTypeDecl.map.json index 598ba96ac..2e0f71688 100644 --- a/quint/testFixture/_1045polymorphicTypeDecl.map.json +++ b/quint/testFixture/_1045polymorphicTypeDecl.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1045polymorphicTypeDecl.qnt"},"map":{"1":[0,{"line":1,"col":16,"index":27},{"line":1,"col":16,"index":27}],"2":[0,{"line":1,"col":22,"index":33},{"line":1,"col":22,"index":33}],"3":[0,{"line":1,"col":25,"index":36},{"line":1,"col":25,"index":36}],"4":[0,{"line":1,"col":21,"index":32},{"line":1,"col":26,"index":37}],"5":[0,{"line":1,"col":2,"index":13},{"line":1,"col":26,"index":37}],"6":[0,{"line":2,"col":14,"index":53},{"line":2,"col":14,"index":53}],"7":[0,{"line":2,"col":17,"index":56},{"line":2,"col":17,"index":56}],"8":[0,{"line":2,"col":23,"index":62},{"line":2,"col":23,"index":62}],"9":[0,{"line":2,"col":28,"index":67},{"line":2,"col":28,"index":67}],"10":[0,{"line":2,"col":23,"index":62},{"line":2,"col":28,"index":67}],"11":[0,{"line":2,"col":31,"index":70},{"line":2,"col":31,"index":70}],"12":[0,{"line":2,"col":22,"index":61},{"line":2,"col":32,"index":71}],"13":[0,{"line":2,"col":2,"index":41},{"line":2,"col":32,"index":71}],"14":[0,{"line":3,"col":14,"index":87},{"line":3,"col":15,"index":88}],"15":[0,{"line":3,"col":18,"index":91},{"line":3,"col":20,"index":93}],"16":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"17":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"18":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"19":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"20":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"21":[0,{"line":4,"col":6,"index":104},{"line":4,"col":7,"index":105}],"22":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"23":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"24":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"25":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"26":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"27":[0,{"line":5,"col":6,"index":117},{"line":5,"col":8,"index":119}],"28":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"29":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"30":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"31":[0,{"line":0,"col":0,"index":0},{"line":6,"col":126,"index":126}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1045polymorphicTypeDecl.qnt"},"map":{"1":[0,{"line":1,"col":22,"index":33},{"line":1,"col":22,"index":33}],"2":[0,{"line":1,"col":25,"index":36},{"line":1,"col":25,"index":36}],"3":[0,{"line":1,"col":21,"index":32},{"line":1,"col":26,"index":37}],"4":[0,{"line":1,"col":2,"index":13},{"line":1,"col":26,"index":37}],"5":[0,{"line":2,"col":23,"index":62},{"line":2,"col":23,"index":62}],"6":[0,{"line":2,"col":28,"index":67},{"line":2,"col":28,"index":67}],"7":[0,{"line":2,"col":23,"index":62},{"line":2,"col":28,"index":67}],"8":[0,{"line":2,"col":31,"index":70},{"line":2,"col":31,"index":70}],"9":[0,{"line":2,"col":22,"index":61},{"line":2,"col":32,"index":71}],"10":[0,{"line":2,"col":2,"index":41},{"line":2,"col":32,"index":71}],"11":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"12":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"13":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"14":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"15":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"16":[0,{"line":4,"col":6,"index":104},{"line":4,"col":7,"index":105}],"17":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"18":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"19":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"20":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"21":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"22":[0,{"line":5,"col":6,"index":117},{"line":5,"col":8,"index":119}],"23":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"24":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"25":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"26":[0,{"line":0,"col":0,"index":0},{"line":6,"col":126,"index":126}]}} \ No newline at end of file From 6d5350d45a85a6950998195b12443f8846c23703 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 28 Feb 2024 17:35:17 -0500 Subject: [PATCH 250/388] Add lookup definition transformer --- quint/src/ir/IRTransformer.ts | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/quint/src/ir/IRTransformer.ts b/quint/src/ir/IRTransformer.ts index e095b7347..2f3401240 100644 --- a/quint/src/ir/IRTransformer.ts +++ b/quint/src/ir/IRTransformer.ts @@ -16,6 +16,7 @@ import * as ir from './quintIr' import * as t from './quintTypes' import { unreachable } from '../util' +import { LookupDefinition } from '../names/base' export class IRTransformer { enterModule?: (module: ir.QuintModule) => ir.QuintModule @@ -282,6 +283,30 @@ export function transformType(transformer: IRTransformer, type: t.QuintType): t. return newType } +/** + * Transforms a Quint LookupDefinition with a transformer + * + * This is just a thin wrapper to deal with the fact that LookupDefinitions are a slightly awkward union. + * + * @param transformer: the IRTransformer instance with the functions to be invoked + * @param lud: the Quint LookupDefinition to be transformed + * + * @returns the transformed LookupDefinition + */ +export function transformLookupDefinition(transformer: IRTransformer, lud: LookupDefinition): LookupDefinition { + switch (lud.kind) { + case 'const': + case 'def': + case 'var': + case 'assume': + case 'typedef': + return transformDefinition(transformer, lud) + + case 'param': + return lud.typeAnnotation ? { ...lud, typeAnnotation: transformType(transformer, lud.typeAnnotation) } : lud + } +} + /** * Transforms a Quint declaration with a transformer, invoking the corresponding function for each * inner component. From 1e0d503803aafbda7fe1764e19cd1c761ba6c363 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 28 Feb 2024 17:06:33 -0500 Subject: [PATCH 251/388] Fix printing of parametric type declarations --- quint/src/ir/IRprinting.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/quint/src/ir/IRprinting.ts b/quint/src/ir/IRprinting.ts index 16acc3e0e..8bbc720c1 100644 --- a/quint/src/ir/IRprinting.ts +++ b/quint/src/ir/IRprinting.ts @@ -121,7 +121,8 @@ export function definitionToString(def: QuintDef, includeBody: boolean = true, t return `assume ${def.name} = ${expressionToString(def.assumption)}` case 'typedef': if (def.type) { - return `type ${def.name} = ${typeToString(def.type)}` + const params = def.params && def.params.length > 0 ? `[${def.params.join(', ')}]` : '' + return `type ${def.name}${params} = ${typeToString(def.type)}` } else { return `type ${def.name}` } From 65737702bef02d932b52f1041363c80783050421 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 23 Feb 2024 11:54:02 -0500 Subject: [PATCH 252/388] Fix test --- quint/test/types/parser.test.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/quint/test/types/parser.test.ts b/quint/test/types/parser.test.ts index 133c0c011..31d262f3f 100644 --- a/quint/test/types/parser.test.ts +++ b/quint/test/types/parser.test.ts @@ -103,13 +103,13 @@ describe('parseType', () => { type.map(value => assert.deepEqual(value, { kind: 'app', - ctor: { kind: 'const', name: 'Foo', id: 1n }, + ctor: { kind: 'const', name: 'Foo', id: 5n }, args: [ - { kind: 'int', id: 2n }, - { kind: 'bool', id: 3n }, - { kind: 'str', id: 4n }, + { kind: 'int', id: 1n }, + { kind: 'bool', id: 2n }, + { kind: 'str', id: 3n }, ], - id: 5n, + id: 4n, }) ) }) From a1ebe5119cfa0a22df10503c768528579ebe9f83 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 28 Feb 2024 19:40:25 -0500 Subject: [PATCH 253/388] Comment out failing test --- quint/test/types/inferrer.test.ts | 35 ++++++++++++++++--------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/quint/test/types/inferrer.test.ts b/quint/test/types/inferrer.test.ts index 9fe0c58ba..0c1dff0b8 100644 --- a/quint/test/types/inferrer.test.ts +++ b/quint/test/types/inferrer.test.ts @@ -395,23 +395,24 @@ module B { ) }) - it('checks correct polymorphic types', () => { - const defs = [ - 'type Result[ok, err] = Ok(ok) | Err(err)', - `def result_map(r: Result[a, e], f: a => b): Result[b, e] = - match r { - | Ok(x) => Ok(f(x)) - | Err(_) => r - }`, - ] - - const [errors, table] = inferTypesForDefs(defs) - assert.sameDeepMembers([...errors.entries()], []) - assert.sameDeepMembers( - [...table.entries()].map(([id, t]) => [id, typeSchemeToString(t)]), - [] - ) - }) + // TODO + // it('checks correct polymorphic types', () => { + // const defs = [ + // 'type Result[ok, err] = Ok(ok) | Err(err)', + // `def result_map(r: Result[a, e], f: a => b): Result[b, e] = + // match r { + // | Ok(x) => Ok(f(x)) + // | Err(_) => r + // }`, + // ] + + // const [errors, table] = inferTypesForDefs(defs) + // assert.sameDeepMembers([...errors.entries()], []) + // assert.sameDeepMembers( + // [...table.entries()].map(([id, t]) => [id, typeSchemeToString(t)]), + // [] + // ) + // }) it('fails when types are not unifiable', () => { const defs = ['def a = 1.map(p => p + 10)'] From caf3821959fd4fce9bf1157ec10cea08c9082c57 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 27 Feb 2024 18:30:25 -0500 Subject: [PATCH 254/388] Fix variant constructor type annotations They were omitting type arguments --- quint/src/parsing/ToIrListener.ts | 15 ++++++- quint/test/types/inferrer.test.ts | 66 ++++++++++++++++--------------- 2 files changed, 47 insertions(+), 34 deletions(-) diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index 46d60312c..2dc64cd5b 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -24,6 +24,7 @@ import { QuintConstType, QuintSumType, QuintType, + QuintVarType, Row, RowField, isUnitType, @@ -405,7 +406,17 @@ export class ToIrListener implements QuintListener { this.checkForUndeclaredTypeVariables(id, def) // Used for annotations in the variant constructors - const constructorReturnType: QuintConstType = { id, kind: 'const', name } + let constructorReturnType: QuintType + // The constant identifying the type definition. E.g. `Result` + const typeConst: QuintConstType = { id: this.getId(ctx), kind: 'const', name } + if (def.params) { + // The type takes parameters, so we need a type application as the return type. E.g., `Result[ok, err]` + const args: QuintVarType[] = def.params.map(name => ({ id: this.getId(ctx), kind: 'var', name })) + constructorReturnType = { id, kind: 'app', ctor: typeConst, args } + } else { + // The type takes no parameters, so we only need the constant name + constructorReturnType = typeConst + } // Generate all the variant constructors implied by a variant type definition // a variant constructor is an operator that injects an expression @@ -451,7 +462,7 @@ export class ToIrListener implements QuintListener { // ``` qualifier = 'val' - // The nullary variant constructor is actualy + // The nullary variant constructor is actually // a variant pairing a label with the unit. const wrappedExpr = unitValue(this.getId(variantCtx._sumLabel)) diff --git a/quint/test/types/inferrer.test.ts b/quint/test/types/inferrer.test.ts index 0c1dff0b8..5cf311add 100644 --- a/quint/test/types/inferrer.test.ts +++ b/quint/test/types/inferrer.test.ts @@ -164,21 +164,22 @@ describe('inferTypes', () => { assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) + // _printUpdatedStringTypes(stringTypes) assert.sameDeepMembers(stringTypes, [ - [14n, 'str'], - [15n, 'int'], - [16n, '(A(int) | B({}))'], + [15n, 'str'], + [16n, 'int'], [17n, '(A(int) | B({}))'], - [10n, 'str'], - [11n, '{}'], - [12n, '(B({}) | A(int))'], - [13n, '(B({}) | A(int))'], - [5n, 'int'], - [4n, 'str'], + [18n, '(A(int) | B({}))'], [6n, 'int'], - [7n, '(A(int) | B({}))'], - [8n, '(int) => (A(int) | B({}))'], + [5n, 'str'], + [7n, 'int'], + [8n, '(A(int) | B({}))'], [9n, '(int) => (A(int) | B({}))'], + [10n, '(int) => (A(int) | B({}))'], + [11n, 'str'], + [12n, '{}'], + [13n, '(B({}) | A(int))'], + [14n, '(B({}) | A(int))'], ]) }) @@ -205,34 +206,35 @@ module B { assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) + // _printUpdatedStringTypes(stringTypes) assert.sameDeepMembers(stringTypes, [ - [14n, 'str'], - [15n, 'int'], - [16n, '(A(int) | B({}))'], + [15n, 'str'], + [16n, 'int'], [17n, '(A(int) | B({}))'], - [10n, 'str'], - [11n, '{}'], - [12n, '(B({}) | A(int))'], - [13n, '(B({}) | A(int))'], [18n, '(A(int) | B({}))'], - [24n, 'str'], - [26n, 'int'], - [19n, 'int'], + [6n, 'int'], + [5n, 'str'], + [7n, 'int'], + [8n, '(A(int) | B({}))'], + [9n, '(int) => (A(int) | B({}))'], + [10n, '(int) => (A(int) | B({}))'], + [11n, 'str'], + [12n, '{}'], + [13n, '(B({}) | A(int))'], + [14n, '(B({}) | A(int))'], + [19n, '(A(int) | B({}))'], + [25n, 'str'], + [27n, 'int'], [20n, 'int'], [21n, 'int'], - [25n, '(int) => int'], - [27n, 'str'], - [29n, '{}'], [22n, 'int'], - [28n, '({}) => int'], + [26n, '(int) => int'], + [28n, 'str'], + [30n, '{}'], [23n, 'int'], - [30n, 'int'], - [5n, 'int'], - [4n, 'str'], - [6n, 'int'], - [7n, '(A(int) | B({}))'], - [8n, '(int) => (A(int) | B({}))'], - [9n, '(int) => (A(int) | B({}))'], + [29n, '({}) => int'], + [24n, 'int'], + [31n, 'int'], ]) }) From f86104e1b29ee51687bf91799dfd2a2c9224d504 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 28 Feb 2024 19:47:11 -0500 Subject: [PATCH 255/388] Remove stale comments --- quint/src/types/constraintGenerator.ts | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/quint/src/types/constraintGenerator.ts b/quint/src/types/constraintGenerator.ts index 4ac413bcf..aa48e3ec6 100644 --- a/quint/src/types/constraintGenerator.ts +++ b/quint/src/types/constraintGenerator.ts @@ -110,23 +110,6 @@ export class ConstraintGeneratorVisitor implements IRVisitor { // Nested lambdas add new entries to the stack, and pop them when exiting. private freeNames: { typeVariables: Set; rowVariables: Set }[] = [] - // int[a] - // - // TODO: Free type variables must also use the variables in the constructor - // - // type T[a] = Set[a] - // type U[a, b] = (Set[a], List[b]) - // - // U[int, int] - // val x = (Set(1,2), List(1,2)) - // val f : a => U[a, U[a, b]] = ... - // - // U[a, b] =.= U[int, int] /\ a =.= b /\ typeOf(x) =.= (Set[a], List[b]) - // - // type MapT[a,b] = (Set[a], a => b) => Set[b] - // - // def map(s: Set[a], f: a => b): Set[b] = ... - // getResult(): [Map, Map] { return [this.errors, this.types] } @@ -315,8 +298,6 @@ export class ConstraintGeneratorVisitor implements IRVisitor { this.addToResults(e.id, this.fetchResult(e.expr.id)) } - // TODO: On type app exit, add constraints for the type operators? - // TODO: Need similar logic on exiting a type def (to create a scheme for a lambda) and exitOpDef(e: QuintOpDef) { if (this.errors.size !== 0) { return From 95f5fad39d305e4edc0ca9b3e8f81767094ac899 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 28 Feb 2024 19:58:18 -0500 Subject: [PATCH 256/388] Update fixtures --- quint/testFixture/SuperSpec.json | 2 +- quint/testFixture/SuperSpec.map.json | 2 +- quint/testFixture/_1043sumTypeDecl.json | 2 +- quint/testFixture/_1043sumTypeDecl.map.json | 2 +- quint/testFixture/_1044matchExpression.json | 2 +- quint/testFixture/_1044matchExpression.map.json | 2 +- quint/testFixture/_1045polymorphicTypeDecl.json | 2 +- quint/testFixture/_1045polymorphicTypeDecl.map.json | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/quint/testFixture/SuperSpec.json b/quint/testFixture/SuperSpec.json index 49df38868..134bbd828 100644 --- a/quint/testFixture/SuperSpec.json +++ b/quint/testFixture/SuperSpec.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":523,"name":"withConsts","declarations":[{"id":100,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":99,"kind":"app","opcode":"isub","args":[{"id":97,"kind":"int","value":1},{"id":98,"kind":"int","value":2}]}},{"id":104,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":103,"kind":"app","opcode":"imul","args":[{"id":101,"kind":"int","value":2},{"id":102,"kind":"int","value":3}]}},{"id":108,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":107,"kind":"app","opcode":"idiv","args":[{"id":105,"kind":"int","value":2},{"id":106,"kind":"int","value":3}]}},{"id":112,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":111,"kind":"app","opcode":"imod","args":[{"id":109,"kind":"int","value":2},{"id":110,"kind":"int","value":3}]}},{"id":116,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":115,"kind":"app","opcode":"ipow","args":[{"id":113,"kind":"int","value":2},{"id":114,"kind":"int","value":3}]}},{"id":119,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":118,"kind":"app","opcode":"iuminus","args":[{"id":117,"kind":"int","value":100}]}},{"id":123,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":122,"kind":"app","opcode":"igt","args":[{"id":120,"kind":"int","value":2},{"id":121,"kind":"int","value":3}]}},{"id":127,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":126,"kind":"app","opcode":"igte","args":[{"id":124,"kind":"int","value":2},{"id":125,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},{"id":131,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":130,"kind":"app","opcode":"ilt","args":[{"id":128,"kind":"int","value":2},{"id":129,"kind":"int","value":3}]}},{"id":135,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":134,"kind":"app","opcode":"ilte","args":[{"id":132,"kind":"int","value":2},{"id":133,"kind":"int","value":3}]}},{"id":139,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":138,"kind":"app","opcode":"eq","args":[{"id":136,"kind":"int","value":2},{"id":137,"kind":"int","value":3}]}},{"id":143,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":142,"kind":"app","opcode":"neq","args":[{"id":140,"kind":"int","value":2},{"id":141,"kind":"int","value":3}]}},{"id":149,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":148,"kind":"app","opcode":"eq","args":[{"id":146,"kind":"app","opcode":"iadd","args":[{"id":144,"kind":"int","value":2},{"id":145,"kind":"int","value":2}]},{"id":147,"kind":"int","value":4}]}},{"id":153,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":152,"kind":"app","opcode":"in","args":[{"id":150,"kind":"int","value":1},{"id":151,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},{"id":165,"kind":"def","name":"withType","qualifier":"val","expr":{"id":164,"kind":"app","opcode":"Set","args":[{"id":162,"kind":"int","value":1},{"id":163,"kind":"int","value":2}]},"typeAnnotation":{"id":161,"kind":"set","elem":{"id":160,"kind":"int"}}},{"id":166,"kind":"typedef","name":"PROC"},{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},{"id":174,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":173,"kind":"int","value":42}},{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},{"kind":"var","name":"k","typeAnnotation":{"id":217,"kind":"int"},"id":218},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22},{"id":239,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":238,"kind":"app","opcode":"and","args":[{"id":236,"kind":"bool","value":false},{"id":237,"kind":"bool","value":true}]}},{"id":243,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":242,"kind":"app","opcode":"or","args":[{"id":240,"kind":"bool","value":false},{"id":241,"kind":"bool","value":true}]}},{"id":247,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":246,"kind":"app","opcode":"implies","args":[{"id":244,"kind":"bool","value":false},{"id":245,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26},{"id":280,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":279,"kind":"app","opcode":"and","args":[{"id":276,"kind":"bool","value":false},{"id":277,"kind":"bool","value":true},{"id":278,"kind":"bool","value":false}]}},{"id":285,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":284,"kind":"app","opcode":"actionAll","args":[{"id":281,"kind":"bool","value":false},{"id":282,"kind":"bool","value":true},{"id":283,"kind":"bool","value":false}]}},{"id":290,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":289,"kind":"app","opcode":"or","args":[{"id":286,"kind":"bool","value":false},{"id":287,"kind":"bool","value":true},{"id":288,"kind":"bool","value":false}]}},{"id":295,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":294,"kind":"app","opcode":"actionAny","args":[{"id":291,"kind":"bool","value":false},{"id":292,"kind":"bool","value":true},{"id":293,"kind":"bool","value":false}]}},{"id":300,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":299,"kind":"app","opcode":"ite","args":[{"id":296,"kind":"bool","value":true},{"id":297,"kind":"int","value":1},{"id":298,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":317,"kind":"fun","arg":{"id":315,"kind":"str"},"res":{"id":316,"kind":"int"}},"id":318},{"kind":"const","name":"MyFunFun","typeAnnotation":{"id":31,"kind":"fun","arg":{"id":29,"kind":"fun","arg":{"id":27,"kind":"int"},"res":{"id":28,"kind":"str"}},"res":{"id":30,"kind":"bool"}},"id":32},{"id":327,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":326,"kind":"lambda","params":[{"id":323,"name":"a"},{"id":324,"name":"b"}],"qualifier":"def","expr":{"id":325,"kind":"int","value":1}}},{"id":339,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":338,"kind":"app","opcode":"in","args":[{"id":336,"kind":"int","value":1},{"id":337,"kind":"app","opcode":"Set","args":[]}]}},{"kind":"const","name":"MyOperator","typeAnnotation":{"id":36,"kind":"oper","args":[{"id":33,"kind":"int"},{"id":34,"kind":"str"}],"res":{"id":35,"kind":"bool"}},"id":37},{"id":404,"kind":"def","name":"one","qualifier":"val","expr":{"id":403,"kind":"app","opcode":"head","args":[{"id":402,"kind":"app","opcode":"List","args":[{"id":400,"kind":"int","value":1},{"id":401,"kind":"int","value":2}]}]}},{"id":409,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":408,"kind":"app","opcode":"Tup","args":[{"id":405,"kind":"int","value":1},{"id":406,"kind":"int","value":2},{"id":407,"kind":"int","value":3}]}},{"id":414,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":413,"kind":"app","opcode":"Tup","args":[{"id":410,"kind":"int","value":1},{"id":411,"kind":"int","value":2},{"id":412,"kind":"int","value":3}]}},{"id":418,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":417,"kind":"app","opcode":"Tup","args":[{"id":415,"kind":"int","value":4},{"id":416,"kind":"int","value":5}]}},{"kind":"const","name":"MyOperatorWithComma","typeAnnotation":{"id":41,"kind":"oper","args":[{"id":38,"kind":"int"},{"id":39,"kind":"str"}],"res":{"id":40,"kind":"bool"}},"id":42},{"id":423,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":422,"kind":"app","opcode":"List","args":[{"id":419,"kind":"int","value":1},{"id":420,"kind":"int","value":2},{"id":421,"kind":"int","value":3}]}},{"id":428,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":427,"kind":"app","opcode":"List","args":[{"id":424,"kind":"int","value":1},{"id":425,"kind":"int","value":2},{"id":426,"kind":"int","value":3}]}},{"id":435,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":434,"kind":"app","opcode":"nth","args":[{"id":432,"kind":"app","opcode":"List","args":[{"id":429,"kind":"int","value":2},{"id":430,"kind":"int","value":3},{"id":431,"kind":"int","value":4}]},{"id":433,"kind":"int","value":2}]}},{"id":441,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":440,"kind":"app","opcode":"Rec","args":[{"id":437,"kind":"str","value":"name"},{"id":436,"kind":"str","value":"igor"},{"id":439,"kind":"str","value":"year"},{"id":438,"kind":"int","value":1981}]}},{"id":447,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":446,"kind":"app","opcode":"Rec","args":[{"id":442,"kind":"str","value":"name"},{"id":443,"kind":"str","value":"igor"},{"id":444,"kind":"str","value":"year"},{"id":445,"kind":"int","value":1981}]}},{"id":460,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":459,"kind":"app","opcode":"Set","args":[{"id":456,"kind":"int","value":1},{"id":457,"kind":"int","value":2},{"id":458,"kind":"int","value":3}]}},{"kind":"const","name":"MyTuple","typeAnnotation":{"id":46,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":43,"kind":"int"}},{"fieldName":"1","fieldType":{"id":44,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":45,"kind":"str"}}],"other":{"kind":"empty"}}},"id":47},{"id":490,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":489,"kind":"app","opcode":"in","args":[{"id":487,"kind":"int","value":2},{"id":488,"kind":"app","opcode":"Set","args":[]}]}},{"id":494,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":493,"kind":"app","opcode":"subseteq","args":[{"id":491,"kind":"app","opcode":"Set","args":[]},{"id":492,"kind":"app","opcode":"Set","args":[]}]}},{"id":503,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":502,"kind":"app","opcode":"in","args":[{"id":496,"kind":"app","opcode":"Set","args":[{"id":495,"kind":"int","value":1}]},{"id":501,"kind":"app","opcode":"powerset","args":[{"id":500,"kind":"app","opcode":"Set","args":[{"id":497,"kind":"int","value":1},{"id":498,"kind":"int","value":2},{"id":499,"kind":"int","value":3}]}]}]}},{"id":516,"kind":"typedef","name":"INT_SET","type":{"id":515,"kind":"set","elem":{"id":514,"kind":"int"}}},{"id":517,"kind":"typedef","name":"UNINTERPRETED_TYPE"},{"kind":"const","name":"MyTupleWithComma","typeAnnotation":{"id":51,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":48,"kind":"int"}},{"fieldName":"1","fieldType":{"id":49,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":50,"kind":"str"}}],"other":{"kind":"empty"}}},"id":52},{"kind":"const","name":"MyRecord","typeAnnotation":{"id":56,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":53,"kind":"int"}},{"fieldName":"b","fieldType":{"id":54,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":55,"kind":"str"}}],"other":{"kind":"empty"}}},"id":57},{"kind":"const","name":"MyRecordWithComma","typeAnnotation":{"id":61,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":58,"kind":"int"}},{"fieldName":"b","fieldType":{"id":59,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":60,"kind":"str"}}],"other":{"kind":"empty"}}},"id":62},{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},{"kind":"var","name":"i","typeAnnotation":{"id":89,"kind":"int"},"id":90},{"kind":"var","name":"j","typeAnnotation":{"id":91,"kind":"bool"},"id":92},{"id":96,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":95,"kind":"app","opcode":"iadd","args":[{"id":93,"kind":"int","value":1},{"id":94,"kind":"int","value":2}]}},{"id":159,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":158,"kind":"app","opcode":"exists","args":[{"id":154,"kind":"name","name":"Bool"},{"id":157,"kind":"lambda","params":[{"id":155,"name":"x"}],"qualifier":"def","expr":{"id":156,"kind":"name","name":"x"}}]}},{"id":170,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":169,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":168,"kind":"set","elem":{"id":167,"kind":"const","name":"PROC"}}},{"id":181,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":180,"kind":"lambda","params":[{"id":175,"name":"x"},{"id":176,"name":"y"}],"qualifier":"puredef","expr":{"id":179,"kind":"app","opcode":"iadd","args":[{"id":177,"kind":"name","name":"x"},{"id":178,"kind":"name","name":"y"}]}}},{"id":187,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":186,"kind":"lambda","params":[{"id":182,"name":"factor"}],"qualifier":"def","expr":{"id":185,"kind":"app","opcode":"imul","args":[{"id":183,"kind":"name","name":"factor"},{"id":184,"kind":"name","name":"n"}]}}},{"id":193,"kind":"def","name":"A","qualifier":"action","expr":{"id":192,"kind":"lambda","params":[{"id":188,"name":"x"}],"qualifier":"action","expr":{"id":191,"kind":"app","opcode":"assign","args":[{"id":190,"kind":"name","name":"n"},{"id":189,"kind":"name","name":"x"}]}}},{"id":198,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":197,"kind":"lambda","params":[{"id":194,"name":"x"}],"qualifier":"puredef","expr":{"id":196,"kind":"app","opcode":"not","args":[{"id":195,"kind":"name","name":"x"}]}}},{"id":209,"kind":"def","name":"H","qualifier":"def","expr":{"id":208,"kind":"lambda","params":[{"id":199,"name":"x"},{"id":200,"name":"y"}],"qualifier":"def","expr":{"id":207,"kind":"app","opcode":"iadd","args":[{"id":205,"kind":"name","name":"x"},{"id":206,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":204,"kind":"oper","args":[{"id":201,"kind":"int"},{"id":202,"kind":"int"}],"res":{"id":203,"kind":"int"}}},{"id":216,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":215,"kind":"lambda","params":[{"id":210,"name":"x"}],"qualifier":"def","expr":{"id":214,"kind":"name","name":"x"}},"typeAnnotation":{"id":213,"kind":"oper","args":[{"id":211,"kind":"var","name":"a"}],"res":{"id":212,"kind":"var","name":"a"}}},{"id":222,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":221,"kind":"app","opcode":"assign","args":[{"id":220,"kind":"name","name":"k"},{"id":219,"kind":"int","value":3}]}},{"id":235,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":234,"kind":"lambda","params":[{"id":224,"name":"x","typeAnnotation":{"id":223,"kind":"int"}},{"id":226,"name":"y","typeAnnotation":{"id":225,"kind":"int"}}],"qualifier":"puredef","expr":{"id":233,"kind":"app","opcode":"ite","args":[{"id":230,"kind":"app","opcode":"ilt","args":[{"id":228,"kind":"name","name":"x"},{"id":229,"kind":"name","name":"y"}]},{"id":231,"kind":"name","name":"x"},{"id":232,"kind":"name","name":"y"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":223,"kind":"int"},{"id":225,"kind":"int"}],"res":{"id":227,"kind":"int"}}},{"id":251,"kind":"def","name":"F","qualifier":"def","expr":{"id":250,"kind":"lambda","params":[{"id":248,"name":"x"}],"qualifier":"def","expr":{"id":249,"kind":"name","name":"x"}}},{"id":314,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":313,"kind":"lambda","params":[{"id":301,"name":"x"},{"id":302,"name":"y"}],"qualifier":"def","expr":{"id":312,"kind":"app","opcode":"ite","args":[{"id":305,"kind":"app","opcode":"ilt","args":[{"id":303,"kind":"name","name":"x"},{"id":304,"kind":"int","value":10}]},{"id":308,"kind":"app","opcode":"iadd","args":[{"id":306,"kind":"name","name":"y"},{"id":307,"kind":"int","value":5}]},{"id":311,"kind":"app","opcode":"imod","args":[{"id":309,"kind":"name","name":"y"},{"id":310,"kind":"int","value":5}]}]}}},{"id":322,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":321,"kind":"app","opcode":"get","args":[{"id":319,"kind":"name","name":"f1"},{"id":320,"kind":"str","value":"a"}]}},{"id":331,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":330,"kind":"app","opcode":"MyOper","args":[{"id":328,"kind":"str","value":"a"},{"id":329,"kind":"int","value":42}]}},{"id":335,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":334,"kind":"app","opcode":"MyOper","args":[{"id":332,"kind":"str","value":"a"},{"id":333,"kind":"int","value":42}]}},{"id":347,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":346,"kind":"app","opcode":"filter","args":[{"id":340,"kind":"name","name":"S"},{"id":345,"kind":"lambda","params":[{"id":341,"name":"x"}],"qualifier":"def","expr":{"id":344,"kind":"app","opcode":"igt","args":[{"id":342,"kind":"name","name":"x"},{"id":343,"kind":"int","value":10}]}}]}},{"id":385,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":384,"kind":"app","opcode":"filter","args":[{"id":380,"kind":"name","name":"S"},{"id":383,"kind":"lambda","params":[{"id":381,"name":"_"}],"qualifier":"def","expr":{"id":382,"kind":"bool","value":true}}]}},{"id":393,"kind":"def","name":"f","qualifier":"val","expr":{"id":392,"kind":"app","opcode":"mapBy","args":[{"id":386,"kind":"name","name":"S"},{"id":391,"kind":"lambda","params":[{"id":387,"name":"x"}],"qualifier":"def","expr":{"id":390,"kind":"app","opcode":"iadd","args":[{"id":388,"kind":"name","name":"x"},{"id":389,"kind":"int","value":1}]}}]}},{"id":399,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":398,"kind":"app","opcode":"exclude","args":[{"id":394,"kind":"name","name":"S"},{"id":397,"kind":"app","opcode":"Set","args":[{"id":395,"kind":"int","value":3},{"id":396,"kind":"int","value":4}]}]}},{"id":455,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"app","opcode":"with","args":[{"id":452,"kind":"name","name":"test_record"},{"id":449,"kind":"str","value":"name"},{"id":448,"kind":"str","value":"quint"}]},{"id":451,"kind":"str","value":"year"},{"id":450,"kind":"int","value":2023}]}},{"id":471,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":470,"kind":"let","opdef":{"id":466,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":465,"kind":"app","opcode":"Rec","args":[{"id":462,"kind":"str","value":"a"},{"id":461,"kind":"int","value":1},{"id":464,"kind":"str","value":"b"},{"id":463,"kind":"str","value":"foo"}]}},"expr":{"id":469,"kind":"app","opcode":"field","args":[{"id":467,"kind":"name","name":"my_rec"},{"id":468,"kind":"str","value":"a"}]}}},{"id":480,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":479,"kind":"let","opdef":{"id":475,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":474,"kind":"app","opcode":"Tup","args":[{"id":472,"kind":"str","value":"a"},{"id":473,"kind":"int","value":3}]}},"expr":{"id":478,"kind":"app","opcode":"item","args":[{"id":476,"kind":"name","name":"my_tup"},{"id":477,"kind":"int","value":2}]}}},{"id":486,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":485,"kind":"lambda","params":[{"id":481,"name":"s"}],"qualifier":"def","expr":{"id":484,"kind":"app","opcode":"eq","args":[{"id":482,"kind":"name","name":"s"},{"id":483,"kind":"app","opcode":"List","args":[]}]}}},{"id":507,"kind":"assume","name":"positive","assumption":{"id":506,"kind":"app","opcode":"igt","args":[{"id":504,"kind":"name","name":"N"},{"id":505,"kind":"int","value":0}]}},{"id":511,"kind":"assume","name":"_","assumption":{"id":510,"kind":"app","opcode":"neq","args":[{"id":508,"kind":"name","name":"N"},{"id":509,"kind":"int","value":0}]}},{"id":512,"kind":"import","defName":"foo","protoName":"M1"},{"id":513,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":518,"kind":"const","name":"INT_SET"},"id":519},{"id":522,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":521,"name":"N"},{"id":520,"kind":"name","name":"N"}]],"identityOverride":false},{"id":74,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":73,"kind":"lambda","params":[{"id":70,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":72,"kind":"app","opcode":"variant","args":[{"id":69,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":71}]}}},{"id":80,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":79,"kind":"lambda","params":[{"id":76,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":78,"kind":"app","opcode":"variant","args":[{"id":75,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":77}]}}},{"id":86,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":85,"kind":"lambda","params":[{"id":82,"name":"__DogParam"}],"qualifier":"def","expr":{"id":84,"kind":"app","opcode":"variant","args":[{"id":81,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":83}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":87,"kind":"const","name":"MyUnionType"},"id":88},{"id":259,"kind":"def","name":"G","qualifier":"def","expr":{"id":258,"kind":"lambda","params":[{"id":252,"name":"x"}],"qualifier":"def","expr":{"id":257,"kind":"app","opcode":"and","args":[{"id":254,"kind":"app","opcode":"F","args":[{"id":253,"kind":"name","name":"x"}]},{"id":256,"kind":"app","opcode":"not","args":[{"id":255,"kind":"name","name":"x"}]}]}}},{"id":267,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":266,"kind":"lambda","params":[{"id":260,"name":"x"}],"qualifier":"def","expr":{"id":265,"kind":"app","opcode":"and","args":[{"id":262,"kind":"app","opcode":"F","args":[{"id":261,"kind":"name","name":"x"}]},{"id":264,"kind":"app","opcode":"not","args":[{"id":263,"kind":"name","name":"x"}]}]}}},{"id":275,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":274,"kind":"lambda","params":[{"id":268,"name":"x"}],"qualifier":"def","expr":{"id":273,"kind":"app","opcode":"or","args":[{"id":270,"kind":"app","opcode":"F","args":[{"id":269,"kind":"name","name":"x"}]},{"id":272,"kind":"app","opcode":"not","args":[{"id":271,"kind":"name","name":"x"}]}]}}},{"id":367,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":366,"kind":"app","opcode":"map","args":[{"id":350,"kind":"app","opcode":"tuples","args":[{"id":348,"kind":"name","name":"S"},{"id":349,"kind":"name","name":"MySet"}]},{"id":365,"kind":"lambda","params":[{"id":356,"name":"quintTupledLambdaParam356"}],"qualifier":"def","expr":{"id":361,"kind":"let","opdef":{"id":352,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":362,"kind":"app","opcode":"item","args":[{"id":363,"kind":"name","name":"quintTupledLambdaParam356"},{"id":364,"kind":"int","value":2}]}},"expr":{"id":357,"kind":"let","opdef":{"id":351,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":358,"kind":"app","opcode":"item","args":[{"id":359,"kind":"name","name":"quintTupledLambdaParam356"},{"id":360,"kind":"int","value":1}]}},"expr":{"id":355,"kind":"app","opcode":"iadd","args":[{"id":353,"kind":"name","name":"s"},{"id":354,"kind":"name","name":"mys"}]}}}}]}},{"id":379,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":378,"kind":"let","opdef":{"id":370,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":369,"kind":"app","opcode":"oneOf","args":[{"id":368,"kind":"name","name":"S"}]}},"expr":{"id":377,"kind":"app","opcode":"actionAll","args":[{"id":373,"kind":"app","opcode":"igt","args":[{"id":371,"kind":"name","name":"x"},{"id":372,"kind":"int","value":10}]},{"id":376,"kind":"app","opcode":"assign","args":[{"id":375,"kind":"name","name":"k"},{"id":374,"kind":"name","name":"x"}]}]}}}]}],"table":{"68":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"71":{"id":70,"name":"__CircleParam","kind":"param"},"77":{"id":76,"name":"__RectangleParam","kind":"param"},"83":{"id":82,"name":"__DogParam","kind":"param"},"87":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"156":{"id":155,"name":"x","kind":"param"},"167":{"id":166,"kind":"typedef","name":"PROC"},"177":{"id":175,"name":"x","kind":"param"},"178":{"id":176,"name":"y","kind":"param"},"183":{"id":182,"name":"factor","kind":"param"},"184":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"189":{"id":188,"name":"x","kind":"param"},"190":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"195":{"id":194,"name":"x","kind":"param"},"205":{"id":199,"name":"x","kind":"param"},"206":{"id":200,"name":"y","kind":"param"},"214":{"id":210,"name":"x","kind":"param"},"220":{"kind":"var","name":"k","typeAnnotation":{"id":217,"kind":"int"},"id":218},"228":{"id":224,"name":"x","typeAnnotation":{"id":223,"kind":"int"},"kind":"param"},"229":{"id":226,"name":"y","typeAnnotation":{"id":225,"kind":"int"},"kind":"param"},"231":{"id":224,"name":"x","typeAnnotation":{"id":223,"kind":"int"},"kind":"param"},"232":{"id":226,"name":"y","typeAnnotation":{"id":225,"kind":"int"},"kind":"param"},"249":{"id":248,"name":"x","kind":"param"},"253":{"id":252,"name":"x","kind":"param"},"254":{"id":251,"kind":"def","name":"F","qualifier":"def","expr":{"id":250,"kind":"lambda","params":[{"id":248,"name":"x"}],"qualifier":"def","expr":{"id":249,"kind":"name","name":"x"}},"depth":0},"255":{"id":252,"name":"x","kind":"param"},"261":{"id":260,"name":"x","kind":"param"},"262":{"id":251,"kind":"def","name":"F","qualifier":"def","expr":{"id":250,"kind":"lambda","params":[{"id":248,"name":"x"}],"qualifier":"def","expr":{"id":249,"kind":"name","name":"x"}},"depth":0},"263":{"id":260,"name":"x","kind":"param"},"269":{"id":268,"name":"x","kind":"param"},"270":{"id":251,"kind":"def","name":"F","qualifier":"def","expr":{"id":250,"kind":"lambda","params":[{"id":248,"name":"x"}],"qualifier":"def","expr":{"id":249,"kind":"name","name":"x"}},"depth":0},"271":{"id":268,"name":"x","kind":"param"},"303":{"id":301,"name":"x","kind":"param"},"306":{"id":302,"name":"y","kind":"param"},"309":{"id":302,"name":"y","kind":"param"},"319":{"kind":"var","name":"f1","typeAnnotation":{"id":317,"kind":"fun","arg":{"id":315,"kind":"str"},"res":{"id":316,"kind":"int"}},"id":318},"330":{"id":327,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":326,"kind":"lambda","params":[{"id":323,"name":"a"},{"id":324,"name":"b"}],"qualifier":"def","expr":{"id":325,"kind":"int","value":1}},"depth":0},"334":{"id":327,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":326,"kind":"lambda","params":[{"id":323,"name":"a"},{"id":324,"name":"b"}],"qualifier":"def","expr":{"id":325,"kind":"int","value":1}},"depth":0},"340":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"342":{"id":341,"name":"x","kind":"param"},"348":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"349":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},"353":{"id":351,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":358,"kind":"app","opcode":"item","args":[{"id":359,"kind":"name","name":"quintTupledLambdaParam356"},{"id":360,"kind":"int","value":1}]},"depth":1},"354":{"id":352,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":362,"kind":"app","opcode":"item","args":[{"id":363,"kind":"name","name":"quintTupledLambdaParam356"},{"id":364,"kind":"int","value":2}]},"depth":1},"359":{"id":356,"name":"quintTupledLambdaParam356","kind":"param"},"363":{"id":356,"name":"quintTupledLambdaParam356","kind":"param"},"368":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"371":{"id":370,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":369,"kind":"app","opcode":"oneOf","args":[{"id":368,"kind":"name","name":"S"}]},"depth":1},"374":{"id":370,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":369,"kind":"app","opcode":"oneOf","args":[{"id":368,"kind":"name","name":"S"}]},"depth":1},"375":{"kind":"var","name":"k","typeAnnotation":{"id":217,"kind":"int"},"id":218},"380":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"386":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"388":{"id":387,"name":"x","kind":"param"},"394":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"452":{"id":441,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":440,"kind":"app","opcode":"Rec","args":[{"id":437,"kind":"str","value":"name"},{"id":436,"kind":"str","value":"igor"},{"id":439,"kind":"str","value":"year"},{"id":438,"kind":"int","value":1981}]},"depth":0},"467":{"id":466,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":465,"kind":"app","opcode":"Rec","args":[{"id":462,"kind":"str","value":"a"},{"id":461,"kind":"int","value":1},{"id":464,"kind":"str","value":"b"},{"id":463,"kind":"str","value":"foo"}]},"depth":1},"476":{"id":475,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":474,"kind":"app","opcode":"Tup","args":[{"id":472,"kind":"str","value":"a"},{"id":473,"kind":"int","value":3}]},"depth":1},"482":{"id":481,"name":"s","kind":"param"},"504":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"508":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"518":{"id":516,"kind":"typedef","name":"INT_SET","type":{"id":515,"kind":"set","elem":{"id":514,"kind":"int"}}},"520":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"521":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":520,"importedFrom":{"id":522,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":521,"name":"N"},{"id":520,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":524,"name":"withConsts","declarations":[{"id":101,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":100,"kind":"app","opcode":"isub","args":[{"id":98,"kind":"int","value":1},{"id":99,"kind":"int","value":2}]}},{"id":105,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":104,"kind":"app","opcode":"imul","args":[{"id":102,"kind":"int","value":2},{"id":103,"kind":"int","value":3}]}},{"id":109,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":108,"kind":"app","opcode":"idiv","args":[{"id":106,"kind":"int","value":2},{"id":107,"kind":"int","value":3}]}},{"id":113,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":112,"kind":"app","opcode":"imod","args":[{"id":110,"kind":"int","value":2},{"id":111,"kind":"int","value":3}]}},{"id":117,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":116,"kind":"app","opcode":"ipow","args":[{"id":114,"kind":"int","value":2},{"id":115,"kind":"int","value":3}]}},{"id":120,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":119,"kind":"app","opcode":"iuminus","args":[{"id":118,"kind":"int","value":100}]}},{"id":124,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":123,"kind":"app","opcode":"igt","args":[{"id":121,"kind":"int","value":2},{"id":122,"kind":"int","value":3}]}},{"id":128,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":127,"kind":"app","opcode":"igte","args":[{"id":125,"kind":"int","value":2},{"id":126,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},{"id":132,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":131,"kind":"app","opcode":"ilt","args":[{"id":129,"kind":"int","value":2},{"id":130,"kind":"int","value":3}]}},{"id":136,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":135,"kind":"app","opcode":"ilte","args":[{"id":133,"kind":"int","value":2},{"id":134,"kind":"int","value":3}]}},{"id":140,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":139,"kind":"app","opcode":"eq","args":[{"id":137,"kind":"int","value":2},{"id":138,"kind":"int","value":3}]}},{"id":144,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":143,"kind":"app","opcode":"neq","args":[{"id":141,"kind":"int","value":2},{"id":142,"kind":"int","value":3}]}},{"id":150,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":149,"kind":"app","opcode":"eq","args":[{"id":147,"kind":"app","opcode":"iadd","args":[{"id":145,"kind":"int","value":2},{"id":146,"kind":"int","value":2}]},{"id":148,"kind":"int","value":4}]}},{"id":154,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":153,"kind":"app","opcode":"in","args":[{"id":151,"kind":"int","value":1},{"id":152,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},{"id":166,"kind":"def","name":"withType","qualifier":"val","expr":{"id":165,"kind":"app","opcode":"Set","args":[{"id":163,"kind":"int","value":1},{"id":164,"kind":"int","value":2}]},"typeAnnotation":{"id":162,"kind":"set","elem":{"id":161,"kind":"int"}}},{"id":167,"kind":"typedef","name":"PROC"},{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173},{"id":175,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":174,"kind":"int","value":42}},{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22},{"id":240,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":239,"kind":"app","opcode":"and","args":[{"id":237,"kind":"bool","value":false},{"id":238,"kind":"bool","value":true}]}},{"id":244,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":243,"kind":"app","opcode":"or","args":[{"id":241,"kind":"bool","value":false},{"id":242,"kind":"bool","value":true}]}},{"id":248,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":247,"kind":"app","opcode":"implies","args":[{"id":245,"kind":"bool","value":false},{"id":246,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26},{"id":281,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":280,"kind":"app","opcode":"and","args":[{"id":277,"kind":"bool","value":false},{"id":278,"kind":"bool","value":true},{"id":279,"kind":"bool","value":false}]}},{"id":286,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":285,"kind":"app","opcode":"actionAll","args":[{"id":282,"kind":"bool","value":false},{"id":283,"kind":"bool","value":true},{"id":284,"kind":"bool","value":false}]}},{"id":291,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":290,"kind":"app","opcode":"or","args":[{"id":287,"kind":"bool","value":false},{"id":288,"kind":"bool","value":true},{"id":289,"kind":"bool","value":false}]}},{"id":296,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":295,"kind":"app","opcode":"actionAny","args":[{"id":292,"kind":"bool","value":false},{"id":293,"kind":"bool","value":true},{"id":294,"kind":"bool","value":false}]}},{"id":301,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":300,"kind":"app","opcode":"ite","args":[{"id":297,"kind":"bool","value":true},{"id":298,"kind":"int","value":1},{"id":299,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319},{"kind":"const","name":"MyFunFun","typeAnnotation":{"id":31,"kind":"fun","arg":{"id":29,"kind":"fun","arg":{"id":27,"kind":"int"},"res":{"id":28,"kind":"str"}},"res":{"id":30,"kind":"bool"}},"id":32},{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}}},{"id":340,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":339,"kind":"app","opcode":"in","args":[{"id":337,"kind":"int","value":1},{"id":338,"kind":"app","opcode":"Set","args":[]}]}},{"kind":"const","name":"MyOperator","typeAnnotation":{"id":36,"kind":"oper","args":[{"id":33,"kind":"int"},{"id":34,"kind":"str"}],"res":{"id":35,"kind":"bool"}},"id":37},{"id":405,"kind":"def","name":"one","qualifier":"val","expr":{"id":404,"kind":"app","opcode":"head","args":[{"id":403,"kind":"app","opcode":"List","args":[{"id":401,"kind":"int","value":1},{"id":402,"kind":"int","value":2}]}]}},{"id":410,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":409,"kind":"app","opcode":"Tup","args":[{"id":406,"kind":"int","value":1},{"id":407,"kind":"int","value":2},{"id":408,"kind":"int","value":3}]}},{"id":415,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":414,"kind":"app","opcode":"Tup","args":[{"id":411,"kind":"int","value":1},{"id":412,"kind":"int","value":2},{"id":413,"kind":"int","value":3}]}},{"id":419,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":418,"kind":"app","opcode":"Tup","args":[{"id":416,"kind":"int","value":4},{"id":417,"kind":"int","value":5}]}},{"kind":"const","name":"MyOperatorWithComma","typeAnnotation":{"id":41,"kind":"oper","args":[{"id":38,"kind":"int"},{"id":39,"kind":"str"}],"res":{"id":40,"kind":"bool"}},"id":42},{"id":424,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":423,"kind":"app","opcode":"List","args":[{"id":420,"kind":"int","value":1},{"id":421,"kind":"int","value":2},{"id":422,"kind":"int","value":3}]}},{"id":429,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"List","args":[{"id":425,"kind":"int","value":1},{"id":426,"kind":"int","value":2},{"id":427,"kind":"int","value":3}]}},{"id":436,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":435,"kind":"app","opcode":"nth","args":[{"id":433,"kind":"app","opcode":"List","args":[{"id":430,"kind":"int","value":2},{"id":431,"kind":"int","value":3},{"id":432,"kind":"int","value":4}]},{"id":434,"kind":"int","value":2}]}},{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]}},{"id":448,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Rec","args":[{"id":443,"kind":"str","value":"name"},{"id":444,"kind":"str","value":"igor"},{"id":445,"kind":"str","value":"year"},{"id":446,"kind":"int","value":1981}]}},{"id":461,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":460,"kind":"app","opcode":"Set","args":[{"id":457,"kind":"int","value":1},{"id":458,"kind":"int","value":2},{"id":459,"kind":"int","value":3}]}},{"kind":"const","name":"MyTuple","typeAnnotation":{"id":46,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":43,"kind":"int"}},{"fieldName":"1","fieldType":{"id":44,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":45,"kind":"str"}}],"other":{"kind":"empty"}}},"id":47},{"id":491,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":490,"kind":"app","opcode":"in","args":[{"id":488,"kind":"int","value":2},{"id":489,"kind":"app","opcode":"Set","args":[]}]}},{"id":495,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":494,"kind":"app","opcode":"subseteq","args":[{"id":492,"kind":"app","opcode":"Set","args":[]},{"id":493,"kind":"app","opcode":"Set","args":[]}]}},{"id":504,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":503,"kind":"app","opcode":"in","args":[{"id":497,"kind":"app","opcode":"Set","args":[{"id":496,"kind":"int","value":1}]},{"id":502,"kind":"app","opcode":"powerset","args":[{"id":501,"kind":"app","opcode":"Set","args":[{"id":498,"kind":"int","value":1},{"id":499,"kind":"int","value":2},{"id":500,"kind":"int","value":3}]}]}]}},{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}}},{"id":518,"kind":"typedef","name":"UNINTERPRETED_TYPE"},{"kind":"const","name":"MyTupleWithComma","typeAnnotation":{"id":51,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":48,"kind":"int"}},{"fieldName":"1","fieldType":{"id":49,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":50,"kind":"str"}}],"other":{"kind":"empty"}}},"id":52},{"kind":"const","name":"MyRecord","typeAnnotation":{"id":56,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":53,"kind":"int"}},{"fieldName":"b","fieldType":{"id":54,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":55,"kind":"str"}}],"other":{"kind":"empty"}}},"id":57},{"kind":"const","name":"MyRecordWithComma","typeAnnotation":{"id":61,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":58,"kind":"int"}},{"fieldName":"b","fieldType":{"id":59,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":60,"kind":"str"}}],"other":{"kind":"empty"}}},"id":62},{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},{"kind":"var","name":"i","typeAnnotation":{"id":90,"kind":"int"},"id":91},{"kind":"var","name":"j","typeAnnotation":{"id":92,"kind":"bool"},"id":93},{"id":97,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":96,"kind":"app","opcode":"iadd","args":[{"id":94,"kind":"int","value":1},{"id":95,"kind":"int","value":2}]}},{"id":160,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":159,"kind":"app","opcode":"exists","args":[{"id":155,"kind":"name","name":"Bool"},{"id":158,"kind":"lambda","params":[{"id":156,"name":"x"}],"qualifier":"def","expr":{"id":157,"kind":"name","name":"x"}}]}},{"id":171,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":170,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":169,"kind":"set","elem":{"id":168,"kind":"const","name":"PROC"}}},{"id":182,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":181,"kind":"lambda","params":[{"id":176,"name":"x"},{"id":177,"name":"y"}],"qualifier":"puredef","expr":{"id":180,"kind":"app","opcode":"iadd","args":[{"id":178,"kind":"name","name":"x"},{"id":179,"kind":"name","name":"y"}]}}},{"id":188,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":187,"kind":"lambda","params":[{"id":183,"name":"factor"}],"qualifier":"def","expr":{"id":186,"kind":"app","opcode":"imul","args":[{"id":184,"kind":"name","name":"factor"},{"id":185,"kind":"name","name":"n"}]}}},{"id":194,"kind":"def","name":"A","qualifier":"action","expr":{"id":193,"kind":"lambda","params":[{"id":189,"name":"x"}],"qualifier":"action","expr":{"id":192,"kind":"app","opcode":"assign","args":[{"id":191,"kind":"name","name":"n"},{"id":190,"kind":"name","name":"x"}]}}},{"id":199,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":198,"kind":"lambda","params":[{"id":195,"name":"x"}],"qualifier":"puredef","expr":{"id":197,"kind":"app","opcode":"not","args":[{"id":196,"kind":"name","name":"x"}]}}},{"id":210,"kind":"def","name":"H","qualifier":"def","expr":{"id":209,"kind":"lambda","params":[{"id":200,"name":"x"},{"id":201,"name":"y"}],"qualifier":"def","expr":{"id":208,"kind":"app","opcode":"iadd","args":[{"id":206,"kind":"name","name":"x"},{"id":207,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":205,"kind":"oper","args":[{"id":202,"kind":"int"},{"id":203,"kind":"int"}],"res":{"id":204,"kind":"int"}}},{"id":217,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":216,"kind":"lambda","params":[{"id":211,"name":"x"}],"qualifier":"def","expr":{"id":215,"kind":"name","name":"x"}},"typeAnnotation":{"id":214,"kind":"oper","args":[{"id":212,"kind":"var","name":"a"}],"res":{"id":213,"kind":"var","name":"a"}}},{"id":223,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":222,"kind":"app","opcode":"assign","args":[{"id":221,"kind":"name","name":"k"},{"id":220,"kind":"int","value":3}]}},{"id":236,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":235,"kind":"lambda","params":[{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"}},{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"}}],"qualifier":"puredef","expr":{"id":234,"kind":"app","opcode":"ite","args":[{"id":231,"kind":"app","opcode":"ilt","args":[{"id":229,"kind":"name","name":"x"},{"id":230,"kind":"name","name":"y"}]},{"id":232,"kind":"name","name":"x"},{"id":233,"kind":"name","name":"y"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":224,"kind":"int"},{"id":226,"kind":"int"}],"res":{"id":228,"kind":"int"}}},{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}}},{"id":315,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":314,"kind":"lambda","params":[{"id":302,"name":"x"},{"id":303,"name":"y"}],"qualifier":"def","expr":{"id":313,"kind":"app","opcode":"ite","args":[{"id":306,"kind":"app","opcode":"ilt","args":[{"id":304,"kind":"name","name":"x"},{"id":305,"kind":"int","value":10}]},{"id":309,"kind":"app","opcode":"iadd","args":[{"id":307,"kind":"name","name":"y"},{"id":308,"kind":"int","value":5}]},{"id":312,"kind":"app","opcode":"imod","args":[{"id":310,"kind":"name","name":"y"},{"id":311,"kind":"int","value":5}]}]}}},{"id":323,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"get","args":[{"id":320,"kind":"name","name":"f1"},{"id":321,"kind":"str","value":"a"}]}},{"id":332,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":331,"kind":"app","opcode":"MyOper","args":[{"id":329,"kind":"str","value":"a"},{"id":330,"kind":"int","value":42}]}},{"id":336,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":335,"kind":"app","opcode":"MyOper","args":[{"id":333,"kind":"str","value":"a"},{"id":334,"kind":"int","value":42}]}},{"id":348,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":347,"kind":"app","opcode":"filter","args":[{"id":341,"kind":"name","name":"S"},{"id":346,"kind":"lambda","params":[{"id":342,"name":"x"}],"qualifier":"def","expr":{"id":345,"kind":"app","opcode":"igt","args":[{"id":343,"kind":"name","name":"x"},{"id":344,"kind":"int","value":10}]}}]}},{"id":386,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":385,"kind":"app","opcode":"filter","args":[{"id":381,"kind":"name","name":"S"},{"id":384,"kind":"lambda","params":[{"id":382,"name":"_"}],"qualifier":"def","expr":{"id":383,"kind":"bool","value":true}}]}},{"id":394,"kind":"def","name":"f","qualifier":"val","expr":{"id":393,"kind":"app","opcode":"mapBy","args":[{"id":387,"kind":"name","name":"S"},{"id":392,"kind":"lambda","params":[{"id":388,"name":"x"}],"qualifier":"def","expr":{"id":391,"kind":"app","opcode":"iadd","args":[{"id":389,"kind":"name","name":"x"},{"id":390,"kind":"int","value":1}]}}]}},{"id":400,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":399,"kind":"app","opcode":"exclude","args":[{"id":395,"kind":"name","name":"S"},{"id":398,"kind":"app","opcode":"Set","args":[{"id":396,"kind":"int","value":3},{"id":397,"kind":"int","value":4}]}]}},{"id":456,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":455,"kind":"app","opcode":"with","args":[{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"name","name":"test_record"},{"id":450,"kind":"str","value":"name"},{"id":449,"kind":"str","value":"quint"}]},{"id":452,"kind":"str","value":"year"},{"id":451,"kind":"int","value":2023}]}},{"id":472,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":471,"kind":"let","opdef":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]}},"expr":{"id":470,"kind":"app","opcode":"field","args":[{"id":468,"kind":"name","name":"my_rec"},{"id":469,"kind":"str","value":"a"}]}}},{"id":481,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":480,"kind":"let","opdef":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]}},"expr":{"id":479,"kind":"app","opcode":"item","args":[{"id":477,"kind":"name","name":"my_tup"},{"id":478,"kind":"int","value":2}]}}},{"id":487,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":486,"kind":"lambda","params":[{"id":482,"name":"s"}],"qualifier":"def","expr":{"id":485,"kind":"app","opcode":"eq","args":[{"id":483,"kind":"name","name":"s"},{"id":484,"kind":"app","opcode":"List","args":[]}]}}},{"id":508,"kind":"assume","name":"positive","assumption":{"id":507,"kind":"app","opcode":"igt","args":[{"id":505,"kind":"name","name":"N"},{"id":506,"kind":"int","value":0}]}},{"id":512,"kind":"assume","name":"_","assumption":{"id":511,"kind":"app","opcode":"neq","args":[{"id":509,"kind":"name","name":"N"},{"id":510,"kind":"int","value":0}]}},{"id":513,"kind":"import","defName":"foo","protoName":"M1"},{"id":514,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":519,"kind":"const","name":"INT_SET"},"id":520},{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},{"id":75,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":74,"kind":"lambda","params":[{"id":71,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":73,"kind":"app","opcode":"variant","args":[{"id":70,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":72}]}}},{"id":81,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":80,"kind":"lambda","params":[{"id":77,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":79,"kind":"app","opcode":"variant","args":[{"id":76,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":78}]}}},{"id":87,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":86,"kind":"lambda","params":[{"id":83,"name":"__DogParam"}],"qualifier":"def","expr":{"id":85,"kind":"app","opcode":"variant","args":[{"id":82,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":84}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":88,"kind":"const","name":"MyUnionType"},"id":89},{"id":260,"kind":"def","name":"G","qualifier":"def","expr":{"id":259,"kind":"lambda","params":[{"id":253,"name":"x"}],"qualifier":"def","expr":{"id":258,"kind":"app","opcode":"and","args":[{"id":255,"kind":"app","opcode":"F","args":[{"id":254,"kind":"name","name":"x"}]},{"id":257,"kind":"app","opcode":"not","args":[{"id":256,"kind":"name","name":"x"}]}]}}},{"id":268,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":267,"kind":"lambda","params":[{"id":261,"name":"x"}],"qualifier":"def","expr":{"id":266,"kind":"app","opcode":"and","args":[{"id":263,"kind":"app","opcode":"F","args":[{"id":262,"kind":"name","name":"x"}]},{"id":265,"kind":"app","opcode":"not","args":[{"id":264,"kind":"name","name":"x"}]}]}}},{"id":276,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":275,"kind":"lambda","params":[{"id":269,"name":"x"}],"qualifier":"def","expr":{"id":274,"kind":"app","opcode":"or","args":[{"id":271,"kind":"app","opcode":"F","args":[{"id":270,"kind":"name","name":"x"}]},{"id":273,"kind":"app","opcode":"not","args":[{"id":272,"kind":"name","name":"x"}]}]}}},{"id":368,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":367,"kind":"app","opcode":"map","args":[{"id":351,"kind":"app","opcode":"tuples","args":[{"id":349,"kind":"name","name":"S"},{"id":350,"kind":"name","name":"MySet"}]},{"id":366,"kind":"lambda","params":[{"id":357,"name":"quintTupledLambdaParam357"}],"qualifier":"def","expr":{"id":362,"kind":"let","opdef":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]}},"expr":{"id":358,"kind":"let","opdef":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]}},"expr":{"id":356,"kind":"app","opcode":"iadd","args":[{"id":354,"kind":"name","name":"s"},{"id":355,"kind":"name","name":"mys"}]}}}}]}},{"id":380,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":379,"kind":"let","opdef":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]}},"expr":{"id":378,"kind":"app","opcode":"actionAll","args":[{"id":374,"kind":"app","opcode":"igt","args":[{"id":372,"kind":"name","name":"x"},{"id":373,"kind":"int","value":10}]},{"id":377,"kind":"app","opcode":"assign","args":[{"id":376,"kind":"name","name":"k"},{"id":375,"kind":"name","name":"x"}]}]}}}]}],"table":{"69":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"72":{"id":71,"name":"__CircleParam","kind":"param"},"78":{"id":77,"name":"__RectangleParam","kind":"param"},"84":{"id":83,"name":"__DogParam","kind":"param"},"88":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"157":{"id":156,"name":"x","kind":"param"},"168":{"id":167,"kind":"typedef","name":"PROC"},"178":{"id":176,"name":"x","kind":"param"},"179":{"id":177,"name":"y","kind":"param"},"184":{"id":183,"name":"factor","kind":"param"},"185":{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173},"190":{"id":189,"name":"x","kind":"param"},"191":{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173},"196":{"id":195,"name":"x","kind":"param"},"206":{"id":200,"name":"x","kind":"param"},"207":{"id":201,"name":"y","kind":"param"},"215":{"id":211,"name":"x","kind":"param"},"221":{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219},"229":{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"},"kind":"param"},"230":{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"},"kind":"param"},"232":{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"},"kind":"param"},"233":{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"},"kind":"param"},"250":{"id":249,"name":"x","kind":"param"},"254":{"id":253,"name":"x","kind":"param"},"255":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"256":{"id":253,"name":"x","kind":"param"},"262":{"id":261,"name":"x","kind":"param"},"263":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"264":{"id":261,"name":"x","kind":"param"},"270":{"id":269,"name":"x","kind":"param"},"271":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"272":{"id":269,"name":"x","kind":"param"},"304":{"id":302,"name":"x","kind":"param"},"307":{"id":303,"name":"y","kind":"param"},"310":{"id":303,"name":"y","kind":"param"},"320":{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319},"331":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"335":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"341":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"343":{"id":342,"name":"x","kind":"param"},"349":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"350":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},"354":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]},"depth":1},"355":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]},"depth":1},"360":{"id":357,"name":"quintTupledLambdaParam357","kind":"param"},"364":{"id":357,"name":"quintTupledLambdaParam357","kind":"param"},"369":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"372":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"375":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"376":{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219},"381":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"387":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"389":{"id":388,"name":"x","kind":"param"},"395":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"453":{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]},"depth":0},"468":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]},"depth":1},"477":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]},"depth":1},"483":{"id":482,"name":"s","kind":"param"},"505":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"509":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"519":{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}}},"521":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"522":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":521,"importedFrom":{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/SuperSpec.map.json b/quint/testFixture/SuperSpec.map.json index f79f12375..789c2de56 100644 --- a/quint/testFixture/SuperSpec.map.json +++ b/quint/testFixture/SuperSpec.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/SuperSpec.qnt"},"map":{"1":[0,{"line":1,"col":12,"index":24},{"line":1,"col":12,"index":24}],"2":[0,{"line":1,"col":2,"index":14},{"line":1,"col":12,"index":24}],"3":[0,{"line":0,"col":0,"index":0},{"line":2,"col":26,"index":26}],"4":[0,{"line":5,"col":12,"index":53},{"line":5,"col":12,"index":53}],"5":[0,{"line":5,"col":2,"index":43},{"line":5,"col":12,"index":53}],"6":[0,{"line":4,"col":0,"index":29},{"line":6,"col":26,"index":55}],"7":[0,{"line":9,"col":11,"index":84},{"line":9,"col":13,"index":86}],"8":[0,{"line":9,"col":2,"index":75},{"line":9,"col":13,"index":86}],"9":[0,{"line":10,"col":9,"index":97},{"line":10,"col":11,"index":99}],"10":[0,{"line":10,"col":2,"index":90},{"line":10,"col":11,"index":99}],"11":[0,{"line":8,"col":0,"index":58},{"line":11,"col":43,"index":101}],"12":[0,{"line":16,"col":11,"index":186},{"line":16,"col":13,"index":188}],"13":[0,{"line":16,"col":2,"index":177},{"line":16,"col":13,"index":188}],"14":[0,{"line":17,"col":15,"index":205},{"line":17,"col":17,"index":207}],"15":[0,{"line":17,"col":11,"index":201},{"line":17,"col":18,"index":208}],"16":[0,{"line":17,"col":2,"index":192},{"line":17,"col":18,"index":208}],"17":[0,{"line":18,"col":19,"index":229},{"line":18,"col":21,"index":231}],"18":[0,{"line":18,"col":15,"index":225},{"line":18,"col":22,"index":232}],"19":[0,{"line":18,"col":2,"index":212},{"line":18,"col":22,"index":232}],"20":[0,{"line":19,"col":20,"index":254},{"line":19,"col":23,"index":257}],"21":[0,{"line":19,"col":15,"index":249},{"line":19,"col":24,"index":258}],"22":[0,{"line":19,"col":2,"index":236},{"line":19,"col":24,"index":258}],"23":[0,{"line":20,"col":15,"index":275},{"line":20,"col":17,"index":277}],"24":[0,{"line":20,"col":22,"index":282},{"line":20,"col":24,"index":284}],"25":[0,{"line":20,"col":15,"index":275},{"line":20,"col":24,"index":284}],"26":[0,{"line":20,"col":2,"index":262},{"line":20,"col":24,"index":284}],"27":[0,{"line":21,"col":19,"index":305},{"line":21,"col":21,"index":307}],"28":[0,{"line":21,"col":26,"index":312},{"line":21,"col":28,"index":314}],"29":[0,{"line":21,"col":19,"index":305},{"line":21,"col":28,"index":314}],"30":[0,{"line":21,"col":34,"index":320},{"line":21,"col":37,"index":323}],"31":[0,{"line":21,"col":18,"index":304},{"line":21,"col":37,"index":323}],"32":[0,{"line":21,"col":2,"index":288},{"line":21,"col":37,"index":323}],"33":[0,{"line":22,"col":21,"index":346},{"line":22,"col":23,"index":348}],"34":[0,{"line":22,"col":26,"index":351},{"line":22,"col":28,"index":353}],"35":[0,{"line":22,"col":34,"index":359},{"line":22,"col":37,"index":362}],"36":[0,{"line":22,"col":20,"index":345},{"line":22,"col":37,"index":362}],"37":[0,{"line":22,"col":2,"index":327},{"line":22,"col":37,"index":362}],"38":[0,{"line":23,"col":30,"index":394},{"line":23,"col":32,"index":396}],"39":[0,{"line":23,"col":35,"index":399},{"line":23,"col":37,"index":401}],"40":[0,{"line":23,"col":45,"index":409},{"line":23,"col":48,"index":412}],"41":[0,{"line":23,"col":29,"index":393},{"line":23,"col":48,"index":412}],"42":[0,{"line":23,"col":2,"index":366},{"line":23,"col":48,"index":412}],"43":[0,{"line":24,"col":18,"index":432},{"line":24,"col":20,"index":434}],"44":[0,{"line":24,"col":23,"index":437},{"line":24,"col":26,"index":440}],"45":[0,{"line":24,"col":29,"index":443},{"line":24,"col":31,"index":445}],"46":[0,{"line":24,"col":17,"index":431},{"line":24,"col":32,"index":446}],"47":[0,{"line":24,"col":2,"index":416},{"line":24,"col":32,"index":446}],"48":[0,{"line":25,"col":27,"index":475},{"line":25,"col":29,"index":477}],"49":[0,{"line":25,"col":32,"index":480},{"line":25,"col":35,"index":483}],"50":[0,{"line":25,"col":38,"index":486},{"line":25,"col":40,"index":488}],"51":[0,{"line":25,"col":26,"index":474},{"line":25,"col":43,"index":491}],"52":[0,{"line":25,"col":2,"index":450},{"line":25,"col":43,"index":491}],"53":[0,{"line":28,"col":23,"index":580},{"line":28,"col":25,"index":582}],"54":[0,{"line":28,"col":31,"index":588},{"line":28,"col":34,"index":591}],"55":[0,{"line":28,"col":40,"index":597},{"line":28,"col":42,"index":599}],"56":[0,{"line":28,"col":18,"index":575},{"line":28,"col":44,"index":601}],"57":[0,{"line":28,"col":2,"index":559},{"line":28,"col":44,"index":601}],"58":[0,{"line":29,"col":32,"index":635},{"line":29,"col":34,"index":637}],"59":[0,{"line":29,"col":40,"index":643},{"line":29,"col":43,"index":646}],"60":[0,{"line":29,"col":49,"index":652},{"line":29,"col":51,"index":654}],"61":[0,{"line":29,"col":27,"index":630},{"line":29,"col":54,"index":657}],"62":[0,{"line":29,"col":2,"index":605},{"line":29,"col":54,"index":657}],"63":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"64":[0,{"line":34,"col":26,"index":777},{"line":34,"col":28,"index":779}],"65":[0,{"line":34,"col":39,"index":790},{"line":34,"col":41,"index":792}],"66":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"67":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"68":[0,{"line":32,"col":2,"index":712},{"line":35,"col":102,"index":812}],"69":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"70":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"71":[0,{"line":33,"col":8,"index":739},{"line":33,"col":13,"index":744}],"72":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"73":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"74":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"75":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"76":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"77":[0,{"line":34,"col":8,"index":759},{"line":34,"col":16,"index":767}],"78":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"79":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"80":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"81":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"82":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"83":[0,{"line":35,"col":8,"index":805},{"line":35,"col":10,"index":807}],"84":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"85":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"86":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"87":[0,{"line":36,"col":17,"index":831},{"line":36,"col":27,"index":841}],"88":[0,{"line":36,"col":2,"index":816},{"line":36,"col":27,"index":841}],"89":[0,{"line":41,"col":9,"index":955},{"line":41,"col":11,"index":957}],"90":[0,{"line":41,"col":2,"index":948},{"line":41,"col":11,"index":957}],"91":[0,{"line":42,"col":9,"index":968},{"line":42,"col":12,"index":971}],"92":[0,{"line":42,"col":2,"index":961},{"line":42,"col":12,"index":971}],"93":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":19,"index":1140}],"94":[0,{"line":47,"col":23,"index":1144},{"line":47,"col":23,"index":1144}],"95":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":23,"index":1144}],"96":[0,{"line":47,"col":2,"index":1123},{"line":47,"col":23,"index":1144}],"97":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":19,"index":1165}],"98":[0,{"line":48,"col":23,"index":1169},{"line":48,"col":23,"index":1169}],"99":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":23,"index":1169}],"100":[0,{"line":48,"col":2,"index":1148},{"line":48,"col":23,"index":1169}],"101":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":19,"index":1190}],"102":[0,{"line":49,"col":23,"index":1194},{"line":49,"col":23,"index":1194}],"103":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":23,"index":1194}],"104":[0,{"line":49,"col":2,"index":1173},{"line":49,"col":23,"index":1194}],"105":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":19,"index":1215}],"106":[0,{"line":50,"col":23,"index":1219},{"line":50,"col":23,"index":1219}],"107":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":23,"index":1219}],"108":[0,{"line":50,"col":2,"index":1198},{"line":50,"col":23,"index":1219}],"109":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":19,"index":1240}],"110":[0,{"line":51,"col":23,"index":1244},{"line":51,"col":23,"index":1244}],"111":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":23,"index":1244}],"112":[0,{"line":51,"col":2,"index":1223},{"line":51,"col":23,"index":1244}],"113":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":19,"index":1265}],"114":[0,{"line":52,"col":21,"index":1267},{"line":52,"col":21,"index":1267}],"115":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":21,"index":1267}],"116":[0,{"line":52,"col":2,"index":1248},{"line":52,"col":21,"index":1267}],"117":[0,{"line":53,"col":16,"index":1285},{"line":53,"col":18,"index":1287}],"118":[0,{"line":53,"col":15,"index":1284},{"line":53,"col":18,"index":1287}],"119":[0,{"line":53,"col":2,"index":1271},{"line":53,"col":18,"index":1287}],"120":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":18,"index":1307}],"121":[0,{"line":54,"col":22,"index":1311},{"line":54,"col":22,"index":1311}],"122":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":22,"index":1311}],"123":[0,{"line":54,"col":2,"index":1291},{"line":54,"col":22,"index":1311}],"124":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":18,"index":1331}],"125":[0,{"line":55,"col":23,"index":1336},{"line":55,"col":23,"index":1336}],"126":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":23,"index":1336}],"127":[0,{"line":55,"col":2,"index":1315},{"line":55,"col":23,"index":1336}],"128":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":18,"index":1356}],"129":[0,{"line":56,"col":22,"index":1360},{"line":56,"col":22,"index":1360}],"130":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":22,"index":1360}],"131":[0,{"line":56,"col":2,"index":1340},{"line":56,"col":22,"index":1360}],"132":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":18,"index":1380}],"133":[0,{"line":57,"col":23,"index":1385},{"line":57,"col":23,"index":1385}],"134":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":23,"index":1385}],"135":[0,{"line":57,"col":2,"index":1364},{"line":57,"col":23,"index":1385}],"136":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":20,"index":1407}],"137":[0,{"line":58,"col":25,"index":1412},{"line":58,"col":25,"index":1412}],"138":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":25,"index":1412}],"139":[0,{"line":58,"col":2,"index":1389},{"line":58,"col":25,"index":1412}],"140":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":18,"index":1432}],"141":[0,{"line":59,"col":23,"index":1437},{"line":59,"col":23,"index":1437}],"142":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":23,"index":1437}],"143":[0,{"line":59,"col":2,"index":1416},{"line":59,"col":23,"index":1437}],"144":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":6,"index":1464}],"145":[0,{"line":61,"col":10,"index":1468},{"line":61,"col":10,"index":1468}],"146":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":10,"index":1468}],"147":[0,{"line":61,"col":15,"index":1473},{"line":61,"col":15,"index":1473}],"148":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":15,"index":1473}],"149":[0,{"line":60,"col":2,"index":1441},{"line":62,"col":38,"index":1477}],"150":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":25,"index":1504}],"151":[0,{"line":63,"col":30,"index":1509},{"line":63,"col":32,"index":1511}],"152":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":33,"index":1512}],"153":[0,{"line":63,"col":2,"index":1481},{"line":63,"col":33,"index":1512}],"154":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":26,"index":1540}],"155":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":35,"index":1549}],"156":[0,{"line":64,"col":40,"index":1554},{"line":64,"col":40,"index":1554}],"157":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":40,"index":1554}],"158":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":41,"index":1555}],"159":[0,{"line":64,"col":2,"index":1516},{"line":64,"col":41,"index":1555}],"160":[0,{"line":67,"col":20,"index":1594},{"line":67,"col":22,"index":1596}],"161":[0,{"line":67,"col":16,"index":1590},{"line":67,"col":23,"index":1597}],"162":[0,{"line":67,"col":31,"index":1605},{"line":67,"col":31,"index":1605}],"163":[0,{"line":67,"col":34,"index":1608},{"line":67,"col":34,"index":1608}],"164":[0,{"line":67,"col":27,"index":1601},{"line":67,"col":35,"index":1609}],"165":[0,{"line":67,"col":2,"index":1576},{"line":67,"col":35,"index":1609}],"166":[0,{"line":69,"col":2,"index":1648},{"line":69,"col":10,"index":1656}],"167":[0,{"line":70,"col":33,"index":1691},{"line":70,"col":36,"index":1694}],"168":[0,{"line":70,"col":29,"index":1687},{"line":70,"col":37,"index":1695}],"169":[0,{"line":70,"col":41,"index":1699},{"line":70,"col":45,"index":1703}],"170":[0,{"line":70,"col":2,"index":1660},{"line":70,"col":45,"index":1703}],"171":[0,{"line":73,"col":9,"index":1741},{"line":73,"col":11,"index":1743}],"172":[0,{"line":73,"col":2,"index":1734},{"line":73,"col":11,"index":1743}],"173":[0,{"line":74,"col":25,"index":1770},{"line":74,"col":26,"index":1771}],"174":[0,{"line":74,"col":2,"index":1747},{"line":74,"col":26,"index":1771}],"175":[0,{"line":75,"col":15,"index":1788},{"line":75,"col":15,"index":1788}],"176":[0,{"line":75,"col":18,"index":1791},{"line":75,"col":18,"index":1791}],"177":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":23,"index":1796}],"178":[0,{"line":75,"col":27,"index":1800},{"line":75,"col":27,"index":1800}],"179":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":27,"index":1800}],"180":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"181":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"182":[0,{"line":76,"col":10,"index":1812},{"line":76,"col":15,"index":1817}],"183":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":25,"index":1827}],"184":[0,{"line":76,"col":29,"index":1831},{"line":76,"col":29,"index":1831}],"185":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":29,"index":1831}],"186":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"187":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"188":[0,{"line":77,"col":11,"index":1844},{"line":77,"col":11,"index":1844}],"189":[0,{"line":77,"col":21,"index":1854},{"line":77,"col":21,"index":1854}],"190":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"191":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"192":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"193":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"194":[0,{"line":78,"col":13,"index":1869},{"line":78,"col":13,"index":1869}],"195":[0,{"line":78,"col":22,"index":1878},{"line":78,"col":22,"index":1878}],"196":[0,{"line":78,"col":18,"index":1874},{"line":78,"col":23,"index":1879}],"197":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"198":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"199":[0,{"line":81,"col":8,"index":1911},{"line":81,"col":8,"index":1911}],"200":[0,{"line":81,"col":11,"index":1914},{"line":81,"col":11,"index":1914}],"201":[0,{"line":81,"col":16,"index":1919},{"line":81,"col":18,"index":1921}],"202":[0,{"line":81,"col":21,"index":1924},{"line":81,"col":23,"index":1926}],"203":[0,{"line":81,"col":29,"index":1932},{"line":81,"col":31,"index":1934}],"204":[0,{"line":81,"col":15,"index":1918},{"line":81,"col":31,"index":1934}],"205":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":6,"index":1946}],"206":[0,{"line":82,"col":10,"index":1950},{"line":82,"col":10,"index":1950}],"207":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":10,"index":1950}],"208":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"209":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"210":[0,{"line":85,"col":10,"index":1997},{"line":85,"col":10,"index":1997}],"211":[0,{"line":85,"col":15,"index":2002},{"line":85,"col":15,"index":2002}],"212":[0,{"line":85,"col":21,"index":2008},{"line":85,"col":21,"index":2008}],"213":[0,{"line":85,"col":14,"index":2001},{"line":85,"col":21,"index":2008}],"214":[0,{"line":86,"col":6,"index":2020},{"line":86,"col":6,"index":2020}],"215":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"216":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"217":[0,{"line":89,"col":9,"index":2036},{"line":89,"col":11,"index":2038}],"218":[0,{"line":89,"col":2,"index":2029},{"line":89,"col":11,"index":2038}],"219":[0,{"line":90,"col":21,"index":2061},{"line":90,"col":21,"index":2061}],"220":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"221":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"222":[0,{"line":90,"col":2,"index":2042},{"line":90,"col":21,"index":2061}],"223":[0,{"line":93,"col":18,"index":2116},{"line":93,"col":20,"index":2118}],"224":[0,{"line":93,"col":15,"index":2113},{"line":93,"col":20,"index":2118}],"225":[0,{"line":93,"col":26,"index":2124},{"line":93,"col":28,"index":2126}],"226":[0,{"line":93,"col":23,"index":2121},{"line":93,"col":28,"index":2126}],"227":[0,{"line":93,"col":32,"index":2130},{"line":93,"col":34,"index":2132}],"228":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":8,"index":2146}],"229":[0,{"line":94,"col":12,"index":2150},{"line":94,"col":12,"index":2150}],"230":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":12,"index":2150}],"231":[0,{"line":95,"col":4,"index":2157},{"line":95,"col":4,"index":2157}],"232":[0,{"line":96,"col":9,"index":2168},{"line":96,"col":9,"index":2168}],"233":[0,{"line":94,"col":4,"index":2142},{"line":96,"col":30,"index":2168}],"234":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"235":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"236":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":21,"index":2220}],"237":[0,{"line":101,"col":27,"index":2226},{"line":101,"col":30,"index":2229}],"238":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":30,"index":2229}],"239":[0,{"line":101,"col":2,"index":2201},{"line":101,"col":30,"index":2229}],"240":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":20,"index":2251}],"241":[0,{"line":102,"col":25,"index":2256},{"line":102,"col":28,"index":2259}],"242":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":28,"index":2259}],"243":[0,{"line":102,"col":2,"index":2233},{"line":102,"col":28,"index":2259}],"244":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":25,"index":2286}],"245":[0,{"line":103,"col":35,"index":2296},{"line":103,"col":38,"index":2299}],"246":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":38,"index":2299}],"247":[0,{"line":103,"col":2,"index":2263},{"line":103,"col":38,"index":2299}],"248":[0,{"line":104,"col":8,"index":2309},{"line":104,"col":8,"index":2309}],"249":[0,{"line":104,"col":13,"index":2314},{"line":104,"col":13,"index":2314}],"250":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"251":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"252":[0,{"line":105,"col":8,"index":2324},{"line":105,"col":8,"index":2324}],"253":[0,{"line":105,"col":15,"index":2331},{"line":105,"col":15,"index":2331}],"254":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":16,"index":2332}],"255":[0,{"line":105,"col":26,"index":2342},{"line":105,"col":26,"index":2342}],"256":[0,{"line":105,"col":22,"index":2338},{"line":105,"col":27,"index":2343}],"257":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":27,"index":2343}],"258":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"259":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"260":[0,{"line":106,"col":19,"index":2364},{"line":106,"col":19,"index":2364}],"261":[0,{"line":106,"col":26,"index":2371},{"line":106,"col":26,"index":2371}],"262":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":27,"index":2372}],"263":[0,{"line":106,"col":37,"index":2382},{"line":106,"col":37,"index":2382}],"264":[0,{"line":106,"col":33,"index":2378},{"line":106,"col":38,"index":2383}],"265":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":38,"index":2383}],"266":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"267":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"268":[0,{"line":107,"col":18,"index":2403},{"line":107,"col":18,"index":2403}],"269":[0,{"line":107,"col":25,"index":2410},{"line":107,"col":25,"index":2410}],"270":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":26,"index":2411}],"271":[0,{"line":107,"col":35,"index":2420},{"line":107,"col":35,"index":2420}],"272":[0,{"line":107,"col":31,"index":2416},{"line":107,"col":36,"index":2421}],"273":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":36,"index":2421}],"274":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"275":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"276":[0,{"line":110,"col":6,"index":2459},{"line":110,"col":10,"index":2463}],"277":[0,{"line":111,"col":6,"index":2472},{"line":111,"col":9,"index":2475}],"278":[0,{"line":112,"col":6,"index":2484},{"line":112,"col":10,"index":2488}],"279":[0,{"line":109,"col":23,"index":2447},{"line":113,"col":68,"index":2492}],"280":[0,{"line":109,"col":2,"index":2426},{"line":113,"col":68,"index":2492}],"281":[0,{"line":116,"col":6,"index":2534},{"line":116,"col":10,"index":2538}],"282":[0,{"line":117,"col":6,"index":2547},{"line":117,"col":9,"index":2550}],"283":[0,{"line":118,"col":6,"index":2559},{"line":118,"col":10,"index":2563}],"284":[0,{"line":115,"col":27,"index":2522},{"line":119,"col":72,"index":2567}],"285":[0,{"line":115,"col":2,"index":2497},{"line":119,"col":72,"index":2567}],"286":[0,{"line":122,"col":6,"index":2603},{"line":122,"col":10,"index":2607}],"287":[0,{"line":123,"col":6,"index":2616},{"line":123,"col":9,"index":2619}],"288":[0,{"line":124,"col":6,"index":2628},{"line":124,"col":10,"index":2632}],"289":[0,{"line":121,"col":22,"index":2592},{"line":125,"col":66,"index":2636}],"290":[0,{"line":121,"col":2,"index":2572},{"line":125,"col":66,"index":2636}],"291":[0,{"line":128,"col":6,"index":2677},{"line":128,"col":10,"index":2681}],"292":[0,{"line":129,"col":6,"index":2690},{"line":129,"col":9,"index":2693}],"293":[0,{"line":130,"col":6,"index":2702},{"line":130,"col":10,"index":2706}],"294":[0,{"line":127,"col":26,"index":2665},{"line":131,"col":71,"index":2710}],"295":[0,{"line":127,"col":2,"index":2641},{"line":131,"col":71,"index":2710}],"296":[0,{"line":133,"col":21,"index":2734},{"line":133,"col":24,"index":2737}],"297":[0,{"line":133,"col":27,"index":2740},{"line":133,"col":27,"index":2740}],"298":[0,{"line":133,"col":34,"index":2747},{"line":133,"col":34,"index":2747}],"299":[0,{"line":133,"col":17,"index":2730},{"line":133,"col":34,"index":2747}],"300":[0,{"line":133,"col":2,"index":2715},{"line":133,"col":34,"index":2747}],"301":[0,{"line":134,"col":16,"index":2765},{"line":134,"col":16,"index":2765}],"302":[0,{"line":134,"col":19,"index":2768},{"line":134,"col":19,"index":2768}],"303":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":28,"index":2777}],"304":[0,{"line":134,"col":32,"index":2781},{"line":134,"col":33,"index":2782}],"305":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":33,"index":2782}],"306":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":36,"index":2785}],"307":[0,{"line":134,"col":40,"index":2789},{"line":134,"col":40,"index":2789}],"308":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":40,"index":2789}],"309":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":47,"index":2796}],"310":[0,{"line":134,"col":51,"index":2800},{"line":134,"col":51,"index":2800}],"311":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":51,"index":2800}],"312":[0,{"line":134,"col":24,"index":2773},{"line":134,"col":51,"index":2800}],"313":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"314":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"315":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":12,"index":2841}],"316":[0,{"line":137,"col":17,"index":2846},{"line":137,"col":19,"index":2848}],"317":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":19,"index":2848}],"318":[0,{"line":137,"col":2,"index":2831},{"line":137,"col":19,"index":2848}],"319":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":16,"index":2866}],"320":[0,{"line":138,"col":22,"index":2872},{"line":138,"col":24,"index":2874}],"321":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":25,"index":2875}],"322":[0,{"line":138,"col":2,"index":2852},{"line":138,"col":25,"index":2875}],"323":[0,{"line":141,"col":13,"index":2939},{"line":141,"col":13,"index":2939}],"324":[0,{"line":141,"col":16,"index":2942},{"line":141,"col":16,"index":2942}],"325":[0,{"line":141,"col":21,"index":2947},{"line":141,"col":21,"index":2947}],"326":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"327":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"328":[0,{"line":142,"col":31,"index":2980},{"line":142,"col":33,"index":2982}],"329":[0,{"line":142,"col":36,"index":2985},{"line":142,"col":37,"index":2986}],"330":[0,{"line":142,"col":24,"index":2973},{"line":142,"col":38,"index":2987}],"331":[0,{"line":142,"col":2,"index":2951},{"line":142,"col":38,"index":2987}],"332":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":24,"index":3013}],"333":[0,{"line":143,"col":33,"index":3022},{"line":143,"col":34,"index":3023}],"334":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":35,"index":3024}],"335":[0,{"line":143,"col":2,"index":2991},{"line":143,"col":35,"index":3024}],"336":[0,{"line":145,"col":19,"index":3102},{"line":145,"col":19,"index":3102}],"337":[0,{"line":145,"col":22,"index":3105},{"line":145,"col":26,"index":3109}],"338":[0,{"line":145,"col":16,"index":3099},{"line":145,"col":27,"index":3110}],"339":[0,{"line":145,"col":2,"index":3085},{"line":145,"col":27,"index":3110}],"340":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":22,"index":3279}],"341":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":31,"index":3288}],"342":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":36,"index":3293}],"343":[0,{"line":150,"col":40,"index":3297},{"line":150,"col":41,"index":3298}],"344":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":41,"index":3298}],"345":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":41,"index":3298}],"346":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":42,"index":3299}],"347":[0,{"line":150,"col":2,"index":3259},{"line":150,"col":42,"index":3299}],"348":[0,{"line":152,"col":25,"index":3356},{"line":152,"col":25,"index":3356}],"349":[0,{"line":152,"col":28,"index":3359},{"line":152,"col":32,"index":3363}],"350":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":33,"index":3364}],"351":[0,{"line":152,"col":42,"index":3373},{"line":152,"col":42,"index":3373}],"352":[0,{"line":152,"col":45,"index":3376},{"line":152,"col":47,"index":3378}],"353":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":54,"index":3385}],"354":[0,{"line":152,"col":58,"index":3389},{"line":152,"col":60,"index":3391}],"355":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":60,"index":3391}],"356":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"357":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"358":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"359":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"360":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"361":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"362":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"363":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"364":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"365":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"366":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":62,"index":3393}],"367":[0,{"line":152,"col":2,"index":3333},{"line":152,"col":62,"index":3393}],"368":[0,{"line":155,"col":21,"index":3458},{"line":155,"col":21,"index":3458}],"369":[0,{"line":155,"col":15,"index":3452},{"line":155,"col":22,"index":3459}],"370":[0,{"line":155,"col":4,"index":3441},{"line":155,"col":22,"index":3459}],"371":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":6,"index":3477}],"372":[0,{"line":157,"col":10,"index":3481},{"line":157,"col":11,"index":3482}],"373":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":11,"index":3482}],"374":[0,{"line":158,"col":11,"index":3496},{"line":158,"col":11,"index":3496}],"375":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"376":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"377":[0,{"line":156,"col":4,"index":3465},{"line":159,"col":41,"index":3502}],"378":[0,{"line":155,"col":4,"index":3441},{"line":159,"col":65,"index":3502}],"379":[0,{"line":154,"col":2,"index":3414},{"line":160,"col":94,"index":3506}],"380":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":22,"index":3545}],"381":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":31,"index":3554}],"382":[0,{"line":162,"col":36,"index":3559},{"line":162,"col":39,"index":3562}],"383":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":39,"index":3562}],"384":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":40,"index":3563}],"385":[0,{"line":162,"col":2,"index":3525},{"line":162,"col":40,"index":3563}],"386":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":10,"index":3576}],"387":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":18,"index":3584}],"388":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":23,"index":3589}],"389":[0,{"line":164,"col":27,"index":3593},{"line":164,"col":27,"index":3593}],"390":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":27,"index":3593}],"391":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":27,"index":3593}],"392":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":28,"index":3594}],"393":[0,{"line":164,"col":2,"index":3568},{"line":164,"col":28,"index":3594}],"394":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":23,"index":3620}],"395":[0,{"line":166,"col":37,"index":3634},{"line":166,"col":37,"index":3634}],"396":[0,{"line":166,"col":40,"index":3637},{"line":166,"col":40,"index":3637}],"397":[0,{"line":166,"col":33,"index":3630},{"line":166,"col":41,"index":3638}],"398":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":42,"index":3639}],"399":[0,{"line":166,"col":2,"index":3599},{"line":166,"col":42,"index":3639}],"400":[0,{"line":169,"col":17,"index":3698},{"line":169,"col":17,"index":3698}],"401":[0,{"line":169,"col":20,"index":3701},{"line":169,"col":20,"index":3701}],"402":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":21,"index":3702}],"403":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":28,"index":3709}],"404":[0,{"line":169,"col":2,"index":3683},{"line":169,"col":28,"index":3709}],"405":[0,{"line":172,"col":20,"index":3753},{"line":172,"col":20,"index":3753}],"406":[0,{"line":172,"col":23,"index":3756},{"line":172,"col":23,"index":3756}],"407":[0,{"line":172,"col":26,"index":3759},{"line":172,"col":26,"index":3759}],"408":[0,{"line":172,"col":19,"index":3752},{"line":172,"col":27,"index":3760}],"409":[0,{"line":172,"col":2,"index":3735},{"line":172,"col":27,"index":3760}],"410":[0,{"line":173,"col":24,"index":3786},{"line":173,"col":24,"index":3786}],"411":[0,{"line":173,"col":27,"index":3789},{"line":173,"col":27,"index":3789}],"412":[0,{"line":173,"col":30,"index":3792},{"line":173,"col":30,"index":3792}],"413":[0,{"line":173,"col":20,"index":3782},{"line":173,"col":31,"index":3793}],"414":[0,{"line":173,"col":2,"index":3764},{"line":173,"col":31,"index":3793}],"415":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":18,"index":3813}],"416":[0,{"line":174,"col":23,"index":3818},{"line":174,"col":23,"index":3818}],"417":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":23,"index":3818}],"418":[0,{"line":174,"col":2,"index":3797},{"line":174,"col":23,"index":3818}],"419":[0,{"line":175,"col":19,"index":3839},{"line":175,"col":19,"index":3839}],"420":[0,{"line":175,"col":22,"index":3842},{"line":175,"col":22,"index":3842}],"421":[0,{"line":175,"col":25,"index":3845},{"line":175,"col":25,"index":3845}],"422":[0,{"line":175,"col":18,"index":3838},{"line":175,"col":26,"index":3846}],"423":[0,{"line":175,"col":2,"index":3822},{"line":175,"col":26,"index":3846}],"424":[0,{"line":176,"col":24,"index":3872},{"line":176,"col":24,"index":3872}],"425":[0,{"line":176,"col":27,"index":3875},{"line":176,"col":27,"index":3875}],"426":[0,{"line":176,"col":30,"index":3878},{"line":176,"col":30,"index":3878}],"427":[0,{"line":176,"col":19,"index":3867},{"line":176,"col":31,"index":3879}],"428":[0,{"line":176,"col":2,"index":3850},{"line":176,"col":31,"index":3879}],"429":[0,{"line":177,"col":23,"index":3904},{"line":177,"col":23,"index":3904}],"430":[0,{"line":177,"col":26,"index":3907},{"line":177,"col":26,"index":3907}],"431":[0,{"line":177,"col":29,"index":3910},{"line":177,"col":29,"index":3910}],"432":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":30,"index":3911}],"433":[0,{"line":177,"col":32,"index":3913},{"line":177,"col":32,"index":3913}],"434":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":33,"index":3914}],"435":[0,{"line":177,"col":2,"index":3883},{"line":177,"col":33,"index":3914}],"436":[0,{"line":178,"col":28,"index":3944},{"line":178,"col":33,"index":3949}],"437":[0,{"line":178,"col":22,"index":3938},{"line":178,"col":33,"index":3949}],"438":[0,{"line":178,"col":42,"index":3958},{"line":178,"col":45,"index":3961}],"439":[0,{"line":178,"col":36,"index":3952},{"line":178,"col":45,"index":3961}],"440":[0,{"line":178,"col":20,"index":3936},{"line":178,"col":47,"index":3963}],"441":[0,{"line":178,"col":2,"index":3918},{"line":178,"col":47,"index":3963}],"442":[0,{"line":179,"col":25,"index":3990},{"line":179,"col":30,"index":3995}],"443":[0,{"line":179,"col":33,"index":3998},{"line":179,"col":38,"index":4003}],"444":[0,{"line":179,"col":41,"index":4006},{"line":179,"col":46,"index":4011}],"445":[0,{"line":179,"col":49,"index":4014},{"line":179,"col":52,"index":4017}],"446":[0,{"line":179,"col":21,"index":3986},{"line":179,"col":53,"index":4018}],"447":[0,{"line":179,"col":2,"index":3967},{"line":179,"col":53,"index":4018}],"448":[0,{"line":180,"col":29,"index":4049},{"line":180,"col":35,"index":4055}],"449":[0,{"line":180,"col":23,"index":4043},{"line":180,"col":35,"index":4055}],"450":[0,{"line":180,"col":44,"index":4064},{"line":180,"col":47,"index":4067}],"451":[0,{"line":180,"col":38,"index":4058},{"line":180,"col":47,"index":4067}],"452":[0,{"line":180,"col":53,"index":4073},{"line":180,"col":63,"index":4083}],"453":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"454":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"455":[0,{"line":180,"col":2,"index":4022},{"line":180,"col":65,"index":4085}],"456":[0,{"line":181,"col":21,"index":4108},{"line":181,"col":21,"index":4108}],"457":[0,{"line":181,"col":24,"index":4111},{"line":181,"col":24,"index":4111}],"458":[0,{"line":181,"col":27,"index":4114},{"line":181,"col":27,"index":4114}],"459":[0,{"line":181,"col":17,"index":4104},{"line":181,"col":28,"index":4115}],"460":[0,{"line":181,"col":2,"index":4089},{"line":181,"col":28,"index":4115}],"461":[0,{"line":185,"col":22,"index":4187},{"line":185,"col":22,"index":4187}],"462":[0,{"line":185,"col":19,"index":4184},{"line":185,"col":22,"index":4187}],"463":[0,{"line":185,"col":28,"index":4193},{"line":185,"col":32,"index":4197}],"464":[0,{"line":185,"col":25,"index":4190},{"line":185,"col":32,"index":4197}],"465":[0,{"line":185,"col":17,"index":4182},{"line":185,"col":34,"index":4199}],"466":[0,{"line":185,"col":4,"index":4169},{"line":185,"col":34,"index":4199}],"467":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":9,"index":4210}],"468":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"469":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"470":[0,{"line":185,"col":4,"index":4169},{"line":186,"col":47,"index":4212}],"471":[0,{"line":184,"col":2,"index":4149},{"line":186,"col":65,"index":4212}],"472":[0,{"line":189,"col":21,"index":4253},{"line":189,"col":23,"index":4255}],"473":[0,{"line":189,"col":26,"index":4258},{"line":189,"col":26,"index":4258}],"474":[0,{"line":189,"col":17,"index":4249},{"line":189,"col":27,"index":4259}],"475":[0,{"line":189,"col":4,"index":4236},{"line":189,"col":27,"index":4259}],"476":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":9,"index":4270}],"477":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"478":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"479":[0,{"line":189,"col":4,"index":4236},{"line":190,"col":41,"index":4273}],"480":[0,{"line":188,"col":2,"index":4217},{"line":190,"col":58,"index":4273}],"481":[0,{"line":192,"col":14,"index":4290},{"line":192,"col":14,"index":4290}],"482":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":19,"index":4295}],"483":[0,{"line":192,"col":24,"index":4300},{"line":192,"col":25,"index":4301}],"484":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":25,"index":4301}],"485":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"486":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"487":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":19,"index":4349}],"488":[0,{"line":195,"col":24,"index":4354},{"line":195,"col":28,"index":4358}],"489":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":29,"index":4359}],"490":[0,{"line":195,"col":2,"index":4332},{"line":195,"col":29,"index":4359}],"491":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":27,"index":4388}],"492":[0,{"line":196,"col":38,"index":4399},{"line":196,"col":42,"index":4403}],"493":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":43,"index":4404}],"494":[0,{"line":196,"col":2,"index":4363},{"line":196,"col":43,"index":4404}],"495":[0,{"line":197,"col":22,"index":4428},{"line":197,"col":22,"index":4428}],"496":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":23,"index":4429}],"497":[0,{"line":197,"col":41,"index":4447},{"line":197,"col":41,"index":4447}],"498":[0,{"line":197,"col":43,"index":4449},{"line":197,"col":43,"index":4449}],"499":[0,{"line":197,"col":45,"index":4451},{"line":197,"col":45,"index":4451}],"500":[0,{"line":197,"col":37,"index":4443},{"line":197,"col":46,"index":4452}],"501":[0,{"line":197,"col":28,"index":4434},{"line":197,"col":47,"index":4453}],"502":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":48,"index":4454}],"503":[0,{"line":197,"col":2,"index":4408},{"line":197,"col":48,"index":4454}],"504":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":20,"index":4501}],"505":[0,{"line":200,"col":24,"index":4505},{"line":200,"col":24,"index":4505}],"506":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":24,"index":4505}],"507":[0,{"line":200,"col":2,"index":4483},{"line":200,"col":24,"index":4505}],"508":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":13,"index":4549}],"509":[0,{"line":202,"col":18,"index":4554},{"line":202,"col":18,"index":4554}],"510":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":18,"index":4554}],"511":[0,{"line":202,"col":2,"index":4538},{"line":202,"col":18,"index":4554}],"512":[0,{"line":205,"col":2,"index":4572},{"line":205,"col":14,"index":4584}],"513":[0,{"line":206,"col":2,"index":4588},{"line":206,"col":12,"index":4598}],"514":[0,{"line":209,"col":21,"index":4636},{"line":209,"col":23,"index":4638}],"515":[0,{"line":209,"col":17,"index":4632},{"line":209,"col":24,"index":4639}],"516":[0,{"line":209,"col":2,"index":4617},{"line":209,"col":24,"index":4639}],"517":[0,{"line":211,"col":2,"index":4644},{"line":211,"col":24,"index":4666}],"518":[0,{"line":213,"col":10,"index":4679},{"line":213,"col":16,"index":4685}],"519":[0,{"line":213,"col":2,"index":4671},{"line":213,"col":16,"index":4685}],"520":[0,{"line":221,"col":19,"index":4906},{"line":221,"col":19,"index":4906}],"521":[0,{"line":221,"col":15,"index":4902},{"line":221,"col":15,"index":4902}],"522":[0,{"line":221,"col":2,"index":4889},{"line":221,"col":29,"index":4916}],"523":[0,{"line":14,"col":0,"index":140},{"line":225,"col":4855,"index":4995}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/SuperSpec.qnt"},"map":{"1":[0,{"line":1,"col":12,"index":24},{"line":1,"col":12,"index":24}],"2":[0,{"line":1,"col":2,"index":14},{"line":1,"col":12,"index":24}],"3":[0,{"line":0,"col":0,"index":0},{"line":2,"col":26,"index":26}],"4":[0,{"line":5,"col":12,"index":53},{"line":5,"col":12,"index":53}],"5":[0,{"line":5,"col":2,"index":43},{"line":5,"col":12,"index":53}],"6":[0,{"line":4,"col":0,"index":29},{"line":6,"col":26,"index":55}],"7":[0,{"line":9,"col":11,"index":84},{"line":9,"col":13,"index":86}],"8":[0,{"line":9,"col":2,"index":75},{"line":9,"col":13,"index":86}],"9":[0,{"line":10,"col":9,"index":97},{"line":10,"col":11,"index":99}],"10":[0,{"line":10,"col":2,"index":90},{"line":10,"col":11,"index":99}],"11":[0,{"line":8,"col":0,"index":58},{"line":11,"col":43,"index":101}],"12":[0,{"line":16,"col":11,"index":186},{"line":16,"col":13,"index":188}],"13":[0,{"line":16,"col":2,"index":177},{"line":16,"col":13,"index":188}],"14":[0,{"line":17,"col":15,"index":205},{"line":17,"col":17,"index":207}],"15":[0,{"line":17,"col":11,"index":201},{"line":17,"col":18,"index":208}],"16":[0,{"line":17,"col":2,"index":192},{"line":17,"col":18,"index":208}],"17":[0,{"line":18,"col":19,"index":229},{"line":18,"col":21,"index":231}],"18":[0,{"line":18,"col":15,"index":225},{"line":18,"col":22,"index":232}],"19":[0,{"line":18,"col":2,"index":212},{"line":18,"col":22,"index":232}],"20":[0,{"line":19,"col":20,"index":254},{"line":19,"col":23,"index":257}],"21":[0,{"line":19,"col":15,"index":249},{"line":19,"col":24,"index":258}],"22":[0,{"line":19,"col":2,"index":236},{"line":19,"col":24,"index":258}],"23":[0,{"line":20,"col":15,"index":275},{"line":20,"col":17,"index":277}],"24":[0,{"line":20,"col":22,"index":282},{"line":20,"col":24,"index":284}],"25":[0,{"line":20,"col":15,"index":275},{"line":20,"col":24,"index":284}],"26":[0,{"line":20,"col":2,"index":262},{"line":20,"col":24,"index":284}],"27":[0,{"line":21,"col":19,"index":305},{"line":21,"col":21,"index":307}],"28":[0,{"line":21,"col":26,"index":312},{"line":21,"col":28,"index":314}],"29":[0,{"line":21,"col":19,"index":305},{"line":21,"col":28,"index":314}],"30":[0,{"line":21,"col":34,"index":320},{"line":21,"col":37,"index":323}],"31":[0,{"line":21,"col":18,"index":304},{"line":21,"col":37,"index":323}],"32":[0,{"line":21,"col":2,"index":288},{"line":21,"col":37,"index":323}],"33":[0,{"line":22,"col":21,"index":346},{"line":22,"col":23,"index":348}],"34":[0,{"line":22,"col":26,"index":351},{"line":22,"col":28,"index":353}],"35":[0,{"line":22,"col":34,"index":359},{"line":22,"col":37,"index":362}],"36":[0,{"line":22,"col":20,"index":345},{"line":22,"col":37,"index":362}],"37":[0,{"line":22,"col":2,"index":327},{"line":22,"col":37,"index":362}],"38":[0,{"line":23,"col":30,"index":394},{"line":23,"col":32,"index":396}],"39":[0,{"line":23,"col":35,"index":399},{"line":23,"col":37,"index":401}],"40":[0,{"line":23,"col":45,"index":409},{"line":23,"col":48,"index":412}],"41":[0,{"line":23,"col":29,"index":393},{"line":23,"col":48,"index":412}],"42":[0,{"line":23,"col":2,"index":366},{"line":23,"col":48,"index":412}],"43":[0,{"line":24,"col":18,"index":432},{"line":24,"col":20,"index":434}],"44":[0,{"line":24,"col":23,"index":437},{"line":24,"col":26,"index":440}],"45":[0,{"line":24,"col":29,"index":443},{"line":24,"col":31,"index":445}],"46":[0,{"line":24,"col":17,"index":431},{"line":24,"col":32,"index":446}],"47":[0,{"line":24,"col":2,"index":416},{"line":24,"col":32,"index":446}],"48":[0,{"line":25,"col":27,"index":475},{"line":25,"col":29,"index":477}],"49":[0,{"line":25,"col":32,"index":480},{"line":25,"col":35,"index":483}],"50":[0,{"line":25,"col":38,"index":486},{"line":25,"col":40,"index":488}],"51":[0,{"line":25,"col":26,"index":474},{"line":25,"col":43,"index":491}],"52":[0,{"line":25,"col":2,"index":450},{"line":25,"col":43,"index":491}],"53":[0,{"line":28,"col":23,"index":580},{"line":28,"col":25,"index":582}],"54":[0,{"line":28,"col":31,"index":588},{"line":28,"col":34,"index":591}],"55":[0,{"line":28,"col":40,"index":597},{"line":28,"col":42,"index":599}],"56":[0,{"line":28,"col":18,"index":575},{"line":28,"col":44,"index":601}],"57":[0,{"line":28,"col":2,"index":559},{"line":28,"col":44,"index":601}],"58":[0,{"line":29,"col":32,"index":635},{"line":29,"col":34,"index":637}],"59":[0,{"line":29,"col":40,"index":643},{"line":29,"col":43,"index":646}],"60":[0,{"line":29,"col":49,"index":652},{"line":29,"col":51,"index":654}],"61":[0,{"line":29,"col":27,"index":630},{"line":29,"col":54,"index":657}],"62":[0,{"line":29,"col":2,"index":605},{"line":29,"col":54,"index":657}],"63":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"64":[0,{"line":34,"col":26,"index":777},{"line":34,"col":28,"index":779}],"65":[0,{"line":34,"col":39,"index":790},{"line":34,"col":41,"index":792}],"66":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"67":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"68":[0,{"line":32,"col":2,"index":712},{"line":35,"col":102,"index":812}],"69":[0,{"line":32,"col":2,"index":712},{"line":35,"col":102,"index":812}],"70":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"71":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"72":[0,{"line":33,"col":8,"index":739},{"line":33,"col":13,"index":744}],"73":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"74":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"75":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"76":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"77":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"78":[0,{"line":34,"col":8,"index":759},{"line":34,"col":16,"index":767}],"79":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"80":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"81":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"82":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"83":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"84":[0,{"line":35,"col":8,"index":805},{"line":35,"col":10,"index":807}],"85":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"86":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"87":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"88":[0,{"line":36,"col":17,"index":831},{"line":36,"col":27,"index":841}],"89":[0,{"line":36,"col":2,"index":816},{"line":36,"col":27,"index":841}],"90":[0,{"line":41,"col":9,"index":955},{"line":41,"col":11,"index":957}],"91":[0,{"line":41,"col":2,"index":948},{"line":41,"col":11,"index":957}],"92":[0,{"line":42,"col":9,"index":968},{"line":42,"col":12,"index":971}],"93":[0,{"line":42,"col":2,"index":961},{"line":42,"col":12,"index":971}],"94":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":19,"index":1140}],"95":[0,{"line":47,"col":23,"index":1144},{"line":47,"col":23,"index":1144}],"96":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":23,"index":1144}],"97":[0,{"line":47,"col":2,"index":1123},{"line":47,"col":23,"index":1144}],"98":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":19,"index":1165}],"99":[0,{"line":48,"col":23,"index":1169},{"line":48,"col":23,"index":1169}],"100":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":23,"index":1169}],"101":[0,{"line":48,"col":2,"index":1148},{"line":48,"col":23,"index":1169}],"102":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":19,"index":1190}],"103":[0,{"line":49,"col":23,"index":1194},{"line":49,"col":23,"index":1194}],"104":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":23,"index":1194}],"105":[0,{"line":49,"col":2,"index":1173},{"line":49,"col":23,"index":1194}],"106":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":19,"index":1215}],"107":[0,{"line":50,"col":23,"index":1219},{"line":50,"col":23,"index":1219}],"108":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":23,"index":1219}],"109":[0,{"line":50,"col":2,"index":1198},{"line":50,"col":23,"index":1219}],"110":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":19,"index":1240}],"111":[0,{"line":51,"col":23,"index":1244},{"line":51,"col":23,"index":1244}],"112":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":23,"index":1244}],"113":[0,{"line":51,"col":2,"index":1223},{"line":51,"col":23,"index":1244}],"114":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":19,"index":1265}],"115":[0,{"line":52,"col":21,"index":1267},{"line":52,"col":21,"index":1267}],"116":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":21,"index":1267}],"117":[0,{"line":52,"col":2,"index":1248},{"line":52,"col":21,"index":1267}],"118":[0,{"line":53,"col":16,"index":1285},{"line":53,"col":18,"index":1287}],"119":[0,{"line":53,"col":15,"index":1284},{"line":53,"col":18,"index":1287}],"120":[0,{"line":53,"col":2,"index":1271},{"line":53,"col":18,"index":1287}],"121":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":18,"index":1307}],"122":[0,{"line":54,"col":22,"index":1311},{"line":54,"col":22,"index":1311}],"123":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":22,"index":1311}],"124":[0,{"line":54,"col":2,"index":1291},{"line":54,"col":22,"index":1311}],"125":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":18,"index":1331}],"126":[0,{"line":55,"col":23,"index":1336},{"line":55,"col":23,"index":1336}],"127":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":23,"index":1336}],"128":[0,{"line":55,"col":2,"index":1315},{"line":55,"col":23,"index":1336}],"129":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":18,"index":1356}],"130":[0,{"line":56,"col":22,"index":1360},{"line":56,"col":22,"index":1360}],"131":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":22,"index":1360}],"132":[0,{"line":56,"col":2,"index":1340},{"line":56,"col":22,"index":1360}],"133":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":18,"index":1380}],"134":[0,{"line":57,"col":23,"index":1385},{"line":57,"col":23,"index":1385}],"135":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":23,"index":1385}],"136":[0,{"line":57,"col":2,"index":1364},{"line":57,"col":23,"index":1385}],"137":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":20,"index":1407}],"138":[0,{"line":58,"col":25,"index":1412},{"line":58,"col":25,"index":1412}],"139":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":25,"index":1412}],"140":[0,{"line":58,"col":2,"index":1389},{"line":58,"col":25,"index":1412}],"141":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":18,"index":1432}],"142":[0,{"line":59,"col":23,"index":1437},{"line":59,"col":23,"index":1437}],"143":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":23,"index":1437}],"144":[0,{"line":59,"col":2,"index":1416},{"line":59,"col":23,"index":1437}],"145":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":6,"index":1464}],"146":[0,{"line":61,"col":10,"index":1468},{"line":61,"col":10,"index":1468}],"147":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":10,"index":1468}],"148":[0,{"line":61,"col":15,"index":1473},{"line":61,"col":15,"index":1473}],"149":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":15,"index":1473}],"150":[0,{"line":60,"col":2,"index":1441},{"line":62,"col":38,"index":1477}],"151":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":25,"index":1504}],"152":[0,{"line":63,"col":30,"index":1509},{"line":63,"col":32,"index":1511}],"153":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":33,"index":1512}],"154":[0,{"line":63,"col":2,"index":1481},{"line":63,"col":33,"index":1512}],"155":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":26,"index":1540}],"156":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":35,"index":1549}],"157":[0,{"line":64,"col":40,"index":1554},{"line":64,"col":40,"index":1554}],"158":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":40,"index":1554}],"159":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":41,"index":1555}],"160":[0,{"line":64,"col":2,"index":1516},{"line":64,"col":41,"index":1555}],"161":[0,{"line":67,"col":20,"index":1594},{"line":67,"col":22,"index":1596}],"162":[0,{"line":67,"col":16,"index":1590},{"line":67,"col":23,"index":1597}],"163":[0,{"line":67,"col":31,"index":1605},{"line":67,"col":31,"index":1605}],"164":[0,{"line":67,"col":34,"index":1608},{"line":67,"col":34,"index":1608}],"165":[0,{"line":67,"col":27,"index":1601},{"line":67,"col":35,"index":1609}],"166":[0,{"line":67,"col":2,"index":1576},{"line":67,"col":35,"index":1609}],"167":[0,{"line":69,"col":2,"index":1648},{"line":69,"col":10,"index":1656}],"168":[0,{"line":70,"col":33,"index":1691},{"line":70,"col":36,"index":1694}],"169":[0,{"line":70,"col":29,"index":1687},{"line":70,"col":37,"index":1695}],"170":[0,{"line":70,"col":41,"index":1699},{"line":70,"col":45,"index":1703}],"171":[0,{"line":70,"col":2,"index":1660},{"line":70,"col":45,"index":1703}],"172":[0,{"line":73,"col":9,"index":1741},{"line":73,"col":11,"index":1743}],"173":[0,{"line":73,"col":2,"index":1734},{"line":73,"col":11,"index":1743}],"174":[0,{"line":74,"col":25,"index":1770},{"line":74,"col":26,"index":1771}],"175":[0,{"line":74,"col":2,"index":1747},{"line":74,"col":26,"index":1771}],"176":[0,{"line":75,"col":15,"index":1788},{"line":75,"col":15,"index":1788}],"177":[0,{"line":75,"col":18,"index":1791},{"line":75,"col":18,"index":1791}],"178":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":23,"index":1796}],"179":[0,{"line":75,"col":27,"index":1800},{"line":75,"col":27,"index":1800}],"180":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":27,"index":1800}],"181":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"182":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"183":[0,{"line":76,"col":10,"index":1812},{"line":76,"col":15,"index":1817}],"184":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":25,"index":1827}],"185":[0,{"line":76,"col":29,"index":1831},{"line":76,"col":29,"index":1831}],"186":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":29,"index":1831}],"187":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"188":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"189":[0,{"line":77,"col":11,"index":1844},{"line":77,"col":11,"index":1844}],"190":[0,{"line":77,"col":21,"index":1854},{"line":77,"col":21,"index":1854}],"191":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"192":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"193":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"194":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"195":[0,{"line":78,"col":13,"index":1869},{"line":78,"col":13,"index":1869}],"196":[0,{"line":78,"col":22,"index":1878},{"line":78,"col":22,"index":1878}],"197":[0,{"line":78,"col":18,"index":1874},{"line":78,"col":23,"index":1879}],"198":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"199":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"200":[0,{"line":81,"col":8,"index":1911},{"line":81,"col":8,"index":1911}],"201":[0,{"line":81,"col":11,"index":1914},{"line":81,"col":11,"index":1914}],"202":[0,{"line":81,"col":16,"index":1919},{"line":81,"col":18,"index":1921}],"203":[0,{"line":81,"col":21,"index":1924},{"line":81,"col":23,"index":1926}],"204":[0,{"line":81,"col":29,"index":1932},{"line":81,"col":31,"index":1934}],"205":[0,{"line":81,"col":15,"index":1918},{"line":81,"col":31,"index":1934}],"206":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":6,"index":1946}],"207":[0,{"line":82,"col":10,"index":1950},{"line":82,"col":10,"index":1950}],"208":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":10,"index":1950}],"209":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"210":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"211":[0,{"line":85,"col":10,"index":1997},{"line":85,"col":10,"index":1997}],"212":[0,{"line":85,"col":15,"index":2002},{"line":85,"col":15,"index":2002}],"213":[0,{"line":85,"col":21,"index":2008},{"line":85,"col":21,"index":2008}],"214":[0,{"line":85,"col":14,"index":2001},{"line":85,"col":21,"index":2008}],"215":[0,{"line":86,"col":6,"index":2020},{"line":86,"col":6,"index":2020}],"216":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"217":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"218":[0,{"line":89,"col":9,"index":2036},{"line":89,"col":11,"index":2038}],"219":[0,{"line":89,"col":2,"index":2029},{"line":89,"col":11,"index":2038}],"220":[0,{"line":90,"col":21,"index":2061},{"line":90,"col":21,"index":2061}],"221":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"222":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"223":[0,{"line":90,"col":2,"index":2042},{"line":90,"col":21,"index":2061}],"224":[0,{"line":93,"col":18,"index":2116},{"line":93,"col":20,"index":2118}],"225":[0,{"line":93,"col":15,"index":2113},{"line":93,"col":20,"index":2118}],"226":[0,{"line":93,"col":26,"index":2124},{"line":93,"col":28,"index":2126}],"227":[0,{"line":93,"col":23,"index":2121},{"line":93,"col":28,"index":2126}],"228":[0,{"line":93,"col":32,"index":2130},{"line":93,"col":34,"index":2132}],"229":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":8,"index":2146}],"230":[0,{"line":94,"col":12,"index":2150},{"line":94,"col":12,"index":2150}],"231":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":12,"index":2150}],"232":[0,{"line":95,"col":4,"index":2157},{"line":95,"col":4,"index":2157}],"233":[0,{"line":96,"col":9,"index":2168},{"line":96,"col":9,"index":2168}],"234":[0,{"line":94,"col":4,"index":2142},{"line":96,"col":30,"index":2168}],"235":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"236":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"237":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":21,"index":2220}],"238":[0,{"line":101,"col":27,"index":2226},{"line":101,"col":30,"index":2229}],"239":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":30,"index":2229}],"240":[0,{"line":101,"col":2,"index":2201},{"line":101,"col":30,"index":2229}],"241":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":20,"index":2251}],"242":[0,{"line":102,"col":25,"index":2256},{"line":102,"col":28,"index":2259}],"243":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":28,"index":2259}],"244":[0,{"line":102,"col":2,"index":2233},{"line":102,"col":28,"index":2259}],"245":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":25,"index":2286}],"246":[0,{"line":103,"col":35,"index":2296},{"line":103,"col":38,"index":2299}],"247":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":38,"index":2299}],"248":[0,{"line":103,"col":2,"index":2263},{"line":103,"col":38,"index":2299}],"249":[0,{"line":104,"col":8,"index":2309},{"line":104,"col":8,"index":2309}],"250":[0,{"line":104,"col":13,"index":2314},{"line":104,"col":13,"index":2314}],"251":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"252":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"253":[0,{"line":105,"col":8,"index":2324},{"line":105,"col":8,"index":2324}],"254":[0,{"line":105,"col":15,"index":2331},{"line":105,"col":15,"index":2331}],"255":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":16,"index":2332}],"256":[0,{"line":105,"col":26,"index":2342},{"line":105,"col":26,"index":2342}],"257":[0,{"line":105,"col":22,"index":2338},{"line":105,"col":27,"index":2343}],"258":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":27,"index":2343}],"259":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"260":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"261":[0,{"line":106,"col":19,"index":2364},{"line":106,"col":19,"index":2364}],"262":[0,{"line":106,"col":26,"index":2371},{"line":106,"col":26,"index":2371}],"263":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":27,"index":2372}],"264":[0,{"line":106,"col":37,"index":2382},{"line":106,"col":37,"index":2382}],"265":[0,{"line":106,"col":33,"index":2378},{"line":106,"col":38,"index":2383}],"266":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":38,"index":2383}],"267":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"268":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"269":[0,{"line":107,"col":18,"index":2403},{"line":107,"col":18,"index":2403}],"270":[0,{"line":107,"col":25,"index":2410},{"line":107,"col":25,"index":2410}],"271":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":26,"index":2411}],"272":[0,{"line":107,"col":35,"index":2420},{"line":107,"col":35,"index":2420}],"273":[0,{"line":107,"col":31,"index":2416},{"line":107,"col":36,"index":2421}],"274":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":36,"index":2421}],"275":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"276":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"277":[0,{"line":110,"col":6,"index":2459},{"line":110,"col":10,"index":2463}],"278":[0,{"line":111,"col":6,"index":2472},{"line":111,"col":9,"index":2475}],"279":[0,{"line":112,"col":6,"index":2484},{"line":112,"col":10,"index":2488}],"280":[0,{"line":109,"col":23,"index":2447},{"line":113,"col":68,"index":2492}],"281":[0,{"line":109,"col":2,"index":2426},{"line":113,"col":68,"index":2492}],"282":[0,{"line":116,"col":6,"index":2534},{"line":116,"col":10,"index":2538}],"283":[0,{"line":117,"col":6,"index":2547},{"line":117,"col":9,"index":2550}],"284":[0,{"line":118,"col":6,"index":2559},{"line":118,"col":10,"index":2563}],"285":[0,{"line":115,"col":27,"index":2522},{"line":119,"col":72,"index":2567}],"286":[0,{"line":115,"col":2,"index":2497},{"line":119,"col":72,"index":2567}],"287":[0,{"line":122,"col":6,"index":2603},{"line":122,"col":10,"index":2607}],"288":[0,{"line":123,"col":6,"index":2616},{"line":123,"col":9,"index":2619}],"289":[0,{"line":124,"col":6,"index":2628},{"line":124,"col":10,"index":2632}],"290":[0,{"line":121,"col":22,"index":2592},{"line":125,"col":66,"index":2636}],"291":[0,{"line":121,"col":2,"index":2572},{"line":125,"col":66,"index":2636}],"292":[0,{"line":128,"col":6,"index":2677},{"line":128,"col":10,"index":2681}],"293":[0,{"line":129,"col":6,"index":2690},{"line":129,"col":9,"index":2693}],"294":[0,{"line":130,"col":6,"index":2702},{"line":130,"col":10,"index":2706}],"295":[0,{"line":127,"col":26,"index":2665},{"line":131,"col":71,"index":2710}],"296":[0,{"line":127,"col":2,"index":2641},{"line":131,"col":71,"index":2710}],"297":[0,{"line":133,"col":21,"index":2734},{"line":133,"col":24,"index":2737}],"298":[0,{"line":133,"col":27,"index":2740},{"line":133,"col":27,"index":2740}],"299":[0,{"line":133,"col":34,"index":2747},{"line":133,"col":34,"index":2747}],"300":[0,{"line":133,"col":17,"index":2730},{"line":133,"col":34,"index":2747}],"301":[0,{"line":133,"col":2,"index":2715},{"line":133,"col":34,"index":2747}],"302":[0,{"line":134,"col":16,"index":2765},{"line":134,"col":16,"index":2765}],"303":[0,{"line":134,"col":19,"index":2768},{"line":134,"col":19,"index":2768}],"304":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":28,"index":2777}],"305":[0,{"line":134,"col":32,"index":2781},{"line":134,"col":33,"index":2782}],"306":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":33,"index":2782}],"307":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":36,"index":2785}],"308":[0,{"line":134,"col":40,"index":2789},{"line":134,"col":40,"index":2789}],"309":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":40,"index":2789}],"310":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":47,"index":2796}],"311":[0,{"line":134,"col":51,"index":2800},{"line":134,"col":51,"index":2800}],"312":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":51,"index":2800}],"313":[0,{"line":134,"col":24,"index":2773},{"line":134,"col":51,"index":2800}],"314":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"315":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"316":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":12,"index":2841}],"317":[0,{"line":137,"col":17,"index":2846},{"line":137,"col":19,"index":2848}],"318":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":19,"index":2848}],"319":[0,{"line":137,"col":2,"index":2831},{"line":137,"col":19,"index":2848}],"320":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":16,"index":2866}],"321":[0,{"line":138,"col":22,"index":2872},{"line":138,"col":24,"index":2874}],"322":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":25,"index":2875}],"323":[0,{"line":138,"col":2,"index":2852},{"line":138,"col":25,"index":2875}],"324":[0,{"line":141,"col":13,"index":2939},{"line":141,"col":13,"index":2939}],"325":[0,{"line":141,"col":16,"index":2942},{"line":141,"col":16,"index":2942}],"326":[0,{"line":141,"col":21,"index":2947},{"line":141,"col":21,"index":2947}],"327":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"328":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"329":[0,{"line":142,"col":31,"index":2980},{"line":142,"col":33,"index":2982}],"330":[0,{"line":142,"col":36,"index":2985},{"line":142,"col":37,"index":2986}],"331":[0,{"line":142,"col":24,"index":2973},{"line":142,"col":38,"index":2987}],"332":[0,{"line":142,"col":2,"index":2951},{"line":142,"col":38,"index":2987}],"333":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":24,"index":3013}],"334":[0,{"line":143,"col":33,"index":3022},{"line":143,"col":34,"index":3023}],"335":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":35,"index":3024}],"336":[0,{"line":143,"col":2,"index":2991},{"line":143,"col":35,"index":3024}],"337":[0,{"line":145,"col":19,"index":3102},{"line":145,"col":19,"index":3102}],"338":[0,{"line":145,"col":22,"index":3105},{"line":145,"col":26,"index":3109}],"339":[0,{"line":145,"col":16,"index":3099},{"line":145,"col":27,"index":3110}],"340":[0,{"line":145,"col":2,"index":3085},{"line":145,"col":27,"index":3110}],"341":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":22,"index":3279}],"342":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":31,"index":3288}],"343":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":36,"index":3293}],"344":[0,{"line":150,"col":40,"index":3297},{"line":150,"col":41,"index":3298}],"345":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":41,"index":3298}],"346":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":41,"index":3298}],"347":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":42,"index":3299}],"348":[0,{"line":150,"col":2,"index":3259},{"line":150,"col":42,"index":3299}],"349":[0,{"line":152,"col":25,"index":3356},{"line":152,"col":25,"index":3356}],"350":[0,{"line":152,"col":28,"index":3359},{"line":152,"col":32,"index":3363}],"351":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":33,"index":3364}],"352":[0,{"line":152,"col":42,"index":3373},{"line":152,"col":42,"index":3373}],"353":[0,{"line":152,"col":45,"index":3376},{"line":152,"col":47,"index":3378}],"354":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":54,"index":3385}],"355":[0,{"line":152,"col":58,"index":3389},{"line":152,"col":60,"index":3391}],"356":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":60,"index":3391}],"357":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"358":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"359":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"360":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"361":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"362":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"363":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"364":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"365":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"366":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"367":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":62,"index":3393}],"368":[0,{"line":152,"col":2,"index":3333},{"line":152,"col":62,"index":3393}],"369":[0,{"line":155,"col":21,"index":3458},{"line":155,"col":21,"index":3458}],"370":[0,{"line":155,"col":15,"index":3452},{"line":155,"col":22,"index":3459}],"371":[0,{"line":155,"col":4,"index":3441},{"line":155,"col":22,"index":3459}],"372":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":6,"index":3477}],"373":[0,{"line":157,"col":10,"index":3481},{"line":157,"col":11,"index":3482}],"374":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":11,"index":3482}],"375":[0,{"line":158,"col":11,"index":3496},{"line":158,"col":11,"index":3496}],"376":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"377":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"378":[0,{"line":156,"col":4,"index":3465},{"line":159,"col":41,"index":3502}],"379":[0,{"line":155,"col":4,"index":3441},{"line":159,"col":65,"index":3502}],"380":[0,{"line":154,"col":2,"index":3414},{"line":160,"col":94,"index":3506}],"381":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":22,"index":3545}],"382":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":31,"index":3554}],"383":[0,{"line":162,"col":36,"index":3559},{"line":162,"col":39,"index":3562}],"384":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":39,"index":3562}],"385":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":40,"index":3563}],"386":[0,{"line":162,"col":2,"index":3525},{"line":162,"col":40,"index":3563}],"387":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":10,"index":3576}],"388":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":18,"index":3584}],"389":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":23,"index":3589}],"390":[0,{"line":164,"col":27,"index":3593},{"line":164,"col":27,"index":3593}],"391":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":27,"index":3593}],"392":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":27,"index":3593}],"393":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":28,"index":3594}],"394":[0,{"line":164,"col":2,"index":3568},{"line":164,"col":28,"index":3594}],"395":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":23,"index":3620}],"396":[0,{"line":166,"col":37,"index":3634},{"line":166,"col":37,"index":3634}],"397":[0,{"line":166,"col":40,"index":3637},{"line":166,"col":40,"index":3637}],"398":[0,{"line":166,"col":33,"index":3630},{"line":166,"col":41,"index":3638}],"399":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":42,"index":3639}],"400":[0,{"line":166,"col":2,"index":3599},{"line":166,"col":42,"index":3639}],"401":[0,{"line":169,"col":17,"index":3698},{"line":169,"col":17,"index":3698}],"402":[0,{"line":169,"col":20,"index":3701},{"line":169,"col":20,"index":3701}],"403":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":21,"index":3702}],"404":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":28,"index":3709}],"405":[0,{"line":169,"col":2,"index":3683},{"line":169,"col":28,"index":3709}],"406":[0,{"line":172,"col":20,"index":3753},{"line":172,"col":20,"index":3753}],"407":[0,{"line":172,"col":23,"index":3756},{"line":172,"col":23,"index":3756}],"408":[0,{"line":172,"col":26,"index":3759},{"line":172,"col":26,"index":3759}],"409":[0,{"line":172,"col":19,"index":3752},{"line":172,"col":27,"index":3760}],"410":[0,{"line":172,"col":2,"index":3735},{"line":172,"col":27,"index":3760}],"411":[0,{"line":173,"col":24,"index":3786},{"line":173,"col":24,"index":3786}],"412":[0,{"line":173,"col":27,"index":3789},{"line":173,"col":27,"index":3789}],"413":[0,{"line":173,"col":30,"index":3792},{"line":173,"col":30,"index":3792}],"414":[0,{"line":173,"col":20,"index":3782},{"line":173,"col":31,"index":3793}],"415":[0,{"line":173,"col":2,"index":3764},{"line":173,"col":31,"index":3793}],"416":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":18,"index":3813}],"417":[0,{"line":174,"col":23,"index":3818},{"line":174,"col":23,"index":3818}],"418":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":23,"index":3818}],"419":[0,{"line":174,"col":2,"index":3797},{"line":174,"col":23,"index":3818}],"420":[0,{"line":175,"col":19,"index":3839},{"line":175,"col":19,"index":3839}],"421":[0,{"line":175,"col":22,"index":3842},{"line":175,"col":22,"index":3842}],"422":[0,{"line":175,"col":25,"index":3845},{"line":175,"col":25,"index":3845}],"423":[0,{"line":175,"col":18,"index":3838},{"line":175,"col":26,"index":3846}],"424":[0,{"line":175,"col":2,"index":3822},{"line":175,"col":26,"index":3846}],"425":[0,{"line":176,"col":24,"index":3872},{"line":176,"col":24,"index":3872}],"426":[0,{"line":176,"col":27,"index":3875},{"line":176,"col":27,"index":3875}],"427":[0,{"line":176,"col":30,"index":3878},{"line":176,"col":30,"index":3878}],"428":[0,{"line":176,"col":19,"index":3867},{"line":176,"col":31,"index":3879}],"429":[0,{"line":176,"col":2,"index":3850},{"line":176,"col":31,"index":3879}],"430":[0,{"line":177,"col":23,"index":3904},{"line":177,"col":23,"index":3904}],"431":[0,{"line":177,"col":26,"index":3907},{"line":177,"col":26,"index":3907}],"432":[0,{"line":177,"col":29,"index":3910},{"line":177,"col":29,"index":3910}],"433":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":30,"index":3911}],"434":[0,{"line":177,"col":32,"index":3913},{"line":177,"col":32,"index":3913}],"435":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":33,"index":3914}],"436":[0,{"line":177,"col":2,"index":3883},{"line":177,"col":33,"index":3914}],"437":[0,{"line":178,"col":28,"index":3944},{"line":178,"col":33,"index":3949}],"438":[0,{"line":178,"col":22,"index":3938},{"line":178,"col":33,"index":3949}],"439":[0,{"line":178,"col":42,"index":3958},{"line":178,"col":45,"index":3961}],"440":[0,{"line":178,"col":36,"index":3952},{"line":178,"col":45,"index":3961}],"441":[0,{"line":178,"col":20,"index":3936},{"line":178,"col":47,"index":3963}],"442":[0,{"line":178,"col":2,"index":3918},{"line":178,"col":47,"index":3963}],"443":[0,{"line":179,"col":25,"index":3990},{"line":179,"col":30,"index":3995}],"444":[0,{"line":179,"col":33,"index":3998},{"line":179,"col":38,"index":4003}],"445":[0,{"line":179,"col":41,"index":4006},{"line":179,"col":46,"index":4011}],"446":[0,{"line":179,"col":49,"index":4014},{"line":179,"col":52,"index":4017}],"447":[0,{"line":179,"col":21,"index":3986},{"line":179,"col":53,"index":4018}],"448":[0,{"line":179,"col":2,"index":3967},{"line":179,"col":53,"index":4018}],"449":[0,{"line":180,"col":29,"index":4049},{"line":180,"col":35,"index":4055}],"450":[0,{"line":180,"col":23,"index":4043},{"line":180,"col":35,"index":4055}],"451":[0,{"line":180,"col":44,"index":4064},{"line":180,"col":47,"index":4067}],"452":[0,{"line":180,"col":38,"index":4058},{"line":180,"col":47,"index":4067}],"453":[0,{"line":180,"col":53,"index":4073},{"line":180,"col":63,"index":4083}],"454":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"455":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"456":[0,{"line":180,"col":2,"index":4022},{"line":180,"col":65,"index":4085}],"457":[0,{"line":181,"col":21,"index":4108},{"line":181,"col":21,"index":4108}],"458":[0,{"line":181,"col":24,"index":4111},{"line":181,"col":24,"index":4111}],"459":[0,{"line":181,"col":27,"index":4114},{"line":181,"col":27,"index":4114}],"460":[0,{"line":181,"col":17,"index":4104},{"line":181,"col":28,"index":4115}],"461":[0,{"line":181,"col":2,"index":4089},{"line":181,"col":28,"index":4115}],"462":[0,{"line":185,"col":22,"index":4187},{"line":185,"col":22,"index":4187}],"463":[0,{"line":185,"col":19,"index":4184},{"line":185,"col":22,"index":4187}],"464":[0,{"line":185,"col":28,"index":4193},{"line":185,"col":32,"index":4197}],"465":[0,{"line":185,"col":25,"index":4190},{"line":185,"col":32,"index":4197}],"466":[0,{"line":185,"col":17,"index":4182},{"line":185,"col":34,"index":4199}],"467":[0,{"line":185,"col":4,"index":4169},{"line":185,"col":34,"index":4199}],"468":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":9,"index":4210}],"469":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"470":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"471":[0,{"line":185,"col":4,"index":4169},{"line":186,"col":47,"index":4212}],"472":[0,{"line":184,"col":2,"index":4149},{"line":186,"col":65,"index":4212}],"473":[0,{"line":189,"col":21,"index":4253},{"line":189,"col":23,"index":4255}],"474":[0,{"line":189,"col":26,"index":4258},{"line":189,"col":26,"index":4258}],"475":[0,{"line":189,"col":17,"index":4249},{"line":189,"col":27,"index":4259}],"476":[0,{"line":189,"col":4,"index":4236},{"line":189,"col":27,"index":4259}],"477":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":9,"index":4270}],"478":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"479":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"480":[0,{"line":189,"col":4,"index":4236},{"line":190,"col":41,"index":4273}],"481":[0,{"line":188,"col":2,"index":4217},{"line":190,"col":58,"index":4273}],"482":[0,{"line":192,"col":14,"index":4290},{"line":192,"col":14,"index":4290}],"483":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":19,"index":4295}],"484":[0,{"line":192,"col":24,"index":4300},{"line":192,"col":25,"index":4301}],"485":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":25,"index":4301}],"486":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"487":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"488":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":19,"index":4349}],"489":[0,{"line":195,"col":24,"index":4354},{"line":195,"col":28,"index":4358}],"490":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":29,"index":4359}],"491":[0,{"line":195,"col":2,"index":4332},{"line":195,"col":29,"index":4359}],"492":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":27,"index":4388}],"493":[0,{"line":196,"col":38,"index":4399},{"line":196,"col":42,"index":4403}],"494":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":43,"index":4404}],"495":[0,{"line":196,"col":2,"index":4363},{"line":196,"col":43,"index":4404}],"496":[0,{"line":197,"col":22,"index":4428},{"line":197,"col":22,"index":4428}],"497":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":23,"index":4429}],"498":[0,{"line":197,"col":41,"index":4447},{"line":197,"col":41,"index":4447}],"499":[0,{"line":197,"col":43,"index":4449},{"line":197,"col":43,"index":4449}],"500":[0,{"line":197,"col":45,"index":4451},{"line":197,"col":45,"index":4451}],"501":[0,{"line":197,"col":37,"index":4443},{"line":197,"col":46,"index":4452}],"502":[0,{"line":197,"col":28,"index":4434},{"line":197,"col":47,"index":4453}],"503":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":48,"index":4454}],"504":[0,{"line":197,"col":2,"index":4408},{"line":197,"col":48,"index":4454}],"505":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":20,"index":4501}],"506":[0,{"line":200,"col":24,"index":4505},{"line":200,"col":24,"index":4505}],"507":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":24,"index":4505}],"508":[0,{"line":200,"col":2,"index":4483},{"line":200,"col":24,"index":4505}],"509":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":13,"index":4549}],"510":[0,{"line":202,"col":18,"index":4554},{"line":202,"col":18,"index":4554}],"511":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":18,"index":4554}],"512":[0,{"line":202,"col":2,"index":4538},{"line":202,"col":18,"index":4554}],"513":[0,{"line":205,"col":2,"index":4572},{"line":205,"col":14,"index":4584}],"514":[0,{"line":206,"col":2,"index":4588},{"line":206,"col":12,"index":4598}],"515":[0,{"line":209,"col":21,"index":4636},{"line":209,"col":23,"index":4638}],"516":[0,{"line":209,"col":17,"index":4632},{"line":209,"col":24,"index":4639}],"517":[0,{"line":209,"col":2,"index":4617},{"line":209,"col":24,"index":4639}],"518":[0,{"line":211,"col":2,"index":4644},{"line":211,"col":24,"index":4666}],"519":[0,{"line":213,"col":10,"index":4679},{"line":213,"col":16,"index":4685}],"520":[0,{"line":213,"col":2,"index":4671},{"line":213,"col":16,"index":4685}],"521":[0,{"line":221,"col":19,"index":4906},{"line":221,"col":19,"index":4906}],"522":[0,{"line":221,"col":15,"index":4902},{"line":221,"col":15,"index":4902}],"523":[0,{"line":221,"col":2,"index":4889},{"line":221,"col":29,"index":4916}],"524":[0,{"line":14,"col":0,"index":140},{"line":225,"col":4855,"index":4995}]}} \ No newline at end of file diff --git a/quint/testFixture/_1043sumTypeDecl.json b/quint/testFixture/_1043sumTypeDecl.json index 86a24fb9f..db8016a6e 100644 --- a/quint/testFixture/_1043sumTypeDecl.json +++ b/quint/testFixture/_1043sumTypeDecl.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":21,"name":"SumTypes","declarations":[{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},{"id":13,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":3,"kind":"const","name":"T"}},"expr":{"id":12,"kind":"lambda","params":[{"id":9,"name":"__BParam"}],"qualifier":"def","expr":{"id":11,"kind":"app","opcode":"variant","args":[{"id":8,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":10}]}}},{"id":7,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":3,"kind":"const","name":"T"},"expr":{"id":6,"kind":"app","opcode":"variant","args":[{"id":4,"kind":"str","value":"A"},{"id":5,"kind":"app","opcode":"Rec","args":[]}]}},{"id":20,"kind":"def","name":"canConstructVariants","qualifier":"val","expr":{"id":19,"kind":"app","opcode":"List","args":[{"id":16,"kind":"name","name":"A"},{"id":18,"kind":"app","opcode":"B","args":[{"id":17,"kind":"int","value":2}]}]},"typeAnnotation":{"id":15,"kind":"list","elem":{"id":14,"kind":"const","name":"T"}}}]}],"table":{"3":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"10":{"id":9,"name":"__BParam","kind":"param"},"14":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"16":{"id":7,"kind":"def","name":"A","qualifier":"val","expr":{"id":6,"kind":"app","opcode":"variant","args":[{"id":4,"kind":"str","value":"A"},{"id":5,"kind":"app","opcode":"Rec","args":[]}]},"depth":0},"18":{"id":13,"kind":"def","name":"B","qualifier":"def","expr":{"id":12,"kind":"lambda","params":[{"id":9,"name":"__BParam"}],"qualifier":"def","expr":{"id":11,"kind":"app","opcode":"variant","args":[{"id":8,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":10}]}},"depth":0}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":22,"name":"SumTypes","declarations":[{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},{"id":14,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}}},{"id":8,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":4,"kind":"const","name":"T"},"expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]}},{"id":21,"kind":"def","name":"canConstructVariants","qualifier":"val","expr":{"id":20,"kind":"app","opcode":"List","args":[{"id":17,"kind":"name","name":"A"},{"id":19,"kind":"app","opcode":"B","args":[{"id":18,"kind":"int","value":2}]}]},"typeAnnotation":{"id":16,"kind":"list","elem":{"id":15,"kind":"const","name":"T"}}}]}],"table":{"4":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"11":{"id":10,"name":"__BParam","kind":"param"},"15":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"17":{"id":8,"kind":"def","name":"A","qualifier":"val","expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]},"depth":0},"19":{"id":14,"kind":"def","name":"B","qualifier":"def","expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1043sumTypeDecl.map.json b/quint/testFixture/_1043sumTypeDecl.map.json index 9d2b689b9..5d16f8502 100644 --- a/quint/testFixture/_1043sumTypeDecl.map.json +++ b/quint/testFixture/_1043sumTypeDecl.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1043sumTypeDecl.qnt"},"map":{"1":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"2":[0,{"line":3,"col":8,"index":45},{"line":3,"col":10,"index":47}],"3":[0,{"line":1,"col":2,"index":20},{"line":3,"col":30,"index":48}],"4":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"5":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"6":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"7":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"8":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"9":[0,{"line":3,"col":8,"index":45},{"line":3,"col":10,"index":47}],"10":[0,{"line":3,"col":6,"index":43},{"line":3,"col":6,"index":43}],"11":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"12":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"13":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"14":[0,{"line":5,"col":34,"index":85},{"line":5,"col":34,"index":85}],"15":[0,{"line":5,"col":29,"index":80},{"line":5,"col":35,"index":86}],"16":[0,{"line":5,"col":44,"index":95},{"line":5,"col":44,"index":95}],"17":[0,{"line":5,"col":49,"index":100},{"line":5,"col":49,"index":100}],"18":[0,{"line":5,"col":47,"index":98},{"line":5,"col":50,"index":101}],"19":[0,{"line":5,"col":39,"index":90},{"line":5,"col":51,"index":102}],"20":[0,{"line":5,"col":2,"index":53},{"line":5,"col":51,"index":102}],"21":[0,{"line":0,"col":0,"index":0},{"line":6,"col":104,"index":104}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1043sumTypeDecl.qnt"},"map":{"1":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"2":[0,{"line":3,"col":8,"index":45},{"line":3,"col":10,"index":47}],"3":[0,{"line":1,"col":2,"index":20},{"line":3,"col":30,"index":48}],"4":[0,{"line":1,"col":2,"index":20},{"line":3,"col":30,"index":48}],"5":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"6":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"7":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"8":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"9":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"10":[0,{"line":3,"col":8,"index":45},{"line":3,"col":10,"index":47}],"11":[0,{"line":3,"col":6,"index":43},{"line":3,"col":6,"index":43}],"12":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"13":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"14":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"15":[0,{"line":5,"col":34,"index":85},{"line":5,"col":34,"index":85}],"16":[0,{"line":5,"col":29,"index":80},{"line":5,"col":35,"index":86}],"17":[0,{"line":5,"col":44,"index":95},{"line":5,"col":44,"index":95}],"18":[0,{"line":5,"col":49,"index":100},{"line":5,"col":49,"index":100}],"19":[0,{"line":5,"col":47,"index":98},{"line":5,"col":50,"index":101}],"20":[0,{"line":5,"col":39,"index":90},{"line":5,"col":51,"index":102}],"21":[0,{"line":5,"col":2,"index":53},{"line":5,"col":51,"index":102}],"22":[0,{"line":0,"col":0,"index":0},{"line":6,"col":104,"index":104}]}} \ No newline at end of file diff --git a/quint/testFixture/_1044matchExpression.json b/quint/testFixture/_1044matchExpression.json index 24a0dc8ae..093e3b648 100644 --- a/quint/testFixture/_1044matchExpression.json +++ b/quint/testFixture/_1044matchExpression.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":40,"name":"SumTypes","declarations":[{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},{"id":14,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}}},{"id":20,"kind":"def","name":"C","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"str"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":19,"kind":"lambda","params":[{"id":16,"name":"__CParam"}],"qualifier":"def","expr":{"id":18,"kind":"app","opcode":"variant","args":[{"id":15,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":17}]}}},{"id":8,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":4,"kind":"const","name":"T"},"expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]}},{"id":23,"kind":"def","name":"c","qualifier":"val","expr":{"id":22,"kind":"app","opcode":"C","args":[{"id":21,"kind":"str","value":"Foo"}]}},{"id":39,"kind":"def","name":"ex","qualifier":"val","expr":{"id":29,"kind":"app","opcode":"matchVariant","args":[{"id":24,"kind":"name","name":"c"},{"id":30,"kind":"str","value":"A"},{"id":31,"kind":"lambda","qualifier":"def","expr":{"id":25,"kind":"int","value":0},"params":[{"name":"_","id":32}]},{"id":33,"kind":"str","value":"B"},{"id":34,"kind":"lambda","qualifier":"def","expr":{"id":26,"kind":"name","name":"n"},"params":[{"name":"n","id":35}]},{"id":36,"kind":"str","value":"_"},{"id":37,"kind":"lambda","qualifier":"def","expr":{"id":28,"kind":"app","opcode":"iuminus","args":[{"id":27,"kind":"int","value":1}]},"params":[{"name":"_","id":38}]}]}}]}],"table":{"4":{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},"11":{"id":10,"name":"__BParam","kind":"param"},"17":{"id":16,"name":"__CParam","kind":"param"},"22":{"id":20,"kind":"def","name":"C","qualifier":"def","expr":{"id":19,"kind":"lambda","params":[{"id":16,"name":"__CParam"}],"qualifier":"def","expr":{"id":18,"kind":"app","opcode":"variant","args":[{"id":15,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":17}]}},"depth":0},"24":{"id":23,"kind":"def","name":"c","qualifier":"val","expr":{"id":22,"kind":"app","opcode":"C","args":[{"id":21,"kind":"str","value":"Foo"}]},"depth":0},"26":{"name":"n","id":35,"kind":"param"}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":41,"name":"SumTypes","declarations":[{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},{"id":15,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"__BParam"}],"qualifier":"def","expr":{"id":13,"kind":"app","opcode":"variant","args":[{"id":10,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":12}]}}},{"id":21,"kind":"def","name":"C","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"str"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":20,"kind":"lambda","params":[{"id":17,"name":"__CParam"}],"qualifier":"def","expr":{"id":19,"kind":"app","opcode":"variant","args":[{"id":16,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":18}]}}},{"id":9,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":5,"kind":"const","name":"T"},"expr":{"id":8,"kind":"app","opcode":"variant","args":[{"id":6,"kind":"str","value":"A"},{"id":7,"kind":"app","opcode":"Rec","args":[]}]}},{"id":24,"kind":"def","name":"c","qualifier":"val","expr":{"id":23,"kind":"app","opcode":"C","args":[{"id":22,"kind":"str","value":"Foo"}]}},{"id":40,"kind":"def","name":"ex","qualifier":"val","expr":{"id":30,"kind":"app","opcode":"matchVariant","args":[{"id":25,"kind":"name","name":"c"},{"id":31,"kind":"str","value":"A"},{"id":32,"kind":"lambda","qualifier":"def","expr":{"id":26,"kind":"int","value":0},"params":[{"name":"_","id":33}]},{"id":34,"kind":"str","value":"B"},{"id":35,"kind":"lambda","qualifier":"def","expr":{"id":27,"kind":"name","name":"n"},"params":[{"name":"n","id":36}]},{"id":37,"kind":"str","value":"_"},{"id":38,"kind":"lambda","qualifier":"def","expr":{"id":29,"kind":"app","opcode":"iuminus","args":[{"id":28,"kind":"int","value":1}]},"params":[{"name":"_","id":39}]}]}}]}],"table":{"5":{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},"12":{"id":11,"name":"__BParam","kind":"param"},"18":{"id":17,"name":"__CParam","kind":"param"},"23":{"id":21,"kind":"def","name":"C","qualifier":"def","expr":{"id":20,"kind":"lambda","params":[{"id":17,"name":"__CParam"}],"qualifier":"def","expr":{"id":19,"kind":"app","opcode":"variant","args":[{"id":16,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":18}]}},"depth":0},"25":{"id":24,"kind":"def","name":"c","qualifier":"val","expr":{"id":23,"kind":"app","opcode":"C","args":[{"id":22,"kind":"str","value":"Foo"}]},"depth":0},"27":{"name":"n","id":36,"kind":"param"}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1044matchExpression.map.json b/quint/testFixture/_1044matchExpression.map.json index 5a444ca1c..19be73e13 100644 --- a/quint/testFixture/_1044matchExpression.map.json +++ b/quint/testFixture/_1044matchExpression.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1044matchExpression.qnt"},"map":{"1":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"2":[0,{"line":1,"col":17,"index":35},{"line":1,"col":19,"index":37}],"3":[0,{"line":1,"col":26,"index":44},{"line":1,"col":28,"index":46}],"4":[0,{"line":1,"col":2,"index":20},{"line":1,"col":29,"index":47}],"5":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"6":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"7":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"8":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"9":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"10":[0,{"line":1,"col":17,"index":35},{"line":1,"col":19,"index":37}],"11":[0,{"line":1,"col":15,"index":33},{"line":1,"col":15,"index":33}],"12":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"13":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"14":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"15":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"16":[0,{"line":1,"col":26,"index":44},{"line":1,"col":28,"index":46}],"17":[0,{"line":1,"col":24,"index":42},{"line":1,"col":24,"index":42}],"18":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"19":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"20":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"21":[0,{"line":3,"col":12,"index":62},{"line":3,"col":16,"index":66}],"22":[0,{"line":3,"col":10,"index":60},{"line":3,"col":17,"index":67}],"23":[0,{"line":3,"col":2,"index":52},{"line":3,"col":17,"index":67}],"24":[0,{"line":5,"col":17,"index":87},{"line":5,"col":17,"index":87}],"25":[0,{"line":6,"col":14,"index":105},{"line":6,"col":14,"index":105}],"26":[0,{"line":7,"col":14,"index":121},{"line":7,"col":14,"index":121}],"27":[0,{"line":8,"col":15,"index":138},{"line":8,"col":15,"index":138}],"28":[0,{"line":8,"col":14,"index":137},{"line":8,"col":15,"index":138}],"29":[0,{"line":5,"col":11,"index":81},{"line":9,"col":72,"index":142}],"30":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"31":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"32":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"33":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"34":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"35":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"36":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"37":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"38":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"39":[0,{"line":5,"col":2,"index":72},{"line":9,"col":72,"index":142}],"40":[0,{"line":0,"col":0,"index":0},{"line":10,"col":144,"index":144}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1044matchExpression.qnt"},"map":{"1":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"2":[0,{"line":1,"col":17,"index":35},{"line":1,"col":19,"index":37}],"3":[0,{"line":1,"col":26,"index":44},{"line":1,"col":28,"index":46}],"4":[0,{"line":1,"col":2,"index":20},{"line":1,"col":29,"index":47}],"5":[0,{"line":1,"col":2,"index":20},{"line":1,"col":29,"index":47}],"6":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"7":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"8":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"9":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"10":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"11":[0,{"line":1,"col":17,"index":35},{"line":1,"col":19,"index":37}],"12":[0,{"line":1,"col":15,"index":33},{"line":1,"col":15,"index":33}],"13":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"14":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"15":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"16":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"17":[0,{"line":1,"col":26,"index":44},{"line":1,"col":28,"index":46}],"18":[0,{"line":1,"col":24,"index":42},{"line":1,"col":24,"index":42}],"19":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"20":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"21":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"22":[0,{"line":3,"col":12,"index":62},{"line":3,"col":16,"index":66}],"23":[0,{"line":3,"col":10,"index":60},{"line":3,"col":17,"index":67}],"24":[0,{"line":3,"col":2,"index":52},{"line":3,"col":17,"index":67}],"25":[0,{"line":5,"col":17,"index":87},{"line":5,"col":17,"index":87}],"26":[0,{"line":6,"col":14,"index":105},{"line":6,"col":14,"index":105}],"27":[0,{"line":7,"col":14,"index":121},{"line":7,"col":14,"index":121}],"28":[0,{"line":8,"col":15,"index":138},{"line":8,"col":15,"index":138}],"29":[0,{"line":8,"col":14,"index":137},{"line":8,"col":15,"index":138}],"30":[0,{"line":5,"col":11,"index":81},{"line":9,"col":72,"index":142}],"31":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"32":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"33":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"34":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"35":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"36":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"37":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"38":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"39":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"40":[0,{"line":5,"col":2,"index":72},{"line":9,"col":72,"index":142}],"41":[0,{"line":0,"col":0,"index":0},{"line":10,"col":144,"index":144}]}} \ No newline at end of file diff --git a/quint/testFixture/_1045polymorphicTypeDecl.json b/quint/testFixture/_1045polymorphicTypeDecl.json index f3055bd2f..f8280eaa1 100644 --- a/quint/testFixture/_1045polymorphicTypeDecl.json +++ b/quint/testFixture/_1045polymorphicTypeDecl.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":26,"name":"m","declarations":[{"id":10,"kind":"typedef","name":"MapApp","type":{"id":9,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":7,"kind":"fun","arg":{"id":5,"kind":"var","name":"a"},"res":{"id":6,"kind":"var","name":"b"}}},{"fieldName":"1","fieldType":{"id":8,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a","b"]},{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"]},{"id":4,"kind":"typedef","name":"MonoPair","type":{"id":3,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":1,"kind":"var","name":"a"}},{"fieldName":"1","fieldType":{"id":2,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a"]},{"id":19,"kind":"def","name":"Ok","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":11,"kind":"var","name":"ok"}],"res":{"id":13,"kind":"const","name":"Result"}},"expr":{"id":18,"kind":"lambda","params":[{"id":15,"name":"__OkParam"}],"qualifier":"def","expr":{"id":17,"kind":"app","opcode":"variant","args":[{"id":14,"kind":"str","value":"Ok"},{"kind":"name","name":"__OkParam","id":16}]}}},{"id":25,"kind":"def","name":"Err","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":12,"kind":"var","name":"err"}],"res":{"id":13,"kind":"const","name":"Result"}},"expr":{"id":24,"kind":"lambda","params":[{"id":21,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":23,"kind":"app","opcode":"variant","args":[{"id":20,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":22}]}}}]}],"table":{"13":{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"]},"16":{"id":15,"name":"__OkParam","kind":"param"},"22":{"id":21,"name":"__ErrParam","kind":"param"}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":29,"name":"m","declarations":[{"id":10,"kind":"typedef","name":"MapApp","type":{"id":9,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":7,"kind":"fun","arg":{"id":5,"kind":"var","name":"a"},"res":{"id":6,"kind":"var","name":"b"}}},{"fieldName":"1","fieldType":{"id":8,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a","b"]},{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"]},{"id":4,"kind":"typedef","name":"MonoPair","type":{"id":3,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":1,"kind":"var","name":"a"}},{"fieldName":"1","fieldType":{"id":2,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a"]},{"id":22,"kind":"def","name":"Ok","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":11,"kind":"var","name":"ok"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":21,"kind":"lambda","params":[{"id":18,"name":"__OkParam"}],"qualifier":"def","expr":{"id":20,"kind":"app","opcode":"variant","args":[{"id":17,"kind":"str","value":"Ok"},{"kind":"name","name":"__OkParam","id":19}]}}},{"id":28,"kind":"def","name":"Err","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":12,"kind":"var","name":"err"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":27,"kind":"lambda","params":[{"id":24,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":26,"kind":"app","opcode":"variant","args":[{"id":23,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":25}]}}}]}],"table":{"14":{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"]},"19":{"id":18,"name":"__OkParam","kind":"param"},"25":{"id":24,"name":"__ErrParam","kind":"param"}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1045polymorphicTypeDecl.map.json b/quint/testFixture/_1045polymorphicTypeDecl.map.json index 2e0f71688..d374b67c1 100644 --- a/quint/testFixture/_1045polymorphicTypeDecl.map.json +++ b/quint/testFixture/_1045polymorphicTypeDecl.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1045polymorphicTypeDecl.qnt"},"map":{"1":[0,{"line":1,"col":22,"index":33},{"line":1,"col":22,"index":33}],"2":[0,{"line":1,"col":25,"index":36},{"line":1,"col":25,"index":36}],"3":[0,{"line":1,"col":21,"index":32},{"line":1,"col":26,"index":37}],"4":[0,{"line":1,"col":2,"index":13},{"line":1,"col":26,"index":37}],"5":[0,{"line":2,"col":23,"index":62},{"line":2,"col":23,"index":62}],"6":[0,{"line":2,"col":28,"index":67},{"line":2,"col":28,"index":67}],"7":[0,{"line":2,"col":23,"index":62},{"line":2,"col":28,"index":67}],"8":[0,{"line":2,"col":31,"index":70},{"line":2,"col":31,"index":70}],"9":[0,{"line":2,"col":22,"index":61},{"line":2,"col":32,"index":71}],"10":[0,{"line":2,"col":2,"index":41},{"line":2,"col":32,"index":71}],"11":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"12":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"13":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"14":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"15":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"16":[0,{"line":4,"col":6,"index":104},{"line":4,"col":7,"index":105}],"17":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"18":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"19":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"20":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"21":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"22":[0,{"line":5,"col":6,"index":117},{"line":5,"col":8,"index":119}],"23":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"24":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"25":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"26":[0,{"line":0,"col":0,"index":0},{"line":6,"col":126,"index":126}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1045polymorphicTypeDecl.qnt"},"map":{"1":[0,{"line":1,"col":22,"index":33},{"line":1,"col":22,"index":33}],"2":[0,{"line":1,"col":25,"index":36},{"line":1,"col":25,"index":36}],"3":[0,{"line":1,"col":21,"index":32},{"line":1,"col":26,"index":37}],"4":[0,{"line":1,"col":2,"index":13},{"line":1,"col":26,"index":37}],"5":[0,{"line":2,"col":23,"index":62},{"line":2,"col":23,"index":62}],"6":[0,{"line":2,"col":28,"index":67},{"line":2,"col":28,"index":67}],"7":[0,{"line":2,"col":23,"index":62},{"line":2,"col":28,"index":67}],"8":[0,{"line":2,"col":31,"index":70},{"line":2,"col":31,"index":70}],"9":[0,{"line":2,"col":22,"index":61},{"line":2,"col":32,"index":71}],"10":[0,{"line":2,"col":2,"index":41},{"line":2,"col":32,"index":71}],"11":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"12":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"13":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"14":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"15":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"16":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"17":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"18":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"19":[0,{"line":4,"col":6,"index":104},{"line":4,"col":7,"index":105}],"20":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"21":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"22":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"23":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"24":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"25":[0,{"line":5,"col":6,"index":117},{"line":5,"col":8,"index":119}],"26":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"27":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"28":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"29":[0,{"line":0,"col":0,"index":0},{"line":6,"col":126,"index":126}]}} \ No newline at end of file From 5b28d8892f53d489416edae9d24a6b3560e38851 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 29 Feb 2024 13:32:00 -0500 Subject: [PATCH 257/388] Fix lightclient typedefs The new syntax for parametric types has enabled us to catch the error here: the target type started with a lowercase letter, and so was accidentally a variable. --- examples/cosmos/lightclient/typedefs.qnt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/cosmos/lightclient/typedefs.qnt b/examples/cosmos/lightclient/typedefs.qnt index 342e8ab7f..9de850f85 100644 --- a/examples/cosmos/lightclient/typedefs.qnt +++ b/examples/cosmos/lightclient/typedefs.qnt @@ -13,8 +13,8 @@ module typedefs { Commits: Set[str] } - type Blockchain = int -> blockHeader - type LightBlockMap = int -> lightBlock + type Blockchain = int -> BlockHeader + type LightBlockMap = int -> LightBlock type LightBlockStatus = int -> str -} \ No newline at end of file +} From e0dd072c1280c05b545b6f0773c1bdd010fb3bfb Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 29 Feb 2024 13:41:09 -0500 Subject: [PATCH 258/388] Remove old comment --- quint/src/parsing/ToIrListener.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index 2dc64cd5b..a444e6d51 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -363,7 +363,6 @@ export class ToIrListener implements QuintListener { const defHead = ctx.typeDefHead() const name = defHead._typeName.text - // NOTE: `rhs` must precede `typeVariables` due to the stack order! const type = this.popType().unwrap(() => fail('internal error: type alias declaration parsed with no right hand side') ) From b9577318a729859eef8d2762451d2b45665743e8 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 29 Feb 2024 13:42:49 -0500 Subject: [PATCH 259/388] Remove unused import --- quint/src/graphics.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/graphics.ts b/quint/src/graphics.ts index d1fcbcb15..cafa467bc 100644 --- a/quint/src/graphics.ts +++ b/quint/src/graphics.ts @@ -8,7 +8,7 @@ * See LICENSE in the project root for license information. */ -import { strict as assert, fail } from 'assert' +import { strict as assert } from 'assert' import chalk from 'chalk' import { Doc, From 68d1322038dbaf126efae582f06d8cb1f3326802 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 29 Feb 2024 13:45:40 -0500 Subject: [PATCH 260/388] Remove abs from vscode completion --- vscode/quint-vscode/server/src/complete.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/vscode/quint-vscode/server/src/complete.ts b/vscode/quint-vscode/server/src/complete.ts index e823d9660..cbeb7c855 100644 --- a/vscode/quint-vscode/server/src/complete.ts +++ b/vscode/quint-vscode/server/src/complete.ts @@ -219,7 +219,6 @@ function getSuggestedBuiltinsForType(type: QuintType): { name: string }[] { case 'oper': // no suggestions from here on case 'var': case 'sum': - case 'abs': case 'app': return [] } From 699219dd66795c5d14d4bdf4346367430a80e3b3 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 29 Feb 2024 13:51:13 -0500 Subject: [PATCH 261/388] Remove old comment --- quint/src/types/inferrer.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/quint/src/types/inferrer.ts b/quint/src/types/inferrer.ts index 16d26f8c0..481fa206a 100644 --- a/quint/src/types/inferrer.ts +++ b/quint/src/types/inferrer.ts @@ -24,7 +24,6 @@ import { simplify } from './simplification' export type TypeInferenceResult = [Map, Map] -// TODO: Get rid of this class? It is very shallow. What do we need it for? export class TypeInferrer extends ConstraintGeneratorVisitor { constructor(table: LookupTable, types?: Map) { super(solveConstraint, table, types) From 164ed1d9520c4fdf4215b4d613d48b6b0537710d Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 29 Feb 2024 20:11:20 -0500 Subject: [PATCH 262/388] Ensure transformations can't mutate the original object There was some mutation happening via the transformer, which was wreaking havoc on attempts to complete #1298. Apparently it was also somehow leading to incorrect printing of sum type variants. I haven't had time to investigate why, but deep cloning the original object must be safer and it is fixing a blocking problem in ongoing work in #1298. Since the cases in which this causes problems are quite subtle, I havent been able to figure out how to test this directly. --- quint/package-lock.json | 128 ++++++++++++++------------ quint/package.json | 16 +--- quint/src/ir/IRTransformer.ts | 13 +-- quint/test/types/aliasInliner.test.ts | 14 +-- 4 files changed, 89 insertions(+), 82 deletions(-) diff --git a/quint/package-lock.json b/quint/package-lock.json index dd192ef04..026906f79 100644 --- a/quint/package-lock.json +++ b/quint/package-lock.json @@ -15,6 +15,7 @@ "@sweet-monads/either": "~3.2.0", "@sweet-monads/maybe": "~3.2.0", "@types/line-column": "^1.0.0", + "@types/lodash.clonedeep": "4.5.0", "@types/seedrandom": "^3.0.4", "antlr4ts": "^0.5.0-alpha.4", "chalk": "^4.1.2", @@ -23,6 +24,7 @@ "json-bigint": "^1.0.0", "line-column": "^1.0.2", "lodash": "^4.17.21", + "lodash.clonedeep": "4.5.0", "lodash.isequal": "^4.5.0", "seedrandom": "^3.0.5", "tar": "^6.1.14", @@ -181,9 +183,9 @@ } }, "node_modules/@babel/core": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", - "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", + "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", @@ -191,11 +193,11 @@ "@babel/generator": "^7.23.6", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.9", - "@babel/parser": "^7.23.9", - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9", + "@babel/helpers": "^7.24.0", + "@babel/parser": "^7.24.0", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -382,14 +384,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", - "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", + "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", "dev": true, "dependencies": { - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -481,9 +483,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -493,23 +495,23 @@ } }, "node_modules/@babel/template": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", - "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9" + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", - "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", + "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.23.5", @@ -518,8 +520,8 @@ "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -537,9 +539,9 @@ } }, "node_modules/@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.23.4", @@ -822,9 +824,9 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "engines": { "node": ">=6.0.0" @@ -1073,8 +1075,15 @@ "node_modules/@types/lodash": { "version": "4.14.202", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", - "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", - "dev": true + "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==" + }, + "node_modules/@types/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@types/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-IHijjFVPJTvzvrNPz+6nQy5lZQb7uh807RfTIEaQBrZXrIGjZy0L2dEb3hju34J0eqbXLCY6Hub/g81Jl4pGCA==", + "dependencies": { + "@types/lodash": "*" + } }, "node_modules/@types/lodash.isequal": { "version": "4.5.8", @@ -1107,9 +1116,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.19.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.18.tgz", - "integrity": "sha512-80CP7B8y4PzZF0GWx15/gVWRrB5y/bIjNI84NK3cmQJu0WZwvmj2WMA5LcofQFVfLqqCSp545+U2LsrVzX36Zg==", + "version": "18.19.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.21.tgz", + "integrity": "sha512-2Q2NeB6BmiTFQi4DHBzncSoq/cJMLDdhPaAoJFnFCyD9a8VPZRf7a1GAwp1Edb7ROaZc5Jz/tnZyL6EsWMRaqw==", "dependencies": { "undici-types": "~5.26.4" } @@ -2400,9 +2409,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.682", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.682.tgz", - "integrity": "sha512-oCglfs8yYKs9RQjJFOHonSnhikPK3y+0SvSYc/YpYJV//6rqc0/hbwd0c7vgK4vrl6y2gJAwjkhkSGWK+z4KRA==", + "version": "1.4.689", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.689.tgz", + "integrity": "sha512-GatzRKnGPS1go29ep25reM94xxd1Wj8ritU0yRhCJ/tr1Bg8gKnm6R9O/yPOhGQBoLMZ9ezfrpghNaTw97C/PQ==", "dev": true }, "node_modules/emoji-regex": { @@ -2416,18 +2425,18 @@ "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==" }, "node_modules/es-abstract": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.4.tgz", - "integrity": "sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==", + "version": "1.22.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz", + "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.1", "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.6", + "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", "es-define-property": "^1.0.0", "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.2", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", "get-intrinsic": "^1.2.4", @@ -2435,15 +2444,15 @@ "globalthis": "^1.0.3", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.1", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", "hasown": "^2.0.1", "internal-slot": "^1.0.7", "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", @@ -2456,10 +2465,10 @@ "string.prototype.trim": "^1.2.8", "string.prototype.trimend": "^1.0.7", "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.1", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.5", "unbox-primitive": "^1.0.2", "which-typed-array": "^1.1.14" }, @@ -6515,6 +6524,11 @@ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" + }, "node_modules/lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", @@ -8533,12 +8547,12 @@ } }, "node_modules/side-channel": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", - "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "dependencies": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.7", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.4", "object-inspect": "^1.13.1" diff --git a/quint/package.json b/quint/package.json index 4bee3265d..cda2d27d1 100644 --- a/quint/package.json +++ b/quint/package.json @@ -2,13 +2,7 @@ "name": "@informalsystems/quint", "version": "0.18.3", "description": "Core tool for the Quint specification language", - "keywords": [ - "temporal", - "logic", - "formal", - "specification", - "verification" - ], + "keywords": ["temporal", "logic", "formal", "specification", "verification"], "homepage": "https://github.com/informalsystems/quint", "bugs": "https://github.com/informalsystems/quint/issues", "license": "Apache 2.0", @@ -35,11 +29,7 @@ "bin": { "quint": "dist/src/cli.js" }, - "files": [ - "README.md", - "dist/**/*", - "test/**/*.ts" - ], + "files": ["README.md", "dist/**/*", "test/**/*.ts"], "engines": { "node": "18 - 20" }, @@ -63,6 +53,8 @@ "line-column": "^1.0.2", "lodash": "^4.17.21", "lodash.isequal": "^4.5.0", + "lodash.clonedeep": "4.5.0", + "@types/lodash.clonedeep": "4.5.0", "seedrandom": "^3.0.5", "tar": "^6.1.14", "yargs": "^17.2.1" diff --git a/quint/src/ir/IRTransformer.ts b/quint/src/ir/IRTransformer.ts index 2f3401240..68789e632 100644 --- a/quint/src/ir/IRTransformer.ts +++ b/quint/src/ir/IRTransformer.ts @@ -17,6 +17,7 @@ import * as ir from './quintIr' import * as t from './quintTypes' import { unreachable } from '../util' import { LookupDefinition } from '../names/base' +import cloneDeep from 'lodash.clonedeep' export class IRTransformer { enterModule?: (module: ir.QuintModule) => ir.QuintModule @@ -111,7 +112,7 @@ export class IRTransformer { * @returns the tranformed Quint module */ export function transformModule(transformer: IRTransformer, quintModule: ir.QuintModule): ir.QuintModule { - let newModule = { ...quintModule } + let newModule = cloneDeep(quintModule) if (transformer.enterModule) { newModule = transformer.enterModule(newModule) @@ -136,7 +137,7 @@ export function transformModule(transformer: IRTransformer, quintModule: ir.Quin * @returns the transformed Quint type */ export function transformType(transformer: IRTransformer, type: t.QuintType): t.QuintType { - let newType = { ...type } + let newType = cloneDeep(type) if (transformer.enterType) { newType = transformer.enterType(newType) } @@ -317,7 +318,7 @@ export function transformLookupDefinition(transformer: IRTransformer, lud: Looku * @returns the transformed Quint definition */ export function transformDeclaration(transformer: IRTransformer, decl: ir.QuintDeclaration): ir.QuintDeclaration { - let newDecl = { ...decl } + let newDecl = cloneDeep(decl) if (transformer.enterDecl) { newDecl = transformer.enterDecl(newDecl) } @@ -375,7 +376,7 @@ export function transformDeclaration(transformer: IRTransformer, decl: ir.QuintD * @returns the transformed Quint definition */ export function transformDefinition(transformer: IRTransformer, def: ir.QuintDef): ir.QuintDef { - let newDef = { ...def } + let newDef = cloneDeep(def) if (transformer.enterDef) { newDef = transformer.enterDef(newDef) } @@ -450,7 +451,7 @@ export function transformDefinition(transformer: IRTransformer, def: ir.QuintDef * @returns the transformed Quint expression */ function transformExpression(transformer: IRTransformer, expr: ir.QuintEx): ir.QuintEx { - let newExpr = { ...expr } + let newExpr = cloneDeep(expr) if (transformer.enterExpr) { newExpr = transformer.enterExpr(newExpr) } @@ -542,7 +543,7 @@ function transformExpression(transformer: IRTransformer, expr: ir.QuintEx): ir.Q * @returns the transformed Quint row */ export function transformRow(transformer: IRTransformer, row: t.Row): t.Row { - let newRow = row + let newRow = cloneDeep(row) if (transformer.enterRow) { newRow = transformer.enterRow(newRow) } diff --git a/quint/test/types/aliasInliner.test.ts b/quint/test/types/aliasInliner.test.ts index 3d57494d1..f7f836b87 100644 --- a/quint/test/types/aliasInliner.test.ts +++ b/quint/test/types/aliasInliner.test.ts @@ -70,13 +70,13 @@ describe('inlineAliases', () => { const { modules } = inlineModule(quintModule) const expectedModule = dedent(`module A { - | type T1 = (B({}) | C({})) - | val C: (B({}) | C({})) = variant("C", Rec()) - | type T2 = (Some((B({}) | C({}))) | None({})) - | val B: (B({}) | C({})) = variant("B", Rec()) - | def Some: ((B({}) | C({}))) => (Some((B({}) | C({}))) | None({})) = ((__SomeParam) => variant("Some", __SomeParam)) - | val None: (Some((B({}) | C({}))) | None({})) = variant("None", Rec()) - | var x: (Some((B({}) | C({}))) | None({})) + | type T1 = (B | C) + | val C: (B | C) = variant("C", Rec()) + | type T2 = (Some((B | C)) | None) + | val B: (B | C) = variant("B", Rec()) + | def Some: ((B | C)) => (Some((B | C)) | None) = ((__SomeParam) => variant("Some", __SomeParam)) + | val None: (Some((B | C)) | None) = variant("None", Rec()) + | var x: (Some((B | C)) | None) |}`) assert.deepEqual(moduleToString(modules[0]), expectedModule) From 1ce07b31a0d5a6c484c359424cd0b98981e3b342 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 23 Feb 2024 12:03:46 -0500 Subject: [PATCH 263/388] Use addToResult for updating types This ensures that we only update the `this.types` thru the `addToResult` method, ensuring that any invariants we want to enforce about added types get applied throughout. --- quint/src/types/constraintGenerator.ts | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/quint/src/types/constraintGenerator.ts b/quint/src/types/constraintGenerator.ts index aa48e3ec6..97ca160f2 100644 --- a/quint/src/types/constraintGenerator.ts +++ b/quint/src/types/constraintGenerator.ts @@ -356,13 +356,11 @@ export class ConstraintGeneratorVisitor implements IRVisitor { // Apply substitution to environment // FIXME: We have to figure out the scope of the constraints/substitutions // https://github.com/informalsystems/quint/issues/690 - this.types = new Map( - [...this.types.entries()].map(([id, te]) => { - const newType = applySubstitution(this.table, subs, te.type) - const scheme: TypeScheme = this.quantify(newType) - return [id, scheme] - }) - ) + this.types.forEach((oldScheme, id) => { + const newType = applySubstitution(this.table, subs, oldScheme.type) + const newScheme: TypeScheme = this.quantify(newType) + this.addToResults(id, right(newScheme)) + }) return subs }) From 20454f7ed8367c47eec602125beb1f58b6d20abb Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 23 Feb 2024 12:37:18 -0500 Subject: [PATCH 264/388] Add method to quantify type defs --- quint/src/types/constraintGenerator.ts | 57 +++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 2 deletions(-) diff --git a/quint/src/types/constraintGenerator.ts b/quint/src/types/constraintGenerator.ts index 97ca160f2..05af2da7f 100644 --- a/quint/src/types/constraintGenerator.ts +++ b/quint/src/types/constraintGenerator.ts @@ -12,7 +12,7 @@ * @module */ -import { IRVisitor } from '../ir/IRVisitor' +import { IRVisitor, walkType } from '../ir/IRVisitor' import { QuintApp, QuintAssume, @@ -29,8 +29,9 @@ import { QuintStr, QuintVar, isAnnotatedDef, + QuintTypeAlias, } from '../ir/quintIr' -import { QuintType, QuintVarType, rowNames, typeNames } from '../ir/quintTypes' +import { QuintType, QuintVarType, Row, rowNames, typeNames } from '../ir/quintTypes' import { expressionToString, rowToString, typeToString } from '../ir/IRprinting' import { Either, left, mergeInMany, right } from '@sweet-monads/either' import { Error, ErrorTree, buildErrorLeaf, buildErrorTree, errorTreeToString } from '../errorTree' @@ -49,6 +50,7 @@ import { withConstraints, } from './specialConstraints' import { FreshVarGenerator } from '../FreshVarGenerator' +import { IRTransformer, transformType } from '../ir/IRTransformer' export type SolvingFunctionType = ( _table: LookupTable, @@ -416,6 +418,36 @@ export class ConstraintGeneratorVisitor implements IRVisitor { ) } + // Converts a type definition into a TypeScheme with all fresh variables, and + // a list of params providing the fresh type variables corresponding to the + // order they are specified in the type declaration. This is binding the type + // parameters of a declared polymorphic type via universal quantification. + // + // E.g., the type definition + // + // type Result[ok, err] = Ok(ok) | Err(err) + // + // Will produce the result + // + // { params: [fresh_ok, fresh_err], + // scheme: ∀(fresh_ok,fresh_err). Ok(fresh_ok) | Err(fresh_err) + // } + private quantifyTypeDef(typeDef: QuintTypeAlias): { params: string[]; scheme: TypeScheme } { + if (!typeDef.params || typeDef.params.length === 0) { + return { params: [], scheme: this.quantify(typeDef.type) } + } + + // Coordinates parameter names with their corresponding fresh variables + const varsMap: Map = new Map( + typeDef.params.map(param => [param, this.freshVarGenerator.freshVar(param)]) + ) + + // Parsing guarantees that every variable in a type def is in the params + const typeWithFreshVars = mapTypeVarNames(n => varsMap.get(n)!, typeDef.type) + + return { scheme: this.quantify(typeWithFreshVars), params: [...varsMap.values()] } + } + private quantify(type: QuintType): TypeScheme { const freeNames = this.currentFreeNames() const nonFreeNames = { @@ -478,3 +510,24 @@ function checkAnnotationGenerality( return right(subs) } } + +function mapTypeVarNames(f: (_: string) => string, t: QuintType): QuintType { + const transformer = new TypeVariableNameMapper(f) + return transformType(transformer, t) +} + +class TypeVariableNameMapper implements IRTransformer { + private mapper: (_: string) => string + + constructor(f: (_: string) => string) { + this.mapper = f + } + + exitVar(t: QuintVar): QuintVar { + return { ...t, name: this.mapper(t.name) } + } + + exitRow(r: Row): Row { + return r.kind === 'var' ? { ...r, name: this.mapper(r.name) } : r + } +} From d5b52e585471a24e95406431d23b0747d74e4236 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 28 Feb 2024 17:07:09 -0500 Subject: [PATCH 265/388] Enable accessing some state --- quint/src/types/constraintGenerator.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/quint/src/types/constraintGenerator.ts b/quint/src/types/constraintGenerator.ts index 05af2da7f..3ff773d63 100644 --- a/quint/src/types/constraintGenerator.ts +++ b/quint/src/types/constraintGenerator.ts @@ -84,6 +84,8 @@ function validateArity( } // A visitor that collects types and constraints for a module's expressions +// +// NOTE: Assumes all type applications have been resolved by typeApplicationResolution first export class ConstraintGeneratorVisitor implements IRVisitor { // Inject dependency to allow manipulation in unit tests constructor(solvingFunction: SolvingFunctionType, table: LookupTable, types?: Map) { @@ -97,13 +99,13 @@ export class ConstraintGeneratorVisitor implements IRVisitor { protected types: Map = new Map() protected errors: Map = new Map() + protected constraints: Constraint[] = [] + protected freshVarGenerator: FreshVarGenerator + protected table: LookupTable private solvingFunction: SolvingFunctionType - private constraints: Constraint[] = [] private builtinSignatures: Map = getSignatures() - private table: LookupTable - private freshVarGenerator: FreshVarGenerator // Track location descriptions for error tree traces private location: string = '' From f3cad9bd570e128face4cab954a59be6781ded37 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 29 Feb 2024 21:41:05 -0500 Subject: [PATCH 266/388] Polymorphic type declarations are working --- quint/src/FreshVarGenerator.ts | 2 +- quint/src/types/constraintGenerator.ts | 3 +- quint/src/types/inferrer.ts | 14 +- quint/src/types/typeApplicationResolution.ts | 140 +++++++++++++++++++ quint/test/types/inferrer.test.ts | 61 +++++--- 5 files changed, 199 insertions(+), 21 deletions(-) create mode 100644 quint/src/types/typeApplicationResolution.ts diff --git a/quint/src/FreshVarGenerator.ts b/quint/src/FreshVarGenerator.ts index 55db3d18b..672ebcabd 100644 --- a/quint/src/FreshVarGenerator.ts +++ b/quint/src/FreshVarGenerator.ts @@ -16,7 +16,7 @@ export class FreshVarGenerator { private freshVarCounters: Map = new Map() freshVar(prefix: string): string { - const counter = this.freshVarCounters.get(prefix)! ?? 0 + const counter = this.freshVarCounters.get(prefix) ?? 0 this.freshVarCounters.set(prefix, counter + 1) return `${prefix}${counter}` diff --git a/quint/src/types/constraintGenerator.ts b/quint/src/types/constraintGenerator.ts index 3ff773d63..d51e3aff4 100644 --- a/quint/src/types/constraintGenerator.ts +++ b/quint/src/types/constraintGenerator.ts @@ -32,7 +32,7 @@ import { QuintTypeAlias, } from '../ir/quintIr' import { QuintType, QuintVarType, Row, rowNames, typeNames } from '../ir/quintTypes' -import { expressionToString, rowToString, typeToString } from '../ir/IRprinting' +import { definitionToString, expressionToString, rowToString, typeToString } from '../ir/IRprinting' import { Either, left, mergeInMany, right } from '@sweet-monads/either' import { Error, ErrorTree, buildErrorLeaf, buildErrorTree, errorTreeToString } from '../errorTree' import { getSignatures } from './builtinSignatures' @@ -51,6 +51,7 @@ import { } from './specialConstraints' import { FreshVarGenerator } from '../FreshVarGenerator' import { IRTransformer, transformType } from '../ir/IRTransformer' +import { constraintToString, typeSchemeToString } from './printing' export type SolvingFunctionType = ( _table: LookupTable, diff --git a/quint/src/types/inferrer.ts b/quint/src/types/inferrer.ts index 481fa206a..752030206 100644 --- a/quint/src/types/inferrer.ts +++ b/quint/src/types/inferrer.ts @@ -21,12 +21,16 @@ import { TypeScheme } from './base' import { ConstraintGeneratorVisitor } from './constraintGenerator' import { solveConstraint } from './constraintSolver' import { simplify } from './simplification' +import { TypeApplicationResolver } from './typeApplicationResolution' +import { transformDeclaration, transformLookupDefinition } from '../ir/IRTransformer' export type TypeInferenceResult = [Map, Map] export class TypeInferrer extends ConstraintGeneratorVisitor { + private resolver: TypeApplicationResolver constructor(table: LookupTable, types?: Map) { super(solveConstraint, table, types) + this.resolver = new TypeApplicationResolver(this.table, this.freshVarGenerator) } /** @@ -38,8 +42,16 @@ export class TypeInferrer extends ConstraintGeneratorVisitor { * ids to the corresponding error for any problematic expressions. */ inferTypes(declarations: QuintDeclaration[]): TypeInferenceResult { + this.table.forEach((def, id) => { + // Don't resolve type definitions, since those should keep their original type variable names + // They are our source of truth for all resolutions + if (def.kind !== 'typedef') { + this.table.set(id, transformLookupDefinition(this.resolver, def)) + } + }) declarations.forEach(decl => { - walkDeclaration(this, decl) + const declWithTypeApplicationsResolved = transformDeclaration(this.resolver, decl) + walkDeclaration(this, declWithTypeApplicationsResolved) }) const simplifiedTypes = new Map([...this.types.entries()].map(([id, t]) => [id, simplify(t)])) return [this.errors, simplifiedTypes] diff --git a/quint/src/types/typeApplicationResolution.ts b/quint/src/types/typeApplicationResolution.ts new file mode 100644 index 000000000..4ea7a85c4 --- /dev/null +++ b/quint/src/types/typeApplicationResolution.ts @@ -0,0 +1,140 @@ +/* ---------------------------------------------------------------------------------- + * Copyright 2024 Informal Systems + * Licensed under the Apache License, Version 2.0. + * See LICENSE in the project root for license information. + * --------------------------------------------------------------------------------- */ + +/** + * Resolution of type application + * + * @author Shon Feder + * + * @module + */ + +import { fail } from 'assert' +import { FreshVarGenerator } from '../FreshVarGenerator' +import { IRTransformer, transformType } from '../ir/IRTransformer' +import { QuintTypeAlias } from '../ir/quintIr' +import { QuintAppType, QuintType, QuintVarType, Row, typeNames } from '../ir/quintTypes' +import { LookupTable } from '../names/base' +import { zip } from '../util' +import { TypeScheme } from './base' +import { Substitutions, applySubstitution } from './substitutions' + +export class TypeApplicationResolver implements IRTransformer { + /** Fresh variable generator, shared with the TypeInferrer */ + freshVarGenerator: FreshVarGenerator + // Lookup table from the parser + table: LookupTable + + constructor(table: LookupTable, freshVarGenerator: FreshVarGenerator) { + this.table = table + this.freshVarGenerator = freshVarGenerator + } + + exitType(t: QuintType): QuintType { + return this.resolveTypeApplications(t) + } + + // Converts a type definition into a TypeScheme with all fresh variables, and + // a list of params providing the fresh type variables corresponding to the + // order they are specified in the type declaration. This is binding the type + // parameters of a declared polymorphic type via universal quantification. + // + // E.g., the type definition + // + // type Result[ok, err] = Ok(ok) | Err(err) + // + // Will produce the result + // + // { params: [fresh_ok, fresh_err], + // scheme: ∀(fresh_ok,fresh_err). Ok(fresh_ok) | Err(fresh_err) + // } + private quantifyTypeDef(typeDef: QuintTypeAlias): { params: QuintVarType[]; scheme: TypeScheme } { + if (!typeDef.params || typeDef.params.length === 0) { + return { params: [], scheme: schemeOfParametricDef([], typeDef.type) } + } + + // Coordinates parameter names with their corresponding fresh variables + const varsMap: Map = new Map( + typeDef.params.map(param => [param, this.freshVarGenerator.freshVar(param)]) + ) + + // Parsing guarantees that every variable in a type def is in the params + const typeWithFreshVars = mapTypeVarNames(n => varsMap.get(n) ?? n, typeDef.type) + const freshParamNames = [...varsMap.values()] + const params: QuintVarType[] = freshParamNames.map(name => ({ kind: 'var', name })) + + return { scheme: schemeOfParametricDef(freshParamNames, typeWithFreshVars), params } + } + + private resolveTypeApp(t: QuintAppType): QuintType { + const typeDef = this.table.get(t.ctor.id!)! // TODO + if (typeDef.kind !== 'typedef' || !typeDef.type) { + fail(`invalid kind looked up for constructor of type application with id ${t.ctor.id} `) + } + const { params, scheme } = this.quantifyTypeDef(typeDef as QuintTypeAlias) + const subs: Substitutions = zip(params, t.args).map(([param, arg]) => ({ + kind: 'type', + name: param.name, + value: arg, + })) + const newType = applySubstitution(this.table, subs, scheme.type) + return newType + } + + // Transforms `t` by resolving all the type applications in all its sub-terms + // + // E.g., given + // + // type Foo[a, b] = (a, b) + // type Bar[x, y] = {i: x, j: y} + // + // + // resolveTypeAllication(Foo[a, {f: Bar[int, str]}]) => (a, {f: {i: int, j: str}}) + resolveTypeApplications(t: QuintType): QuintType { + const transformer = new TypeMapper(x => (x.kind === 'app' ? this.resolveTypeApp(x) : x)) + return transformType(transformer, t) + } +} + +function schemeOfParametricDef(param: string[], type: QuintType): TypeScheme { + const typeVariables = new Set([...typeNames(type).typeVariables].filter(name => param.includes(name))) + const rowVariables = new Set([...typeNames(type).rowVariables].filter(name => param.includes(name))) + return { type, typeVariables, rowVariables } +} + +// Map type variable names according to `f` +function mapTypeVarNames(f: (_: string) => string, t: QuintType): QuintType { + const transformer = new TypeVariableNameMapper(f) + return transformType(transformer, t) +} + +class TypeVariableNameMapper implements IRTransformer { + private mapper: (_: string) => string + + constructor(f: (_: string) => string) { + this.mapper = f + } + + exitVarType(t: QuintVarType): QuintVarType { + return { ...t, name: this.mapper(t.name) } + } + + exitRow(r: Row): Row { + return r.kind === 'var' ? { ...r, name: this.mapper(r.name) } : r + } +} + +class TypeMapper implements IRTransformer { + private mapper: (_: QuintType) => QuintType + + constructor(f: (_: QuintType) => QuintType) { + this.mapper = f + } + + exitType(t: QuintType): QuintType { + return this.mapper(t) + } +} diff --git a/quint/test/types/inferrer.test.ts b/quint/test/types/inferrer.test.ts index 5cf311add..be12dfcf3 100644 --- a/quint/test/types/inferrer.test.ts +++ b/quint/test/types/inferrer.test.ts @@ -397,24 +397,49 @@ module B { ) }) - // TODO - // it('checks correct polymorphic types', () => { - // const defs = [ - // 'type Result[ok, err] = Ok(ok) | Err(err)', - // `def result_map(r: Result[a, e], f: a => b): Result[b, e] = - // match r { - // | Ok(x) => Ok(f(x)) - // | Err(_) => r - // }`, - // ] - - // const [errors, table] = inferTypesForDefs(defs) - // assert.sameDeepMembers([...errors.entries()], []) - // assert.sameDeepMembers( - // [...table.entries()].map(([id, t]) => [id, typeSchemeToString(t)]), - // [] - // ) - // }) + it('checks correct polymorphic types', () => { + const defs = [ + 'type Option[a] = Some(a) | None', + 'type Result[ok, err] = Ok(ok) | Err(err)', + `def result_map(r: Result[a, e], f: a => b): Result[b, e] = + match r { + | Ok(x) => Ok(f(x)) + | Err(_) => r + }`, + `def option_to_result(o: Option[ok], e: err): Result[ok, err] = + match o { + | Some(x) => Ok(x) + | None => Err(e) + }`, + 'val nested_type_application: Result[Option[int], str] = Ok(Some(42))', + ] + + const [errors, _] = inferTypesForDefs(defs) + assert.sameDeepMembers([...errors.entries()], []) + }) + + it('fails when polymorphic types are not unifiable', () => { + const defs = [ + 'type Result[ok, err] = Ok(ok) | Err(err)', + `def result_map(r: Result[bool, e]): Result[int, e] = + match r { + | Ok(x) => Ok(x) + | Err(_) => r + }`, + ] + + const [errors] = inferTypesForDefs(defs) + assert.isNotEmpty([...errors.entries()]) + + const actualErrors = [...errors.entries()].map(e => errorTreeToString(e[1])) + const expectedError = `Couldn't unify bool and int +Trying to unify bool and int +Trying to unify { Ok: bool, Err: _t5 } and { Ok: int, Err: _t5 } +Trying to unify (Ok(bool) | Err(_t5)) and (Ok(int) | Err(_t5)) +Trying to unify ((Ok(bool) | Err(_t5))) => (Ok(bool) | Err(_t5)) and ((Ok(bool) | Err(_t5))) => (Ok(int) | Err(_t5)) +` + assert.deepEqual(actualErrors, [expectedError]) + }) it('fails when types are not unifiable', () => { const defs = ['def a = 1.map(p => p + 10)'] From 9b45e7bdc9c2fa275aa321404768c64902d438d3 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 29 Feb 2024 22:05:56 -0500 Subject: [PATCH 267/388] Cleanup --- quint/src/types/inferrer.ts | 8 +- quint/src/types/typeApplicationResolution.ts | 90 ++++++++++---------- 2 files changed, 50 insertions(+), 48 deletions(-) diff --git a/quint/src/types/inferrer.ts b/quint/src/types/inferrer.ts index 752030206..1fbfedfd1 100644 --- a/quint/src/types/inferrer.ts +++ b/quint/src/types/inferrer.ts @@ -42,16 +42,18 @@ export class TypeInferrer extends ConstraintGeneratorVisitor { * ids to the corresponding error for any problematic expressions. */ inferTypes(declarations: QuintDeclaration[]): TypeInferenceResult { + // Resolve all type applications used in expressions in the lookup table this.table.forEach((def, id) => { // Don't resolve type definitions, since those should keep their original type variable names // They are our source of truth for all resolutions if (def.kind !== 'typedef') { - this.table.set(id, transformLookupDefinition(this.resolver, def)) + const resolvedLookupDef = transformLookupDefinition(this.resolver, def) + this.table.set(id, resolvedLookupDef) } }) declarations.forEach(decl => { - const declWithTypeApplicationsResolved = transformDeclaration(this.resolver, decl) - walkDeclaration(this, declWithTypeApplicationsResolved) + const resolvedDecl = transformDeclaration(this.resolver, decl) + walkDeclaration(this, resolvedDecl) }) const simplifiedTypes = new Map([...this.types.entries()].map(([id, t]) => [id, simplify(t)])) return [this.errors, simplifiedTypes] diff --git a/quint/src/types/typeApplicationResolution.ts b/quint/src/types/typeApplicationResolution.ts index 4ea7a85c4..6ff453667 100644 --- a/quint/src/types/typeApplicationResolution.ts +++ b/quint/src/types/typeApplicationResolution.ts @@ -23,10 +23,10 @@ import { TypeScheme } from './base' import { Substitutions, applySubstitution } from './substitutions' export class TypeApplicationResolver implements IRTransformer { - /** Fresh variable generator, shared with the TypeInferrer */ - freshVarGenerator: FreshVarGenerator + // Fresh variable generator, shared with the TypeInferrer + private freshVarGenerator: FreshVarGenerator // Lookup table from the parser - table: LookupTable + private table: LookupTable constructor(table: LookupTable, freshVarGenerator: FreshVarGenerator) { this.table = table @@ -37,36 +37,18 @@ export class TypeApplicationResolver implements IRTransformer { return this.resolveTypeApplications(t) } - // Converts a type definition into a TypeScheme with all fresh variables, and - // a list of params providing the fresh type variables corresponding to the - // order they are specified in the type declaration. This is binding the type - // parameters of a declared polymorphic type via universal quantification. + // Transforms `t` by resolving all the type applications in all its sub-terms // - // E.g., the type definition + // E.g., given // - // type Result[ok, err] = Ok(ok) | Err(err) + // type Foo[a, b] = (a, b) + // type Bar[x, y] = {i: x, j: y} // - // Will produce the result // - // { params: [fresh_ok, fresh_err], - // scheme: ∀(fresh_ok,fresh_err). Ok(fresh_ok) | Err(fresh_err) - // } - private quantifyTypeDef(typeDef: QuintTypeAlias): { params: QuintVarType[]; scheme: TypeScheme } { - if (!typeDef.params || typeDef.params.length === 0) { - return { params: [], scheme: schemeOfParametricDef([], typeDef.type) } - } - - // Coordinates parameter names with their corresponding fresh variables - const varsMap: Map = new Map( - typeDef.params.map(param => [param, this.freshVarGenerator.freshVar(param)]) - ) - - // Parsing guarantees that every variable in a type def is in the params - const typeWithFreshVars = mapTypeVarNames(n => varsMap.get(n) ?? n, typeDef.type) - const freshParamNames = [...varsMap.values()] - const params: QuintVarType[] = freshParamNames.map(name => ({ kind: 'var', name })) - - return { scheme: schemeOfParametricDef(freshParamNames, typeWithFreshVars), params } + // resolveTypeAllications(Foo[a, {f: Bar[int, str]}]) = (a, {f: {i: int, j: str}}) + resolveTypeApplications(t: QuintType): QuintType { + const f: (_: QuintType) => QuintType = x => (x.kind !== 'app' ? x : this.resolveTypeApp(x)) + return mapType(f, t) } private resolveTypeApp(t: QuintAppType): QuintType { @@ -74,35 +56,47 @@ export class TypeApplicationResolver implements IRTransformer { if (typeDef.kind !== 'typedef' || !typeDef.type) { fail(`invalid kind looked up for constructor of type application with id ${t.ctor.id} `) } - const { params, scheme } = this.quantifyTypeDef(typeDef as QuintTypeAlias) + const { params, type } = this.freshTypeFromDef(typeDef as QuintTypeAlias) const subs: Substitutions = zip(params, t.args).map(([param, arg]) => ({ kind: 'type', name: param.name, value: arg, })) - const newType = applySubstitution(this.table, subs, scheme.type) + const newType = applySubstitution(this.table, subs, type) return newType } - // Transforms `t` by resolving all the type applications in all its sub-terms + // Given a type definition, extract the type it is defined by (with all type + // parameters replaced with fresh variables) and a list of params giving the + // fresh type variables in the order corresponding to the params they + // replaced in the type declaration. // - // E.g., given + // E.g., the type definition // - // type Foo[a, b] = (a, b) - // type Bar[x, y] = {i: x, j: y} + // type Result[ok, err] = Ok(ok) | Err(err) // + // Will produce the result // - // resolveTypeAllication(Foo[a, {f: Bar[int, str]}]) => (a, {f: {i: int, j: str}}) - resolveTypeApplications(t: QuintType): QuintType { - const transformer = new TypeMapper(x => (x.kind === 'app' ? this.resolveTypeApp(x) : x)) - return transformType(transformer, t) - } -} + // { params: [fresh_ok, fresh_err], + // type: (Ok(fresh_ok) | Err(fresh_err)) + // } + private freshTypeFromDef(typeDef: QuintTypeAlias): { params: QuintVarType[]; type: QuintType } { + if (!typeDef.params || typeDef.params.length === 0) { + return { params: [], type: typeDef.type } + } + + // Coordinates parameter names with their corresponding fresh variables + const varsMap: Map = new Map( + typeDef.params.map(param => [param, this.freshVarGenerator.freshVar(param)]) + ) + + // Parsing guarantees that every variable in a type def is in the params + const type = mapTypeVarNames(n => varsMap.get(n) ?? n, typeDef.type) + const freshParamNames = [...varsMap.values()] + const params: QuintVarType[] = freshParamNames.map(name => ({ kind: 'var', name })) -function schemeOfParametricDef(param: string[], type: QuintType): TypeScheme { - const typeVariables = new Set([...typeNames(type).typeVariables].filter(name => param.includes(name))) - const rowVariables = new Set([...typeNames(type).rowVariables].filter(name => param.includes(name))) - return { type, typeVariables, rowVariables } + return { type, params } + } } // Map type variable names according to `f` @@ -127,6 +121,12 @@ class TypeVariableNameMapper implements IRTransformer { } } +// Transform `t`, and all its subterms, by `f` +function mapType(f: (_: QuintType) => QuintType, t: QuintType): QuintType { + const transformer = new TypeMapper(f) + return transformType(transformer, t) +} + class TypeMapper implements IRTransformer { private mapper: (_: QuintType) => QuintType From 33c1b7fb3abb0a023ce82b83df411893ff41c209 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 29 Feb 2024 22:28:01 -0500 Subject: [PATCH 268/388] Fix formatting --- quint/src/types/constraintGenerator.ts | 7 +++---- quint/src/types/typeApplicationResolution.ts | 3 +-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/quint/src/types/constraintGenerator.ts b/quint/src/types/constraintGenerator.ts index d51e3aff4..b6c9afc5a 100644 --- a/quint/src/types/constraintGenerator.ts +++ b/quint/src/types/constraintGenerator.ts @@ -12,7 +12,7 @@ * @module */ -import { IRVisitor, walkType } from '../ir/IRVisitor' +import { IRVisitor } from '../ir/IRVisitor' import { QuintApp, QuintAssume, @@ -27,12 +27,12 @@ import { QuintName, QuintOpDef, QuintStr, + QuintTypeAlias, QuintVar, isAnnotatedDef, - QuintTypeAlias, } from '../ir/quintIr' import { QuintType, QuintVarType, Row, rowNames, typeNames } from '../ir/quintTypes' -import { definitionToString, expressionToString, rowToString, typeToString } from '../ir/IRprinting' +import { expressionToString, rowToString, typeToString } from '../ir/IRprinting' import { Either, left, mergeInMany, right } from '@sweet-monads/either' import { Error, ErrorTree, buildErrorLeaf, buildErrorTree, errorTreeToString } from '../errorTree' import { getSignatures } from './builtinSignatures' @@ -51,7 +51,6 @@ import { } from './specialConstraints' import { FreshVarGenerator } from '../FreshVarGenerator' import { IRTransformer, transformType } from '../ir/IRTransformer' -import { constraintToString, typeSchemeToString } from './printing' export type SolvingFunctionType = ( _table: LookupTable, diff --git a/quint/src/types/typeApplicationResolution.ts b/quint/src/types/typeApplicationResolution.ts index 6ff453667..c85f8766c 100644 --- a/quint/src/types/typeApplicationResolution.ts +++ b/quint/src/types/typeApplicationResolution.ts @@ -16,10 +16,9 @@ import { fail } from 'assert' import { FreshVarGenerator } from '../FreshVarGenerator' import { IRTransformer, transformType } from '../ir/IRTransformer' import { QuintTypeAlias } from '../ir/quintIr' -import { QuintAppType, QuintType, QuintVarType, Row, typeNames } from '../ir/quintTypes' +import { QuintAppType, QuintType, QuintVarType, Row } from '../ir/quintTypes' import { LookupTable } from '../names/base' import { zip } from '../util' -import { TypeScheme } from './base' import { Substitutions, applySubstitution } from './substitutions' export class TypeApplicationResolver implements IRTransformer { From d5d3d5021af5e2070a0765996c4ddc3572bab55f Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 29 Feb 2024 23:25:32 -0500 Subject: [PATCH 269/388] Use polymorphic types in option.qnt --- examples/language-features/option.qnt | 36 +++++++++++++++++++-------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/examples/language-features/option.qnt b/examples/language-features/option.qnt index 871eda916..ae524f1ec 100644 --- a/examples/language-features/option.qnt +++ b/examples/language-features/option.qnt @@ -1,12 +1,26 @@ module option { // A demonstration of sum types, specifying an option type. - // An option type for int values. - type VoteOption = + // A polymorphic option type + type Option[a] = + | Some(a) | None - | Some(int) - var votes: List[VoteOption] + // `o.optionMap(f)` is `Some(f(v))` if `o = Some(v)` or `None` of `o = None` + def optionMap(o: Option[a], f: a => b): Option[b] = + match o { + | Some(x) => Some(f(x)) + | None => None + } + + // `o.getOr(v)` is `x` or `Some(x) = o` or `v` if `o = None` + def getOr(o: Option[a], default: a): a = + match o { + | Some(x) => x + | None => default + } + + var votes: List[Option[int]] var outcome: int action init = all { @@ -18,22 +32,24 @@ module option { votes' = votes.append(Some(v)) } + action incrVote(i, n) = { + val vote0 = votes[i] + val vote1 = vote0.optionMap(x => x + n) + votes' = votes.replaceAt(i, vote1) + } + action unvote(i) = all { - votes[i] != None, votes' = votes.replaceAt(i, None), } val sumVotes = - votes.foldl(0, (sum, v) => match v { - | Some(n) => sum + n - | None => sum - } - ) + votes.foldl(0, (sum, v) => v.getOr(0) + sum) action step = all { any { nondet v = oneOf(Int); vote(v), nondet i = oneOf(votes.indices()); unvote(i), + nondet i = oneOf(votes.indices()); nondet v = oneOf(Int) incrVote(i, v), }, outcome' = sumVotes } From 12ca582f88095b51ca285a403d37ce9ea4dc4ef5 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 29 Feb 2024 23:34:04 -0500 Subject: [PATCH 270/388] Document polymorphic type declarations in lang.md --- doc/lang.md | 43 +++++++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/doc/lang.md b/doc/lang.md index 31c578b99..cc3ef8b01 100644 --- a/doc/lang.md +++ b/doc/lang.md @@ -147,31 +147,34 @@ This is the same type system as in Apalache: A type is one of the following: - - Basic type: `bool`, `int`, `str`. +- Basic type: `bool`, `int`, `str`. - - Uninterpreted type or type name: `IDENTIFIER_IN_CAPS`. +- Uninterpreted type or type name: `IDENTIFIER_IN_CAPS`. - - Type variable (parameter): `a`, ..., `z`. +- Type variable (parameter): `a`, ..., `z`. - - Set: `Set[T]` for a type `T`. +- Set: `Set[T]` for a type `T`. - - List: `List[T]` for a type `T`. +- List: `List[T]` for a type `T`. - - Tuple: `(T_1, T_2, ..., T_n)` for `n >= 2` types `T_1`, ..., `T_n`. +- Tuple: `(T_1, T_2, ..., T_n)` for `n >= 2` types `T_1`, ..., `T_n`. - - Record: `{ name_1: T_1, name_2: T_2, ..., name_n: T_n }` - for `n >= 1` types `T_1`, ..., `T_n`. +- Record: `{ name_1: T_1, name_2: T_2, ..., name_n: T_n }` + for `n >= 1` types `T_1`, ..., `T_n`. - - Function: `T1 -> T2` for types `T1` and `T2`. +- Function: `T1 -> T2` for types `T1` and `T2`. - - Operator: `(T_1, ..., T_n) => R` for `n >= 0` argument types `T_1, ..., T_n` - and result type `R`. +- Operator: `(T_1, ..., T_n) => R` for `n >= 0` argument types `T_1, ..., T_n` + and result type `R`. - - Sum Types: `type T = L_1(T_1) | ... | L_n(T_n) ` for `n >= 1`, argument types - `T_1`, ..., `T_n`, and a type alais `T`. +- Sum Types: `type T = L_1(T_1) | ... | L_n(T_n) ` for `n >= 1`, argument types + `T_1`, ..., `T_n`, and a type alais `T`. - - Type in parentheses: `(T)` for a type `T`. +- Type in parentheses: `(T)` for a type `T`. +- An instance of a defined polymorphic type `T[T_1, ..., T_n]` for a defined type + constructor with type parameters `T[p_1, ..., p_n]` and types `T_1, ..., + T_n`. It is often convenient to declare a type alias. You can use `type` to define an alias inside a module definition. For instance: @@ -180,6 +183,18 @@ an alias inside a module definition. For instance: type Temperature = int ``` +A type alias specified with type parameters defines a polymorphic type +constructor for instances of the defined type. For instance, given + +```bluespec +type Option[a] = + | Some(a) + | None +``` + +You can then construct concrete types such as `Option[int]` or +`Option[List[int]]`. + A type identifier can also introduce an uninterpreted type by defining a type without any constructors for values of that type: ```bluespec From b3aec3f35725d7c382a3a23c274fd7e8363c0cb8 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Mar 2024 11:58:58 -0500 Subject: [PATCH 271/388] Clean up dead code --- quint/src/types/constraintGenerator.ts | 54 +------------------------- 1 file changed, 1 insertion(+), 53 deletions(-) diff --git a/quint/src/types/constraintGenerator.ts b/quint/src/types/constraintGenerator.ts index b6c9afc5a..4a31fd09c 100644 --- a/quint/src/types/constraintGenerator.ts +++ b/quint/src/types/constraintGenerator.ts @@ -99,12 +99,11 @@ export class ConstraintGeneratorVisitor implements IRVisitor { protected types: Map = new Map() protected errors: Map = new Map() - protected constraints: Constraint[] = [] protected freshVarGenerator: FreshVarGenerator protected table: LookupTable + private constraints: Constraint[] = [] private solvingFunction: SolvingFunctionType - private builtinSignatures: Map = getSignatures() // Track location descriptions for error tree traces @@ -420,36 +419,6 @@ export class ConstraintGeneratorVisitor implements IRVisitor { ) } - // Converts a type definition into a TypeScheme with all fresh variables, and - // a list of params providing the fresh type variables corresponding to the - // order they are specified in the type declaration. This is binding the type - // parameters of a declared polymorphic type via universal quantification. - // - // E.g., the type definition - // - // type Result[ok, err] = Ok(ok) | Err(err) - // - // Will produce the result - // - // { params: [fresh_ok, fresh_err], - // scheme: ∀(fresh_ok,fresh_err). Ok(fresh_ok) | Err(fresh_err) - // } - private quantifyTypeDef(typeDef: QuintTypeAlias): { params: string[]; scheme: TypeScheme } { - if (!typeDef.params || typeDef.params.length === 0) { - return { params: [], scheme: this.quantify(typeDef.type) } - } - - // Coordinates parameter names with their corresponding fresh variables - const varsMap: Map = new Map( - typeDef.params.map(param => [param, this.freshVarGenerator.freshVar(param)]) - ) - - // Parsing guarantees that every variable in a type def is in the params - const typeWithFreshVars = mapTypeVarNames(n => varsMap.get(n)!, typeDef.type) - - return { scheme: this.quantify(typeWithFreshVars), params: [...varsMap.values()] } - } - private quantify(type: QuintType): TypeScheme { const freeNames = this.currentFreeNames() const nonFreeNames = { @@ -512,24 +481,3 @@ function checkAnnotationGenerality( return right(subs) } } - -function mapTypeVarNames(f: (_: string) => string, t: QuintType): QuintType { - const transformer = new TypeVariableNameMapper(f) - return transformType(transformer, t) -} - -class TypeVariableNameMapper implements IRTransformer { - private mapper: (_: string) => string - - constructor(f: (_: string) => string) { - this.mapper = f - } - - exitVar(t: QuintVar): QuintVar { - return { ...t, name: this.mapper(t.name) } - } - - exitRow(r: Row): Row { - return r.kind === 'var' ? { ...r, name: this.mapper(r.name) } : r - } -} From 32a48274c55a4d34836cd7be9fd686b7d4a759b8 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Mar 2024 13:38:16 -0500 Subject: [PATCH 272/388] Cleanup --- quint/src/types/typeApplicationResolution.ts | 27 ++++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/quint/src/types/typeApplicationResolution.ts b/quint/src/types/typeApplicationResolution.ts index c85f8766c..c84ce9474 100644 --- a/quint/src/types/typeApplicationResolution.ts +++ b/quint/src/types/typeApplicationResolution.ts @@ -14,6 +14,7 @@ import { fail } from 'assert' import { FreshVarGenerator } from '../FreshVarGenerator' +import { typeToString } from '../ir/IRprinting' import { IRTransformer, transformType } from '../ir/IRTransformer' import { QuintTypeAlias } from '../ir/quintIr' import { QuintAppType, QuintType, QuintVarType, Row } from '../ir/quintTypes' @@ -21,6 +22,7 @@ import { LookupTable } from '../names/base' import { zip } from '../util' import { Substitutions, applySubstitution } from './substitutions' +/** Resolves all type applications in an IR object */ export class TypeApplicationResolver implements IRTransformer { // Fresh variable generator, shared with the TypeInferrer private freshVarGenerator: FreshVarGenerator @@ -44,30 +46,45 @@ export class TypeApplicationResolver implements IRTransformer { // type Bar[x, y] = {i: x, j: y} // // - // resolveTypeAllications(Foo[a, {f: Bar[int, str]}]) = (a, {f: {i: int, j: str}}) + // resolveTypeApplications(Foo[a, {f: Bar[int, str]}]) = (a, {f: {i: int, j: str}}) resolveTypeApplications(t: QuintType): QuintType { const f: (_: QuintType) => QuintType = x => (x.kind !== 'app' ? x : this.resolveTypeApp(x)) return mapType(f, t) } private resolveTypeApp(t: QuintAppType): QuintType { - const typeDef = this.table.get(t.ctor.id!)! // TODO + if (!t.ctor.id) { + // This should be ensured by parsing + fail( + `invalid IR node: type constructor ${t.ctor.name} in type application ${typeToString(t)} id ${t.id} has no id` + ) + } + + const typeDef = this.table.get(t.ctor.id) + if (!typeDef) { + // This should be ensured by name resolution + fail(`invalid IR reference: type constructor ${t.ctor.name} with id ${t.ctor.id} has no type definition`) + } + if (typeDef.kind !== 'typedef' || !typeDef.type) { + // This should be ensured by the grammar and by name resolution fail(`invalid kind looked up for constructor of type application with id ${t.ctor.id} `) } + const { params, type } = this.freshTypeFromDef(typeDef as QuintTypeAlias) + + // Substitute the type `args` for each corresponding fresh variable const subs: Substitutions = zip(params, t.args).map(([param, arg]) => ({ kind: 'type', name: param.name, value: arg, })) - const newType = applySubstitution(this.table, subs, type) - return newType + return applySubstitution(this.table, subs, type) } // Given a type definition, extract the type it is defined by (with all type // parameters replaced with fresh variables) and a list of params giving the - // fresh type variables in the order corresponding to the params they + // fresh type variables in the order corresponding to the params they // replaced in the type declaration. // // E.g., the type definition From 2707ec1042d992bee723cf08ebaf960f292ca6aa Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Mar 2024 13:54:50 -0500 Subject: [PATCH 273/388] Update changelog --- CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2960af69a..9534e7ca6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,10 +8,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED ### Added + +- Added polymorphic type declarations, allowing abstracting commonly used data + types like `Option[a]` and `Result[err, ok]`. Note that this is not yet + supported by `verify`. (#1298) + ### Changed + +- The latest supported node version is now bounded at <= 20, which covers the + latest LTS. (#1380) + ### Deprecated ### Removed ### Fixed + +- Removed a dependency causing deprecation errors messages to be emitted. + (#1380) + ### Security ## v0.18.3 -- 2024-02-08 From 502008853381b0d3e92329532582b0b6c9ba2b73 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Mar 2024 14:10:32 -0500 Subject: [PATCH 274/388] Update the examples --- examples/.scripts/run-example.sh | 2 ++ examples/README.md | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/.scripts/run-example.sh b/examples/.scripts/run-example.sh index aacd34f45..4fdbea46b 100755 --- a/examples/.scripts/run-example.sh +++ b/examples/.scripts/run-example.sh @@ -60,6 +60,8 @@ result () { printf "https://github.com/informalsystems/quint/issues/1284" elif [[ "$file" == "classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt" && "$cmd" =~ (test|verify) ]] ; then printf "https://github.com/informalsystems/quint/issues/1299" + elif [[ "$file" == "language-features/option.qnt" && "$cmd" == "verify" ]] ; then + printf "https://github.com/informalsystems/quint/issues/1391" fi fi } diff --git a/examples/README.md b/examples/README.md index 5cd3b2523..a51536d54 100644 --- a/examples/README.md +++ b/examples/README.md @@ -86,7 +86,7 @@ listed without any additional command line arguments. | [language-features/lists.qnt](./language-features/lists.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/maps.qnt](./language-features/maps.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/nondetEx.qnt](./language-features/nondetEx.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [language-features/option.qnt](./language-features/option.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [language-features/option.qnt](./language-features/option.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1391 | | [language-features/records.qnt](./language-features/records.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/sets.qnt](./language-features/sets.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/tuples.qnt](./language-features/tuples.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | From 3816c25e0172ced6bde5f4ebb71851786cf9c2e8 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Mar 2024 15:52:14 -0500 Subject: [PATCH 275/388] Make option.qnt runnable --- examples/language-features/option.qnt | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/examples/language-features/option.qnt b/examples/language-features/option.qnt index ae524f1ec..23e822872 100644 --- a/examples/language-features/option.qnt +++ b/examples/language-features/option.qnt @@ -47,9 +47,16 @@ module option { action step = all { any { - nondet v = oneOf(Int); vote(v), - nondet i = oneOf(votes.indices()); unvote(i), - nondet i = oneOf(votes.indices()); nondet v = oneOf(Int) incrVote(i, v), + nondet v = oneOf(0.to(5)); vote(v), + all { + votes.length() > 0, + nondet i = oneOf(votes.indices()); unvote(i), + }, + all { + votes.length() > 0, + nondet i = oneOf(votes.indices()); nondet v = oneOf(0.to(5)) incrVote(i, v), + } + }, outcome' = sumVotes } From 420f295df266fe009399c821e5366f3e9435f18e Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Mar 2024 16:05:10 -0500 Subject: [PATCH 276/388] Fix lints --- quint/src/types/constraintGenerator.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/quint/src/types/constraintGenerator.ts b/quint/src/types/constraintGenerator.ts index 4a31fd09c..3f19dd1fb 100644 --- a/quint/src/types/constraintGenerator.ts +++ b/quint/src/types/constraintGenerator.ts @@ -27,11 +27,10 @@ import { QuintName, QuintOpDef, QuintStr, - QuintTypeAlias, QuintVar, isAnnotatedDef, } from '../ir/quintIr' -import { QuintType, QuintVarType, Row, rowNames, typeNames } from '../ir/quintTypes' +import { QuintType, QuintVarType, rowNames, typeNames } from '../ir/quintTypes' import { expressionToString, rowToString, typeToString } from '../ir/IRprinting' import { Either, left, mergeInMany, right } from '@sweet-monads/either' import { Error, ErrorTree, buildErrorLeaf, buildErrorTree, errorTreeToString } from '../errorTree' @@ -50,7 +49,6 @@ import { withConstraints, } from './specialConstraints' import { FreshVarGenerator } from '../FreshVarGenerator' -import { IRTransformer, transformType } from '../ir/IRTransformer' export type SolvingFunctionType = ( _table: LookupTable, From 06c24e76e1cf32acea762f7a523eb33719b9dac2 Mon Sep 17 00:00:00 2001 From: bugarela Date: Fri, 1 Mar 2024 18:16:36 -0300 Subject: [PATCH 277/388] Resolve type applications at the IR level --- quint/src/quintAnalyzer.ts | 17 ++++++++++---- quint/src/types/inferrer.ts | 17 ++------------ quint/src/types/typeApplicationResolution.ts | 24 ++++++++++++++------ 3 files changed, 31 insertions(+), 27 deletions(-) diff --git a/quint/src/quintAnalyzer.ts b/quint/src/quintAnalyzer.ts index e7bc4b7c9..beace6c1f 100644 --- a/quint/src/quintAnalyzer.ts +++ b/quint/src/quintAnalyzer.ts @@ -22,6 +22,7 @@ import { ModeChecker } from './effects/modeChecker' import { QuintError } from './quintError' import { errorTreeToString } from './errorTree' import { MultipleUpdatesChecker } from './effects/MultipleUpdatesChecker' +import { TypeApplicationResolver } from './types/typeApplicationResolution' /* Products from static analysis */ export type AnalysisOutput = { @@ -42,7 +43,7 @@ export type AnalysisResult = [QuintError[], AnalysisOutput] */ export function analyzeModules(lookupTable: LookupTable, quintModules: QuintModule[]): AnalysisResult { const analyzer = new QuintAnalyzer(lookupTable) - quintModules.map(m => analyzer.analyzeDeclarations(m.declarations)) + quintModules.forEach(m => (m.declarations = analyzer.analyzeDeclarations(m.declarations))) return analyzer.getResult() } @@ -75,6 +76,7 @@ export function analyzeInc( * @param previousOutput - The previous analysis output to be used as a starting point. */ class QuintAnalyzer { + private typeApplicationResolver: TypeApplicationResolver private effectInferrer: EffectInferrer private typeInferrer: TypeInferrer private modeChecker: ModeChecker @@ -84,17 +86,20 @@ class QuintAnalyzer { private output: AnalysisOutput = { types: new Map(), effects: new Map(), modes: new Map() } constructor(lookupTable: LookupTable, previousOutput?: AnalysisOutput) { + this.typeApplicationResolver = new TypeApplicationResolver(lookupTable) this.typeInferrer = new TypeInferrer(lookupTable, previousOutput?.types) this.effectInferrer = new EffectInferrer(lookupTable, previousOutput?.effects) this.multipleUpdatesChecker = new MultipleUpdatesChecker() this.modeChecker = new ModeChecker(previousOutput?.modes) } - analyzeDeclarations(decls: QuintDeclaration[]): void { - const [typeErrMap, types] = this.typeInferrer.inferTypes(decls) - const [effectErrMap, effects] = this.effectInferrer.inferEffects(decls) + analyzeDeclarations(decls: QuintDeclaration[]): QuintDeclaration[] { + const resolvedDecls = this.typeApplicationResolver.resolveTypeApplications(decls) + + const [typeErrMap, types] = this.typeInferrer.inferTypes(resolvedDecls) + const [effectErrMap, effects] = this.effectInferrer.inferEffects(resolvedDecls) const updatesErrMap = this.multipleUpdatesChecker.checkEffects([...effects.values()]) - const [modeErrMap, modes] = this.modeChecker.checkModes(decls, effects) + const [modeErrMap, modes] = this.modeChecker.checkModes(resolvedDecls, effects) const errorTrees = [...typeErrMap, ...effectErrMap] @@ -114,6 +119,8 @@ class QuintAnalyzer { effects: new Map([...this.output.effects, ...effects]), modes: new Map([...this.output.modes, ...modes]), } + + return resolvedDecls } getResult(): AnalysisResult { diff --git a/quint/src/types/inferrer.ts b/quint/src/types/inferrer.ts index 1fbfedfd1..a0f349552 100644 --- a/quint/src/types/inferrer.ts +++ b/quint/src/types/inferrer.ts @@ -16,21 +16,17 @@ import { ErrorTree } from '../errorTree' import { walkDeclaration } from '../ir/IRVisitor' import { LookupTable } from '../names/base' -import { QuintDeclaration } from '../ir/quintIr' +import { QuintDeclaration, isDef } from '../ir/quintIr' import { TypeScheme } from './base' import { ConstraintGeneratorVisitor } from './constraintGenerator' import { solveConstraint } from './constraintSolver' import { simplify } from './simplification' -import { TypeApplicationResolver } from './typeApplicationResolution' -import { transformDeclaration, transformLookupDefinition } from '../ir/IRTransformer' export type TypeInferenceResult = [Map, Map] export class TypeInferrer extends ConstraintGeneratorVisitor { - private resolver: TypeApplicationResolver constructor(table: LookupTable, types?: Map) { super(solveConstraint, table, types) - this.resolver = new TypeApplicationResolver(this.table, this.freshVarGenerator) } /** @@ -43,17 +39,8 @@ export class TypeInferrer extends ConstraintGeneratorVisitor { */ inferTypes(declarations: QuintDeclaration[]): TypeInferenceResult { // Resolve all type applications used in expressions in the lookup table - this.table.forEach((def, id) => { - // Don't resolve type definitions, since those should keep their original type variable names - // They are our source of truth for all resolutions - if (def.kind !== 'typedef') { - const resolvedLookupDef = transformLookupDefinition(this.resolver, def) - this.table.set(id, resolvedLookupDef) - } - }) declarations.forEach(decl => { - const resolvedDecl = transformDeclaration(this.resolver, decl) - walkDeclaration(this, resolvedDecl) + walkDeclaration(this, decl) }) const simplifiedTypes = new Map([...this.types.entries()].map(([id, t]) => [id, simplify(t)])) return [this.errors, simplifiedTypes] diff --git a/quint/src/types/typeApplicationResolution.ts b/quint/src/types/typeApplicationResolution.ts index c84ce9474..a20d0a975 100644 --- a/quint/src/types/typeApplicationResolution.ts +++ b/quint/src/types/typeApplicationResolution.ts @@ -14,9 +14,10 @@ import { fail } from 'assert' import { FreshVarGenerator } from '../FreshVarGenerator' + import { typeToString } from '../ir/IRprinting' -import { IRTransformer, transformType } from '../ir/IRTransformer' -import { QuintTypeAlias } from '../ir/quintIr' +import { IRTransformer, transformDeclaration, transformLookupDefinition, transformType } from '../ir/IRTransformer' +import { QuintDeclaration, QuintTypeAlias } from '../ir/quintIr' import { QuintAppType, QuintType, QuintVarType, Row } from '../ir/quintTypes' import { LookupTable } from '../names/base' import { zip } from '../util' @@ -29,13 +30,22 @@ export class TypeApplicationResolver implements IRTransformer { // Lookup table from the parser private table: LookupTable - constructor(table: LookupTable, freshVarGenerator: FreshVarGenerator) { + constructor(table: LookupTable) { this.table = table - this.freshVarGenerator = freshVarGenerator + this.freshVarGenerator = new FreshVarGenerator() + + this.table.forEach((def, id) => { + const resolvedLookupDef = transformLookupDefinition(this, def) + this.table.set(id, resolvedLookupDef) + }) + } + + resolveTypeApplications(decls: QuintDeclaration[]): QuintDeclaration[] { + return decls.map(decl => transformDeclaration(this, decl)) } exitType(t: QuintType): QuintType { - return this.resolveTypeApplications(t) + return this.resolveTypeApplicationsForType(t) } // Transforms `t` by resolving all the type applications in all its sub-terms @@ -46,8 +56,8 @@ export class TypeApplicationResolver implements IRTransformer { // type Bar[x, y] = {i: x, j: y} // // - // resolveTypeApplications(Foo[a, {f: Bar[int, str]}]) = (a, {f: {i: int, j: str}}) - resolveTypeApplications(t: QuintType): QuintType { + // resolveTypeApplicationsForType(Foo[a, {f: Bar[int, str]}]) = (a, {f: {i: int, j: str}}) + private resolveTypeApplicationsForType(t: QuintType): QuintType { const f: (_: QuintType) => QuintType = x => (x.kind !== 'app' ? x : this.resolveTypeApp(x)) return mapType(f, t) } From 44ad95176dda6a01f1703c3886815cf50f6db2b2 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Mar 2024 22:36:48 -0500 Subject: [PATCH 278/388] Add regression test for 1391 --- quint/test/flattening/fullFlattener.test.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/quint/test/flattening/fullFlattener.test.ts b/quint/test/flattening/fullFlattener.test.ts index f55422999..6dc0c8c39 100644 --- a/quint/test/flattening/fullFlattener.test.ts +++ b/quint/test/flattening/fullFlattener.test.ts @@ -235,4 +235,19 @@ describe('flattenModules', () => { assertFlattenedModule(text) }) + + // Regression test for https://github.com/informalsystems/quint/issues/1391 + describe('can flatten with polymorphic types between different modules (#802)', () => { + const text = `module A { + type Foo[a] = F(a) + def mapFoo(x: Foo[a], f: a => b): Foo[b] = match x { F(v) => F(f(v)) } + } + + module B { + import A.* + val b: Foo[int] = F("one").mapFoo(_ => 1) + }` + + assertFlattenedModule(text) + }) }) From be70a9ed41ca1294e5022e9a1fda8acc5b758b06 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Mar 2024 23:08:40 -0500 Subject: [PATCH 279/388] Resolve type apps in type inference tests --- quint/test/types/inferrer.test.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/quint/test/types/inferrer.test.ts b/quint/test/types/inferrer.test.ts index be12dfcf3..1a1e20976 100644 --- a/quint/test/types/inferrer.test.ts +++ b/quint/test/types/inferrer.test.ts @@ -4,6 +4,7 @@ import { TypeInferenceResult, TypeInferrer } from '../../src/types/inferrer' import { typeSchemeToString } from '../../src/types/printing' import { errorTreeToString } from '../../src/errorTree' import { parseMockedModule } from '../util' +import { TypeApplicationResolver } from '../../src/types/typeApplicationResolution' // Utility used to print update `stringType` values to make // updating the expected values in the following tests less @@ -16,9 +17,12 @@ function _printUpdatedStringTypes(stringTypes: (string | bigint)[][]) { describe('inferTypes', () => { function inferTypesForModules(text: string): TypeInferenceResult { - const { modules, table } = parseMockedModule(text) + const { modules: parsedModules, table } = parseMockedModule(text) + // Type inference assumes all type applications (e.g., `Foo[int, str]`) have been resolved. + const resolver = new TypeApplicationResolver(table) const inferrer = new TypeInferrer(table) + const modules = parsedModules.map(m => ({ ...m, declarations: resolver.resolveTypeApplications(m.declarations) })) return inferrer.inferTypes(modules.flatMap(m => m.declarations)) } From bdabe6433e6f4dfc954e29d91374608bab6ddda1 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Mar 2024 23:08:56 -0500 Subject: [PATCH 280/388] Warn about mutations --- quint/src/quintAnalyzer.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/quint/src/quintAnalyzer.ts b/quint/src/quintAnalyzer.ts index beace6c1f..970c7bfc8 100644 --- a/quint/src/quintAnalyzer.ts +++ b/quint/src/quintAnalyzer.ts @@ -37,12 +37,16 @@ export type AnalysisResult = [QuintError[], AnalysisOutput] /** * Analyzes multiple Quint modules and returns the analysis result. * + * NOTE: This is modifies the `lookupTable` and the `quintModules`! + * See XXX for the mutation sites. + * * @param lookupTable - The lookup tables for the modules. * @param quintModules - The Quint modules to be analyzed. * @returns A tuple with a list of errors and the analysis output. */ export function analyzeModules(lookupTable: LookupTable, quintModules: QuintModule[]): AnalysisResult { const analyzer = new QuintAnalyzer(lookupTable) + // XXX: the modules are mutated here. quintModules.forEach(m => (m.declarations = analyzer.analyzeDeclarations(m.declarations))) return analyzer.getResult() } @@ -50,6 +54,9 @@ export function analyzeModules(lookupTable: LookupTable, quintModules: QuintModu /** * Analyzes declarations incrementally and returns the analysis result. * + * NOTE: This is modifies the `lookupTable`! + * See XXX for the mutation sites. + * * @param analysisOutput - The previous analysis output to be used as a starting point. * @param lookupTable - The lookup tables for the modules. * @param declarations - The Quint declarations to be analyzed. @@ -86,6 +93,7 @@ class QuintAnalyzer { private output: AnalysisOutput = { types: new Map(), effects: new Map(), modes: new Map() } constructor(lookupTable: LookupTable, previousOutput?: AnalysisOutput) { + // XXX: the lookUp table is mutated when TypeApplicationResolver is instantiated this.typeApplicationResolver = new TypeApplicationResolver(lookupTable) this.typeInferrer = new TypeInferrer(lookupTable, previousOutput?.types) this.effectInferrer = new EffectInferrer(lookupTable, previousOutput?.effects) @@ -96,6 +104,7 @@ class QuintAnalyzer { analyzeDeclarations(decls: QuintDeclaration[]): QuintDeclaration[] { const resolvedDecls = this.typeApplicationResolver.resolveTypeApplications(decls) + // XXX: the lookUp table is mutated during type inference const [typeErrMap, types] = this.typeInferrer.inferTypes(resolvedDecls) const [effectErrMap, effects] = this.effectInferrer.inferEffects(resolvedDecls) const updatesErrMap = this.multipleUpdatesChecker.checkEffects([...effects.values()]) From 3f7f1d9ae5a55bdbb0bca7eab85a98efcad8bbec Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 1 Mar 2024 23:53:22 -0500 Subject: [PATCH 281/388] Add error handling for invaild type applications Closes #1390 --- quint/src/quintAnalyzer.ts | 4 +- quint/src/types/typeApplicationResolution.ts | 54 +++++++++++++------- quint/test/types/inferrer.test.ts | 40 +++++++++++++-- 3 files changed, 75 insertions(+), 23 deletions(-) diff --git a/quint/src/quintAnalyzer.ts b/quint/src/quintAnalyzer.ts index 970c7bfc8..32cd723c8 100644 --- a/quint/src/quintAnalyzer.ts +++ b/quint/src/quintAnalyzer.ts @@ -102,7 +102,7 @@ class QuintAnalyzer { } analyzeDeclarations(decls: QuintDeclaration[]): QuintDeclaration[] { - const resolvedDecls = this.typeApplicationResolver.resolveTypeApplications(decls) + const [typAppErrMap, resolvedDecls] = this.typeApplicationResolver.resolveTypeApplications(decls) // XXX: the lookUp table is mutated during type inference const [typeErrMap, types] = this.typeInferrer.inferTypes(resolvedDecls) @@ -110,7 +110,7 @@ class QuintAnalyzer { const updatesErrMap = this.multipleUpdatesChecker.checkEffects([...effects.values()]) const [modeErrMap, modes] = this.modeChecker.checkModes(resolvedDecls, effects) - const errorTrees = [...typeErrMap, ...effectErrMap] + const errorTrees = [...typeErrMap, ...effectErrMap, ...typAppErrMap] // TODO: Type and effect checking should return QuintErrors instead of error trees this.errors.push( diff --git a/quint/src/types/typeApplicationResolution.ts b/quint/src/types/typeApplicationResolution.ts index a20d0a975..9f62ec4a3 100644 --- a/quint/src/types/typeApplicationResolution.ts +++ b/quint/src/types/typeApplicationResolution.ts @@ -12,7 +12,7 @@ * @module */ -import { fail } from 'assert' +import { buildErrorLeaf, buildErrorTree, ErrorTree } from '../errorTree' import { FreshVarGenerator } from '../FreshVarGenerator' import { typeToString } from '../ir/IRprinting' @@ -22,9 +22,12 @@ import { QuintAppType, QuintType, QuintVarType, Row } from '../ir/quintTypes' import { LookupTable } from '../names/base' import { zip } from '../util' import { Substitutions, applySubstitution } from './substitutions' +import assert from 'assert' /** Resolves all type applications in an IR object */ export class TypeApplicationResolver implements IRTransformer { + // Errors found during type application resolution + private errors: Map = new Map() // Fresh variable generator, shared with the TypeInferrer private freshVarGenerator: FreshVarGenerator // Lookup table from the parser @@ -40,8 +43,10 @@ export class TypeApplicationResolver implements IRTransformer { }) } - resolveTypeApplications(decls: QuintDeclaration[]): QuintDeclaration[] { - return decls.map(decl => transformDeclaration(this, decl)) + resolveTypeApplications(decls: QuintDeclaration[]): [Map, QuintDeclaration[]] { + const resolvedDecls = decls.map(decl => transformDeclaration(this, decl)) + const errors = this.errors + return [errors, resolvedDecls] } exitType(t: QuintType): QuintType { @@ -63,26 +68,39 @@ export class TypeApplicationResolver implements IRTransformer { } private resolveTypeApp(t: QuintAppType): QuintType { - if (!t.ctor.id) { - // This should be ensured by parsing - fail( - `invalid IR node: type constructor ${t.ctor.name} in type application ${typeToString(t)} id ${t.id} has no id` - ) - } + // Ensured by parsing + assert(t.id, `invalid IR node: type application ${typeToString(t)} has no id`) + // Ensured by parsing + assert( + t.ctor.id, + `invalid IR node: type constructor ${t.ctor.name} in type application ${typeToString(t)} id ${t.id} has no id` + ) const typeDef = this.table.get(t.ctor.id) - if (!typeDef) { - // This should be ensured by name resolution - fail(`invalid IR reference: type constructor ${t.ctor.name} with id ${t.ctor.id} has no type definition`) - } - - if (typeDef.kind !== 'typedef' || !typeDef.type) { - // This should be ensured by the grammar and by name resolution - fail(`invalid kind looked up for constructor of type application with id ${t.ctor.id} `) - } + // Ensured by name resolution + assert(typeDef, `invalid IR reference: type constructor ${t.ctor.name} with id ${t.ctor.id} has no type definition`) + // Ensured by the grammar and by name resolution + assert( + typeDef.kind === 'typedef' && typeDef.type, + `invalid kind looked up for constructor of type application with id ${t.ctor.id} ` + ) const { params, type } = this.freshTypeFromDef(typeDef as QuintTypeAlias) + // NOTE: Early exit on error + // Check for arity mismatch in type application + if (params.length !== t.args.length) { + const ctorMsg = typeToString(t.ctor) + const typeArgsMsg = t.args.map(typeToString).join(', ') + const manyOrFew = params.length > t.args.length ? 'few' : 'many' + const err = buildErrorLeaf( + `applying type constructor ${ctorMsg} to arguments ${typeArgsMsg}`, + `too ${manyOrFew} arguments supplied: ${ctorMsg} only accepts ${params.length} parameters` + ) + this.errors.set(t.id, err) + return t + } + // Substitute the type `args` for each corresponding fresh variable const subs: Substitutions = zip(params, t.args).map(([param, arg]) => ({ kind: 'type', diff --git a/quint/test/types/inferrer.test.ts b/quint/test/types/inferrer.test.ts index 1a1e20976..a3471cf5d 100644 --- a/quint/test/types/inferrer.test.ts +++ b/quint/test/types/inferrer.test.ts @@ -2,7 +2,7 @@ import { describe, it } from 'mocha' import { assert } from 'chai' import { TypeInferenceResult, TypeInferrer } from '../../src/types/inferrer' import { typeSchemeToString } from '../../src/types/printing' -import { errorTreeToString } from '../../src/errorTree' +import { ErrorTree, errorTreeToString } from '../../src/errorTree' import { parseMockedModule } from '../util' import { TypeApplicationResolver } from '../../src/types/typeApplicationResolution' @@ -22,8 +22,17 @@ describe('inferTypes', () => { // Type inference assumes all type applications (e.g., `Foo[int, str]`) have been resolved. const resolver = new TypeApplicationResolver(table) const inferrer = new TypeInferrer(table) - const modules = parsedModules.map(m => ({ ...m, declarations: resolver.resolveTypeApplications(m.declarations) })) - return inferrer.inferTypes(modules.flatMap(m => m.declarations)) + + // Used to collect errors found during type application + let typeAppErrs: Map = new Map() + const modules = parsedModules.map(m => { + const [errs, declarations] = resolver.resolveTypeApplications(m.declarations) + typeAppErrs = new Map([...typeAppErrs, ...errs]) + return { ...m, declarations } + }) + const [inferenceErrors, inferenceSchemes] = inferrer.inferTypes(modules.flatMap(m => m.declarations)) + const combinedErrors = new Map([...inferenceErrors, ...typeAppErrs]) + return [combinedErrors, inferenceSchemes] } function inferTypesForDefs(defs: string[]): TypeInferenceResult { @@ -445,6 +454,31 @@ Trying to unify ((Ok(bool) | Err(_t5))) => (Ok(bool) | Err(_t5)) and ((Ok(bool) assert.deepEqual(actualErrors, [expectedError]) }) + it('errors when polymorphic types are applied to invalid numbers of arguments', () => { + const defs = [ + 'type Result[ok, err] = Ok(ok) | Err(err)', + `val too_many: Result[a, b, c] = Ok(1)`, + `val too_few: Result[a] = Ok(1)`, + ] + + const [errors] = inferTypesForDefs(defs) + assert.isNotEmpty([...errors.entries()]) + + const actualErrors = [...errors.entries()].map(e => errorTreeToString(e[1])) + const expectedErrors = [ + `Couldn't unify sum and app +Trying to unify (Ok(int) | Err(_t3)) and Result[a, b, c] +`, + `too many arguments supplied: Result only accepts 2 parameters +applying type constructor Result to arguments a, b, c +`, + `too few arguments supplied: Result only accepts 2 parameters +applying type constructor Result to arguments a +`, + ] + assert.deepEqual(actualErrors, expectedErrors) + }) + it('fails when types are not unifiable', () => { const defs = ['def a = 1.map(p => p + 10)'] From 07fbfd0e545037aa685713c755c7f5d4d23d8352 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Sat, 2 Mar 2024 00:07:42 -0500 Subject: [PATCH 282/388] Fix lints --- quint/src/types/inferrer.ts | 2 +- quint/src/types/typeApplicationResolution.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/quint/src/types/inferrer.ts b/quint/src/types/inferrer.ts index a0f349552..f1bb378a9 100644 --- a/quint/src/types/inferrer.ts +++ b/quint/src/types/inferrer.ts @@ -16,7 +16,7 @@ import { ErrorTree } from '../errorTree' import { walkDeclaration } from '../ir/IRVisitor' import { LookupTable } from '../names/base' -import { QuintDeclaration, isDef } from '../ir/quintIr' +import { QuintDeclaration } from '../ir/quintIr' import { TypeScheme } from './base' import { ConstraintGeneratorVisitor } from './constraintGenerator' import { solveConstraint } from './constraintSolver' diff --git a/quint/src/types/typeApplicationResolution.ts b/quint/src/types/typeApplicationResolution.ts index 9f62ec4a3..7dd83d45e 100644 --- a/quint/src/types/typeApplicationResolution.ts +++ b/quint/src/types/typeApplicationResolution.ts @@ -12,7 +12,7 @@ * @module */ -import { buildErrorLeaf, buildErrorTree, ErrorTree } from '../errorTree' +import { ErrorTree, buildErrorLeaf } from '../errorTree' import { FreshVarGenerator } from '../FreshVarGenerator' import { typeToString } from '../ir/IRprinting' From 862ee0aaac27e48a881b968a9c812a47759f4892 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Sat, 2 Mar 2024 00:13:18 -0500 Subject: [PATCH 283/388] Update examples --- examples/.scripts/run-example.sh | 2 +- examples/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/.scripts/run-example.sh b/examples/.scripts/run-example.sh index 4fdbea46b..e64273133 100755 --- a/examples/.scripts/run-example.sh +++ b/examples/.scripts/run-example.sh @@ -61,7 +61,7 @@ result () { elif [[ "$file" == "classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt" && "$cmd" =~ (test|verify) ]] ; then printf "https://github.com/informalsystems/quint/issues/1299" elif [[ "$file" == "language-features/option.qnt" && "$cmd" == "verify" ]] ; then - printf "https://github.com/informalsystems/quint/issues/1391" + printf "https://github.com/informalsystems/quint/issues/1393" fi fi } diff --git a/examples/README.md b/examples/README.md index a51536d54..cf82deffe 100644 --- a/examples/README.md +++ b/examples/README.md @@ -86,7 +86,7 @@ listed without any additional command line arguments. | [language-features/lists.qnt](./language-features/lists.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/maps.qnt](./language-features/maps.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/nondetEx.qnt](./language-features/nondetEx.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [language-features/option.qnt](./language-features/option.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1391 | +| [language-features/option.qnt](./language-features/option.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1393 | | [language-features/records.qnt](./language-features/records.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/sets.qnt](./language-features/sets.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/tuples.qnt](./language-features/tuples.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | From df21b96a42e636038787763a370ba8d7b40afc62 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 5 Mar 2024 09:49:26 -0300 Subject: [PATCH 284/388] Track depth of lambda params --- quint/src/ir/IRVisitor.ts | 6 ++++++ quint/src/names/resolver.ts | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/quint/src/ir/IRVisitor.ts b/quint/src/ir/IRVisitor.ts index f321ef8df..b7b4195a5 100644 --- a/quint/src/ir/IRVisitor.ts +++ b/quint/src/ir/IRVisitor.ts @@ -444,6 +444,9 @@ export function walkExpression(visitor: IRVisitor, expr: ir.QuintEx): void { break } case 'lambda': + if (visitor.definitionDepth !== undefined) { + visitor.definitionDepth++ + } if (visitor.enterLambda) { visitor.enterLambda(expr) } @@ -457,6 +460,9 @@ export function walkExpression(visitor: IRVisitor, expr: ir.QuintEx): void { if (visitor.exitLambda) { visitor.exitLambda(expr) } + if (visitor.definitionDepth !== undefined) { + visitor.definitionDepth-- + } break case 'let': if (visitor.enterLet) { diff --git a/quint/src/names/resolver.ts b/quint/src/names/resolver.ts index 826c51efe..edad7f581 100644 --- a/quint/src/names/resolver.ts +++ b/quint/src/names/resolver.ts @@ -88,7 +88,7 @@ class NameResolver implements IRVisitor { enterLambda(expr: QuintLambda): void { // Lambda parameters are scoped, so they are collected here expr.params.forEach(p => { - this.collector.collectDefinition({ ...p, kind: 'param' }) + this.collector.collectDefinition({ ...p, kind: 'param', depth: this.definitionDepth }) }) } From 31085e1c47abffe86e357616bf3f75d795c4c9bd Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 5 Mar 2024 12:06:29 -0300 Subject: [PATCH 285/388] Allow shadowing by keeping a list of definitions in the `definitionsByName` map --- quint/src/names/base.ts | 19 +++- quint/src/names/collector.ts | 100 +++++++++++++----- quint/src/names/resolver.ts | 4 +- quint/test/names/collector.test.ts | 50 ++++----- quint/test/names/resolver.test.ts | 25 ++++- quint/testFixture/SuperSpec.json | 2 +- quint/testFixture/_0099unorderedDefs.json | 2 +- quint/testFixture/_0100cyclicDefs.json | 2 +- quint/testFixture/_0101noRecursion.json | 2 +- quint/testFixture/_1011nameOutOfScope.json | 2 +- quint/testFixture/_1012unknownType.json | 2 +- quint/testFixture/_1014conflictingNames.json | 2 +- quint/testFixture/_1016nonConstOverride.json | 2 +- quint/testFixture/_1030const.json | 2 +- quint/testFixture/_1031instance.json | 2 +- quint/testFixture/_1032docstrings.json | 2 +- quint/testFixture/_1040compileError.json | 2 +- quint/testFixture/_1041compileConst.json | 2 +- .../_1042qualifiersInRecordsFieldsError.json | 2 +- quint/testFixture/_1043sumTypeDecl.json | 2 +- quint/testFixture/_1044matchExpression.json | 2 +- .../testFixture/_1045polymorphicTypeDecl.json | 2 +- quint/testFixture/modulesAndJunk.json | 2 +- 23 files changed, 153 insertions(+), 81 deletions(-) diff --git a/quint/src/names/base.ts b/quint/src/names/base.ts index 6e8e2071e..e34415dc5 100644 --- a/quint/src/names/base.ts +++ b/quint/src/names/base.ts @@ -12,6 +12,7 @@ * @module */ +import { cloneDeep, compact } from 'lodash' import { QuintDef, QuintExport, QuintImport, QuintInstance, QuintLambdaParameter } from '../ir/quintIr' import { QuintType } from '../ir/quintTypes' import { QuintError } from '../quintError' @@ -49,7 +50,7 @@ export type LookupDefinition = (QuintDef | ({ kind: 'param' } & QuintLambdaParam /** * A module's definitions, indexed by name. */ -export type DefinitionsByName = Map +export type DefinitionsByName = Map /** * Definitions for each module @@ -83,6 +84,10 @@ export type NameResolutionResult = { errors: QuintError[] } +export function getTopLevelDef(defs: DefinitionsByName, name: string): LookupDefinition | undefined { + return defs.get(name)?.at(0) +} + /** * Copy the names of a definitions table to a new one, ignoring hidden * definitions, and optionally adding a namespace. @@ -100,11 +105,15 @@ export function copyNames( ): DefinitionsByName { const table = new Map() - originTable.forEach((def, identifier) => { + originTable.forEach((defs, identifier) => { const name = namespace ? [namespace, identifier].join('::') : identifier - if (!def.hidden || def.kind === 'const') { - table.set(name, copyAsHidden ? { ...def, hidden: copyAsHidden } : def) - } + const newDefs = defs.map(def => { + if (!def.hidden || def.kind === 'const') { + return cloneDeep(copyAsHidden ? { ...def, hidden: copyAsHidden } : def) + } + }) + + table.set(name, compact(newDefs)) }) return table diff --git a/quint/src/names/collector.ts b/quint/src/names/collector.ts index 52e8dc054..86918a9cc 100644 --- a/quint/src/names/collector.ts +++ b/quint/src/names/collector.ts @@ -34,6 +34,7 @@ import { addNamespacesToDef, builtinNames, copyNames, + getTopLevelDef, } from './base' import { moduleNotFoundError, @@ -42,7 +43,7 @@ import { paramNotFoundError, selfReferenceError, } from './importErrors' -import { compact } from 'lodash' +import { cloneDeep, compact } from 'lodash' /** * Collects all top-level definitions in Quint modules. Used internally by @@ -118,7 +119,7 @@ export class NameCollector implements IRVisitor { return } - const instanceTable = new Map([...moduleTable.entries()]) + const instanceTable = cloneDeep(moduleTable) if (decl.qualifiedName) { // Add the qualifier to `definitionsMyModule` map with a copy of the // definitions, so if there is an export of that qualifier, we know which @@ -129,7 +130,8 @@ export class NameCollector implements IRVisitor { // For each override, check if the name exists in the instantiated module and is a constant. // If so, update the value definition to point to the expression being overriden decl.overrides.forEach(([param, ex]) => { - const constDef = instanceTable.get(param.name) + // Constants are always top-level + const constDef = getTopLevelDef(instanceTable, param.name) if (!constDef) { this.errors.push(paramNotFoundError(decl, param)) @@ -142,13 +144,14 @@ export class NameCollector implements IRVisitor { } // Update the definition to point to the expression being overriden - instanceTable.set(param.name, { ...constDef, id: ex.id }) + constDef.id = ex.id + constDef.hidden = false }) // All names from the instanced module should be acessible with the instance namespace // So, copy them to the current module's lookup table const newDefs = copyNames(instanceTable, decl.qualifiedName, true) - this.collectDefinitions(newDefs, decl) + this.collectTopLevelDefinitions(newDefs, decl) } enterImport(decl: QuintImport): void { @@ -158,7 +161,7 @@ export class NameCollector implements IRVisitor { return } - const moduleTable = this.definitionsByModule.get(decl.protoName) + const moduleTable = cloneDeep(this.definitionsByModule.get(decl.protoName)) if (!moduleTable) { // Importing non-existing module @@ -178,12 +181,12 @@ export class NameCollector implements IRVisitor { if (!decl.defName || decl.defName === '*') { // Imports all definitions - this.collectDefinitions(importableDefinitions, decl) + this.collectTopLevelDefinitions(importableDefinitions, decl) return } // Tries to find a specific definition, reporting an error if not found - const newDef = importableDefinitions.get(decl.defName) + const newDef = getTopLevelDef(importableDefinitions, decl.defName) if (!newDef) { this.errors.push(nameNotFoundError(decl)) return @@ -203,7 +206,7 @@ export class NameCollector implements IRVisitor { return } - const moduleTable = this.definitionsByModule.get(decl.protoName) + const moduleTable = cloneDeep(this.definitionsByModule.get(decl.protoName)) if (!moduleTable) { // Exporting non-existing module this.errors.push(moduleNotFoundError(decl)) @@ -214,12 +217,12 @@ export class NameCollector implements IRVisitor { if (!decl.defName || decl.defName === '*') { // Export all definitions - this.collectDefinitions(exportableDefinitions, decl) + this.collectTopLevelDefinitions(exportableDefinitions, decl) return } // Tries to find a specific definition, reporting an error if not found - const newDef = exportableDefinitions.get(decl.defName) + const newDef = getTopLevelDef(exportableDefinitions, decl.defName) if (!newDef) { this.errors.push(nameNotFoundError(decl)) @@ -257,14 +260,36 @@ export class NameCollector implements IRVisitor { return } - if (this.definitionsByName.has(identifier) && this.definitionsByName.get(identifier)!.id != def.id) { - // Conflict with a previous definition - this.recordConflict(identifier, this.definitionsByName.get(identifier)!.id, source) + def.depth ??= 0 + const namespaces = importedFrom ? this.namespaces(importedFrom) : [] + + if (!this.definitionsByName.has(identifier)) { + // No existing defs with this name. Create an entry with a single def. + this.definitionsByName.set(identifier, [{ ...addNamespacesToDef(def, namespaces), importedFrom }]) return } - const namespaces = importedFrom ? this.namespaces(importedFrom) : [] - this.definitionsByName.set(identifier, { ...addNamespacesToDef(def, namespaces), importedFrom }) + // Else: There are exiting defs. We need to check for conflicts + const existingEntries = this.definitionsByName.get(identifier)! + // Entries conflict if they have different ids, but the same depth. + // Entries with different depths are ok, because one is shadowing the + // other. + const conflictingEntries = existingEntries.filter(entry => entry.id !== def.id && entry.depth === def.depth) + + // Record potential errors and move on + conflictingEntries.forEach(existingEntry => { + this.recordConflict(identifier, existingEntry.id, source) + }) + + // Keep entries with different ids. DON'T keep the whole + // `existingEntries` since those may contain the same exact defs, but + // hidden. + this.definitionsByName.set( + identifier, + existingEntries + .filter(entry => entry.id !== def.id) + .concat([{ ...addNamespacesToDef(def, namespaces), importedFrom }]) + ) } /** @@ -273,11 +298,12 @@ export class NameCollector implements IRVisitor { * @param identifier - The identifier of the definition to delete. */ deleteDefinition(identifier: string): void { - this.definitionsByName.delete(identifier) + this.definitionsByName.get(identifier)?.pop() + return } /** - * Obtains a collected definition. + * Gets the definition with the given name, in the current (visiting) scope * * @param identifier - The identifier of the definition to retrieve. * @@ -285,7 +311,12 @@ export class NameCollector implements IRVisitor { * definitions with that identifier was never collected. */ getDefinition(identifier: string): LookupDefinition | undefined { - return this.definitionsByName.get(identifier) + const defs = this.definitionsByName.get(identifier) + if (defs === undefined || defs.length === 0) { + return + } + + return defs[defs.length - 1] } private namespaces(decl: QuintImport | QuintInstance | QuintExport): string[] { @@ -297,18 +328,33 @@ export class NameCollector implements IRVisitor { return namespace ? [namespace] : [] } - private collectDefinitions( + private collectTopLevelDefinitions( newDefs: DefinitionsByName, importedFrom?: QuintImport | QuintExport | QuintInstance ): void { const namespaces = importedFrom ? this.namespaces(importedFrom) : [] - const newEntries: [string, LookupDefinition][] = [...newDefs.entries()].map(([identifier, def]) => { - const existingEntry = this.definitionsByName.get(identifier) - if (existingEntry && existingEntry.id !== def.id) { - this.recordConflict(identifier, existingEntry.id, def.id) - } - return [identifier, { ...addNamespacesToDef(def, namespaces), importedFrom }] - }) + const newEntries: [string, LookupDefinition[]][] = compact( + [...newDefs.keys()].map(identifier => { + const def = getTopLevelDef(newDefs, identifier) + if (!def) { + return + } + + const existingEntries = this.definitionsByName.get(identifier) + if (existingEntries) { + const conflictingEntries = existingEntries.filter(entry => entry.id !== def.id) + conflictingEntries.forEach(existingEntry => { + this.recordConflict(identifier, existingEntry.id, def.id) + }) + + // Keep conflicting entries and add the new one. DON'T keep the whole + // `existingEntries` since those may contain the same exact defs, but + // hidden. + return [identifier, conflictingEntries.concat([{ ...addNamespacesToDef(def, namespaces), importedFrom }])] + } + return [identifier, [{ ...addNamespacesToDef(def, namespaces), importedFrom }]] + }) + ) this.definitionsByName = new Map([...this.definitionsByName.entries(), ...newEntries]) } diff --git a/quint/src/names/resolver.ts b/quint/src/names/resolver.ts index edad7f581..777c457a1 100644 --- a/quint/src/names/resolver.ts +++ b/quint/src/names/resolver.ts @@ -58,8 +58,8 @@ class NameResolver implements IRVisitor { unusedDefinitions: UnusedDefinitions = moduleName => { const definitions: LookupDefinition[] = Array.from( this.collector.definitionsByModule.get(moduleName)?.values() || [] - ) - const usedDefinitions = [...this.table.values()] + ).flat() + const usedDefinitions = [...this.table.values()].flat() return new Set(difference(definitions, usedDefinitions)) } diff --git a/quint/test/names/collector.test.ts b/quint/test/names/collector.test.ts index 40fc688dc..16e014675 100644 --- a/quint/test/names/collector.test.ts +++ b/quint/test/names/collector.test.ts @@ -4,7 +4,7 @@ import { buildModuleWithDecls } from '../builders/ir' import { QuintError, QuintModule } from '../../src' import { NameCollector } from '../../src/names/collector' import { walkModule } from '../../src/ir/IRVisitor' -import { DefinitionsByName } from '../../src/names/base' +import { DefinitionsByName, getTopLevelDef } from '../../src/names/base' import { zerog } from '../../src/idGenerator' describe('NameCollector', () => { @@ -31,8 +31,8 @@ describe('NameCollector', () => { assert.deepInclude([...definitions.keys()], 'a') assert.notDeepInclude([...definitions.keys()], 'b') - assert.deepEqual(definitions.get('a')?.importedFrom?.kind, 'import') - assert.deepEqual(definitions.get('a')?.namespaces ?? [], []) + assert.deepEqual(getTopLevelDef(definitions, 'a')?.importedFrom?.kind, 'import') + assert.deepEqual(getTopLevelDef(definitions, 'a')?.namespaces ?? [], []) }) it('imports all definitions', () => { @@ -51,7 +51,7 @@ describe('NameCollector', () => { assert.isEmpty(errors) - const def = definitions.get('test_module::a') + const def = getTopLevelDef(definitions, 'test_module::a') assert.isTrue(def!.hidden) assert.deepEqual(def?.kind, 'def') }) @@ -63,7 +63,7 @@ describe('NameCollector', () => { assert.isEmpty(errors) - const def = definitions.get('my_import::a') + const def = getTopLevelDef(definitions, 'my_import::a') assert.isTrue(def!.hidden) assert.deepEqual(def?.kind, 'def') }) @@ -81,8 +81,8 @@ describe('NameCollector', () => { assert.includeDeepMembers([...definitions.keys()], ['test_module_instance::c1', 'test_module_instance::c2']) assert.includeDeepMembers([...definitions.keys()], ['test_module_instance::T']) - assert.deepEqual(definitions.get('test_module_instance::a')?.importedFrom?.kind, 'instance') - assert.deepEqual(definitions.get('test_module_instance::a')?.namespaces ?? [], [ + assert.deepEqual(getTopLevelDef(definitions, 'test_module_instance::a')?.importedFrom?.kind, 'instance') + assert.deepEqual(getTopLevelDef(definitions, 'test_module_instance::a')?.namespaces ?? [], [ 'test_module_instance', 'wrapper', ]) @@ -114,7 +114,7 @@ describe('NameCollector', () => { zerog ) - const [errors, _definitions] = collect(quintModule) + const [errors, definitions] = collect(quintModule) assert.sameDeepMembers(errors, [ { @@ -124,6 +124,8 @@ describe('NameCollector', () => { data: {}, }, ]) + + assert.deepEqual(getTopLevelDef(definitions, 'test_module_instance::a')?.kind, 'def') }) it('fails importing itself', () => { @@ -148,8 +150,8 @@ describe('NameCollector', () => { const [errors, definitions] = collect(quintModule) assert.isEmpty(errors) - assert.isNotTrue(definitions.get('a')!.hidden) - assert.isNotTrue(definitions.get('T')!.hidden) + assert.isNotTrue(getTopLevelDef(definitions, 'a')!.hidden) + assert.isNotTrue(getTopLevelDef(definitions, 'T')!.hidden) }) it('exports previously imported definitions', () => { @@ -158,8 +160,8 @@ describe('NameCollector', () => { const [errors, definitions] = collect(quintModule) assert.isEmpty(errors) - assert.isNotTrue(definitions.get('a')!.hidden) - assert.isNotTrue(definitions.get('T')!.hidden) + assert.isNotTrue(getTopLevelDef(definitions, 'a')!.hidden) + assert.isNotTrue(getTopLevelDef(definitions, 'T')!.hidden) }) it('exports imported definitions that were previously qualified', () => { @@ -168,8 +170,8 @@ describe('NameCollector', () => { const [errors, definitions] = collect(quintModule) assert.isEmpty(errors) - assert.isNotTrue(definitions.get('a')!.hidden) - assert.isNotTrue(definitions.get('T')!.hidden) + assert.isNotTrue(getTopLevelDef(definitions, 'a')!.hidden) + assert.isNotTrue(getTopLevelDef(definitions, 'T')!.hidden) }) it('exports specific definitions', () => { @@ -179,9 +181,9 @@ describe('NameCollector', () => { assert.isEmpty(errors) // a is not hidden anymore - assert.isNotTrue(definitions.get('a')!.hidden) + assert.isNotTrue(getTopLevelDef(definitions, 'a')!.hidden) // T is still hidden - assert.isTrue(definitions.get('T')!.hidden) + assert.isTrue(getTopLevelDef(definitions, 'T')!.hidden) }) it('exports definitions with qualifier', () => { @@ -194,8 +196,8 @@ describe('NameCollector', () => { const [errors, definitions] = collect(quintModule) assert.isEmpty(errors) - assert.isTrue(definitions.get('a')!.hidden) - assert.isNotTrue(definitions.get('my_export::a')!.hidden) + assert.isTrue(getTopLevelDef(definitions, 'a')!.hidden) + assert.isNotTrue(getTopLevelDef(definitions, 'my_export::a')!.hidden) }) it('exports definitions with namespace', () => { @@ -205,14 +207,14 @@ describe('NameCollector', () => { assert.isEmpty(errors) - assert.isTrue(definitions.get('a')!.hidden) - assert.isNotTrue(definitions.get('test_module::a')!.hidden) + assert.isTrue(getTopLevelDef(definitions, 'a')!.hidden) + assert.isNotTrue(getTopLevelDef(definitions, 'test_module::a')!.hidden) - assert.deepEqual(definitions.get('a')?.importedFrom?.kind, 'import') - assert.deepEqual(definitions.get('test_module::a')?.importedFrom?.kind, 'export') + assert.deepEqual(getTopLevelDef(definitions, 'a')?.importedFrom?.kind, 'import') + assert.deepEqual(getTopLevelDef(definitions, 'test_module::a')?.importedFrom?.kind, 'export') - assert.deepEqual(definitions.get('a')?.namespaces ?? [], []) - assert.deepEqual(definitions.get('test_module::a')?.namespaces ?? [], ['test_module']) + assert.deepEqual(getTopLevelDef(definitions, 'a')?.namespaces ?? [], []) + assert.deepEqual(getTopLevelDef(definitions, 'test_module::a')?.namespaces ?? [], ['test_module']) }) it('fails exporting unexisting definition', () => { diff --git a/quint/test/names/resolver.test.ts b/quint/test/names/resolver.test.ts index bf75af9b3..d0d502ee1 100644 --- a/quint/test/names/resolver.test.ts +++ b/quint/test/names/resolver.test.ts @@ -4,7 +4,7 @@ import { assert } from 'chai' import { NameResolutionResult } from '../../src/names/base' import { resolveNames } from '../../src/names/resolver' import { buildModule, buildModuleWithDecls } from '../builders/ir' -import { zerog } from '../../src/idGenerator' +import { IdGenerator, newIdGenerator, zerog } from '../../src/idGenerator' describe('resolveNames', () => { const baseDefs = [ @@ -13,14 +13,16 @@ describe('resolveNames', () => { 'type MY_TYPE = int', ] - function resolveNamesForExprs(exprs: string[]): NameResolutionResult { - const module = buildModule(baseDefs, exprs, undefined, zerog) + function resolveNamesForExprs(exprs: string[], idGenerator?: IdGenerator): NameResolutionResult { + const idGen = idGenerator ?? zerog + const module = buildModule(baseDefs, exprs, undefined, idGen) return resolveNames([module]) } - function resolveNamesForDefs(defs: string[]): NameResolutionResult { - const module = buildModuleWithDecls(baseDefs.concat(defs), undefined, zerog) + function resolveNamesForDefs(defs: string[], idGenerator?: IdGenerator): NameResolutionResult { + const idGen = idGenerator ?? zerog + const module = buildModuleWithDecls(baseDefs.concat(defs), undefined, idGen) return resolveNames([module]) } @@ -82,6 +84,19 @@ describe('resolveNames', () => { }) }) + describe('shadowing', () => { + it('resolves shadowed names', () => { + const result = resolveNamesForDefs( + ['val shadowing = def foo = (shadowing) => shadowing { foo(1) }', 'val a = shadowing'], + newIdGenerator() + ) + + assert.isEmpty(result.errors) + assert.isTrue([...result.table.values()].some(def => def.name === 'shadowing' || def.kind === 'def')) + assert.isTrue([...result.table.values()].some(def => def.name === 'shadowing' || def.kind === 'param')) + }) + }) + describe('type aliases', () => { it('resolves defined aliases', () => { const result = resolveNamesForDefs(['const a: MY_TYPE', 'var b: a -> Set[a]']) diff --git a/quint/testFixture/SuperSpec.json b/quint/testFixture/SuperSpec.json index 134bbd828..6e84ef117 100644 --- a/quint/testFixture/SuperSpec.json +++ b/quint/testFixture/SuperSpec.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":524,"name":"withConsts","declarations":[{"id":101,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":100,"kind":"app","opcode":"isub","args":[{"id":98,"kind":"int","value":1},{"id":99,"kind":"int","value":2}]}},{"id":105,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":104,"kind":"app","opcode":"imul","args":[{"id":102,"kind":"int","value":2},{"id":103,"kind":"int","value":3}]}},{"id":109,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":108,"kind":"app","opcode":"idiv","args":[{"id":106,"kind":"int","value":2},{"id":107,"kind":"int","value":3}]}},{"id":113,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":112,"kind":"app","opcode":"imod","args":[{"id":110,"kind":"int","value":2},{"id":111,"kind":"int","value":3}]}},{"id":117,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":116,"kind":"app","opcode":"ipow","args":[{"id":114,"kind":"int","value":2},{"id":115,"kind":"int","value":3}]}},{"id":120,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":119,"kind":"app","opcode":"iuminus","args":[{"id":118,"kind":"int","value":100}]}},{"id":124,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":123,"kind":"app","opcode":"igt","args":[{"id":121,"kind":"int","value":2},{"id":122,"kind":"int","value":3}]}},{"id":128,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":127,"kind":"app","opcode":"igte","args":[{"id":125,"kind":"int","value":2},{"id":126,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},{"id":132,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":131,"kind":"app","opcode":"ilt","args":[{"id":129,"kind":"int","value":2},{"id":130,"kind":"int","value":3}]}},{"id":136,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":135,"kind":"app","opcode":"ilte","args":[{"id":133,"kind":"int","value":2},{"id":134,"kind":"int","value":3}]}},{"id":140,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":139,"kind":"app","opcode":"eq","args":[{"id":137,"kind":"int","value":2},{"id":138,"kind":"int","value":3}]}},{"id":144,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":143,"kind":"app","opcode":"neq","args":[{"id":141,"kind":"int","value":2},{"id":142,"kind":"int","value":3}]}},{"id":150,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":149,"kind":"app","opcode":"eq","args":[{"id":147,"kind":"app","opcode":"iadd","args":[{"id":145,"kind":"int","value":2},{"id":146,"kind":"int","value":2}]},{"id":148,"kind":"int","value":4}]}},{"id":154,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":153,"kind":"app","opcode":"in","args":[{"id":151,"kind":"int","value":1},{"id":152,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},{"id":166,"kind":"def","name":"withType","qualifier":"val","expr":{"id":165,"kind":"app","opcode":"Set","args":[{"id":163,"kind":"int","value":1},{"id":164,"kind":"int","value":2}]},"typeAnnotation":{"id":162,"kind":"set","elem":{"id":161,"kind":"int"}}},{"id":167,"kind":"typedef","name":"PROC"},{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173},{"id":175,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":174,"kind":"int","value":42}},{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22},{"id":240,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":239,"kind":"app","opcode":"and","args":[{"id":237,"kind":"bool","value":false},{"id":238,"kind":"bool","value":true}]}},{"id":244,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":243,"kind":"app","opcode":"or","args":[{"id":241,"kind":"bool","value":false},{"id":242,"kind":"bool","value":true}]}},{"id":248,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":247,"kind":"app","opcode":"implies","args":[{"id":245,"kind":"bool","value":false},{"id":246,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26},{"id":281,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":280,"kind":"app","opcode":"and","args":[{"id":277,"kind":"bool","value":false},{"id":278,"kind":"bool","value":true},{"id":279,"kind":"bool","value":false}]}},{"id":286,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":285,"kind":"app","opcode":"actionAll","args":[{"id":282,"kind":"bool","value":false},{"id":283,"kind":"bool","value":true},{"id":284,"kind":"bool","value":false}]}},{"id":291,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":290,"kind":"app","opcode":"or","args":[{"id":287,"kind":"bool","value":false},{"id":288,"kind":"bool","value":true},{"id":289,"kind":"bool","value":false}]}},{"id":296,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":295,"kind":"app","opcode":"actionAny","args":[{"id":292,"kind":"bool","value":false},{"id":293,"kind":"bool","value":true},{"id":294,"kind":"bool","value":false}]}},{"id":301,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":300,"kind":"app","opcode":"ite","args":[{"id":297,"kind":"bool","value":true},{"id":298,"kind":"int","value":1},{"id":299,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319},{"kind":"const","name":"MyFunFun","typeAnnotation":{"id":31,"kind":"fun","arg":{"id":29,"kind":"fun","arg":{"id":27,"kind":"int"},"res":{"id":28,"kind":"str"}},"res":{"id":30,"kind":"bool"}},"id":32},{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}}},{"id":340,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":339,"kind":"app","opcode":"in","args":[{"id":337,"kind":"int","value":1},{"id":338,"kind":"app","opcode":"Set","args":[]}]}},{"kind":"const","name":"MyOperator","typeAnnotation":{"id":36,"kind":"oper","args":[{"id":33,"kind":"int"},{"id":34,"kind":"str"}],"res":{"id":35,"kind":"bool"}},"id":37},{"id":405,"kind":"def","name":"one","qualifier":"val","expr":{"id":404,"kind":"app","opcode":"head","args":[{"id":403,"kind":"app","opcode":"List","args":[{"id":401,"kind":"int","value":1},{"id":402,"kind":"int","value":2}]}]}},{"id":410,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":409,"kind":"app","opcode":"Tup","args":[{"id":406,"kind":"int","value":1},{"id":407,"kind":"int","value":2},{"id":408,"kind":"int","value":3}]}},{"id":415,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":414,"kind":"app","opcode":"Tup","args":[{"id":411,"kind":"int","value":1},{"id":412,"kind":"int","value":2},{"id":413,"kind":"int","value":3}]}},{"id":419,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":418,"kind":"app","opcode":"Tup","args":[{"id":416,"kind":"int","value":4},{"id":417,"kind":"int","value":5}]}},{"kind":"const","name":"MyOperatorWithComma","typeAnnotation":{"id":41,"kind":"oper","args":[{"id":38,"kind":"int"},{"id":39,"kind":"str"}],"res":{"id":40,"kind":"bool"}},"id":42},{"id":424,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":423,"kind":"app","opcode":"List","args":[{"id":420,"kind":"int","value":1},{"id":421,"kind":"int","value":2},{"id":422,"kind":"int","value":3}]}},{"id":429,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"List","args":[{"id":425,"kind":"int","value":1},{"id":426,"kind":"int","value":2},{"id":427,"kind":"int","value":3}]}},{"id":436,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":435,"kind":"app","opcode":"nth","args":[{"id":433,"kind":"app","opcode":"List","args":[{"id":430,"kind":"int","value":2},{"id":431,"kind":"int","value":3},{"id":432,"kind":"int","value":4}]},{"id":434,"kind":"int","value":2}]}},{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]}},{"id":448,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Rec","args":[{"id":443,"kind":"str","value":"name"},{"id":444,"kind":"str","value":"igor"},{"id":445,"kind":"str","value":"year"},{"id":446,"kind":"int","value":1981}]}},{"id":461,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":460,"kind":"app","opcode":"Set","args":[{"id":457,"kind":"int","value":1},{"id":458,"kind":"int","value":2},{"id":459,"kind":"int","value":3}]}},{"kind":"const","name":"MyTuple","typeAnnotation":{"id":46,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":43,"kind":"int"}},{"fieldName":"1","fieldType":{"id":44,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":45,"kind":"str"}}],"other":{"kind":"empty"}}},"id":47},{"id":491,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":490,"kind":"app","opcode":"in","args":[{"id":488,"kind":"int","value":2},{"id":489,"kind":"app","opcode":"Set","args":[]}]}},{"id":495,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":494,"kind":"app","opcode":"subseteq","args":[{"id":492,"kind":"app","opcode":"Set","args":[]},{"id":493,"kind":"app","opcode":"Set","args":[]}]}},{"id":504,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":503,"kind":"app","opcode":"in","args":[{"id":497,"kind":"app","opcode":"Set","args":[{"id":496,"kind":"int","value":1}]},{"id":502,"kind":"app","opcode":"powerset","args":[{"id":501,"kind":"app","opcode":"Set","args":[{"id":498,"kind":"int","value":1},{"id":499,"kind":"int","value":2},{"id":500,"kind":"int","value":3}]}]}]}},{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}}},{"id":518,"kind":"typedef","name":"UNINTERPRETED_TYPE"},{"kind":"const","name":"MyTupleWithComma","typeAnnotation":{"id":51,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":48,"kind":"int"}},{"fieldName":"1","fieldType":{"id":49,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":50,"kind":"str"}}],"other":{"kind":"empty"}}},"id":52},{"kind":"const","name":"MyRecord","typeAnnotation":{"id":56,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":53,"kind":"int"}},{"fieldName":"b","fieldType":{"id":54,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":55,"kind":"str"}}],"other":{"kind":"empty"}}},"id":57},{"kind":"const","name":"MyRecordWithComma","typeAnnotation":{"id":61,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":58,"kind":"int"}},{"fieldName":"b","fieldType":{"id":59,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":60,"kind":"str"}}],"other":{"kind":"empty"}}},"id":62},{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},{"kind":"var","name":"i","typeAnnotation":{"id":90,"kind":"int"},"id":91},{"kind":"var","name":"j","typeAnnotation":{"id":92,"kind":"bool"},"id":93},{"id":97,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":96,"kind":"app","opcode":"iadd","args":[{"id":94,"kind":"int","value":1},{"id":95,"kind":"int","value":2}]}},{"id":160,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":159,"kind":"app","opcode":"exists","args":[{"id":155,"kind":"name","name":"Bool"},{"id":158,"kind":"lambda","params":[{"id":156,"name":"x"}],"qualifier":"def","expr":{"id":157,"kind":"name","name":"x"}}]}},{"id":171,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":170,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":169,"kind":"set","elem":{"id":168,"kind":"const","name":"PROC"}}},{"id":182,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":181,"kind":"lambda","params":[{"id":176,"name":"x"},{"id":177,"name":"y"}],"qualifier":"puredef","expr":{"id":180,"kind":"app","opcode":"iadd","args":[{"id":178,"kind":"name","name":"x"},{"id":179,"kind":"name","name":"y"}]}}},{"id":188,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":187,"kind":"lambda","params":[{"id":183,"name":"factor"}],"qualifier":"def","expr":{"id":186,"kind":"app","opcode":"imul","args":[{"id":184,"kind":"name","name":"factor"},{"id":185,"kind":"name","name":"n"}]}}},{"id":194,"kind":"def","name":"A","qualifier":"action","expr":{"id":193,"kind":"lambda","params":[{"id":189,"name":"x"}],"qualifier":"action","expr":{"id":192,"kind":"app","opcode":"assign","args":[{"id":191,"kind":"name","name":"n"},{"id":190,"kind":"name","name":"x"}]}}},{"id":199,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":198,"kind":"lambda","params":[{"id":195,"name":"x"}],"qualifier":"puredef","expr":{"id":197,"kind":"app","opcode":"not","args":[{"id":196,"kind":"name","name":"x"}]}}},{"id":210,"kind":"def","name":"H","qualifier":"def","expr":{"id":209,"kind":"lambda","params":[{"id":200,"name":"x"},{"id":201,"name":"y"}],"qualifier":"def","expr":{"id":208,"kind":"app","opcode":"iadd","args":[{"id":206,"kind":"name","name":"x"},{"id":207,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":205,"kind":"oper","args":[{"id":202,"kind":"int"},{"id":203,"kind":"int"}],"res":{"id":204,"kind":"int"}}},{"id":217,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":216,"kind":"lambda","params":[{"id":211,"name":"x"}],"qualifier":"def","expr":{"id":215,"kind":"name","name":"x"}},"typeAnnotation":{"id":214,"kind":"oper","args":[{"id":212,"kind":"var","name":"a"}],"res":{"id":213,"kind":"var","name":"a"}}},{"id":223,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":222,"kind":"app","opcode":"assign","args":[{"id":221,"kind":"name","name":"k"},{"id":220,"kind":"int","value":3}]}},{"id":236,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":235,"kind":"lambda","params":[{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"}},{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"}}],"qualifier":"puredef","expr":{"id":234,"kind":"app","opcode":"ite","args":[{"id":231,"kind":"app","opcode":"ilt","args":[{"id":229,"kind":"name","name":"x"},{"id":230,"kind":"name","name":"y"}]},{"id":232,"kind":"name","name":"x"},{"id":233,"kind":"name","name":"y"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":224,"kind":"int"},{"id":226,"kind":"int"}],"res":{"id":228,"kind":"int"}}},{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}}},{"id":315,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":314,"kind":"lambda","params":[{"id":302,"name":"x"},{"id":303,"name":"y"}],"qualifier":"def","expr":{"id":313,"kind":"app","opcode":"ite","args":[{"id":306,"kind":"app","opcode":"ilt","args":[{"id":304,"kind":"name","name":"x"},{"id":305,"kind":"int","value":10}]},{"id":309,"kind":"app","opcode":"iadd","args":[{"id":307,"kind":"name","name":"y"},{"id":308,"kind":"int","value":5}]},{"id":312,"kind":"app","opcode":"imod","args":[{"id":310,"kind":"name","name":"y"},{"id":311,"kind":"int","value":5}]}]}}},{"id":323,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"get","args":[{"id":320,"kind":"name","name":"f1"},{"id":321,"kind":"str","value":"a"}]}},{"id":332,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":331,"kind":"app","opcode":"MyOper","args":[{"id":329,"kind":"str","value":"a"},{"id":330,"kind":"int","value":42}]}},{"id":336,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":335,"kind":"app","opcode":"MyOper","args":[{"id":333,"kind":"str","value":"a"},{"id":334,"kind":"int","value":42}]}},{"id":348,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":347,"kind":"app","opcode":"filter","args":[{"id":341,"kind":"name","name":"S"},{"id":346,"kind":"lambda","params":[{"id":342,"name":"x"}],"qualifier":"def","expr":{"id":345,"kind":"app","opcode":"igt","args":[{"id":343,"kind":"name","name":"x"},{"id":344,"kind":"int","value":10}]}}]}},{"id":386,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":385,"kind":"app","opcode":"filter","args":[{"id":381,"kind":"name","name":"S"},{"id":384,"kind":"lambda","params":[{"id":382,"name":"_"}],"qualifier":"def","expr":{"id":383,"kind":"bool","value":true}}]}},{"id":394,"kind":"def","name":"f","qualifier":"val","expr":{"id":393,"kind":"app","opcode":"mapBy","args":[{"id":387,"kind":"name","name":"S"},{"id":392,"kind":"lambda","params":[{"id":388,"name":"x"}],"qualifier":"def","expr":{"id":391,"kind":"app","opcode":"iadd","args":[{"id":389,"kind":"name","name":"x"},{"id":390,"kind":"int","value":1}]}}]}},{"id":400,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":399,"kind":"app","opcode":"exclude","args":[{"id":395,"kind":"name","name":"S"},{"id":398,"kind":"app","opcode":"Set","args":[{"id":396,"kind":"int","value":3},{"id":397,"kind":"int","value":4}]}]}},{"id":456,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":455,"kind":"app","opcode":"with","args":[{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"name","name":"test_record"},{"id":450,"kind":"str","value":"name"},{"id":449,"kind":"str","value":"quint"}]},{"id":452,"kind":"str","value":"year"},{"id":451,"kind":"int","value":2023}]}},{"id":472,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":471,"kind":"let","opdef":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]}},"expr":{"id":470,"kind":"app","opcode":"field","args":[{"id":468,"kind":"name","name":"my_rec"},{"id":469,"kind":"str","value":"a"}]}}},{"id":481,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":480,"kind":"let","opdef":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]}},"expr":{"id":479,"kind":"app","opcode":"item","args":[{"id":477,"kind":"name","name":"my_tup"},{"id":478,"kind":"int","value":2}]}}},{"id":487,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":486,"kind":"lambda","params":[{"id":482,"name":"s"}],"qualifier":"def","expr":{"id":485,"kind":"app","opcode":"eq","args":[{"id":483,"kind":"name","name":"s"},{"id":484,"kind":"app","opcode":"List","args":[]}]}}},{"id":508,"kind":"assume","name":"positive","assumption":{"id":507,"kind":"app","opcode":"igt","args":[{"id":505,"kind":"name","name":"N"},{"id":506,"kind":"int","value":0}]}},{"id":512,"kind":"assume","name":"_","assumption":{"id":511,"kind":"app","opcode":"neq","args":[{"id":509,"kind":"name","name":"N"},{"id":510,"kind":"int","value":0}]}},{"id":513,"kind":"import","defName":"foo","protoName":"M1"},{"id":514,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":519,"kind":"const","name":"INT_SET"},"id":520},{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},{"id":75,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":74,"kind":"lambda","params":[{"id":71,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":73,"kind":"app","opcode":"variant","args":[{"id":70,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":72}]}}},{"id":81,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":80,"kind":"lambda","params":[{"id":77,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":79,"kind":"app","opcode":"variant","args":[{"id":76,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":78}]}}},{"id":87,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":86,"kind":"lambda","params":[{"id":83,"name":"__DogParam"}],"qualifier":"def","expr":{"id":85,"kind":"app","opcode":"variant","args":[{"id":82,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":84}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":88,"kind":"const","name":"MyUnionType"},"id":89},{"id":260,"kind":"def","name":"G","qualifier":"def","expr":{"id":259,"kind":"lambda","params":[{"id":253,"name":"x"}],"qualifier":"def","expr":{"id":258,"kind":"app","opcode":"and","args":[{"id":255,"kind":"app","opcode":"F","args":[{"id":254,"kind":"name","name":"x"}]},{"id":257,"kind":"app","opcode":"not","args":[{"id":256,"kind":"name","name":"x"}]}]}}},{"id":268,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":267,"kind":"lambda","params":[{"id":261,"name":"x"}],"qualifier":"def","expr":{"id":266,"kind":"app","opcode":"and","args":[{"id":263,"kind":"app","opcode":"F","args":[{"id":262,"kind":"name","name":"x"}]},{"id":265,"kind":"app","opcode":"not","args":[{"id":264,"kind":"name","name":"x"}]}]}}},{"id":276,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":275,"kind":"lambda","params":[{"id":269,"name":"x"}],"qualifier":"def","expr":{"id":274,"kind":"app","opcode":"or","args":[{"id":271,"kind":"app","opcode":"F","args":[{"id":270,"kind":"name","name":"x"}]},{"id":273,"kind":"app","opcode":"not","args":[{"id":272,"kind":"name","name":"x"}]}]}}},{"id":368,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":367,"kind":"app","opcode":"map","args":[{"id":351,"kind":"app","opcode":"tuples","args":[{"id":349,"kind":"name","name":"S"},{"id":350,"kind":"name","name":"MySet"}]},{"id":366,"kind":"lambda","params":[{"id":357,"name":"quintTupledLambdaParam357"}],"qualifier":"def","expr":{"id":362,"kind":"let","opdef":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]}},"expr":{"id":358,"kind":"let","opdef":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]}},"expr":{"id":356,"kind":"app","opcode":"iadd","args":[{"id":354,"kind":"name","name":"s"},{"id":355,"kind":"name","name":"mys"}]}}}}]}},{"id":380,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":379,"kind":"let","opdef":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]}},"expr":{"id":378,"kind":"app","opcode":"actionAll","args":[{"id":374,"kind":"app","opcode":"igt","args":[{"id":372,"kind":"name","name":"x"},{"id":373,"kind":"int","value":10}]},{"id":377,"kind":"app","opcode":"assign","args":[{"id":376,"kind":"name","name":"k"},{"id":375,"kind":"name","name":"x"}]}]}}}]}],"table":{"69":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"72":{"id":71,"name":"__CircleParam","kind":"param"},"78":{"id":77,"name":"__RectangleParam","kind":"param"},"84":{"id":83,"name":"__DogParam","kind":"param"},"88":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"157":{"id":156,"name":"x","kind":"param"},"168":{"id":167,"kind":"typedef","name":"PROC"},"178":{"id":176,"name":"x","kind":"param"},"179":{"id":177,"name":"y","kind":"param"},"184":{"id":183,"name":"factor","kind":"param"},"185":{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173},"190":{"id":189,"name":"x","kind":"param"},"191":{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173},"196":{"id":195,"name":"x","kind":"param"},"206":{"id":200,"name":"x","kind":"param"},"207":{"id":201,"name":"y","kind":"param"},"215":{"id":211,"name":"x","kind":"param"},"221":{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219},"229":{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"},"kind":"param"},"230":{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"},"kind":"param"},"232":{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"},"kind":"param"},"233":{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"},"kind":"param"},"250":{"id":249,"name":"x","kind":"param"},"254":{"id":253,"name":"x","kind":"param"},"255":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"256":{"id":253,"name":"x","kind":"param"},"262":{"id":261,"name":"x","kind":"param"},"263":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"264":{"id":261,"name":"x","kind":"param"},"270":{"id":269,"name":"x","kind":"param"},"271":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"272":{"id":269,"name":"x","kind":"param"},"304":{"id":302,"name":"x","kind":"param"},"307":{"id":303,"name":"y","kind":"param"},"310":{"id":303,"name":"y","kind":"param"},"320":{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319},"331":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"335":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"341":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"343":{"id":342,"name":"x","kind":"param"},"349":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"350":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},"354":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]},"depth":1},"355":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]},"depth":1},"360":{"id":357,"name":"quintTupledLambdaParam357","kind":"param"},"364":{"id":357,"name":"quintTupledLambdaParam357","kind":"param"},"369":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"372":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"375":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"376":{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219},"381":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"387":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"389":{"id":388,"name":"x","kind":"param"},"395":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"453":{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]},"depth":0},"468":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]},"depth":1},"477":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]},"depth":1},"483":{"id":482,"name":"s","kind":"param"},"505":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"509":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"519":{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}}},"521":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"522":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":521,"importedFrom":{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10,"depth":0},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8,"depth":0}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":524,"name":"withConsts","declarations":[{"id":101,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":100,"kind":"app","opcode":"isub","args":[{"id":98,"kind":"int","value":1},{"id":99,"kind":"int","value":2}]}},{"id":105,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":104,"kind":"app","opcode":"imul","args":[{"id":102,"kind":"int","value":2},{"id":103,"kind":"int","value":3}]}},{"id":109,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":108,"kind":"app","opcode":"idiv","args":[{"id":106,"kind":"int","value":2},{"id":107,"kind":"int","value":3}]}},{"id":113,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":112,"kind":"app","opcode":"imod","args":[{"id":110,"kind":"int","value":2},{"id":111,"kind":"int","value":3}]}},{"id":117,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":116,"kind":"app","opcode":"ipow","args":[{"id":114,"kind":"int","value":2},{"id":115,"kind":"int","value":3}]}},{"id":120,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":119,"kind":"app","opcode":"iuminus","args":[{"id":118,"kind":"int","value":100}]}},{"id":124,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":123,"kind":"app","opcode":"igt","args":[{"id":121,"kind":"int","value":2},{"id":122,"kind":"int","value":3}]}},{"id":128,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":127,"kind":"app","opcode":"igte","args":[{"id":125,"kind":"int","value":2},{"id":126,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},{"id":132,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":131,"kind":"app","opcode":"ilt","args":[{"id":129,"kind":"int","value":2},{"id":130,"kind":"int","value":3}]}},{"id":136,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":135,"kind":"app","opcode":"ilte","args":[{"id":133,"kind":"int","value":2},{"id":134,"kind":"int","value":3}]}},{"id":140,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":139,"kind":"app","opcode":"eq","args":[{"id":137,"kind":"int","value":2},{"id":138,"kind":"int","value":3}]}},{"id":144,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":143,"kind":"app","opcode":"neq","args":[{"id":141,"kind":"int","value":2},{"id":142,"kind":"int","value":3}]}},{"id":150,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":149,"kind":"app","opcode":"eq","args":[{"id":147,"kind":"app","opcode":"iadd","args":[{"id":145,"kind":"int","value":2},{"id":146,"kind":"int","value":2}]},{"id":148,"kind":"int","value":4}]}},{"id":154,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":153,"kind":"app","opcode":"in","args":[{"id":151,"kind":"int","value":1},{"id":152,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},{"id":166,"kind":"def","name":"withType","qualifier":"val","expr":{"id":165,"kind":"app","opcode":"Set","args":[{"id":163,"kind":"int","value":1},{"id":164,"kind":"int","value":2}]},"typeAnnotation":{"id":162,"kind":"set","elem":{"id":161,"kind":"int"}}},{"id":167,"kind":"typedef","name":"PROC","depth":0},{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},{"id":175,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":174,"kind":"int","value":42}},{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19,"depth":0},{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22,"depth":0},{"id":240,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":239,"kind":"app","opcode":"and","args":[{"id":237,"kind":"bool","value":false},{"id":238,"kind":"bool","value":true}]}},{"id":244,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":243,"kind":"app","opcode":"or","args":[{"id":241,"kind":"bool","value":false},{"id":242,"kind":"bool","value":true}]}},{"id":248,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":247,"kind":"app","opcode":"implies","args":[{"id":245,"kind":"bool","value":false},{"id":246,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26,"depth":0},{"id":281,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":280,"kind":"app","opcode":"and","args":[{"id":277,"kind":"bool","value":false},{"id":278,"kind":"bool","value":true},{"id":279,"kind":"bool","value":false}]}},{"id":286,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":285,"kind":"app","opcode":"actionAll","args":[{"id":282,"kind":"bool","value":false},{"id":283,"kind":"bool","value":true},{"id":284,"kind":"bool","value":false}]}},{"id":291,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":290,"kind":"app","opcode":"or","args":[{"id":287,"kind":"bool","value":false},{"id":288,"kind":"bool","value":true},{"id":289,"kind":"bool","value":false}]}},{"id":296,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":295,"kind":"app","opcode":"actionAny","args":[{"id":292,"kind":"bool","value":false},{"id":293,"kind":"bool","value":true},{"id":294,"kind":"bool","value":false}]}},{"id":301,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":300,"kind":"app","opcode":"ite","args":[{"id":297,"kind":"bool","value":true},{"id":298,"kind":"int","value":1},{"id":299,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319,"depth":0},{"kind":"const","name":"MyFunFun","typeAnnotation":{"id":31,"kind":"fun","arg":{"id":29,"kind":"fun","arg":{"id":27,"kind":"int"},"res":{"id":28,"kind":"str"}},"res":{"id":30,"kind":"bool"}},"id":32,"depth":0},{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}}},{"id":340,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":339,"kind":"app","opcode":"in","args":[{"id":337,"kind":"int","value":1},{"id":338,"kind":"app","opcode":"Set","args":[]}]}},{"kind":"const","name":"MyOperator","typeAnnotation":{"id":36,"kind":"oper","args":[{"id":33,"kind":"int"},{"id":34,"kind":"str"}],"res":{"id":35,"kind":"bool"}},"id":37,"depth":0},{"id":405,"kind":"def","name":"one","qualifier":"val","expr":{"id":404,"kind":"app","opcode":"head","args":[{"id":403,"kind":"app","opcode":"List","args":[{"id":401,"kind":"int","value":1},{"id":402,"kind":"int","value":2}]}]}},{"id":410,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":409,"kind":"app","opcode":"Tup","args":[{"id":406,"kind":"int","value":1},{"id":407,"kind":"int","value":2},{"id":408,"kind":"int","value":3}]}},{"id":415,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":414,"kind":"app","opcode":"Tup","args":[{"id":411,"kind":"int","value":1},{"id":412,"kind":"int","value":2},{"id":413,"kind":"int","value":3}]}},{"id":419,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":418,"kind":"app","opcode":"Tup","args":[{"id":416,"kind":"int","value":4},{"id":417,"kind":"int","value":5}]}},{"kind":"const","name":"MyOperatorWithComma","typeAnnotation":{"id":41,"kind":"oper","args":[{"id":38,"kind":"int"},{"id":39,"kind":"str"}],"res":{"id":40,"kind":"bool"}},"id":42,"depth":0},{"id":424,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":423,"kind":"app","opcode":"List","args":[{"id":420,"kind":"int","value":1},{"id":421,"kind":"int","value":2},{"id":422,"kind":"int","value":3}]}},{"id":429,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"List","args":[{"id":425,"kind":"int","value":1},{"id":426,"kind":"int","value":2},{"id":427,"kind":"int","value":3}]}},{"id":436,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":435,"kind":"app","opcode":"nth","args":[{"id":433,"kind":"app","opcode":"List","args":[{"id":430,"kind":"int","value":2},{"id":431,"kind":"int","value":3},{"id":432,"kind":"int","value":4}]},{"id":434,"kind":"int","value":2}]}},{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]}},{"id":448,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Rec","args":[{"id":443,"kind":"str","value":"name"},{"id":444,"kind":"str","value":"igor"},{"id":445,"kind":"str","value":"year"},{"id":446,"kind":"int","value":1981}]}},{"id":461,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":460,"kind":"app","opcode":"Set","args":[{"id":457,"kind":"int","value":1},{"id":458,"kind":"int","value":2},{"id":459,"kind":"int","value":3}]}},{"kind":"const","name":"MyTuple","typeAnnotation":{"id":46,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":43,"kind":"int"}},{"fieldName":"1","fieldType":{"id":44,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":45,"kind":"str"}}],"other":{"kind":"empty"}}},"id":47,"depth":0},{"id":491,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":490,"kind":"app","opcode":"in","args":[{"id":488,"kind":"int","value":2},{"id":489,"kind":"app","opcode":"Set","args":[]}]}},{"id":495,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":494,"kind":"app","opcode":"subseteq","args":[{"id":492,"kind":"app","opcode":"Set","args":[]},{"id":493,"kind":"app","opcode":"Set","args":[]}]}},{"id":504,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":503,"kind":"app","opcode":"in","args":[{"id":497,"kind":"app","opcode":"Set","args":[{"id":496,"kind":"int","value":1}]},{"id":502,"kind":"app","opcode":"powerset","args":[{"id":501,"kind":"app","opcode":"Set","args":[{"id":498,"kind":"int","value":1},{"id":499,"kind":"int","value":2},{"id":500,"kind":"int","value":3}]}]}]}},{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}},"depth":0},{"id":518,"kind":"typedef","name":"UNINTERPRETED_TYPE","depth":0},{"kind":"const","name":"MyTupleWithComma","typeAnnotation":{"id":51,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":48,"kind":"int"}},{"fieldName":"1","fieldType":{"id":49,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":50,"kind":"str"}}],"other":{"kind":"empty"}}},"id":52,"depth":0},{"kind":"const","name":"MyRecord","typeAnnotation":{"id":56,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":53,"kind":"int"}},{"fieldName":"b","fieldType":{"id":54,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":55,"kind":"str"}}],"other":{"kind":"empty"}}},"id":57,"depth":0},{"kind":"const","name":"MyRecordWithComma","typeAnnotation":{"id":61,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":58,"kind":"int"}},{"fieldName":"b","fieldType":{"id":59,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":60,"kind":"str"}}],"other":{"kind":"empty"}}},"id":62,"depth":0},{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},{"kind":"var","name":"i","typeAnnotation":{"id":90,"kind":"int"},"id":91,"depth":0},{"kind":"var","name":"j","typeAnnotation":{"id":92,"kind":"bool"},"id":93,"depth":0},{"id":97,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":96,"kind":"app","opcode":"iadd","args":[{"id":94,"kind":"int","value":1},{"id":95,"kind":"int","value":2}]}},{"id":160,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":159,"kind":"app","opcode":"exists","args":[{"id":155,"kind":"name","name":"Bool"},{"id":158,"kind":"lambda","params":[{"id":156,"name":"x"}],"qualifier":"def","expr":{"id":157,"kind":"name","name":"x"}}]}},{"id":171,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":170,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":169,"kind":"set","elem":{"id":168,"kind":"const","name":"PROC"}}},{"id":182,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":181,"kind":"lambda","params":[{"id":176,"name":"x"},{"id":177,"name":"y"}],"qualifier":"puredef","expr":{"id":180,"kind":"app","opcode":"iadd","args":[{"id":178,"kind":"name","name":"x"},{"id":179,"kind":"name","name":"y"}]}}},{"id":188,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":187,"kind":"lambda","params":[{"id":183,"name":"factor"}],"qualifier":"def","expr":{"id":186,"kind":"app","opcode":"imul","args":[{"id":184,"kind":"name","name":"factor"},{"id":185,"kind":"name","name":"n"}]}}},{"id":194,"kind":"def","name":"A","qualifier":"action","expr":{"id":193,"kind":"lambda","params":[{"id":189,"name":"x"}],"qualifier":"action","expr":{"id":192,"kind":"app","opcode":"assign","args":[{"id":191,"kind":"name","name":"n"},{"id":190,"kind":"name","name":"x"}]}}},{"id":199,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":198,"kind":"lambda","params":[{"id":195,"name":"x"}],"qualifier":"puredef","expr":{"id":197,"kind":"app","opcode":"not","args":[{"id":196,"kind":"name","name":"x"}]}}},{"id":210,"kind":"def","name":"H","qualifier":"def","expr":{"id":209,"kind":"lambda","params":[{"id":200,"name":"x"},{"id":201,"name":"y"}],"qualifier":"def","expr":{"id":208,"kind":"app","opcode":"iadd","args":[{"id":206,"kind":"name","name":"x"},{"id":207,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":205,"kind":"oper","args":[{"id":202,"kind":"int"},{"id":203,"kind":"int"}],"res":{"id":204,"kind":"int"}}},{"id":217,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":216,"kind":"lambda","params":[{"id":211,"name":"x"}],"qualifier":"def","expr":{"id":215,"kind":"name","name":"x"}},"typeAnnotation":{"id":214,"kind":"oper","args":[{"id":212,"kind":"var","name":"a"}],"res":{"id":213,"kind":"var","name":"a"}}},{"id":223,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":222,"kind":"app","opcode":"assign","args":[{"id":221,"kind":"name","name":"k"},{"id":220,"kind":"int","value":3}]}},{"id":236,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":235,"kind":"lambda","params":[{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"}},{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"}}],"qualifier":"puredef","expr":{"id":234,"kind":"app","opcode":"ite","args":[{"id":231,"kind":"app","opcode":"ilt","args":[{"id":229,"kind":"name","name":"x"},{"id":230,"kind":"name","name":"y"}]},{"id":232,"kind":"name","name":"x"},{"id":233,"kind":"name","name":"y"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":224,"kind":"int"},{"id":226,"kind":"int"}],"res":{"id":228,"kind":"int"}}},{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}}},{"id":315,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":314,"kind":"lambda","params":[{"id":302,"name":"x"},{"id":303,"name":"y"}],"qualifier":"def","expr":{"id":313,"kind":"app","opcode":"ite","args":[{"id":306,"kind":"app","opcode":"ilt","args":[{"id":304,"kind":"name","name":"x"},{"id":305,"kind":"int","value":10}]},{"id":309,"kind":"app","opcode":"iadd","args":[{"id":307,"kind":"name","name":"y"},{"id":308,"kind":"int","value":5}]},{"id":312,"kind":"app","opcode":"imod","args":[{"id":310,"kind":"name","name":"y"},{"id":311,"kind":"int","value":5}]}]}}},{"id":323,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"get","args":[{"id":320,"kind":"name","name":"f1"},{"id":321,"kind":"str","value":"a"}]}},{"id":332,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":331,"kind":"app","opcode":"MyOper","args":[{"id":329,"kind":"str","value":"a"},{"id":330,"kind":"int","value":42}]}},{"id":336,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":335,"kind":"app","opcode":"MyOper","args":[{"id":333,"kind":"str","value":"a"},{"id":334,"kind":"int","value":42}]}},{"id":348,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":347,"kind":"app","opcode":"filter","args":[{"id":341,"kind":"name","name":"S"},{"id":346,"kind":"lambda","params":[{"id":342,"name":"x"}],"qualifier":"def","expr":{"id":345,"kind":"app","opcode":"igt","args":[{"id":343,"kind":"name","name":"x"},{"id":344,"kind":"int","value":10}]}}]}},{"id":386,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":385,"kind":"app","opcode":"filter","args":[{"id":381,"kind":"name","name":"S"},{"id":384,"kind":"lambda","params":[{"id":382,"name":"_"}],"qualifier":"def","expr":{"id":383,"kind":"bool","value":true}}]}},{"id":394,"kind":"def","name":"f","qualifier":"val","expr":{"id":393,"kind":"app","opcode":"mapBy","args":[{"id":387,"kind":"name","name":"S"},{"id":392,"kind":"lambda","params":[{"id":388,"name":"x"}],"qualifier":"def","expr":{"id":391,"kind":"app","opcode":"iadd","args":[{"id":389,"kind":"name","name":"x"},{"id":390,"kind":"int","value":1}]}}]}},{"id":400,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":399,"kind":"app","opcode":"exclude","args":[{"id":395,"kind":"name","name":"S"},{"id":398,"kind":"app","opcode":"Set","args":[{"id":396,"kind":"int","value":3},{"id":397,"kind":"int","value":4}]}]}},{"id":456,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":455,"kind":"app","opcode":"with","args":[{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"name","name":"test_record"},{"id":450,"kind":"str","value":"name"},{"id":449,"kind":"str","value":"quint"}]},{"id":452,"kind":"str","value":"year"},{"id":451,"kind":"int","value":2023}]}},{"id":472,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":471,"kind":"let","opdef":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]}},"expr":{"id":470,"kind":"app","opcode":"field","args":[{"id":468,"kind":"name","name":"my_rec"},{"id":469,"kind":"str","value":"a"}]}}},{"id":481,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":480,"kind":"let","opdef":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]}},"expr":{"id":479,"kind":"app","opcode":"item","args":[{"id":477,"kind":"name","name":"my_tup"},{"id":478,"kind":"int","value":2}]}}},{"id":487,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":486,"kind":"lambda","params":[{"id":482,"name":"s"}],"qualifier":"def","expr":{"id":485,"kind":"app","opcode":"eq","args":[{"id":483,"kind":"name","name":"s"},{"id":484,"kind":"app","opcode":"List","args":[]}]}}},{"id":508,"kind":"assume","name":"positive","assumption":{"id":507,"kind":"app","opcode":"igt","args":[{"id":505,"kind":"name","name":"N"},{"id":506,"kind":"int","value":0}]},"depth":0},{"id":512,"kind":"assume","name":"_","assumption":{"id":511,"kind":"app","opcode":"neq","args":[{"id":509,"kind":"name","name":"N"},{"id":510,"kind":"int","value":0}]}},{"id":513,"kind":"import","defName":"foo","protoName":"M1"},{"id":514,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":519,"kind":"const","name":"INT_SET"},"id":520,"depth":0},{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},{"id":75,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":74,"kind":"lambda","params":[{"id":71,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":73,"kind":"app","opcode":"variant","args":[{"id":70,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":72}]}}},{"id":81,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":80,"kind":"lambda","params":[{"id":77,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":79,"kind":"app","opcode":"variant","args":[{"id":76,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":78}]}}},{"id":87,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":86,"kind":"lambda","params":[{"id":83,"name":"__DogParam"}],"qualifier":"def","expr":{"id":85,"kind":"app","opcode":"variant","args":[{"id":82,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":84}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":88,"kind":"const","name":"MyUnionType"},"id":89,"depth":0},{"id":260,"kind":"def","name":"G","qualifier":"def","expr":{"id":259,"kind":"lambda","params":[{"id":253,"name":"x"}],"qualifier":"def","expr":{"id":258,"kind":"app","opcode":"and","args":[{"id":255,"kind":"app","opcode":"F","args":[{"id":254,"kind":"name","name":"x"}]},{"id":257,"kind":"app","opcode":"not","args":[{"id":256,"kind":"name","name":"x"}]}]}}},{"id":268,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":267,"kind":"lambda","params":[{"id":261,"name":"x"}],"qualifier":"def","expr":{"id":266,"kind":"app","opcode":"and","args":[{"id":263,"kind":"app","opcode":"F","args":[{"id":262,"kind":"name","name":"x"}]},{"id":265,"kind":"app","opcode":"not","args":[{"id":264,"kind":"name","name":"x"}]}]}}},{"id":276,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":275,"kind":"lambda","params":[{"id":269,"name":"x"}],"qualifier":"def","expr":{"id":274,"kind":"app","opcode":"or","args":[{"id":271,"kind":"app","opcode":"F","args":[{"id":270,"kind":"name","name":"x"}]},{"id":273,"kind":"app","opcode":"not","args":[{"id":272,"kind":"name","name":"x"}]}]}}},{"id":368,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":367,"kind":"app","opcode":"map","args":[{"id":351,"kind":"app","opcode":"tuples","args":[{"id":349,"kind":"name","name":"S"},{"id":350,"kind":"name","name":"MySet"}]},{"id":366,"kind":"lambda","params":[{"id":357,"name":"quintTupledLambdaParam357"}],"qualifier":"def","expr":{"id":362,"kind":"let","opdef":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]}},"expr":{"id":358,"kind":"let","opdef":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]}},"expr":{"id":356,"kind":"app","opcode":"iadd","args":[{"id":354,"kind":"name","name":"s"},{"id":355,"kind":"name","name":"mys"}]}}}}]}},{"id":380,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":379,"kind":"let","opdef":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]}},"expr":{"id":378,"kind":"app","opcode":"actionAll","args":[{"id":374,"kind":"app","opcode":"igt","args":[{"id":372,"kind":"name","name":"x"},{"id":373,"kind":"int","value":10}]},{"id":377,"kind":"app","opcode":"assign","args":[{"id":376,"kind":"name","name":"k"},{"id":375,"kind":"name","name":"x"}]}]}}}]}],"table":{"69":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"72":{"id":71,"name":"__CircleParam","kind":"param","depth":1},"78":{"id":77,"name":"__RectangleParam","kind":"param","depth":1},"84":{"id":83,"name":"__DogParam","kind":"param","depth":1},"88":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"157":{"id":156,"name":"x","kind":"param","depth":1},"168":{"id":167,"kind":"typedef","name":"PROC","depth":0},"178":{"id":176,"name":"x","kind":"param","depth":1},"179":{"id":177,"name":"y","kind":"param","depth":1},"184":{"id":183,"name":"factor","kind":"param","depth":1},"185":{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},"190":{"id":189,"name":"x","kind":"param","depth":1},"191":{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},"196":{"id":195,"name":"x","kind":"param","depth":1},"206":{"id":200,"name":"x","kind":"param","depth":1},"207":{"id":201,"name":"y","kind":"param","depth":1},"215":{"id":211,"name":"x","kind":"param","depth":1},"221":{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},"229":{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"},"kind":"param","depth":1},"230":{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"},"kind":"param","depth":1},"232":{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"},"kind":"param","depth":1},"233":{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"},"kind":"param","depth":1},"250":{"id":249,"name":"x","kind":"param","depth":1},"254":{"id":253,"name":"x","kind":"param","depth":1},"255":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"256":{"id":253,"name":"x","kind":"param","depth":1},"262":{"id":261,"name":"x","kind":"param","depth":1},"263":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"264":{"id":261,"name":"x","kind":"param","depth":1},"270":{"id":269,"name":"x","kind":"param","depth":1},"271":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"272":{"id":269,"name":"x","kind":"param","depth":1},"304":{"id":302,"name":"x","kind":"param","depth":1},"307":{"id":303,"name":"y","kind":"param","depth":1},"310":{"id":303,"name":"y","kind":"param","depth":1},"320":{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319,"depth":0},"331":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"335":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"341":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"343":{"id":342,"name":"x","kind":"param","depth":1},"349":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"350":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19,"depth":0},"354":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]},"depth":2},"355":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]},"depth":2},"360":{"id":357,"name":"quintTupledLambdaParam357","kind":"param","depth":1},"364":{"id":357,"name":"quintTupledLambdaParam357","kind":"param","depth":1},"369":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"372":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"375":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":1},"376":{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},"381":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"387":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"389":{"id":388,"name":"x","kind":"param","depth":1},"395":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"453":{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]},"depth":0},"468":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]},"depth":1},"477":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]},"depth":1},"483":{"id":482,"name":"s","kind":"param","depth":1},"505":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"509":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"519":{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}},"depth":0},"521":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"522":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":521,"depth":0,"importedFrom":{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_0099unorderedDefs.json b/quint/testFixture/_0099unorderedDefs.json index 3cc68b30f..1749b6095 100644 --- a/quint/testFixture/_0099unorderedDefs.json +++ b/quint/testFixture/_0099unorderedDefs.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":14,"name":"unorderedDefs","declarations":[{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}}},{"id":6,"kind":"def","name":"double","qualifier":"puredef","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":4,"kind":"app","opcode":"plus","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"name","name":"x"}]}}}]}],"table":{"2":{"id":1,"name":"x","kind":"param"},"3":{"id":1,"name":"x","kind":"param"},"4":{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}},"depth":0},"9":{"id":7,"name":"x","kind":"param"},"10":{"id":8,"name":"y","kind":"param"}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":14,"name":"unorderedDefs","declarations":[{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}}},{"id":6,"kind":"def","name":"double","qualifier":"puredef","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":4,"kind":"app","opcode":"plus","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"name","name":"x"}]}}}]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1},"3":{"id":1,"name":"x","kind":"param","depth":1},"4":{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}},"depth":0},"9":{"id":7,"name":"x","kind":"param","depth":1},"10":{"id":8,"name":"y","kind":"param","depth":1}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_0100cyclicDefs.json b/quint/testFixture/_0100cyclicDefs.json index 16815402e..f2b5ffce7 100644 --- a/quint/testFixture/_0100cyclicDefs.json +++ b/quint/testFixture/_0100cyclicDefs.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":16,"name":"cyclicDefs","declarations":[]}],"table":{"2":{"id":1,"name":"x","kind":"param"},"3":{"id":10,"kind":"def","name":"bar","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"baz","args":[{"id":7,"kind":"name","name":"x"}]}},"depth":0},"7":{"id":6,"name":"x","kind":"param"},"8":{"id":15,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"x"}],"qualifier":"puredef","expr":{"id":13,"kind":"app","opcode":"foo","args":[{"id":12,"kind":"name","name":"x"}]}},"depth":0},"12":{"id":11,"name":"x","kind":"param"},"13":{"id":5,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":4,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":3,"kind":"app","opcode":"bar","args":[{"id":2,"kind":"name","name":"x"}]}},"depth":0}},"errors":[{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":2,"col":2,"index":70},"end":{"line":2,"col":25,"index":93}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":3,"col":2,"index":97},"end":{"line":3,"col":25,"index":120}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":4,"col":2,"index":124},"end":{"line":4,"col":25,"index":147}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":16,"name":"cyclicDefs","declarations":[]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1},"3":{"id":10,"kind":"def","name":"bar","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"baz","args":[{"id":7,"kind":"name","name":"x"}]}},"depth":0},"7":{"id":6,"name":"x","kind":"param","depth":1},"8":{"id":15,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"x"}],"qualifier":"puredef","expr":{"id":13,"kind":"app","opcode":"foo","args":[{"id":12,"kind":"name","name":"x"}]}},"depth":0},"12":{"id":11,"name":"x","kind":"param","depth":1},"13":{"id":5,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":4,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":3,"kind":"app","opcode":"bar","args":[{"id":2,"kind":"name","name":"x"}]}},"depth":0}},"errors":[{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":2,"col":2,"index":70},"end":{"line":2,"col":25,"index":93}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":3,"col":2,"index":97},"end":{"line":3,"col":25,"index":120}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":4,"col":2,"index":124},"end":{"line":4,"col":25,"index":147}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_0101noRecursion.json b/quint/testFixture/_0101noRecursion.json index cc35ab29e..f04f2c675 100644 --- a/quint/testFixture/_0101noRecursion.json +++ b/quint/testFixture/_0101noRecursion.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":8,"name":"noRecursion","declarations":[]}],"table":{"2":{"id":1,"name":"x","kind":"param"},"5":{"id":7,"kind":"def","name":"blackhole","qualifier":"puredef","expr":{"id":6,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"blackhole","args":[{"id":4,"kind":"app","opcode":"iadd","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"int","value":1}]}]}},"depth":0}},"errors":[{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0101noRecursion.qnt","start":{"line":3,"col":2,"index":131},"end":{"line":3,"col":41,"index":170}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":8,"name":"noRecursion","declarations":[]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1},"5":{"id":7,"kind":"def","name":"blackhole","qualifier":"puredef","expr":{"id":6,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"blackhole","args":[{"id":4,"kind":"app","opcode":"iadd","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"int","value":1}]}]}},"depth":0}},"errors":[{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0101noRecursion.qnt","start":{"line":3,"col":2,"index":131},"end":{"line":3,"col":41,"index":170}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1011nameOutOfScope.json b/quint/testFixture/_1011nameOutOfScope.json index 463c5237d..11ef1d678 100644 --- a/quint/testFixture/_1011nameOutOfScope.json +++ b/quint/testFixture/_1011nameOutOfScope.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"nameOutOfScope","declarations":[{"id":10,"kind":"def","name":"A","qualifier":"val","expr":{"id":9,"kind":"app","opcode":"iadd","args":[{"id":7,"kind":"name","name":"x"},{"id":8,"kind":"int","value":1}]}},{"id":6,"kind":"def","name":"f","qualifier":"def","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"def","expr":{"id":4,"kind":"app","opcode":"igt","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"int","value":10}]}}}]}],"table":{"2":{"id":1,"name":"x","kind":"param"}},"errors":[{"explanation":"[QNT404] Name 'x' not found","locs":[{"source":"mocked_path/testFixture/_1011nameOutOfScope.qnt","start":{"line":4,"col":10,"index":188},"end":{"line":4,"col":10,"index":188}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"nameOutOfScope","declarations":[{"id":10,"kind":"def","name":"A","qualifier":"val","expr":{"id":9,"kind":"app","opcode":"iadd","args":[{"id":7,"kind":"name","name":"x"},{"id":8,"kind":"int","value":1}]}},{"id":6,"kind":"def","name":"f","qualifier":"def","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"def","expr":{"id":4,"kind":"app","opcode":"igt","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"int","value":10}]}}}]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1}},"errors":[{"explanation":"[QNT404] Name 'x' not found","locs":[{"source":"mocked_path/testFixture/_1011nameOutOfScope.qnt","start":{"line":4,"col":10,"index":188},"end":{"line":4,"col":10,"index":188}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1012unknownType.json b/quint/testFixture/_1012unknownType.json index f7e30f970..4e3720254 100644 --- a/quint/testFixture/_1012unknownType.json +++ b/quint/testFixture/_1012unknownType.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":3,"name":"unknown_type","declarations":[{"kind":"var","name":"S","typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"},"id":2}]}],"table":{},"errors":[{"explanation":"[QNT404] Type alias 'UNKNOWN_TYPE' not found","locs":[{"source":"mocked_path/testFixture/_1012unknownType.qnt","start":{"line":1,"col":9,"index":31},"end":{"line":1,"col":20,"index":42}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":3,"name":"unknown_type","declarations":[{"kind":"var","name":"S","typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"},"id":2,"depth":0}]}],"table":{},"errors":[{"explanation":"[QNT404] Type alias 'UNKNOWN_TYPE' not found","locs":[{"source":"mocked_path/testFixture/_1012unknownType.qnt","start":{"line":1,"col":9,"index":31},"end":{"line":1,"col":20,"index":42}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1014conflictingNames.json b/quint/testFixture/_1014conflictingNames.json index c4b48653f..745920eed 100644 --- a/quint/testFixture/_1014conflictingNames.json +++ b/quint/testFixture/_1014conflictingNames.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":3,"name":"M","declarations":[{"id":2,"kind":"def","name":"b","qualifier":"def","expr":{"id":1,"kind":"int","value":2}}]},{"id":21,"name":"conflictingNames","declarations":[{"id":13,"kind":"def","name":"size","qualifier":"def","expr":{"id":12,"kind":"lambda","params":[{"id":10,"name":"x"}],"qualifier":"def","expr":{"id":11,"kind":"int","value":0}}},{"id":15,"kind":"typedef","name":"T","type":{"id":14,"kind":"int"}},{"id":17,"kind":"typedef","name":"T","type":{"id":16,"kind":"str"}},{"id":19,"kind":"def","name":"b","qualifier":"def","expr":{"id":18,"kind":"int","value":1}},{"kind":"var","name":"a","typeAnnotation":{"id":4,"kind":"int"},"id":5},{"id":20,"kind":"import","defName":"b","protoName":"M"},{"id":9,"kind":"def","name":"a","qualifier":"def","expr":{"id":8,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"def","expr":{"id":7,"kind":"name","name":"x"}}}]}],"table":{"7":{"id":6,"name":"x","kind":"param"}},"errors":[{"explanation":"[QNT101] Conflicting definitions found for name 'a' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":6,"col":2,"index":73},"end":{"line":6,"col":12,"index":83}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'a' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":7,"col":2,"index":87},"end":{"line":7,"col":13,"index":98}}]},{"explanation":"[QNT101] Built-in name 'size' is redefined in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":10,"col":2,"index":142},"end":{"line":10,"col":16,"index":156}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'T' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":13,"col":2,"index":186},"end":{"line":13,"col":13,"index":197}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'T' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":14,"col":2,"index":201},"end":{"line":14,"col":13,"index":212}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'b' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":16,"col":2,"index":217},"end":{"line":16,"col":10,"index":225}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'b' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":19,"col":2,"index":271},"end":{"line":19,"col":11,"index":280}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":3,"name":"M","declarations":[{"id":2,"kind":"def","name":"b","qualifier":"def","expr":{"id":1,"kind":"int","value":2}}]},{"id":21,"name":"conflictingNames","declarations":[{"id":13,"kind":"def","name":"size","qualifier":"def","expr":{"id":12,"kind":"lambda","params":[{"id":10,"name":"x"}],"qualifier":"def","expr":{"id":11,"kind":"int","value":0}}},{"id":15,"kind":"typedef","name":"T","type":{"id":14,"kind":"int"},"depth":0},{"id":17,"kind":"typedef","name":"T","type":{"id":16,"kind":"str"},"depth":0},{"id":19,"kind":"def","name":"b","qualifier":"def","expr":{"id":18,"kind":"int","value":1}},{"kind":"var","name":"a","typeAnnotation":{"id":4,"kind":"int"},"id":5,"depth":0},{"id":20,"kind":"import","defName":"b","protoName":"M"},{"id":9,"kind":"def","name":"a","qualifier":"def","expr":{"id":8,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"def","expr":{"id":7,"kind":"name","name":"x"}}}]}],"table":{"7":{"id":6,"name":"x","kind":"param","depth":1}},"errors":[{"explanation":"[QNT101] Conflicting definitions found for name 'a' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":6,"col":2,"index":73},"end":{"line":6,"col":12,"index":83}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'a' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":7,"col":2,"index":87},"end":{"line":7,"col":13,"index":98}}]},{"explanation":"[QNT101] Built-in name 'size' is redefined in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":10,"col":2,"index":142},"end":{"line":10,"col":16,"index":156}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'T' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":13,"col":2,"index":186},"end":{"line":13,"col":13,"index":197}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'T' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":14,"col":2,"index":201},"end":{"line":14,"col":13,"index":212}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'b' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":16,"col":2,"index":217},"end":{"line":16,"col":10,"index":225}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'b' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":19,"col":2,"index":271},"end":{"line":19,"col":11,"index":280}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1016nonConstOverride.json b/quint/testFixture/_1016nonConstOverride.json index 617624975..16377145c 100644 --- a/quint/testFixture/_1016nonConstOverride.json +++ b/quint/testFixture/_1016nonConstOverride.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":5,"name":"A","declarations":[{"kind":"const","name":"c","typeAnnotation":{"id":1,"kind":"int"},"id":2},{"kind":"var","name":"a","typeAnnotation":{"id":3,"kind":"int"},"id":4}]},{"id":11,"name":"nonConstOverride","declarations":[{"id":10,"kind":"instance","qualifiedName":"A1","protoName":"A","overrides":[[{"id":8,"name":"c"},{"id":6,"kind":"int","value":1}],[{"id":9,"name":"a"},{"id":7,"kind":"bool","value":false}]],"identityOverride":false}]}],"table":{"8":{"kind":"const","name":"c","typeAnnotation":{"id":1,"kind":"int"},"id":6,"importedFrom":{"id":10,"kind":"instance","qualifiedName":"A1","protoName":"A","overrides":[[{"id":8,"name":"c"},{"id":6,"kind":"int","value":1}],[{"id":9,"name":"a"},{"id":7,"kind":"bool","value":false}]],"identityOverride":false},"hidden":true,"namespaces":["A1","nonConstOverride"]},"9":{"kind":"var","name":"a","typeAnnotation":{"id":3,"kind":"int"},"id":4,"importedFrom":{"id":10,"kind":"instance","qualifiedName":"A1","protoName":"A","overrides":[[{"id":8,"name":"c"},{"id":6,"kind":"int","value":1}],[{"id":9,"name":"a"},{"id":7,"kind":"bool","value":false}]],"identityOverride":false},"hidden":true,"namespaces":["A1","nonConstOverride"]}},"errors":[{"explanation":"[QNT406] Instantiation error: 'a' is not a constant in 'A'","locs":[{"source":"mocked_path/testFixture/_1016nonConstOverride.qnt","start":{"line":6,"col":2,"index":70},"end":{"line":6,"col":33,"index":101}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":5,"name":"A","declarations":[{"kind":"const","name":"c","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},{"kind":"var","name":"a","typeAnnotation":{"id":3,"kind":"int"},"id":4,"depth":0}]},{"id":11,"name":"nonConstOverride","declarations":[{"id":10,"kind":"instance","qualifiedName":"A1","protoName":"A","overrides":[[{"id":8,"name":"c"},{"id":6,"kind":"int","value":1}],[{"id":9,"name":"a"},{"id":7,"kind":"bool","value":false}]],"identityOverride":false}]}],"table":{"8":{"kind":"const","name":"c","typeAnnotation":{"id":1,"kind":"int"},"id":6,"depth":0,"importedFrom":{"id":10,"kind":"instance","qualifiedName":"A1","protoName":"A","overrides":[[{"id":8,"name":"c"},{"id":6,"kind":"int","value":1}],[{"id":9,"name":"a"},{"id":7,"kind":"bool","value":false}]],"identityOverride":false},"hidden":true,"namespaces":["A1","nonConstOverride"]},"9":{"kind":"var","name":"a","typeAnnotation":{"id":3,"kind":"int"},"id":4,"depth":0,"importedFrom":{"id":10,"kind":"instance","qualifiedName":"A1","protoName":"A","overrides":[[{"id":8,"name":"c"},{"id":6,"kind":"int","value":1}],[{"id":9,"name":"a"},{"id":7,"kind":"bool","value":false}]],"identityOverride":false},"hidden":true,"namespaces":["A1","nonConstOverride"]}},"errors":[{"explanation":"[QNT406] Instantiation error: 'a' is not a constant in 'A'","locs":[{"source":"mocked_path/testFixture/_1016nonConstOverride.qnt","start":{"line":6,"col":2,"index":70},"end":{"line":6,"col":33,"index":101}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1030const.json b/quint/testFixture/_1030const.json index a2a4bb5b0..41bd5f567 100644 --- a/quint/testFixture/_1030const.json +++ b/quint/testFixture/_1030const.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2},{"id":10,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":4,"name":"i","typeAnnotation":{"id":3,"kind":"int"}}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"iadd","args":[{"id":6,"kind":"name","name":"i"},{"id":7,"kind":"name","name":"N"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"int"}],"res":{"id":5,"kind":"int"}}}]}],"table":{"6":{"id":4,"name":"i","typeAnnotation":{"id":3,"kind":"int"},"kind":"param"},"7":{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},{"id":10,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":4,"name":"i","typeAnnotation":{"id":3,"kind":"int"}}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"iadd","args":[{"id":6,"kind":"name","name":"i"},{"id":7,"kind":"name","name":"N"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"int"}],"res":{"id":5,"kind":"int"}}}]}],"table":{"6":{"id":4,"name":"i","typeAnnotation":{"id":3,"kind":"int"},"kind":"param","depth":1},"7":{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1031instance.json b/quint/testFixture/_1031instance.json index 788b99601..f45d277dc 100644 --- a/quint/testFixture/_1031instance.json +++ b/quint/testFixture/_1031instance.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":18,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9},{"id":17,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":16,"kind":"lambda","params":[{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"}}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":10,"kind":"int"}],"res":{"id":12,"kind":"int"}}}]},{"id":7,"name":"inst","declarations":[{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},{"id":6,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"foo","args":[{"id":4,"kind":"int","value":6}]}}]}],"table":{"2":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":1,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"5":{"id":17,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":16,"kind":"lambda","params":[{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"}}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"depth":0,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"13":{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"},"kind":"param"},"14":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":18,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9,"depth":0},{"id":17,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":16,"kind":"lambda","params":[{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"}}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":10,"kind":"int"}],"res":{"id":12,"kind":"int"}}}]},{"id":7,"name":"inst","declarations":[{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},{"id":6,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"foo","args":[{"id":4,"kind":"int","value":6}]}}]}],"table":{"2":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":1,"depth":0,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"5":{"id":17,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":16,"kind":"lambda","params":[{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"}}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"depth":0,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"13":{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"},"kind":"param","depth":1},"14":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9,"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1032docstrings.json b/quint/testFixture/_1032docstrings.json index 6bfc7ca63..88f583e0d 100644 --- a/quint/testFixture/_1032docstrings.json +++ b/quint/testFixture/_1032docstrings.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"docstrings","declarations":[{"doc":"Docstring for var","kind":"var","name":"x","typeAnnotation":{"id":6,"kind":"int"},"id":7},{"doc":"Docstring for const","kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9},{"doc":"Top level docstring","id":5,"kind":"def","name":"nestedVals","qualifier":"val","expr":{"id":4,"kind":"let","opdef":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1}},"expr":{"id":3,"kind":"name","name":"foo"}}}],"doc":"Docstring for module"}],"table":{"3":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1},"depth":1}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"docstrings","declarations":[{"doc":"Docstring for var","kind":"var","name":"x","typeAnnotation":{"id":6,"kind":"int"},"id":7,"depth":0},{"doc":"Docstring for const","kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9,"depth":0},{"doc":"Top level docstring","id":5,"kind":"def","name":"nestedVals","qualifier":"val","expr":{"id":4,"kind":"let","opdef":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1}},"expr":{"id":3,"kind":"name","name":"foo"}}}],"doc":"Docstring for module"}],"table":{"3":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1},"depth":1}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1040compileError.json b/quint/testFixture/_1040compileError.json index a841f0e70..297159d06 100644 --- a/quint/testFixture/_1040compileError.json +++ b/quint/testFixture/_1040compileError.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":8,"name":"_1040compileError","declarations":[{"kind":"const","name":"n","typeAnnotation":{"id":1,"kind":"int"},"id":2},{"id":7,"kind":"def","name":"myTest","qualifier":"run","expr":{"id":6,"kind":"app","opcode":"assert","args":[{"id":5,"kind":"app","opcode":"igt","args":[{"id":3,"kind":"name","name":"n"},{"id":4,"kind":"int","value":0}]}]}}]}],"table":{"3":{"kind":"const","name":"n","typeAnnotation":{"id":1,"kind":"int"},"id":2}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":8,"name":"_1040compileError","declarations":[{"kind":"const","name":"n","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},{"id":7,"kind":"def","name":"myTest","qualifier":"run","expr":{"id":6,"kind":"app","opcode":"assert","args":[{"id":5,"kind":"app","opcode":"igt","args":[{"id":3,"kind":"name","name":"n"},{"id":4,"kind":"int","value":0}]}]}}]}],"table":{"3":{"kind":"const","name":"n","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1041compileConst.json b/quint/testFixture/_1041compileConst.json index 3ea01a4eb..5aac7fd72 100644 --- a/quint/testFixture/_1041compileConst.json +++ b/quint/testFixture/_1041compileConst.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":15,"name":"_1041compileConst","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2},{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4},{"id":14,"kind":"def","name":"step","qualifier":"action","expr":{"id":13,"kind":"app","opcode":"assign","args":[{"id":12,"kind":"name","name":"x"},{"id":11,"kind":"app","opcode":"isub","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"int","value":1}]}]}},{"id":8,"kind":"def","name":"init","qualifier":"action","expr":{"id":7,"kind":"app","opcode":"assign","args":[{"id":6,"kind":"name","name":"x"},{"id":5,"kind":"name","name":"N"}]}}]}],"table":{"5":{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2},"6":{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4},"9":{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4},"12":{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":15,"name":"_1041compileConst","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4,"depth":0},{"id":14,"kind":"def","name":"step","qualifier":"action","expr":{"id":13,"kind":"app","opcode":"assign","args":[{"id":12,"kind":"name","name":"x"},{"id":11,"kind":"app","opcode":"isub","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"int","value":1}]}]}},{"id":8,"kind":"def","name":"init","qualifier":"action","expr":{"id":7,"kind":"app","opcode":"assign","args":[{"id":6,"kind":"name","name":"x"},{"id":5,"kind":"name","name":"N"}]}}]}],"table":{"5":{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},"6":{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4,"depth":0},"9":{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4,"depth":0},"12":{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4,"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1042qualifiersInRecordsFieldsError.json b/quint/testFixture/_1042qualifiersInRecordsFieldsError.json index d235213b0..bdd6bb145 100644 --- a/quint/testFixture/_1042qualifiersInRecordsFieldsError.json +++ b/quint/testFixture/_1042qualifiersInRecordsFieldsError.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"qualifiersInRecordFields","declarations":[{"id":5,"kind":"typedef","name":"T","type":{"id":4,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"invalid::decl::label","fieldType":{"id":3,"kind":"int"}}],"other":{"kind":"empty"}}}},{"id":9,"kind":"def","name":"r","qualifier":"val","expr":{"id":8,"kind":"app","opcode":"Rec","args":[{"id":7,"kind":"str","value":"invalid::record::label"},{"id":6,"kind":"int","value":1}]}}]}],"table":{},"errors":[{"explanation":"[QNT008] Identifiers in a record cannot be qualified with '::'. Found invalid::decl::label.","locs":[{"source":"mocked_path/testFixture/_1042qualifiersInRecordsFieldsError.qnt","start":{"line":1,"col":33,"index":67},"end":{"line":1,"col":33,"index":67}}]},{"explanation":"[QNT008] Identifiers in a record cannot be qualified with '::'. Found invalid::record::label.","locs":[{"source":"mocked_path/testFixture/_1042qualifiersInRecordsFieldsError.qnt","start":{"line":2,"col":35,"index":110},"end":{"line":2,"col":35,"index":110}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"qualifiersInRecordFields","declarations":[{"id":5,"kind":"typedef","name":"T","type":{"id":4,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"invalid::decl::label","fieldType":{"id":3,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},{"id":9,"kind":"def","name":"r","qualifier":"val","expr":{"id":8,"kind":"app","opcode":"Rec","args":[{"id":7,"kind":"str","value":"invalid::record::label"},{"id":6,"kind":"int","value":1}]}}]}],"table":{},"errors":[{"explanation":"[QNT008] Identifiers in a record cannot be qualified with '::'. Found invalid::decl::label.","locs":[{"source":"mocked_path/testFixture/_1042qualifiersInRecordsFieldsError.qnt","start":{"line":1,"col":33,"index":67},"end":{"line":1,"col":33,"index":67}}]},{"explanation":"[QNT008] Identifiers in a record cannot be qualified with '::'. Found invalid::record::label.","locs":[{"source":"mocked_path/testFixture/_1042qualifiersInRecordsFieldsError.qnt","start":{"line":2,"col":35,"index":110},"end":{"line":2,"col":35,"index":110}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1043sumTypeDecl.json b/quint/testFixture/_1043sumTypeDecl.json index db8016a6e..90dc57e22 100644 --- a/quint/testFixture/_1043sumTypeDecl.json +++ b/quint/testFixture/_1043sumTypeDecl.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":22,"name":"SumTypes","declarations":[{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},{"id":14,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}}},{"id":8,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":4,"kind":"const","name":"T"},"expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]}},{"id":21,"kind":"def","name":"canConstructVariants","qualifier":"val","expr":{"id":20,"kind":"app","opcode":"List","args":[{"id":17,"kind":"name","name":"A"},{"id":19,"kind":"app","opcode":"B","args":[{"id":18,"kind":"int","value":2}]}]},"typeAnnotation":{"id":16,"kind":"list","elem":{"id":15,"kind":"const","name":"T"}}}]}],"table":{"4":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"11":{"id":10,"name":"__BParam","kind":"param"},"15":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"17":{"id":8,"kind":"def","name":"A","qualifier":"val","expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]},"depth":0},"19":{"id":14,"kind":"def","name":"B","qualifier":"def","expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}},"depth":0}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":22,"name":"SumTypes","declarations":[{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},{"id":14,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}}},{"id":8,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":4,"kind":"const","name":"T"},"expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]}},{"id":21,"kind":"def","name":"canConstructVariants","qualifier":"val","expr":{"id":20,"kind":"app","opcode":"List","args":[{"id":17,"kind":"name","name":"A"},{"id":19,"kind":"app","opcode":"B","args":[{"id":18,"kind":"int","value":2}]}]},"typeAnnotation":{"id":16,"kind":"list","elem":{"id":15,"kind":"const","name":"T"}}}]}],"table":{"4":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},"11":{"id":10,"name":"__BParam","kind":"param","depth":1},"15":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},"17":{"id":8,"kind":"def","name":"A","qualifier":"val","expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]},"depth":0},"19":{"id":14,"kind":"def","name":"B","qualifier":"def","expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1044matchExpression.json b/quint/testFixture/_1044matchExpression.json index 093e3b648..abd859adf 100644 --- a/quint/testFixture/_1044matchExpression.json +++ b/quint/testFixture/_1044matchExpression.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":41,"name":"SumTypes","declarations":[{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},{"id":15,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"__BParam"}],"qualifier":"def","expr":{"id":13,"kind":"app","opcode":"variant","args":[{"id":10,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":12}]}}},{"id":21,"kind":"def","name":"C","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"str"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":20,"kind":"lambda","params":[{"id":17,"name":"__CParam"}],"qualifier":"def","expr":{"id":19,"kind":"app","opcode":"variant","args":[{"id":16,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":18}]}}},{"id":9,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":5,"kind":"const","name":"T"},"expr":{"id":8,"kind":"app","opcode":"variant","args":[{"id":6,"kind":"str","value":"A"},{"id":7,"kind":"app","opcode":"Rec","args":[]}]}},{"id":24,"kind":"def","name":"c","qualifier":"val","expr":{"id":23,"kind":"app","opcode":"C","args":[{"id":22,"kind":"str","value":"Foo"}]}},{"id":40,"kind":"def","name":"ex","qualifier":"val","expr":{"id":30,"kind":"app","opcode":"matchVariant","args":[{"id":25,"kind":"name","name":"c"},{"id":31,"kind":"str","value":"A"},{"id":32,"kind":"lambda","qualifier":"def","expr":{"id":26,"kind":"int","value":0},"params":[{"name":"_","id":33}]},{"id":34,"kind":"str","value":"B"},{"id":35,"kind":"lambda","qualifier":"def","expr":{"id":27,"kind":"name","name":"n"},"params":[{"name":"n","id":36}]},{"id":37,"kind":"str","value":"_"},{"id":38,"kind":"lambda","qualifier":"def","expr":{"id":29,"kind":"app","opcode":"iuminus","args":[{"id":28,"kind":"int","value":1}]},"params":[{"name":"_","id":39}]}]}}]}],"table":{"5":{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},"12":{"id":11,"name":"__BParam","kind":"param"},"18":{"id":17,"name":"__CParam","kind":"param"},"23":{"id":21,"kind":"def","name":"C","qualifier":"def","expr":{"id":20,"kind":"lambda","params":[{"id":17,"name":"__CParam"}],"qualifier":"def","expr":{"id":19,"kind":"app","opcode":"variant","args":[{"id":16,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":18}]}},"depth":0},"25":{"id":24,"kind":"def","name":"c","qualifier":"val","expr":{"id":23,"kind":"app","opcode":"C","args":[{"id":22,"kind":"str","value":"Foo"}]},"depth":0},"27":{"name":"n","id":36,"kind":"param"}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":41,"name":"SumTypes","declarations":[{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},{"id":15,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"__BParam"}],"qualifier":"def","expr":{"id":13,"kind":"app","opcode":"variant","args":[{"id":10,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":12}]}}},{"id":21,"kind":"def","name":"C","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"str"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":20,"kind":"lambda","params":[{"id":17,"name":"__CParam"}],"qualifier":"def","expr":{"id":19,"kind":"app","opcode":"variant","args":[{"id":16,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":18}]}}},{"id":9,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":5,"kind":"const","name":"T"},"expr":{"id":8,"kind":"app","opcode":"variant","args":[{"id":6,"kind":"str","value":"A"},{"id":7,"kind":"app","opcode":"Rec","args":[]}]}},{"id":24,"kind":"def","name":"c","qualifier":"val","expr":{"id":23,"kind":"app","opcode":"C","args":[{"id":22,"kind":"str","value":"Foo"}]}},{"id":40,"kind":"def","name":"ex","qualifier":"val","expr":{"id":30,"kind":"app","opcode":"matchVariant","args":[{"id":25,"kind":"name","name":"c"},{"id":31,"kind":"str","value":"A"},{"id":32,"kind":"lambda","qualifier":"def","expr":{"id":26,"kind":"int","value":0},"params":[{"name":"_","id":33}]},{"id":34,"kind":"str","value":"B"},{"id":35,"kind":"lambda","qualifier":"def","expr":{"id":27,"kind":"name","name":"n"},"params":[{"name":"n","id":36}]},{"id":37,"kind":"str","value":"_"},{"id":38,"kind":"lambda","qualifier":"def","expr":{"id":29,"kind":"app","opcode":"iuminus","args":[{"id":28,"kind":"int","value":1}]},"params":[{"name":"_","id":39}]}]}}]}],"table":{"5":{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"12":{"id":11,"name":"__BParam","kind":"param","depth":1},"18":{"id":17,"name":"__CParam","kind":"param","depth":1},"23":{"id":21,"kind":"def","name":"C","qualifier":"def","expr":{"id":20,"kind":"lambda","params":[{"id":17,"name":"__CParam"}],"qualifier":"def","expr":{"id":19,"kind":"app","opcode":"variant","args":[{"id":16,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":18}]}},"depth":0},"25":{"id":24,"kind":"def","name":"c","qualifier":"val","expr":{"id":23,"kind":"app","opcode":"C","args":[{"id":22,"kind":"str","value":"Foo"}]},"depth":0},"27":{"name":"n","id":36,"kind":"param","depth":1}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1045polymorphicTypeDecl.json b/quint/testFixture/_1045polymorphicTypeDecl.json index f8280eaa1..951bdacda 100644 --- a/quint/testFixture/_1045polymorphicTypeDecl.json +++ b/quint/testFixture/_1045polymorphicTypeDecl.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":29,"name":"m","declarations":[{"id":10,"kind":"typedef","name":"MapApp","type":{"id":9,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":7,"kind":"fun","arg":{"id":5,"kind":"var","name":"a"},"res":{"id":6,"kind":"var","name":"b"}}},{"fieldName":"1","fieldType":{"id":8,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a","b"]},{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"]},{"id":4,"kind":"typedef","name":"MonoPair","type":{"id":3,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":1,"kind":"var","name":"a"}},{"fieldName":"1","fieldType":{"id":2,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a"]},{"id":22,"kind":"def","name":"Ok","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":11,"kind":"var","name":"ok"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":21,"kind":"lambda","params":[{"id":18,"name":"__OkParam"}],"qualifier":"def","expr":{"id":20,"kind":"app","opcode":"variant","args":[{"id":17,"kind":"str","value":"Ok"},{"kind":"name","name":"__OkParam","id":19}]}}},{"id":28,"kind":"def","name":"Err","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":12,"kind":"var","name":"err"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":27,"kind":"lambda","params":[{"id":24,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":26,"kind":"app","opcode":"variant","args":[{"id":23,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":25}]}}}]}],"table":{"14":{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"]},"19":{"id":18,"name":"__OkParam","kind":"param"},"25":{"id":24,"name":"__ErrParam","kind":"param"}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":29,"name":"m","declarations":[{"id":10,"kind":"typedef","name":"MapApp","type":{"id":9,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":7,"kind":"fun","arg":{"id":5,"kind":"var","name":"a"},"res":{"id":6,"kind":"var","name":"b"}}},{"fieldName":"1","fieldType":{"id":8,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a","b"],"depth":0},{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"],"depth":0},{"id":4,"kind":"typedef","name":"MonoPair","type":{"id":3,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":1,"kind":"var","name":"a"}},{"fieldName":"1","fieldType":{"id":2,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a"],"depth":0},{"id":22,"kind":"def","name":"Ok","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":11,"kind":"var","name":"ok"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":21,"kind":"lambda","params":[{"id":18,"name":"__OkParam"}],"qualifier":"def","expr":{"id":20,"kind":"app","opcode":"variant","args":[{"id":17,"kind":"str","value":"Ok"},{"kind":"name","name":"__OkParam","id":19}]}}},{"id":28,"kind":"def","name":"Err","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":12,"kind":"var","name":"err"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":27,"kind":"lambda","params":[{"id":24,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":26,"kind":"app","opcode":"variant","args":[{"id":23,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":25}]}}}]}],"table":{"14":{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"],"depth":0},"19":{"id":18,"name":"__OkParam","kind":"param","depth":1},"25":{"id":24,"name":"__ErrParam","kind":"param","depth":1}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/modulesAndJunk.json b/quint/testFixture/modulesAndJunk.json index 7ae45fde9..48fb05ca0 100644 --- a/quint/testFixture/modulesAndJunk.json +++ b/quint/testFixture/modulesAndJunk.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":13,"name":"bar","declarations":[{"id":12,"kind":"def","name":"baz","qualifier":"def","expr":{"id":11,"kind":"lambda","params":[{"id":6,"name":"x","typeAnnotation":{"id":5,"kind":"int"}}],"qualifier":"def","expr":{"id":10,"kind":"app","opcode":"iadd","args":[{"id":8,"kind":"name","name":"x"},{"id":9,"kind":"int","value":1}]}},"typeAnnotation":{"kind":"oper","args":[{"id":5,"kind":"int"}],"res":{"id":7,"kind":"int"}}}]},{"id":4,"name":"foo","declarations":[{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":1}}]}],"table":{"8":{"id":6,"name":"x","typeAnnotation":{"id":5,"kind":"int"},"kind":"param"}},"errors":[{"explanation":"[QNT000] extraneous input 'the' expecting {, 'module', DOCCOMMENT}","locs":[{"source":"mocked_path/testFixture/modulesAndJunk.qnt","start":{"line":8,"col":0,"index":75},"end":{"line":8,"col":2,"index":77}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":13,"name":"bar","declarations":[{"id":12,"kind":"def","name":"baz","qualifier":"def","expr":{"id":11,"kind":"lambda","params":[{"id":6,"name":"x","typeAnnotation":{"id":5,"kind":"int"}}],"qualifier":"def","expr":{"id":10,"kind":"app","opcode":"iadd","args":[{"id":8,"kind":"name","name":"x"},{"id":9,"kind":"int","value":1}]}},"typeAnnotation":{"kind":"oper","args":[{"id":5,"kind":"int"}],"res":{"id":7,"kind":"int"}}}]},{"id":4,"name":"foo","declarations":[{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":1}}]}],"table":{"8":{"id":6,"name":"x","typeAnnotation":{"id":5,"kind":"int"},"kind":"param","depth":1}},"errors":[{"explanation":"[QNT000] extraneous input 'the' expecting {, 'module', DOCCOMMENT}","locs":[{"source":"mocked_path/testFixture/modulesAndJunk.qnt","start":{"line":8,"col":0,"index":75},"end":{"line":8,"col":2,"index":77}}]}]} \ No newline at end of file From 84d914ae9752a5ac64a02797d99f2c1505ecb1c8 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 5 Mar 2024 12:23:29 -0300 Subject: [PATCH 286/388] Add CHANGELOG entry --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9534e7ca6..e0326d518 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - The latest supported node version is now bounded at <= 20, which covers the latest LTS. (#1380) +- Shadowing names are now supported, which means that the same name can be redefined + in nested scopes (#1394) ### Deprecated ### Removed From 81a363f0bc2b64982077e64cf9bba657f9f4adfa Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 5 Mar 2024 12:25:37 -0300 Subject: [PATCH 287/388] Update documentation --- doc/lang.md | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/doc/lang.md b/doc/lang.md index cc3ef8b01..d71ba0c3e 100644 --- a/doc/lang.md +++ b/doc/lang.md @@ -514,7 +514,7 @@ module Top { Note that in the above example, `Inner::x2` is treated as a qualified identifier, that is, it consists of the prefix `Inner` and the name `x2`. -*No collisions.* There must be no name collisions between names. Shadowing of a name is not allowed. For example: +Shadowing names is allowed. For example: ```bluespec module OS { @@ -524,13 +524,7 @@ module OS { } ``` -The Quint parser produces the following error message: - -``` -error: [QNT101] Conflicting definitions found for name 'clock' in module 'OS' -4: def increase(clock) = clock + 1 - ^^^^^ -``` +PS: Let us know if you are bothered by this. We are considering making it a togglable feature. *No order.* In contrast to TLA+, namespaces are not ordered. It is perfectly fine to write out-of-order definitions, like in many programming languages: From 4ccd20c3a58cc114d5b545b63a60f9deac645556 Mon Sep 17 00:00:00 2001 From: Gabriela Moreira Date: Tue, 5 Mar 2024 15:34:23 -0300 Subject: [PATCH 288/388] Update quint/src/names/base.ts Co-authored-by: Shon Feder --- quint/src/names/base.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/names/base.ts b/quint/src/names/base.ts index e34415dc5..3a4f63908 100644 --- a/quint/src/names/base.ts +++ b/quint/src/names/base.ts @@ -50,7 +50,7 @@ export type LookupDefinition = (QuintDef | ({ kind: 'param' } & QuintLambdaParam /** * A module's definitions, indexed by name. */ -export type DefinitionsByName = Map +export type DefinitionsByName = Map /** * Definitions for each module From f97f77cc858c5ab1fa614b36b3dcc21444c5a760 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 7 Mar 2024 10:57:52 -0500 Subject: [PATCH 289/388] Use Apalache versin 0.44.7 --- quint/src/quintVerifier.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/quintVerifier.ts b/quint/src/quintVerifier.ts index be2f54bde..bab9b0c5d 100644 --- a/quint/src/quintVerifier.ts +++ b/quint/src/quintVerifier.ts @@ -38,7 +38,7 @@ import type { Buffer } from 'buffer' import type { PackageDefinition as ProtoPackageDefinition } from '@grpc/proto-loader' const APALACHE_SERVER_URI = 'localhost:8822' -const APALACHE_VERSION_TAG = '0.44.2' +const APALACHE_VERSION_TAG = '0.44.7' // TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 // const APALACHE_TGZ = 'apalache.tgz' From aa27c5141e2a91dcda5b3a8cae445e0cc251a70d Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 7 Mar 2024 12:49:26 -0500 Subject: [PATCH 290/388] Move Apalache client into its own module This is almost entirely a mechanical change. We just move the Apalache server manager and client into its own module, and rename a few types to reflect the generality of the functionality. This leaves `quintVerifier.ts` super slim, but all of the verify logic (excluding the IO operations) from the `cliCommand` module should be moved there eventually. Closes #1396 --- quint/src/apalache.ts | 430 +++++++++++++++++++++++++++++++++++++ quint/src/quintVerifier.ts | 421 +----------------------------------- 2 files changed, 435 insertions(+), 416 deletions(-) create mode 100644 quint/src/apalache.ts diff --git a/quint/src/apalache.ts b/quint/src/apalache.ts new file mode 100644 index 000000000..e5cfbd130 --- /dev/null +++ b/quint/src/apalache.ts @@ -0,0 +1,430 @@ +/* ---------------------------------------------------------------------------------- + * Copyright 2023 Informal Systems + * Licensed under the Apache License, Version 2.0. + * See LICENSE in the project root for license information. + * --------------------------------------------------------------------------------- */ + +/** + * Interface to Apalache + * + * This functionality is enabled by managing and interacting with the Apalache + * server. + * + * @author Shon Feder + * + * @module + */ + +import { Either, chain, left, right } from '@sweet-monads/either' +import { ErrorMessage } from './ErrorMessage' +import path from 'path' +import fs from 'fs' +import os from 'os' +// TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 +// import semver from 'semver' +import { pipeline } from 'stream/promises' +import child_process from 'child_process' +import * as tar from 'tar' +import * as grpc from '@grpc/grpc-js' +import * as proto from '@grpc/proto-loader' +import * as protobufDescriptor from 'protobufjs/ext/descriptor' +import { setTimeout } from 'timers/promises' +import { promisify } from 'util' +import { ItfTrace } from './itf' +import { verbosity } from './verbosity' +// TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 +// import { request as octokitRequest } from '@octokit/request' + +import type { Buffer } from 'buffer' +import type { PackageDefinition as ProtoPackageDefinition } from '@grpc/proto-loader' + +const APALACHE_SERVER_URI = 'localhost:8822' +const APALACHE_VERSION_TAG = '0.44.7' +// TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 +// const APALACHE_TGZ = 'apalache.tgz' + +function quintConfigDir(): string { + return path.join(os.homedir(), '.quint') +} + +function apalacheDistDir(): string { + return path.join(quintConfigDir(), `apalache-dist-${APALACHE_VERSION_TAG}`) +} + +// The structure used to report errors +type ApalacheError = { + explanation: string + errors: ErrorMessage[] + traces?: ItfTrace[] +} + +export type ApalacheResult = Either + +// An object representing the Apalache configuration +// See https://github.com/informalsystems/apalache/blob/main/mod-infra/src/main/scala/at/forsyte/apalache/infra/passes/options.scala#L255 +type ApalacheConfig = any + +// Interface to the apalache server +// This is likely to be expanded in the future +type Apalache = { + // Run the check command with the given configuration + check: (c: ApalacheConfig) => Promise> +} + +function handleVerificationFailure(failure: { pass_name: string; error_data: any }): ApalacheError { + switch (failure.pass_name) { + case 'SanyParser': + return { + explanation: `internal error: while parsing in Apalache:\n'${failure.error_data}'\nPlease report an issue: https://github.com/informalsystems/quint/issues/new`, + errors: [], + } + case 'TypeCheckerSnowcat': + return { + explanation: `internal error: while type checking in Apalache:\n'${failure.error_data}'\nPlease report an issue: https://github.com/informalsystems/quint/issues/new`, + errors: [], + } + case 'BoundedChecker': + switch (failure.error_data.checking_result) { + case 'Error': + return { explanation: 'found a counterexample', traces: failure.error_data.counterexamples, errors: [] } + case 'Deadlock': + return { explanation: 'reached a deadlock', traces: failure.error_data.counterexamples, errors: [] } + default: + throw new Error(`internal error: unhandled verification error ${failure.error_data.checking_result}`) + } + default: + throw new Error(`internal error: unhandled verification error at pass ${failure.pass_name}`) + } +} + +// Construct the Apalache interface around the cmdExecutor +function apalache(cmdExecutor: AsyncCmdExecutor): Apalache { + const check = async (c: ApalacheConfig): Promise> => { + const response = await cmdExecutor.run({ cmd: 'CHECK', config: JSON.stringify(c) }) + if (response.result == 'success') { + return right(void 0) + } else { + switch (response.failure.errorType) { + case 'UNEXPECTED': { + const errData = JSON.parse(response.failure.data) + return err(errData.msg) + } + case 'PASS_FAILURE': + return left(handleVerificationFailure(JSON.parse(response.failure.data))) + default: + // TODO handle other error cases + return err(`${response.failure.errorType}: ${response.failure.data}`) + } + } + } + + return { check } +} + +// Alias for an async callback for values of type T used to annotate +// callback-based methods so we can convert them into promise-based methods via +// promiseify. +type AsyncCallBack = (err: any, result: T) => void + +// The core grpc tooling doesn't support generation of typing info, +// we therefore record the structer we require from the grpc generation +// in the 6 following types. +// +// The types reflect https://github.com/informalsystems/apalache/blob/main/shai/src/main/protobuf/cmdExecutor.proto + +type RunRequest = { cmd: string; config: string } + +type RunResponse = + | { result: 'failure'; failure: { errorType: string; data: string } } + // The success data also includes the parsed module, but we don't need it + | { result: 'success' } + +// The interface for the CmdExecutor service generated by the gRPC library +type CmdExecutor = { + // Constructs a new client service + new (url: string, creds: any): CmdExecutor + run: (req: RunRequest, cb: AsyncCallBack) => void +} + +// The refined interface to the CmdExecutor we produce from the generated interface +type AsyncCmdExecutor = { + run: (req: RunRequest) => Promise +} + +// The interface for the Shai package +type ShaiPkg = { + cmdExecutor: { + CmdExecutor: CmdExecutor + } +} + +// Helper to construct errors results +function err(explanation: string, errors: ErrorMessage[] = [], traces?: ItfTrace[]): ApalacheResult { + return left({ explanation, errors, traces }) +} + +// See https://grpc.io/docs/languages/node/basics/#example-code-and-setup +const grpcStubOptions = { + keepCase: true, + longs: String, + enums: String, + defaults: true, + oneofs: true, +} + +async function loadProtoDefViaReflection(retry: boolean): Promise> { + // Types of the gRPC interface + type ServerReflectionRequest = { file_containing_symbol: string } + type ServerReflectionResponseSuccess = { + file_descriptor_response: { + file_descriptor_proto: Buffer[] + } + } + type ServerReflectionResponseFailure = { + error_response: { + error_code: number + error_message: string + } + } + type ServerReflectionResponse = ServerReflectionResponseSuccess | ServerReflectionResponseFailure + type ServerReflectionService = { + new (url: string, creds: grpc.ChannelCredentials): ServerReflectionService + ServerReflectionInfo: () => grpc.ClientDuplexStream + getChannel: () => { getConnectivityState: (_: boolean) => grpc.connectivityState } + } + type ServerReflectionPkg = { + grpc: { reflection: { v1alpha: { ServerReflection: ServerReflectionService } } } + } + + // Obtain a reflection service client + const protoPath = require.resolve('./reflection.proto') + const packageDefinition = proto.loadSync(protoPath, grpcStubOptions) + const reflectionProtoDescriptor = grpc.loadPackageDefinition(packageDefinition) as unknown as ServerReflectionPkg + const serverReflectionService = reflectionProtoDescriptor.grpc.reflection.v1alpha.ServerReflection + const reflectionClient = new serverReflectionService(APALACHE_SERVER_URI, grpc.credentials.createInsecure()) + + // Wait for gRPC channel to come up, with 1sec pauses + if (retry) { + for (;;) { + const grpcChannelState = reflectionClient.getChannel().getConnectivityState(true) + if (grpcChannelState == grpc.connectivityState.READY) { + break + } else { + /* I suspect that there is a race with async gRPC code that actually + * brings the connection up, so we need to yield control here. In + * particular, waiting for the channel to come up in a busy-waiting loop + * does NOT work. + */ + await setTimeout(1000) + } + } + } + + // Query reflection endpoint + return new Promise>((resolve, _) => { + const call = reflectionClient.ServerReflectionInfo() + call.on('data', (r: ServerReflectionResponse) => { + call.end() + resolve(right(r)) + }) + call.on('error', (e: grpc.StatusObject) => resolve(err(`Error querying reflection endpoint: ${e}`))) + + call.write({ file_containing_symbol: 'shai.cmdExecutor.CmdExecutor' }) + }).then(protoDefResponse => + protoDefResponse.chain(protoDefResponse => { + // Construct a proto definition of the reflection response. + if ('error_response' in protoDefResponse) { + return err( + `Apalache gRPC endpoint is corrupted. Could not extract proto file: ${protoDefResponse.error_response.error_message}` + ) + } + + // Decode reflection response to FileDescriptorProto + let fileDescriptorProtos = protoDefResponse.file_descriptor_response.file_descriptor_proto.map( + bytes => protobufDescriptor.FileDescriptorProto.decode(bytes) as protobufDescriptor.IFileDescriptorProto + ) + + // Use proto-loader to load the FileDescriptorProto wrapped in a FileDescriptorSet + return right(proto.loadFileDescriptorSetFromObject({ file: fileDescriptorProtos }, grpcStubOptions)) + }) + ) +} + +function loadGrpcClient(protoDef: ProtoPackageDefinition): AsyncCmdExecutor { + const protoDescriptor = grpc.loadPackageDefinition(protoDef) + // The cast thru `unkown` lets us convince the type system of anything + // See https://basarat.gitbook.io/typescript/type-system/type-assertion#double-assertion + const pkg = protoDescriptor.shai as unknown as ShaiPkg + const stub: any = new pkg.cmdExecutor.CmdExecutor(APALACHE_SERVER_URI, grpc.credentials.createInsecure()) + return { + run: promisify((data: RunRequest, cb: AsyncCallBack) => stub.run(data, cb)), + } +} + +/** + * Connect to the Apalache server, and verify that the gRPC channel is up. + * + * @param retry Wait for the gRPC connection to come up. + * + * @returns A promise resolving to a `right` if the connection is + * successful, or a `left` if not. + */ +async function tryConnect(retry: boolean = false): Promise> { + return (await loadProtoDefViaReflection(retry)).map(loadGrpcClient).map(apalache) +} + +function downloadAndUnpackApalache(): Promise> { + const url = `https://github.com/informalsystems/apalache/releases/download/v${APALACHE_VERSION_TAG}/apalache.tgz` + return fetch(url) + .then( + // unpack response body + res => pipeline(res.body!, tar.extract({ cwd: apalacheDistDir(), strict: true })), + error => err(`Error fetching ${url}: ${error}`) + ) + .then( + _ => right(null), + error => err(`Error unpacking .tgz: ${error}`) + ) +} + +/** + * Fetch the latest Apalache release pinned by `APALACHE_VERSION_TAG` from Github. + * + * @returns A promise resolving to: + * - a `right` equal to the path the Apalache dist was unpacked to, + * - a `left` indicating an error. + */ +async function fetchApalache(verbosityLevel: number): Promise> { + const apalacheBinary = path.join(apalacheDistDir(), 'apalache', 'bin', 'apalache-mc') + if (fs.existsSync(apalacheBinary)) { + // Use existing download + debugLog(verbosityLevel, `Using existing Apalache distribution in ${apalacheBinary}`) + return right(apalacheBinary) + } else { + fs.mkdirSync(apalacheDistDir(), { recursive: true }) + process.stdout.write('Downloading Apalache distribution...') + const res = await downloadAndUnpackApalache() + process.stdout.write(' done.\n') + return res.map(_ => apalacheBinary) + } + + // TODO: This logic makes the CLI tool extremely sensitive to environment. + // See https://github.com/informalsystems/quint/issues/1124 + // Fetch Github releases + // return octokitRequest('GET /repos/informalsystems/apalache/releases').then( + // async resp => { + // // Find latest that satisfies `APALACHE_VERSION_TAG` + // const versions = resp.data.map((element: any) => element.tag_name) + // const latestTaggedVersion = semver.parse(semver.maxSatisfying(versions, APALACHE_VERSION_TAG)) + // if (latestTaggedVersion === null) { + // return err(`Failed to deteremine a valid semver version vesion from ${versions} and ${APALACHE_VERSION_TAG}`) + // } + // // Check if we have already downloaded this release + // const unpackPath = apalacheDistDir() + // const apalacheBinary = path.join(unpackPath, 'apalache', 'bin', 'apalache-mc') + // if (fs.existsSync(apalacheBinary)) { + // // Use existing download + // console.log(`Using existing Apalache distribution in ${unpackPath}`) + // return right(unpackPath) + // } else { + // // No existing download, download Apalache dist + // fs.mkdirSync(unpackPath, { recursive: true }) + + // // Filter release response to get dist archive asset URL + // const taggedRelease = resp.data.find((element: any) => element.tag_name == latestTaggedVersion) + // const tgzAsset = taggedRelease.assets.find((asset: any) => asset.name == APALACHE_TGZ) + // const downloadUrl = tgzAsset.browser_download_url + + // console.log(`Downloading Apalache distribution from ${downloadUrl}...`) + // return fetch(downloadUrl) + // .then( + // // unpack response body + // res => pipeline(res.body, tar.extract({ cwd: unpackPath, strict: true })), + // error => err(`Error fetching ${downloadUrl}: ${error}`) + // ) + // .then( + // _ => right(unpackPath), + // error => err(`Error unpacking .tgz: ${error}`) + // ) + // } + // }, + // error => err(`Error listing the Apalache releases: ${error}`) + // ) +} + +/** + * Connect to an already running Apalache server, or – if unsuccessful – fetch + * Apalache, spawn it, and connect to it. + * + * If an Apalache server is spawned, the child process exits when the parent process (i.e., this process) terminates. + * + * @returns A promise resolving to: + * - a `right` equal to the path the Apalache dist was unpacked to, + * - a `left` indicating an error. + */ +export async function connect(verbosityLevel: number): Promise> { + // Try to connect to Shai, and try to ping it + const connectionResult = await tryConnect() + // We managed to connect, simply return this connection + if (connectionResult.isRight()) { + return connectionResult + } + + // Connection or pinging failed, download Apalache + debugLog(verbosityLevel, 'No running Apalache server found, launching...') + const exeResult = await fetchApalache(verbosityLevel) + // Launch Apalache from download + return exeResult + .asyncChain( + async exe => + new Promise>((resolve, _) => { + debugLog(verbosityLevel, 'Launching Apalache server') + const apalache = child_process.spawn(exe, ['server']) + + // Exit handler that kills Apalache if Quint exists + function exitHandler() { + debugLog(verbosityLevel, 'Shutting down Apalache server') + try { + process.kill(apalache.pid!) + } catch (error: any) { + // ESRCH is raised if no process with `pid` exists, i.e., + // if Apalache server exited on its own + if (error.code == 'ESRCH') { + debugLog(verbosityLevel, 'Apalache already exited') + } else { + throw error + } + } + } + + if (apalache.pid) { + // Apalache launched successfully + + // Install exit handler that kills Apalache if Quint exists + process.on('exit', exitHandler.bind(null)) + process.on('SIGINT', exitHandler.bind(null)) + process.on('SIGUSR1', exitHandler.bind(null)) + process.on('SIGUSR2', exitHandler.bind(null)) + process.on('uncaughtException', exitHandler.bind(null)) + + resolve(right(void 0)) + } + // If Apalache fails to spawn, `apalache.pid` is undefined and 'error' is + // emitted. + apalache.on('error', error => resolve(err(`Failed to launch Apalache server: ${error.message}`))) + }) + ) + .then(chain(() => tryConnect(true))) +} + +/** + * Log `msg` to the console if `verbosityLevel` implies debug output. + * + * @param verbosityLevel the current verbosity level (set with --verbosity) + * @param msg the message to log + */ +function debugLog(verbosityLevel: number, msg: string) { + if (verbosity.hasDebugInfo(verbosityLevel)) { + console.log(msg) + } +} diff --git a/quint/src/quintVerifier.ts b/quint/src/quintVerifier.ts index bab9b0c5d..3749c1b65 100644 --- a/quint/src/quintVerifier.ts +++ b/quint/src/quintVerifier.ts @@ -1,431 +1,20 @@ /* ---------------------------------------------------------------------------------- - * Copyright 2023 Informal Systems + * Copyright 2024 Informal Systems * Licensed under the Apache License, Version 2.0. * See LICENSE in the project root for license information. * --------------------------------------------------------------------------------- */ /** - * Interface to Apalache's model checking functionality - * - * This functionality is exposed thru the Apalache server. + * Core logic of verification * * @author Shon Feder * * @module */ -import { Either, chain, left, right } from '@sweet-monads/either' -import { ErrorMessage } from './ErrorMessage' -import path from 'path' -import fs from 'fs' -import os from 'os' -// TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 -// import semver from 'semver' -import { pipeline } from 'stream/promises' -import child_process from 'child_process' -import * as tar from 'tar' -import * as grpc from '@grpc/grpc-js' -import * as proto from '@grpc/proto-loader' -import * as protobufDescriptor from 'protobufjs/ext/descriptor' -import { setTimeout } from 'timers/promises' -import { promisify } from 'util' -import { ItfTrace } from './itf' -import { verbosity } from './verbosity' -// TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 -// import { request as octokitRequest } from '@octokit/request' - -import type { Buffer } from 'buffer' -import type { PackageDefinition as ProtoPackageDefinition } from '@grpc/proto-loader' - -const APALACHE_SERVER_URI = 'localhost:8822' -const APALACHE_VERSION_TAG = '0.44.7' -// TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 -// const APALACHE_TGZ = 'apalache.tgz' - -// The structure used to report errors -type VerifyError = { - explanation: string - errors: ErrorMessage[] - traces?: ItfTrace[] -} - -function quintConfigDir(): string { - return path.join(os.homedir(), '.quint') -} - -function apalacheDistDir(): string { - return path.join(quintConfigDir(), `apalache-dist-${APALACHE_VERSION_TAG}`) -} - -export type VerifyResult = Either - -// An object representing the Apalache configuration -// See https://github.com/informalsystems/apalache/blob/main/mod-infra/src/main/scala/at/forsyte/apalache/infra/passes/options.scala#L255 -type ApalacheConfig = any - -// Interface to the apalache server -// This is likely to be expanded in the future -type Apalache = { - // Run the check command with the given configuration - check: (c: ApalacheConfig) => Promise> -} - -function handleVerificationFailure(failure: { pass_name: string; error_data: any }): VerifyError { - switch (failure.pass_name) { - case 'SanyParser': - return { - explanation: `internal error: while parsing in Apalache:\n'${failure.error_data}'\nPlease report an issue: https://github.com/informalsystems/quint/issues/new`, - errors: [], - } - case 'TypeCheckerSnowcat': - return { - explanation: `internal error: while type checking in Apalache:\n'${failure.error_data}'\nPlease report an issue: https://github.com/informalsystems/quint/issues/new`, - errors: [], - } - case 'BoundedChecker': - switch (failure.error_data.checking_result) { - case 'Error': - return { explanation: 'found a counterexample', traces: failure.error_data.counterexamples, errors: [] } - case 'Deadlock': - return { explanation: 'reached a deadlock', traces: failure.error_data.counterexamples, errors: [] } - default: - throw new Error(`internal error: unhandled verification error ${failure.error_data.checking_result}`) - } - default: - throw new Error(`internal error: unhandled verification error at pass ${failure.pass_name}`) - } -} - -// Construct the Apalache interface around the cmdExecutor -function apalache(cmdExecutor: AsyncCmdExecutor): Apalache { - const check = async (c: ApalacheConfig): Promise> => { - const response = await cmdExecutor.run({ cmd: 'CHECK', config: JSON.stringify(c) }) - if (response.result == 'success') { - return right(void 0) - } else { - switch (response.failure.errorType) { - case 'UNEXPECTED': { - const errData = JSON.parse(response.failure.data) - return err(errData.msg) - } - case 'PASS_FAILURE': - return left(handleVerificationFailure(JSON.parse(response.failure.data))) - default: - // TODO handle other error cases - return err(`${response.failure.errorType}: ${response.failure.data}`) - } - } - } - - return { check } -} - -// Alias for an async callback for values of type T used to annotate -// callback-based methods so we can convert them into promise-based methods via -// promiseify. -type AsyncCallBack = (err: any, result: T) => void - -// The core grpc tooling doesn't support generation of typing info, -// we therefore record the structer we require from the grpc generation -// in the 6 following types. -// -// The types reflect https://github.com/informalsystems/apalache/blob/main/shai/src/main/protobuf/cmdExecutor.proto - -type RunRequest = { cmd: string; config: string } - -type RunResponse = - | { result: 'failure'; failure: { errorType: string; data: string } } - // The success data also includes the parsed module, but we don't need it - | { result: 'success' } - -// The interface for the CmdExecutor service generated by the gRPC library -type CmdExecutor = { - // Constructs a new client service - new (url: string, creds: any): CmdExecutor - run: (req: RunRequest, cb: AsyncCallBack) => void -} - -// The refined interface to the CmdExecutor we produce from the generated interface -type AsyncCmdExecutor = { - run: (req: RunRequest) => Promise -} - -// The interface for the Shai package -type ShaiPkg = { - cmdExecutor: { - CmdExecutor: CmdExecutor - } -} - -// Helper to construct errors results -function err(explanation: string, errors: ErrorMessage[] = [], traces?: ItfTrace[]): VerifyResult { - return left({ explanation, errors, traces }) -} - -// See https://grpc.io/docs/languages/node/basics/#example-code-and-setup -const grpcStubOptions = { - keepCase: true, - longs: String, - enums: String, - defaults: true, - oneofs: true, -} - -async function loadProtoDefViaReflection(retry: boolean): Promise> { - // Types of the gRPC interface - type ServerReflectionRequest = { file_containing_symbol: string } - type ServerReflectionResponseSuccess = { - file_descriptor_response: { - file_descriptor_proto: Buffer[] - } - } - type ServerReflectionResponseFailure = { - error_response: { - error_code: number - error_message: string - } - } - type ServerReflectionResponse = ServerReflectionResponseSuccess | ServerReflectionResponseFailure - type ServerReflectionService = { - new (url: string, creds: grpc.ChannelCredentials): ServerReflectionService - ServerReflectionInfo: () => grpc.ClientDuplexStream - getChannel: () => { getConnectivityState: (_: boolean) => grpc.connectivityState } - } - type ServerReflectionPkg = { - grpc: { reflection: { v1alpha: { ServerReflection: ServerReflectionService } } } - } - - // Obtain a reflection service client - const protoPath = require.resolve('./reflection.proto') - const packageDefinition = proto.loadSync(protoPath, grpcStubOptions) - const reflectionProtoDescriptor = grpc.loadPackageDefinition(packageDefinition) as unknown as ServerReflectionPkg - const serverReflectionService = reflectionProtoDescriptor.grpc.reflection.v1alpha.ServerReflection - const reflectionClient = new serverReflectionService(APALACHE_SERVER_URI, grpc.credentials.createInsecure()) - - // Wait for gRPC channel to come up, with 1sec pauses - if (retry) { - for (;;) { - const grpcChannelState = reflectionClient.getChannel().getConnectivityState(true) - if (grpcChannelState == grpc.connectivityState.READY) { - break - } else { - /* I suspect that there is a race with async gRPC code that actually - * brings the connection up, so we need to yield control here. In - * particular, waiting for the channel to come up in a busy-waiting loop - * does NOT work. - */ - await setTimeout(1000) - } - } - } - - // Query reflection endpoint - return new Promise>((resolve, _) => { - const call = reflectionClient.ServerReflectionInfo() - call.on('data', (r: ServerReflectionResponse) => { - call.end() - resolve(right(r)) - }) - call.on('error', (e: grpc.StatusObject) => resolve(err(`Error querying reflection endpoint: ${e}`))) - - call.write({ file_containing_symbol: 'shai.cmdExecutor.CmdExecutor' }) - }).then(protoDefResponse => - protoDefResponse.chain(protoDefResponse => { - // Construct a proto definition of the reflection response. - if ('error_response' in protoDefResponse) { - return err( - `Apalache gRPC endpoint is corrupted. Could not extract proto file: ${protoDefResponse.error_response.error_message}` - ) - } +// TODO This module should subsume the pure logic from the verify commaind in cliCommand - // Decode reflection response to FileDescriptorProto - let fileDescriptorProtos = protoDefResponse.file_descriptor_response.file_descriptor_proto.map( - bytes => protobufDescriptor.FileDescriptorProto.decode(bytes) as protobufDescriptor.IFileDescriptorProto - ) - - // Use proto-loader to load the FileDescriptorProto wrapped in a FileDescriptorSet - return right(proto.loadFileDescriptorSetFromObject({ file: fileDescriptorProtos }, grpcStubOptions)) - }) - ) -} - -function loadGrpcClient(protoDef: ProtoPackageDefinition): AsyncCmdExecutor { - const protoDescriptor = grpc.loadPackageDefinition(protoDef) - // The cast thru `unkown` lets us convince the type system of anything - // See https://basarat.gitbook.io/typescript/type-system/type-assertion#double-assertion - const pkg = protoDescriptor.shai as unknown as ShaiPkg - const stub: any = new pkg.cmdExecutor.CmdExecutor(APALACHE_SERVER_URI, grpc.credentials.createInsecure()) - return { - run: promisify((data: RunRequest, cb: AsyncCallBack) => stub.run(data, cb)), - } -} - -/** - * Connect to the Apalache server, and verify that the gRPC channel is up. - * - * @param retry Wait for the gRPC connection to come up. - * - * @returns A promise resolving to a `right` if the connection is successful, or a `left` if not. - */ -async function tryConnect(retry: boolean = false): Promise> { - return (await loadProtoDefViaReflection(retry)).map(loadGrpcClient).map(apalache) -} - -function downloadAndUnpackApalache(): Promise> { - const url = `https://github.com/informalsystems/apalache/releases/download/v${APALACHE_VERSION_TAG}/apalache.tgz` - return fetch(url) - .then( - // unpack response body - res => pipeline(res.body!, tar.extract({ cwd: apalacheDistDir(), strict: true })), - error => err(`Error fetching ${url}: ${error}`) - ) - .then( - _ => right(null), - error => err(`Error unpacking .tgz: ${error}`) - ) -} - -/** - * Fetch the latest Apalache release pinned by `APALACHE_VERSION_TAG` from Github. - * - * @returns A promise resolving to: - * - a `right` equal to the path the Apalache dist was unpacked to, - * - a `left` indicating an error. - */ -async function fetchApalache(verbosityLevel: number): Promise> { - const apalacheBinary = path.join(apalacheDistDir(), 'apalache', 'bin', 'apalache-mc') - if (fs.existsSync(apalacheBinary)) { - // Use existing download - debugLog(verbosityLevel, `Using existing Apalache distribution in ${apalacheBinary}`) - return right(apalacheBinary) - } else { - fs.mkdirSync(apalacheDistDir(), { recursive: true }) - process.stdout.write('Downloading Apalache distribution...') - const res = await downloadAndUnpackApalache() - process.stdout.write(' done.\n') - return res.map(_ => apalacheBinary) - } - - // TODO: This logic makes the CLI tool extremely sensitive to environment. - // See https://github.com/informalsystems/quint/issues/1124 - // Fetch Github releases - // return octokitRequest('GET /repos/informalsystems/apalache/releases').then( - // async resp => { - // // Find latest that satisfies `APALACHE_VERSION_TAG` - // const versions = resp.data.map((element: any) => element.tag_name) - // const latestTaggedVersion = semver.parse(semver.maxSatisfying(versions, APALACHE_VERSION_TAG)) - // if (latestTaggedVersion === null) { - // return err(`Failed to deteremine a valid semver version vesion from ${versions} and ${APALACHE_VERSION_TAG}`) - // } - // // Check if we have already downloaded this release - // const unpackPath = apalacheDistDir() - // const apalacheBinary = path.join(unpackPath, 'apalache', 'bin', 'apalache-mc') - // if (fs.existsSync(apalacheBinary)) { - // // Use existing download - // console.log(`Using existing Apalache distribution in ${unpackPath}`) - // return right(unpackPath) - // } else { - // // No existing download, download Apalache dist - // fs.mkdirSync(unpackPath, { recursive: true }) - - // // Filter release response to get dist archive asset URL - // const taggedRelease = resp.data.find((element: any) => element.tag_name == latestTaggedVersion) - // const tgzAsset = taggedRelease.assets.find((asset: any) => asset.name == APALACHE_TGZ) - // const downloadUrl = tgzAsset.browser_download_url - - // console.log(`Downloading Apalache distribution from ${downloadUrl}...`) - // return fetch(downloadUrl) - // .then( - // // unpack response body - // res => pipeline(res.body, tar.extract({ cwd: unpackPath, strict: true })), - // error => err(`Error fetching ${downloadUrl}: ${error}`) - // ) - // .then( - // _ => right(unpackPath), - // error => err(`Error unpacking .tgz: ${error}`) - // ) - // } - // }, - // error => err(`Error listing the Apalache releases: ${error}`) - // ) -} - -/** - * Connect to an already running Apalache server, or – if unsuccessful – fetch - * Apalache, spawn it, and connect to it. - * - * If an Apalache server is spawned, the child process exits when the parent process (i.e., this process) terminates. - * - * @returns A promise resolving to: - * - a `right` equal to the path the Apalache dist was unpacked to, - * - a `left` indicating an error. - */ -async function connect(verbosityLevel: number): Promise> { - // Try to connect to Shai, and try to ping it - const connectionResult = await tryConnect() - // We managed to connect, simply return this connection - if (connectionResult.isRight()) { - return connectionResult - } - - // Connection or pinging failed, download Apalache - debugLog(verbosityLevel, 'No running Apalache server found, launching...') - const exeResult = await fetchApalache(verbosityLevel) - // Launch Apalache from download - return exeResult - .asyncChain( - async exe => - new Promise>((resolve, _) => { - debugLog(verbosityLevel, 'Launching Apalache server') - const apalache = child_process.spawn(exe, ['server']) - - // Exit handler that kills Apalache if Quint exists - function exitHandler() { - debugLog(verbosityLevel, 'Shutting down Apalache server') - try { - process.kill(apalache.pid!) - } catch (error: any) { - // ESRCH is raised if no process with `pid` exists, i.e., - // if Apalache server exited on its own - if (error.code == 'ESRCH') { - debugLog(verbosityLevel, 'Apalache already exited') - } else { - throw error - } - } - } - - if (apalache.pid) { - // Apalache launched successfully - - // Install exit handler that kills Apalache if Quint exists - process.on('exit', exitHandler.bind(null)) - process.on('SIGINT', exitHandler.bind(null)) - process.on('SIGUSR1', exitHandler.bind(null)) - process.on('SIGUSR2', exitHandler.bind(null)) - process.on('uncaughtException', exitHandler.bind(null)) - - resolve(right(void 0)) - } - // If Apalache fails to spawn, `apalache.pid` is undefined and 'error' is - // emitted. - apalache.on('error', error => resolve(err(`Failed to launch Apalache server: ${error.message}`))) - }) - ) - .then(chain(() => tryConnect(true))) -} - -/** - * Log `msg` to the console if `verbosityLevel` implies debug output. - * - * @param verbosityLevel the current verbosity level (set with --verbosity) - * @param msg the message to log - */ -function debugLog(verbosityLevel: number, msg: string) { - if (verbosity.hasDebugInfo(verbosityLevel)) { - console.log(msg) - } -} +import { ApalacheResult, connect } from './apalache' /** * Verifies the configuration `config` by model checking it with the Apalache server @@ -435,7 +24,7 @@ function debugLog(verbosityLevel: number, msg: string) { * * @returns right(void) if verification succeeds, or left(err) explaining the failure */ -export async function verify(config: any, verbosityLevel: number): Promise> { +export async function verify(config: any, verbosityLevel: number): Promise> { const connectionResult = await connect(verbosityLevel) return connectionResult.asyncChain(conn => conn.check(config)) } From b01272a9974e8156d0d57de4151aae4db8b879eb Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 11 Mar 2024 11:50:05 -0400 Subject: [PATCH 291/388] Use guessMainModule function --- quint/src/cliCommands.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index a23b3178d..2822e6a73 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -623,8 +623,7 @@ export async function verifySpec(prev: TypecheckedStage): Promise m.name === mainName) if (!main) { return cliErr(`module ${mainName} does not exist`, { ...verifying, errors: [], sourceCode: new Map() }) From e8ef56bd5bbf0bf6d5ef0d601f86196e39253f08 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 11 Mar 2024 12:23:50 -0400 Subject: [PATCH 292/388] Remove unnecessary `async` --- quint/src/cli.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/cli.ts b/quint/src/cli.ts index 21df3eb7d..35837fa54 100755 --- a/quint/src/cli.ts +++ b/quint/src/cli.ts @@ -58,7 +58,7 @@ const parseCmd = { desc: 'name of the source map', type: 'string', }), - handler: async (args: any) => load(args).then(chainCmd(parse)).then(outputResult), + handler: (args: any) => load(args).then(chainCmd(parse)).then(outputResult), } // construct typecheck commands with yargs From d2ccc5ebcb51bb05d0b38fd38ac0698288bf3767 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 11 Mar 2024 12:24:42 -0400 Subject: [PATCH 293/388] Preserve successful data received from Apalache We didn't need this before when just using the `check` command. --- quint/src/apalache.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/quint/src/apalache.ts b/quint/src/apalache.ts index e5cfbd130..d2cf3cccc 100644 --- a/quint/src/apalache.ts +++ b/quint/src/apalache.ts @@ -136,8 +136,9 @@ type RunRequest = { cmd: string; config: string } type RunResponse = | { result: 'failure'; failure: { errorType: string; data: string } } - // The success data also includes the parsed module, but we don't need it - | { result: 'success' } + // The success data also includes the parsed module, either as JSON + // representing the Apalache IR, ir as a TLA string (if the `TLA` command is used) + | { result: 'success'; success: string } // The interface for the CmdExecutor service generated by the gRPC library type CmdExecutor = { From 4e6197570dbbd5b7884d3051d9aaeac6195dea6d Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 11 Mar 2024 12:26:17 -0400 Subject: [PATCH 294/388] Add support for the `TLA` Apalache cmdServer cmd --- quint/src/apalache.ts | 44 ++++++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/quint/src/apalache.ts b/quint/src/apalache.ts index d2cf3cccc..fdcfa91e0 100644 --- a/quint/src/apalache.ts +++ b/quint/src/apalache.ts @@ -69,6 +69,8 @@ type ApalacheConfig = any type Apalache = { // Run the check command with the given configuration check: (c: ApalacheConfig) => Promise> + // Convert the provided input into formatted TLA + tla: (c: ApalacheConfig) => Promise> } function handleVerificationFailure(failure: { pass_name: string; error_data: any }): ApalacheError { @@ -97,28 +99,36 @@ function handleVerificationFailure(failure: { pass_name: string; error_data: any } } +async function handleResponse(response: RunResponse): Promise> { + if (response.result == 'success') { + const success = JSON.parse(response.success) + return right(success) + } else { + switch (response.failure.errorType) { + case 'UNEXPECTED': { + const errData = JSON.parse(response.failure.data) + return err(errData.msg) + } + case 'PASS_FAILURE': + return left(handleVerificationFailure(JSON.parse(response.failure.data))) + default: + // TODO handle other error cases + return err(`${response.failure.errorType}: ${response.failure.data}`) + } + } +} + // Construct the Apalache interface around the cmdExecutor function apalache(cmdExecutor: AsyncCmdExecutor): Apalache { const check = async (c: ApalacheConfig): Promise> => { - const response = await cmdExecutor.run({ cmd: 'CHECK', config: JSON.stringify(c) }) - if (response.result == 'success') { - return right(void 0) - } else { - switch (response.failure.errorType) { - case 'UNEXPECTED': { - const errData = JSON.parse(response.failure.data) - return err(errData.msg) - } - case 'PASS_FAILURE': - return left(handleVerificationFailure(JSON.parse(response.failure.data))) - default: - // TODO handle other error cases - return err(`${response.failure.errorType}: ${response.failure.data}`) - } - } + return cmdExecutor.run({ cmd: 'CHECK', config: JSON.stringify(c) }).then(handleResponse) + } + + const tla = async (c: ApalacheConfig): Promise> => { + return cmdExecutor.run({ cmd: 'TLA', config: JSON.stringify(c) }).then(handleResponse) } - return { check } + return { check, tla } } // Alias for an async callback for values of type T used to annotate From e98270404e3bea5d3e5f619bfb2c345fe3e04e7d Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 11 Mar 2024 20:37:20 -0400 Subject: [PATCH 295/388] Add compile subcommand Closes #1309 Closes #359 Both issues include ideas for followup work (e.g., compiling to a `js` or UX improvements for a TLC integration). But this covers the core of both. --- quint/src/cli.ts | 25 ++++++++++++++ quint/src/cliCommands.ts | 64 ++++++++++++++++++++++++++++++++++- quint/src/compileToTlaplus.ts | 36 ++++++++++++++++++++ 3 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 quint/src/compileToTlaplus.ts diff --git a/quint/src/cli.ts b/quint/src/cli.ts index 35837fa54..9663c3c02 100755 --- a/quint/src/cli.ts +++ b/quint/src/cli.ts @@ -13,6 +13,7 @@ import yargs from 'yargs/yargs' import { CLIProcedure, + compile, docs, load, outputResult, @@ -69,6 +70,29 @@ const typecheckCmd = { handler: (args: any) => load(args).then(chainCmd(parse)).then(chainCmd(typecheck)).then(outputResult), } +// construct the compile subcommand +const compileCmd = { + command: 'compile ', + desc: 'compile a Quint specification into the target kind, the output is written to stdout', + builder: (yargs: any) => + defaultOpts(yargs) + .option('main', { + desc: 'name of the main module (by default, computed from filename)', + type: 'string', + }) + .option('target', { + desc: 'the compilation target. Supported values: `tlaplus`, `json`', + type: 'string', + }) + .option('verbosity', { + desc: 'control how much output is produced (0 to 5)', + type: 'number', + default: verbosity.defaultLevel, + }), + handler: (args: any) => + load(args).then(chainCmd(parse)).then(chainCmd(typecheck)).then(chainCmd(compile)).then(outputResult), +} + // construct repl commands with yargs const replCmd = { command: ['repl', '*'], @@ -292,6 +316,7 @@ async function main() { await yargs(process.argv.slice(2)) .command(parseCmd) .command(typecheckCmd) + .command(compileCmd) .command(replCmd) .command(runCmd) .command(testCmd) diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index 2822e6a73..24f36032f 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -24,6 +24,7 @@ import { } from './parsing/quintParserFrontend' import { ErrorMessage } from './ErrorMessage' +import { fail } from 'assert' import { Either, left, right } from '@sweet-monads/either' import { EffectScheme } from './effects/base' import { LookupTable, UnusedDefinitions } from './names/base' @@ -47,8 +48,9 @@ import { analyzeInc, analyzeModules } from './quintAnalyzer' import { ExecutionFrame } from './runtime/trace' import { flow, isEqual, uniqWith } from 'lodash' import { Maybe, just, none } from '@sweet-monads/maybe' +import { compileToTlaplus } from './compileToTlaplus' -export type stage = 'loading' | 'parsing' | 'typechecking' | 'testing' | 'running' | 'documentation' +export type stage = 'loading' | 'parsing' | 'typechecking' | 'testing' | 'running' | 'compiling' | 'documentation' /** The data from a ProcedureStage that may be output to --out */ interface OutputStage { @@ -604,6 +606,66 @@ export async function runSimulator(prev: TypecheckedStage): Promise> { + const stage: stage = 'compiling' + const args = typechecked.args + const verbosityLevel = deriveVerbosity(args) + + const { flattenedModules, flattenedTable, flattenedAnalysis } = flattenModules( + typechecked.modules, + typechecked.table, + typechecked.idGen, + typechecked.sourceMap, + typechecked + ) + + const mainName = guessMainModule(typechecked) + const main = flattenedModules.find(m => m.name === mainName)! + if (!main) { + return cliErr(`module ${mainName} does not exist`, { ...typechecked, errors: [], sourceCode: new Map() }) + } + + const flattenedStage: TypecheckedStage = { + ...typechecked, + ...flattenedAnalysis, + modules: [main], + table: flattenedTable, + stage, + } + + const parsedSpecJson = jsonStringOfOutputStage(pickOutputStage(flattenedStage)) + switch ((typechecked.args.target as string).toLowerCase()) { + case 'json': + process.stdout.write(parsedSpecJson) + return right(flattenedStage) + case 'tlaplus': { + const toTlaResult = await compileToTlaplus(parsedSpecJson, verbosityLevel) + return toTlaResult + .mapRight(tla => { + process.stdout.write(tla) // Write out, since all went right + return flattenedStage + }) + .mapLeft(err => { + return { + msg: err.explanation, + stage: { ...flattenedStage, stage, status: 'error', errors: err.errors }, + } + }) + } + default: + fail(`Invalid option for --target: ${args.target}. Valid options: json, tlaplus`) + } +} + /** * Verify a spec via Apalache. * diff --git a/quint/src/compileToTlaplus.ts b/quint/src/compileToTlaplus.ts new file mode 100644 index 000000000..4df0a7995 --- /dev/null +++ b/quint/src/compileToTlaplus.ts @@ -0,0 +1,36 @@ +/* ---------------------------------------------------------------------------------- + * Copyright 2024 Informal Systems + * Licensed under the Apache License, Version 2.0. + * See LICENSE in the project root for license information. + * --------------------------------------------------------------------------------- */ + +/** + * Use apalache to convert quint parse data into TLA+ + * + * @author Shon Feder + * + * @module + */ + +import { ApalacheResult, connect } from './apalache' + +/** + * Get apalache to convert quint parse data into TLA+ + * + * @param parseDataJson the flattened, analyzed, parse data, in as a json string + * + * @returns right(tlaString) if parsing succeeds, or left(err) explaining the failure + */ +export async function compileToTlaplus(parseDataJson: string, verbosityLevel: number): Promise> { + const config = { + input: { + source: { + type: 'string', + format: 'qnt', + content: parseDataJson, + }, + }, + } + const connectionResult = await connect(verbosityLevel) + return connectionResult.asyncChain(conn => conn.tla(config)) +} From 4d2c10d26d76f2edb9f87a04cff82218ca43a8f5 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 11 Mar 2024 20:39:04 -0400 Subject: [PATCH 296/388] Add tests for `compile --target tlaplus` --- quint/apalache-tests.md | 51 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/quint/apalache-tests.md b/quint/apalache-tests.md index 1ffc501d2..8a716f60c 100644 --- a/quint/apalache-tests.md +++ b/quint/apalache-tests.md @@ -219,3 +219,54 @@ An example execution: __saved_n: 1, n: 1 ``` + +## Compiling to TLA+ + +### Test that we can compile to TLA+ of the expected form + + +``` +quint compile --target tlaplus ../examples/language-features/booleans.qnt +``` + + +``` +------------------------------- MODULE booleans ------------------------------- + +EXTENDS Integers, Sequences, FiniteSets, TLC, Apalache + +VARIABLE b + +step == + (b \/ TRUE) + /\ ~(b /\ FALSE) + /\ (b => b) + /\ (b <=> b) + /\ b = b + /\ b /= (~b) + /\ b' := (~b) + +init == b' := TRUE + +================================================================================ +``` + +### Test that we can compile a module with imports and instances to TLA+ + + + +``` +quint compile --target tlaplus ../examples/classic/distributed/ClockSync/clockSync3.qnt | head +``` + + +TODO: This is an incorrect result, we are removing all "unused" declarations +which leaves nothing, thanks to the way clockSync3 is instanced. + +``` +------------------------------ MODULE clockSync3 ------------------------------ + +EXTENDS Integers, Sequences, FiniteSets, TLC, Apalache + +================================================================================ +``` From 7811f8627e1d564b85113ff5ab015e389eba3722 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 11 Mar 2024 20:53:28 -0400 Subject: [PATCH 297/388] Add test for `compile --target json` --- quint/io-cli-tests.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/quint/io-cli-tests.md b/quint/io-cli-tests.md index 3f3d3e663..dff7aa198 100644 --- a/quint/io-cli-tests.md +++ b/quint/io-cli-tests.md @@ -171,6 +171,20 @@ Trying to unify bool and int error: typechecking failed ``` +## The `compile` commaind + +### Can compile `booleans.qnt` to JSON + + +``` +quint compile --target json ../examples/language-features/booleans.qnt | jq '.modules[0].name' +``` + + +``` +"booleans" +``` + ## Use of `repl`, `test`, and `run` ### Repl loads a file with -r From 7003ef2fcc7fb2e902f3398f7b7a7de92e169031 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 11 Mar 2024 21:37:45 -0400 Subject: [PATCH 298/388] Give a clean CLI error for invalid options --- quint/io-cli-tests.md | 18 ++++++++++++++++++ quint/src/cli.ts | 10 +++++++++- quint/src/cliCommands.ts | 3 ++- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/quint/io-cli-tests.md b/quint/io-cli-tests.md index dff7aa198..6907f5c47 100644 --- a/quint/io-cli-tests.md +++ b/quint/io-cli-tests.md @@ -173,6 +173,24 @@ error: typechecking failed ## The `compile` commaind +### Reports in error for invalid `--target` + +We pipe stderr to `tail` here. Following https://stackoverflow.com/a/52575213/1187277 +This is a clean CLI interface error, but we don't want to put the entire output +in the test, lest it require fiddling when unrelated things are updated. + + + +``` +quint compile --target invalidTarget ../examples/language-features/booleans.qnt 2> >(tail -1 >&2) +``` + + +``` +Invalid option for --target: invalidTarget. Valid options: tlaplus, json +``` + + ### Can compile `booleans.qnt` to JSON diff --git a/quint/src/cli.ts b/quint/src/cli.ts index 9663c3c02..11fffcefe 100755 --- a/quint/src/cli.ts +++ b/quint/src/cli.ts @@ -9,6 +9,7 @@ * @author Igor Konnov, Gabriela Moreira, Shon Feder, Informal Systems, 2021-2023 */ +import { fail } from 'assert' import yargs from 'yargs/yargs' import { @@ -70,6 +71,7 @@ const typecheckCmd = { handler: (args: any) => load(args).then(chainCmd(parse)).then(chainCmd(typecheck)).then(outputResult), } +const supportedTarges = ['tlaplus', 'json'] // construct the compile subcommand const compileCmd = { command: 'compile ', @@ -81,9 +83,15 @@ const compileCmd = { type: 'string', }) .option('target', { - desc: 'the compilation target. Supported values: `tlaplus`, `json`', + desc: `the compilation target. Supported values: ${supportedTarges.join(', ')}`, type: 'string', }) + .coerce('target', (target: string): string => { + if (!supportedTarges.includes(target)) { + fail(`Invalid option for --target: ${target}. Valid options: ${supportedTarges.join(', ')}`) + } + return target + }) .option('verbosity', { desc: 'control how much output is produced (0 to 5)', type: 'number', diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index 24f36032f..2fdb81b2c 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -662,7 +662,8 @@ export async function compile(typechecked: TypecheckedStage): Promise Date: Tue, 12 Mar 2024 11:56:56 -0400 Subject: [PATCH 299/388] Update quint/src/apalache.ts Co-authored-by: Gabriela Moreira --- quint/src/apalache.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/apalache.ts b/quint/src/apalache.ts index fdcfa91e0..c398c6ea1 100644 --- a/quint/src/apalache.ts +++ b/quint/src/apalache.ts @@ -147,7 +147,7 @@ type RunRequest = { cmd: string; config: string } type RunResponse = | { result: 'failure'; failure: { errorType: string; data: string } } // The success data also includes the parsed module, either as JSON - // representing the Apalache IR, ir as a TLA string (if the `TLA` command is used) + // representing the Apalache IR, or as a TLA string (if the `TLA` command is used) | { result: 'success'; success: string } // The interface for the CmdExecutor service generated by the gRPC library From dda6aee1662b700095bf7860b38d9684e1090479 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 12 Mar 2024 12:33:31 -0400 Subject: [PATCH 300/388] Fix comment --- quint/src/apalache.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/quint/src/apalache.ts b/quint/src/apalache.ts index c398c6ea1..a382957a8 100644 --- a/quint/src/apalache.ts +++ b/quint/src/apalache.ts @@ -137,8 +137,8 @@ function apalache(cmdExecutor: AsyncCmdExecutor): Apalache { type AsyncCallBack = (err: any, result: T) => void // The core grpc tooling doesn't support generation of typing info, -// we therefore record the structer we require from the grpc generation -// in the 6 following types. +// we therefore record the structure we require from the grpc generation +// in the following types. // // The types reflect https://github.com/informalsystems/apalache/blob/main/shai/src/main/protobuf/cmdExecutor.proto From f078b5760e9e7d7ed191d1c56287928002aa088c Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 12 Mar 2024 12:33:40 -0400 Subject: [PATCH 301/388] Defualt compile to the `json` target --- quint/src/cli.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/quint/src/cli.ts b/quint/src/cli.ts index 11fffcefe..189620ee3 100755 --- a/quint/src/cli.ts +++ b/quint/src/cli.ts @@ -85,6 +85,7 @@ const compileCmd = { .option('target', { desc: `the compilation target. Supported values: ${supportedTarges.join(', ')}`, type: 'string', + default: 'json', }) .coerce('target', (target: string): string => { if (!supportedTarges.includes(target)) { From 620baf3c78fb862f3a391815ab567214aec6661c Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 12 Mar 2024 12:42:22 -0400 Subject: [PATCH 302/388] Add documentation --- doc/quint.md | 34 ++++++++++++++++++++++++++++++++++ quint/src/cli.ts | 2 +- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/doc/quint.md b/doc/quint.md index e455f2e4a..18eed574b 100644 --- a/doc/quint.md +++ b/doc/quint.md @@ -14,6 +14,8 @@ and integration with other tools. The main commands of `quint` are as follows: - [x] `repl` starts the REPL (Read-Eval-Print loop) for Quint + - [x] `compile` parses, typechecks, and processes a quint specification + into the `--target` format, writing the results to stdout - [x] `parse` parses a Quint specification and resolves names - [x] `typecheck` infers types in a Quint specification - [x] `run` executes a Quint specification via random simulation @@ -65,6 +67,38 @@ The REPL is especially useful for learning the language. See the The verbosity levels 3 and 4 are used to show execution details. They are especially useful for debugging complex specifications. +## Command `compile` + +```sh +$ quint compile --help +quint compile + +compile a Quint specification into the target, the output is written to +stdout + +Options: + --help Show help [boolean] + --version Show version number [boolean] + --out output file (suppresses all console output) [string] + --main name of the main module (by default, computed from filename) + [string] + --target the compilation target. Supported values: tlaplus, json + [string] [default: "json"] + --verbosity control how much output is produced (0 to 5)[number] [default: 2] +``` + +Given a quint specification as input, this command parses, resolves imports, +typechecks, and then "flattens" the specification into on module containing just +the needed definitions. + +The following compilation targets are supported + +- `json`: The default target, this produces a json representation, in the same + format which is described under [`parse`](#command-parse) and + [`typecheck`](#command-typecheck), below. +- `tlaplus`: Quint uses its integration with Apalache to compile the + specification into TLA+. + ## Command `parse` *Warning: The language is still in active development, and breaking changes are diff --git a/quint/src/cli.ts b/quint/src/cli.ts index 189620ee3..da318605e 100755 --- a/quint/src/cli.ts +++ b/quint/src/cli.ts @@ -75,7 +75,7 @@ const supportedTarges = ['tlaplus', 'json'] // construct the compile subcommand const compileCmd = { command: 'compile ', - desc: 'compile a Quint specification into the target kind, the output is written to stdout', + desc: 'compile a Quint specification into the target, the output is written to stdout', builder: (yargs: any) => defaultOpts(yargs) .option('main', { From f10ab04b2ff6989d6114671679d41cb0652f414f Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Tue, 12 Mar 2024 12:48:55 -0400 Subject: [PATCH 303/388] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e0326d518..4f2f95c17 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added polymorphic type declarations, allowing abstracting commonly used data types like `Option[a]` and `Result[err, ok]`. Note that this is not yet supported by `verify`. (#1298) +- Added `compile` subcommand, allowing compiling specs to TLA+ (via Apalache) + and to a JSON format. (#1309, #359) ### Changed From 2c03d4647668135bb4843b46caa55601aec62f88 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 13 Mar 2024 23:03:11 -0400 Subject: [PATCH 304/388] Use () instead of {} for the unit We had been using the empty record `{}` for the unit, but this was causing problems with conversion to TLA+. We now use the empty tuple, `()`, which is easily and type-correctly represented in TLA+ as `<<>>`. --- quint/io-cli-tests.md | 2 +- quint/src/generated/Quint.g4 | 3 +- quint/src/generated/Quint.interp | 2 +- quint/src/generated/QuintListener.ts | 14 + quint/src/generated/QuintParser.ts | 1071 +++++++++--------- quint/src/generated/QuintVisitor.ts | 9 + quint/src/ir/quintTypes.ts | 16 +- quint/src/parsing/ToIrListener.ts | 7 +- quint/src/types/constraintGenerator.ts | 4 +- quint/test/runtime/compile.test.ts | 2 +- quint/test/types/aliasInliner.test.ts | 6 +- quint/test/types/constraintGenerator.test.ts | 8 - quint/test/types/inferrer.test.ts | 38 +- quint/testFixture/_1043sumTypeDecl.json | 2 +- quint/testFixture/_1044matchExpression.json | 2 +- 15 files changed, 623 insertions(+), 563 deletions(-) diff --git a/quint/io-cli-tests.md b/quint/io-cli-tests.md index 6907f5c47..d9744bc60 100644 --- a/quint/io-cli-tests.md +++ b/quint/io-cli-tests.md @@ -1130,7 +1130,7 @@ rm xTest.itf.json ``` -[{"#meta":{"index":0},"x":{"tag":"None","value":{}}},{"#meta":{"index":1},"x":{"tag":"Some","value":{"#bigint":"1"}}},{"#meta":{"index":2},"x":{"tag":"Some","value":{"#bigint":"2"}}}] +[{"#meta":{"index":0},"x":{"tag":"None","value":{"#tup":[]}}},{"#meta":{"index":1},"x":{"tag":"Some","value":{"#bigint":"1"}}},{"#meta":{"index":2},"x":{"tag":"Some","value":{"#bigint":"2"}}}] ``` ### FAIL on parsing filenames with different casing diff --git a/quint/src/generated/Quint.g4 b/quint/src/generated/Quint.g4 index 5e571e491..b562a451a 100644 --- a/quint/src/generated/Quint.g4 +++ b/quint/src/generated/Quint.g4 @@ -176,8 +176,9 @@ expr: // apply a built-in operator via the dot notation | 'all' '{' expr (',' expr)* ','? '}' # actionAll | 'any' '{' expr (',' expr)* ','? '}' # actionAny | ( qualId | INT | BOOL | STRING) # literalOrId - // a tuple constructor, the form tup(...) is just an operator call + // a tuple constructor, the form Tup(...) is just an operator call | '(' expr ',' expr (',' expr)* ','? ')' # tuple + | '(' ')' # unit // short-hand syntax for pairs, mainly designed for maps | expr '->' expr # pair | '{' recElem (',' recElem)* ','? '}' # record diff --git a/quint/src/generated/Quint.interp b/quint/src/generated/Quint.interp index f54adf8d9..f372f04a1 100644 --- a/quint/src/generated/Quint.interp +++ b/quint/src/generated/Quint.interp @@ -191,4 +191,4 @@ identifier atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 801, 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, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 3, 2, 6, 2, 90, 10, 2, 13, 2, 14, 2, 91, 3, 2, 3, 2, 3, 3, 7, 3, 97, 10, 3, 12, 3, 14, 3, 100, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 106, 10, 3, 12, 3, 14, 3, 109, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 114, 10, 4, 12, 4, 14, 4, 117, 11, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 141, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 149, 10, 6, 12, 6, 14, 6, 152, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 159, 10, 6, 3, 6, 5, 6, 162, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 170, 10, 6, 12, 6, 14, 6, 173, 11, 6, 5, 6, 175, 10, 6, 3, 6, 5, 6, 178, 10, 6, 3, 6, 3, 6, 5, 6, 182, 10, 6, 3, 6, 3, 6, 5, 6, 186, 10, 6, 3, 6, 5, 6, 189, 10, 6, 5, 6, 191, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 205, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 212, 10, 8, 12, 8, 14, 8, 215, 11, 8, 3, 8, 5, 8, 218, 10, 8, 3, 9, 5, 9, 221, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 226, 10, 9, 12, 9, 14, 9, 229, 11, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 236, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 242, 10, 11, 3, 11, 3, 11, 3, 11, 5, 11, 247, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 258, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 266, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 272, 10, 13, 3, 13, 3, 13, 5, 13, 276, 10, 13, 5, 13, 278, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 289, 10, 14, 5, 14, 291, 10, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 304, 10, 15, 12, 15, 14, 15, 307, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 314, 10, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 327, 10, 15, 12, 15, 14, 15, 330, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 337, 10, 15, 5, 15, 339, 10, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 354, 10, 20, 12, 20, 14, 20, 357, 11, 20, 5, 20, 359, 10, 20, 3, 20, 5, 20, 362, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 383, 10, 20, 12, 20, 14, 20, 386, 11, 20, 3, 20, 5, 20, 389, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 395, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 412, 10, 20, 12, 20, 14, 20, 415, 11, 20, 3, 20, 3, 20, 5, 20, 419, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 427, 10, 20, 12, 20, 14, 20, 430, 11, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 443, 10, 22, 12, 22, 14, 22, 446, 11, 22, 3, 22, 3, 22, 3, 22, 5, 22, 451, 10, 22, 3, 22, 3, 22, 5, 22, 455, 10, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 464, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 480, 10, 24, 12, 24, 14, 24, 483, 11, 24, 3, 24, 5, 24, 486, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 495, 10, 24, 12, 24, 14, 24, 498, 11, 24, 3, 24, 5, 24, 501, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 511, 10, 24, 12, 24, 14, 24, 514, 11, 24, 3, 24, 5, 24, 517, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 526, 10, 24, 12, 24, 14, 24, 529, 11, 24, 3, 24, 5, 24, 532, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 540, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 548, 10, 24, 12, 24, 14, 24, 551, 11, 24, 3, 24, 5, 24, 554, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 562, 10, 24, 12, 24, 14, 24, 565, 11, 24, 3, 24, 5, 24, 568, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 576, 10, 24, 12, 24, 14, 24, 579, 11, 24, 5, 24, 581, 10, 24, 3, 24, 5, 24, 584, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 609, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 648, 10, 24, 3, 24, 5, 24, 651, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 658, 10, 24, 12, 24, 14, 24, 661, 11, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 667, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 672, 10, 25, 12, 25, 14, 25, 675, 11, 25, 3, 25, 3, 25, 3, 26, 3, 26, 5, 26, 681, 10, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 690, 10, 27, 3, 27, 5, 27, 693, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 704, 10, 28, 3, 29, 3, 29, 5, 29, 708, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 718, 10, 30, 12, 30, 14, 30, 721, 11, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 727, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 6, 31, 734, 10, 31, 13, 31, 14, 31, 735, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 5, 32, 745, 10, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 5, 35, 755, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 760, 10, 36, 12, 36, 14, 36, 763, 11, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 771, 10, 37, 3, 38, 3, 38, 5, 38, 775, 10, 38, 3, 39, 3, 39, 5, 39, 779, 10, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 7, 42, 788, 10, 42, 12, 42, 14, 42, 791, 11, 42, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 797, 10, 43, 3, 44, 3, 44, 3, 44, 2, 2, 4, 38, 46, 45, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 68, 2, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 86, 2, 2, 10, 3, 2, 53, 55, 3, 2, 51, 52, 3, 2, 56, 61, 4, 2, 45, 49, 65, 66, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 51, 61, 3, 2, 42, 44, 3, 2, 67, 68, 2, 898, 2, 89, 3, 2, 2, 2, 4, 98, 3, 2, 2, 2, 6, 115, 3, 2, 2, 2, 8, 140, 3, 2, 2, 2, 10, 190, 3, 2, 2, 2, 12, 204, 3, 2, 2, 2, 14, 206, 3, 2, 2, 2, 16, 220, 3, 2, 2, 2, 18, 230, 3, 2, 2, 2, 20, 237, 3, 2, 2, 2, 22, 257, 3, 2, 2, 2, 24, 277, 3, 2, 2, 2, 26, 290, 3, 2, 2, 2, 28, 338, 3, 2, 2, 2, 30, 340, 3, 2, 2, 2, 32, 342, 3, 2, 2, 2, 34, 344, 3, 2, 2, 2, 36, 346, 3, 2, 2, 2, 38, 418, 3, 2, 2, 2, 40, 431, 3, 2, 2, 2, 42, 454, 3, 2, 2, 2, 44, 456, 3, 2, 2, 2, 46, 608, 3, 2, 2, 2, 48, 662, 3, 2, 2, 2, 50, 680, 3, 2, 2, 2, 52, 685, 3, 2, 2, 2, 54, 703, 3, 2, 2, 2, 56, 707, 3, 2, 2, 2, 58, 726, 3, 2, 2, 2, 60, 728, 3, 2, 2, 2, 62, 744, 3, 2, 2, 2, 64, 746, 3, 2, 2, 2, 66, 748, 3, 2, 2, 2, 68, 754, 3, 2, 2, 2, 70, 756, 3, 2, 2, 2, 72, 770, 3, 2, 2, 2, 74, 774, 3, 2, 2, 2, 76, 778, 3, 2, 2, 2, 78, 780, 3, 2, 2, 2, 80, 782, 3, 2, 2, 2, 82, 784, 3, 2, 2, 2, 84, 796, 3, 2, 2, 2, 86, 798, 3, 2, 2, 2, 88, 90, 5, 4, 3, 2, 89, 88, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 89, 3, 2, 2, 2, 91, 92, 3, 2, 2, 2, 92, 93, 3, 2, 2, 2, 93, 94, 7, 2, 2, 3, 94, 3, 3, 2, 2, 2, 95, 97, 7, 69, 2, 2, 96, 95, 3, 2, 2, 2, 97, 100, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 98, 99, 3, 2, 2, 2, 99, 101, 3, 2, 2, 2, 100, 98, 3, 2, 2, 2, 101, 102, 7, 3, 2, 2, 102, 103, 5, 82, 42, 2, 103, 107, 7, 4, 2, 2, 104, 106, 5, 6, 4, 2, 105, 104, 3, 2, 2, 2, 106, 109, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 107, 108, 3, 2, 2, 2, 108, 110, 3, 2, 2, 2, 109, 107, 3, 2, 2, 2, 110, 111, 7, 5, 2, 2, 111, 5, 3, 2, 2, 2, 112, 114, 7, 69, 2, 2, 113, 112, 3, 2, 2, 2, 114, 117, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 115, 116, 3, 2, 2, 2, 116, 118, 3, 2, 2, 2, 117, 115, 3, 2, 2, 2, 118, 119, 5, 8, 5, 2, 119, 7, 3, 2, 2, 2, 120, 121, 7, 6, 2, 2, 121, 122, 5, 82, 42, 2, 122, 123, 7, 7, 2, 2, 123, 124, 5, 38, 20, 2, 124, 141, 3, 2, 2, 2, 125, 126, 7, 8, 2, 2, 126, 127, 5, 82, 42, 2, 127, 128, 7, 7, 2, 2, 128, 129, 5, 38, 20, 2, 129, 141, 3, 2, 2, 2, 130, 131, 7, 9, 2, 2, 131, 132, 5, 62, 32, 2, 132, 133, 7, 62, 2, 2, 133, 134, 5, 46, 24, 2, 134, 141, 3, 2, 2, 2, 135, 141, 5, 28, 15, 2, 136, 141, 5, 10, 6, 2, 137, 141, 5, 12, 7, 2, 138, 141, 5, 24, 13, 2, 139, 141, 5, 26, 14, 2, 140, 120, 3, 2, 2, 2, 140, 125, 3, 2, 2, 2, 140, 130, 3, 2, 2, 2, 140, 135, 3, 2, 2, 2, 140, 136, 3, 2, 2, 2, 140, 137, 3, 2, 2, 2, 140, 138, 3, 2, 2, 2, 140, 139, 3, 2, 2, 2, 141, 9, 3, 2, 2, 2, 142, 143, 5, 22, 12, 2, 143, 144, 5, 74, 38, 2, 144, 145, 7, 63, 2, 2, 145, 150, 5, 66, 34, 2, 146, 147, 7, 10, 2, 2, 147, 149, 5, 66, 34, 2, 148, 146, 3, 2, 2, 2, 149, 152, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 150, 151, 3, 2, 2, 2, 151, 153, 3, 2, 2, 2, 152, 150, 3, 2, 2, 2, 153, 154, 7, 64, 2, 2, 154, 155, 7, 7, 2, 2, 155, 158, 5, 38, 20, 2, 156, 157, 7, 62, 2, 2, 157, 159, 5, 46, 24, 2, 158, 156, 3, 2, 2, 2, 158, 159, 3, 2, 2, 2, 159, 161, 3, 2, 2, 2, 160, 162, 7, 11, 2, 2, 161, 160, 3, 2, 2, 2, 161, 162, 3, 2, 2, 2, 162, 191, 3, 2, 2, 2, 163, 164, 5, 22, 12, 2, 164, 177, 5, 74, 38, 2, 165, 174, 7, 63, 2, 2, 166, 171, 5, 64, 33, 2, 167, 168, 7, 10, 2, 2, 168, 170, 5, 64, 33, 2, 169, 167, 3, 2, 2, 2, 170, 173, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 171, 172, 3, 2, 2, 2, 172, 175, 3, 2, 2, 2, 173, 171, 3, 2, 2, 2, 174, 166, 3, 2, 2, 2, 174, 175, 3, 2, 2, 2, 175, 176, 3, 2, 2, 2, 176, 178, 7, 64, 2, 2, 177, 165, 3, 2, 2, 2, 177, 178, 3, 2, 2, 2, 178, 181, 3, 2, 2, 2, 179, 180, 7, 7, 2, 2, 180, 182, 5, 38, 20, 2, 181, 179, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 185, 3, 2, 2, 2, 183, 184, 7, 62, 2, 2, 184, 186, 5, 46, 24, 2, 185, 183, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 188, 3, 2, 2, 2, 187, 189, 7, 11, 2, 2, 188, 187, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 191, 3, 2, 2, 2, 190, 142, 3, 2, 2, 2, 190, 163, 3, 2, 2, 2, 191, 11, 3, 2, 2, 2, 192, 193, 7, 12, 2, 2, 193, 205, 5, 82, 42, 2, 194, 195, 7, 12, 2, 2, 195, 196, 5, 14, 8, 2, 196, 197, 7, 62, 2, 2, 197, 198, 5, 38, 20, 2, 198, 205, 3, 2, 2, 2, 199, 200, 7, 12, 2, 2, 200, 201, 5, 14, 8, 2, 201, 202, 7, 62, 2, 2, 202, 203, 5, 16, 9, 2, 203, 205, 3, 2, 2, 2, 204, 192, 3, 2, 2, 2, 204, 194, 3, 2, 2, 2, 204, 199, 3, 2, 2, 2, 205, 13, 3, 2, 2, 2, 206, 217, 5, 82, 42, 2, 207, 208, 7, 13, 2, 2, 208, 213, 7, 67, 2, 2, 209, 210, 7, 10, 2, 2, 210, 212, 7, 67, 2, 2, 211, 209, 3, 2, 2, 2, 212, 215, 3, 2, 2, 2, 213, 211, 3, 2, 2, 2, 213, 214, 3, 2, 2, 2, 214, 216, 3, 2, 2, 2, 215, 213, 3, 2, 2, 2, 216, 218, 7, 14, 2, 2, 217, 207, 3, 2, 2, 2, 217, 218, 3, 2, 2, 2, 218, 15, 3, 2, 2, 2, 219, 221, 7, 15, 2, 2, 220, 219, 3, 2, 2, 2, 220, 221, 3, 2, 2, 2, 221, 222, 3, 2, 2, 2, 222, 227, 5, 18, 10, 2, 223, 224, 7, 15, 2, 2, 224, 226, 5, 18, 10, 2, 225, 223, 3, 2, 2, 2, 226, 229, 3, 2, 2, 2, 227, 225, 3, 2, 2, 2, 227, 228, 3, 2, 2, 2, 228, 17, 3, 2, 2, 2, 229, 227, 3, 2, 2, 2, 230, 235, 5, 84, 43, 2, 231, 232, 7, 63, 2, 2, 232, 233, 5, 38, 20, 2, 233, 234, 7, 64, 2, 2, 234, 236, 3, 2, 2, 2, 235, 231, 3, 2, 2, 2, 235, 236, 3, 2, 2, 2, 236, 19, 3, 2, 2, 2, 237, 238, 7, 16, 2, 2, 238, 241, 5, 82, 42, 2, 239, 240, 7, 7, 2, 2, 240, 242, 5, 38, 20, 2, 241, 239, 3, 2, 2, 2, 241, 242, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 244, 7, 62, 2, 2, 244, 246, 5, 46, 24, 2, 245, 247, 7, 11, 2, 2, 246, 245, 3, 2, 2, 2, 246, 247, 3, 2, 2, 2, 247, 21, 3, 2, 2, 2, 248, 258, 7, 17, 2, 2, 249, 258, 7, 18, 2, 2, 250, 251, 7, 19, 2, 2, 251, 258, 7, 17, 2, 2, 252, 253, 7, 19, 2, 2, 253, 258, 7, 18, 2, 2, 254, 258, 7, 20, 2, 2, 255, 258, 7, 21, 2, 2, 256, 258, 7, 22, 2, 2, 257, 248, 3, 2, 2, 2, 257, 249, 3, 2, 2, 2, 257, 250, 3, 2, 2, 2, 257, 252, 3, 2, 2, 2, 257, 254, 3, 2, 2, 2, 257, 255, 3, 2, 2, 2, 257, 256, 3, 2, 2, 2, 258, 23, 3, 2, 2, 2, 259, 260, 7, 23, 2, 2, 260, 261, 5, 32, 17, 2, 261, 262, 7, 24, 2, 2, 262, 265, 5, 68, 35, 2, 263, 264, 7, 25, 2, 2, 264, 266, 5, 36, 19, 2, 265, 263, 3, 2, 2, 2, 265, 266, 3, 2, 2, 2, 266, 278, 3, 2, 2, 2, 267, 268, 7, 23, 2, 2, 268, 271, 5, 32, 17, 2, 269, 270, 7, 26, 2, 2, 270, 272, 5, 32, 17, 2, 271, 269, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 275, 3, 2, 2, 2, 273, 274, 7, 25, 2, 2, 274, 276, 5, 36, 19, 2, 275, 273, 3, 2, 2, 2, 275, 276, 3, 2, 2, 2, 276, 278, 3, 2, 2, 2, 277, 259, 3, 2, 2, 2, 277, 267, 3, 2, 2, 2, 278, 25, 3, 2, 2, 2, 279, 280, 7, 27, 2, 2, 280, 281, 5, 32, 17, 2, 281, 282, 7, 24, 2, 2, 282, 283, 5, 68, 35, 2, 283, 291, 3, 2, 2, 2, 284, 285, 7, 27, 2, 2, 285, 288, 5, 32, 17, 2, 286, 287, 7, 26, 2, 2, 287, 289, 5, 32, 17, 2, 288, 286, 3, 2, 2, 2, 288, 289, 3, 2, 2, 2, 289, 291, 3, 2, 2, 2, 290, 279, 3, 2, 2, 2, 290, 284, 3, 2, 2, 2, 291, 27, 3, 2, 2, 2, 292, 293, 7, 23, 2, 2, 293, 294, 5, 30, 16, 2, 294, 295, 7, 63, 2, 2, 295, 296, 5, 32, 17, 2, 296, 297, 7, 62, 2, 2, 297, 305, 5, 46, 24, 2, 298, 299, 7, 10, 2, 2, 299, 300, 5, 32, 17, 2, 300, 301, 7, 62, 2, 2, 301, 302, 5, 46, 24, 2, 302, 304, 3, 2, 2, 2, 303, 298, 3, 2, 2, 2, 304, 307, 3, 2, 2, 2, 305, 303, 3, 2, 2, 2, 305, 306, 3, 2, 2, 2, 306, 308, 3, 2, 2, 2, 307, 305, 3, 2, 2, 2, 308, 309, 7, 64, 2, 2, 309, 310, 7, 24, 2, 2, 310, 313, 7, 53, 2, 2, 311, 312, 7, 25, 2, 2, 312, 314, 5, 36, 19, 2, 313, 311, 3, 2, 2, 2, 313, 314, 3, 2, 2, 2, 314, 339, 3, 2, 2, 2, 315, 316, 7, 23, 2, 2, 316, 317, 5, 30, 16, 2, 317, 318, 7, 63, 2, 2, 318, 319, 5, 32, 17, 2, 319, 320, 7, 62, 2, 2, 320, 328, 5, 46, 24, 2, 321, 322, 7, 10, 2, 2, 322, 323, 5, 32, 17, 2, 323, 324, 7, 62, 2, 2, 324, 325, 5, 46, 24, 2, 325, 327, 3, 2, 2, 2, 326, 321, 3, 2, 2, 2, 327, 330, 3, 2, 2, 2, 328, 326, 3, 2, 2, 2, 328, 329, 3, 2, 2, 2, 329, 331, 3, 2, 2, 2, 330, 328, 3, 2, 2, 2, 331, 332, 7, 64, 2, 2, 332, 333, 7, 26, 2, 2, 333, 336, 5, 34, 18, 2, 334, 335, 7, 25, 2, 2, 335, 337, 5, 36, 19, 2, 336, 334, 3, 2, 2, 2, 336, 337, 3, 2, 2, 2, 337, 339, 3, 2, 2, 2, 338, 292, 3, 2, 2, 2, 338, 315, 3, 2, 2, 2, 339, 29, 3, 2, 2, 2, 340, 341, 5, 82, 42, 2, 341, 31, 3, 2, 2, 2, 342, 343, 5, 82, 42, 2, 343, 33, 3, 2, 2, 2, 344, 345, 5, 82, 42, 2, 345, 35, 3, 2, 2, 2, 346, 347, 7, 42, 2, 2, 347, 37, 3, 2, 2, 2, 348, 349, 8, 20, 1, 2, 349, 358, 7, 63, 2, 2, 350, 355, 5, 38, 20, 2, 351, 352, 7, 10, 2, 2, 352, 354, 5, 38, 20, 2, 353, 351, 3, 2, 2, 2, 354, 357, 3, 2, 2, 2, 355, 353, 3, 2, 2, 2, 355, 356, 3, 2, 2, 2, 356, 359, 3, 2, 2, 2, 357, 355, 3, 2, 2, 2, 358, 350, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 361, 3, 2, 2, 2, 360, 362, 7, 10, 2, 2, 361, 360, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 364, 7, 64, 2, 2, 364, 365, 7, 29, 2, 2, 365, 419, 5, 38, 20, 14, 366, 367, 7, 65, 2, 2, 367, 368, 7, 13, 2, 2, 368, 369, 5, 38, 20, 2, 369, 370, 7, 14, 2, 2, 370, 419, 3, 2, 2, 2, 371, 372, 7, 66, 2, 2, 372, 373, 7, 13, 2, 2, 373, 374, 5, 38, 20, 2, 374, 375, 7, 14, 2, 2, 375, 419, 3, 2, 2, 2, 376, 377, 7, 63, 2, 2, 377, 378, 5, 38, 20, 2, 378, 379, 7, 10, 2, 2, 379, 384, 5, 38, 20, 2, 380, 381, 7, 10, 2, 2, 381, 383, 5, 38, 20, 2, 382, 380, 3, 2, 2, 2, 383, 386, 3, 2, 2, 2, 384, 382, 3, 2, 2, 2, 384, 385, 3, 2, 2, 2, 385, 388, 3, 2, 2, 2, 386, 384, 3, 2, 2, 2, 387, 389, 7, 10, 2, 2, 388, 387, 3, 2, 2, 2, 388, 389, 3, 2, 2, 2, 389, 390, 3, 2, 2, 2, 390, 391, 7, 64, 2, 2, 391, 419, 3, 2, 2, 2, 392, 394, 7, 4, 2, 2, 393, 395, 5, 42, 22, 2, 394, 393, 3, 2, 2, 2, 394, 395, 3, 2, 2, 2, 395, 396, 3, 2, 2, 2, 396, 419, 7, 5, 2, 2, 397, 419, 7, 30, 2, 2, 398, 419, 7, 31, 2, 2, 399, 419, 7, 32, 2, 2, 400, 419, 5, 40, 21, 2, 401, 419, 5, 82, 42, 2, 402, 403, 7, 63, 2, 2, 403, 404, 5, 38, 20, 2, 404, 405, 7, 64, 2, 2, 405, 419, 3, 2, 2, 2, 406, 407, 5, 82, 42, 2, 407, 408, 7, 13, 2, 2, 408, 413, 5, 38, 20, 2, 409, 410, 7, 10, 2, 2, 410, 412, 5, 38, 20, 2, 411, 409, 3, 2, 2, 2, 412, 415, 3, 2, 2, 2, 413, 411, 3, 2, 2, 2, 413, 414, 3, 2, 2, 2, 414, 416, 3, 2, 2, 2, 415, 413, 3, 2, 2, 2, 416, 417, 7, 14, 2, 2, 417, 419, 3, 2, 2, 2, 418, 348, 3, 2, 2, 2, 418, 366, 3, 2, 2, 2, 418, 371, 3, 2, 2, 2, 418, 376, 3, 2, 2, 2, 418, 392, 3, 2, 2, 2, 418, 397, 3, 2, 2, 2, 418, 398, 3, 2, 2, 2, 418, 399, 3, 2, 2, 2, 418, 400, 3, 2, 2, 2, 418, 401, 3, 2, 2, 2, 418, 402, 3, 2, 2, 2, 418, 406, 3, 2, 2, 2, 419, 428, 3, 2, 2, 2, 420, 421, 12, 16, 2, 2, 421, 422, 7, 28, 2, 2, 422, 427, 5, 38, 20, 16, 423, 424, 12, 15, 2, 2, 424, 425, 7, 29, 2, 2, 425, 427, 5, 38, 20, 15, 426, 420, 3, 2, 2, 2, 426, 423, 3, 2, 2, 2, 427, 430, 3, 2, 2, 2, 428, 426, 3, 2, 2, 2, 428, 429, 3, 2, 2, 2, 429, 39, 3, 2, 2, 2, 430, 428, 3, 2, 2, 2, 431, 432, 7, 67, 2, 2, 432, 41, 3, 2, 2, 2, 433, 434, 5, 44, 23, 2, 434, 435, 7, 7, 2, 2, 435, 436, 5, 38, 20, 2, 436, 444, 3, 2, 2, 2, 437, 438, 7, 10, 2, 2, 438, 439, 5, 44, 23, 2, 439, 440, 7, 7, 2, 2, 440, 441, 5, 38, 20, 2, 441, 443, 3, 2, 2, 2, 442, 437, 3, 2, 2, 2, 443, 446, 3, 2, 2, 2, 444, 442, 3, 2, 2, 2, 444, 445, 3, 2, 2, 2, 445, 450, 3, 2, 2, 2, 446, 444, 3, 2, 2, 2, 447, 451, 7, 10, 2, 2, 448, 449, 7, 15, 2, 2, 449, 451, 5, 86, 44, 2, 450, 447, 3, 2, 2, 2, 450, 448, 3, 2, 2, 2, 450, 451, 3, 2, 2, 2, 451, 455, 3, 2, 2, 2, 452, 453, 7, 15, 2, 2, 453, 455, 5, 86, 44, 2, 454, 433, 3, 2, 2, 2, 454, 452, 3, 2, 2, 2, 455, 43, 3, 2, 2, 2, 456, 457, 5, 84, 43, 2, 457, 45, 3, 2, 2, 2, 458, 459, 8, 24, 1, 2, 459, 609, 5, 56, 29, 2, 460, 461, 5, 74, 38, 2, 461, 463, 7, 63, 2, 2, 462, 464, 5, 70, 36, 2, 463, 462, 3, 2, 2, 2, 463, 464, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, 466, 7, 64, 2, 2, 466, 609, 3, 2, 2, 2, 467, 468, 7, 52, 2, 2, 468, 609, 5, 46, 24, 27, 469, 470, 5, 82, 42, 2, 470, 471, 7, 34, 2, 2, 471, 472, 7, 62, 2, 2, 472, 473, 5, 46, 24, 23, 473, 609, 3, 2, 2, 2, 474, 475, 7, 45, 2, 2, 475, 476, 7, 4, 2, 2, 476, 481, 5, 46, 24, 2, 477, 478, 7, 10, 2, 2, 478, 480, 5, 46, 24, 2, 479, 477, 3, 2, 2, 2, 480, 483, 3, 2, 2, 2, 481, 479, 3, 2, 2, 2, 481, 482, 3, 2, 2, 2, 482, 485, 3, 2, 2, 2, 483, 481, 3, 2, 2, 2, 484, 486, 7, 10, 2, 2, 485, 484, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 7, 5, 2, 2, 488, 609, 3, 2, 2, 2, 489, 490, 7, 46, 2, 2, 490, 491, 7, 4, 2, 2, 491, 496, 5, 46, 24, 2, 492, 493, 7, 10, 2, 2, 493, 495, 5, 46, 24, 2, 494, 492, 3, 2, 2, 2, 495, 498, 3, 2, 2, 2, 496, 494, 3, 2, 2, 2, 496, 497, 3, 2, 2, 2, 497, 500, 3, 2, 2, 2, 498, 496, 3, 2, 2, 2, 499, 501, 7, 10, 2, 2, 500, 499, 3, 2, 2, 2, 500, 501, 3, 2, 2, 2, 501, 502, 3, 2, 2, 2, 502, 503, 7, 5, 2, 2, 503, 609, 3, 2, 2, 2, 504, 609, 5, 48, 25, 2, 505, 506, 7, 35, 2, 2, 506, 507, 7, 4, 2, 2, 507, 512, 5, 46, 24, 2, 508, 509, 7, 10, 2, 2, 509, 511, 5, 46, 24, 2, 510, 508, 3, 2, 2, 2, 511, 514, 3, 2, 2, 2, 512, 510, 3, 2, 2, 2, 512, 513, 3, 2, 2, 2, 513, 516, 3, 2, 2, 2, 514, 512, 3, 2, 2, 2, 515, 517, 7, 10, 2, 2, 516, 515, 3, 2, 2, 2, 516, 517, 3, 2, 2, 2, 517, 518, 3, 2, 2, 2, 518, 519, 7, 5, 2, 2, 519, 609, 3, 2, 2, 2, 520, 521, 7, 36, 2, 2, 521, 522, 7, 4, 2, 2, 522, 527, 5, 46, 24, 2, 523, 524, 7, 10, 2, 2, 524, 526, 5, 46, 24, 2, 525, 523, 3, 2, 2, 2, 526, 529, 3, 2, 2, 2, 527, 525, 3, 2, 2, 2, 527, 528, 3, 2, 2, 2, 528, 531, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 530, 532, 7, 10, 2, 2, 531, 530, 3, 2, 2, 2, 531, 532, 3, 2, 2, 2, 532, 533, 3, 2, 2, 2, 533, 534, 7, 5, 2, 2, 534, 609, 3, 2, 2, 2, 535, 540, 5, 82, 42, 2, 536, 540, 7, 44, 2, 2, 537, 540, 7, 43, 2, 2, 538, 540, 7, 42, 2, 2, 539, 535, 3, 2, 2, 2, 539, 536, 3, 2, 2, 2, 539, 537, 3, 2, 2, 2, 539, 538, 3, 2, 2, 2, 540, 609, 3, 2, 2, 2, 541, 542, 7, 63, 2, 2, 542, 543, 5, 46, 24, 2, 543, 544, 7, 10, 2, 2, 544, 549, 5, 46, 24, 2, 545, 546, 7, 10, 2, 2, 546, 548, 5, 46, 24, 2, 547, 545, 3, 2, 2, 2, 548, 551, 3, 2, 2, 2, 549, 547, 3, 2, 2, 2, 549, 550, 3, 2, 2, 2, 550, 553, 3, 2, 2, 2, 551, 549, 3, 2, 2, 2, 552, 554, 7, 10, 2, 2, 553, 552, 3, 2, 2, 2, 553, 554, 3, 2, 2, 2, 554, 555, 3, 2, 2, 2, 555, 556, 7, 64, 2, 2, 556, 609, 3, 2, 2, 2, 557, 558, 7, 4, 2, 2, 558, 563, 5, 72, 37, 2, 559, 560, 7, 10, 2, 2, 560, 562, 5, 72, 37, 2, 561, 559, 3, 2, 2, 2, 562, 565, 3, 2, 2, 2, 563, 561, 3, 2, 2, 2, 563, 564, 3, 2, 2, 2, 564, 567, 3, 2, 2, 2, 565, 563, 3, 2, 2, 2, 566, 568, 7, 10, 2, 2, 567, 566, 3, 2, 2, 2, 567, 568, 3, 2, 2, 2, 568, 569, 3, 2, 2, 2, 569, 570, 7, 5, 2, 2, 570, 609, 3, 2, 2, 2, 571, 580, 7, 13, 2, 2, 572, 577, 5, 46, 24, 2, 573, 574, 7, 10, 2, 2, 574, 576, 5, 46, 24, 2, 575, 573, 3, 2, 2, 2, 576, 579, 3, 2, 2, 2, 577, 575, 3, 2, 2, 2, 577, 578, 3, 2, 2, 2, 578, 581, 3, 2, 2, 2, 579, 577, 3, 2, 2, 2, 580, 572, 3, 2, 2, 2, 580, 581, 3, 2, 2, 2, 581, 583, 3, 2, 2, 2, 582, 584, 7, 10, 2, 2, 583, 582, 3, 2, 2, 2, 583, 584, 3, 2, 2, 2, 584, 585, 3, 2, 2, 2, 585, 609, 7, 14, 2, 2, 586, 587, 7, 37, 2, 2, 587, 588, 7, 63, 2, 2, 588, 589, 5, 46, 24, 2, 589, 590, 7, 64, 2, 2, 590, 591, 5, 46, 24, 2, 591, 592, 7, 38, 2, 2, 592, 593, 5, 46, 24, 7, 593, 609, 3, 2, 2, 2, 594, 595, 5, 10, 6, 2, 595, 596, 5, 46, 24, 6, 596, 609, 3, 2, 2, 2, 597, 598, 5, 20, 11, 2, 598, 599, 5, 46, 24, 5, 599, 609, 3, 2, 2, 2, 600, 601, 7, 63, 2, 2, 601, 602, 5, 46, 24, 2, 602, 603, 7, 64, 2, 2, 603, 609, 3, 2, 2, 2, 604, 605, 7, 4, 2, 2, 605, 606, 5, 46, 24, 2, 606, 607, 7, 5, 2, 2, 607, 609, 3, 2, 2, 2, 608, 458, 3, 2, 2, 2, 608, 460, 3, 2, 2, 2, 608, 467, 3, 2, 2, 2, 608, 469, 3, 2, 2, 2, 608, 474, 3, 2, 2, 2, 608, 489, 3, 2, 2, 2, 608, 504, 3, 2, 2, 2, 608, 505, 3, 2, 2, 2, 608, 520, 3, 2, 2, 2, 608, 539, 3, 2, 2, 2, 608, 541, 3, 2, 2, 2, 608, 557, 3, 2, 2, 2, 608, 571, 3, 2, 2, 2, 608, 586, 3, 2, 2, 2, 608, 594, 3, 2, 2, 2, 608, 597, 3, 2, 2, 2, 608, 600, 3, 2, 2, 2, 608, 604, 3, 2, 2, 2, 609, 659, 3, 2, 2, 2, 610, 611, 12, 28, 2, 2, 611, 612, 7, 33, 2, 2, 612, 658, 5, 46, 24, 28, 613, 614, 12, 26, 2, 2, 614, 615, 9, 2, 2, 2, 615, 658, 5, 46, 24, 27, 616, 617, 12, 25, 2, 2, 617, 618, 9, 3, 2, 2, 618, 658, 5, 46, 24, 26, 619, 620, 12, 24, 2, 2, 620, 621, 9, 4, 2, 2, 621, 658, 5, 46, 24, 25, 622, 623, 12, 22, 2, 2, 623, 624, 7, 62, 2, 2, 624, 625, 5, 46, 24, 23, 625, 626, 8, 24, 1, 2, 626, 658, 3, 2, 2, 2, 627, 628, 12, 20, 2, 2, 628, 629, 7, 45, 2, 2, 629, 658, 5, 46, 24, 21, 630, 631, 12, 18, 2, 2, 631, 632, 7, 46, 2, 2, 632, 658, 5, 46, 24, 19, 633, 634, 12, 17, 2, 2, 634, 635, 7, 47, 2, 2, 635, 658, 5, 46, 24, 18, 636, 637, 12, 16, 2, 2, 637, 638, 7, 48, 2, 2, 638, 658, 5, 46, 24, 17, 639, 640, 12, 10, 2, 2, 640, 641, 7, 28, 2, 2, 641, 658, 5, 46, 24, 11, 642, 643, 12, 32, 2, 2, 643, 644, 7, 24, 2, 2, 644, 650, 5, 76, 39, 2, 645, 647, 7, 63, 2, 2, 646, 648, 5, 70, 36, 2, 647, 646, 3, 2, 2, 2, 647, 648, 3, 2, 2, 2, 648, 649, 3, 2, 2, 2, 649, 651, 7, 64, 2, 2, 650, 645, 3, 2, 2, 2, 650, 651, 3, 2, 2, 2, 651, 658, 3, 2, 2, 2, 652, 653, 12, 29, 2, 2, 653, 654, 7, 13, 2, 2, 654, 655, 5, 46, 24, 2, 655, 656, 7, 14, 2, 2, 656, 658, 3, 2, 2, 2, 657, 610, 3, 2, 2, 2, 657, 613, 3, 2, 2, 2, 657, 616, 3, 2, 2, 2, 657, 619, 3, 2, 2, 2, 657, 622, 3, 2, 2, 2, 657, 627, 3, 2, 2, 2, 657, 630, 3, 2, 2, 2, 657, 633, 3, 2, 2, 2, 657, 636, 3, 2, 2, 2, 657, 639, 3, 2, 2, 2, 657, 642, 3, 2, 2, 2, 657, 652, 3, 2, 2, 2, 658, 661, 3, 2, 2, 2, 659, 657, 3, 2, 2, 2, 659, 660, 3, 2, 2, 2, 660, 47, 3, 2, 2, 2, 661, 659, 3, 2, 2, 2, 662, 663, 7, 50, 2, 2, 663, 664, 5, 46, 24, 2, 664, 666, 7, 4, 2, 2, 665, 667, 7, 15, 2, 2, 666, 665, 3, 2, 2, 2, 666, 667, 3, 2, 2, 2, 667, 668, 3, 2, 2, 2, 668, 673, 5, 50, 26, 2, 669, 670, 7, 15, 2, 2, 670, 672, 5, 50, 26, 2, 671, 669, 3, 2, 2, 2, 672, 675, 3, 2, 2, 2, 673, 671, 3, 2, 2, 2, 673, 674, 3, 2, 2, 2, 674, 676, 3, 2, 2, 2, 675, 673, 3, 2, 2, 2, 676, 677, 7, 5, 2, 2, 677, 49, 3, 2, 2, 2, 678, 681, 5, 52, 27, 2, 679, 681, 7, 39, 2, 2, 680, 678, 3, 2, 2, 2, 680, 679, 3, 2, 2, 2, 681, 682, 3, 2, 2, 2, 682, 683, 7, 29, 2, 2, 683, 684, 5, 46, 24, 2, 684, 51, 3, 2, 2, 2, 685, 692, 5, 84, 43, 2, 686, 689, 7, 63, 2, 2, 687, 690, 5, 84, 43, 2, 688, 690, 7, 39, 2, 2, 689, 687, 3, 2, 2, 2, 689, 688, 3, 2, 2, 2, 690, 691, 3, 2, 2, 2, 691, 693, 7, 64, 2, 2, 692, 686, 3, 2, 2, 2, 692, 693, 3, 2, 2, 2, 693, 53, 3, 2, 2, 2, 694, 695, 5, 8, 5, 2, 695, 696, 7, 2, 2, 3, 696, 704, 3, 2, 2, 2, 697, 698, 5, 46, 24, 2, 698, 699, 7, 2, 2, 3, 699, 704, 3, 2, 2, 2, 700, 701, 7, 69, 2, 2, 701, 704, 7, 2, 2, 3, 702, 704, 7, 2, 2, 3, 703, 694, 3, 2, 2, 2, 703, 697, 3, 2, 2, 2, 703, 700, 3, 2, 2, 2, 703, 702, 3, 2, 2, 2, 704, 55, 3, 2, 2, 2, 705, 708, 5, 58, 30, 2, 706, 708, 5, 60, 31, 2, 707, 705, 3, 2, 2, 2, 707, 706, 3, 2, 2, 2, 708, 57, 3, 2, 2, 2, 709, 710, 5, 64, 33, 2, 710, 711, 7, 29, 2, 2, 711, 712, 5, 46, 24, 2, 712, 727, 3, 2, 2, 2, 713, 714, 7, 63, 2, 2, 714, 719, 5, 64, 33, 2, 715, 716, 7, 10, 2, 2, 716, 718, 5, 64, 33, 2, 717, 715, 3, 2, 2, 2, 718, 721, 3, 2, 2, 2, 719, 717, 3, 2, 2, 2, 719, 720, 3, 2, 2, 2, 720, 722, 3, 2, 2, 2, 721, 719, 3, 2, 2, 2, 722, 723, 7, 64, 2, 2, 723, 724, 7, 29, 2, 2, 724, 725, 5, 46, 24, 2, 725, 727, 3, 2, 2, 2, 726, 709, 3, 2, 2, 2, 726, 713, 3, 2, 2, 2, 727, 59, 3, 2, 2, 2, 728, 729, 7, 63, 2, 2, 729, 730, 7, 63, 2, 2, 730, 733, 5, 64, 33, 2, 731, 732, 7, 10, 2, 2, 732, 734, 5, 64, 33, 2, 733, 731, 3, 2, 2, 2, 734, 735, 3, 2, 2, 2, 735, 733, 3, 2, 2, 2, 735, 736, 3, 2, 2, 2, 736, 737, 3, 2, 2, 2, 737, 738, 7, 64, 2, 2, 738, 739, 7, 64, 2, 2, 739, 740, 7, 29, 2, 2, 740, 741, 5, 46, 24, 2, 741, 61, 3, 2, 2, 2, 742, 745, 7, 39, 2, 2, 743, 745, 5, 82, 42, 2, 744, 742, 3, 2, 2, 2, 744, 743, 3, 2, 2, 2, 745, 63, 3, 2, 2, 2, 746, 747, 5, 62, 32, 2, 747, 65, 3, 2, 2, 2, 748, 749, 5, 62, 32, 2, 749, 750, 7, 7, 2, 2, 750, 751, 5, 38, 20, 2, 751, 67, 3, 2, 2, 2, 752, 755, 7, 53, 2, 2, 753, 755, 5, 82, 42, 2, 754, 752, 3, 2, 2, 2, 754, 753, 3, 2, 2, 2, 755, 69, 3, 2, 2, 2, 756, 761, 5, 46, 24, 2, 757, 758, 7, 10, 2, 2, 758, 760, 5, 46, 24, 2, 759, 757, 3, 2, 2, 2, 760, 763, 3, 2, 2, 2, 761, 759, 3, 2, 2, 2, 761, 762, 3, 2, 2, 2, 762, 71, 3, 2, 2, 2, 763, 761, 3, 2, 2, 2, 764, 765, 5, 84, 43, 2, 765, 766, 7, 7, 2, 2, 766, 767, 5, 46, 24, 2, 767, 771, 3, 2, 2, 2, 768, 769, 7, 40, 2, 2, 769, 771, 5, 46, 24, 2, 770, 764, 3, 2, 2, 2, 770, 768, 3, 2, 2, 2, 771, 73, 3, 2, 2, 2, 772, 775, 5, 82, 42, 2, 773, 775, 9, 5, 2, 2, 774, 772, 3, 2, 2, 2, 774, 773, 3, 2, 2, 2, 775, 75, 3, 2, 2, 2, 776, 779, 5, 82, 42, 2, 777, 779, 9, 6, 2, 2, 778, 776, 3, 2, 2, 2, 778, 777, 3, 2, 2, 2, 779, 77, 3, 2, 2, 2, 780, 781, 9, 7, 2, 2, 781, 79, 3, 2, 2, 2, 782, 783, 9, 8, 2, 2, 783, 81, 3, 2, 2, 2, 784, 789, 5, 86, 44, 2, 785, 786, 7, 41, 2, 2, 786, 788, 5, 86, 44, 2, 787, 785, 3, 2, 2, 2, 788, 791, 3, 2, 2, 2, 789, 787, 3, 2, 2, 2, 789, 790, 3, 2, 2, 2, 790, 83, 3, 2, 2, 2, 791, 789, 3, 2, 2, 2, 792, 797, 5, 86, 44, 2, 793, 794, 5, 82, 42, 2, 794, 795, 8, 43, 1, 2, 795, 797, 3, 2, 2, 2, 796, 792, 3, 2, 2, 2, 796, 793, 3, 2, 2, 2, 797, 85, 3, 2, 2, 2, 798, 799, 9, 9, 2, 2, 799, 87, 3, 2, 2, 2, 90, 91, 98, 107, 115, 140, 150, 158, 161, 171, 174, 177, 181, 185, 188, 190, 204, 213, 217, 220, 227, 235, 241, 246, 257, 265, 271, 275, 277, 288, 290, 305, 313, 328, 336, 338, 355, 358, 361, 384, 388, 394, 413, 418, 426, 428, 444, 450, 454, 463, 481, 485, 496, 500, 512, 516, 527, 531, 539, 549, 553, 563, 567, 577, 580, 583, 608, 647, 650, 657, 659, 666, 673, 680, 689, 692, 703, 707, 719, 726, 735, 744, 754, 761, 770, 774, 778, 789, 796] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 803, 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, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 3, 2, 6, 2, 90, 10, 2, 13, 2, 14, 2, 91, 3, 2, 3, 2, 3, 3, 7, 3, 97, 10, 3, 12, 3, 14, 3, 100, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 106, 10, 3, 12, 3, 14, 3, 109, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 114, 10, 4, 12, 4, 14, 4, 117, 11, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 141, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 149, 10, 6, 12, 6, 14, 6, 152, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 159, 10, 6, 3, 6, 5, 6, 162, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 170, 10, 6, 12, 6, 14, 6, 173, 11, 6, 5, 6, 175, 10, 6, 3, 6, 5, 6, 178, 10, 6, 3, 6, 3, 6, 5, 6, 182, 10, 6, 3, 6, 3, 6, 5, 6, 186, 10, 6, 3, 6, 5, 6, 189, 10, 6, 5, 6, 191, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 205, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 212, 10, 8, 12, 8, 14, 8, 215, 11, 8, 3, 8, 5, 8, 218, 10, 8, 3, 9, 5, 9, 221, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 226, 10, 9, 12, 9, 14, 9, 229, 11, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 236, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 242, 10, 11, 3, 11, 3, 11, 3, 11, 5, 11, 247, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 258, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 266, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 272, 10, 13, 3, 13, 3, 13, 5, 13, 276, 10, 13, 5, 13, 278, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 289, 10, 14, 5, 14, 291, 10, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 304, 10, 15, 12, 15, 14, 15, 307, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 314, 10, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 327, 10, 15, 12, 15, 14, 15, 330, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 337, 10, 15, 5, 15, 339, 10, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 354, 10, 20, 12, 20, 14, 20, 357, 11, 20, 5, 20, 359, 10, 20, 3, 20, 5, 20, 362, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 383, 10, 20, 12, 20, 14, 20, 386, 11, 20, 3, 20, 5, 20, 389, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 395, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 412, 10, 20, 12, 20, 14, 20, 415, 11, 20, 3, 20, 3, 20, 5, 20, 419, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 427, 10, 20, 12, 20, 14, 20, 430, 11, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 443, 10, 22, 12, 22, 14, 22, 446, 11, 22, 3, 22, 3, 22, 3, 22, 5, 22, 451, 10, 22, 3, 22, 3, 22, 5, 22, 455, 10, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 464, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 480, 10, 24, 12, 24, 14, 24, 483, 11, 24, 3, 24, 5, 24, 486, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 495, 10, 24, 12, 24, 14, 24, 498, 11, 24, 3, 24, 5, 24, 501, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 511, 10, 24, 12, 24, 14, 24, 514, 11, 24, 3, 24, 5, 24, 517, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 526, 10, 24, 12, 24, 14, 24, 529, 11, 24, 3, 24, 5, 24, 532, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 540, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 548, 10, 24, 12, 24, 14, 24, 551, 11, 24, 3, 24, 5, 24, 554, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 564, 10, 24, 12, 24, 14, 24, 567, 11, 24, 3, 24, 5, 24, 570, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 578, 10, 24, 12, 24, 14, 24, 581, 11, 24, 5, 24, 583, 10, 24, 3, 24, 5, 24, 586, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 611, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 650, 10, 24, 3, 24, 5, 24, 653, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 660, 10, 24, 12, 24, 14, 24, 663, 11, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 669, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 674, 10, 25, 12, 25, 14, 25, 677, 11, 25, 3, 25, 3, 25, 3, 26, 3, 26, 5, 26, 683, 10, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 692, 10, 27, 3, 27, 5, 27, 695, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 706, 10, 28, 3, 29, 3, 29, 5, 29, 710, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 720, 10, 30, 12, 30, 14, 30, 723, 11, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 729, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 6, 31, 736, 10, 31, 13, 31, 14, 31, 737, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 5, 32, 747, 10, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 5, 35, 757, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 762, 10, 36, 12, 36, 14, 36, 765, 11, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 773, 10, 37, 3, 38, 3, 38, 5, 38, 777, 10, 38, 3, 39, 3, 39, 5, 39, 781, 10, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 7, 42, 790, 10, 42, 12, 42, 14, 42, 793, 11, 42, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 799, 10, 43, 3, 44, 3, 44, 3, 44, 2, 2, 4, 38, 46, 45, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 68, 2, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 86, 2, 2, 10, 3, 2, 53, 55, 3, 2, 51, 52, 3, 2, 56, 61, 4, 2, 45, 49, 65, 66, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 51, 61, 3, 2, 42, 44, 3, 2, 67, 68, 2, 901, 2, 89, 3, 2, 2, 2, 4, 98, 3, 2, 2, 2, 6, 115, 3, 2, 2, 2, 8, 140, 3, 2, 2, 2, 10, 190, 3, 2, 2, 2, 12, 204, 3, 2, 2, 2, 14, 206, 3, 2, 2, 2, 16, 220, 3, 2, 2, 2, 18, 230, 3, 2, 2, 2, 20, 237, 3, 2, 2, 2, 22, 257, 3, 2, 2, 2, 24, 277, 3, 2, 2, 2, 26, 290, 3, 2, 2, 2, 28, 338, 3, 2, 2, 2, 30, 340, 3, 2, 2, 2, 32, 342, 3, 2, 2, 2, 34, 344, 3, 2, 2, 2, 36, 346, 3, 2, 2, 2, 38, 418, 3, 2, 2, 2, 40, 431, 3, 2, 2, 2, 42, 454, 3, 2, 2, 2, 44, 456, 3, 2, 2, 2, 46, 610, 3, 2, 2, 2, 48, 664, 3, 2, 2, 2, 50, 682, 3, 2, 2, 2, 52, 687, 3, 2, 2, 2, 54, 705, 3, 2, 2, 2, 56, 709, 3, 2, 2, 2, 58, 728, 3, 2, 2, 2, 60, 730, 3, 2, 2, 2, 62, 746, 3, 2, 2, 2, 64, 748, 3, 2, 2, 2, 66, 750, 3, 2, 2, 2, 68, 756, 3, 2, 2, 2, 70, 758, 3, 2, 2, 2, 72, 772, 3, 2, 2, 2, 74, 776, 3, 2, 2, 2, 76, 780, 3, 2, 2, 2, 78, 782, 3, 2, 2, 2, 80, 784, 3, 2, 2, 2, 82, 786, 3, 2, 2, 2, 84, 798, 3, 2, 2, 2, 86, 800, 3, 2, 2, 2, 88, 90, 5, 4, 3, 2, 89, 88, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 89, 3, 2, 2, 2, 91, 92, 3, 2, 2, 2, 92, 93, 3, 2, 2, 2, 93, 94, 7, 2, 2, 3, 94, 3, 3, 2, 2, 2, 95, 97, 7, 69, 2, 2, 96, 95, 3, 2, 2, 2, 97, 100, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 98, 99, 3, 2, 2, 2, 99, 101, 3, 2, 2, 2, 100, 98, 3, 2, 2, 2, 101, 102, 7, 3, 2, 2, 102, 103, 5, 82, 42, 2, 103, 107, 7, 4, 2, 2, 104, 106, 5, 6, 4, 2, 105, 104, 3, 2, 2, 2, 106, 109, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 107, 108, 3, 2, 2, 2, 108, 110, 3, 2, 2, 2, 109, 107, 3, 2, 2, 2, 110, 111, 7, 5, 2, 2, 111, 5, 3, 2, 2, 2, 112, 114, 7, 69, 2, 2, 113, 112, 3, 2, 2, 2, 114, 117, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 115, 116, 3, 2, 2, 2, 116, 118, 3, 2, 2, 2, 117, 115, 3, 2, 2, 2, 118, 119, 5, 8, 5, 2, 119, 7, 3, 2, 2, 2, 120, 121, 7, 6, 2, 2, 121, 122, 5, 82, 42, 2, 122, 123, 7, 7, 2, 2, 123, 124, 5, 38, 20, 2, 124, 141, 3, 2, 2, 2, 125, 126, 7, 8, 2, 2, 126, 127, 5, 82, 42, 2, 127, 128, 7, 7, 2, 2, 128, 129, 5, 38, 20, 2, 129, 141, 3, 2, 2, 2, 130, 131, 7, 9, 2, 2, 131, 132, 5, 62, 32, 2, 132, 133, 7, 62, 2, 2, 133, 134, 5, 46, 24, 2, 134, 141, 3, 2, 2, 2, 135, 141, 5, 28, 15, 2, 136, 141, 5, 10, 6, 2, 137, 141, 5, 12, 7, 2, 138, 141, 5, 24, 13, 2, 139, 141, 5, 26, 14, 2, 140, 120, 3, 2, 2, 2, 140, 125, 3, 2, 2, 2, 140, 130, 3, 2, 2, 2, 140, 135, 3, 2, 2, 2, 140, 136, 3, 2, 2, 2, 140, 137, 3, 2, 2, 2, 140, 138, 3, 2, 2, 2, 140, 139, 3, 2, 2, 2, 141, 9, 3, 2, 2, 2, 142, 143, 5, 22, 12, 2, 143, 144, 5, 74, 38, 2, 144, 145, 7, 63, 2, 2, 145, 150, 5, 66, 34, 2, 146, 147, 7, 10, 2, 2, 147, 149, 5, 66, 34, 2, 148, 146, 3, 2, 2, 2, 149, 152, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 150, 151, 3, 2, 2, 2, 151, 153, 3, 2, 2, 2, 152, 150, 3, 2, 2, 2, 153, 154, 7, 64, 2, 2, 154, 155, 7, 7, 2, 2, 155, 158, 5, 38, 20, 2, 156, 157, 7, 62, 2, 2, 157, 159, 5, 46, 24, 2, 158, 156, 3, 2, 2, 2, 158, 159, 3, 2, 2, 2, 159, 161, 3, 2, 2, 2, 160, 162, 7, 11, 2, 2, 161, 160, 3, 2, 2, 2, 161, 162, 3, 2, 2, 2, 162, 191, 3, 2, 2, 2, 163, 164, 5, 22, 12, 2, 164, 177, 5, 74, 38, 2, 165, 174, 7, 63, 2, 2, 166, 171, 5, 64, 33, 2, 167, 168, 7, 10, 2, 2, 168, 170, 5, 64, 33, 2, 169, 167, 3, 2, 2, 2, 170, 173, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 171, 172, 3, 2, 2, 2, 172, 175, 3, 2, 2, 2, 173, 171, 3, 2, 2, 2, 174, 166, 3, 2, 2, 2, 174, 175, 3, 2, 2, 2, 175, 176, 3, 2, 2, 2, 176, 178, 7, 64, 2, 2, 177, 165, 3, 2, 2, 2, 177, 178, 3, 2, 2, 2, 178, 181, 3, 2, 2, 2, 179, 180, 7, 7, 2, 2, 180, 182, 5, 38, 20, 2, 181, 179, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 185, 3, 2, 2, 2, 183, 184, 7, 62, 2, 2, 184, 186, 5, 46, 24, 2, 185, 183, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 188, 3, 2, 2, 2, 187, 189, 7, 11, 2, 2, 188, 187, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 191, 3, 2, 2, 2, 190, 142, 3, 2, 2, 2, 190, 163, 3, 2, 2, 2, 191, 11, 3, 2, 2, 2, 192, 193, 7, 12, 2, 2, 193, 205, 5, 82, 42, 2, 194, 195, 7, 12, 2, 2, 195, 196, 5, 14, 8, 2, 196, 197, 7, 62, 2, 2, 197, 198, 5, 38, 20, 2, 198, 205, 3, 2, 2, 2, 199, 200, 7, 12, 2, 2, 200, 201, 5, 14, 8, 2, 201, 202, 7, 62, 2, 2, 202, 203, 5, 16, 9, 2, 203, 205, 3, 2, 2, 2, 204, 192, 3, 2, 2, 2, 204, 194, 3, 2, 2, 2, 204, 199, 3, 2, 2, 2, 205, 13, 3, 2, 2, 2, 206, 217, 5, 82, 42, 2, 207, 208, 7, 13, 2, 2, 208, 213, 7, 67, 2, 2, 209, 210, 7, 10, 2, 2, 210, 212, 7, 67, 2, 2, 211, 209, 3, 2, 2, 2, 212, 215, 3, 2, 2, 2, 213, 211, 3, 2, 2, 2, 213, 214, 3, 2, 2, 2, 214, 216, 3, 2, 2, 2, 215, 213, 3, 2, 2, 2, 216, 218, 7, 14, 2, 2, 217, 207, 3, 2, 2, 2, 217, 218, 3, 2, 2, 2, 218, 15, 3, 2, 2, 2, 219, 221, 7, 15, 2, 2, 220, 219, 3, 2, 2, 2, 220, 221, 3, 2, 2, 2, 221, 222, 3, 2, 2, 2, 222, 227, 5, 18, 10, 2, 223, 224, 7, 15, 2, 2, 224, 226, 5, 18, 10, 2, 225, 223, 3, 2, 2, 2, 226, 229, 3, 2, 2, 2, 227, 225, 3, 2, 2, 2, 227, 228, 3, 2, 2, 2, 228, 17, 3, 2, 2, 2, 229, 227, 3, 2, 2, 2, 230, 235, 5, 84, 43, 2, 231, 232, 7, 63, 2, 2, 232, 233, 5, 38, 20, 2, 233, 234, 7, 64, 2, 2, 234, 236, 3, 2, 2, 2, 235, 231, 3, 2, 2, 2, 235, 236, 3, 2, 2, 2, 236, 19, 3, 2, 2, 2, 237, 238, 7, 16, 2, 2, 238, 241, 5, 82, 42, 2, 239, 240, 7, 7, 2, 2, 240, 242, 5, 38, 20, 2, 241, 239, 3, 2, 2, 2, 241, 242, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 244, 7, 62, 2, 2, 244, 246, 5, 46, 24, 2, 245, 247, 7, 11, 2, 2, 246, 245, 3, 2, 2, 2, 246, 247, 3, 2, 2, 2, 247, 21, 3, 2, 2, 2, 248, 258, 7, 17, 2, 2, 249, 258, 7, 18, 2, 2, 250, 251, 7, 19, 2, 2, 251, 258, 7, 17, 2, 2, 252, 253, 7, 19, 2, 2, 253, 258, 7, 18, 2, 2, 254, 258, 7, 20, 2, 2, 255, 258, 7, 21, 2, 2, 256, 258, 7, 22, 2, 2, 257, 248, 3, 2, 2, 2, 257, 249, 3, 2, 2, 2, 257, 250, 3, 2, 2, 2, 257, 252, 3, 2, 2, 2, 257, 254, 3, 2, 2, 2, 257, 255, 3, 2, 2, 2, 257, 256, 3, 2, 2, 2, 258, 23, 3, 2, 2, 2, 259, 260, 7, 23, 2, 2, 260, 261, 5, 32, 17, 2, 261, 262, 7, 24, 2, 2, 262, 265, 5, 68, 35, 2, 263, 264, 7, 25, 2, 2, 264, 266, 5, 36, 19, 2, 265, 263, 3, 2, 2, 2, 265, 266, 3, 2, 2, 2, 266, 278, 3, 2, 2, 2, 267, 268, 7, 23, 2, 2, 268, 271, 5, 32, 17, 2, 269, 270, 7, 26, 2, 2, 270, 272, 5, 32, 17, 2, 271, 269, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 275, 3, 2, 2, 2, 273, 274, 7, 25, 2, 2, 274, 276, 5, 36, 19, 2, 275, 273, 3, 2, 2, 2, 275, 276, 3, 2, 2, 2, 276, 278, 3, 2, 2, 2, 277, 259, 3, 2, 2, 2, 277, 267, 3, 2, 2, 2, 278, 25, 3, 2, 2, 2, 279, 280, 7, 27, 2, 2, 280, 281, 5, 32, 17, 2, 281, 282, 7, 24, 2, 2, 282, 283, 5, 68, 35, 2, 283, 291, 3, 2, 2, 2, 284, 285, 7, 27, 2, 2, 285, 288, 5, 32, 17, 2, 286, 287, 7, 26, 2, 2, 287, 289, 5, 32, 17, 2, 288, 286, 3, 2, 2, 2, 288, 289, 3, 2, 2, 2, 289, 291, 3, 2, 2, 2, 290, 279, 3, 2, 2, 2, 290, 284, 3, 2, 2, 2, 291, 27, 3, 2, 2, 2, 292, 293, 7, 23, 2, 2, 293, 294, 5, 30, 16, 2, 294, 295, 7, 63, 2, 2, 295, 296, 5, 32, 17, 2, 296, 297, 7, 62, 2, 2, 297, 305, 5, 46, 24, 2, 298, 299, 7, 10, 2, 2, 299, 300, 5, 32, 17, 2, 300, 301, 7, 62, 2, 2, 301, 302, 5, 46, 24, 2, 302, 304, 3, 2, 2, 2, 303, 298, 3, 2, 2, 2, 304, 307, 3, 2, 2, 2, 305, 303, 3, 2, 2, 2, 305, 306, 3, 2, 2, 2, 306, 308, 3, 2, 2, 2, 307, 305, 3, 2, 2, 2, 308, 309, 7, 64, 2, 2, 309, 310, 7, 24, 2, 2, 310, 313, 7, 53, 2, 2, 311, 312, 7, 25, 2, 2, 312, 314, 5, 36, 19, 2, 313, 311, 3, 2, 2, 2, 313, 314, 3, 2, 2, 2, 314, 339, 3, 2, 2, 2, 315, 316, 7, 23, 2, 2, 316, 317, 5, 30, 16, 2, 317, 318, 7, 63, 2, 2, 318, 319, 5, 32, 17, 2, 319, 320, 7, 62, 2, 2, 320, 328, 5, 46, 24, 2, 321, 322, 7, 10, 2, 2, 322, 323, 5, 32, 17, 2, 323, 324, 7, 62, 2, 2, 324, 325, 5, 46, 24, 2, 325, 327, 3, 2, 2, 2, 326, 321, 3, 2, 2, 2, 327, 330, 3, 2, 2, 2, 328, 326, 3, 2, 2, 2, 328, 329, 3, 2, 2, 2, 329, 331, 3, 2, 2, 2, 330, 328, 3, 2, 2, 2, 331, 332, 7, 64, 2, 2, 332, 333, 7, 26, 2, 2, 333, 336, 5, 34, 18, 2, 334, 335, 7, 25, 2, 2, 335, 337, 5, 36, 19, 2, 336, 334, 3, 2, 2, 2, 336, 337, 3, 2, 2, 2, 337, 339, 3, 2, 2, 2, 338, 292, 3, 2, 2, 2, 338, 315, 3, 2, 2, 2, 339, 29, 3, 2, 2, 2, 340, 341, 5, 82, 42, 2, 341, 31, 3, 2, 2, 2, 342, 343, 5, 82, 42, 2, 343, 33, 3, 2, 2, 2, 344, 345, 5, 82, 42, 2, 345, 35, 3, 2, 2, 2, 346, 347, 7, 42, 2, 2, 347, 37, 3, 2, 2, 2, 348, 349, 8, 20, 1, 2, 349, 358, 7, 63, 2, 2, 350, 355, 5, 38, 20, 2, 351, 352, 7, 10, 2, 2, 352, 354, 5, 38, 20, 2, 353, 351, 3, 2, 2, 2, 354, 357, 3, 2, 2, 2, 355, 353, 3, 2, 2, 2, 355, 356, 3, 2, 2, 2, 356, 359, 3, 2, 2, 2, 357, 355, 3, 2, 2, 2, 358, 350, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 361, 3, 2, 2, 2, 360, 362, 7, 10, 2, 2, 361, 360, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 364, 7, 64, 2, 2, 364, 365, 7, 29, 2, 2, 365, 419, 5, 38, 20, 14, 366, 367, 7, 65, 2, 2, 367, 368, 7, 13, 2, 2, 368, 369, 5, 38, 20, 2, 369, 370, 7, 14, 2, 2, 370, 419, 3, 2, 2, 2, 371, 372, 7, 66, 2, 2, 372, 373, 7, 13, 2, 2, 373, 374, 5, 38, 20, 2, 374, 375, 7, 14, 2, 2, 375, 419, 3, 2, 2, 2, 376, 377, 7, 63, 2, 2, 377, 378, 5, 38, 20, 2, 378, 379, 7, 10, 2, 2, 379, 384, 5, 38, 20, 2, 380, 381, 7, 10, 2, 2, 381, 383, 5, 38, 20, 2, 382, 380, 3, 2, 2, 2, 383, 386, 3, 2, 2, 2, 384, 382, 3, 2, 2, 2, 384, 385, 3, 2, 2, 2, 385, 388, 3, 2, 2, 2, 386, 384, 3, 2, 2, 2, 387, 389, 7, 10, 2, 2, 388, 387, 3, 2, 2, 2, 388, 389, 3, 2, 2, 2, 389, 390, 3, 2, 2, 2, 390, 391, 7, 64, 2, 2, 391, 419, 3, 2, 2, 2, 392, 394, 7, 4, 2, 2, 393, 395, 5, 42, 22, 2, 394, 393, 3, 2, 2, 2, 394, 395, 3, 2, 2, 2, 395, 396, 3, 2, 2, 2, 396, 419, 7, 5, 2, 2, 397, 419, 7, 30, 2, 2, 398, 419, 7, 31, 2, 2, 399, 419, 7, 32, 2, 2, 400, 419, 5, 40, 21, 2, 401, 419, 5, 82, 42, 2, 402, 403, 7, 63, 2, 2, 403, 404, 5, 38, 20, 2, 404, 405, 7, 64, 2, 2, 405, 419, 3, 2, 2, 2, 406, 407, 5, 82, 42, 2, 407, 408, 7, 13, 2, 2, 408, 413, 5, 38, 20, 2, 409, 410, 7, 10, 2, 2, 410, 412, 5, 38, 20, 2, 411, 409, 3, 2, 2, 2, 412, 415, 3, 2, 2, 2, 413, 411, 3, 2, 2, 2, 413, 414, 3, 2, 2, 2, 414, 416, 3, 2, 2, 2, 415, 413, 3, 2, 2, 2, 416, 417, 7, 14, 2, 2, 417, 419, 3, 2, 2, 2, 418, 348, 3, 2, 2, 2, 418, 366, 3, 2, 2, 2, 418, 371, 3, 2, 2, 2, 418, 376, 3, 2, 2, 2, 418, 392, 3, 2, 2, 2, 418, 397, 3, 2, 2, 2, 418, 398, 3, 2, 2, 2, 418, 399, 3, 2, 2, 2, 418, 400, 3, 2, 2, 2, 418, 401, 3, 2, 2, 2, 418, 402, 3, 2, 2, 2, 418, 406, 3, 2, 2, 2, 419, 428, 3, 2, 2, 2, 420, 421, 12, 16, 2, 2, 421, 422, 7, 28, 2, 2, 422, 427, 5, 38, 20, 16, 423, 424, 12, 15, 2, 2, 424, 425, 7, 29, 2, 2, 425, 427, 5, 38, 20, 15, 426, 420, 3, 2, 2, 2, 426, 423, 3, 2, 2, 2, 427, 430, 3, 2, 2, 2, 428, 426, 3, 2, 2, 2, 428, 429, 3, 2, 2, 2, 429, 39, 3, 2, 2, 2, 430, 428, 3, 2, 2, 2, 431, 432, 7, 67, 2, 2, 432, 41, 3, 2, 2, 2, 433, 434, 5, 44, 23, 2, 434, 435, 7, 7, 2, 2, 435, 436, 5, 38, 20, 2, 436, 444, 3, 2, 2, 2, 437, 438, 7, 10, 2, 2, 438, 439, 5, 44, 23, 2, 439, 440, 7, 7, 2, 2, 440, 441, 5, 38, 20, 2, 441, 443, 3, 2, 2, 2, 442, 437, 3, 2, 2, 2, 443, 446, 3, 2, 2, 2, 444, 442, 3, 2, 2, 2, 444, 445, 3, 2, 2, 2, 445, 450, 3, 2, 2, 2, 446, 444, 3, 2, 2, 2, 447, 451, 7, 10, 2, 2, 448, 449, 7, 15, 2, 2, 449, 451, 5, 86, 44, 2, 450, 447, 3, 2, 2, 2, 450, 448, 3, 2, 2, 2, 450, 451, 3, 2, 2, 2, 451, 455, 3, 2, 2, 2, 452, 453, 7, 15, 2, 2, 453, 455, 5, 86, 44, 2, 454, 433, 3, 2, 2, 2, 454, 452, 3, 2, 2, 2, 455, 43, 3, 2, 2, 2, 456, 457, 5, 84, 43, 2, 457, 45, 3, 2, 2, 2, 458, 459, 8, 24, 1, 2, 459, 611, 5, 56, 29, 2, 460, 461, 5, 74, 38, 2, 461, 463, 7, 63, 2, 2, 462, 464, 5, 70, 36, 2, 463, 462, 3, 2, 2, 2, 463, 464, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, 466, 7, 64, 2, 2, 466, 611, 3, 2, 2, 2, 467, 468, 7, 52, 2, 2, 468, 611, 5, 46, 24, 28, 469, 470, 5, 82, 42, 2, 470, 471, 7, 34, 2, 2, 471, 472, 7, 62, 2, 2, 472, 473, 5, 46, 24, 24, 473, 611, 3, 2, 2, 2, 474, 475, 7, 45, 2, 2, 475, 476, 7, 4, 2, 2, 476, 481, 5, 46, 24, 2, 477, 478, 7, 10, 2, 2, 478, 480, 5, 46, 24, 2, 479, 477, 3, 2, 2, 2, 480, 483, 3, 2, 2, 2, 481, 479, 3, 2, 2, 2, 481, 482, 3, 2, 2, 2, 482, 485, 3, 2, 2, 2, 483, 481, 3, 2, 2, 2, 484, 486, 7, 10, 2, 2, 485, 484, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 7, 5, 2, 2, 488, 611, 3, 2, 2, 2, 489, 490, 7, 46, 2, 2, 490, 491, 7, 4, 2, 2, 491, 496, 5, 46, 24, 2, 492, 493, 7, 10, 2, 2, 493, 495, 5, 46, 24, 2, 494, 492, 3, 2, 2, 2, 495, 498, 3, 2, 2, 2, 496, 494, 3, 2, 2, 2, 496, 497, 3, 2, 2, 2, 497, 500, 3, 2, 2, 2, 498, 496, 3, 2, 2, 2, 499, 501, 7, 10, 2, 2, 500, 499, 3, 2, 2, 2, 500, 501, 3, 2, 2, 2, 501, 502, 3, 2, 2, 2, 502, 503, 7, 5, 2, 2, 503, 611, 3, 2, 2, 2, 504, 611, 5, 48, 25, 2, 505, 506, 7, 35, 2, 2, 506, 507, 7, 4, 2, 2, 507, 512, 5, 46, 24, 2, 508, 509, 7, 10, 2, 2, 509, 511, 5, 46, 24, 2, 510, 508, 3, 2, 2, 2, 511, 514, 3, 2, 2, 2, 512, 510, 3, 2, 2, 2, 512, 513, 3, 2, 2, 2, 513, 516, 3, 2, 2, 2, 514, 512, 3, 2, 2, 2, 515, 517, 7, 10, 2, 2, 516, 515, 3, 2, 2, 2, 516, 517, 3, 2, 2, 2, 517, 518, 3, 2, 2, 2, 518, 519, 7, 5, 2, 2, 519, 611, 3, 2, 2, 2, 520, 521, 7, 36, 2, 2, 521, 522, 7, 4, 2, 2, 522, 527, 5, 46, 24, 2, 523, 524, 7, 10, 2, 2, 524, 526, 5, 46, 24, 2, 525, 523, 3, 2, 2, 2, 526, 529, 3, 2, 2, 2, 527, 525, 3, 2, 2, 2, 527, 528, 3, 2, 2, 2, 528, 531, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 530, 532, 7, 10, 2, 2, 531, 530, 3, 2, 2, 2, 531, 532, 3, 2, 2, 2, 532, 533, 3, 2, 2, 2, 533, 534, 7, 5, 2, 2, 534, 611, 3, 2, 2, 2, 535, 540, 5, 82, 42, 2, 536, 540, 7, 44, 2, 2, 537, 540, 7, 43, 2, 2, 538, 540, 7, 42, 2, 2, 539, 535, 3, 2, 2, 2, 539, 536, 3, 2, 2, 2, 539, 537, 3, 2, 2, 2, 539, 538, 3, 2, 2, 2, 540, 611, 3, 2, 2, 2, 541, 542, 7, 63, 2, 2, 542, 543, 5, 46, 24, 2, 543, 544, 7, 10, 2, 2, 544, 549, 5, 46, 24, 2, 545, 546, 7, 10, 2, 2, 546, 548, 5, 46, 24, 2, 547, 545, 3, 2, 2, 2, 548, 551, 3, 2, 2, 2, 549, 547, 3, 2, 2, 2, 549, 550, 3, 2, 2, 2, 550, 553, 3, 2, 2, 2, 551, 549, 3, 2, 2, 2, 552, 554, 7, 10, 2, 2, 553, 552, 3, 2, 2, 2, 553, 554, 3, 2, 2, 2, 554, 555, 3, 2, 2, 2, 555, 556, 7, 64, 2, 2, 556, 611, 3, 2, 2, 2, 557, 558, 7, 63, 2, 2, 558, 611, 7, 64, 2, 2, 559, 560, 7, 4, 2, 2, 560, 565, 5, 72, 37, 2, 561, 562, 7, 10, 2, 2, 562, 564, 5, 72, 37, 2, 563, 561, 3, 2, 2, 2, 564, 567, 3, 2, 2, 2, 565, 563, 3, 2, 2, 2, 565, 566, 3, 2, 2, 2, 566, 569, 3, 2, 2, 2, 567, 565, 3, 2, 2, 2, 568, 570, 7, 10, 2, 2, 569, 568, 3, 2, 2, 2, 569, 570, 3, 2, 2, 2, 570, 571, 3, 2, 2, 2, 571, 572, 7, 5, 2, 2, 572, 611, 3, 2, 2, 2, 573, 582, 7, 13, 2, 2, 574, 579, 5, 46, 24, 2, 575, 576, 7, 10, 2, 2, 576, 578, 5, 46, 24, 2, 577, 575, 3, 2, 2, 2, 578, 581, 3, 2, 2, 2, 579, 577, 3, 2, 2, 2, 579, 580, 3, 2, 2, 2, 580, 583, 3, 2, 2, 2, 581, 579, 3, 2, 2, 2, 582, 574, 3, 2, 2, 2, 582, 583, 3, 2, 2, 2, 583, 585, 3, 2, 2, 2, 584, 586, 7, 10, 2, 2, 585, 584, 3, 2, 2, 2, 585, 586, 3, 2, 2, 2, 586, 587, 3, 2, 2, 2, 587, 611, 7, 14, 2, 2, 588, 589, 7, 37, 2, 2, 589, 590, 7, 63, 2, 2, 590, 591, 5, 46, 24, 2, 591, 592, 7, 64, 2, 2, 592, 593, 5, 46, 24, 2, 593, 594, 7, 38, 2, 2, 594, 595, 5, 46, 24, 7, 595, 611, 3, 2, 2, 2, 596, 597, 5, 10, 6, 2, 597, 598, 5, 46, 24, 6, 598, 611, 3, 2, 2, 2, 599, 600, 5, 20, 11, 2, 600, 601, 5, 46, 24, 5, 601, 611, 3, 2, 2, 2, 602, 603, 7, 63, 2, 2, 603, 604, 5, 46, 24, 2, 604, 605, 7, 64, 2, 2, 605, 611, 3, 2, 2, 2, 606, 607, 7, 4, 2, 2, 607, 608, 5, 46, 24, 2, 608, 609, 7, 5, 2, 2, 609, 611, 3, 2, 2, 2, 610, 458, 3, 2, 2, 2, 610, 460, 3, 2, 2, 2, 610, 467, 3, 2, 2, 2, 610, 469, 3, 2, 2, 2, 610, 474, 3, 2, 2, 2, 610, 489, 3, 2, 2, 2, 610, 504, 3, 2, 2, 2, 610, 505, 3, 2, 2, 2, 610, 520, 3, 2, 2, 2, 610, 539, 3, 2, 2, 2, 610, 541, 3, 2, 2, 2, 610, 557, 3, 2, 2, 2, 610, 559, 3, 2, 2, 2, 610, 573, 3, 2, 2, 2, 610, 588, 3, 2, 2, 2, 610, 596, 3, 2, 2, 2, 610, 599, 3, 2, 2, 2, 610, 602, 3, 2, 2, 2, 610, 606, 3, 2, 2, 2, 611, 661, 3, 2, 2, 2, 612, 613, 12, 29, 2, 2, 613, 614, 7, 33, 2, 2, 614, 660, 5, 46, 24, 29, 615, 616, 12, 27, 2, 2, 616, 617, 9, 2, 2, 2, 617, 660, 5, 46, 24, 28, 618, 619, 12, 26, 2, 2, 619, 620, 9, 3, 2, 2, 620, 660, 5, 46, 24, 27, 621, 622, 12, 25, 2, 2, 622, 623, 9, 4, 2, 2, 623, 660, 5, 46, 24, 26, 624, 625, 12, 23, 2, 2, 625, 626, 7, 62, 2, 2, 626, 627, 5, 46, 24, 24, 627, 628, 8, 24, 1, 2, 628, 660, 3, 2, 2, 2, 629, 630, 12, 21, 2, 2, 630, 631, 7, 45, 2, 2, 631, 660, 5, 46, 24, 22, 632, 633, 12, 19, 2, 2, 633, 634, 7, 46, 2, 2, 634, 660, 5, 46, 24, 20, 635, 636, 12, 18, 2, 2, 636, 637, 7, 47, 2, 2, 637, 660, 5, 46, 24, 19, 638, 639, 12, 17, 2, 2, 639, 640, 7, 48, 2, 2, 640, 660, 5, 46, 24, 18, 641, 642, 12, 10, 2, 2, 642, 643, 7, 28, 2, 2, 643, 660, 5, 46, 24, 11, 644, 645, 12, 33, 2, 2, 645, 646, 7, 24, 2, 2, 646, 652, 5, 76, 39, 2, 647, 649, 7, 63, 2, 2, 648, 650, 5, 70, 36, 2, 649, 648, 3, 2, 2, 2, 649, 650, 3, 2, 2, 2, 650, 651, 3, 2, 2, 2, 651, 653, 7, 64, 2, 2, 652, 647, 3, 2, 2, 2, 652, 653, 3, 2, 2, 2, 653, 660, 3, 2, 2, 2, 654, 655, 12, 30, 2, 2, 655, 656, 7, 13, 2, 2, 656, 657, 5, 46, 24, 2, 657, 658, 7, 14, 2, 2, 658, 660, 3, 2, 2, 2, 659, 612, 3, 2, 2, 2, 659, 615, 3, 2, 2, 2, 659, 618, 3, 2, 2, 2, 659, 621, 3, 2, 2, 2, 659, 624, 3, 2, 2, 2, 659, 629, 3, 2, 2, 2, 659, 632, 3, 2, 2, 2, 659, 635, 3, 2, 2, 2, 659, 638, 3, 2, 2, 2, 659, 641, 3, 2, 2, 2, 659, 644, 3, 2, 2, 2, 659, 654, 3, 2, 2, 2, 660, 663, 3, 2, 2, 2, 661, 659, 3, 2, 2, 2, 661, 662, 3, 2, 2, 2, 662, 47, 3, 2, 2, 2, 663, 661, 3, 2, 2, 2, 664, 665, 7, 50, 2, 2, 665, 666, 5, 46, 24, 2, 666, 668, 7, 4, 2, 2, 667, 669, 7, 15, 2, 2, 668, 667, 3, 2, 2, 2, 668, 669, 3, 2, 2, 2, 669, 670, 3, 2, 2, 2, 670, 675, 5, 50, 26, 2, 671, 672, 7, 15, 2, 2, 672, 674, 5, 50, 26, 2, 673, 671, 3, 2, 2, 2, 674, 677, 3, 2, 2, 2, 675, 673, 3, 2, 2, 2, 675, 676, 3, 2, 2, 2, 676, 678, 3, 2, 2, 2, 677, 675, 3, 2, 2, 2, 678, 679, 7, 5, 2, 2, 679, 49, 3, 2, 2, 2, 680, 683, 5, 52, 27, 2, 681, 683, 7, 39, 2, 2, 682, 680, 3, 2, 2, 2, 682, 681, 3, 2, 2, 2, 683, 684, 3, 2, 2, 2, 684, 685, 7, 29, 2, 2, 685, 686, 5, 46, 24, 2, 686, 51, 3, 2, 2, 2, 687, 694, 5, 84, 43, 2, 688, 691, 7, 63, 2, 2, 689, 692, 5, 84, 43, 2, 690, 692, 7, 39, 2, 2, 691, 689, 3, 2, 2, 2, 691, 690, 3, 2, 2, 2, 692, 693, 3, 2, 2, 2, 693, 695, 7, 64, 2, 2, 694, 688, 3, 2, 2, 2, 694, 695, 3, 2, 2, 2, 695, 53, 3, 2, 2, 2, 696, 697, 5, 8, 5, 2, 697, 698, 7, 2, 2, 3, 698, 706, 3, 2, 2, 2, 699, 700, 5, 46, 24, 2, 700, 701, 7, 2, 2, 3, 701, 706, 3, 2, 2, 2, 702, 703, 7, 69, 2, 2, 703, 706, 7, 2, 2, 3, 704, 706, 7, 2, 2, 3, 705, 696, 3, 2, 2, 2, 705, 699, 3, 2, 2, 2, 705, 702, 3, 2, 2, 2, 705, 704, 3, 2, 2, 2, 706, 55, 3, 2, 2, 2, 707, 710, 5, 58, 30, 2, 708, 710, 5, 60, 31, 2, 709, 707, 3, 2, 2, 2, 709, 708, 3, 2, 2, 2, 710, 57, 3, 2, 2, 2, 711, 712, 5, 64, 33, 2, 712, 713, 7, 29, 2, 2, 713, 714, 5, 46, 24, 2, 714, 729, 3, 2, 2, 2, 715, 716, 7, 63, 2, 2, 716, 721, 5, 64, 33, 2, 717, 718, 7, 10, 2, 2, 718, 720, 5, 64, 33, 2, 719, 717, 3, 2, 2, 2, 720, 723, 3, 2, 2, 2, 721, 719, 3, 2, 2, 2, 721, 722, 3, 2, 2, 2, 722, 724, 3, 2, 2, 2, 723, 721, 3, 2, 2, 2, 724, 725, 7, 64, 2, 2, 725, 726, 7, 29, 2, 2, 726, 727, 5, 46, 24, 2, 727, 729, 3, 2, 2, 2, 728, 711, 3, 2, 2, 2, 728, 715, 3, 2, 2, 2, 729, 59, 3, 2, 2, 2, 730, 731, 7, 63, 2, 2, 731, 732, 7, 63, 2, 2, 732, 735, 5, 64, 33, 2, 733, 734, 7, 10, 2, 2, 734, 736, 5, 64, 33, 2, 735, 733, 3, 2, 2, 2, 736, 737, 3, 2, 2, 2, 737, 735, 3, 2, 2, 2, 737, 738, 3, 2, 2, 2, 738, 739, 3, 2, 2, 2, 739, 740, 7, 64, 2, 2, 740, 741, 7, 64, 2, 2, 741, 742, 7, 29, 2, 2, 742, 743, 5, 46, 24, 2, 743, 61, 3, 2, 2, 2, 744, 747, 7, 39, 2, 2, 745, 747, 5, 82, 42, 2, 746, 744, 3, 2, 2, 2, 746, 745, 3, 2, 2, 2, 747, 63, 3, 2, 2, 2, 748, 749, 5, 62, 32, 2, 749, 65, 3, 2, 2, 2, 750, 751, 5, 62, 32, 2, 751, 752, 7, 7, 2, 2, 752, 753, 5, 38, 20, 2, 753, 67, 3, 2, 2, 2, 754, 757, 7, 53, 2, 2, 755, 757, 5, 82, 42, 2, 756, 754, 3, 2, 2, 2, 756, 755, 3, 2, 2, 2, 757, 69, 3, 2, 2, 2, 758, 763, 5, 46, 24, 2, 759, 760, 7, 10, 2, 2, 760, 762, 5, 46, 24, 2, 761, 759, 3, 2, 2, 2, 762, 765, 3, 2, 2, 2, 763, 761, 3, 2, 2, 2, 763, 764, 3, 2, 2, 2, 764, 71, 3, 2, 2, 2, 765, 763, 3, 2, 2, 2, 766, 767, 5, 84, 43, 2, 767, 768, 7, 7, 2, 2, 768, 769, 5, 46, 24, 2, 769, 773, 3, 2, 2, 2, 770, 771, 7, 40, 2, 2, 771, 773, 5, 46, 24, 2, 772, 766, 3, 2, 2, 2, 772, 770, 3, 2, 2, 2, 773, 73, 3, 2, 2, 2, 774, 777, 5, 82, 42, 2, 775, 777, 9, 5, 2, 2, 776, 774, 3, 2, 2, 2, 776, 775, 3, 2, 2, 2, 777, 75, 3, 2, 2, 2, 778, 781, 5, 82, 42, 2, 779, 781, 9, 6, 2, 2, 780, 778, 3, 2, 2, 2, 780, 779, 3, 2, 2, 2, 781, 77, 3, 2, 2, 2, 782, 783, 9, 7, 2, 2, 783, 79, 3, 2, 2, 2, 784, 785, 9, 8, 2, 2, 785, 81, 3, 2, 2, 2, 786, 791, 5, 86, 44, 2, 787, 788, 7, 41, 2, 2, 788, 790, 5, 86, 44, 2, 789, 787, 3, 2, 2, 2, 790, 793, 3, 2, 2, 2, 791, 789, 3, 2, 2, 2, 791, 792, 3, 2, 2, 2, 792, 83, 3, 2, 2, 2, 793, 791, 3, 2, 2, 2, 794, 799, 5, 86, 44, 2, 795, 796, 5, 82, 42, 2, 796, 797, 8, 43, 1, 2, 797, 799, 3, 2, 2, 2, 798, 794, 3, 2, 2, 2, 798, 795, 3, 2, 2, 2, 799, 85, 3, 2, 2, 2, 800, 801, 9, 9, 2, 2, 801, 87, 3, 2, 2, 2, 90, 91, 98, 107, 115, 140, 150, 158, 161, 171, 174, 177, 181, 185, 188, 190, 204, 213, 217, 220, 227, 235, 241, 246, 257, 265, 271, 275, 277, 288, 290, 305, 313, 328, 336, 338, 355, 358, 361, 384, 388, 394, 413, 418, 426, 428, 444, 450, 454, 463, 481, 485, 496, 500, 512, 516, 527, 531, 539, 549, 553, 565, 569, 579, 582, 585, 610, 649, 652, 659, 661, 668, 675, 682, 691, 694, 705, 709, 721, 728, 737, 746, 756, 763, 772, 776, 780, 791, 798] \ No newline at end of file diff --git a/quint/src/generated/QuintListener.ts b/quint/src/generated/QuintListener.ts index 7eade795d..0c24f2792 100644 --- a/quint/src/generated/QuintListener.ts +++ b/quint/src/generated/QuintListener.ts @@ -47,6 +47,7 @@ import { ActionAllContext } from "./QuintParser"; import { ActionAnyContext } from "./QuintParser"; import { LiteralOrIdContext } from "./QuintParser"; import { TupleContext } from "./QuintParser"; +import { UnitContext } from "./QuintParser"; import { PairContext } from "./QuintParser"; import { RecordContext } from "./QuintParser"; import { ListContext } from "./QuintParser"; @@ -609,6 +610,19 @@ export interface QuintListener extends ParseTreeListener { */ exitTuple?: (ctx: TupleContext) => void; + /** + * Enter a parse tree produced by the `unit` + * labeled alternative in `QuintParser.expr`. + * @param ctx the parse tree + */ + enterUnit?: (ctx: UnitContext) => void; + /** + * Exit a parse tree produced by the `unit` + * labeled alternative in `QuintParser.expr`. + * @param ctx the parse tree + */ + exitUnit?: (ctx: UnitContext) => void; + /** * Enter a parse tree produced by the `pair` * labeled alternative in `QuintParser.expr`. diff --git a/quint/src/generated/QuintParser.ts b/quint/src/generated/QuintParser.ts index 8cb906851..42faa5ee2 100644 --- a/quint/src/generated/QuintParser.ts +++ b/quint/src/generated/QuintParser.ts @@ -1881,7 +1881,7 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 606; + this.state = 608; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 65, this._ctx) ) { case 1: @@ -1927,7 +1927,7 @@ export class QuintParser extends Parser { this.state = 465; this.match(QuintParser.MINUS); this.state = 466; - this.expr(25); + this.expr(26); } break; @@ -1943,7 +1943,7 @@ export class QuintParser extends Parser { this.state = 469; this.match(QuintParser.ASGN); this.state = 470; - this.expr(21); + this.expr(22); } break; @@ -2220,172 +2220,184 @@ export class QuintParser extends Parser { case 12: { - _localctx = new RecordContext(_localctx); + _localctx = new UnitContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; this.state = 555; - this.match(QuintParser.T__1); + this.match(QuintParser.LPAREN); this.state = 556; + this.match(QuintParser.RPAREN); + } + break; + + case 13: + { + _localctx = new RecordContext(_localctx); + this._ctx = _localctx; + _prevctx = _localctx; + this.state = 557; + this.match(QuintParser.T__1); + this.state = 558; this.recElem(); - this.state = 561; + this.state = 563; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 60, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 557; + this.state = 559; this.match(QuintParser.T__7); - this.state = 558; + this.state = 560; this.recElem(); } } } - this.state = 563; + this.state = 565; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 60, this._ctx); } - this.state = 565; + this.state = 567; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 564; + this.state = 566; this.match(QuintParser.T__7); } } - this.state = 567; + this.state = 569; this.match(QuintParser.T__2); } break; - case 13: + case 14: { _localctx = new ListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 569; + this.state = 571; this.match(QuintParser.T__10); - this.state = 578; + this.state = 580; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 570; + this.state = 572; this.expr(0); - this.state = 575; + this.state = 577; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 62, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 571; + this.state = 573; this.match(QuintParser.T__7); - this.state = 572; + this.state = 574; this.expr(0); } } } - this.state = 577; + this.state = 579; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 62, this._ctx); } } } - this.state = 581; + this.state = 583; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 580; + this.state = 582; this.match(QuintParser.T__7); } } - this.state = 583; + this.state = 585; this.match(QuintParser.T__11); } break; - case 14: + case 15: { _localctx = new IfElseContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 584; - this.match(QuintParser.T__34); - this.state = 585; - this.match(QuintParser.LPAREN); this.state = 586; - this.expr(0); + this.match(QuintParser.T__34); this.state = 587; - this.match(QuintParser.RPAREN); + this.match(QuintParser.LPAREN); this.state = 588; this.expr(0); this.state = 589; - this.match(QuintParser.T__35); + this.match(QuintParser.RPAREN); this.state = 590; + this.expr(0); + this.state = 591; + this.match(QuintParser.T__35); + this.state = 592; this.expr(5); } break; - case 15: + case 16: { _localctx = new LetInContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 592; + this.state = 594; this.operDef(); - this.state = 593; + this.state = 595; this.expr(4); } break; - case 16: + case 17: { _localctx = new NondetContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 595; + this.state = 597; this.nondetOperDef(); - this.state = 596; + this.state = 598; this.expr(3); } break; - case 17: + case 18: { _localctx = new ParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 598; + this.state = 600; this.match(QuintParser.LPAREN); - this.state = 599; + this.state = 601; this.expr(0); - this.state = 600; + this.state = 602; this.match(QuintParser.RPAREN); } break; - case 18: + case 19: { _localctx = new BracesContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 602; + this.state = 604; this.match(QuintParser.T__1); - this.state = 603; + this.state = 605; this.expr(0); - this.state = 604; + this.state = 606; this.match(QuintParser.T__2); } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 657; + this.state = 659; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 69, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -2395,21 +2407,21 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 655; + this.state = 657; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 68, this._ctx) ) { case 1: { _localctx = new PowContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 608; - if (!(this.precpred(this._ctx, 26))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 26)"); + this.state = 610; + if (!(this.precpred(this._ctx, 27))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 27)"); } - this.state = 609; + this.state = 611; (_localctx as PowContext)._op = this.match(QuintParser.T__30); - this.state = 610; - this.expr(26); + this.state = 612; + this.expr(27); } break; @@ -2417,11 +2429,11 @@ export class QuintParser extends Parser { { _localctx = new MultDivContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 611; - if (!(this.precpred(this._ctx, 24))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 24)"); + this.state = 613; + if (!(this.precpred(this._ctx, 25))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 25)"); } - this.state = 612; + this.state = 614; (_localctx as MultDivContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & ((1 << (QuintParser.MUL - 51)) | (1 << (QuintParser.DIV - 51)) | (1 << (QuintParser.MOD - 51)))) !== 0))) { @@ -2434,8 +2446,8 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 613; - this.expr(25); + this.state = 615; + this.expr(26); } break; @@ -2443,11 +2455,11 @@ export class QuintParser extends Parser { { _localctx = new PlusMinusContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 614; - if (!(this.precpred(this._ctx, 23))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 23)"); + this.state = 616; + if (!(this.precpred(this._ctx, 24))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 24)"); } - this.state = 615; + this.state = 617; (_localctx as PlusMinusContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(_la === QuintParser.PLUS || _la === QuintParser.MINUS)) { @@ -2460,8 +2472,8 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 616; - this.expr(24); + this.state = 618; + this.expr(25); } break; @@ -2469,11 +2481,11 @@ export class QuintParser extends Parser { { _localctx = new RelationsContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 617; - if (!(this.precpred(this._ctx, 22))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 22)"); + this.state = 619; + if (!(this.precpred(this._ctx, 23))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 23)"); } - this.state = 618; + this.state = 620; (_localctx as RelationsContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 54)) & ~0x1F) === 0 && ((1 << (_la - 54)) & ((1 << (QuintParser.GT - 54)) | (1 << (QuintParser.LT - 54)) | (1 << (QuintParser.GE - 54)) | (1 << (QuintParser.LE - 54)) | (1 << (QuintParser.NE - 54)) | (1 << (QuintParser.EQ - 54)))) !== 0))) { @@ -2486,8 +2498,8 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 619; - this.expr(23); + this.state = 621; + this.expr(24); } break; @@ -2495,14 +2507,14 @@ export class QuintParser extends Parser { { _localctx = new ErrorEqContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 620; - if (!(this.precpred(this._ctx, 20))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 20)"); + this.state = 622; + if (!(this.precpred(this._ctx, 21))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 21)"); } - this.state = 621; + this.state = 623; this.match(QuintParser.ASGN); - this.state = 622; - this.expr(21); + this.state = 624; + this.expr(22); const m = "[QNT006] unexpected '=', did you mean '=='?" this.notifyErrorListeners(m) @@ -2514,14 +2526,14 @@ export class QuintParser extends Parser { { _localctx = new AndContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 625; - if (!(this.precpred(this._ctx, 18))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 18)"); + this.state = 627; + if (!(this.precpred(this._ctx, 19))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 19)"); } - this.state = 626; + this.state = 628; this.match(QuintParser.AND); - this.state = 627; - this.expr(19); + this.state = 629; + this.expr(20); } break; @@ -2529,14 +2541,14 @@ export class QuintParser extends Parser { { _localctx = new OrContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 628; - if (!(this.precpred(this._ctx, 16))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 16)"); + this.state = 630; + if (!(this.precpred(this._ctx, 17))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 17)"); } - this.state = 629; + this.state = 631; this.match(QuintParser.OR); - this.state = 630; - this.expr(17); + this.state = 632; + this.expr(18); } break; @@ -2544,14 +2556,14 @@ export class QuintParser extends Parser { { _localctx = new IffContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 631; - if (!(this.precpred(this._ctx, 15))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 15)"); + this.state = 633; + if (!(this.precpred(this._ctx, 16))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 16)"); } - this.state = 632; + this.state = 634; this.match(QuintParser.IFF); - this.state = 633; - this.expr(16); + this.state = 635; + this.expr(17); } break; @@ -2559,14 +2571,14 @@ export class QuintParser extends Parser { { _localctx = new ImpliesContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 634; - if (!(this.precpred(this._ctx, 14))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); + this.state = 636; + if (!(this.precpred(this._ctx, 15))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 15)"); } - this.state = 635; + this.state = 637; this.match(QuintParser.IMPLIES); - this.state = 636; - this.expr(15); + this.state = 638; + this.expr(16); } break; @@ -2574,13 +2586,13 @@ export class QuintParser extends Parser { { _localctx = new PairContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 637; + this.state = 639; if (!(this.precpred(this._ctx, 8))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 8)"); } - this.state = 638; + this.state = 640; this.match(QuintParser.T__25); - this.state = 639; + this.state = 641; this.expr(9); } break; @@ -2589,32 +2601,32 @@ export class QuintParser extends Parser { { _localctx = new DotCallContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 640; - if (!(this.precpred(this._ctx, 30))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 30)"); + this.state = 642; + if (!(this.precpred(this._ctx, 31))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 31)"); } - this.state = 641; + this.state = 643; this.match(QuintParser.T__21); - this.state = 642; + this.state = 644; this.nameAfterDot(); - this.state = 648; + this.state = 650; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 67, this._ctx) ) { case 1: { - this.state = 643; - this.match(QuintParser.LPAREN); this.state = 645; + this.match(QuintParser.LPAREN); + this.state = 647; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 644; + this.state = 646; this.argList(); } } - this.state = 647; + this.state = 649; this.match(QuintParser.RPAREN); } break; @@ -2626,22 +2638,22 @@ export class QuintParser extends Parser { { _localctx = new ListAppContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 650; - if (!(this.precpred(this._ctx, 27))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 27)"); + this.state = 652; + if (!(this.precpred(this._ctx, 28))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 28)"); } - this.state = 651; + this.state = 653; this.match(QuintParser.T__10); - this.state = 652; + this.state = 654; this.expr(0); - this.state = 653; + this.state = 655; this.match(QuintParser.T__11); } break; } } } - this.state = 659; + this.state = 661; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 69, this._ctx); } @@ -2669,43 +2681,43 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 660; + this.state = 662; this.match(QuintParser.MATCH); - this.state = 661; + this.state = 663; this.expr(0); - this.state = 662; - this.match(QuintParser.T__1); this.state = 664; + this.match(QuintParser.T__1); + this.state = 666; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__12) { { - this.state = 663; + this.state = 665; this.match(QuintParser.T__12); } } - this.state = 666; + this.state = 668; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); - this.state = 671; + this.state = 673; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__12) { { { - this.state = 667; + this.state = 669; this.match(QuintParser.T__12); - this.state = 668; + this.state = 670; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); } } - this.state = 673; + this.state = 675; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 674; + this.state = 676; this.match(QuintParser.T__2); } } @@ -2730,28 +2742,28 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 678; + this.state = 680; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 676; + this.state = 678; _localctx._variantMatch = this.matchSumVariant(); } break; case QuintParser.T__36: { - this.state = 677; + this.state = 679; _localctx._wildCardMatch = this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 680; + this.state = 682; this.match(QuintParser.T__26); - this.state = 681; + this.state = 683; this.expr(0); } } @@ -2778,36 +2790,36 @@ export class QuintParser extends Parser { this.enterOuterAlt(_localctx, 1); { { - this.state = 683; + this.state = 685; _localctx._variantLabel = this.simpleId("variant label"); } - this.state = 690; + this.state = 692; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.LPAREN) { { - this.state = 684; + this.state = 686; this.match(QuintParser.LPAREN); - this.state = 687; + this.state = 689; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 685; + this.state = 687; _localctx._variantParam = this.simpleId("match case parameter"); } break; case QuintParser.T__36: { - this.state = 686; + this.state = 688; this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 689; + this.state = 691; this.match(QuintParser.RPAREN); } } @@ -2833,15 +2845,15 @@ export class QuintParser extends Parser { let _localctx: DeclarationOrExprContext = new DeclarationOrExprContext(this._ctx, this.state); this.enterRule(_localctx, 52, QuintParser.RULE_declarationOrExpr); try { - this.state = 701; + this.state = 703; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 75, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 692; + this.state = 694; this.declaration(); - this.state = 693; + this.state = 695; this.match(QuintParser.EOF); } break; @@ -2849,9 +2861,9 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 695; + this.state = 697; this.expr(0); - this.state = 696; + this.state = 698; this.match(QuintParser.EOF); } break; @@ -2859,9 +2871,9 @@ export class QuintParser extends Parser { case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 698; + this.state = 700; this.match(QuintParser.DOCCOMMENT); - this.state = 699; + this.state = 701; this.match(QuintParser.EOF); } break; @@ -2869,7 +2881,7 @@ export class QuintParser extends Parser { case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 700; + this.state = 702; this.match(QuintParser.EOF); } break; @@ -2894,13 +2906,13 @@ export class QuintParser extends Parser { let _localctx: LambdaContext = new LambdaContext(this._ctx, this.state); this.enterRule(_localctx, 54, QuintParser.RULE_lambda); try { - this.state = 705; + this.state = 707; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 76, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 703; + this.state = 705; this.lambdaUnsugared(); } break; @@ -2908,7 +2920,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 704; + this.state = 706; this.lambdaTupleSugar(); } break; @@ -2934,7 +2946,7 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 56, QuintParser.RULE_lambdaUnsugared); let _la: number; try { - this.state = 724; + this.state = 726; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: @@ -2942,42 +2954,42 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 707; + this.state = 709; this.parameter(); - this.state = 708; + this.state = 710; this.match(QuintParser.T__26); - this.state = 709; + this.state = 711; this.expr(0); } break; case QuintParser.LPAREN: this.enterOuterAlt(_localctx, 2); { - this.state = 711; + this.state = 713; this.match(QuintParser.LPAREN); - this.state = 712; + this.state = 714; this.parameter(); - this.state = 717; + this.state = 719; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 713; + this.state = 715; this.match(QuintParser.T__7); - this.state = 714; + this.state = 716; this.parameter(); } } - this.state = 719; + this.state = 721; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 720; + this.state = 722; this.match(QuintParser.RPAREN); - this.state = 721; + this.state = 723; this.match(QuintParser.T__26); - this.state = 722; + this.state = 724; this.expr(0); } break; @@ -3007,35 +3019,35 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 726; + this.state = 728; this.match(QuintParser.LPAREN); - this.state = 727; + this.state = 729; this.match(QuintParser.LPAREN); - this.state = 728; + this.state = 730; this.parameter(); - this.state = 731; + this.state = 733; this._errHandler.sync(this); _la = this._input.LA(1); do { { { - this.state = 729; + this.state = 731; this.match(QuintParser.T__7); - this.state = 730; + this.state = 732; this.parameter(); } } - this.state = 733; + this.state = 735; this._errHandler.sync(this); _la = this._input.LA(1); } while (_la === QuintParser.T__7); - this.state = 735; + this.state = 737; this.match(QuintParser.RPAREN); - this.state = 736; + this.state = 738; this.match(QuintParser.RPAREN); - this.state = 737; + this.state = 739; this.match(QuintParser.T__26); - this.state = 738; + this.state = 740; this.expr(0); } } @@ -3058,13 +3070,13 @@ export class QuintParser extends Parser { let _localctx: IdentOrHoleContext = new IdentOrHoleContext(this._ctx, this.state); this.enterRule(_localctx, 60, QuintParser.RULE_identOrHole); try { - this.state = 742; + this.state = 744; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: this.enterOuterAlt(_localctx, 1); { - this.state = 740; + this.state = 742; this.match(QuintParser.T__36); } break; @@ -3072,7 +3084,7 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 741; + this.state = 743; this.qualId(); } break; @@ -3101,7 +3113,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 744; + this.state = 746; _localctx._paramName = this.identOrHole(); } } @@ -3126,11 +3138,11 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 746; + this.state = 748; _localctx._paramName = this.identOrHole(); - this.state = 747; + this.state = 749; this.match(QuintParser.T__4); - this.state = 748; + this.state = 750; this.type(0); } } @@ -3153,13 +3165,13 @@ export class QuintParser extends Parser { let _localctx: IdentOrStarContext = new IdentOrStarContext(this._ctx, this.state); this.enterRule(_localctx, 66, QuintParser.RULE_identOrStar); try { - this.state = 752; + this.state = 754; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.MUL: this.enterOuterAlt(_localctx, 1); { - this.state = 750; + this.state = 752; this.match(QuintParser.MUL); } break; @@ -3167,7 +3179,7 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 751; + this.state = 753; this.qualId(); } break; @@ -3197,21 +3209,21 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 754; + this.state = 756; this.expr(0); - this.state = 759; + this.state = 761; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 755; + this.state = 757; this.match(QuintParser.T__7); - this.state = 756; + this.state = 758; this.expr(0); } } - this.state = 761; + this.state = 763; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -3236,27 +3248,27 @@ export class QuintParser extends Parser { let _localctx: RecElemContext = new RecElemContext(this._ctx, this.state); this.enterRule(_localctx, 70, QuintParser.RULE_recElem); try { - this.state = 768; + this.state = 770; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 762; + this.state = 764; this.simpleId("record"); - this.state = 763; + this.state = 765; this.match(QuintParser.T__4); - this.state = 764; + this.state = 766; this.expr(0); } break; case QuintParser.T__37: this.enterOuterAlt(_localctx, 2); { - this.state = 766; + this.state = 768; this.match(QuintParser.T__37); - this.state = 767; + this.state = 769; this.expr(0); } break; @@ -3284,14 +3296,14 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 72, QuintParser.RULE_normalCallName); let _la: number; try { - this.state = 772; + this.state = 774; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 770; + this.state = 772; this.qualId(); } break; @@ -3304,7 +3316,7 @@ export class QuintParser extends Parser { case QuintParser.LIST: this.enterOuterAlt(_localctx, 2); { - this.state = 771; + this.state = 773; _localctx._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 43)) & ~0x1F) === 0 && ((1 << (_la - 43)) & ((1 << (QuintParser.AND - 43)) | (1 << (QuintParser.OR - 43)) | (1 << (QuintParser.IFF - 43)) | (1 << (QuintParser.IMPLIES - 43)) | (1 << (QuintParser.MAP - 43)) | (1 << (QuintParser.SET - 43)) | (1 << (QuintParser.LIST - 43)))) !== 0))) { @@ -3343,14 +3355,14 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 74, QuintParser.RULE_nameAfterDot); let _la: number; try { - this.state = 776; + this.state = 778; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 774; + this.state = 776; this.qualId(); } break; @@ -3360,7 +3372,7 @@ export class QuintParser extends Parser { case QuintParser.IMPLIES: this.enterOuterAlt(_localctx, 2); { - this.state = 775; + this.state = 777; _localctx._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 43)) & ~0x1F) === 0 && ((1 << (_la - 43)) & ((1 << (QuintParser.AND - 43)) | (1 << (QuintParser.OR - 43)) | (1 << (QuintParser.IFF - 43)) | (1 << (QuintParser.IMPLIES - 43)))) !== 0))) { @@ -3401,7 +3413,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 778; + this.state = 780; _la = this._input.LA(1); if (!(((((_la - 31)) & ~0x1F) === 0 && ((1 << (_la - 31)) & ((1 << (QuintParser.T__30 - 31)) | (1 << (QuintParser.AND - 31)) | (1 << (QuintParser.OR - 31)) | (1 << (QuintParser.IFF - 31)) | (1 << (QuintParser.IMPLIES - 31)) | (1 << (QuintParser.PLUS - 31)) | (1 << (QuintParser.MINUS - 31)) | (1 << (QuintParser.MUL - 31)) | (1 << (QuintParser.DIV - 31)) | (1 << (QuintParser.MOD - 31)) | (1 << (QuintParser.GT - 31)) | (1 << (QuintParser.LT - 31)) | (1 << (QuintParser.GE - 31)) | (1 << (QuintParser.LE - 31)) | (1 << (QuintParser.NE - 31)) | (1 << (QuintParser.EQ - 31)))) !== 0))) { this._errHandler.recoverInline(this); @@ -3437,7 +3449,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 780; + this.state = 782; _la = this._input.LA(1); if (!(((((_la - 40)) & ~0x1F) === 0 && ((1 << (_la - 40)) & ((1 << (QuintParser.STRING - 40)) | (1 << (QuintParser.BOOL - 40)) | (1 << (QuintParser.INT - 40)))) !== 0))) { this._errHandler.recoverInline(this); @@ -3473,23 +3485,23 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 782; + this.state = 784; this.identifier(); - this.state = 787; + this.state = 789; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 86, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 783; + this.state = 785; this.match(QuintParser.T__38); - this.state = 784; + this.state = 786; this.identifier(); } } } - this.state = 789; + this.state = 791; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 86, this._ctx); } @@ -3514,13 +3526,13 @@ export class QuintParser extends Parser { let _localctx: SimpleIdContext = new SimpleIdContext(this._ctx, this.state, context); this.enterRule(_localctx, 82, QuintParser.RULE_simpleId); try { - this.state = 794; + this.state = 796; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 87, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 790; + this.state = 792; this.identifier(); } break; @@ -3528,7 +3540,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 791; + this.state = 793; _localctx._qualId = this.qualId(); const err = quintErrorToString( @@ -3564,7 +3576,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 796; + this.state = 798; _la = this._input.LA(1); if (!(_la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID)) { this._errHandler.recoverInline(this); @@ -3616,47 +3628,47 @@ export class QuintParser extends Parser { private expr_sempred(_localctx: ExprContext, predIndex: number): boolean { switch (predIndex) { case 2: - return this.precpred(this._ctx, 26); + return this.precpred(this._ctx, 27); case 3: - return this.precpred(this._ctx, 24); + return this.precpred(this._ctx, 25); case 4: - return this.precpred(this._ctx, 23); + return this.precpred(this._ctx, 24); case 5: - return this.precpred(this._ctx, 22); + return this.precpred(this._ctx, 23); case 6: - return this.precpred(this._ctx, 20); + return this.precpred(this._ctx, 21); case 7: - return this.precpred(this._ctx, 18); + return this.precpred(this._ctx, 19); case 8: - return this.precpred(this._ctx, 16); + return this.precpred(this._ctx, 17); case 9: - return this.precpred(this._ctx, 15); + return this.precpred(this._ctx, 16); case 10: - return this.precpred(this._ctx, 14); + return this.precpred(this._ctx, 15); case 11: return this.precpred(this._ctx, 8); case 12: - return this.precpred(this._ctx, 30); + return this.precpred(this._ctx, 31); case 13: - return this.precpred(this._ctx, 27); + return this.precpred(this._ctx, 28); } return true; } private static readonly _serializedATNSegments: number = 2; private static readonly _serializedATNSegment0: string = - "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03H\u0321\x04\x02" + + "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03H\u0323\x04\x02" + "\t\x02\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06\x04\x07" + "\t\x07\x04\b\t\b\x04\t\t\t\x04\n\t\n\x04\v\t\v\x04\f\t\f\x04\r\t\r\x04" + "\x0E\t\x0E\x04\x0F\t\x0F\x04\x10\t\x10\x04\x11\t\x11\x04\x12\t\x12\x04" + @@ -3717,142 +3729,142 @@ export class QuintParser extends Parser { "\u0211\v\x18\x03\x18\x05\x18\u0214\n\x18\x03\x18\x03\x18\x03\x18\x03\x18" + "\x03\x18\x03\x18\x05\x18\u021C\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + "\x18\x03\x18\x07\x18\u0224\n\x18\f\x18\x0E\x18\u0227\v\x18\x03\x18\x05" + - "\x18\u022A\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18" + - "\u0232\n\x18\f\x18\x0E\x18\u0235\v\x18\x03\x18\x05\x18\u0238\n\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0240\n\x18\f\x18" + - "\x0E\x18\u0243\v\x18\x05\x18\u0245\n\x18\x03\x18\x05\x18\u0248\n\x18\x03" + + "\x18\u022A\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x07\x18\u0234\n\x18\f\x18\x0E\x18\u0237\v\x18\x03\x18\x05\x18" + + "\u023A\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0242" + + "\n\x18\f\x18\x0E\x18\u0245\v\x18\x05\x18\u0247\n\x18\x03\x18\x05\x18\u024A" + + "\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u0263\n\x18\x03" + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u0261\n\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18" + - "\u0288\n\x18\x03\x18\x05\x18\u028B\n\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x07\x18\u0292\n\x18\f\x18\x0E\x18\u0295\v\x18\x03\x19\x03\x19" + - "\x03\x19\x03\x19\x05\x19\u029B\n\x19\x03\x19\x03\x19\x03\x19\x07\x19\u02A0" + - "\n\x19\f\x19\x0E\x19\u02A3\v\x19\x03\x19\x03\x19\x03\x1A\x03\x1A\x05\x1A" + - "\u02A9\n\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x05" + - "\x1B\u02B2\n\x1B\x03\x1B\x05\x1B\u02B5\n\x1B\x03\x1C\x03\x1C\x03\x1C\x03" + - "\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x05\x1C\u02C0\n\x1C\x03\x1D" + - "\x03\x1D\x05\x1D\u02C4\n\x1D\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03" + - "\x1E\x03\x1E\x03\x1E\x07\x1E\u02CE\n\x1E\f\x1E\x0E\x1E\u02D1\v\x1E\x03" + - "\x1E\x03\x1E\x03\x1E\x03\x1E\x05\x1E\u02D7\n\x1E\x03\x1F\x03\x1F\x03\x1F" + - "\x03\x1F\x03\x1F\x06\x1F\u02DE\n\x1F\r\x1F\x0E\x1F\u02DF\x03\x1F\x03\x1F" + - "\x03\x1F\x03\x1F\x03\x1F\x03 \x03 \x05 \u02E9\n \x03!\x03!\x03\"\x03\"" + - "\x03\"\x03\"\x03#\x03#\x05#\u02F3\n#\x03$\x03$\x03$\x07$\u02F8\n$\f$\x0E" + - "$\u02FB\v$\x03%\x03%\x03%\x03%\x03%\x03%\x05%\u0303\n%\x03&\x03&\x05&" + - "\u0307\n&\x03\'\x03\'\x05\'\u030B\n\'\x03(\x03(\x03)\x03)\x03*\x03*\x03" + - "*\x07*\u0314\n*\f*\x0E*\u0317\v*\x03+\x03+\x03+\x03+\x05+\u031D\n+\x03" + - ",\x03,\x03,\x02\x02\x04&.-\x02\x02\x04\x02\x06\x02\b\x02\n\x02\f\x02\x0E" + - "\x02\x10\x02\x12\x02\x14\x02\x16\x02\x18\x02\x1A\x02\x1C\x02\x1E\x02 " + - "\x02\"\x02$\x02&\x02(\x02*\x02,\x02.\x020\x022\x024\x026\x028\x02:\x02" + - "<\x02>\x02@\x02B\x02D\x02F\x02H\x02J\x02L\x02N\x02P\x02R\x02T\x02V\x02" + - "\x02\n\x03\x0257\x03\x0234\x03\x028=\x04\x02-1AB\x03\x02-0\x05\x02!!-" + - "03=\x03\x02*,\x03\x02CD\x02\u0382\x02Y\x03\x02\x02\x02\x04b\x03\x02\x02" + - "\x02\x06s\x03\x02\x02\x02\b\x8C\x03\x02\x02\x02\n\xBE\x03\x02\x02\x02" + - "\f\xCC\x03\x02\x02\x02\x0E\xCE\x03\x02\x02\x02\x10\xDC\x03\x02\x02\x02" + - "\x12\xE6\x03\x02\x02\x02\x14\xED\x03\x02\x02\x02\x16\u0101\x03\x02\x02" + - "\x02\x18\u0115\x03\x02\x02\x02\x1A\u0122\x03\x02\x02\x02\x1C\u0152\x03" + - "\x02\x02\x02\x1E\u0154\x03\x02\x02\x02 \u0156\x03\x02\x02\x02\"\u0158" + - "\x03\x02\x02\x02$\u015A\x03\x02\x02\x02&\u01A2\x03\x02\x02\x02(\u01AF" + - "\x03\x02\x02\x02*\u01C6\x03\x02\x02\x02,\u01C8\x03\x02\x02\x02.\u0260" + - "\x03\x02\x02\x020\u0296\x03\x02\x02\x022\u02A8\x03\x02\x02\x024\u02AD" + - "\x03\x02\x02\x026\u02BF\x03\x02\x02\x028\u02C3\x03\x02\x02\x02:\u02D6" + - "\x03\x02\x02\x02<\u02D8\x03\x02\x02\x02>\u02E8\x03\x02\x02\x02@\u02EA" + - "\x03\x02\x02\x02B\u02EC\x03\x02\x02\x02D\u02F2\x03\x02\x02\x02F\u02F4" + - "\x03\x02\x02\x02H\u0302\x03\x02\x02\x02J\u0306\x03\x02\x02\x02L\u030A" + - "\x03\x02\x02\x02N\u030C\x03\x02\x02\x02P\u030E\x03\x02\x02\x02R\u0310" + - "\x03\x02\x02\x02T\u031C\x03\x02\x02\x02V\u031E\x03\x02\x02\x02XZ\x05\x04" + - "\x03\x02YX\x03\x02\x02\x02Z[\x03\x02\x02\x02[Y\x03\x02\x02\x02[\\\x03" + - "\x02\x02\x02\\]\x03\x02\x02\x02]^\x07\x02\x02\x03^\x03\x03\x02\x02\x02" + - "_a\x07E\x02\x02`_\x03\x02\x02\x02ad\x03\x02\x02\x02b`\x03\x02\x02\x02" + - "bc\x03\x02\x02\x02ce\x03\x02\x02\x02db\x03\x02\x02\x02ef\x07\x03\x02\x02" + - "fg\x05R*\x02gk\x07\x04\x02\x02hj\x05\x06\x04\x02ih\x03\x02\x02\x02jm\x03" + - "\x02\x02\x02ki\x03\x02\x02\x02kl\x03\x02\x02\x02ln\x03\x02\x02\x02mk\x03" + - "\x02\x02\x02no\x07\x05\x02\x02o\x05\x03\x02\x02\x02pr\x07E\x02\x02qp\x03" + - "\x02\x02\x02ru\x03\x02\x02\x02sq\x03\x02\x02\x02st\x03\x02\x02\x02tv\x03" + - "\x02\x02\x02us\x03\x02\x02\x02vw\x05\b\x05\x02w\x07\x03\x02\x02\x02xy" + - "\x07\x06\x02\x02yz\x05R*\x02z{\x07\x07\x02\x02{|\x05&\x14\x02|\x8D\x03" + - "\x02\x02\x02}~\x07\b\x02\x02~\x7F\x05R*\x02\x7F\x80\x07\x07\x02\x02\x80" + - "\x81\x05&\x14\x02\x81\x8D\x03\x02\x02\x02\x82\x83\x07\t\x02\x02\x83\x84" + - "\x05> \x02\x84\x85\x07>\x02\x02\x85\x86\x05.\x18\x02\x86\x8D\x03\x02\x02" + - "\x02\x87\x8D\x05\x1C\x0F\x02\x88\x8D\x05\n\x06\x02\x89\x8D\x05\f\x07\x02" + - "\x8A\x8D\x05\x18\r\x02\x8B\x8D\x05\x1A\x0E\x02\x8Cx\x03\x02\x02\x02\x8C" + - "}\x03\x02\x02\x02\x8C\x82\x03\x02\x02\x02\x8C\x87\x03\x02\x02\x02\x8C" + - "\x88\x03\x02\x02\x02\x8C\x89\x03\x02\x02\x02\x8C\x8A\x03\x02\x02\x02\x8C" + - "\x8B\x03\x02\x02\x02\x8D\t\x03\x02\x02\x02\x8E\x8F\x05\x16\f\x02\x8F\x90" + - "\x05J&\x02\x90\x91\x07?\x02\x02\x91\x96\x05B\"\x02\x92\x93\x07\n\x02\x02" + - "\x93\x95\x05B\"\x02\x94\x92\x03\x02\x02\x02\x95\x98\x03\x02\x02\x02\x96" + - "\x94\x03\x02\x02\x02\x96\x97\x03\x02\x02\x02\x97\x99\x03\x02\x02\x02\x98" + - "\x96\x03\x02\x02\x02\x99\x9A\x07@\x02\x02\x9A\x9B\x07\x07\x02\x02\x9B" + - "\x9E\x05&\x14\x02\x9C\x9D\x07>\x02\x02\x9D\x9F\x05.\x18\x02\x9E\x9C\x03" + - "\x02\x02\x02\x9E\x9F\x03\x02\x02\x02\x9F\xA1\x03\x02\x02\x02\xA0\xA2\x07" + - "\v\x02\x02\xA1\xA0\x03\x02\x02\x02\xA1\xA2\x03\x02\x02\x02\xA2\xBF\x03" + - "\x02\x02\x02\xA3\xA4\x05\x16\f\x02\xA4\xB1\x05J&\x02\xA5\xAE\x07?\x02" + - "\x02\xA6\xAB\x05@!\x02\xA7\xA8\x07\n\x02\x02\xA8\xAA\x05@!\x02\xA9\xA7" + - "\x03\x02\x02\x02\xAA\xAD\x03\x02\x02\x02\xAB\xA9\x03\x02\x02\x02\xAB\xAC" + - "\x03\x02\x02\x02\xAC\xAF\x03\x02\x02\x02\xAD\xAB\x03\x02\x02\x02\xAE\xA6" + - "\x03\x02\x02\x02\xAE\xAF\x03\x02\x02\x02\xAF\xB0\x03\x02\x02\x02\xB0\xB2" + - "\x07@\x02\x02\xB1\xA5\x03\x02\x02\x02\xB1\xB2\x03\x02\x02\x02\xB2\xB5" + - "\x03\x02\x02\x02\xB3\xB4\x07\x07\x02\x02\xB4\xB6\x05&\x14\x02\xB5\xB3" + - "\x03\x02\x02\x02\xB5\xB6\x03\x02\x02\x02\xB6\xB9\x03\x02\x02\x02\xB7\xB8" + - "\x07>\x02\x02\xB8\xBA\x05.\x18\x02\xB9\xB7\x03\x02\x02\x02\xB9\xBA\x03" + - "\x02\x02\x02\xBA\xBC\x03\x02\x02\x02\xBB\xBD\x07\v\x02\x02\xBC\xBB\x03" + - "\x02\x02\x02\xBC\xBD\x03\x02\x02\x02\xBD\xBF\x03\x02\x02\x02\xBE\x8E\x03" + - "\x02\x02\x02\xBE\xA3\x03\x02\x02\x02\xBF\v\x03\x02\x02\x02\xC0\xC1\x07" + - "\f\x02\x02\xC1\xCD\x05R*\x02\xC2\xC3\x07\f\x02\x02\xC3\xC4\x05\x0E\b\x02" + - "\xC4\xC5\x07>\x02\x02\xC5\xC6\x05&\x14\x02\xC6\xCD\x03\x02\x02\x02\xC7" + - "\xC8\x07\f\x02\x02\xC8\xC9\x05\x0E\b\x02\xC9\xCA\x07>\x02\x02\xCA\xCB" + - "\x05\x10\t\x02\xCB\xCD\x03\x02\x02\x02\xCC\xC0\x03\x02\x02\x02\xCC\xC2" + - "\x03\x02\x02\x02\xCC\xC7\x03\x02\x02\x02\xCD\r\x03\x02\x02\x02\xCE\xD9" + - "\x05R*\x02\xCF\xD0\x07\r\x02\x02\xD0\xD5\x07C\x02\x02\xD1\xD2\x07\n\x02" + - "\x02\xD2\xD4\x07C\x02\x02\xD3\xD1\x03\x02\x02\x02\xD4\xD7\x03\x02\x02" + - "\x02\xD5\xD3\x03\x02\x02\x02\xD5\xD6\x03\x02\x02\x02\xD6\xD8\x03\x02\x02" + - "\x02\xD7\xD5\x03\x02\x02\x02\xD8\xDA\x07\x0E\x02\x02\xD9\xCF\x03\x02\x02" + - "\x02\xD9\xDA\x03\x02\x02\x02\xDA\x0F\x03\x02\x02\x02\xDB\xDD\x07\x0F\x02" + - "\x02\xDC\xDB\x03\x02\x02\x02\xDC\xDD\x03\x02\x02\x02\xDD\xDE\x03\x02\x02" + - "\x02\xDE\xE3\x05\x12\n\x02\xDF\xE0\x07\x0F\x02\x02\xE0\xE2\x05\x12\n\x02" + - "\xE1\xDF\x03\x02\x02\x02\xE2\xE5\x03\x02\x02\x02\xE3\xE1\x03\x02\x02\x02" + - "\xE3\xE4\x03\x02\x02\x02\xE4\x11\x03\x02\x02\x02\xE5\xE3\x03\x02\x02\x02" + - "\xE6\xEB\x05T+\x02\xE7\xE8\x07?\x02\x02\xE8\xE9\x05&\x14\x02\xE9\xEA\x07" + - "@\x02\x02\xEA\xEC\x03\x02\x02\x02\xEB\xE7\x03\x02\x02\x02\xEB\xEC\x03" + - "\x02\x02\x02\xEC\x13\x03\x02\x02\x02\xED\xEE\x07\x10\x02\x02\xEE\xF1\x05" + - "R*\x02\xEF\xF0\x07\x07\x02\x02\xF0\xF2\x05&\x14\x02\xF1\xEF\x03\x02\x02" + - "\x02\xF1\xF2\x03\x02\x02\x02\xF2\xF3\x03\x02\x02\x02\xF3\xF4\x07>\x02" + - "\x02\xF4\xF6\x05.\x18\x02\xF5\xF7\x07\v\x02\x02\xF6\xF5\x03\x02\x02\x02" + - "\xF6\xF7\x03\x02\x02\x02\xF7\x15\x03\x02\x02\x02\xF8\u0102\x07\x11\x02" + - "\x02\xF9\u0102\x07\x12\x02\x02\xFA\xFB\x07\x13\x02\x02\xFB\u0102\x07\x11" + - "\x02\x02\xFC\xFD\x07\x13\x02\x02\xFD\u0102\x07\x12\x02\x02\xFE\u0102\x07" + - "\x14\x02\x02\xFF\u0102\x07\x15\x02\x02\u0100\u0102\x07\x16\x02\x02\u0101" + - "\xF8\x03\x02\x02\x02\u0101\xF9\x03\x02\x02\x02\u0101\xFA\x03\x02\x02\x02" + - "\u0101\xFC\x03\x02\x02\x02\u0101\xFE\x03\x02\x02\x02\u0101\xFF\x03\x02" + - "\x02\x02\u0101\u0100\x03\x02\x02\x02\u0102\x17\x03\x02\x02\x02\u0103\u0104" + - "\x07\x17\x02\x02\u0104\u0105\x05 \x11\x02\u0105\u0106\x07\x18\x02\x02" + - "\u0106\u0109\x05D#\x02\u0107\u0108\x07\x19\x02\x02\u0108\u010A\x05$\x13" + - "\x02\u0109\u0107\x03\x02\x02\x02\u0109\u010A\x03\x02\x02\x02\u010A\u0116" + - "\x03\x02\x02\x02\u010B\u010C\x07\x17\x02\x02\u010C\u010F\x05 \x11\x02" + - "\u010D\u010E\x07\x1A\x02\x02\u010E\u0110\x05 \x11\x02\u010F\u010D\x03" + - "\x02\x02\x02\u010F\u0110\x03\x02\x02\x02\u0110\u0113\x03\x02\x02\x02\u0111" + - "\u0112\x07\x19\x02\x02\u0112\u0114\x05$\x13\x02\u0113\u0111\x03\x02\x02" + - "\x02\u0113\u0114\x03\x02\x02\x02\u0114\u0116\x03\x02\x02\x02\u0115\u0103" + - "\x03\x02\x02\x02\u0115\u010B\x03\x02\x02\x02\u0116\x19\x03\x02\x02\x02" + - "\u0117\u0118\x07\x1B\x02\x02\u0118\u0119\x05 \x11\x02\u0119\u011A\x07" + - "\x18\x02\x02\u011A\u011B\x05D#\x02\u011B\u0123\x03\x02\x02\x02\u011C\u011D" + - "\x07\x1B\x02\x02\u011D\u0120\x05 \x11\x02\u011E\u011F\x07\x1A\x02\x02" + - "\u011F\u0121\x05 \x11\x02\u0120\u011E\x03\x02\x02\x02\u0120\u0121\x03" + - "\x02\x02\x02\u0121\u0123\x03\x02\x02\x02\u0122\u0117\x03\x02\x02\x02\u0122" + - "\u011C\x03\x02\x02\x02\u0123\x1B\x03\x02\x02\x02\u0124\u0125\x07\x17\x02" + - "\x02\u0125\u0126\x05\x1E\x10\x02\u0126\u0127\x07?\x02\x02\u0127\u0128" + - "\x05 \x11\x02\u0128\u0129\x07>\x02\x02\u0129\u0131\x05.\x18\x02\u012A" + - "\u012B\x07\n\x02\x02\u012B\u012C\x05 \x11\x02\u012C\u012D\x07>\x02\x02" + - "\u012D\u012E\x05.\x18\x02\u012E\u0130\x03\x02\x02\x02\u012F\u012A\x03" + - "\x02\x02\x02\u0130\u0133\x03\x02\x02\x02\u0131\u012F\x03\x02\x02\x02\u0131" + - "\u0132\x03\x02\x02\x02\u0132\u0134\x03\x02\x02\x02\u0133\u0131\x03\x02" + - "\x02\x02\u0134\u0135\x07@\x02\x02\u0135\u0136\x07\x18\x02\x02\u0136\u0139" + - "\x075\x02\x02\u0137\u0138\x07\x19\x02\x02\u0138\u013A\x05$\x13\x02\u0139" + - "\u0137\x03\x02\x02\x02\u0139\u013A\x03\x02\x02\x02\u013A\u0153\x03\x02" + - "\x02\x02\u013B\u013C\x07\x17\x02\x02\u013C\u013D\x05\x1E\x10\x02\u013D" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x05\x18\u028A\n\x18\x03\x18\x05\x18\u028D\n\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x07\x18\u0294\n\x18\f\x18\x0E\x18\u0297\v\x18\x03" + + "\x19\x03\x19\x03\x19\x03\x19\x05\x19\u029D\n\x19\x03\x19\x03\x19\x03\x19" + + "\x07\x19\u02A2\n\x19\f\x19\x0E\x19\u02A5\v\x19\x03\x19\x03\x19\x03\x1A" + + "\x03\x1A\x05\x1A\u02AB\n\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1B\x03\x1B\x03" + + "\x1B\x03\x1B\x05\x1B\u02B4\n\x1B\x03\x1B\x05\x1B\u02B7\n\x1B\x03\x1C\x03" + + "\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x05\x1C\u02C2" + + "\n\x1C\x03\x1D\x03\x1D\x05\x1D\u02C6\n\x1D\x03\x1E\x03\x1E\x03\x1E\x03" + + "\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x07\x1E\u02D0\n\x1E\f\x1E\x0E\x1E" + + "\u02D3\v\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x05\x1E\u02D9\n\x1E\x03\x1F" + + "\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x06\x1F\u02E0\n\x1F\r\x1F\x0E\x1F\u02E1" + + "\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03 \x03 \x05 \u02EB\n \x03!" + + "\x03!\x03\"\x03\"\x03\"\x03\"\x03#\x03#\x05#\u02F5\n#\x03$\x03$\x03$\x07" + + "$\u02FA\n$\f$\x0E$\u02FD\v$\x03%\x03%\x03%\x03%\x03%\x03%\x05%\u0305\n" + + "%\x03&\x03&\x05&\u0309\n&\x03\'\x03\'\x05\'\u030D\n\'\x03(\x03(\x03)\x03" + + ")\x03*\x03*\x03*\x07*\u0316\n*\f*\x0E*\u0319\v*\x03+\x03+\x03+\x03+\x05" + + "+\u031F\n+\x03,\x03,\x03,\x02\x02\x04&.-\x02\x02\x04\x02\x06\x02\b\x02" + + "\n\x02\f\x02\x0E\x02\x10\x02\x12\x02\x14\x02\x16\x02\x18\x02\x1A\x02\x1C" + + "\x02\x1E\x02 \x02\"\x02$\x02&\x02(\x02*\x02,\x02.\x020\x022\x024\x026" + + "\x028\x02:\x02<\x02>\x02@\x02B\x02D\x02F\x02H\x02J\x02L\x02N\x02P\x02" + + "R\x02T\x02V\x02\x02\n\x03\x0257\x03\x0234\x03\x028=\x04\x02-1AB\x03\x02" + + "-0\x05\x02!!-03=\x03\x02*,\x03\x02CD\x02\u0385\x02Y\x03\x02\x02\x02\x04" + + "b\x03\x02\x02\x02\x06s\x03\x02\x02\x02\b\x8C\x03\x02\x02\x02\n\xBE\x03" + + "\x02\x02\x02\f\xCC\x03\x02\x02\x02\x0E\xCE\x03\x02\x02\x02\x10\xDC\x03" + + "\x02\x02\x02\x12\xE6\x03\x02\x02\x02\x14\xED\x03\x02\x02\x02\x16\u0101" + + "\x03\x02\x02\x02\x18\u0115\x03\x02\x02\x02\x1A\u0122\x03\x02\x02\x02\x1C" + + "\u0152\x03\x02\x02\x02\x1E\u0154\x03\x02\x02\x02 \u0156\x03\x02\x02\x02" + + "\"\u0158\x03\x02\x02\x02$\u015A\x03\x02\x02\x02&\u01A2\x03\x02\x02\x02" + + "(\u01AF\x03\x02\x02\x02*\u01C6\x03\x02\x02\x02,\u01C8\x03\x02\x02\x02" + + ".\u0262\x03\x02\x02\x020\u0298\x03\x02\x02\x022\u02AA\x03\x02\x02\x02" + + "4\u02AF\x03\x02\x02\x026\u02C1\x03\x02\x02\x028\u02C5\x03\x02\x02\x02" + + ":\u02D8\x03\x02\x02\x02<\u02DA\x03\x02\x02\x02>\u02EA\x03\x02\x02\x02" + + "@\u02EC\x03\x02\x02\x02B\u02EE\x03\x02\x02\x02D\u02F4\x03\x02\x02\x02" + + "F\u02F6\x03\x02\x02\x02H\u0304\x03\x02\x02\x02J\u0308\x03\x02\x02\x02" + + "L\u030C\x03\x02\x02\x02N\u030E\x03\x02\x02\x02P\u0310\x03\x02\x02\x02" + + "R\u0312\x03\x02\x02\x02T\u031E\x03\x02\x02\x02V\u0320\x03\x02\x02\x02" + + "XZ\x05\x04\x03\x02YX\x03\x02\x02\x02Z[\x03\x02\x02\x02[Y\x03\x02\x02\x02" + + "[\\\x03\x02\x02\x02\\]\x03\x02\x02\x02]^\x07\x02\x02\x03^\x03\x03\x02" + + "\x02\x02_a\x07E\x02\x02`_\x03\x02\x02\x02ad\x03\x02\x02\x02b`\x03\x02" + + "\x02\x02bc\x03\x02\x02\x02ce\x03\x02\x02\x02db\x03\x02\x02\x02ef\x07\x03" + + "\x02\x02fg\x05R*\x02gk\x07\x04\x02\x02hj\x05\x06\x04\x02ih\x03\x02\x02" + + "\x02jm\x03\x02\x02\x02ki\x03\x02\x02\x02kl\x03\x02\x02\x02ln\x03\x02\x02" + + "\x02mk\x03\x02\x02\x02no\x07\x05\x02\x02o\x05\x03\x02\x02\x02pr\x07E\x02" + + "\x02qp\x03\x02\x02\x02ru\x03\x02\x02\x02sq\x03\x02\x02\x02st\x03\x02\x02" + + "\x02tv\x03\x02\x02\x02us\x03\x02\x02\x02vw\x05\b\x05\x02w\x07\x03\x02" + + "\x02\x02xy\x07\x06\x02\x02yz\x05R*\x02z{\x07\x07\x02\x02{|\x05&\x14\x02" + + "|\x8D\x03\x02\x02\x02}~\x07\b\x02\x02~\x7F\x05R*\x02\x7F\x80\x07\x07\x02" + + "\x02\x80\x81\x05&\x14\x02\x81\x8D\x03\x02\x02\x02\x82\x83\x07\t\x02\x02" + + "\x83\x84\x05> \x02\x84\x85\x07>\x02\x02\x85\x86\x05.\x18\x02\x86\x8D\x03" + + "\x02\x02\x02\x87\x8D\x05\x1C\x0F\x02\x88\x8D\x05\n\x06\x02\x89\x8D\x05" + + "\f\x07\x02\x8A\x8D\x05\x18\r\x02\x8B\x8D\x05\x1A\x0E\x02\x8Cx\x03\x02" + + "\x02\x02\x8C}\x03\x02\x02\x02\x8C\x82\x03\x02\x02\x02\x8C\x87\x03\x02" + + "\x02\x02\x8C\x88\x03\x02\x02\x02\x8C\x89\x03\x02\x02\x02\x8C\x8A\x03\x02" + + "\x02\x02\x8C\x8B\x03\x02\x02\x02\x8D\t\x03\x02\x02\x02\x8E\x8F\x05\x16" + + "\f\x02\x8F\x90\x05J&\x02\x90\x91\x07?\x02\x02\x91\x96\x05B\"\x02\x92\x93" + + "\x07\n\x02\x02\x93\x95\x05B\"\x02\x94\x92\x03\x02\x02\x02\x95\x98\x03" + + "\x02\x02\x02\x96\x94\x03\x02\x02\x02\x96\x97\x03\x02\x02\x02\x97\x99\x03" + + "\x02\x02\x02\x98\x96\x03\x02\x02\x02\x99\x9A\x07@\x02\x02\x9A\x9B\x07" + + "\x07\x02\x02\x9B\x9E\x05&\x14\x02\x9C\x9D\x07>\x02\x02\x9D\x9F\x05.\x18" + + "\x02\x9E\x9C\x03\x02\x02\x02\x9E\x9F\x03\x02\x02\x02\x9F\xA1\x03\x02\x02" + + "\x02\xA0\xA2\x07\v\x02\x02\xA1\xA0\x03\x02\x02\x02\xA1\xA2\x03\x02\x02" + + "\x02\xA2\xBF\x03\x02\x02\x02\xA3\xA4\x05\x16\f\x02\xA4\xB1\x05J&\x02\xA5" + + "\xAE\x07?\x02\x02\xA6\xAB\x05@!\x02\xA7\xA8\x07\n\x02\x02\xA8\xAA\x05" + + "@!\x02\xA9\xA7\x03\x02\x02\x02\xAA\xAD\x03\x02\x02\x02\xAB\xA9\x03\x02" + + "\x02\x02\xAB\xAC\x03\x02\x02\x02\xAC\xAF\x03\x02\x02\x02\xAD\xAB\x03\x02" + + "\x02\x02\xAE\xA6\x03\x02\x02\x02\xAE\xAF\x03\x02\x02\x02\xAF\xB0\x03\x02" + + "\x02\x02\xB0\xB2\x07@\x02\x02\xB1\xA5\x03\x02\x02\x02\xB1\xB2\x03\x02" + + "\x02\x02\xB2\xB5\x03\x02\x02\x02\xB3\xB4\x07\x07\x02\x02\xB4\xB6\x05&" + + "\x14\x02\xB5\xB3\x03\x02\x02\x02\xB5\xB6\x03\x02\x02\x02\xB6\xB9\x03\x02" + + "\x02\x02\xB7\xB8\x07>\x02\x02\xB8\xBA\x05.\x18\x02\xB9\xB7\x03\x02\x02" + + "\x02\xB9\xBA\x03\x02\x02\x02\xBA\xBC\x03\x02\x02\x02\xBB\xBD\x07\v\x02" + + "\x02\xBC\xBB\x03\x02\x02\x02\xBC\xBD\x03\x02\x02\x02\xBD\xBF\x03\x02\x02" + + "\x02\xBE\x8E\x03\x02\x02\x02\xBE\xA3\x03\x02\x02\x02\xBF\v\x03\x02\x02" + + "\x02\xC0\xC1\x07\f\x02\x02\xC1\xCD\x05R*\x02\xC2\xC3\x07\f\x02\x02\xC3" + + "\xC4\x05\x0E\b\x02\xC4\xC5\x07>\x02\x02\xC5\xC6\x05&\x14\x02\xC6\xCD\x03" + + "\x02\x02\x02\xC7\xC8\x07\f\x02\x02\xC8\xC9\x05\x0E\b\x02\xC9\xCA\x07>" + + "\x02\x02\xCA\xCB\x05\x10\t\x02\xCB\xCD\x03\x02\x02\x02\xCC\xC0\x03\x02" + + "\x02\x02\xCC\xC2\x03\x02\x02\x02\xCC\xC7\x03\x02\x02\x02\xCD\r\x03\x02" + + "\x02\x02\xCE\xD9\x05R*\x02\xCF\xD0\x07\r\x02\x02\xD0\xD5\x07C\x02\x02" + + "\xD1\xD2\x07\n\x02\x02\xD2\xD4\x07C\x02\x02\xD3\xD1\x03\x02\x02\x02\xD4" + + "\xD7\x03\x02\x02\x02\xD5\xD3\x03\x02\x02\x02\xD5\xD6\x03\x02\x02\x02\xD6" + + "\xD8\x03\x02\x02\x02\xD7\xD5\x03\x02\x02\x02\xD8\xDA\x07\x0E\x02\x02\xD9" + + "\xCF\x03\x02\x02\x02\xD9\xDA\x03\x02\x02\x02\xDA\x0F\x03\x02\x02\x02\xDB" + + "\xDD\x07\x0F\x02\x02\xDC\xDB\x03\x02\x02\x02\xDC\xDD\x03\x02\x02\x02\xDD" + + "\xDE\x03\x02\x02\x02\xDE\xE3\x05\x12\n\x02\xDF\xE0\x07\x0F\x02\x02\xE0" + + "\xE2\x05\x12\n\x02\xE1\xDF\x03\x02\x02\x02\xE2\xE5\x03\x02\x02\x02\xE3" + + "\xE1\x03\x02\x02\x02\xE3\xE4\x03\x02\x02\x02\xE4\x11\x03\x02\x02\x02\xE5" + + "\xE3\x03\x02\x02\x02\xE6\xEB\x05T+\x02\xE7\xE8\x07?\x02\x02\xE8\xE9\x05" + + "&\x14\x02\xE9\xEA\x07@\x02\x02\xEA\xEC\x03\x02\x02\x02\xEB\xE7\x03\x02" + + "\x02\x02\xEB\xEC\x03\x02\x02\x02\xEC\x13\x03\x02\x02\x02\xED\xEE\x07\x10" + + "\x02\x02\xEE\xF1\x05R*\x02\xEF\xF0\x07\x07\x02\x02\xF0\xF2\x05&\x14\x02" + + "\xF1\xEF\x03\x02\x02\x02\xF1\xF2\x03\x02\x02\x02\xF2\xF3\x03\x02\x02\x02" + + "\xF3\xF4\x07>\x02\x02\xF4\xF6\x05.\x18\x02\xF5\xF7\x07\v\x02\x02\xF6\xF5" + + "\x03\x02\x02\x02\xF6\xF7\x03\x02\x02\x02\xF7\x15\x03\x02\x02\x02\xF8\u0102" + + "\x07\x11\x02\x02\xF9\u0102\x07\x12\x02\x02\xFA\xFB\x07\x13\x02\x02\xFB" + + "\u0102\x07\x11\x02\x02\xFC\xFD\x07\x13\x02\x02\xFD\u0102\x07\x12\x02\x02" + + "\xFE\u0102\x07\x14\x02\x02\xFF\u0102\x07\x15\x02\x02\u0100\u0102\x07\x16" + + "\x02\x02\u0101\xF8\x03\x02\x02\x02\u0101\xF9\x03\x02\x02\x02\u0101\xFA" + + "\x03\x02\x02\x02\u0101\xFC\x03\x02\x02\x02\u0101\xFE\x03\x02\x02\x02\u0101" + + "\xFF\x03\x02\x02\x02\u0101\u0100\x03\x02\x02\x02\u0102\x17\x03\x02\x02" + + "\x02\u0103\u0104\x07\x17\x02\x02\u0104\u0105\x05 \x11\x02\u0105\u0106" + + "\x07\x18\x02\x02\u0106\u0109\x05D#\x02\u0107\u0108\x07\x19\x02\x02\u0108" + + "\u010A\x05$\x13\x02\u0109\u0107\x03\x02\x02\x02\u0109\u010A\x03\x02\x02" + + "\x02\u010A\u0116\x03\x02\x02\x02\u010B\u010C\x07\x17\x02\x02\u010C\u010F" + + "\x05 \x11\x02\u010D\u010E\x07\x1A\x02\x02\u010E\u0110\x05 \x11\x02\u010F" + + "\u010D\x03\x02\x02\x02\u010F\u0110\x03\x02\x02\x02\u0110\u0113\x03\x02" + + "\x02\x02\u0111\u0112\x07\x19\x02\x02\u0112\u0114\x05$\x13\x02\u0113\u0111" + + "\x03\x02\x02\x02\u0113\u0114\x03\x02\x02\x02\u0114\u0116\x03\x02\x02\x02" + + "\u0115\u0103\x03\x02\x02\x02\u0115\u010B\x03\x02\x02\x02\u0116\x19\x03" + + "\x02\x02\x02\u0117\u0118\x07\x1B\x02\x02\u0118\u0119\x05 \x11\x02\u0119" + + "\u011A\x07\x18\x02\x02\u011A\u011B\x05D#\x02\u011B\u0123\x03\x02\x02\x02" + + "\u011C\u011D\x07\x1B\x02\x02\u011D\u0120\x05 \x11\x02\u011E\u011F\x07" + + "\x1A\x02\x02\u011F\u0121\x05 \x11\x02\u0120\u011E\x03\x02\x02\x02\u0120" + + "\u0121\x03\x02\x02\x02\u0121\u0123\x03\x02\x02\x02\u0122\u0117\x03\x02" + + "\x02\x02\u0122\u011C\x03\x02\x02\x02\u0123\x1B\x03\x02\x02\x02\u0124\u0125" + + "\x07\x17\x02\x02\u0125\u0126\x05\x1E\x10\x02\u0126\u0127\x07?\x02\x02" + + "\u0127\u0128\x05 \x11\x02\u0128\u0129\x07>\x02\x02\u0129\u0131\x05.\x18" + + "\x02\u012A\u012B\x07\n\x02\x02\u012B\u012C\x05 \x11\x02\u012C\u012D\x07" + + ">\x02\x02\u012D\u012E\x05.\x18\x02\u012E\u0130\x03\x02\x02\x02\u012F\u012A" + + "\x03\x02\x02\x02\u0130\u0133\x03\x02\x02\x02\u0131\u012F\x03\x02\x02\x02" + + "\u0131\u0132\x03\x02\x02\x02\u0132\u0134\x03\x02\x02\x02\u0133\u0131\x03" + + "\x02\x02\x02\u0134\u0135\x07@\x02\x02\u0135\u0136\x07\x18\x02\x02\u0136" + + "\u0139\x075\x02\x02\u0137\u0138\x07\x19\x02\x02\u0138\u013A\x05$\x13\x02" + + "\u0139\u0137\x03\x02\x02\x02\u0139\u013A\x03\x02\x02\x02\u013A\u0153\x03" + + "\x02\x02\x02\u013B\u013C\x07\x17\x02\x02\u013C\u013D\x05\x1E\x10\x02\u013D" + "\u013E\x07?\x02\x02\u013E\u013F\x05 \x11\x02\u013F\u0140\x07>\x02\x02" + "\u0140\u0148\x05.\x18\x02\u0141\u0142\x07\n\x02\x02\u0142\u0143\x05 \x11" + "\x02\u0143\u0144\x07>\x02\x02\u0144\u0145\x05.\x18\x02\u0145\u0147\x03" + @@ -3916,168 +3928,169 @@ export class QuintParser extends Parser { "\u01C7\x03\x02\x02\x02\u01C4\u01C5\x07\x0F\x02\x02\u01C5\u01C7\x05V,\x02" + "\u01C6\u01B1\x03\x02\x02\x02\u01C6\u01C4\x03\x02\x02\x02\u01C7+\x03\x02" + "\x02\x02\u01C8\u01C9\x05T+\x02\u01C9-\x03\x02\x02\x02\u01CA\u01CB\b\x18" + - "\x01\x02\u01CB\u0261\x058\x1D\x02\u01CC\u01CD\x05J&\x02\u01CD\u01CF\x07" + + "\x01\x02\u01CB\u0263\x058\x1D\x02\u01CC\u01CD\x05J&\x02\u01CD\u01CF\x07" + "?\x02\x02\u01CE\u01D0\x05F$\x02\u01CF\u01CE\x03\x02\x02\x02\u01CF\u01D0" + "\x03\x02\x02\x02\u01D0\u01D1\x03\x02\x02\x02\u01D1\u01D2\x07@\x02\x02" + - "\u01D2\u0261\x03\x02\x02\x02\u01D3\u01D4\x074\x02\x02\u01D4\u0261\x05" + - ".\x18\x1B\u01D5\u01D6\x05R*\x02\u01D6\u01D7\x07\"\x02\x02\u01D7\u01D8" + - "\x07>\x02\x02\u01D8\u01D9\x05.\x18\x17\u01D9\u0261\x03\x02\x02\x02\u01DA" + + "\u01D2\u0263\x03\x02\x02\x02\u01D3\u01D4\x074\x02\x02\u01D4\u0263\x05" + + ".\x18\x1C\u01D5\u01D6\x05R*\x02\u01D6\u01D7\x07\"\x02\x02\u01D7\u01D8" + + "\x07>\x02\x02\u01D8\u01D9\x05.\x18\x18\u01D9\u0263\x03\x02\x02\x02\u01DA" + "\u01DB\x07-\x02\x02\u01DB\u01DC\x07\x04\x02\x02\u01DC\u01E1\x05.\x18\x02" + "\u01DD\u01DE\x07\n\x02\x02\u01DE\u01E0\x05.\x18\x02\u01DF\u01DD\x03\x02" + "\x02\x02\u01E0\u01E3\x03\x02\x02\x02\u01E1\u01DF\x03\x02\x02\x02\u01E1" + "\u01E2\x03\x02\x02\x02\u01E2\u01E5\x03\x02\x02\x02\u01E3\u01E1\x03\x02" + "\x02\x02\u01E4\u01E6\x07\n\x02\x02\u01E5\u01E4\x03\x02\x02\x02\u01E5\u01E6" + "\x03\x02\x02\x02\u01E6\u01E7\x03\x02\x02\x02\u01E7\u01E8\x07\x05\x02\x02" + - "\u01E8\u0261\x03\x02\x02\x02\u01E9\u01EA\x07.\x02\x02\u01EA\u01EB\x07" + + "\u01E8\u0263\x03\x02\x02\x02\u01E9\u01EA\x07.\x02\x02\u01EA\u01EB\x07" + "\x04\x02\x02\u01EB\u01F0\x05.\x18\x02\u01EC\u01ED\x07\n\x02\x02\u01ED" + - "\u01EF\x05.\x18\x02\u01EE\u01EC\x03\x02"; + "\u01EF\x05.\x18\x02"; private static readonly _serializedATNSegment1: string = - "\x02\x02\u01EF\u01F2\x03\x02\x02\x02\u01F0\u01EE\x03\x02\x02\x02\u01F0" + - "\u01F1\x03\x02\x02\x02\u01F1\u01F4\x03\x02\x02\x02\u01F2\u01F0\x03\x02" + - "\x02\x02\u01F3\u01F5\x07\n\x02\x02\u01F4\u01F3\x03\x02\x02\x02\u01F4\u01F5" + - "\x03\x02\x02\x02\u01F5\u01F6\x03\x02\x02\x02\u01F6\u01F7\x07\x05\x02\x02" + - "\u01F7\u0261\x03\x02\x02\x02\u01F8\u0261\x050\x19\x02\u01F9\u01FA\x07" + - "#\x02\x02\u01FA\u01FB\x07\x04\x02\x02\u01FB\u0200\x05.\x18\x02\u01FC\u01FD" + - "\x07\n\x02\x02\u01FD\u01FF\x05.\x18\x02\u01FE\u01FC\x03\x02\x02\x02\u01FF" + - "\u0202\x03\x02\x02\x02\u0200\u01FE\x03\x02\x02\x02\u0200\u0201\x03\x02" + - "\x02\x02\u0201\u0204\x03\x02\x02\x02\u0202\u0200\x03\x02\x02\x02\u0203" + - "\u0205\x07\n\x02\x02\u0204\u0203\x03\x02\x02\x02\u0204\u0205\x03\x02\x02" + - "\x02\u0205\u0206\x03\x02\x02\x02\u0206\u0207\x07\x05\x02\x02\u0207\u0261" + - "\x03\x02\x02\x02\u0208\u0209\x07$\x02\x02\u0209\u020A\x07\x04\x02\x02" + - "\u020A\u020F\x05.\x18\x02\u020B\u020C\x07\n\x02\x02\u020C\u020E\x05.\x18" + - "\x02\u020D\u020B\x03\x02\x02\x02\u020E\u0211\x03\x02\x02\x02\u020F\u020D" + - "\x03\x02\x02\x02\u020F\u0210\x03\x02\x02\x02\u0210\u0213\x03\x02\x02\x02" + - "\u0211\u020F\x03\x02\x02\x02\u0212\u0214\x07\n\x02\x02\u0213\u0212\x03" + - "\x02\x02\x02\u0213\u0214\x03\x02\x02\x02\u0214\u0215\x03\x02\x02\x02\u0215" + - "\u0216\x07\x05\x02\x02\u0216\u0261\x03\x02\x02\x02\u0217\u021C\x05R*\x02" + - "\u0218\u021C\x07,\x02\x02\u0219\u021C\x07+\x02\x02\u021A\u021C\x07*\x02" + - "\x02\u021B\u0217\x03\x02\x02\x02\u021B\u0218\x03\x02\x02\x02\u021B\u0219" + - "\x03\x02\x02\x02\u021B\u021A\x03\x02\x02\x02\u021C\u0261\x03\x02\x02\x02" + - "\u021D\u021E\x07?\x02\x02\u021E\u021F\x05.\x18\x02\u021F\u0220\x07\n\x02" + - "\x02\u0220\u0225\x05.\x18\x02\u0221\u0222\x07\n\x02\x02\u0222\u0224\x05" + - ".\x18\x02\u0223\u0221\x03\x02\x02\x02\u0224\u0227\x03\x02\x02\x02\u0225" + - "\u0223\x03\x02\x02\x02\u0225\u0226\x03\x02\x02\x02\u0226\u0229\x03\x02" + - "\x02\x02\u0227\u0225\x03\x02\x02\x02\u0228\u022A\x07\n\x02\x02\u0229\u0228" + - "\x03\x02\x02\x02\u0229\u022A\x03\x02\x02\x02\u022A\u022B\x03\x02\x02\x02" + - "\u022B\u022C\x07@\x02\x02\u022C\u0261\x03\x02\x02\x02\u022D\u022E\x07" + - "\x04\x02\x02\u022E\u0233\x05H%\x02\u022F\u0230\x07\n\x02\x02\u0230\u0232" + - "\x05H%\x02\u0231\u022F\x03\x02\x02\x02\u0232\u0235\x03\x02\x02\x02\u0233" + - "\u0231\x03\x02\x02\x02\u0233\u0234\x03\x02\x02\x02\u0234\u0237\x03\x02" + - "\x02\x02\u0235\u0233\x03\x02\x02\x02\u0236\u0238\x07\n\x02\x02\u0237\u0236" + - "\x03\x02\x02\x02\u0237\u0238\x03\x02\x02\x02\u0238\u0239\x03\x02\x02\x02" + - "\u0239\u023A\x07\x05\x02\x02\u023A\u0261\x03\x02\x02\x02\u023B\u0244\x07" + - "\r\x02\x02\u023C\u0241\x05.\x18\x02\u023D\u023E\x07\n\x02\x02\u023E\u0240" + - "\x05.\x18\x02\u023F\u023D\x03\x02\x02\x02\u0240\u0243\x03\x02\x02\x02" + - "\u0241\u023F\x03\x02\x02\x02\u0241\u0242\x03\x02\x02\x02\u0242\u0245\x03" + - "\x02\x02\x02\u0243\u0241\x03\x02\x02\x02\u0244\u023C\x03\x02\x02\x02\u0244" + - "\u0245\x03\x02\x02\x02\u0245\u0247\x03\x02\x02\x02\u0246\u0248\x07\n\x02" + - "\x02\u0247\u0246\x03\x02\x02\x02\u0247\u0248\x03\x02\x02\x02\u0248\u0249" + - "\x03\x02\x02\x02\u0249\u0261\x07\x0E\x02\x02\u024A\u024B\x07%\x02\x02" + - "\u024B\u024C\x07?\x02\x02\u024C\u024D\x05.\x18\x02\u024D\u024E\x07@\x02" + - "\x02\u024E\u024F\x05.\x18\x02\u024F\u0250\x07&\x02\x02\u0250\u0251\x05" + - ".\x18\x07\u0251\u0261\x03\x02\x02\x02\u0252\u0253\x05\n\x06\x02\u0253" + - "\u0254\x05.\x18\x06\u0254\u0261\x03\x02\x02\x02\u0255\u0256\x05\x14\v" + - "\x02\u0256\u0257\x05.\x18\x05\u0257\u0261\x03\x02\x02\x02\u0258\u0259" + - "\x07?\x02\x02\u0259\u025A\x05.\x18\x02\u025A\u025B\x07@\x02\x02\u025B" + - "\u0261\x03\x02\x02\x02\u025C\u025D\x07\x04\x02\x02\u025D\u025E\x05.\x18" + - "\x02\u025E\u025F\x07\x05\x02\x02\u025F\u0261\x03\x02\x02\x02\u0260\u01CA" + - "\x03\x02\x02\x02\u0260\u01CC\x03\x02\x02\x02\u0260\u01D3\x03\x02\x02\x02" + - "\u0260\u01D5\x03\x02\x02\x02\u0260\u01DA\x03\x02\x02\x02\u0260\u01E9\x03" + - "\x02\x02\x02\u0260\u01F8\x03\x02\x02\x02\u0260\u01F9\x03\x02\x02\x02\u0260" + - "\u0208\x03\x02\x02\x02\u0260\u021B\x03\x02\x02\x02\u0260\u021D\x03\x02" + - "\x02\x02\u0260\u022D\x03\x02\x02\x02\u0260\u023B\x03\x02\x02\x02\u0260" + - "\u024A\x03\x02\x02\x02\u0260\u0252\x03\x02\x02\x02\u0260\u0255\x03\x02" + - "\x02\x02\u0260\u0258\x03\x02\x02\x02\u0260\u025C\x03\x02\x02\x02\u0261" + - "\u0293\x03\x02\x02\x02\u0262\u0263\f\x1C\x02\x02\u0263\u0264\x07!\x02" + - "\x02\u0264\u0292\x05.\x18\x1C\u0265\u0266\f\x1A\x02\x02\u0266\u0267\t" + - "\x02\x02\x02\u0267\u0292\x05.\x18\x1B\u0268\u0269\f\x19\x02\x02\u0269" + - "\u026A\t\x03\x02\x02\u026A\u0292\x05.\x18\x1A\u026B\u026C\f\x18\x02\x02" + - "\u026C\u026D\t\x04\x02\x02\u026D\u0292\x05.\x18\x19\u026E\u026F\f\x16" + - "\x02\x02\u026F\u0270\x07>\x02\x02\u0270\u0271\x05.\x18\x17\u0271\u0272" + - "\b\x18\x01\x02\u0272\u0292\x03\x02\x02\x02\u0273\u0274\f\x14\x02\x02\u0274" + - "\u0275\x07-\x02\x02\u0275\u0292\x05.\x18\x15\u0276\u0277\f\x12\x02\x02" + - "\u0277\u0278\x07.\x02\x02\u0278\u0292\x05.\x18\x13\u0279\u027A\f\x11\x02" + - "\x02\u027A\u027B\x07/\x02\x02\u027B\u0292\x05.\x18\x12\u027C\u027D\f\x10" + - "\x02\x02\u027D\u027E\x070\x02\x02\u027E\u0292\x05.\x18\x11\u027F\u0280" + - "\f\n\x02\x02\u0280\u0281\x07\x1C\x02\x02\u0281\u0292\x05.\x18\v\u0282" + - "\u0283\f \x02\x02\u0283\u0284\x07\x18\x02\x02\u0284\u028A\x05L\'\x02\u0285" + - "\u0287\x07?\x02\x02\u0286\u0288\x05F$\x02\u0287\u0286\x03\x02\x02\x02" + - "\u0287\u0288\x03\x02\x02\x02\u0288\u0289\x03\x02\x02\x02\u0289\u028B\x07" + - "@\x02\x02\u028A\u0285\x03\x02\x02\x02\u028A\u028B\x03\x02\x02\x02\u028B" + - "\u0292\x03\x02\x02\x02\u028C\u028D\f\x1D\x02\x02\u028D\u028E\x07\r\x02" + - "\x02\u028E\u028F\x05.\x18\x02\u028F\u0290\x07\x0E\x02\x02\u0290\u0292" + - "\x03\x02\x02\x02\u0291\u0262\x03\x02\x02\x02\u0291\u0265\x03\x02\x02\x02" + - "\u0291\u0268\x03\x02\x02\x02\u0291\u026B\x03\x02\x02\x02\u0291\u026E\x03" + - "\x02\x02\x02\u0291\u0273\x03\x02\x02\x02\u0291\u0276\x03\x02\x02\x02\u0291" + - "\u0279\x03\x02\x02\x02\u0291\u027C\x03\x02\x02\x02\u0291\u027F\x03\x02" + - "\x02\x02\u0291\u0282\x03\x02\x02\x02\u0291\u028C\x03\x02\x02\x02\u0292" + - "\u0295\x03\x02\x02\x02\u0293\u0291\x03\x02\x02\x02\u0293\u0294\x03\x02" + - "\x02\x02\u0294/\x03\x02\x02\x02\u0295\u0293\x03\x02\x02\x02\u0296\u0297" + - "\x072\x02\x02\u0297\u0298\x05.\x18\x02\u0298\u029A\x07\x04\x02\x02\u0299" + - "\u029B\x07\x0F\x02\x02\u029A\u0299\x03\x02\x02\x02\u029A\u029B\x03\x02" + - "\x02\x02\u029B\u029C\x03\x02\x02\x02\u029C\u02A1\x052\x1A\x02\u029D\u029E" + - "\x07\x0F\x02\x02\u029E\u02A0\x052\x1A\x02\u029F\u029D\x03\x02\x02\x02" + - "\u02A0\u02A3\x03\x02\x02\x02\u02A1\u029F\x03\x02\x02\x02\u02A1\u02A2\x03" + - "\x02\x02\x02\u02A2\u02A4\x03\x02\x02\x02\u02A3\u02A1\x03\x02\x02\x02\u02A4" + - "\u02A5\x07\x05\x02\x02\u02A51\x03\x02\x02\x02\u02A6\u02A9\x054\x1B\x02" + - "\u02A7\u02A9\x07\'\x02\x02\u02A8\u02A6\x03\x02\x02\x02\u02A8\u02A7\x03" + - "\x02\x02\x02\u02A9\u02AA\x03\x02\x02\x02\u02AA\u02AB\x07\x1D\x02\x02\u02AB" + - "\u02AC\x05.\x18\x02\u02AC3\x03\x02\x02\x02\u02AD\u02B4\x05T+\x02\u02AE" + - "\u02B1\x07?\x02\x02\u02AF\u02B2\x05T+\x02\u02B0\u02B2\x07\'\x02\x02\u02B1" + - "\u02AF\x03\x02\x02\x02\u02B1\u02B0\x03\x02\x02\x02\u02B2\u02B3\x03\x02" + - "\x02\x02\u02B3\u02B5\x07@\x02\x02\u02B4\u02AE\x03\x02\x02\x02\u02B4\u02B5" + - "\x03\x02\x02\x02\u02B55\x03\x02\x02\x02\u02B6\u02B7\x05\b\x05\x02\u02B7" + - "\u02B8\x07\x02\x02\x03\u02B8\u02C0\x03\x02\x02\x02\u02B9\u02BA\x05.\x18" + - "\x02\u02BA\u02BB\x07\x02\x02\x03\u02BB\u02C0\x03\x02\x02\x02\u02BC\u02BD" + - "\x07E\x02\x02\u02BD\u02C0\x07\x02\x02\x03\u02BE\u02C0\x07\x02\x02\x03" + - "\u02BF\u02B6\x03\x02\x02\x02\u02BF\u02B9\x03\x02\x02\x02\u02BF\u02BC\x03" + - "\x02\x02\x02\u02BF\u02BE\x03\x02\x02\x02\u02C07\x03\x02\x02\x02\u02C1" + - "\u02C4\x05:\x1E\x02\u02C2\u02C4\x05<\x1F\x02\u02C3\u02C1\x03\x02\x02\x02" + - "\u02C3\u02C2\x03\x02\x02\x02\u02C49\x03\x02\x02\x02\u02C5\u02C6\x05@!" + - "\x02\u02C6\u02C7\x07\x1D\x02\x02\u02C7\u02C8\x05.\x18\x02\u02C8\u02D7" + - "\x03\x02\x02\x02\u02C9\u02CA\x07?\x02\x02\u02CA\u02CF\x05@!\x02\u02CB" + - "\u02CC\x07\n\x02\x02\u02CC\u02CE\x05@!\x02\u02CD\u02CB\x03\x02\x02\x02" + - "\u02CE\u02D1\x03\x02\x02\x02\u02CF\u02CD\x03\x02\x02\x02\u02CF\u02D0\x03" + - "\x02\x02\x02\u02D0\u02D2\x03\x02\x02\x02\u02D1\u02CF\x03\x02\x02\x02\u02D2" + - "\u02D3\x07@\x02\x02\u02D3\u02D4\x07\x1D\x02\x02\u02D4\u02D5\x05.\x18\x02" + - "\u02D5\u02D7\x03\x02\x02\x02\u02D6\u02C5\x03\x02\x02\x02\u02D6\u02C9\x03" + - "\x02\x02\x02\u02D7;\x03\x02\x02\x02\u02D8\u02D9\x07?\x02\x02\u02D9\u02DA" + - "\x07?\x02\x02\u02DA\u02DD\x05@!\x02\u02DB\u02DC\x07\n\x02\x02\u02DC\u02DE" + - "\x05@!\x02\u02DD\u02DB\x03\x02\x02\x02\u02DE\u02DF\x03\x02\x02\x02\u02DF" + - "\u02DD\x03\x02\x02\x02\u02DF\u02E0\x03\x02\x02\x02\u02E0\u02E1\x03\x02" + - "\x02\x02\u02E1\u02E2\x07@\x02\x02\u02E2\u02E3\x07@\x02\x02\u02E3\u02E4" + - "\x07\x1D\x02\x02\u02E4\u02E5\x05.\x18\x02\u02E5=\x03\x02\x02\x02\u02E6" + - "\u02E9\x07\'\x02\x02\u02E7\u02E9\x05R*\x02\u02E8\u02E6\x03\x02\x02\x02" + - "\u02E8\u02E7\x03\x02\x02\x02\u02E9?\x03\x02\x02\x02\u02EA\u02EB\x05> " + - "\x02\u02EBA\x03\x02\x02\x02\u02EC\u02ED\x05> \x02\u02ED\u02EE\x07\x07" + - "\x02\x02\u02EE\u02EF\x05&\x14\x02\u02EFC\x03\x02\x02\x02\u02F0\u02F3\x07" + - "5\x02\x02\u02F1\u02F3\x05R*\x02\u02F2\u02F0\x03\x02\x02\x02\u02F2\u02F1" + - "\x03\x02\x02\x02\u02F3E\x03\x02\x02\x02\u02F4\u02F9\x05.\x18\x02\u02F5" + - "\u02F6\x07\n\x02\x02\u02F6\u02F8\x05.\x18\x02\u02F7\u02F5\x03\x02\x02" + - "\x02\u02F8\u02FB\x03\x02\x02\x02\u02F9\u02F7\x03\x02\x02\x02\u02F9\u02FA" + - "\x03\x02\x02\x02\u02FAG\x03\x02\x02\x02\u02FB\u02F9\x03\x02\x02\x02\u02FC" + - "\u02FD\x05T+\x02\u02FD\u02FE\x07\x07\x02\x02\u02FE\u02FF\x05.\x18\x02" + - "\u02FF\u0303\x03\x02\x02\x02\u0300\u0301\x07(\x02\x02\u0301\u0303\x05" + - ".\x18\x02\u0302\u02FC\x03\x02\x02\x02\u0302\u0300\x03\x02\x02\x02\u0303" + - "I\x03\x02\x02\x02\u0304\u0307\x05R*\x02\u0305\u0307\t\x05\x02\x02\u0306" + - "\u0304\x03\x02\x02\x02\u0306\u0305\x03\x02\x02\x02\u0307K\x03\x02\x02" + - "\x02\u0308\u030B\x05R*\x02\u0309\u030B\t\x06\x02\x02\u030A\u0308\x03\x02" + - "\x02\x02\u030A\u0309\x03\x02\x02\x02\u030BM\x03\x02\x02\x02\u030C\u030D" + - "\t\x07\x02\x02\u030DO\x03\x02\x02\x02\u030E\u030F\t\b\x02\x02\u030FQ\x03" + - "\x02\x02\x02\u0310\u0315\x05V,\x02\u0311\u0312\x07)\x02\x02\u0312\u0314" + - "\x05V,\x02\u0313\u0311\x03\x02\x02\x02\u0314\u0317\x03\x02\x02\x02\u0315" + - "\u0313\x03\x02\x02\x02\u0315\u0316\x03\x02\x02\x02\u0316S\x03\x02\x02" + - "\x02\u0317\u0315\x03\x02\x02\x02\u0318\u031D\x05V,\x02\u0319\u031A\x05" + - "R*\x02\u031A\u031B\b+\x01\x02\u031B\u031D\x03\x02\x02\x02\u031C\u0318" + - "\x03\x02\x02\x02\u031C\u0319\x03\x02\x02\x02\u031DU\x03\x02\x02\x02\u031E" + - "\u031F\t\t\x02\x02\u031FW\x03\x02\x02\x02Z[bks\x8C\x96\x9E\xA1\xAB\xAE" + - "\xB1\xB5\xB9\xBC\xBE\xCC\xD5\xD9\xDC\xE3\xEB\xF1\xF6\u0101\u0109\u010F" + - "\u0113\u0115\u0120\u0122\u0131\u0139\u0148\u0150\u0152\u0163\u0166\u0169" + - "\u0180\u0184\u018A\u019D\u01A2\u01AA\u01AC\u01BC\u01C2\u01C6\u01CF\u01E1" + - "\u01E5\u01F0\u01F4\u0200\u0204\u020F\u0213\u021B\u0225\u0229\u0233\u0237" + - "\u0241\u0244\u0247\u0260\u0287\u028A\u0291\u0293\u029A\u02A1\u02A8\u02B1" + - "\u02B4\u02BF\u02C3\u02CF\u02D6\u02DF\u02E8\u02F2\u02F9\u0302\u0306\u030A" + - "\u0315\u031C"; + "\u01EE\u01EC\x03\x02\x02\x02\u01EF\u01F2\x03\x02\x02\x02\u01F0\u01EE\x03" + + "\x02\x02\x02\u01F0\u01F1\x03\x02\x02\x02\u01F1\u01F4\x03\x02\x02\x02\u01F2" + + "\u01F0\x03\x02\x02\x02\u01F3\u01F5\x07\n\x02\x02\u01F4\u01F3\x03\x02\x02" + + "\x02\u01F4\u01F5\x03\x02\x02\x02\u01F5\u01F6\x03\x02\x02\x02\u01F6\u01F7" + + "\x07\x05\x02\x02\u01F7\u0263\x03\x02\x02\x02\u01F8\u0263\x050\x19\x02" + + "\u01F9\u01FA\x07#\x02\x02\u01FA\u01FB\x07\x04\x02\x02\u01FB\u0200\x05" + + ".\x18\x02\u01FC\u01FD\x07\n\x02\x02\u01FD\u01FF\x05.\x18\x02\u01FE\u01FC" + + "\x03\x02\x02\x02\u01FF\u0202\x03\x02\x02\x02\u0200\u01FE\x03\x02\x02\x02" + + "\u0200\u0201\x03\x02\x02\x02\u0201\u0204\x03\x02\x02\x02\u0202\u0200\x03" + + "\x02\x02\x02\u0203\u0205\x07\n\x02\x02\u0204\u0203\x03\x02\x02\x02\u0204" + + "\u0205\x03\x02\x02\x02\u0205\u0206\x03\x02\x02\x02\u0206\u0207\x07\x05" + + "\x02\x02\u0207\u0263\x03\x02\x02\x02\u0208\u0209\x07$\x02\x02\u0209\u020A" + + "\x07\x04\x02\x02\u020A\u020F\x05.\x18\x02\u020B\u020C\x07\n\x02\x02\u020C" + + "\u020E\x05.\x18\x02\u020D\u020B\x03\x02\x02\x02\u020E\u0211\x03\x02\x02" + + "\x02\u020F\u020D\x03\x02\x02\x02\u020F\u0210\x03\x02\x02\x02\u0210\u0213" + + "\x03\x02\x02\x02\u0211\u020F\x03\x02\x02\x02\u0212\u0214\x07\n\x02\x02" + + "\u0213\u0212\x03\x02\x02\x02\u0213\u0214\x03\x02\x02\x02\u0214\u0215\x03" + + "\x02\x02\x02\u0215\u0216\x07\x05\x02\x02\u0216\u0263\x03\x02\x02\x02\u0217" + + "\u021C\x05R*\x02\u0218\u021C\x07,\x02\x02\u0219\u021C\x07+\x02\x02\u021A" + + "\u021C\x07*\x02\x02\u021B\u0217\x03\x02\x02\x02\u021B\u0218\x03\x02\x02" + + "\x02\u021B\u0219\x03\x02\x02\x02\u021B\u021A\x03\x02\x02\x02\u021C\u0263" + + "\x03\x02\x02\x02\u021D\u021E\x07?\x02\x02\u021E\u021F\x05.\x18\x02\u021F" + + "\u0220\x07\n\x02\x02\u0220\u0225\x05.\x18\x02\u0221\u0222\x07\n\x02\x02" + + "\u0222\u0224\x05.\x18\x02\u0223\u0221\x03\x02\x02\x02\u0224\u0227\x03" + + "\x02\x02\x02\u0225\u0223\x03\x02\x02\x02\u0225\u0226\x03\x02\x02\x02\u0226" + + "\u0229\x03\x02\x02\x02\u0227\u0225\x03\x02\x02\x02\u0228\u022A\x07\n\x02" + + "\x02\u0229\u0228\x03\x02\x02\x02\u0229\u022A\x03\x02\x02\x02\u022A\u022B" + + "\x03\x02\x02\x02\u022B\u022C\x07@\x02\x02\u022C\u0263\x03\x02\x02\x02" + + "\u022D\u022E\x07?\x02\x02\u022E\u0263\x07@\x02\x02\u022F\u0230\x07\x04" + + "\x02\x02\u0230\u0235\x05H%\x02\u0231\u0232\x07\n\x02\x02\u0232\u0234\x05" + + "H%\x02\u0233\u0231\x03\x02\x02\x02\u0234\u0237\x03\x02\x02\x02\u0235\u0233" + + "\x03\x02\x02\x02\u0235\u0236\x03\x02\x02\x02\u0236\u0239\x03\x02\x02\x02" + + "\u0237\u0235\x03\x02\x02\x02\u0238\u023A\x07\n\x02\x02\u0239\u0238\x03" + + "\x02\x02\x02\u0239\u023A\x03\x02\x02\x02\u023A\u023B\x03\x02\x02\x02\u023B" + + "\u023C\x07\x05\x02\x02\u023C\u0263\x03\x02\x02\x02\u023D\u0246\x07\r\x02" + + "\x02\u023E\u0243\x05.\x18\x02\u023F\u0240\x07\n\x02\x02\u0240\u0242\x05" + + ".\x18\x02\u0241\u023F\x03\x02\x02\x02\u0242\u0245\x03\x02\x02\x02\u0243" + + "\u0241\x03\x02\x02\x02\u0243\u0244\x03\x02\x02\x02\u0244\u0247\x03\x02" + + "\x02\x02\u0245\u0243\x03\x02\x02\x02\u0246\u023E\x03\x02\x02\x02\u0246" + + "\u0247\x03\x02\x02\x02\u0247\u0249\x03\x02\x02\x02\u0248\u024A\x07\n\x02" + + "\x02\u0249\u0248\x03\x02\x02\x02\u0249\u024A\x03\x02\x02\x02\u024A\u024B" + + "\x03\x02\x02\x02\u024B\u0263\x07\x0E\x02\x02\u024C\u024D\x07%\x02\x02" + + "\u024D\u024E\x07?\x02\x02\u024E\u024F\x05.\x18\x02\u024F\u0250\x07@\x02" + + "\x02\u0250\u0251\x05.\x18\x02\u0251\u0252\x07&\x02\x02\u0252\u0253\x05" + + ".\x18\x07\u0253\u0263\x03\x02\x02\x02\u0254\u0255\x05\n\x06\x02\u0255" + + "\u0256\x05.\x18\x06\u0256\u0263\x03\x02\x02\x02\u0257\u0258\x05\x14\v" + + "\x02\u0258\u0259\x05.\x18\x05\u0259\u0263\x03\x02\x02\x02\u025A\u025B" + + "\x07?\x02\x02\u025B\u025C\x05.\x18\x02\u025C\u025D\x07@\x02\x02\u025D" + + "\u0263\x03\x02\x02\x02\u025E\u025F\x07\x04\x02\x02\u025F\u0260\x05.\x18" + + "\x02\u0260\u0261\x07\x05\x02\x02\u0261\u0263\x03\x02\x02\x02\u0262\u01CA" + + "\x03\x02\x02\x02\u0262\u01CC\x03\x02\x02\x02\u0262\u01D3\x03\x02\x02\x02" + + "\u0262\u01D5\x03\x02\x02\x02\u0262\u01DA\x03\x02\x02\x02\u0262\u01E9\x03" + + "\x02\x02\x02\u0262\u01F8\x03\x02\x02\x02\u0262\u01F9\x03\x02\x02\x02\u0262" + + "\u0208\x03\x02\x02\x02\u0262\u021B\x03\x02\x02\x02\u0262\u021D\x03\x02" + + "\x02\x02\u0262\u022D\x03\x02\x02\x02\u0262\u022F\x03\x02\x02\x02\u0262" + + "\u023D\x03\x02\x02\x02\u0262\u024C\x03\x02\x02\x02\u0262\u0254\x03\x02" + + "\x02\x02\u0262\u0257\x03\x02\x02\x02\u0262\u025A\x03\x02\x02\x02\u0262" + + "\u025E\x03\x02\x02\x02\u0263\u0295\x03\x02\x02\x02\u0264\u0265\f\x1D\x02" + + "\x02\u0265\u0266\x07!\x02\x02\u0266\u0294\x05.\x18\x1D\u0267\u0268\f\x1B" + + "\x02\x02\u0268\u0269\t\x02\x02\x02\u0269\u0294\x05.\x18\x1C\u026A\u026B" + + "\f\x1A\x02\x02\u026B\u026C\t\x03\x02\x02\u026C\u0294\x05.\x18\x1B\u026D" + + "\u026E\f\x19\x02\x02\u026E\u026F\t\x04\x02\x02\u026F\u0294\x05.\x18\x1A" + + "\u0270\u0271\f\x17\x02\x02\u0271\u0272\x07>\x02\x02\u0272\u0273\x05.\x18" + + "\x18\u0273\u0274\b\x18\x01\x02\u0274\u0294\x03\x02\x02\x02\u0275\u0276" + + "\f\x15\x02\x02\u0276\u0277\x07-\x02\x02\u0277\u0294\x05.\x18\x16\u0278" + + "\u0279\f\x13\x02\x02\u0279\u027A\x07.\x02\x02\u027A\u0294\x05.\x18\x14" + + "\u027B\u027C\f\x12\x02\x02\u027C\u027D\x07/\x02\x02\u027D\u0294\x05.\x18" + + "\x13\u027E\u027F\f\x11\x02\x02\u027F\u0280\x070\x02\x02\u0280\u0294\x05" + + ".\x18\x12\u0281\u0282\f\n\x02\x02\u0282\u0283\x07\x1C\x02\x02\u0283\u0294" + + "\x05.\x18\v\u0284\u0285\f!\x02\x02\u0285\u0286\x07\x18\x02\x02\u0286\u028C" + + "\x05L\'\x02\u0287\u0289\x07?\x02\x02\u0288\u028A\x05F$\x02\u0289\u0288" + + "\x03\x02\x02\x02\u0289\u028A\x03\x02\x02\x02\u028A\u028B\x03\x02\x02\x02" + + "\u028B\u028D\x07@\x02\x02\u028C\u0287\x03\x02\x02\x02\u028C\u028D\x03" + + "\x02\x02\x02\u028D\u0294\x03\x02\x02\x02\u028E\u028F\f\x1E\x02\x02\u028F" + + "\u0290\x07\r\x02\x02\u0290\u0291\x05.\x18\x02\u0291\u0292\x07\x0E\x02" + + "\x02\u0292\u0294\x03\x02\x02\x02\u0293\u0264\x03\x02\x02\x02\u0293\u0267" + + "\x03\x02\x02\x02\u0293\u026A\x03\x02\x02\x02\u0293\u026D\x03\x02\x02\x02" + + "\u0293\u0270\x03\x02\x02\x02\u0293\u0275\x03\x02\x02\x02\u0293\u0278\x03" + + "\x02\x02\x02\u0293\u027B\x03\x02\x02\x02\u0293\u027E\x03\x02\x02\x02\u0293" + + "\u0281\x03\x02\x02\x02\u0293\u0284\x03\x02\x02\x02\u0293\u028E\x03\x02" + + "\x02\x02\u0294\u0297\x03\x02\x02\x02\u0295\u0293\x03\x02\x02\x02\u0295" + + "\u0296\x03\x02\x02\x02\u0296/\x03\x02\x02\x02\u0297\u0295\x03\x02\x02" + + "\x02\u0298\u0299\x072\x02\x02\u0299\u029A\x05.\x18\x02\u029A\u029C\x07" + + "\x04\x02\x02\u029B\u029D\x07\x0F\x02\x02\u029C\u029B\x03\x02\x02\x02\u029C" + + "\u029D\x03\x02\x02\x02\u029D\u029E\x03\x02\x02\x02\u029E\u02A3\x052\x1A" + + "\x02\u029F\u02A0\x07\x0F\x02\x02\u02A0\u02A2\x052\x1A\x02\u02A1\u029F" + + "\x03\x02\x02\x02\u02A2\u02A5\x03\x02\x02\x02\u02A3\u02A1\x03\x02\x02\x02" + + "\u02A3\u02A4\x03\x02\x02\x02\u02A4\u02A6\x03\x02\x02\x02\u02A5\u02A3\x03" + + "\x02\x02\x02\u02A6\u02A7\x07\x05\x02\x02\u02A71\x03\x02\x02\x02\u02A8" + + "\u02AB\x054\x1B\x02\u02A9\u02AB\x07\'\x02\x02\u02AA\u02A8\x03\x02\x02" + + "\x02\u02AA\u02A9\x03\x02\x02\x02\u02AB\u02AC\x03\x02\x02\x02\u02AC\u02AD" + + "\x07\x1D\x02\x02\u02AD\u02AE\x05.\x18\x02\u02AE3\x03\x02\x02\x02\u02AF" + + "\u02B6\x05T+\x02\u02B0\u02B3\x07?\x02\x02\u02B1\u02B4\x05T+\x02\u02B2" + + "\u02B4\x07\'\x02\x02\u02B3\u02B1\x03\x02\x02\x02\u02B3\u02B2\x03\x02\x02" + + "\x02\u02B4\u02B5\x03\x02\x02\x02\u02B5\u02B7\x07@\x02\x02\u02B6\u02B0" + + "\x03\x02\x02\x02\u02B6\u02B7\x03\x02\x02\x02\u02B75\x03\x02\x02\x02\u02B8" + + "\u02B9\x05\b\x05\x02\u02B9\u02BA\x07\x02\x02\x03\u02BA\u02C2\x03\x02\x02" + + "\x02\u02BB\u02BC\x05.\x18\x02\u02BC\u02BD\x07\x02\x02\x03\u02BD\u02C2" + + "\x03\x02\x02\x02\u02BE\u02BF\x07E\x02\x02\u02BF\u02C2\x07\x02\x02\x03" + + "\u02C0\u02C2\x07\x02\x02\x03\u02C1\u02B8\x03\x02\x02\x02\u02C1\u02BB\x03" + + "\x02\x02\x02\u02C1\u02BE\x03\x02\x02\x02\u02C1\u02C0\x03\x02\x02\x02\u02C2" + + "7\x03\x02\x02\x02\u02C3\u02C6\x05:\x1E\x02\u02C4\u02C6\x05<\x1F\x02\u02C5" + + "\u02C3\x03\x02\x02\x02\u02C5\u02C4\x03\x02\x02\x02\u02C69\x03\x02\x02" + + "\x02\u02C7\u02C8\x05@!\x02\u02C8\u02C9\x07\x1D\x02\x02\u02C9\u02CA\x05" + + ".\x18\x02\u02CA\u02D9\x03\x02\x02\x02\u02CB\u02CC\x07?\x02\x02\u02CC\u02D1" + + "\x05@!\x02\u02CD\u02CE\x07\n\x02\x02\u02CE\u02D0\x05@!\x02\u02CF\u02CD" + + "\x03\x02\x02\x02\u02D0\u02D3\x03\x02\x02\x02\u02D1\u02CF\x03\x02\x02\x02" + + "\u02D1\u02D2\x03\x02\x02\x02\u02D2\u02D4\x03\x02\x02\x02\u02D3\u02D1\x03" + + "\x02\x02\x02\u02D4\u02D5\x07@\x02\x02\u02D5\u02D6\x07\x1D\x02\x02\u02D6" + + "\u02D7\x05.\x18\x02\u02D7\u02D9\x03\x02\x02\x02\u02D8\u02C7\x03\x02\x02" + + "\x02\u02D8\u02CB\x03\x02\x02\x02\u02D9;\x03\x02\x02\x02\u02DA\u02DB\x07" + + "?\x02\x02\u02DB\u02DC\x07?\x02\x02\u02DC\u02DF\x05@!\x02\u02DD\u02DE\x07" + + "\n\x02\x02\u02DE\u02E0\x05@!\x02\u02DF\u02DD\x03\x02\x02\x02\u02E0\u02E1" + + "\x03\x02\x02\x02\u02E1\u02DF\x03\x02\x02\x02\u02E1\u02E2\x03\x02\x02\x02" + + "\u02E2\u02E3\x03\x02\x02\x02\u02E3\u02E4\x07@\x02\x02\u02E4\u02E5\x07" + + "@\x02\x02\u02E5\u02E6\x07\x1D\x02\x02\u02E6\u02E7\x05.\x18\x02\u02E7=" + + "\x03\x02\x02\x02\u02E8\u02EB\x07\'\x02\x02\u02E9\u02EB\x05R*\x02\u02EA" + + "\u02E8\x03\x02\x02\x02\u02EA\u02E9\x03\x02\x02\x02\u02EB?\x03\x02\x02" + + "\x02\u02EC\u02ED\x05> \x02\u02EDA\x03\x02\x02\x02\u02EE\u02EF\x05> \x02" + + "\u02EF\u02F0\x07\x07\x02\x02\u02F0\u02F1\x05&\x14\x02\u02F1C\x03\x02\x02" + + "\x02\u02F2\u02F5\x075\x02\x02\u02F3\u02F5\x05R*\x02\u02F4\u02F2\x03\x02" + + "\x02\x02\u02F4\u02F3\x03\x02\x02\x02\u02F5E\x03\x02\x02\x02\u02F6\u02FB" + + "\x05.\x18\x02\u02F7\u02F8\x07\n\x02\x02\u02F8\u02FA\x05.\x18\x02\u02F9" + + "\u02F7\x03\x02\x02\x02\u02FA\u02FD\x03\x02\x02\x02\u02FB\u02F9\x03\x02" + + "\x02\x02\u02FB\u02FC\x03\x02\x02\x02\u02FCG\x03\x02\x02\x02\u02FD\u02FB" + + "\x03\x02\x02\x02\u02FE\u02FF\x05T+\x02\u02FF\u0300\x07\x07\x02\x02\u0300" + + "\u0301\x05.\x18\x02\u0301\u0305\x03\x02\x02\x02\u0302\u0303\x07(\x02\x02" + + "\u0303\u0305\x05.\x18\x02\u0304\u02FE\x03\x02\x02\x02\u0304\u0302\x03" + + "\x02\x02\x02\u0305I\x03\x02\x02\x02\u0306\u0309\x05R*\x02\u0307\u0309" + + "\t\x05\x02\x02\u0308\u0306\x03\x02\x02\x02\u0308\u0307\x03\x02\x02\x02" + + "\u0309K\x03\x02\x02\x02\u030A\u030D\x05R*\x02\u030B\u030D\t\x06\x02\x02" + + "\u030C\u030A\x03\x02\x02\x02\u030C\u030B\x03\x02\x02\x02\u030DM\x03\x02" + + "\x02\x02\u030E\u030F\t\x07\x02\x02\u030FO\x03\x02\x02\x02\u0310\u0311" + + "\t\b\x02\x02\u0311Q\x03\x02\x02\x02\u0312\u0317\x05V,\x02\u0313\u0314" + + "\x07)\x02\x02\u0314\u0316\x05V,\x02\u0315\u0313\x03\x02\x02\x02\u0316" + + "\u0319\x03\x02\x02\x02\u0317\u0315\x03\x02\x02\x02\u0317\u0318\x03\x02" + + "\x02\x02\u0318S\x03\x02\x02\x02\u0319\u0317\x03\x02\x02\x02\u031A\u031F" + + "\x05V,\x02\u031B\u031C\x05R*\x02\u031C\u031D\b+\x01\x02\u031D\u031F\x03" + + "\x02\x02\x02\u031E\u031A\x03\x02\x02\x02\u031E\u031B\x03\x02\x02\x02\u031F" + + "U\x03\x02\x02\x02\u0320\u0321\t\t\x02\x02\u0321W\x03\x02\x02\x02Z[bks" + + "\x8C\x96\x9E\xA1\xAB\xAE\xB1\xB5\xB9\xBC\xBE\xCC\xD5\xD9\xDC\xE3\xEB\xF1" + + "\xF6\u0101\u0109\u010F\u0113\u0115\u0120\u0122\u0131\u0139\u0148\u0150" + + "\u0152\u0163\u0166\u0169\u0180\u0184\u018A\u019D\u01A2\u01AA\u01AC\u01BC" + + "\u01C2\u01C6\u01CF\u01E1\u01E5\u01F0\u01F4\u0200\u0204\u020F\u0213\u021B" + + "\u0225\u0229\u0235\u0239\u0243\u0246\u0249\u0262\u0289\u028C\u0293\u0295" + + "\u029C\u02A3\u02AA\u02B3\u02B6\u02C1\u02C5\u02D1\u02D8\u02E1\u02EA\u02F4" + + "\u02FB\u0304\u0308\u030C\u0317\u031E"; public static readonly _serializedATN: string = Utils.join( [ QuintParser._serializedATNSegment0, @@ -6486,6 +6499,34 @@ export class TupleContext extends ExprContext { } } } +export class UnitContext extends ExprContext { + public LPAREN(): TerminalNode { return this.getToken(QuintParser.LPAREN, 0); } + public RPAREN(): TerminalNode { return this.getToken(QuintParser.RPAREN, 0); } + constructor(ctx: ExprContext) { + super(ctx.parent, ctx.invokingState); + this.copyFrom(ctx); + } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterUnit) { + listener.enterUnit(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitUnit) { + listener.exitUnit(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitUnit) { + return visitor.visitUnit(this); + } else { + return visitor.visitChildren(this); + } + } +} export class PairContext extends ExprContext { public expr(): ExprContext[]; public expr(i: number): ExprContext; diff --git a/quint/src/generated/QuintVisitor.ts b/quint/src/generated/QuintVisitor.ts index 7b5cc3ea0..cca740a52 100644 --- a/quint/src/generated/QuintVisitor.ts +++ b/quint/src/generated/QuintVisitor.ts @@ -47,6 +47,7 @@ import { ActionAllContext } from "./QuintParser"; import { ActionAnyContext } from "./QuintParser"; import { LiteralOrIdContext } from "./QuintParser"; import { TupleContext } from "./QuintParser"; +import { UnitContext } from "./QuintParser"; import { PairContext } from "./QuintParser"; import { RecordContext } from "./QuintParser"; import { ListContext } from "./QuintParser"; @@ -422,6 +423,14 @@ export interface QuintVisitor extends ParseTreeVisitor { */ visitTuple?: (ctx: TupleContext) => Result; + /** + * Visit a parse tree produced by the `unit` + * labeled alternative in `QuintParser.expr`. + * @param ctx the parse tree + * @return the visitor result + */ + visitUnit?: (ctx: UnitContext) => Result; + /** * Visit a parse tree produced by the `pair` * labeled alternative in `QuintParser.expr`. diff --git a/quint/src/ir/quintTypes.ts b/quint/src/ir/quintTypes.ts index f8322d67a..624bb2e31 100644 --- a/quint/src/ir/quintTypes.ts +++ b/quint/src/ir/quintTypes.ts @@ -69,22 +69,22 @@ export interface QuintTupleType extends WithOptionalId { fields: Row } -export interface QuintRecordType extends WithOptionalId { - kind: 'rec' - fields: Row -} - // A value of the unit type, i.e. an empty record -export function unitType(id: bigint): QuintRecordType { +export function unitType(id: bigint): QuintTupleType { return { id, - kind: 'rec', + kind: 'tup', fields: { kind: 'row', fields: [], other: { kind: 'empty' } }, } } export function isUnitType(r: QuintType): Boolean { - return r.kind === 'rec' && r.fields.kind === 'row' && r.fields.fields.length === 0 && r.fields.other.kind === 'empty' + return r.kind === 'tup' && r.fields.kind === 'row' && r.fields.fields.length === 0 && r.fields.other.kind === 'empty' +} + +export interface QuintRecordType extends WithOptionalId { + kind: 'rec' + fields: Row } export interface QuintSumType extends WithOptionalId { diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index a444e6d51..ce9b07be2 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -764,6 +764,11 @@ export class ToIrListener implements QuintListener { this.pushApplication(ctx, 'Tup', args) } + // The unit, (), represented by the empty tuple + exitUnit(ctx: p.UnitContext) { + this.exprStack.push(unitValue(this.getId(ctx))) + } + // pair constructor, e.g., 2 -> 3 exitPair(ctx: p.PairContext) { const args = popMany(this.exprStack, ctx.expr().length, this.undefinedExpr(ctx)) @@ -1353,7 +1358,7 @@ function unitValue(id: bigint): QuintBuiltinApp { return { id, kind: 'app', - opcode: 'Rec', + opcode: 'Tup', args: [], } } diff --git a/quint/src/types/constraintGenerator.ts b/quint/src/types/constraintGenerator.ts index 3f19dd1fb..9a17b6ddb 100644 --- a/quint/src/types/constraintGenerator.ts +++ b/quint/src/types/constraintGenerator.ts @@ -214,9 +214,7 @@ export class ConstraintGeneratorVisitor implements IRVisitor { return validateArity(e.opcode, results, l => l === 3, '3').chain(() => withConstraints(e.id, results, a)) // Tuple operators case 'Tup': - return validateArity(e.opcode, results, l => l > 0, 'at least one').chain(() => - tupleConstructorConstraints(e.id, results, a) - ) + return tupleConstructorConstraints(e.id, results, a) case 'item': return validateArity(e.opcode, results, l => l === 2, '2').chain(() => itemConstraints(e.id, results, a)) // Sum type operators diff --git a/quint/test/runtime/compile.test.ts b/quint/test/runtime/compile.test.ts index fe326ff69..12deb53a5 100644 --- a/quint/test/runtime/compile.test.ts +++ b/quint/test/runtime/compile.test.ts @@ -873,7 +873,7 @@ describe('compiling specs to runtime values', () => { it('can compile construction of sum type variants', () => { const context = 'type T = Some(int) | None' assertResultAsString('Some(40 + 2)', 'variant("Some", 42)', context) - assertResultAsString('None', 'variant("None", Rec())', context) + assertResultAsString('None', 'variant("None", Tup())', context) }) it('can compile elimination of sum type variants via match', () => { diff --git a/quint/test/types/aliasInliner.test.ts b/quint/test/types/aliasInliner.test.ts index f7f836b87..931b738ba 100644 --- a/quint/test/types/aliasInliner.test.ts +++ b/quint/test/types/aliasInliner.test.ts @@ -71,11 +71,11 @@ describe('inlineAliases', () => { const expectedModule = dedent(`module A { | type T1 = (B | C) - | val C: (B | C) = variant("C", Rec()) + | val C: (B | C) = variant("C", Tup()) | type T2 = (Some((B | C)) | None) - | val B: (B | C) = variant("B", Rec()) + | val B: (B | C) = variant("B", Tup()) | def Some: ((B | C)) => (Some((B | C)) | None) = ((__SomeParam) => variant("Some", __SomeParam)) - | val None: (Some((B | C)) | None) = variant("None", Rec()) + | val None: (Some((B | C)) | None) = variant("None", Tup()) | var x: (Some((B | C)) | None) |}`) diff --git a/quint/test/types/constraintGenerator.test.ts b/quint/test/types/constraintGenerator.test.ts index 8cb3fd0bf..784b62915 100644 --- a/quint/test/types/constraintGenerator.test.ts +++ b/quint/test/types/constraintGenerator.test.ts @@ -162,14 +162,6 @@ describe('ConstraintGeneratorVisitor', () => { ) }) - it('catches invalid arity on Tup operator', () => { - testArityError( - 'val x = Tup()', - 'Checking arity for application of Tup', - 'Operator expects at least one arguments but was given 0' - ) - }) - it('catches invalid arity on item operator', () => { testArityError( 'val x = (0, 1).item()', diff --git a/quint/test/types/inferrer.test.ts b/quint/test/types/inferrer.test.ts index a3471cf5d..7486ddf11 100644 --- a/quint/test/types/inferrer.test.ts +++ b/quint/test/types/inferrer.test.ts @@ -181,18 +181,18 @@ describe('inferTypes', () => { assert.sameDeepMembers(stringTypes, [ [15n, 'str'], [16n, 'int'], - [17n, '(A(int) | B({}))'], - [18n, '(A(int) | B({}))'], + [17n, '(A(int) | B(()))'], + [18n, '(A(int) | B(()))'], [6n, 'int'], [5n, 'str'], [7n, 'int'], - [8n, '(A(int) | B({}))'], - [9n, '(int) => (A(int) | B({}))'], - [10n, '(int) => (A(int) | B({}))'], + [8n, '(A(int) | B(()))'], + [9n, '(int) => (A(int) | B(()))'], + [10n, '(int) => (A(int) | B(()))'], [11n, 'str'], - [12n, '{}'], - [13n, '(B({}) | A(int))'], - [14n, '(B({}) | A(int))'], + [12n, '()'], + [13n, '(B(()) | A(int))'], + [14n, '(B(()) | A(int))'], ]) }) @@ -223,19 +223,19 @@ module B { assert.sameDeepMembers(stringTypes, [ [15n, 'str'], [16n, 'int'], - [17n, '(A(int) | B({}))'], - [18n, '(A(int) | B({}))'], + [17n, '(A(int) | B(()))'], + [18n, '(A(int) | B(()))'], [6n, 'int'], [5n, 'str'], [7n, 'int'], - [8n, '(A(int) | B({}))'], - [9n, '(int) => (A(int) | B({}))'], - [10n, '(int) => (A(int) | B({}))'], + [8n, '(A(int) | B(()))'], + [9n, '(int) => (A(int) | B(()))'], + [10n, '(int) => (A(int) | B(()))'], [11n, 'str'], - [12n, '{}'], - [13n, '(B({}) | A(int))'], - [14n, '(B({}) | A(int))'], - [19n, '(A(int) | B({}))'], + [12n, '()'], + [13n, '(B(()) | A(int))'], + [14n, '(B(()) | A(int))'], + [19n, '(A(int) | B(()))'], [25n, 'str'], [27n, 'int'], [20n, 'int'], @@ -243,9 +243,9 @@ module B { [22n, 'int'], [26n, '(int) => int'], [28n, 'str'], - [30n, '{}'], + [30n, '()'], [23n, 'int'], - [29n, '({}) => int'], + [29n, '(()) => int'], [24n, 'int'], [31n, 'int'], ]) diff --git a/quint/testFixture/_1043sumTypeDecl.json b/quint/testFixture/_1043sumTypeDecl.json index 90dc57e22..53f0aa6b2 100644 --- a/quint/testFixture/_1043sumTypeDecl.json +++ b/quint/testFixture/_1043sumTypeDecl.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":22,"name":"SumTypes","declarations":[{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},{"id":14,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}}},{"id":8,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":4,"kind":"const","name":"T"},"expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]}},{"id":21,"kind":"def","name":"canConstructVariants","qualifier":"val","expr":{"id":20,"kind":"app","opcode":"List","args":[{"id":17,"kind":"name","name":"A"},{"id":19,"kind":"app","opcode":"B","args":[{"id":18,"kind":"int","value":2}]}]},"typeAnnotation":{"id":16,"kind":"list","elem":{"id":15,"kind":"const","name":"T"}}}]}],"table":{"4":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},"11":{"id":10,"name":"__BParam","kind":"param","depth":1},"15":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},"17":{"id":8,"kind":"def","name":"A","qualifier":"val","expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]},"depth":0},"19":{"id":14,"kind":"def","name":"B","qualifier":"def","expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}},"depth":0}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":22,"name":"SumTypes","declarations":[{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},{"id":14,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}}},{"id":8,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":4,"kind":"const","name":"T"},"expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Tup","args":[]}]}},{"id":21,"kind":"def","name":"canConstructVariants","qualifier":"val","expr":{"id":20,"kind":"app","opcode":"List","args":[{"id":17,"kind":"name","name":"A"},{"id":19,"kind":"app","opcode":"B","args":[{"id":18,"kind":"int","value":2}]}]},"typeAnnotation":{"id":16,"kind":"list","elem":{"id":15,"kind":"const","name":"T"}}}]}],"table":{"4":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},"11":{"id":10,"name":"__BParam","kind":"param","depth":1},"15":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},"17":{"id":8,"kind":"def","name":"A","qualifier":"val","expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Tup","args":[]}]},"depth":0},"19":{"id":14,"kind":"def","name":"B","qualifier":"def","expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1044matchExpression.json b/quint/testFixture/_1044matchExpression.json index abd859adf..037d9dba6 100644 --- a/quint/testFixture/_1044matchExpression.json +++ b/quint/testFixture/_1044matchExpression.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":41,"name":"SumTypes","declarations":[{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},{"id":15,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"__BParam"}],"qualifier":"def","expr":{"id":13,"kind":"app","opcode":"variant","args":[{"id":10,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":12}]}}},{"id":21,"kind":"def","name":"C","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"str"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":20,"kind":"lambda","params":[{"id":17,"name":"__CParam"}],"qualifier":"def","expr":{"id":19,"kind":"app","opcode":"variant","args":[{"id":16,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":18}]}}},{"id":9,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":5,"kind":"const","name":"T"},"expr":{"id":8,"kind":"app","opcode":"variant","args":[{"id":6,"kind":"str","value":"A"},{"id":7,"kind":"app","opcode":"Rec","args":[]}]}},{"id":24,"kind":"def","name":"c","qualifier":"val","expr":{"id":23,"kind":"app","opcode":"C","args":[{"id":22,"kind":"str","value":"Foo"}]}},{"id":40,"kind":"def","name":"ex","qualifier":"val","expr":{"id":30,"kind":"app","opcode":"matchVariant","args":[{"id":25,"kind":"name","name":"c"},{"id":31,"kind":"str","value":"A"},{"id":32,"kind":"lambda","qualifier":"def","expr":{"id":26,"kind":"int","value":0},"params":[{"name":"_","id":33}]},{"id":34,"kind":"str","value":"B"},{"id":35,"kind":"lambda","qualifier":"def","expr":{"id":27,"kind":"name","name":"n"},"params":[{"name":"n","id":36}]},{"id":37,"kind":"str","value":"_"},{"id":38,"kind":"lambda","qualifier":"def","expr":{"id":29,"kind":"app","opcode":"iuminus","args":[{"id":28,"kind":"int","value":1}]},"params":[{"name":"_","id":39}]}]}}]}],"table":{"5":{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"12":{"id":11,"name":"__BParam","kind":"param","depth":1},"18":{"id":17,"name":"__CParam","kind":"param","depth":1},"23":{"id":21,"kind":"def","name":"C","qualifier":"def","expr":{"id":20,"kind":"lambda","params":[{"id":17,"name":"__CParam"}],"qualifier":"def","expr":{"id":19,"kind":"app","opcode":"variant","args":[{"id":16,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":18}]}},"depth":0},"25":{"id":24,"kind":"def","name":"c","qualifier":"val","expr":{"id":23,"kind":"app","opcode":"C","args":[{"id":22,"kind":"str","value":"Foo"}]},"depth":0},"27":{"name":"n","id":36,"kind":"param","depth":1}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":41,"name":"SumTypes","declarations":[{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},{"id":15,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"__BParam"}],"qualifier":"def","expr":{"id":13,"kind":"app","opcode":"variant","args":[{"id":10,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":12}]}}},{"id":21,"kind":"def","name":"C","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"str"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":20,"kind":"lambda","params":[{"id":17,"name":"__CParam"}],"qualifier":"def","expr":{"id":19,"kind":"app","opcode":"variant","args":[{"id":16,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":18}]}}},{"id":9,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":5,"kind":"const","name":"T"},"expr":{"id":8,"kind":"app","opcode":"variant","args":[{"id":6,"kind":"str","value":"A"},{"id":7,"kind":"app","opcode":"Tup","args":[]}]}},{"id":24,"kind":"def","name":"c","qualifier":"val","expr":{"id":23,"kind":"app","opcode":"C","args":[{"id":22,"kind":"str","value":"Foo"}]}},{"id":40,"kind":"def","name":"ex","qualifier":"val","expr":{"id":30,"kind":"app","opcode":"matchVariant","args":[{"id":25,"kind":"name","name":"c"},{"id":31,"kind":"str","value":"A"},{"id":32,"kind":"lambda","qualifier":"def","expr":{"id":26,"kind":"int","value":0},"params":[{"name":"_","id":33}]},{"id":34,"kind":"str","value":"B"},{"id":35,"kind":"lambda","qualifier":"def","expr":{"id":27,"kind":"name","name":"n"},"params":[{"name":"n","id":36}]},{"id":37,"kind":"str","value":"_"},{"id":38,"kind":"lambda","qualifier":"def","expr":{"id":29,"kind":"app","opcode":"iuminus","args":[{"id":28,"kind":"int","value":1}]},"params":[{"name":"_","id":39}]}]}}]}],"table":{"5":{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"12":{"id":11,"name":"__BParam","kind":"param","depth":1},"18":{"id":17,"name":"__CParam","kind":"param","depth":1},"23":{"id":21,"kind":"def","name":"C","qualifier":"def","expr":{"id":20,"kind":"lambda","params":[{"id":17,"name":"__CParam"}],"qualifier":"def","expr":{"id":19,"kind":"app","opcode":"variant","args":[{"id":16,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":18}]}},"depth":0},"25":{"id":24,"kind":"def","name":"c","qualifier":"val","expr":{"id":23,"kind":"app","opcode":"C","args":[{"id":22,"kind":"str","value":"Foo"}]},"depth":0},"27":{"name":"n","id":36,"kind":"param","depth":1}},"errors":[]} \ No newline at end of file From 80eef26f35a42211a3eeeb5584c33f88caf3a0ce Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 13 Mar 2024 23:05:18 -0400 Subject: [PATCH 305/388] Update apalache integration test for compile We now test that identifiers are sanitized, that imports and instances are resolved as expected, and that the unit is represented correctly. --- quint/apalache-tests.md | 45 ++++++++++++++--------- quint/testFixture/ApalacheCompilation.qnt | 35 ++++++++++++++++++ 2 files changed, 63 insertions(+), 17 deletions(-) create mode 100644 quint/testFixture/ApalacheCompilation.qnt diff --git a/quint/apalache-tests.md b/quint/apalache-tests.md index 8a716f60c..5517ca4b7 100644 --- a/quint/apalache-tests.md +++ b/quint/apalache-tests.md @@ -224,34 +224,45 @@ An example execution: ### Test that we can compile to TLA+ of the expected form - + ``` -quint compile --target tlaplus ../examples/language-features/booleans.qnt +quint compile --target tlaplus ./testFixture/ApalacheCompilation.qnt ``` - + ``` -------------------------------- MODULE booleans ------------------------------- +-------------------------- MODULE ApalacheCompilation -------------------------- -EXTENDS Integers, Sequences, FiniteSets, TLC, Apalache +EXTENDS Integers, Sequences, FiniteSets, TLC, Apalache, Variants -VARIABLE b +VARIABLE x -step == - (b \/ TRUE) - /\ ~(b /\ FALSE) - /\ (b => b) - /\ (b <=> b) - /\ b = b - /\ b /= (~b) - /\ b' := (~b) +A == Variant("A", <<>>) -init == b' := TRUE +B(__BParam_27) == Variant("B", __BParam_27) + +foo_bar(id__123_31) == id__123_31 + +importedValue == 0 + +ApalacheCompilation_ModuleToInstantiate_C == 0 + +step == x' := (x + 1) + +inv == x >= 0 + +ApalacheCompilation_ModuleToInstantiate_instantiatedValue == + ApalacheCompilation_ModuleToInstantiate_C + +init == + x' + := (importedValue + + ApalacheCompilation_ModuleToInstantiate_instantiatedValue) ================================================================================ ``` -### Test that we can compile a module with imports and instances to TLA+ +### Test that we can compile a module to TLA+ that instantiates but has not declarations @@ -266,7 +277,7 @@ which leaves nothing, thanks to the way clockSync3 is instanced. ``` ------------------------------ MODULE clockSync3 ------------------------------ -EXTENDS Integers, Sequences, FiniteSets, TLC, Apalache +EXTENDS Integers, Sequences, FiniteSets, TLC, Apalache, Variants ================================================================================ ``` diff --git a/quint/testFixture/ApalacheCompilation.qnt b/quint/testFixture/ApalacheCompilation.qnt new file mode 100644 index 000000000..02a415496 --- /dev/null +++ b/quint/testFixture/ApalacheCompilation.qnt @@ -0,0 +1,35 @@ +module ModuleToInstantiate { + const C: int + + val instantiatedValue = C +} + +module ModuleToImport { + val importedValue = 0 +} + +module ApalacheCompilation { + // Tests whether we can compile imports + import ModuleToImport.* + + // Tests whether we can compile instantiations + import ModuleToInstantiate(C = 0).* + + var x: int + + type T = + | A // Test whether we represent the unit correctly + | B(int) + + // Tests whether we will sanitize identifiers + def foo::bar(__123) = __123 + + // TODO: Tests that we remove primes from assignments in the init functino + action init = { + x' = importedValue + instantiatedValue + } + + action step = x' = x + 1 + + def inv = x >= 0 +} From 9c08b7d8ee073e7ac598c7057522916ba4acef27 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 13 Mar 2024 23:12:25 -0400 Subject: [PATCH 306/388] Update changelog --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f2f95c17..80d1fa7d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,7 +20,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - The latest supported node version is now bounded at <= 20, which covers the latest LTS. (#1380) - Shadowing names are now supported, which means that the same name can be redefined - in nested scopes (#1394) + in nested scopes. (#1394) +- The canonical unit type is now the empty tuple, `()`, rather than the empty + record, `{}`. This should only affect invisible things to do with sum type + constructors. (#1401) ### Deprecated ### Removed From c70ae5af1ab399c2b04a307cfd67dd5408dba0fe Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Wed, 13 Mar 2024 23:14:14 -0400 Subject: [PATCH 307/388] Update the language spec --- doc/lang.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/lang.md b/doc/lang.md index d71ba0c3e..a598c6146 100644 --- a/doc/lang.md +++ b/doc/lang.md @@ -1300,14 +1300,14 @@ sets of records: (1) It often confuses beginners, (2) It can be expressed with ### Tuples -In contrast to TLA+, Quint tuples have length of at least 2. -If you need lists, use lists. - ```scala // Tuple constructor: << e_1, ..., e_n >> -// Warning: n >= 2 (e_1, ..., e_n) Tup(e_1, ..., e_n) +// The empty tuple is also the canonical unit type +// <<>> +() +Tup() // t[1], t[2], t[3], t[4], ... , t[50] t._1 t._2 From 606b43607fe7d202f45594c17743ce4e8c10cc93 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Thu, 14 Mar 2024 17:15:15 -0400 Subject: [PATCH 308/388] Add q::* operators to compiled targets Closes #1402 This also shares the flattening and extension logic between the `compile` command and the `verifySpec` command. --- doc/quint.md | 53 +++++--- quint/apalache-tests.md | 71 ++++++++++- quint/src/cli.ts | 77 ++++++------ quint/src/cliCommands.ts | 147 +++++++++++----------- quint/testFixture/ApalacheCompilation.qnt | 21 +++- 5 files changed, 232 insertions(+), 137 deletions(-) diff --git a/doc/quint.md b/doc/quint.md index 18eed574b..12c5bd6c1 100644 --- a/doc/quint.md +++ b/doc/quint.md @@ -73,8 +73,7 @@ especially useful for debugging complex specifications. $ quint compile --help quint compile -compile a Quint specification into the target, the output is written to -stdout +compile a Quint specification into the target, the output is written to stdout Options: --help Show help [boolean] @@ -82,6 +81,10 @@ Options: --out output file (suppresses all console output) [string] --main name of the main module (by default, computed from filename) [string] + --init name of the initializer action [string] [default: "init"] + --step name of the step action [string] [default: "step"] + --invariant the invariants to check, separated by commas (e.g.) [string] + --temporal the temporal properties to check, separated by commas [string] --target the compilation target. Supported values: tlaplus, json [string] [default: "json"] --verbosity control how much output is produced (0 to 5)[number] [default: 2] @@ -91,6 +94,16 @@ Given a quint specification as input, this command parses, resolves imports, typechecks, and then "flattens" the specification into on module containing just the needed definitions. +The main module is determined as follows: If a module name is specified by +`--main`, that takes precedence. Otherwise, if there is only one module in the +input file, that is the main module. Otherwise, the module with the same name as +the file is taken to be the main module. + +The main module must specify a state machine. This means it must either define +actions named `init` and `step`, specifying the initial state and the +transition action respectivefly, or suitable actions defined in the main module +must be indicated using the `--init` and `--step` actions. + The following compilation targets are supported - `json`: The default target, this produces a json representation, in the same @@ -105,7 +118,7 @@ The following compilation targets are supported to be expected.* ```sh -$ quint parse --help +$ quint parse --help quint parse parse a Quint specification @@ -292,30 +305,32 @@ Options: ## Command verify ```sh -$ quint verify +$ quint verify --help +quint verify Verify a Quint specification via Apalache Options: - --help Show help [boolean] - --version Show version number [boolean] - --main name of the main module (by default, computed from - filename) [string] - --out output file (suppresses all console output) [string] - --out-itf output the trace in the Informal Trace Format to file - (suppresses all console output) [string] - --max-steps the maximum number of steps in every trace - [number] [default: 10] - --init name of the initializer action [string] [default: "init"] - --step name of the step action [string] [default: "step"] - --invariant the invariants to check, separated by a comma [string] - --temporal the temporal properties to check, separated by a comma + --help Show help [boolean] + --version Show version number [boolean] + --out output file (suppresses all console output) [string] + --main name of the main module (by default, computed from + filename) [string] + --init name of the initializer action[string] [default: "init"] + --step name of the step action [string] [default: "step"] + --invariant the invariants to check, separated by commas (e.g.) [string] + --temporal the temporal properties to check, separated by commas + [string] + --out-itf output the trace in the Informal Trace Format to file + (suppresses all console output) [string] + --max-steps the maximum number of steps in every trace + [number] [default: 10] --random-transitions choose transitions at random (= use symbolic simulation) [boolean] [default: false] --apalache-config path to an additional Apalache configuration file (in JSON) [string] - --verbosity control how much output is produced (0 to 5) + --verbosity control how much output is produced (0 to 5) [number] [default: 2] ``` @@ -332,7 +347,7 @@ steps: Apalache uses bounded model checking. This technique checks *all runs* up to `--max-steps` steps via [z3][]. Apalache is highly configurable. See [Apalache configuration](https://apalache.informal.systems/docs/apalache/config.html?highlight=configuration#apalache-configuration) -for guidance. +for guidance. - If there are no critical errors (e.g., in parsing, typechecking, etc.), this command sends the Quint specification to the [Apalache][] model checker, which diff --git a/quint/apalache-tests.md b/quint/apalache-tests.md index 5517ca4b7..d455c834a 100644 --- a/quint/apalache-tests.md +++ b/quint/apalache-tests.md @@ -239,18 +239,24 @@ VARIABLE x A == Variant("A", <<>>) -B(__BParam_27) == Variant("B", __BParam_27) +B(__BParam_31) == Variant("B", __BParam_31) -foo_bar(id__123_31) == id__123_31 +foo_bar(id__123_35) == id__123_35 importedValue == 0 ApalacheCompilation_ModuleToInstantiate_C == 0 +altInit == x' := 0 + step == x' := (x + 1) +altStep == x' := (x + 0) + inv == x >= 0 +altInv == x >= 0 + ApalacheCompilation_ModuleToInstantiate_instantiatedValue == ApalacheCompilation_ModuleToInstantiate_C @@ -259,10 +265,59 @@ init == := (importedValue + ApalacheCompilation_ModuleToInstantiate_instantiatedValue) +q_step == step + +q_init == init + ================================================================================ ``` -### Test that we can compile a module to TLA+ that instantiates but has not declarations +### Test that we can compile to TLA+ of the expected form with CLI confgis + +We check that specifying `--init`, `--step`, and `--invariant` work as expected + + +``` +quint compile --target tlaplus \ + --init altInit --step altStep --invariant altInv \ + ./testFixture/ApalacheCompilation.qnt \ + | grep -e q_init -e q_step -e q_inv +``` + + +``` +q_init == altInit +q_step == altStep +q_inv == altInv +``` + +### Test that we can compile to TLA+ of the expected form, specifying `--main` + + +``` +quint compile --target tlaplus --main ModuleToImport ./testFixture/ApalacheCompilation.qnt +``` + + +``` +---------------------------- MODULE ModuleToImport ---------------------------- + +EXTENDS Integers, Sequences, FiniteSets, TLC, Apalache, Variants + +step == TRUE + +importedValue == 0 + +init == TRUE + +q_init == init + +q_step == step + +================================================================================ +``` + +### Test that we can compile a module to TLA+ that instantiates but has no declarations @@ -270,14 +325,18 @@ init == quint compile --target tlaplus ../examples/classic/distributed/ClockSync/clockSync3.qnt | head ``` +The compiled module is not empty: -TODO: This is an incorrect result, we are removing all "unused" declarations -which leaves nothing, thanks to the way clockSync3 is instanced. ``` ------------------------------ MODULE clockSync3 ------------------------------ EXTENDS Integers, Sequences, FiniteSets, TLC, Apalache, Variants -================================================================================ +VARIABLE clockSync3_clockSync3Spec_time + +clockSync3_clockSync3Spec_Proc(clockSync3_clockSync3Spec_id_37) == + [id |-> clockSync3_clockSync3Spec_id_37] + +VARIABLE clockSync3_clockSync3Spec_hc ``` diff --git a/quint/src/cli.ts b/quint/src/cli.ts index da318605e..7bcf81866 100755 --- a/quint/src/cli.ts +++ b/quint/src/cli.ts @@ -17,6 +17,7 @@ import { compile, docs, load, + outputCompilationTarget, outputResult, parse, runRepl, @@ -36,6 +37,32 @@ const defaultOpts = (yargs: any) => type: 'string', }) +// Arguments used by routines that pass thru the `compile` stage +const compileOpts = (yargs: any) => + defaultOpts(yargs) + .option('main', { + desc: 'name of the main module (by default, computed from filename)', + type: 'string', + }) + .option('init', { + desc: 'name of the initializer action', + type: 'string', + default: 'init', + }) + .option('step', { + desc: 'name of the step action', + type: 'string', + default: 'step', + }) + .option('invariant', { + desc: 'the invariants to check, separated by commas (e.g.)', + type: 'string', + }) + .option('temporal', { + desc: 'the temporal properties to check, separated by commas', + type: 'string', + }) + // Chain async CLIProcedures // // This saves us having to manually thread the result argument like @@ -77,11 +104,7 @@ const compileCmd = { command: 'compile ', desc: 'compile a Quint specification into the target, the output is written to stdout', builder: (yargs: any) => - defaultOpts(yargs) - .option('main', { - desc: 'name of the main module (by default, computed from filename)', - type: 'string', - }) + compileOpts(yargs) .option('target', { desc: `the compilation target. Supported values: ${supportedTarges.join(', ')}`, type: 'string', @@ -99,7 +122,12 @@ const compileCmd = { default: verbosity.defaultLevel, }), handler: (args: any) => - load(args).then(chainCmd(parse)).then(chainCmd(typecheck)).then(chainCmd(compile)).then(outputResult), + load(args) + .then(chainCmd(parse)) + .then(chainCmd(typecheck)) + .then(chainCmd(compile)) + .then(chainCmd(outputCompilationTarget)) + .then(outputResult), } // construct repl commands with yargs @@ -235,15 +263,7 @@ const verifyCmd = { command: 'verify ', desc: `Verify a Quint specification via Apalache`, builder: (yargs: any) => - yargs - .option('main', { - desc: 'name of the main module (by default, computed from filename)', - type: 'string', - }) - .option('out', { - desc: 'output file (suppresses all console output)', - type: 'string', - }) + compileOpts(yargs) .option('out-itf', { desc: 'output the trace in the Informal Trace Format to file (suppresses all console output)', type: 'string', @@ -253,26 +273,6 @@ const verifyCmd = { type: 'number', default: 10, }) - .option('init', { - desc: 'name of the initializer action', - type: 'string', - default: 'init', - }) - .option('step', { - desc: 'name of the step action', - type: 'string', - default: 'step', - }) - .option('invariant', { - desc: 'the invariants to check, separated by a comma', - type: 'string', - coerce: (s: string) => s.split(','), - }) - .option('temporal', { - desc: 'the temporal properties to check, separated by a comma', - type: 'string', - coerce: (s: string) => s.split(','), - }) .option('random-transitions', { desc: 'choose transitions at random (= use symbolic simulation)', type: 'boolean', @@ -295,7 +295,12 @@ const verifyCmd = { // type: 'number', // }) handler: (args: any) => - load(args).then(chainCmd(parse)).then(chainCmd(typecheck)).then(chainCmd(verifySpec)).then(outputResult), + load(args) + .then(chainCmd(parse)) + .then(chainCmd(typecheck)) + .then(chainCmd(compile)) + .then(chainCmd(verifySpec)) + .then(outputResult), } // construct documenting commands with yargs diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index 2fdb81b2c..99c6f968f 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -29,7 +29,7 @@ import { Either, left, right } from '@sweet-monads/either' import { EffectScheme } from './effects/base' import { LookupTable, UnusedDefinitions } from './names/base' import { ReplOptions, quintRepl } from './repl' -import { OpQualifier, QuintEx, QuintModule, QuintOpDef, qualifier } from './ir/quintIr' +import { FlatModule, OpQualifier, QuintEx, QuintModule, QuintOpDef, qualifier } from './ir/quintIr' import { TypeScheme } from './types/base' import { createFinders, formatError } from './errorReporter' import { DocumentationEntry, produceDocs, toMarkdown } from './docs' @@ -44,13 +44,21 @@ import { Rng, newRng } from './rng' import { fileSourceResolver } from './parsing/sourceResolver' import { verify } from './quintVerifier' import { flattenModules } from './flattening/fullFlattener' -import { analyzeInc, analyzeModules } from './quintAnalyzer' +import { AnalysisOutput, analyzeInc, analyzeModules } from './quintAnalyzer' import { ExecutionFrame } from './runtime/trace' import { flow, isEqual, uniqWith } from 'lodash' import { Maybe, just, none } from '@sweet-monads/maybe' import { compileToTlaplus } from './compileToTlaplus' -export type stage = 'loading' | 'parsing' | 'typechecking' | 'testing' | 'running' | 'compiling' | 'documentation' +export type stage = + | 'loading' + | 'parsing' + | 'typechecking' + | 'testing' + | 'running' + | 'compiling' + | 'outputting target' + | 'documentation' /** The data from a ProcedureStage that may be output to --out */ interface OutputStage { @@ -138,6 +146,10 @@ interface TypecheckedStage extends ParsedStage { modes: Map } +interface CompiledStage extends TypecheckedStage, AnalysisOutput { + mainModule: FlatModule +} + interface TestedStage extends LoadedStage { // the names of the passed tests passed: string[] @@ -606,20 +618,46 @@ export async function runSimulator(prev: TypecheckedStage): Promise> { - const stage: stage = 'compiling' +export async function compile(typechecked: TypecheckedStage): Promise> { const args = typechecked.args - const verbosityLevel = deriveVerbosity(args) + const mainName = guessMainModule(typechecked) + const main = typechecked.modules.find(m => m.name === mainName) + if (!main) { + return cliErr(`module ${mainName} does not exist`, { ...typechecked, errors: [], sourceCode: new Map() }) + } + + // Wrap init, step, invariant and temporal properties in other definitions, + // to make sure they are not considered unused in the main module and, + // therefore, ignored by the flattener + const extraDefsAsText = [`action q::init = ${args.init}`, `action q::step = ${args.step}`] + + if (args.invariant) { + extraDefsAsText.push(`val q::inv = and(${args.invariant})`) + } + if (args.temporal) { + extraDefsAsText.push(`temporal q::temporalProps = and(${args.temporal})`) + } + const extraDefs = extraDefsAsText.map(d => parseDefOrThrow(d, typechecked.idGen, new Map())) + main.declarations.push(...extraDefs) + + // We have to update the lookup table and analysis result with the new definitions. This is not ideal, and the problem + // is that is hard to add this definitions in the proper stage, in our current setup. We should try to tackle this + // while solving #1052. + const resolutionResult = parsePhase3importAndNameResolution({ ...typechecked, errors: [] }) + if (resolutionResult.errors.length > 0) { + const errors = resolutionResult.errors.map(mkErrorMessage(typechecked.sourceMap)) + return cliErr('name resolution failed', { ...typechecked, errors }) + } + + typechecked.table = resolutionResult.table + analyzeInc(typechecked, typechecked.table, extraDefs) + + // Flatten modules, replacing instances, imports and exports with their definitions const { flattenedModules, flattenedTable, flattenedAnalysis } = flattenModules( typechecked.modules, typechecked.table, @@ -628,36 +666,43 @@ export async function compile(typechecked: TypecheckedStage): Promise m.name === mainName)! - if (!main) { - return cliErr(`module ${mainName} does not exist`, { ...typechecked, errors: [], sourceCode: new Map() }) - } + // Pick the main module + const flatMain = flattenedModules.find(m => m.name === mainName)! - const flattenedStage: TypecheckedStage = { + return right({ ...typechecked, ...flattenedAnalysis, - modules: [main], + mainModule: flatMain, table: flattenedTable, - stage, - } + stage: 'compiling', + }) +} - const parsedSpecJson = jsonStringOfOutputStage(pickOutputStage(flattenedStage)) - switch ((typechecked.args.target as string).toLowerCase()) { +/** output a compiled spec in the format specified in the `compiled.args.target` to stdout + * + * @param compiled The result of a preceding compile stage + */ +export async function outputCompilationTarget(compiled: CompiledStage): Promise> { + const stage: stage = 'outputting target' + const args = compiled.args + const verbosityLevel = deriveVerbosity(args) + + const parsedSpecJson = jsonStringOfOutputStage(pickOutputStage({ ...compiled, modules: [compiled.mainModule] })) + switch ((compiled.args.target as string).toLowerCase()) { case 'json': process.stdout.write(parsedSpecJson) - return right(flattenedStage) + return right(compiled) case 'tlaplus': { const toTlaResult = await compileToTlaplus(parsedSpecJson, verbosityLevel) return toTlaResult .mapRight(tla => { process.stdout.write(tla) // Write out, since all went right - return flattenedStage + return compiled }) .mapLeft(err => { return { msg: err.explanation, - stage: { ...flattenedStage, stage, status: 'error', errors: err.errors }, + stage: { ...compiled, stage, status: 'error', errors: err.errors }, } }) } @@ -672,7 +717,7 @@ export async function compile(typechecked: TypecheckedStage): Promise> { +export async function verifySpec(prev: CompiledStage): Promise> { const verifying = { ...prev, stage: 'verifying' as stage } const args = verifying.args const verbosityLevel = deriveVerbosity(args) @@ -686,51 +731,7 @@ export async function verifySpec(prev: TypecheckedStage): Promise m.name === mainName) - if (!main) { - return cliErr(`module ${mainName} does not exist`, { ...verifying, errors: [], sourceCode: new Map() }) - } - - // Wrap init, step, invariant and temporal properties in other definitions, - // to make sure they are not considered unused in the main module and, - // therefore, ignored by the flattener - const extraDefsAsText = [`action q::init = ${args.init}`, `action q::step = ${args.step}`] - if (args.invariant) { - extraDefsAsText.push(`val q::inv = and(${args.invariant.join(',')})`) - } - if (args.temporal) { - extraDefsAsText.push(`temporal q::temporalProps = and(${args.temporal.join(',')})`) - } - - const extraDefs = extraDefsAsText.map(d => parseDefOrThrow(d, verifying.idGen, new Map())) - main.declarations.push(...extraDefs) - - // We have to update the lookup table and analysis result with the new definitions. This is not ideal, and the problem - // is that is hard to add this definitions in the proper stage, in our current setup. We should try to tackle this - // while solving #1052. - const resolutionResult = parsePhase3importAndNameResolution({ ...prev, errors: [] }) - if (resolutionResult.errors.length > 0) { - const errors = resolutionResult.errors.map(mkErrorMessage(prev.sourceMap)) - return cliErr('name resolution failed', { ...verifying, errors }) - } - - verifying.table = resolutionResult.table - analyzeInc(verifying, verifying.table, extraDefs) - - // Flatten modules, replacing instances, imports and exports with their definitions - const { flattenedModules, flattenedTable, flattenedAnalysis } = flattenModules( - verifying.modules, - verifying.table, - verifying.idGen, - verifying.sourceMap, - verifying - ) - - // Pick main module, we only pass this on to Apalache - const flatMain = flattenedModules.find(m => m.name === mainName)! - - const veryfiyingFlat = { ...verifying, ...flattenedAnalysis, modules: [flatMain], table: flattenedTable } + const veryfiyingFlat = { ...prev, modules: [prev.mainModule] } const parsedSpec = jsonStringOfOutputStage(pickOutputStage(veryfiyingFlat)) // We need to insert the data form CLI args into their appropriate locations diff --git a/quint/testFixture/ApalacheCompilation.qnt b/quint/testFixture/ApalacheCompilation.qnt index 02a415496..b1ffde284 100644 --- a/quint/testFixture/ApalacheCompilation.qnt +++ b/quint/testFixture/ApalacheCompilation.qnt @@ -4,15 +4,19 @@ module ModuleToInstantiate { val instantiatedValue = C } +// Used for import tests and for testing specifying an alternate main module module ModuleToImport { val importedValue = 0 + + action init = true + action step = true } module ApalacheCompilation { // Tests whether we can compile imports - import ModuleToImport.* + import ModuleToImport.importedValue - // Tests whether we can compile instantiations + // Tests whether we can compile instances import ModuleToInstantiate(C = 0).* var x: int @@ -24,12 +28,23 @@ module ApalacheCompilation { // Tests whether we will sanitize identifiers def foo::bar(__123) = __123 - // TODO: Tests that we remove primes from assignments in the init functino + // TODO: Tests that we remove primes from assignments in the init function action init = { x' = importedValue + instantiatedValue } + // Tests that we can specify an alternative init via CLI args + action altInit = { + x' = 0 + } + action step = x' = x + 1 + // Tests that we can specify an alternative step via CLI args + action altStep = x' = x + 0 + def inv = x >= 0 + + // Tests that we can specify an alternative invariant via CLI args + def altInv = x >= 0 } From 11fcd96869d61409d1f8958fed4f1cd1d3bb010f Mon Sep 17 00:00:00 2001 From: Gabriela Moreira Date: Tue, 19 Mar 2024 17:37:43 -0300 Subject: [PATCH 309/388] Apply suggestions from code review --- quint/apalache-tests.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/quint/apalache-tests.md b/quint/apalache-tests.md index 5517ca4b7..fc021999c 100644 --- a/quint/apalache-tests.md +++ b/quint/apalache-tests.md @@ -226,7 +226,7 @@ An example execution: ``` -quint compile --target tlaplus ./testFixture/ApalacheCompilation.qnt +quint compile --target tlaplus ./testFixture/ApalacheCompilation.qnt ``` @@ -262,7 +262,7 @@ init == ================================================================================ ``` -### Test that we can compile a module to TLA+ that instantiates but has not declarations +### Test that we can compile a module to TLA+ that instantiates but has no declarations From 0a8baa60016c9576bdcb3e7306a6ea47307f09bf Mon Sep 17 00:00:00 2001 From: bugarela Date: Wed, 20 Mar 2024 09:01:13 -0300 Subject: [PATCH 310/388] Bump apalache version --- quint/src/apalache.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/apalache.ts b/quint/src/apalache.ts index a382957a8..b22b2c270 100644 --- a/quint/src/apalache.ts +++ b/quint/src/apalache.ts @@ -39,7 +39,7 @@ import type { Buffer } from 'buffer' import type { PackageDefinition as ProtoPackageDefinition } from '@grpc/proto-loader' const APALACHE_SERVER_URI = 'localhost:8822' -const APALACHE_VERSION_TAG = '0.44.7' +const APALACHE_VERSION_TAG = '0.44.8' // TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 // const APALACHE_TGZ = 'apalache.tgz' From 899360a86850e969436afc1fc38bd16aec8a8b27 Mon Sep 17 00:00:00 2001 From: bugarela Date: Thu, 21 Mar 2024 11:36:28 -0300 Subject: [PATCH 311/388] Fix the type quantification strategy and corresponding tests --- examples/cosmwasm/zero-to-hero/vote.qnt | 5 +- quint/src/types/base.ts | 5 +- quint/src/types/constraintGenerator.ts | 192 +++++++++++++----------- quint/test/types/inferrer.test.ts | 32 ++-- 4 files changed, 128 insertions(+), 106 deletions(-) diff --git a/examples/cosmwasm/zero-to-hero/vote.qnt b/examples/cosmwasm/zero-to-hero/vote.qnt index 61adf5a58..fed0492b9 100644 --- a/examples/cosmwasm/zero-to-hero/vote.qnt +++ b/examples/cosmwasm/zero-to-hero/vote.qnt @@ -489,10 +489,7 @@ module state { ) // assert that aggregated sum in `polls[poll_id]` equals the sum from above val poll = state.polls.get(poll_id) - poll.options.listForall(option => - val optionKey = option._1 - // FIXME(#1167): Type annotation below is a workaround, inferred type is too general - val optionSum: int = option._2 + poll.options.listForall(((optionKey, optionSum)) => // `ballots` only contains entries if there are > 0 votes. optionSum > 0 implies and { summed_ballots.keys().contains(optionKey), diff --git a/quint/src/types/base.ts b/quint/src/types/base.ts index 23f357f21..4ba069a3c 100644 --- a/quint/src/types/base.ts +++ b/quint/src/types/base.ts @@ -21,12 +21,13 @@ export type Constraint = */ const constraintKinds = ['empty', 'eq', 'conjunction', 'isDefined'] as const -export interface TypeScheme { - type: QuintType +export interface QuantifiedVariables { typeVariables: Set rowVariables: Set } +export type TypeScheme = { type: QuintType } & QuantifiedVariables + export type Signature = (_arity: number) => TypeScheme // Does not bind any type variables in `type`, which we take to assume diff --git a/quint/src/types/constraintGenerator.ts b/quint/src/types/constraintGenerator.ts index 3f19dd1fb..5c60fb58c 100644 --- a/quint/src/types/constraintGenerator.ts +++ b/quint/src/types/constraintGenerator.ts @@ -1,5 +1,5 @@ /* ---------------------------------------------------------------------------------- - * Copyright 2022 Informal Systems + * Copyright 2022-2024 Informal Systems * Licensed under the Apache License, Version 2.0. * See LICENSE in the project root for license information. * --------------------------------------------------------------------------------- */ @@ -18,7 +18,7 @@ import { QuintAssume, QuintBool, QuintConst, - QuintDef, + QuintDeclaration, QuintEx, QuintInstance, QuintInt, @@ -35,7 +35,7 @@ import { expressionToString, rowToString, typeToString } from '../ir/IRprinting' import { Either, left, mergeInMany, right } from '@sweet-monads/either' import { Error, ErrorTree, buildErrorLeaf, buildErrorTree, errorTreeToString } from '../errorTree' import { getSignatures } from './builtinSignatures' -import { Constraint, Signature, TypeScheme, toScheme } from './base' +import { Constraint, QuantifiedVariables, Signature, TypeScheme, toScheme } from './base' import { Substitutions, applySubstitution, compose } from './substitutions' import { LookupTable } from '../names/base' import { @@ -95,7 +95,7 @@ export class ConstraintGeneratorVisitor implements IRVisitor { } } - protected types: Map = new Map() + protected types: Map = new Map() protected errors: Map = new Map() protected freshVarGenerator: FreshVarGenerator protected table: LookupTable @@ -104,13 +104,14 @@ export class ConstraintGeneratorVisitor implements IRVisitor { private solvingFunction: SolvingFunctionType private builtinSignatures: Map = getSignatures() + // A map to save which type variables were free when we started visiting an opdef or an assume + protected tvs: Map = new Map() + // Temporary type map only for types in scope for a certain declaration + protected typesInScope: Map = new Map() + // Track location descriptions for error tree traces private location: string = '' - // A stack of free type variables and row variables for lambda expressions. - // Nested lambdas add new entries to the stack, and pop them when exiting. - private freeNames: { typeVariables: Set; rowVariables: Set }[] = [] - getResult(): [Map, Map] { return [this.errors, this.types] } @@ -119,18 +120,6 @@ export class ConstraintGeneratorVisitor implements IRVisitor { this.location = `Generating constraints for ${expressionToString(e)}` } - exitDef(def: QuintDef) { - if (this.constraints.length > 0) { - this.solveConstraints().map(subs => { - if (isAnnotatedDef(def)) { - checkAnnotationGenerality(subs, def.typeAnnotation).mapLeft(err => - this.errors.set(def.typeAnnotation?.id ?? def.id, err) - ) - } - }) - } - } - exitVar(e: QuintVar) { this.addToResults(e.id, right(toScheme(e.typeAnnotation))) } @@ -244,22 +233,14 @@ export class ConstraintGeneratorVisitor implements IRVisitor { } enterLambda(expr: QuintLambda) { - const lastParamNames = this.currentFreeNames() - const paramNames = { - typeVariables: new Set(lastParamNames.typeVariables), - rowVariables: new Set(lastParamNames.rowVariables), - } expr.params.forEach(p => { const varName = p.name === '_' ? this.freshVarGenerator.freshVar('_t') : `t_${p.name}_${p.id}` - paramNames.typeVariables.add(varName) const paramTypeVar: QuintVarType = { kind: 'var', name: varName } this.addToResults(p.id, right(toScheme(paramTypeVar))) if (p.typeAnnotation) { this.constraints.push({ kind: 'eq', types: [paramTypeVar, p.typeAnnotation], sourceId: p.id }) } }) - - this.freeNames.push(paramNames) } // Γ ∪ {p0: t0, ..., pn: tn} ⊢ e: (te, c) t0, ..., tn are fresh @@ -283,7 +264,6 @@ export class ConstraintGeneratorVisitor implements IRVisitor { }) this.addToResults(e.id, result) - this.freeNames.pop() } // Γ ⊢ e1: (t1, c1) s = solve(c1) s(Γ ∪ {n: t1}) ⊢ e2: (t2, c2) @@ -294,22 +274,58 @@ export class ConstraintGeneratorVisitor implements IRVisitor { return } - // TODO: Occurs check on operator body to prevent recursion, see https://github.com/informalsystems/quint/issues/171 - this.addToResults(e.id, this.fetchResult(e.expr.id)) } - exitOpDef(e: QuintOpDef) { + exitDecl(_def: QuintDeclaration) { + this.typesInScope = new Map() + } + + enterOpDef(def: QuintOpDef) { + // Save which type variables were free when we started visiting this op def + const tvs = this.freeNamesInScope() + this.tvs.set(def.id, tvs) + } + + exitOpDef(def: QuintOpDef) { if (this.errors.size !== 0) { return } - this.fetchResult(e.expr.id).map(t => { - this.addToResults(e.id, right(this.quantify(t.type))) - if (e.typeAnnotation) { - this.constraints.push({ kind: 'eq', types: [t.type, e.typeAnnotation], sourceId: e.id }) + this.fetchResult(def.expr.id).map(t => { + if (def.typeAnnotation) { + this.constraints.push({ kind: 'eq', types: [t.type, def.typeAnnotation], sourceId: def.id }) } }) + + const tvs_before = this.tvs.get(def.id)! + + if (this.constraints.length > 0) { + this.solveConstraints().map(subs => { + // For every free name we are binding in the substitutions, the names occuring in the value of the substitution + // have to become free as well. + addBindingsToFreeTypes(tvs_before, subs) + + if (isAnnotatedDef(def)) { + checkAnnotationGenerality(subs, def.typeAnnotation).mapLeft(err => + this.errors.set(def.typeAnnotation?.id ?? def.id, err) + ) + } + }) + } + + const tvs = this.freeNamesInScope() + // Any new free names, that were not free before, have to be quantified + const toQuantify = variablesDifference(tvs, tvs_before) + + this.fetchResult(def.expr.id).map(t => { + this.addToResults(def.id, right(quantify(toQuantify, t.type))) + }) + } + + enterAssume(e: QuintAssume) { + const tvs = this.freeNamesInScope() + this.tvs.set(e.id, tvs) } exitAssume(e: QuintAssume) { @@ -318,7 +334,10 @@ export class ConstraintGeneratorVisitor implements IRVisitor { } this.fetchResult(e.assumption.id).map(t => { - this.addToResults(e.id, right(this.quantify(t.type))) + const tvs_before = this.tvs.get(e.id)! + const tvs = this.freeNamesInScope() + const toQuantify = variablesDifference(tvs, tvs_before) + this.addToResults(e.id, right(quantify(toQuantify, t.type))) this.constraints.push({ kind: 'eq', types: [t.type, { kind: 'bool' }], sourceId: e.id }) }) } @@ -326,7 +345,10 @@ export class ConstraintGeneratorVisitor implements IRVisitor { private addToResults(exprId: bigint, result: Either) { result .mapLeft(err => this.errors.set(exprId, buildErrorTree(this.location, err))) - .map(r => this.types.set(exprId, r)) + .map(r => { + this.typesInScope.set(exprId, r) + this.types.set(exprId, r) + }) } private fetchResult(id: bigint): Either { @@ -350,16 +372,9 @@ export class ConstraintGeneratorVisitor implements IRVisitor { return this.solvingFunction(this.table, constraint) .mapLeft(errors => errors.forEach((err, id) => this.errors.set(id, err))) .map(subs => { - // For every free name we are binding in the substitutions, the names occuring in the value of the substitution - // have to become free as well. - this.addBindingsToFreeNames(subs) - - // Apply substitution to environment - // FIXME: We have to figure out the scope of the constraints/substitutions - // https://github.com/informalsystems/quint/issues/690 - this.types.forEach((oldScheme, id) => { + this.typesInScope.forEach((oldScheme, id) => { const newType = applySubstitution(this.table, subs, oldScheme.type) - const newScheme: TypeScheme = this.quantify(newType) + const newScheme: TypeScheme = { ...oldScheme, type: newType } this.addToResults(id, right(newScheme)) }) @@ -408,45 +423,18 @@ export class ConstraintGeneratorVisitor implements IRVisitor { return applySubstitution(this.table, subs, t.type) } - private currentFreeNames(): { typeVariables: Set; rowVariables: Set } { - return ( - this.freeNames[this.freeNames.length - 1] ?? { - typeVariables: new Set(), - rowVariables: new Set(), - } + private freeNamesInScope(): QuantifiedVariables { + return [...this.typesInScope.values()].reduce( + (acc, t) => { + const names = freeTypes(t) + return { + typeVariables: new Set([...names.typeVariables, ...acc.typeVariables]), + rowVariables: new Set([...names.rowVariables, ...acc.rowVariables]), + } + }, + { typeVariables: new Set(), rowVariables: new Set() } ) } - - private quantify(type: QuintType): TypeScheme { - const freeNames = this.currentFreeNames() - const nonFreeNames = { - typeVariables: new Set([...typeNames(type).typeVariables].filter(name => !freeNames.typeVariables.has(name))), - rowVariables: new Set([...typeNames(type).rowVariables].filter(name => !freeNames.rowVariables.has(name))), - } - return { ...nonFreeNames, type } - } - - private addBindingsToFreeNames(substitutions: Substitutions) { - // Assumes substitutions are topologically sorted, i.e. [ t0 |-> (t1, t2), t1 |-> (t3, t4) ] - substitutions.forEach(s => { - switch (s.kind) { - case 'type': - this.freeNames - .filter(free => free.typeVariables.has(s.name)) - .forEach(free => { - const names = typeNames(s.value) - names.typeVariables.forEach(v => free.typeVariables.add(v)) - names.rowVariables.forEach(v => free.rowVariables.add(v)) - }) - return - case 'row': - this.freeNames - .filter(free => free.rowVariables.has(s.name)) - .forEach(free => rowNames(s.value).forEach(v => free.rowVariables.add(v))) - return - } - }) - } } function checkAnnotationGenerality( @@ -479,3 +467,39 @@ function checkAnnotationGenerality( return right(subs) } } + +function quantify(tvs: QuantifiedVariables, type: QuintType): TypeScheme { + return { ...tvs, type } +} + +function freeTypes(t: TypeScheme): QuantifiedVariables { + const allNames = typeNames(t.type) + return variablesDifference(allNames, { typeVariables: t.typeVariables, rowVariables: t.rowVariables }) +} + +function addBindingsToFreeTypes(free: QuantifiedVariables, substitutions: Substitutions): void { + // Assumes substitutions are topologically sorted, i.e. [ t0 |-> (t1, t2), t1 |-> (t3, t4) ] + substitutions.forEach(s => { + switch (s.kind) { + case 'type': + if (free.typeVariables.has(s.name)) { + const names = typeNames(s.value) + names.typeVariables.forEach(v => free.typeVariables.add(v)) + names.rowVariables.forEach(v => free.rowVariables.add(v)) + } + return + case 'row': + if (free.rowVariables.has(s.name)) { + rowNames(s.value).forEach(v => free.rowVariables.add(v)) + } + return + } + }) +} + +function variablesDifference(a: QuantifiedVariables, b: QuantifiedVariables): QuantifiedVariables { + return { + typeVariables: new Set([...a.typeVariables].filter(tv => !b.typeVariables.has(tv))), + rowVariables: new Set([...a.rowVariables].filter(tv => !b.rowVariables.has(tv))), + } +} diff --git a/quint/test/types/inferrer.test.ts b/quint/test/types/inferrer.test.ts index a3471cf5d..f7664a3fb 100644 --- a/quint/test/types/inferrer.test.ts +++ b/quint/test/types/inferrer.test.ts @@ -97,11 +97,11 @@ describe('inferTypes', () => { [14n, 'int'], [15n, '((bool) => int, bool) => int'], [16n, '((bool) => int, bool) => int'], - [1n, '∀ t0, t1 . (t0) => t1'], - [2n, '∀ t0 . t0'], - [3n, '∀ t0 . t0'], - [4n, '∀ t0 . t0'], - [5n, '∀ t0, t1 . ((t0) => t1, t0) => t1'], + [1n, '(t_p_2) => _t4'], + [2n, 't_p_2'], + [3n, 't_p_2'], + [4n, '_t4'], + [5n, '((t_p_2) => _t4, t_p_2) => _t4'], [6n, '∀ t0, t1 . ((t0) => t1, t0) => t1'], ]) }) @@ -129,14 +129,14 @@ describe('inferTypes', () => { [10n, '{ f1: int, f2: bool }'], [11n, 'Set[{ f1: int, f2: bool }]'], [12n, 'Set[{ f1: int, f2: bool }]'], - [13n, '∀ r0 . { f1: int | r0 }'], + [13n, '{ f1: int | tail__t3 }'], [14n, '{ f1: int, f2: bool }'], [15n, 'str'], - [16n, '∀ r0 . { f1: int | r0 }'], + [16n, '{ f1: int | tail__t3 }'], [17n, 'str'], [18n, 'int'], [19n, '{ f1: int, f2: bool }'], - [20n, '∀ r0 . ({ f1: int | r0 }) => { f1: int, f2: bool }'], + [20n, '({ f1: int | tail__t3 }) => { f1: int, f2: bool }'], [21n, '∀ r0 . ({ f1: int | r0 }) => { f1: int, f2: bool }'], [23n, 'str'], [22n, 'int'], @@ -156,16 +156,16 @@ describe('inferTypes', () => { const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) // _printUpdatedStringTypes(stringTypes) assert.sameDeepMembers(stringTypes, [ - [1n, '∀ t0, r0 . (t0 | r0)'], - [2n, '∀ t0, t1, r0 . (t0, t1 | r0)'], - [3n, '∀ t0, r0 . (t0 | r0)'], + [1n, '(_t0 | tail__t0)'], + [2n, '(tup__t1_0, _t1 | tail__t1)'], + [3n, '(_t0 | tail__t0)'], [4n, 'int'], - [5n, '∀ t0 . t0'], - [6n, '∀ t0, t1, r0 . (t0, t1 | r0)'], + [5n, '_t0'], + [6n, '(tup__t1_0, _t1 | tail__t1)'], [7n, 'int'], - [8n, '∀ t0 . t0'], - [9n, '∀ t0, t1 . (t0, t1)'], - [10n, '∀ t0, t1, t2, r0, r1 . ((t0 | r0), (t1, t2 | r1)) => (t0, t2)'], + [8n, '_t1'], + [9n, '(_t0, _t1)'], + [10n, '((_t0 | tail__t0), (tup__t1_0, _t1 | tail__t1)) => (_t0, _t1)'], [11n, '∀ t0, t1, t2, r0, r1 . ((t0 | r0), (t1, t2 | r1)) => (t0, t2)'], ]) }) From 2c6759341985d85b2ff6982f4058587458a1c0bb Mon Sep 17 00:00:00 2001 From: bugarela Date: Fri, 22 Mar 2024 08:29:09 -0300 Subject: [PATCH 312/388] Bump Apalache version again --- quint/src/apalache.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/apalache.ts b/quint/src/apalache.ts index b22b2c270..83122e045 100644 --- a/quint/src/apalache.ts +++ b/quint/src/apalache.ts @@ -39,7 +39,7 @@ import type { Buffer } from 'buffer' import type { PackageDefinition as ProtoPackageDefinition } from '@grpc/proto-loader' const APALACHE_SERVER_URI = 'localhost:8822' -const APALACHE_VERSION_TAG = '0.44.8' +const APALACHE_VERSION_TAG = '0.44.9' // TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 // const APALACHE_TGZ = 'apalache.tgz' From a43eaaa7c16ffa453fecc4aa68f0490b8f8563b3 Mon Sep 17 00:00:00 2001 From: bugarela Date: Fri, 22 Mar 2024 08:29:21 -0300 Subject: [PATCH 313/388] Update test expectation --- quint/apalache-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/apalache-tests.md b/quint/apalache-tests.md index fc021999c..e4ff60b30 100644 --- a/quint/apalache-tests.md +++ b/quint/apalache-tests.md @@ -237,7 +237,7 @@ EXTENDS Integers, Sequences, FiniteSets, TLC, Apalache, Variants VARIABLE x -A == Variant("A", <<>>) +A == Variant("A", "U_OF_UNIT") B(__BParam_27) == Variant("B", __BParam_27) From e1ebfc214c3cb18aac9dc215d399462a01a93650 Mon Sep 17 00:00:00 2001 From: Gabriela Moreira Date: Fri, 22 Mar 2024 08:49:19 -0300 Subject: [PATCH 314/388] Apply suggestions from code review --- doc/quint.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/quint.md b/doc/quint.md index 12c5bd6c1..af6124f07 100644 --- a/doc/quint.md +++ b/doc/quint.md @@ -101,8 +101,8 @@ the file is taken to be the main module. The main module must specify a state machine. This means it must either define actions named `init` and `step`, specifying the initial state and the -transition action respectivefly, or suitable actions defined in the main module -must be indicated using the `--init` and `--step` actions. +transition action respectively, or suitable actions defined in the main module +must be indicated using the `--init` and `--step` options. The following compilation targets are supported From f695cb857ff47004341e2029a064fcd660177a1b Mon Sep 17 00:00:00 2001 From: bugarela Date: Fri, 22 Mar 2024 08:59:39 -0300 Subject: [PATCH 315/388] Add CHANGELOG entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 80d1fa7d5..f07af671a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Removed a dependency causing deprecation errors messages to be emitted. (#1380) +- Fixed a type checker bug causing too general types to be inferred (#1409). ### Security From d235fd0db301e146ef33ca93602f86fb85f81411 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 25 Mar 2024 12:00:55 -0300 Subject: [PATCH 316/388] Fix serialization of Sets --- quint/src/cliCommands.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index 99c6f968f..e05438d9d 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -901,7 +901,7 @@ function addItfHeader(source: string, status: string, traceInJson: any): any { // Preprocess troublesome types so they are represented in JSON. // -// We need it particularly because, by default, serialization of Map +// We need it particularly because, by default, serialization of Map and Set // objects just produces an empty object // (see https://stackoverflow.com/questions/46634449/json-stringify-of-object-of-map-return-empty) // @@ -910,6 +910,9 @@ function replacer(_key: String, value: any): any { if (value instanceof Map) { // Represent Maps as JSON objects return Object.fromEntries(value) + } else if (value instanceof Set) { + // Represent Sets as JSON arrays + return Array.from(value) } else { return value } From 9557b01ae7b84822584f6e5c6ead591c5a075839 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 25 Mar 2024 12:04:50 -0300 Subject: [PATCH 317/388] Add CHANGELOG entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f07af671a..7ede3f019 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Removed a dependency causing deprecation errors messages to be emitted. (#1380) - Fixed a type checker bug causing too general types to be inferred (#1409). +- Fixes serialization of Sets in JSON outputs (#1410). ### Security From 0ff85c73130a2ee293a5f5ec9645a58dee1c2a93 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 25 Mar 2024 15:16:36 -0300 Subject: [PATCH 318/388] Bump Apalache version --- quint/src/apalache.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/apalache.ts b/quint/src/apalache.ts index 83122e045..ac46dff63 100644 --- a/quint/src/apalache.ts +++ b/quint/src/apalache.ts @@ -39,7 +39,7 @@ import type { Buffer } from 'buffer' import type { PackageDefinition as ProtoPackageDefinition } from '@grpc/proto-loader' const APALACHE_SERVER_URI = 'localhost:8822' -const APALACHE_VERSION_TAG = '0.44.9' +const APALACHE_VERSION_TAG = '0.44.10' // TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 // const APALACHE_TGZ = 'apalache.tgz' From 3994c6b636bfedbe1e20bdfdd752c6ae3ff51d3c Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 25 Mar 2024 15:28:32 -0300 Subject: [PATCH 319/388] Release v0.19.0 --- CHANGELOG.md | 9 +++++++++ quint/package-lock.json | 4 ++-- quint/package.json | 16 +++++++++++++--- quint/src/version.ts | 2 +- 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ede3f019..72a8b2849 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.19.0 -- 2024-03-25 + ### Added - Added polymorphic type declarations, allowing abstracting commonly used data diff --git a/quint/package-lock.json b/quint/package-lock.json index 026906f79..e0a90bc42 100644 --- a/quint/package-lock.json +++ b/quint/package-lock.json @@ -1,12 +1,12 @@ { "name": "@informalsystems/quint", - "version": "0.18.3", + "version": "0.19.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@informalsystems/quint", - "version": "0.18.3", + "version": "0.19.0", "license": "Apache 2.0", "dependencies": { "@grpc/grpc-js": "^1.8.14", diff --git a/quint/package.json b/quint/package.json index cda2d27d1..c998fee87 100644 --- a/quint/package.json +++ b/quint/package.json @@ -1,8 +1,14 @@ { "name": "@informalsystems/quint", - "version": "0.18.3", + "version": "0.19.0", "description": "Core tool for the Quint specification language", - "keywords": ["temporal", "logic", "formal", "specification", "verification"], + "keywords": [ + "temporal", + "logic", + "formal", + "specification", + "verification" + ], "homepage": "https://github.com/informalsystems/quint", "bugs": "https://github.com/informalsystems/quint/issues", "license": "Apache 2.0", @@ -29,7 +35,11 @@ "bin": { "quint": "dist/src/cli.js" }, - "files": ["README.md", "dist/**/*", "test/**/*.ts"], + "files": [ + "README.md", + "dist/**/*", + "test/**/*.ts" + ], "engines": { "node": "18 - 20" }, diff --git a/quint/src/version.ts b/quint/src/version.ts index 8172abdfa..808e70727 100644 --- a/quint/src/version.ts +++ b/quint/src/version.ts @@ -1,2 +1,2 @@ // Generated by genversion. -export const version = '0.18.3' +export const version = '0.19.0' From 49cf203c98e743698fc5442c5a86974b99aff502 Mon Sep 17 00:00:00 2001 From: bugarela Date: Tue, 26 Mar 2024 08:32:45 -0300 Subject: [PATCH 320/388] VSCode Release v0.14.0 --- vscode/quint-vscode/CHANGELOG.md | 9 ++ vscode/quint-vscode/package-lock.json | 4 +- vscode/quint-vscode/package.json | 2 +- vscode/quint-vscode/server/package-lock.json | 123 +++++++------------ vscode/quint-vscode/server/package.json | 4 +- 5 files changed, 56 insertions(+), 86 deletions(-) diff --git a/vscode/quint-vscode/CHANGELOG.md b/vscode/quint-vscode/CHANGELOG.md index 2c8eb0c06..fb5e62dec 100644 --- a/vscode/quint-vscode/CHANGELOG.md +++ b/vscode/quint-vscode/CHANGELOG.md @@ -14,6 +14,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed ### Security +## v0.14.0 -- 2024-03-26 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + ## v0.13.7 -- 2024-02-08 ### Added diff --git a/vscode/quint-vscode/package-lock.json b/vscode/quint-vscode/package-lock.json index 1b7f69401..900f52373 100644 --- a/vscode/quint-vscode/package-lock.json +++ b/vscode/quint-vscode/package-lock.json @@ -1,12 +1,12 @@ { "name": "quint-vscode", - "version": "0.13.7", + "version": "0.14.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "quint-vscode", - "version": "0.13.7", + "version": "0.14.0", "hasInstallScript": true, "dependencies": { "vscode-languageclient": "^7.0.0" diff --git a/vscode/quint-vscode/package.json b/vscode/quint-vscode/package.json index 10eb198ad..ee5f35fa2 100644 --- a/vscode/quint-vscode/package.json +++ b/vscode/quint-vscode/package.json @@ -3,7 +3,7 @@ "displayName": "Quint", "description": "Language support for Quint specifications", "icon": "quint-logo-vscode.png", - "version": "0.13.7", + "version": "0.14.0", "publisher": "informal", "engines": { "vscode": "^1.52.0" diff --git a/vscode/quint-vscode/server/package-lock.json b/vscode/quint-vscode/server/package-lock.json index d0ffde05d..b9ff769fe 100644 --- a/vscode/quint-vscode/server/package-lock.json +++ b/vscode/quint-vscode/server/package-lock.json @@ -1,15 +1,15 @@ { "name": "@informalsystems/quint-language-server", - "version": "0.13.7", + "version": "0.14.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint-language-server", - "version": "0.13.7", + "version": "0.14.0", "license": "Apache 2.0", "dependencies": { - "@informalsystems/quint": "^0.18.3", + "@informalsystems/quint": "^0.19.0", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" @@ -476,9 +476,9 @@ "dev": true }, "node_modules/@informalsystems/quint": { - "version": "0.18.3", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.18.3.tgz", - "integrity": "sha512-NemkxVijY7DC9dyVQwp/S3K0PhbDjGVRZx2RmXlt9x8kUt0I1RgYtqChc0Za39tl/p9Tu+CbB1Pa2KEJyw2JXA==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.19.0.tgz", + "integrity": "sha512-gyoyraa6C163gRFNB9LUzCHLpyUfcnyK7r0HKKzi0jsN9w9TJzxfXFc48X2l0qAf2Y9IJx3s7khqJtNX51xgsA==", "dependencies": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", @@ -486,6 +486,7 @@ "@sweet-monads/either": "~3.2.0", "@sweet-monads/maybe": "~3.2.0", "@types/line-column": "^1.0.0", + "@types/lodash.clonedeep": "4.5.0", "@types/seedrandom": "^3.0.4", "antlr4ts": "^0.5.0-alpha.4", "chalk": "^4.1.2", @@ -494,8 +495,8 @@ "json-bigint": "^1.0.0", "line-column": "^1.0.2", "lodash": "^4.17.21", + "lodash.clonedeep": "4.5.0", "lodash.isequal": "^4.5.0", - "node-fetch": "^2.6.13", "seedrandom": "^3.0.5", "tar": "^6.1.14", "yargs": "^17.2.1" @@ -504,7 +505,7 @@ "quint": "dist/src/cli.js" }, "engines": { - "node": ">=18" + "node": "18 - 20" } }, "node_modules/@informalsystems/quint/node_modules/cliui": { @@ -828,8 +829,15 @@ "node_modules/@types/lodash": { "version": "4.14.191", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", - "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==", - "dev": true + "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==" + }, + "node_modules/@types/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@types/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-IHijjFVPJTvzvrNPz+6nQy5lZQb7uh807RfTIEaQBrZXrIGjZy0L2dEb3hju34J0eqbXLCY6Hub/g81Jl4pGCA==", + "dependencies": { + "@types/lodash": "*" + } }, "node_modules/@types/mocha": { "version": "8.2.3", @@ -5129,6 +5137,11 @@ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" + }, "node_modules/lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", @@ -5445,25 +5458,6 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -6421,11 +6415,6 @@ "node": ">=8.0" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, "node_modules/ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", @@ -6666,20 +6655,6 @@ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==" }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -7207,9 +7182,9 @@ "dev": true }, "@informalsystems/quint": { - "version": "0.18.3", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.18.3.tgz", - "integrity": "sha512-NemkxVijY7DC9dyVQwp/S3K0PhbDjGVRZx2RmXlt9x8kUt0I1RgYtqChc0Za39tl/p9Tu+CbB1Pa2KEJyw2JXA==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.19.0.tgz", + "integrity": "sha512-gyoyraa6C163gRFNB9LUzCHLpyUfcnyK7r0HKKzi0jsN9w9TJzxfXFc48X2l0qAf2Y9IJx3s7khqJtNX51xgsA==", "requires": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", @@ -7217,6 +7192,7 @@ "@sweet-monads/either": "~3.2.0", "@sweet-monads/maybe": "~3.2.0", "@types/line-column": "^1.0.0", + "@types/lodash.clonedeep": "4.5.0", "@types/seedrandom": "^3.0.4", "antlr4ts": "^0.5.0-alpha.4", "chalk": "^4.1.2", @@ -7225,8 +7201,8 @@ "json-bigint": "^1.0.0", "line-column": "^1.0.2", "lodash": "^4.17.21", + "lodash.clonedeep": "4.5.0", "lodash.isequal": "^4.5.0", - "node-fetch": "^2.6.13", "seedrandom": "^3.0.5", "tar": "^6.1.14", "yargs": "^17.2.1" @@ -7513,8 +7489,15 @@ "@types/lodash": { "version": "4.14.191", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", - "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==", - "dev": true + "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==" + }, + "@types/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@types/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-IHijjFVPJTvzvrNPz+6nQy5lZQb7uh807RfTIEaQBrZXrIGjZy0L2dEb3hju34J0eqbXLCY6Hub/g81Jl4pGCA==", + "requires": { + "@types/lodash": "*" + } }, "@types/mocha": { "version": "8.2.3", @@ -10707,6 +10690,11 @@ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" + }, "lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", @@ -10956,14 +10944,6 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -11650,11 +11630,6 @@ "is-number": "^7.0.0" } }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, "ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", @@ -11840,20 +11815,6 @@ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==" }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/vscode/quint-vscode/server/package.json b/vscode/quint-vscode/server/package.json index f416bbaa8..fbd39ff11 100644 --- a/vscode/quint-vscode/server/package.json +++ b/vscode/quint-vscode/server/package.json @@ -1,7 +1,7 @@ { "name": "@informalsystems/quint-language-server", "description": "Language Server for the Quint specification language", - "version": "0.13.7", + "version": "0.14.0", "author": "Informal Systems", "contributors": [ { @@ -43,7 +43,7 @@ "test/**/*.ts" ], "dependencies": { - "@informalsystems/quint": "^0.18.3", + "@informalsystems/quint": "^0.19.0", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" From f7b38df6490efc02fc720118f6933422bbede3c2 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 1 Apr 2024 09:59:55 -0300 Subject: [PATCH 321/388] Update pretty-printing of the unit type in a sum type --- quint/src/graphics.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/quint/src/graphics.ts b/quint/src/graphics.ts index cafa467bc..2fa8080f4 100644 --- a/quint/src/graphics.ts +++ b/quint/src/graphics.ts @@ -108,8 +108,8 @@ export function prettyQuintEx(ex: QuintEx): Doc { const valueExpr = ex.args[1] const value = - valueExpr.kind === 'app' && valueExpr.opcode === 'Rec' && valueExpr.args.length === 0 - ? [] // A payload with the empty record is shown as a bare label + valueExpr.kind === 'app' && valueExpr.opcode === 'Tup' && valueExpr.args.length === 0 + ? [] // A payload with the empty tuple is shown as a bare label : [text('('), prettyQuintEx(valueExpr), text(')')] return group([label, ...value]) From 1ed273b7dcdd9faaff5fb65cc57ffc6bc8e67319 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 1 Apr 2024 10:01:58 -0300 Subject: [PATCH 322/388] Convert "U_OF_UNIT" from Apalache to the empty tuple --- quint/src/itf.ts | 6 ++++++ quint/test/itf.test.ts | 24 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/quint/src/itf.ts b/quint/src/itf.ts index 525d28989..6daaa81f8 100644 --- a/quint/src/itf.ts +++ b/quint/src/itf.ts @@ -189,6 +189,12 @@ export function ofItf(itf: ItfTrace): QuintEx[] { if (typeof value === 'boolean') { return { id, kind: 'bool', value } } else if (typeof value === 'string') { + if (value === 'U_OF_UNIT') { + // Apalache converts empty tuples to its unit value, "U_OF_UNIT". + // We need to convert it back to Quint's unit value, the empty tuple. + return { id, kind: 'app', opcode: 'Tup', args: [] } + } + return { id, kind: 'str', value } } else if (isBigint(value)) { // this is the standard way of encoding an integer in ITF. diff --git a/quint/test/itf.test.ts b/quint/test/itf.test.ts index 507e8a23a..03d490211 100644 --- a/quint/test/itf.test.ts +++ b/quint/test/itf.test.ts @@ -88,4 +88,28 @@ describe('toItf', () => { `round trip conversion of trace failed` ) }) + + it('converts unit type from Apalache', () => { + const text = '{ a: () }' + + const trace = [buildExpression(text)] + const vars = ['a'] + const itfTrace = { + vars: vars, + states: [ + { + '#meta': { + index: 0, + }, + a: 'U_OF_UNIT', + }, + ], + } + + const roundTripTrace = ofItf(itfTrace) + assert( + zip(roundTripTrace, trace).every(([a, b]) => quintExAreEqual(a, b)), + `round trip conversion of trace failed` + ) + }) }) From 7cc7e17b309f81a44d89a0d993007c2898484ca5 Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 1 Apr 2024 10:10:43 -0300 Subject: [PATCH 323/388] Add CHANGELOG entry --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 72a8b2849..770a048c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Deprecated ### Removed ### Fixed + +- Fix a problem where sum types with no parameters were being printed with + either Quint's unit type `()` or Apalache's unit type `"U_OF_UNIT"` (#1416). + ### Security ## v0.19.0 -- 2024-03-25 From 2439aeef56a83446bdbbf4bc806a68a2f6b37c5e Mon Sep 17 00:00:00 2001 From: bugarela Date: Mon, 1 Apr 2024 10:34:16 -0300 Subject: [PATCH 324/388] Release v0.19.1 --- CHANGELOG.md | 9 +++++++++ quint/package-lock.json | 4 ++-- quint/package.json | 2 +- quint/src/version.ts | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 770a048c9..a34d5305a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## UNRELEASED +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.19.1 -- 2024-04-01 + ### Added ### Changed ### Deprecated diff --git a/quint/package-lock.json b/quint/package-lock.json index e0a90bc42..7585f9ed7 100644 --- a/quint/package-lock.json +++ b/quint/package-lock.json @@ -1,12 +1,12 @@ { "name": "@informalsystems/quint", - "version": "0.19.0", + "version": "0.19.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@informalsystems/quint", - "version": "0.19.0", + "version": "0.19.1", "license": "Apache 2.0", "dependencies": { "@grpc/grpc-js": "^1.8.14", diff --git a/quint/package.json b/quint/package.json index c998fee87..118b36ce6 100644 --- a/quint/package.json +++ b/quint/package.json @@ -1,6 +1,6 @@ { "name": "@informalsystems/quint", - "version": "0.19.0", + "version": "0.19.1", "description": "Core tool for the Quint specification language", "keywords": [ "temporal", diff --git a/quint/src/version.ts b/quint/src/version.ts index 808e70727..b49c84d06 100644 --- a/quint/src/version.ts +++ b/quint/src/version.ts @@ -1,2 +1,2 @@ // Generated by genversion. -export const version = '0.19.0' +export const version = '0.19.1' From 00dd030959a11c5d52a17b65ffd859526a37f9f2 Mon Sep 17 00:00:00 2001 From: bugarela Date: Fri, 5 Apr 2024 11:42:20 -0300 Subject: [PATCH 325/388] Parse the empty tuple type --- quint/src/generated/Quint.g4 | 3 +- quint/src/generated/Quint.interp | 2 +- quint/src/generated/QuintListener.ts | 14 + quint/src/generated/QuintParser.ts | 1451 +++++++++-------- quint/src/generated/QuintVisitor.ts | 9 + quint/src/parsing/ToIrListener.ts | 11 + .../testFixture/_1045polymorphicTypeDecl.json | 2 +- .../_1045polymorphicTypeDecl.map.json | 2 +- .../testFixture/_1045polymorphicTypeDecl.qnt | 1 + 9 files changed, 786 insertions(+), 709 deletions(-) diff --git a/quint/src/generated/Quint.g4 b/quint/src/generated/Quint.g4 index b562a451a..3c2ecaeb7 100644 --- a/quint/src/generated/Quint.g4 +++ b/quint/src/generated/Quint.g4 @@ -6,7 +6,7 @@ * 2. Make it expressive enough to capture all of the TLA logic. * * @author: Igor Konnov, Shon Feder, Gabriela Moreira, Jure Kukovec, Thomas Pani - * Informal Systems, 2021-2023 + * Informal Systems, 2021-2024 */ grammar Quint; @@ -119,6 +119,7 @@ type | SET '[' type ']' # typeSet // TODO: replace List with general type application | LIST '[' type ']' # typeList + | '(' ')' # typeUnit | '(' type ',' type (',' type)* ','? ')' # typeTuple | '{' row? '}' # typeRec | 'int' # typeInt diff --git a/quint/src/generated/Quint.interp b/quint/src/generated/Quint.interp index f372f04a1..761f5f1b0 100644 --- a/quint/src/generated/Quint.interp +++ b/quint/src/generated/Quint.interp @@ -191,4 +191,4 @@ identifier atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 803, 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, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 3, 2, 6, 2, 90, 10, 2, 13, 2, 14, 2, 91, 3, 2, 3, 2, 3, 3, 7, 3, 97, 10, 3, 12, 3, 14, 3, 100, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 106, 10, 3, 12, 3, 14, 3, 109, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 114, 10, 4, 12, 4, 14, 4, 117, 11, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 141, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 149, 10, 6, 12, 6, 14, 6, 152, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 159, 10, 6, 3, 6, 5, 6, 162, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 170, 10, 6, 12, 6, 14, 6, 173, 11, 6, 5, 6, 175, 10, 6, 3, 6, 5, 6, 178, 10, 6, 3, 6, 3, 6, 5, 6, 182, 10, 6, 3, 6, 3, 6, 5, 6, 186, 10, 6, 3, 6, 5, 6, 189, 10, 6, 5, 6, 191, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 205, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 212, 10, 8, 12, 8, 14, 8, 215, 11, 8, 3, 8, 5, 8, 218, 10, 8, 3, 9, 5, 9, 221, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 226, 10, 9, 12, 9, 14, 9, 229, 11, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 236, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 242, 10, 11, 3, 11, 3, 11, 3, 11, 5, 11, 247, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 258, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 266, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 272, 10, 13, 3, 13, 3, 13, 5, 13, 276, 10, 13, 5, 13, 278, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 289, 10, 14, 5, 14, 291, 10, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 304, 10, 15, 12, 15, 14, 15, 307, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 314, 10, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 327, 10, 15, 12, 15, 14, 15, 330, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 337, 10, 15, 5, 15, 339, 10, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 354, 10, 20, 12, 20, 14, 20, 357, 11, 20, 5, 20, 359, 10, 20, 3, 20, 5, 20, 362, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 383, 10, 20, 12, 20, 14, 20, 386, 11, 20, 3, 20, 5, 20, 389, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 395, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 412, 10, 20, 12, 20, 14, 20, 415, 11, 20, 3, 20, 3, 20, 5, 20, 419, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 427, 10, 20, 12, 20, 14, 20, 430, 11, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 443, 10, 22, 12, 22, 14, 22, 446, 11, 22, 3, 22, 3, 22, 3, 22, 5, 22, 451, 10, 22, 3, 22, 3, 22, 5, 22, 455, 10, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 464, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 480, 10, 24, 12, 24, 14, 24, 483, 11, 24, 3, 24, 5, 24, 486, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 495, 10, 24, 12, 24, 14, 24, 498, 11, 24, 3, 24, 5, 24, 501, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 511, 10, 24, 12, 24, 14, 24, 514, 11, 24, 3, 24, 5, 24, 517, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 526, 10, 24, 12, 24, 14, 24, 529, 11, 24, 3, 24, 5, 24, 532, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 540, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 548, 10, 24, 12, 24, 14, 24, 551, 11, 24, 3, 24, 5, 24, 554, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 564, 10, 24, 12, 24, 14, 24, 567, 11, 24, 3, 24, 5, 24, 570, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 578, 10, 24, 12, 24, 14, 24, 581, 11, 24, 5, 24, 583, 10, 24, 3, 24, 5, 24, 586, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 611, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 650, 10, 24, 3, 24, 5, 24, 653, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 660, 10, 24, 12, 24, 14, 24, 663, 11, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 669, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 674, 10, 25, 12, 25, 14, 25, 677, 11, 25, 3, 25, 3, 25, 3, 26, 3, 26, 5, 26, 683, 10, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 692, 10, 27, 3, 27, 5, 27, 695, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 706, 10, 28, 3, 29, 3, 29, 5, 29, 710, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 720, 10, 30, 12, 30, 14, 30, 723, 11, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 729, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 6, 31, 736, 10, 31, 13, 31, 14, 31, 737, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 5, 32, 747, 10, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 5, 35, 757, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 762, 10, 36, 12, 36, 14, 36, 765, 11, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 773, 10, 37, 3, 38, 3, 38, 5, 38, 777, 10, 38, 3, 39, 3, 39, 5, 39, 781, 10, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 7, 42, 790, 10, 42, 12, 42, 14, 42, 793, 11, 42, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 799, 10, 43, 3, 44, 3, 44, 3, 44, 2, 2, 4, 38, 46, 45, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 68, 2, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 86, 2, 2, 10, 3, 2, 53, 55, 3, 2, 51, 52, 3, 2, 56, 61, 4, 2, 45, 49, 65, 66, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 51, 61, 3, 2, 42, 44, 3, 2, 67, 68, 2, 901, 2, 89, 3, 2, 2, 2, 4, 98, 3, 2, 2, 2, 6, 115, 3, 2, 2, 2, 8, 140, 3, 2, 2, 2, 10, 190, 3, 2, 2, 2, 12, 204, 3, 2, 2, 2, 14, 206, 3, 2, 2, 2, 16, 220, 3, 2, 2, 2, 18, 230, 3, 2, 2, 2, 20, 237, 3, 2, 2, 2, 22, 257, 3, 2, 2, 2, 24, 277, 3, 2, 2, 2, 26, 290, 3, 2, 2, 2, 28, 338, 3, 2, 2, 2, 30, 340, 3, 2, 2, 2, 32, 342, 3, 2, 2, 2, 34, 344, 3, 2, 2, 2, 36, 346, 3, 2, 2, 2, 38, 418, 3, 2, 2, 2, 40, 431, 3, 2, 2, 2, 42, 454, 3, 2, 2, 2, 44, 456, 3, 2, 2, 2, 46, 610, 3, 2, 2, 2, 48, 664, 3, 2, 2, 2, 50, 682, 3, 2, 2, 2, 52, 687, 3, 2, 2, 2, 54, 705, 3, 2, 2, 2, 56, 709, 3, 2, 2, 2, 58, 728, 3, 2, 2, 2, 60, 730, 3, 2, 2, 2, 62, 746, 3, 2, 2, 2, 64, 748, 3, 2, 2, 2, 66, 750, 3, 2, 2, 2, 68, 756, 3, 2, 2, 2, 70, 758, 3, 2, 2, 2, 72, 772, 3, 2, 2, 2, 74, 776, 3, 2, 2, 2, 76, 780, 3, 2, 2, 2, 78, 782, 3, 2, 2, 2, 80, 784, 3, 2, 2, 2, 82, 786, 3, 2, 2, 2, 84, 798, 3, 2, 2, 2, 86, 800, 3, 2, 2, 2, 88, 90, 5, 4, 3, 2, 89, 88, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 89, 3, 2, 2, 2, 91, 92, 3, 2, 2, 2, 92, 93, 3, 2, 2, 2, 93, 94, 7, 2, 2, 3, 94, 3, 3, 2, 2, 2, 95, 97, 7, 69, 2, 2, 96, 95, 3, 2, 2, 2, 97, 100, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 98, 99, 3, 2, 2, 2, 99, 101, 3, 2, 2, 2, 100, 98, 3, 2, 2, 2, 101, 102, 7, 3, 2, 2, 102, 103, 5, 82, 42, 2, 103, 107, 7, 4, 2, 2, 104, 106, 5, 6, 4, 2, 105, 104, 3, 2, 2, 2, 106, 109, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 107, 108, 3, 2, 2, 2, 108, 110, 3, 2, 2, 2, 109, 107, 3, 2, 2, 2, 110, 111, 7, 5, 2, 2, 111, 5, 3, 2, 2, 2, 112, 114, 7, 69, 2, 2, 113, 112, 3, 2, 2, 2, 114, 117, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 115, 116, 3, 2, 2, 2, 116, 118, 3, 2, 2, 2, 117, 115, 3, 2, 2, 2, 118, 119, 5, 8, 5, 2, 119, 7, 3, 2, 2, 2, 120, 121, 7, 6, 2, 2, 121, 122, 5, 82, 42, 2, 122, 123, 7, 7, 2, 2, 123, 124, 5, 38, 20, 2, 124, 141, 3, 2, 2, 2, 125, 126, 7, 8, 2, 2, 126, 127, 5, 82, 42, 2, 127, 128, 7, 7, 2, 2, 128, 129, 5, 38, 20, 2, 129, 141, 3, 2, 2, 2, 130, 131, 7, 9, 2, 2, 131, 132, 5, 62, 32, 2, 132, 133, 7, 62, 2, 2, 133, 134, 5, 46, 24, 2, 134, 141, 3, 2, 2, 2, 135, 141, 5, 28, 15, 2, 136, 141, 5, 10, 6, 2, 137, 141, 5, 12, 7, 2, 138, 141, 5, 24, 13, 2, 139, 141, 5, 26, 14, 2, 140, 120, 3, 2, 2, 2, 140, 125, 3, 2, 2, 2, 140, 130, 3, 2, 2, 2, 140, 135, 3, 2, 2, 2, 140, 136, 3, 2, 2, 2, 140, 137, 3, 2, 2, 2, 140, 138, 3, 2, 2, 2, 140, 139, 3, 2, 2, 2, 141, 9, 3, 2, 2, 2, 142, 143, 5, 22, 12, 2, 143, 144, 5, 74, 38, 2, 144, 145, 7, 63, 2, 2, 145, 150, 5, 66, 34, 2, 146, 147, 7, 10, 2, 2, 147, 149, 5, 66, 34, 2, 148, 146, 3, 2, 2, 2, 149, 152, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 150, 151, 3, 2, 2, 2, 151, 153, 3, 2, 2, 2, 152, 150, 3, 2, 2, 2, 153, 154, 7, 64, 2, 2, 154, 155, 7, 7, 2, 2, 155, 158, 5, 38, 20, 2, 156, 157, 7, 62, 2, 2, 157, 159, 5, 46, 24, 2, 158, 156, 3, 2, 2, 2, 158, 159, 3, 2, 2, 2, 159, 161, 3, 2, 2, 2, 160, 162, 7, 11, 2, 2, 161, 160, 3, 2, 2, 2, 161, 162, 3, 2, 2, 2, 162, 191, 3, 2, 2, 2, 163, 164, 5, 22, 12, 2, 164, 177, 5, 74, 38, 2, 165, 174, 7, 63, 2, 2, 166, 171, 5, 64, 33, 2, 167, 168, 7, 10, 2, 2, 168, 170, 5, 64, 33, 2, 169, 167, 3, 2, 2, 2, 170, 173, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 171, 172, 3, 2, 2, 2, 172, 175, 3, 2, 2, 2, 173, 171, 3, 2, 2, 2, 174, 166, 3, 2, 2, 2, 174, 175, 3, 2, 2, 2, 175, 176, 3, 2, 2, 2, 176, 178, 7, 64, 2, 2, 177, 165, 3, 2, 2, 2, 177, 178, 3, 2, 2, 2, 178, 181, 3, 2, 2, 2, 179, 180, 7, 7, 2, 2, 180, 182, 5, 38, 20, 2, 181, 179, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 185, 3, 2, 2, 2, 183, 184, 7, 62, 2, 2, 184, 186, 5, 46, 24, 2, 185, 183, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 188, 3, 2, 2, 2, 187, 189, 7, 11, 2, 2, 188, 187, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 191, 3, 2, 2, 2, 190, 142, 3, 2, 2, 2, 190, 163, 3, 2, 2, 2, 191, 11, 3, 2, 2, 2, 192, 193, 7, 12, 2, 2, 193, 205, 5, 82, 42, 2, 194, 195, 7, 12, 2, 2, 195, 196, 5, 14, 8, 2, 196, 197, 7, 62, 2, 2, 197, 198, 5, 38, 20, 2, 198, 205, 3, 2, 2, 2, 199, 200, 7, 12, 2, 2, 200, 201, 5, 14, 8, 2, 201, 202, 7, 62, 2, 2, 202, 203, 5, 16, 9, 2, 203, 205, 3, 2, 2, 2, 204, 192, 3, 2, 2, 2, 204, 194, 3, 2, 2, 2, 204, 199, 3, 2, 2, 2, 205, 13, 3, 2, 2, 2, 206, 217, 5, 82, 42, 2, 207, 208, 7, 13, 2, 2, 208, 213, 7, 67, 2, 2, 209, 210, 7, 10, 2, 2, 210, 212, 7, 67, 2, 2, 211, 209, 3, 2, 2, 2, 212, 215, 3, 2, 2, 2, 213, 211, 3, 2, 2, 2, 213, 214, 3, 2, 2, 2, 214, 216, 3, 2, 2, 2, 215, 213, 3, 2, 2, 2, 216, 218, 7, 14, 2, 2, 217, 207, 3, 2, 2, 2, 217, 218, 3, 2, 2, 2, 218, 15, 3, 2, 2, 2, 219, 221, 7, 15, 2, 2, 220, 219, 3, 2, 2, 2, 220, 221, 3, 2, 2, 2, 221, 222, 3, 2, 2, 2, 222, 227, 5, 18, 10, 2, 223, 224, 7, 15, 2, 2, 224, 226, 5, 18, 10, 2, 225, 223, 3, 2, 2, 2, 226, 229, 3, 2, 2, 2, 227, 225, 3, 2, 2, 2, 227, 228, 3, 2, 2, 2, 228, 17, 3, 2, 2, 2, 229, 227, 3, 2, 2, 2, 230, 235, 5, 84, 43, 2, 231, 232, 7, 63, 2, 2, 232, 233, 5, 38, 20, 2, 233, 234, 7, 64, 2, 2, 234, 236, 3, 2, 2, 2, 235, 231, 3, 2, 2, 2, 235, 236, 3, 2, 2, 2, 236, 19, 3, 2, 2, 2, 237, 238, 7, 16, 2, 2, 238, 241, 5, 82, 42, 2, 239, 240, 7, 7, 2, 2, 240, 242, 5, 38, 20, 2, 241, 239, 3, 2, 2, 2, 241, 242, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 244, 7, 62, 2, 2, 244, 246, 5, 46, 24, 2, 245, 247, 7, 11, 2, 2, 246, 245, 3, 2, 2, 2, 246, 247, 3, 2, 2, 2, 247, 21, 3, 2, 2, 2, 248, 258, 7, 17, 2, 2, 249, 258, 7, 18, 2, 2, 250, 251, 7, 19, 2, 2, 251, 258, 7, 17, 2, 2, 252, 253, 7, 19, 2, 2, 253, 258, 7, 18, 2, 2, 254, 258, 7, 20, 2, 2, 255, 258, 7, 21, 2, 2, 256, 258, 7, 22, 2, 2, 257, 248, 3, 2, 2, 2, 257, 249, 3, 2, 2, 2, 257, 250, 3, 2, 2, 2, 257, 252, 3, 2, 2, 2, 257, 254, 3, 2, 2, 2, 257, 255, 3, 2, 2, 2, 257, 256, 3, 2, 2, 2, 258, 23, 3, 2, 2, 2, 259, 260, 7, 23, 2, 2, 260, 261, 5, 32, 17, 2, 261, 262, 7, 24, 2, 2, 262, 265, 5, 68, 35, 2, 263, 264, 7, 25, 2, 2, 264, 266, 5, 36, 19, 2, 265, 263, 3, 2, 2, 2, 265, 266, 3, 2, 2, 2, 266, 278, 3, 2, 2, 2, 267, 268, 7, 23, 2, 2, 268, 271, 5, 32, 17, 2, 269, 270, 7, 26, 2, 2, 270, 272, 5, 32, 17, 2, 271, 269, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 275, 3, 2, 2, 2, 273, 274, 7, 25, 2, 2, 274, 276, 5, 36, 19, 2, 275, 273, 3, 2, 2, 2, 275, 276, 3, 2, 2, 2, 276, 278, 3, 2, 2, 2, 277, 259, 3, 2, 2, 2, 277, 267, 3, 2, 2, 2, 278, 25, 3, 2, 2, 2, 279, 280, 7, 27, 2, 2, 280, 281, 5, 32, 17, 2, 281, 282, 7, 24, 2, 2, 282, 283, 5, 68, 35, 2, 283, 291, 3, 2, 2, 2, 284, 285, 7, 27, 2, 2, 285, 288, 5, 32, 17, 2, 286, 287, 7, 26, 2, 2, 287, 289, 5, 32, 17, 2, 288, 286, 3, 2, 2, 2, 288, 289, 3, 2, 2, 2, 289, 291, 3, 2, 2, 2, 290, 279, 3, 2, 2, 2, 290, 284, 3, 2, 2, 2, 291, 27, 3, 2, 2, 2, 292, 293, 7, 23, 2, 2, 293, 294, 5, 30, 16, 2, 294, 295, 7, 63, 2, 2, 295, 296, 5, 32, 17, 2, 296, 297, 7, 62, 2, 2, 297, 305, 5, 46, 24, 2, 298, 299, 7, 10, 2, 2, 299, 300, 5, 32, 17, 2, 300, 301, 7, 62, 2, 2, 301, 302, 5, 46, 24, 2, 302, 304, 3, 2, 2, 2, 303, 298, 3, 2, 2, 2, 304, 307, 3, 2, 2, 2, 305, 303, 3, 2, 2, 2, 305, 306, 3, 2, 2, 2, 306, 308, 3, 2, 2, 2, 307, 305, 3, 2, 2, 2, 308, 309, 7, 64, 2, 2, 309, 310, 7, 24, 2, 2, 310, 313, 7, 53, 2, 2, 311, 312, 7, 25, 2, 2, 312, 314, 5, 36, 19, 2, 313, 311, 3, 2, 2, 2, 313, 314, 3, 2, 2, 2, 314, 339, 3, 2, 2, 2, 315, 316, 7, 23, 2, 2, 316, 317, 5, 30, 16, 2, 317, 318, 7, 63, 2, 2, 318, 319, 5, 32, 17, 2, 319, 320, 7, 62, 2, 2, 320, 328, 5, 46, 24, 2, 321, 322, 7, 10, 2, 2, 322, 323, 5, 32, 17, 2, 323, 324, 7, 62, 2, 2, 324, 325, 5, 46, 24, 2, 325, 327, 3, 2, 2, 2, 326, 321, 3, 2, 2, 2, 327, 330, 3, 2, 2, 2, 328, 326, 3, 2, 2, 2, 328, 329, 3, 2, 2, 2, 329, 331, 3, 2, 2, 2, 330, 328, 3, 2, 2, 2, 331, 332, 7, 64, 2, 2, 332, 333, 7, 26, 2, 2, 333, 336, 5, 34, 18, 2, 334, 335, 7, 25, 2, 2, 335, 337, 5, 36, 19, 2, 336, 334, 3, 2, 2, 2, 336, 337, 3, 2, 2, 2, 337, 339, 3, 2, 2, 2, 338, 292, 3, 2, 2, 2, 338, 315, 3, 2, 2, 2, 339, 29, 3, 2, 2, 2, 340, 341, 5, 82, 42, 2, 341, 31, 3, 2, 2, 2, 342, 343, 5, 82, 42, 2, 343, 33, 3, 2, 2, 2, 344, 345, 5, 82, 42, 2, 345, 35, 3, 2, 2, 2, 346, 347, 7, 42, 2, 2, 347, 37, 3, 2, 2, 2, 348, 349, 8, 20, 1, 2, 349, 358, 7, 63, 2, 2, 350, 355, 5, 38, 20, 2, 351, 352, 7, 10, 2, 2, 352, 354, 5, 38, 20, 2, 353, 351, 3, 2, 2, 2, 354, 357, 3, 2, 2, 2, 355, 353, 3, 2, 2, 2, 355, 356, 3, 2, 2, 2, 356, 359, 3, 2, 2, 2, 357, 355, 3, 2, 2, 2, 358, 350, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 361, 3, 2, 2, 2, 360, 362, 7, 10, 2, 2, 361, 360, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 364, 7, 64, 2, 2, 364, 365, 7, 29, 2, 2, 365, 419, 5, 38, 20, 14, 366, 367, 7, 65, 2, 2, 367, 368, 7, 13, 2, 2, 368, 369, 5, 38, 20, 2, 369, 370, 7, 14, 2, 2, 370, 419, 3, 2, 2, 2, 371, 372, 7, 66, 2, 2, 372, 373, 7, 13, 2, 2, 373, 374, 5, 38, 20, 2, 374, 375, 7, 14, 2, 2, 375, 419, 3, 2, 2, 2, 376, 377, 7, 63, 2, 2, 377, 378, 5, 38, 20, 2, 378, 379, 7, 10, 2, 2, 379, 384, 5, 38, 20, 2, 380, 381, 7, 10, 2, 2, 381, 383, 5, 38, 20, 2, 382, 380, 3, 2, 2, 2, 383, 386, 3, 2, 2, 2, 384, 382, 3, 2, 2, 2, 384, 385, 3, 2, 2, 2, 385, 388, 3, 2, 2, 2, 386, 384, 3, 2, 2, 2, 387, 389, 7, 10, 2, 2, 388, 387, 3, 2, 2, 2, 388, 389, 3, 2, 2, 2, 389, 390, 3, 2, 2, 2, 390, 391, 7, 64, 2, 2, 391, 419, 3, 2, 2, 2, 392, 394, 7, 4, 2, 2, 393, 395, 5, 42, 22, 2, 394, 393, 3, 2, 2, 2, 394, 395, 3, 2, 2, 2, 395, 396, 3, 2, 2, 2, 396, 419, 7, 5, 2, 2, 397, 419, 7, 30, 2, 2, 398, 419, 7, 31, 2, 2, 399, 419, 7, 32, 2, 2, 400, 419, 5, 40, 21, 2, 401, 419, 5, 82, 42, 2, 402, 403, 7, 63, 2, 2, 403, 404, 5, 38, 20, 2, 404, 405, 7, 64, 2, 2, 405, 419, 3, 2, 2, 2, 406, 407, 5, 82, 42, 2, 407, 408, 7, 13, 2, 2, 408, 413, 5, 38, 20, 2, 409, 410, 7, 10, 2, 2, 410, 412, 5, 38, 20, 2, 411, 409, 3, 2, 2, 2, 412, 415, 3, 2, 2, 2, 413, 411, 3, 2, 2, 2, 413, 414, 3, 2, 2, 2, 414, 416, 3, 2, 2, 2, 415, 413, 3, 2, 2, 2, 416, 417, 7, 14, 2, 2, 417, 419, 3, 2, 2, 2, 418, 348, 3, 2, 2, 2, 418, 366, 3, 2, 2, 2, 418, 371, 3, 2, 2, 2, 418, 376, 3, 2, 2, 2, 418, 392, 3, 2, 2, 2, 418, 397, 3, 2, 2, 2, 418, 398, 3, 2, 2, 2, 418, 399, 3, 2, 2, 2, 418, 400, 3, 2, 2, 2, 418, 401, 3, 2, 2, 2, 418, 402, 3, 2, 2, 2, 418, 406, 3, 2, 2, 2, 419, 428, 3, 2, 2, 2, 420, 421, 12, 16, 2, 2, 421, 422, 7, 28, 2, 2, 422, 427, 5, 38, 20, 16, 423, 424, 12, 15, 2, 2, 424, 425, 7, 29, 2, 2, 425, 427, 5, 38, 20, 15, 426, 420, 3, 2, 2, 2, 426, 423, 3, 2, 2, 2, 427, 430, 3, 2, 2, 2, 428, 426, 3, 2, 2, 2, 428, 429, 3, 2, 2, 2, 429, 39, 3, 2, 2, 2, 430, 428, 3, 2, 2, 2, 431, 432, 7, 67, 2, 2, 432, 41, 3, 2, 2, 2, 433, 434, 5, 44, 23, 2, 434, 435, 7, 7, 2, 2, 435, 436, 5, 38, 20, 2, 436, 444, 3, 2, 2, 2, 437, 438, 7, 10, 2, 2, 438, 439, 5, 44, 23, 2, 439, 440, 7, 7, 2, 2, 440, 441, 5, 38, 20, 2, 441, 443, 3, 2, 2, 2, 442, 437, 3, 2, 2, 2, 443, 446, 3, 2, 2, 2, 444, 442, 3, 2, 2, 2, 444, 445, 3, 2, 2, 2, 445, 450, 3, 2, 2, 2, 446, 444, 3, 2, 2, 2, 447, 451, 7, 10, 2, 2, 448, 449, 7, 15, 2, 2, 449, 451, 5, 86, 44, 2, 450, 447, 3, 2, 2, 2, 450, 448, 3, 2, 2, 2, 450, 451, 3, 2, 2, 2, 451, 455, 3, 2, 2, 2, 452, 453, 7, 15, 2, 2, 453, 455, 5, 86, 44, 2, 454, 433, 3, 2, 2, 2, 454, 452, 3, 2, 2, 2, 455, 43, 3, 2, 2, 2, 456, 457, 5, 84, 43, 2, 457, 45, 3, 2, 2, 2, 458, 459, 8, 24, 1, 2, 459, 611, 5, 56, 29, 2, 460, 461, 5, 74, 38, 2, 461, 463, 7, 63, 2, 2, 462, 464, 5, 70, 36, 2, 463, 462, 3, 2, 2, 2, 463, 464, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, 466, 7, 64, 2, 2, 466, 611, 3, 2, 2, 2, 467, 468, 7, 52, 2, 2, 468, 611, 5, 46, 24, 28, 469, 470, 5, 82, 42, 2, 470, 471, 7, 34, 2, 2, 471, 472, 7, 62, 2, 2, 472, 473, 5, 46, 24, 24, 473, 611, 3, 2, 2, 2, 474, 475, 7, 45, 2, 2, 475, 476, 7, 4, 2, 2, 476, 481, 5, 46, 24, 2, 477, 478, 7, 10, 2, 2, 478, 480, 5, 46, 24, 2, 479, 477, 3, 2, 2, 2, 480, 483, 3, 2, 2, 2, 481, 479, 3, 2, 2, 2, 481, 482, 3, 2, 2, 2, 482, 485, 3, 2, 2, 2, 483, 481, 3, 2, 2, 2, 484, 486, 7, 10, 2, 2, 485, 484, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 7, 5, 2, 2, 488, 611, 3, 2, 2, 2, 489, 490, 7, 46, 2, 2, 490, 491, 7, 4, 2, 2, 491, 496, 5, 46, 24, 2, 492, 493, 7, 10, 2, 2, 493, 495, 5, 46, 24, 2, 494, 492, 3, 2, 2, 2, 495, 498, 3, 2, 2, 2, 496, 494, 3, 2, 2, 2, 496, 497, 3, 2, 2, 2, 497, 500, 3, 2, 2, 2, 498, 496, 3, 2, 2, 2, 499, 501, 7, 10, 2, 2, 500, 499, 3, 2, 2, 2, 500, 501, 3, 2, 2, 2, 501, 502, 3, 2, 2, 2, 502, 503, 7, 5, 2, 2, 503, 611, 3, 2, 2, 2, 504, 611, 5, 48, 25, 2, 505, 506, 7, 35, 2, 2, 506, 507, 7, 4, 2, 2, 507, 512, 5, 46, 24, 2, 508, 509, 7, 10, 2, 2, 509, 511, 5, 46, 24, 2, 510, 508, 3, 2, 2, 2, 511, 514, 3, 2, 2, 2, 512, 510, 3, 2, 2, 2, 512, 513, 3, 2, 2, 2, 513, 516, 3, 2, 2, 2, 514, 512, 3, 2, 2, 2, 515, 517, 7, 10, 2, 2, 516, 515, 3, 2, 2, 2, 516, 517, 3, 2, 2, 2, 517, 518, 3, 2, 2, 2, 518, 519, 7, 5, 2, 2, 519, 611, 3, 2, 2, 2, 520, 521, 7, 36, 2, 2, 521, 522, 7, 4, 2, 2, 522, 527, 5, 46, 24, 2, 523, 524, 7, 10, 2, 2, 524, 526, 5, 46, 24, 2, 525, 523, 3, 2, 2, 2, 526, 529, 3, 2, 2, 2, 527, 525, 3, 2, 2, 2, 527, 528, 3, 2, 2, 2, 528, 531, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 530, 532, 7, 10, 2, 2, 531, 530, 3, 2, 2, 2, 531, 532, 3, 2, 2, 2, 532, 533, 3, 2, 2, 2, 533, 534, 7, 5, 2, 2, 534, 611, 3, 2, 2, 2, 535, 540, 5, 82, 42, 2, 536, 540, 7, 44, 2, 2, 537, 540, 7, 43, 2, 2, 538, 540, 7, 42, 2, 2, 539, 535, 3, 2, 2, 2, 539, 536, 3, 2, 2, 2, 539, 537, 3, 2, 2, 2, 539, 538, 3, 2, 2, 2, 540, 611, 3, 2, 2, 2, 541, 542, 7, 63, 2, 2, 542, 543, 5, 46, 24, 2, 543, 544, 7, 10, 2, 2, 544, 549, 5, 46, 24, 2, 545, 546, 7, 10, 2, 2, 546, 548, 5, 46, 24, 2, 547, 545, 3, 2, 2, 2, 548, 551, 3, 2, 2, 2, 549, 547, 3, 2, 2, 2, 549, 550, 3, 2, 2, 2, 550, 553, 3, 2, 2, 2, 551, 549, 3, 2, 2, 2, 552, 554, 7, 10, 2, 2, 553, 552, 3, 2, 2, 2, 553, 554, 3, 2, 2, 2, 554, 555, 3, 2, 2, 2, 555, 556, 7, 64, 2, 2, 556, 611, 3, 2, 2, 2, 557, 558, 7, 63, 2, 2, 558, 611, 7, 64, 2, 2, 559, 560, 7, 4, 2, 2, 560, 565, 5, 72, 37, 2, 561, 562, 7, 10, 2, 2, 562, 564, 5, 72, 37, 2, 563, 561, 3, 2, 2, 2, 564, 567, 3, 2, 2, 2, 565, 563, 3, 2, 2, 2, 565, 566, 3, 2, 2, 2, 566, 569, 3, 2, 2, 2, 567, 565, 3, 2, 2, 2, 568, 570, 7, 10, 2, 2, 569, 568, 3, 2, 2, 2, 569, 570, 3, 2, 2, 2, 570, 571, 3, 2, 2, 2, 571, 572, 7, 5, 2, 2, 572, 611, 3, 2, 2, 2, 573, 582, 7, 13, 2, 2, 574, 579, 5, 46, 24, 2, 575, 576, 7, 10, 2, 2, 576, 578, 5, 46, 24, 2, 577, 575, 3, 2, 2, 2, 578, 581, 3, 2, 2, 2, 579, 577, 3, 2, 2, 2, 579, 580, 3, 2, 2, 2, 580, 583, 3, 2, 2, 2, 581, 579, 3, 2, 2, 2, 582, 574, 3, 2, 2, 2, 582, 583, 3, 2, 2, 2, 583, 585, 3, 2, 2, 2, 584, 586, 7, 10, 2, 2, 585, 584, 3, 2, 2, 2, 585, 586, 3, 2, 2, 2, 586, 587, 3, 2, 2, 2, 587, 611, 7, 14, 2, 2, 588, 589, 7, 37, 2, 2, 589, 590, 7, 63, 2, 2, 590, 591, 5, 46, 24, 2, 591, 592, 7, 64, 2, 2, 592, 593, 5, 46, 24, 2, 593, 594, 7, 38, 2, 2, 594, 595, 5, 46, 24, 7, 595, 611, 3, 2, 2, 2, 596, 597, 5, 10, 6, 2, 597, 598, 5, 46, 24, 6, 598, 611, 3, 2, 2, 2, 599, 600, 5, 20, 11, 2, 600, 601, 5, 46, 24, 5, 601, 611, 3, 2, 2, 2, 602, 603, 7, 63, 2, 2, 603, 604, 5, 46, 24, 2, 604, 605, 7, 64, 2, 2, 605, 611, 3, 2, 2, 2, 606, 607, 7, 4, 2, 2, 607, 608, 5, 46, 24, 2, 608, 609, 7, 5, 2, 2, 609, 611, 3, 2, 2, 2, 610, 458, 3, 2, 2, 2, 610, 460, 3, 2, 2, 2, 610, 467, 3, 2, 2, 2, 610, 469, 3, 2, 2, 2, 610, 474, 3, 2, 2, 2, 610, 489, 3, 2, 2, 2, 610, 504, 3, 2, 2, 2, 610, 505, 3, 2, 2, 2, 610, 520, 3, 2, 2, 2, 610, 539, 3, 2, 2, 2, 610, 541, 3, 2, 2, 2, 610, 557, 3, 2, 2, 2, 610, 559, 3, 2, 2, 2, 610, 573, 3, 2, 2, 2, 610, 588, 3, 2, 2, 2, 610, 596, 3, 2, 2, 2, 610, 599, 3, 2, 2, 2, 610, 602, 3, 2, 2, 2, 610, 606, 3, 2, 2, 2, 611, 661, 3, 2, 2, 2, 612, 613, 12, 29, 2, 2, 613, 614, 7, 33, 2, 2, 614, 660, 5, 46, 24, 29, 615, 616, 12, 27, 2, 2, 616, 617, 9, 2, 2, 2, 617, 660, 5, 46, 24, 28, 618, 619, 12, 26, 2, 2, 619, 620, 9, 3, 2, 2, 620, 660, 5, 46, 24, 27, 621, 622, 12, 25, 2, 2, 622, 623, 9, 4, 2, 2, 623, 660, 5, 46, 24, 26, 624, 625, 12, 23, 2, 2, 625, 626, 7, 62, 2, 2, 626, 627, 5, 46, 24, 24, 627, 628, 8, 24, 1, 2, 628, 660, 3, 2, 2, 2, 629, 630, 12, 21, 2, 2, 630, 631, 7, 45, 2, 2, 631, 660, 5, 46, 24, 22, 632, 633, 12, 19, 2, 2, 633, 634, 7, 46, 2, 2, 634, 660, 5, 46, 24, 20, 635, 636, 12, 18, 2, 2, 636, 637, 7, 47, 2, 2, 637, 660, 5, 46, 24, 19, 638, 639, 12, 17, 2, 2, 639, 640, 7, 48, 2, 2, 640, 660, 5, 46, 24, 18, 641, 642, 12, 10, 2, 2, 642, 643, 7, 28, 2, 2, 643, 660, 5, 46, 24, 11, 644, 645, 12, 33, 2, 2, 645, 646, 7, 24, 2, 2, 646, 652, 5, 76, 39, 2, 647, 649, 7, 63, 2, 2, 648, 650, 5, 70, 36, 2, 649, 648, 3, 2, 2, 2, 649, 650, 3, 2, 2, 2, 650, 651, 3, 2, 2, 2, 651, 653, 7, 64, 2, 2, 652, 647, 3, 2, 2, 2, 652, 653, 3, 2, 2, 2, 653, 660, 3, 2, 2, 2, 654, 655, 12, 30, 2, 2, 655, 656, 7, 13, 2, 2, 656, 657, 5, 46, 24, 2, 657, 658, 7, 14, 2, 2, 658, 660, 3, 2, 2, 2, 659, 612, 3, 2, 2, 2, 659, 615, 3, 2, 2, 2, 659, 618, 3, 2, 2, 2, 659, 621, 3, 2, 2, 2, 659, 624, 3, 2, 2, 2, 659, 629, 3, 2, 2, 2, 659, 632, 3, 2, 2, 2, 659, 635, 3, 2, 2, 2, 659, 638, 3, 2, 2, 2, 659, 641, 3, 2, 2, 2, 659, 644, 3, 2, 2, 2, 659, 654, 3, 2, 2, 2, 660, 663, 3, 2, 2, 2, 661, 659, 3, 2, 2, 2, 661, 662, 3, 2, 2, 2, 662, 47, 3, 2, 2, 2, 663, 661, 3, 2, 2, 2, 664, 665, 7, 50, 2, 2, 665, 666, 5, 46, 24, 2, 666, 668, 7, 4, 2, 2, 667, 669, 7, 15, 2, 2, 668, 667, 3, 2, 2, 2, 668, 669, 3, 2, 2, 2, 669, 670, 3, 2, 2, 2, 670, 675, 5, 50, 26, 2, 671, 672, 7, 15, 2, 2, 672, 674, 5, 50, 26, 2, 673, 671, 3, 2, 2, 2, 674, 677, 3, 2, 2, 2, 675, 673, 3, 2, 2, 2, 675, 676, 3, 2, 2, 2, 676, 678, 3, 2, 2, 2, 677, 675, 3, 2, 2, 2, 678, 679, 7, 5, 2, 2, 679, 49, 3, 2, 2, 2, 680, 683, 5, 52, 27, 2, 681, 683, 7, 39, 2, 2, 682, 680, 3, 2, 2, 2, 682, 681, 3, 2, 2, 2, 683, 684, 3, 2, 2, 2, 684, 685, 7, 29, 2, 2, 685, 686, 5, 46, 24, 2, 686, 51, 3, 2, 2, 2, 687, 694, 5, 84, 43, 2, 688, 691, 7, 63, 2, 2, 689, 692, 5, 84, 43, 2, 690, 692, 7, 39, 2, 2, 691, 689, 3, 2, 2, 2, 691, 690, 3, 2, 2, 2, 692, 693, 3, 2, 2, 2, 693, 695, 7, 64, 2, 2, 694, 688, 3, 2, 2, 2, 694, 695, 3, 2, 2, 2, 695, 53, 3, 2, 2, 2, 696, 697, 5, 8, 5, 2, 697, 698, 7, 2, 2, 3, 698, 706, 3, 2, 2, 2, 699, 700, 5, 46, 24, 2, 700, 701, 7, 2, 2, 3, 701, 706, 3, 2, 2, 2, 702, 703, 7, 69, 2, 2, 703, 706, 7, 2, 2, 3, 704, 706, 7, 2, 2, 3, 705, 696, 3, 2, 2, 2, 705, 699, 3, 2, 2, 2, 705, 702, 3, 2, 2, 2, 705, 704, 3, 2, 2, 2, 706, 55, 3, 2, 2, 2, 707, 710, 5, 58, 30, 2, 708, 710, 5, 60, 31, 2, 709, 707, 3, 2, 2, 2, 709, 708, 3, 2, 2, 2, 710, 57, 3, 2, 2, 2, 711, 712, 5, 64, 33, 2, 712, 713, 7, 29, 2, 2, 713, 714, 5, 46, 24, 2, 714, 729, 3, 2, 2, 2, 715, 716, 7, 63, 2, 2, 716, 721, 5, 64, 33, 2, 717, 718, 7, 10, 2, 2, 718, 720, 5, 64, 33, 2, 719, 717, 3, 2, 2, 2, 720, 723, 3, 2, 2, 2, 721, 719, 3, 2, 2, 2, 721, 722, 3, 2, 2, 2, 722, 724, 3, 2, 2, 2, 723, 721, 3, 2, 2, 2, 724, 725, 7, 64, 2, 2, 725, 726, 7, 29, 2, 2, 726, 727, 5, 46, 24, 2, 727, 729, 3, 2, 2, 2, 728, 711, 3, 2, 2, 2, 728, 715, 3, 2, 2, 2, 729, 59, 3, 2, 2, 2, 730, 731, 7, 63, 2, 2, 731, 732, 7, 63, 2, 2, 732, 735, 5, 64, 33, 2, 733, 734, 7, 10, 2, 2, 734, 736, 5, 64, 33, 2, 735, 733, 3, 2, 2, 2, 736, 737, 3, 2, 2, 2, 737, 735, 3, 2, 2, 2, 737, 738, 3, 2, 2, 2, 738, 739, 3, 2, 2, 2, 739, 740, 7, 64, 2, 2, 740, 741, 7, 64, 2, 2, 741, 742, 7, 29, 2, 2, 742, 743, 5, 46, 24, 2, 743, 61, 3, 2, 2, 2, 744, 747, 7, 39, 2, 2, 745, 747, 5, 82, 42, 2, 746, 744, 3, 2, 2, 2, 746, 745, 3, 2, 2, 2, 747, 63, 3, 2, 2, 2, 748, 749, 5, 62, 32, 2, 749, 65, 3, 2, 2, 2, 750, 751, 5, 62, 32, 2, 751, 752, 7, 7, 2, 2, 752, 753, 5, 38, 20, 2, 753, 67, 3, 2, 2, 2, 754, 757, 7, 53, 2, 2, 755, 757, 5, 82, 42, 2, 756, 754, 3, 2, 2, 2, 756, 755, 3, 2, 2, 2, 757, 69, 3, 2, 2, 2, 758, 763, 5, 46, 24, 2, 759, 760, 7, 10, 2, 2, 760, 762, 5, 46, 24, 2, 761, 759, 3, 2, 2, 2, 762, 765, 3, 2, 2, 2, 763, 761, 3, 2, 2, 2, 763, 764, 3, 2, 2, 2, 764, 71, 3, 2, 2, 2, 765, 763, 3, 2, 2, 2, 766, 767, 5, 84, 43, 2, 767, 768, 7, 7, 2, 2, 768, 769, 5, 46, 24, 2, 769, 773, 3, 2, 2, 2, 770, 771, 7, 40, 2, 2, 771, 773, 5, 46, 24, 2, 772, 766, 3, 2, 2, 2, 772, 770, 3, 2, 2, 2, 773, 73, 3, 2, 2, 2, 774, 777, 5, 82, 42, 2, 775, 777, 9, 5, 2, 2, 776, 774, 3, 2, 2, 2, 776, 775, 3, 2, 2, 2, 777, 75, 3, 2, 2, 2, 778, 781, 5, 82, 42, 2, 779, 781, 9, 6, 2, 2, 780, 778, 3, 2, 2, 2, 780, 779, 3, 2, 2, 2, 781, 77, 3, 2, 2, 2, 782, 783, 9, 7, 2, 2, 783, 79, 3, 2, 2, 2, 784, 785, 9, 8, 2, 2, 785, 81, 3, 2, 2, 2, 786, 791, 5, 86, 44, 2, 787, 788, 7, 41, 2, 2, 788, 790, 5, 86, 44, 2, 789, 787, 3, 2, 2, 2, 790, 793, 3, 2, 2, 2, 791, 789, 3, 2, 2, 2, 791, 792, 3, 2, 2, 2, 792, 83, 3, 2, 2, 2, 793, 791, 3, 2, 2, 2, 794, 799, 5, 86, 44, 2, 795, 796, 5, 82, 42, 2, 796, 797, 8, 43, 1, 2, 797, 799, 3, 2, 2, 2, 798, 794, 3, 2, 2, 2, 798, 795, 3, 2, 2, 2, 799, 85, 3, 2, 2, 2, 800, 801, 9, 9, 2, 2, 801, 87, 3, 2, 2, 2, 90, 91, 98, 107, 115, 140, 150, 158, 161, 171, 174, 177, 181, 185, 188, 190, 204, 213, 217, 220, 227, 235, 241, 246, 257, 265, 271, 275, 277, 288, 290, 305, 313, 328, 336, 338, 355, 358, 361, 384, 388, 394, 413, 418, 426, 428, 444, 450, 454, 463, 481, 485, 496, 500, 512, 516, 527, 531, 539, 549, 553, 565, 569, 579, 582, 585, 610, 649, 652, 659, 661, 668, 675, 682, 691, 694, 705, 709, 721, 728, 737, 746, 756, 763, 772, 776, 780, 791, 798] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 805, 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, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 3, 2, 6, 2, 90, 10, 2, 13, 2, 14, 2, 91, 3, 2, 3, 2, 3, 3, 7, 3, 97, 10, 3, 12, 3, 14, 3, 100, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 106, 10, 3, 12, 3, 14, 3, 109, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 114, 10, 4, 12, 4, 14, 4, 117, 11, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 141, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 149, 10, 6, 12, 6, 14, 6, 152, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 159, 10, 6, 3, 6, 5, 6, 162, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 170, 10, 6, 12, 6, 14, 6, 173, 11, 6, 5, 6, 175, 10, 6, 3, 6, 5, 6, 178, 10, 6, 3, 6, 3, 6, 5, 6, 182, 10, 6, 3, 6, 3, 6, 5, 6, 186, 10, 6, 3, 6, 5, 6, 189, 10, 6, 5, 6, 191, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 205, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 212, 10, 8, 12, 8, 14, 8, 215, 11, 8, 3, 8, 5, 8, 218, 10, 8, 3, 9, 5, 9, 221, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 226, 10, 9, 12, 9, 14, 9, 229, 11, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 236, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 242, 10, 11, 3, 11, 3, 11, 3, 11, 5, 11, 247, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 258, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 266, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 272, 10, 13, 3, 13, 3, 13, 5, 13, 276, 10, 13, 5, 13, 278, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 289, 10, 14, 5, 14, 291, 10, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 304, 10, 15, 12, 15, 14, 15, 307, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 314, 10, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 327, 10, 15, 12, 15, 14, 15, 330, 11, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 337, 10, 15, 5, 15, 339, 10, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 354, 10, 20, 12, 20, 14, 20, 357, 11, 20, 5, 20, 359, 10, 20, 3, 20, 5, 20, 362, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 385, 10, 20, 12, 20, 14, 20, 388, 11, 20, 3, 20, 5, 20, 391, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 397, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 414, 10, 20, 12, 20, 14, 20, 417, 11, 20, 3, 20, 3, 20, 5, 20, 421, 10, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 429, 10, 20, 12, 20, 14, 20, 432, 11, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 445, 10, 22, 12, 22, 14, 22, 448, 11, 22, 3, 22, 3, 22, 3, 22, 5, 22, 453, 10, 22, 3, 22, 3, 22, 5, 22, 457, 10, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 466, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 482, 10, 24, 12, 24, 14, 24, 485, 11, 24, 3, 24, 5, 24, 488, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 497, 10, 24, 12, 24, 14, 24, 500, 11, 24, 3, 24, 5, 24, 503, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 513, 10, 24, 12, 24, 14, 24, 516, 11, 24, 3, 24, 5, 24, 519, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 528, 10, 24, 12, 24, 14, 24, 531, 11, 24, 3, 24, 5, 24, 534, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 542, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 550, 10, 24, 12, 24, 14, 24, 553, 11, 24, 3, 24, 5, 24, 556, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 566, 10, 24, 12, 24, 14, 24, 569, 11, 24, 3, 24, 5, 24, 572, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 580, 10, 24, 12, 24, 14, 24, 583, 11, 24, 5, 24, 585, 10, 24, 3, 24, 5, 24, 588, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 613, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 652, 10, 24, 3, 24, 5, 24, 655, 10, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 662, 10, 24, 12, 24, 14, 24, 665, 11, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 671, 10, 25, 3, 25, 3, 25, 3, 25, 7, 25, 676, 10, 25, 12, 25, 14, 25, 679, 11, 25, 3, 25, 3, 25, 3, 26, 3, 26, 5, 26, 685, 10, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 694, 10, 27, 3, 27, 5, 27, 697, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 708, 10, 28, 3, 29, 3, 29, 5, 29, 712, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 7, 30, 722, 10, 30, 12, 30, 14, 30, 725, 11, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 731, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 6, 31, 738, 10, 31, 13, 31, 14, 31, 739, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 5, 32, 749, 10, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 5, 35, 759, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 764, 10, 36, 12, 36, 14, 36, 767, 11, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 775, 10, 37, 3, 38, 3, 38, 5, 38, 779, 10, 38, 3, 39, 3, 39, 5, 39, 783, 10, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 7, 42, 792, 10, 42, 12, 42, 14, 42, 795, 11, 42, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 801, 10, 43, 3, 44, 3, 44, 3, 44, 2, 2, 4, 38, 46, 45, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 68, 2, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 86, 2, 2, 10, 3, 2, 53, 55, 3, 2, 51, 52, 3, 2, 56, 61, 4, 2, 45, 49, 65, 66, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 51, 61, 3, 2, 42, 44, 3, 2, 67, 68, 2, 904, 2, 89, 3, 2, 2, 2, 4, 98, 3, 2, 2, 2, 6, 115, 3, 2, 2, 2, 8, 140, 3, 2, 2, 2, 10, 190, 3, 2, 2, 2, 12, 204, 3, 2, 2, 2, 14, 206, 3, 2, 2, 2, 16, 220, 3, 2, 2, 2, 18, 230, 3, 2, 2, 2, 20, 237, 3, 2, 2, 2, 22, 257, 3, 2, 2, 2, 24, 277, 3, 2, 2, 2, 26, 290, 3, 2, 2, 2, 28, 338, 3, 2, 2, 2, 30, 340, 3, 2, 2, 2, 32, 342, 3, 2, 2, 2, 34, 344, 3, 2, 2, 2, 36, 346, 3, 2, 2, 2, 38, 420, 3, 2, 2, 2, 40, 433, 3, 2, 2, 2, 42, 456, 3, 2, 2, 2, 44, 458, 3, 2, 2, 2, 46, 612, 3, 2, 2, 2, 48, 666, 3, 2, 2, 2, 50, 684, 3, 2, 2, 2, 52, 689, 3, 2, 2, 2, 54, 707, 3, 2, 2, 2, 56, 711, 3, 2, 2, 2, 58, 730, 3, 2, 2, 2, 60, 732, 3, 2, 2, 2, 62, 748, 3, 2, 2, 2, 64, 750, 3, 2, 2, 2, 66, 752, 3, 2, 2, 2, 68, 758, 3, 2, 2, 2, 70, 760, 3, 2, 2, 2, 72, 774, 3, 2, 2, 2, 74, 778, 3, 2, 2, 2, 76, 782, 3, 2, 2, 2, 78, 784, 3, 2, 2, 2, 80, 786, 3, 2, 2, 2, 82, 788, 3, 2, 2, 2, 84, 800, 3, 2, 2, 2, 86, 802, 3, 2, 2, 2, 88, 90, 5, 4, 3, 2, 89, 88, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 89, 3, 2, 2, 2, 91, 92, 3, 2, 2, 2, 92, 93, 3, 2, 2, 2, 93, 94, 7, 2, 2, 3, 94, 3, 3, 2, 2, 2, 95, 97, 7, 69, 2, 2, 96, 95, 3, 2, 2, 2, 97, 100, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 98, 99, 3, 2, 2, 2, 99, 101, 3, 2, 2, 2, 100, 98, 3, 2, 2, 2, 101, 102, 7, 3, 2, 2, 102, 103, 5, 82, 42, 2, 103, 107, 7, 4, 2, 2, 104, 106, 5, 6, 4, 2, 105, 104, 3, 2, 2, 2, 106, 109, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 107, 108, 3, 2, 2, 2, 108, 110, 3, 2, 2, 2, 109, 107, 3, 2, 2, 2, 110, 111, 7, 5, 2, 2, 111, 5, 3, 2, 2, 2, 112, 114, 7, 69, 2, 2, 113, 112, 3, 2, 2, 2, 114, 117, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 115, 116, 3, 2, 2, 2, 116, 118, 3, 2, 2, 2, 117, 115, 3, 2, 2, 2, 118, 119, 5, 8, 5, 2, 119, 7, 3, 2, 2, 2, 120, 121, 7, 6, 2, 2, 121, 122, 5, 82, 42, 2, 122, 123, 7, 7, 2, 2, 123, 124, 5, 38, 20, 2, 124, 141, 3, 2, 2, 2, 125, 126, 7, 8, 2, 2, 126, 127, 5, 82, 42, 2, 127, 128, 7, 7, 2, 2, 128, 129, 5, 38, 20, 2, 129, 141, 3, 2, 2, 2, 130, 131, 7, 9, 2, 2, 131, 132, 5, 62, 32, 2, 132, 133, 7, 62, 2, 2, 133, 134, 5, 46, 24, 2, 134, 141, 3, 2, 2, 2, 135, 141, 5, 28, 15, 2, 136, 141, 5, 10, 6, 2, 137, 141, 5, 12, 7, 2, 138, 141, 5, 24, 13, 2, 139, 141, 5, 26, 14, 2, 140, 120, 3, 2, 2, 2, 140, 125, 3, 2, 2, 2, 140, 130, 3, 2, 2, 2, 140, 135, 3, 2, 2, 2, 140, 136, 3, 2, 2, 2, 140, 137, 3, 2, 2, 2, 140, 138, 3, 2, 2, 2, 140, 139, 3, 2, 2, 2, 141, 9, 3, 2, 2, 2, 142, 143, 5, 22, 12, 2, 143, 144, 5, 74, 38, 2, 144, 145, 7, 63, 2, 2, 145, 150, 5, 66, 34, 2, 146, 147, 7, 10, 2, 2, 147, 149, 5, 66, 34, 2, 148, 146, 3, 2, 2, 2, 149, 152, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 150, 151, 3, 2, 2, 2, 151, 153, 3, 2, 2, 2, 152, 150, 3, 2, 2, 2, 153, 154, 7, 64, 2, 2, 154, 155, 7, 7, 2, 2, 155, 158, 5, 38, 20, 2, 156, 157, 7, 62, 2, 2, 157, 159, 5, 46, 24, 2, 158, 156, 3, 2, 2, 2, 158, 159, 3, 2, 2, 2, 159, 161, 3, 2, 2, 2, 160, 162, 7, 11, 2, 2, 161, 160, 3, 2, 2, 2, 161, 162, 3, 2, 2, 2, 162, 191, 3, 2, 2, 2, 163, 164, 5, 22, 12, 2, 164, 177, 5, 74, 38, 2, 165, 174, 7, 63, 2, 2, 166, 171, 5, 64, 33, 2, 167, 168, 7, 10, 2, 2, 168, 170, 5, 64, 33, 2, 169, 167, 3, 2, 2, 2, 170, 173, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 171, 172, 3, 2, 2, 2, 172, 175, 3, 2, 2, 2, 173, 171, 3, 2, 2, 2, 174, 166, 3, 2, 2, 2, 174, 175, 3, 2, 2, 2, 175, 176, 3, 2, 2, 2, 176, 178, 7, 64, 2, 2, 177, 165, 3, 2, 2, 2, 177, 178, 3, 2, 2, 2, 178, 181, 3, 2, 2, 2, 179, 180, 7, 7, 2, 2, 180, 182, 5, 38, 20, 2, 181, 179, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 185, 3, 2, 2, 2, 183, 184, 7, 62, 2, 2, 184, 186, 5, 46, 24, 2, 185, 183, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 188, 3, 2, 2, 2, 187, 189, 7, 11, 2, 2, 188, 187, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 191, 3, 2, 2, 2, 190, 142, 3, 2, 2, 2, 190, 163, 3, 2, 2, 2, 191, 11, 3, 2, 2, 2, 192, 193, 7, 12, 2, 2, 193, 205, 5, 82, 42, 2, 194, 195, 7, 12, 2, 2, 195, 196, 5, 14, 8, 2, 196, 197, 7, 62, 2, 2, 197, 198, 5, 38, 20, 2, 198, 205, 3, 2, 2, 2, 199, 200, 7, 12, 2, 2, 200, 201, 5, 14, 8, 2, 201, 202, 7, 62, 2, 2, 202, 203, 5, 16, 9, 2, 203, 205, 3, 2, 2, 2, 204, 192, 3, 2, 2, 2, 204, 194, 3, 2, 2, 2, 204, 199, 3, 2, 2, 2, 205, 13, 3, 2, 2, 2, 206, 217, 5, 82, 42, 2, 207, 208, 7, 13, 2, 2, 208, 213, 7, 67, 2, 2, 209, 210, 7, 10, 2, 2, 210, 212, 7, 67, 2, 2, 211, 209, 3, 2, 2, 2, 212, 215, 3, 2, 2, 2, 213, 211, 3, 2, 2, 2, 213, 214, 3, 2, 2, 2, 214, 216, 3, 2, 2, 2, 215, 213, 3, 2, 2, 2, 216, 218, 7, 14, 2, 2, 217, 207, 3, 2, 2, 2, 217, 218, 3, 2, 2, 2, 218, 15, 3, 2, 2, 2, 219, 221, 7, 15, 2, 2, 220, 219, 3, 2, 2, 2, 220, 221, 3, 2, 2, 2, 221, 222, 3, 2, 2, 2, 222, 227, 5, 18, 10, 2, 223, 224, 7, 15, 2, 2, 224, 226, 5, 18, 10, 2, 225, 223, 3, 2, 2, 2, 226, 229, 3, 2, 2, 2, 227, 225, 3, 2, 2, 2, 227, 228, 3, 2, 2, 2, 228, 17, 3, 2, 2, 2, 229, 227, 3, 2, 2, 2, 230, 235, 5, 84, 43, 2, 231, 232, 7, 63, 2, 2, 232, 233, 5, 38, 20, 2, 233, 234, 7, 64, 2, 2, 234, 236, 3, 2, 2, 2, 235, 231, 3, 2, 2, 2, 235, 236, 3, 2, 2, 2, 236, 19, 3, 2, 2, 2, 237, 238, 7, 16, 2, 2, 238, 241, 5, 82, 42, 2, 239, 240, 7, 7, 2, 2, 240, 242, 5, 38, 20, 2, 241, 239, 3, 2, 2, 2, 241, 242, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 244, 7, 62, 2, 2, 244, 246, 5, 46, 24, 2, 245, 247, 7, 11, 2, 2, 246, 245, 3, 2, 2, 2, 246, 247, 3, 2, 2, 2, 247, 21, 3, 2, 2, 2, 248, 258, 7, 17, 2, 2, 249, 258, 7, 18, 2, 2, 250, 251, 7, 19, 2, 2, 251, 258, 7, 17, 2, 2, 252, 253, 7, 19, 2, 2, 253, 258, 7, 18, 2, 2, 254, 258, 7, 20, 2, 2, 255, 258, 7, 21, 2, 2, 256, 258, 7, 22, 2, 2, 257, 248, 3, 2, 2, 2, 257, 249, 3, 2, 2, 2, 257, 250, 3, 2, 2, 2, 257, 252, 3, 2, 2, 2, 257, 254, 3, 2, 2, 2, 257, 255, 3, 2, 2, 2, 257, 256, 3, 2, 2, 2, 258, 23, 3, 2, 2, 2, 259, 260, 7, 23, 2, 2, 260, 261, 5, 32, 17, 2, 261, 262, 7, 24, 2, 2, 262, 265, 5, 68, 35, 2, 263, 264, 7, 25, 2, 2, 264, 266, 5, 36, 19, 2, 265, 263, 3, 2, 2, 2, 265, 266, 3, 2, 2, 2, 266, 278, 3, 2, 2, 2, 267, 268, 7, 23, 2, 2, 268, 271, 5, 32, 17, 2, 269, 270, 7, 26, 2, 2, 270, 272, 5, 32, 17, 2, 271, 269, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 275, 3, 2, 2, 2, 273, 274, 7, 25, 2, 2, 274, 276, 5, 36, 19, 2, 275, 273, 3, 2, 2, 2, 275, 276, 3, 2, 2, 2, 276, 278, 3, 2, 2, 2, 277, 259, 3, 2, 2, 2, 277, 267, 3, 2, 2, 2, 278, 25, 3, 2, 2, 2, 279, 280, 7, 27, 2, 2, 280, 281, 5, 32, 17, 2, 281, 282, 7, 24, 2, 2, 282, 283, 5, 68, 35, 2, 283, 291, 3, 2, 2, 2, 284, 285, 7, 27, 2, 2, 285, 288, 5, 32, 17, 2, 286, 287, 7, 26, 2, 2, 287, 289, 5, 32, 17, 2, 288, 286, 3, 2, 2, 2, 288, 289, 3, 2, 2, 2, 289, 291, 3, 2, 2, 2, 290, 279, 3, 2, 2, 2, 290, 284, 3, 2, 2, 2, 291, 27, 3, 2, 2, 2, 292, 293, 7, 23, 2, 2, 293, 294, 5, 30, 16, 2, 294, 295, 7, 63, 2, 2, 295, 296, 5, 32, 17, 2, 296, 297, 7, 62, 2, 2, 297, 305, 5, 46, 24, 2, 298, 299, 7, 10, 2, 2, 299, 300, 5, 32, 17, 2, 300, 301, 7, 62, 2, 2, 301, 302, 5, 46, 24, 2, 302, 304, 3, 2, 2, 2, 303, 298, 3, 2, 2, 2, 304, 307, 3, 2, 2, 2, 305, 303, 3, 2, 2, 2, 305, 306, 3, 2, 2, 2, 306, 308, 3, 2, 2, 2, 307, 305, 3, 2, 2, 2, 308, 309, 7, 64, 2, 2, 309, 310, 7, 24, 2, 2, 310, 313, 7, 53, 2, 2, 311, 312, 7, 25, 2, 2, 312, 314, 5, 36, 19, 2, 313, 311, 3, 2, 2, 2, 313, 314, 3, 2, 2, 2, 314, 339, 3, 2, 2, 2, 315, 316, 7, 23, 2, 2, 316, 317, 5, 30, 16, 2, 317, 318, 7, 63, 2, 2, 318, 319, 5, 32, 17, 2, 319, 320, 7, 62, 2, 2, 320, 328, 5, 46, 24, 2, 321, 322, 7, 10, 2, 2, 322, 323, 5, 32, 17, 2, 323, 324, 7, 62, 2, 2, 324, 325, 5, 46, 24, 2, 325, 327, 3, 2, 2, 2, 326, 321, 3, 2, 2, 2, 327, 330, 3, 2, 2, 2, 328, 326, 3, 2, 2, 2, 328, 329, 3, 2, 2, 2, 329, 331, 3, 2, 2, 2, 330, 328, 3, 2, 2, 2, 331, 332, 7, 64, 2, 2, 332, 333, 7, 26, 2, 2, 333, 336, 5, 34, 18, 2, 334, 335, 7, 25, 2, 2, 335, 337, 5, 36, 19, 2, 336, 334, 3, 2, 2, 2, 336, 337, 3, 2, 2, 2, 337, 339, 3, 2, 2, 2, 338, 292, 3, 2, 2, 2, 338, 315, 3, 2, 2, 2, 339, 29, 3, 2, 2, 2, 340, 341, 5, 82, 42, 2, 341, 31, 3, 2, 2, 2, 342, 343, 5, 82, 42, 2, 343, 33, 3, 2, 2, 2, 344, 345, 5, 82, 42, 2, 345, 35, 3, 2, 2, 2, 346, 347, 7, 42, 2, 2, 347, 37, 3, 2, 2, 2, 348, 349, 8, 20, 1, 2, 349, 358, 7, 63, 2, 2, 350, 355, 5, 38, 20, 2, 351, 352, 7, 10, 2, 2, 352, 354, 5, 38, 20, 2, 353, 351, 3, 2, 2, 2, 354, 357, 3, 2, 2, 2, 355, 353, 3, 2, 2, 2, 355, 356, 3, 2, 2, 2, 356, 359, 3, 2, 2, 2, 357, 355, 3, 2, 2, 2, 358, 350, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 361, 3, 2, 2, 2, 360, 362, 7, 10, 2, 2, 361, 360, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 364, 7, 64, 2, 2, 364, 365, 7, 29, 2, 2, 365, 421, 5, 38, 20, 15, 366, 367, 7, 65, 2, 2, 367, 368, 7, 13, 2, 2, 368, 369, 5, 38, 20, 2, 369, 370, 7, 14, 2, 2, 370, 421, 3, 2, 2, 2, 371, 372, 7, 66, 2, 2, 372, 373, 7, 13, 2, 2, 373, 374, 5, 38, 20, 2, 374, 375, 7, 14, 2, 2, 375, 421, 3, 2, 2, 2, 376, 377, 7, 63, 2, 2, 377, 421, 7, 64, 2, 2, 378, 379, 7, 63, 2, 2, 379, 380, 5, 38, 20, 2, 380, 381, 7, 10, 2, 2, 381, 386, 5, 38, 20, 2, 382, 383, 7, 10, 2, 2, 383, 385, 5, 38, 20, 2, 384, 382, 3, 2, 2, 2, 385, 388, 3, 2, 2, 2, 386, 384, 3, 2, 2, 2, 386, 387, 3, 2, 2, 2, 387, 390, 3, 2, 2, 2, 388, 386, 3, 2, 2, 2, 389, 391, 7, 10, 2, 2, 390, 389, 3, 2, 2, 2, 390, 391, 3, 2, 2, 2, 391, 392, 3, 2, 2, 2, 392, 393, 7, 64, 2, 2, 393, 421, 3, 2, 2, 2, 394, 396, 7, 4, 2, 2, 395, 397, 5, 42, 22, 2, 396, 395, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, 398, 3, 2, 2, 2, 398, 421, 7, 5, 2, 2, 399, 421, 7, 30, 2, 2, 400, 421, 7, 31, 2, 2, 401, 421, 7, 32, 2, 2, 402, 421, 5, 40, 21, 2, 403, 421, 5, 82, 42, 2, 404, 405, 7, 63, 2, 2, 405, 406, 5, 38, 20, 2, 406, 407, 7, 64, 2, 2, 407, 421, 3, 2, 2, 2, 408, 409, 5, 82, 42, 2, 409, 410, 7, 13, 2, 2, 410, 415, 5, 38, 20, 2, 411, 412, 7, 10, 2, 2, 412, 414, 5, 38, 20, 2, 413, 411, 3, 2, 2, 2, 414, 417, 3, 2, 2, 2, 415, 413, 3, 2, 2, 2, 415, 416, 3, 2, 2, 2, 416, 418, 3, 2, 2, 2, 417, 415, 3, 2, 2, 2, 418, 419, 7, 14, 2, 2, 419, 421, 3, 2, 2, 2, 420, 348, 3, 2, 2, 2, 420, 366, 3, 2, 2, 2, 420, 371, 3, 2, 2, 2, 420, 376, 3, 2, 2, 2, 420, 378, 3, 2, 2, 2, 420, 394, 3, 2, 2, 2, 420, 399, 3, 2, 2, 2, 420, 400, 3, 2, 2, 2, 420, 401, 3, 2, 2, 2, 420, 402, 3, 2, 2, 2, 420, 403, 3, 2, 2, 2, 420, 404, 3, 2, 2, 2, 420, 408, 3, 2, 2, 2, 421, 430, 3, 2, 2, 2, 422, 423, 12, 17, 2, 2, 423, 424, 7, 28, 2, 2, 424, 429, 5, 38, 20, 17, 425, 426, 12, 16, 2, 2, 426, 427, 7, 29, 2, 2, 427, 429, 5, 38, 20, 16, 428, 422, 3, 2, 2, 2, 428, 425, 3, 2, 2, 2, 429, 432, 3, 2, 2, 2, 430, 428, 3, 2, 2, 2, 430, 431, 3, 2, 2, 2, 431, 39, 3, 2, 2, 2, 432, 430, 3, 2, 2, 2, 433, 434, 7, 67, 2, 2, 434, 41, 3, 2, 2, 2, 435, 436, 5, 44, 23, 2, 436, 437, 7, 7, 2, 2, 437, 438, 5, 38, 20, 2, 438, 446, 3, 2, 2, 2, 439, 440, 7, 10, 2, 2, 440, 441, 5, 44, 23, 2, 441, 442, 7, 7, 2, 2, 442, 443, 5, 38, 20, 2, 443, 445, 3, 2, 2, 2, 444, 439, 3, 2, 2, 2, 445, 448, 3, 2, 2, 2, 446, 444, 3, 2, 2, 2, 446, 447, 3, 2, 2, 2, 447, 452, 3, 2, 2, 2, 448, 446, 3, 2, 2, 2, 449, 453, 7, 10, 2, 2, 450, 451, 7, 15, 2, 2, 451, 453, 5, 86, 44, 2, 452, 449, 3, 2, 2, 2, 452, 450, 3, 2, 2, 2, 452, 453, 3, 2, 2, 2, 453, 457, 3, 2, 2, 2, 454, 455, 7, 15, 2, 2, 455, 457, 5, 86, 44, 2, 456, 435, 3, 2, 2, 2, 456, 454, 3, 2, 2, 2, 457, 43, 3, 2, 2, 2, 458, 459, 5, 84, 43, 2, 459, 45, 3, 2, 2, 2, 460, 461, 8, 24, 1, 2, 461, 613, 5, 56, 29, 2, 462, 463, 5, 74, 38, 2, 463, 465, 7, 63, 2, 2, 464, 466, 5, 70, 36, 2, 465, 464, 3, 2, 2, 2, 465, 466, 3, 2, 2, 2, 466, 467, 3, 2, 2, 2, 467, 468, 7, 64, 2, 2, 468, 613, 3, 2, 2, 2, 469, 470, 7, 52, 2, 2, 470, 613, 5, 46, 24, 28, 471, 472, 5, 82, 42, 2, 472, 473, 7, 34, 2, 2, 473, 474, 7, 62, 2, 2, 474, 475, 5, 46, 24, 24, 475, 613, 3, 2, 2, 2, 476, 477, 7, 45, 2, 2, 477, 478, 7, 4, 2, 2, 478, 483, 5, 46, 24, 2, 479, 480, 7, 10, 2, 2, 480, 482, 5, 46, 24, 2, 481, 479, 3, 2, 2, 2, 482, 485, 3, 2, 2, 2, 483, 481, 3, 2, 2, 2, 483, 484, 3, 2, 2, 2, 484, 487, 3, 2, 2, 2, 485, 483, 3, 2, 2, 2, 486, 488, 7, 10, 2, 2, 487, 486, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 489, 3, 2, 2, 2, 489, 490, 7, 5, 2, 2, 490, 613, 3, 2, 2, 2, 491, 492, 7, 46, 2, 2, 492, 493, 7, 4, 2, 2, 493, 498, 5, 46, 24, 2, 494, 495, 7, 10, 2, 2, 495, 497, 5, 46, 24, 2, 496, 494, 3, 2, 2, 2, 497, 500, 3, 2, 2, 2, 498, 496, 3, 2, 2, 2, 498, 499, 3, 2, 2, 2, 499, 502, 3, 2, 2, 2, 500, 498, 3, 2, 2, 2, 501, 503, 7, 10, 2, 2, 502, 501, 3, 2, 2, 2, 502, 503, 3, 2, 2, 2, 503, 504, 3, 2, 2, 2, 504, 505, 7, 5, 2, 2, 505, 613, 3, 2, 2, 2, 506, 613, 5, 48, 25, 2, 507, 508, 7, 35, 2, 2, 508, 509, 7, 4, 2, 2, 509, 514, 5, 46, 24, 2, 510, 511, 7, 10, 2, 2, 511, 513, 5, 46, 24, 2, 512, 510, 3, 2, 2, 2, 513, 516, 3, 2, 2, 2, 514, 512, 3, 2, 2, 2, 514, 515, 3, 2, 2, 2, 515, 518, 3, 2, 2, 2, 516, 514, 3, 2, 2, 2, 517, 519, 7, 10, 2, 2, 518, 517, 3, 2, 2, 2, 518, 519, 3, 2, 2, 2, 519, 520, 3, 2, 2, 2, 520, 521, 7, 5, 2, 2, 521, 613, 3, 2, 2, 2, 522, 523, 7, 36, 2, 2, 523, 524, 7, 4, 2, 2, 524, 529, 5, 46, 24, 2, 525, 526, 7, 10, 2, 2, 526, 528, 5, 46, 24, 2, 527, 525, 3, 2, 2, 2, 528, 531, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 529, 530, 3, 2, 2, 2, 530, 533, 3, 2, 2, 2, 531, 529, 3, 2, 2, 2, 532, 534, 7, 10, 2, 2, 533, 532, 3, 2, 2, 2, 533, 534, 3, 2, 2, 2, 534, 535, 3, 2, 2, 2, 535, 536, 7, 5, 2, 2, 536, 613, 3, 2, 2, 2, 537, 542, 5, 82, 42, 2, 538, 542, 7, 44, 2, 2, 539, 542, 7, 43, 2, 2, 540, 542, 7, 42, 2, 2, 541, 537, 3, 2, 2, 2, 541, 538, 3, 2, 2, 2, 541, 539, 3, 2, 2, 2, 541, 540, 3, 2, 2, 2, 542, 613, 3, 2, 2, 2, 543, 544, 7, 63, 2, 2, 544, 545, 5, 46, 24, 2, 545, 546, 7, 10, 2, 2, 546, 551, 5, 46, 24, 2, 547, 548, 7, 10, 2, 2, 548, 550, 5, 46, 24, 2, 549, 547, 3, 2, 2, 2, 550, 553, 3, 2, 2, 2, 551, 549, 3, 2, 2, 2, 551, 552, 3, 2, 2, 2, 552, 555, 3, 2, 2, 2, 553, 551, 3, 2, 2, 2, 554, 556, 7, 10, 2, 2, 555, 554, 3, 2, 2, 2, 555, 556, 3, 2, 2, 2, 556, 557, 3, 2, 2, 2, 557, 558, 7, 64, 2, 2, 558, 613, 3, 2, 2, 2, 559, 560, 7, 63, 2, 2, 560, 613, 7, 64, 2, 2, 561, 562, 7, 4, 2, 2, 562, 567, 5, 72, 37, 2, 563, 564, 7, 10, 2, 2, 564, 566, 5, 72, 37, 2, 565, 563, 3, 2, 2, 2, 566, 569, 3, 2, 2, 2, 567, 565, 3, 2, 2, 2, 567, 568, 3, 2, 2, 2, 568, 571, 3, 2, 2, 2, 569, 567, 3, 2, 2, 2, 570, 572, 7, 10, 2, 2, 571, 570, 3, 2, 2, 2, 571, 572, 3, 2, 2, 2, 572, 573, 3, 2, 2, 2, 573, 574, 7, 5, 2, 2, 574, 613, 3, 2, 2, 2, 575, 584, 7, 13, 2, 2, 576, 581, 5, 46, 24, 2, 577, 578, 7, 10, 2, 2, 578, 580, 5, 46, 24, 2, 579, 577, 3, 2, 2, 2, 580, 583, 3, 2, 2, 2, 581, 579, 3, 2, 2, 2, 581, 582, 3, 2, 2, 2, 582, 585, 3, 2, 2, 2, 583, 581, 3, 2, 2, 2, 584, 576, 3, 2, 2, 2, 584, 585, 3, 2, 2, 2, 585, 587, 3, 2, 2, 2, 586, 588, 7, 10, 2, 2, 587, 586, 3, 2, 2, 2, 587, 588, 3, 2, 2, 2, 588, 589, 3, 2, 2, 2, 589, 613, 7, 14, 2, 2, 590, 591, 7, 37, 2, 2, 591, 592, 7, 63, 2, 2, 592, 593, 5, 46, 24, 2, 593, 594, 7, 64, 2, 2, 594, 595, 5, 46, 24, 2, 595, 596, 7, 38, 2, 2, 596, 597, 5, 46, 24, 7, 597, 613, 3, 2, 2, 2, 598, 599, 5, 10, 6, 2, 599, 600, 5, 46, 24, 6, 600, 613, 3, 2, 2, 2, 601, 602, 5, 20, 11, 2, 602, 603, 5, 46, 24, 5, 603, 613, 3, 2, 2, 2, 604, 605, 7, 63, 2, 2, 605, 606, 5, 46, 24, 2, 606, 607, 7, 64, 2, 2, 607, 613, 3, 2, 2, 2, 608, 609, 7, 4, 2, 2, 609, 610, 5, 46, 24, 2, 610, 611, 7, 5, 2, 2, 611, 613, 3, 2, 2, 2, 612, 460, 3, 2, 2, 2, 612, 462, 3, 2, 2, 2, 612, 469, 3, 2, 2, 2, 612, 471, 3, 2, 2, 2, 612, 476, 3, 2, 2, 2, 612, 491, 3, 2, 2, 2, 612, 506, 3, 2, 2, 2, 612, 507, 3, 2, 2, 2, 612, 522, 3, 2, 2, 2, 612, 541, 3, 2, 2, 2, 612, 543, 3, 2, 2, 2, 612, 559, 3, 2, 2, 2, 612, 561, 3, 2, 2, 2, 612, 575, 3, 2, 2, 2, 612, 590, 3, 2, 2, 2, 612, 598, 3, 2, 2, 2, 612, 601, 3, 2, 2, 2, 612, 604, 3, 2, 2, 2, 612, 608, 3, 2, 2, 2, 613, 663, 3, 2, 2, 2, 614, 615, 12, 29, 2, 2, 615, 616, 7, 33, 2, 2, 616, 662, 5, 46, 24, 29, 617, 618, 12, 27, 2, 2, 618, 619, 9, 2, 2, 2, 619, 662, 5, 46, 24, 28, 620, 621, 12, 26, 2, 2, 621, 622, 9, 3, 2, 2, 622, 662, 5, 46, 24, 27, 623, 624, 12, 25, 2, 2, 624, 625, 9, 4, 2, 2, 625, 662, 5, 46, 24, 26, 626, 627, 12, 23, 2, 2, 627, 628, 7, 62, 2, 2, 628, 629, 5, 46, 24, 24, 629, 630, 8, 24, 1, 2, 630, 662, 3, 2, 2, 2, 631, 632, 12, 21, 2, 2, 632, 633, 7, 45, 2, 2, 633, 662, 5, 46, 24, 22, 634, 635, 12, 19, 2, 2, 635, 636, 7, 46, 2, 2, 636, 662, 5, 46, 24, 20, 637, 638, 12, 18, 2, 2, 638, 639, 7, 47, 2, 2, 639, 662, 5, 46, 24, 19, 640, 641, 12, 17, 2, 2, 641, 642, 7, 48, 2, 2, 642, 662, 5, 46, 24, 18, 643, 644, 12, 10, 2, 2, 644, 645, 7, 28, 2, 2, 645, 662, 5, 46, 24, 11, 646, 647, 12, 33, 2, 2, 647, 648, 7, 24, 2, 2, 648, 654, 5, 76, 39, 2, 649, 651, 7, 63, 2, 2, 650, 652, 5, 70, 36, 2, 651, 650, 3, 2, 2, 2, 651, 652, 3, 2, 2, 2, 652, 653, 3, 2, 2, 2, 653, 655, 7, 64, 2, 2, 654, 649, 3, 2, 2, 2, 654, 655, 3, 2, 2, 2, 655, 662, 3, 2, 2, 2, 656, 657, 12, 30, 2, 2, 657, 658, 7, 13, 2, 2, 658, 659, 5, 46, 24, 2, 659, 660, 7, 14, 2, 2, 660, 662, 3, 2, 2, 2, 661, 614, 3, 2, 2, 2, 661, 617, 3, 2, 2, 2, 661, 620, 3, 2, 2, 2, 661, 623, 3, 2, 2, 2, 661, 626, 3, 2, 2, 2, 661, 631, 3, 2, 2, 2, 661, 634, 3, 2, 2, 2, 661, 637, 3, 2, 2, 2, 661, 640, 3, 2, 2, 2, 661, 643, 3, 2, 2, 2, 661, 646, 3, 2, 2, 2, 661, 656, 3, 2, 2, 2, 662, 665, 3, 2, 2, 2, 663, 661, 3, 2, 2, 2, 663, 664, 3, 2, 2, 2, 664, 47, 3, 2, 2, 2, 665, 663, 3, 2, 2, 2, 666, 667, 7, 50, 2, 2, 667, 668, 5, 46, 24, 2, 668, 670, 7, 4, 2, 2, 669, 671, 7, 15, 2, 2, 670, 669, 3, 2, 2, 2, 670, 671, 3, 2, 2, 2, 671, 672, 3, 2, 2, 2, 672, 677, 5, 50, 26, 2, 673, 674, 7, 15, 2, 2, 674, 676, 5, 50, 26, 2, 675, 673, 3, 2, 2, 2, 676, 679, 3, 2, 2, 2, 677, 675, 3, 2, 2, 2, 677, 678, 3, 2, 2, 2, 678, 680, 3, 2, 2, 2, 679, 677, 3, 2, 2, 2, 680, 681, 7, 5, 2, 2, 681, 49, 3, 2, 2, 2, 682, 685, 5, 52, 27, 2, 683, 685, 7, 39, 2, 2, 684, 682, 3, 2, 2, 2, 684, 683, 3, 2, 2, 2, 685, 686, 3, 2, 2, 2, 686, 687, 7, 29, 2, 2, 687, 688, 5, 46, 24, 2, 688, 51, 3, 2, 2, 2, 689, 696, 5, 84, 43, 2, 690, 693, 7, 63, 2, 2, 691, 694, 5, 84, 43, 2, 692, 694, 7, 39, 2, 2, 693, 691, 3, 2, 2, 2, 693, 692, 3, 2, 2, 2, 694, 695, 3, 2, 2, 2, 695, 697, 7, 64, 2, 2, 696, 690, 3, 2, 2, 2, 696, 697, 3, 2, 2, 2, 697, 53, 3, 2, 2, 2, 698, 699, 5, 8, 5, 2, 699, 700, 7, 2, 2, 3, 700, 708, 3, 2, 2, 2, 701, 702, 5, 46, 24, 2, 702, 703, 7, 2, 2, 3, 703, 708, 3, 2, 2, 2, 704, 705, 7, 69, 2, 2, 705, 708, 7, 2, 2, 3, 706, 708, 7, 2, 2, 3, 707, 698, 3, 2, 2, 2, 707, 701, 3, 2, 2, 2, 707, 704, 3, 2, 2, 2, 707, 706, 3, 2, 2, 2, 708, 55, 3, 2, 2, 2, 709, 712, 5, 58, 30, 2, 710, 712, 5, 60, 31, 2, 711, 709, 3, 2, 2, 2, 711, 710, 3, 2, 2, 2, 712, 57, 3, 2, 2, 2, 713, 714, 5, 64, 33, 2, 714, 715, 7, 29, 2, 2, 715, 716, 5, 46, 24, 2, 716, 731, 3, 2, 2, 2, 717, 718, 7, 63, 2, 2, 718, 723, 5, 64, 33, 2, 719, 720, 7, 10, 2, 2, 720, 722, 5, 64, 33, 2, 721, 719, 3, 2, 2, 2, 722, 725, 3, 2, 2, 2, 723, 721, 3, 2, 2, 2, 723, 724, 3, 2, 2, 2, 724, 726, 3, 2, 2, 2, 725, 723, 3, 2, 2, 2, 726, 727, 7, 64, 2, 2, 727, 728, 7, 29, 2, 2, 728, 729, 5, 46, 24, 2, 729, 731, 3, 2, 2, 2, 730, 713, 3, 2, 2, 2, 730, 717, 3, 2, 2, 2, 731, 59, 3, 2, 2, 2, 732, 733, 7, 63, 2, 2, 733, 734, 7, 63, 2, 2, 734, 737, 5, 64, 33, 2, 735, 736, 7, 10, 2, 2, 736, 738, 5, 64, 33, 2, 737, 735, 3, 2, 2, 2, 738, 739, 3, 2, 2, 2, 739, 737, 3, 2, 2, 2, 739, 740, 3, 2, 2, 2, 740, 741, 3, 2, 2, 2, 741, 742, 7, 64, 2, 2, 742, 743, 7, 64, 2, 2, 743, 744, 7, 29, 2, 2, 744, 745, 5, 46, 24, 2, 745, 61, 3, 2, 2, 2, 746, 749, 7, 39, 2, 2, 747, 749, 5, 82, 42, 2, 748, 746, 3, 2, 2, 2, 748, 747, 3, 2, 2, 2, 749, 63, 3, 2, 2, 2, 750, 751, 5, 62, 32, 2, 751, 65, 3, 2, 2, 2, 752, 753, 5, 62, 32, 2, 753, 754, 7, 7, 2, 2, 754, 755, 5, 38, 20, 2, 755, 67, 3, 2, 2, 2, 756, 759, 7, 53, 2, 2, 757, 759, 5, 82, 42, 2, 758, 756, 3, 2, 2, 2, 758, 757, 3, 2, 2, 2, 759, 69, 3, 2, 2, 2, 760, 765, 5, 46, 24, 2, 761, 762, 7, 10, 2, 2, 762, 764, 5, 46, 24, 2, 763, 761, 3, 2, 2, 2, 764, 767, 3, 2, 2, 2, 765, 763, 3, 2, 2, 2, 765, 766, 3, 2, 2, 2, 766, 71, 3, 2, 2, 2, 767, 765, 3, 2, 2, 2, 768, 769, 5, 84, 43, 2, 769, 770, 7, 7, 2, 2, 770, 771, 5, 46, 24, 2, 771, 775, 3, 2, 2, 2, 772, 773, 7, 40, 2, 2, 773, 775, 5, 46, 24, 2, 774, 768, 3, 2, 2, 2, 774, 772, 3, 2, 2, 2, 775, 73, 3, 2, 2, 2, 776, 779, 5, 82, 42, 2, 777, 779, 9, 5, 2, 2, 778, 776, 3, 2, 2, 2, 778, 777, 3, 2, 2, 2, 779, 75, 3, 2, 2, 2, 780, 783, 5, 82, 42, 2, 781, 783, 9, 6, 2, 2, 782, 780, 3, 2, 2, 2, 782, 781, 3, 2, 2, 2, 783, 77, 3, 2, 2, 2, 784, 785, 9, 7, 2, 2, 785, 79, 3, 2, 2, 2, 786, 787, 9, 8, 2, 2, 787, 81, 3, 2, 2, 2, 788, 793, 5, 86, 44, 2, 789, 790, 7, 41, 2, 2, 790, 792, 5, 86, 44, 2, 791, 789, 3, 2, 2, 2, 792, 795, 3, 2, 2, 2, 793, 791, 3, 2, 2, 2, 793, 794, 3, 2, 2, 2, 794, 83, 3, 2, 2, 2, 795, 793, 3, 2, 2, 2, 796, 801, 5, 86, 44, 2, 797, 798, 5, 82, 42, 2, 798, 799, 8, 43, 1, 2, 799, 801, 3, 2, 2, 2, 800, 796, 3, 2, 2, 2, 800, 797, 3, 2, 2, 2, 801, 85, 3, 2, 2, 2, 802, 803, 9, 9, 2, 2, 803, 87, 3, 2, 2, 2, 90, 91, 98, 107, 115, 140, 150, 158, 161, 171, 174, 177, 181, 185, 188, 190, 204, 213, 217, 220, 227, 235, 241, 246, 257, 265, 271, 275, 277, 288, 290, 305, 313, 328, 336, 338, 355, 358, 361, 386, 390, 396, 415, 420, 428, 430, 446, 452, 456, 465, 483, 487, 498, 502, 514, 518, 529, 533, 541, 551, 555, 567, 571, 581, 584, 587, 612, 651, 654, 661, 663, 670, 677, 684, 693, 696, 707, 711, 723, 730, 739, 748, 758, 765, 774, 778, 782, 793, 800] \ No newline at end of file diff --git a/quint/src/generated/QuintListener.ts b/quint/src/generated/QuintListener.ts index 0c24f2792..794ecca5c 100644 --- a/quint/src/generated/QuintListener.ts +++ b/quint/src/generated/QuintListener.ts @@ -13,6 +13,7 @@ import { TypeFunContext } from "./QuintParser"; import { TypeOperContext } from "./QuintParser"; import { TypeSetContext } from "./QuintParser"; import { TypeListContext } from "./QuintParser"; +import { TypeUnitContext } from "./QuintParser"; import { TypeTupleContext } from "./QuintParser"; import { TypeRecContext } from "./QuintParser"; import { TypeIntContext } from "./QuintParser"; @@ -168,6 +169,19 @@ export interface QuintListener extends ParseTreeListener { */ exitTypeList?: (ctx: TypeListContext) => void; + /** + * Enter a parse tree produced by the `typeUnit` + * labeled alternative in `QuintParser.type`. + * @param ctx the parse tree + */ + enterTypeUnit?: (ctx: TypeUnitContext) => void; + /** + * Exit a parse tree produced by the `typeUnit` + * labeled alternative in `QuintParser.type`. + * @param ctx the parse tree + */ + exitTypeUnit?: (ctx: TypeUnitContext) => void; + /** * Enter a parse tree produced by the `typeTuple` * labeled alternative in `QuintParser.type`. diff --git a/quint/src/generated/QuintParser.ts b/quint/src/generated/QuintParser.ts index 42faa5ee2..0d88c2494 100644 --- a/quint/src/generated/QuintParser.ts +++ b/quint/src/generated/QuintParser.ts @@ -1389,7 +1389,7 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 416; + this.state = 418; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 42, this._ctx) ) { case 1: @@ -1443,7 +1443,7 @@ export class QuintParser extends Parser { this.state = 362; this.match(QuintParser.T__26); this.state = 363; - this.type(12); + this.type(13); } break; @@ -1481,174 +1481,186 @@ export class QuintParser extends Parser { case 4: { - _localctx = new TypeTupleContext(_localctx); + _localctx = new TypeUnitContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; this.state = 374; this.match(QuintParser.LPAREN); this.state = 375; - this.type(0); + this.match(QuintParser.RPAREN); + } + break; + + case 5: + { + _localctx = new TypeTupleContext(_localctx); + this._ctx = _localctx; + _prevctx = _localctx; this.state = 376; - this.match(QuintParser.T__7); + this.match(QuintParser.LPAREN); this.state = 377; this.type(0); - this.state = 382; + this.state = 378; + this.match(QuintParser.T__7); + this.state = 379; + this.type(0); + this.state = 384; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 378; + this.state = 380; this.match(QuintParser.T__7); - this.state = 379; + this.state = 381; this.type(0); } } } - this.state = 384; + this.state = 386; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); } - this.state = 386; + this.state = 388; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 385; + this.state = 387; this.match(QuintParser.T__7); } } - this.state = 388; + this.state = 390; this.match(QuintParser.RPAREN); } break; - case 5: + case 6: { _localctx = new TypeRecContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 390; - this.match(QuintParser.T__1); this.state = 392; + this.match(QuintParser.T__1); + this.state = 394; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__12 || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 391; + this.state = 393; this.row(); } } - this.state = 394; + this.state = 396; this.match(QuintParser.T__2); } break; - case 6: + case 7: { _localctx = new TypeIntContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 395; + this.state = 397; this.match(QuintParser.T__27); } break; - case 7: + case 8: { _localctx = new TypeStrContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 396; + this.state = 398; this.match(QuintParser.T__28); } break; - case 8: + case 9: { _localctx = new TypeBoolContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 397; + this.state = 399; this.match(QuintParser.T__29); } break; - case 9: + case 10: { _localctx = new TypeVarCaseContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 398; + this.state = 400; this.typeVar(); } break; - case 10: + case 11: { _localctx = new TypeConstContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 399; + this.state = 401; this.qualId(); } break; - case 11: + case 12: { _localctx = new TypeParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 400; + this.state = 402; this.match(QuintParser.LPAREN); - this.state = 401; + this.state = 403; this.type(0); - this.state = 402; + this.state = 404; this.match(QuintParser.RPAREN); } break; - case 12: + case 13: { _localctx = new TypeAppContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 404; + this.state = 406; (_localctx as TypeAppContext)._typeCtor = this.qualId(); { - this.state = 405; + this.state = 407; this.match(QuintParser.T__10); - this.state = 406; + this.state = 408; (_localctx as TypeAppContext)._type = this.type(0); (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); - this.state = 411; + this.state = 413; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 407; + this.state = 409; this.match(QuintParser.T__7); - this.state = 408; + this.state = 410; (_localctx as TypeAppContext)._type = this.type(0); (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); } } - this.state = 413; + this.state = 415; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 414; + this.state = 416; this.match(QuintParser.T__11); } } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 426; + this.state = 428; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 44, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -1658,21 +1670,21 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 424; + this.state = 426; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 43, this._ctx) ) { case 1: { _localctx = new TypeFunContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 418; - if (!(this.precpred(this._ctx, 14))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); + this.state = 420; + if (!(this.precpred(this._ctx, 15))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 15)"); } - this.state = 419; + this.state = 421; this.match(QuintParser.T__25); - this.state = 420; - this.type(14); + this.state = 422; + this.type(15); } break; @@ -1680,20 +1692,20 @@ export class QuintParser extends Parser { { _localctx = new TypeOperContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 421; - if (!(this.precpred(this._ctx, 13))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 13)"); + this.state = 423; + if (!(this.precpred(this._ctx, 14))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); } - this.state = 422; + this.state = 424; this.match(QuintParser.T__26); - this.state = 423; - this.type(13); + this.state = 425; + this.type(14); } break; } } } - this.state = 428; + this.state = 430; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 44, this._ctx); } @@ -1720,7 +1732,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 429; + this.state = 431; this.match(QuintParser.LOW_ID); } } @@ -1744,7 +1756,7 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 40, QuintParser.RULE_row); try { let _alt: number; - this.state = 452; + this.state = 454; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: @@ -1752,50 +1764,50 @@ export class QuintParser extends Parser { this.enterOuterAlt(_localctx, 1); { { - this.state = 431; + this.state = 433; this.rowLabel(); - this.state = 432; + this.state = 434; this.match(QuintParser.T__4); - this.state = 433; + this.state = 435; this.type(0); } - this.state = 442; + this.state = 444; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 45, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 435; + this.state = 437; this.match(QuintParser.T__7); - this.state = 436; + this.state = 438; this.rowLabel(); - this.state = 437; + this.state = 439; this.match(QuintParser.T__4); - this.state = 438; + this.state = 440; this.type(0); } } } - this.state = 444; + this.state = 446; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 45, this._ctx); } - this.state = 448; + this.state = 450; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__7: { - this.state = 445; + this.state = 447; this.match(QuintParser.T__7); } break; case QuintParser.T__12: { - this.state = 446; + this.state = 448; this.match(QuintParser.T__12); { - this.state = 447; + this.state = 449; _localctx._rowVar = this.identifier(); } } @@ -1810,10 +1822,10 @@ export class QuintParser extends Parser { case QuintParser.T__12: this.enterOuterAlt(_localctx, 2); { - this.state = 450; + this.state = 452; this.match(QuintParser.T__12); { - this.state = 451; + this.state = 453; _localctx._rowVar = this.identifier(); } } @@ -1843,7 +1855,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 454; + this.state = 456; this.simpleId("record"); } } @@ -1881,7 +1893,7 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 608; + this.state = 610; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 65, this._ctx) ) { case 1: @@ -1890,7 +1902,7 @@ export class QuintParser extends Parser { this._ctx = _localctx; _prevctx = _localctx; - this.state = 457; + this.state = 459; this.lambda(); } break; @@ -1900,21 +1912,21 @@ export class QuintParser extends Parser { _localctx = new OperAppContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 458; + this.state = 460; this.normalCallName(); - this.state = 459; - this.match(QuintParser.LPAREN); this.state = 461; + this.match(QuintParser.LPAREN); + this.state = 463; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 460; + this.state = 462; this.argList(); } } - this.state = 463; + this.state = 465; this.match(QuintParser.RPAREN); } break; @@ -1924,9 +1936,9 @@ export class QuintParser extends Parser { _localctx = new UminusContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 465; + this.state = 467; this.match(QuintParser.MINUS); - this.state = 466; + this.state = 468; this.expr(26); } break; @@ -1936,13 +1948,13 @@ export class QuintParser extends Parser { _localctx = new AsgnContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 467; + this.state = 469; this.qualId(); - this.state = 468; + this.state = 470; this.match(QuintParser.T__31); - this.state = 469; + this.state = 471; this.match(QuintParser.ASGN); - this.state = 470; + this.state = 472; this.expr(22); } break; @@ -1952,41 +1964,41 @@ export class QuintParser extends Parser { _localctx = new AndExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 472; + this.state = 474; this.match(QuintParser.AND); - this.state = 473; + this.state = 475; this.match(QuintParser.T__1); - this.state = 474; + this.state = 476; this.expr(0); - this.state = 479; + this.state = 481; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 475; + this.state = 477; this.match(QuintParser.T__7); - this.state = 476; + this.state = 478; this.expr(0); } } } - this.state = 481; + this.state = 483; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); } - this.state = 483; + this.state = 485; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 482; + this.state = 484; this.match(QuintParser.T__7); } } - this.state = 485; + this.state = 487; this.match(QuintParser.T__2); } break; @@ -1996,41 +2008,41 @@ export class QuintParser extends Parser { _localctx = new OrExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 487; + this.state = 489; this.match(QuintParser.OR); - this.state = 488; + this.state = 490; this.match(QuintParser.T__1); - this.state = 489; + this.state = 491; this.expr(0); - this.state = 494; + this.state = 496; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 51, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 490; + this.state = 492; this.match(QuintParser.T__7); - this.state = 491; + this.state = 493; this.expr(0); } } } - this.state = 496; + this.state = 498; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 51, this._ctx); } - this.state = 498; + this.state = 500; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 497; + this.state = 499; this.match(QuintParser.T__7); } } - this.state = 500; + this.state = 502; this.match(QuintParser.T__2); } break; @@ -2040,7 +2052,7 @@ export class QuintParser extends Parser { _localctx = new MatchContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 502; + this.state = 504; this.matchSumExpr(); } break; @@ -2050,41 +2062,41 @@ export class QuintParser extends Parser { _localctx = new ActionAllContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 503; + this.state = 505; this.match(QuintParser.T__32); - this.state = 504; + this.state = 506; this.match(QuintParser.T__1); - this.state = 505; + this.state = 507; this.expr(0); - this.state = 510; + this.state = 512; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 53, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 506; + this.state = 508; this.match(QuintParser.T__7); - this.state = 507; + this.state = 509; this.expr(0); } } } - this.state = 512; + this.state = 514; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 53, this._ctx); } - this.state = 514; + this.state = 516; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 513; + this.state = 515; this.match(QuintParser.T__7); } } - this.state = 516; + this.state = 518; this.match(QuintParser.T__2); } break; @@ -2094,41 +2106,41 @@ export class QuintParser extends Parser { _localctx = new ActionAnyContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 518; + this.state = 520; this.match(QuintParser.T__33); - this.state = 519; + this.state = 521; this.match(QuintParser.T__1); - this.state = 520; + this.state = 522; this.expr(0); - this.state = 525; + this.state = 527; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 55, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 521; + this.state = 523; this.match(QuintParser.T__7); - this.state = 522; + this.state = 524; this.expr(0); } } } - this.state = 527; + this.state = 529; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 55, this._ctx); } - this.state = 529; + this.state = 531; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 528; + this.state = 530; this.match(QuintParser.T__7); } } - this.state = 531; + this.state = 533; this.match(QuintParser.T__2); } break; @@ -2138,31 +2150,31 @@ export class QuintParser extends Parser { _localctx = new LiteralOrIdContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 537; + this.state = 539; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 533; + this.state = 535; this.qualId(); } break; case QuintParser.INT: { - this.state = 534; + this.state = 536; this.match(QuintParser.INT); } break; case QuintParser.BOOL: { - this.state = 535; + this.state = 537; this.match(QuintParser.BOOL); } break; case QuintParser.STRING: { - this.state = 536; + this.state = 538; this.match(QuintParser.STRING); } break; @@ -2177,43 +2189,43 @@ export class QuintParser extends Parser { _localctx = new TupleContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 539; + this.state = 541; this.match(QuintParser.LPAREN); - this.state = 540; + this.state = 542; this.expr(0); - this.state = 541; + this.state = 543; this.match(QuintParser.T__7); - this.state = 542; + this.state = 544; this.expr(0); - this.state = 547; + this.state = 549; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 58, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 543; + this.state = 545; this.match(QuintParser.T__7); - this.state = 544; + this.state = 546; this.expr(0); } } } - this.state = 549; + this.state = 551; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 58, this._ctx); } - this.state = 551; + this.state = 553; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 550; + this.state = 552; this.match(QuintParser.T__7); } } - this.state = 553; + this.state = 555; this.match(QuintParser.RPAREN); } break; @@ -2223,9 +2235,9 @@ export class QuintParser extends Parser { _localctx = new UnitContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 555; + this.state = 557; this.match(QuintParser.LPAREN); - this.state = 556; + this.state = 558; this.match(QuintParser.RPAREN); } break; @@ -2235,39 +2247,39 @@ export class QuintParser extends Parser { _localctx = new RecordContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 557; + this.state = 559; this.match(QuintParser.T__1); - this.state = 558; + this.state = 560; this.recElem(); - this.state = 563; + this.state = 565; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 60, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 559; + this.state = 561; this.match(QuintParser.T__7); - this.state = 560; + this.state = 562; this.recElem(); } } } - this.state = 565; + this.state = 567; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 60, this._ctx); } - this.state = 567; + this.state = 569; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 566; + this.state = 568; this.match(QuintParser.T__7); } } - this.state = 569; + this.state = 571; this.match(QuintParser.T__2); } break; @@ -2277,47 +2289,47 @@ export class QuintParser extends Parser { _localctx = new ListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 571; + this.state = 573; this.match(QuintParser.T__10); - this.state = 580; + this.state = 582; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 572; + this.state = 574; this.expr(0); - this.state = 577; + this.state = 579; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 62, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 573; + this.state = 575; this.match(QuintParser.T__7); - this.state = 574; + this.state = 576; this.expr(0); } } } - this.state = 579; + this.state = 581; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 62, this._ctx); } } } - this.state = 583; + this.state = 585; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 582; + this.state = 584; this.match(QuintParser.T__7); } } - this.state = 585; + this.state = 587; this.match(QuintParser.T__11); } break; @@ -2327,19 +2339,19 @@ export class QuintParser extends Parser { _localctx = new IfElseContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 586; - this.match(QuintParser.T__34); - this.state = 587; - this.match(QuintParser.LPAREN); this.state = 588; - this.expr(0); + this.match(QuintParser.T__34); this.state = 589; - this.match(QuintParser.RPAREN); + this.match(QuintParser.LPAREN); this.state = 590; this.expr(0); this.state = 591; - this.match(QuintParser.T__35); + this.match(QuintParser.RPAREN); this.state = 592; + this.expr(0); + this.state = 593; + this.match(QuintParser.T__35); + this.state = 594; this.expr(5); } break; @@ -2349,9 +2361,9 @@ export class QuintParser extends Parser { _localctx = new LetInContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 594; + this.state = 596; this.operDef(); - this.state = 595; + this.state = 597; this.expr(4); } break; @@ -2361,9 +2373,9 @@ export class QuintParser extends Parser { _localctx = new NondetContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 597; + this.state = 599; this.nondetOperDef(); - this.state = 598; + this.state = 600; this.expr(3); } break; @@ -2373,11 +2385,11 @@ export class QuintParser extends Parser { _localctx = new ParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 600; + this.state = 602; this.match(QuintParser.LPAREN); - this.state = 601; + this.state = 603; this.expr(0); - this.state = 602; + this.state = 604; this.match(QuintParser.RPAREN); } break; @@ -2387,17 +2399,17 @@ export class QuintParser extends Parser { _localctx = new BracesContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 604; + this.state = 606; this.match(QuintParser.T__1); - this.state = 605; + this.state = 607; this.expr(0); - this.state = 606; + this.state = 608; this.match(QuintParser.T__2); } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 659; + this.state = 661; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 69, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -2407,20 +2419,20 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 657; + this.state = 659; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 68, this._ctx) ) { case 1: { _localctx = new PowContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 610; + this.state = 612; if (!(this.precpred(this._ctx, 27))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 27)"); } - this.state = 611; + this.state = 613; (_localctx as PowContext)._op = this.match(QuintParser.T__30); - this.state = 612; + this.state = 614; this.expr(27); } break; @@ -2429,11 +2441,11 @@ export class QuintParser extends Parser { { _localctx = new MultDivContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 613; + this.state = 615; if (!(this.precpred(this._ctx, 25))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 25)"); } - this.state = 614; + this.state = 616; (_localctx as MultDivContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & ((1 << (QuintParser.MUL - 51)) | (1 << (QuintParser.DIV - 51)) | (1 << (QuintParser.MOD - 51)))) !== 0))) { @@ -2446,7 +2458,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 615; + this.state = 617; this.expr(26); } break; @@ -2455,11 +2467,11 @@ export class QuintParser extends Parser { { _localctx = new PlusMinusContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 616; + this.state = 618; if (!(this.precpred(this._ctx, 24))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 24)"); } - this.state = 617; + this.state = 619; (_localctx as PlusMinusContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(_la === QuintParser.PLUS || _la === QuintParser.MINUS)) { @@ -2472,7 +2484,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 618; + this.state = 620; this.expr(25); } break; @@ -2481,11 +2493,11 @@ export class QuintParser extends Parser { { _localctx = new RelationsContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 619; + this.state = 621; if (!(this.precpred(this._ctx, 23))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 23)"); } - this.state = 620; + this.state = 622; (_localctx as RelationsContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 54)) & ~0x1F) === 0 && ((1 << (_la - 54)) & ((1 << (QuintParser.GT - 54)) | (1 << (QuintParser.LT - 54)) | (1 << (QuintParser.GE - 54)) | (1 << (QuintParser.LE - 54)) | (1 << (QuintParser.NE - 54)) | (1 << (QuintParser.EQ - 54)))) !== 0))) { @@ -2498,7 +2510,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 621; + this.state = 623; this.expr(24); } break; @@ -2507,13 +2519,13 @@ export class QuintParser extends Parser { { _localctx = new ErrorEqContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 622; + this.state = 624; if (!(this.precpred(this._ctx, 21))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 21)"); } - this.state = 623; + this.state = 625; this.match(QuintParser.ASGN); - this.state = 624; + this.state = 626; this.expr(22); const m = "[QNT006] unexpected '=', did you mean '=='?" @@ -2526,13 +2538,13 @@ export class QuintParser extends Parser { { _localctx = new AndContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 627; + this.state = 629; if (!(this.precpred(this._ctx, 19))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 19)"); } - this.state = 628; + this.state = 630; this.match(QuintParser.AND); - this.state = 629; + this.state = 631; this.expr(20); } break; @@ -2541,13 +2553,13 @@ export class QuintParser extends Parser { { _localctx = new OrContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 630; + this.state = 632; if (!(this.precpred(this._ctx, 17))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 17)"); } - this.state = 631; + this.state = 633; this.match(QuintParser.OR); - this.state = 632; + this.state = 634; this.expr(18); } break; @@ -2556,13 +2568,13 @@ export class QuintParser extends Parser { { _localctx = new IffContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 633; + this.state = 635; if (!(this.precpred(this._ctx, 16))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 16)"); } - this.state = 634; + this.state = 636; this.match(QuintParser.IFF); - this.state = 635; + this.state = 637; this.expr(17); } break; @@ -2571,13 +2583,13 @@ export class QuintParser extends Parser { { _localctx = new ImpliesContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 636; + this.state = 638; if (!(this.precpred(this._ctx, 15))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 15)"); } - this.state = 637; + this.state = 639; this.match(QuintParser.IMPLIES); - this.state = 638; + this.state = 640; this.expr(16); } break; @@ -2586,13 +2598,13 @@ export class QuintParser extends Parser { { _localctx = new PairContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 639; + this.state = 641; if (!(this.precpred(this._ctx, 8))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 8)"); } - this.state = 640; + this.state = 642; this.match(QuintParser.T__25); - this.state = 641; + this.state = 643; this.expr(9); } break; @@ -2601,32 +2613,32 @@ export class QuintParser extends Parser { { _localctx = new DotCallContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 642; + this.state = 644; if (!(this.precpred(this._ctx, 31))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 31)"); } - this.state = 643; + this.state = 645; this.match(QuintParser.T__21); - this.state = 644; + this.state = 646; this.nameAfterDot(); - this.state = 650; + this.state = 652; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 67, this._ctx) ) { case 1: { - this.state = 645; - this.match(QuintParser.LPAREN); this.state = 647; + this.match(QuintParser.LPAREN); + this.state = 649; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 646; + this.state = 648; this.argList(); } } - this.state = 649; + this.state = 651; this.match(QuintParser.RPAREN); } break; @@ -2638,22 +2650,22 @@ export class QuintParser extends Parser { { _localctx = new ListAppContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 652; + this.state = 654; if (!(this.precpred(this._ctx, 28))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 28)"); } - this.state = 653; + this.state = 655; this.match(QuintParser.T__10); - this.state = 654; + this.state = 656; this.expr(0); - this.state = 655; + this.state = 657; this.match(QuintParser.T__11); } break; } } } - this.state = 661; + this.state = 663; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 69, this._ctx); } @@ -2681,43 +2693,43 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 662; + this.state = 664; this.match(QuintParser.MATCH); - this.state = 663; + this.state = 665; this.expr(0); - this.state = 664; - this.match(QuintParser.T__1); this.state = 666; + this.match(QuintParser.T__1); + this.state = 668; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__12) { { - this.state = 665; + this.state = 667; this.match(QuintParser.T__12); } } - this.state = 668; + this.state = 670; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); - this.state = 673; + this.state = 675; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__12) { { { - this.state = 669; + this.state = 671; this.match(QuintParser.T__12); - this.state = 670; + this.state = 672; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); } } - this.state = 675; + this.state = 677; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 676; + this.state = 678; this.match(QuintParser.T__2); } } @@ -2742,28 +2754,28 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 680; + this.state = 682; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 678; + this.state = 680; _localctx._variantMatch = this.matchSumVariant(); } break; case QuintParser.T__36: { - this.state = 679; + this.state = 681; _localctx._wildCardMatch = this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 682; + this.state = 684; this.match(QuintParser.T__26); - this.state = 683; + this.state = 685; this.expr(0); } } @@ -2790,36 +2802,36 @@ export class QuintParser extends Parser { this.enterOuterAlt(_localctx, 1); { { - this.state = 685; + this.state = 687; _localctx._variantLabel = this.simpleId("variant label"); } - this.state = 692; + this.state = 694; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.LPAREN) { { - this.state = 686; + this.state = 688; this.match(QuintParser.LPAREN); - this.state = 689; + this.state = 691; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: { - this.state = 687; + this.state = 689; _localctx._variantParam = this.simpleId("match case parameter"); } break; case QuintParser.T__36: { - this.state = 688; + this.state = 690; this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 691; + this.state = 693; this.match(QuintParser.RPAREN); } } @@ -2845,15 +2857,15 @@ export class QuintParser extends Parser { let _localctx: DeclarationOrExprContext = new DeclarationOrExprContext(this._ctx, this.state); this.enterRule(_localctx, 52, QuintParser.RULE_declarationOrExpr); try { - this.state = 703; + this.state = 705; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 75, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 694; + this.state = 696; this.declaration(); - this.state = 695; + this.state = 697; this.match(QuintParser.EOF); } break; @@ -2861,9 +2873,9 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 697; + this.state = 699; this.expr(0); - this.state = 698; + this.state = 700; this.match(QuintParser.EOF); } break; @@ -2871,9 +2883,9 @@ export class QuintParser extends Parser { case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 700; + this.state = 702; this.match(QuintParser.DOCCOMMENT); - this.state = 701; + this.state = 703; this.match(QuintParser.EOF); } break; @@ -2881,7 +2893,7 @@ export class QuintParser extends Parser { case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 702; + this.state = 704; this.match(QuintParser.EOF); } break; @@ -2906,13 +2918,13 @@ export class QuintParser extends Parser { let _localctx: LambdaContext = new LambdaContext(this._ctx, this.state); this.enterRule(_localctx, 54, QuintParser.RULE_lambda); try { - this.state = 707; + this.state = 709; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 76, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 705; + this.state = 707; this.lambdaUnsugared(); } break; @@ -2920,7 +2932,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 706; + this.state = 708; this.lambdaTupleSugar(); } break; @@ -2946,7 +2958,7 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 56, QuintParser.RULE_lambdaUnsugared); let _la: number; try { - this.state = 726; + this.state = 728; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: @@ -2954,42 +2966,42 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 709; + this.state = 711; this.parameter(); - this.state = 710; + this.state = 712; this.match(QuintParser.T__26); - this.state = 711; + this.state = 713; this.expr(0); } break; case QuintParser.LPAREN: this.enterOuterAlt(_localctx, 2); { - this.state = 713; + this.state = 715; this.match(QuintParser.LPAREN); - this.state = 714; + this.state = 716; this.parameter(); - this.state = 719; + this.state = 721; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 715; + this.state = 717; this.match(QuintParser.T__7); - this.state = 716; + this.state = 718; this.parameter(); } } - this.state = 721; + this.state = 723; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 722; + this.state = 724; this.match(QuintParser.RPAREN); - this.state = 723; + this.state = 725; this.match(QuintParser.T__26); - this.state = 724; + this.state = 726; this.expr(0); } break; @@ -3019,35 +3031,35 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 728; + this.state = 730; this.match(QuintParser.LPAREN); - this.state = 729; + this.state = 731; this.match(QuintParser.LPAREN); - this.state = 730; + this.state = 732; this.parameter(); - this.state = 733; + this.state = 735; this._errHandler.sync(this); _la = this._input.LA(1); do { { { - this.state = 731; + this.state = 733; this.match(QuintParser.T__7); - this.state = 732; + this.state = 734; this.parameter(); } } - this.state = 735; + this.state = 737; this._errHandler.sync(this); _la = this._input.LA(1); } while (_la === QuintParser.T__7); - this.state = 737; + this.state = 739; this.match(QuintParser.RPAREN); - this.state = 738; + this.state = 740; this.match(QuintParser.RPAREN); - this.state = 739; + this.state = 741; this.match(QuintParser.T__26); - this.state = 740; + this.state = 742; this.expr(0); } } @@ -3070,13 +3082,13 @@ export class QuintParser extends Parser { let _localctx: IdentOrHoleContext = new IdentOrHoleContext(this._ctx, this.state); this.enterRule(_localctx, 60, QuintParser.RULE_identOrHole); try { - this.state = 744; + this.state = 746; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: this.enterOuterAlt(_localctx, 1); { - this.state = 742; + this.state = 744; this.match(QuintParser.T__36); } break; @@ -3084,7 +3096,7 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 743; + this.state = 745; this.qualId(); } break; @@ -3113,7 +3125,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 746; + this.state = 748; _localctx._paramName = this.identOrHole(); } } @@ -3138,11 +3150,11 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 748; + this.state = 750; _localctx._paramName = this.identOrHole(); - this.state = 749; + this.state = 751; this.match(QuintParser.T__4); - this.state = 750; + this.state = 752; this.type(0); } } @@ -3165,13 +3177,13 @@ export class QuintParser extends Parser { let _localctx: IdentOrStarContext = new IdentOrStarContext(this._ctx, this.state); this.enterRule(_localctx, 66, QuintParser.RULE_identOrStar); try { - this.state = 754; + this.state = 756; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.MUL: this.enterOuterAlt(_localctx, 1); { - this.state = 752; + this.state = 754; this.match(QuintParser.MUL); } break; @@ -3179,7 +3191,7 @@ export class QuintParser extends Parser { case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 753; + this.state = 755; this.qualId(); } break; @@ -3209,21 +3221,21 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 756; + this.state = 758; this.expr(0); - this.state = 761; + this.state = 763; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 757; + this.state = 759; this.match(QuintParser.T__7); - this.state = 758; + this.state = 760; this.expr(0); } } - this.state = 763; + this.state = 765; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -3248,27 +3260,27 @@ export class QuintParser extends Parser { let _localctx: RecElemContext = new RecElemContext(this._ctx, this.state); this.enterRule(_localctx, 70, QuintParser.RULE_recElem); try { - this.state = 770; + this.state = 772; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 764; + this.state = 766; this.simpleId("record"); - this.state = 765; + this.state = 767; this.match(QuintParser.T__4); - this.state = 766; + this.state = 768; this.expr(0); } break; case QuintParser.T__37: this.enterOuterAlt(_localctx, 2); { - this.state = 768; + this.state = 770; this.match(QuintParser.T__37); - this.state = 769; + this.state = 771; this.expr(0); } break; @@ -3296,14 +3308,14 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 72, QuintParser.RULE_normalCallName); let _la: number; try { - this.state = 774; + this.state = 776; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 772; + this.state = 774; this.qualId(); } break; @@ -3316,7 +3328,7 @@ export class QuintParser extends Parser { case QuintParser.LIST: this.enterOuterAlt(_localctx, 2); { - this.state = 773; + this.state = 775; _localctx._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 43)) & ~0x1F) === 0 && ((1 << (_la - 43)) & ((1 << (QuintParser.AND - 43)) | (1 << (QuintParser.OR - 43)) | (1 << (QuintParser.IFF - 43)) | (1 << (QuintParser.IMPLIES - 43)) | (1 << (QuintParser.MAP - 43)) | (1 << (QuintParser.SET - 43)) | (1 << (QuintParser.LIST - 43)))) !== 0))) { @@ -3355,14 +3367,14 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 74, QuintParser.RULE_nameAfterDot); let _la: number; try { - this.state = 778; + this.state = 780; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.LOW_ID: case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 776; + this.state = 778; this.qualId(); } break; @@ -3372,7 +3384,7 @@ export class QuintParser extends Parser { case QuintParser.IMPLIES: this.enterOuterAlt(_localctx, 2); { - this.state = 777; + this.state = 779; _localctx._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 43)) & ~0x1F) === 0 && ((1 << (_la - 43)) & ((1 << (QuintParser.AND - 43)) | (1 << (QuintParser.OR - 43)) | (1 << (QuintParser.IFF - 43)) | (1 << (QuintParser.IMPLIES - 43)))) !== 0))) { @@ -3413,7 +3425,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 780; + this.state = 782; _la = this._input.LA(1); if (!(((((_la - 31)) & ~0x1F) === 0 && ((1 << (_la - 31)) & ((1 << (QuintParser.T__30 - 31)) | (1 << (QuintParser.AND - 31)) | (1 << (QuintParser.OR - 31)) | (1 << (QuintParser.IFF - 31)) | (1 << (QuintParser.IMPLIES - 31)) | (1 << (QuintParser.PLUS - 31)) | (1 << (QuintParser.MINUS - 31)) | (1 << (QuintParser.MUL - 31)) | (1 << (QuintParser.DIV - 31)) | (1 << (QuintParser.MOD - 31)) | (1 << (QuintParser.GT - 31)) | (1 << (QuintParser.LT - 31)) | (1 << (QuintParser.GE - 31)) | (1 << (QuintParser.LE - 31)) | (1 << (QuintParser.NE - 31)) | (1 << (QuintParser.EQ - 31)))) !== 0))) { this._errHandler.recoverInline(this); @@ -3449,7 +3461,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 782; + this.state = 784; _la = this._input.LA(1); if (!(((((_la - 40)) & ~0x1F) === 0 && ((1 << (_la - 40)) & ((1 << (QuintParser.STRING - 40)) | (1 << (QuintParser.BOOL - 40)) | (1 << (QuintParser.INT - 40)))) !== 0))) { this._errHandler.recoverInline(this); @@ -3485,23 +3497,23 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 784; + this.state = 786; this.identifier(); - this.state = 789; + this.state = 791; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 86, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 785; + this.state = 787; this.match(QuintParser.T__38); - this.state = 786; + this.state = 788; this.identifier(); } } } - this.state = 791; + this.state = 793; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 86, this._ctx); } @@ -3526,13 +3538,13 @@ export class QuintParser extends Parser { let _localctx: SimpleIdContext = new SimpleIdContext(this._ctx, this.state, context); this.enterRule(_localctx, 82, QuintParser.RULE_simpleId); try { - this.state = 796; + this.state = 798; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 87, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 792; + this.state = 794; this.identifier(); } break; @@ -3540,7 +3552,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 793; + this.state = 795; _localctx._qualId = this.qualId(); const err = quintErrorToString( @@ -3576,7 +3588,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 798; + this.state = 800; _la = this._input.LA(1); if (!(_la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID)) { this._errHandler.recoverInline(this); @@ -3618,10 +3630,10 @@ export class QuintParser extends Parser { private type_sempred(_localctx: TypeContext, predIndex: number): boolean { switch (predIndex) { case 0: - return this.precpred(this._ctx, 14); + return this.precpred(this._ctx, 15); case 1: - return this.precpred(this._ctx, 13); + return this.precpred(this._ctx, 14); } return true; } @@ -3668,7 +3680,7 @@ export class QuintParser extends Parser { private static readonly _serializedATNSegments: number = 2; private static readonly _serializedATNSegment0: string = - "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03H\u0323\x04\x02" + + "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03H\u0325\x04\x02" + "\t\x02\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06\x04\x07" + "\t\x07\x04\b\t\b\x04\t\t\t\x04\n\t\n\x04\v\t\v\x04\f\t\f\x04\r\t\r\x04" + "\x0E\t\x0E\x04\x0F\t\x0F\x04\x10\t\x10\x04\x11\t\x11\x04\x12\t\x12\x04" + @@ -3708,389 +3720,390 @@ export class QuintParser extends Parser { "\u0162\n\x14\f\x14\x0E\x14\u0165\v\x14\x05\x14\u0167\n\x14\x03\x14\x05" + "\x14\u016A\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + - "\x03\x14\x03\x14\x03\x14\x07\x14\u017F\n\x14\f\x14\x0E\x14\u0182\v\x14" + - "\x03\x14\x05\x14\u0185\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x05\x14\u018B" + - "\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + - "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u019C" + - "\n\x14\f\x14\x0E\x14\u019F\v\x14\x03\x14\x03\x14\x05\x14\u01A3\n\x14\x03" + - "\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u01AB\n\x14\f\x14" + - "\x0E\x14\u01AE\v\x14\x03\x15\x03\x15\x03\x16\x03\x16\x03\x16\x03\x16\x03" + - "\x16\x03\x16\x03\x16\x03\x16\x03\x16\x07\x16\u01BB\n\x16\f\x16\x0E\x16" + - "\u01BE\v\x16\x03\x16\x03\x16\x03\x16\x05\x16\u01C3\n\x16\x03\x16\x03\x16" + - "\x05\x16\u01C7\n\x16\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x05\x18\u01D0\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18" + - "\u01E0\n\x18\f\x18\x0E\x18\u01E3\v\x18\x03\x18\x05\x18\u01E6\n\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u01EF\n\x18" + - "\f\x18\x0E\x18\u01F2\v\x18\x03\x18\x05\x18\u01F5\n\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u01FF\n\x18\f" + - "\x18\x0E\x18\u0202\v\x18\x03\x18\x05\x18\u0205\n\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u020E\n\x18\f\x18\x0E\x18" + - "\u0211\v\x18\x03\x18\x05\x18\u0214\n\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x05\x18\u021C\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x07\x18\u0224\n\x18\f\x18\x0E\x18\u0227\v\x18\x03\x18\x05" + - "\x18\u022A\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x07\x18\u0234\n\x18\f\x18\x0E\x18\u0237\v\x18\x03\x18\x05\x18" + - "\u023A\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0242" + - "\n\x18\f\x18\x0E\x18\u0245\v\x18\x05\x18\u0247\n\x18\x03\x18\x05\x18\u024A" + - "\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + - "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u0263\n\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u0181\n\x14\f\x14\x0E" + + "\x14\u0184\v\x14\x03\x14\x05\x14\u0187\n\x14\x03\x14\x03\x14\x03\x14\x03" + + "\x14\x05\x14\u018D\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + + "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + + "\x07\x14\u019E\n\x14\f\x14\x0E\x14\u01A1\v\x14\x03\x14\x03\x14\x05\x14" + + "\u01A5\n\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\u01AD" + + "\n\x14\f\x14\x0E\x14\u01B0\v\x14\x03\x15\x03\x15\x03\x16\x03\x16\x03\x16" + + "\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x07\x16\u01BD\n\x16\f" + + "\x16\x0E\x16\u01C0\v\x16\x03\x16\x03\x16\x03\x16\x05\x16\u01C5\n\x16\x03" + + "\x16\x03\x16\x05\x16\u01C9\n\x16\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x05\x18\u01D2\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x07\x18\u01E2\n\x18\f\x18\x0E\x18\u01E5\v\x18\x03\x18\x05\x18\u01E8" + + "\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18" + + "\u01F1\n\x18\f\x18\x0E\x18\u01F4\v\x18\x03\x18\x05\x18\u01F7\n\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0201" + + "\n\x18\f\x18\x0E\x18\u0204\v\x18\x03\x18\x05\x18\u0207\n\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0210\n\x18\f\x18" + + "\x0E\x18\u0213\v\x18\x03\x18\x05\x18\u0216\n\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x05\x18\u021E\n\x18\x03\x18\x03\x18\x03\x18\x03" + + "\x18\x03\x18\x03\x18\x07\x18\u0226\n\x18\f\x18\x0E\x18\u0229\v\x18\x03" + + "\x18\x05\x18\u022C\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x07\x18\u0236\n\x18\f\x18\x0E\x18\u0239\v\x18\x03\x18" + + "\x05\x18\u023C\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07" + + "\x18\u0244\n\x18\f\x18\x0E\x18\u0247\v\x18\x05\x18\u0249\n\x18\x03\x18" + + "\x05\x18\u024C\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x05\x18\u028A\n\x18\x03\x18\x05\x18\u028D\n\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x18\x03\x18\x07\x18\u0294\n\x18\f\x18\x0E\x18\u0297\v\x18\x03" + - "\x19\x03\x19\x03\x19\x03\x19\x05\x19\u029D\n\x19\x03\x19\x03\x19\x03\x19" + - "\x07\x19\u02A2\n\x19\f\x19\x0E\x19\u02A5\v\x19\x03\x19\x03\x19\x03\x1A" + - "\x03\x1A\x05\x1A\u02AB\n\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1B\x03\x1B\x03" + - "\x1B\x03\x1B\x05\x1B\u02B4\n\x1B\x03\x1B\x05\x1B\u02B7\n\x1B\x03\x1C\x03" + - "\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x05\x1C\u02C2" + - "\n\x1C\x03\x1D\x03\x1D\x05\x1D\u02C6\n\x1D\x03\x1E\x03\x1E\x03\x1E\x03" + - "\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x07\x1E\u02D0\n\x1E\f\x1E\x0E\x1E" + - "\u02D3\v\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x05\x1E\u02D9\n\x1E\x03\x1F" + - "\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x06\x1F\u02E0\n\x1F\r\x1F\x0E\x1F\u02E1" + - "\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03 \x03 \x05 \u02EB\n \x03!" + - "\x03!\x03\"\x03\"\x03\"\x03\"\x03#\x03#\x05#\u02F5\n#\x03$\x03$\x03$\x07" + - "$\u02FA\n$\f$\x0E$\u02FD\v$\x03%\x03%\x03%\x03%\x03%\x03%\x05%\u0305\n" + - "%\x03&\x03&\x05&\u0309\n&\x03\'\x03\'\x05\'\u030D\n\'\x03(\x03(\x03)\x03" + - ")\x03*\x03*\x03*\x07*\u0316\n*\f*\x0E*\u0319\v*\x03+\x03+\x03+\x03+\x05" + - "+\u031F\n+\x03,\x03,\x03,\x02\x02\x04&.-\x02\x02\x04\x02\x06\x02\b\x02" + - "\n\x02\f\x02\x0E\x02\x10\x02\x12\x02\x14\x02\x16\x02\x18\x02\x1A\x02\x1C" + - "\x02\x1E\x02 \x02\"\x02$\x02&\x02(\x02*\x02,\x02.\x020\x022\x024\x026" + - "\x028\x02:\x02<\x02>\x02@\x02B\x02D\x02F\x02H\x02J\x02L\x02N\x02P\x02" + - "R\x02T\x02V\x02\x02\n\x03\x0257\x03\x0234\x03\x028=\x04\x02-1AB\x03\x02" + - "-0\x05\x02!!-03=\x03\x02*,\x03\x02CD\x02\u0385\x02Y\x03\x02\x02\x02\x04" + - "b\x03\x02\x02\x02\x06s\x03\x02\x02\x02\b\x8C\x03\x02\x02\x02\n\xBE\x03" + - "\x02\x02\x02\f\xCC\x03\x02\x02\x02\x0E\xCE\x03\x02\x02\x02\x10\xDC\x03" + - "\x02\x02\x02\x12\xE6\x03\x02\x02\x02\x14\xED\x03\x02\x02\x02\x16\u0101" + - "\x03\x02\x02\x02\x18\u0115\x03\x02\x02\x02\x1A\u0122\x03\x02\x02\x02\x1C" + - "\u0152\x03\x02\x02\x02\x1E\u0154\x03\x02\x02\x02 \u0156\x03\x02\x02\x02" + - "\"\u0158\x03\x02\x02\x02$\u015A\x03\x02\x02\x02&\u01A2\x03\x02\x02\x02" + - "(\u01AF\x03\x02\x02\x02*\u01C6\x03\x02\x02\x02,\u01C8\x03\x02\x02\x02" + - ".\u0262\x03\x02\x02\x020\u0298\x03\x02\x02\x022\u02AA\x03\x02\x02\x02" + - "4\u02AF\x03\x02\x02\x026\u02C1\x03\x02\x02\x028\u02C5\x03\x02\x02\x02" + - ":\u02D8\x03\x02\x02\x02<\u02DA\x03\x02\x02\x02>\u02EA\x03\x02\x02\x02" + - "@\u02EC\x03\x02\x02\x02B\u02EE\x03\x02\x02\x02D\u02F4\x03\x02\x02\x02" + - "F\u02F6\x03\x02\x02\x02H\u0304\x03\x02\x02\x02J\u0308\x03\x02\x02\x02" + - "L\u030C\x03\x02\x02\x02N\u030E\x03\x02\x02\x02P\u0310\x03\x02\x02\x02" + - "R\u0312\x03\x02\x02\x02T\u031E\x03\x02\x02\x02V\u0320\x03\x02\x02\x02" + - "XZ\x05\x04\x03\x02YX\x03\x02\x02\x02Z[\x03\x02\x02\x02[Y\x03\x02\x02\x02" + - "[\\\x03\x02\x02\x02\\]\x03\x02\x02\x02]^\x07\x02\x02\x03^\x03\x03\x02" + - "\x02\x02_a\x07E\x02\x02`_\x03\x02\x02\x02ad\x03\x02\x02\x02b`\x03\x02" + - "\x02\x02bc\x03\x02\x02\x02ce\x03\x02\x02\x02db\x03\x02\x02\x02ef\x07\x03" + - "\x02\x02fg\x05R*\x02gk\x07\x04\x02\x02hj\x05\x06\x04\x02ih\x03\x02\x02" + - "\x02jm\x03\x02\x02\x02ki\x03\x02\x02\x02kl\x03\x02\x02\x02ln\x03\x02\x02" + - "\x02mk\x03\x02\x02\x02no\x07\x05\x02\x02o\x05\x03\x02\x02\x02pr\x07E\x02" + - "\x02qp\x03\x02\x02\x02ru\x03\x02\x02\x02sq\x03\x02\x02\x02st\x03\x02\x02" + - "\x02tv\x03\x02\x02\x02us\x03\x02\x02\x02vw\x05\b\x05\x02w\x07\x03\x02" + - "\x02\x02xy\x07\x06\x02\x02yz\x05R*\x02z{\x07\x07\x02\x02{|\x05&\x14\x02" + - "|\x8D\x03\x02\x02\x02}~\x07\b\x02\x02~\x7F\x05R*\x02\x7F\x80\x07\x07\x02" + - "\x02\x80\x81\x05&\x14\x02\x81\x8D\x03\x02\x02\x02\x82\x83\x07\t\x02\x02" + - "\x83\x84\x05> \x02\x84\x85\x07>\x02\x02\x85\x86\x05.\x18\x02\x86\x8D\x03" + - "\x02\x02\x02\x87\x8D\x05\x1C\x0F\x02\x88\x8D\x05\n\x06\x02\x89\x8D\x05" + - "\f\x07\x02\x8A\x8D\x05\x18\r\x02\x8B\x8D\x05\x1A\x0E\x02\x8Cx\x03\x02" + - "\x02\x02\x8C}\x03\x02\x02\x02\x8C\x82\x03\x02\x02\x02\x8C\x87\x03\x02" + - "\x02\x02\x8C\x88\x03\x02\x02\x02\x8C\x89\x03\x02\x02\x02\x8C\x8A\x03\x02" + - "\x02\x02\x8C\x8B\x03\x02\x02\x02\x8D\t\x03\x02\x02\x02\x8E\x8F\x05\x16" + - "\f\x02\x8F\x90\x05J&\x02\x90\x91\x07?\x02\x02\x91\x96\x05B\"\x02\x92\x93" + - "\x07\n\x02\x02\x93\x95\x05B\"\x02\x94\x92\x03\x02\x02\x02\x95\x98\x03" + - "\x02\x02\x02\x96\x94\x03\x02\x02\x02\x96\x97\x03\x02\x02\x02\x97\x99\x03" + - "\x02\x02\x02\x98\x96\x03\x02\x02\x02\x99\x9A\x07@\x02\x02\x9A\x9B\x07" + - "\x07\x02\x02\x9B\x9E\x05&\x14\x02\x9C\x9D\x07>\x02\x02\x9D\x9F\x05.\x18" + - "\x02\x9E\x9C\x03\x02\x02\x02\x9E\x9F\x03\x02\x02\x02\x9F\xA1\x03\x02\x02" + - "\x02\xA0\xA2\x07\v\x02\x02\xA1\xA0\x03\x02\x02\x02\xA1\xA2\x03\x02\x02" + - "\x02\xA2\xBF\x03\x02\x02\x02\xA3\xA4\x05\x16\f\x02\xA4\xB1\x05J&\x02\xA5" + - "\xAE\x07?\x02\x02\xA6\xAB\x05@!\x02\xA7\xA8\x07\n\x02\x02\xA8\xAA\x05" + - "@!\x02\xA9\xA7\x03\x02\x02\x02\xAA\xAD\x03\x02\x02\x02\xAB\xA9\x03\x02" + - "\x02\x02\xAB\xAC\x03\x02\x02\x02\xAC\xAF\x03\x02\x02\x02\xAD\xAB\x03\x02" + - "\x02\x02\xAE\xA6\x03\x02\x02\x02\xAE\xAF\x03\x02\x02\x02\xAF\xB0\x03\x02" + - "\x02\x02\xB0\xB2\x07@\x02\x02\xB1\xA5\x03\x02\x02\x02\xB1\xB2\x03\x02" + - "\x02\x02\xB2\xB5\x03\x02\x02\x02\xB3\xB4\x07\x07\x02\x02\xB4\xB6\x05&" + - "\x14\x02\xB5\xB3\x03\x02\x02\x02\xB5\xB6\x03\x02\x02\x02\xB6\xB9\x03\x02" + - "\x02\x02\xB7\xB8\x07>\x02\x02\xB8\xBA\x05.\x18\x02\xB9\xB7\x03\x02\x02" + - "\x02\xB9\xBA\x03\x02\x02\x02\xBA\xBC\x03\x02\x02\x02\xBB\xBD\x07\v\x02" + - "\x02\xBC\xBB\x03\x02\x02\x02\xBC\xBD\x03\x02\x02\x02\xBD\xBF\x03\x02\x02" + - "\x02\xBE\x8E\x03\x02\x02\x02\xBE\xA3\x03\x02\x02\x02\xBF\v\x03\x02\x02" + - "\x02\xC0\xC1\x07\f\x02\x02\xC1\xCD\x05R*\x02\xC2\xC3\x07\f\x02\x02\xC3" + - "\xC4\x05\x0E\b\x02\xC4\xC5\x07>\x02\x02\xC5\xC6\x05&\x14\x02\xC6\xCD\x03" + - "\x02\x02\x02\xC7\xC8\x07\f\x02\x02\xC8\xC9\x05\x0E\b\x02\xC9\xCA\x07>" + - "\x02\x02\xCA\xCB\x05\x10\t\x02\xCB\xCD\x03\x02\x02\x02\xCC\xC0\x03\x02" + - "\x02\x02\xCC\xC2\x03\x02\x02\x02\xCC\xC7\x03\x02\x02\x02\xCD\r\x03\x02" + - "\x02\x02\xCE\xD9\x05R*\x02\xCF\xD0\x07\r\x02\x02\xD0\xD5\x07C\x02\x02" + - "\xD1\xD2\x07\n\x02\x02\xD2\xD4\x07C\x02\x02\xD3\xD1\x03\x02\x02\x02\xD4" + - "\xD7\x03\x02\x02\x02\xD5\xD3\x03\x02\x02\x02\xD5\xD6\x03\x02\x02\x02\xD6" + - "\xD8\x03\x02\x02\x02\xD7\xD5\x03\x02\x02\x02\xD8\xDA\x07\x0E\x02\x02\xD9" + - "\xCF\x03\x02\x02\x02\xD9\xDA\x03\x02\x02\x02\xDA\x0F\x03\x02\x02\x02\xDB" + - "\xDD\x07\x0F\x02\x02\xDC\xDB\x03\x02\x02\x02\xDC\xDD\x03\x02\x02\x02\xDD" + - "\xDE\x03\x02\x02\x02\xDE\xE3\x05\x12\n\x02\xDF\xE0\x07\x0F\x02\x02\xE0" + - "\xE2\x05\x12\n\x02\xE1\xDF\x03\x02\x02\x02\xE2\xE5\x03\x02\x02\x02\xE3" + - "\xE1\x03\x02\x02\x02\xE3\xE4\x03\x02\x02\x02\xE4\x11\x03\x02\x02\x02\xE5" + - "\xE3\x03\x02\x02\x02\xE6\xEB\x05T+\x02\xE7\xE8\x07?\x02\x02\xE8\xE9\x05" + - "&\x14\x02\xE9\xEA\x07@\x02\x02\xEA\xEC\x03\x02\x02\x02\xEB\xE7\x03\x02" + - "\x02\x02\xEB\xEC\x03\x02\x02\x02\xEC\x13\x03\x02\x02\x02\xED\xEE\x07\x10" + - "\x02\x02\xEE\xF1\x05R*\x02\xEF\xF0\x07\x07\x02\x02\xF0\xF2\x05&\x14\x02" + - "\xF1\xEF\x03\x02\x02\x02\xF1\xF2\x03\x02\x02\x02\xF2\xF3\x03\x02\x02\x02" + - "\xF3\xF4\x07>\x02\x02\xF4\xF6\x05.\x18\x02\xF5\xF7\x07\v\x02\x02\xF6\xF5" + - "\x03\x02\x02\x02\xF6\xF7\x03\x02\x02\x02\xF7\x15\x03\x02\x02\x02\xF8\u0102" + - "\x07\x11\x02\x02\xF9\u0102\x07\x12\x02\x02\xFA\xFB\x07\x13\x02\x02\xFB" + - "\u0102\x07\x11\x02\x02\xFC\xFD\x07\x13\x02\x02\xFD\u0102\x07\x12\x02\x02" + - "\xFE\u0102\x07\x14\x02\x02\xFF\u0102\x07\x15\x02\x02\u0100\u0102\x07\x16" + - "\x02\x02\u0101\xF8\x03\x02\x02\x02\u0101\xF9\x03\x02\x02\x02\u0101\xFA" + - "\x03\x02\x02\x02\u0101\xFC\x03\x02\x02\x02\u0101\xFE\x03\x02\x02\x02\u0101" + - "\xFF\x03\x02\x02\x02\u0101\u0100\x03\x02\x02\x02\u0102\x17\x03\x02\x02" + - "\x02\u0103\u0104\x07\x17\x02\x02\u0104\u0105\x05 \x11\x02\u0105\u0106" + - "\x07\x18\x02\x02\u0106\u0109\x05D#\x02\u0107\u0108\x07\x19\x02\x02\u0108" + - "\u010A\x05$\x13\x02\u0109\u0107\x03\x02\x02\x02\u0109\u010A\x03\x02\x02" + - "\x02\u010A\u0116\x03\x02\x02\x02\u010B\u010C\x07\x17\x02\x02\u010C\u010F" + - "\x05 \x11\x02\u010D\u010E\x07\x1A\x02\x02\u010E\u0110\x05 \x11\x02\u010F" + - "\u010D\x03\x02\x02\x02\u010F\u0110\x03\x02\x02\x02\u0110\u0113\x03\x02" + - "\x02\x02\u0111\u0112\x07\x19\x02\x02\u0112\u0114\x05$\x13\x02\u0113\u0111" + - "\x03\x02\x02\x02\u0113\u0114\x03\x02\x02\x02\u0114\u0116\x03\x02\x02\x02" + - "\u0115\u0103\x03\x02\x02\x02\u0115\u010B\x03\x02\x02\x02\u0116\x19\x03" + - "\x02\x02\x02\u0117\u0118\x07\x1B\x02\x02\u0118\u0119\x05 \x11\x02\u0119" + - "\u011A\x07\x18\x02\x02\u011A\u011B\x05D#\x02\u011B\u0123\x03\x02\x02\x02" + - "\u011C\u011D\x07\x1B\x02\x02\u011D\u0120\x05 \x11\x02\u011E\u011F\x07" + - "\x1A\x02\x02\u011F\u0121\x05 \x11\x02\u0120\u011E\x03\x02\x02\x02\u0120" + - "\u0121\x03\x02\x02\x02\u0121\u0123\x03\x02\x02\x02\u0122\u0117\x03\x02" + - "\x02\x02\u0122\u011C\x03\x02\x02\x02\u0123\x1B\x03\x02\x02\x02\u0124\u0125" + - "\x07\x17\x02\x02\u0125\u0126\x05\x1E\x10\x02\u0126\u0127\x07?\x02\x02" + - "\u0127\u0128\x05 \x11\x02\u0128\u0129\x07>\x02\x02\u0129\u0131\x05.\x18" + - "\x02\u012A\u012B\x07\n\x02\x02\u012B\u012C\x05 \x11\x02\u012C\u012D\x07" + - ">\x02\x02\u012D\u012E\x05.\x18\x02\u012E\u0130\x03\x02\x02\x02\u012F\u012A" + - "\x03\x02\x02\x02\u0130\u0133\x03\x02\x02\x02\u0131\u012F\x03\x02\x02\x02" + - "\u0131\u0132\x03\x02\x02\x02\u0132\u0134\x03\x02\x02\x02\u0133\u0131\x03" + - "\x02\x02\x02\u0134\u0135\x07@\x02\x02\u0135\u0136\x07\x18\x02\x02\u0136" + - "\u0139\x075\x02\x02\u0137\u0138\x07\x19\x02\x02\u0138\u013A\x05$\x13\x02" + - "\u0139\u0137\x03\x02\x02\x02\u0139\u013A\x03\x02\x02\x02\u013A\u0153\x03" + - "\x02\x02\x02\u013B\u013C\x07\x17\x02\x02\u013C\u013D\x05\x1E\x10\x02\u013D" + - "\u013E\x07?\x02\x02\u013E\u013F\x05 \x11\x02\u013F\u0140\x07>\x02\x02" + - "\u0140\u0148\x05.\x18\x02\u0141\u0142\x07\n\x02\x02\u0142\u0143\x05 \x11" + - "\x02\u0143\u0144\x07>\x02\x02\u0144\u0145\x05.\x18\x02\u0145\u0147\x03" + - "\x02\x02\x02\u0146\u0141\x03\x02\x02\x02\u0147\u014A\x03\x02\x02\x02\u0148" + - "\u0146\x03\x02\x02\x02\u0148\u0149\x03\x02\x02\x02\u0149\u014B\x03\x02" + - "\x02\x02\u014A\u0148\x03\x02\x02\x02\u014B\u014C\x07@\x02\x02\u014C\u014D" + - "\x07\x1A\x02\x02\u014D\u0150\x05\"\x12\x02\u014E\u014F\x07\x19\x02\x02" + - "\u014F\u0151\x05$\x13\x02\u0150\u014E\x03\x02\x02\x02\u0150\u0151\x03" + - "\x02\x02\x02\u0151\u0153\x03\x02\x02\x02\u0152\u0124\x03\x02\x02\x02\u0152" + - "\u013B\x03\x02\x02\x02\u0153\x1D\x03\x02\x02\x02\u0154\u0155\x05R*\x02" + - "\u0155\x1F\x03\x02\x02\x02\u0156\u0157\x05R*\x02\u0157!\x03\x02\x02\x02" + - "\u0158\u0159\x05R*\x02\u0159#\x03\x02\x02\x02\u015A\u015B\x07*\x02\x02" + - "\u015B%\x03\x02\x02\x02\u015C\u015D\b\x14\x01\x02\u015D\u0166\x07?\x02" + - "\x02\u015E\u0163\x05&\x14\x02\u015F\u0160\x07\n\x02\x02\u0160\u0162\x05" + - "&\x14\x02\u0161\u015F\x03\x02\x02\x02\u0162\u0165\x03\x02\x02\x02\u0163" + - "\u0161\x03\x02\x02\x02\u0163\u0164\x03\x02\x02\x02\u0164\u0167\x03\x02" + - "\x02\x02\u0165\u0163\x03\x02\x02\x02\u0166\u015E\x03\x02\x02\x02\u0166" + - "\u0167\x03\x02\x02\x02\u0167\u0169\x03\x02\x02\x02\u0168\u016A\x07\n\x02" + - "\x02\u0169\u0168\x03\x02\x02\x02\u0169\u016A\x03\x02\x02\x02\u016A\u016B" + - "\x03\x02\x02\x02\u016B\u016C\x07@\x02\x02\u016C\u016D\x07\x1D\x02\x02" + - "\u016D\u01A3\x05&\x14\x0E\u016E\u016F\x07A\x02\x02\u016F\u0170\x07\r\x02" + - "\x02\u0170\u0171\x05&\x14\x02\u0171\u0172\x07\x0E\x02\x02\u0172\u01A3" + - "\x03\x02\x02\x02\u0173\u0174\x07B\x02\x02\u0174\u0175\x07\r\x02\x02\u0175" + - "\u0176\x05&\x14\x02\u0176\u0177\x07\x0E\x02\x02\u0177\u01A3\x03\x02\x02" + - "\x02\u0178\u0179\x07?\x02\x02\u0179\u017A\x05&\x14\x02\u017A\u017B\x07" + - "\n\x02\x02\u017B\u0180\x05&\x14\x02\u017C\u017D\x07\n\x02\x02\u017D\u017F" + - "\x05&\x14\x02\u017E\u017C\x03\x02\x02\x02\u017F\u0182\x03\x02\x02\x02" + - "\u0180\u017E\x03\x02\x02\x02\u0180\u0181\x03\x02\x02\x02\u0181\u0184\x03" + - "\x02\x02\x02\u0182\u0180\x03\x02\x02\x02\u0183\u0185\x07\n\x02\x02\u0184" + - "\u0183\x03\x02\x02\x02\u0184\u0185\x03\x02\x02\x02\u0185\u0186\x03\x02" + - "\x02\x02\u0186\u0187\x07@\x02\x02\u0187\u01A3\x03\x02\x02\x02\u0188\u018A" + - "\x07\x04\x02\x02\u0189\u018B\x05*\x16\x02\u018A\u0189\x03\x02\x02\x02" + - "\u018A\u018B\x03\x02\x02\x02\u018B\u018C\x03\x02\x02\x02\u018C\u01A3\x07" + - "\x05\x02\x02\u018D\u01A3\x07\x1E\x02\x02\u018E\u01A3\x07\x1F\x02\x02\u018F" + - "\u01A3\x07 \x02\x02\u0190\u01A3\x05(\x15\x02\u0191\u01A3\x05R*\x02\u0192" + - "\u0193\x07?\x02\x02\u0193\u0194\x05&\x14\x02\u0194\u0195\x07@\x02\x02" + - "\u0195\u01A3\x03\x02\x02\x02\u0196\u0197\x05R*\x02\u0197\u0198\x07\r\x02" + - "\x02\u0198\u019D\x05&\x14\x02\u0199\u019A\x07\n\x02\x02\u019A\u019C\x05" + - "&\x14\x02\u019B\u0199\x03\x02\x02\x02\u019C\u019F\x03\x02\x02\x02\u019D" + - "\u019B\x03\x02\x02\x02\u019D\u019E\x03\x02\x02\x02\u019E\u01A0\x03\x02" + - "\x02\x02\u019F\u019D\x03\x02\x02\x02\u01A0\u01A1\x07\x0E\x02\x02\u01A1" + - "\u01A3\x03\x02\x02\x02\u01A2\u015C\x03\x02\x02\x02\u01A2\u016E\x03\x02" + - "\x02\x02\u01A2\u0173\x03\x02\x02\x02\u01A2\u0178\x03\x02\x02\x02\u01A2" + - "\u0188\x03\x02\x02\x02\u01A2\u018D\x03\x02\x02\x02\u01A2\u018E\x03\x02" + - "\x02\x02\u01A2\u018F\x03\x02\x02\x02\u01A2\u0190\x03\x02\x02\x02\u01A2" + - "\u0191\x03\x02\x02\x02\u01A2\u0192\x03\x02\x02\x02\u01A2\u0196\x03\x02" + - "\x02\x02\u01A3\u01AC\x03\x02\x02\x02\u01A4\u01A5\f\x10\x02\x02\u01A5\u01A6" + - "\x07\x1C\x02\x02\u01A6\u01AB\x05&\x14\x10\u01A7\u01A8\f\x0F\x02\x02\u01A8" + - "\u01A9\x07\x1D\x02\x02\u01A9\u01AB\x05&\x14\x0F\u01AA\u01A4\x03\x02\x02" + - "\x02\u01AA\u01A7\x03\x02\x02\x02\u01AB\u01AE\x03\x02\x02\x02\u01AC\u01AA" + - "\x03\x02\x02\x02\u01AC\u01AD\x03\x02\x02\x02\u01AD\'\x03\x02\x02\x02\u01AE" + - "\u01AC\x03\x02\x02\x02\u01AF\u01B0\x07C\x02\x02\u01B0)\x03\x02\x02\x02" + - "\u01B1\u01B2\x05,\x17\x02\u01B2\u01B3\x07\x07\x02\x02\u01B3\u01B4\x05" + - "&\x14\x02\u01B4\u01BC\x03\x02\x02\x02\u01B5\u01B6\x07\n\x02\x02\u01B6" + - "\u01B7\x05,\x17\x02\u01B7\u01B8\x07\x07\x02\x02\u01B8\u01B9\x05&\x14\x02" + - "\u01B9\u01BB\x03\x02\x02\x02\u01BA\u01B5\x03\x02\x02\x02\u01BB\u01BE\x03" + - "\x02\x02\x02\u01BC\u01BA\x03\x02\x02\x02\u01BC\u01BD\x03\x02\x02\x02\u01BD" + - "\u01C2\x03\x02\x02\x02\u01BE\u01BC\x03\x02\x02\x02\u01BF\u01C3\x07\n\x02" + - "\x02\u01C0\u01C1\x07\x0F\x02\x02\u01C1\u01C3\x05V,\x02\u01C2\u01BF\x03" + - "\x02\x02\x02\u01C2\u01C0\x03\x02\x02\x02\u01C2\u01C3\x03\x02\x02\x02\u01C3" + - "\u01C7\x03\x02\x02\x02\u01C4\u01C5\x07\x0F\x02\x02\u01C5\u01C7\x05V,\x02" + - "\u01C6\u01B1\x03\x02\x02\x02\u01C6\u01C4\x03\x02\x02\x02\u01C7+\x03\x02" + - "\x02\x02\u01C8\u01C9\x05T+\x02\u01C9-\x03\x02\x02\x02\u01CA\u01CB\b\x18" + - "\x01\x02\u01CB\u0263\x058\x1D\x02\u01CC\u01CD\x05J&\x02\u01CD\u01CF\x07" + - "?\x02\x02\u01CE\u01D0\x05F$\x02\u01CF\u01CE\x03\x02\x02\x02\u01CF\u01D0" + - "\x03\x02\x02\x02\u01D0\u01D1\x03\x02\x02\x02\u01D1\u01D2\x07@\x02\x02" + - "\u01D2\u0263\x03\x02\x02\x02\u01D3\u01D4\x074\x02\x02\u01D4\u0263\x05" + - ".\x18\x1C\u01D5\u01D6\x05R*\x02\u01D6\u01D7\x07\"\x02\x02\u01D7\u01D8" + - "\x07>\x02\x02\u01D8\u01D9\x05.\x18\x18\u01D9\u0263\x03\x02\x02\x02\u01DA" + - "\u01DB\x07-\x02\x02\u01DB\u01DC\x07\x04\x02\x02\u01DC\u01E1\x05.\x18\x02" + - "\u01DD\u01DE\x07\n\x02\x02\u01DE\u01E0\x05.\x18\x02\u01DF\u01DD\x03\x02" + - "\x02\x02\u01E0\u01E3\x03\x02\x02\x02\u01E1\u01DF\x03\x02\x02\x02\u01E1" + - "\u01E2\x03\x02\x02\x02\u01E2\u01E5\x03\x02\x02\x02\u01E3\u01E1\x03\x02" + - "\x02\x02\u01E4\u01E6\x07\n\x02\x02\u01E5\u01E4\x03\x02\x02\x02\u01E5\u01E6" + - "\x03\x02\x02\x02\u01E6\u01E7\x03\x02\x02\x02\u01E7\u01E8\x07\x05\x02\x02" + - "\u01E8\u0263\x03\x02\x02\x02\u01E9\u01EA\x07.\x02\x02\u01EA\u01EB\x07" + - "\x04\x02\x02\u01EB\u01F0\x05.\x18\x02\u01EC\u01ED\x07\n\x02\x02\u01ED" + - "\u01EF\x05.\x18\x02"; + "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u0265" + + "\n\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x03\x18\x03\x18\x05\x18\u028C\n\x18\x03\x18\x05\x18\u028F\n\x18\x03\x18" + + "\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0296\n\x18\f\x18\x0E\x18\u0299" + + "\v\x18\x03\x19\x03\x19\x03\x19\x03\x19\x05\x19\u029F\n\x19\x03\x19\x03" + + "\x19\x03\x19\x07\x19\u02A4\n\x19\f\x19\x0E\x19\u02A7\v\x19\x03\x19\x03" + + "\x19\x03\x1A\x03\x1A\x05\x1A\u02AD\n\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1B" + + "\x03\x1B\x03\x1B\x03\x1B\x05\x1B\u02B6\n\x1B\x03\x1B\x05\x1B\u02B9\n\x1B" + + "\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C" + + "\x05\x1C\u02C4\n\x1C\x03\x1D\x03\x1D\x05\x1D\u02C8\n\x1D\x03\x1E\x03\x1E" + + "\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x07\x1E\u02D2\n\x1E\f" + + "\x1E\x0E\x1E\u02D5\v\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x05\x1E\u02DB" + + "\n\x1E\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x06\x1F\u02E2\n\x1F\r\x1F" + + "\x0E\x1F\u02E3\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03 \x03 \x05 " + + "\u02ED\n \x03!\x03!\x03\"\x03\"\x03\"\x03\"\x03#\x03#\x05#\u02F7\n#\x03" + + "$\x03$\x03$\x07$\u02FC\n$\f$\x0E$\u02FF\v$\x03%\x03%\x03%\x03%\x03%\x03" + + "%\x05%\u0307\n%\x03&\x03&\x05&\u030B\n&\x03\'\x03\'\x05\'\u030F\n\'\x03" + + "(\x03(\x03)\x03)\x03*\x03*\x03*\x07*\u0318\n*\f*\x0E*\u031B\v*\x03+\x03" + + "+\x03+\x03+\x05+\u0321\n+\x03,\x03,\x03,\x02\x02\x04&.-\x02\x02\x04\x02" + + "\x06\x02\b\x02\n\x02\f\x02\x0E\x02\x10\x02\x12\x02\x14\x02\x16\x02\x18" + + "\x02\x1A\x02\x1C\x02\x1E\x02 \x02\"\x02$\x02&\x02(\x02*\x02,\x02.\x02" + + "0\x022\x024\x026\x028\x02:\x02<\x02>\x02@\x02B\x02D\x02F\x02H\x02J\x02" + + "L\x02N\x02P\x02R\x02T\x02V\x02\x02\n\x03\x0257\x03\x0234\x03\x028=\x04" + + "\x02-1AB\x03\x02-0\x05\x02!!-03=\x03\x02*,\x03\x02CD\x02\u0388\x02Y\x03" + + "\x02\x02\x02\x04b\x03\x02\x02\x02\x06s\x03\x02\x02\x02\b\x8C\x03\x02\x02" + + "\x02\n\xBE\x03\x02\x02\x02\f\xCC\x03\x02\x02\x02\x0E\xCE\x03\x02\x02\x02" + + "\x10\xDC\x03\x02\x02\x02\x12\xE6\x03\x02\x02\x02\x14\xED\x03\x02\x02\x02" + + "\x16\u0101\x03\x02\x02\x02\x18\u0115\x03\x02\x02\x02\x1A\u0122\x03\x02" + + "\x02\x02\x1C\u0152\x03\x02\x02\x02\x1E\u0154\x03\x02\x02\x02 \u0156\x03" + + "\x02\x02\x02\"\u0158\x03\x02\x02\x02$\u015A\x03\x02\x02\x02&\u01A4\x03" + + "\x02\x02\x02(\u01B1\x03\x02\x02\x02*\u01C8\x03\x02\x02\x02,\u01CA\x03" + + "\x02\x02\x02.\u0264\x03\x02\x02\x020\u029A\x03\x02\x02\x022\u02AC\x03" + + "\x02\x02\x024\u02B1\x03\x02\x02\x026\u02C3\x03\x02\x02\x028\u02C7\x03" + + "\x02\x02\x02:\u02DA\x03\x02\x02\x02<\u02DC\x03\x02\x02\x02>\u02EC\x03" + + "\x02\x02\x02@\u02EE\x03\x02\x02\x02B\u02F0\x03\x02\x02\x02D\u02F6\x03" + + "\x02\x02\x02F\u02F8\x03\x02\x02\x02H\u0306\x03\x02\x02\x02J\u030A\x03" + + "\x02\x02\x02L\u030E\x03\x02\x02\x02N\u0310\x03\x02\x02\x02P\u0312\x03" + + "\x02\x02\x02R\u0314\x03\x02\x02\x02T\u0320\x03\x02\x02\x02V\u0322\x03" + + "\x02\x02\x02XZ\x05\x04\x03\x02YX\x03\x02\x02\x02Z[\x03\x02\x02\x02[Y\x03" + + "\x02\x02\x02[\\\x03\x02\x02\x02\\]\x03\x02\x02\x02]^\x07\x02\x02\x03^" + + "\x03\x03\x02\x02\x02_a\x07E\x02\x02`_\x03\x02\x02\x02ad\x03\x02\x02\x02" + + "b`\x03\x02\x02\x02bc\x03\x02\x02\x02ce\x03\x02\x02\x02db\x03\x02\x02\x02" + + "ef\x07\x03\x02\x02fg\x05R*\x02gk\x07\x04\x02\x02hj\x05\x06\x04\x02ih\x03" + + "\x02\x02\x02jm\x03\x02\x02\x02ki\x03\x02\x02\x02kl\x03\x02\x02\x02ln\x03" + + "\x02\x02\x02mk\x03\x02\x02\x02no\x07\x05\x02\x02o\x05\x03\x02\x02\x02" + + "pr\x07E\x02\x02qp\x03\x02\x02\x02ru\x03\x02\x02\x02sq\x03\x02\x02\x02" + + "st\x03\x02\x02\x02tv\x03\x02\x02\x02us\x03\x02\x02\x02vw\x05\b\x05\x02" + + "w\x07\x03\x02\x02\x02xy\x07\x06\x02\x02yz\x05R*\x02z{\x07\x07\x02\x02" + + "{|\x05&\x14\x02|\x8D\x03\x02\x02\x02}~\x07\b\x02\x02~\x7F\x05R*\x02\x7F" + + "\x80\x07\x07\x02\x02\x80\x81\x05&\x14\x02\x81\x8D\x03\x02\x02\x02\x82" + + "\x83\x07\t\x02\x02\x83\x84\x05> \x02\x84\x85\x07>\x02\x02\x85\x86\x05" + + ".\x18\x02\x86\x8D\x03\x02\x02\x02\x87\x8D\x05\x1C\x0F\x02\x88\x8D\x05" + + "\n\x06\x02\x89\x8D\x05\f\x07\x02\x8A\x8D\x05\x18\r\x02\x8B\x8D\x05\x1A" + + "\x0E\x02\x8Cx\x03\x02\x02\x02\x8C}\x03\x02\x02\x02\x8C\x82\x03\x02\x02" + + "\x02\x8C\x87\x03\x02\x02\x02\x8C\x88\x03\x02\x02\x02\x8C\x89\x03\x02\x02" + + "\x02\x8C\x8A\x03\x02\x02\x02\x8C\x8B\x03\x02\x02\x02\x8D\t\x03\x02\x02" + + "\x02\x8E\x8F\x05\x16\f\x02\x8F\x90\x05J&\x02\x90\x91\x07?\x02\x02\x91" + + "\x96\x05B\"\x02\x92\x93\x07\n\x02\x02\x93\x95\x05B\"\x02\x94\x92\x03\x02" + + "\x02\x02\x95\x98\x03\x02\x02\x02\x96\x94\x03\x02\x02\x02\x96\x97\x03\x02" + + "\x02\x02\x97\x99\x03\x02\x02\x02\x98\x96\x03\x02\x02\x02\x99\x9A\x07@" + + "\x02\x02\x9A\x9B\x07\x07\x02\x02\x9B\x9E\x05&\x14\x02\x9C\x9D\x07>\x02" + + "\x02\x9D\x9F\x05.\x18\x02\x9E\x9C\x03\x02\x02\x02\x9E\x9F\x03\x02\x02" + + "\x02\x9F\xA1\x03\x02\x02\x02\xA0\xA2\x07\v\x02\x02\xA1\xA0\x03\x02\x02" + + "\x02\xA1\xA2\x03\x02\x02\x02\xA2\xBF\x03\x02\x02\x02\xA3\xA4\x05\x16\f" + + "\x02\xA4\xB1\x05J&\x02\xA5\xAE\x07?\x02\x02\xA6\xAB\x05@!\x02\xA7\xA8" + + "\x07\n\x02\x02\xA8\xAA\x05@!\x02\xA9\xA7\x03\x02\x02\x02\xAA\xAD\x03\x02" + + "\x02\x02\xAB\xA9\x03\x02\x02\x02\xAB\xAC\x03\x02\x02\x02\xAC\xAF\x03\x02" + + "\x02\x02\xAD\xAB\x03\x02\x02\x02\xAE\xA6\x03\x02\x02\x02\xAE\xAF\x03\x02" + + "\x02\x02\xAF\xB0\x03\x02\x02\x02\xB0\xB2\x07@\x02\x02\xB1\xA5\x03\x02" + + "\x02\x02\xB1\xB2\x03\x02\x02\x02\xB2\xB5\x03\x02\x02\x02\xB3\xB4\x07\x07" + + "\x02\x02\xB4\xB6\x05&\x14\x02\xB5\xB3\x03\x02\x02\x02\xB5\xB6\x03\x02" + + "\x02\x02\xB6\xB9\x03\x02\x02\x02\xB7\xB8\x07>\x02\x02\xB8\xBA\x05.\x18" + + "\x02\xB9\xB7\x03\x02\x02\x02\xB9\xBA\x03\x02\x02\x02\xBA\xBC\x03\x02\x02" + + "\x02\xBB\xBD\x07\v\x02\x02\xBC\xBB\x03\x02\x02\x02\xBC\xBD\x03\x02\x02" + + "\x02\xBD\xBF\x03\x02\x02\x02\xBE\x8E\x03\x02\x02\x02\xBE\xA3\x03\x02\x02" + + "\x02\xBF\v\x03\x02\x02\x02\xC0\xC1\x07\f\x02\x02\xC1\xCD\x05R*\x02\xC2" + + "\xC3\x07\f\x02\x02\xC3\xC4\x05\x0E\b\x02\xC4\xC5\x07>\x02\x02\xC5\xC6" + + "\x05&\x14\x02\xC6\xCD\x03\x02\x02\x02\xC7\xC8\x07\f\x02\x02\xC8\xC9\x05" + + "\x0E\b\x02\xC9\xCA\x07>\x02\x02\xCA\xCB\x05\x10\t\x02\xCB\xCD\x03\x02" + + "\x02\x02\xCC\xC0\x03\x02\x02\x02\xCC\xC2\x03\x02\x02\x02\xCC\xC7\x03\x02" + + "\x02\x02\xCD\r\x03\x02\x02\x02\xCE\xD9\x05R*\x02\xCF\xD0\x07\r\x02\x02" + + "\xD0\xD5\x07C\x02\x02\xD1\xD2\x07\n\x02\x02\xD2\xD4\x07C\x02\x02\xD3\xD1" + + "\x03\x02\x02\x02\xD4\xD7\x03\x02\x02\x02\xD5\xD3\x03\x02\x02\x02\xD5\xD6" + + "\x03\x02\x02\x02\xD6\xD8\x03\x02\x02\x02\xD7\xD5\x03\x02\x02\x02\xD8\xDA" + + "\x07\x0E\x02\x02\xD9\xCF\x03\x02\x02\x02\xD9\xDA\x03\x02\x02\x02\xDA\x0F" + + "\x03\x02\x02\x02\xDB\xDD\x07\x0F\x02\x02\xDC\xDB\x03\x02\x02\x02\xDC\xDD" + + "\x03\x02\x02\x02\xDD\xDE\x03\x02\x02\x02\xDE\xE3\x05\x12\n\x02\xDF\xE0" + + "\x07\x0F\x02\x02\xE0\xE2\x05\x12\n\x02\xE1\xDF\x03\x02\x02\x02\xE2\xE5" + + "\x03\x02\x02\x02\xE3\xE1\x03\x02\x02\x02\xE3\xE4\x03\x02\x02\x02\xE4\x11" + + "\x03\x02\x02\x02\xE5\xE3\x03\x02\x02\x02\xE6\xEB\x05T+\x02\xE7\xE8\x07" + + "?\x02\x02\xE8\xE9\x05&\x14\x02\xE9\xEA\x07@\x02\x02\xEA\xEC\x03\x02\x02" + + "\x02\xEB\xE7\x03\x02\x02\x02\xEB\xEC\x03\x02\x02\x02\xEC\x13\x03\x02\x02" + + "\x02\xED\xEE\x07\x10\x02\x02\xEE\xF1\x05R*\x02\xEF\xF0\x07\x07\x02\x02" + + "\xF0\xF2\x05&\x14\x02\xF1\xEF\x03\x02\x02\x02\xF1\xF2\x03\x02\x02\x02" + + "\xF2\xF3\x03\x02\x02\x02\xF3\xF4\x07>\x02\x02\xF4\xF6\x05.\x18\x02\xF5" + + "\xF7\x07\v\x02\x02\xF6\xF5\x03\x02\x02\x02\xF6\xF7\x03\x02\x02\x02\xF7" + + "\x15\x03\x02\x02\x02\xF8\u0102\x07\x11\x02\x02\xF9\u0102\x07\x12\x02\x02" + + "\xFA\xFB\x07\x13\x02\x02\xFB\u0102\x07\x11\x02\x02\xFC\xFD\x07\x13\x02" + + "\x02\xFD\u0102\x07\x12\x02\x02\xFE\u0102\x07\x14\x02\x02\xFF\u0102\x07" + + "\x15\x02\x02\u0100\u0102\x07\x16\x02\x02\u0101\xF8\x03\x02\x02\x02\u0101" + + "\xF9\x03\x02\x02\x02\u0101\xFA\x03\x02\x02\x02\u0101\xFC\x03\x02\x02\x02" + + "\u0101\xFE\x03\x02\x02\x02\u0101\xFF\x03\x02\x02\x02\u0101\u0100\x03\x02" + + "\x02\x02\u0102\x17\x03\x02\x02\x02\u0103\u0104\x07\x17\x02\x02\u0104\u0105" + + "\x05 \x11\x02\u0105\u0106\x07\x18\x02\x02\u0106\u0109\x05D#\x02\u0107" + + "\u0108\x07\x19\x02\x02\u0108\u010A\x05$\x13\x02\u0109\u0107\x03\x02\x02" + + "\x02\u0109\u010A\x03\x02\x02\x02\u010A\u0116\x03\x02\x02\x02\u010B\u010C" + + "\x07\x17\x02\x02\u010C\u010F\x05 \x11\x02\u010D\u010E\x07\x1A\x02\x02" + + "\u010E\u0110\x05 \x11\x02\u010F\u010D\x03\x02\x02\x02\u010F\u0110\x03" + + "\x02\x02\x02\u0110\u0113\x03\x02\x02\x02\u0111\u0112\x07\x19\x02\x02\u0112" + + "\u0114\x05$\x13\x02\u0113\u0111\x03\x02\x02\x02\u0113\u0114\x03\x02\x02" + + "\x02\u0114\u0116\x03\x02\x02\x02\u0115\u0103\x03\x02\x02\x02\u0115\u010B" + + "\x03\x02\x02\x02\u0116\x19\x03\x02\x02\x02\u0117\u0118\x07\x1B\x02\x02" + + "\u0118\u0119\x05 \x11\x02\u0119\u011A\x07\x18\x02\x02\u011A\u011B\x05" + + "D#\x02\u011B\u0123\x03\x02\x02\x02\u011C\u011D\x07\x1B\x02\x02\u011D\u0120" + + "\x05 \x11\x02\u011E\u011F\x07\x1A\x02\x02\u011F\u0121\x05 \x11\x02\u0120" + + "\u011E\x03\x02\x02\x02\u0120\u0121\x03\x02\x02\x02\u0121\u0123\x03\x02" + + "\x02\x02\u0122\u0117\x03\x02\x02\x02\u0122\u011C\x03\x02\x02\x02\u0123" + + "\x1B\x03\x02\x02\x02\u0124\u0125\x07\x17\x02\x02\u0125\u0126\x05\x1E\x10" + + "\x02\u0126\u0127\x07?\x02\x02\u0127\u0128\x05 \x11\x02\u0128\u0129\x07" + + ">\x02\x02\u0129\u0131\x05.\x18\x02\u012A\u012B\x07\n\x02\x02\u012B\u012C" + + "\x05 \x11\x02\u012C\u012D\x07>\x02\x02\u012D\u012E\x05.\x18\x02\u012E" + + "\u0130\x03\x02\x02\x02\u012F\u012A\x03\x02\x02\x02\u0130\u0133\x03\x02" + + "\x02\x02\u0131\u012F\x03\x02\x02\x02\u0131\u0132\x03\x02\x02\x02\u0132" + + "\u0134\x03\x02\x02\x02\u0133\u0131\x03\x02\x02\x02\u0134\u0135\x07@\x02" + + "\x02\u0135\u0136\x07\x18\x02\x02\u0136\u0139\x075\x02\x02\u0137\u0138" + + "\x07\x19\x02\x02\u0138\u013A\x05$\x13\x02\u0139\u0137\x03\x02\x02\x02" + + "\u0139\u013A\x03\x02\x02\x02\u013A\u0153\x03\x02\x02\x02\u013B\u013C\x07" + + "\x17\x02\x02\u013C\u013D\x05\x1E\x10\x02\u013D\u013E\x07?\x02\x02\u013E" + + "\u013F\x05 \x11\x02\u013F\u0140\x07>\x02\x02\u0140\u0148\x05.\x18\x02" + + "\u0141\u0142\x07\n\x02\x02\u0142\u0143\x05 \x11\x02\u0143\u0144\x07>\x02" + + "\x02\u0144\u0145\x05.\x18\x02\u0145\u0147\x03\x02\x02\x02\u0146\u0141" + + "\x03\x02\x02\x02\u0147\u014A\x03\x02\x02\x02\u0148\u0146\x03\x02\x02\x02" + + "\u0148\u0149\x03\x02\x02\x02\u0149\u014B\x03\x02\x02\x02\u014A\u0148\x03" + + "\x02\x02\x02\u014B\u014C\x07@\x02\x02\u014C\u014D\x07\x1A\x02\x02\u014D" + + "\u0150\x05\"\x12\x02\u014E\u014F\x07\x19\x02\x02\u014F\u0151\x05$\x13" + + "\x02\u0150\u014E\x03\x02\x02\x02\u0150\u0151\x03\x02\x02\x02\u0151\u0153" + + "\x03\x02\x02\x02\u0152\u0124\x03\x02\x02\x02\u0152\u013B\x03\x02\x02\x02" + + "\u0153\x1D\x03\x02\x02\x02\u0154\u0155\x05R*\x02\u0155\x1F\x03\x02\x02" + + "\x02\u0156\u0157\x05R*\x02\u0157!\x03\x02\x02\x02\u0158\u0159\x05R*\x02" + + "\u0159#\x03\x02\x02\x02\u015A\u015B\x07*\x02\x02\u015B%\x03\x02\x02\x02" + + "\u015C\u015D\b\x14\x01\x02\u015D\u0166\x07?\x02\x02\u015E\u0163\x05&\x14" + + "\x02\u015F\u0160\x07\n\x02\x02\u0160\u0162\x05&\x14\x02\u0161\u015F\x03" + + "\x02\x02\x02\u0162\u0165\x03\x02\x02\x02\u0163\u0161\x03\x02\x02\x02\u0163" + + "\u0164\x03\x02\x02\x02\u0164\u0167\x03\x02\x02\x02\u0165\u0163\x03\x02" + + "\x02\x02\u0166\u015E\x03\x02\x02\x02\u0166\u0167\x03\x02\x02\x02\u0167" + + "\u0169\x03\x02\x02\x02\u0168\u016A\x07\n\x02\x02\u0169\u0168\x03\x02\x02" + + "\x02\u0169\u016A\x03\x02\x02\x02\u016A\u016B\x03\x02\x02\x02\u016B\u016C" + + "\x07@\x02\x02\u016C\u016D\x07\x1D\x02\x02\u016D\u01A5\x05&\x14\x0F\u016E" + + "\u016F\x07A\x02\x02\u016F\u0170\x07\r\x02\x02\u0170\u0171\x05&\x14\x02" + + "\u0171\u0172\x07\x0E\x02\x02\u0172\u01A5\x03\x02\x02\x02\u0173\u0174\x07" + + "B\x02\x02\u0174\u0175\x07\r\x02\x02\u0175\u0176\x05&\x14\x02\u0176\u0177" + + "\x07\x0E\x02\x02\u0177\u01A5\x03\x02\x02\x02\u0178\u0179\x07?\x02\x02" + + "\u0179\u01A5\x07@\x02\x02\u017A\u017B\x07?\x02\x02\u017B\u017C\x05&\x14" + + "\x02\u017C\u017D\x07\n\x02\x02\u017D\u0182\x05&\x14\x02\u017E\u017F\x07" + + "\n\x02\x02\u017F\u0181\x05&\x14\x02\u0180\u017E\x03\x02\x02\x02\u0181" + + "\u0184\x03\x02\x02\x02\u0182\u0180\x03\x02\x02\x02\u0182\u0183\x03\x02" + + "\x02\x02\u0183\u0186\x03\x02\x02\x02\u0184\u0182\x03\x02\x02\x02\u0185" + + "\u0187\x07\n\x02\x02\u0186\u0185\x03\x02\x02\x02\u0186\u0187\x03\x02\x02" + + "\x02\u0187\u0188\x03\x02\x02\x02\u0188\u0189\x07@\x02\x02\u0189\u01A5" + + "\x03\x02\x02\x02\u018A\u018C\x07\x04\x02\x02\u018B\u018D\x05*\x16\x02" + + "\u018C\u018B\x03\x02\x02\x02\u018C\u018D\x03\x02\x02\x02\u018D\u018E\x03" + + "\x02\x02\x02\u018E\u01A5\x07\x05\x02\x02\u018F\u01A5\x07\x1E\x02\x02\u0190" + + "\u01A5\x07\x1F\x02\x02\u0191\u01A5\x07 \x02\x02\u0192\u01A5\x05(\x15\x02" + + "\u0193\u01A5\x05R*\x02\u0194\u0195\x07?\x02\x02\u0195\u0196\x05&\x14\x02" + + "\u0196\u0197\x07@\x02\x02\u0197\u01A5\x03\x02\x02\x02\u0198\u0199\x05" + + "R*\x02\u0199\u019A\x07\r\x02\x02\u019A\u019F\x05&\x14\x02\u019B\u019C" + + "\x07\n\x02\x02\u019C\u019E\x05&\x14\x02\u019D\u019B\x03\x02\x02\x02\u019E" + + "\u01A1\x03\x02\x02\x02\u019F\u019D\x03\x02\x02\x02\u019F\u01A0\x03\x02" + + "\x02\x02\u01A0\u01A2\x03\x02\x02\x02\u01A1\u019F\x03\x02\x02\x02\u01A2" + + "\u01A3\x07\x0E\x02\x02\u01A3\u01A5\x03\x02\x02\x02\u01A4\u015C\x03\x02" + + "\x02\x02\u01A4\u016E\x03\x02\x02\x02\u01A4\u0173\x03\x02\x02\x02\u01A4" + + "\u0178\x03\x02\x02\x02\u01A4\u017A\x03\x02\x02\x02\u01A4\u018A\x03\x02" + + "\x02\x02\u01A4\u018F\x03\x02\x02\x02\u01A4\u0190\x03\x02\x02\x02\u01A4" + + "\u0191\x03\x02\x02\x02\u01A4\u0192\x03\x02\x02\x02\u01A4\u0193\x03\x02" + + "\x02\x02\u01A4\u0194\x03\x02\x02\x02\u01A4\u0198\x03\x02\x02\x02\u01A5" + + "\u01AE\x03\x02\x02\x02\u01A6\u01A7\f\x11\x02\x02\u01A7\u01A8\x07\x1C\x02" + + "\x02\u01A8\u01AD\x05&\x14\x11\u01A9\u01AA\f\x10\x02\x02\u01AA\u01AB\x07" + + "\x1D\x02\x02\u01AB\u01AD\x05&\x14\x10\u01AC\u01A6\x03\x02\x02\x02\u01AC" + + "\u01A9\x03\x02\x02\x02\u01AD\u01B0\x03\x02\x02\x02\u01AE\u01AC\x03\x02" + + "\x02\x02\u01AE\u01AF\x03\x02\x02\x02\u01AF\'\x03\x02\x02\x02\u01B0\u01AE" + + "\x03\x02\x02\x02\u01B1\u01B2\x07C\x02\x02\u01B2)\x03\x02\x02\x02\u01B3" + + "\u01B4\x05,\x17\x02\u01B4\u01B5\x07\x07\x02\x02\u01B5\u01B6\x05&\x14\x02" + + "\u01B6\u01BE\x03\x02\x02\x02\u01B7\u01B8\x07\n\x02\x02\u01B8\u01B9\x05" + + ",\x17\x02\u01B9\u01BA\x07\x07\x02\x02\u01BA\u01BB\x05&\x14\x02\u01BB\u01BD" + + "\x03\x02\x02\x02\u01BC\u01B7\x03\x02\x02\x02\u01BD\u01C0\x03\x02\x02\x02" + + "\u01BE\u01BC\x03\x02\x02\x02\u01BE\u01BF\x03\x02\x02\x02\u01BF\u01C4\x03" + + "\x02\x02\x02\u01C0\u01BE\x03\x02\x02\x02\u01C1\u01C5\x07\n\x02\x02\u01C2" + + "\u01C3\x07\x0F\x02\x02\u01C3\u01C5\x05V,\x02\u01C4\u01C1\x03\x02\x02\x02" + + "\u01C4\u01C2\x03\x02\x02\x02\u01C4\u01C5\x03\x02\x02\x02\u01C5\u01C9\x03" + + "\x02\x02\x02\u01C6\u01C7\x07\x0F\x02\x02\u01C7\u01C9\x05V,\x02\u01C8\u01B3" + + "\x03\x02\x02\x02\u01C8\u01C6\x03\x02\x02\x02\u01C9+\x03\x02\x02\x02\u01CA" + + "\u01CB\x05T+\x02\u01CB-\x03\x02\x02\x02\u01CC\u01CD\b\x18\x01\x02\u01CD" + + "\u0265\x058\x1D\x02\u01CE\u01CF\x05J&\x02\u01CF\u01D1\x07?\x02\x02\u01D0" + + "\u01D2\x05F$\x02\u01D1\u01D0\x03\x02\x02\x02\u01D1\u01D2\x03\x02\x02\x02" + + "\u01D2\u01D3\x03\x02\x02\x02\u01D3\u01D4\x07@\x02\x02\u01D4\u0265\x03" + + "\x02\x02\x02\u01D5\u01D6\x074\x02\x02\u01D6\u0265\x05.\x18\x1C\u01D7\u01D8" + + "\x05R*\x02\u01D8\u01D9\x07\"\x02\x02\u01D9\u01DA\x07>\x02\x02\u01DA\u01DB" + + "\x05.\x18\x18\u01DB\u0265\x03\x02\x02\x02\u01DC\u01DD\x07-\x02\x02\u01DD" + + "\u01DE\x07\x04\x02\x02\u01DE\u01E3\x05.\x18\x02\u01DF\u01E0\x07\n\x02" + + "\x02\u01E0\u01E2\x05.\x18\x02\u01E1\u01DF\x03\x02\x02\x02\u01E2\u01E5" + + "\x03\x02\x02\x02\u01E3\u01E1\x03\x02\x02\x02\u01E3\u01E4\x03\x02\x02\x02" + + "\u01E4\u01E7\x03\x02\x02\x02\u01E5\u01E3\x03\x02\x02\x02\u01E6\u01E8\x07" + + "\n\x02\x02\u01E7\u01E6\x03\x02\x02\x02\u01E7\u01E8\x03\x02\x02\x02\u01E8" + + "\u01E9\x03\x02\x02\x02\u01E9\u01EA\x07\x05\x02\x02\u01EA\u0265\x03\x02" + + "\x02\x02\u01EB\u01EC\x07.\x02\x02\u01EC\u01ED"; private static readonly _serializedATNSegment1: string = - "\u01EE\u01EC\x03\x02\x02\x02\u01EF\u01F2\x03\x02\x02\x02\u01F0\u01EE\x03" + - "\x02\x02\x02\u01F0\u01F1\x03\x02\x02\x02\u01F1\u01F4\x03\x02\x02\x02\u01F2" + - "\u01F0\x03\x02\x02\x02\u01F3\u01F5\x07\n\x02\x02\u01F4\u01F3\x03\x02\x02" + - "\x02\u01F4\u01F5\x03\x02\x02\x02\u01F5\u01F6\x03\x02\x02\x02\u01F6\u01F7" + - "\x07\x05\x02\x02\u01F7\u0263\x03\x02\x02\x02\u01F8\u0263\x050\x19\x02" + - "\u01F9\u01FA\x07#\x02\x02\u01FA\u01FB\x07\x04\x02\x02\u01FB\u0200\x05" + - ".\x18\x02\u01FC\u01FD\x07\n\x02\x02\u01FD\u01FF\x05.\x18\x02\u01FE\u01FC" + - "\x03\x02\x02\x02\u01FF\u0202\x03\x02\x02\x02\u0200\u01FE\x03\x02\x02\x02" + - "\u0200\u0201\x03\x02\x02\x02\u0201\u0204\x03\x02\x02\x02\u0202\u0200\x03" + - "\x02\x02\x02\u0203\u0205\x07\n\x02\x02\u0204\u0203\x03\x02\x02\x02\u0204" + - "\u0205\x03\x02\x02\x02\u0205\u0206\x03\x02\x02\x02\u0206\u0207\x07\x05" + - "\x02\x02\u0207\u0263\x03\x02\x02\x02\u0208\u0209\x07$\x02\x02\u0209\u020A" + - "\x07\x04\x02\x02\u020A\u020F\x05.\x18\x02\u020B\u020C\x07\n\x02\x02\u020C" + - "\u020E\x05.\x18\x02\u020D\u020B\x03\x02\x02\x02\u020E\u0211\x03\x02\x02" + - "\x02\u020F\u020D\x03\x02\x02\x02\u020F\u0210\x03\x02\x02\x02\u0210\u0213" + - "\x03\x02\x02\x02\u0211\u020F\x03\x02\x02\x02\u0212\u0214\x07\n\x02\x02" + - "\u0213\u0212\x03\x02\x02\x02\u0213\u0214\x03\x02\x02\x02\u0214\u0215\x03" + - "\x02\x02\x02\u0215\u0216\x07\x05\x02\x02\u0216\u0263\x03\x02\x02\x02\u0217" + - "\u021C\x05R*\x02\u0218\u021C\x07,\x02\x02\u0219\u021C\x07+\x02\x02\u021A" + - "\u021C\x07*\x02\x02\u021B\u0217\x03\x02\x02\x02\u021B\u0218\x03\x02\x02" + - "\x02\u021B\u0219\x03\x02\x02\x02\u021B\u021A\x03\x02\x02\x02\u021C\u0263" + - "\x03\x02\x02\x02\u021D\u021E\x07?\x02\x02\u021E\u021F\x05.\x18\x02\u021F" + - "\u0220\x07\n\x02\x02\u0220\u0225\x05.\x18\x02\u0221\u0222\x07\n\x02\x02" + - "\u0222\u0224\x05.\x18\x02\u0223\u0221\x03\x02\x02\x02\u0224\u0227\x03" + - "\x02\x02\x02\u0225\u0223\x03\x02\x02\x02\u0225\u0226\x03\x02\x02\x02\u0226" + - "\u0229\x03\x02\x02\x02\u0227\u0225\x03\x02\x02\x02\u0228\u022A\x07\n\x02" + - "\x02\u0229\u0228\x03\x02\x02\x02\u0229\u022A\x03\x02\x02\x02\u022A\u022B" + - "\x03\x02\x02\x02\u022B\u022C\x07@\x02\x02\u022C\u0263\x03\x02\x02\x02" + - "\u022D\u022E\x07?\x02\x02\u022E\u0263\x07@\x02\x02\u022F\u0230\x07\x04" + - "\x02\x02\u0230\u0235\x05H%\x02\u0231\u0232\x07\n\x02\x02\u0232\u0234\x05" + - "H%\x02\u0233\u0231\x03\x02\x02\x02\u0234\u0237\x03\x02\x02\x02\u0235\u0233" + - "\x03\x02\x02\x02\u0235\u0236\x03\x02\x02\x02\u0236\u0239\x03\x02\x02\x02" + - "\u0237\u0235\x03\x02\x02\x02\u0238\u023A\x07\n\x02\x02\u0239\u0238\x03" + - "\x02\x02\x02\u0239\u023A\x03\x02\x02\x02\u023A\u023B\x03\x02\x02\x02\u023B" + - "\u023C\x07\x05\x02\x02\u023C\u0263\x03\x02\x02\x02\u023D\u0246\x07\r\x02" + - "\x02\u023E\u0243\x05.\x18\x02\u023F\u0240\x07\n\x02\x02\u0240\u0242\x05" + - ".\x18\x02\u0241\u023F\x03\x02\x02\x02\u0242\u0245\x03\x02\x02\x02\u0243" + - "\u0241\x03\x02\x02\x02\u0243\u0244\x03\x02\x02\x02\u0244\u0247\x03\x02" + - "\x02\x02\u0245\u0243\x03\x02\x02\x02\u0246\u023E\x03\x02\x02\x02\u0246" + - "\u0247\x03\x02\x02\x02\u0247\u0249\x03\x02\x02\x02\u0248\u024A\x07\n\x02" + - "\x02\u0249\u0248\x03\x02\x02\x02\u0249\u024A\x03\x02\x02\x02\u024A\u024B" + - "\x03\x02\x02\x02\u024B\u0263\x07\x0E\x02\x02\u024C\u024D\x07%\x02\x02" + - "\u024D\u024E\x07?\x02\x02\u024E\u024F\x05.\x18\x02\u024F\u0250\x07@\x02" + - "\x02\u0250\u0251\x05.\x18\x02\u0251\u0252\x07&\x02\x02\u0252\u0253\x05" + - ".\x18\x07\u0253\u0263\x03\x02\x02\x02\u0254\u0255\x05\n\x06\x02\u0255" + - "\u0256\x05.\x18\x06\u0256\u0263\x03\x02\x02\x02\u0257\u0258\x05\x14\v" + - "\x02\u0258\u0259\x05.\x18\x05\u0259\u0263\x03\x02\x02\x02\u025A\u025B" + - "\x07?\x02\x02\u025B\u025C\x05.\x18\x02\u025C\u025D\x07@\x02\x02\u025D" + - "\u0263\x03\x02\x02\x02\u025E\u025F\x07\x04\x02\x02\u025F\u0260\x05.\x18" + - "\x02\u0260\u0261\x07\x05\x02\x02\u0261\u0263\x03\x02\x02\x02\u0262\u01CA" + - "\x03\x02\x02\x02\u0262\u01CC\x03\x02\x02\x02\u0262\u01D3\x03\x02\x02\x02" + - "\u0262\u01D5\x03\x02\x02\x02\u0262\u01DA\x03\x02\x02\x02\u0262\u01E9\x03" + - "\x02\x02\x02\u0262\u01F8\x03\x02\x02\x02\u0262\u01F9\x03\x02\x02\x02\u0262" + - "\u0208\x03\x02\x02\x02\u0262\u021B\x03\x02\x02\x02\u0262\u021D\x03\x02" + - "\x02\x02\u0262\u022D\x03\x02\x02\x02\u0262\u022F\x03\x02\x02\x02\u0262" + - "\u023D\x03\x02\x02\x02\u0262\u024C\x03\x02\x02\x02\u0262\u0254\x03\x02" + - "\x02\x02\u0262\u0257\x03\x02\x02\x02\u0262\u025A\x03\x02\x02\x02\u0262" + - "\u025E\x03\x02\x02\x02\u0263\u0295\x03\x02\x02\x02\u0264\u0265\f\x1D\x02" + - "\x02\u0265\u0266\x07!\x02\x02\u0266\u0294\x05.\x18\x1D\u0267\u0268\f\x1B" + - "\x02\x02\u0268\u0269\t\x02\x02\x02\u0269\u0294\x05.\x18\x1C\u026A\u026B" + - "\f\x1A\x02\x02\u026B\u026C\t\x03\x02\x02\u026C\u0294\x05.\x18\x1B\u026D" + - "\u026E\f\x19\x02\x02\u026E\u026F\t\x04\x02\x02\u026F\u0294\x05.\x18\x1A" + - "\u0270\u0271\f\x17\x02\x02\u0271\u0272\x07>\x02\x02\u0272\u0273\x05.\x18" + - "\x18\u0273\u0274\b\x18\x01\x02\u0274\u0294\x03\x02\x02\x02\u0275\u0276" + - "\f\x15\x02\x02\u0276\u0277\x07-\x02\x02\u0277\u0294\x05.\x18\x16\u0278" + - "\u0279\f\x13\x02\x02\u0279\u027A\x07.\x02\x02\u027A\u0294\x05.\x18\x14" + - "\u027B\u027C\f\x12\x02\x02\u027C\u027D\x07/\x02\x02\u027D\u0294\x05.\x18" + - "\x13\u027E\u027F\f\x11\x02\x02\u027F\u0280\x070\x02\x02\u0280\u0294\x05" + - ".\x18\x12\u0281\u0282\f\n\x02\x02\u0282\u0283\x07\x1C\x02\x02\u0283\u0294" + - "\x05.\x18\v\u0284\u0285\f!\x02\x02\u0285\u0286\x07\x18\x02\x02\u0286\u028C" + - "\x05L\'\x02\u0287\u0289\x07?\x02\x02\u0288\u028A\x05F$\x02\u0289\u0288" + - "\x03\x02\x02\x02\u0289\u028A\x03\x02\x02\x02\u028A\u028B\x03\x02\x02\x02" + - "\u028B\u028D\x07@\x02\x02\u028C\u0287\x03\x02\x02\x02\u028C\u028D\x03" + - "\x02\x02\x02\u028D\u0294\x03\x02\x02\x02\u028E\u028F\f\x1E\x02\x02\u028F" + - "\u0290\x07\r\x02\x02\u0290\u0291\x05.\x18\x02\u0291\u0292\x07\x0E\x02" + - "\x02\u0292\u0294\x03\x02\x02\x02\u0293\u0264\x03\x02\x02\x02\u0293\u0267" + - "\x03\x02\x02\x02\u0293\u026A\x03\x02\x02\x02\u0293\u026D\x03\x02\x02\x02" + - "\u0293\u0270\x03\x02\x02\x02\u0293\u0275\x03\x02\x02\x02\u0293\u0278\x03" + - "\x02\x02\x02\u0293\u027B\x03\x02\x02\x02\u0293\u027E\x03\x02\x02\x02\u0293" + - "\u0281\x03\x02\x02\x02\u0293\u0284\x03\x02\x02\x02\u0293\u028E\x03\x02" + - "\x02\x02\u0294\u0297\x03\x02\x02\x02\u0295\u0293\x03\x02\x02\x02\u0295" + - "\u0296\x03\x02\x02\x02\u0296/\x03\x02\x02\x02\u0297\u0295\x03\x02\x02" + - "\x02\u0298\u0299\x072\x02\x02\u0299\u029A\x05.\x18\x02\u029A\u029C\x07" + - "\x04\x02\x02\u029B\u029D\x07\x0F\x02\x02\u029C\u029B\x03\x02\x02\x02\u029C" + - "\u029D\x03\x02\x02\x02\u029D\u029E\x03\x02\x02\x02\u029E\u02A3\x052\x1A" + - "\x02\u029F\u02A0\x07\x0F\x02\x02\u02A0\u02A2\x052\x1A\x02\u02A1\u029F" + - "\x03\x02\x02\x02\u02A2\u02A5\x03\x02\x02\x02\u02A3\u02A1\x03\x02\x02\x02" + - "\u02A3\u02A4\x03\x02\x02\x02\u02A4\u02A6\x03\x02\x02\x02\u02A5\u02A3\x03" + - "\x02\x02\x02\u02A6\u02A7\x07\x05\x02\x02\u02A71\x03\x02\x02\x02\u02A8" + - "\u02AB\x054\x1B\x02\u02A9\u02AB\x07\'\x02\x02\u02AA\u02A8\x03\x02\x02" + - "\x02\u02AA\u02A9\x03\x02\x02\x02\u02AB\u02AC\x03\x02\x02\x02\u02AC\u02AD" + - "\x07\x1D\x02\x02\u02AD\u02AE\x05.\x18\x02\u02AE3\x03\x02\x02\x02\u02AF" + - "\u02B6\x05T+\x02\u02B0\u02B3\x07?\x02\x02\u02B1\u02B4\x05T+\x02\u02B2" + - "\u02B4\x07\'\x02\x02\u02B3\u02B1\x03\x02\x02\x02\u02B3\u02B2\x03\x02\x02" + - "\x02\u02B4\u02B5\x03\x02\x02\x02\u02B5\u02B7\x07@\x02\x02\u02B6\u02B0" + - "\x03\x02\x02\x02\u02B6\u02B7\x03\x02\x02\x02\u02B75\x03\x02\x02\x02\u02B8" + - "\u02B9\x05\b\x05\x02\u02B9\u02BA\x07\x02\x02\x03\u02BA\u02C2\x03\x02\x02" + - "\x02\u02BB\u02BC\x05.\x18\x02\u02BC\u02BD\x07\x02\x02\x03\u02BD\u02C2" + - "\x03\x02\x02\x02\u02BE\u02BF\x07E\x02\x02\u02BF\u02C2\x07\x02\x02\x03" + - "\u02C0\u02C2\x07\x02\x02\x03\u02C1\u02B8\x03\x02\x02\x02\u02C1\u02BB\x03" + - "\x02\x02\x02\u02C1\u02BE\x03\x02\x02\x02\u02C1\u02C0\x03\x02\x02\x02\u02C2" + - "7\x03\x02\x02\x02\u02C3\u02C6\x05:\x1E\x02\u02C4\u02C6\x05<\x1F\x02\u02C5" + - "\u02C3\x03\x02\x02\x02\u02C5\u02C4\x03\x02\x02\x02\u02C69\x03\x02\x02" + - "\x02\u02C7\u02C8\x05@!\x02\u02C8\u02C9\x07\x1D\x02\x02\u02C9\u02CA\x05" + - ".\x18\x02\u02CA\u02D9\x03\x02\x02\x02\u02CB\u02CC\x07?\x02\x02\u02CC\u02D1" + - "\x05@!\x02\u02CD\u02CE\x07\n\x02\x02\u02CE\u02D0\x05@!\x02\u02CF\u02CD" + - "\x03\x02\x02\x02\u02D0\u02D3\x03\x02\x02\x02\u02D1\u02CF\x03\x02\x02\x02" + - "\u02D1\u02D2\x03\x02\x02\x02\u02D2\u02D4\x03\x02\x02\x02\u02D3\u02D1\x03" + - "\x02\x02\x02\u02D4\u02D5\x07@\x02\x02\u02D5\u02D6\x07\x1D\x02\x02\u02D6" + - "\u02D7\x05.\x18\x02\u02D7\u02D9\x03\x02\x02\x02\u02D8\u02C7\x03\x02\x02" + - "\x02\u02D8\u02CB\x03\x02\x02\x02\u02D9;\x03\x02\x02\x02\u02DA\u02DB\x07" + - "?\x02\x02\u02DB\u02DC\x07?\x02\x02\u02DC\u02DF\x05@!\x02\u02DD\u02DE\x07" + - "\n\x02\x02\u02DE\u02E0\x05@!\x02\u02DF\u02DD\x03\x02\x02\x02\u02E0\u02E1" + - "\x03\x02\x02\x02\u02E1\u02DF\x03\x02\x02\x02\u02E1\u02E2\x03\x02\x02\x02" + - "\u02E2\u02E3\x03\x02\x02\x02\u02E3\u02E4\x07@\x02\x02\u02E4\u02E5\x07" + - "@\x02\x02\u02E5\u02E6\x07\x1D\x02\x02\u02E6\u02E7\x05.\x18\x02\u02E7=" + - "\x03\x02\x02\x02\u02E8\u02EB\x07\'\x02\x02\u02E9\u02EB\x05R*\x02\u02EA" + - "\u02E8\x03\x02\x02\x02\u02EA\u02E9\x03\x02\x02\x02\u02EB?\x03\x02\x02" + - "\x02\u02EC\u02ED\x05> \x02\u02EDA\x03\x02\x02\x02\u02EE\u02EF\x05> \x02" + - "\u02EF\u02F0\x07\x07\x02\x02\u02F0\u02F1\x05&\x14\x02\u02F1C\x03\x02\x02" + - "\x02\u02F2\u02F5\x075\x02\x02\u02F3\u02F5\x05R*\x02\u02F4\u02F2\x03\x02" + - "\x02\x02\u02F4\u02F3\x03\x02\x02\x02\u02F5E\x03\x02\x02\x02\u02F6\u02FB" + - "\x05.\x18\x02\u02F7\u02F8\x07\n\x02\x02\u02F8\u02FA\x05.\x18\x02\u02F9" + - "\u02F7\x03\x02\x02\x02\u02FA\u02FD\x03\x02\x02\x02\u02FB\u02F9\x03\x02" + - "\x02\x02\u02FB\u02FC\x03\x02\x02\x02\u02FCG\x03\x02\x02\x02\u02FD\u02FB" + - "\x03\x02\x02\x02\u02FE\u02FF\x05T+\x02\u02FF\u0300\x07\x07\x02\x02\u0300" + - "\u0301\x05.\x18\x02\u0301\u0305\x03\x02\x02\x02\u0302\u0303\x07(\x02\x02" + - "\u0303\u0305\x05.\x18\x02\u0304\u02FE\x03\x02\x02\x02\u0304\u0302\x03" + - "\x02\x02\x02\u0305I\x03\x02\x02\x02\u0306\u0309\x05R*\x02\u0307\u0309" + - "\t\x05\x02\x02\u0308\u0306\x03\x02\x02\x02\u0308\u0307\x03\x02\x02\x02" + - "\u0309K\x03\x02\x02\x02\u030A\u030D\x05R*\x02\u030B\u030D\t\x06\x02\x02" + - "\u030C\u030A\x03\x02\x02\x02\u030C\u030B\x03\x02\x02\x02\u030DM\x03\x02" + - "\x02\x02\u030E\u030F\t\x07\x02\x02\u030FO\x03\x02\x02\x02\u0310\u0311" + - "\t\b\x02\x02\u0311Q\x03\x02\x02\x02\u0312\u0317\x05V,\x02\u0313\u0314" + - "\x07)\x02\x02\u0314\u0316\x05V,\x02\u0315\u0313\x03\x02\x02\x02\u0316" + - "\u0319\x03\x02\x02\x02\u0317\u0315\x03\x02\x02\x02\u0317\u0318\x03\x02" + - "\x02\x02\u0318S\x03\x02\x02\x02\u0319\u0317\x03\x02\x02\x02\u031A\u031F" + - "\x05V,\x02\u031B\u031C\x05R*\x02\u031C\u031D\b+\x01\x02\u031D\u031F\x03" + - "\x02\x02\x02\u031E\u031A\x03\x02\x02\x02\u031E\u031B\x03\x02\x02\x02\u031F" + - "U\x03\x02\x02\x02\u0320\u0321\t\t\x02\x02\u0321W\x03\x02\x02\x02Z[bks" + - "\x8C\x96\x9E\xA1\xAB\xAE\xB1\xB5\xB9\xBC\xBE\xCC\xD5\xD9\xDC\xE3\xEB\xF1" + - "\xF6\u0101\u0109\u010F\u0113\u0115\u0120\u0122\u0131\u0139\u0148\u0150" + - "\u0152\u0163\u0166\u0169\u0180\u0184\u018A\u019D\u01A2\u01AA\u01AC\u01BC" + - "\u01C2\u01C6\u01CF\u01E1\u01E5\u01F0\u01F4\u0200\u0204\u020F\u0213\u021B" + - "\u0225\u0229\u0235\u0239\u0243\u0246\u0249\u0262\u0289\u028C\u0293\u0295" + - "\u029C\u02A3\u02AA\u02B3\u02B6\u02C1\u02C5\u02D1\u02D8\u02E1\u02EA\u02F4" + - "\u02FB\u0304\u0308\u030C\u0317\u031E"; + "\x07\x04\x02\x02\u01ED\u01F2\x05.\x18\x02\u01EE\u01EF\x07\n\x02\x02\u01EF" + + "\u01F1\x05.\x18\x02\u01F0\u01EE\x03\x02\x02\x02\u01F1\u01F4\x03\x02\x02" + + "\x02\u01F2\u01F0\x03\x02\x02\x02\u01F2\u01F3\x03\x02\x02\x02\u01F3\u01F6" + + "\x03\x02\x02\x02\u01F4\u01F2\x03\x02\x02\x02\u01F5\u01F7\x07\n\x02\x02" + + "\u01F6\u01F5\x03\x02\x02\x02\u01F6\u01F7\x03\x02\x02\x02\u01F7\u01F8\x03" + + "\x02\x02\x02\u01F8\u01F9\x07\x05\x02\x02\u01F9\u0265\x03\x02\x02\x02\u01FA" + + "\u0265\x050\x19\x02\u01FB\u01FC\x07#\x02\x02\u01FC\u01FD\x07\x04\x02\x02" + + "\u01FD\u0202\x05.\x18\x02\u01FE\u01FF\x07\n\x02\x02\u01FF\u0201\x05.\x18" + + "\x02\u0200\u01FE\x03\x02\x02\x02\u0201\u0204\x03\x02\x02\x02\u0202\u0200" + + "\x03\x02\x02\x02\u0202\u0203\x03\x02\x02\x02\u0203\u0206\x03\x02\x02\x02" + + "\u0204\u0202\x03\x02\x02\x02\u0205\u0207\x07\n\x02\x02\u0206\u0205\x03" + + "\x02\x02\x02\u0206\u0207\x03\x02\x02\x02\u0207\u0208\x03\x02\x02\x02\u0208" + + "\u0209\x07\x05\x02\x02\u0209\u0265\x03\x02\x02\x02\u020A\u020B\x07$\x02" + + "\x02\u020B\u020C\x07\x04\x02\x02\u020C\u0211\x05.\x18\x02\u020D\u020E" + + "\x07\n\x02\x02\u020E\u0210\x05.\x18\x02\u020F\u020D\x03\x02\x02\x02\u0210" + + "\u0213\x03\x02\x02\x02\u0211\u020F\x03\x02\x02\x02\u0211\u0212\x03\x02" + + "\x02\x02\u0212\u0215\x03\x02\x02\x02\u0213\u0211\x03\x02\x02\x02\u0214" + + "\u0216\x07\n\x02\x02\u0215\u0214\x03\x02\x02\x02\u0215\u0216\x03\x02\x02" + + "\x02\u0216\u0217\x03\x02\x02\x02\u0217\u0218\x07\x05\x02\x02\u0218\u0265" + + "\x03\x02\x02\x02\u0219\u021E\x05R*\x02\u021A\u021E\x07,\x02\x02\u021B" + + "\u021E\x07+\x02\x02\u021C\u021E\x07*\x02\x02\u021D\u0219\x03\x02\x02\x02" + + "\u021D\u021A\x03\x02\x02\x02\u021D\u021B\x03\x02\x02\x02\u021D\u021C\x03" + + "\x02\x02\x02\u021E\u0265\x03\x02\x02\x02\u021F\u0220\x07?\x02\x02\u0220" + + "\u0221\x05.\x18\x02\u0221\u0222\x07\n\x02\x02\u0222\u0227\x05.\x18\x02" + + "\u0223\u0224\x07\n\x02\x02\u0224\u0226\x05.\x18\x02\u0225\u0223\x03\x02" + + "\x02\x02\u0226\u0229\x03\x02\x02\x02\u0227\u0225\x03\x02\x02\x02\u0227" + + "\u0228\x03\x02\x02\x02\u0228\u022B\x03\x02\x02\x02\u0229\u0227\x03\x02" + + "\x02\x02\u022A\u022C\x07\n\x02\x02\u022B\u022A\x03\x02\x02\x02\u022B\u022C" + + "\x03\x02\x02\x02\u022C\u022D\x03\x02\x02\x02\u022D\u022E\x07@\x02\x02" + + "\u022E\u0265\x03\x02\x02\x02\u022F\u0230\x07?\x02\x02\u0230\u0265\x07" + + "@\x02\x02\u0231\u0232\x07\x04\x02\x02\u0232\u0237\x05H%\x02\u0233\u0234" + + "\x07\n\x02\x02\u0234\u0236\x05H%\x02\u0235\u0233\x03\x02\x02\x02\u0236" + + "\u0239\x03\x02\x02\x02\u0237\u0235\x03\x02\x02\x02\u0237\u0238\x03\x02" + + "\x02\x02\u0238\u023B\x03\x02\x02\x02\u0239\u0237\x03\x02\x02\x02\u023A" + + "\u023C\x07\n\x02\x02\u023B\u023A\x03\x02\x02\x02\u023B\u023C\x03\x02\x02" + + "\x02\u023C\u023D\x03\x02\x02\x02\u023D\u023E\x07\x05\x02\x02\u023E\u0265" + + "\x03\x02\x02\x02\u023F\u0248\x07\r\x02\x02\u0240\u0245\x05.\x18\x02\u0241" + + "\u0242\x07\n\x02\x02\u0242\u0244\x05.\x18\x02\u0243\u0241\x03\x02\x02" + + "\x02\u0244\u0247\x03\x02\x02\x02\u0245\u0243\x03\x02\x02\x02\u0245\u0246" + + "\x03\x02\x02\x02\u0246\u0249\x03\x02\x02\x02\u0247\u0245\x03\x02\x02\x02" + + "\u0248\u0240\x03\x02\x02\x02\u0248\u0249\x03\x02\x02\x02\u0249\u024B\x03" + + "\x02\x02\x02\u024A\u024C\x07\n\x02\x02\u024B\u024A\x03\x02\x02\x02\u024B" + + "\u024C\x03\x02\x02\x02\u024C\u024D\x03\x02\x02\x02\u024D\u0265\x07\x0E" + + "\x02\x02\u024E\u024F\x07%\x02\x02\u024F\u0250\x07?\x02\x02\u0250\u0251" + + "\x05.\x18\x02\u0251\u0252\x07@\x02\x02\u0252\u0253\x05.\x18\x02\u0253" + + "\u0254\x07&\x02\x02\u0254\u0255\x05.\x18\x07\u0255\u0265\x03\x02\x02\x02" + + "\u0256\u0257\x05\n\x06\x02\u0257\u0258\x05.\x18\x06\u0258\u0265\x03\x02" + + "\x02\x02\u0259\u025A\x05\x14\v\x02\u025A\u025B\x05.\x18\x05\u025B\u0265" + + "\x03\x02\x02\x02\u025C\u025D\x07?\x02\x02\u025D\u025E\x05.\x18\x02\u025E" + + "\u025F\x07@\x02\x02\u025F\u0265\x03\x02\x02\x02\u0260\u0261\x07\x04\x02" + + "\x02\u0261\u0262\x05.\x18\x02\u0262\u0263\x07\x05\x02\x02\u0263\u0265" + + "\x03\x02\x02\x02\u0264\u01CC\x03\x02\x02\x02\u0264\u01CE\x03\x02\x02\x02" + + "\u0264\u01D5\x03\x02\x02\x02\u0264\u01D7\x03\x02\x02\x02\u0264\u01DC\x03" + + "\x02\x02\x02\u0264\u01EB\x03\x02\x02\x02\u0264\u01FA\x03\x02\x02\x02\u0264" + + "\u01FB\x03\x02\x02\x02\u0264\u020A\x03\x02\x02\x02\u0264\u021D\x03\x02" + + "\x02\x02\u0264\u021F\x03\x02\x02\x02\u0264\u022F\x03\x02\x02\x02\u0264" + + "\u0231\x03\x02\x02\x02\u0264\u023F\x03\x02\x02\x02\u0264\u024E\x03\x02" + + "\x02\x02\u0264\u0256\x03\x02\x02\x02\u0264\u0259\x03\x02\x02\x02\u0264" + + "\u025C\x03\x02\x02\x02\u0264\u0260\x03\x02\x02\x02\u0265\u0297\x03\x02" + + "\x02\x02\u0266\u0267\f\x1D\x02\x02\u0267\u0268\x07!\x02\x02\u0268\u0296" + + "\x05.\x18\x1D\u0269\u026A\f\x1B\x02\x02\u026A\u026B\t\x02\x02\x02\u026B" + + "\u0296\x05.\x18\x1C\u026C\u026D\f\x1A\x02\x02\u026D\u026E\t\x03\x02\x02" + + "\u026E\u0296\x05.\x18\x1B\u026F\u0270\f\x19\x02\x02\u0270\u0271\t\x04" + + "\x02\x02\u0271\u0296\x05.\x18\x1A\u0272\u0273\f\x17\x02\x02\u0273\u0274" + + "\x07>\x02\x02\u0274\u0275\x05.\x18\x18\u0275\u0276\b\x18\x01\x02\u0276" + + "\u0296\x03\x02\x02\x02\u0277\u0278\f\x15\x02\x02\u0278\u0279\x07-\x02" + + "\x02\u0279\u0296\x05.\x18\x16\u027A\u027B\f\x13\x02\x02\u027B\u027C\x07" + + ".\x02\x02\u027C\u0296\x05.\x18\x14\u027D\u027E\f\x12\x02\x02\u027E\u027F" + + "\x07/\x02\x02\u027F\u0296\x05.\x18\x13\u0280\u0281\f\x11\x02\x02\u0281" + + "\u0282\x070\x02\x02\u0282\u0296\x05.\x18\x12\u0283\u0284\f\n\x02\x02\u0284" + + "\u0285\x07\x1C\x02\x02\u0285\u0296\x05.\x18\v\u0286\u0287\f!\x02\x02\u0287" + + "\u0288\x07\x18\x02\x02\u0288\u028E\x05L\'\x02\u0289\u028B\x07?\x02\x02" + + "\u028A\u028C\x05F$\x02\u028B\u028A\x03\x02\x02\x02\u028B\u028C\x03\x02" + + "\x02\x02\u028C\u028D\x03\x02\x02\x02\u028D\u028F\x07@\x02\x02\u028E\u0289" + + "\x03\x02\x02\x02\u028E\u028F\x03\x02\x02\x02\u028F\u0296\x03\x02\x02\x02" + + "\u0290\u0291\f\x1E\x02\x02\u0291\u0292\x07\r\x02\x02\u0292\u0293\x05." + + "\x18\x02\u0293\u0294\x07\x0E\x02\x02\u0294\u0296\x03\x02\x02\x02\u0295" + + "\u0266\x03\x02\x02\x02\u0295\u0269\x03\x02\x02\x02\u0295\u026C\x03\x02" + + "\x02\x02\u0295\u026F\x03\x02\x02\x02\u0295\u0272\x03\x02\x02\x02\u0295" + + "\u0277\x03\x02\x02\x02\u0295\u027A\x03\x02\x02\x02\u0295\u027D\x03\x02" + + "\x02\x02\u0295\u0280\x03\x02\x02\x02\u0295\u0283\x03\x02\x02\x02\u0295" + + "\u0286\x03\x02\x02\x02\u0295\u0290\x03\x02\x02\x02\u0296\u0299\x03\x02" + + "\x02\x02\u0297\u0295\x03\x02\x02\x02\u0297\u0298\x03\x02\x02\x02\u0298" + + "/\x03\x02\x02\x02\u0299\u0297\x03\x02\x02\x02\u029A\u029B\x072\x02\x02" + + "\u029B\u029C\x05.\x18\x02\u029C\u029E\x07\x04\x02\x02\u029D\u029F\x07" + + "\x0F\x02\x02\u029E\u029D\x03\x02\x02\x02\u029E\u029F\x03\x02\x02\x02\u029F" + + "\u02A0\x03\x02\x02\x02\u02A0\u02A5\x052\x1A\x02\u02A1\u02A2\x07\x0F\x02" + + "\x02\u02A2\u02A4\x052\x1A\x02\u02A3\u02A1\x03\x02\x02\x02\u02A4\u02A7" + + "\x03\x02\x02\x02\u02A5\u02A3\x03\x02\x02\x02\u02A5\u02A6\x03\x02\x02\x02" + + "\u02A6\u02A8\x03\x02\x02\x02\u02A7\u02A5\x03\x02\x02\x02\u02A8\u02A9\x07" + + "\x05\x02\x02\u02A91\x03\x02\x02\x02\u02AA\u02AD\x054\x1B\x02\u02AB\u02AD" + + "\x07\'\x02\x02\u02AC\u02AA\x03\x02\x02\x02\u02AC\u02AB\x03\x02\x02\x02" + + "\u02AD\u02AE\x03\x02\x02\x02\u02AE\u02AF\x07\x1D\x02\x02\u02AF\u02B0\x05" + + ".\x18\x02\u02B03\x03\x02\x02\x02\u02B1\u02B8\x05T+\x02\u02B2\u02B5\x07" + + "?\x02\x02\u02B3\u02B6\x05T+\x02\u02B4\u02B6\x07\'\x02\x02\u02B5\u02B3" + + "\x03\x02\x02\x02\u02B5\u02B4\x03\x02\x02\x02\u02B6\u02B7\x03\x02\x02\x02" + + "\u02B7\u02B9\x07@\x02\x02\u02B8\u02B2\x03\x02\x02\x02\u02B8\u02B9\x03" + + "\x02\x02\x02\u02B95\x03\x02\x02\x02\u02BA\u02BB\x05\b\x05\x02\u02BB\u02BC" + + "\x07\x02\x02\x03\u02BC\u02C4\x03\x02\x02\x02\u02BD\u02BE\x05.\x18\x02" + + "\u02BE\u02BF\x07\x02\x02\x03\u02BF\u02C4\x03\x02\x02\x02\u02C0\u02C1\x07" + + "E\x02\x02\u02C1\u02C4\x07\x02\x02\x03\u02C2\u02C4\x07\x02\x02\x03\u02C3" + + "\u02BA\x03\x02\x02\x02\u02C3\u02BD\x03\x02\x02\x02\u02C3\u02C0\x03\x02" + + "\x02\x02\u02C3\u02C2\x03\x02\x02\x02\u02C47\x03\x02\x02\x02\u02C5\u02C8" + + "\x05:\x1E\x02\u02C6\u02C8\x05<\x1F\x02\u02C7\u02C5\x03\x02\x02\x02\u02C7" + + "\u02C6\x03\x02\x02\x02\u02C89\x03\x02\x02\x02\u02C9\u02CA\x05@!\x02\u02CA" + + "\u02CB\x07\x1D\x02\x02\u02CB\u02CC\x05.\x18\x02\u02CC\u02DB\x03\x02\x02" + + "\x02\u02CD\u02CE\x07?\x02\x02\u02CE\u02D3\x05@!\x02\u02CF\u02D0\x07\n" + + "\x02\x02\u02D0\u02D2\x05@!\x02\u02D1\u02CF\x03\x02\x02\x02\u02D2\u02D5" + + "\x03\x02\x02\x02\u02D3\u02D1\x03\x02\x02\x02\u02D3\u02D4\x03\x02\x02\x02" + + "\u02D4\u02D6\x03\x02\x02\x02\u02D5\u02D3\x03\x02\x02\x02\u02D6\u02D7\x07" + + "@\x02\x02\u02D7\u02D8\x07\x1D\x02\x02\u02D8\u02D9\x05.\x18\x02\u02D9\u02DB" + + "\x03\x02\x02\x02\u02DA\u02C9\x03\x02\x02\x02\u02DA\u02CD\x03\x02\x02\x02" + + "\u02DB;\x03\x02\x02\x02\u02DC\u02DD\x07?\x02\x02\u02DD\u02DE\x07?\x02" + + "\x02\u02DE\u02E1\x05@!\x02\u02DF\u02E0\x07\n\x02\x02\u02E0\u02E2\x05@" + + "!\x02\u02E1\u02DF\x03\x02\x02\x02\u02E2\u02E3\x03\x02\x02\x02\u02E3\u02E1" + + "\x03\x02\x02\x02\u02E3\u02E4\x03\x02\x02\x02\u02E4\u02E5\x03\x02\x02\x02" + + "\u02E5\u02E6\x07@\x02\x02\u02E6\u02E7\x07@\x02\x02\u02E7\u02E8\x07\x1D" + + "\x02\x02\u02E8\u02E9\x05.\x18\x02\u02E9=\x03\x02\x02\x02\u02EA\u02ED\x07" + + "\'\x02\x02\u02EB\u02ED\x05R*\x02\u02EC\u02EA\x03\x02\x02\x02\u02EC\u02EB" + + "\x03\x02\x02\x02\u02ED?\x03\x02\x02\x02\u02EE\u02EF\x05> \x02\u02EFA\x03" + + "\x02\x02\x02\u02F0\u02F1\x05> \x02\u02F1\u02F2\x07\x07\x02\x02\u02F2\u02F3" + + "\x05&\x14\x02\u02F3C\x03\x02\x02\x02\u02F4\u02F7\x075\x02\x02\u02F5\u02F7" + + "\x05R*\x02\u02F6\u02F4\x03\x02\x02\x02\u02F6\u02F5\x03\x02\x02\x02\u02F7" + + "E\x03\x02\x02\x02\u02F8\u02FD\x05.\x18\x02\u02F9\u02FA\x07\n\x02\x02\u02FA" + + "\u02FC\x05.\x18\x02\u02FB\u02F9\x03\x02\x02\x02\u02FC\u02FF\x03\x02\x02" + + "\x02\u02FD\u02FB\x03\x02\x02\x02\u02FD\u02FE\x03\x02\x02\x02\u02FEG\x03" + + "\x02\x02\x02\u02FF\u02FD\x03\x02\x02\x02\u0300\u0301\x05T+\x02\u0301\u0302" + + "\x07\x07\x02\x02\u0302\u0303\x05.\x18\x02\u0303\u0307\x03\x02\x02\x02" + + "\u0304\u0305\x07(\x02\x02\u0305\u0307\x05.\x18\x02\u0306\u0300\x03\x02" + + "\x02\x02\u0306\u0304\x03\x02\x02\x02\u0307I\x03\x02\x02\x02\u0308\u030B" + + "\x05R*\x02\u0309\u030B\t\x05\x02\x02\u030A\u0308\x03\x02\x02\x02\u030A" + + "\u0309\x03\x02\x02\x02\u030BK\x03\x02\x02\x02\u030C\u030F\x05R*\x02\u030D" + + "\u030F\t\x06\x02\x02\u030E\u030C\x03\x02\x02\x02\u030E\u030D\x03\x02\x02" + + "\x02\u030FM\x03\x02\x02\x02\u0310\u0311\t\x07\x02\x02\u0311O\x03\x02\x02" + + "\x02\u0312\u0313\t\b\x02\x02\u0313Q\x03\x02\x02\x02\u0314\u0319\x05V," + + "\x02\u0315\u0316\x07)\x02\x02\u0316\u0318\x05V,\x02\u0317\u0315\x03\x02" + + "\x02\x02\u0318\u031B\x03\x02\x02\x02\u0319\u0317\x03\x02\x02\x02\u0319" + + "\u031A\x03\x02\x02\x02\u031AS\x03\x02\x02\x02\u031B\u0319\x03\x02\x02" + + "\x02\u031C\u0321\x05V,\x02\u031D\u031E\x05R*\x02\u031E\u031F\b+\x01\x02" + + "\u031F\u0321\x03\x02\x02\x02\u0320\u031C\x03\x02\x02\x02\u0320\u031D\x03" + + "\x02\x02\x02\u0321U\x03\x02\x02\x02\u0322\u0323\t\t\x02\x02\u0323W\x03" + + "\x02\x02\x02Z[bks\x8C\x96\x9E\xA1\xAB\xAE\xB1\xB5\xB9\xBC\xBE\xCC\xD5" + + "\xD9\xDC\xE3\xEB\xF1\xF6\u0101\u0109\u010F\u0113\u0115\u0120\u0122\u0131" + + "\u0139\u0148\u0150\u0152\u0163\u0166\u0169\u0182\u0186\u018C\u019F\u01A4" + + "\u01AC\u01AE\u01BE\u01C4\u01C8\u01D1\u01E3\u01E7\u01F2\u01F6\u0202\u0206" + + "\u0211\u0215\u021D\u0227\u022B\u0237\u023B\u0245\u0248\u024B\u0264\u028B" + + "\u028E\u0295\u0297\u029E\u02A5\u02AC\u02B5\u02B8\u02C3\u02C7\u02D3\u02DA" + + "\u02E3\u02EC\u02F6\u02FD\u0306\u030A\u030E\u0319\u0320"; public static readonly _serializedATN: string = Utils.join( [ QuintParser._serializedATNSegment0, @@ -5327,6 +5340,34 @@ export class TypeListContext extends TypeContext { } } } +export class TypeUnitContext extends TypeContext { + public LPAREN(): TerminalNode { return this.getToken(QuintParser.LPAREN, 0); } + public RPAREN(): TerminalNode { return this.getToken(QuintParser.RPAREN, 0); } + constructor(ctx: TypeContext) { + super(ctx.parent, ctx.invokingState); + this.copyFrom(ctx); + } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterTypeUnit) { + listener.enterTypeUnit(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitTypeUnit) { + listener.exitTypeUnit(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitTypeUnit) { + return visitor.visitTypeUnit(this); + } else { + return visitor.visitChildren(this); + } + } +} export class TypeTupleContext extends TypeContext { public LPAREN(): TerminalNode { return this.getToken(QuintParser.LPAREN, 0); } public type(): TypeContext[]; diff --git a/quint/src/generated/QuintVisitor.ts b/quint/src/generated/QuintVisitor.ts index cca740a52..cd053a7a2 100644 --- a/quint/src/generated/QuintVisitor.ts +++ b/quint/src/generated/QuintVisitor.ts @@ -13,6 +13,7 @@ import { TypeFunContext } from "./QuintParser"; import { TypeOperContext } from "./QuintParser"; import { TypeSetContext } from "./QuintParser"; import { TypeListContext } from "./QuintParser"; +import { TypeUnitContext } from "./QuintParser"; import { TypeTupleContext } from "./QuintParser"; import { TypeRecContext } from "./QuintParser"; import { TypeIntContext } from "./QuintParser"; @@ -151,6 +152,14 @@ export interface QuintVisitor extends ParseTreeVisitor { */ visitTypeList?: (ctx: TypeListContext) => Result; + /** + * Visit a parse tree produced by the `typeUnit` + * labeled alternative in `QuintParser.type`. + * @param ctx the parse tree + * @return the visitor result + */ + visitTypeUnit?: (ctx: TypeUnitContext) => Result; + /** * Visit a parse tree produced by the `typeTuple` * labeled alternative in `QuintParser.type`. diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index ce9b07be2..1f6901487 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -1123,6 +1123,17 @@ export class ToIrListener implements QuintListener { this.typeStack.push({ id, kind: 'fun', arg, res }) } + // The unit type + exitTypeUnit(ctx: p.TypeUnitContext) { + const id = this.getId(ctx) + + this.typeStack.push({ + id: id, + kind: 'tup', + fields: { kind: 'empty' }, + }) + } + // A tuple type, e.g., (int, bool) // the type stack contains the types of the elements exitTypeTuple(ctx: p.TypeTupleContext) { diff --git a/quint/testFixture/_1045polymorphicTypeDecl.json b/quint/testFixture/_1045polymorphicTypeDecl.json index 951bdacda..38644197e 100644 --- a/quint/testFixture/_1045polymorphicTypeDecl.json +++ b/quint/testFixture/_1045polymorphicTypeDecl.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":29,"name":"m","declarations":[{"id":10,"kind":"typedef","name":"MapApp","type":{"id":9,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":7,"kind":"fun","arg":{"id":5,"kind":"var","name":"a"},"res":{"id":6,"kind":"var","name":"b"}}},{"fieldName":"1","fieldType":{"id":8,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a","b"],"depth":0},{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"],"depth":0},{"id":4,"kind":"typedef","name":"MonoPair","type":{"id":3,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":1,"kind":"var","name":"a"}},{"fieldName":"1","fieldType":{"id":2,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a"],"depth":0},{"id":22,"kind":"def","name":"Ok","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":11,"kind":"var","name":"ok"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":21,"kind":"lambda","params":[{"id":18,"name":"__OkParam"}],"qualifier":"def","expr":{"id":20,"kind":"app","opcode":"variant","args":[{"id":17,"kind":"str","value":"Ok"},{"kind":"name","name":"__OkParam","id":19}]}}},{"id":28,"kind":"def","name":"Err","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":12,"kind":"var","name":"err"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":27,"kind":"lambda","params":[{"id":24,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":26,"kind":"app","opcode":"variant","args":[{"id":23,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":25}]}}}]}],"table":{"14":{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"],"depth":0},"19":{"id":18,"name":"__OkParam","kind":"param","depth":1},"25":{"id":24,"name":"__ErrParam","kind":"param","depth":1}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":36,"name":"m","declarations":[{"id":10,"kind":"typedef","name":"MapApp","type":{"id":9,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":7,"kind":"fun","arg":{"id":5,"kind":"var","name":"a"},"res":{"id":6,"kind":"var","name":"b"}}},{"fieldName":"1","fieldType":{"id":8,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a","b"],"depth":0},{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"],"depth":0},{"id":4,"kind":"typedef","name":"MonoPair","type":{"id":3,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":1,"kind":"var","name":"a"}},{"fieldName":"1","fieldType":{"id":2,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a"],"depth":0},{"id":22,"kind":"def","name":"Ok","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":11,"kind":"var","name":"ok"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":21,"kind":"lambda","params":[{"id":18,"name":"__OkParam"}],"qualifier":"def","expr":{"id":20,"kind":"app","opcode":"variant","args":[{"id":17,"kind":"str","value":"Ok"},{"kind":"name","name":"__OkParam","id":19}]}}},{"id":28,"kind":"def","name":"Err","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":12,"kind":"var","name":"err"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":27,"kind":"lambda","params":[{"id":24,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":26,"kind":"app","opcode":"variant","args":[{"id":23,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":25}]}}},{"id":35,"kind":"def","name":"test","qualifier":"val","expr":{"id":34,"kind":"app","opcode":"Err","args":[{"id":33,"kind":"str","value":"my error"}]},"typeAnnotation":{"id":31,"kind":"app","ctor":{"id":32,"kind":"const","name":"Result"},"args":[{"id":29,"kind":"tup","fields":{"kind":"empty"}},{"id":30,"kind":"str"}]}}]}],"table":{"14":{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"],"depth":0},"19":{"id":18,"name":"__OkParam","kind":"param","depth":1},"25":{"id":24,"name":"__ErrParam","kind":"param","depth":1},"32":{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"],"depth":0},"34":{"id":28,"kind":"def","name":"Err","qualifier":"def","expr":{"id":27,"kind":"lambda","params":[{"id":24,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":26,"kind":"app","opcode":"variant","args":[{"id":23,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":25}]}},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1045polymorphicTypeDecl.map.json b/quint/testFixture/_1045polymorphicTypeDecl.map.json index d374b67c1..5e565a6e4 100644 --- a/quint/testFixture/_1045polymorphicTypeDecl.map.json +++ b/quint/testFixture/_1045polymorphicTypeDecl.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1045polymorphicTypeDecl.qnt"},"map":{"1":[0,{"line":1,"col":22,"index":33},{"line":1,"col":22,"index":33}],"2":[0,{"line":1,"col":25,"index":36},{"line":1,"col":25,"index":36}],"3":[0,{"line":1,"col":21,"index":32},{"line":1,"col":26,"index":37}],"4":[0,{"line":1,"col":2,"index":13},{"line":1,"col":26,"index":37}],"5":[0,{"line":2,"col":23,"index":62},{"line":2,"col":23,"index":62}],"6":[0,{"line":2,"col":28,"index":67},{"line":2,"col":28,"index":67}],"7":[0,{"line":2,"col":23,"index":62},{"line":2,"col":28,"index":67}],"8":[0,{"line":2,"col":31,"index":70},{"line":2,"col":31,"index":70}],"9":[0,{"line":2,"col":22,"index":61},{"line":2,"col":32,"index":71}],"10":[0,{"line":2,"col":2,"index":41},{"line":2,"col":32,"index":71}],"11":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"12":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"13":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"14":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"15":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"16":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"17":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"18":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"19":[0,{"line":4,"col":6,"index":104},{"line":4,"col":7,"index":105}],"20":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"21":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"22":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"23":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"24":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"25":[0,{"line":5,"col":6,"index":117},{"line":5,"col":8,"index":119}],"26":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"27":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"28":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"29":[0,{"line":0,"col":0,"index":0},{"line":6,"col":126,"index":126}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1045polymorphicTypeDecl.qnt"},"map":{"1":[0,{"line":1,"col":22,"index":33},{"line":1,"col":22,"index":33}],"2":[0,{"line":1,"col":25,"index":36},{"line":1,"col":25,"index":36}],"3":[0,{"line":1,"col":21,"index":32},{"line":1,"col":26,"index":37}],"4":[0,{"line":1,"col":2,"index":13},{"line":1,"col":26,"index":37}],"5":[0,{"line":2,"col":23,"index":62},{"line":2,"col":23,"index":62}],"6":[0,{"line":2,"col":28,"index":67},{"line":2,"col":28,"index":67}],"7":[0,{"line":2,"col":23,"index":62},{"line":2,"col":28,"index":67}],"8":[0,{"line":2,"col":31,"index":70},{"line":2,"col":31,"index":70}],"9":[0,{"line":2,"col":22,"index":61},{"line":2,"col":32,"index":71}],"10":[0,{"line":2,"col":2,"index":41},{"line":2,"col":32,"index":71}],"11":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"12":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"13":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"14":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"15":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"16":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"17":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"18":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"19":[0,{"line":4,"col":6,"index":104},{"line":4,"col":7,"index":105}],"20":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"21":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"22":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"23":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"24":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"25":[0,{"line":5,"col":6,"index":117},{"line":5,"col":8,"index":119}],"26":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"27":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"28":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"29":[0,{"line":6,"col":19,"index":145},{"line":6,"col":20,"index":146}],"30":[0,{"line":6,"col":23,"index":149},{"line":6,"col":25,"index":151}],"31":[0,{"line":6,"col":12,"index":138},{"line":6,"col":26,"index":152}],"32":[0,{"line":6,"col":12,"index":138},{"line":6,"col":26,"index":152}],"33":[0,{"line":6,"col":34,"index":160},{"line":6,"col":43,"index":169}],"34":[0,{"line":6,"col":30,"index":156},{"line":6,"col":44,"index":170}],"35":[0,{"line":6,"col":2,"index":128},{"line":6,"col":44,"index":170}],"36":[0,{"line":0,"col":0,"index":0},{"line":7,"col":172,"index":172}]}} \ No newline at end of file diff --git a/quint/testFixture/_1045polymorphicTypeDecl.qnt b/quint/testFixture/_1045polymorphicTypeDecl.qnt index 423c76fe0..205d0e4b0 100644 --- a/quint/testFixture/_1045polymorphicTypeDecl.qnt +++ b/quint/testFixture/_1045polymorphicTypeDecl.qnt @@ -4,4 +4,5 @@ module m { type Result[ok, err] = | Ok(ok) | Err(err) + val test: Result[(), str] = Err("my error") } From 6e0e8fe010b02008eacc5e211d94e0b6b3b30d4a Mon Sep 17 00:00:00 2001 From: bugarela Date: Fri, 5 Apr 2024 11:54:19 -0300 Subject: [PATCH 326/388] Add CHANGELOG entry --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a34d5305a..66f38e3ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Deprecated ### Removed ### Fixed + +- Fix a problem where empty tuples were not parsed as valid types, only as + values (#1421). + ### Security ## v0.19.1 -- 2024-04-01 From 1c5d42e5810de8946ba7b558a63f26b53812e2ab Mon Sep 17 00:00:00 2001 From: bugarela Date: Fri, 5 Apr 2024 11:56:12 -0300 Subject: [PATCH 327/388] Add explanatory comment --- quint/src/generated/Quint.g4 | 1 + 1 file changed, 1 insertion(+) diff --git a/quint/src/generated/Quint.g4 b/quint/src/generated/Quint.g4 index 3c2ecaeb7..7c79ae84d 100644 --- a/quint/src/generated/Quint.g4 +++ b/quint/src/generated/Quint.g4 @@ -119,6 +119,7 @@ type | SET '[' type ']' # typeSet // TODO: replace List with general type application | LIST '[' type ']' # typeList + // Parse tuples of size 0 or 2+, but not 1. (int) should be parsed as int. | '(' ')' # typeUnit | '(' type ',' type (',' type)* ','? ')' # typeTuple | '{' row? '}' # typeRec From b05c6b3c369e3c56d3a38783e91f8fb8cbe3a838 Mon Sep 17 00:00:00 2001 From: bugarela Date: Fri, 5 Apr 2024 16:14:58 -0300 Subject: [PATCH 328/388] Add links to the Telegram group --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 99ae97722..a20673bcd 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,11 @@ src="https://img.shields.io/npm/v/@informalsystems/quint" alt="npm (scoped)"> + + telegram group +

Installation • - Documentation • + Documentation • Community