Skip to content

Commit

Permalink
clean(plonk-options): creates an adhoc and plonk option mechanism in …
Browse files Browse the repository at this point in the history
…protocol/query
  • Loading branch information
AlexandreBelling committed Feb 22, 2025
1 parent 92c61c5 commit 50837d7
Show file tree
Hide file tree
Showing 28 changed files with 64 additions and 38 deletions.
2 changes: 1 addition & 1 deletion prover/protocol/compiler/fullrecursion/full_recursion.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ import (
"github.com/consensys/linea-monorepo/prover/protocol/accessors"
"github.com/consensys/linea-monorepo/prover/protocol/coin"
"github.com/consensys/linea-monorepo/prover/protocol/column"
plonk "github.com/consensys/linea-monorepo/prover/protocol/compiler/plonkinwizard/plonkinternal"
"github.com/consensys/linea-monorepo/prover/protocol/compiler/selfrecursion"
"github.com/consensys/linea-monorepo/prover/protocol/compiler/vortex"
"github.com/consensys/linea-monorepo/prover/protocol/ifaces"
plonk "github.com/consensys/linea-monorepo/prover/protocol/internal/plonkinternal"
"github.com/consensys/linea-monorepo/prover/protocol/query"
"github.com/consensys/linea-monorepo/prover/protocol/wizard"
"github.com/consensys/linea-monorepo/prover/utils"
Expand Down
10 changes: 8 additions & 2 deletions prover/protocol/compiler/plonkinwizard/compile.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import (
"github.com/consensys/linea-monorepo/prover/maths/common/smartvectors"
"github.com/consensys/linea-monorepo/prover/maths/field"
"github.com/consensys/linea-monorepo/prover/protocol/column"
plonkinternal "github.com/consensys/linea-monorepo/prover/protocol/compiler/plonkinwizard/plonkinternal"
"github.com/consensys/linea-monorepo/prover/protocol/ifaces"
plonkinternal "github.com/consensys/linea-monorepo/prover/protocol/internal/plonkinternal"
"github.com/consensys/linea-monorepo/prover/protocol/query"
"github.com/consensys/linea-monorepo/prover/protocol/wizard"
sym "github.com/consensys/linea-monorepo/prover/symbolic"
Expand Down Expand Up @@ -55,7 +55,13 @@ func compileQuery(comp *wizard.CompiledIOP, q *query.PlonkInWizard) {

plonkOptions := make([]plonkinternal.Option, len(q.PlonkOptions))
for i := range plonkOptions {
plonkOptions[i] = q.PlonkOptions[i].(plonkinternal.Option)
// Note: today, there is only one type of PlonkOption but in the
// the future we might have more.
plonkOptions[i] = plonkinternal.WithRangecheck(
q.PlonkOptions[i].RangeCheckNbBits,
q.PlonkOptions[i].RangeCheckNbLimbs,
q.PlonkOptions[i].RangeCheckAddGateForRangeCheck,
)
}

var (
Expand Down
2 changes: 1 addition & 1 deletion prover/protocol/dedicated/plonk/alignment.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ type CircuitAlignmentInput struct {
NbCircuitInstances int

// PlonkOptions are optional options to the plonk-in-wizard checker. See [Option].
PlonkOptions []any
PlonkOptions []query.PlonkOption

// InputFiller returns an element to pad in the public input for the
// circuit in case DataToCircuitMask is not full length of the circuit
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import (
"github.com/consensys/gnark/backend/witness"
"github.com/consensys/gnark/frontend"
"github.com/consensys/linea-monorepo/prover/protocol/compiler/dummy"
"github.com/consensys/linea-monorepo/prover/protocol/compiler/plonkinwizard/plonkinternal"
"github.com/consensys/linea-monorepo/prover/protocol/internal/plonkinternal"
"github.com/consensys/linea-monorepo/prover/protocol/wizard"
"github.com/consensys/linea-monorepo/prover/utils/gnarkutil"
"github.com/stretchr/testify/require"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import (
"github.com/consensys/gnark/backend/witness"
"github.com/consensys/gnark/frontend"
"github.com/consensys/linea-monorepo/prover/protocol/compiler/dummy"
"github.com/consensys/linea-monorepo/prover/protocol/compiler/plonkinwizard/plonkinternal"
"github.com/consensys/linea-monorepo/prover/protocol/internal/plonkinternal"
"github.com/consensys/linea-monorepo/prover/protocol/wizard"
"github.com/consensys/linea-monorepo/prover/utils/gnarkutil"
"github.com/stretchr/testify/require"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (
"github.com/consensys/gnark/frontend"
"github.com/consensys/linea-monorepo/prover/maths/field"
"github.com/consensys/linea-monorepo/prover/protocol/compiler/dummy"
plonk "github.com/consensys/linea-monorepo/prover/protocol/compiler/plonkinwizard/plonkinternal"
plonk "github.com/consensys/linea-monorepo/prover/protocol/internal/plonkinternal"
"github.com/consensys/linea-monorepo/prover/protocol/wizard"
"github.com/consensys/linea-monorepo/prover/utils/gnarkutil"
"github.com/stretchr/testify/assert"
Expand Down
22 changes: 21 additions & 1 deletion prover/protocol/query/plonk_in_wizard.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ type PlonkInWizard struct {
CircuitMask ifaces.Column

// PlonkOptions are optional options to pass to the circuit when building it
PlonkOptions []any
PlonkOptions []PlonkOption

// nbPublicInput is a lazily-loaded variable representing the number of public
// inputs in the circuit provided by the query. The variable is computed the
Expand All @@ -79,6 +79,26 @@ type PlonkInWizard struct {
nbPublicInputsLoaded bool
}

// PlonkOption represents a an option for the compilation of the circuit. One
// option is the use of a custom range-checker (based on external-lookups)
// instead of one based on in-circuit lookups.
type PlonkOption struct {
RangeCheckNbBits int
RangeCheckNbLimbs int
RangeCheckAddGateForRangeCheck bool
}

// WithRangecheck allows bridging range checking from gnark into Wizard. The
// total of bits being range-checked are nbBits*nbLimbs. If addGateForRangeCheck
// is true, then new gates are added for wires not present in existing gates.
func PlonkRangeCheckOption(nbBits, nbLimbs int, addGateForRangeCheck bool) PlonkOption {
return PlonkOption{
RangeCheckNbBits: nbBits,
RangeCheckNbLimbs: nbLimbs,
RangeCheckAddGateForRangeCheck: addGateForRangeCheck,
}
}

// Name implements the [ifaces.Query] interface
func (piw *PlonkInWizard) Name() ifaces.QueryID {
return piw.ID
Expand Down
6 changes: 3 additions & 3 deletions prover/zkevm/prover/ecarith/ecadd.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ import (
"github.com/consensys/gnark/std/algebra/emulated/sw_bn254"
"github.com/consensys/gnark/std/math/bitslice"
"github.com/consensys/gnark/std/math/emulated"
"github.com/consensys/linea-monorepo/prover/protocol/compiler/plonkinwizard/plonkinternal"
"github.com/consensys/linea-monorepo/prover/protocol/dedicated/plonk"
"github.com/consensys/linea-monorepo/prover/protocol/ifaces"
"github.com/consensys/linea-monorepo/prover/protocol/query"
"github.com/consensys/linea-monorepo/prover/protocol/wizard"
)

Expand Down Expand Up @@ -43,12 +43,12 @@ func NewEcAddZkEvm(comp *wizard.CompiledIOP, limits *Limits) *EcAdd {
IsData: comp.Columns.GetHandle("ecdata.IS_ECADD_DATA"),
IsRes: comp.Columns.GetHandle("ecdata.IS_ECADD_RESULT"),
},
[]any{plonkinternal.WithRangecheck(16, 6, true)},
[]query.PlonkOption{query.PlonkRangeCheckOption(16, 6, true)},
)
}

// newEcAdd creates a new EC_ADD integration.
func newEcAdd(comp *wizard.CompiledIOP, limits *Limits, src *EcDataAddSource, plonkOptions []any) *EcAdd {
func newEcAdd(comp *wizard.CompiledIOP, limits *Limits, src *EcDataAddSource, plonkOptions []query.PlonkOption) *EcAdd {
size := limits.sizeEcAddIntegration()

toAlign := &plonk.CircuitAlignmentInput{
Expand Down
4 changes: 2 additions & 2 deletions prover/zkevm/prover/ecarith/ecadd_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import (
"testing"

"github.com/consensys/linea-monorepo/prover/protocol/compiler/dummy"
"github.com/consensys/linea-monorepo/prover/protocol/compiler/plonkinwizard/plonkinternal"
"github.com/consensys/linea-monorepo/prover/protocol/query"
"github.com/consensys/linea-monorepo/prover/protocol/wizard"
"github.com/consensys/linea-monorepo/prover/utils/csvtraces"
)
Expand All @@ -26,7 +26,7 @@ func TestEcAddIntegration(t *testing.T) {
IsData: ct.GetCommit(b, "IS_DATA"),
IsRes: ct.GetCommit(b, "IS_RES"),
}
ecAdd = newEcAdd(b.CompiledIOP, limits, ecAddSource, []any{plonkinternal.WithRangecheck(16, 6, true)})
ecAdd = newEcAdd(b.CompiledIOP, limits, ecAddSource, []query.PlonkOption{query.PlonkRangeCheckOption(16, 6, true)})
},
dummy.Compile,
)
Expand Down
6 changes: 3 additions & 3 deletions prover/zkevm/prover/ecarith/ecmul.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ import (
"github.com/consensys/gnark/std/algebra/emulated/sw_bn254"
"github.com/consensys/gnark/std/math/bitslice"
"github.com/consensys/gnark/std/math/emulated"
"github.com/consensys/linea-monorepo/prover/protocol/compiler/plonkinwizard/plonkinternal"
"github.com/consensys/linea-monorepo/prover/protocol/dedicated/plonk"
"github.com/consensys/linea-monorepo/prover/protocol/ifaces"
"github.com/consensys/linea-monorepo/prover/protocol/query"
"github.com/consensys/linea-monorepo/prover/protocol/wizard"
)

Expand Down Expand Up @@ -44,12 +44,12 @@ func NewEcMulZkEvm(comp *wizard.CompiledIOP, limits *Limits) *EcMul {
IsData: comp.Columns.GetHandle("ecdata.IS_ECMUL_DATA"),
IsRes: comp.Columns.GetHandle("ecdata.IS_ECMUL_RESULT"),
},
[]any{plonkinternal.WithRangecheck(16, 6, true)},
[]query.PlonkOption{query.PlonkRangeCheckOption(16, 6, true)},
)
}

// newEcMul creates a new EC_MUL integration.
func newEcMul(comp *wizard.CompiledIOP, limits *Limits, src *EcDataMulSource, plonkOptions []any) *EcMul {
func newEcMul(comp *wizard.CompiledIOP, limits *Limits, src *EcDataMulSource, plonkOptions []query.PlonkOption) *EcMul {
size := limits.sizeEcMulIntegration()

toAlign := &plonk.CircuitAlignmentInput{
Expand Down
4 changes: 2 additions & 2 deletions prover/zkevm/prover/ecarith/ecmul_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import (
"github.com/consensys/gnark/backend"
"github.com/consensys/gnark/test"
"github.com/consensys/linea-monorepo/prover/protocol/compiler/dummy"
"github.com/consensys/linea-monorepo/prover/protocol/compiler/plonkinwizard/plonkinternal"
"github.com/consensys/linea-monorepo/prover/protocol/query"
"github.com/consensys/linea-monorepo/prover/protocol/wizard"
"github.com/consensys/linea-monorepo/prover/utils/csvtraces"
)
Expand Down Expand Up @@ -100,7 +100,7 @@ func TestEcMulIntegration(t *testing.T) {
IsData: ct.GetCommit(b, "IS_DATA"),
IsRes: ct.GetCommit(b, "IS_RES"),
}
ecMul = newEcMul(b.CompiledIOP, limits, ecMulSource, []any{plonkinternal.WithRangecheck(16, 6, true)})
ecMul = newEcMul(b.CompiledIOP, limits, ecMulSource, []query.PlonkOption{query.PlonkRangeCheckOption(16, 6, true)})
},
dummy.Compile,
)
Expand Down
3 changes: 2 additions & 1 deletion prover/zkevm/prover/ecdsa/antichamber.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"github.com/consensys/linea-monorepo/prover/maths/field"
"github.com/consensys/linea-monorepo/prover/protocol/dedicated/plonk"
"github.com/consensys/linea-monorepo/prover/protocol/ifaces"
"github.com/consensys/linea-monorepo/prover/protocol/query"
"github.com/consensys/linea-monorepo/prover/protocol/wizard"
"github.com/consensys/linea-monorepo/prover/utils"
"github.com/consensys/linea-monorepo/prover/zkevm/prover/hash/generic"
Expand Down Expand Up @@ -47,7 +48,7 @@ type antichamberInput struct {
txSource *txnData
rlpTxn generic.GenDataModule
settings *Settings
plonkOptions []any
plonkOptions []query.PlonkOption
}

type antichamber struct {
Expand Down
4 changes: 2 additions & 2 deletions prover/zkevm/prover/ecdsa/antichamber_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import (
fr_secp256k1 "github.com/consensys/gnark-crypto/ecc/secp256k1/fr"
"github.com/consensys/linea-monorepo/prover/crypto/keccak"
"github.com/consensys/linea-monorepo/prover/protocol/compiler/dummy"
"github.com/consensys/linea-monorepo/prover/protocol/compiler/plonkinwizard/plonkinternal"
"github.com/consensys/linea-monorepo/prover/protocol/query"
"github.com/consensys/linea-monorepo/prover/protocol/wizard"
"github.com/consensys/linea-monorepo/prover/utils"
"github.com/consensys/linea-monorepo/prover/utils/csvtraces"
Expand Down Expand Up @@ -71,7 +71,7 @@ func TestAntichamber(t *testing.T) {
ecSource: ecSrc,
txSource: txSrc,
rlpTxn: rlpTxn,
plonkOptions: []any{plonkinternal.WithRangecheck(16, 6, true)},
plonkOptions: []query.PlonkOption{query.PlonkRangeCheckOption(16, 6, true)},
settings: limits,
},
)
Expand Down
4 changes: 2 additions & 2 deletions prover/zkevm/prover/ecdsa/ecdsa.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package ecdsa

import (
"github.com/consensys/linea-monorepo/prover/protocol/compiler/plonkinwizard/plonkinternal"
"github.com/consensys/linea-monorepo/prover/protocol/query"
"github.com/consensys/linea-monorepo/prover/protocol/wizard"
"github.com/consensys/linea-monorepo/prover/zkevm/prover/hash/generic"
)
Expand All @@ -22,7 +22,7 @@ func NewEcdsaZkEvm(
ecSource: getEcdataArithmetization(comp),
txSource: getTxnDataArithmetization(comp),
rlpTxn: getRlpTxnArithmetization(comp),
plonkOptions: []any{plonkinternal.WithRangecheck(16, 6, true)},
plonkOptions: []query.PlonkOption{query.PlonkRangeCheckOption(16, 6, true)},
},
),
}
Expand Down
8 changes: 4 additions & 4 deletions prover/zkevm/prover/ecpair/ecpair.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package ecpair

import (
"github.com/consensys/linea-monorepo/prover/protocol/compiler/plonkinwizard/plonkinternal"
"github.com/consensys/linea-monorepo/prover/protocol/dedicated/plonk"
"github.com/consensys/linea-monorepo/prover/protocol/ifaces"
"github.com/consensys/linea-monorepo/prover/protocol/query"
"github.com/consensys/linea-monorepo/prover/protocol/wizard"
)

Expand Down Expand Up @@ -75,7 +75,7 @@ func NewECPairZkEvm(comp *wizard.CompiledIOP, limits *Limits) *ECPair {
CsG2Membership: comp.Columns.GetHandle("ecdata.CIRCUIT_SELECTOR_G2_MEMBERSHIP"),
},
).WithG2MembershipCircuit(comp).
WithPairingCircuit(comp, plonkinternal.WithRangecheck(16, 6, true))
WithPairingCircuit(comp, query.PlonkRangeCheckOption(16, 6, true))
}

func newECPair(comp *wizard.CompiledIOP, limits *Limits, ecSource *ECPairSource) *ECPair {
Expand Down Expand Up @@ -122,7 +122,7 @@ func newECPair(comp *wizard.CompiledIOP, limits *Limits, ecSource *ECPairSource)

// WithPairingCircuit attaches the gnark circuit to the ECPair module for
// enforcing the pairing checks.
func (ec *ECPair) WithPairingCircuit(comp *wizard.CompiledIOP, options ...any) *ECPair {
func (ec *ECPair) WithPairingCircuit(comp *wizard.CompiledIOP, options ...query.PlonkOption) *ECPair {
alignInputMillerLoop := &plonk.CircuitAlignmentInput{
Round: roundNr,
Name: nameAlignmentMillerLoop,
Expand Down Expand Up @@ -152,7 +152,7 @@ func (ec *ECPair) WithPairingCircuit(comp *wizard.CompiledIOP, options ...any) *

// WithG2MembershipCircuit attaches the gnark circuit to the ECPair module for
// enforcing the G2 membership checks.
func (ec *ECPair) WithG2MembershipCircuit(comp *wizard.CompiledIOP, options ...any) *ECPair {
func (ec *ECPair) WithG2MembershipCircuit(comp *wizard.CompiledIOP, options ...query.PlonkOption) *ECPair {
alignInputG2Membership := &plonk.CircuitAlignmentInput{
Round: roundNr,
Name: nameAlignmentG2Subgroup,
Expand Down
6 changes: 3 additions & 3 deletions prover/zkevm/prover/ecpair/ecpair_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import (
"testing"

"github.com/consensys/linea-monorepo/prover/protocol/compiler/dummy"
"github.com/consensys/linea-monorepo/prover/protocol/compiler/plonkinwizard/plonkinternal"
"github.com/consensys/linea-monorepo/prover/protocol/query"
"github.com/consensys/linea-monorepo/prover/protocol/wizard"
"github.com/consensys/linea-monorepo/prover/utils/csvtraces"
)
Expand Down Expand Up @@ -110,10 +110,10 @@ func testModule(t *testing.T, tc pairingDataTestCase, withPairingCircuit, withG2

mod = newECPair(build.CompiledIOP, limits, inp)
if withPairingCircuit {
mod.WithPairingCircuit(build.CompiledIOP, plonkinternal.WithRangecheck(16, 6, false))
mod.WithPairingCircuit(build.CompiledIOP, query.PlonkRangeCheckOption(16, 6, false))
}
if withG2MembershipCircuit {
mod.WithG2MembershipCircuit(build.CompiledIOP, plonkinternal.WithRangecheck(16, 6, false))
mod.WithG2MembershipCircuit(build.CompiledIOP, query.PlonkRangeCheckOption(16, 6, false))
}
}, dummy.Compile)

Expand Down
2 changes: 1 addition & 1 deletion prover/zkevm/prover/hash/sha2/sha2_block.go
Original file line number Diff line number Diff line change
Expand Up @@ -318,7 +318,7 @@ func newSha2BlockModule(comp *wizard.CompiledIOP, inp *sha2BlocksInputs) *sha2Bl
return res
}

func (sbh *sha2BlockModule) WithCircuit(comp *wizard.CompiledIOP, options ...any) *sha2BlockModule {
func (sbh *sha2BlockModule) WithCircuit(comp *wizard.CompiledIOP, options ...query.PlonkOption) *sha2BlockModule {

sbh.hasCircuit = true

Expand Down
4 changes: 2 additions & 2 deletions prover/zkevm/prover/hash/sha2/sha2_block_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import (
"testing"

"github.com/consensys/linea-monorepo/prover/protocol/compiler/dummy"
"github.com/consensys/linea-monorepo/prover/protocol/compiler/plonkinwizard/plonkinternal"
"github.com/consensys/linea-monorepo/prover/protocol/query"
"github.com/consensys/linea-monorepo/prover/protocol/wizard"
"github.com/consensys/linea-monorepo/prover/utils/csvtraces"
)
Expand Down Expand Up @@ -58,7 +58,7 @@ func runTestSha2(t *testing.T, tc testCaseFile) {
mod = newSha2BlockModule(build.CompiledIOP, &inp)

if tc.WithCircuit {
mod.WithCircuit(build.CompiledIOP, plonkinternal.WithRangecheck(16, 6, false))
mod.WithCircuit(build.CompiledIOP, query.PlonkRangeCheckOption(16, 6, false))
}

}, dummy.Compile)
Expand Down
5 changes: 2 additions & 3 deletions prover/zkevm/prover/modexp/module.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import (
"github.com/consensys/linea-monorepo/prover/maths/common/smartvectors"
"github.com/consensys/linea-monorepo/prover/maths/field"
"github.com/consensys/linea-monorepo/prover/protocol/column"
"github.com/consensys/linea-monorepo/prover/protocol/compiler/plonkinwizard/plonkinternal"
"github.com/consensys/linea-monorepo/prover/protocol/dedicated/plonk"
"github.com/consensys/linea-monorepo/prover/protocol/ifaces"
"github.com/consensys/linea-monorepo/prover/protocol/query"
Expand Down Expand Up @@ -69,7 +68,7 @@ type Module struct {
// does not define them.
func NewModuleZkEvm(comp *wizard.CompiledIOP, settings Settings) *Module {
return newModule(comp, newZkEVMInput(comp, settings)).
WithCircuit(comp, plonkinternal.WithRangecheck(16, 6, false))
WithCircuit(comp, query.PlonkRangeCheckOption(16, 6, false))
}

func newModule(comp *wizard.CompiledIOP, input Input) *Module {
Expand Down Expand Up @@ -108,7 +107,7 @@ func newModule(comp *wizard.CompiledIOP, input Input) *Module {

// WithCircuits adds the Plonk-in-Wizard circuit verification to complete
// the anti-chamber.
func (mod *Module) WithCircuit(comp *wizard.CompiledIOP, options ...any) *Module {
func (mod *Module) WithCircuit(comp *wizard.CompiledIOP, options ...query.PlonkOption) *Module {

mod.hasCircuit = true

Expand Down
4 changes: 2 additions & 2 deletions prover/zkevm/prover/modexp/module_with_circuit_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import (
"testing"

"github.com/consensys/linea-monorepo/prover/protocol/compiler/dummy"
"github.com/consensys/linea-monorepo/prover/protocol/compiler/plonkinwizard/plonkinternal"
"github.com/consensys/linea-monorepo/prover/protocol/query"
"github.com/consensys/linea-monorepo/prover/protocol/wizard"
"github.com/consensys/linea-monorepo/prover/utils/csvtraces"
)
Expand Down Expand Up @@ -46,7 +46,7 @@ func TestModexpWithCircuit(t *testing.T) {
}

mod = newModule(build.CompiledIOP, inp).
WithCircuit(build.CompiledIOP, plonkinternal.WithRangecheck(21, 4, false))
WithCircuit(build.CompiledIOP, query.PlonkRangeCheckOption(21, 4, false))
}, dummy.Compile)

proof := wizard.Prove(cmp, func(run *wizard.ProverRuntime) {
Expand Down

0 comments on commit 50837d7

Please sign in to comment.