From 997b467946c1e7f6a7703ce9c2056d23f4fcabd0 Mon Sep 17 00:00:00 2001 From: Will Fyson Date: Tue, 11 Dec 2018 12:26:05 +0000 Subject: [PATCH] Add eprintid on to default eprint report export, fix bug with fields from itemref fields not being included in export options, and adjust CSV export to use phrases for headers rather than field IDS. --- cfg/cfg.d/z_reports.pl | 8 +- lib/plugins/EPrints/Plugin/Export/Grid2.pm | 69 +- .../EPrints/Plugin/Export/Report/HTML.pm | 9 +- lib/plugins/EPrints/Plugin/Screen/Report.pm | 4 +- reports.epm | 897 +++++++++--------- reports.epmi | 16 +- 6 files changed, 548 insertions(+), 455 deletions(-) diff --git a/cfg/cfg.d/z_reports.pl b/cfg/cfg.d/z_reports.pl index 3e693c7..a421af4 100644 --- a/cfg/cfg.d/z_reports.pl +++ b/cfg/cfg.d/z_reports.pl @@ -1,7 +1,7 @@ # # EPrints Services - Generic Reporting System # -# Version: 0.1 +# Version: 3.0 # @@ -39,6 +39,7 @@ #export field options $c->{eprint_report}->{exportfields} = { eprint_report_core => [ qw( + eprintid title creators_name abstract @@ -51,11 +52,12 @@ ispublished refereed publication - document_format + documents.format datestamp )], }; $c->{eprint_report}->{exportfield_defaults} = [ qw( + eprintid title creators_name abstract @@ -68,7 +70,7 @@ ispublished refereed publication - document_format + documents.format datestamp )]; diff --git a/lib/plugins/EPrints/Plugin/Export/Grid2.pm b/lib/plugins/EPrints/Plugin/Export/Grid2.pm index 9a8b369..a4ef808 100644 --- a/lib/plugins/EPrints/Plugin/Export/Grid2.pm +++ b/lib/plugins/EPrints/Plugin/Export/Grid2.pm @@ -66,14 +66,50 @@ sub header_row if ($field->isa("EPrints::MetaField::Multipart")) { - my $name = $field->name; - push @names, map { - $name . '.' . $_->{sub_name} - } @{$field->property("fields_cache")}; + my $parent_name = $field->render_name; + if( $field->isa( "EPrints::MetaField::Name" )) #need to deal with legacy phrase id's + { + foreach my $bit ( $field->get_input_bits() ) + { + $bit = "given_names" if( $bit eq "given" ); + $bit = "family_names" if( $bit eq "family" ); + my $custom_phrase = $field->name . "_" . $bit; + if( $ds->repository->get_lang->has_phrase( $custom_phrase ) ) #allow a custom phrase to be used + { + push @names, $ds->repository->html_phrase( $custom_phrase ); + } + else + { + push @names, $parent_name . ": " . $ds->repository->html_phrase( "lib/metafield:".$bit ); + } + } + } + else + { + my $name = $field->name; + push @names, map { + $name . '.' . $_->{sub_name} + } @{$field->property("fields_cache")}; + } + } + elsif( $field->isa("EPrints::MetaField::Compound" ) ) + { + foreach my $sub_field (@{$field->property("fields_cache")}) + { + my $custom_phrase = $field->name . "_" . $sub_field->name; + if( $ds->repository->get_lang->has_phrase( $custom_phrase ) ) #allow a custom phrase to be used + { + push @names, $ds->repository->html_phrase( $custom_phrase ); + } + else + { + push @names, $field->render_name . ": " . $sub_field->render_name; + } + } } else { - push @names, $field->name; + push @names, $field->render_name; } } } @@ -237,7 +273,28 @@ sub value_to_rows } elsif ($field->isa("EPrints::MetaField::Multipart")) { - push @rows, [map { $value->{$_->{sub_name}} } @{$field->property("fields_cache")}]; + if( $field->isa( "EPrints::MetaField::Name" )) #need to deal with legacy phrase id's + { + my @bit_values; + foreach my $bit ( $field->get_input_bits() ) + { + push @bit_values, $value->{$bit}; + } + push @rows, \@bit_values; + } + else + { + push @rows, [map { $value->{$_->{sub_name}} } @{$field->property("fields_cache")}]; + } + } + elsif ($field->isa("EPrints::MetaField::Compound")) + { + my @sub_values; + foreach my $key (keys %{$value}) + { + push @sub_values, $value->{$key}; + } + push @rows, \@sub_values; } else { diff --git a/lib/plugins/EPrints/Plugin/Export/Report/HTML.pm b/lib/plugins/EPrints/Plugin/Export/Report/HTML.pm index cfd3e34..ea77b03 100644 --- a/lib/plugins/EPrints/Plugin/Export/Report/HTML.pm +++ b/lib/plugins/EPrints/Plugin/Export/Report/HTML.pm @@ -145,13 +145,14 @@ sub output_dataobj } else #render normal value like a normal field { - my $ds_id = $dataobj->get_dataset_id; - my $ds = $repo->dataset( $ds_id ); + my $ds = $dataobj->dataset; if( $ds->has_field( $f ) ) { + my $field = EPrints::Utils::field_from_config_string( $ds, $f ); + $table->appendChild( $repo->render_row( - $repo->html_phrase( $ds_id."_fieldname_".$f ), - $dataobj->render_value( $f ) + $field->render_name, + $dataobj->render_value( $f ) ) ); } } diff --git a/lib/plugins/EPrints/Plugin/Screen/Report.pm b/lib/plugins/EPrints/Plugin/Screen/Report.pm index 9058d35..434c060 100644 --- a/lib/plugins/EPrints/Plugin/Screen/Report.pm +++ b/lib/plugins/EPrints/Plugin/Screen/Report.pm @@ -816,12 +816,12 @@ sub render_export_bar my $count = 0; #count how many fields we add foreach my $fieldname( @{$repo->config( $self->{export_conf}, "exportfields" )->{$key}} ) { - if( defined $repo->config( $self->{export_conf}, "customer_export" ) && exists ${$repo->config( $self->{export_conf}, "custom_export" )}{$fieldname} ) #no field in dataset, but we have a custom export function instead + if( defined $repo->config( $self->{export_conf}, "custom_export" ) && exists ${$repo->config( $self->{export_conf}, "custom_export" )}{$fieldname} ) #we have a custom export function instead { $count++; $self->_export_field_checkbox( $repo, $fieldname, $ul, $repo->html_phrase( "exportfieldoptions:$fieldname" ) ); } - elsif( $report_ds->has_field( $fieldname ) ) + elsif( defined EPrints::Utils::field_from_config_string( $report_ds, $fieldname ) ) { my $field = EPrints::Utils::field_from_config_string( $report_ds, $fieldname ); $count++; diff --git a/reports.epm b/reports.epm index 5e43aa1..25cb462 100644 --- a/reports.epm +++ b/reports.epm @@ -42,11 +42,11 @@ cGxlX2ZpZWxkcyB9Owo= epm/reports/cfg/cfg.d/z_reports.pl text/plain - 385eec38a9a534ff630359efd9b5460b + 334237b831581075209dbbedf084d878 MD5 - 2593 + 2609 IwojIEVQcmludHMgU2VydmljZXMgLSBHZW5lcmljIFJlcG9ydGluZyBTeXN0ZW0KIwojIFZlcnNp -b246IDAuMQojCgoKJGMtPntwbHVnaW5zfXsiU2NyZWVuOjpSZXBvcnQifXtwYXJhbXN9e2Rpc2Fi +b246IDMuMAojCgoKJGMtPntwbHVnaW5zfXsiU2NyZWVuOjpSZXBvcnQifXtwYXJhbXN9e2Rpc2Fi bGV9ID0gMDsKCiRjLT57cGx1Z2luc317IkV4cG9ydDo6UmVwb3J0In17cGFyYW1zfXtkaXNhYmxl fSA9IDA7CiRjLT57cGx1Z2luc317IkV4cG9ydDo6UmVwb3J0OjpDU1YifXtwYXJhbXN9e2Rpc2Fi bGV9ID0gMDsKJGMtPntwbHVnaW5zfXsiRXhwb3J0OjpSZXBvcnQ6OkpTT04ifXtwYXJhbXN9e2Rp @@ -67,30 +67,30 @@ ICAgICAgICAiYnl5ZWFyIiA9PiAiLWRhdGUvY3JlYXRvcnNfbmFtZS90aXRsZSIsCiAgICAgICAg ImJ5dGl0bGUiID0+ICJ0aXRsZS9jcmVhdG9yc19uYW1lLy1kYXRlIiwKICAgICAgICAiYnlkaXZp c2lvbiIgPT4gImRpdmlzaW9ucy9jcmVhdG9yc19uYW1lLy1kYXRlIiwKfTsKCiNleHBvcnQgZmll bGQgb3B0aW9ucwokYy0+e2VwcmludF9yZXBvcnR9LT57ZXhwb3J0ZmllbGRzfSA9IHsKICAgICAg -ICBlcHJpbnRfcmVwb3J0X2NvcmUgPT4gWyBxdygKICAgICAgICAgICAgICAgIHRpdGxlCiAgICAg -ICAgICAgICAgICBjcmVhdG9yc19uYW1lCiAgICAgICAgICAgICAgICBhYnN0cmFjdAogICAgICAg -ICAgICAgICAgZGF0ZQogICAgICAgICAgICAgICAga2V5d29yZHMKICAgICAgICAgICAgICAgIGRp -dmlzaW9ucwogICAgICAgICAgICAgICAgc3ViamVjdHMKICAgICAgICAgICAgICAgIHR5cGUKICAg -ICAgICAgICAgICAgIGVkaXRvcnNfbmFtZQogICAgICAgICAgICAgICAgaXNwdWJsaXNoZWQKICAg -ICAgICAgICAgICAgIHJlZmVyZWVkCiAgICAgICAgICAgICAgICBwdWJsaWNhdGlvbgogICAgICAg -ICAgICAgICAgZG9jdW1lbnRfZm9ybWF0CiAgICAgICAgICAgICAgICBkYXRlc3RhbXAKICAgICAg -ICApXSwKfTsKJGMtPntlcHJpbnRfcmVwb3J0fS0+e2V4cG9ydGZpZWxkX2RlZmF1bHRzfSA9IFsg -cXcoCgl0aXRsZQogICAgICAgIGNyZWF0b3JzX25hbWUKICAgICAgICBhYnN0cmFjdAogICAgICAg -IGRhdGUKICAgICAgICBrZXl3b3JkcwogICAgICAgIGRpdmlzaW9ucwogICAgICAgIHN1YmplY3Rz -CiAgICAgICAgdHlwZQogICAgICAgIGVkaXRvcnNfbmFtZQogICAgICAgIGlzcHVibGlzaGVkCiAg -ICAgICAgcmVmZXJlZWQKICAgICAgICBwdWJsaWNhdGlvbgogICAgICAgIGRvY3VtZW50X2Zvcm1h -dAoJZGF0ZXN0YW1wCildOwoKI3NldCBjb25maWcgZm9yIGRlZmF1bHQgdXNlciByZXBvcnQKJGMt -PntkYXRhc2V0c30tPnt1c2VyfS0+e3NlYXJjaH0tPnt1c2VyX3JlcG9ydH0gPSAkYy0+e3NlYXJj -aH0tPnt1c2VyfTsgI3VzZSB0aGUgZGVmYXVsdCB1c2VyIHNlYXJjaCBmb3JtCgojc29ydCBvcHRp -b25zIGZvciBzb3J0aW5nIHdpdGhpbiBlYWNoIGdyb3VwCiRjLT57dXNlcl9yZXBvcnR9LT57c29y -dGZpZWxkc30gPSB7CiAgICAgICAgImJ5bmFtZSIgPT4gIm5hbWUiLAp9OwoKI2V4cG9ydCBmaWVs -ZCBvcHRpb25zCiRjLT57dXNlcl9yZXBvcnR9LT57ZXhwb3J0ZmllbGRzfSA9IHsKICAgICAgICB1 -c2VyX3JlcG9ydF9jb3JlID0+IFsgcXcoCiAgICAgICAgCW5hbWUKCQl1c2VybmFtZQoJCXVzZXJp -ZAoJCWRlcHQKCQlvcmcKCQlhZGRyZXNzCgkJY291bnRlcgoJCXVzZXJ0eXBlCgkJZW1haWwKCSld -LAp9OwoKCiRjLT57dXNlcl9yZXBvcnR9LT57ZXhwb3J0ZmllbGRfZGVmYXVsdHN9ID0gWyBxdygK -ICAgICAgICBuYW1lCgl1c2VybmFtZQoJdXNlcmlkCglkZXB0CglvcmcKCWFkZHJlc3MKCWNvdW50 -ZXIKCXVzZXJ0eXBlCgllbWFpbAopXTsKCgpwdXNoIEB7JGMtPnt1c2VyX3JvbGVzfS0+e2FkbWlu -fX0sIHF3ewogICAgICAgICtyZXBvcnQKfTsKCg== +ICBlcHJpbnRfcmVwb3J0X2NvcmUgPT4gWyBxdygKCQllcHJpbnRpZAogICAgICAgICAgICAgICAg +dGl0bGUKICAgICAgICAgICAgICAgIGNyZWF0b3JzX25hbWUKICAgICAgICAgICAgICAgIGFic3Ry +YWN0CiAgICAgICAgICAgICAgICBkYXRlCiAgICAgICAgICAgICAgICBrZXl3b3JkcwogICAgICAg +ICAgICAgICAgZGl2aXNpb25zCiAgICAgICAgICAgICAgICBzdWJqZWN0cwogICAgICAgICAgICAg +ICAgdHlwZQogICAgICAgICAgICAgICAgZWRpdG9yc19uYW1lCiAgICAgICAgICAgICAgICBpc3B1 +Ymxpc2hlZAogICAgICAgICAgICAgICAgcmVmZXJlZWQKICAgICAgICAgICAgICAgIHB1YmxpY2F0 +aW9uCiAgICAgICAgICAgICAgICBkb2N1bWVudHMuZm9ybWF0CiAgICAgICAgICAgICAgICBkYXRl +c3RhbXAKICAgICAgICApXSwKfTsKJGMtPntlcHJpbnRfcmVwb3J0fS0+e2V4cG9ydGZpZWxkX2Rl +ZmF1bHRzfSA9IFsgcXcoCgllcHJpbnRpZAoJdGl0bGUKICAgICAgICBjcmVhdG9yc19uYW1lCiAg +ICAgICAgYWJzdHJhY3QKICAgICAgICBkYXRlCiAgICAgICAga2V5d29yZHMKICAgICAgICBkaXZp +c2lvbnMKICAgICAgICBzdWJqZWN0cwogICAgICAgIHR5cGUKICAgICAgICBlZGl0b3JzX25hbWUK +ICAgICAgICBpc3B1Ymxpc2hlZAogICAgICAgIHJlZmVyZWVkCiAgICAgICAgcHVibGljYXRpb24K +CWRvY3VtZW50cy5mb3JtYXQKCWRhdGVzdGFtcAopXTsKCiNzZXQgY29uZmlnIGZvciBkZWZhdWx0 +IHVzZXIgcmVwb3J0CiRjLT57ZGF0YXNldHN9LT57dXNlcn0tPntzZWFyY2h9LT57dXNlcl9yZXBv +cnR9ID0gJGMtPntzZWFyY2h9LT57dXNlcn07ICN1c2UgdGhlIGRlZmF1bHQgdXNlciBzZWFyY2gg +Zm9ybQoKI3NvcnQgb3B0aW9ucyBmb3Igc29ydGluZyB3aXRoaW4gZWFjaCBncm91cAokYy0+e3Vz +ZXJfcmVwb3J0fS0+e3NvcnRmaWVsZHN9ID0gewogICAgICAgICJieW5hbWUiID0+ICJuYW1lIiwK +fTsKCiNleHBvcnQgZmllbGQgb3B0aW9ucwokYy0+e3VzZXJfcmVwb3J0fS0+e2V4cG9ydGZpZWxk +c30gPSB7CiAgICAgICAgdXNlcl9yZXBvcnRfY29yZSA9PiBbIHF3KAogICAgICAgIAluYW1lCgkJ +dXNlcm5hbWUKCQl1c2VyaWQKCQlkZXB0CgkJb3JnCgkJYWRkcmVzcwoJCWNvdW50ZXIKCQl1c2Vy +dHlwZQoJCWVtYWlsCgkpXSwKfTsKCgokYy0+e3VzZXJfcmVwb3J0fS0+e2V4cG9ydGZpZWxkX2Rl +ZmF1bHRzfSA9IFsgcXcoCiAgICAgICAgbmFtZQoJdXNlcm5hbWUKCXVzZXJpZAoJZGVwdAoJb3Jn +CglhZGRyZXNzCgljb3VudGVyCgl1c2VydHlwZQoJZW1haWwKKV07CgoKcHVzaCBAeyRjLT57dXNl +cl9yb2xlc30tPnthZG1pbn19LCBxd3sKICAgICAgICArcmVwb3J0Cn07Cgo= @@ -179,9 +179,9 @@ dDpzb3J0OmJ5bmFtZSI+TmFtZTwvZXBwOnBocmFzZT4KCjwvZXBwOnBocmFzZXM+Cg== plugins/EPrints/Plugin/Export/Grid2.pm text/plain - facf6666f0b9757b6b43e6fd20559099 + dd9b2c0a038b1f9f51b618a4b2e11c4b MD5 - 7787 + 9699 PWhlYWQxIE5BTUUKCkVQcmludHM6OlBsdWdpbjo6RXhwb3J0OjpHcmlkMgoKPWN1dAoKcGFja2Fn ZSBFUHJpbnRzOjpQbHVnaW46OkV4cG9ydDo6R3JpZDI7Cgp1c2UgRGF0YTo6RHVtcGVyOwp1c2Ug RVByaW50czo6UGx1Z2luOjpFeHBvcnQ7CgpASVNBID0gKCAiRVByaW50czo6UGx1Z2luOjpFeHBv @@ -204,121 +204,155 @@ ICAgICAgIHsKICAgICAgICAgICAgICAgIAlwdXNoIEBuYW1lcywgJGRzLT5yZXBvc2l0b3J5LT5o dG1sX3BocmFzZSggImV4cG9ydGZpZWxkb3B0aW9uczokZiIgKTsKICAgICAgICAgICAgICAgIH0K CQllbHNlCgkJewoJCQlteSAkZmllbGQgPSBFUHJpbnRzOjpVdGlsczo6ZmllbGRfZnJvbV9jb25m aWdfc3RyaW5nKCAkZHMsICRmICk7CgoJCQlpZiAoJGZpZWxkLT5pc2EoIkVQcmludHM6Ok1ldGFG -aWVsZDo6TXVsdGlwYXJ0IikpCgkJCXsKCQkJCW15ICRuYW1lID0gJGZpZWxkLT5uYW1lOwoJCQkJ -cHVzaCBAbmFtZXMsIG1hcCB7CgkJCQkJJG5hbWUgLiAnLicgLiAkXy0+e3N1Yl9uYW1lfQoJCQkJ -fSBAeyRmaWVsZC0+cHJvcGVydHkoImZpZWxkc19jYWNoZSIpfTsKCQkJfQoJCQllbHNlCgkJCXsK -CQkJCXB1c2ggQG5hbWVzLCAkZmllbGQtPm5hbWU7CgkJCX0KCQl9Cgl9CQkKCXJldHVybiBAbmFt -ZXM7Cn0KCnN1YiBkYXRhb2JqX3RvX3Jvd3MKewoJbXkoICRzZWxmLCAkZGF0YW9iaiwgJW9wdHMg -KSA9IEBfOwoKCW15ICRtYWluX2RhdGFvYmogPSAkZGF0YW9iajsgI3N0b3JlIGRhdGFvYmogZm9y -IGZ1dHVyZSByZWZlcmVuY2UKCglteSAkZmllbGRzID0gJG9wdHN7ZmllbGRzfSB8fCBbJHNlbGYt -PmZpZWxkcygkZGF0YW9iai0+e2RhdGFzZXR9KV07CglteSAkZHMgPSAkb3B0c3tsaXN0fS0+e2Rh -dGFzZXR9OwoKCW15IEByb3dzID0gKFtdKTsKCWZvcmVhY2ggbXkgJGZuYW1lIChAJGZpZWxkcykK -CXsKCQkjcmVzZXQgZGF0YW9iaiB0byBtYWluIGRhdGFvYmoKCQkkZGF0YW9iaiA9ICRtYWluX2Rh -dGFvYmo7CgoJCSNnZXQgdGhlIGZpZWxkIGZyb20gdGhlIGlkCgkJbXkgJGZpZWxkOwoJCW15IEBm -bmFtZXMgPSBzcGxpdCggL1wuLywgJGZuYW1lICk7CgkJbXkgJHN1Yl9kYXRhb2JqX3ZhbHVlcyA9 -IFtdOwkJCgkJaWYoIHNjYWxhciggQGZuYW1lcyA+IDEgKSApICNhIGZpZWxkIG9mIGFub3RoZXIg -ZGF0YXNldCwgZS5nLiBkb2N1bWVudHMuY29udGVudAogICAgICAgICAgICAgICAgewoJCQkkZmll -bGQgPSAkZHMtPmdldF9maWVsZCggJGZuYW1lc1swXSApOyAjZmlyc3QgZ2V0IHRoZSBmaWVsZAoJ -CQlpZiggJGZpZWxkLT5pc190eXBlKCAic3Vib2JqZWN0IiwgIml0ZW1yZWYiICkgKSAjaWYgdGhl -IGZpZWxkIGJlbG9uZ3MgdG8gYW5vdGhlciBkYXRhc2V0CiAgICAgICAgICAgICAgICAgICAgICAg -IHsKCQkJCW15ICRzdWJfZHNfaWQgPSAkZmllbGQtPmdldF9wcm9wZXJ0eSggImRhdGFzZXRpZCIg -KTsKCQkJCW15ICRtdWx0aXBsZSA9ICRmaWVsZC0+Z2V0X3Byb3BlcnR5KCAibXVsdGlwbGUiICk7 -CgkJCQlpZiggJG11bHRpcGxlICkKCQkJCXsKCQkJCQlteSBAc3ViX2RhdGFvYmpzOwoJCQkJCSNn -ZXQgdGhlIGRhdGFvYmpzIG9mIHRoaXMgZmllbGQKCQkJCQlpZiggJHN1Yl9kc19pZCBlcSAiZG9j -dW1lbnQiICkgI2RvY3VtZW50cyByZXByZXNlbnQgYSBzcGVjaWFsIGNhc2Ugb2Ygc3ViIG9iamVj -dCAtIHdlIGRvbid0IHdhbnQgdm9sYXRpbGUgZG9jdW1lbnRzIChwcm9iYWJseSkKICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsJCgkJCQkJCUBzdWJfZGF0YW9ianMgPSAk -ZGF0YW9iai0+Z2V0X2FsbF9kb2N1bWVudHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNl -CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CgkJCQkJCWZvcmVhY2gg -bXkgJHN1Yl9vYmogKCBAeyRkYXRhb2JqLT52YWx1ZSggJGZuYW1lc1swXSApfSApCgkJCQkJCXsK -CQkJCQkJCXB1c2ggQHN1Yl9kYXRhb2JqcywgJGZpZWxkLT5nZXRfaXRlbSggJGRhdGFvYmotPnJl -cG9zaXRvcnksICRzdWJfb2JqICk7CgkJCQkJCX0KICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgIH0KCQkJCQkKCQkJCQkjYW5kIGJ1aWxkIHVwIGFuIGFycmF5IG9mIHRoZXNl -IHN1YiBkYXRhb2JqJ3MgdmFsdWVzCgkJCQkJZm9yZWFjaCBteSAkb2JqICggQHN1Yl9kYXRhb2Jq -cyApICNnZXQgdGhlIHZhbHVlcyB3ZSBhcmUgcmVxdWVzdGluZyBvZiB0aGUgZGF0YW9iamVjdHMK -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKCQkJCQkJI2NoZWNrIGZv -ciBhIGN1c3RvbSByZW5kZXJlcgoJCQkJCQlteSAkdmFsdWU7CgkJCQkJCWlmKCBkZWZpbmVkICRv -cHRze2N1c3RvbV9leHBvcnR9ICYmIGRlZmluZWQgJG9wdHN7Y3VzdG9tX2V4cG9ydH0tPnskZm5h -bWV9ICkKCQkJCQkJewoJCQkJCQkJJHZhbHVlID0gJG9wdHN7Y3VzdG9tX2V4cG9ydH0tPnskZm5h -bWV9LT4oICRvYmosICRvcHRze3BsdWdpbn0gKTsKCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsJ -CQkJCQkJCgkJCQkJCQkkZmllbGQgPSBFUHJpbnRzOjpVdGlsczo6ZmllbGRfZnJvbV9jb25maWdf -c3RyaW5nKCAkb2JqLT5kYXRhc2V0LCAkZm5hbWVzWzFdICk7CQkJCQkJCQoJCQkJCQkJaWYoICRm -aWVsZC0+Z2V0X3Byb3BlcnR5KCAidmlydHVhbCIgKSApICN2aXJ0dWFsIGZpZWxkcyBuZWVkIHJl -bmRlcmluZwoJCQkJCQkJewoJCQkJCQkJCSR2YWx1ZSA9IEVQcmludHM6OlV0aWxzOjp0cmVlX3Rv -X3V0ZjgoICRvYmotPnJlbmRlcl92YWx1ZSggJGZuYW1lc1sxXSApICk7CgkJCQkJCQl9CgkJCQkJ -CQllbHNlICNyZWd1bGFyIGZpZWxkIHZhbHVlcyBjYW4gc2ltcGx5IGJlIHJldHJpZXZlZAoJCQkJ -CQkJewoJCQkJCQkJCSR2YWx1ZSA9ICRmaWVsZC0+Z2V0X3ZhbHVlKCAkb2JqICk7CgkJCQkJCQl9 -CgkJCQkJCX0KCQkJCQkJcHVzaCBAeyRzdWJfZGF0YW9ial92YWx1ZXN9LCAkdmFsdWU7IAoJCQkJ -CX0KCQkJCX0KCQkJCWVsc2UgI3dlIG9ubHkgaGF2ZSBvbmUgc3ViLW9iamVjdCwgCgkJCQl7CgkJ -CQkJbXkgJHN1Yl9vYmogPSAkZmllbGQtPmdldF9pdGVtKCAkZGF0YW9iai0+cmVwb3NpdG9yeSwg -JGRhdGFvYmotPnZhbHVlKCAkZm5hbWVzWzBdICkgKTsgI2dldCB0aGUgc3Vib2JqZWN0CgkJCQkJ -JGZpZWxkID0gRVByaW50czo6VXRpbHM6OmZpZWxkX2Zyb21fY29uZmlnX3N0cmluZyggJHN1Yl9v -YmotPmRhdGFzZXQsICRmbmFtZXNbMV0gKTsgI2dldCB0aGUgc3Vib2JqZWN0cyBmaWVsZAoJCQkJ -CW15ICR2YWx1ZSA9ICRmaWVsZC0+Z2V0X3ZhbHVlKCAkc3ViX29iaiApOyAjZ2V0IHRoZSBzdWJv -YmplY3RzIHZhbHVlIGZvciB0aGlzIGZpZWxkCgkJCQkJcHVzaCBAeyRzdWJfZGF0YW9ial92YWx1 -ZXN9LCAkdmFsdWU7CQkJCQkJCgkJCQl9CgkJCX0KCQl9CgoJCW15ICRpID0gQHskcm93c1swXX07 -CgkJbXkgJF9yb3dzOwoJCWlmKCBFUHJpbnRzOjpVdGlsczo6aXNfc2V0KCAkZmllbGQgKSApICN3 -ZSBhbHJlYWR5IGhhdmUgb3VyIHZhbHVlcwoJCXsKCQkJaWYoIHNjYWxhciBAeyRzdWJfZGF0YW9i -al92YWx1ZXN9ID4gMCApCgkJCXsKCQkJCSRfcm93cyA9ICRzZWxmLT52YWx1ZV90b19yb3dzKCRm -aWVsZCwgJHN1Yl9kYXRhb2JqX3ZhbHVlcyk7CQkJCgkJCX0KCQkJZWxzZSAjdGhlcmUncyBubyBy -ZXN1bHRzLCBidXQgd2Ugc3RpbGwgbmVlZCB0byBhZGQgYW4gZW1wdHkgY2VsbCB0byB0aGUgc3By -ZWFkc2hlZXQKCQkJewoJCQkJJF9yb3dzID0gJHNlbGYtPnZhbHVlX3RvX3Jvd3MoJGZpZWxkLCB1 -bmRlZik7CgkJCX0KCQl9CgkJZWxzZSAjd2UgbmVlZCB0byByZXRyaWV2ZSBvdXIgdmFsdWVzIGZv -ciB0aGlzIGZpZWxkIGZyb20gb3VyIGRhdGFvYmogKG9yIHN1Yl9kYXRhb2JqKQoJCXsKCQkJbXkg -JHZhbHVlOwoJCQlpZiggZGVmaW5lZCAkb3B0c3tjdXN0b21fZXhwb3J0fSAmJiBkZWZpbmVkICRv -cHRze2N1c3RvbV9leHBvcnR9LT57JGZuYW1lfSApICN3ZSBoYXZlIGEgY3VzdG9tIGV4cG9ydGVy -CgkJCXsKCQkJCSR2YWx1ZSA9ICRvcHRze2N1c3RvbV9leHBvcnR9LT57JGZuYW1lfS0+KCAkZGF0 -YW9iaiwgJG9wdHN7cGx1Z2lufSApOwoJCQkJJF9yb3dzID0gJHNlbGYtPmN1c3RvbV92YWx1ZV90 -b19yb3dzKCAkdmFsdWUgKTsKCQkJfQoJCQllbHNlICNqdXN0IGdldCB0aGUgZmllbGQncyB1c3Vh -bCB2YWx1ZQoJCQl7CgkJCQkkZmllbGQgPSBFUHJpbnRzOjpVdGlsczo6ZmllbGRfZnJvbV9jb25m -aWdfc3RyaW5nKCAkZHMsICRmbmFtZSApOwoJCQkJaWYoICRmaWVsZC0+Z2V0X3Byb3BlcnR5KCAi -dmlydHVhbCIgKSApICN2aXJ0dWFsIGZpZWxkcyBuZWVkIHJlbmRlcmluZwoJCQkJewoJCQkJCSR2 -YWx1ZSA9IEVQcmludHM6OlV0aWxzOjp0cmVlX3RvX3V0ZjgoICRkYXRhb2JqLT5yZW5kZXJfdmFs -dWUoICRmbmFtZSApICk7CgkJCQl9CgkJCQllbHNlICNyZWd1bGFyIGZpZWxkIHZhbHVlcyBjYW4g -c2ltcGx5IGJlIHJldHJpZXZlZAoJCQkJewoJCQkJCSR2YWx1ZSA9ICRmaWVsZC0+Z2V0X3ZhbHVl -KCAkZGF0YW9iaiApOwoJCQkJfQoJCQkJJF9yb3dzID0gJHNlbGYtPnZhbHVlX3RvX3Jvd3MoJGZp -ZWxkLCAkdmFsdWUpOyAJCQoJCQl9CQkJCgkJfQoKCQlmb3JlYWNoIG15ICRqICgwLi4kIyRfcm93 -cykKCQl7CgkJCWZvcmVhY2ggbXkgJF9pICgwLi4kI3skX3Jvd3MtPlskal19KQoJCQl7CgkJCQkk -cm93c1skal1bJGkrJF9pXSA9ICRfcm93cy0+WyRqXVskX2ldOwoJCQl9CgkJfQoJfQoKCSMgZ2Vu -ZXJhdGUgY29tcGxldGUgcm93cwoJaWYoJG9wdHN7cGx1Z2lufS0+cGFyYW0oICJtdWx0aWxpbmVf -cmVwZWF0IiApKSAjd2Ugd2FudCBlYWNoIGNvbHVtbiB0byByZXBlYXQgZm9yIGVhY2ggcm93Cgl7 -CgkJZm9yZWFjaCBteSAkaSAoMC4uKHNjYWxhciBAcm93cyktMSkKCQl7CgkJCWZvcmVhY2ggbXkg -JGogKDAuLiQjeyRyb3dzWzBdfSkKCQkJewoJCQkJJHJvd3NbJGldWyRqXSB8fD0gJHJvd3NbMF1b -JGpdOwoJCQl9CQoJCX0KCX0KCWVsc2UgI3dlIGRvbid0IHdhbnQgcmVwZWF0aW5nIHZhbHVlcyBp -biB0aGUgY29sdW1ucwoJewkKCQlmb3IoQHJvd3MpIHsKCQkJJF8tPlswXSA9ICRyb3dzWzBdWzBd -OyAjZmlyc3QgZWxlbWVudCBvZiB0aGlzIGFycmF5IGVxdWFscyB0aGUgZmlyc3QgZWxlbWVudCBv -ZiB0aGUgZmlyc3Qgcm93CgkJCSRfLT5bJCN7JHJvd3NbMF19XSB8fD0gdW5kZWY7CgkJfQoKCX0K -CglyZXR1cm4gXEByb3dzOwp9CgpzdWIgdmFsdWVfdG9fcm93cwp7CglteSAoJHNlbGYsICRmaWVs -ZCwgJHZhbHVlKSA9IEBfOwoKCW15IEByb3dzOwoKCWlmIChyZWYoJHZhbHVlKSBlcSAiQVJSQVki -KQoJewoJCSR2YWx1ZSA9IFskZmllbGQtPmVtcHR5X3ZhbHVlXSBpZiAhQCR2YWx1ZTsKCQlAcm93 -cyA9IG1hcCB7ICRzZWxmLT52YWx1ZV90b19yb3dzKCRmaWVsZCwgJF8pLT5bMF0gfSBAJHZhbHVl -OwoJfQoJZWxzaWYgKCRmaWVsZC0+aXNhKCJFUHJpbnRzOjpNZXRhRmllbGQ6Ok11bHRpcGFydCIp -KQoJewoJCXB1c2ggQHJvd3MsIFttYXAgeyAkdmFsdWUtPnskXy0+e3N1Yl9uYW1lfX0gfSBAeyRm -aWVsZC0+cHJvcGVydHkoImZpZWxkc19jYWNoZSIpfV07Cgl9CgllbHNlCgl7CgkJcHVzaCBAcm93 -cywgWyR2YWx1ZV07Cgl9CgoJcmV0dXJuIFxAcm93czsKfQoKI3VzZWQgZm9yIGN1c3RvbSBleHBv -cnRzIHRoYXQgbWlnaHQgcmV0dXJuIGEgZmllbGQgb3IgYW4gYXJyYXkgKGJ1dCBhcmVuJ3QgbmVj -ZXNhcmlseSBhc3NvY2lhdGVkIHdpdGggYSBmaWVsZCEpCnN1YiBjdXN0b21fdmFsdWVfdG9fcm93 -cwp7CiAgICAgICAgbXkgKCRzZWxmLCAkdmFsdWUpID0gQF87CgogICAgICAgIG15IEByb3dzOwoK -ICAgICAgICBpZiAocmVmKCR2YWx1ZSkgZXEgIkFSUkFZIikKICAgICAgICB7CiAgICAgICAgICAg -ICAgICBAcm93cyA9IG1hcCB7ICRzZWxmLT5jdXN0b21fdmFsdWVfdG9fcm93cygkXyktPlswXSB9 -IEAkdmFsdWU7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgICAg -ICBwdXNoIEByb3dzLCBbJHZhbHVlXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBcQHJvd3M7 -Cn0KCgoxOwoKPWhlYWQxIENPUFlSSUdIVAoKPWZvciBDT1BZUklHSFQgQkVHSU4KCkNvcHlyaWdo -dCAyMDAwLTIwMTEgVW5pdmVyc2l0eSBvZiBTb3V0aGFtcHRvbi4KCj1mb3IgQ09QWVJJR0hUIEVO -RAoKPWZvciBMSUNFTlNFIEJFR0lOCgpUaGlzIGZpbGUgaXMgcGFydCBvZiBFUHJpbnRzIEw8aHR0 -cDovL3d3dy5lcHJpbnRzLm9yZy8+LgoKRVByaW50cyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2Fu -IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CnVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg -R05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZApieSB0aGUgRnJl -ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBv -cgooYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKRVByaW50cyBpcyBkaXN0cmli -dXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVApBTlkg -V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFC -SUxJVFkgb3IKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBM -ZXNzZXIgR2VuZXJhbCBQdWJsaWMKTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKWW91IHNob3Vs -ZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwpM -aWNlbnNlIGFsb25nIHdpdGggRVByaW50cy4gIElmIG5vdCwgc2VlIEw8aHR0cDovL3d3dy5nbnUu -b3JnL2xpY2Vuc2VzLz4uCgo9Zm9yIExJQ0VOU0UgRU5ECgo= +aWVsZDo6TXVsdGlwYXJ0IikpCgkJCXsKCQkJCW15ICRwYXJlbnRfbmFtZSA9ICRmaWVsZC0+cmVu +ZGVyX25hbWU7CgkJCQlpZiggJGZpZWxkLT5pc2EoICJFUHJpbnRzOjpNZXRhRmllbGQ6Ok5hbWUi +ICkpICNuZWVkIHRvIGRlYWwgd2l0aCBsZWdhY3kgcGhyYXNlIGlkJ3MKCQkJCXsKCQkJCQlmb3Jl +YWNoIG15ICRiaXQgKCAkZmllbGQtPmdldF9pbnB1dF9iaXRzKCkgKQoJCQkJICAgICAgICB7CgkJ +CQkJCSRiaXQgPSAiZ2l2ZW5fbmFtZXMiIGlmKCAkYml0IGVxICJnaXZlbiIgKTsKICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJJGJpdCA9ICJmYW1pbHlfbmFt +ZXMiIGlmKCAkYml0IGVxICJmYW1pbHkiICk7CgkJCQkJCW15ICRjdXN0b21fcGhyYXNlID0gJGZp +ZWxkLT5uYW1lIC4gIl8iIC4gJGJpdDsKCQkJCQkJaWYoICRkcy0+cmVwb3NpdG9yeS0+Z2V0X2xh +bmctPmhhc19waHJhc2UoICRjdXN0b21fcGhyYXNlICkgKSAjYWxsb3cgYSBjdXN0b20gcGhyYXNl +IHRvIGJlIHVzZWQKCQkJCQkJewoJCQkJCQkJcHVzaCBAbmFtZXMsICRkcy0+cmVwb3NpdG9yeS0+ +aHRtbF9waHJhc2UoICRjdXN0b21fcGhyYXNlICk7CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7 +CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlwdXNoIEBu +YW1lcywgJHBhcmVudF9uYW1lIC4gIjogIiAuICRkcy0+cmVwb3NpdG9yeS0+aHRtbF9waHJhc2Uo +ICJsaWIvbWV0YWZpZWxkOiIuJGJpdCApOwoJCQkJCQl9CiAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICB9CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJbXkgJG5hbWUgPSAk +ZmllbGQtPm5hbWU7CgkJCQkJcHVzaCBAbmFtZXMsIG1hcCB7CgkJCQkJCSRuYW1lIC4gJy4nIC4g +JF8tPntzdWJfbmFtZX0KCQkJCQl9IEB7JGZpZWxkLT5wcm9wZXJ0eSgiZmllbGRzX2NhY2hlIil9 +OwoJCQkJfQoJCQl9CgkJCWVsc2lmKCAkZmllbGQtPmlzYSgiRVByaW50czo6TWV0YUZpZWxkOjpD +b21wb3VuZCIgKSApCgkJCXsKCQkJCWZvcmVhY2ggbXkgJHN1Yl9maWVsZCAoQHskZmllbGQtPnBy +b3BlcnR5KCJmaWVsZHNfY2FjaGUiKX0pCgkJCQl7CgkJCQkJbXkgJGN1c3RvbV9waHJhc2UgPSAk +ZmllbGQtPm5hbWUgLiAiXyIgLiAkc3ViX2ZpZWxkLT5uYW1lOwoJCQkJCWlmKCAkZHMtPnJlcG9z +aXRvcnktPmdldF9sYW5nLT5oYXNfcGhyYXNlKCAkY3VzdG9tX3BocmFzZSApICkgI2FsbG93IGEg +Y3VzdG9tIHBocmFzZSB0byBiZSB1c2VkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJcHVzaCBA +bmFtZXMsICRkcy0+cmVwb3NpdG9yeS0+aHRtbF9waHJhc2UoICRjdXN0b21fcGhyYXNlICk7CiAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgkJCQkJZWxzZQoJCQkJCXsK +CQkJCQkJcHVzaCBAbmFtZXMsICRmaWVsZC0+cmVuZGVyX25hbWUgLiAiOiAiIC4gJHN1Yl9maWVs +ZC0+cmVuZGVyX25hbWU7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcHVzaCBA +bmFtZXMsICRmaWVsZC0+cmVuZGVyX25hbWU7CgkJCX0KCQl9Cgl9CQkKCXJldHVybiBAbmFtZXM7 +Cn0KCnN1YiBkYXRhb2JqX3RvX3Jvd3MKewoJbXkoICRzZWxmLCAkZGF0YW9iaiwgJW9wdHMgKSA9 +IEBfOwoKCW15ICRtYWluX2RhdGFvYmogPSAkZGF0YW9iajsgI3N0b3JlIGRhdGFvYmogZm9yIGZ1 +dHVyZSByZWZlcmVuY2UKCglteSAkZmllbGRzID0gJG9wdHN7ZmllbGRzfSB8fCBbJHNlbGYtPmZp +ZWxkcygkZGF0YW9iai0+e2RhdGFzZXR9KV07CglteSAkZHMgPSAkb3B0c3tsaXN0fS0+e2RhdGFz +ZXR9OwoKCW15IEByb3dzID0gKFtdKTsKCWZvcmVhY2ggbXkgJGZuYW1lIChAJGZpZWxkcykKCXsK +CQkjcmVzZXQgZGF0YW9iaiB0byBtYWluIGRhdGFvYmoKCQkkZGF0YW9iaiA9ICRtYWluX2RhdGFv +Ymo7CgoJCSNnZXQgdGhlIGZpZWxkIGZyb20gdGhlIGlkCgkJbXkgJGZpZWxkOwoJCW15IEBmbmFt +ZXMgPSBzcGxpdCggL1wuLywgJGZuYW1lICk7CgkJbXkgJHN1Yl9kYXRhb2JqX3ZhbHVlcyA9IFtd +OwkJCgkJaWYoIHNjYWxhciggQGZuYW1lcyA+IDEgKSApICNhIGZpZWxkIG9mIGFub3RoZXIgZGF0 +YXNldCwgZS5nLiBkb2N1bWVudHMuY29udGVudAogICAgICAgICAgICAgICAgewoJCQkkZmllbGQg +PSAkZHMtPmdldF9maWVsZCggJGZuYW1lc1swXSApOyAjZmlyc3QgZ2V0IHRoZSBmaWVsZAoJCQlp +ZiggJGZpZWxkLT5pc190eXBlKCAic3Vib2JqZWN0IiwgIml0ZW1yZWYiICkgKSAjaWYgdGhlIGZp +ZWxkIGJlbG9uZ3MgdG8gYW5vdGhlciBkYXRhc2V0CiAgICAgICAgICAgICAgICAgICAgICAgIHsK +CQkJCW15ICRzdWJfZHNfaWQgPSAkZmllbGQtPmdldF9wcm9wZXJ0eSggImRhdGFzZXRpZCIgKTsK +CQkJCW15ICRtdWx0aXBsZSA9ICRmaWVsZC0+Z2V0X3Byb3BlcnR5KCAibXVsdGlwbGUiICk7CgkJ +CQlpZiggJG11bHRpcGxlICkKCQkJCXsKCQkJCQlteSBAc3ViX2RhdGFvYmpzOwoJCQkJCSNnZXQg +dGhlIGRhdGFvYmpzIG9mIHRoaXMgZmllbGQKCQkJCQlpZiggJHN1Yl9kc19pZCBlcSAiZG9jdW1l +bnQiICkgI2RvY3VtZW50cyByZXByZXNlbnQgYSBzcGVjaWFsIGNhc2Ugb2Ygc3ViIG9iamVjdCAt +IHdlIGRvbid0IHdhbnQgdm9sYXRpbGUgZG9jdW1lbnRzIChwcm9iYWJseSkKICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsJCgkJCQkJCUBzdWJfZGF0YW9ianMgPSAkZGF0 +YW9iai0+Z2V0X2FsbF9kb2N1bWVudHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CgkJCQkJCWZvcmVhY2ggbXkg +JHN1Yl9vYmogKCBAeyRkYXRhb2JqLT52YWx1ZSggJGZuYW1lc1swXSApfSApCgkJCQkJCXsKCQkJ +CQkJCXB1c2ggQHN1Yl9kYXRhb2JqcywgJGZpZWxkLT5nZXRfaXRlbSggJGRhdGFvYmotPnJlcG9z +aXRvcnksICRzdWJfb2JqICk7CgkJCQkJCX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgIH0KCQkJCQkKCQkJCQkjYW5kIGJ1aWxkIHVwIGFuIGFycmF5IG9mIHRoZXNlIHN1 +YiBkYXRhb2JqJ3MgdmFsdWVzCgkJCQkJZm9yZWFjaCBteSAkb2JqICggQHN1Yl9kYXRhb2JqcyAp +ICNnZXQgdGhlIHZhbHVlcyB3ZSBhcmUgcmVxdWVzdGluZyBvZiB0aGUgZGF0YW9iamVjdHMKICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKCQkJCQkJI2NoZWNrIGZvciBh +IGN1c3RvbSByZW5kZXJlcgoJCQkJCQlteSAkdmFsdWU7CgkJCQkJCWlmKCBkZWZpbmVkICRvcHRz +e2N1c3RvbV9leHBvcnR9ICYmIGRlZmluZWQgJG9wdHN7Y3VzdG9tX2V4cG9ydH0tPnskZm5hbWV9 +ICkKCQkJCQkJewoJCQkJCQkJJHZhbHVlID0gJG9wdHN7Y3VzdG9tX2V4cG9ydH0tPnskZm5hbWV9 +LT4oICRvYmosICRvcHRze3BsdWdpbn0gKTsKCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsJCQkJ +CQkJCgkJCQkJCQkkZmllbGQgPSBFUHJpbnRzOjpVdGlsczo6ZmllbGRfZnJvbV9jb25maWdfc3Ry +aW5nKCAkb2JqLT5kYXRhc2V0LCAkZm5hbWVzWzFdICk7CQkJCQkJCQoJCQkJCQkJaWYoICRmaWVs +ZC0+Z2V0X3Byb3BlcnR5KCAidmlydHVhbCIgKSApICN2aXJ0dWFsIGZpZWxkcyBuZWVkIHJlbmRl +cmluZwoJCQkJCQkJewoJCQkJCQkJCSR2YWx1ZSA9IEVQcmludHM6OlV0aWxzOjp0cmVlX3RvX3V0 +ZjgoICRvYmotPnJlbmRlcl92YWx1ZSggJGZuYW1lc1sxXSApICk7CgkJCQkJCQl9CgkJCQkJCQll +bHNlICNyZWd1bGFyIGZpZWxkIHZhbHVlcyBjYW4gc2ltcGx5IGJlIHJldHJpZXZlZAoJCQkJCQkJ +ewoJCQkJCQkJCSR2YWx1ZSA9ICRmaWVsZC0+Z2V0X3ZhbHVlKCAkb2JqICk7CgkJCQkJCQl9CgkJ +CQkJCX0KCQkJCQkJcHVzaCBAeyRzdWJfZGF0YW9ial92YWx1ZXN9LCAkdmFsdWU7IAoJCQkJCX0K +CQkJCX0KCQkJCWVsc2UgI3dlIG9ubHkgaGF2ZSBvbmUgc3ViLW9iamVjdCwgCgkJCQl7CgkJCQkJ +bXkgJHN1Yl9vYmogPSAkZmllbGQtPmdldF9pdGVtKCAkZGF0YW9iai0+cmVwb3NpdG9yeSwgJGRh +dGFvYmotPnZhbHVlKCAkZm5hbWVzWzBdICkgKTsgI2dldCB0aGUgc3Vib2JqZWN0CgkJCQkJJGZp +ZWxkID0gRVByaW50czo6VXRpbHM6OmZpZWxkX2Zyb21fY29uZmlnX3N0cmluZyggJHN1Yl9vYmot +PmRhdGFzZXQsICRmbmFtZXNbMV0gKTsgI2dldCB0aGUgc3Vib2JqZWN0cyBmaWVsZAoJCQkJCW15 +ICR2YWx1ZSA9ICRmaWVsZC0+Z2V0X3ZhbHVlKCAkc3ViX29iaiApOyAjZ2V0IHRoZSBzdWJvYmpl +Y3RzIHZhbHVlIGZvciB0aGlzIGZpZWxkCgkJCQkJcHVzaCBAeyRzdWJfZGF0YW9ial92YWx1ZXN9 +LCAkdmFsdWU7CQkJCQkJCgkJCQl9CgkJCX0KCQl9CgoJCW15ICRpID0gQHskcm93c1swXX07CgkJ +bXkgJF9yb3dzOwoJCWlmKCBFUHJpbnRzOjpVdGlsczo6aXNfc2V0KCAkZmllbGQgKSApICN3ZSBh +bHJlYWR5IGhhdmUgb3VyIHZhbHVlcwoJCXsKCQkJaWYoIHNjYWxhciBAeyRzdWJfZGF0YW9ial92 +YWx1ZXN9ID4gMCApCgkJCXsKCQkJCSRfcm93cyA9ICRzZWxmLT52YWx1ZV90b19yb3dzKCRmaWVs +ZCwgJHN1Yl9kYXRhb2JqX3ZhbHVlcyk7CQkJCgkJCX0KCQkJZWxzZSAjdGhlcmUncyBubyByZXN1 +bHRzLCBidXQgd2Ugc3RpbGwgbmVlZCB0byBhZGQgYW4gZW1wdHkgY2VsbCB0byB0aGUgc3ByZWFk +c2hlZXQKCQkJewoJCQkJJF9yb3dzID0gJHNlbGYtPnZhbHVlX3RvX3Jvd3MoJGZpZWxkLCB1bmRl +Zik7CgkJCX0KCQl9CgkJZWxzZSAjd2UgbmVlZCB0byByZXRyaWV2ZSBvdXIgdmFsdWVzIGZvciB0 +aGlzIGZpZWxkIGZyb20gb3VyIGRhdGFvYmogKG9yIHN1Yl9kYXRhb2JqKQoJCXsKCQkJbXkgJHZh +bHVlOwoJCQlpZiggZGVmaW5lZCAkb3B0c3tjdXN0b21fZXhwb3J0fSAmJiBkZWZpbmVkICRvcHRz +e2N1c3RvbV9leHBvcnR9LT57JGZuYW1lfSApICN3ZSBoYXZlIGEgY3VzdG9tIGV4cG9ydGVyCgkJ +CXsKCQkJCSR2YWx1ZSA9ICRvcHRze2N1c3RvbV9leHBvcnR9LT57JGZuYW1lfS0+KCAkZGF0YW9i +aiwgJG9wdHN7cGx1Z2lufSApOwoJCQkJJF9yb3dzID0gJHNlbGYtPmN1c3RvbV92YWx1ZV90b19y +b3dzKCAkdmFsdWUgKTsKCQkJfQoJCQllbHNlICNqdXN0IGdldCB0aGUgZmllbGQncyB1c3VhbCB2 +YWx1ZQoJCQl7CgkJCQkkZmllbGQgPSBFUHJpbnRzOjpVdGlsczo6ZmllbGRfZnJvbV9jb25maWdf +c3RyaW5nKCAkZHMsICRmbmFtZSApOwoJCQkJaWYoICRmaWVsZC0+Z2V0X3Byb3BlcnR5KCAidmly +dHVhbCIgKSApICN2aXJ0dWFsIGZpZWxkcyBuZWVkIHJlbmRlcmluZwoJCQkJewoJCQkJCSR2YWx1 +ZSA9IEVQcmludHM6OlV0aWxzOjp0cmVlX3RvX3V0ZjgoICRkYXRhb2JqLT5yZW5kZXJfdmFsdWUo +ICRmbmFtZSApICk7CgkJCQl9CgkJCQllbHNlICNyZWd1bGFyIGZpZWxkIHZhbHVlcyBjYW4gc2lt +cGx5IGJlIHJldHJpZXZlZAoJCQkJewoJCQkJCSR2YWx1ZSA9ICRmaWVsZC0+Z2V0X3ZhbHVlKCAk +ZGF0YW9iaiApOwoJCQkJfQoJCQkJJF9yb3dzID0gJHNlbGYtPnZhbHVlX3RvX3Jvd3MoJGZpZWxk +LCAkdmFsdWUpOyAJCQoJCQl9CQkJCgkJfQoKCQlmb3JlYWNoIG15ICRqICgwLi4kIyRfcm93cykK +CQl7CgkJCWZvcmVhY2ggbXkgJF9pICgwLi4kI3skX3Jvd3MtPlskal19KQoJCQl7CgkJCQkkcm93 +c1skal1bJGkrJF9pXSA9ICRfcm93cy0+WyRqXVskX2ldOwoJCQl9CgkJfQoJfQoKCSMgZ2VuZXJh +dGUgY29tcGxldGUgcm93cwoJaWYoJG9wdHN7cGx1Z2lufS0+cGFyYW0oICJtdWx0aWxpbmVfcmVw +ZWF0IiApKSAjd2Ugd2FudCBlYWNoIGNvbHVtbiB0byByZXBlYXQgZm9yIGVhY2ggcm93Cgl7CgkJ +Zm9yZWFjaCBteSAkaSAoMC4uKHNjYWxhciBAcm93cyktMSkKCQl7CgkJCWZvcmVhY2ggbXkgJGog +KDAuLiQjeyRyb3dzWzBdfSkKCQkJewoJCQkJJHJvd3NbJGldWyRqXSB8fD0gJHJvd3NbMF1bJGpd +OwoJCQl9CQoJCX0KCX0KCWVsc2UgI3dlIGRvbid0IHdhbnQgcmVwZWF0aW5nIHZhbHVlcyBpbiB0 +aGUgY29sdW1ucwoJewkKCQlmb3IoQHJvd3MpIHsKCQkJJF8tPlswXSA9ICRyb3dzWzBdWzBdOyAj +Zmlyc3QgZWxlbWVudCBvZiB0aGlzIGFycmF5IGVxdWFscyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0 +aGUgZmlyc3Qgcm93CgkJCSRfLT5bJCN7JHJvd3NbMF19XSB8fD0gdW5kZWY7CgkJfQoKCX0KCgly +ZXR1cm4gXEByb3dzOwp9CgpzdWIgdmFsdWVfdG9fcm93cwp7CglteSAoJHNlbGYsICRmaWVsZCwg +JHZhbHVlKSA9IEBfOwoKCW15IEByb3dzOwoKCWlmIChyZWYoJHZhbHVlKSBlcSAiQVJSQVkiKQoJ +ewoJCSR2YWx1ZSA9IFskZmllbGQtPmVtcHR5X3ZhbHVlXSBpZiAhQCR2YWx1ZTsKCQlAcm93cyA9 +IG1hcCB7ICRzZWxmLT52YWx1ZV90b19yb3dzKCRmaWVsZCwgJF8pLT5bMF0gfSBAJHZhbHVlOwoJ +fQoJZWxzaWYgKCRmaWVsZC0+aXNhKCJFUHJpbnRzOjpNZXRhRmllbGQ6Ok11bHRpcGFydCIpKQoJ +ewoJCWlmKCAkZmllbGQtPmlzYSggIkVQcmludHM6Ok1ldGFGaWVsZDo6TmFtZSIgKSkgI25lZWQg +dG8gZGVhbCB3aXRoIGxlZ2FjeSBwaHJhc2UgaWQncwogICAgICAgICAgICAgICAgewoJCQlteSBA +Yml0X3ZhbHVlczsKCQkJZm9yZWFjaCBteSAkYml0ICggJGZpZWxkLT5nZXRfaW5wdXRfYml0cygp +ICkKICAgICAgICAgICAgICAgICAgICAgICAgewoJCQkJcHVzaCBAYml0X3ZhbHVlcywgJHZhbHVl +LT57JGJpdH07CiAgICAgICAgCQl9CQoJCQlwdXNoIEByb3dzLCBcQGJpdF92YWx1ZXM7CgkgICAg +ICAgIH0KCQllbHNlCgkJewoJCQlwdXNoIEByb3dzLCBbbWFwIHsgJHZhbHVlLT57JF8tPntzdWJf +bmFtZX19IH0gQHskZmllbGQtPnByb3BlcnR5KCJmaWVsZHNfY2FjaGUiKX1dOwoJCX0KCX0KCWVs +c2lmICgkZmllbGQtPmlzYSgiRVByaW50czo6TWV0YUZpZWxkOjpDb21wb3VuZCIpKQoJewoJCW15 +IEBzdWJfdmFsdWVzOwoJCWZvcmVhY2ggbXkgJGtleSAoa2V5cyAleyR2YWx1ZX0pCgkJewoJCQlw +dXNoIEBzdWJfdmFsdWVzLCAkdmFsdWUtPnska2V5fTsKCQl9CgkJcHVzaCBAcm93cywgXEBzdWJf +dmFsdWVzOwoJfQoJZWxzZQoJewoJCXB1c2ggQHJvd3MsIFskdmFsdWVdOwoJfQoKCXJldHVybiBc +QHJvd3M7Cn0KCiN1c2VkIGZvciBjdXN0b20gZXhwb3J0cyB0aGF0IG1pZ2h0IHJldHVybiBhIGZp +ZWxkIG9yIGFuIGFycmF5IChidXQgYXJlbid0IG5lY2VzYXJpbHkgYXNzb2NpYXRlZCB3aXRoIGEg +ZmllbGQhKQpzdWIgY3VzdG9tX3ZhbHVlX3RvX3Jvd3MKewogICAgICAgIG15ICgkc2VsZiwgJHZh +bHVlKSA9IEBfOwoKICAgICAgICBteSBAcm93czsKCiAgICAgICAgaWYgKHJlZigkdmFsdWUpIGVx +ICJBUlJBWSIpCiAgICAgICAgewogICAgICAgICAgICAgICAgQHJvd3MgPSBtYXAgeyAkc2VsZi0+ +Y3VzdG9tX3ZhbHVlX3RvX3Jvd3MoJF8pLT5bMF0gfSBAJHZhbHVlOwogICAgICAgIH0KICAgICAg +ICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAgICAgcHVzaCBAcm93cywgWyR2YWx1ZV07CiAg +ICAgICAgfQoKICAgICAgICByZXR1cm4gXEByb3dzOwp9CgoKMTsKCj1oZWFkMSBDT1BZUklHSFQK +Cj1mb3IgQ09QWVJJR0hUIEJFR0lOCgpDb3B5cmlnaHQgMjAwMC0yMDExIFVuaXZlcnNpdHkgb2Yg +U291dGhhbXB0b24uCgo9Zm9yIENPUFlSSUdIVCBFTkQKCj1mb3IgTElDRU5TRSBCRUdJTgoKVGhp +cyBmaWxlIGlzIHBhcnQgb2YgRVByaW50cyBMPGh0dHA6Ly93d3cuZXByaW50cy5vcmcvPi4KCkVQ +cmludHMgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1v +ZGlmeSBpdAp1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMg +TGljZW5zZSBhcyBwdWJsaXNoZWQKYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0 +aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0 +ZXIgdmVyc2lvbi4KCkVQcmludHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3 +aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl +IGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCkZJVE5FU1MgRk9SIEEgUEFS +VElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCkxpY2Vu +c2UgZm9yIG1vcmUgZGV0YWlscy4KCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg +dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKTGljZW5zZSBhbG9uZyB3aXRoIEVQcmludHMu +ICBJZiBub3QsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgoKPWZvciBMSUNF +TlNFIEVORAoK @@ -481,9 +515,9 @@ ZjsKfQoKCjE7Cg== plugins/EPrints/Plugin/Export/Report/HTML.pm text/plain - 666f802bd567fead817bd3228b7dc78e + 8e2ca840f2fd1fa5983bcca0f96a7233 MD5 - 5596 + 5578 cGFja2FnZSBFUHJpbnRzOjpQbHVnaW46OkV4cG9ydDo6UmVwb3J0OjpIVE1MOwoKdXNlIEVQcmlu dHM6OlBsdWdpbjo6RXhwb3J0OjpSZXBvcnQ7CkBJU0EgPSAoICJFUHJpbnRzOjpQbHVnaW46OkV4 cG9ydDo6UmVwb3J0IiApOwoKdXNlIHN0cmljdDsKCnN1YiBuZXcKewoJbXkoICRjbGFzcywgJXBh @@ -562,27 +596,26 @@ YWJsZS0+YXBwZW5kQ2hpbGQoICRyZXBvLT5yZW5kZXJfcm93KAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICRyZXBvLT5odG1sX3BocmFzZSggImV4cG9ydGZpZWxkb3B0aW9uczokZiIg KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVwby0+bWFrZV90ZXh0KCAkdmFs dWUgKQogICAgICAgICAgICAgICAgICAgICAgICApICk7CgkJfQoJCWVsc2UgI3JlbmRlciBub3Jt -YWwgdmFsdWUgbGlrZSBhIG5vcm1hbCBmaWVsZAoJCXsKCQkJbXkgJGRzX2lkID0gJGRhdGFvYmot -PmdldF9kYXRhc2V0X2lkOwoJCQlteSAkZHMgPSAkcmVwby0+ZGF0YXNldCggJGRzX2lkICk7CgkJ -CWlmKCAkZHMtPmhhc19maWVsZCggJGYgKSApCgkJCXsKCQkJCSR0YWJsZS0+YXBwZW5kQ2hpbGQo -ICRyZXBvLT5yZW5kZXJfcm93KAogICAgICAgIAkgICAgICAgIAkJJHJlcG8tPmh0bWxfcGhyYXNl -KCAkZHNfaWQuIl9maWVsZG5hbWVfIi4kZiApLAoJCSAgICAgICAgICAgICAgICAJJGRhdGFvYmot -PnJlbmRlcl92YWx1ZSggJGYgKSAKCQkJCSkgKTsKCQkJfQoJCX0KCX0KCSRkYXRhb2JqX2Rpdi0+ -YXBwZW5kQ2hpbGQoICR0YWJsZSApOwoKCSNhZGQgdGhlIGRhdGFvYmogZGl2IHRvIHRoZSBzZWN0 -aW9uCgkkc2VjdGlvbl9pdGVtcy0+YXBwZW5kQ2hpbGQoICRkYXRhb2JqX2RpdiApOwoKCSNhZGQg -Y3VzdG9tIGNsYXNzIGlmIG5lY2Vzc2FyeSBmb3IgZnVydGhlciBDU1MgY3VzdG9taXNhdGlvbiAK -CWlmKCBkZWZpbmVkICRwbHVnaW4tPnBhcmFtKCAiY3VzdG9tX2NsYXNzIiApICkKCXsKCQkkZGF0 -YW9ial9kaXYtPnNldEF0dHJpYnV0ZSggY2xhc3MgPT4gJGRhdGFvYmpfZGl2LT5nZXRBdHRyaWJ1 -dGUoICJjbGFzcyIgKSAuICIgIiAuICRwbHVnaW4tPnBhcmFtKCAiY3VzdG9tX2NsYXNzIiApICk7 -CgkJJGNpdGF0aW9uX2Rpdi0+c2V0QXR0cmlidXRlKCBjbGFzcyA9PiAkY2l0YXRpb25fZGl2LT5n -ZXRBdHRyaWJ1dGUoICJjbGFzcyIgKSAuICIgIiAuICRwbHVnaW4tPnBhcmFtKCAiY3VzdG9tX2Ns -YXNzIiApICk7CgkJJHRhYmxlLT5zZXRBdHRyaWJ1dGUoIGNsYXNzID0+ICR0YWJsZS0+Z2V0QXR0 -cmlidXRlKCAiY2xhc3MiICkgLiAiICIgLiAkcGx1Z2luLT5wYXJhbSggImN1c3RvbV9jbGFzcyIg -KSApOwoJfQp9CgpzdWIgeG1sX2RhdGFvYmoKewogICAgICAgIG15KCAkcGx1Z2luLCAkZGF0YW9i -aiApID0gQF87CgogICAgICAgIG15ICRwID0gJHBsdWdpbi0+e3Nlc3Npb259LT5tYWtlX2VsZW1l -bnQoICJwIiwgY2xhc3M9PiJjaXRhdGlvbiIgKTsKCiAgICAgICAgJHAtPmFwcGVuZENoaWxkKCAk -ZGF0YW9iai0+cmVuZGVyX2NpdGF0aW9uX2xpbmsgKTsKCiAgICAgICAgcmV0dXJuICRwOwp9Cgox -OyAgICAgICAgCg== +YWwgdmFsdWUgbGlrZSBhIG5vcm1hbCBmaWVsZAoJCXsKCQkJbXkgJGRzID0gJGRhdGFvYmotPmRh +dGFzZXQ7CgkJCWlmKCAkZHMtPmhhc19maWVsZCggJGYgKSApCgkJCXsKCQkJCW15ICRmaWVsZCA9 +IEVQcmludHM6OlV0aWxzOjpmaWVsZF9mcm9tX2NvbmZpZ19zdHJpbmcoICRkcywgJGYgKTsKCgkJ +CQkkdGFibGUtPmFwcGVuZENoaWxkKCAkcmVwby0+cmVuZGVyX3JvdygKICAgICAgICAJICAgICAg +ICAJCSRmaWVsZC0+cmVuZGVyX25hbWUsCgkJCQkJJGRhdGFvYmotPnJlbmRlcl92YWx1ZSggJGYg +KSAKCQkJCSkgKTsKCQkJfQoJCX0KCX0KCSRkYXRhb2JqX2Rpdi0+YXBwZW5kQ2hpbGQoICR0YWJs +ZSApOwoKCSNhZGQgdGhlIGRhdGFvYmogZGl2IHRvIHRoZSBzZWN0aW9uCgkkc2VjdGlvbl9pdGVt +cy0+YXBwZW5kQ2hpbGQoICRkYXRhb2JqX2RpdiApOwoKCSNhZGQgY3VzdG9tIGNsYXNzIGlmIG5l +Y2Vzc2FyeSBmb3IgZnVydGhlciBDU1MgY3VzdG9taXNhdGlvbiAKCWlmKCBkZWZpbmVkICRwbHVn +aW4tPnBhcmFtKCAiY3VzdG9tX2NsYXNzIiApICkKCXsKCQkkZGF0YW9ial9kaXYtPnNldEF0dHJp +YnV0ZSggY2xhc3MgPT4gJGRhdGFvYmpfZGl2LT5nZXRBdHRyaWJ1dGUoICJjbGFzcyIgKSAuICIg +IiAuICRwbHVnaW4tPnBhcmFtKCAiY3VzdG9tX2NsYXNzIiApICk7CgkJJGNpdGF0aW9uX2Rpdi0+ +c2V0QXR0cmlidXRlKCBjbGFzcyA9PiAkY2l0YXRpb25fZGl2LT5nZXRBdHRyaWJ1dGUoICJjbGFz +cyIgKSAuICIgIiAuICRwbHVnaW4tPnBhcmFtKCAiY3VzdG9tX2NsYXNzIiApICk7CgkJJHRhYmxl +LT5zZXRBdHRyaWJ1dGUoIGNsYXNzID0+ICR0YWJsZS0+Z2V0QXR0cmlidXRlKCAiY2xhc3MiICkg +LiAiICIgLiAkcGx1Z2luLT5wYXJhbSggImN1c3RvbV9jbGFzcyIgKSApOwoJfQp9CgpzdWIgeG1s +X2RhdGFvYmoKewogICAgICAgIG15KCAkcGx1Z2luLCAkZGF0YW9iaiApID0gQF87CgogICAgICAg +IG15ICRwID0gJHBsdWdpbi0+e3Nlc3Npb259LT5tYWtlX2VsZW1lbnQoICJwIiwgY2xhc3M9PiJj +aXRhdGlvbiIgKTsKCiAgICAgICAgJHAtPmFwcGVuZENoaWxkKCAkZGF0YW9iai0+cmVuZGVyX2Np +dGF0aW9uX2xpbmsgKTsKCiAgICAgICAgcmV0dXJuICRwOwp9CgoxOyAgICAgICAgCg== @@ -712,9 +745,9 @@ bHVlOwp9CgoKMTsK plugins/EPrints/Plugin/Screen/Report.pm text/plain - 7b964bfb863e905a17713c6cea2e0653 + 210449eac1f7ee02e7519beead2c640b MD5 - 37088 + 37100 cGFja2FnZSBFUHJpbnRzOjpQbHVnaW46OlNjcmVlbjo6UmVwb3J0OwoKIyBBYnN0cmFjdCBjbGFz cyB0aGF0IGhhbmRsZXMgdGhlIFJlcG9ydCB0b29scwoKdXNlIEpTT04gcXcoZW5jb2RlX2pzb24p Owp1c2UgRVByaW50czo6UGx1Z2luOjpTY3JlZW47CkBJU0EgPSAoICdFUHJpbnRzOjpQbHVnaW46 @@ -1103,269 +1136,269 @@ CSAgICAgICAgICAgICAgICAJc3R5bGUgPT4gImxpc3Qtc3R5bGUtdHlwZTogbm9uZSIKCSAgICAg ICAgCSk7CgkJCQoJCQlteSAkY291bnQgPSAwOyAjY291bnQgaG93IG1hbnkgZmllbGRzIHdlIGFk ZAoJCQlmb3JlYWNoIG15ICRmaWVsZG5hbWUoIEB7JHJlcG8tPmNvbmZpZyggJHNlbGYtPntleHBv cnRfY29uZn0sICJleHBvcnRmaWVsZHMiICktPnska2V5fX0gKQoJCQl7CgkJCQlpZiggZGVmaW5l -ZCAkcmVwby0+Y29uZmlnKCAkc2VsZi0+e2V4cG9ydF9jb25mfSwgImN1c3RvbWVyX2V4cG9ydCIg -KSAmJiBleGlzdHMgJHskcmVwby0+Y29uZmlnKCAkc2VsZi0+e2V4cG9ydF9jb25mfSwgImN1c3Rv -bV9leHBvcnQiICl9eyRmaWVsZG5hbWV9ICkgI25vIGZpZWxkIGluIGRhdGFzZXQsIGJ1dCB3ZSBo -YXZlIGEgY3VzdG9tIGV4cG9ydCBmdW5jdGlvbiBpbnN0ZWFkIAoJCQkJewoJCQkJCSRjb3VudCsr -OwoJCQkJCSRzZWxmLT5fZXhwb3J0X2ZpZWxkX2NoZWNrYm94KCAkcmVwbywgJGZpZWxkbmFtZSwg -JHVsLCAkcmVwby0+aHRtbF9waHJhc2UoICJleHBvcnRmaWVsZG9wdGlvbnM6JGZpZWxkbmFtZSIg -KSApOyAKCQkJCX0KCQkJCWVsc2lmKCAkcmVwb3J0X2RzLT5oYXNfZmllbGQoICRmaWVsZG5hbWUg -KSApCgkJCQl7CgkJCQkJbXkgJGZpZWxkID0gRVByaW50czo6VXRpbHM6OmZpZWxkX2Zyb21fY29u -ZmlnX3N0cmluZyggJHJlcG9ydF9kcywgJGZpZWxkbmFtZSApOwoJCQkJCSRjb3VudCsrOwogICAg -ICAgCQkJICAgICAgICAJJHNlbGYtPl9leHBvcnRfZmllbGRfY2hlY2tib3goICRyZXBvLCAkZmll -bGRuYW1lLCAkdWwsICRmaWVsZC0+cmVuZGVyX25hbWUgKTsKCgkJCQl9CgkJCX0KCQkJaWYoICRj -b3VudCApICNvbmx5IGFkZCBvcHRpb25zIGlmIHdlIGhhdmUgYW55IGZpZWxkcyB0byBzaG93CgkJ -CXsKCQkJCW15ICRkaXYgPSAkcmVwby0+bWFrZV9lbGVtZW50KCAiZGl2IiwgY2xhc3M9PiJyZXBv -cnRfZXhwb3J0X29wdGlvbnMiICk7CgkJCQkkZGl2LT5hcHBlbmRDaGlsZCggbXkgJGggPSAkcmVw -by0+bWFrZV9lbGVtZW50KCAiaDQiICkgKTsKCQkJCSRoLT5hcHBlbmRDaGlsZCggJHJlcG8tPmh0 -bWxfcGhyYXNlKCAiZXhwb3J0ZmllbGRzOiRrZXkiICkgKTsJCgkJCQkkZGl2LT5hcHBlbmRDaGls -ZCggJHVsICk7CgkJCQkkZXhwb3J0X29wdGlvbnMtPmFwcGVuZENoaWxkKCAkZGl2ICk7CgkJCX0K -ICAgICAgIAkJfQoJCSRmb3JtLT5hcHBlbmRDaGlsZCggJGV4cG9ydF9vcHRpb25zICk7Cgl9CgoJ -JGZvcm0tPmFwcGVuZENoaWxkKCAKCQkkcmVwby0+cmVuZGVyX2J1dHRvbigKCQkJbmFtZSA9PiAi -X2FjdGlvbl9leHBvcnQiLAoJCQljbGFzcyA9PiAiZXBfZm9ybV9hY3Rpb25fYnV0dG9uIiwKCQkJ -dmFsdWUgPT4gJHJlcG8tPnBocmFzZSggJ2NnaS91c2Vycy9lZGl0X2VwcmludDpleHBvcnQnICkK -CSkgKTsKCgkjY3JlYXRlIGEgY29sbGFwc2libGUgYm94CglteSAkaW1hZ2VzdXJsID0gJHJlcG8t -PmN1cnJlbnRfdXJsKCBwYXRoID0+ICJzdGF0aWMiLCAic3R5bGUvaW1hZ2VzIiApOwoJbXkgJW9w -dGlvbnM7Cgkkb3B0aW9uc3tzZXNzaW9ufSA9ICRyZXBvOwogICAgICAgICRvcHRpb25ze2lkfSA9 -ICJlcF9yZXBvcnRfZXhwb3J0IjsKICAgICAgICAkb3B0aW9uc3t0aXRsZX0gPSAkcmVwby0+aHRt -bF9waHJhc2UoICJleHBvcnRfdGl0bGUiICk7CiAgICAgICAgJG9wdGlvbnN7Y29sbGFwc2VkfSA9 -IDE7Cgkkb3B0aW9uc3tjb250ZW50fSA9ICRmb3JtOwogICAgICAgICRvcHRpb25ze3Nob3dfaWNv -bl91cmx9ID0gIiRpbWFnZXN1cmwvbXVsdGlfZG93bi5wbmciOwoJJG9wdGlvbnN7aGlkZV9pY29u -X3VybH0gPSAiJGltYWdlc3VybC9tdWx0aV91cC5wbmciOwoKCW15ICRib3ggPSAkcmVwby0+bWFr -ZV9lbGVtZW50KCAiZGl2Iiwgc3R5bGU9PiJ0ZXh0LWFsaWduOiBsZWZ0IiApOwoJJGJveC0+YXBw -ZW5kQ2hpbGQoIEVQcmludHM6OkJveDo6cmVuZGVyKCAlb3B0aW9ucyApICk7CgkkY2h1bmstPmFw -cGVuZENoaWxkKCAkYm94ICk7CgoJcmV0dXJuICRjaHVuazsKfQoKc3ViIHJlbmRlcl9zb3J0X29w -dGlvbnMKewoJbXkoICRzZWxmICkgPSBAXzsKCglteSAkcmVwbyA9ICRzZWxmLT5yZXBvc2l0b3J5 -OwoKCW15ICRjaHVuayA9ICRyZXBvLT5tYWtlX2RvY19mcmFnbWVudDsKCglyZXR1cm4gJGNodW5r -IHVubGVzcyggZGVmaW5lZCggJHJlcG8tPmNvbmZpZyggJHNlbGYtPntzb3J0X2NvbmZ9LCAic29y -dGZpZWxkcyIgKSApICk7CgoJbXkgJHNvcnRfY29uZiA9ICRyZXBvLT5jb25maWcoICRzZWxmLT57 -c29ydF9jb25mfSwgInNvcnRmaWVsZHMiICk7CgoJI2J1aWxkIHRoZSBmb3JtCglteSAkZm9ybSA9 -ICRzZWxmLT5yZW5kZXJfZm9ybTsKCSRmb3JtLT5zZXRBdHRyaWJ1dGUoIG5hbWUgPT4gInNvcnRf -cmVwb3J0IiApOwogICAgICAgICRmb3JtLT5zZXRBdHRyaWJ1dGUoIG1ldGhvZCA9PiAiZ2V0IiAp -OwoJJGNodW5rLT5hcHBlbmRDaGlsZCggJGZvcm0gKTsKCQoJaWYoIGRlZmluZWQgJHJlcG8tPnBh -cmFtKCAic2VhcmNoIiApIHx8ICRzZWxmLT57cHJvY2Vzc29yfS0+e2FjdGlvbn0gZXEgInNlYXJj -aCIgKQoJewoJCSRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG8tPnJlbmRlcl9oaWRkZW5fZmllbGQo -ICJzZWFyY2giLCAgJHNlbGYtPntwcm9jZXNzb3J9LT57c2VhcmNofS0+c2VyaWFsaXNlKSApOwoJ -fQoKCWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX2V4cH0gKQoJewoJCSRm -b3JtLT5hcHBlbmRDaGlsZCggJHJlcG8tPnJlbmRlcl9oaWRkZW5fZmllbGQoICJncm91cCIsICAk -c2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cF9leHB9ICkgKTsKCX0KCgkjZGlzcGxheSB0aGUgbGlu -a3MgdGhhdCB3aWxsIHRyaWdnZXIgdGhlIGZvcm0KCW15ICRmaXJzdCA9IDE7CglteSAkc29ydF9s -aW5rcyA9ICRyZXBvLT5tYWtlX2RvY19mcmFnbWVudDsKCWZvcmVhY2ggbXkgJHNvcnRfbmFtZSAo -IGtleXMgJXskc29ydF9jb25mfSApCiAgICAgICAgewoJCW15ICRzb3J0X3ZhbHVlID0gJHNvcnRf -Y29uZi0+eyRzb3J0X25hbWV9OwoJCWlmKCAkZmlyc3QgKQoJCXsKCQkJJGZvcm0tPmFwcGVuZENo -aWxkKCAkcmVwby0+cmVuZGVyX2hpZGRlbl9maWVsZCggInNvcnQiLCAkc29ydF92YWx1ZSkgKTsK -CQl9CgoJCWlmKCAhJGZpcnN0ICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIAkk -c29ydF9saW5rcy0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggIlVwZGF0ZS9WaWV3 -czpncm91cF9zZXBlcmF0b3IiICkgKTsKICAgICAgICAgICAgICAgIH0KCQkKCQlpZiggZGVmaW5l -ZCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzb3J0fSAmJiAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzb3J0 -fSBlcSAkc29ydF92YWx1ZSApCgkJewoJCQlteSAkc3Ryb25nID0gJHJlcG8tPm1ha2VfZWxlbWVu -dCggInN0cm9uZyIgKTsKCQkJJHN0cm9uZy0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFz -ZSggJHNlbGYtPntzb3J0X2NvbmZ9IC4gIjpzb3J0OiIgLiAkc29ydF9uYW1lICkgKTsKCQkJJHNv -cnRfbGlua3MtPmFwcGVuZENoaWxkKCAkc3Ryb25nICk7CgkJfQoJCWVsc2UKCQl7CgkJCW15ICRs -aW5rID0gJHJlcG8tPnJlbmRlcl9saW5rKCAnamF2YXNjcmlwdDpzb3J0X3JlcG9ydCgiJy4kc29y -dF92YWx1ZS4nIiknICk7CQoJCQkkbGluay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFz -ZSggJHNlbGYtPntzb3J0X2NvbmZ9IC4gIjpzb3J0OiIgLiAkc29ydF9uYW1lICkgKTsKCQkJJHNv -cnRfbGlua3MtPmFwcGVuZENoaWxkKCAkbGluayApOwoJCX0KCQkkZmlyc3QgPSAwOwogICAgICAg -IH0gICAgICAgICAgIAoJJGNodW5rLT5hcHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNlKCAi -UmVwb3J0OnNvcnRfbGlua3MiLCBsaW5rcz0+JHNvcnRfbGlua3MgKSApOwoJcmV0dXJuICRjaHVu -azsKfQoKCnN1YiByZW5kZXJfZ3JvdXBfb3B0aW9ucwp7CglteSggJHNlbGYgKSA9IEBfOwoKCW15 -ICRyZXBvID0gJHNlbGYtPnJlcG9zaXRvcnk7CgoJbXkgJGNodW5rID0gJHJlcG8tPm1ha2VfZG9j -X2ZyYWdtZW50OwoKCXJldHVybiAkY2h1bmsgdW5sZXNzKCBkZWZpbmVkKCAkcmVwby0+Y29uZmln -KCAkc2VsZi0+e2dyb3VwX2NvbmZ9LCAiZ3JvdXBmaWVsZHMiICkgKSApOwoKCW15ICRncm91cF9j -b25mID0gJHJlcG8tPmNvbmZpZyggJHNlbGYtPntncm91cF9jb25mfSwgImdyb3VwZmllbGRzIiAp -OwoKCSNidWlsZCB0aGUgZm9ybQoJbXkgJGZvcm0gPSAkc2VsZi0+cmVuZGVyX2Zvcm07CgkkZm9y -bS0+c2V0QXR0cmlidXRlKCBuYW1lID0+ICJncm91cF9yZXBvcnQiICk7CiAgICAgICAgJGZvcm0t -PnNldEF0dHJpYnV0ZSggbWV0aG9kID0+ICJnZXQiICk7CgkkY2h1bmstPmFwcGVuZENoaWxkKCAk -Zm9ybSApOwoJCglpZiggZGVmaW5lZCAkcmVwby0+cGFyYW0oICJzZWFyY2giICkgfHwgJHNlbGYt -Pntwcm9jZXNzb3J9LT57YWN0aW9ufSBlcSAic2VhcmNoIiApCgl7CgkJJGZvcm0tPmFwcGVuZENo -aWxkKCAkcmVwby0+cmVuZGVyX2hpZGRlbl9maWVsZCggInNlYXJjaCIsICAkc2VsZi0+e3Byb2Nl -c3Nvcn0tPntzZWFyY2h9LT5zZXJpYWxpc2UpICk7Cgl9CgoJaWYoIGRlZmluZWQgJHNlbGYtPntw -cm9jZXNzb3J9LT57c29ydH0gKQoJewoJCSRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG8tPnJlbmRl -cl9oaWRkZW5fZmllbGQoICJzb3J0IiwgICRzZWxmLT57cHJvY2Vzc29yfS0+e3NvcnR9ICkgKTsK -CX0KCgkjZGlzcGxheSB0aGUgbGlua3MgdGhhdCB3aWxsIHRyaWdnZXIgdGhlIGZvcm0KCW15ICRm -aXJzdCA9IDE7CglteSAkZ3JvdXBfbGlua3MgPSAkcmVwby0+bWFrZV9kb2NfZnJhZ21lbnQ7Cglm -b3JlYWNoIG15ICRncm91cF92YWx1ZSAoIEB7JGdyb3VwX2NvbmZ9ICkKICAgICAgICB7CgkJbXkg -KCRncm91cF9maWVsZCkgPSBzcGxpdCgvOy8sICRncm91cF92YWx1ZSApOwoJCWlmKCAkZmlyc3Qg -KQoJCXsKCQkJJGZvcm0tPmFwcGVuZENoaWxkKCAkcmVwby0+cmVuZGVyX2hpZGRlbl9maWVsZCgg -Imdyb3VwIiwgJGdyb3VwX3ZhbHVlKSApOwoJCX0KCgkJaWYoICEkZmlyc3QgKQogICAgICAgICAg -ICAgICAgewogICAgICAgICAgICAgICAgCSRncm91cF9saW5rcy0+YXBwZW5kQ2hpbGQoICRyZXBv -LT5odG1sX3BocmFzZSggIlVwZGF0ZS9WaWV3czpncm91cF9zZXBlcmF0b3IiICkgKTsKICAgICAg -ICAgICAgICAgIH0KCQkKCQlpZiggZGVmaW5lZCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cH0g -JiYgJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXB9IGVxICRncm91cF9maWVsZCApCgkJewoJCQlt -eSAkc3Ryb25nID0gJHJlcG8tPm1ha2VfZWxlbWVudCggInN0cm9uZyIgKTsKCQkJJHN0cm9uZy0+ -YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggJHNlbGYtPntncm91cF9jb25mfSAuICI6 -Z3JvdXA6IiAuICRncm91cF9maWVsZCApICk7CgkJCSRncm91cF9saW5rcy0+YXBwZW5kQ2hpbGQo -ICRzdHJvbmcgKTsKCQl9CgkJZWxzZQoJCXsKCQkJbXkgJGxpbmsgPSAkcmVwby0+cmVuZGVyX2xp -bmsoICdqYXZhc2NyaXB0Omdyb3VwX3JlcG9ydCgiJy4kZ3JvdXBfdmFsdWUuJyIpJyApOwkKCQkJ -JGxpbmstPmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJhc2UoICRzZWxmLT57Z3JvdXBfY29u -Zn0gLiAiOmdyb3VwOiIgLiAkZ3JvdXBfZmllbGQgKSApOwoJCQkkZ3JvdXBfbGlua3MtPmFwcGVu -ZENoaWxkKCAkbGluayApOwoJCX0KCQkkZmlyc3QgPSAwOwogICAgICAgIH0gICAgICAgICAgIAoJ -Cgkjbm8gZ3JvdXBpbmcgbGluayBhdCB0aGUgZW5kCgkkZ3JvdXBfbGlua3MtPmFwcGVuZENoaWxk -KCAkcmVwby0+aHRtbF9waHJhc2UoICJVcGRhdGUvVmlld3M6Z3JvdXBfc2VwZXJhdG9yIiApICk7 -CglpZiggZGVmaW5lZCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cH0gJiYgJHNlbGYtPntwcm9j -ZXNzb3J9LT57Z3JvdXB9IG5lICIiICkKCXsKCQlteSAkbGluayA9ICRyZXBvLT5yZW5kZXJfbGlu -ayggJ2phdmFzY3JpcHQ6Z3JvdXBfcmVwb3J0KCIiKScgKTsJCgkJJGxpbmstPmFwcGVuZENoaWxk -KCAkcmVwby0+aHRtbF9waHJhc2UoICJyZXBvcnQ6bm9fZ3JvdXBpbmciICkgKTsKCQkkZ3JvdXBf -bGlua3MtPmFwcGVuZENoaWxkKCAkbGluayApOwoJfQoJZWxzZQoJewoJCW15ICRzdHJvbmcgPSAk -cmVwby0+bWFrZV9lbGVtZW50KCAic3Ryb25nIiApOwogCQkkc3Ryb25nLT5hcHBlbmRDaGlsZCgg -JHJlcG8tPmh0bWxfcGhyYXNlKCAicmVwb3J0Om5vX2dyb3VwaW5nIiApICk7CgkJJGdyb3VwX2xp -bmtzLT5hcHBlbmRDaGlsZCggJHN0cm9uZyApOwoJfQoJCgkkY2h1bmstPmFwcGVuZENoaWxkKCAk -cmVwby0+aHRtbF9waHJhc2UoICJSZXBvcnQ6Z3JvdXBfbGlua3MiLCBsaW5rcz0+JGdyb3VwX2xp -bmtzICkgKTsKCglyZXR1cm4gJGNodW5rOwp9CgoKI2FkZHMgYSBuZXcgY2hlY2tib3ggdG8gYWxs -b3cgdGhlIHVzZXIgdG8gY2hvb3NlIHdoaWNoIGZpZWxkcyB0byBleHBvcnQKc3ViIF9leHBvcnRf -ZmllbGRfY2hlY2tib3gKewoJbXkoICRzZWxmLCAkcmVwbywgJGZpZWxkbmFtZSwgJHVsLCAkZmll -bGRsYWJlbCApID0gQF87CgoJbXkgJGxpID0gJHJlcG8tPm1ha2VfZWxlbWVudCggImxpIiApOwoJ -JHVsLT5hcHBlbmRDaGlsZCggJGxpICk7CgogICAgICAgIG15ICRjaGVja2JveCA9ICRyZXBvLT5t -YWtlX2VsZW1lbnQoICJpbnB1dCIsIHR5cGUgPT4gImNoZWNrYm94IiwgaWQgPT4gJGZpZWxkbmFt -ZSwgbmFtZSA9PiAkZmllbGRuYW1lLCB2YWx1ZSA9PiAkZmllbGRuYW1lICk7CglpZiggZGVmaW5l -ZCAkcmVwby0+Y29uZmlnKCAkc2VsZi0+e2V4cG9ydF9jb25mfSwgImV4cG9ydGZpZWxkX2RlZmF1 -bHRzIiApICkKCXsKCQlpZiggKCBncmVwIHsgJGZpZWxkbmFtZSBlcSAkXyB9IEB7JHJlcG8tPmNv -bmZpZyggJHNlbGYtPntleHBvcnRfY29uZn0sICJleHBvcnRmaWVsZF9kZWZhdWx0cyIgKX0gKSB8 -fCAoIHNjYWxhciggQHskcmVwby0+Y29uZmlnKCAkc2VsZi0+e2V4cG9ydF9jb25mfSwgImV4cG9y -dGZpZWxkX2RlZmF1bHRzIiApfSApID09IDAgKSApCgkJewoJCQkjb25seSBjaGVjayBkZWZhdWx0 -cyBvciBjaGVjayBldmVyeXRoaW5nIGlmIGRlZmF1bHRzIG5vdCBkZWZpbmVkCgkJCSRjaGVja2Jv -eC0+c2V0QXR0cmlidXRlKCAiY2hlY2tlZCIsICJ5ZXMiICk7CgkJfQoJfQoJbXkgJGxhYmVsID0g -JHJlcG8tPm1ha2VfZWxlbWVudCggImxhYmVsIiwgZm9yID0+ICRmaWVsZG5hbWUgKTsKCSRsYWJl -bC0+YXBwZW5kQ2hpbGQoICRmaWVsZGxhYmVsICk7CgoJJGxpLT5hcHBlbmRDaGlsZCggJGNoZWNr -Ym94ICk7CgkkbGktPmFwcGVuZENoaWxkKCAkbGFiZWwgKTsKfQoKIyMjIHV0aWxpdHkgbWV0aG9k -cwoKIyBUT0RPIHNob3VsZCB1c2UgIkpTT04iIHBhY2thZ2UKc3ViIHRvX2pzb24KewogICAgICAg -IG15KCAkc2VsZiwgJG9iamVjdCApID0gQF87CgoJcmV0dXJuICIiIGlmKCAhZGVmaW5lZCAkb2Jq -ZWN0ICk7CgojIFVURi04IGlzc3VlczoKIwlyZXR1cm4gSlNPTi0+bmV3LT51dGY4KDEpLT5lbmNv -ZGUoICRvYmplY3QgKTsKCiAgICAgICAgaWYoIHJlZiggJG9iamVjdCApIGVxICdIQVNIJyApCiAg -ICAgICAgewogICAgICAgICAgICAgICAgbXkgQHN0dWZmOwogICAgICAgICAgICAgICAgd2hpbGUo -IG15KCAkaywgJHYgKSA9IGVhY2goICUkb2JqZWN0ICkgKQogICAgICAgICAgICAgICAgewogICAg -ICAgICAgICAgICAgICAgICAgICBuZXh0IGlmKCAhRVByaW50czo6VXRpbHM6OmlzX3NldCggJHYg -KSApOyAgICAgICAjIG9yICdudWxsJyA/CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQHN0 -dWZmLCBFUHJpbnRzOjpVdGlsczo6anNfc3RyaW5nKCAkayApLic6Jy4kc2VsZi0+dG9fanNvbigg -JHYgKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuICd7JyAuIGpvaW4o -ICIsIiwgQHN0dWZmICkgLiAnfSc7CiAgICAgICAgfQogICAgICAgIGVsc2lmKCByZWYoICRvYmpl -Y3QgKSBlcSAnQVJSQVknICkKICAgICAgICB7CiAgICAgICAgICAgICAgICBteSBAc3R1ZmY7CiAg -ICAgICAgICAgICAgICBmb3JlYWNoKCBAJG9iamVjdCApCiAgICAgICAgICAgICAgICB7CiAgICAg -ICAgICAgICAgICAgICAgICAgIG5leHQgaWYoICFFUHJpbnRzOjpVdGlsczo6aXNfc2V0KCAkXyAp -ICk7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQHN0dWZmLCAkc2VsZi0+dG9fanNvbigg -JF8gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAnWycgLiBqb2lu -KCAiLCIsIEBzdHVmZiApIC4gJ10nOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIEVQcmludHM6 -OlV0aWxzOjpqc19zdHJpbmcoICRvYmplY3QgKTsKfQoKc3ViIGV4cG9ydF9wbHVnaW5zCnsKICAg -ICAgICBteSggJHNlbGYsICRnZW5lcmljICkgPSBAXzsKCglteSBAcGx1Z2luX2lkczsKCWlmKCAk -Z2VuZXJpYyApCgl7CiAJCUBwbHVnaW5faWRzID0gJHNlbGYtPnJlcG9zaXRvcnktPnBsdWdpbl9s -aXN0KAogICAgICAgICAgICAgICAgCXR5cGUgPT4gIkV4cG9ydCIsCgkgICAgICAgICAgICAgICAg -Y2FuX2FjY2VwdCA9PiAicmVwb3J0L2dlbmVyaWMiLAogICAgICAgIAkgICAgICAgIGlzX3Zpc2li -bGUgPT4gInN0YWZmIiwKCQkJaXNfYWR2ZXJ0aXNlZCA9PiAxLAoJICAgICAgICApOwoJfQoJZWxz -ZQoJewogICAgICAgIAlAcGx1Z2luX2lkcyA9ICRzZWxmLT5yZXBvc2l0b3J5LT5wbHVnaW5fbGlz -dCgKICAgICAgICAgICAgICAgIAl0eXBlID0+ICJFeHBvcnQiLAoJICAgICAgICAgICAgICAgIGNh -bl9hY2NlcHQgPT4gInJlcG9ydC8iLiRzZWxmLT5nZXRfcmVwb3J0LAogICAgICAgIAkgICAgICAg -IGlzX3Zpc2libGUgPT4gInN0YWZmIiwKCQkJaXNfYWR2ZXJ0aXNlZCA9PiAxLAoJICAgICAgICAp -OwogICAgICAgIH0KCW15IEBwbHVnaW5zOwoJZm9yZWFjaCBteSAkaWQgKCBAcGx1Z2luX2lkcyAp -CiAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJHAgPSAkc2VsZi0+cmVwb3NpdG9yeS0+cGx1 -Z2luKCAiJGlkIiApIG9yIG5leHQ7CiAgICAgICAgICAgICAgICBwdXNoIEBwbHVnaW5zLCAkcDsK -ICAgICAgICB9CgogICAgICAgIHJldHVybiBAcGx1Z2luczsKfQoKc3ViIHJlcG9ydF9wbHVnaW5z -CnsKCW15KCAkc2VsZiApID0gQF87CgoJIyBzZjIgLSBjYW4ndCBsaXN0IHZpYSB0eXBlID0+ICJT -ZWFyY2g6OlJlcG9ydCIgPyAKICAgICAgICBteSBAcGx1Z2luX2lkcyA9ICRzZWxmLT5yZXBvc2l0 -b3J5LT5wbHVnaW5fbGlzdCgKICAgICAgICAgICAgICAgIHR5cGUgPT4gIlNjcmVlbiIsCiAgICAg -ICAgKTsKCiAgICAgICAgbXkgQHBsdWdpbnM7Cglmb3JlYWNoIG15ICRpZCAoIEBwbHVnaW5faWRz -ICkKICAgICAgICB7CgkJbmV4dCBpZiggJGlkICF+IC9eU2NyZWVuOjpSZXBvcnQ6Oi8gKTsJIyBu -b3RlIHRoaXMgYWxzbyBmaWx0ZXJzIG91dCAkc2VsZiAoYWthIFNjcmVlbjo6UmVwb3J0KQoKICAg -ICAgICAgICAgICAgIG15ICRwID0gJHNlbGYtPnJlcG9zaXRvcnktPnBsdWdpbiggIiRpZCIgKTsK -CQluZXh0IGlmKCAhZGVmaW5lZCAkcCB8fCAhJHAtPmNhbl9iZV92aWV3ZWQgKTsKCiAgICAgICAg -ICAgICAgICBwdXNoIEBwbHVnaW5zLCAkcDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBAcGx1 -Z2luczsKfQoKI3JldHVybnMgYSBoYXNoIG9mIHZhbHVlcyBtYXBwZWQgdG8gYSBsYWJlbCBhbmQg -YSBsaXN0CiNpZiBpZHNfb25seSBpcyBzZXQgdGhlIGxpc3Qgb2YgaXRlbXMgYXJlIGp1c3QgcmVw -cmVzZW50ZWQgYnkgdGhlaXIgaWQgKHVzZWQgYnkgcmVwb3J0IEpTKQpzdWIgZ2V0X2dyb3VwZWRf -aXRlbXMKewoJbXkoICRzZWxmLCAkaXRlbXMsICRpZHNfb25seSApID0gQF87CglteSAkc2Vzc2lv -biA9ICRzZWxmLT57c2Vzc2lvbn07CglteSAlZ3JvdXBlZDsKCglteSAkZ3JvdXBpbmcgPSAkc2Vs -Zi0+e3Byb2Nlc3Nvcn0tPntncm91cH07CgoJbXkgJG1ldGFmaWVsZCA9ICRpdGVtcy0+Z2V0X2Rh -dGFzZXQtPmZpZWxkKCAkZ3JvdXBpbmcgKTsKCgkjc2V0IGdyb3VwX29wdHMgaWYgYXBwcm9wcmlh -dGUKCWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX29wdHN9ICkKCXsKCQlp -ZiggJG1ldGFmaWVsZC0+dHlwZSBlcSAiZGF0ZSIgKQoJCXsKCQkJJG1ldGFmaWVsZC0+e3JlbmRl -cl9yZXN9ID0gJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXBfb3B0c30tPntyZXN9IGlmIGV4aXN0 -cyAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cF9vcHRzfS0+e3Jlc307CgkJfQoJfQoKCSNjcmVh -dGUgYSBoYXNoIG9mIGZpZWxkIHZhbHVlcyB0byBpdGVtcyAob3IgaXRlbSBpZHMpCgkkaXRlbXMt -Pm1hcCggc3ViIHsKCSAgICAgICAJbXkoICRzZXNzaW9uLCAkZGF0YXNldCwgJGl0ZW0gKSA9IEBf -OwoJCQoJCW15ICRtdWx0aXBsZSA9ICRtZXRhZmllbGQtPmdldF9wcm9wZXJ0eSggIm11bHRpcGxl -IiApOwoJCW15IEBncm91cF92YWx1ZXM7CgkJaWYoICRtdWx0aXBsZSApCiAgICAgICAgICAgICAg -ICB7CgkJCUBncm91cF92YWx1ZXMgPSBAeyRpdGVtLT52YWx1ZSggJGdyb3VwaW5nICl9OwoJCX0K -CQllbHNlCgkJewkJCQoJCQlAZ3JvdXBfdmFsdWVzID0gKCRpdGVtLT52YWx1ZSggJGdyb3VwaW5n -ICkpOwoJCX0KCQoJCWlmKCBzY2FsYXIgQGdyb3VwX3ZhbHVlcyA+IDAgKQoJCXsKCQkJZm9yZWFj -aCBteSAkZ3JvdXBfdmFsdWUgKCBAZ3JvdXBfdmFsdWVzICkKCQkJewoJCQkJbXkgJGdyb3VwX2lk -ID0gJG1ldGFmaWVsZC0+Z2V0X2lkX2Zyb21fdmFsdWUoICRzZXNzaW9uLCAkZ3JvdXBfdmFsdWUg -KTsKCQkJCSN0cnVuY2F0ZSBncm91cCBpZiBhcHByb3ByaWF0ZQoJCQkJaWYoIGRlZmluZWQgJHNl -bGYtPntwcm9jZXNzb3J9LT57Z3JvdXBfb3B0c30gKQoJCQkJewoJCQkJCSRncm91cF9pZCA9ICBz -dWJzdHIoICJcdSRncm91cF9pZCIsIDAsICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX29wdHN9 -LT57dHJ1bmNhdGV9ICkgaWYgZXhpc3RzICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX29wdHN9 -LT57dHJ1bmNhdGV9OwoJCQkJfQoKCQkgICAgICAgIAlpZiggZXhpc3RzICRncm91cGVkeyRncm91 -cF9pZH0gKSAjd2UndmUgYWxyZWFkeSBzZXQgdGhpcyBsaXN0IHVwLCBwdXNoIGEgbmV3IGl0ZW0g -b24gdG8gdGhlIGxpc3QKCQkgICAgICAgICAgICAgICAJewoJCQkJCWlmKCAkaWRzX29ubHkgKSAj -c29tZXRpbWVzIHdlIG9ubHkgd2FudCBpZHMgcmF0aGVyIHRoYW4gdGhlIHdob2xlIGl0ZW0KCQkJ -CQl7CgkJCQkJCXB1c2ggQHskZ3JvdXBlZHskZ3JvdXBfaWR9fSwgJGl0ZW0tPmlkOwoJCQkJCX0K -CQkJCQllbHNlCgkJCQkJewoJCQkJCQlwdXNoIEB7JGdyb3VwZWR7JGdyb3VwX2lkfX0sICRpdGVt -OwoJCQkJCX0KCSAgICAgICAJCSAgICAgICAgfQogICAgICAgIAkgICAgICAJCWVsc2UgI3NldCB1 -cCBhIGxpc3QgZm9yIHRoaXMgZ3JvdXAKCSAgICAgICAgCSAgICAgICAJewoJCQkJCW15IEBncm91 -cGVkX2l0ZW1zOwoJCQkJCWlmKCAkaWRzX29ubHkgKSAjc29tZXRpbWVzIHdlIG9ubHkgd2FudCBp -ZHMgcmF0aGVyIHRoYW4gdGhlIHdob2xlIGl0ZW0KCQkgICAgICAgICAgICAgICAgICAgICAgICB7 -CQogICAgICAgIAkJICAgICAgICAgICAgICAgICAgICAgICAgQGdyb3VwZWRfaXRlbXMgPSAoJGl0 -ZW0tPmlkKTsKICAgICAgICAgICAgICAgIAkJICAgICAgICB9CgkgICAgICAgICAgICAgICAgCSAg -ICAgICAgZWxzZQogICAgICAgIAkgICAgICAgICAgICAgICAgCXsKCSAgICAgICAgICAgICAgICAJ -ICAgICAgICAgICAgICAgIEBncm91cGVkX2l0ZW1zID0gKCRpdGVtKTsKICAgICAgICAJCSAgICAg -ICAgICAgICAgIAl9CgkgICAgICAgICAgICAgICAgCSAgICAgICAgJGdyb3VwZWR7JGdyb3VwX2lk -fSA9IFtAZ3JvdXBlZF9pdGVtc107CgkJCQl9CiAgICAgICAgICAgICAgIAkJfQoJCX0KCQllbHNl -CgkJewoJCQlteSAkZ3JvdXBfaWQgPSAiVW5zcGVjaWZpZWQgIiAuICRtZXRhZmllbGQtPm5hbWU7 -CiAgCSAgICAJCWlmKCBleGlzdHMgJGdyb3VwZWR7JGdyb3VwX2lkfSApICN3ZSd2ZSBhbHJlYWR5 -IHNldCB0aGlzIGxpc3QgdXAsIHB1c2ggYSBuZXcgaXRlbSBvbiB0byB0aGUgbGlzdAoJCSAgCXsK -CQkJCWlmKCAkaWRzX29ubHkgKSAjc29tZXRpbWVzIHdlIG9ubHkgd2FudCBpZHMgcmF0aGVyIHRo -YW4gdGhlIHdob2xlIGl0ZW0KCQkJCXsKCQkJCQlwdXNoIEB7JGdyb3VwZWR7JGdyb3VwX2lkfX0s -ICRpdGVtLT5pZDsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlwdXNoIEB7JGdyb3VwZWR7JGdy -b3VwX2lkfX0sICRpdGVtOwoJCQkJfQoJICAgICAgIAkJfQogICAgICAgIAkgICAgICAJZWxzZSAj -c2V0IHVwIGEgbGlzdCBmb3IgdGhpcyBncm91cAoJICAgICAgICAJewoJCQkJbXkgQGdyb3VwZWRf -aXRlbXM7CgkJCQlpZiggJGlkc19vbmx5ICkgI3NvbWV0aW1lcyB3ZSBvbmx5IHdhbnQgaWRzIHJh -dGhlciB0aGFuIHRoZSB3aG9sZSBpdGVtCgkJICAgICAgICAgICAgICAgIHsJCiAgICAgICAgCQkJ -CUBncm91cGVkX2l0ZW1zID0gKCRpdGVtLT5pZCk7CiAgICAgICAgICAgICAgICAJCX0KCSAgICAg -ICAgICAgICAgICAJZWxzZQogICAgICAgIAkgICAgICAgICAgICAgICAgewoJICAgICAgICAgICAg -ICAgCSAgICAgICAgICAgICAgICBAZ3JvdXBlZF9pdGVtcyA9ICgkaXRlbSk7CiAgICAgICAgCSAg -ICAgICAgICAgICAgIAl9CgkgICAgICAgICAgICAgIAkgICAgICAgICRncm91cGVkeyRncm91cF9p -ZH0gPSBbQGdyb3VwZWRfaXRlbXNdOwoJCQl9CgkJfQogICAgICAgCX0gKTsKCgkjbm93IHNvcnQg -dGhlIGdyb3VwcyBhbmQgYWRkIGh1bWFuIHJlYWRhYmxlIGxhYmVscwoJbXkgQHNvcnRlZF9ncm91 -cHM7CgkKCW15ICRyZXZlcnNlID0gMDsKCSRyZXZlcnNlID0gJHNlbGYtPntwcm9jZXNzb3J9LT57 -Z3JvdXBfb3B0c30tPntyZXZlcnNlX29yZGVyfSBpZiBleGlzdHMgJHNlbGYtPntwcm9jZXNzb3J9 -LT57Z3JvdXBfb3B0c30tPntyZXZlcnNlX29yZGVyfTsKCWlmKCAkbWV0YWZpZWxkLT50eXBlIGVx -ICJuYW1lZHNldCIgKQoJewoJCW15KCAkdGFncywgJGxhYmVscyApID0gJG1ldGFmaWVsZC0+dGFn -c19hbmRfbGFiZWxzKCAkc2Vzc2lvbiApOwoJCSNjb252ZXJ0IHRhZ3MgdG8gYSBoYXNoIG9mIHZh -bHVlcyBhbmQgYSBwcmlvcml0eSAoZm9yIG9yZGVyaW5nKQoJCW15ICVwcmlvcml0eTsKCQlteSAk -aW5kZXggPSAxOwoJCWZvcmVhY2ggbXkgJHRhZyAoQHskdGFnc30gKQoJCXsKCQkJJHByaW9yaXR5 -eyR0YWd9ID0gJGluZGV4OwoJCQkkaW5kZXgrKzsKCQl9CgkJZm9yZWFjaCBteSAka2V5IChzb3J0 -IHskcHJpb3JpdHl7JGF9IDw9PiAkcHJpb3JpdHl7JGJ9fSBrZXlzICVncm91cGVkKQogICAgICAg -IAl7CgkJCXB1c2ggQHNvcnRlZF9ncm91cHMsICRzZWxmLT5fbWFrZV9ncm91cGVkX2l0ZW0oICRn -cm91cGVkeyRrZXl9LCAkbGFiZWxzLT57JGtleX0gKTsKCQl9Cgl9CgllbHNpZiggJG1ldGFmaWVs -ZC0+dHlwZSBlcSAic3ViamVjdCIgKQoJewkJCgkJbXkgJGRzID0gJHNlc3Npb24tPmRhdGFzZXQo -ICJzdWJqZWN0IiApOwoJCW15IEB2YWx1ZXMgPSBrZXlzICVncm91cGVkOwoJCW15ICRzb3J0ZWQg -PSAkbWV0YWZpZWxkLT5zb3J0X3ZhbHVlcyggJHNlc3Npb24sIFxAdmFsdWVzICk7CgkJbXkgJXBy -aW9yaXR5OwoJCW15ICRpbmRleCA9IDE7CiAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICR2YWx1 -ZSAoQHskc29ydGVkfSApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAg -ICRwcmlvcml0eXskdmFsdWV9ID0gJGluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICAkaW5k -ZXgrKzsKICAgICAgICAgICAgICAgIH0KCQlmb3JlYWNoIG15ICRrZXkgKHNvcnQgeyRwcmlvcml0 -eXskYX0gPD0+ICRwcmlvcml0eXskYn19IGtleXMgJWdyb3VwZWQpCiAgICAgICAgICAgICAgICB7 -CgkJCW15ICRzdWJqID0gJGRzLT5kYXRhb2JqKCAka2V5ICk7CiAgICAgICAgICAgICAgICAgICAg -ICAgIHB1c2ggQHNvcnRlZF9ncm91cHMsICRzZWxmLT5fbWFrZV9ncm91cGVkX2l0ZW0oICRncm91 -cGVkeyRrZXl9LCBFUHJpbnRzOjpVdGlsczo6dHJlZV90b191dGY4KCAkc3Viai0+cmVuZGVyX2Rl -c2NyaXB0aW9uICkgKSBpZiBkZWZpbmVkICRzdWJqOwogICAgICAgICAgICAgICAgfQoJfQoJZWxz -aWYoICRtZXRhZmllbGQtPnR5cGUgZXEgImRhdGUiICkKCXsKCQlpZiggJHJldmVyc2UgKQoJCXsK -CQkJZm9yZWFjaCBteSAka2V5ICggc29ydCB7JGIgPD0+ICRhfSBrZXlzICVncm91cGVkICkKCQkJ -ewoJCQkJcHVzaCBAc29ydGVkX2dyb3VwcywgJHNlbGYtPl9tYWtlX2dyb3VwZWRfaXRlbSggJGdy -b3VwZWR7JGtleX0sICRrZXkgKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlmb3JlYWNoIG15ICRr -ZXkgKCBzb3J0IHskYSA8PT4gJGJ9IGtleXMgJWdyb3VwZWQgKQoJCQl7CgkJCQlwdXNoIEBzb3J0 -ZWRfZ3JvdXBzLCAkc2VsZi0+X21ha2VfZ3JvdXBlZF9pdGVtKCAkZ3JvdXBlZHska2V5fSwgJGtl -eSApOwoJCQl9CgkJfQoJfQoJZWxzZQoJewkKCQlpZiggJHJldmVyc2UgKQoJCXsKCQkJZm9yZWFj -aCBteSAka2V5ICggc29ydCB7JGIgY21wICRhfSBrZXlzICVncm91cGVkICkKCQkJewoJCQkJcHVz -aCBAc29ydGVkX2dyb3VwcywgJHNlbGYtPl9tYWtlX2dyb3VwZWRfaXRlbSggJGdyb3VwZWR7JGtl -eX0sICRrZXkgKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlmb3JlYWNoIG15ICRrZXkgKCBzb3J0 -IGtleXMgJWdyb3VwZWQgKQoJCQl7CgkJCQlwdXNoIEBzb3J0ZWRfZ3JvdXBzLCAkc2VsZi0+X21h -a2VfZ3JvdXBlZF9pdGVtKCAkZ3JvdXBlZHska2V5fSwgJGtleSApOwoJCQl9CgkJfQoJfQoKCSNj -aGVjayBmb3IgYW55IHVuc3BlY2lmaWVkIGdyb3VwcwoJbXkgJGdyb3VwX2lkID0gIlVuc3BlY2lm -aWVkICIgLiAkbWV0YWZpZWxkLT5uYW1lOwoJaWYoIGV4aXN0cyAkZ3JvdXBlZHskZ3JvdXBfaWR9 -ICkKCXsKCQlwdXNoIEBzb3J0ZWRfZ3JvdXBzLCAkc2VsZi0+X21ha2VfZ3JvdXBlZF9pdGVtKCAk -Z3JvdXBlZHskZ3JvdXBfaWR9LCAkZ3JvdXBfaWQgKTsKCX0KCglyZXR1cm4gXEBzb3J0ZWRfZ3Jv -dXBzOwp9CQoKCnN1YiBfbWFrZV9ncm91cGVkX2l0ZW0KewoJbXkoICRzZWxmLCAkbGlzdCwgJGxh -YmVsICkgPSBAXzsKCW15ICVncm91cDsKCSRncm91cHtsaXN0fSA9ICRsaXN0OwoJJGdyb3Vwe2xh -YmVsfSA9ICRsYWJlbDsKCXJldHVybiBcJWdyb3VwOwp9CgoxOwo= +ZCAkcmVwby0+Y29uZmlnKCAkc2VsZi0+e2V4cG9ydF9jb25mfSwgImN1c3RvbV9leHBvcnQiICkg +JiYgZXhpc3RzICR7JHJlcG8tPmNvbmZpZyggJHNlbGYtPntleHBvcnRfY29uZn0sICJjdXN0b21f +ZXhwb3J0IiApfXskZmllbGRuYW1lfSApICN3ZSBoYXZlIGEgY3VzdG9tIGV4cG9ydCBmdW5jdGlv +biBpbnN0ZWFkIAoJCQkJewoJCQkJCSRjb3VudCsrOwoJCQkJCSRzZWxmLT5fZXhwb3J0X2ZpZWxk +X2NoZWNrYm94KCAkcmVwbywgJGZpZWxkbmFtZSwgJHVsLCAkcmVwby0+aHRtbF9waHJhc2UoICJl +eHBvcnRmaWVsZG9wdGlvbnM6JGZpZWxkbmFtZSIgKSApOyAKCQkJCX0KCQkJCWVsc2lmKCBkZWZp +bmVkIEVQcmludHM6OlV0aWxzOjpmaWVsZF9mcm9tX2NvbmZpZ19zdHJpbmcoICRyZXBvcnRfZHMs +ICRmaWVsZG5hbWUgKSApCgkJCQl7CgkJCQkJbXkgJGZpZWxkID0gRVByaW50czo6VXRpbHM6OmZp +ZWxkX2Zyb21fY29uZmlnX3N0cmluZyggJHJlcG9ydF9kcywgJGZpZWxkbmFtZSApOwoJCQkJCSRj +b3VudCsrOwogICAgICAgCQkJICAgICAgICAJJHNlbGYtPl9leHBvcnRfZmllbGRfY2hlY2tib3go +ICRyZXBvLCAkZmllbGRuYW1lLCAkdWwsICRmaWVsZC0+cmVuZGVyX25hbWUgKTsKCgkJCQl9CgkJ +CX0KCQkJaWYoICRjb3VudCApICNvbmx5IGFkZCBvcHRpb25zIGlmIHdlIGhhdmUgYW55IGZpZWxk +cyB0byBzaG93CgkJCXsKCQkJCW15ICRkaXYgPSAkcmVwby0+bWFrZV9lbGVtZW50KCAiZGl2Iiwg +Y2xhc3M9PiJyZXBvcnRfZXhwb3J0X29wdGlvbnMiICk7CgkJCQkkZGl2LT5hcHBlbmRDaGlsZCgg +bXkgJGggPSAkcmVwby0+bWFrZV9lbGVtZW50KCAiaDQiICkgKTsKCQkJCSRoLT5hcHBlbmRDaGls +ZCggJHJlcG8tPmh0bWxfcGhyYXNlKCAiZXhwb3J0ZmllbGRzOiRrZXkiICkgKTsJCgkJCQkkZGl2 +LT5hcHBlbmRDaGlsZCggJHVsICk7CgkJCQkkZXhwb3J0X29wdGlvbnMtPmFwcGVuZENoaWxkKCAk +ZGl2ICk7CgkJCX0KICAgICAgIAkJfQoJCSRmb3JtLT5hcHBlbmRDaGlsZCggJGV4cG9ydF9vcHRp +b25zICk7Cgl9CgoJJGZvcm0tPmFwcGVuZENoaWxkKCAKCQkkcmVwby0+cmVuZGVyX2J1dHRvbigK +CQkJbmFtZSA9PiAiX2FjdGlvbl9leHBvcnQiLAoJCQljbGFzcyA9PiAiZXBfZm9ybV9hY3Rpb25f +YnV0dG9uIiwKCQkJdmFsdWUgPT4gJHJlcG8tPnBocmFzZSggJ2NnaS91c2Vycy9lZGl0X2Vwcmlu +dDpleHBvcnQnICkKCSkgKTsKCgkjY3JlYXRlIGEgY29sbGFwc2libGUgYm94CglteSAkaW1hZ2Vz +dXJsID0gJHJlcG8tPmN1cnJlbnRfdXJsKCBwYXRoID0+ICJzdGF0aWMiLCAic3R5bGUvaW1hZ2Vz +IiApOwoJbXkgJW9wdGlvbnM7Cgkkb3B0aW9uc3tzZXNzaW9ufSA9ICRyZXBvOwogICAgICAgICRv +cHRpb25ze2lkfSA9ICJlcF9yZXBvcnRfZXhwb3J0IjsKICAgICAgICAkb3B0aW9uc3t0aXRsZX0g +PSAkcmVwby0+aHRtbF9waHJhc2UoICJleHBvcnRfdGl0bGUiICk7CiAgICAgICAgJG9wdGlvbnN7 +Y29sbGFwc2VkfSA9IDE7Cgkkb3B0aW9uc3tjb250ZW50fSA9ICRmb3JtOwogICAgICAgICRvcHRp +b25ze3Nob3dfaWNvbl91cmx9ID0gIiRpbWFnZXN1cmwvbXVsdGlfZG93bi5wbmciOwoJJG9wdGlv +bnN7aGlkZV9pY29uX3VybH0gPSAiJGltYWdlc3VybC9tdWx0aV91cC5wbmciOwoKCW15ICRib3gg +PSAkcmVwby0+bWFrZV9lbGVtZW50KCAiZGl2Iiwgc3R5bGU9PiJ0ZXh0LWFsaWduOiBsZWZ0IiAp +OwoJJGJveC0+YXBwZW5kQ2hpbGQoIEVQcmludHM6OkJveDo6cmVuZGVyKCAlb3B0aW9ucyApICk7 +CgkkY2h1bmstPmFwcGVuZENoaWxkKCAkYm94ICk7CgoJcmV0dXJuICRjaHVuazsKfQoKc3ViIHJl +bmRlcl9zb3J0X29wdGlvbnMKewoJbXkoICRzZWxmICkgPSBAXzsKCglteSAkcmVwbyA9ICRzZWxm +LT5yZXBvc2l0b3J5OwoKCW15ICRjaHVuayA9ICRyZXBvLT5tYWtlX2RvY19mcmFnbWVudDsKCgly +ZXR1cm4gJGNodW5rIHVubGVzcyggZGVmaW5lZCggJHJlcG8tPmNvbmZpZyggJHNlbGYtPntzb3J0 +X2NvbmZ9LCAic29ydGZpZWxkcyIgKSApICk7CgoJbXkgJHNvcnRfY29uZiA9ICRyZXBvLT5jb25m +aWcoICRzZWxmLT57c29ydF9jb25mfSwgInNvcnRmaWVsZHMiICk7CgoJI2J1aWxkIHRoZSBmb3Jt +CglteSAkZm9ybSA9ICRzZWxmLT5yZW5kZXJfZm9ybTsKCSRmb3JtLT5zZXRBdHRyaWJ1dGUoIG5h +bWUgPT4gInNvcnRfcmVwb3J0IiApOwogICAgICAgICRmb3JtLT5zZXRBdHRyaWJ1dGUoIG1ldGhv +ZCA9PiAiZ2V0IiApOwoJJGNodW5rLT5hcHBlbmRDaGlsZCggJGZvcm0gKTsKCQoJaWYoIGRlZmlu +ZWQgJHJlcG8tPnBhcmFtKCAic2VhcmNoIiApIHx8ICRzZWxmLT57cHJvY2Vzc29yfS0+e2FjdGlv +bn0gZXEgInNlYXJjaCIgKQoJewoJCSRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG8tPnJlbmRlcl9o +aWRkZW5fZmllbGQoICJzZWFyY2giLCAgJHNlbGYtPntwcm9jZXNzb3J9LT57c2VhcmNofS0+c2Vy +aWFsaXNlKSApOwoJfQoKCWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX2V4 +cH0gKQoJewoJCSRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG8tPnJlbmRlcl9oaWRkZW5fZmllbGQo +ICJncm91cCIsICAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cF9leHB9ICkgKTsKCX0KCgkjZGlz +cGxheSB0aGUgbGlua3MgdGhhdCB3aWxsIHRyaWdnZXIgdGhlIGZvcm0KCW15ICRmaXJzdCA9IDE7 +CglteSAkc29ydF9saW5rcyA9ICRyZXBvLT5tYWtlX2RvY19mcmFnbWVudDsKCWZvcmVhY2ggbXkg +JHNvcnRfbmFtZSAoIGtleXMgJXskc29ydF9jb25mfSApCiAgICAgICAgewoJCW15ICRzb3J0X3Zh +bHVlID0gJHNvcnRfY29uZi0+eyRzb3J0X25hbWV9OwoJCWlmKCAkZmlyc3QgKQoJCXsKCQkJJGZv +cm0tPmFwcGVuZENoaWxkKCAkcmVwby0+cmVuZGVyX2hpZGRlbl9maWVsZCggInNvcnQiLCAkc29y +dF92YWx1ZSkgKTsKCQl9CgoJCWlmKCAhJGZpcnN0ICkKICAgICAgICAgICAgICAgIHsKICAgICAg +ICAgICAgICAgIAkkc29ydF9saW5rcy0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSgg +IlVwZGF0ZS9WaWV3czpncm91cF9zZXBlcmF0b3IiICkgKTsKICAgICAgICAgICAgICAgIH0KCQkK +CQlpZiggZGVmaW5lZCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzb3J0fSAmJiAkc2VsZi0+e3Byb2Nl +c3Nvcn0tPntzb3J0fSBlcSAkc29ydF92YWx1ZSApCgkJewoJCQlteSAkc3Ryb25nID0gJHJlcG8t +Pm1ha2VfZWxlbWVudCggInN0cm9uZyIgKTsKCQkJJHN0cm9uZy0+YXBwZW5kQ2hpbGQoICRyZXBv +LT5odG1sX3BocmFzZSggJHNlbGYtPntzb3J0X2NvbmZ9IC4gIjpzb3J0OiIgLiAkc29ydF9uYW1l +ICkgKTsKCQkJJHNvcnRfbGlua3MtPmFwcGVuZENoaWxkKCAkc3Ryb25nICk7CgkJfQoJCWVsc2UK +CQl7CgkJCW15ICRsaW5rID0gJHJlcG8tPnJlbmRlcl9saW5rKCAnamF2YXNjcmlwdDpzb3J0X3Jl +cG9ydCgiJy4kc29ydF92YWx1ZS4nIiknICk7CQoJCQkkbGluay0+YXBwZW5kQ2hpbGQoICRyZXBv +LT5odG1sX3BocmFzZSggJHNlbGYtPntzb3J0X2NvbmZ9IC4gIjpzb3J0OiIgLiAkc29ydF9uYW1l +ICkgKTsKCQkJJHNvcnRfbGlua3MtPmFwcGVuZENoaWxkKCAkbGluayApOwoJCX0KCQkkZmlyc3Qg +PSAwOwogICAgICAgIH0gICAgICAgICAgIAoJJGNodW5rLT5hcHBlbmRDaGlsZCggJHJlcG8tPmh0 +bWxfcGhyYXNlKCAiUmVwb3J0OnNvcnRfbGlua3MiLCBsaW5rcz0+JHNvcnRfbGlua3MgKSApOwoJ +cmV0dXJuICRjaHVuazsKfQoKCnN1YiByZW5kZXJfZ3JvdXBfb3B0aW9ucwp7CglteSggJHNlbGYg +KSA9IEBfOwoKCW15ICRyZXBvID0gJHNlbGYtPnJlcG9zaXRvcnk7CgoJbXkgJGNodW5rID0gJHJl +cG8tPm1ha2VfZG9jX2ZyYWdtZW50OwoKCXJldHVybiAkY2h1bmsgdW5sZXNzKCBkZWZpbmVkKCAk +cmVwby0+Y29uZmlnKCAkc2VsZi0+e2dyb3VwX2NvbmZ9LCAiZ3JvdXBmaWVsZHMiICkgKSApOwoK +CW15ICRncm91cF9jb25mID0gJHJlcG8tPmNvbmZpZyggJHNlbGYtPntncm91cF9jb25mfSwgImdy +b3VwZmllbGRzIiApOwoKCSNidWlsZCB0aGUgZm9ybQoJbXkgJGZvcm0gPSAkc2VsZi0+cmVuZGVy +X2Zvcm07CgkkZm9ybS0+c2V0QXR0cmlidXRlKCBuYW1lID0+ICJncm91cF9yZXBvcnQiICk7CiAg +ICAgICAgJGZvcm0tPnNldEF0dHJpYnV0ZSggbWV0aG9kID0+ICJnZXQiICk7CgkkY2h1bmstPmFw +cGVuZENoaWxkKCAkZm9ybSApOwoJCglpZiggZGVmaW5lZCAkcmVwby0+cGFyYW0oICJzZWFyY2gi +ICkgfHwgJHNlbGYtPntwcm9jZXNzb3J9LT57YWN0aW9ufSBlcSAic2VhcmNoIiApCgl7CgkJJGZv +cm0tPmFwcGVuZENoaWxkKCAkcmVwby0+cmVuZGVyX2hpZGRlbl9maWVsZCggInNlYXJjaCIsICAk +c2VsZi0+e3Byb2Nlc3Nvcn0tPntzZWFyY2h9LT5zZXJpYWxpc2UpICk7Cgl9CgoJaWYoIGRlZmlu +ZWQgJHNlbGYtPntwcm9jZXNzb3J9LT57c29ydH0gKQoJewoJCSRmb3JtLT5hcHBlbmRDaGlsZCgg +JHJlcG8tPnJlbmRlcl9oaWRkZW5fZmllbGQoICJzb3J0IiwgICRzZWxmLT57cHJvY2Vzc29yfS0+ +e3NvcnR9ICkgKTsKCX0KCgkjZGlzcGxheSB0aGUgbGlua3MgdGhhdCB3aWxsIHRyaWdnZXIgdGhl +IGZvcm0KCW15ICRmaXJzdCA9IDE7CglteSAkZ3JvdXBfbGlua3MgPSAkcmVwby0+bWFrZV9kb2Nf +ZnJhZ21lbnQ7Cglmb3JlYWNoIG15ICRncm91cF92YWx1ZSAoIEB7JGdyb3VwX2NvbmZ9ICkKICAg +ICAgICB7CgkJbXkgKCRncm91cF9maWVsZCkgPSBzcGxpdCgvOy8sICRncm91cF92YWx1ZSApOwoJ +CWlmKCAkZmlyc3QgKQoJCXsKCQkJJGZvcm0tPmFwcGVuZENoaWxkKCAkcmVwby0+cmVuZGVyX2hp +ZGRlbl9maWVsZCggImdyb3VwIiwgJGdyb3VwX3ZhbHVlKSApOwoJCX0KCgkJaWYoICEkZmlyc3Qg +KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgCSRncm91cF9saW5rcy0+YXBwZW5k +Q2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggIlVwZGF0ZS9WaWV3czpncm91cF9zZXBlcmF0b3Ii +ICkgKTsKICAgICAgICAgICAgICAgIH0KCQkKCQlpZiggZGVmaW5lZCAkc2VsZi0+e3Byb2Nlc3Nv +cn0tPntncm91cH0gJiYgJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXB9IGVxICRncm91cF9maWVs +ZCApCgkJewoJCQlteSAkc3Ryb25nID0gJHJlcG8tPm1ha2VfZWxlbWVudCggInN0cm9uZyIgKTsK +CQkJJHN0cm9uZy0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggJHNlbGYtPntncm91 +cF9jb25mfSAuICI6Z3JvdXA6IiAuICRncm91cF9maWVsZCApICk7CgkJCSRncm91cF9saW5rcy0+ +YXBwZW5kQ2hpbGQoICRzdHJvbmcgKTsKCQl9CgkJZWxzZQoJCXsKCQkJbXkgJGxpbmsgPSAkcmVw +by0+cmVuZGVyX2xpbmsoICdqYXZhc2NyaXB0Omdyb3VwX3JlcG9ydCgiJy4kZ3JvdXBfdmFsdWUu +JyIpJyApOwkKCQkJJGxpbmstPmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJhc2UoICRzZWxm +LT57Z3JvdXBfY29uZn0gLiAiOmdyb3VwOiIgLiAkZ3JvdXBfZmllbGQgKSApOwoJCQkkZ3JvdXBf +bGlua3MtPmFwcGVuZENoaWxkKCAkbGluayApOwoJCX0KCQkkZmlyc3QgPSAwOwogICAgICAgIH0g +ICAgICAgICAgIAoJCgkjbm8gZ3JvdXBpbmcgbGluayBhdCB0aGUgZW5kCgkkZ3JvdXBfbGlua3Mt +PmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJhc2UoICJVcGRhdGUvVmlld3M6Z3JvdXBfc2Vw +ZXJhdG9yIiApICk7CglpZiggZGVmaW5lZCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cH0gJiYg +JHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXB9IG5lICIiICkKCXsKCQlteSAkbGluayA9ICRyZXBv +LT5yZW5kZXJfbGluayggJ2phdmFzY3JpcHQ6Z3JvdXBfcmVwb3J0KCIiKScgKTsJCgkJJGxpbmst +PmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJhc2UoICJyZXBvcnQ6bm9fZ3JvdXBpbmciICkg +KTsKCQkkZ3JvdXBfbGlua3MtPmFwcGVuZENoaWxkKCAkbGluayApOwoJfQoJZWxzZQoJewoJCW15 +ICRzdHJvbmcgPSAkcmVwby0+bWFrZV9lbGVtZW50KCAic3Ryb25nIiApOwogCQkkc3Ryb25nLT5h +cHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNlKCAicmVwb3J0Om5vX2dyb3VwaW5nIiApICk7 +CgkJJGdyb3VwX2xpbmtzLT5hcHBlbmRDaGlsZCggJHN0cm9uZyApOwoJfQoJCgkkY2h1bmstPmFw +cGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJhc2UoICJSZXBvcnQ6Z3JvdXBfbGlua3MiLCBsaW5r +cz0+JGdyb3VwX2xpbmtzICkgKTsKCglyZXR1cm4gJGNodW5rOwp9CgoKI2FkZHMgYSBuZXcgY2hl +Y2tib3ggdG8gYWxsb3cgdGhlIHVzZXIgdG8gY2hvb3NlIHdoaWNoIGZpZWxkcyB0byBleHBvcnQK +c3ViIF9leHBvcnRfZmllbGRfY2hlY2tib3gKewoJbXkoICRzZWxmLCAkcmVwbywgJGZpZWxkbmFt +ZSwgJHVsLCAkZmllbGRsYWJlbCApID0gQF87CgoJbXkgJGxpID0gJHJlcG8tPm1ha2VfZWxlbWVu +dCggImxpIiApOwoJJHVsLT5hcHBlbmRDaGlsZCggJGxpICk7CgogICAgICAgIG15ICRjaGVja2Jv +eCA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJpbnB1dCIsIHR5cGUgPT4gImNoZWNrYm94IiwgaWQg +PT4gJGZpZWxkbmFtZSwgbmFtZSA9PiAkZmllbGRuYW1lLCB2YWx1ZSA9PiAkZmllbGRuYW1lICk7 +CglpZiggZGVmaW5lZCAkcmVwby0+Y29uZmlnKCAkc2VsZi0+e2V4cG9ydF9jb25mfSwgImV4cG9y +dGZpZWxkX2RlZmF1bHRzIiApICkKCXsKCQlpZiggKCBncmVwIHsgJGZpZWxkbmFtZSBlcSAkXyB9 +IEB7JHJlcG8tPmNvbmZpZyggJHNlbGYtPntleHBvcnRfY29uZn0sICJleHBvcnRmaWVsZF9kZWZh +dWx0cyIgKX0gKSB8fCAoIHNjYWxhciggQHskcmVwby0+Y29uZmlnKCAkc2VsZi0+e2V4cG9ydF9j +b25mfSwgImV4cG9ydGZpZWxkX2RlZmF1bHRzIiApfSApID09IDAgKSApCgkJewoJCQkjb25seSBj +aGVjayBkZWZhdWx0cyBvciBjaGVjayBldmVyeXRoaW5nIGlmIGRlZmF1bHRzIG5vdCBkZWZpbmVk +CgkJCSRjaGVja2JveC0+c2V0QXR0cmlidXRlKCAiY2hlY2tlZCIsICJ5ZXMiICk7CgkJfQoJfQoJ +bXkgJGxhYmVsID0gJHJlcG8tPm1ha2VfZWxlbWVudCggImxhYmVsIiwgZm9yID0+ICRmaWVsZG5h +bWUgKTsKCSRsYWJlbC0+YXBwZW5kQ2hpbGQoICRmaWVsZGxhYmVsICk7CgoJJGxpLT5hcHBlbmRD +aGlsZCggJGNoZWNrYm94ICk7CgkkbGktPmFwcGVuZENoaWxkKCAkbGFiZWwgKTsKfQoKIyMjIHV0 +aWxpdHkgbWV0aG9kcwoKIyBUT0RPIHNob3VsZCB1c2UgIkpTT04iIHBhY2thZ2UKc3ViIHRvX2pz +b24KewogICAgICAgIG15KCAkc2VsZiwgJG9iamVjdCApID0gQF87CgoJcmV0dXJuICIiIGlmKCAh +ZGVmaW5lZCAkb2JqZWN0ICk7CgojIFVURi04IGlzc3VlczoKIwlyZXR1cm4gSlNPTi0+bmV3LT51 +dGY4KDEpLT5lbmNvZGUoICRvYmplY3QgKTsKCiAgICAgICAgaWYoIHJlZiggJG9iamVjdCApIGVx +ICdIQVNIJyApCiAgICAgICAgewogICAgICAgICAgICAgICAgbXkgQHN0dWZmOwogICAgICAgICAg +ICAgICAgd2hpbGUoIG15KCAkaywgJHYgKSA9IGVhY2goICUkb2JqZWN0ICkgKQogICAgICAgICAg +ICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IGlmKCAhRVByaW50czo6VXRpbHM6 +OmlzX3NldCggJHYgKSApOyAgICAgICAjIG9yICdudWxsJyA/CiAgICAgICAgICAgICAgICAgICAg +ICAgIHB1c2ggQHN0dWZmLCBFUHJpbnRzOjpVdGlsczo6anNfc3RyaW5nKCAkayApLic6Jy4kc2Vs +Zi0+dG9fanNvbiggJHYgKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJu +ICd7JyAuIGpvaW4oICIsIiwgQHN0dWZmICkgLiAnfSc7CiAgICAgICAgfQogICAgICAgIGVsc2lm +KCByZWYoICRvYmplY3QgKSBlcSAnQVJSQVknICkKICAgICAgICB7CiAgICAgICAgICAgICAgICBt +eSBAc3R1ZmY7CiAgICAgICAgICAgICAgICBmb3JlYWNoKCBAJG9iamVjdCApCiAgICAgICAgICAg +ICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgaWYoICFFUHJpbnRzOjpVdGlsczo6 +aXNfc2V0KCAkXyApICk7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQHN0dWZmLCAkc2Vs +Zi0+dG9fanNvbiggJF8gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVy +biAnWycgLiBqb2luKCAiLCIsIEBzdHVmZiApIC4gJ10nOwogICAgICAgIH0KCiAgICAgICAgcmV0 +dXJuIEVQcmludHM6OlV0aWxzOjpqc19zdHJpbmcoICRvYmplY3QgKTsKfQoKc3ViIGV4cG9ydF9w +bHVnaW5zCnsKICAgICAgICBteSggJHNlbGYsICRnZW5lcmljICkgPSBAXzsKCglteSBAcGx1Z2lu +X2lkczsKCWlmKCAkZ2VuZXJpYyApCgl7CiAJCUBwbHVnaW5faWRzID0gJHNlbGYtPnJlcG9zaXRv +cnktPnBsdWdpbl9saXN0KAogICAgICAgICAgICAgICAgCXR5cGUgPT4gIkV4cG9ydCIsCgkgICAg +ICAgICAgICAgICAgY2FuX2FjY2VwdCA9PiAicmVwb3J0L2dlbmVyaWMiLAogICAgICAgIAkgICAg +ICAgIGlzX3Zpc2libGUgPT4gInN0YWZmIiwKCQkJaXNfYWR2ZXJ0aXNlZCA9PiAxLAoJICAgICAg +ICApOwoJfQoJZWxzZQoJewogICAgICAgIAlAcGx1Z2luX2lkcyA9ICRzZWxmLT5yZXBvc2l0b3J5 +LT5wbHVnaW5fbGlzdCgKICAgICAgICAgICAgICAgIAl0eXBlID0+ICJFeHBvcnQiLAoJICAgICAg +ICAgICAgICAgIGNhbl9hY2NlcHQgPT4gInJlcG9ydC8iLiRzZWxmLT5nZXRfcmVwb3J0LAogICAg +ICAgIAkgICAgICAgIGlzX3Zpc2libGUgPT4gInN0YWZmIiwKCQkJaXNfYWR2ZXJ0aXNlZCA9PiAx +LAoJICAgICAgICApOwogICAgICAgIH0KCW15IEBwbHVnaW5zOwoJZm9yZWFjaCBteSAkaWQgKCBA +cGx1Z2luX2lkcyApCiAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJHAgPSAkc2VsZi0+cmVw +b3NpdG9yeS0+cGx1Z2luKCAiJGlkIiApIG9yIG5leHQ7CiAgICAgICAgICAgICAgICBwdXNoIEBw +bHVnaW5zLCAkcDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBAcGx1Z2luczsKfQoKc3ViIHJl +cG9ydF9wbHVnaW5zCnsKCW15KCAkc2VsZiApID0gQF87CgoJIyBzZjIgLSBjYW4ndCBsaXN0IHZp +YSB0eXBlID0+ICJTZWFyY2g6OlJlcG9ydCIgPyAKICAgICAgICBteSBAcGx1Z2luX2lkcyA9ICRz +ZWxmLT5yZXBvc2l0b3J5LT5wbHVnaW5fbGlzdCgKICAgICAgICAgICAgICAgIHR5cGUgPT4gIlNj +cmVlbiIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgQHBsdWdpbnM7Cglmb3JlYWNoIG15ICRpZCAo +IEBwbHVnaW5faWRzICkKICAgICAgICB7CgkJbmV4dCBpZiggJGlkICF+IC9eU2NyZWVuOjpSZXBv +cnQ6Oi8gKTsJIyBub3RlIHRoaXMgYWxzbyBmaWx0ZXJzIG91dCAkc2VsZiAoYWthIFNjcmVlbjo6 +UmVwb3J0KQoKICAgICAgICAgICAgICAgIG15ICRwID0gJHNlbGYtPnJlcG9zaXRvcnktPnBsdWdp +biggIiRpZCIgKTsKCQluZXh0IGlmKCAhZGVmaW5lZCAkcCB8fCAhJHAtPmNhbl9iZV92aWV3ZWQg +KTsKCiAgICAgICAgICAgICAgICBwdXNoIEBwbHVnaW5zLCAkcDsKICAgICAgICB9CgogICAgICAg +IHJldHVybiBAcGx1Z2luczsKfQoKI3JldHVybnMgYSBoYXNoIG9mIHZhbHVlcyBtYXBwZWQgdG8g +YSBsYWJlbCBhbmQgYSBsaXN0CiNpZiBpZHNfb25seSBpcyBzZXQgdGhlIGxpc3Qgb2YgaXRlbXMg +YXJlIGp1c3QgcmVwcmVzZW50ZWQgYnkgdGhlaXIgaWQgKHVzZWQgYnkgcmVwb3J0IEpTKQpzdWIg +Z2V0X2dyb3VwZWRfaXRlbXMKewoJbXkoICRzZWxmLCAkaXRlbXMsICRpZHNfb25seSApID0gQF87 +CglteSAkc2Vzc2lvbiA9ICRzZWxmLT57c2Vzc2lvbn07CglteSAlZ3JvdXBlZDsKCglteSAkZ3Jv +dXBpbmcgPSAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cH07CgoJbXkgJG1ldGFmaWVsZCA9ICRp +dGVtcy0+Z2V0X2RhdGFzZXQtPmZpZWxkKCAkZ3JvdXBpbmcgKTsKCgkjc2V0IGdyb3VwX29wdHMg +aWYgYXBwcm9wcmlhdGUKCWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX29w +dHN9ICkKCXsKCQlpZiggJG1ldGFmaWVsZC0+dHlwZSBlcSAiZGF0ZSIgKQoJCXsKCQkJJG1ldGFm +aWVsZC0+e3JlbmRlcl9yZXN9ID0gJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXBfb3B0c30tPnty +ZXN9IGlmIGV4aXN0cyAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cF9vcHRzfS0+e3Jlc307CgkJ +fQoJfQoKCSNjcmVhdGUgYSBoYXNoIG9mIGZpZWxkIHZhbHVlcyB0byBpdGVtcyAob3IgaXRlbSBp +ZHMpCgkkaXRlbXMtPm1hcCggc3ViIHsKCSAgICAgICAJbXkoICRzZXNzaW9uLCAkZGF0YXNldCwg +JGl0ZW0gKSA9IEBfOwoJCQoJCW15ICRtdWx0aXBsZSA9ICRtZXRhZmllbGQtPmdldF9wcm9wZXJ0 +eSggIm11bHRpcGxlIiApOwoJCW15IEBncm91cF92YWx1ZXM7CgkJaWYoICRtdWx0aXBsZSApCiAg +ICAgICAgICAgICAgICB7CgkJCUBncm91cF92YWx1ZXMgPSBAeyRpdGVtLT52YWx1ZSggJGdyb3Vw +aW5nICl9OwoJCX0KCQllbHNlCgkJewkJCQoJCQlAZ3JvdXBfdmFsdWVzID0gKCRpdGVtLT52YWx1 +ZSggJGdyb3VwaW5nICkpOwoJCX0KCQoJCWlmKCBzY2FsYXIgQGdyb3VwX3ZhbHVlcyA+IDAgKQoJ +CXsKCQkJZm9yZWFjaCBteSAkZ3JvdXBfdmFsdWUgKCBAZ3JvdXBfdmFsdWVzICkKCQkJewoJCQkJ +bXkgJGdyb3VwX2lkID0gJG1ldGFmaWVsZC0+Z2V0X2lkX2Zyb21fdmFsdWUoICRzZXNzaW9uLCAk +Z3JvdXBfdmFsdWUgKTsKCQkJCSN0cnVuY2F0ZSBncm91cCBpZiBhcHByb3ByaWF0ZQoJCQkJaWYo +IGRlZmluZWQgJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXBfb3B0c30gKQoJCQkJewoJCQkJCSRn +cm91cF9pZCA9ICBzdWJzdHIoICJcdSRncm91cF9pZCIsIDAsICRzZWxmLT57cHJvY2Vzc29yfS0+ +e2dyb3VwX29wdHN9LT57dHJ1bmNhdGV9ICkgaWYgZXhpc3RzICRzZWxmLT57cHJvY2Vzc29yfS0+ +e2dyb3VwX29wdHN9LT57dHJ1bmNhdGV9OwoJCQkJfQoKCQkgICAgICAgIAlpZiggZXhpc3RzICRn +cm91cGVkeyRncm91cF9pZH0gKSAjd2UndmUgYWxyZWFkeSBzZXQgdGhpcyBsaXN0IHVwLCBwdXNo +IGEgbmV3IGl0ZW0gb24gdG8gdGhlIGxpc3QKCQkgICAgICAgICAgICAgICAJewoJCQkJCWlmKCAk +aWRzX29ubHkgKSAjc29tZXRpbWVzIHdlIG9ubHkgd2FudCBpZHMgcmF0aGVyIHRoYW4gdGhlIHdo +b2xlIGl0ZW0KCQkJCQl7CgkJCQkJCXB1c2ggQHskZ3JvdXBlZHskZ3JvdXBfaWR9fSwgJGl0ZW0t +PmlkOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlwdXNoIEB7JGdyb3VwZWR7JGdyb3Vw +X2lkfX0sICRpdGVtOwoJCQkJCX0KCSAgICAgICAJCSAgICAgICAgfQogICAgICAgIAkgICAgICAJ +CWVsc2UgI3NldCB1cCBhIGxpc3QgZm9yIHRoaXMgZ3JvdXAKCSAgICAgICAgCSAgICAgICAJewoJ +CQkJCW15IEBncm91cGVkX2l0ZW1zOwoJCQkJCWlmKCAkaWRzX29ubHkgKSAjc29tZXRpbWVzIHdl +IG9ubHkgd2FudCBpZHMgcmF0aGVyIHRoYW4gdGhlIHdob2xlIGl0ZW0KCQkgICAgICAgICAgICAg +ICAgICAgICAgICB7CQogICAgICAgIAkJICAgICAgICAgICAgICAgICAgICAgICAgQGdyb3VwZWRf +aXRlbXMgPSAoJGl0ZW0tPmlkKTsKICAgICAgICAgICAgICAgIAkJICAgICAgICB9CgkgICAgICAg +ICAgICAgICAgCSAgICAgICAgZWxzZQogICAgICAgIAkgICAgICAgICAgICAgICAgCXsKCSAgICAg +ICAgICAgICAgICAJICAgICAgICAgICAgICAgIEBncm91cGVkX2l0ZW1zID0gKCRpdGVtKTsKICAg +ICAgICAJCSAgICAgICAgICAgICAgIAl9CgkgICAgICAgICAgICAgICAgCSAgICAgICAgJGdyb3Vw +ZWR7JGdyb3VwX2lkfSA9IFtAZ3JvdXBlZF9pdGVtc107CgkJCQl9CiAgICAgICAgICAgICAgIAkJ +fQoJCX0KCQllbHNlCgkJewoJCQlteSAkZ3JvdXBfaWQgPSAiVW5zcGVjaWZpZWQgIiAuICRtZXRh +ZmllbGQtPm5hbWU7CiAgCSAgICAJCWlmKCBleGlzdHMgJGdyb3VwZWR7JGdyb3VwX2lkfSApICN3 +ZSd2ZSBhbHJlYWR5IHNldCB0aGlzIGxpc3QgdXAsIHB1c2ggYSBuZXcgaXRlbSBvbiB0byB0aGUg +bGlzdAoJCSAgCXsKCQkJCWlmKCAkaWRzX29ubHkgKSAjc29tZXRpbWVzIHdlIG9ubHkgd2FudCBp +ZHMgcmF0aGVyIHRoYW4gdGhlIHdob2xlIGl0ZW0KCQkJCXsKCQkJCQlwdXNoIEB7JGdyb3VwZWR7 +JGdyb3VwX2lkfX0sICRpdGVtLT5pZDsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlwdXNoIEB7 +JGdyb3VwZWR7JGdyb3VwX2lkfX0sICRpdGVtOwoJCQkJfQoJICAgICAgIAkJfQogICAgICAgIAkg +ICAgICAJZWxzZSAjc2V0IHVwIGEgbGlzdCBmb3IgdGhpcyBncm91cAoJICAgICAgICAJewoJCQkJ +bXkgQGdyb3VwZWRfaXRlbXM7CgkJCQlpZiggJGlkc19vbmx5ICkgI3NvbWV0aW1lcyB3ZSBvbmx5 +IHdhbnQgaWRzIHJhdGhlciB0aGFuIHRoZSB3aG9sZSBpdGVtCgkJICAgICAgICAgICAgICAgIHsJ +CiAgICAgICAgCQkJCUBncm91cGVkX2l0ZW1zID0gKCRpdGVtLT5pZCk7CiAgICAgICAgICAgICAg +ICAJCX0KCSAgICAgICAgICAgICAgICAJZWxzZQogICAgICAgIAkgICAgICAgICAgICAgICAgewoJ +ICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBAZ3JvdXBlZF9pdGVtcyA9ICgkaXRlbSk7 +CiAgICAgICAgCSAgICAgICAgICAgICAgIAl9CgkgICAgICAgICAgICAgIAkgICAgICAgICRncm91 +cGVkeyRncm91cF9pZH0gPSBbQGdyb3VwZWRfaXRlbXNdOwoJCQl9CgkJfQogICAgICAgCX0gKTsK +Cgkjbm93IHNvcnQgdGhlIGdyb3VwcyBhbmQgYWRkIGh1bWFuIHJlYWRhYmxlIGxhYmVscwoJbXkg +QHNvcnRlZF9ncm91cHM7CgkKCW15ICRyZXZlcnNlID0gMDsKCSRyZXZlcnNlID0gJHNlbGYtPntw +cm9jZXNzb3J9LT57Z3JvdXBfb3B0c30tPntyZXZlcnNlX29yZGVyfSBpZiBleGlzdHMgJHNlbGYt +Pntwcm9jZXNzb3J9LT57Z3JvdXBfb3B0c30tPntyZXZlcnNlX29yZGVyfTsKCWlmKCAkbWV0YWZp +ZWxkLT50eXBlIGVxICJuYW1lZHNldCIgKQoJewoJCW15KCAkdGFncywgJGxhYmVscyApID0gJG1l +dGFmaWVsZC0+dGFnc19hbmRfbGFiZWxzKCAkc2Vzc2lvbiApOwoJCSNjb252ZXJ0IHRhZ3MgdG8g +YSBoYXNoIG9mIHZhbHVlcyBhbmQgYSBwcmlvcml0eSAoZm9yIG9yZGVyaW5nKQoJCW15ICVwcmlv +cml0eTsKCQlteSAkaW5kZXggPSAxOwoJCWZvcmVhY2ggbXkgJHRhZyAoQHskdGFnc30gKQoJCXsK +CQkJJHByaW9yaXR5eyR0YWd9ID0gJGluZGV4OwoJCQkkaW5kZXgrKzsKCQl9CgkJZm9yZWFjaCBt +eSAka2V5IChzb3J0IHskcHJpb3JpdHl7JGF9IDw9PiAkcHJpb3JpdHl7JGJ9fSBrZXlzICVncm91 +cGVkKQogICAgICAgIAl7CgkJCXB1c2ggQHNvcnRlZF9ncm91cHMsICRzZWxmLT5fbWFrZV9ncm91 +cGVkX2l0ZW0oICRncm91cGVkeyRrZXl9LCAkbGFiZWxzLT57JGtleX0gKTsKCQl9Cgl9CgllbHNp +ZiggJG1ldGFmaWVsZC0+dHlwZSBlcSAic3ViamVjdCIgKQoJewkJCgkJbXkgJGRzID0gJHNlc3Np +b24tPmRhdGFzZXQoICJzdWJqZWN0IiApOwoJCW15IEB2YWx1ZXMgPSBrZXlzICVncm91cGVkOwoJ +CW15ICRzb3J0ZWQgPSAkbWV0YWZpZWxkLT5zb3J0X3ZhbHVlcyggJHNlc3Npb24sIFxAdmFsdWVz +ICk7CgkJbXkgJXByaW9yaXR5OwoJCW15ICRpbmRleCA9IDE7CiAgICAgICAgICAgICAgICBmb3Jl +YWNoIG15ICR2YWx1ZSAoQHskc29ydGVkfSApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAg +ICAgICAgICAgICAgICRwcmlvcml0eXskdmFsdWV9ID0gJGluZGV4OwogICAgICAgICAgICAgICAg +ICAgICAgICAkaW5kZXgrKzsKICAgICAgICAgICAgICAgIH0KCQlmb3JlYWNoIG15ICRrZXkgKHNv +cnQgeyRwcmlvcml0eXskYX0gPD0+ICRwcmlvcml0eXskYn19IGtleXMgJWdyb3VwZWQpCiAgICAg +ICAgICAgICAgICB7CgkJCW15ICRzdWJqID0gJGRzLT5kYXRhb2JqKCAka2V5ICk7CiAgICAgICAg +ICAgICAgICAgICAgICAgIHB1c2ggQHNvcnRlZF9ncm91cHMsICRzZWxmLT5fbWFrZV9ncm91cGVk +X2l0ZW0oICRncm91cGVkeyRrZXl9LCBFUHJpbnRzOjpVdGlsczo6dHJlZV90b191dGY4KCAkc3Vi +ai0+cmVuZGVyX2Rlc2NyaXB0aW9uICkgKSBpZiBkZWZpbmVkICRzdWJqOwogICAgICAgICAgICAg +ICAgfQoJfQoJZWxzaWYoICRtZXRhZmllbGQtPnR5cGUgZXEgImRhdGUiICkKCXsKCQlpZiggJHJl +dmVyc2UgKQoJCXsKCQkJZm9yZWFjaCBteSAka2V5ICggc29ydCB7JGIgPD0+ICRhfSBrZXlzICVn +cm91cGVkICkKCQkJewoJCQkJcHVzaCBAc29ydGVkX2dyb3VwcywgJHNlbGYtPl9tYWtlX2dyb3Vw +ZWRfaXRlbSggJGdyb3VwZWR7JGtleX0sICRrZXkgKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlm +b3JlYWNoIG15ICRrZXkgKCBzb3J0IHskYSA8PT4gJGJ9IGtleXMgJWdyb3VwZWQgKQoJCQl7CgkJ +CQlwdXNoIEBzb3J0ZWRfZ3JvdXBzLCAkc2VsZi0+X21ha2VfZ3JvdXBlZF9pdGVtKCAkZ3JvdXBl +ZHska2V5fSwgJGtleSApOwoJCQl9CgkJfQoJfQoJZWxzZQoJewkKCQlpZiggJHJldmVyc2UgKQoJ +CXsKCQkJZm9yZWFjaCBteSAka2V5ICggc29ydCB7JGIgY21wICRhfSBrZXlzICVncm91cGVkICkK +CQkJewoJCQkJcHVzaCBAc29ydGVkX2dyb3VwcywgJHNlbGYtPl9tYWtlX2dyb3VwZWRfaXRlbSgg +JGdyb3VwZWR7JGtleX0sICRrZXkgKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlmb3JlYWNoIG15 +ICRrZXkgKCBzb3J0IGtleXMgJWdyb3VwZWQgKQoJCQl7CgkJCQlwdXNoIEBzb3J0ZWRfZ3JvdXBz +LCAkc2VsZi0+X21ha2VfZ3JvdXBlZF9pdGVtKCAkZ3JvdXBlZHska2V5fSwgJGtleSApOwoJCQl9 +CgkJfQoJfQoKCSNjaGVjayBmb3IgYW55IHVuc3BlY2lmaWVkIGdyb3VwcwoJbXkgJGdyb3VwX2lk +ID0gIlVuc3BlY2lmaWVkICIgLiAkbWV0YWZpZWxkLT5uYW1lOwoJaWYoIGV4aXN0cyAkZ3JvdXBl +ZHskZ3JvdXBfaWR9ICkKCXsKCQlwdXNoIEBzb3J0ZWRfZ3JvdXBzLCAkc2VsZi0+X21ha2VfZ3Jv +dXBlZF9pdGVtKCAkZ3JvdXBlZHskZ3JvdXBfaWR9LCAkZ3JvdXBfaWQgKTsKCX0KCglyZXR1cm4g +XEBzb3J0ZWRfZ3JvdXBzOwp9CQoKCnN1YiBfbWFrZV9ncm91cGVkX2l0ZW0KewoJbXkoICRzZWxm +LCAkbGlzdCwgJGxhYmVsICkgPSBAXzsKCW15ICVncm91cDsKCSRncm91cHtsaXN0fSA9ICRsaXN0 +OwoJJGdyb3Vwe2xhYmVsfSA9ICRsYWJlbDsKCXJldHVybiBcJWdyb3VwOwp9CgoxOwo= diff --git a/reports.epmi b/reports.epmi index 2b76082..88b9fab 100644 --- a/reports.epmi +++ b/reports.epmi @@ -15,9 +15,9 @@ epm/reports/cfg/cfg.d/z_reports.pl text/plain - 385eec38a9a534ff630359efd9b5460b + 334237b831581075209dbbedf084d878 MD5 - 2593 + 2609 epm/reports/cfg/cfg.d/z_search_reports.pl @@ -36,9 +36,9 @@ plugins/EPrints/Plugin/Export/Grid2.pm text/plain - facf6666f0b9757b6b43e6fd20559099 + dd9b2c0a038b1f9f51b618a4b2e11c4b MD5 - 7787 + 9699 plugins/EPrints/Plugin/Export/MultilineCSV2.pm @@ -71,9 +71,9 @@ plugins/EPrints/Plugin/Export/Report/HTML.pm text/plain - 666f802bd567fead817bd3228b7dc78e + 8e2ca840f2fd1fa5983bcca0f96a7233 MD5 - 5596 + 5578 plugins/EPrints/Plugin/Export/Report/JSON.pm @@ -85,9 +85,9 @@ plugins/EPrints/Plugin/Screen/Report.pm text/plain - 7b964bfb863e905a17713c6cea2e0653 + 210449eac1f7ee02e7519beead2c640b MD5 - 37088 + 37100 plugins/EPrints/Plugin/Screen/Report/EPrint.pm