feat(solc): add source map parser (#658)

* feat(solc): add source map parser

* merge branch master

* make some types private

* chore: make id an option

* fix: support negative field values

* check parsed element
This commit is contained in:
Matthias Seitz 2022-01-06 12:54:46 +01:00 committed by GitHub
parent 10f014bd6c
commit 88b342287a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 569 additions and 1 deletions

View File

@ -11,7 +11,13 @@ use std::{
str::FromStr, str::FromStr,
}; };
use crate::{compile::*, error::SolcIoError, remappings::Remapping, utils}; use crate::{
compile::*,
error::SolcIoError,
remappings::Remapping,
sourcemap::{self, SourceMap, SyntaxError},
utils,
};
use ethers_core::abi::Address; use ethers_core::abi::Address;
use serde::{de::Visitor, Deserialize, Deserializer, Serialize, Serializer}; use serde::{de::Visitor, Deserialize, Deserializer, Serialize, Serializer};
@ -813,6 +819,13 @@ pub struct Bytecode {
} }
impl Bytecode { impl Bytecode {
/// Returns the parsed source map
///
/// See also https://docs.soliditylang.org/en/v0.8.10/internals/source_mappings.html
pub fn source_map(&self) -> Option<Result<SourceMap, SyntaxError>> {
self.source_map.as_ref().map(|map| sourcemap::parse(map))
}
/// Same as `Bytecode::link` but with fully qualified name (`file.sol:Math`) /// Same as `Bytecode::link` but with fully qualified name (`file.sol:Math`)
pub fn link_fully_qualified(&mut self, name: impl AsRef<str>, addr: Address) -> bool { pub fn link_fully_qualified(&mut self, name: impl AsRef<str>, addr: Address) -> bool {
if let Some((file, lib)) = name.as_ref().split_once(':') { if let Some((file, lib)) = name.as_ref().split_once(':') {

View File

@ -1,6 +1,7 @@
#![doc = include_str ! ("../README.md")] #![doc = include_str ! ("../README.md")]
pub mod artifacts; pub mod artifacts;
pub mod sourcemap;
pub use artifacts::{CompilerInput, CompilerOutput, EvmVersion}; pub use artifacts::{CompilerInput, CompilerOutput, EvmVersion};
use std::collections::btree_map::Entry; use std::collections::btree_map::Entry;

View File

@ -0,0 +1,528 @@
use std::{fmt, fmt::Write, iter::Peekable, str::CharIndices};
type Spanned<Token, Loc, Error> = Result<(Token, Loc), Error>;
macro_rules! syntax_err {
($msg:expr) => {{
Err(SyntaxError::new($msg))
}};
($msg:expr, $($tt:tt)*) => {{
Err(SyntaxError::new(format!($msg, $($tt)*)))
}};
}
/// An error that can happen during source map parsing.
#[derive(Debug, Clone, thiserror::Error)]
#[error("{0}")]
pub struct SyntaxError(String);
impl SyntaxError {
pub fn new(s: impl Into<String>) -> Self {
SyntaxError(s.into())
}
}
#[derive(PartialEq)]
enum Token<'a> {
Number(&'a str),
Semicolon,
Colon,
/// `i` which represents an instruction that goes into a function
In,
/// `o` which represents an instruction that returns from a function
Out,
/// `-` regular jump
Regular,
}
impl<'a> fmt::Debug for Token<'a> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Token::Number(s) => write!(f, "NUMBER({:?})", s),
Token::Semicolon => write!(f, "SEMICOLON"),
Token::Colon => write!(f, "COLON"),
Token::In => write!(f, "JMP(i)"),
Token::Out => write!(f, "JMP(o)"),
Token::Regular => write!(f, "JMP(-)"),
}
}
}
impl<'a> fmt::Display for Token<'a> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Token::Number(_) => write!(f, "number"),
Token::Semicolon => write!(f, "`;`"),
Token::Colon => write!(f, "`:`"),
Token::In => write!(f, "jmp-in"),
Token::Out => write!(f, "jmp-out"),
Token::Regular => write!(f, "jmp"),
}
}
}
struct TokenStream<'input> {
input: &'input str,
chars: Peekable<CharIndices<'input>>,
}
impl<'input> TokenStream<'input> {
pub fn new(input: &'input str) -> TokenStream<'input> {
TokenStream { chars: input.char_indices().peekable(), input }
}
fn number(
&mut self,
start: usize,
mut end: usize,
) -> Option<Spanned<Token<'input>, usize, SyntaxError>> {
loop {
if let Some((_, ch)) = self.chars.peek().cloned() {
if !ch.is_ascii_digit() {
break
}
self.chars.next();
end += 1;
} else {
end = self.input.len();
break
}
}
Some(Ok((Token::Number(&self.input[start..end]), start)))
}
}
impl<'input> Iterator for TokenStream<'input> {
type Item = Spanned<Token<'input>, usize, SyntaxError>;
fn next(&mut self) -> Option<Self::Item> {
match self.chars.next()? {
(i, ';') => Some(Ok((Token::Semicolon, i))),
(i, ':') => Some(Ok((Token::Colon, i))),
(i, 'i') => Some(Ok((Token::In, i))),
(i, 'o') => Some(Ok((Token::Out, i))),
(start, '-') => match self.chars.peek() {
Some((_, ch)) if ch.is_ascii_digit() => {
self.chars.next();
self.number(start, start + 2)
}
_ => Some(Ok((Token::Regular, start))),
},
(start, ch) if ch.is_ascii_digit() => self.number(start, start + 1),
(i, c) => Some(syntax_err!("Unexpected input {} at {}", c, i)),
}
}
}
#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
pub enum Jump {
/// A jump instruction that goes into a function
In,
/// A jump represents an instruction that returns from a function
Out,
/// A regular jump instruction
Regular,
}
impl AsRef<str> for Jump {
fn as_ref(&self) -> &str {
match self {
Jump::In => "i",
Jump::Out => "o",
Jump::Regular => "-",
}
}
}
impl<'a> fmt::Display for Jump {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.as_ref())
}
}
/// Represents a whole source map as list of `SourceElement`s
///
/// See also https://docs.soliditylang.org/en/latest/internals/source_mappings.html#source-mappings
pub type SourceMap = Vec<SourceElement>;
/// Represents a single element in the source map
/// A solidity source map entry takes the following form
///
/// before 0.6.0
/// s:l:f:j
///
/// after 0.6.0
/// s:l:f:j:m
///
/// Where s is the byte-offset to the start of the range in the source file, l is the length of the
/// source range in bytes and f is the source index.
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct SourceElement {
/// The byte-offset to the start of the range in the source file
pub offset: usize,
/// The length of the source range in bytes
pub length: usize,
/// the source index
///
/// Note: In the case of instructions that are not associated with any particular source file,
/// the source mapping assigns an integer identifier of -1. This may happen for bytecode
/// sections stemming from compiler-generated inline assembly statements.
/// This case is represented as a `None` value
pub index: Option<u32>,
/// Jump instruction
pub jump: Jump,
/// “modifier depth”. This depth is increased whenever the placeholder statement (_) is entered
/// in a modifier and decreased when it is left again.
pub modifier_depth: usize,
}
impl<'a> fmt::Display for SourceElement {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"{}:{}:{}:{}:{}",
self.offset,
self.length,
self.index.map(|i| i as i64).unwrap_or(-1),
self.jump,
self.modifier_depth
)
}
}
#[derive(Default)]
struct SourceElementBuilder {
pub offset: Option<usize>,
pub length: Option<usize>,
pub index: Option<Option<u32>>,
pub jump: Option<Jump>,
pub modifier_depth: Option<usize>,
}
impl<'a> fmt::Display for SourceElementBuilder {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if self.offset.is_none() &&
self.length.is_none() &&
self.index.is_none() &&
self.jump.is_none() &&
self.modifier_depth.is_none()
{
return Ok(())
}
if let Some(s) = self.offset {
if self.index == Some(None) {
f.write_str("-1")?;
} else {
s.fmt(f)?;
}
}
if self.length.is_none() &&
self.index.is_none() &&
self.jump.is_none() &&
self.modifier_depth.is_none()
{
return Ok(())
}
f.write_char(':')?;
if let Some(s) = self.length {
if self.index == Some(None) {
f.write_str("-1")?;
} else {
s.fmt(f)?;
}
}
if self.index.is_none() && self.jump.is_none() && self.modifier_depth.is_none() {
return Ok(())
}
f.write_char(':')?;
if let Some(s) = self.index {
let s = s.map(|s| s as i64).unwrap_or(-1);
s.fmt(f)?;
}
if self.jump.is_none() && self.modifier_depth.is_none() {
return Ok(())
}
f.write_char(':')?;
if let Some(s) = self.jump {
s.fmt(f)?;
}
if self.modifier_depth.is_none() {
return Ok(())
}
f.write_char(':')?;
if let Some(s) = self.modifier_depth {
if self.index == Some(None) {
f.write_str("-1")?;
} else {
s.fmt(f)?;
}
}
Ok(())
}
}
impl SourceElementBuilder {
fn finish(self, prev: Option<SourceElement>) -> Result<SourceElement, SyntaxError> {
let element = if let Some(prev) = prev {
SourceElement {
offset: self.offset.unwrap_or(prev.offset),
length: self.length.unwrap_or(prev.length),
index: self.index.unwrap_or(prev.index),
jump: self.jump.unwrap_or(prev.jump),
modifier_depth: self.modifier_depth.unwrap_or(prev.modifier_depth),
}
} else {
SourceElement {
offset: self.offset.ok_or_else(|| SyntaxError::new("No previous offset"))?,
length: self.length.ok_or_else(|| SyntaxError::new("No previous length"))?,
index: self.index.ok_or_else(|| SyntaxError::new("No previous index"))?,
jump: self.jump.ok_or_else(|| SyntaxError::new("No previous jump"))?,
modifier_depth: self.modifier_depth.unwrap_or_default(),
}
};
Ok(element)
}
fn set_jmp(&mut self, jmp: Jump, i: usize) -> Option<SyntaxError> {
if self.jump.is_some() {
return Some(SyntaxError::new(format!("Jump already set: {}", i)))
}
self.jump = Some(jmp);
None
}
fn set_offset(&mut self, offset: usize, i: usize) -> Option<SyntaxError> {
if self.offset.is_some() {
return Some(SyntaxError::new(format!("Offset already set: {}", i)))
}
self.offset = Some(offset);
None
}
fn set_length(&mut self, length: usize, i: usize) -> Option<SyntaxError> {
if self.length.is_some() {
return Some(SyntaxError::new(format!("Length already set: {}", i)))
}
self.length = Some(length);
None
}
fn set_index(&mut self, index: Option<u32>, i: usize) -> Option<SyntaxError> {
if self.index.is_some() {
return Some(SyntaxError::new(format!("Index already set: {}", i)))
}
self.index = Some(index);
None
}
fn set_modifier(&mut self, modifier_depth: usize, i: usize) -> Option<SyntaxError> {
if self.modifier_depth.is_some() {
return Some(SyntaxError::new(format!("Modifier depth already set: {}", i)))
}
self.modifier_depth = Some(modifier_depth);
None
}
}
pub struct Parser<'input> {
stream: TokenStream<'input>,
last_element: Option<SourceElement>,
done: bool,
#[cfg(test)]
output: Option<&'input mut dyn Write>,
}
impl<'input> Parser<'input> {
pub fn new(input: &'input str) -> Self {
Self {
stream: TokenStream::new(input),
last_element: None,
done: false,
#[cfg(test)]
output: None,
}
}
}
macro_rules! parse_number {
($num:expr, $pos:expr) => {{
let num = match $num.parse::<i64>() {
Ok(num) => num,
Err(_) => {
return Some(syntax_err!(
"Expected {} to be a `{}` at {}",
$num,
stringify!($t),
$pos
))
}
};
match num {
i if i < -1 => {
return Some(syntax_err!("Unexpected negative identifier of `{}` at {}", i, $pos))
}
-1 => None,
i => Some(i as u32),
}
}};
}
macro_rules! bail_opt {
($opt:stmt) => {
if let Some(err) = { $opt } {
return Some(Err(err))
}
};
}
impl<'input> Iterator for Parser<'input> {
type Item = Result<SourceElement, SyntaxError>;
fn next(&mut self) -> Option<Self::Item> {
// start parsing at the offset state, `s`
let mut state = State::Offset;
let mut builder = SourceElementBuilder::default();
loop {
match self.stream.next() {
Some(Ok((token, pos))) => match token {
Token::Semicolon => break,
Token::Number(num) => match state {
State::Offset => {
bail_opt!(builder.set_offset(
parse_number!(num, pos).unwrap_or_default() as usize,
pos
))
}
State::Length => {
bail_opt!(builder.set_length(
parse_number!(num, pos).unwrap_or_default() as usize,
pos
))
}
State::Index => {
bail_opt!(builder.set_index(parse_number!(num, pos), pos))
}
State::Modifier => {
bail_opt!(builder.set_modifier(
parse_number!(num, pos).unwrap_or_default() as usize,
pos
))
}
State::Jmp => {
return Some(syntax_err!("Expected Jump found number at {}", pos))
}
},
Token::Colon => {
bail_opt!(state.advance(pos))
}
Token::In => {
bail_opt!(builder.set_jmp(Jump::In, pos))
}
Token::Out => {
bail_opt!(builder.set_jmp(Jump::Out, pos))
}
Token::Regular => {
bail_opt!(builder.set_jmp(Jump::Regular, pos))
}
},
Some(Err(err)) => return Some(Err(err)),
None => {
if self.done {
return None
}
self.done = true;
break
}
}
}
#[cfg(test)]
{
if let Some(out) = self.output.as_mut() {
if self.last_element.is_some() {
let _ = out.write_char(';');
}
let _ = out.write_str(&builder.to_string());
}
}
let element = match builder.finish(self.last_element.take()) {
Ok(element) => {
self.last_element = Some(element.clone());
Ok(element)
}
Err(err) => Err(err),
};
Some(element)
}
}
/// State machine to keep track of separating `:`
#[derive(Clone, PartialEq, Eq, Copy)]
enum State {
// s
Offset,
// l
Length,
// f
Index,
// j
Jmp,
// m
Modifier,
}
impl State {
fn advance(&mut self, i: usize) -> Option<SyntaxError> {
match self {
State::Offset => *self = State::Length,
State::Length => *self = State::Index,
State::Index => *self = State::Jmp,
State::Jmp => *self = State::Modifier,
State::Modifier => return Some(SyntaxError::new(format!("unexpected colon at {}", i))),
}
None
}
}
/// Parses a source map
pub fn parse(input: &str) -> Result<SourceMap, SyntaxError> {
Parser::new(input).collect()
}
#[cfg(test)]
mod tests {
use super::*;
#[allow(unused)]
fn tokenize(s: &str) -> Vec<Spanned<Token, usize, SyntaxError>> {
TokenStream::new(s).collect()
}
#[test]
fn can_parse_source_maps() {
// all source maps from the compiler output test data
let source_maps = include_str!("../test-data/out-source-maps.txt");
for (line, s) in source_maps.lines().enumerate() {
parse(s).unwrap_or_else(|_| panic!("Failed to parse line {}", line));
}
}
#[test]
fn can_parse_foundry_cheatcodes_sol_maps() {
let s = include_str!("../test-data/cheatcodes.sol-sourcemap.txt");
let mut out = String::new();
let mut parser = Parser::new(s);
parser.output = Some(&mut out);
let _map = parser.collect::<Result<SourceMap, _>>().unwrap();
assert_eq!(out, s);
}
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,25 @@
25:64:0:-;;;47:40;8:9:-1;5:2;;;30:1;27;20:12;5:2;47:40:0;74:8;;
93:467:0:-:0;;;146:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;193:60;;;;;;;;;;;;;;;;;;243:9;193:11;;;;;:60;;:::i;:::-;274:9;263:8;:20;;;;;;;;;;;;:::i;:::-;;146:144;93:467;;6021:141:1;6088:70;6150:2;6154;6104:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6088:15;;;:70;;:::i;:::-;6021:141;;:::o;176:288::-;240:21;264:7;:14;240:38;;282:22;129:42;282:40;;373:2;364:7;360:16;455:1;452;437:13;423:12;407:14;400:5;389:68;335:126;;;;;:::o;93:467:0:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:354:2:-;96:5;121:66;137:49;179:6;137:49;:::i;:::-;121:66;:::i;:::-;112:75;;210:6;203:5;196:21;248:4;241:5;237:16;286:3;277:6;272:3;268:16;265:25;262:2;;;303:1;300;293:12;262:2;316:39;348:6;343:3;338;316:39;:::i;:::-;102:259;;;;;;:::o;381:288::-;448:5;497:3;490:4;482:6;478:17;474:27;464:2;;515:1;512;505:12;464:2;548:6;542:13;573:90;659:3;651:6;644:4;636:6;632:17;573:90;:::i;:::-;564:99;;454:215;;;;;:::o;675:390::-;755:6;804:2;792:9;783:7;779:23;775:32;772:2;;;820:1;817;810:12;772:2;884:1;873:9;869:17;863:24;914:18;906:6;903:30;900:2;;;946:1;943;936:12;900:2;974:74;1040:7;1031:6;1020:9;1016:22;974:74;:::i;:::-;964:84;;834:224;762:303;;;;:::o;1071:364::-;1159:3;1187:39;1220:5;1187:39;:::i;:::-;1242:71;1306:6;1301:3;1242:71;:::i;:::-;1235:78;;1322:52;1367:6;1362:3;1355:4;1348:5;1344:16;1322:52;:::i;:::-;1399:29;1421:6;1399:29;:::i;:::-;1394:3;1390:39;1383:46;;1163:272;;;;;:::o;1441:514::-;1602:4;1640:2;1629:9;1625:18;1617:26;;1689:9;1683:4;1679:20;1675:1;1664:9;1660:17;1653:47;1717:78;1790:4;1781:6;1717:78;:::i;:::-;1709:86;;1842:9;1836:4;1832:20;1827:2;1816:9;1812:18;1805:48;1870:78;1943:4;1934:6;1870:78;:::i;:::-;1862:86;;1607:348;;;;;:::o;1961:129::-;1995:6;2022:20;;:::i;:::-;2012:30;;2051:33;2079:4;2071:6;2051:33;:::i;:::-;2002:88;;;:::o;2096:75::-;2129:6;2162:2;2156:9;2146:19;;2136:35;:::o;2177:308::-;2239:4;2329:18;2321:6;2318:30;2315:2;;;2351:18;;:::i;:::-;2315:2;2389:29;2411:6;2389:29;:::i;:::-;2381:37;;2473:4;2467;2463:15;2455:23;;2244:241;;;:::o;2491:99::-;2543:6;2577:5;2571:12;2561:22;;2550:40;;;:::o;2596:169::-;2680:11;2714:6;2709:3;2702:19;2754:4;2749:3;2745:14;2730:29;;2692:73;;;;:::o;2771:307::-;2839:1;2849:113;2863:6;2860:1;2857:13;2849:113;;;2948:1;2943:3;2939:11;2933:18;2929:1;2924:3;2920:11;2913:39;2885:2;2882:1;2878:10;2873:15;;2849:113;;;2980:6;2977:1;2974:13;2971:2;;;3060:1;3051:6;3046:3;3042:16;3035:27;2971:2;2820:258;;;;:::o;3084:320::-;3128:6;3165:1;3159:4;3155:12;3145:22;;3212:1;3206:4;3202:12;3233:18;3223:2;;3289:4;3281:6;3277:17;3267:27;;3223:2;3351;3343:6;3340:14;3320:18;3317:38;3314:2;;;3370:18;;:::i;:::-;3314:2;3135:269;;;;:::o;3410:281::-;3493:27;3515:4;3493:27;:::i;:::-;3485:6;3481:40;3623:6;3611:10;3608:22;3587:18;3575:10;3572:34;3569:62;3566:2;;;3634:18;;:::i;:::-;3566:2;3674:10;3670:2;3663:22;3453:238;;;:::o;3697:180::-;3745:77;3742:1;3735:88;3842:4;3839:1;3832:15;3866:4;3863:1;3856:15;3883:180;3931:77;3928:1;3921:88;4028:4;4025:1;4018:15;4052:4;4049:1;4042:15;4069:102;4110:6;4161:2;4157:7;4152:2;4145:5;4141:14;4137:28;4127:38;;4117:54;;;:::o;93:467:0:-;;;;;;;
67:61980:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
147:1787:0:-:0;;;261:628;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;299:80;312:66;299:80;;:12;;;:80;;:::i;:::-;398;411:66;398:80;;:12;;;:80;;:::i;:::-;500;513:66;500:80;;:12;;;:80;;:::i;:::-;599:60;;;;;;;;;;;;;;;;;;649:9;599:11;;;;;:60;;:::i;:::-;661:80;674:66;661:80;;:12;;;:80;;:::i;:::-;763;776:66;763:80;;:12;;;:80;;:::i;:::-;873:9;862:8;:20;;;;;;;;;;;;:::i;:::-;;261:628;147:1787;;166:59;;:::o;6021:141:1:-;6088:70;6150:2;6154;6104:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6088:15;;;:70;;:::i;:::-;6021:141;;:::o;176:288::-;240:21;264:7;:14;240:38;;282:22;129:42;282:40;;373:2;364:7;360:16;455:1;452;437:13;423:12;407:14;400:5;389:68;335:126;;;;;:::o;147:1787:0:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:354:2:-;96:5;121:66;137:49;179:6;137:49;:::i;:::-;121:66;:::i;:::-;112:75;;210:6;203:5;196:21;248:4;241:5;237:16;286:3;277:6;272:3;268:16;265:25;262:2;;;303:1;300;293:12;262:2;316:39;348:6;343:3;338;316:39;:::i;:::-;102:259;;;;;;:::o;381:288::-;448:5;497:3;490:4;482:6;478:17;474:27;464:2;;515:1;512;505:12;464:2;548:6;542:13;573:90;659:3;651:6;644:4;636:6;632:17;573:90;:::i;:::-;564:99;;454:215;;;;;:::o;675:390::-;755:6;804:2;792:9;783:7;779:23;775:32;772:2;;;820:1;817;810:12;772:2;884:1;873:9;869:17;863:24;914:18;906:6;903:30;900:2;;;946:1;943;936:12;900:2;974:74;1040:7;1031:6;1020:9;1016:22;974:74;:::i;:::-;964:84;;834:224;762:303;;;;:::o;1071:364::-;1159:3;1187:39;1220:5;1187:39;:::i;:::-;1242:71;1306:6;1301:3;1242:71;:::i;:::-;1235:78;;1322:52;1367:6;1362:3;1355:4;1348:5;1344:16;1322:52;:::i;:::-;1399:29;1421:6;1399:29;:::i;:::-;1394:3;1390:39;1383:46;;1163:272;;;;;:::o;1441:514::-;1602:4;1640:2;1629:9;1625:18;1617:26;;1689:9;1683:4;1679:20;1675:1;1664:9;1660:17;1653:47;1717:78;1790:4;1781:6;1717:78;:::i;:::-;1709:86;;1842:9;1836:4;1832:20;1827:2;1816:9;1812:18;1805:48;1870:78;1943:4;1934:6;1870:78;:::i;:::-;1862:86;;1607:348;;;;;:::o;1961:129::-;1995:6;2022:20;;:::i;:::-;2012:30;;2051:33;2079:4;2071:6;2051:33;:::i;:::-;2002:88;;;:::o;2096:75::-;2129:6;2162:2;2156:9;2146:19;;2136:35;:::o;2177:308::-;2239:4;2329:18;2321:6;2318:30;2315:2;;;2351:18;;:::i;:::-;2315:2;2389:29;2411:6;2389:29;:::i;:::-;2381:37;;2473:4;2467;2463:15;2455:23;;2244:241;;;:::o;2491:99::-;2543:6;2577:5;2571:12;2561:22;;2550:40;;;:::o;2596:169::-;2680:11;2714:6;2709:3;2702:19;2754:4;2749:3;2745:14;2730:29;;2692:73;;;;:::o;2771:307::-;2839:1;2849:113;2863:6;2860:1;2857:13;2849:113;;;2948:1;2943:3;2939:11;2933:18;2929:1;2924:3;2920:11;2913:39;2885:2;2882:1;2878:10;2873:15;;2849:113;;;2980:6;2977:1;2974:13;2971:2;;;3060:1;3051:6;3046:3;3042:16;3035:27;2971:2;2820:258;;;;:::o;3084:320::-;3128:6;3165:1;3159:4;3155:12;3145:22;;3212:1;3206:4;3202:12;3233:18;3223:2;;3289:4;3281:6;3277:17;3267:27;;3223:2;3351;3343:6;3340:14;3320:18;3317:38;3314:2;;;3370:18;;:::i;:::-;3314:2;3135:269;;;;:::o;3410:281::-;3493:27;3515:4;3493:27;:::i;:::-;3485:6;3481:40;3623:6;3611:10;3608:22;3587:18;3575:10;3572:34;3569:62;3566:2;;;3634:18;;:::i;:::-;3566:2;3674:10;3670:2;3663:22;3453:238;;;:::o;3697:180::-;3745:77;3742:1;3735:88;3842:4;3839:1;3832:15;3866:4;3863:1;3856:15;3883:180;3931:77;3928:1;3921:88;4028:4;4025:1;4018:15;4052:4;4049:1;4042:15;4069:102;4110:6;4161:2;4157:7;4152:2;4145:5;4141:14;4137:28;4127:38;;4117:54;;;:::o;147:1787:0:-;;;;;;;
67:61980:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
93:467:0:-:0;;;146:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;193:60;;;;;;;;;;;;;;;;;;243:9;193:11;;;;;:60;;:::i;:::-;274:9;263:8;:20;;;;;;;;;;;;:::i;:::-;;146:144;93:467;;6021:141:1;6088:70;6150:2;6154;6104:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6088:15;;;:70;;:::i;:::-;6021:141;;:::o;176:288::-;240:21;264:7;:14;240:38;;282:22;129:42;282:40;;373:2;364:7;360:16;455:1;452;437:13;423:12;407:14;400:5;389:68;335:126;;;;;:::o;93:467:0:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:354:2:-;96:5;121:66;137:49;179:6;137:49;:::i;:::-;121:66;:::i;:::-;112:75;;210:6;203:5;196:21;248:4;241:5;237:16;286:3;277:6;272:3;268:16;265:25;262:2;;;303:1;300;293:12;262:2;316:39;348:6;343:3;338;316:39;:::i;:::-;102:259;;;;;;:::o;381:288::-;448:5;497:3;490:4;482:6;478:17;474:27;464:2;;515:1;512;505:12;464:2;548:6;542:13;573:90;659:3;651:6;644:4;636:6;632:17;573:90;:::i;:::-;564:99;;454:215;;;;;:::o;675:390::-;755:6;804:2;792:9;783:7;779:23;775:32;772:2;;;820:1;817;810:12;772:2;884:1;873:9;869:17;863:24;914:18;906:6;903:30;900:2;;;946:1;943;936:12;900:2;974:74;1040:7;1031:6;1020:9;1016:22;974:74;:::i;:::-;964:84;;834:224;762:303;;;;:::o;1071:364::-;1159:3;1187:39;1220:5;1187:39;:::i;:::-;1242:71;1306:6;1301:3;1242:71;:::i;:::-;1235:78;;1322:52;1367:6;1362:3;1355:4;1348:5;1344:16;1322:52;:::i;:::-;1399:29;1421:6;1399:29;:::i;:::-;1394:3;1390:39;1383:46;;1163:272;;;;;:::o;1441:514::-;1602:4;1640:2;1629:9;1625:18;1617:26;;1689:9;1683:4;1679:20;1675:1;1664:9;1660:17;1653:47;1717:78;1790:4;1781:6;1717:78;:::i;:::-;1709:86;;1842:9;1836:4;1832:20;1827:2;1816:9;1812:18;1805:48;1870:78;1943:4;1934:6;1870:78;:::i;:::-;1862:86;;1607:348;;;;;:::o;1961:129::-;1995:6;2022:20;;:::i;:::-;2012:30;;2051:33;2079:4;2071:6;2051:33;:::i;:::-;2002:88;;;:::o;2096:75::-;2129:6;2162:2;2156:9;2146:19;;2136:35;:::o;2177:308::-;2239:4;2329:18;2321:6;2318:30;2315:2;;;2351:18;;:::i;:::-;2315:2;2389:29;2411:6;2389:29;:::i;:::-;2381:37;;2473:4;2467;2463:15;2455:23;;2244:241;;;:::o;2491:99::-;2543:6;2577:5;2571:12;2561:22;;2550:40;;;:::o;2596:169::-;2680:11;2714:6;2709:3;2702:19;2754:4;2749:3;2745:14;2730:29;;2692:73;;;;:::o;2771:307::-;2839:1;2849:113;2863:6;2860:1;2857:13;2849:113;;;2948:1;2943:3;2939:11;2933:18;2929:1;2924:3;2920:11;2913:39;2885:2;2882:1;2878:10;2873:15;;2849:113;;;2980:6;2977:1;2974:13;2971:2;;;3060:1;3051:6;3046:3;3042:16;3035:27;2971:2;2820:258;;;;:::o;3084:320::-;3128:6;3165:1;3159:4;3155:12;3145:22;;3212:1;3206:4;3202:12;3233:18;3223:2;;3289:4;3281:6;3277:17;3267:27;;3223:2;3351;3343:6;3340:14;3320:18;3317:38;3314:2;;;3370:18;;:::i;:::-;3314:2;3135:269;;;;:::o;3410:281::-;3493:27;3515:4;3493:27;:::i;:::-;3485:6;3481:40;3623:6;3611:10;3608:22;3587:18;3575:10;3572:34;3569:62;3566:2;;;3634:18;;:::i;:::-;3566:2;3674:10;3670:2;3663:22;3453:238;;;:::o;3697:180::-;3745:77;3742:1;3735:88;3842:4;3839:1;3832:15;3866:4;3863:1;3856:15;3883:180;3931:77;3928:1;3921:88;4028:4;4025:1;4018:15;4052:4;4049:1;4042:15;4069:102;4110:6;4161:2;4157:7;4152:2;4145:5;4141:14;4137:28;4127:38;;4117:54;;;:::o;93:467:0:-;;;;;;;
67:61980:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
147:1787:0:-:0;;;261:628;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;299:80;312:66;299:80;;:12;;;:80;;:::i;:::-;398;411:66;398:80;;:12;;;:80;;:::i;:::-;500;513:66;500:80;;:12;;;:80;;:::i;:::-;599:60;;;;;;;;;;;;;;;;;;649:9;599:11;;;;;:60;;:::i;:::-;661:80;674:66;661:80;;:12;;;:80;;:::i;:::-;763;776:66;763:80;;:12;;;:80;;:::i;:::-;873:9;862:8;:20;;;;;;;;;;;;:::i;:::-;;261:628;147:1787;;166:59;;:::o;6021:141:1:-;6088:70;6150:2;6154;6104:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6088:15;;;:70;;:::i;:::-;6021:141;;:::o;176:288::-;240:21;264:7;:14;240:38;;282:22;129:42;282:40;;373:2;364:7;360:16;455:1;452;437:13;423:12;407:14;400:5;389:68;335:126;;;;;:::o;147:1787:0:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:354:2:-;96:5;121:66;137:49;179:6;137:49;:::i;:::-;121:66;:::i;:::-;112:75;;210:6;203:5;196:21;248:4;241:5;237:16;286:3;277:6;272:3;268:16;265:25;262:2;;;303:1;300;293:12;262:2;316:39;348:6;343:3;338;316:39;:::i;:::-;102:259;;;;;;:::o;381:288::-;448:5;497:3;490:4;482:6;478:17;474:27;464:2;;515:1;512;505:12;464:2;548:6;542:13;573:90;659:3;651:6;644:4;636:6;632:17;573:90;:::i;:::-;564:99;;454:215;;;;;:::o;675:390::-;755:6;804:2;792:9;783:7;779:23;775:32;772:2;;;820:1;817;810:12;772:2;884:1;873:9;869:17;863:24;914:18;906:6;903:30;900:2;;;946:1;943;936:12;900:2;974:74;1040:7;1031:6;1020:9;1016:22;974:74;:::i;:::-;964:84;;834:224;762:303;;;;:::o;1071:364::-;1159:3;1187:39;1220:5;1187:39;:::i;:::-;1242:71;1306:6;1301:3;1242:71;:::i;:::-;1235:78;;1322:52;1367:6;1362:3;1355:4;1348:5;1344:16;1322:52;:::i;:::-;1399:29;1421:6;1399:29;:::i;:::-;1394:3;1390:39;1383:46;;1163:272;;;;;:::o;1441:514::-;1602:4;1640:2;1629:9;1625:18;1617:26;;1689:9;1683:4;1679:20;1675:1;1664:9;1660:17;1653:47;1717:78;1790:4;1781:6;1717:78;:::i;:::-;1709:86;;1842:9;1836:4;1832:20;1827:2;1816:9;1812:18;1805:48;1870:78;1943:4;1934:6;1870:78;:::i;:::-;1862:86;;1607:348;;;;;:::o;1961:129::-;1995:6;2022:20;;:::i;:::-;2012:30;;2051:33;2079:4;2071:6;2051:33;:::i;:::-;2002:88;;;:::o;2096:75::-;2129:6;2162:2;2156:9;2146:19;;2136:35;:::o;2177:308::-;2239:4;2329:18;2321:6;2318:30;2315:2;;;2351:18;;:::i;:::-;2315:2;2389:29;2411:6;2389:29;:::i;:::-;2381:37;;2473:4;2467;2463:15;2455:23;;2244:241;;;:::o;2491:99::-;2543:6;2577:5;2571:12;2561:22;;2550:40;;;:::o;2596:169::-;2680:11;2714:6;2709:3;2702:19;2754:4;2749:3;2745:14;2730:29;;2692:73;;;;:::o;2771:307::-;2839:1;2849:113;2863:6;2860:1;2857:13;2849:113;;;2948:1;2943:3;2939:11;2933:18;2929:1;2924:3;2920:11;2913:39;2885:2;2882:1;2878:10;2873:15;;2849:113;;;2980:6;2977:1;2974:13;2971:2;;;3060:1;3051:6;3046:3;3042:16;3035:27;2971:2;2820:258;;;;:::o;3084:320::-;3128:6;3165:1;3159:4;3155:12;3145:22;;3212:1;3206:4;3202:12;3233:18;3223:2;;3289:4;3281:6;3277:17;3267:27;;3223:2;3351;3343:6;3340:14;3320:18;3317:38;3314:2;;;3370:18;;:::i;:::-;3314:2;3135:269;;;;:::o;3410:281::-;3493:27;3515:4;3493:27;:::i;:::-;3485:6;3481:40;3623:6;3611:10;3608:22;3587:18;3575:10;3572:34;3569:62;3566:2;;;3634:18;;:::i;:::-;3566:2;3674:10;3670:2;3663:22;3453:238;;;:::o;3697:180::-;3745:77;3742:1;3735:88;3842:4;3839:1;3832:15;3866:4;3863:1;3856:15;3883:180;3931:77;3928:1;3921:88;4028:4;4025:1;4018:15;4052:4;4049:1;4042:15;4069:102;4110:6;4161:2;4157:7;4152:2;4145:5;4141:14;4137:28;4127:38;;4117:54;;;:::o;147:1787:0:-;;;;;;;
67:61980:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
93:467:0:-:0;;;146:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;193:60;;;;;;;;;;;;;;;;;;243:9;193:11;;;;;:60;;:::i;:::-;274:9;263:8;:20;;;;;;;;;;;;:::i;:::-;;146:144;93:467;;6021:141:1;6088:70;6150:2;6154;6104:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6088:15;;;:70;;:::i;:::-;6021:141;;:::o;176:288::-;240:21;264:7;:14;240:38;;282:22;129:42;282:40;;373:2;364:7;360:16;455:1;452;437:13;423:12;407:14;400:5;389:68;335:126;;;;;:::o;93:467:0:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:354:2:-;96:5;121:66;137:49;179:6;137:49;:::i;:::-;121:66;:::i;:::-;112:75;;210:6;203:5;196:21;248:4;241:5;237:16;286:3;277:6;272:3;268:16;265:25;262:2;;;303:1;300;293:12;262:2;316:39;348:6;343:3;338;316:39;:::i;:::-;102:259;;;;;;:::o;381:288::-;448:5;497:3;490:4;482:6;478:17;474:27;464:2;;515:1;512;505:12;464:2;548:6;542:13;573:90;659:3;651:6;644:4;636:6;632:17;573:90;:::i;:::-;564:99;;454:215;;;;;:::o;675:390::-;755:6;804:2;792:9;783:7;779:23;775:32;772:2;;;820:1;817;810:12;772:2;884:1;873:9;869:17;863:24;914:18;906:6;903:30;900:2;;;946:1;943;936:12;900:2;974:74;1040:7;1031:6;1020:9;1016:22;974:74;:::i;:::-;964:84;;834:224;762:303;;;;:::o;1071:364::-;1159:3;1187:39;1220:5;1187:39;:::i;:::-;1242:71;1306:6;1301:3;1242:71;:::i;:::-;1235:78;;1322:52;1367:6;1362:3;1355:4;1348:5;1344:16;1322:52;:::i;:::-;1399:29;1421:6;1399:29;:::i;:::-;1394:3;1390:39;1383:46;;1163:272;;;;;:::o;1441:514::-;1602:4;1640:2;1629:9;1625:18;1617:26;;1689:9;1683:4;1679:20;1675:1;1664:9;1660:17;1653:47;1717:78;1790:4;1781:6;1717:78;:::i;:::-;1709:86;;1842:9;1836:4;1832:20;1827:2;1816:9;1812:18;1805:48;1870:78;1943:4;1934:6;1870:78;:::i;:::-;1862:86;;1607:348;;;;;:::o;1961:129::-;1995:6;2022:20;;:::i;:::-;2012:30;;2051:33;2079:4;2071:6;2051:33;:::i;:::-;2002:88;;;:::o;2096:75::-;2129:6;2162:2;2156:9;2146:19;;2136:35;:::o;2177:308::-;2239:4;2329:18;2321:6;2318:30;2315:2;;;2351:18;;:::i;:::-;2315:2;2389:29;2411:6;2389:29;:::i;:::-;2381:37;;2473:4;2467;2463:15;2455:23;;2244:241;;;:::o;2491:99::-;2543:6;2577:5;2571:12;2561:22;;2550:40;;;:::o;2596:169::-;2680:11;2714:6;2709:3;2702:19;2754:4;2749:3;2745:14;2730:29;;2692:73;;;;:::o;2771:307::-;2839:1;2849:113;2863:6;2860:1;2857:13;2849:113;;;2948:1;2943:3;2939:11;2933:18;2929:1;2924:3;2920:11;2913:39;2885:2;2882:1;2878:10;2873:15;;2849:113;;;2980:6;2977:1;2974:13;2971:2;;;3060:1;3051:6;3046:3;3042:16;3035:27;2971:2;2820:258;;;;:::o;3084:320::-;3128:6;3165:1;3159:4;3155:12;3145:22;;3212:1;3206:4;3202:12;3233:18;3223:2;;3289:4;3281:6;3277:17;3267:27;;3223:2;3351;3343:6;3340:14;3320:18;3317:38;3314:2;;;3370:18;;:::i;:::-;3314:2;3135:269;;;;:::o;3410:281::-;3493:27;3515:4;3493:27;:::i;:::-;3485:6;3481:40;3623:6;3611:10;3608:22;3587:18;3575:10;3572:34;3569:62;3566:2;;;3634:18;;:::i;:::-;3566:2;3674:10;3670:2;3663:22;3453:238;;;:::o;3697:180::-;3745:77;3742:1;3735:88;3842:4;3839:1;3832:15;3866:4;3863:1;3856:15;3883:180;3931:77;3928:1;3921:88;4028:4;4025:1;4018:15;4052:4;4049:1;4042:15;4069:102;4110:6;4161:2;4157:7;4152:2;4145:5;4141:14;4137:28;4127:38;;4117:54;;;:::o;93:467:0:-;;;;;;;
67:61980:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
147:1787:0:-:0;;;261:628;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;299:80;312:66;299:80;;:12;;;:80;;:::i;:::-;398;411:66;398:80;;:12;;;:80;;:::i;:::-;500;513:66;500:80;;:12;;;:80;;:::i;:::-;599:60;;;;;;;;;;;;;;;;;;649:9;599:11;;;;;:60;;:::i;:::-;661:80;674:66;661:80;;:12;;;:80;;:::i;:::-;763;776:66;763:80;;:12;;;:80;;:::i;:::-;873:9;862:8;:20;;;;;;;;;;;;:::i;:::-;;261:628;147:1787;;166:59;;:::o;6021:141:1:-;6088:70;6150:2;6154;6104:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6088:15;;;:70;;:::i;:::-;6021:141;;:::o;176:288::-;240:21;264:7;:14;240:38;;282:22;129:42;282:40;;373:2;364:7;360:16;455:1;452;437:13;423:12;407:14;400:5;389:68;335:126;;;;;:::o;147:1787:0:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:354:2:-;96:5;121:66;137:49;179:6;137:49;:::i;:::-;121:66;:::i;:::-;112:75;;210:6;203:5;196:21;248:4;241:5;237:16;286:3;277:6;272:3;268:16;265:25;262:2;;;303:1;300;293:12;262:2;316:39;348:6;343:3;338;316:39;:::i;:::-;102:259;;;;;;:::o;381:288::-;448:5;497:3;490:4;482:6;478:17;474:27;464:2;;515:1;512;505:12;464:2;548:6;542:13;573:90;659:3;651:6;644:4;636:6;632:17;573:90;:::i;:::-;564:99;;454:215;;;;;:::o;675:390::-;755:6;804:2;792:9;783:7;779:23;775:32;772:2;;;820:1;817;810:12;772:2;884:1;873:9;869:17;863:24;914:18;906:6;903:30;900:2;;;946:1;943;936:12;900:2;974:74;1040:7;1031:6;1020:9;1016:22;974:74;:::i;:::-;964:84;;834:224;762:303;;;;:::o;1071:364::-;1159:3;1187:39;1220:5;1187:39;:::i;:::-;1242:71;1306:6;1301:3;1242:71;:::i;:::-;1235:78;;1322:52;1367:6;1362:3;1355:4;1348:5;1344:16;1322:52;:::i;:::-;1399:29;1421:6;1399:29;:::i;:::-;1394:3;1390:39;1383:46;;1163:272;;;;;:::o;1441:514::-;1602:4;1640:2;1629:9;1625:18;1617:26;;1689:9;1683:4;1679:20;1675:1;1664:9;1660:17;1653:47;1717:78;1790:4;1781:6;1717:78;:::i;:::-;1709:86;;1842:9;1836:4;1832:20;1827:2;1816:9;1812:18;1805:48;1870:78;1943:4;1934:6;1870:78;:::i;:::-;1862:86;;1607:348;;;;;:::o;1961:129::-;1995:6;2022:20;;:::i;:::-;2012:30;;2051:33;2079:4;2071:6;2051:33;:::i;:::-;2002:88;;;:::o;2096:75::-;2129:6;2162:2;2156:9;2146:19;;2136:35;:::o;2177:308::-;2239:4;2329:18;2321:6;2318:30;2315:2;;;2351:18;;:::i;:::-;2315:2;2389:29;2411:6;2389:29;:::i;:::-;2381:37;;2473:4;2467;2463:15;2455:23;;2244:241;;;:::o;2491:99::-;2543:6;2577:5;2571:12;2561:22;;2550:40;;;:::o;2596:169::-;2680:11;2714:6;2709:3;2702:19;2754:4;2749:3;2745:14;2730:29;;2692:73;;;;:::o;2771:307::-;2839:1;2849:113;2863:6;2860:1;2857:13;2849:113;;;2948:1;2943:3;2939:11;2933:18;2929:1;2924:3;2920:11;2913:39;2885:2;2882:1;2878:10;2873:15;;2849:113;;;2980:6;2977:1;2974:13;2971:2;;;3060:1;3051:6;3046:3;3042:16;3035:27;2971:2;2820:258;;;;:::o;3084:320::-;3128:6;3165:1;3159:4;3155:12;3145:22;;3212:1;3206:4;3202:12;3233:18;3223:2;;3289:4;3281:6;3277:17;3267:27;;3223:2;3351;3343:6;3340:14;3320:18;3317:38;3314:2;;;3370:18;;:::i;:::-;3314:2;3135:269;;;;:::o;3410:281::-;3493:27;3515:4;3493:27;:::i;:::-;3485:6;3481:40;3623:6;3611:10;3608:22;3587:18;3575:10;3572:34;3569:62;3566:2;;;3634:18;;:::i;:::-;3566:2;3674:10;3670:2;3663:22;3453:238;;;:::o;3697:180::-;3745:77;3742:1;3735:88;3842:4;3839:1;3832:15;3866:4;3863:1;3856:15;3883:180;3931:77;3928:1;3921:88;4028:4;4025:1;4018:15;4052:4;4049:1;4042:15;4069:102;4110:6;4161:2;4157:7;4152:2;4145:5;4141:14;4137:28;4127:38;;4117:54;;;:::o;147:1787:0:-;;;;;;;
67:61980:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
93:467:0:-:0;;;146:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;193:60;;;;;;;;;;;;;;;;;;243:9;193:11;;;;;:60;;:::i;:::-;274:9;263:8;:20;;;;;;;;;;;;:::i;:::-;;146:144;93:467;;6021:141:1;6088:70;6150:2;6154;6104:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6088:15;;;:70;;:::i;:::-;6021:141;;:::o;176:288::-;240:21;264:7;:14;240:38;;282:22;129:42;282:40;;373:2;364:7;360:16;455:1;452;437:13;423:12;407:14;400:5;389:68;335:126;;;;;:::o;93:467:0:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:354:2:-;96:5;121:66;137:49;179:6;137:49;:::i;:::-;121:66;:::i;:::-;112:75;;210:6;203:5;196:21;248:4;241:5;237:16;286:3;277:6;272:3;268:16;265:25;262:2;;;303:1;300;293:12;262:2;316:39;348:6;343:3;338;316:39;:::i;:::-;102:259;;;;;;:::o;381:288::-;448:5;497:3;490:4;482:6;478:17;474:27;464:2;;515:1;512;505:12;464:2;548:6;542:13;573:90;659:3;651:6;644:4;636:6;632:17;573:90;:::i;:::-;564:99;;454:215;;;;;:::o;675:390::-;755:6;804:2;792:9;783:7;779:23;775:32;772:2;;;820:1;817;810:12;772:2;884:1;873:9;869:17;863:24;914:18;906:6;903:30;900:2;;;946:1;943;936:12;900:2;974:74;1040:7;1031:6;1020:9;1016:22;974:74;:::i;:::-;964:84;;834:224;762:303;;;;:::o;1071:364::-;1159:3;1187:39;1220:5;1187:39;:::i;:::-;1242:71;1306:6;1301:3;1242:71;:::i;:::-;1235:78;;1322:52;1367:6;1362:3;1355:4;1348:5;1344:16;1322:52;:::i;:::-;1399:29;1421:6;1399:29;:::i;:::-;1394:3;1390:39;1383:46;;1163:272;;;;;:::o;1441:514::-;1602:4;1640:2;1629:9;1625:18;1617:26;;1689:9;1683:4;1679:20;1675:1;1664:9;1660:17;1653:47;1717:78;1790:4;1781:6;1717:78;:::i;:::-;1709:86;;1842:9;1836:4;1832:20;1827:2;1816:9;1812:18;1805:48;1870:78;1943:4;1934:6;1870:78;:::i;:::-;1862:86;;1607:348;;;;;:::o;1961:129::-;1995:6;2022:20;;:::i;:::-;2012:30;;2051:33;2079:4;2071:6;2051:33;:::i;:::-;2002:88;;;:::o;2096:75::-;2129:6;2162:2;2156:9;2146:19;;2136:35;:::o;2177:308::-;2239:4;2329:18;2321:6;2318:30;2315:2;;;2351:18;;:::i;:::-;2315:2;2389:29;2411:6;2389:29;:::i;:::-;2381:37;;2473:4;2467;2463:15;2455:23;;2244:241;;;:::o;2491:99::-;2543:6;2577:5;2571:12;2561:22;;2550:40;;;:::o;2596:169::-;2680:11;2714:6;2709:3;2702:19;2754:4;2749:3;2745:14;2730:29;;2692:73;;;;:::o;2771:307::-;2839:1;2849:113;2863:6;2860:1;2857:13;2849:113;;;2948:1;2943:3;2939:11;2933:18;2929:1;2924:3;2920:11;2913:39;2885:2;2882:1;2878:10;2873:15;;2849:113;;;2980:6;2977:1;2974:13;2971:2;;;3060:1;3051:6;3046:3;3042:16;3035:27;2971:2;2820:258;;;;:::o;3084:320::-;3128:6;3165:1;3159:4;3155:12;3145:22;;3212:1;3206:4;3202:12;3233:18;3223:2;;3289:4;3281:6;3277:17;3267:27;;3223:2;3351;3343:6;3340:14;3320:18;3317:38;3314:2;;;3370:18;;:::i;:::-;3314:2;3135:269;;;;:::o;3410:281::-;3493:27;3515:4;3493:27;:::i;:::-;3485:6;3481:40;3623:6;3611:10;3608:22;3587:18;3575:10;3572:34;3569:62;3566:2;;;3634:18;;:::i;:::-;3566:2;3674:10;3670:2;3663:22;3453:238;;;:::o;3697:180::-;3745:77;3742:1;3735:88;3842:4;3839:1;3832:15;3866:4;3863:1;3856:15;3883:180;3931:77;3928:1;3921:88;4028:4;4025:1;4018:15;4052:4;4049:1;4042:15;4069:102;4110:6;4161:2;4157:7;4152:2;4145:5;4141:14;4137:28;4127:38;;4117:54;;;:::o;93:467:0:-;;;;;;;
67:61980:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
147:1787:0:-:0;;;261:628;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;299:80;312:66;299:80;;:12;;;:80;;:::i;:::-;398;411:66;398:80;;:12;;;:80;;:::i;:::-;500;513:66;500:80;;:12;;;:80;;:::i;:::-;599:60;;;;;;;;;;;;;;;;;;649:9;599:11;;;;;:60;;:::i;:::-;661:80;674:66;661:80;;:12;;;:80;;:::i;:::-;763;776:66;763:80;;:12;;;:80;;:::i;:::-;873:9;862:8;:20;;;;;;;;;;;;:::i;:::-;;261:628;147:1787;;166:59;;:::o;6021:141:1:-;6088:70;6150:2;6154;6104:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6088:15;;;:70;;:::i;:::-;6021:141;;:::o;176:288::-;240:21;264:7;:14;240:38;;282:22;129:42;282:40;;373:2;364:7;360:16;455:1;452;437:13;423:12;407:14;400:5;389:68;335:126;;;;;:::o;147:1787:0:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:354:2:-;96:5;121:66;137:49;179:6;137:49;:::i;:::-;121:66;:::i;:::-;112:75;;210:6;203:5;196:21;248:4;241:5;237:16;286:3;277:6;272:3;268:16;265:25;262:2;;;303:1;300;293:12;262:2;316:39;348:6;343:3;338;316:39;:::i;:::-;102:259;;;;;;:::o;381:288::-;448:5;497:3;490:4;482:6;478:17;474:27;464:2;;515:1;512;505:12;464:2;548:6;542:13;573:90;659:3;651:6;644:4;636:6;632:17;573:90;:::i;:::-;564:99;;454:215;;;;;:::o;675:390::-;755:6;804:2;792:9;783:7;779:23;775:32;772:2;;;820:1;817;810:12;772:2;884:1;873:9;869:17;863:24;914:18;906:6;903:30;900:2;;;946:1;943;936:12;900:2;974:74;1040:7;1031:6;1020:9;1016:22;974:74;:::i;:::-;964:84;;834:224;762:303;;;;:::o;1071:364::-;1159:3;1187:39;1220:5;1187:39;:::i;:::-;1242:71;1306:6;1301:3;1242:71;:::i;:::-;1235:78;;1322:52;1367:6;1362:3;1355:4;1348:5;1344:16;1322:52;:::i;:::-;1399:29;1421:6;1399:29;:::i;:::-;1394:3;1390:39;1383:46;;1163:272;;;;;:::o;1441:514::-;1602:4;1640:2;1629:9;1625:18;1617:26;;1689:9;1683:4;1679:20;1675:1;1664:9;1660:17;1653:47;1717:78;1790:4;1781:6;1717:78;:::i;:::-;1709:86;;1842:9;1836:4;1832:20;1827:2;1816:9;1812:18;1805:48;1870:78;1943:4;1934:6;1870:78;:::i;:::-;1862:86;;1607:348;;;;;:::o;1961:129::-;1995:6;2022:20;;:::i;:::-;2012:30;;2051:33;2079:4;2071:6;2051:33;:::i;:::-;2002:88;;;:::o;2096:75::-;2129:6;2162:2;2156:9;2146:19;;2136:35;:::o;2177:308::-;2239:4;2329:18;2321:6;2318:30;2315:2;;;2351:18;;:::i;:::-;2315:2;2389:29;2411:6;2389:29;:::i;:::-;2381:37;;2473:4;2467;2463:15;2455:23;;2244:241;;;:::o;2491:99::-;2543:6;2577:5;2571:12;2561:22;;2550:40;;;:::o;2596:169::-;2680:11;2714:6;2709:3;2702:19;2754:4;2749:3;2745:14;2730:29;;2692:73;;;;:::o;2771:307::-;2839:1;2849:113;2863:6;2860:1;2857:13;2849:113;;;2948:1;2943:3;2939:11;2933:18;2929:1;2924:3;2920:11;2913:39;2885:2;2882:1;2878:10;2873:15;;2849:113;;;2980:6;2977:1;2974:13;2971:2;;;3060:1;3051:6;3046:3;3042:16;3035:27;2971:2;2820:258;;;;:::o;3084:320::-;3128:6;3165:1;3159:4;3155:12;3145:22;;3212:1;3206:4;3202:12;3233:18;3223:2;;3289:4;3281:6;3277:17;3267:27;;3223:2;3351;3343:6;3340:14;3320:18;3317:38;3314:2;;;3370:18;;:::i;:::-;3314:2;3135:269;;;;:::o;3410:281::-;3493:27;3515:4;3493:27;:::i;:::-;3485:6;3481:40;3623:6;3611:10;3608:22;3587:18;3575:10;3572:34;3569:62;3566:2;;;3634:18;;:::i;:::-;3566:2;3674:10;3670:2;3663:22;3453:238;;;:::o;3697:180::-;3745:77;3742:1;3735:88;3842:4;3839:1;3832:15;3866:4;3863:1;3856:15;3883:180;3931:77;3928:1;3921:88;4028:4;4025:1;4018:15;4052:4;4049:1;4042:15;4069:102;4110:6;4161:2;4157:7;4152:2;4145:5;4141:14;4137:28;4127:38;;4117:54;;;:::o;147:1787:0:-;;;;;;;
67:61980:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
93:467:0:-:0;;;146:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;193:60;;;;;;;;;;;;;;;;;;243:9;193:11;;;;;:60;;:::i;:::-;274:9;263:8;:20;;;;;;;;;;;;:::i;:::-;;146:144;93:467;;6021:141:1;6088:70;6150:2;6154;6104:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6088:15;;;:70;;:::i;:::-;6021:141;;:::o;176:288::-;240:21;264:7;:14;240:38;;282:22;129:42;282:40;;373:2;364:7;360:16;455:1;452;437:13;423:12;407:14;400:5;389:68;335:126;;;;;:::o;93:467:0:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:354:2:-;96:5;121:66;137:49;179:6;137:49;:::i;:::-;121:66;:::i;:::-;112:75;;210:6;203:5;196:21;248:4;241:5;237:16;286:3;277:6;272:3;268:16;265:25;262:2;;;303:1;300;293:12;262:2;316:39;348:6;343:3;338;316:39;:::i;:::-;102:259;;;;;;:::o;381:288::-;448:5;497:3;490:4;482:6;478:17;474:27;464:2;;515:1;512;505:12;464:2;548:6;542:13;573:90;659:3;651:6;644:4;636:6;632:17;573:90;:::i;:::-;564:99;;454:215;;;;;:::o;675:390::-;755:6;804:2;792:9;783:7;779:23;775:32;772:2;;;820:1;817;810:12;772:2;884:1;873:9;869:17;863:24;914:18;906:6;903:30;900:2;;;946:1;943;936:12;900:2;974:74;1040:7;1031:6;1020:9;1016:22;974:74;:::i;:::-;964:84;;834:224;762:303;;;;:::o;1071:364::-;1159:3;1187:39;1220:5;1187:39;:::i;:::-;1242:71;1306:6;1301:3;1242:71;:::i;:::-;1235:78;;1322:52;1367:6;1362:3;1355:4;1348:5;1344:16;1322:52;:::i;:::-;1399:29;1421:6;1399:29;:::i;:::-;1394:3;1390:39;1383:46;;1163:272;;;;;:::o;1441:514::-;1602:4;1640:2;1629:9;1625:18;1617:26;;1689:9;1683:4;1679:20;1675:1;1664:9;1660:17;1653:47;1717:78;1790:4;1781:6;1717:78;:::i;:::-;1709:86;;1842:9;1836:4;1832:20;1827:2;1816:9;1812:18;1805:48;1870:78;1943:4;1934:6;1870:78;:::i;:::-;1862:86;;1607:348;;;;;:::o;1961:129::-;1995:6;2022:20;;:::i;:::-;2012:30;;2051:33;2079:4;2071:6;2051:33;:::i;:::-;2002:88;;;:::o;2096:75::-;2129:6;2162:2;2156:9;2146:19;;2136:35;:::o;2177:308::-;2239:4;2329:18;2321:6;2318:30;2315:2;;;2351:18;;:::i;:::-;2315:2;2389:29;2411:6;2389:29;:::i;:::-;2381:37;;2473:4;2467;2463:15;2455:23;;2244:241;;;:::o;2491:99::-;2543:6;2577:5;2571:12;2561:22;;2550:40;;;:::o;2596:169::-;2680:11;2714:6;2709:3;2702:19;2754:4;2749:3;2745:14;2730:29;;2692:73;;;;:::o;2771:307::-;2839:1;2849:113;2863:6;2860:1;2857:13;2849:113;;;2948:1;2943:3;2939:11;2933:18;2929:1;2924:3;2920:11;2913:39;2885:2;2882:1;2878:10;2873:15;;2849:113;;;2980:6;2977:1;2974:13;2971:2;;;3060:1;3051:6;3046:3;3042:16;3035:27;2971:2;2820:258;;;;:::o;3084:320::-;3128:6;3165:1;3159:4;3155:12;3145:22;;3212:1;3206:4;3202:12;3233:18;3223:2;;3289:4;3281:6;3277:17;3267:27;;3223:2;3351;3343:6;3340:14;3320:18;3317:38;3314:2;;;3370:18;;:::i;:::-;3314:2;3135:269;;;;:::o;3410:281::-;3493:27;3515:4;3493:27;:::i;:::-;3485:6;3481:40;3623:6;3611:10;3608:22;3587:18;3575:10;3572:34;3569:62;3566:2;;;3634:18;;:::i;:::-;3566:2;3674:10;3670:2;3663:22;3453:238;;;:::o;3697:180::-;3745:77;3742:1;3735:88;3842:4;3839:1;3832:15;3866:4;3863:1;3856:15;3883:180;3931:77;3928:1;3921:88;4028:4;4025:1;4018:15;4052:4;4049:1;4042:15;4069:102;4110:6;4161:2;4157:7;4152:2;4145:5;4141:14;4137:28;4127:38;;4117:54;;;:::o;93:467:0:-;;;;;;;
67:61980:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
25:21:0:-:0;;;;;;;;;;;;;;;;;;;
93:467:0:-:0;;;146:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;193:60;;;;;;;;;;;;;;;;;;243:9;193:11;;;;;:60;;:::i;:::-;274:9;263:8;:20;;;;;;;;;;;;:::i;:::-;;146:144;93:467;;6021:141:1;6088:70;6150:2;6154;6104:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6088:15;;;:70;;:::i;:::-;6021:141;;:::o;176:288::-;240:21;264:7;:14;240:38;;282:22;129:42;282:40;;373:2;364:7;360:16;455:1;452;437:13;423:12;407:14;400:5;389:68;335:126;;;;;:::o;93:467:0:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:354:2:-;96:5;121:66;137:49;179:6;137:49;:::i;:::-;121:66;:::i;:::-;112:75;;210:6;203:5;196:21;248:4;241:5;237:16;286:3;277:6;272:3;268:16;265:25;262:2;;;303:1;300;293:12;262:2;316:39;348:6;343:3;338;316:39;:::i;:::-;102:259;;;;;;:::o;381:288::-;448:5;497:3;490:4;482:6;478:17;474:27;464:2;;515:1;512;505:12;464:2;548:6;542:13;573:90;659:3;651:6;644:4;636:6;632:17;573:90;:::i;:::-;564:99;;454:215;;;;;:::o;675:390::-;755:6;804:2;792:9;783:7;779:23;775:32;772:2;;;820:1;817;810:12;772:2;884:1;873:9;869:17;863:24;914:18;906:6;903:30;900:2;;;946:1;943;936:12;900:2;974:74;1040:7;1031:6;1020:9;1016:22;974:74;:::i;:::-;964:84;;834:224;762:303;;;;:::o;1071:364::-;1159:3;1187:39;1220:5;1187:39;:::i;:::-;1242:71;1306:6;1301:3;1242:71;:::i;:::-;1235:78;;1322:52;1367:6;1362:3;1355:4;1348:5;1344:16;1322:52;:::i;:::-;1399:29;1421:6;1399:29;:::i;:::-;1394:3;1390:39;1383:46;;1163:272;;;;;:::o;1441:514::-;1602:4;1640:2;1629:9;1625:18;1617:26;;1689:9;1683:4;1679:20;1675:1;1664:9;1660:17;1653:47;1717:78;1790:4;1781:6;1717:78;:::i;:::-;1709:86;;1842:9;1836:4;1832:20;1827:2;1816:9;1812:18;1805:48;1870:78;1943:4;1934:6;1870:78;:::i;:::-;1862:86;;1607:348;;;;;:::o;1961:129::-;1995:6;2022:20;;:::i;:::-;2012:30;;2051:33;2079:4;2071:6;2051:33;:::i;:::-;2002:88;;;:::o;2096:75::-;2129:6;2162:2;2156:9;2146:19;;2136:35;:::o;2177:308::-;2239:4;2329:18;2321:6;2318:30;2315:2;;;2351:18;;:::i;:::-;2315:2;2389:29;2411:6;2389:29;:::i;:::-;2381:37;;2473:4;2467;2463:15;2455:23;;2244:241;;;:::o;2491:99::-;2543:6;2577:5;2571:12;2561:22;;2550:40;;;:::o;2596:169::-;2680:11;2714:6;2709:3;2702:19;2754:4;2749:3;2745:14;2730:29;;2692:73;;;;:::o;2771:307::-;2839:1;2849:113;2863:6;2860:1;2857:13;2849:113;;;2948:1;2943:3;2939:11;2933:18;2929:1;2924:3;2920:11;2913:39;2885:2;2882:1;2878:10;2873:15;;2849:113;;;2980:6;2977:1;2974:13;2971:2;;;3060:1;3051:6;3046:3;3042:16;3035:27;2971:2;2820:258;;;;:::o;3084:320::-;3128:6;3165:1;3159:4;3155:12;3145:22;;3212:1;3206:4;3202:12;3233:18;3223:2;;3289:4;3281:6;3277:17;3267:27;;3223:2;3351;3343:6;3340:14;3320:18;3317:38;3314:2;;;3370:18;;:::i;:::-;3314:2;3135:269;;;;:::o;3410:281::-;3493:27;3515:4;3493:27;:::i;:::-;3485:6;3481:40;3623:6;3611:10;3608:22;3587:18;3575:10;3572:34;3569:62;3566:2;;;3634:18;;:::i;:::-;3566:2;3674:10;3670:2;3663:22;3453:238;;;:::o;3697:180::-;3745:77;3742:1;3735:88;3842:4;3839:1;3832:15;3866:4;3863:1;3856:15;3883:180;3931:77;3928:1;3921:88;4028:4;4025:1;4018:15;4052:4;4049:1;4042:15;4069:102;4110:6;4161:2;4157:7;4152:2;4145:5;4141:14;4137:28;4127:38;;4117:54;;;:::o;93:467:0:-;;;;;;;
67:61980:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
25:13:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25:13:0;;;;;;;
0:13:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;0:13:0;;;;;;;
25:21:0:-:0;;;;;;;;;;;;;;;;;;;