// codesnip-guard: SegmentTreeMap #[cfg_attr(any(),rustfmt::skip)]pub use self::segment_tree_map::SegmentTreeMap;#[cfg_attr(any(),rustfmt::skip)]mod segment_tree_map{use super::{AbelianMonoid,FibHashMap,Monoid,RangeBoundsExt};use std::{fmt::{self,Debug,Formatter},ops::RangeBounds};pub struct SegmentTreeMapwhere M:Monoid{n:usize,seg:FibHashMap,u:M::T}implClone for SegmentTreeMapwhere M:Monoid{fn clone(&self)->Self{Self{n:self.n,seg:self.seg.clone(),u:self.u.clone()}}}implDebug for SegmentTreeMapwhere M:Monoid{fn fmt(&self,f:&mut Formatter<'_>)->fmt::Result{f.debug_struct("SegmentTreeMap").field("n",&self.n).field("seg",&self.seg).field("u",&self.u).finish()}}implSegmentTreeMapwhere M:Monoid{pub fn new(n:usize)->Self{let u=M::unit();Self{n,seg:Default::default(),u}}#[inline]fn get_ref(&self,k:usize)->&M::T{self.seg.get(&k).unwrap_or(&self.u)}pub fn set(&mut self,k:usize,x:M::T){debug_assert!(k0{*self.seg.entry(k).or_insert(M::unit())=M::operate(self.get_ref(2*k),self.get_ref(2*k+1));k/=2;}}pub fn update(&mut self,k:usize,x:M::T){debug_assert!(k0{*self.seg.entry(k).or_insert(M::unit())=M::operate(self.get_ref(2*k),self.get_ref(2*k+1));k/=2;}}pub fn get(&self,k:usize)->M::T{debug_assert!(k(&self,range:R)->M::T where R:RangeBounds{let range=range.to_range();debug_assert!(range.end<=self.n);let mut l=range.start+self.n;let mut r=range.end+self.n;let mut vl=M::unit();let mut vr=M::unit();while l(&self,mut pos:usize,mut acc:M::T,mut pred:P)->(usize,M::T)where P:FnMut(&M::T)->bool{while pos(&self,mut pos:usize,mut acc:M::T,mut pred:P)->(usize,M::T)where P:FnMut(&M::T)->bool{while pos(&self,left:usize,mut pred:P)->usize where P:FnMut(&M::T)->bool{let mut l=left+self.n;let r=2*self.n;let mut k=0usize;let mut acc=M::unit();while l>k{if l&1!=0{let nacc=M::operate(&acc,self.get_ref(l));if!pred(&nacc){return self.partition_point_perfect(l,acc,pred).0;}acc=nacc;l+=1;}l>>=1;k+=1;}for k in(0..k).rev(){let r=r>>k;if r&1!=0{let nacc=M::operate(&acc,self.get_ref(r-1));if!pred(&nacc){return self.partition_point_perfect(r-1,acc,pred).0;}acc=nacc;}}self.n}pub fn rpartition_point_acc

(&self,right:usize,mut pred:P)->usize where P:FnMut(&M::T)->bool{let mut l=self.n;let mut r=right+self.n;let mut c=0usize;let mut k=0usize;let mut acc=M::unit();while l>>k>=1;k+=1;}for k in(0..k).rev(){if c&1!=0{l-=1<>k;let nacc=M::operate(self.get_ref(l),&acc);if!pred(&nacc){return self.rpartition_point_perfect(l,acc,pred).0+1;}acc=nacc;}c>>=1;}0}}implSegmentTreeMapwhere M:AbelianMonoid{pub fn fold_all(&self)->M::T{self.seg.get(&1).cloned().unwrap_or_else(M::unit)}}} // codesnip-guard: FibonacciHash #[cfg_attr(any(),rustfmt::skip)]pub use self::fibonacci_hash::{FibHashMap,FibHashSet,FibonacciHasher,FibonacciHasheru32,FibonacciHasheru64};#[cfg_attr(any(),rustfmt::skip)]mod fibonacci_hash{use std::{collections::{HashMap,HashSet},hash::{BuildHasherDefault,Hasher}};#[cfg(target_pointer_width="32")]pub type FibonacciHasher=FibonacciHasheru32;#[cfg(not(target_pointer_width="32"))]pub type FibonacciHasher=FibonacciHasheru64;pub type FibHashMap=HashMap>;pub type FibHashSet=HashSet>;#[derive(Debug,Default)]pub struct FibonacciHasheru32{hash:u32}impl FibonacciHasheru32{const A:u32=2654435769;const B:u32=5;fn push(&mut self,x:u32){self.hash=(self.hash.rotate_right(Self::B)^x).wrapping_mul(Self::A);}}impl Hasher for FibonacciHasheru32{fn finish(&self)->u64{self.hash as u64}fn write(&mut self,mut bytes:&[u8]){if bytes.len()%4>=2{let(chunk,rest)=bytes.split_first_chunk::<2>().unwrap();self.push(u16::from_ne_bytes(*chunk)as u32);bytes=rest;}if bytes.len()%2>=1{let(chunk,rest)=bytes.split_first_chunk::<1>().unwrap();self.push(u8::from_ne_bytes(*chunk)as u32);bytes=rest;}for chunk in bytes.as_chunks::<4>().0{self.push(u32::from_ne_bytes(*chunk));}}fn write_u8(&mut self,i:u8){self.push(i as u32)}fn write_u16(&mut self,i:u16){self.push(i as u32)}fn write_u32(&mut self,i:u32){self.push(i)}fn write_u64(&mut self,i:u64){self.push(i as u32);self.push((i>>32)as u32);}fn write_u128(&mut self,i:u128){self.push(i as u32);self.push((i>>32)as u32);self.push((i>>64)as u32);self.push((i>>96)as u32);}#[cfg(target_pointer_width="32")]fn write_usize(&mut self,i:usize){self.write_u32(i as u32)}#[cfg(target_pointer_width="64")]fn write_usize(&mut self,i:usize){self.write_u64(i as u64)}fn write_i8(&mut self,i:i8){self.write_u8(i as u8)}fn write_i16(&mut self,i:i16){self.write_u16(i as u16)}fn write_i32(&mut self,i:i32){self.write_u32(i as u32)}fn write_i64(&mut self,i:i64){self.write_u64(i as u64)}fn write_i128(&mut self,i:i128){self.write_u128(i as u128)}fn write_isize(&mut self,i:isize){self.write_usize(i as usize)}}#[derive(Debug,Default)]pub struct FibonacciHasheru64{hash:u64}impl FibonacciHasheru64{const A:u64=11400714819323198485;const B:u32=5;fn push(&mut self,x:u64){self.hash=(self.hash.rotate_right(Self::B)^x).wrapping_mul(Self::A);}}impl Hasher for FibonacciHasheru64{fn finish(&self)->u64{self.hash}fn write(&mut self,mut bytes:&[u8]){if bytes.len()%8>=4{let(chunk,rest)=bytes.split_first_chunk::<4>().unwrap();self.push(u32::from_ne_bytes(*chunk)as u64);bytes=rest;}if bytes.len()%4>=2{let(chunk,rest)=bytes.split_first_chunk::<2>().unwrap();self.push(u16::from_ne_bytes(*chunk)as u64);bytes=rest;}if bytes.len()%2>=1{let(chunk,rest)=bytes.split_first_chunk::<1>().unwrap();self.push(u8::from_ne_bytes(*chunk)as u64);bytes=rest;}for chunk in bytes.as_chunks::<8>().0{self.push(u64::from_ne_bytes(*chunk));}}fn write_u8(&mut self,i:u8){self.push(i as u64)}fn write_u16(&mut self,i:u16){self.push(i as u64)}fn write_u32(&mut self,i:u32){self.push(i as u64)}fn write_u64(&mut self,i:u64){self.push(i);}fn write_u128(&mut self,i:u128){self.push(i as u64);self.push((i>>64)as u64);}fn write_usize(&mut self,i:usize){self.write_u64(i as u64)}fn write_i8(&mut self,i:i8){self.write_u8(i as u8)}fn write_i16(&mut self,i:i16){self.write_u16(i as u16)}fn write_i32(&mut self,i:i32){self.write_u32(i as u32)}fn write_i64(&mut self,i:i64){self.write_u64(i as u64)}fn write_i128(&mut self,i:i128){self.write_u128(i as u128)}fn write_isize(&mut self,i:isize){self.write_usize(i as usize)}}} // codesnip-guard: algebra #[cfg_attr(any(),rustfmt::skip)]pub use self::magma::*;#[cfg_attr(any(),rustfmt::skip)]mod magma{#![doc=" algebraic traits"]#[doc=" binary operaion: $T \\circ T \\to T$"]pub trait Magma{#[doc=" type of operands: $T$"]type T:Clone;#[doc=" binary operaion: $\\circ$"]fn operate(x:&Self::T,y:&Self::T)->Self::T;fn reverse_operate(x:&Self::T,y:&Self::T)->Self::T{Self::operate(y,x)}fn operate_assign(x:&mut Self::T,y:&Self::T){*x=Self::operate(x,y);}}#[doc=" $\\forall a,\\forall b,\\forall c \\in T, (a \\circ b) \\circ c = a \\circ (b \\circ c)$"]pub trait Associative:Magma{}#[doc=" associative binary operation"]pub trait SemiGroup:Magma+Associative{}implSemiGroup for S where S:Magma+Associative{}#[doc=" $\\exists e \\in T, \\forall a \\in T, e \\circ a = a \\circ e = a$"]pub trait Unital:Magma{#[doc=" identity element: $e$"]fn unit()->Self::T;fn is_unit(x:&Self::T)->bool where Self::T:PartialEq{x==&Self::unit()}fn set_unit(x:&mut Self::T){*x=Self::unit();}}pub trait ExpBits{type Iter:Iterator;fn bits(self)->Self::Iter;}pub trait SignedExpBits{type T:ExpBits;fn neg_and_bits(self)->(bool,Self::T);}pub struct Bits{n:T}macro_rules!impl_exp_bits_for_uint{($($t:ty)*)=>{$(impl Iterator for Bits<$t>{type Item=bool;fn next(&mut self)->Option{if self.n==0{None}else{let bit=(self.n&1)==1;self.n>>=1;Some(bit)}}}impl ExpBits for$t{type Iter=Bits<$t>;fn bits(self)->Self::Iter{Bits{n:self}}}impl SignedExpBits for$t{type T=$t;fn neg_and_bits(self)->(bool,Self::T){(false,self)}})*};}impl_exp_bits_for_uint!(u8 u16 u32 u64 u128 usize);macro_rules!impl_signed_exp_bits_for_sint{($($s:ty,$u:ty;)*)=>{$(impl SignedExpBits for$s{type T=$u;fn neg_and_bits(self)->(bool,Self::T){(self<0,self.unsigned_abs())}})*};}impl_signed_exp_bits_for_sint!(i8,u8;i16,u16;i32,u32;i64,u64;i128,u128;isize,usize;);#[doc=" associative binary operation and an identity element"]pub trait Monoid:SemiGroup+Unital{#[doc=" binary exponentiation: $x^n = x\\circ\\ddots\\circ x$"]fn pow(mut x:Self::T,exp:E)->Self::T where E:ExpBits{let mut bits=exp.bits();let Some(first)=bits.next()else{return Self::unit();};let mut res=if first{x.clone()}else{Self::unit()};for bit in bits{x=Self::operate(&x,&x);if bit{res=Self::operate(&res,&x);}}res}fn fold(iter:I)->Self::T where I:IntoIterator{let mut iter=iter.into_iter();if let Some(item)=iter.next(){iter.fold(item,|acc,x|Self::operate(&acc,&x))}else{Self::unit()}}}implMonoid for M where M:SemiGroup+Unital{}#[doc=" $\\exists e \\in T, \\forall a \\in T, \\exists b,c \\in T, b \\circ a = a \\circ c = e$"]pub trait Invertible:Magma+Unital{#[doc=" $a$ where $a \\circ x = e$"]fn inverse(x:&Self::T)->Self::T;fn rinv_operate(x:&Self::T,y:&Self::T)->Self::T{Self::operate(x,&Self::inverse(y))}fn rinv_operate_assign(x:&mut Self::T,y:&Self::T){*x=Self::rinv_operate(x,y);}}#[doc=" associative binary operation and an identity element and inverse elements"]pub trait Group:Monoid+Invertible{fn signed_pow(x:Self::T,exp:E)->Self::T where E:SignedExpBits{let(neg,exp)=E::neg_and_bits(exp);let res=Self::pow(x,exp);if neg{Self::inverse(&res)}else{res}}}implGroup for G where G:Monoid+Invertible{}#[doc=" $\\forall a,\\forall b \\in T, a \\circ b = b \\circ a$"]pub trait Commutative:Magma{}#[doc=" commutative monoid"]pub trait AbelianMonoid:Monoid+Commutative{}implAbelianMonoid for M where M:Monoid+Commutative{}#[doc=" commutative group"]pub trait AbelianGroup:Group+Commutative{}implAbelianGroup for G where G:Group+Commutative{}#[doc=" $\\forall a \\in T, a \\circ a = a$"]pub trait Idempotent:Magma{}#[doc=" idempotent monoid"]pub trait IdempotentMonoid:Monoid+Idempotent{}implIdempotentMonoid for M where M:Monoid+Idempotent{}#[macro_export]macro_rules!monoid_fold{($m:ty)=>{<$m as Unital>::unit()};($m:ty,)=>{<$m as Unital>::unit()};($m:ty,$f:expr)=>{$f};($m:ty,$f:expr,$($ff:expr),*)=>{<$m as Magma>::operate(&($f),&monoid_fold!($m,$($ff),*))};}#[macro_export]macro_rules!define_monoid{($Name:ident,$t:ty,|$x:ident,$y:ident|$op:expr,$unit:expr)=>{struct$Name;impl Magma for$Name{type T=$t;fn operate($x:&Self::T,$y:&Self::T)->Self::T{$op}}impl Unital for$Name{fn unit()->Self::T{$unit}}impl Associative for$Name{}};}} // codesnip-guard: bounded #[cfg_attr(any(),rustfmt::skip)]pub use self::bounded::Bounded;#[cfg_attr(any(),rustfmt::skip)]mod bounded{#[doc=" Trait for max/min bounds"]pub trait Bounded:Sized+PartialOrd{fn maximum()->Self;fn minimum()->Self;fn is_maximum(&self)->bool{self==&Self::maximum()}fn is_minimum(&self)->bool{self==&Self::minimum()}fn set_maximum(&mut self){*self=Self::maximum()}fn set_minimum(&mut self){*self=Self::minimum()}}macro_rules!impl_bounded_num{($($t:ident)*)=>{$(impl Bounded for$t{fn maximum()->Self{$t::MAX}fn minimum()->Self{$t::MIN}})*};}impl_bounded_num!(u8 u16 u32 u64 u128 usize i8 i16 i32 i64 i128 isize f32 f64);macro_rules!impl_bounded_tuple{(@impl$($T:ident)*)=>{impl<$($T:Bounded),*>Bounded for($($T,)*){fn maximum()->Self{($(<$T as Bounded>::maximum(),)*)}fn minimum()->Self{($(<$T as Bounded>::minimum(),)*)}}};(@inner$($T:ident)*,)=>{impl_bounded_tuple!(@impl$($T)*);};(@inner$($T:ident)*,$U:ident$($Rest:ident)*)=>{impl_bounded_tuple!(@impl$($T)*);impl_bounded_tuple!(@inner$($T)*$U,$($Rest)*);};($T:ident$($Rest:ident)*)=>{impl_bounded_tuple!(@inner$T,$($Rest)*);};}impl_bounded_tuple!(A B C D E F G H I J);impl Bounded for(){fn maximum()->Self{}fn minimum()->Self{}}impl Bounded for bool{fn maximum()->Self{true}fn minimum()->Self{false}}implBounded for Optionwhere T:Bounded{fn maximum()->Self{Some(::maximum())}fn minimum()->Self{None}}implBounded for std::cmp::Reversewhere T:Bounded{fn maximum()->Self{std::cmp::Reverse(::minimum())}fn minimum()->Self{std::cmp::Reverse(::maximum())}}} // codesnip-guard: discrete_steps #[cfg_attr(any(),rustfmt::skip)]pub use self::discrete_steps::{DiscreteSteps,RangeBoundsExt};#[cfg_attr(any(),rustfmt::skip)]mod discrete_steps{use super::Bounded;use std::{convert::TryFrom,ops::{Bound,Range,RangeBounds,RangeInclusive}};pub trait DiscreteSteps:Clone{fn delta()->Delta;fn steps_between(start:&Self,end:&Self)->Option;fn forward_checked(start:Self,delta:Delta)->Option;fn backward_checked(start:Self,delta:Delta)->Option;fn forward(start:Self,delta:Delta)->Self{Self::forward_checked(start,delta).expect("overflow in `DiscreteSteps::forward`")}fn backward(start:Self,delta:Delta)->Self{Self::backward_checked(start,delta).expect("overflow in `DiscreteSteps::backward`")}fn forward_delta_checked(start:Self)->Option{Self::forward_checked(start,Self::delta())}fn backward_delta_checked(start:Self)->Option{Self::backward_checked(start,Self::delta())}fn forward_delta(start:Self)->Self{Self::forward(start,Self::delta())}fn backward_delta(start:Self)->Self{Self::backward(start,Self::delta())}}macro_rules!impl_discrete_steps_integer{(@common$u_source:ident)=>{fn delta()->$u_source{1}fn forward(start:Self,delta:$u_source)->Self{assert!(Self::forward_checked(start,delta).is_some(),"attempt to add with overflow");start.wrapping_add(delta as Self)}fn backward(start:Self,delta:$u_source)->Self{assert!(Self::backward_checked(start,delta).is_some(),"attempt to subtract with overflow");start.wrapping_sub(delta as Self)}};($u_source:ident$i_source:ident;$($u_narrower:ident$i_narrower:ident),*;$($u_wider:ident$i_wider:ident),*)=>{$(impl DiscreteSteps<$u_source>for$u_narrower{impl_discrete_steps_integer!(@common$u_source);fn steps_between(start:&Self,end:&Self)->Option<$u_source>{if*start<=*end{$u_source::try_from(*end-*start).ok()}else{None}}fn forward_checked(start:Self,delta:$u_source)->Option{Self::try_from(delta).ok().and_then(|delta|start.checked_add(delta))}fn backward_checked(start:Self,delta:$u_source)->Option{Self::try_from(delta).ok().and_then(|delta|start.checked_sub(delta))}}impl DiscreteSteps<$u_source>for$i_narrower{impl_discrete_steps_integer!(@common$u_source);fn steps_between(start:&Self,end:&Self)->Option<$u_source>{if*start<=*end{$u_source::try_from(end.abs_diff(*start)).ok()}else{None}}fn forward_checked(start:Self,delta:$u_source)->Option{$u_narrower::try_from(delta).ok().and_then(|delta|{let wrapped=start.wrapping_add(delta as Self);if wrapped>=start{Some(wrapped)}else{None}})}fn backward_checked(start:Self,delta:$u_source)->Option{$u_narrower::try_from(delta).ok().and_then(|delta|{let wrapped=start.wrapping_sub(delta as Self);if wrapped<=start{Some(wrapped)}else{None}})}})*$(impl DiscreteSteps<$u_source>for$u_wider{impl_discrete_steps_integer!(@common$u_source);fn steps_between(start:&Self,end:&Self)->Option<$u_source>{if*start<=*end{$u_source::try_from(*end-*start).ok()}else{None}}fn forward_checked(start:Self,delta:$u_source)->Option{start.checked_add(delta as Self)}fn backward_checked(start:Self,delta:$u_source)->Option{start.checked_sub(delta as Self)}}impl DiscreteSteps<$u_source>for$i_wider{impl_discrete_steps_integer!(@common$u_source);fn steps_between(start:&Self,end:&Self)->Option<$u_source>{if*start<=*end{end.checked_sub(*start).and_then(|result|$u_source::try_from(result).ok())}else{None}}fn forward_checked(start:Self,delta:$u_source)->Option{start.checked_add(delta as Self)}fn backward_checked(start:Self,delta:$u_source)->Option{start.checked_sub(delta as Self)}})*};}impl_discrete_steps_integer!(u16 i16;u8 i8,u16 i16,usize isize;u32 i32,u64 i64,u128 i128);impl_discrete_steps_integer!(u32 i32;u8 i8,u16 i16,u32 i32,usize isize;u64 i64,u128 i128);impl_discrete_steps_integer!(u64 i64;u8 i8,u16 i16,u32 i32,u64 i64,usize isize;u128 i128);impl_discrete_steps_integer!(u128 i128;u8 i8,u16 i16,u32 i32,u64 i64,u128 i128,usize isize;);impl_discrete_steps_integer!(usize isize;u8 i8,u16 i16,u32 i32,u64 i64,usize isize;u128 i128);pub trait RangeBoundsExt{fn start_bound_included_checked(&self)->Option;fn start_bound_excluded_checked(&self)->Option;fn end_bound_included_checked(&self)->Option;fn end_bound_excluded_checked(&self)->Option;fn start_bound_included(&self)->T;fn start_bound_excluded(&self)->T;fn end_bound_included(&self)->T;fn end_bound_excluded(&self)->T;fn start_bound_included_bounded(&self,lb:T)->Optionwhere T:Ord;fn start_bound_excluded_bounded(&self,lb:T)->Optionwhere T:Ord;fn end_bound_included_bounded(&self,ub:T)->Optionwhere T:Ord;fn end_bound_excluded_bounded(&self,ub:T)->Optionwhere T:Ord;fn to_range_checked(&self)->Option>{match(self.start_bound_included_checked(),self.end_bound_excluded_checked()){(Some(start),Some(end))=>Some(start..end),_=>None,}}fn to_range(&self)->Range{self.start_bound_included()..self.end_bound_excluded()}fn to_range_bounded(&self,min:T,max:T)->Option>where T:Ord{Some(self.start_bound_included_bounded(min)?..self.end_bound_excluded_bounded(max)?)}fn to_range_inclusive_checked(&self)->Option>{match(self.start_bound_included_checked(),self.end_bound_included_checked()){(Some(start),Some(end))=>Some(start..=end),_=>None,}}fn to_range_inclusive(&self)->RangeInclusive{self.start_bound_included()..=self.end_bound_included()}fn to_range_inclusive_bounded(&self,min:T,max:T)->Option>where T:Ord{Some(self.start_bound_included_bounded(min)?..=self.end_bound_included_bounded(max)?)}}macro_rules!impl_range_bounds_ext{($($source:ident=>$($target:ident)+);*$(;)?)=>{$($(implRangeBoundsExt<$target>for R where R:RangeBounds<$target>,{fn start_bound_included_checked(&self)->Option<$target>{match self.start_bound(){Bound::Included(x)=>Some(*x),Bound::Excluded(x)=>DiscreteSteps::<$source>::forward_delta_checked(*x),Bound::Unbounded=>Some(Bounded::minimum()),}}fn start_bound_excluded_checked(&self)->Option<$target>{match self.start_bound(){Bound::Included(x)=>DiscreteSteps::<$source>::backward_delta_checked(*x),Bound::Excluded(x)=>Some(*x),Bound::Unbounded=>None,}}fn end_bound_included_checked(&self)->Option<$target>{match self.end_bound(){Bound::Included(x)=>Some(*x),Bound::Excluded(x)=>DiscreteSteps::<$source>::backward_delta_checked(*x),Bound::Unbounded=>Some(Bounded::maximum()),}}fn end_bound_excluded_checked(&self)->Option<$target>{match self.end_bound(){Bound::Included(x)=>DiscreteSteps::<$source>::forward_delta_checked(*x),Bound::Excluded(x)=>Some(*x),Bound::Unbounded=>None,}}fn start_bound_included(&self)->$target{match self.start_bound(){Bound::Included(x)=>*x,Bound::Excluded(x)=>DiscreteSteps::<$source>::forward_delta(*x),Bound::Unbounded=>Bounded::minimum(),}}fn start_bound_excluded(&self)->$target{match self.start_bound(){Bound::Included(x)=>DiscreteSteps::<$source>::backward_delta(*x),Bound::Excluded(x)=>*x,Bound::Unbounded=>DiscreteSteps::<$source>::backward_delta(Bounded::minimum()),}}fn end_bound_included(&self)->$target{match self.end_bound(){Bound::Included(x)=>*x,Bound::Excluded(x)=>DiscreteSteps::<$source>::backward_delta(*x),Bound::Unbounded=>Bounded::maximum(),}}fn end_bound_excluded(&self)->$target{match self.end_bound(){Bound::Included(x)=>DiscreteSteps::<$source>::forward_delta(*x),Bound::Excluded(x)=>*x,Bound::Unbounded=>DiscreteSteps::<$source>::forward_delta(Bounded::maximum()),}}fn start_bound_included_bounded(&self,lb:$target)->Option<$target>where$target:Ord{match self.start_bound(){Bound::Included(x)=>Some(*x).filter(|&x|lb<=x),Bound::Excluded(x)=>DiscreteSteps::<$source>::forward_delta_checked(*x).filter(|&x|lb<=x),Bound::Unbounded=>Some(lb),}}fn start_bound_excluded_bounded(&self,lb:$target)->Option<$target>where$target:Ord{match self.start_bound(){Bound::Included(x)=>DiscreteSteps::<$source>::backward_delta_checked(*x).filter(|&x|lb<=x),Bound::Excluded(x)=>Some(*x).filter(|&x|lb<=x),Bound::Unbounded=>Some(lb),}}fn end_bound_included_bounded(&self,ub:$target)->Option<$target>where$target:Ord{match self.end_bound(){Bound::Included(x)=>Some(*x).filter(|&x|x<=ub),Bound::Excluded(x)=>DiscreteSteps::<$source>::backward_delta_checked(*x).filter(|&x|x<=ub),Bound::Unbounded=>Some(ub),}}fn end_bound_excluded_bounded(&self,ub:$target)->Option<$target>where$target:Ord{match self.end_bound(){Bound::Included(x)=>DiscreteSteps::<$source>::forward_delta_checked(*x).filter(|&x|x<=ub),Bound::Excluded(x)=>Some(*x).filter(|&x|x<=ub),Bound::Unbounded=>Some(ub),}}})+)*};}impl_range_bounds_ext!(u16=>u8 i8 u16 i16;u32=>u32 i32;u64=>u64 i64;u128=>u128 i128;usize=>isize usize;);}