From 2d084a150b550af88a6f02ba5b8f39ad03efd199 Mon Sep 17 00:00:00 2001 From: Jasmine Date: Mon, 5 Oct 2020 19:05:47 -0700 Subject: [PATCH 01/26] wrote a script to verify that the token works --- lib/slack.rb | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/lib/slack.rb b/lib/slack.rb index 8a0b659b..e1f46e8d 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -1,12 +1,26 @@ #!/usr/bin/env ruby +require "dotenv" +require "httparty" +require "pry" +Dotenv.load def main puts "Welcome to the Ada Slack CLI!" - workspace = Workspace.new + #workspace = Workspace.new - # TODO project + # TODO projectdfd puts "Thank you for using the Ada Slack CLI" end -main if __FILE__ == $PROGRAM_NAME \ No newline at end of file +main if __FILE__ == $PROGRAM_NAME + +URL = "https://slack.com/api/conversations.list" +KEY = ENV["SLACK_TOKEN"] + + +response = HTTParty.get(URL, query: { token: KEY } ) + +binding.pry + + From 08445a7bcf9b6106fdab805553e6481852ec016f Mon Sep 17 00:00:00 2001 From: Jasmine Date: Mon, 5 Oct 2020 19:07:55 -0700 Subject: [PATCH 02/26] added the filter_sensitive_data for SLACK_TOKEN --- test/test_helper.rb | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/test/test_helper.rb b/test/test_helper.rb index 1fcf2bab..e8fea87f 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -3,11 +3,16 @@ add_filter 'test/' end + + require 'minitest' require 'minitest/autorun' require 'minitest/reporters' require 'minitest/skip_dsl' require 'vcr' +require "dotenv" +Dotenv.load + Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new @@ -25,5 +30,8 @@ } # Don't leave our token lying around in a cassette file. - + config.filter_sensitive_data("") do + ENV["SLACK_TOKEN"] + end end + From 2cf3d20ce8d598e17cd833b46bac4e5e282f8152 Mon Sep 17 00:00:00 2001 From: Ringo Alcock Date: Tue, 6 Oct 2020 16:08:18 -0700 Subject: [PATCH 03/26] create channel class and define initialize and self.life methods --- lib/channel.rb | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 lib/channel.rb diff --git a/lib/channel.rb b/lib/channel.rb new file mode 100644 index 00000000..30a62561 --- /dev/null +++ b/lib/channel.rb @@ -0,0 +1,33 @@ +require 'httparty' +require 'dotenv' +Dotenv.load + +require_relative 'recipient' + +class Channel < Recipient + + attr_reader :name, :topic, :member_count + + BASE_URL = "https://slack.com/api/conversations.list" + + def initialize(slack_id, name, topic, member_count) + super(slack_id) + @name = name + @topic = topic + @member_count = member_count + end + + def self.list + response = self.get(BASE_URL) + all_our_pretty_channels = [] + response["channels"].each_with_index do |channel| + slack_id = channel["id"] + name = channel["name"] + topic = channel["purpose"]["value"] + member_count = channel["num_members"] + all_our_pretty_channels << Channel.new(slack_id, name, topic, member_count) + end + return all_our_pretty_channels + end + +end \ No newline at end of file From f9b04a3a649f752104ec89f3cf3fe7be8f321a3e Mon Sep 17 00:00:00 2001 From: Ringo Alcock Date: Tue, 6 Oct 2020 16:08:49 -0700 Subject: [PATCH 04/26] create recipient class and define initialize and self.get methods --- lib/recipient.rb | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 lib/recipient.rb diff --git a/lib/recipient.rb b/lib/recipient.rb new file mode 100644 index 00000000..63262ced --- /dev/null +++ b/lib/recipient.rb @@ -0,0 +1,25 @@ +require 'httparty' +require 'dotenv' +Dotenv.load + +class Recipient + + attr_reader :slack_id + # GET_BASE_URL = "https://slack.com/api/" + # MESSAGE_BASE_URL = + # # child classes will append their own url suffixes + KEY = ENV["SLACK_TOKEN"] + + def initialize(slack_id) + @slack_id = slack_id + end + + def self.get(url, parameters: { token: KEY } ) + HTTParty.get(url, query: parameters ) + end + + def self.list + raise NotImplementedError + end + +end \ No newline at end of file From 95694ac0d544f8c8c7e9dc658849b7b0a04581ce Mon Sep 17 00:00:00 2001 From: Ringo Alcock Date: Tue, 6 Oct 2020 16:09:27 -0700 Subject: [PATCH 05/26] define main method for list users & channels --- lib/slack.rb | 49 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/lib/slack.rb b/lib/slack.rb index e1f46e8d..dd9fee98 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -1,26 +1,53 @@ #!/usr/bin/env ruby -require "dotenv" +# require "dotenv" require "httparty" require "pry" -Dotenv.load +require "colorize" +require_relative 'workspace.rb' +# Dotenv.load def main - puts "Welcome to the Ada Slack CLI!" - #workspace = Workspace.new - - # TODO projectdfd + puts "Welcome to the Ada Slack CLI!".colorize(:light_yellow) + workspace = Workspace.new + + #puts load information (number of users and channels, etc) + puts "There are #{workspace.users.length} users and #{workspace.channels.length} channels".colorize(:light_yellow) + + options = "\nWhat would you like to do?\n— list users\n— list channels\n— quit\n".colorize(:light_green) + + while true + puts options + print "=> " + user_input = gets.chomp.downcase + puts + + case user_input + when "list users" + tp workspace.list("users") + when "list channels" + tp workspace.list("channels") + when "quit" + break + else + puts "I told you your options, buddy... try again.".colorize(:light_magenta) + end + end puts "Thank you for using the Ada Slack CLI" end main if __FILE__ == $PROGRAM_NAME -URL = "https://slack.com/api/conversations.list" -KEY = ENV["SLACK_TOKEN"] - +# URL = "https://slack.com/api/conversations.list" +# KEY = ENV["SLACK_TOKEN"] +# response = HTTParty.get(URL, query: { token: KEY } ) -response = HTTParty.get(URL, query: { token: KEY } ) -binding.pry +# blah blah as part of code +# if "list users" +# tp workspace.list("users") +# if "list channels" +# tp workspace.list("channels") +# TODO look into soft wrap or continue on new line for table_print \ No newline at end of file From ed7061aad08dcab9e82953532436ec48d5ab9a2d Mon Sep 17 00:00:00 2001 From: Ringo Alcock Date: Tue, 6 Oct 2020 16:09:55 -0700 Subject: [PATCH 06/26] create user class and define initalize and self.list methods --- lib/user.rb | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 lib/user.rb diff --git a/lib/user.rb b/lib/user.rb new file mode 100644 index 00000000..fb0c41e7 --- /dev/null +++ b/lib/user.rb @@ -0,0 +1,34 @@ +require 'httparty' +require 'dotenv' +Dotenv.load + +require_relative 'recipient' + +class User < Recipient + + attr_reader :username, :real_name, :status_text, :status_emoji + + BASE_URL = "https://slack.com/api/users.list" + + def initialize(slack_id, username, real_name, status_text, status_emoji) + super(slack_id) + @username = username + @real_name = real_name + @status_text = status_text + @status_emoji = status_emoji + end + + def self.list + response = self.get(BASE_URL) + all_our_pretty_users = [] + response["members"].each_with_index do |user| + slack_id = user["id"] + username = user["name"] + real_name = user["real_name"] + status_text = user["profile"]["status_text"] + status_emoji = user['profile']['status_emoji'] + all_our_pretty_users << User.new(slack_id, username, real_name, status_text, status_emoji) + end + return all_our_pretty_users + end +end \ No newline at end of file From 02a716c772c5a10cfa5b2205ad83056f88e7b500 Mon Sep 17 00:00:00 2001 From: Ringo Alcock Date: Tue, 6 Oct 2020 16:10:32 -0700 Subject: [PATCH 07/26] create workspace class and define initialize and list methods --- lib/workspace.rb | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 lib/workspace.rb diff --git a/lib/workspace.rb b/lib/workspace.rb new file mode 100644 index 00000000..6f2e6f41 --- /dev/null +++ b/lib/workspace.rb @@ -0,0 +1,24 @@ +require 'table_print' +require_relative 'user' +require_relative 'channel' + +class Workspace + + attr_reader :users, :channels + + def initialize + @users = User.list + @channels = Channel.list + end + + def list(thing_to_print) + if thing_to_print == "users" + printable_users = @users.map { |user| { "User Name" => user.username, "Real Name" => user.real_name, "Slack ID" => user.slack_id} } + return printable_users + elsif thing_to_print == "channels" + printable_users = @channels.map { |channel| {"Channel Name" => channel.name, "Member Count" => channel.member_count, "Slack ID" => channel.slack_id, "Topic" => channel.topic} } + return printable_users + end + end + +end \ No newline at end of file From 19549eb19d5f1eb4370647141959715b204548c8 Mon Sep 17 00:00:00 2001 From: Ringo Alcock Date: Tue, 6 Oct 2020 16:12:27 -0700 Subject: [PATCH 08/26] delete duplicate text in test_helper and make test files for classes --- test/channel_test.rb | 1 + test/recipient_test.rb | 7 +++++++ test/test_helper.rb | 6 ------ test/user_test.rb | 1 + test/workspace_test.rb | 1 + 5 files changed, 10 insertions(+), 6 deletions(-) create mode 100644 test/channel_test.rb create mode 100644 test/recipient_test.rb create mode 100644 test/user_test.rb create mode 100644 test/workspace_test.rb diff --git a/test/channel_test.rb b/test/channel_test.rb new file mode 100644 index 00000000..a46e6816 --- /dev/null +++ b/test/channel_test.rb @@ -0,0 +1 @@ +require_relative "test_helper" \ No newline at end of file diff --git a/test/recipient_test.rb b/test/recipient_test.rb new file mode 100644 index 00000000..1077ce88 --- /dev/null +++ b/test/recipient_test.rb @@ -0,0 +1,7 @@ +require_relative "test_helper" + +describe "self.get" do + it "gets a response from API" do + + end +end \ No newline at end of file diff --git a/test/test_helper.rb b/test/test_helper.rb index e8fea87f..c6bfc389 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -13,14 +13,8 @@ require "dotenv" Dotenv.load - Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new -VCR.configure do |config| - config.cassette_library_dir = "test/cassettes" - config.hook_into :webmock -end - VCR.configure do |config| config.cassette_library_dir = "test/cassettes" # folder where casettes will be located config.hook_into :webmock # tie into this other tool called webmock diff --git a/test/user_test.rb b/test/user_test.rb new file mode 100644 index 00000000..a46e6816 --- /dev/null +++ b/test/user_test.rb @@ -0,0 +1 @@ +require_relative "test_helper" \ No newline at end of file diff --git a/test/workspace_test.rb b/test/workspace_test.rb new file mode 100644 index 00000000..a46e6816 --- /dev/null +++ b/test/workspace_test.rb @@ -0,0 +1 @@ +require_relative "test_helper" \ No newline at end of file From e1596907bc9d9215639591c88f90c1a3b76401b8 Mon Sep 17 00:00:00 2001 From: Ringo Alcock Date: Tue, 6 Oct 2020 16:13:40 -0700 Subject: [PATCH 09/26] add floo files to .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 3ff4fada..e651d86e 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,5 @@ # Ignore environemnt variables .env +.floo +.flooignore From 7acca4b8faf2be318c6951106f6a88e9bee4a361 Mon Sep 17 00:00:00 2001 From: Ringo Alcock Date: Tue, 6 Oct 2020 16:49:47 -0700 Subject: [PATCH 10/26] create slack_api_error and add exception handling to self.get --- lib/recipient.rb | 7 ++++++- lib/slack_api_error.rb | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 lib/slack_api_error.rb diff --git a/lib/recipient.rb b/lib/recipient.rb index 63262ced..e10da65a 100644 --- a/lib/recipient.rb +++ b/lib/recipient.rb @@ -2,6 +2,8 @@ require 'dotenv' Dotenv.load +require_relative 'slack_api_error' + class Recipient attr_reader :slack_id @@ -15,7 +17,10 @@ def initialize(slack_id) end def self.get(url, parameters: { token: KEY } ) - HTTParty.get(url, query: parameters ) + response = HTTParty.get(url, query: parameters ) + raise SlackApiError if response.code != 200 || response['ok'] + + return response end def self.list diff --git a/lib/slack_api_error.rb b/lib/slack_api_error.rb new file mode 100644 index 00000000..1d4a0b6f --- /dev/null +++ b/lib/slack_api_error.rb @@ -0,0 +1,2 @@ +class SlackApiError < Exception +end \ No newline at end of file From 16d636d0d964359f9230838684b168111011dc15 Mon Sep 17 00:00:00 2001 From: Ringo Alcock Date: Tue, 6 Oct 2020 17:27:12 -0700 Subject: [PATCH 11/26] write tests for recipient --- lib/recipient.rb | 2 +- test/cassettes/recipient_get.yml | 373 +++++++++++++++++++++++++++++++ test/recipient_test.rb | 31 ++- test/test_helper.rb | 6 + 4 files changed, 409 insertions(+), 3 deletions(-) create mode 100644 test/cassettes/recipient_get.yml diff --git a/lib/recipient.rb b/lib/recipient.rb index e10da65a..981c192d 100644 --- a/lib/recipient.rb +++ b/lib/recipient.rb @@ -18,7 +18,7 @@ def initialize(slack_id) def self.get(url, parameters: { token: KEY } ) response = HTTParty.get(url, query: parameters ) - raise SlackApiError if response.code != 200 || response['ok'] + raise SlackApiError unless response['ok'] return response end diff --git a/test/cassettes/recipient_get.yml b/test/cassettes/recipient_get.yml new file mode 100644 index 00000000..d1225f4c --- /dev/null +++ b/test/cassettes/recipient_get.yml @@ -0,0 +1,373 @@ +--- +http_interactions: +- request: + method: get + uri: https://slack.com/api/users.list?token= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Date: + - Wed, 07 Oct 2020 00:08:54 GMT + Server: + - Apache + X-Slack-Req-Id: + - d5077e85ce7b2b23b4962987b18301f0 + X-Oauth-Scopes: + - chat:write,channels:read,users:read,channels:join + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + Access-Control-Allow-Origin: + - "*" + X-Slack-Backend: + - r + X-Content-Type-Options: + - nosniff + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - users:read + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, + x-b3-sampled, x-b3-flags + Vary: + - Accept-Encoding + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Content-Length: + - '1250' + Content-Type: + - application/json; charset=utf-8 + X-Via: + - haproxy-www-eyic,haproxy-edge-pdx-uln4 + body: + encoding: ASCII-8BIT + string: '{"ok":true,"members":[{"id":"USLACKBOT","team_id":"T01BKP66VQF","name":"slackbot","deleted":false,"color":"757575","real_name":"Slackbot","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Slackbot","real_name_normalized":"Slackbot","display_name":"Slackbot","display_name_normalized":"Slackbot","fields":null,"status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"sv41d8cd98f0","always_active":true,"first_name":"slackbot","last_name":"","image_24":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_24.png","image_32":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_32.png","image_48":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_48.png","image_72":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_72.png","image_192":"https:\/\/a.slack-edge.com\/80588\/marketing\/img\/avatars\/slackbot\/avatar-slackbot.png","image_512":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_512.png","status_text_canonical":"","team":"T01BKP66VQF"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":0},{"id":"U01BKP9SFK9","team_id":"T01BKP66VQF","name":"ringo.alcock","deleted":false,"color":"4bbe2e","real_name":"Ringo","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Ringo","real_name_normalized":"Ringo","display_name":"Ringo","display_name_normalized":"Ringo","fields":null,"status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g08f17ccf64b","image_24":"https:\/\/secure.gravatar.com\/avatar\/08f17ccf64bc02a830ff6d94158bb7d0.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/08f17ccf64bc02a830ff6d94158bb7d0.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/08f17ccf64bc02a830ff6d94158bb7d0.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/08f17ccf64bc02a830ff6d94158bb7d0.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/08f17ccf64bc02a830ff6d94158bb7d0.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/08f17ccf64bc02a830ff6d94158bb7d0.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-512.png","status_text_canonical":"","team":"T01BKP66VQF"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1601939635},{"id":"U01BXDDM9D3","team_id":"T01BKP66VQF","name":"slack_shack_ringo_api","deleted":false,"color":"3c989f","real_name":"Slack + Shack - Ringo - API Project","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Slack + Shack - Ringo - API Project","real_name_normalized":"Slack Shack - Ringo - + API Project","display_name":"","display_name_normalized":"","fields":null,"status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g80470ef0045","api_app_id":"A01CD505VFB","always_active":false,"bot_id":"B01CQBDFDH6","image_24":"https:\/\/secure.gravatar.com\/avatar\/80470ef0045f14e6eabaa7de2a9a3cf1.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0007-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/80470ef0045f14e6eabaa7de2a9a3cf1.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0007-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/80470ef0045f14e6eabaa7de2a9a3cf1.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0007-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/80470ef0045f14e6eabaa7de2a9a3cf1.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0007-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/80470ef0045f14e6eabaa7de2a9a3cf1.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0007-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/80470ef0045f14e6eabaa7de2a9a3cf1.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0007-512.png","status_text_canonical":"","team":"T01BKP66VQF"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":true,"is_app_user":false,"updated":1601940231},{"id":"U01C0FJ2NR0","team_id":"T01BKP66VQF","name":"jasylop","deleted":false,"color":"9f69e7","real_name":"jasylop","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"jasylop","real_name_normalized":"jasylop","display_name":"","display_name_normalized":"","fields":null,"status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g9cad2c21b75","image_24":"https:\/\/secure.gravatar.com\/avatar\/9cad2c21b7556014e0c7d631350bfa6f.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/9cad2c21b7556014e0c7d631350bfa6f.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/9cad2c21b7556014e0c7d631350bfa6f.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/9cad2c21b7556014e0c7d631350bfa6f.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/9cad2c21b7556014e0c7d631350bfa6f.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/9cad2c21b7556014e0c7d631350bfa6f.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-512.png","status_text_canonical":"","team":"T01BKP66VQF"},"is_admin":true,"is_owner":true,"is_primary_owner":true,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1601939471},{"id":"U01CD4VSXRP","team_id":"T01BKP66VQF","name":"earth_jasmine_api_pro","deleted":false,"color":"e7392d","real_name":"Earth + - Jasmine - API Project","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight + Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Earth + - Jasmine - API Project","real_name_normalized":"Earth - Jasmine - API Project","display_name":"","display_name_normalized":"","fields":null,"status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"gc21fc0f73d1","api_app_id":"A01BTPM845U","always_active":false,"bot_id":"B01BXD5J81K","image_24":"https:\/\/secure.gravatar.com\/avatar\/c21fc0f73d1ef7d3240a2ef839f929cf.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0006-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/c21fc0f73d1ef7d3240a2ef839f929cf.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0006-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/c21fc0f73d1ef7d3240a2ef839f929cf.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0006-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/c21fc0f73d1ef7d3240a2ef839f929cf.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0006-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/c21fc0f73d1ef7d3240a2ef839f929cf.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0006-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/c21fc0f73d1ef7d3240a2ef839f929cf.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0006-512.png","status_text_canonical":"","team":"T01BKP66VQF"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":true,"is_app_user":false,"updated":1601939850}],"cache_ts":1602029334,"response_metadata":{"next_cursor":""}}' + recorded_at: Wed, 07 Oct 2020 00:08:54 GMT +- request: + method: get + uri: https://slack.com/api/?token= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 301 + message: Moved Permanently + headers: + Date: + - Wed, 07 Oct 2020 00:13:04 GMT + Server: + - Apache + Vary: + - Accept-Encoding + Location: + - https://slack.com/api?token= + Content-Length: + - '0' + Content-Type: + - text/html + X-Via: + - haproxy-www-ak1v,haproxy-edge-pdx-1cbr + body: + encoding: UTF-8 + string: '' + recorded_at: Wed, 07 Oct 2020 00:13:04 GMT +- request: + method: get + uri: https://slack.com/api?token= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 301 + message: Moved Permanently + headers: + Date: + - Wed, 07 Oct 2020 00:13:04 GMT + Server: + - Apache + Vary: + - Accept-Encoding + Location: + - https://api.slack.com?token= + Content-Length: + - '0' + Content-Type: + - text/html + X-Via: + - haproxy-www-vlb3,haproxy-edge-pdx-yate + body: + encoding: UTF-8 + string: '' + recorded_at: Wed, 07 Oct 2020 00:13:04 GMT +- request: + method: get + uri: https://api.slack.com/?token= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Date: + - Wed, 07 Oct 2020 00:13:04 GMT + Server: + - Apache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + X-Slack-Backend: + - r + Vary: + - Accept-Encoding + X-Xss-Protection: + - '0' + X-Frame-Options: + - SAMEORIGIN + Set-Cookie: + - b=3uenb6yf4fbz2jx5c5vd75cax; expires=Mon, 07-Oct-2030 00:13:04 GMT; Max-Age=315532800; + path=/; domain=.slack.com; secure; SameSite=None + - x=3uenb6yf4fbz2jx5c5vd75cax.1602029584; expires=Wed, 07-Oct-2020 00:28:04 + GMT; Max-Age=900; path=/; domain=.slack.com; secure; SameSite=None + Content-Length: + - '19441' + Content-Type: + - text/html; charset=utf-8 + X-Via: + - haproxy-www-pysr,haproxy-edge-pdx-l129 + body: + encoding: ASCII-8BIT + string: !binary |- + PCFET0NUWVBFIGh0bWw+PGh0bWwgbGFuZz0iZW4tVVMiIGNsYXNzPSIiPjxoZWFkPjxzY3JpcHQ+d2luZG93LnRzX2VuZHBvaW50X3VybCA9ICJodHRwczpcL1wvc2xhY2suY29tXC9iZWFjb25cL3RpbWluZyI7KGZ1bmN0aW9uKGUpIHsKCXZhciBuPURhdGUubm93P0RhdGUubm93KCk6K25ldyBEYXRlLHI9ZS5wZXJmb3JtYW5jZXx8e30sdD1bXSxhPXt9LGk9ZnVuY3Rpb24oZSxuKXtmb3IodmFyIHI9MCxhPXQubGVuZ3RoLGk9W107YT5yO3IrKyl0W3JdW2VdPT1uJiZpLnB1c2godFtyXSk7cmV0dXJuIGl9LG89ZnVuY3Rpb24oZSxuKXtmb3IodmFyIHIsYT10Lmxlbmd0aDthLS07KXI9dFthXSxyLmVudHJ5VHlwZSE9ZXx8dm9pZCAwIT09biYmci5uYW1lIT1ufHx0LnNwbGljZShhLDEpfTtyLm5vd3x8KHIubm93PXIud2Via2l0Tm93fHxyLm1vek5vd3x8ci5tc05vd3x8ZnVuY3Rpb24oKXtyZXR1cm4oRGF0ZS5ub3c/RGF0ZS5ub3coKTorbmV3IERhdGUpLW59KSxyLm1hcmt8fChyLm1hcms9ci53ZWJraXRNYXJrfHxmdW5jdGlvbihlKXt2YXIgbj17bmFtZTplLGVudHJ5VHlwZToibWFyayIsc3RhcnRUaW1lOnIubm93KCksZHVyYXRpb246MH07dC5wdXNoKG4pLGFbZV09bn0pLHIubWVhc3VyZXx8KHIubWVhc3VyZT1yLndlYmtpdE1lYXN1cmV8fGZ1bmN0aW9uKGUsbixyKXtuPWFbbl0uc3RhcnRUaW1lLHI9YVtyXS5zdGFydFRpbWUsdC5wdXNoKHtuYW1lOmUsZW50cnlUeXBlOiJtZWFzdXJlIixzdGFydFRpbWU6bixkdXJhdGlvbjpyLW59KX0pLHIuZ2V0RW50cmllc0J5VHlwZXx8KHIuZ2V0RW50cmllc0J5VHlwZT1yLndlYmtpdEdldEVudHJpZXNCeVR5cGV8fGZ1bmN0aW9uKGUpe3JldHVybiBpKCJlbnRyeVR5cGUiLGUpfSksci5nZXRFbnRyaWVzQnlOYW1lfHwoci5nZXRFbnRyaWVzQnlOYW1lPXIud2Via2l0R2V0RW50cmllc0J5TmFtZXx8ZnVuY3Rpb24oZSl7cmV0dXJuIGkoIm5hbWUiLGUpfSksci5jbGVhck1hcmtzfHwoci5jbGVhck1hcmtzPXIud2Via2l0Q2xlYXJNYXJrc3x8ZnVuY3Rpb24oZSl7bygibWFyayIsZSl9KSxyLmNsZWFyTWVhc3VyZXN8fChyLmNsZWFyTWVhc3VyZXM9ci53ZWJraXRDbGVhck1lYXN1cmVzfHxmdW5jdGlvbihlKXtvKCJtZWFzdXJlIixlKX0pLGUucGVyZm9ybWFuY2U9ciwiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiYoZGVmaW5lLmFtZHx8ZGVmaW5lLmFqcykmJmRlZmluZSgicGVyZm9ybWFuY2UiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIHJ9KSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lCn0pKHdpbmRvdyk7PC9zY3JpcHQ+PHNjcmlwdD4KCihmdW5jdGlvbiAoKSB7CgkKCXdpbmRvdy5UU01hcmsgPSBmdW5jdGlvbiAobWFya19sYWJlbCkgewoJCWlmICghd2luZG93LnBlcmZvcm1hbmNlIHx8ICF3aW5kb3cucGVyZm9ybWFuY2UubWFyaykgcmV0dXJuOwoJCXBlcmZvcm1hbmNlLm1hcmsobWFya19sYWJlbCk7Cgl9OwoJd2luZG93LlRTTWFyaygnc3RhcnRfbG9hZCcpOwoKCQoJd2luZG93LlRTTWVhc3VyZUFuZEJlYWNvbiA9IGZ1bmN0aW9uIChtZWFzdXJlX2xhYmVsLCBzdGFydF9tYXJrX2xhYmVsKSB7CgkJaWYgKCF3aW5kb3cucGVyZm9ybWFuY2UgfHwgIXdpbmRvdy5wZXJmb3JtYW5jZS5tYXJrIHx8ICF3aW5kb3cucGVyZm9ybWFuY2UubWVhc3VyZSkgewoJCQlyZXR1cm47CgkJfQoKCQlwZXJmb3JtYW5jZS5tYXJrKHN0YXJ0X21hcmtfbGFiZWwgKyAnX2VuZCcpOwoKCQl0cnkgewoJCQlwZXJmb3JtYW5jZS5tZWFzdXJlKG1lYXN1cmVfbGFiZWwsIHN0YXJ0X21hcmtfbGFiZWwsIHN0YXJ0X21hcmtfbGFiZWwgKyAnX2VuZCcpOwoJCQl3aW5kb3cuVFNCZWFjb24obWVhc3VyZV9sYWJlbCwgcGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5TmFtZShtZWFzdXJlX2xhYmVsKVswXS5kdXJhdGlvbik7CgkJfSBjYXRjaCAoZSkgewoJCQkKCQl9Cgl9OwoKCQoJaWYgKCdzZW5kQmVhY29uJyBpbiBuYXZpZ2F0b3IpIHsKCQl3aW5kb3cuVFNCZWFjb24gPSBmdW5jdGlvbiAobGFiZWwsIHZhbHVlKSB7CgkJCXZhciBlbmRwb2ludF91cmwgPSB3aW5kb3cudHNfZW5kcG9pbnRfdXJsIHx8ICdodHRwczovL3NsYWNrLmNvbS9iZWFjb24vdGltaW5nJzsKCQkJbmF2aWdhdG9yLnNlbmRCZWFjb24oCgkJCQllbmRwb2ludF91cmwgKyAnP2RhdGE9JyArIGVuY29kZVVSSUNvbXBvbmVudChsYWJlbCArICc6JyArIHZhbHVlKSwKCQkJCScnCgkJCSk7CgkJfTsKCX0gZWxzZSB7CgkJd2luZG93LlRTQmVhY29uID0gZnVuY3Rpb24gKGxhYmVsLCB2YWx1ZSkgewoJCQl2YXIgZW5kcG9pbnRfdXJsID0gd2luZG93LnRzX2VuZHBvaW50X3VybCB8fCAnaHR0cHM6Ly9zbGFjay5jb20vYmVhY29uL3RpbWluZyc7CgkJCW5ldyBJbWFnZSgpLnNyYyA9IGVuZHBvaW50X3VybCArICc/ZGF0YT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGxhYmVsICsgJzonICsgdmFsdWUpOwoJCX07Cgl9Cn0pKCk7Cjwvc2NyaXB0PjxzY3JpcHQ+d2luZG93LlRTTWFyaygnc3RlcF9sb2FkJyk7PC9zY3JpcHQ+PG5vc2NyaXB0PjxtZXRhIGh0dHAtZXF1aXY9InJlZnJlc2giIGNvbnRlbnQ9IjA7IFVSTD0vP3Rva2VuPTxTTEFDS19UT0tFTj4mYW1wO25vanNtb2RlPTEiPjwvbm9zY3JpcHQ+PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPnZhciBzYWZlX2hvc3RzID0gWydhcHAub3B0aW1pemVseS5jb20nLCAndGlueXNwZWNrLmRldi5zbGFjay5jb20nXTsKCmlmIChzZWxmICE9PSB0b3AgJiYgc2FmZV9ob3N0cy5pbmRleE9mKHRvcC5sb2NhdGlvbi5ob3N0KSA9PT0gLTEpIHsKCXdpbmRvdy5kb2N1bWVudC53cml0ZSgKCQknXHUwMDNDc3R5bGU+Ym9keSAqIHtkaXNwbGF5Om5vbmUgIWltcG9ydGFudDt9XHUwMDNDL3N0eWxlPlx1MDAzQ2EgaHJlZj0iIyIgb25jbGljaz0nICsKCQkJJyJ0b3AubG9jYXRpb24uaHJlZj13aW5kb3cubG9jYXRpb24uaHJlZiIgc3R5bGU9ImRpc3BsYXk6YmxvY2sgIWltcG9ydGFudDtwYWRkaW5nOjEwcHgiPkdvIHRvIFNsYWNrLmNvbVx1MDAzQy9hPicKCSk7Cn0KCihmdW5jdGlvbigpIHsKCXZhciB0aW1lcjsKCWlmIChzZWxmICE9PSB0b3AgJiYgc2FmZV9ob3N0cy5pbmRleE9mKHRvcC5sb2NhdGlvbi5ob3N0KSA9PT0gLTEpIHsKCQl0aW1lciA9IHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKCQkJaWYgKHdpbmRvdykgewoJCQkJdHJ5IHsKCQkJCQl2YXIgcGFnZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhZ2UnKTsKCQkJCQl2YXIgY2xpZW50RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xpZW50LXVpJyk7CgkJCQkJdmFyIHNlY3Rpb25FbHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCduYXYsIGhlYWRlciwgc2VjdGlvbicpOwoKCQkJCQlwYWdlRWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwYWdlRWwpOwoJCQkJCWNsaWVudEVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2xpZW50RWwpOwoJCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgc2VjdGlvbkVscy5sZW5ndGg7IGkrKykgewoJCQkJCQlzZWN0aW9uRWxzW2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc2VjdGlvbkVsc1tpXSk7CgkJCQkJfQoJCQkJCXdpbmRvdy5UUyA9IG51bGw7CgkJCQkJd2luZG93LlREID0gbnVsbDsKCQkJCQl3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aW1lcik7CgkJCQl9IGNhdGNoIChlKSB7fQkKCQkJfQoJCX0sIDIwMCk7Cgl9Cn0pKCk7PC9zY3JpcHQ+PHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmNvb2tpZWxhdy5vcmcvc2NyaXB0dGVtcGxhdGVzL290U0RLU3R1Yi5qcyIgZGF0YS1kb2N1bWVudC1sYW5ndWFnZT0idHJ1ZSIgZGF0YS1kb21haW4tc2NyaXB0PSJmZTc4ZmQ4Ni1iNThiLTRmMGMtYTMxMS1kZDkyNGViMDg3MzYiPjwvc2NyaXB0PjxzY3JpcHQ+CmZ1bmN0aW9uIE9wdGFub25XcmFwcGVyKCkgewoJd2luZG93LmRhdGFMYXllci5wdXNoKHtldmVudDonT25lVHJ1c3RHcm91cHNVcGRhdGVkJ30pOwoJCglPcHRhbm9uLk9uQ29uc2VudENoYW5nZWQoZnVuY3Rpb24oKSB7CgkJaWYgKHdpbmRvdy5kcmlmdCAmJiB3aW5kb3cuT25ldHJ1c3RBY3RpdmVHcm91cHMgJiYgd2luZG93Lk9uZXRydXN0QWN0aXZlR3JvdXBzLmluY2x1ZGVzKCdDMDAwMycpKSB7CgkJZHJpZnQubG9hZCgnYTZ5cmk0YjgyenY3Jyk7Cgl9CgkJaWYgKHdpbmRvdy5URCAmJiB3aW5kb3cuVEQuY2xvZykgewoJCQl3aW5kb3cuVEQuY2xvZy50cmFjaygnV0VCU0lURV9DTElDSycsIHsKCQkJCSd0cmlnZ2VyJzogd2luZG93Lk9uZXRydXN0QWN0aXZlR3JvdXBzLAoJCQkJJ3N0ZXAnOidjb25zZW50X2NoYW5nZWQnLAoJCQkJJ2NvbnRleHRzJzogewoJCQkJCSd1aV9jb250ZXh0JzogewoJCQkJCQknc3RlcCc6IFRELmJvb3RfZGF0YS5jbG9nX3VpX3N0ZXAsCgkJCQkJCSdhY3Rpb24nOiAnc2V0dGluZ3MnLAoJCQkJCQkndWlfY29tcG9uZW50JzogJ2luY19jb29raWVfYmFubmVyX3YyJwoJCQkJCX0KCQkJCX0KCQkJfSk7CgkJfQoJfSk7Cn08L3NjcmlwdD48dGl0bGU+U2xhY2sgQVBJIHwgU2xhY2s8L3RpdGxlPjxtZXRhIG5hbWU9IkhhbmRoZWxkRnJpZW5kbHkiIGNvbnRlbnQ9InRydWUiPjxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wIj48bWV0YSBuYW1lPSJhdXRob3IiIGNvbnRlbnQ9IlNsYWNrIj48bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iU2xhY2sgQVBJcyBhbGxvdyB5b3UgdG8gaW50ZWdyYXRlIGNvbXBsZXggc2VydmljZXMgd2l0aCBTbGFjayB0byBnbyBiZXlvbmQgdGhlIGludGVncmF0aW9ucyB3ZSBwcm92aWRlIG91dCBvZiB0aGUgYm94LiI+PG1ldGEgcHJvcGVydHk9Im9nOnR5cGUiIGNvbnRlbnQ9IndlYnNpdGUiPjxtZXRhIHByb3BlcnR5PSJvZzpzaXRlX25hbWUiIGNvbnRlbnQ9IlNsYWNrIj48bWV0YSBwcm9wZXJ0eT0ib2c6dGl0bGUiIGNvbnRlbnQ9IlNsYWNrIEFQSSI+PG1ldGEgcHJvcGVydHk9Im9nOmltYWdlIiBjb250ZW50PSJodHRwczovL2Euc2xhY2stZWRnZS5jb20vODA1ODgvaW1nL3NlcnZpY2VzL2FwaV8yMDAucG5nIj48bWV0YSBwcm9wZXJ0eT0ib2c6ZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlNsYWNrIEFQSXMgYWxsb3cgeW91IHRvIGludGVncmF0ZSBjb21wbGV4IHNlcnZpY2VzIHdpdGggU2xhY2sgdG8gZ28gYmV5b25kIHRoZSBpbnRlZ3JhdGlvbnMgd2UgcHJvdmlkZSBvdXQgb2YgdGhlIGJveC4iPjxtZXRhIHByb3BlcnR5PSJvZzp1cmwiIGNvbnRlbnQ9Imh0dHBzOi8vc2xhY2suY29tLyI+PG1ldGEgbmFtZT0idHdpdHRlcjpzaXRlIiBjb250ZW50PSJAc2xhY2thcGkiPjxtZXRhIG5hbWU9InR3aXR0ZXI6Y2FyZCIgY29udGVudD0ic3VtbWFyeSI+PGxpbmsgaHJlZj0iaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tLzg5NDRlL3N0eWxlL3JvbGx1cC1zbGFja19raXRfbGVnYWN5X2FkYXB0ZXJzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgb25sb2FkPSJ3aW5kb3cuX2NkbiA/IF9jZG4ub2sodGhpcywgYXJndW1lbnRzKSA6IG51bGwiIG9uZXJyb3I9IndpbmRvdy5fY2RuID8gX2Nkbi5mYWlsZWQodGhpcywgYXJndW1lbnRzKSA6IG51bGwiIGNyb3Nzb3JpZ2luPSJhbm9ueW1vdXMiPjxsaW5rIGhyZWY9Imh0dHBzOi8vYS5zbGFjay1lZGdlLmNvbS9jNjM3ZS9zdHlsZS9yb2xsdXAtYXBpX3NpdGUuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBvbmxvYWQ9IndpbmRvdy5fY2RuID8gX2Nkbi5vayh0aGlzLCBhcmd1bWVudHMpIDogbnVsbCIgb25lcnJvcj0id2luZG93Ll9jZG4gPyBfY2RuLmZhaWxlZCh0aGlzLCBhcmd1bWVudHMpIDogbnVsbCIgY3Jvc3NvcmlnaW49ImFub255bW91cyI+PGxpbmsgaHJlZj0iaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tL2J2MS04L21vZGVybi52ZW5kb3IuZWQxNDQ2YS5taW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBvbmxvYWQ9IndpbmRvdy5fY2RuID8gX2Nkbi5vayh0aGlzLCBhcmd1bWVudHMpIDogbnVsbCIgb25lcnJvcj0id2luZG93Ll9jZG4gPyBfY2RuLmZhaWxlZCh0aGlzLCBhcmd1bWVudHMpIDogbnVsbCIgY3Jvc3NvcmlnaW49ImFub255bW91cyI+PGxpbmsgaHJlZj0iaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tL2VjNDM5L3N0eWxlL3JvbGx1cC1zbGFja19raXRfaGVscGVycy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgaWQ9InNsYWNrX2tpdF9oZWxwZXJzX3N0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBvbmxvYWQ9IndpbmRvdy5fY2RuID8gX2Nkbi5vayh0aGlzLCBhcmd1bWVudHMpIDogbnVsbCIgb25lcnJvcj0id2luZG93Ll9jZG4gPyBfY2RuLmZhaWxlZCh0aGlzLCBhcmd1bWVudHMpIDogbnVsbCIgY3Jvc3NvcmlnaW49ImFub255bW91cyI+PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tL2J2MS04L3dlYnBhY2subWFuaWZlc3QuZmY4YTYzMWQzMzNjMzkyZDZjNzkubWluLmpzIiBvbmxvYWQ9IndpbmRvdy5fY2RuID8gX2Nkbi5vayh0aGlzLCBhcmd1bWVudHMpIDogbnVsbCIgb25lcnJvcj0id2luZG93Ll9jZG4gPyBfY2RuLmZhaWxlZCh0aGlzLCBhcmd1bWVudHMpIDogbnVsbCIgY3Jvc3NvcmlnaW49ImFub255bW91cyI+PC9zY3JpcHQ+PGxpbmsgaWQ9ImZhdmljb24iIHJlbD0ic2hvcnRjdXQgaWNvbiIgaHJlZj0iaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tLzgwNTg4L21hcmtldGluZy9pbWcvbWV0YS9mYXZpY29uLTMyLnBuZyIgc2l6ZXM9IjE2eDE2IDMyeDMyIDQ4eDQ4IiB0eXBlPSJpbWFnZS9wbmciPjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93LmRhdGFMYXllciA9IHdpbmRvdy5kYXRhTGF5ZXIgfHwgW107CndpbmRvdy5kYXRhTGF5ZXIucHVzaCh7CgknZ3RtLnN0YXJ0JzogRGF0ZS5ub3coKSwKCSdldmVudCcgOiAnZ3RtLmpzJywKCSdzZWN1cmVfcGFnZScgOiBmYWxzZSwKfSk7CnZhciBmaXJzdFNjcmlwdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKVswXTsKdmFyIHRoaXNTY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKdGhpc1NjcmlwdC5hc3luYyA9IHRydWU7CnRoaXNTY3JpcHQuc3JjID0gJy8vd3d3Lmdvb2dsZXRhZ21hbmFnZXIuY29tL2d0bS5qcz9pZD1HVE0tS0gyTFBLJzsKZmlyc3RTY3JpcHQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpc1NjcmlwdCwgZmlyc3RTY3JpcHQpOwo8L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbihlKSB7Cgl2YXIgZ3RtRGF0YUxheWVyID0gd2luZG93LmRhdGFMYXllciB8fCBbXTsKCXZhciBndG1UYWdzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnKltkYXRhLWd0bS1jbGlja10nKTsKCXZhciBndG1DbGlja0hhbmRsZXIgPSBmdW5jdGlvbihjKSB7CgkJdmFyIGd0bV9ldmVudHMgPSB0aGlzLmdldEF0dHJpYnV0ZSgnZGF0YS1ndG0tY2xpY2snKTsKCQlpZiAoIWd0bV9ldmVudHMpIHJldHVybjsKCQl2YXIgZ3RtX2V2ZW50c19hcnIgPSBndG1fZXZlbnRzLnNwbGl0KCIsIik7CgkJZm9yKHZhciBlPTA7IGUgPCBndG1fZXZlbnRzX2Fyci5sZW5ndGg7IGUrKykgewoJCQl2YXIgZXYgPSBndG1fZXZlbnRzX2FycltlXS50cmltKCk7CgkJCWd0bURhdGFMYXllci5wdXNoKHsgJ2V2ZW50JzogZXYgfSk7CgkJfQoJfTsKCWZvcih2YXIgZz0wOyBnIDwgZ3RtVGFncy5sZW5ndGg7IGcrKyl7CgkJdmFyIGVsZW0gPSBndG1UYWdzW2ddOwoJCWVsZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBndG1DbGlja0hhbmRsZXIpOwoJfQp9KTsKPC9zY3JpcHQ+PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgooZnVuY3Rpb24oZSxjLGIsZixkLGcsYSl7ZS5TbGFja0JlYWNvbk9iamVjdD1kOwplW2RdPWVbZF18fGZ1bmN0aW9uKCl7KGVbZF0ucT1lW2RdLnF8fFtdKS5wdXNoKFsxKm5ldyBEYXRlKCksYXJndW1lbnRzXSl9OwplW2RdLmw9MSpuZXcgRGF0ZSgpO2c9Yy5jcmVhdGVFbGVtZW50KGIpO2E9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXTsKZy5hc3luYz0xO2cuc3JjPWY7YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEpCn0pKHdpbmRvdyxkb2N1bWVudCwic2NyaXB0IiwiaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tL2J2MS04L3NsYWNrX2JlYWNvbi5iZWRjMTJjMTZmMjc5NTE5OTI2ZC5taW4uanMiLCJzYiIpOwp3aW5kb3cuc2IoJ3NldCcsICd0b2tlbicsICczMzA3ZjQzNjk2M2UwMmQ0ZjllYjg1Y2U1MTU5NzQ0YycpOwp3aW5kb3cuc2IoJ3RyYWNrJywgJ3BhZ2V2aWV3Jyk7Cjwvc2NyaXB0PjxsaW5rIHJlbD0iYWx0ZXJuYXRlIiB0eXBlPSJhcHBsaWNhdGlvbi9yc3MreG1sIiB0aXRsZT0iUmVjZW50IGNoYW5nZXMgdG8gdGhlIFNsYWNrIHBsYXRmb3JtIFJTUyBGZWVkIiBocmVmPSIvY2hhbmdlbG9nLnJzcyI+PC9oZWFkPjxib2R5IGNsYXNzPSJhcGkgbGlnaHRfdGhlbWUgZmVhdHVyZV9yZWxhdGVkX2NvbnRlbnQiPjxoZWFkZXI+PGRpdiBjbGFzcz0iZGlzcGxheV9mbGV4IGZ1bGxfd2lkdGggZmxleF9kaXJlY3Rpb25fcm93IGFsaWduX2l0ZW1zX2NlbnRlciBoZWFkZXJfd3JhcHBlciI+PGEgaWQ9Im1lbnVfdG9nZ2xlIiBjbGFzcz0ibm9fdHJhbnNpdGlvbiBzaG93X29uX21vYmlsZSBuYXZfaWNvbl9saW5rIj48dHMtaWNvbiBjbGFzcz0iYy1pY29uIG51ZGdlX3RvcF8xIGMtaWNvbi0tbWVudSIgYXJpYS1oaWRkZW49InRydWUiPjwvdHMtaWNvbj48L2E+PGRpdiBjbGFzcz0iZmxleF9vbmUgYXBpX2hlYWRlcl9sb2dvIj48YSBocmVmPSJodHRwczovL2FwaS5zbGFjay5jb20vIiBpZD0iaGVhZGVyX2xvZ28iIGNsYXNzPSJhcGkiPjxpbWcgYWx0PSJTbGFjayBBUEkiIHNyYz0iaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tLzgwNTg4L2ltZy9zbGFja19hcGlfbG9nb192b2d1ZS5wbmciPjwvYT48L2Rpdj48YSBocmVmPSJodHRwczovL2FwaS5zbGFjay5jb20vc2VhcmNoIiBjbGFzcz0ic2VhcmNoX25hdl9saW5rIHNob3dfb25fbW9iaWxlIGZsZXhfbm9uZSBuYXZfaWNvbl9saW5rIj48dHMtaWNvbiBjbGFzcz0iYy1pY29uIGMtaWNvbi0tc2VhcmNoLW1lZGl1bSIgYXJpYS1oaWRkZW49InRydWUiPjwvdHMtaWNvbj48L2E+PGRpdiBjbGFzcz0ic2VhcmNoX25hdl9pbmxpbmUgaGlkZV9vbl9tb2JpbGUgZmxleF9vbmUgYXBpX2hlYWRlcl9zZWFyY2hfYmFyIj48Zm9ybSBjbGFzcz0ic2VhcmNoIiBhY2NlcHQtY2hhcnNldD0iVVRGLTgiIGFjdGlvbj0iL3NlYXJjaCIgbWV0aG9kPSJnZXQiIHJvbGU9InNlYXJjaCI+PGRpdiBjbGFzcz0iYy1maWx0ZXJfaW5wdXQgYXBpX3NlYXJjaCIgcm9sZT0icHJlc2VudGF0aW9uIj48dHMtaWNvbiBjbGFzcz0iYy1pY29uIG51ZGdlX3RvcF8xIGMtaWNvbi0tc2VhcmNoLW1lZGl1bSBzbWFsbF9yaWdodF9wYWRkaW5nIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC90cy1pY29uPjxpbnB1dCBjbGFzcz0ic2VhcmNoX2lucHV0IiBpZD0icXVlcnkiIG5hbWU9InF1ZXJ5IiB2YWx1ZT0iIiB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0iU2VhcmNoIiBkYXRhLXNtYWxscGxhY2Vob2xkZXI9IlNlYXJjaCB0aGUgZG9jdW1lbnRhdGlvbiI+PC9kaXY+PC9mb3JtPjwvZGl2PjxkaXYgY2xhc3M9ImhpZGVfb25fbW9iaWxlIGZsZXhfbm9uZSBhcGlfaGVhZGVyX25hdiI+PGRpdiBjbGFzcz0iaGVhZGVyX25hdiI+PGEgaHJlZj0iaHR0cHM6Ly9zbGFjay5jb20vc2lnbmluIiBjbGFzcz0iYnRuIGhlYWRlcl9idG4gZmxvYXRfcmlnaHQiIGRhdGEtcWE9InNpZ25faW4iPkdvIHRvIFNsYWNrPC9hPjxkaXYgY2xhc3M9ImhlYWRlcl9saW5rcyBmbG9hdF9yaWdodCI+PGEgaHJlZj0iLyNyZWFkX3RoZV9kb2NzIiBjbGFzcz0iYWN0aXZlIiBkYXRhLXFhPSJkb2N1bWVudGF0aW9uIj5Eb2N1bWVudGF0aW9uPC9hPiA8YSBocmVmPSIvdHV0b3JpYWxzIiBkYXRhLXFhPSJ0dXRvcmlhbHMiPlR1dG9yaWFsczwvYT4gPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9Ac2xhY2thcGkiIHRhcmdldD0ibmV3IiBkYXRhLXFhPSJ0d2l0dGVyIj5Ud2l0dGVyPC9hPjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImFsZXJ0X3BhZ2Vfc3RhY2tlZCI+PGRpdiBjbGFzcz0iYWxlcnRfcGFnZSBhbGVydF9zdWNjZXNzIGhpZGRlbiBmYWRlIGFwaV9hbGVydF9wYWdlIiBkYXRhLWpzPSJhcGlfYWxlcnRfcGFnZSI+PGkgY2xhc3M9InRzX2ljb24gdHNfaWNvbl9jaGVja19jaXJjbGVfbyI+PC9pPlN1Y2Nlc3MhPC9kaXY+PC9kaXY+PC9oZWFkZXI+PGRpdiBpZD0icGFnZSIgY2xhc3M9ImxheW91dF90aHJlZV9jb2wgbGF5b3V0X2hvbWVwYWdlIj48ZGl2IGNsYXNzPSJhcGlfaG9tZV9iYW5uZXJfY29udGFpbmVyIGZ1bGxfd2lkdGggZGlzcGxheV9mbGV4IGZsZXhfZGlyZWN0aW9uX2NvbHVtbiBhbGlnbl9pdGVtc19jZW50ZXIganVzdGlmeV9jb250ZW50X2NlbnRlciBhbGlnbl9jZW50ZXIgbmV1dHJhbF93aGl0ZSI+PGRpdiBjbGFzcz0iYXBpX2hvbWVfYmFubmVyX2JhY2tncm91bmRfaW1hZ2UgcG9zaXRpb25fYWJzb2x1dGUiPjwvZGl2PjxoMSBjbGFzcz0ibmV1dHJhbF93aGl0ZSBhcGlfaG9tZV9iYW5uZXJfaGVhZGluZyI+QnVpbGQ8L2gxPjxkaXYgY2xhc3M9ImFwaV9ob21lX2Jhbm5lcl9oZWFkaW5nX2xpc3RfY29udGFpbmVyIG92ZXJmbG93X2hpZGRlbiBwb3NpdGlvbl9yZWxhdGl2ZSI+PHVsIGNsYXNzPSJhcGlfaG9tZV9iYW5uZXJfaGVhZGluZ19saXN0IG5vX2xpc3Rfc3R5bGUgcG9zaXRpb25fcmVsYXRpdmUgbmV1dHJhbF93aGl0ZSBub3JtYWwgbm9fbWFyZ2luIj48bGkgY2xhc3M9ImFwaV9ob21lX2Jhbm5lcl9oZWFkaW5nX2xpc3RfaXRlbSI+PGEgaHJlZj0iL2ludGVybmFsLWludGVncmF0aW9ucyI+aW50ZXJuYWwgdG9vbHM8L2E+PC9saT48bGkgY2xhc3M9ImFwaV9ob21lX2Jhbm5lcl9oZWFkaW5nX2xpc3RfaXRlbSI+PGEgaHJlZj0iL3N0YXJ0L2J1aWxkaW5nL3dvcmtmbG93LWJ1aWxkZXIiPnNpbXBsaWZpZWQgd29ya2Zsb3dzPC9hPjwvbGk+PGxpIGNsYXNzPSJhcGlfaG9tZV9iYW5uZXJfaGVhZGluZ19saXN0X2l0ZW0iPjxhIGhyZWY9Ii9ib3QtdXNlcnMiPmJyaWxsaWFudCBib3RzPC9hPjwvbGk+PGxpIGNsYXNzPSJhcGlfaG9tZV9iYW5uZXJfaGVhZGluZ19saXN0X2l0ZW0iPjxhIGhyZWY9Ii9zdGFydC9vdmVydmlldyI+dXNlZnVsIGFwcHM8L2E+PC9saT48bGkgY2xhc3M9ImFwaV9ob21lX2Jhbm5lcl9oZWFkaW5nX2xpc3RfaXRlbSI+PGEgaHJlZj0iL2ludGVybmFsLWludGVncmF0aW9ucyI+aW50ZXJuYWwgdG9vbHM8L2E+PC9saT48L3VsPjxkaXYgY2xhc3M9ImFwaV9ob21lX2Jhbm5lcl9naXptbyBwb3NpdGlvbl9hYnNvbHV0ZSI+PGRpdiBjbGFzcz0iYXBpX2hvbWVfYmFubmVyX2dpem1vX2JlbHQiPjwvZGl2PjxkaXYgY2xhc3M9ImFwaV9ob21lX2Jhbm5lcl9naXptb19nZWFyIGFwaV9ob21lX2Jhbm5lcl9naXptb19nZWFyX3RvcCI+PC9kaXY+PGRpdiBjbGFzcz0iYXBpX2hvbWVfYmFubmVyX2dpem1vX2dlYXIgYXBpX2hvbWVfYmFubmVyX2dpem1vX2dlYXJfYm90dG9tIj48L2Rpdj48L2Rpdj48L2Rpdj48YSBjbGFzcz0iYnRuIGJ0bl9sYXJnZSBhcGlfaG9tZV9iYW5uZXJfYnV0dG9uIG1lZGl1bV90b3BfbWFyZ2luIGxlZnRfcGFkZGluZyByaWdodF9wYWRkaW5nIiBocmVmPSIvYXBwcz9uZXdfYXBwPTEiIGRhdGEtY2xvZy1ldmVudD0iQVBQX0RJUkVDVE9SWV9XRUJTSVRFX0NMSUNLIiBkYXRhLWNsb2ctcGFyYW1zPSJjbGlja190YXJnZXQ9YXBpX2hlYWRlcl9zdGFydF9idWlsZGluZ19idG4iIGRhdGEtZ3RtLWNsaWNrPSJBUElTdGFydEJ1aWxkaW5nIj5TdGFydCBCdWlsZGluZzwvYT48L2Rpdj48ZGl2IGlkPSJwYWdlX2NvbnRlbnRzIiBjbGFzcz0iY2xlYXJmaXggYXBpX2hvbWVfcGFnZV9jb250ZW50cyAiPjxkaXYgY2xhc3M9ImFwaV9jb2xfd3JhcHBlciI+PG5hdiBpZD0iYXBpX25hdiIgY2xhc3M9ImNvbCBodWIgZXhwYW5kaW5nX25hdiI+PGRpdiBjbGFzcz0ic2lkZWJhcl9tZW51IHNob3dfb25fbW9iaWxlIj48aDQgY2xhc3M9InNpZGViYXJfbWVudV9oZWFkZXIiPk15IFNsYWNrIEFQSTwvaDQ+PHVsIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdCI+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtIGlzX2FjdGl2ZSIgaHJlZj0iLyNyZWFkX3RoZV9kb2NzIj5Eb2N1bWVudGF0aW9uPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3R1dG9yaWFscyI+VHV0b3JpYWxzPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2FwcHMiPllvdXIgQXBwczwvYT48L2xpPjwvdWw+PC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl9uYXYiPjxkaXYgY2xhc3M9InNpZGViYXJfZXhwYW5kYWJsZV9uYXYiPjxkaXYgY2xhc3M9InNpZGViYXJfZ3JvdXAgZ3JvdXBfY29sbGFwc2VkIiBkYXRhLWRvY3NuYXY9Imdyb3VwIiBpZD0iaHViX2dyb3VwX3N0YXJ0Ij48ZGl2IGNsYXNzPSJzaWRlYmFyX2dyb3VwX3RpdGxlIiBkYXRhLWRvY3NuYXY9InRvZ2dsZSIgZGF0YS10YXJnZXQ9Imh1Yl9ncm91cF9zdGFydCI+PGkgY2xhc3M9ImMtaWNvbiBjLWljb24tLW1hcCI+PC9pPlN0YXJ0IGxlYXJuaW5nPC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl9ncm91cF9jb2xsYXBzZSI+PGRpdiBjbGFzcz0ic2lkZWJhcl9tZW51Ij48dWwgY2xhc3M9InNpZGViYXJfbWVudV9saXN0Ij48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvc3RhcnQiIHRhcmdldD0iIiB0aXRsZT0iT3ZlcnZpZXciPk92ZXJ2aWV3IDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdGFydC9vdmVydmlldyIgdGFyZ2V0PSIiIHRpdGxlPSJJbnRybyB0byB0aGUgU2xhY2sgcGxhdGZvcm0iPkludHJvIHRvIHRoZSBTbGFjayBwbGF0Zm9ybSA8L2E+PC9saT48L3VsPjwvZGl2PjxkaXYgY2xhc3M9InNpZGViYXJfbWVudSI+PGg0IGNsYXNzPSJzaWRlYmFyX21lbnVfaGVhZGVyIj5QbGFubmluZyB5b3VyIGFwcDwvaDQ+PHVsIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdCI+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3N0YXJ0L3BsYW5uaW5nIiB0YXJnZXQ9IiIgdGl0bGU9Ik92ZXJ2aWV3Ij5PdmVydmlldyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvc3RhcnQvcGxhbm5pbmcvdHJpZ2dlcnMiIHRhcmdldD0iIiB0aXRsZT0iUGxhbm5pbmcgaW50ZXJhY3Rpb24iPlBsYW5uaW5nIGludGVyYWN0aW9uIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdGFydC9wbGFubmluZy9jaG9vc2luZyIgdGFyZ2V0PSIiIHRpdGxlPSJDaG9vc2luZyBBUElzIj5DaG9vc2luZyBBUElzIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdGFydC9wbGFubmluZy9jb21tdW5pY2F0aW5nIiB0YXJnZXQ9IiIgdGl0bGU9IkNvbW11bmljYXRpbmciPkNvbW11bmljYXRpbmcgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3N0YXJ0L3BsYW5uaW5nL2d1aWRlbGluZXMiIHRhcmdldD0iIiB0aXRsZT0iSW50ZXJhY3Rpb24gZ3VpZGVsaW5lcyI+SW50ZXJhY3Rpb24gZ3VpZGVsaW5lcyA8L2E+PC9saT48L3VsPjwvZGl2PjxkaXYgY2xhc3M9InNpZGViYXJfbWVudSI+PGg0IGNsYXNzPSJzaWRlYmFyX21lbnVfaGVhZGVyIj5EZXNpZ25pbmcgYSBncmVhdCBleHBlcmllbmNlPC9oND48dWwgY2xhc3M9InNpZGViYXJfbWVudV9saXN0Ij48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvc3RhcnQvZGVzaWduaW5nIiB0YXJnZXQ9IiIgdGl0bGU9Ik92ZXJ2aWV3Ij5PdmVydmlldyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvc3RhcnQvZGVzaWduaW5nL3RhYnMiIHRhcmdldD0iIiB0aXRsZT0iRGVzaWduaW5nIGhvbWUgdGFicyI+RGVzaWduaW5nIGhvbWUgdGFicyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvc3RhcnQvZGVzaWduaW5nL21vZGFscyIgdGFyZ2V0PSIiIHRpdGxlPSJEZXNpZ25pbmcgbW9kYWxzIj5EZXNpZ25pbmcgbW9kYWxzIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdGFydC9kZXNpZ25pbmcvc2hvcnRjdXRzIiB0YXJnZXQ9IiIgdGl0bGU9IlNob3J0Y3V0IGd1aWRlbGluZXMiPlNob3J0Y3V0IGd1aWRlbGluZXMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3N0YXJ0L2Rlc2lnbmluZy92b2ljZS10b25lIiB0YXJnZXQ9IiIgdGl0bGU9IkNob29zaW5nIHZvaWNlICZhbXA7IHRvbmUiPkNob29zaW5nIHZvaWNlICZhbXA7IHRvbmUgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3N0YXJ0L2Rlc2lnbmluZy9sb2NhbGl6aW5nIiB0YXJnZXQ9IiIgdGl0bGU9IkxvY2FsaXppbmcgYXBwcyI+TG9jYWxpemluZyBhcHBzIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdGFydC9kZXNpZ25pbmcvb25ib2FyZGluZyIgdGFyZ2V0PSIiIHRpdGxlPSJPbmJvYXJkaW5nIGV4cGVyaWVuY2VzIj5PbmJvYXJkaW5nIGV4cGVyaWVuY2VzIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdGFydC9kZXNpZ25pbmcvZ3VpZGVsaW5lcyIgdGFyZ2V0PSIiIHRpdGxlPSJHZW5lcmFsIGd1aWRlbGluZXMiPkdlbmVyYWwgZ3VpZGVsaW5lcyA8L2E+PC9saT48L3VsPjwvZGl2PjxkaXYgY2xhc3M9InNpZGViYXJfbWVudSI+PGg0IGNsYXNzPSJzaWRlYmFyX21lbnVfaGVhZGVyIj5CdWlsZGluZyBhbiBhcHA8L2g0Pjx1bCBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3QiPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdGFydC9idWlsZGluZyIgdGFyZ2V0PSIiIHRpdGxlPSJPdmVydmlldyI+T3ZlcnZpZXcgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3N0YXJ0L2J1aWxkaW5nL2JvbHQtanMiIHRhcmdldD0iIiB0aXRsZT0iRGV2ZWxvcGluZyB3aXRoIEphdmFTY3JpcHQiPkRldmVsb3Bpbmcgd2l0aCBKYXZhU2NyaXB0IDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdGFydC9idWlsZGluZy9ib2x0LXB5dGhvbiIgdGFyZ2V0PSIiIHRpdGxlPSJEZXZlbG9waW5nIHdpdGggUHl0aG9uIj5EZXZlbG9waW5nIHdpdGggUHl0aG9uIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdGFydC9idWlsZGluZy9ib2x0LWphdmEiIHRhcmdldD0iIiB0aXRsZT0iRGV2ZWxvcGluZyB3aXRoIEphdmEiPkRldmVsb3Bpbmcgd2l0aCBKYXZhIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdGFydC9idWlsZGluZy93b3JrZmxvdy1idWlsZGVyIiB0YXJnZXQ9IiIgdGl0bGU9IldvcmtmbG93IEJ1aWxkZXIiPldvcmtmbG93IEJ1aWxkZXIgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2Jsb2NrLWtpdC1idWlsZGVyIiB0YXJnZXQ9IiIgdGl0bGU9IkJsb2NrIGJ1aWxkZXIiPkJsb2NrIGJ1aWxkZXIgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3Rvb2xzIiB0YXJnZXQ9IiIgdGl0bGU9IlNES3MgJmFtcDsgdG9vbHMiPlNES3MgJmFtcDsgdG9vbHMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2Jlc3QtcHJhY3RpY2VzL2JsdWVwcmludHMiIHRhcmdldD0iIiB0aXRsZT0iQXBwIGJsdWVwcmludHMiPkFwcCBibHVlcHJpbnRzIDwvYT48L2xpPjwvdWw+PC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl9tZW51Ij48aDQgY2xhc3M9InNpZGViYXJfbWVudV9oZWFkZXIiPkRpc3RyaWJ1dGluZyBhbiBhcHA8L2g0Pjx1bCBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3QiPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdGFydC9kaXN0cmlidXRpbmciIHRhcmdldD0iIiB0aXRsZT0iT3ZlcnZpZXciPk92ZXJ2aWV3IDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdGFydC9kaXN0cmlidXRpbmcvcHVibGljIiB0YXJnZXQ9IiIgdGl0bGU9IkRpc3RyaWJ1dGluZyBhcHBzIHB1YmxpY2x5Ij5EaXN0cmlidXRpbmcgYXBwcyBwdWJsaWNseSA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvc3RhcnQvZGlzdHJpYnV0aW5nL2RpcmVjdG9yeSIgdGFyZ2V0PSIiIHRpdGxlPSJVc2luZyB0aGUgQXBwIERpcmVjdG9yeSI+VXNpbmcgdGhlIEFwcCBEaXJlY3RvcnkgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3N0YXJ0L2Rpc3RyaWJ1dGluZy9ndWlkZWxpbmVzIiB0YXJnZXQ9IiIgdGl0bGU9IkFwcCBEaXJlY3RvcnkgR3VpZGVsaW5lcyI+QXBwIERpcmVjdG9yeSBHdWlkZWxpbmVzIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdGFydC9kaXN0cmlidXRpbmcvZGlyZWN0b3J5I3BvbGljaWVzIiB0YXJnZXQ9IiIgdGl0bGU9IkRldmVsb3BlciBwb2xpY2llcyI+RGV2ZWxvcGVyIHBvbGljaWVzIDwvYT48L2xpPjwvdWw+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl9ncm91cCBncm91cF9jb2xsYXBzZWQiIGRhdGEtZG9jc25hdj0iZ3JvdXAiIGlkPSJodWJfZ3JvdXBfYXV0aGVudGljYXRpb24iPjxkaXYgY2xhc3M9InNpZGViYXJfZ3JvdXBfdGl0bGUiIGRhdGEtZG9jc25hdj0idG9nZ2xlIiBkYXRhLXRhcmdldD0iaHViX2dyb3VwX2F1dGhlbnRpY2F0aW9uIj48aSBjbGFzcz0iYy1pY29uIGMtaWNvbi0tbG9jay1sYXJnZS1vIj48L2k+QXV0aGVudGljYXRpb248L2Rpdj48ZGl2IGNsYXNzPSJzaWRlYmFyX2dyb3VwX2NvbGxhcHNlIj48ZGl2IGNsYXNzPSJzaWRlYmFyX21lbnUiPjx1bCBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3QiPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9hdXRoZW50aWNhdGlvbiIgdGFyZ2V0PSIiIHRpdGxlPSJPdmVydmlldyI+T3ZlcnZpZXcgPC9hPjwvbGk+PC91bD48L2Rpdj48ZGl2IGNsYXNzPSJzaWRlYmFyX21lbnUiPjxoNCBjbGFzcz0ic2lkZWJhcl9tZW51X2hlYWRlciI+SW5zdGFsbGF0aW9uICZhbXA7IFBlcm1pc3Npb25zPC9oND48dWwgY2xhc3M9InNpZGViYXJfbWVudV9saXN0Ij48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvYXV0aGVudGljYXRpb24vYmFzaWNzIiB0YXJnZXQ9IiIgdGl0bGU9IkJhc2ljIGFwcCBzZXR1cCI+QmFzaWMgYXBwIHNldHVwIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9hdXRoZW50aWNhdGlvbi9vYXV0aC12MiIgdGFyZ2V0PSIiIHRpdGxlPSJJbnN0YWxsaW5nIHdpdGggT0F1dGgiPkluc3RhbGxpbmcgd2l0aCBPQXV0aCA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvYXV0aGVudGljYXRpb24vcXVpY2tzdGFydCIgdGFyZ2V0PSIiIHRpdGxlPSJRdWlja3N0YXJ0OiB3aGF0J3MgbmV3Ij5RdWlja3N0YXJ0OiB3aGF0J3MgbmV3IDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9hdXRoZW50aWNhdGlvbi9taWdyYXRpb24iIHRhcmdldD0iIiB0aXRsZT0iTWlncmF0aW9uIGd1aWRlIj5NaWdyYXRpb24gZ3VpZGUgPC9hPjwvbGk+PC91bD48L2Rpdj48ZGl2IGNsYXNzPSJzaWRlYmFyX21lbnUiPjxoNCBjbGFzcz0ic2lkZWJhcl9tZW51X2hlYWRlciI+U2VjdXJpdHk8L2g0Pjx1bCBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3QiPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9hdXRoZW50aWNhdGlvbi92ZXJpZnlpbmctcmVxdWVzdHMtZnJvbS1zbGFjayIgdGFyZ2V0PSIiIHRpdGxlPSJWZXJpZnlpbmcgcmVxdWVzdHMiPlZlcmlmeWluZyByZXF1ZXN0cyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvYXV0aGVudGljYXRpb24vYmVzdC1wcmFjdGljZXMiIHRhcmdldD0iIiB0aXRsZT0iQmVzdCBwcmFjdGljZXMiPkJlc3QgcHJhY3RpY2VzIDwvYT48L2xpPjwvdWw+PC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl9tZW51Ij48aDQgY2xhc3M9InNpZGViYXJfbWVudV9oZWFkZXIiPlJlZmVyZW5jZTwvaDQ+PHVsIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdCI+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2F1dGhlbnRpY2F0aW9uL3Rva2VuLXR5cGVzIiB0YXJnZXQ9IiIgdGl0bGU9IlRva2VuIHR5cGVzIj5Ub2tlbiB0eXBlcyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvc2NvcGVzIiB0YXJnZXQ9IiIgdGl0bGU9IlNjb3BlcyI+U2NvcGVzIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9kb2NzL3NpZ24taW4td2l0aC1zbGFjayIgdGFyZ2V0PSIiIHRpdGxlPSJTaWduIGluIHdpdGggU2xhY2siPlNpZ24gaW4gd2l0aCBTbGFjayA8L2E+PC9saT48L3VsPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InNpZGViYXJfZ3JvdXAgZ3JvdXBfY29sbGFwc2VkIiBkYXRhLWRvY3NuYXY9Imdyb3VwIiBpZD0iaHViX2dyb3VwX3N1cmZhY2VzIj48ZGl2IGNsYXNzPSJzaWRlYmFyX2dyb3VwX3RpdGxlIiBkYXRhLWRvY3NuYXY9InRvZ2dsZSIgZGF0YS10YXJnZXQ9Imh1Yl9ncm91cF9zdXJmYWNlcyI+PGkgY2xhc3M9ImMtaWNvbiBjLWljb24tLWduLW1lbnUtc21hbGwiPjwvaT5TdXJmYWNlczwvZGl2PjxkaXYgY2xhc3M9InNpZGViYXJfZ3JvdXBfY29sbGFwc2UiPjxkaXYgY2xhc3M9InNpZGViYXJfbWVudSI+PHVsIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdCI+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3N1cmZhY2VzIiB0YXJnZXQ9IiIgdGl0bGU9Ik92ZXJ2aWV3Ij5PdmVydmlldyA8L2E+PC9saT48L3VsPjwvZGl2PjxkaXYgY2xhc3M9InNpZGViYXJfbWVudSI+PGg0IGNsYXNzPSJzaWRlYmFyX21lbnVfaGVhZGVyIj5Ib21lIHRhYnM8L2g0Pjx1bCBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3QiPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdXJmYWNlcy90YWJzIiB0YXJnZXQ9IiIgdGl0bGU9Ik92ZXJ2aWV3Ij5PdmVydmlldyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvc3VyZmFjZXMvdGFicy91c2luZyIgdGFyZ2V0PSIiIHRpdGxlPSJVc2luZyB5b3VyIEhvbWUgdGFiIj5Vc2luZyB5b3VyIEhvbWUgdGFiIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdXJmYWNlcy90YWJzL2V2ZW50cyIgdGFyZ2V0PSIiIHRpdGxlPSJFdmVudHMgaW4gQXBwIEhvbWUiPkV2ZW50cyBpbiBBcHAgSG9tZSA8L2E+PC9saT48L3VsPjwvZGl2PjxkaXYgY2xhc3M9InNpZGViYXJfbWVudSI+PGg0IGNsYXNzPSJzaWRlYmFyX21lbnVfaGVhZGVyIj5Nb2RhbHM8L2g0Pjx1bCBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3QiPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdXJmYWNlcy9tb2RhbHMiIHRhcmdldD0iIiB0aXRsZT0iT3ZlcnZpZXciPk92ZXJ2aWV3IDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdXJmYWNlcy9tb2RhbHMvdXNpbmciIHRhcmdldD0iIiB0aXRsZT0iVXNpbmcgbW9kYWxzIj5Vc2luZyBtb2RhbHMgPC9hPjwvbGk+PC91bD48L2Rpdj48ZGl2IGNsYXNzPSJzaWRlYmFyX21lbnUiPjxoNCBjbGFzcz0ic2lkZWJhcl9tZW51X2hlYWRlciI+TWVzc2FnZXM8L2g0Pjx1bCBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3QiPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdXJmYWNlcy9tZXNzYWdlcyIgdGFyZ2V0PSIiIHRpdGxlPSJPdmVydmlldyI+T3ZlcnZpZXcgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL21lc3NhZ2luZy9zZW5kaW5nIiB0YXJnZXQ9IiIgdGl0bGU9IlNlbmRpbmcgbWVzc2FnZXMiPlNlbmRpbmcgbWVzc2FnZXMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL21lc3NhZ2luZy9jb21wb3NpbmcvbGF5b3V0cyIgdGFyZ2V0PSIiIHRpdGxlPSJSaWNoIG1lc3NhZ2UgbGF5b3V0cyI+UmljaCBtZXNzYWdlIGxheW91dHMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL21lc3NhZ2luZy9pbnRlcmFjdGl2aXR5IiB0YXJnZXQ9IiIgdGl0bGU9IkludGVyYWN0aXZlIG1lc3NhZ2VzIj5JbnRlcmFjdGl2ZSBtZXNzYWdlcyA8L2E+PC9saT48L3VsPjwvZGl2PjxkaXYgY2xhc3M9InNpZGViYXJfbWVudSI+PGg0IGNsYXNzPSJzaWRlYmFyX21lbnVfaGVhZGVyIj5SZWZlcmVuY2U8L2g0Pjx1bCBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3QiPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9yZWZlcmVuY2Uvc3VyZmFjZXMvdmlld3MiIHRhcmdldD0iIiB0aXRsZT0iRGVmaW5pbmcgdmlld3MiPkRlZmluaW5nIHZpZXdzIDwvYT48L2xpPjwvdWw+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl9ncm91cCBncm91cF9jb2xsYXBzZWQiIGRhdGEtZG9jc25hdj0iZ3JvdXAiIGlkPSJodWJfZ3JvdXBfYmxvY2traXQiPjxkaXYgY2xhc3M9InNpZGViYXJfZ3JvdXBfdGl0bGUiIGRhdGEtZG9jc25hdj0idG9nZ2xlIiBkYXRhLXRhcmdldD0iaHViX2dyb3VwX2Jsb2Nra2l0Ij48aSBjbGFzcz0iYy1pY29uIGMtaWNvbi0tYmxvY2tzIj48L2k+QmxvY2sgS2l0PC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl9ncm91cF9jb2xsYXBzZSI+PGRpdiBjbGFzcz0ic2lkZWJhcl9tZW51Ij48dWwgY2xhc3M9InNpZGViYXJfbWVudV9saXN0Ij48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvYmxvY2sta2l0IiB0YXJnZXQ9IiIgdGl0bGU9Ik92ZXJ2aWV3Ij5PdmVydmlldyA8L2E+PC9saT48L3VsPjwvZGl2PjxkaXYgY2xhc3M9InNpZGViYXJfbWVudSI+PGg0IGNsYXNzPSJzaWRlYmFyX21lbnVfaGVhZGVyIj5CbG9jayBiYXNpY3M8L2g0Pjx1bCBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3QiPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9ibG9jay1raXQvYnVpbGRpbmciIHRhcmdldD0iIiB0aXRsZT0iQnVpbGRpbmcgYmxvY2tzIj5CdWlsZGluZyBibG9ja3MgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2Jsb2NrLWtpdC9pbnRlcmFjdGl2aXR5IiB0YXJnZXQ9IiIgdGl0bGU9IkludGVyYWN0aXZpdHkgaW4gQmxvY2sgS2l0Ij5JbnRlcmFjdGl2aXR5IGluIEJsb2NrIEtpdCA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvdG9vbHMvYmxvY2sta2l0LWJ1aWxkZXIiIHRhcmdldD0iIiB0aXRsZT0iQmxvY2sgS2l0IEJ1aWxkZXIiPkJsb2NrIEtpdCBCdWlsZGVyIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii90b29scy9ibG9jay1raXQtYnVpbGRlcj90ZW1wbGF0ZT0xIiB0YXJnZXQ9IiIgdGl0bGU9IkFwcCB0ZW1wbGF0ZXMiPkFwcCB0ZW1wbGF0ZXMgPC9hPjwvbGk+PC91bD48L2Rpdj48ZGl2IGNsYXNzPSJzaWRlYmFyX21lbnUiPjxoNCBjbGFzcz0ic2lkZWJhcl9tZW51X2hlYWRlciI+UmVmZXJlbmNlPC9oND48dWwgY2xhc3M9InNpZGViYXJfbWVudV9saXN0Ij48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvcmVmZXJlbmNlL2Jsb2NrLWtpdCIgdGFyZ2V0PSIiIHRpdGxlPSJPdmVydmlldyI+T3ZlcnZpZXcgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3JlZmVyZW5jZS9ibG9jay1raXQvYmxvY2tzIiB0YXJnZXQ9IiIgdGl0bGU9IkJsb2NrcyI+QmxvY2tzIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9yZWZlcmVuY2UvYmxvY2sta2l0L2Jsb2NrLWVsZW1lbnRzIiB0YXJnZXQ9IiIgdGl0bGU9IkJsb2NrIGVsZW1lbnRzIj5CbG9jayBlbGVtZW50cyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvcmVmZXJlbmNlL2Jsb2NrLWtpdC9pbnRlcmFjdGl2ZS1jb21wb25lbnRzIiB0YXJnZXQ9IiIgdGl0bGU9IkludGVyYWN0aXZlIGNvbXBvbmVudHMiPkludGVyYWN0aXZlIGNvbXBvbmVudHMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3JlZmVyZW5jZS9ibG9jay1raXQvY29tcG9zaXRpb24tb2JqZWN0cyIgdGFyZ2V0PSIiIHRpdGxlPSJDb21wb3NpdGlvbiBvYmplY3RzIj5Db21wb3NpdGlvbiBvYmplY3RzIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9yZWZlcmVuY2UvYmxvY2sta2l0L3ZpZXdzIiB0YXJnZXQ9IiIgdGl0bGU9IkRlZmluaW5nIHZpZXdzIj5EZWZpbmluZyB2aWV3cyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvcmVmZXJlbmNlL2ludGVyYWN0aW9uLXBheWxvYWRzL2Jsb2NrLWFjdGlvbnMiIHRhcmdldD0iIiB0aXRsZT0iYmxvY2tfYWN0aW9ucyBwYXlsb2FkcyI+YmxvY2tfYWN0aW9ucyBwYXlsb2FkcyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvcmVmZXJlbmNlL2ludGVyYWN0aW9uLXBheWxvYWRzL3ZpZXdzIiB0YXJnZXQ9IiIgdGl0bGU9IlZpZXcgaW50ZXJhY3Rpb24gcGF5bG9hZHMiPlZpZXcgaW50ZXJhY3Rpb24gcGF5bG9hZHMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2Jsb2NrLWtpdC9kaWFsb2dzLXRvLW1vZGFscyIgdGFyZ2V0PSIiIHRpdGxlPSJVcGdyYWRpbmcgdG8gbW9kYWxzIj5VcGdyYWRpbmcgdG8gbW9kYWxzIDwvYT48L2xpPjwvdWw+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl9ncm91cCBncm91cF9jb2xsYXBzZWQiIGRhdGEtZG9jc25hdj0iZ3JvdXAiIGlkPSJodWJfZ3JvdXBfaW50ZXJhY3Rpdml0eSI+PGRpdiBjbGFzcz0ic2lkZWJhcl9ncm91cF90aXRsZSIgZGF0YS1kb2NzbmF2PSJ0b2dnbGUiIGRhdGEtdGFyZ2V0PSJodWJfZ3JvdXBfaW50ZXJhY3Rpdml0eSI+PGkgY2xhc3M9ImMtaWNvbiBjLWljb24tLXBsdWciPjwvaT5JbnRlcmFjdGl2aXR5PC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl9ncm91cF9jb2xsYXBzZSI+PGRpdiBjbGFzcz0ic2lkZWJhcl9tZW51Ij48dWwgY2xhc3M9InNpZGViYXJfbWVudV9saXN0Ij48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvaW50ZXJhY3Rpdml0eSIgdGFyZ2V0PSIiIHRpdGxlPSJPdmVydmlldyI+T3ZlcnZpZXcgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2ludGVyYWN0aXZpdHkvaGFuZGxpbmciIHRhcmdldD0iIiB0aXRsZT0iSGFuZGxpbmcgdXNlciBpbnRlcmFjdGlvbiI+SGFuZGxpbmcgdXNlciBpbnRlcmFjdGlvbiA8L2E+PC9saT48L3VsPjwvZGl2PjxkaXYgY2xhc3M9InNpZGViYXJfbWVudSI+PGg0IGNsYXNzPSJzaWRlYmFyX21lbnVfaGVhZGVyIj5FbnRyeSBwb2ludHM8L2g0Pjx1bCBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3QiPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9pbnRlcmFjdGl2aXR5L2VudHJ5LXBvaW50cyIgdGFyZ2V0PSIiIHRpdGxlPSJPdmVydmlldyI+T3ZlcnZpZXcgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2ludGVyYWN0aXZpdHkvc2hvcnRjdXRzIyIgdGFyZ2V0PSIiIHRpdGxlPSJTaG9ydGN1dHMiPlNob3J0Y3V0cyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvaW50ZXJhY3Rpdml0eS9zbGFzaC1jb21tYW5kcyIgdGFyZ2V0PSIiIHRpdGxlPSJTbGFzaCBDb21tYW5kcyI+U2xhc2ggQ29tbWFuZHMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2ludGVyYWN0aXZpdHkvY29tcG9uZW50cyIgdGFyZ2V0PSIiIHRpdGxlPSJJbnRlcmFjdGl2ZSBjb21wb25lbnRzIj5JbnRlcmFjdGl2ZSBjb21wb25lbnRzIDwvYT48L2xpPjwvdWw+PC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl9tZW51Ij48aDQgY2xhc3M9InNpZGViYXJfbWVudV9oZWFkZXIiPlNob3J0Y3V0czwvaDQ+PHVsIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdCI+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2ludGVyYWN0aXZpdHkvc2hvcnRjdXRzIiB0YXJnZXQ9IiIgdGl0bGU9Ik92ZXJ2aWV3Ij5PdmVydmlldyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvaW50ZXJhY3Rpdml0eS9zaG9ydGN1dHMvdXNpbmciIHRhcmdldD0iIiB0aXRsZT0iSW1wbGVtZW50aW5nIHNob3J0Y3V0cyI+SW1wbGVtZW50aW5nIHNob3J0Y3V0cyA8L2E+PC9saT48L3VsPjwvZGl2PjxkaXYgY2xhc3M9InNpZGViYXJfbWVudSI+PGg0IGNsYXNzPSJzaWRlYmFyX21lbnVfaGVhZGVyIj5JbnRlcmFjdGlvbiBwYXlsb2FkczwvaDQ+PHVsIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdCI+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3JlZmVyZW5jZS9pbnRlcmFjdGlvbi1wYXlsb2FkcyIgdGFyZ2V0PSIiIHRpdGxlPSJPdmVydmlldyI+T3ZlcnZpZXcgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3JlZmVyZW5jZS9pbnRlcmFjdGlvbi1wYXlsb2Fkcy9zaG9ydGN1dHMiIHRhcmdldD0iIiB0aXRsZT0iU2hvcnRjdXRzIHBheWxvYWRzIj5TaG9ydGN1dHMgcGF5bG9hZHMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3JlZmVyZW5jZS9pbnRlcmFjdGlvbi1wYXlsb2Fkcy9ibG9jay1hY3Rpb25zIiB0YXJnZXQ9IiIgdGl0bGU9ImJsb2NrX2FjdGlvbnMgcGF5bG9hZHMiPmJsb2NrX2FjdGlvbnMgcGF5bG9hZHMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3JlZmVyZW5jZS9pbnRlcmFjdGlvbi1wYXlsb2Fkcy92aWV3cyIgdGFyZ2V0PSIiIHRpdGxlPSJWaWV3IGludGVyYWN0aW9uIHBheWxvYWRzIj5WaWV3IGludGVyYWN0aW9uIHBheWxvYWRzIDwvYT48L2xpPjwvdWw+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl9ncm91cCBncm91cF9jb2xsYXBzZWQiIGRhdGEtZG9jc25hdj0iZ3JvdXAiIGlkPSJodWJfZ3JvdXBfbWVzc2FnaW5nIj48ZGl2IGNsYXNzPSJzaWRlYmFyX2dyb3VwX3RpdGxlIiBkYXRhLWRvY3NuYXY9InRvZ2dsZSIgZGF0YS10YXJnZXQ9Imh1Yl9ncm91cF9tZXNzYWdpbmciPjxpIGNsYXNzPSJjLWljb24gYy1pY29uLS1kbSI+PC9pPk1lc3NhZ2luZzwvZGl2PjxkaXYgY2xhc3M9InNpZGViYXJfZ3JvdXBfY29sbGFwc2UiPjxkaXYgY2xhc3M9InNpZGViYXJfbWVudSI+PGg0IGNsYXNzPSJzaWRlYmFyX21lbnVfaGVhZGVyIj5NYW5hZ2luZyBtZXNzYWdlczwvaDQ+PHVsIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdCI+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL21lc3NhZ2luZy9tYW5hZ2luZyIgdGFyZ2V0PSIiIHRpdGxlPSJPdmVydmlldyI+T3ZlcnZpZXcgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL21lc3NhZ2luZy9yZXRyaWV2aW5nIiB0YXJnZXQ9IiIgdGl0bGU9IlJldHJpZXZpbmcgbWVzc2FnZXMiPlJldHJpZXZpbmcgbWVzc2FnZXMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL21lc3NhZ2luZy9zZW5kaW5nIiB0YXJnZXQ9IiIgdGl0bGU9IlNlbmRpbmcgbWVzc2FnZXMiPlNlbmRpbmcgbWVzc2FnZXMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL21lc3NhZ2luZy9tb2RpZnlpbmciIHRhcmdldD0iIiB0aXRsZT0iTW9kaWZ5aW5nIG1lc3NhZ2VzIj5Nb2RpZnlpbmcgbWVzc2FnZXMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL21lc3NhZ2luZy9zY2hlZHVsaW5nIiB0YXJnZXQ9IiIgdGl0bGU9IlNjaGVkdWxpbmcgbWVzc2FnZXMiPlNjaGVkdWxpbmcgbWVzc2FnZXMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL21lc3NhZ2luZy93ZWJob29rcyIgdGFyZ2V0PSIiIHRpdGxlPSJVc2luZyBXZWJob29rcyI+VXNpbmcgV2ViaG9va3MgPC9hPjwvbGk+PC91bD48L2Rpdj48ZGl2IGNsYXNzPSJzaWRlYmFyX21lbnUiPjxoNCBjbGFzcz0ic2lkZWJhcl9tZW51X2hlYWRlciI+Q29tcG9zaW5nIG1lc3NhZ2VzPC9oND48dWwgY2xhc3M9InNpZGViYXJfbWVudV9saXN0Ij48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvbWVzc2FnaW5nL2NvbXBvc2luZyIgdGFyZ2V0PSIiIHRpdGxlPSJPdmVydmlldyI+T3ZlcnZpZXcgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL21lc3NhZ2luZy9jb21wb3NpbmcvZm9ybWF0dGluZyIgdGFyZ2V0PSIiIHRpdGxlPSJGb3JtYXR0aW5nIHRleHQiPkZvcm1hdHRpbmcgdGV4dCA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvbWVzc2FnaW5nL2NvbXBvc2luZy9sYXlvdXRzIiB0YXJnZXQ9IiIgdGl0bGU9Ik1lc3NhZ2UgbGF5b3V0cyI+TWVzc2FnZSBsYXlvdXRzIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9tZXNzYWdpbmcvaW50ZXJhY3Rpdml0eSIgdGFyZ2V0PSIiIHRpdGxlPSJJbnRlcmFjdGl2ZSBtZXNzYWdlcyI+SW50ZXJhY3RpdmUgbWVzc2FnZXMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3Rvb2xzL2Jsb2NrLWtpdC1idWlsZGVyIiB0YXJnZXQ9IiIgdGl0bGU9IkJsb2NrIEtpdCBCdWlsZGVyIj5CbG9jayBLaXQgQnVpbGRlciA8L2E+PC9saT48L3VsPjwvZGl2PjxkaXYgY2xhc3M9InNpZGViYXJfbWVudSI+PGg0IGNsYXNzPSJzaWRlYmFyX21lbnVfaGVhZGVyIj5Xb3JraW5nIHdpdGggZmlsZXM8L2g0Pjx1bCBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3QiPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9tZXNzYWdpbmcvZmlsZXMiIHRhcmdldD0iIiB0aXRsZT0iT3ZlcnZpZXciPk92ZXJ2aWV3IDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9tZXNzYWdpbmcvZmlsZXMvc2V0dXAiIHRhcmdldD0iIiB0aXRsZT0iUHJlcGFyaW5nIHlvdXIgYXBwIGZvciBmaWxlcyI+UHJlcGFyaW5nIHlvdXIgYXBwIGZvciBmaWxlcyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvbWVzc2FnaW5nL2ZpbGVzL3VwbG9hZGluZyIgdGFyZ2V0PSIiIHRpdGxlPSJVcGxvYWRpbmcgZmlsZXMgdG8gU2xhY2siPlVwbG9hZGluZyBmaWxlcyB0byBTbGFjayA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvbWVzc2FnaW5nL2ZpbGVzL3JlbW90ZSIgdGFyZ2V0PSIiIHRpdGxlPSJBZGRpbmcgcmVtb3RlIGZpbGVzIj5BZGRpbmcgcmVtb3RlIGZpbGVzIDwvYT48L2xpPjwvdWw+PC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl9tZW51Ij48aDQgY2xhc3M9InNpZGViYXJfbWVudV9oZWFkZXIiPlJlZmVyZW5jZTwvaDQ+PHVsIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdCI+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3JlZmVyZW5jZS9tZXNzYWdpbmcvcGF5bG9hZCIgdGFyZ2V0PSIiIHRpdGxlPSJNZXNzYWdlcyI+TWVzc2FnZXMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3JlZmVyZW5jZS9ibG9jay1raXQvYmxvY2tzIiB0YXJnZXQ9IiIgdGl0bGU9IkJsb2NrcyI+QmxvY2tzIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9yZWZlcmVuY2UvbWVzc2FnaW5nL2F0dGFjaG1lbnRzIiB0YXJnZXQ9IiIgdGl0bGU9IlNlY29uZGFyeSBhdHRhY2htZW50cyI+U2Vjb25kYXJ5IGF0dGFjaG1lbnRzIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9yZWZlcmVuY2UvbWVzc2FnaW5nL2xpbmstdW5mdXJsaW5nIiB0YXJnZXQ9IiIgdGl0bGU9IkxpbmsgdW5mdXJsaW5nIj5MaW5rIHVuZnVybGluZyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvbWVzc2FnaW5nL2F0dGFjaG1lbnRzLXRvLWJsb2NrcyIgdGFyZ2V0PSIiIHRpdGxlPSJVcGdyYWRpbmcgdG8gYmxvY2tzIj5VcGdyYWRpbmcgdG8gYmxvY2tzIDwvYT48L2xpPjwvdWw+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl9ncm91cCBncm91cF9jb2xsYXBzZWQiIGRhdGEtZG9jc25hdj0iZ3JvdXAiIGlkPSJodWJfZ3JvdXBfYXBpcyI+PGRpdiBjbGFzcz0ic2lkZWJhcl9ncm91cF90aXRsZSIgZGF0YS1kb2NzbmF2PSJ0b2dnbGUiIGRhdGEtdGFyZ2V0PSJodWJfZ3JvdXBfYXBpcyI+PGkgY2xhc3M9ImMtaWNvbiBjLWljb24tLWNvZ3MiPjwvaT5BUElzPC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl9ncm91cF9jb2xsYXBzZSI+PGRpdiBjbGFzcz0ic2lkZWJhcl9tZW51Ij48dWwgY2xhc3M9InNpZGViYXJfbWVudV9saXN0Ij48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvYXBpcyIgdGFyZ2V0PSIiIHRpdGxlPSJPdmVydmlldyI+T3ZlcnZpZXcgPC9hPjwvbGk+PC91bD48L2Rpdj48ZGl2IGNsYXNzPSJzaWRlYmFyX21lbnUiPjxoNCBjbGFzcz0ic2lkZWJhcl9tZW51X2hlYWRlciI+VXNhZ2UgZ3VpZGVzPC9oND48dWwgY2xhc3M9InNpZGViYXJfbWVudV9saXN0Ij48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvd2ViIiB0YXJnZXQ9IiIgdGl0bGU9IlVzaW5nIHRoZSBXZWIgQVBJIj5Vc2luZyB0aGUgV2ViIEFQSSA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvZXZlbnRzLWFwaSIgdGFyZ2V0PSIiIHRpdGxlPSJVc2luZyB0aGUgRXZlbnRzIEFQSSI+VXNpbmcgdGhlIEV2ZW50cyBBUEkgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2RvY3MvcGFnaW5hdGlvbiIgdGFyZ2V0PSIiIHRpdGxlPSJQYWdpbmF0aW9uIj5QYWdpbmF0aW9uIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9kb2NzL3JhdGUtbGltaXRzIiB0YXJnZXQ9IiIgdGl0bGU9IlJhdGUgbGltaXRzIj5SYXRlIGxpbWl0cyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvYXBpcy9jaGFubmVscy1iZXR3ZWVuLW9yZ3MiIHRhcmdldD0iIiB0aXRsZT0iQ2hhbm5lbHMgYmV0d2VlbiBvcmdzIj5DaGFubmVscyBiZXR3ZWVuIG9yZ3MgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2RvY3Mvc2xhY2stc3RhdHVzIiB0YXJnZXQ9IiIgdGl0bGU9IlN0YXR1cyBBUEkiPlN0YXR1cyBBUEkgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2FwaXMvY2FsbHMiIHRhcmdldD0iIiB0aXRsZT0iQ2FsbHMgQVBJIj5DYWxscyBBUEkgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2RvY3MvcHJlc2VuY2UtYW5kLXN0YXR1cyIgdGFyZ2V0PSIiIHRpdGxlPSJQcmVzZW5jZSAmYW1wOyBzdGF0dXMiPlByZXNlbmNlICZhbXA7IHN0YXR1cyA8L2E+PC9saT48L3VsPjwvZGl2PjxkaXYgY2xhc3M9InNpZGViYXJfbWVudSI+PGg0IGNsYXNzPSJzaWRlYmFyX21lbnVfaGVhZGVyIj5SZWZlcmVuY2U8L2g0Pjx1bCBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3QiPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9tZXRob2RzIiB0YXJnZXQ9IiIgdGl0bGU9Ik1ldGhvZHMiPk1ldGhvZHMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2V2ZW50cyIgdGFyZ2V0PSIiIHRpdGxlPSJFdmVudCB0eXBlcyI+RXZlbnQgdHlwZXMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3R5cGVzIiB0YXJnZXQ9IiIgdGl0bGU9Ik9iamVjdCB0eXBlcyI+T2JqZWN0IHR5cGVzIDwvYT48L2xpPjwvdWw+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl9ncm91cCBncm91cF9jb2xsYXBzZWQiIGRhdGEtZG9jc25hdj0iZ3JvdXAiIGlkPSJodWJfZ3JvdXBfd29ya2Zsb3dzIj48ZGl2IGNsYXNzPSJzaWRlYmFyX2dyb3VwX3RpdGxlIiBkYXRhLWRvY3NuYXY9InRvZ2dsZSIgZGF0YS10YXJnZXQ9Imh1Yl9ncm91cF93b3JrZmxvd3MiPjxpIGNsYXNzPSJjLWljb24gYy1pY29uLS1tYWdpYyI+PC9pPldvcmtmbG93czwvZGl2PjxkaXYgY2xhc3M9InNpZGViYXJfZ3JvdXBfY29sbGFwc2UiPjxkaXYgY2xhc3M9InNpZGViYXJfbWVudSI+PHVsIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdCI+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3dvcmtmbG93cyIgdGFyZ2V0PSIiIHRpdGxlPSJPdmVydmlldyI+T3ZlcnZpZXcgPC9hPjwvbGk+PC91bD48L2Rpdj48ZGl2IGNsYXNzPSJzaWRlYmFyX21lbnUiPjxoNCBjbGFzcz0ic2lkZWJhcl9tZW51X2hlYWRlciI+V29ya2Zsb3dzIGZvciB1c2VyczwvaDQ+PHVsIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdCI+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3dvcmtmbG93cyNpbnRybyIgdGFyZ2V0PSIiIHRpdGxlPSJJbnRyb2R1Y3Rpb24iPkludHJvZHVjdGlvbiA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvd29ya2Zsb3dzI2J1aWxkaW5nX3dvcmtmbG93cyIgdGFyZ2V0PSIiIHRpdGxlPSJCdWlsZGluZyB3b3JrZmxvd3MiPkJ1aWxkaW5nIHdvcmtmbG93cyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSJodHRwczovL3NsYWNrLmNvbS9zbGFjay10aXBzL3dvcmtmbG93LWJ1aWxkZXItZXhhbXBsZXMiIHRhcmdldD0iX2JsYW5rIiB0aXRsZT0iUHJlLWJ1aWx0IHdvcmtmbG93cyI+UHJlLWJ1aWx0IHdvcmtmbG93cyA8dHMtaWNvbiBjbGFzcz0idHNfaWNvbl9leHRlcm5hbF9saW5rIj48L3RzLWljb24+PC9hPjwvbGk+PC91bD48L2Rpdj48ZGl2IGNsYXNzPSJzaWRlYmFyX21lbnUiPjxoNCBjbGFzcz0ic2lkZWJhcl9tZW51X2hlYWRlciI+V29ya2Zsb3dzIGZvciBkZXZlbG9wZXJzPC9oND48dWwgY2xhc3M9InNpZGViYXJfbWVudV9saXN0Ij48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvd29ya2Zsb3dzI3dlYmhvb2tzIiB0YXJnZXQ9IiIgdGl0bGU9IldlYmhvb2sgdHJpZ2dlcnMiPldlYmhvb2sgdHJpZ2dlcnMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3dvcmtmbG93cy9zdGVwcyIgdGFyZ2V0PSIiIHRpdGxlPSJTdGVwcyBmcm9tIGFwcHMiPlN0ZXBzIGZyb20gYXBwcyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2xhY2thcGkvd29ya2Zsb3ctcG93ZXJ1cHMiIHRhcmdldD0iIiB0aXRsZT0iV29ya2Zsb3cgUG93ZXJ1cHMiPldvcmtmbG93IFBvd2VydXBzIDwvYT48L2xpPjwvdWw+PC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl9tZW51Ij48aDQgY2xhc3M9InNpZGViYXJfbWVudV9oZWFkZXIiPlJlZmVyZW5jZTwvaDQ+PHVsIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdCI+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3JlZmVyZW5jZS93b3JrZmxvd3MvY29uZmlndXJhdGlvbi12aWV3IiB0YXJnZXQ9IiIgdGl0bGU9IkNvbmZpZ3VyYXRpb24gdmlld3MiPkNvbmZpZ3VyYXRpb24gdmlld3MgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3JlZmVyZW5jZS93b3JrZmxvd3Mvd29ya2Zsb3dfc3RlcCIgdGFyZ2V0PSIiIHRpdGxlPSJ3b3JrZmxvd19zdGVwIj53b3JrZmxvd19zdGVwIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9yZWZlcmVuY2Uvd29ya2Zsb3dzL3dvcmtmbG93X3N0ZXBfZWRpdCIgdGFyZ2V0PSIiIHRpdGxlPSJ3b3JrZmxvd19zdGVwX2VkaXQiPndvcmtmbG93X3N0ZXBfZWRpdCA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvZXZlbnRzL3dvcmtmbG93X3N0ZXBfZXhlY3V0ZSIgdGFyZ2V0PSIiIHRpdGxlPSJ3b3JrZmxvd19zdGVwX2V4ZWN1dGUiPndvcmtmbG93X3N0ZXBfZXhlY3V0ZSA8L2E+PC9saT48L3VsPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InNpZGViYXJfZ3JvdXAgZ3JvdXBfY29sbGFwc2VkIiBkYXRhLWRvY3NuYXY9Imdyb3VwIiBpZD0iaHViX2dyb3VwX2VudGVycHJpc2UiPjxkaXYgY2xhc3M9InNpZGViYXJfZ3JvdXBfdGl0bGUiIGRhdGEtZG9jc25hdj0idG9nZ2xlIiBkYXRhLXRhcmdldD0iaHViX2dyb3VwX2VudGVycHJpc2UiPjxpIGNsYXNzPSJjLWljb24gYy1pY29uLS1idWlsZGluZyI+PC9pPkVudGVycHJpc2U8L2Rpdj48ZGl2IGNsYXNzPSJzaWRlYmFyX2dyb3VwX2NvbGxhcHNlIj48ZGl2IGNsYXNzPSJzaWRlYmFyX21lbnUiPjxoNCBjbGFzcz0ic2lkZWJhcl9tZW51X2hlYWRlciI+RW50ZXJwcmlzZSBHcmlkPC9oND48dWwgY2xhc3M9InNpZGViYXJfbWVudV9saXN0Ij48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvZW50ZXJwcmlzZS9ncmlkIiB0YXJnZXQ9IiIgdGl0bGU9Ik92ZXJ2aWV3Ij5PdmVydmlldyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvZW50ZXJwcmlzZS9ncmlkL2RldmVsb3BpbmciIHRhcmdldD0iIiB0aXRsZT0iUHJlcGFyaW5nIHlvdXIgYXBwcyI+UHJlcGFyaW5nIHlvdXIgYXBwcyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvZW50ZXJwcmlzZS9ncmlkL3Rlc3RpbmciIHRhcmdldD0iIiB0aXRsZT0iVGVzdGluZyBvbiBHcmlkIj5UZXN0aW5nIG9uIEdyaWQgPC9hPjwvbGk+PC91bD48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJzaWRlYmFyX2dyb3VwIGdyb3VwX2NvbGxhcHNlZCIgZGF0YS1kb2NzbmF2PSJncm91cCIgaWQ9Imh1Yl9ncm91cF9hZG1pbnMiPjxkaXYgY2xhc3M9InNpZGViYXJfZ3JvdXBfdGl0bGUiIGRhdGEtZG9jc25hdj0idG9nZ2xlIiBkYXRhLXRhcmdldD0iaHViX2dyb3VwX2FkbWlucyI+PGkgY2xhc3M9ImMtaWNvbiBjLWljb24tLWZpbHRlcnMiPjwvaT5BcHBzIGZvciBBZG1pbnM8L2Rpdj48ZGl2IGNsYXNzPSJzaWRlYmFyX2dyb3VwX2NvbGxhcHNlIj48ZGl2IGNsYXNzPSJzaWRlYmFyX21lbnUiPjx1bCBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3QiPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9hZG1pbnMiIHRhcmdldD0iIiB0aXRsZT0iT3ZlcnZpZXciPk92ZXJ2aWV3IDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9hZG1pbnMvY2hhbm5lbHMiIHRhcmdldD0iIiB0aXRsZT0iTWFuYWdpbmcgY2hhbm5lbHMiPk1hbmFnaW5nIGNoYW5uZWxzIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9hZG1pbnMvYXBwcm92YWxzIiB0YXJnZXQ9IiIgdGl0bGU9Ik1hbmFnaW5nIGFwcCBhcHByb3ZhbHMiPk1hbmFnaW5nIGFwcCBhcHByb3ZhbHMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2FkbWlucy93b3Jrc3BhY2VzIiB0YXJnZXQ9IiIgdGl0bGU9Ik1hbmFnaW5nIHVzZXJzIj5NYW5hZ2luZyB1c2VycyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvYWRtaW5zL2ludml0aW5nIiB0YXJnZXQ9IiIgdGl0bGU9Ik1hbmFnaW5nIGludml0ZSByZXF1ZXN0cyI+TWFuYWdpbmcgaW52aXRlIHJlcXVlc3RzIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9tZXRob2RzL2FkbWluLnVzZXJzLnNlc3Npb24ucmVzZXQiIHRhcmdldD0iIiB0aXRsZT0iUmVzZXR0aW5nIHNlc3Npb25zIj5SZXNldHRpbmcgc2Vzc2lvbnMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2FkbWlucy9zY2ltIiB0YXJnZXQ9IiIgdGl0bGU9IlByb3Zpc2lvbmluZyB3aXRoIFNDSU0iPlByb3Zpc2lvbmluZyB3aXRoIFNDSU0gPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2FkbWlucy9hdWRpdC1sb2dzIiB0YXJnZXQ9IiIgdGl0bGU9IkF1ZGl0IExvZ3MgQVBJIj5BdWRpdCBMb2dzIEFQSSA8L2E+PC9saT48L3VsPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InNpZGViYXJfZ3JvdXAgc2lkZWJhcl9yZWZlcmVuY2VfbGluayI+PGRpdiBjbGFzcz0ic2lkZWJhcl9ncm91cF90aXRsZSI+PGkgY2xhc3M9ImMtaWNvbiBjLWljb24tLWNvZGUiPjwvaT48YSBocmVmPSIvcmVmZXJlbmNlIj5SZWZlcmVuY2U8L2E+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl90cmF2ZWxpbmdfbmF2Ij48ZGl2IGNsYXNzPSJzaWRlYmFyX21lbnUiPjx1bCBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3QiPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9jaGFuZ2Vsb2ciIHRhcmdldD0iIiB0aXRsZT0iQ2hhbmdlbG9nIj5DaGFuZ2Vsb2cgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2RldmVsb3Blci1iZXRhIiB0YXJnZXQ9IiIgdGl0bGU9IkJldGEgZmVhdHVyZXMiPkJldGEgZmVhdHVyZXMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iaHR0cHM6Ly9tZWRpdW0uY29tL3NsYWNrLWRldmVsb3Blci1ibG9nIiB0YXJnZXQ9IiIgdGl0bGU9IkRldmVsb3BlciBibG9nIj5EZXZlbG9wZXIgYmxvZyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvcm9hZG1hcCIgdGFyZ2V0PSIiIHRpdGxlPSJSb2FkbWFwIj5Sb2FkbWFwIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vc2xhY2thcGkiIHRhcmdldD0iIiB0aXRsZT0iQFNsYWNrQVBJIj5AU2xhY2tBUEkgPC9hPjwvbGk+PC91bD48L2Rpdj48ZGl2IGNsYXNzPSJzaWRlYmFyX21lbnUiPjxoNCBjbGFzcz0ic2lkZWJhcl9tZW51X2hlYWRlciI+UmVzb3VyY2VzPC9oND48dWwgY2xhc3M9InNpZGViYXJfbWVudV9saXN0Ij48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvdG9vbHMiIHRhcmdldD0iIiB0aXRsZT0iT3VyIHRvb2xzIj5PdXIgdG9vbHMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3N1cHBvcnQiIHRhcmdldD0iIiB0aXRsZT0iR2V0IHN1cHBvcnQiPkdldCBzdXBwb3J0IDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Imh0dHBzOi8vc2xhY2suY29tL3BhcnRuZXJzIiB0YXJnZXQ9IiIgdGl0bGU9IlBhcnRuZXIgd2l0aCB1cyI+UGFydG5lciB3aXRoIHVzIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9sYW5nL2phLWpwIiB0YXJnZXQ9IiIgdGl0bGU9IvCfh6/wn4e1ICDml6XmnKzoqp4iPvCfh6/wn4e1ICDml6XmnKzoqp4gPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iaHR0cHM6Ly9zbGFjay5jb20vdGVybXMtb2Ytc2VydmljZS9hcGkiIHRhcmdldD0iIiB0aXRsZT0iQVBJIFRlcm1zIG9mIFNlcnZpY2UiPkFQSSBUZXJtcyBvZiBTZXJ2aWNlIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Imh0dHBzOi8vc2xhY2suY29tL2RldmVsb3BlcnMvZnVuZCIgdGFyZ2V0PSIiIHRpdGxlPSJTbGFjayBGdW5kIj5TbGFjayBGdW5kIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9mYXEiIHRhcmdldD0iIiB0aXRsZT0iRkFRIj5GQVEgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iaHR0cHM6Ly9zbGFjay5lbmdpbmVlcmluZyIgdGFyZ2V0PSIiIHRpdGxlPSJTbGFjayBFbmdpbmVlcmluZyI+U2xhY2sgRW5naW5lZXJpbmcgPC9hPjwvbGk+PC91bD48L2Rpdj48ZGl2IGNsYXNzPSJzaWRlYmFyX21lbnUiPjxoNCBjbGFzcz0ic2lkZWJhcl9tZW51X2hlYWRlciI+Q29tbXVuaXR5PC9oND48dWwgY2xhc3M9InNpZGViYXJfbWVudV9saXN0Ij48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvY29tbXVuaXR5IiB0YXJnZXQ9IiIgdGl0bGU9IlRvb2xzIGFuZCByZXNvdXJjZXMiPlRvb2xzIGFuZCByZXNvdXJjZXMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iaHR0cHM6Ly9zbGFja2NvbW11bml0eS5jb20/dXRtX21lZGl1bT1yZWZlcnJhbCZhbXA7dXRtX3NvdXJjZT1hcGlzbGFjayZhbXA7dXRtX2NhbXBhaWduPWZ5MjAtUTEwMy1zcGNsYXVuY2giIHRhcmdldD0iIiB0aXRsZT0iR3JvdXBzIGFuZCBldmVudHMiPkdyb3VwcyBhbmQgZXZlbnRzIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9jb21tdW5pdHkvY29kZS1vZi1jb25kdWN0IiB0YXJnZXQ9IiIgdGl0bGU9IkNvZGUgb2YgQ29uZHVjdCI+Q29kZSBvZiBDb25kdWN0IDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9kb2NzL2hvc3RpbmciIHRhcmdldD0iIiB0aXRsZT0iSG9zdGluZyBwcm92aWRlcnMiPkhvc3RpbmcgcHJvdmlkZXJzIDwvYT48L2xpPjwvdWw+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl9tZW51IHNpZGViYXJfaGVscF9saW5rIj48cD48YSBkYXRhLWd0bS1jbGljaz0iQVBJR2V0SGVscCIgZGF0YS1jbG9nLWV2ZW50PSJBUFBfRElSRUNUT1JZX1dFQlNJVEVfQ0xJQ0siIGRhdGEtY2xvZy1wYXJhbXM9ImNsaWNrX3RhcmdldD1hcGlfbmF2X2dldF9oZWxwX2J0biIgaHJlZj0iL3N1cHBvcnQ/cmVmPWFwaV9uYXYiIGNsYXNzPSJidG4iPkdldCBIZWxwPC9hPjwvcD48L2Rpdj48L2Rpdj48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPihmdW5jdGlvbigpIHsKCWNvbnN0IG5hdkNvbGxhcHNlciA9IChldmUpID0+IHsKCQljb25zdCB0YXJnZXRfaWQgPSBldmUuc3JjRWxlbWVudC5kYXRhc2V0LnRhcmdldDsKCQl2YXIgdGFyZ2V0X2dyb3VwID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignIycrdGFyZ2V0X2lkKTsKCQl0YXJnZXRfZ3JvdXAuY2xhc3NMaXN0LnRvZ2dsZSgnZ3JvdXBfZXhwYW5kZWQnKTsKCQl0YXJnZXRfZ3JvdXAuY2xhc3NMaXN0LnRvZ2dsZSgnZ3JvdXBfY29sbGFwc2VkJyk7Cgl9OwoJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtZG9jc25hdj10b2dnbGVdJykuZm9yRWFjaCgodG9nZ2xlKSA9PiB7CgkJdG9nZ2xlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbmF2Q29sbGFwc2VyKQoJfSk7Cn0pKCk7PC9zY3JpcHQ+PC9uYXY+PGRpdiBpZD0iYXBpX21haW5fY29udGVudCIgY2xhc3M9ImNvbCI+PGRpdiBjbGFzcz0iY2FyZCI+PHNlY3Rpb24+PGRpdiBjbGFzcz0iYm90dG9tX21hcmdpbiI+PGZvcm0gY2xhc3M9InNlYXJjaCIgYWNjZXB0LWNoYXJzZXQ9IlVURi04IiBhY3Rpb249Ii9zZWFyY2giIG1ldGhvZD0iZ2V0IiByb2xlPSJzZWFyY2giPjxkaXYgY2xhc3M9ImNsZWFyZml4Ij48ZGl2IGNsYXNzPSJjb2wgc3Bhbl8xMF9vZl8xMiBzbWFsbF9sZWZ0X3BhZGRpbmciPjxkaXYgY2xhc3M9ImMtZmlsdGVyX2lucHV0IGFwaV9zZWFyY2giIHJvbGU9InByZXNlbnRhdGlvbiI+PHRzLWljb24gY2xhc3M9ImMtaWNvbiBudWRnZV90b3BfMSBjLWljb24tLXNlYXJjaC1tZWRpdW0gc21hbGxfcmlnaHRfcGFkZGluZyIgYXJpYS1oaWRkZW49InRydWUiPjwvdHMtaWNvbj48aW5wdXQgY2xhc3M9InNlYXJjaF9pbnB1dCIgaWQ9InF1ZXJ5IiBuYW1lPSJxdWVyeSIgdmFsdWU9IiIgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9IlNlYXJjaCBvdXIgZG9jcywgdHV0b3JpYWxzLCBjaGFuZ2Vsb2dzLCBhbmQgbW9yZSIgZGF0YS1zbWFsbHBsYWNlaG9sZGVyPSJTZWFyY2ggdGhlIGRvY3VtZW50YXRpb24iPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImZyb20iIHZhbHVlPSJob21lIj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJjb2wgc3Bhbl8yX29mXzEyIG5vX3BhZGRpbmcgbm9fbWFyZ2luIj48aW5wdXQgdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGZ1bGxfd2lkdGgiIHZhbHVlPSJTZWFyY2giPjwvZGl2PjwvZGl2PjwvZm9ybT48L2Rpdj48L3NlY3Rpb24+PHNlY3Rpb24+PGRpdiBjbGFzcz0iZGlzcGxheV9mbGV4IGFsaWduX2l0ZW1zX2NlbnRlciBhcGlfaG9tZV9leGFtcGxlX3JvdyI+PGRpdiBjbGFzcz0iZmxleF9ub25lIGFwaV9ob21lX2V4YW1wbGVfaW1hZ2VfY29udGFpbmVyIj48aW1nIHNyYz0iaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tLzlhYTk2L2ltZy9hcGkvaG9tZXBhZ2VfZXhhbXBsZV92aXNpdGJvdC5wbmciIHNyY3NldD0iaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tLzlhYTk2L2ltZy9hcGkvaG9tZXBhZ2VfZXhhbXBsZV92aXNpdGJvdC5wbmcgMXgsIGh0dHBzOi8vYS5zbGFjay1lZGdlLmNvbS85YWE5Ni9pbWcvYXBpL2hvbWVwYWdlX2V4YW1wbGVfdmlzaXRib3RAMngucG5nIDJ4Ij48L2Rpdj48ZGl2IGNsYXNzPSJhcGlfaG9tZV9leGFtcGxlX3RleHRfY29udGFpbmVyIj48aDMgY2xhc3M9ImJsYWNrIj5TZW5kIG1lc3NhZ2VzPC9oMz48cD5NZXNzYWdlcyBhcmUgdGhlIGJ1aWxkaW5nIGJsb2NrcyBvZiBhcHBzIGFuZCBib3RzLiBTdGFydCBmcm9tICZsZHF1bztIZWxsbywgd29ybGQsJnJkcXVvOyBvciBjb25uZWN0IGEgc2VydmljZSB5b3UgYWxyZWFkeSB1c2UuPC9wPjxhc2lkZSBjbGFzcz0ic21hbGwiPkxlYXJuIGFib3V0IDxhIGhyZWY9Ii9kb2NzL21lc3NhZ2VzIj5tZXNzYWdlczwvYT4gJmFtcDsgPGEgaHJlZj0iL21lc3NhZ2luZy93ZWJob29rcyI+aW5jb21pbmcgd2ViaG9va3M8L2E+LjwvYXNpZGU+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iZGlzcGxheV9mbGV4IGFsaWduX2l0ZW1zX2NlbnRlciBhcGlfaG9tZV9leGFtcGxlX3JvdyI+PGRpdiBjbGFzcz0iYXBpX2hvbWVfZXhhbXBsZV90ZXh0X2NvbnRhaW5lciI+PGgzIGNsYXNzPSJibGFjayI+R2l2ZSB1c2VycyBhIHNob3J0Y3V0PC9oMz48cD5IZWxwIHVzZXJzIGRpc2NvdmVyIHdoYXQgeW91ciBhcHAgY2FuIGRvIHdpdGggU2hvcnRjdXRzLjwvcD48YXNpZGUgY2xhc3M9InNtYWxsIj5MZWFybiBhYm91dCA8YSBocmVmPSIvaW50ZXJhY3Rpdml0eS9zaG9ydGN1dHMiPlNob3J0Y3V0czwvYT4gJmFtcDsgPGEgaHJlZj0iL3N1cmZhY2VzL21vZGFscyI+TW9kYWxzPC9hPi48L2FzaWRlPjwvZGl2PjxkaXYgY2xhc3M9ImZsZXhfbm9uZSBhcGlfaG9tZV9leGFtcGxlX2ltYWdlX2NvbnRhaW5lciI+PGltZyBzcmM9Imh0dHBzOi8vYS5zbGFjay1lZGdlLmNvbS85YWE5Ni9pbWcvYXBpL2hvbWVwYWdlX2hlbHBkZXNrX3Nob3J0Y3V0LnBuZyIgc3Jjc2V0PSJodHRwczovL2Euc2xhY2stZWRnZS5jb20vOWFhOTYvaW1nL2FwaS9ob21lcGFnZV9oZWxwZGVza19zaG9ydGN1dC5wbmcgMXgsIGh0dHBzOi8vYS5zbGFjay1lZGdlLmNvbS85YWE5Ni9pbWcvYXBpL2hvbWVwYWdlX2hlbHBkZXNrX3Nob3J0Y3V0QDJ4LnBuZyAyeCI+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iZGlzcGxheV9mbGV4IGFsaWduX2l0ZW1zX2NlbnRlciBhcGlfaG9tZV9leGFtcGxlX3JvdyI+PGRpdiBjbGFzcz0iZmxleF9ub25lIGFwaV9ob21lX2V4YW1wbGVfaW1hZ2VfY29udGFpbmVyIj48aW1nIHNyYz0iaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tL2U5YzhmL2ltZy9hcGkvaG9tZXBhZ2VfZXhhbXBsZV93b3JrZmxvdy5wbmciIHNyY3NldD0iaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tL2U5YzhmL2ltZy9hcGkvaG9tZXBhZ2VfZXhhbXBsZV93b3JrZmxvdy5wbmcgMXgsIGh0dHBzOi8vYS5zbGFjay1lZGdlLmNvbS9lOWM4Zi9pbWcvYXBpL2hvbWVwYWdlX2V4YW1wbGVfd29ya2Zsb3dAMngucG5nIDJ4Ij48L2Rpdj48ZGl2IGNsYXNzPSJhcGlfaG9tZV9leGFtcGxlX3RleHRfY29udGFpbmVyIj48aDMgY2xhc3M9ImJsYWNrIj5BdXRvbWF0ZSB3aXRoIHdvcmtmbG93czwvaDM+PHA+SGFybmVzcyB0aGUgcG93ZXIgb2YgYXBwcywgd2l0aG91dCB0aGUgY29kZS48L3A+PGFzaWRlIGNsYXNzPSJzbWFsbCI+IExlYXJuIGFib3V0IDxhIGhyZWY9Ii9zdGFydC9idWlsZGluZy93b3JrZmxvdy1idWlsZGVyIj5Xb3JrZmxvdyBCdWlsZGVyPC9hPi4gPC9hc2lkZT48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJkaXNwbGF5X2ZsZXggYWxpZ25faXRlbXNfY2VudGVyIGFwaV9ob21lX2V4YW1wbGVfcm93Ij48ZGl2IGNsYXNzPSJhcGlfaG9tZV9leGFtcGxlX3RleHRfY29udGFpbmVyIj48aDMgY2xhc3M9ImJsYWNrIj5DcmVhdGUgc2ltcGxlIGludGVyYWN0aW9uczwvaDM+PHA+WW91ciBhcHAgY2FuIHJlc3BvbmQgdG8gdXNlciBhY3Rpdml0eSwgYW5kIGJ1dHRvbnMgbGV0IHVzZXJzIGNvbXBsZXRlIHNpbXBsZSB0YXNrcyAobGlrZSByZXF1ZXN0cyBhbmQgYXBwcm92YWxzKS48L3A+PGFzaWRlIGNsYXNzPSJzbWFsbCI+IExlYXJuIGFib3V0IDxhIGhyZWY9Ii9pbnRlcmFjdGl2ZS1tZXNzYWdlcyI+SW50ZXJhY3RpdmUgY29tcG9uZW50czwvYT4gJmFtcDsgPGEgaHJlZj0iL2V2ZW50cy1hcGkiPkV2ZW50cyBBUEk8L2E+LiA8L2FzaWRlPjwvZGl2PjxkaXYgY2xhc3M9ImZsZXhfbm9uZSBhcGlfaG9tZV9leGFtcGxlX2ltYWdlX2NvbnRhaW5lciI+PGltZyBzcmM9Imh0dHBzOi8vYS5zbGFjay1lZGdlLmNvbS85YWE5Ni9pbWcvYXBpL2hvbWVwYWdlX2V4YW1wbGVfaGlyZXRyb24ucG5nIiBzcmNzZXQ9Imh0dHBzOi8vYS5zbGFjay1lZGdlLmNvbS85YWE5Ni9pbWcvYXBpL2hvbWVwYWdlX2V4YW1wbGVfaGlyZXRyb24ucG5nIDF4LCBodHRwczovL2Euc2xhY2stZWRnZS5jb20vOWFhOTYvaW1nL2FwaS9ob21lcGFnZV9leGFtcGxlX2hpcmV0cm9uQDJ4LnBuZyAyeCI+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iZGlzcGxheV9mbGV4IGFsaWduX2l0ZW1zX2NlbnRlciBhcGlfaG9tZV9leGFtcGxlX3JvdyI+PGRpdiBjbGFzcz0iZmxleF9ub25lIGFwaV9ob21lX2V4YW1wbGVfaW1hZ2VfY29udGFpbmVyIj48aW1nIHNyYz0iaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tLzlhYTk2L2ltZy9hcGkvaG9tZXBhZ2VfZXhhbXBsZV9leHBlbnNpYm90LnBuZyIgc3Jjc2V0PSJodHRwczovL2Euc2xhY2stZWRnZS5jb20vOWFhOTYvaW1nL2FwaS9ob21lcGFnZV9leGFtcGxlX2V4cGVuc2lib3QucG5nIDF4LCBodHRwczovL2Euc2xhY2stZWRnZS5jb20vOWFhOTYvaW1nL2FwaS9ob21lcGFnZV9leGFtcGxlX2V4cGVuc2lib3RAMngucG5nIDJ4Ij48L2Rpdj48ZGl2IGNsYXNzPSJhcGlfaG9tZV9leGFtcGxlX3RleHRfY29udGFpbmVyIj48aDMgY2xhc3M9ImJsYWNrIj5TZXQgdXAgaW50ZXJuYWwgdG9vbHM8L2gzPjxwPk5lZWQgYSBzbGFzaCBjb21tYW5kIG9yIGEgYm90IGp1c3QgZm9yIHlvdXIgdGVhbT8gQWxsIG91ciB0b29scyBjYW4gYmUgdXNlZCBmb3IgaW50ZXJuYWwgaW50ZWdyYXRpb25zLjwvcD48YXNpZGUgY2xhc3M9InNtYWxsIj5MZWFybiBhYm91dCA8YSBocmVmPSIvaW50ZXJuYWwtaW50ZWdyYXRpb25zIj5JbnRlcm5hbCBpbnRlZ3JhdGlvbnM8L2E+LjwvYXNpZGU+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iZGlzcGxheV9mbGV4IGFsaWduX2l0ZW1zX2NlbnRlciBhcGlfaG9tZV9leGFtcGxlX3JvdyI+PGRpdiBjbGFzcz0iYXBpX2hvbWVfZXhhbXBsZV90ZXh0X2NvbnRhaW5lciI+PGgzIGNsYXNzPSJibGFjayI+UHVibGlzaCB5b3VyIGFwcDwvaDM+PHA+U3VibWl0IHlvdXIgYXBwIHRvIHRoZSBTbGFjayBBcHAgRGlyZWN0b3J5LCBhbmQgcmVhY2ggbWlsbGlvbnMgb2YgZGFpbHkgYWN0aXZlIFNsYWNrIHVzZXJzLjwvcD48YXNpZGUgY2xhc3M9InNtYWxsIj5MZWFybiBhYm91dCB0aGUgPGEgaHJlZj0iL2RvY3Mvc2xhY2stYXBwcy1jaGVja2xpc3QiPkFwcCBkaXJlY3RvcnkgY2hlY2tsaXN0PC9hPi48L2FzaWRlPjwvZGl2PjxkaXYgY2xhc3M9ImZsZXhfbm9uZSBhcGlfaG9tZV9leGFtcGxlX2ltYWdlX2NvbnRhaW5lciI+PGltZyBzcmM9Imh0dHBzOi8vYS5zbGFjay1lZGdlLmNvbS84MDU4OC9pbWcvYXBpL2hvbWVwYWdlX2V4YW1wbGVfY2hlY2tsaXN0LnBuZyIgc3Jjc2V0PSJodHRwczovL2Euc2xhY2stZWRnZS5jb20vODA1ODgvaW1nL2FwaS9ob21lcGFnZV9leGFtcGxlX2NoZWNrbGlzdC5wbmcgMXgsIGh0dHBzOi8vYS5zbGFjay1lZGdlLmNvbS84MDU4OC9pbWcvYXBpL2hvbWVwYWdlX2V4YW1wbGVfY2hlY2tsaXN0QDJ4LnBuZyAyeCI+PC9kaXY+PC9kaXY+PC9zZWN0aW9uPjxzZWN0aW9uPjxoMiBjbGFzcz0iYWxpZ25fY2VudGVyIGJsYWNrIj5MYXRlc3QgZnJvbSB0aGUgY2hhbmdlbG9nPGltZyBzcmM9Imh0dHBzOi8vYS5zbGFjay1lZGdlLmNvbS84MDU4OC9pbWcvYXBpL2hvbWVwYWdlX2Jsb2dfc2hhcGVzLnBuZyIgc3Jjc2V0PSJodHRwczovL2Euc2xhY2stZWRnZS5jb20vODA1ODgvaW1nL2FwaS9ob21lcGFnZV9ibG9nX3NoYXBlcy5wbmcgMXgsIGh0dHBzOi8vYS5zbGFjay1lZGdlLmNvbS84MDU4OC9pbWcvYXBpL2hvbWVwYWdlX2Jsb2dfc2hhcGVzQDJ4LnBuZyAyeCIgY2xhc3M9ImFwaV9ob21lX2Jsb2dfaW1hZ2UgbGVmdF9tYXJnaW4iPjwvaDI+PGRpdiBjbGFzcz0iYm90dG9tX2JvcmRlciBkaXNwbGF5X2ZsZXggc21hbGxfdG9wX3BhZGRpbmcgc21hbGxfYm90dG9tX3BhZGRpbmciPjxkaXYgY2xhc3M9ImFwaV9ob21lX2Jsb2dfcG9zdF9taWRkbGVfY29udGFpbmVyIHNtYWxsX2xlZnRfcGFkZGluZyBmbGV4X25vbmUiPjxzcGFuPk9jdCA2LCAyMDIwPC9zcGFuPjwvZGl2PjxkaXY+PHAgY2xhc3M9Im5vcm1hbCI+PGEgY2xhc3M9ImluZGlmZmVyZW50X2dyZXkiIGhyZWY9Ii9zdXJmYWNlcy9tZXNzYWdlcyI+QmxvY2sgS2l0IGNoZWNrYm94ZXMgYW5kIHJhZGlvIGJ1dHRvbnMgYXJlIG5vdyBhdmFpbGFibGUgdG8gdXNlIGluIG1lc3NhZ2VzLiBRdWlja2x5IGFuZCBjb252ZXJzYXRpb25hbGx5IGNvbGxlY3QgaW5mb3JtYXRpb24gZnJvbSB1c2VycyBieSA8YSBocmVmPSIvcmVmZXJlbmNlL2Jsb2NrLWtpdC9pbnRlcmFjdGl2ZS1jb21wb25lbnRzIj5pbmNsdWRpbmcgdGhlbSBpbmxpbmU8L2E+Lgo8L2E+PC9wPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImJvdHRvbV9ib3JkZXIgZGlzcGxheV9mbGV4IHNtYWxsX3RvcF9wYWRkaW5nIHNtYWxsX2JvdHRvbV9wYWRkaW5nIj48ZGl2IGNsYXNzPSJhcGlfaG9tZV9ibG9nX3Bvc3RfbWlkZGxlX2NvbnRhaW5lciBzbWFsbF9sZWZ0X3BhZGRpbmcgZmxleF9ub25lIj48c3Bhbj5PY3QgNiwgMjAyMDwvc3Bhbj48L2Rpdj48ZGl2PjxwIGNsYXNzPSJub3JtYWwiPjxhIGNsYXNzPSJpbmRpZmZlcmVudF9ncmV5IiBocmVmPSIvcmVmZXJlbmNlL2Jsb2NrLWtpdC9ibG9ja3MjaW5wdXQiPkdhdGhlciBkYXRhIGZyb20gdXNlcnMgZGlyZWN0bHkgZnJvbSB5b3VyIEFwcCBIb21l4oCUPGEgaHJlZj0iL3JlZmVyZW5jZS9ibG9jay1raXQvYmxvY2tzI2lucHV0Ij5pbnB1dCBibG9ja3M8L2E+IGNhbiBub3cgYmUgYWRkZWQgdG8gPGEgaHJlZj0iL3N1cmZhY2VzL3RhYnMiPkhvbWUgdGFiczwvYT4uIEFkZGl0aW9uYWxseSwgaW5wdXQgYmxvY2tzIGNhbiBub3cgZGlzcGF0Y2ggPGEgaHJlZj0iL3JlZmVyZW5jZS9pbnRlcmFjdGlvbi1wYXlsb2Fkcy9ibG9jay1hY3Rpb25zIj48Y29kZT5ibG9ja19hY3Rpb25zPC9jb2RlPiBwYXlsb2FkczwvYT4gd2hlbiBzb21lb25lIGludGVyYWN0cyB3aXRoIHRoZW0uIDxhIGhyZWY9Ii9yZWZlcmVuY2UvYmxvY2sta2l0L2Jsb2NrcyNpbnB1dCI+UmVhZCBhYm91dCB0aGUgbmV3IDxjb2RlPmRpc3BhdGNoX2FjdGlvbnM8L2NvZGU+IGZsYWc8L2E+Lgo8L2E+PC9wPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImJvdHRvbV9ib3JkZXIgZGlzcGxheV9mbGV4IHNtYWxsX3RvcF9wYWRkaW5nIHNtYWxsX2JvdHRvbV9wYWRkaW5nIj48ZGl2IGNsYXNzPSJhcGlfaG9tZV9ibG9nX3Bvc3RfbWlkZGxlX2NvbnRhaW5lciBzbWFsbF9sZWZ0X3BhZGRpbmcgZmxleF9ub25lIj48c3Bhbj5PY3QgMSwgMjAyMDwvc3Bhbj48L2Rpdj48ZGl2PjxwIGNsYXNzPSJub3JtYWwiPjxhIGNsYXNzPSJpbmRpZmZlcmVudF9ncmV5IiBocmVmPSJodHRwczovL3NsYWNrLmNvbS9hcHBzIj5XZSByZWZyZXNoZWQgdGhlIGxvb2sgb2YgeW91ciBhcHAncyBsaXN0aW5nIGluIHRoZSA8YSBocmVmPSJodHRwczovL3NsYWNrLmNvbS9hcHBzIj5BcHAgRGlyZWN0b3J5PC9hPi4gQW1vbmcgdGhlIGNoYW5nZXM6IGEgPHN0cm9uZz5GZWF0dXJlczwvc3Ryb25nPiB0YWIgc2hvd3MgeW91ciBhcHAncyA8YSBocmVmPSIvaW50ZXJhY3Rpdml0eS9lbnRyeS1wb2ludHMiPmVudHJ5IHBvaW50czwvYT7igJRsaWtlIDxhIGhyZWY9Ii9pbnRlcmFjdGl2aXR5L3Nob3J0Y3V0cyI+c2hvcnRjdXRzPC9hPiBhbmQgPGEgaHJlZj0iL2ludGVyYWN0aXZpdHkvc2xhc2gtY29tbWFuZHMiPnNsYXNoIGNvbW1hbmRzPC9hPi4KPC9hPjwvcD48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJub3JtYWxfcGFkZGluZ190b3AgbGFyZ2VfbWFyZ2luX2JvdHRvbSBhbGlnbl9jZW50ZXIiPjxwIGNsYXNzPSJsYXJnZV90b3BfbWFyZ2luIHZlcnlfbGFyZ2VfYm90dG9tX21hcmdpbiI+QnJvd3NlIG1vcmUgb2YgdGhlIENoYW5nZWxvZyA8YSBocmVmPSIvY2hhbmdlbG9nIj5oZXJlPC9hPi48L3A+PC9kaXY+PC9zZWN0aW9uPjxzZWN0aW9uPjxoMiBjbGFzcz0iYWxpZ25fY2VudGVyIGJsYWNrIj5MYXRlc3QgZnJvbSB0aGUgcGxhdGZvcm0gYmxvZzxpbWcgc3JjPSJodHRwczovL2Euc2xhY2stZWRnZS5jb20vODA1ODgvaW1nL2FwaS9ob21lcGFnZV9ibG9nX3NoYXBlcy5wbmciIHNyY3NldD0iaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tLzgwNTg4L2ltZy9hcGkvaG9tZXBhZ2VfYmxvZ19zaGFwZXMucG5nIDF4LCBodHRwczovL2Euc2xhY2stZWRnZS5jb20vODA1ODgvaW1nL2FwaS9ob21lcGFnZV9ibG9nX3NoYXBlc0AyeC5wbmcgMngiIGNsYXNzPSJhcGlfaG9tZV9ibG9nX2ltYWdlIGxlZnRfbWFyZ2luIj48L2gyPjxkaXYgY2xhc3M9ImJvdHRvbV9ib3JkZXIgZGlzcGxheV9mbGV4IHNtYWxsX3RvcF9wYWRkaW5nIHNtYWxsX2JvdHRvbV9wYWRkaW5nIj48ZGl2IGNsYXNzPSJhcGlfaG9tZV9ibG9nX3Bvc3RfbWlkZGxlX2NvbnRhaW5lciBsZWZ0X3BhZGRpbmcgZmxleF9ub25lIj48c3Bhbj5BdWcgMTgsIDIwMjA8L3NwYW4+PC9kaXY+PGRpdj48aDQgY2xhc3M9Im5vcm1hbCI+PGEgY2xhc3M9ImluZGlmZmVyZW50X2dyZXkiIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9zbGFjay1kZXZlbG9wZXItYmxvZy9tdWx0aXBseS15b3VyLWFwcHMtcmVhY2gtd2l0aC1zbGFjay1jb25uZWN0LWY2ZTM5Nzg4ZjY5OT9zb3VyY2U9cnNzLS0tLWQ3NmMwNjA1YjkyMi0tLTQiPk11bHRpcGx5IHlvdXIgYXBw4oCZcyByZWFjaCB3aXRoIFNsYWNrIENvbm5lY3Q8L2E+PC9oND48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJib3R0b21fYm9yZGVyIGRpc3BsYXlfZmxleCBzbWFsbF90b3BfcGFkZGluZyBzbWFsbF9ib3R0b21fcGFkZGluZyI+PGRpdiBjbGFzcz0iYXBpX2hvbWVfYmxvZ19wb3N0X21pZGRsZV9jb250YWluZXIgbGVmdF9wYWRkaW5nIGZsZXhfbm9uZSI+PHNwYW4+QXVnIDQsIDIwMjA8L3NwYW4+PC9kaXY+PGRpdj48aDQgY2xhc3M9Im5vcm1hbCI+PGEgY2xhc3M9ImluZGlmZmVyZW50X2dyZXkiIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9zbGFjay1kZXZlbG9wZXItYmxvZy9zbGFjay1vbi1zbGFjay1kZWxpdmVyaW5nLWltcGFjdGZ1bC1pbnRlcm5hbC1wcm9kdWN0cy05ZjNlNjI0MDM0OTI/c291cmNlPXJzcy0tLS1kNzZjMDYwNWI5MjItLS00Ij5TbGFjayBvbiBTbGFjazogRGVsaXZlcmluZyBpbXBhY3RmdWwgaW50ZXJuYWwgcHJvZHVjdHM8L2E+PC9oND48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJib3R0b21fYm9yZGVyIGRpc3BsYXlfZmxleCBzbWFsbF90b3BfcGFkZGluZyBzbWFsbF9ib3R0b21fcGFkZGluZyI+PGRpdiBjbGFzcz0iYXBpX2hvbWVfYmxvZ19wb3N0X21pZGRsZV9jb250YWluZXIgbGVmdF9wYWRkaW5nIGZsZXhfbm9uZSI+PHNwYW4+SnVsIDI5LCAyMDIwPC9zcGFuPjwvZGl2PjxkaXY+PGg0IGNsYXNzPSJub3JtYWwiPjxhIGNsYXNzPSJpbmRpZmZlcmVudF9ncmV5IiBocmVmPSJodHRwczovL21lZGl1bS5jb20vc2xhY2stZGV2ZWxvcGVyLWJsb2cvYS1uZXctZGVzaWduLWFwcHJvYWNoLTYzNjFiZDU0NmI3P3NvdXJjZT1yc3MtLS0tZDc2YzA2MDViOTIyLS0tNCI+QSBuZXcgZGVzaWduIGFwcHJvYWNoPC9hPjwvaDQ+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ibm9ybWFsX3BhZGRpbmdfdG9wIGxhcmdlX21hcmdpbl9ib3R0b20gYWxpZ25fY2VudGVyIj48cCBjbGFzcz0ibGFyZ2VfdG9wX21hcmdpbiB2ZXJ5X2xhcmdlX2JvdHRvbV9tYXJnaW4iPkJyb3dzZSBtb3JlIG9mIHRoZSBQbGF0Zm9ybSBCbG9nIDxhIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9zbGFjay1kZXZlbG9wZXItYmxvZyI+aGVyZTwvYT4uPC9wPjwvZGl2Pjwvc2VjdGlvbj48c2VjdGlvbj48aDIgY2xhc3M9ImFsaWduX2NlbnRlciBibGFjayI+UmVjZW50IHR1dG9yaWFsczxpbWcgc3JjPSJodHRwczovL2Euc2xhY2stZWRnZS5jb20vODA1ODgvaW1nL2FwaS9ob21lcGFnZV9ibG9nX3NoYXBlcy5wbmciIHNyY3NldD0iaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tLzgwNTg4L2ltZy9hcGkvaG9tZXBhZ2VfYmxvZ19zaGFwZXMucG5nIDF4LCBodHRwczovL2Euc2xhY2stZWRnZS5jb20vODA1ODgvaW1nL2FwaS9ob21lcGFnZV9ibG9nX3NoYXBlc0AyeC5wbmcgMngiIGNsYXNzPSJhcGlfaG9tZV9ibG9nX2ltYWdlIGxlZnRfbWFyZ2luIj48L2gyPjxkaXYgY2xhc3M9ImJvdHRvbV9ib3JkZXIgZGlzcGxheV9mbGV4IHNtYWxsX3RvcF9wYWRkaW5nIHNtYWxsX2JvdHRvbV9wYWRkaW5nIj48ZGl2IGNsYXNzPSJmbGV4X25vbmUiPjwvZGl2PjxkaXYgY2xhc3M9ImFwaV9ob21lX2Jsb2dfcG9zdF9taWRkbGVfY29udGFpbmVyIHNtYWxsX2xlZnRfcGFkZGluZyBmbGV4X25vbmUiPjxzdHJvbmc+U2FyYWggQmFybmVrb3c8L3N0cm9uZz48YnI+PHNwYW4+SnVsIDI5LCAyMDIwPC9zcGFuPjwvZGl2PjxkaXY+PGg0IGNsYXNzPSJub3JtYWwiPjxhIGNsYXNzPSJpbmRpZmZlcmVudF9ncmV5IiBocmVmPSIvdHV0b3JpYWxzL3dvcmtmbG93LWJ1aWxkZXItc3RlcHMiPldvcmtmbG93IEJ1aWxkZXIgU3RlcHMgZnJvbSBBcHBzPC9hPjwvaDQ+PHA+TGVhcm4gaG93IHRvIGNvbmZpZ3VyZSBhIFdvcmtmbG93IEJ1aWxkZXIgU3RlcCBmcm9tIHlvdXIgQXBwLiA8YSBocmVmPSIvdHV0b3JpYWxzL3dvcmtmbG93LWJ1aWxkZXItc3RlcHMiPlJlYWQgTW9yZTwvYT48L3A+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iYm90dG9tX2JvcmRlciBkaXNwbGF5X2ZsZXggc21hbGxfdG9wX3BhZGRpbmcgc21hbGxfYm90dG9tX3BhZGRpbmciPjxkaXYgY2xhc3M9ImZsZXhfbm9uZSI+PC9kaXY+PGRpdiBjbGFzcz0iYXBpX2hvbWVfYmxvZ19wb3N0X21pZGRsZV9jb250YWluZXIgc21hbGxfbGVmdF9wYWRkaW5nIGZsZXhfbm9uZSI+PHN0cm9uZz5KYXNvbiBXb25nPC9zdHJvbmc+PGJyPjxzcGFuPkF1ZyAxNywgMjAyMDwvc3Bhbj48L2Rpdj48ZGl2PjxoNCBjbGFzcz0ibm9ybWFsIj48YSBjbGFzcz0iaW5kaWZmZXJlbnRfZ3JleSIgaHJlZj0iL3R1dG9yaWFscy9pbnRyby10by1tb2RhbHMtYmxvY2sta2l0Ij5JbnRyb2R1Y3Rpb24gdG8gTW9kYWxzIGFuZCBCbG9jayBLaXQ8L2E+PC9oND48cD5Zb3VyIHZlcnkgb3duIFNsYWNrIGFwcCEuIDxhIGhyZWY9Ii90dXRvcmlhbHMvaW50cm8tdG8tbW9kYWxzLWJsb2NrLWtpdCI+UmVhZCBNb3JlPC9hPjwvcD48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJib3R0b21fYm9yZGVyIGRpc3BsYXlfZmxleCBzbWFsbF90b3BfcGFkZGluZyBzbWFsbF9ib3R0b21fcGFkZGluZyI+PGRpdiBjbGFzcz0iZmxleF9ub25lIj48L2Rpdj48ZGl2IGNsYXNzPSJhcGlfaG9tZV9ibG9nX3Bvc3RfbWlkZGxlX2NvbnRhaW5lciBzbWFsbF9sZWZ0X3BhZGRpbmcgZmxleF9ub25lIj48c3Ryb25nPlN0ZXZlIEdpbGw8L3N0cm9uZz48YnI+PHNwYW4+RmViIDQsIDIwMjA8L3NwYW4+PC9kaXY+PGRpdj48aDQgY2xhc3M9Im5vcm1hbCI+PGEgY2xhc3M9ImluZGlmZmVyZW50X2dyZXkiIGhyZWY9Ii90dXRvcmlhbHMvdW5kZXJzdGFuZGluZy1vYXV0aC1zY29wZXMtYm90Ij5VbmRlcnN0YW5kaW5nIE9BdXRoIHNjb3BlcyBmb3IgQm90czwvYT48L2g0PjxwPkxlYXJuIGhvdyB1c2UgcmVxdWVzdCBzY29wZXMgdXNpbmcgT0F1dGguIDxhIGhyZWY9Ii90dXRvcmlhbHMvdW5kZXJzdGFuZGluZy1vYXV0aC1zY29wZXMtYm90Ij5SZWFkIE1vcmU8L2E+PC9wPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9Im5vcm1hbF9wYWRkaW5nX3RvcCBsYXJnZV9tYXJnaW5fYm90dG9tIGFsaWduX2NlbnRlciI+PHAgY2xhc3M9ImxhcmdlX3RvcF9tYXJnaW4gdmVyeV9sYXJnZV9ib3R0b21fbWFyZ2luIj5Ccm93c2UgbW9yZSB0dXRvcmlhbHMgPGEgaHJlZj0iL3R1dG9yaWFscyI+aGVyZTwvYT4uPC9wPjwvZGl2Pjwvc2VjdGlvbj48c2VjdGlvbiBjbGFzcz0iYXBpX2hvbWVfc3RhcnRfbGVhcm5pbmdfYmFubmVyIG5ldXRyYWxfd2hpdGUgZGlzcGxheV9mbGV4IGFsaWduX2l0ZW1zX2NlbnRlciBqdXN0aWZ5X2NvbnRlbnRfY2VudGVyIHZlcnlfbGFyZ2VfYm90dG9tX21hcmdpbiI+PGRpdiBjbGFzcz0ic3Bhbl8xX29mXzMgYWxpZ25fY2VudGVyIj48aW1nIHNyYz0iaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tLzgwNTg4L2ltZy9pbnRlZ3JhdGlvbnNfZm9yX3lvdXJfdGVhbS5wbmciIHNyY3NldD0iaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tLzgwNTg4L2ltZy9pbnRlZ3JhdGlvbnNfZm9yX3lvdXJfdGVhbS5wbmcgMXgsIGh0dHBzOi8vYS5zbGFjay1lZGdlLmNvbS84MDU4OC9pbWcvaW50ZWdyYXRpb25zX2Zvcl95b3VyX3RlYW1AMngucG5nIDJ4Ij48L2Rpdj48ZGl2IGNsYXNzPSJzcGFuXzJfb2ZfMyB2ZXJ5X2xhcmdlX3JpZ2h0X3BhZGRpbmciPjxoMyBjbGFzcz0iYXBpX2hvbWVfc3RhcnRfbGVhcm5pbmdfaGVhZGluZyBibGFjayI+V2FudCB0byBkaXZlIGRlZXBlcj88L2gzPjxwIGNsYXNzPSJhcGlfaG9tZV9zdGFydF9sZWFybmluZ19zdWJoZWFkaW5nIHNtYWxsX3RvcF9tYXJnaW4gbGFyZ2VfYm90dG9tX21hcmdpbiI+RkFRcywgdHV0b3JpYWxzLCBhbmQgbW9yZSAmbWRhc2g7IHJlYWQgdXAgb24gaG93IHRvIG1ha2UgeW91ciBhcHAgc2hpbmUuPC9wPjxhIGNsYXNzPSJidG4gYnRuX2xhcmdlIGFwaV9ob21lX3N0YXJ0X2xlYXJuaW5nX2J1dHRvbiBsZWZ0X3BhZGRpbmcgcmlnaHRfcGFkZGluZyIgZGF0YS1jbG9nLWV2ZW50PSJBUFBfRElSRUNUT1JZX1dFQlNJVEVfQ0xJQ0siIGRhdGEtY2xvZy1wYXJhbXM9ImNsaWNrX3RhcmdldD1hcGlfc3RhcnRfbGVhcm5pbmdfYnRuIiBkYXRhLWd0bS1jbGljaz0iQVBJU3RhcnRMZWFybmluZyIgaHJlZj0iL3N0YXJ0Ij5TdGFydCBMZWFybmluZzwvYT48L2Rpdj48L3NlY3Rpb24+PHNlY3Rpb24gY2xhc3M9ImFsaWduX2NlbnRlciBwb3NpdGlvbl9yZWxhdGl2ZSBhcGlfaG9tZV9sb29raW5nX21vcmUiPjxoNCBjbGFzcz0iYmxhY2siPjx0cy1pY29uIGNsYXNzPSJ0c19pY29uX2Vtb2ppX29iamVjdHMgbWlhbWlfcGluayBzbWFsbF9yaWdodF9tYXJnaW4iPjwvdHMtaWNvbj5Mb29raW5nIGZvciBtb3JlPzwvaDQ+PHAgY2xhc3M9ImxhcmdlX2JvdHRvbV9tYXJnaW4iPlRoZXNlIGhhbmR5IGxpbmtzIHdpbGwgaGVscCB5b3UgZ2V0IG9uIHlvdXIgd2F5LjwvcD48ZGl2IGNsYXNzPSJkaXNwbGF5X2ZsZXggYm90dG9tX21hcmdpbiBhcGlfaG9tZV9sb29raW5nX21vcmVfbGlua19jb250YWluZXIgYm9sZCI+PGEgaHJlZj0iaHR0cHM6Ly9zbGFjay5jb20vZGV2ZWxvcGVycy9mdW5kIiBjbGFzcz0iYXBpX2hvbWVfbG9va2luZ19tb3JlX2xpbmsgcG9zaXRpb25fcmVsYXRpdmUgZmxleF9vbmUgZGlzcGxheV9mbGV4IGFsaWduX2l0ZW1zX2NlbnRlciBqdXN0aWZ5X2NvbnRlbnRfY2VudGVyIGNoYXJjb2FsX2dyZXkgbmV1dHJhbF93aGl0ZV9iZyBub191bmRlcmxpbmUiPlNsYWNrIEZ1bmQ8L2E+PGEgaHJlZj0iaHR0cHM6Ly90cmVsbG8uY29tL2IvWm5UUXl1bVEvc2xhY2stcGxhdGZvcm0tcm9hZG1hcCIgY2xhc3M9ImFwaV9ob21lX2xvb2tpbmdfbW9yZV9saW5rIHBvc2l0aW9uX3JlbGF0aXZlIGZsZXhfb25lIGRpc3BsYXlfZmxleCBhbGlnbl9pdGVtc19jZW50ZXIganVzdGlmeV9jb250ZW50X2NlbnRlciBjaGFyY29hbF9ncmV5IG5ldXRyYWxfd2hpdGVfYmcgbm9fdW5kZXJsaW5lIj5QbGF0Zm9ybSBSb2FkbWFwPC9hPjxhIGhyZWY9Ii90b29scyIgY2xhc3M9ImFwaV9ob21lX2xvb2tpbmdfbW9yZV9saW5rIHBvc2l0aW9uX3JlbGF0aXZlIGZsZXhfb25lIGRpc3BsYXlfZmxleCBhbGlnbl9pdGVtc19jZW50ZXIganVzdGlmeV9jb250ZW50X2NlbnRlciBjaGFyY29hbF9ncmV5IG5ldXRyYWxfd2hpdGVfYmcgbm9fdW5kZXJsaW5lIj5Ub29scyBhbmQgU0RLczwvYT48L2Rpdj48L3NlY3Rpb24+PC9kaXY+PC9kaXY+PGRpdiBpZD0iYXBpX2FkZGVkX2NvbnRlbnQiIGNsYXNzPSJjb2wgY29udGVudF9jb2x1bW4gYWRkZWRfY29sdW1uIj48L2Rpdj48L2Rpdj48ZGl2IGlkPSJvdmVybGF5Ij48L2Rpdj48ZGl2IGNsYXNzPSJjbGVhcl9ib3RoIj48L2Rpdj48L2Rpdj48L2Rpdj48Zm9vdGVyIGRhdGEtcWE9ImZvb3RlciI+PHNlY3Rpb24gY2xhc3M9ImxpbmtzIj48ZGl2IGNsYXNzPSJncmlkIj48ZGl2IGNsYXNzPSJjb2wgc3Bhbl8xX29mXzQgbmF2X2NvbCI+PHVsPjxsaSBjbGFzcz0iY2F0XzEiPlVzaW5nIFNsYWNrPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9zbGFjay5jb20vaXMiIGRhdGEtcWE9InByb2R1Y3RfZm9vdGVyIiBkYXRhLWNsb2ctZXZlbnQ9IldFQlNJVEVfQ0xJQ0siIGRhdGEtY2xvZy1wYXJhbXM9ImNsaWNrX3RhcmdldD1mb290ZXJfcHJvZHVjdCI+UHJvZHVjdDwvYT48L2xpPjxsaT48YSBocmVmPSJodHRwczovL3NsYWNrLmNvbS9lbnRlcnByaXNlIiBkYXRhLXFhPSJlbnRlcnByaXNlX2Zvb3RlciIgZGF0YS1jbG9nLWV2ZW50PSJXRUJTSVRFX0NMSUNLIiBkYXRhLWNsb2ctcGFyYW1zPSJjbGlja190YXJnZXQ9Zm9vdGVyX2VudGVycHJpc2UiPkVudGVycHJpc2U8L2E+PC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9zbGFjay5jb20vcHJpY2luZz91aV9zdGVwPTI4JmFtcDt1aV9lbGVtZW50PTUiIGRhdGEtcWE9InByaWNpbmdfZm9vdGVyIiBkYXRhLWNsb2ctZXZlbnQ9IldFQlNJVEVfQ0xJQ0siIGRhdGEtY2xvZy1wYXJhbXM9ImNsaWNrX3RhcmdldD1mb290ZXJfcHJpY2luZyI+UHJpY2luZzwvYT48L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dldC5zbGFjay5oZWxwL2hjL2VuLXVzIiBkYXRhLXFhPSJzdXBwb3J0X2Zvb3RlciIgZGF0YS1jbG9nLWV2ZW50PSJXRUJTSVRFX0NMSUNLIiBkYXRhLWNsb2ctcGFyYW1zPSJjbGlja190YXJnZXQ9Zm9vdGVyX3N1cHBvcnQiPlN1cHBvcnQ8L2E+PC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9zbGFjay5jb20vZ3VpZGVzIiBkYXRhLXFhPSJnZXR0aW5nX3N0YXJ0ZWQiIGRhdGEtY2xvZy1ldmVudD0iV0VCU0lURV9DTElDSyIgZGF0YS1jbG9nLXBhcmFtcz0iY2xpY2tfdGFyZ2V0PWZvb3Rlcl9nZXR0aW5nX3N0YXJ0ZWQiPlNsYWNrIEd1aWRlczwvYT48L2xpPjxsaT48YSBocmVmPSJodHRwczovL3NsYWNrLmNvbS9hcHBzIiBkYXRhLXFhPSJhcHBfZGlyZWN0b3J5IiBkYXRhLWNsb2ctZXZlbnQ9IldFQlNJVEVfQ0xJQ0siIGRhdGEtY2xvZy1wYXJhbXM9ImNsaWNrX3RhcmdldD1mb290ZXJfYXBwX2RpcmVjdG9yeSI+QXBwIERpcmVjdG9yeTwvYT48L2xpPjxsaT48YSBocmVmPSJodHRwczovL2FwaS5zbGFjay5jb20vIiBkYXRhLXFhPSJhcGkiIGRhdGEtY2xvZy1ldmVudD0iV0VCU0lURV9DTElDSyIgZGF0YS1jbG9nLXBhcmFtcz0iY2xpY2tfdGFyZ2V0PWZvb3Rlcl9hcGkiPkFQSTwvYT48L2xpPjwvdWw+PC9kaXY+PGRpdiBjbGFzcz0iY29sIHNwYW5fMV9vZl80IG5hdl9jb2wiPjx1bD48bGkgY2xhc3M9ImNhdF8yIj5TbGFjayA8dHMtaWNvbiBjbGFzcz0idHNfaWNvbl9oZWFydCI+PC90cy1pY29uPjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vc2xhY2suY29tL2pvYnMiIGRhdGEtcWE9ImpvYnMiIGRhdGEtY2xvZy1ldmVudD0iV0VCU0lURV9DTElDSyIgZGF0YS1jbG9nLXBhcmFtcz0iY2xpY2tfdGFyZ2V0PWZvb3Rlcl9qb2JzIj5Kb2JzPC9hPjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vc2xhY2suY29tL2N1c3RvbWVycyIgZGF0YS1xYT0iY3VzdG9tZXJzIiBkYXRhLWNsb2ctZXZlbnQ9IldFQlNJVEVfQ0xJQ0siIGRhdGEtY2xvZy1wYXJhbXM9ImNsaWNrX3RhcmdldD1mb290ZXJfY3VzdG9tZXJzIj5DdXN0b21lcnM8L2E+PC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9zbGFjay5jb20vZGV2ZWxvcGVycyIgZGF0YS1xYT0iZGV2ZWxvcGVycyIgZGF0YS1jbG9nLWV2ZW50PSJXRUJTSVRFX0NMSUNLIiBkYXRhLWNsb2ctcGFyYW1zPSJjbGlja190YXJnZXQ9Zm9vdGVyX2RldmVsb3BlcnMiPkRldmVsb3BlcnM8L2E+PC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9zbGFjay5jb20vZXZlbnRzIiBkYXRhLXFhPSJldmVudHMiIGRhdGEtY2xvZy1ldmVudD0iV0VCU0lURV9DTElDSyIgZGF0YS1jbG9nLXBhcmFtcz0iY2xpY2tfdGFyZ2V0PWZvb3Rlcl9ldmVudHMiPkV2ZW50czwvYT48L2xpPjxsaT48YSBocmVmPSJodHRwczovL3NsYWNraHEuY29tLyIgZGF0YS1xYT0iYmxvZ19mb290ZXIiIGRhdGEtY2xvZy1ldmVudD0iV0VCU0lURV9DTElDSyIgZGF0YS1jbG9nLXBhcmFtcz0iY2xpY2tfdGFyZ2V0PWZvb3Rlcl9ibG9nIj5CbG9nPC9hPjwvbGk+PC91bD48L2Rpdj48ZGl2IGNsYXNzPSJjb2wgc3Bhbl8xX29mXzQgbmF2X2NvbCI+PHVsPjxsaSBjbGFzcz0iY2F0XzMiPkxlZ2FsPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9zbGFjay5jb20vcHJpdmFjeS1wb2xpY3kiIGRhdGEtcWE9InByaXZhY3kiIGRhdGEtY2xvZy1ldmVudD0iV0VCU0lURV9DTElDSyIgZGF0YS1jbG9nLXBhcmFtcz0iY2xpY2tfdGFyZ2V0PWZvb3Rlcl9wcml2YWN5Ij5Qcml2YWN5PC9hPjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vc2xhY2suY29tL3NlY3VyaXR5IiBkYXRhLXFhPSJzZWN1cml0eSIgZGF0YS1jbG9nLWV2ZW50PSJXRUJTSVRFX0NMSUNLIiBkYXRhLWNsb2ctcGFyYW1zPSJjbGlja190YXJnZXQ9Zm9vdGVyX3NlY3VyaXR5Ij5TZWN1cml0eTwvYT48L2xpPjxsaT48YSBocmVmPSJodHRwczovL3NsYWNrLmNvbS90ZXJtcy1vZi1zZXJ2aWNlIiBkYXRhLXFhPSJ0b3MiIGRhdGEtY2xvZy1ldmVudD0iV0VCU0lURV9DTElDSyIgZGF0YS1jbG9nLXBhcmFtcz0iY2xpY2tfdGFyZ2V0PWZvb3Rlcl90b3MiPlRlcm1zIG9mIFNlcnZpY2U8L2E+PC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9zbGFjay5jb20vcG9saWNpZXMiIGRhdGEtcWE9InBvbGljaWVzIiBkYXRhLWNsb2ctZXZlbnQ9IldFQlNJVEVfQ0xJQ0siIGRhdGEtY2xvZy1wYXJhbXM9ImNsaWNrX3RhcmdldD1mb290ZXJfcG9saWNpZXMiPlBvbGljaWVzPC9hPjwvbGk+PC91bD48L2Rpdj48ZGl2IGNsYXNzPSJjb2wgc3Bhbl8xX29mXzQgbmF2X2NvbCI+PHVsPjxsaSBjbGFzcz0iY2F0XzQiPkhhbmR5IExpbmtzPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9zbGFjay5jb20vZG93bmxvYWRzIiBkYXRhLXFhPSJkb3dubG9hZHMiIGRhdGEtY2xvZy1ldmVudD0iV0VCU0lURV9DTElDSyIgZGF0YS1jbG9nLXBhcmFtcz0iY2xpY2tfdGFyZ2V0PWZvb3Rlcl9kb3dubG9hZHMiPkRvd25sb2FkIGRlc2t0b3AgYXBwPC9hPjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vc2xhY2suY29tL2Rvd25sb2FkcyIgZGF0YS1xYT0iZG93bmxvYWRzX21vYmlsZSIgZGF0YS1jbG9nLWV2ZW50PSJXRUJTSVRFX0NMSUNLIiBkYXRhLWNsb2ctcGFyYW1zPSJjbGlja190YXJnZXQ9Zm9vdGVyX2Rvd25sb2Fkc19tb2JpbGUiPkRvd25sb2FkIG1vYmlsZSBhcHA8L2E+PC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9zbGFjay5jb20vYnJhbmQtZ3VpZGVsaW5lcyIgZGF0YS1xYT0iYnJhbmRfZ3VpZGVsaW5lcyIgZGF0YS1jbG9nLWV2ZW50PSJXRUJTSVRFX0NMSUNLIiBkYXRhLWNsb2ctcGFyYW1zPSJjbGlja190YXJnZXQ9Zm9vdGVyX2JyYW5kX2d1aWRlbGluZXMiPkJyYW5kIEd1aWRlbGluZXM8L2E+PC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9zbGFja2F0d29yay5jb20iIGRhdGEtcWE9InNsYWNrX2F0X3dvcmsiIGRhdGEtY2xvZy1ldmVudD0iV0VCU0lURV9DTElDSyIgZGF0YS1jbG9nLXBhcmFtcz0iY2xpY2tfdGFyZ2V0PWZvb3Rlcl9zbGFja19hdF93b3JrIj5TbGFjayBhdCBXb3JrPC9hPjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vc3RhdHVzLnNsYWNrLmNvbS8iIGRhdGEtcWE9InN0YXR1cyIgZGF0YS1jbG9nLWV2ZW50PSJXRUJTSVRFX0NMSUNLIiBkYXRhLWNsb2ctcGFyYW1zPSJjbGlja190YXJnZXQ9Zm9vdGVyX3N0YXR1cyI+U3RhdHVzPC9hPjwvbGk+PC91bD48L2Rpdj48L2Rpdj48L3NlY3Rpb24+PGRpdiBjbGFzcz0iZm9vdG5vdGUiPjxzZWN0aW9uPjxhIGhyZWY9Imh0dHBzOi8vc2xhY2suY29tIiBhcmlhLWxhYmVsPSJTbGFjayBob21lcGFnZSIgZGF0YS1jbG9nLWV2ZW50PSJXRUJTSVRFX0NMSUNLIiBkYXRhLWNsb2ctcGFyYW1zPSJjbGlja190YXJnZXQ9Zm9vdGVyX3NsYWNrX2ljb24iPjx0cy1pY29uIGNsYXNzPSJjLWljb24tLXNsYWNrIiBhcmlhLWhpZGRlbj48L3RzLWljb24+PC9hPjx1bD48bGk+PGEgaHJlZj0iaHR0cHM6Ly9zbGFjay5jb20vaGVscC9jb250YWN0IiBkYXRhLXFhPSJjb250YWN0X3VzIiBkYXRhLWNsb2ctZXZlbnQ9IldFQlNJVEVfQ0xJQ0siIGRhdGEtY2xvZy1wYXJhbXM9ImNsaWNrX3RhcmdldD1mb290ZXJfY29udGFjdF91cyI+Q29udGFjdCBVczwvYT48L2xpPjxsaT48YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL1NsYWNrSFEiIGRhdGEtcWE9InNsYWNrX3R3aXR0ZXIiIGRhdGEtY2xvZy1ldmVudD0iV0VCU0lURV9DTElDSyIgZGF0YS1jbG9nLXBhcmFtcz0iY2xpY2tfdGFyZ2V0PWZvb3Rlcl9zbGFja190d2l0dGVyIiBhcmlhLWxhYmVsPSJTbGFjayBvbiBUd2l0dGVyIj48dHMtaWNvbiBjbGFzcz0idHNfaWNvbl90d2l0dGVyIiBhcmlhLWhpZGRlbj48L3RzLWljb24+PC9hPjwvbGk+PGxpIGNsYXNzPSJ5dCI+PGEgaHJlZj0iaHR0cHM6Ly93d3cueW91dHViZS5jb20vY2hhbm5lbC9VQ1kzWUVDZ2VCY0xDeklyRkxQNGdibHciIGRhdGEtcWE9InNsYWNrX3lvdXR1YmUiIGRhdGEtY2xvZy1ldmVudD0iV0VCU0lURV9DTElDSyIgZGF0YS1jbG9nLXBhcmFtcz0iY2xpY2tfdGFyZ2V0PWZvb3Rlcl9zbGFja195b3V0dWJlIiBhcmlhLWxhYmVsPSJTbGFjayBvbiBZb3VUdWJlIj48dHMtaWNvbiBjbGFzcz0idHNfaWNvbl95b3V0dWJlIiBhcmlhLWhpZGRlbj48L3RzLWljb24+PC9hPjwvbGk+PC91bD48L3NlY3Rpb24+PC9kaXY+PC9mb290ZXI+PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgovKioKICogQSBwbGFjZWhvbGRlciBmdW5jdGlvbiB0aGF0IHRoZSBidWlsZCBzY3JpcHQgdXNlcyB0bwogKiByZXBsYWNlIGZpbGUgcGF0aHMgd2l0aCB0aGVpciBDRE4gdmVyc2lvbnMuCiAqCiAqIEBwYXJhbSB7U3RyaW5nfSBmaWxlX3BhdGggLSBGaWxlIHBhdGgKICogQHJldHVybnMge1N0cmluZ30KICovCmZ1bmN0aW9uIHZ2dihmaWxlX3BhdGgpIHsKCQkgdmFyIHZ2dl93YXJuaW5nID0gJ1lvdSBjYW5ub3QgdXNlIHZ2diBvbiBkeW5hbWljIHZhbHVlcy4gUGxlYXNlIG1ha2Ugc3VyZSB5b3Ugb25seSBwYXNzIGluIHN0YXRpYyBmaWxlIHBhdGhzLic7IGlmICh3aW5kb3cuVFMgJiYgd2luZG93LlRTLndhcm4pIHsgd2luZG93LlRTLndhcm4odnZ2X3dhcm5pbmcpOyB9IGVsc2UgeyBjb25zb2xlLndhcm4odnZ2X3dhcm5pbmcpOyB9IAoJcmV0dXJuIGZpbGVfcGF0aDsKfQoKdmFyIGNkbl91cmwgPSAiaHR0cHM6XC9cL2Euc2xhY2stZWRnZS5jb20iOwp2YXIgdnZ2X2Fic191cmwgPSAiaHR0cHM6XC9cL3NsYWNrLmNvbVwvIjsKdmFyIGluY19qc19zZXR1cF9kYXRhID0gewoJZW1vamlfc2hlZXRzOiB7CgkJYXBwbGU6ICdodHRwczovL2Euc2xhY2stZWRnZS5jb20vODA1ODgvaW1nL2Vtb2ppXzIwMTdfMTJfMDYvc2hlZXRfYXBwbGVfNjRfaW5kZXhlZF8yNTYucG5nJywKCQlnb29nbGU6ICdodHRwczovL2Euc2xhY2stZWRnZS5jb20vODA1ODgvaW1nL2Vtb2ppXzIwMTdfMTJfMDYvc2hlZXRfZ29vZ2xlXzY0X2luZGV4ZWRfMjU2LnBuZycsCgl9LAp9Owo8L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CS8vIGNvbW1vbiBib290X2RhdGEKCXZhciBib290X2RhdGEgPSB7ImFwaV91cmwiOiJcL2FwaVwvIiwiYXBwIjoiZmFsc2UiLCJ1c2VyX2lkIjpudWxsLCJ0ZWFtX2lkIjoiVDAwMDAwMDAwIiwidmlzaXRvcl91aWQiOiIzdWVuYjZ5ZjRmYnoyang1YzV2ZDc1Y2F4Iiwibm9fbG9naW4iOnRydWUsInZlcnNpb25fdHMiOiIxNjAyMDI0NDIyIiwidmVyc2lvbl91aWQiOiJmNDY3MTRmMjMyN2EwOTk1ZTM1OWJjYmYzMmVlZTc0ZGUxM2NhMmNkIiwiY2FjaGVfdmVyc2lvbiI6InYyMS1ub21hZCIsImNhY2hlX3RzX3ZlcnNpb24iOiJ2Mi1idW5ueSIsInJlZGlyX2RvbWFpbiI6InNsYWNrLXJlZGlyLm5ldCIsInNpZ25pbl91cmwiOiJodHRwczpcL1wvc2xhY2suY29tXC9zaWduaW4iLCJhYnNfcm9vdF91cmwiOiJodHRwczpcL1wvc2xhY2suY29tXC8iLCJ0ZWFtX3VybCI6IiIsImltYWdlX3Byb3h5X3VybCI6Imh0dHBzOlwvXC9zbGFjay1pbWdzLmNvbVwvIiwiYmVhY29uX3RpbWluZ191cmwiOiJodHRwczpcL1wvc2xhY2suY29tXC9iZWFjb25cL3RpbWluZyIsImJlYWNvbl9lcnJvcl91cmwiOiJodHRwczpcL1wvc2xhY2suY29tXC9iZWFjb25cL2Vycm9yIiwiY2xvZ191cmwiOiJjbG9nXC90cmFja1wvIiwiYXBpX3Rva2VuIjoiIiwidnZ2X3BhdGhzIjp7Imx6X3N0cmluZyI6Imh0dHBzOlwvXC9hLnNsYWNrLWVkZ2UuY29tXC9idjEtOFwvbHotc3RyaW5nLTEuNC40Lndvcmtlci44ZGUxYjAwZDY3MGZmM2RjNzA2YTAuanMiLCJjb2RlbWlycm9yIjoiaHR0cHM6XC9cL2Euc2xhY2stZWRnZS5jb21cL2J2MS04XC9jb2RlbWlycm9yLm1pbi41MjZmOTM2OTI0ZWVmMThmMDBiYi5taW4uanMiLCJjb2RlbWlycm9yX2FkZG9uX3NpbXBsZSI6Imh0dHBzOlwvXC9hLnNsYWNrLWVkZ2UuY29tXC9idjEtOFwvY29kZW1pcnJvcl9zaW1wbGUuOWJjNzZiYjMyNjBhNWVkMGU1ZGMubWluLmpzIiwiY29kZW1pcnJvcl9sb2FkIjoiaHR0cHM6XC9cL2Euc2xhY2stZWRnZS5jb21cL2J2MS04XC9jb2RlbWlycm9yX2xvYWQuZjFhMzdmNGU0ODZiMmMyMjEwNWIubWluLmpzIiwiY29kZW1pcnJvcl9maWxlcyI6eyJqYXZhc2NyaXB0IjoiaHR0cHM6XC9cL2Euc2xhY2stZWRnZS5jb21cL2J2MS04XC9jb2RlbWlycm9yX2xhbmdfamF2YXNjcmlwdC5iMjk1ZWY4NzZlZWRhZmU4M2IzOS5taW4uanMifX0sIm5vdGlmaWNhdGlvbl9zb3VuZHMiOlt7InZhbHVlIjoiYjIubXAzIiwibGFiZWwiOiJEaW5nIiwidXJsIjoiaHR0cHM6XC9cL2Euc2xhY2stZWRnZS5jb21cLzdlOTFcL3NvdW5kc1wvcHVzaFwvYjIubXAzIiwidXJsX29nZyI6Imh0dHBzOlwvXC9hLnNsYWNrLWVkZ2UuY29tXC80NmViYlwvc291bmRzXC9wdXNoXC9iMi5vZ2cifSx7InZhbHVlIjoiYW5pbWFsX3N0aWNrLm1wMyIsImxhYmVsIjoiQm9pbmciLCJ1cmwiOiJodHRwczpcL1wvYS5zbGFjay1lZGdlLmNvbVwvN2U5MVwvc291bmRzXC9wdXNoXC9hbmltYWxfc3RpY2subXAzIiwidXJsX29nZyI6Imh0dHBzOlwvXC9hLnNsYWNrLWVkZ2UuY29tXC80NmViYlwvc291bmRzXC9wdXNoXC9hbmltYWxfc3RpY2sub2dnIn0seyJ2YWx1ZSI6ImJlZW5fdHJlZS5tcDMiLCJsYWJlbCI6IkRyb3AiLCJ1cmwiOiJodHRwczpcL1wvYS5zbGFjay1lZGdlLmNvbVwvN2U5MVwvc291bmRzXC9wdXNoXC9iZWVuX3RyZWUubXAzIiwidXJsX29nZyI6Imh0dHBzOlwvXC9hLnNsYWNrLWVkZ2UuY29tXC80NmViYlwvc291bmRzXC9wdXNoXC9iZWVuX3RyZWUub2dnIn0seyJ2YWx1ZSI6ImNvbXBsZXRlX3F1ZXN0X3JlcXVpcmVtZW50Lm1wMyIsImxhYmVsIjoiVGEtZGEiLCJ1cmwiOiJodHRwczpcL1wvYS5zbGFjay1lZGdlLmNvbVwvN2U5MVwvc291bmRzXC9wdXNoXC9jb21wbGV0ZV9xdWVzdF9yZXF1aXJlbWVudC5tcDMiLCJ1cmxfb2dnIjoiaHR0cHM6XC9cL2Euc2xhY2stZWRnZS5jb21cLzQ2ZWJiXC9zb3VuZHNcL3B1c2hcL2NvbXBsZXRlX3F1ZXN0X3JlcXVpcmVtZW50Lm9nZyJ9LHsidmFsdWUiOiJjb25maXJtX2RlbGl2ZXJ5Lm1wMyIsImxhYmVsIjoiUGxpbmsiLCJ1cmwiOiJodHRwczpcL1wvYS5zbGFjay1lZGdlLmNvbVwvN2U5MVwvc291bmRzXC9wdXNoXC9jb25maXJtX2RlbGl2ZXJ5Lm1wMyIsInVybF9vZ2ciOiJodHRwczpcL1wvYS5zbGFjay1lZGdlLmNvbVwvNDZlYmJcL3NvdW5kc1wvcHVzaFwvY29uZmlybV9kZWxpdmVyeS5vZ2cifSx7InZhbHVlIjoiZmxpdHRlcmJ1Zy5tcDMiLCJsYWJlbCI6IldvdyIsInVybCI6Imh0dHBzOlwvXC9hLnNsYWNrLWVkZ2UuY29tXC83ZTkxXC9zb3VuZHNcL3B1c2hcL2ZsaXR0ZXJidWcubXAzIiwidXJsX29nZyI6Imh0dHBzOlwvXC9hLnNsYWNrLWVkZ2UuY29tXC80NmViYlwvc291bmRzXC9wdXNoXC9mbGl0dGVyYnVnLm9nZyJ9LHsidmFsdWUiOiJoZXJlX3lvdV9nb19saWdodGVyLm1wMyIsImxhYmVsIjoiSGVyZSB5b3UgZ28iLCJ1cmwiOiJodHRwczpcL1wvYS5zbGFjay1lZGdlLmNvbVwvN2U5MVwvc291bmRzXC9wdXNoXC9oZXJlX3lvdV9nb19saWdodGVyLm1wMyIsInVybF9vZ2ciOiJodHRwczpcL1wvYS5zbGFjay1lZGdlLmNvbVwvNDZlYmJcL3NvdW5kc1wvcHVzaFwvaGVyZV95b3VfZ29fbGlnaHRlci5vZ2cifSx7InZhbHVlIjoiaGlfZmxvd2Vyc19oaXQubXAzIiwibGFiZWwiOiJIaSIsInVybCI6Imh0dHBzOlwvXC9hLnNsYWNrLWVkZ2UuY29tXC83ZTkxXC9zb3VuZHNcL3B1c2hcL2hpX2Zsb3dlcnNfaGl0Lm1wMyIsInVybF9vZ2ciOiJodHRwczpcL1wvYS5zbGFjay1lZGdlLmNvbVwvNDZlYmJcL3NvdW5kc1wvcHVzaFwvaGlfZmxvd2Vyc19oaXQub2dnIn0seyJ2YWx1ZSI6Imtub2NrX2JydXNoLm1wMyIsImxhYmVsIjoiS25vY2sgQnJ1c2giLCJ1cmwiOiJodHRwczpcL1wvYS5zbGFjay1lZGdlLmNvbVwvN2U5MVwvc291bmRzXC9wdXNoXC9rbm9ja19icnVzaC5tcDMiLCJ1cmxfb2dnIjoiaHR0cHM6XC9cL2Euc2xhY2stZWRnZS5jb21cLzQ2ZWJiXC9zb3VuZHNcL3B1c2hcL2tub2NrX2JydXNoLm9nZyJ9LHsidmFsdWUiOiJzYXZlX2FuZF9jaGVja291dC5tcDMiLCJsYWJlbCI6Ildob2EhIiwidXJsIjoiaHR0cHM6XC9cL2Euc2xhY2stZWRnZS5jb21cLzdlOTFcL3NvdW5kc1wvcHVzaFwvc2F2ZV9hbmRfY2hlY2tvdXQubXAzIiwidXJsX29nZyI6Imh0dHBzOlwvXC9hLnNsYWNrLWVkZ2UuY29tXC80NmViYlwvc291bmRzXC9wdXNoXC9zYXZlX2FuZF9jaGVja291dC5vZ2cifSx7InZhbHVlIjoiaXRlbV9waWNrdXAubXAzIiwibGFiZWwiOiJZb2luayIsInVybCI6Imh0dHBzOlwvXC9hLnNsYWNrLWVkZ2UuY29tXC83ZTkxXC9zb3VuZHNcL3B1c2hcL2l0ZW1fcGlja3VwLm1wMyIsInVybF9vZ2ciOiJodHRwczpcL1wvYS5zbGFjay1lZGdlLmNvbVwvNDZlYmJcL3NvdW5kc1wvcHVzaFwvaXRlbV9waWNrdXAub2dnIn0seyJ2YWx1ZSI6Imh1bW11cy5tcDMiLCJsYWJlbCI6Ikh1bW11cyIsInVybCI6Imh0dHBzOlwvXC9hLnNsYWNrLWVkZ2UuY29tXC83ZmE5XC9zb3VuZHNcL3B1c2hcL2h1bW11cy5tcDMiLCJ1cmxfb2dnIjoiaHR0cHM6XC9cL2Euc2xhY2stZWRnZS5jb21cLzQ2ZWJiXC9zb3VuZHNcL3B1c2hcL2h1bW11cy5vZ2cifSx7InZhbHVlIjoibm9uZSIsImxhYmVsIjoiTm9uZSJ9XSwiYWxlcnRfc291bmRzIjpbeyJ2YWx1ZSI6ImZyb2cubXAzIiwibGFiZWwiOiJGcm9nIiwidXJsIjoiaHR0cHM6XC9cL3NsYWNrLmdsb2JhbC5zc2wuZmFzdGx5Lm5ldFwvYTM0YVwvc291bmRzXC9mcm9nLm1wMyJ9XSwiY2FsbF9zb3VuZHMiOlt7InZhbHVlIjoiY2FsbFwvYWxlcnRfdjIubXAzIiwibGFiZWwiOiJBbGVydCIsInVybCI6Imh0dHBzOlwvXC9zbGFjay5nbG9iYWwuc3NsLmZhc3RseS5uZXRcLzA4ZjdcL3NvdW5kc1wvY2FsbFwvYWxlcnRfdjIubXAzIn0seyJ2YWx1ZSI6ImNhbGxcL2luY29taW5nX3JpbmdfdjIubXAzIiwibGFiZWwiOiJJbmNvbWluZyByaW5nIiwidXJsIjoiaHR0cHM6XC9cL3NsYWNrLmdsb2JhbC5zc2wuZmFzdGx5Lm5ldFwvMDhmN1wvc291bmRzXC9jYWxsXC9pbmNvbWluZ19yaW5nX3YyLm1wMyJ9LHsidmFsdWUiOiJjYWxsXC9vdXRnb2luZ19yaW5nX3YyLm1wMyIsImxhYmVsIjoiT3V0Z29pbmcgcmluZyIsInVybCI6Imh0dHBzOlwvXC9zbGFjay5nbG9iYWwuc3NsLmZhc3RseS5uZXRcLzA4ZjdcL3NvdW5kc1wvY2FsbFwvb3V0Z29pbmdfcmluZ192Mi5tcDMifSx7InZhbHVlIjoiY2FsbFwvcG9wX3YyLm1wMyIsImxhYmVsIjoiSW5jb21pbmcgcmVhY3Rpb24iLCJ1cmwiOiJodHRwczpcL1wvc2xhY2suZ2xvYmFsLnNzbC5mYXN0bHkubmV0XC8wOGY3XC9zb3VuZHNcL2NhbGxcL3BvcF92Mi5tcDMifSx7InZhbHVlIjoiY2FsbFwvdGhleV9sZWZ0X2NhbGxfdjIubXAzIiwibGFiZWwiOiJUaGV5IGxlZnQgY2FsbCIsInVybCI6Imh0dHBzOlwvXC9zbGFjay5nbG9iYWwuc3NsLmZhc3RseS5uZXRcLzA4ZjdcL3NvdW5kc1wvY2FsbFwvdGhleV9sZWZ0X2NhbGxfdjIubXAzIn0seyJ2YWx1ZSI6ImNhbGxcL3lvdV9sZWZ0X2NhbGxfdjIubXAzIiwibGFiZWwiOiJZb3UgbGVmdCBjYWxsIiwidXJsIjoiaHR0cHM6XC9cL3NsYWNrLmdsb2JhbC5zc2wuZmFzdGx5Lm5ldFwvMDhmN1wvc291bmRzXC9jYWxsXC95b3VfbGVmdF9jYWxsX3YyLm1wMyJ9LHsidmFsdWUiOiJjYWxsXC90aGV5X2pvaW5lZF9jYWxsX3YyLm1wMyIsImxhYmVsIjoiVGhleSBqb2luZWQgY2FsbCIsInVybCI6Imh0dHBzOlwvXC9zbGFjay5nbG9iYWwuc3NsLmZhc3RseS5uZXRcLzA4ZjdcL3NvdW5kc1wvY2FsbFwvdGhleV9qb2luZWRfY2FsbF92Mi5tcDMifSx7InZhbHVlIjoiY2FsbFwveW91X2pvaW5lZF9jYWxsX3YyLm1wMyIsImxhYmVsIjoiWW91IGpvaW5lZCBjYWxsIiwidXJsIjoiaHR0cHM6XC9cL3NsYWNrLmdsb2JhbC5zc2wuZmFzdGx5Lm5ldFwvMDhmN1wvc291bmRzXC9jYWxsXC95b3Vfam9pbmVkX2NhbGxfdjIubXAzIn0seyJ2YWx1ZSI6ImNhbGxcL2NvbmZpcm1hdGlvbl92Mi5tcDMiLCJsYWJlbCI6IkNvbmZpcm1hdGlvbiIsInVybCI6Imh0dHBzOlwvXC9zbGFjay5nbG9iYWwuc3NsLmZhc3RseS5uZXRcLzA4ZjdcL3NvdW5kc1wvY2FsbFwvY29uZmlybWF0aW9uX3YyLm1wMyJ9XSwiY2FsbF9zb3VuZHNfdmVyc2lvbiI6InYyIiwiaW1nIjp7ImFwcF9pY29uIjoiaHR0cHM6XC9cL2Euc2xhY2stZWRnZS5jb21cLzgwNTg4XC9pbWdcL3NsYWNrX2dyb3dsX2ljb25fdm9ndWUucG5nIn0sInBhZ2VfbmVlZHNfZW50ZXJwcmlzZSI6ZmFsc2UsInBhZ2VfbmVlZHNfY3VzdG9tX2Vtb2ppIjpmYWxzZSwiaXNfZGVwcmVjYXRlZF93ZWJjbGllbnRfYnJvd3NlciI6ZmFsc2UsImlzX3Vuc3VwcG9ydGVkX3dlYmNsaWVudF9icm93c2VyIjp0cnVlLCJkZWZhdWx0X3R6IjoiQW1lcmljYVwvTG9zX0FuZ2VsZXMiLCJmZWF0dXJlX2Rpc3BsYXlfZW1haWxfYWRkcmVzc2VzX3RvX3JhZGlvIjpmYWxzZSwiZmVhdHVyZV9pY29uX2J1dHRvbl9hcmlhX2xhYmVsX2kxOG4iOmZhbHNlLCJmZWF0dXJlX2FsdF9jaGFubmVsc19yZWR1Y2VyIjpmYWxzZSwiZmVhdHVyZV9qc2ZfMTYxOSI6dHJ1ZSwiZmVhdHVyZV9kZXNrdG9wX2xhenlfbG9hZF9lbW9qaSI6ZmFsc2UsImZlYXR1cmVfZWR1Xzg4X2dhIjpmYWxzZSwiZmVhdHVyZV9leHBvcnRfcHJlZl90b19kaXNhYmxlIjpmYWxzZSwiZmVhdHVyZV9hZGRfbWVtYmVyX3N0YXRzX2FwaSI6ZmFsc2UsImZlYXR1cmVfbWVtYmVyX2FuYWx5dGljc19wZXJtaXNzaW9ucyI6ZmFsc2UsImZlYXR1cmVfYnVsa191c2VyX3JlYWN0aXZhdGlvbl9ncmlkIjp0cnVlLCJmZWF0dXJlX2J1aWxkZXJfbXVsdGlzdGVwX2NvbGxhYm9yYXRvcnNfbW9kYWwiOmZhbHNlLCJmZWF0dXJlX2J1aWxkZXJfYWxsb3dfY3VzdG9tX3RpbWVfc2NoZWR1bGVkX3RyaWdnZXIiOnRydWUsImZlYXR1cmVfYnVpbGRlcl9zY2hlZHVsZWRfdHJpZ2dlciI6dHJ1ZSwiZmVhdHVyZV9idWlsZGVyX21lc3NhZ2VfYnV0dG9uX2hlbHBlcl90ZXh0IjpmYWxzZSwiZmVhdHVyZV9idWlsZGVyX2NyZWF0aW9uX29yZ19wb2xpY3kiOnRydWUsImZlYXR1cmVfYnVpbGRlcl9leHRlbnNpb25zIjp0cnVlLCJmZWF0dXJlX2J1aWxkZXJfZXh0ZW5zaW9uX3N0ZXBzX3ByZWYiOnRydWUsImZlYXR1cmVfYnVpbGRlcl9hY2Nlc3NfZXJyb3JfY29udGVudCI6ZmFsc2UsImZlYXR1cmVfYnVpbGRlcl9wYWdpbmF0ZV93b3JrZmxvd3NfbGlzdCI6ZmFsc2UsImZlYXR1cmVfYnVpbGRlcl9zdGVwX2xpYnJhcnkiOnRydWUsImZlYXR1cmVfYnVpbGRlcl90ZWFtX2FwcHNfdHJhbnNsYXRpb25zIjpmYWxzZSwiZmVhdHVyZV9idWlsZGVyX2FwcHNfY29sbGVjdGlvbl9saW5rIjpmYWxzZSwiZmVhdHVyZV9hcHBzX2Nhbl9zdWJtaXRfd2l0aF93b3JrZmxvd19zdGVwcyI6dHJ1ZSwiZmVhdHVyZV9idWlsZGVyX2ZlZWRiYWNrX2J1dHRvbiI6ZmFsc2UsImZlYXR1cmVfYnVpbGRlcl9tZXNzYWdlX3N0ZXBfcmljaF90ZXh0Ijp0cnVlLCJmZWF0dXJlX2NoaW1lX2FjY2Vzc19jaGVjayI6dHJ1ZSwiZmVhdHVyZV9hcHBfdmlld3NfdjEiOnRydWUsImZlYXR1cmVfYXVkaXRfbG9nc192aWV3IjpmYWxzZSwiZmVhdHVyZV9hdWRpdF9sb2dzX3ZpZXdfd29ya3NwYWNlIjpmYWxzZSwiZmVhdHVyZV9vcmdfdGVhbXNfaW5fbG9jYWxfY29uZmlnIjp0cnVlLCJmZWF0dXJlX2RhdGFfbG9jYXRpb25fbmV3X3RyYW5zbGF0aW9ucyI6ZmFsc2UsImZlYXR1cmVfZGVmYXVsdF9icm93c2VyX2NvbnRyb2xfdjIiOnRydWUsImZlYXR1cmVfYWNjZXNzaWJsZV9zZWxlY3RzIjp0cnVlLCJmZWF0dXJlX3NlbGVjdF9vbl90YWIiOnRydWUsImZlYXR1cmVfcHJvbm91bnNfaW5fcHJvZmlsZSI6ZmFsc2UsImZlYXR1cmVfYnVpbGRlcl9kaXNhYmxlX2dsb2JhbF90cmlnZ2VycyI6dHJ1ZSwiZmVhdHVyZV93b3JrZmxvd19idWlsZGVyX2VuYWJsZWRfb3JnX3NldHRpbmciOnRydWUsImZlYXR1cmVfYnVpbGRlcl9jYW5fYWNjZXNzIjpmYWxzZSwiZmVhdHVyZV9hbHdheXNfc2hvd19hcmNoaXZlX2NoYW5uZWxfb3B0aW9uIjp0cnVlLCJmZWF0dXJlX29yZ19kYXNoYm9hcmRfZ2FudHJ5X2FjY2VzcyI6ZmFsc2UsImZlYXR1cmVfb3JnX2Rhc2hfZ2FudHJ5X3JlZGlyZWN0IjpmYWxzZSwiZmVhdHVyZV9pbmZvX2JhcnJpZXJzIjpmYWxzZSwiZmVhdHVyZV9kYXkyX3NoYXJlX21vZGFsIjpmYWxzZSwiZmVhdHVyZV9ncmFudWxhcl9kbmQiOmZhbHNlLCJmZWF0dXJlX2N1c3RvbV9kbmRfdHJhbnNsYXRpb25zIjpmYWxzZSwiZmVhdHVyZV9pbmZvcm1hdGl2ZV9hbm5vdW5jZV9vbmx5X2Zvb3Rlcl90cmFuc2xhdGlvbnMiOmZhbHNlLCJmZWF0dXJlX2NvbnRleHRfYmFyX3R6X2lzc3VlcyI6ZmFsc2UsImZlYXR1cmVfbmV3eHBfNDQwMSI6dHJ1ZSwiZmVhdHVyZV9uZXd4cF80MjgxIjp0cnVlLCJmZWF0dXJlX25ld3hwXzM4NDgiOnRydWUsImZlYXR1cmVfZGF5MV9jb252byI6dHJ1ZSwiZmVhdHVyZV9kYXkxX2NvbWZ5X3NpZGViYXJfY29weSI6ZmFsc2UsImZlYXR1cmVfZGF5MV9jcmVhdG9yX2xhbmRpbmdfY29weSI6ZmFsc2UsImZlYXR1cmVfY2hhbm5lbF9icm93c2VyX2RheTEiOnRydWUsImZlYXR1cmVfYmFubmVyX2FwcF9yZWNzIjp0cnVlLCJmZWF0dXJlX2NvcHlfam9pbmVyX2Zsb3ciOnRydWUsImZlYXR1cmVfYXBwcm92ZWRfb3JncyI6ZmFsc2UsImZlYXR1cmVfbmV3eHBfMzI3OSI6dHJ1ZSwiZmVhdHVyZV9uZXd4cF80MTYwIjp0cnVlLCJmZWF0dXJlX25ld3hwXzQxNTMiOnRydWUsImZlYXR1cmVfbmV3eHBfNDIwMiI6dHJ1ZSwiZmVhdHVyZV9uZXd4cF80MzEzIjpmYWxzZSwiZmVhdHVyZV90aW55c3BlY2siOmZhbHNlLCJmZWF0dXJlX3FyX2NvZGVfaW52aXRlIjpmYWxzZSwiZmVhdHVyZV9nZW5lcmF0ZV9saWdodHdlaWdodF9kbV9saW5rIjpmYWxzZSwiZmVhdHVyZV9jb25uZWN0X2RtX2Vhcmx5X2FjY2VzcyI6dHJ1ZSwiZmVhdHVyZV9zbGFja19jb25uZWN0X2RtX2FjY2VwdF9jb3B5Ijp0cnVlLCJmZWF0dXJlX3NsYWNrX2Nvbm5lY3RfZG1fcHJlZnMiOnRydWUsImZlYXR1cmVfb2x1Z19lc2NfY2hhbm5lbHNfd29yayI6dHJ1ZSwiZmVhdHVyZV9vbHVnX3JlbW92ZV9yZXF1aXJlZF93b3Jrc3BhY2Vfc2V0dGluZyI6ZmFsc2UsImZlYXR1cmVfZGF0YV90YWJsZV9pbl9vcmdfbGV2ZWxfdXNlcl9ncm91cHMiOmZhbHNlLCJmZWF0dXJlX29yZ19zZXR0aW5nc19tMTFuIjpmYWxzZSwiZmVhdHVyZV9kZXByZWNhdGVfZ2V0X21lbWJlcl9ieV9uYW1lIjpmYWxzZSwiZmVhdHVyZV91bmtub3duX2ZpbGVzIjp0cnVlLCJmZWF0dXJlX3Vua25vd25fbWVzc2FnZXMiOnRydWUsImZlYXR1cmVfYWRkX21lc3NhZ2VfcGVyZiI6ZmFsc2UsImZlYXR1cmVfZml4X2N1c3RvbV9lbW9qaV9lcnJvcnMiOnRydWUsImZlYXR1cmVfbW9kZXJuX2RlbGV0ZV9maWxlIjp0cnVlLCJmZWF0dXJlX2NvcHlfY2hhbm5lbF9saW5rIjp0cnVlLCJmZWF0dXJlX2NvbGxhcHNlX3JlYWN0aW9ucyI6ZmFsc2UsImZlYXR1cmVfaWFfc3RhdHVzX2J1dHRvbiI6dHJ1ZSwiZmVhdHVyZV9mdWxsX3Byb2ZpbGVfbGluayI6dHJ1ZSwiZmVhdHVyZV9wcmludF9wZGYiOmZhbHNlLCJmZWF0dXJlX3NhZmFyaTEwX2RlcHJlY2F0aW9uIjp0cnVlLCJmZWF0dXJlX3NhZmFyaTEwX2RlcHJlY2F0aW9uX21vZGFsIjp0cnVlLCJmZWF0dXJlX3NhZmFyaTEwX2RlcHJlY2F0aW9uX2Jsb2NrIjpmYWxzZSwiZmVhdHVyZV9kZXNrdG9wNDYwX2RlcHJlY2F0aW9uIjpmYWxzZSwiZmVhdHVyZV9kZXNrdG9wNDYwX2RlcHJlY2F0aW9uX2Jsb2NrIjpmYWxzZSwiZmVhdHVyZV9lbWFpbF93b3JrZmxvdyI6ZmFsc2UsImZlYXR1cmVfd2lkZXJfcmVhY3Rpb25fdGlwIjpmYWxzZSwiZmVhdHVyZV9maWxlX3BpY2tlcl9zZWFyY2giOmZhbHNlLCJmZWF0dXJlX3NvcnRfYnlfcmVjZW5jeV9wb3N0X3YxIjpmYWxzZSwiZmVhdHVyZV9zZW5kX2ZhaWxlZF90b2FzdCI6ZmFsc2UsImZlYXR1cmVfYXVkaW9fcGxheWVyIjpmYWxzZSwiZmVhdHVyZV9lYWdlcmx5X21hcmtfYnJvYWRjYXN0cyI6ZmFsc2UsImZlYXR1cmVfc2hvd19yZXBsaWVzX2ltbWVkaWF0ZWx5IjpmYWxzZSwiZmVhdHVyZV9jb21wb3Nlcl9lc2NhcGVfaGF0Y2giOmZhbHNlLCJmZWF0dXJlX2NvbXBvc2VyX2VtYWlsX2NsYXNzaWZpY2F0aW9uIjpmYWxzZSwiZmVhdHVyZV9hbWF6b25fYTExeV9jdXN0b21fc3RhdHVzX2Vtb2ppIjp0cnVlLCJmZWF0dXJlX2J5ZV9zbGFja2JvdF9oZWxwIjp0cnVlLCJmZWF0dXJlX2FsbF9kbV9tdXRlX2JvdHMiOnRydWUsImZlYXR1cmVfZmlsZV90aHJlYWRzIjp0cnVlLCJmZWF0dXJlX2Jyb2FkY2FzdF9pbmRpY2F0b3IiOnRydWUsImZlYXR1cmVfbmV3X3JlcGxpZXNfYWZ0ZXJfYmNhc3QiOnRydWUsImZlYXR1cmVfc29uaWNfZW1vamkiOnRydWUsImZlYXR1cmVfZW1vamlfMTIiOmZhbHNlLCJmZWF0dXJlX2VtYWlsX2luZ2VzdGlvbiI6ZmFsc2UsImZlYXR1cmVfYXR0YWNobWVudHNfaW5saW5lIjpmYWxzZSwiZmVhdHVyZV9maXhfZmlsZXMiOnRydWUsImZlYXR1cmVfYWFhX2FkbWluX2FwaXMiOnRydWUsImZlYXR1cmVfcmVtb3ZlX2FjdGlvbnNfZnJvbV9zaWRlYmFyIjpmYWxzZSwiZmVhdHVyZV9zaG9ydGN1dHNfdjJfZWR1Y2F0aW9uIjp0cnVlLCJmZWF0dXJlX3BhZF8xNTM0IjpmYWxzZSwiZmVhdHVyZV9zaG9ydGN1dHNfbWVudV9jbGVhbnVwX2kxOG4iOmZhbHNlLCJmZWF0dXJlX2FwcF9sYXVuY2hlcl9hZGRfaWNvbiI6ZmFsc2UsImZlYXR1cmVfYXBwX2xhdW5jaGVyX2Jhbm5lcnMiOmZhbHNlLCJmZWF0dXJlX2FwcF9sYXVuY2hlcl9zZWFyY2hfcGFnaW5hdGlvbiI6ZmFsc2UsImZlYXR1cmVfY2hhbm5lbF9zaWRlYmFyX2RyYWZ0c19zZWN0aW9uIjp0cnVlLCJmZWF0dXJlX25hdmlnYXRlX2hpc3RvcnkiOnRydWUsImZlYXR1cmVfaTE4bl9kcmFmdHMiOmZhbHNlLCJmZWF0dXJlX2NvbXBvc2VyX3VyYV9tcGRtIjpmYWxzZSwiZmVhdHVyZV9yZWNlbnRfc3RhdHVzX2RlbGV0ZSI6ZmFsc2UsImZlYXR1cmVfY29tcG9zZV9mbG93IjpmYWxzZSwiZmVhdHVyZV9jb21wb3NlX2Zsb3dfeHdzIjp0cnVlLCJmZWF0dXJlX2Zhc3Rlcl9jb3VudF9hbGxfdW5yZWFkcyI6dHJ1ZSwiZmVhdHVyZV9zb25pY191c2VyX2dyb3VwcyI6ZmFsc2UsImZlYXR1cmVfY2hhbm5lbF9zZWxlY3Rvcl9mb3JfdGVhbV9ndWVzdHNfdXBkYXRlIjpmYWxzZSwiZmVhdHVyZV9za19kYXRhX3RhYmxlX2ExMXkiOmZhbHNlLCJmZWF0dXJlX3NrX2RhdGFfdGFibGVfcGlubmVkX3Jvd3NfYW5kX2NvbHVtbnMiOmZhbHNlLCJmZWF0dXJlX2Rlc2t0b3Bfc3ltcHRvbV9ldmVudHMiOmZhbHNlLCJmZWF0dXJlX2RhdGFfcmVzaWRlbmN5X2RlYnVnZ2luZyI6ZmFsc2UsImZlYXR1cmVfbmV3X3N1YnRlYW1fbGlua2VkX2NoYW5uZWxfbGltaXQiOnRydWUsImZlYXR1cmVfc3VidGVhbV91c2VyX2xpbWl0Ijp0cnVlLCJmZWF0dXJlX2VudF9hZG1pbl9hcHByb3ZlZF9hcHBzX3YyIjp0cnVlLCJmZWF0dXJlX2Rhc2hib2FyZF9zb3J0YWJsZV9saXN0cyI6ZmFsc2UsImZlYXR1cmVfc2tfbG9hZGluZ19idXR0b25fbW90aW9ucyI6dHJ1ZSwiZmVhdHVyZV9za19iYXNlX2ljb24iOmZhbHNlLCJmZWF0dXJlX3NrX2Jhc2ljX3NlbGVjdF9hcmlhbGFiZWwiOmZhbHNlLCJmZWF0dXJlX3NrX3JlcXVpcmVkX2FyaWFsYWJlbCI6ZmFsc2UsImZlYXR1cmVfY2VfZW5nX2Nvbm5lY3RfZG1zIjpmYWxzZSwiZmVhdHVyZV9jZV9lbmdfc2VhcmNoX2RlbW8iOmZhbHNlLCJmZWF0dXJlX2NlX2VuZ19oZWxwX3ZpdGVzcyI6ZmFsc2UsImZlYXR1cmVfY2VfZW5nX3ZlcmlmaWVkX3RpY2tldHMiOmZhbHNlLCJmZWF0dXJlX2FwcF9kaXJfcGhvZW5peCI6ZmFsc2UsImZlYXR1cmVfc2hhcmVkX2NoYW5uZWxzX211bHRpX29yZyI6ZmFsc2UsImZlYXR1cmVfc2hhcmVkX2NoYW5uZWxzX211bHRpX29yZ19tcGltIjp0cnVlLCJmZWF0dXJlX3NoYXJlZF9jaGFubmVsc19tdWx0aV9vcmdfbXBpbV9mZSI6dHJ1ZSwiZmVhdHVyZV9jaGF0X21waW1fb3Blbl9yZWZhY3Rvcl9mZV9jb3B5Ijp0cnVlLCJmZWF0dXJlX2ZpbmRfYW5fYWRtaW5fZGlzY29ubmVjdF9leHBsYWluZXIiOmZhbHNlLCJmZWF0dXJlX3NoYXJlZF9jaGFubmVsc19tdWx0aV9vcmdfaW52aXRlc19iZSI6ZmFsc2UsImZlYXR1cmVfbXVsdGlfb3JnX2ludml0ZV91bmZ1cmwiOnRydWUsImZlYXR1cmVfc2hhcmVkX2NoYW5uZWxzX2xlZ2FjeV9yZWNvbm5lY3QiOnRydWUsImZlYXR1cmVfc2hhcmVkX2NoYW5uZWxzX211bHRpX29yZ19xYV9saW1pdF9vdmVycmlkZSI6ZmFsc2UsImZlYXR1cmVfbXVsdGlfd29ya3NwYWNlX3NoYXJlZF9jaGFubmVsc19iZSI6ZmFsc2UsImZlYXR1cmVfbXdzY194d3NfdG9fZXNjIjpmYWxzZSwiZmVhdHVyZV9yZXZva2VfZXNjX2ludml0ZXNfZmUiOmZhbHNlLCJmZWF0dXJlX213c2NfZXNjX3RvX3h3cyI6ZmFsc2UsImZlYXR1cmVfcmVtb3ZlX2RvdWJsZV9yaW5ncyI6ZmFsc2UsImZlYXR1cmVfcmVtb3ZlX2RvdWJsZV9kaWFtb25kcyI6ZmFsc2UsImZlYXR1cmVfY2hhbm5lbHNfdmlld19pbl9tc2MiOmZhbHNlLCJmZWF0dXJlX3NoYXJlZF9jaGFubmVsc19lbW9qaV9kZWxpZ2h0Ijp0cnVlLCJmZWF0dXJlX2NyZWF0ZV9wcml2YXRlX2NfY2hhbm5lbHMiOmZhbHNlLCJmZWF0dXJlX2dkcHJfdXNlcl9qb2luX3RvcyI6dHJ1ZSwiZmVhdHVyZV91c2VyX2ludml0ZV90b3NfYXByaWxfMjAxOCI6dHJ1ZSwiZmVhdHVyZV9ub19tb3JlX2dldF9vcmlnaW5hdGluZ190ZWFtX2ZlIjp0cnVlLCJmZWF0dXJlX3JvbGVzX2FyZV9mcmVzaF9waGFzZV8xIjpmYWxzZSwiZmVhdHVyZV9jaGFubmVsX21nbXRfbWVzc2FnZV9jb3VudCI6ZmFsc2UsImZlYXR1cmVfYW9wc18zMzIwX3JldHVybl91c2VyX2lkc19hbmRfZXJyb3Jfc3RyaW5ncyI6dHJ1ZSwiZmVhdHVyZV9mdW5uZWxfY2FrZSI6ZmFsc2UsImZlYXR1cmVfbmV1ZV90eXBlIjpmYWxzZSwiZmVhdHVyZV9jdXN0X2FjcV9pMThuX3R3ZWFrcyI6ZmFsc2UsImZlYXR1cmVfZXhwb3J0c19jb3B5X3VwZGF0ZXMiOnRydWUsImZlYXR1cmVfd2hpdGVsaXN0X3plbmRlc2tfY2hhdF93aWRnZXQiOmZhbHNlLCJmZWF0dXJlX2NvbW1lbmRhdGlvbnNfc3B5Ijp0cnVlLCJmZWF0dXJlX3h3c19pMThuIjpmYWxzZSwiZmVhdHVyZV91c2VfaW1ncHJveHlfcmVzaXppbmciOnRydWUsImZlYXR1cmVfc2hhcmVfbWVudGlvbl9jb21tZW50X2NsZWFudXAiOmZhbHNlLCJmZWF0dXJlX2JvYXJkc19pMThuIjpmYWxzZSwiZmVhdHVyZV9kaXNhYmxlX2JrX2luX3RocmVhZCI6ZmFsc2UsImZlYXR1cmVfbmV3X2xvY2FsZV90b2FzdCI6dHJ1ZSwiZmVhdHVyZV9jaGFubmVsX2V4cG9ydHMiOmZhbHNlLCJmZWF0dXJlX2RvY3NfbWVudGlvbnNfYW5kX2NoYW5uZWxzIjpmYWxzZSwiZmVhdHVyZV9jYWxsc19zdXJ2ZXlfcmVxdWVzdF9yZXNwb25zZSI6dHJ1ZSwiZmVhdHVyZV90b2tlbl9pcF93aGl0ZWxpc3QiOnRydWUsImZlYXR1cmVfc2lkZWJhcl90aGVtZV91bmRvIjp0cnVlLCJmZWF0dXJlX2FsbG93X2ludHJhX3dvcmRfZm9ybWF0dGluZyI6dHJ1ZSwiZmVhdHVyZV9pMThuX2NoYW5uZWxzX3ZhbGlkYXRlX2Vtb2ppIjp0cnVlLCJmZWF0dXJlX2Z3X2VuZ19ub3JtYWxpemF0aW9uIjp0cnVlLCJmZWF0dXJlX3NsaW1fc2Nyb2xsYmFyIjpmYWxzZSwiZmVhdHVyZV9wcmltYXJ5X3NlYXJjaCI6ZmFsc2UsImZlYXR1cmVfbW9kZXJuX3NvdW5kcyI6ZmFsc2UsImZlYXR1cmVfcXVpY2tfY29weV9jb2RlX2Jsb2NrcyI6dHJ1ZSwiZmVhdHVyZV9zdGVlcGxlX2NodXJjaCI6dHJ1ZSwiZmVhdHVyZV9zdGVlcGxlX2NodXJjaF9saW5rIjp0cnVlLCJmZWF0dXJlX3N0ZWVwbGVfY2h1cmNoX2V4dCI6dHJ1ZSwiZmVhdHVyZV9zdHJvbGxlcnNfdG9fcGVyY2giOnRydWUsImZlYXR1cmVfZmlsZV9icm93c2VyX3YyIjpmYWxzZSwiZmVhdHVyZV9wZW9wbGVfc2VhcmNoIjpmYWxzZSwiZmVhdHVyZV9yZWFjdF9tZXNzYWdlcyI6dHJ1ZSwiZmVhdHVyZV9lZGdlX3VwbG9hZF9wcm94eV9jaGVjayI6ZmFsc2UsImZlYXR1cmVfdW5yZWFkX2NvdW50c19kZWxheSI6dHJ1ZSwiZmVhdHVyZV9sZWdhY3lfZmlsZV91cGxvYWRfYW5hbHl0aWNzIjp0cnVlLCJmZWF0dXJlX21wZG1fbGltaXRfY2hhbm5lbF9jcmVhdGlvbiI6ZmFsc2UsImZlYXR1cmVfc25pcHBldF9tb2Rlc19pMThuIjpmYWxzZSwiZmVhdHVyZV9la21fbWVzc2FnZV9yZXZvY2F0aW9uX3BvbGxpbmdfdGVzdCI6ZmFsc2UsImZlYXR1cmVfdGVhbV9hZG1pbnNfbGlzdF9hcGkiOnRydWUsImZlYXR1cmVfbW92ZWRfZGV0YWlscyI6ZmFsc2UsImZlYXR1cmVfbXNfbGF0ZXN0Ijp0cnVlLCJmZWF0dXJlX2d1ZXN0c191c2VfZW50aXRsZW1lbnRzIjp0cnVlLCJmZWF0dXJlX3Jvb21zX2pvaW5fYXBpIjp0cnVlLCJmZWF0dXJlX3Jvb21zX2pvaW5fdXJsIjpmYWxzZSwiZmVhdHVyZV9jYWxsc19zaXBfaW50ZWdyYXRpb25fbGFiZWxzIjpmYWxzZSwiZmVhdHVyZV90YXNrc192MV9jb3B5IjpmYWxzZSwiZmVhdHVyZV9jYWxsc19jb252ZXJzYXRpb25zIjpmYWxzZSwiZmVhdHVyZV9jdXN0b21fc3RhdHVzX2NhbGVuZGFyX3N5bmNfY29weSI6dHJ1ZSwiZmVhdHVyZV9jdXN0b21fc3RhdHVzX2NhbGVuZGFyX3N5bmMiOmZhbHNlLCJmZWF0dXJlX21hc2tfdW5kb2N1bWVudGVkX2Vycm9ycyI6ZmFsc2UsImZlYXR1cmVfYXBwX2FjdGlvbnNfYWRtaW5fcGFnZXMiOnRydWUsImZlYXR1cmVfYXBwX3ZpZXdzX3JlbWluZGVycyI6dHJ1ZSwiZmVhdHVyZV9yZW1pbmRlcnNfb3JnX3NoYXJkIjpmYWxzZSwiZmVhdHVyZV9yZW1pbmRlcnNfZ3JpZF9taWdyYXRpb25zX29yZ19zaGFyZCI6dHJ1ZSwiZmVhdHVyZV9ibG9ja3NfcmVtaW5kZXJzX2xpc3QiOmZhbHNlLCJmZWF0dXJlX21lc3NhZ2VfYmxvY2tzIjpmYWxzZSwiZmVhdHVyZV9zaWxlbmNlX2FwcF9kbXMiOmZhbHNlLCJmZWF0dXJlX3NldF90el9hdXRvbWF0aWNhbGx5Ijp0cnVlLCJmZWF0dXJlX2NvbmZpcm1fY2xlYXJfYWxsX3VucmVhZHNfcHJlZiI6dHJ1ZSwiZmVhdHVyZV9ibG9ja19tb3VudHMiOnRydWUsImZlYXR1cmVfYXR0YWNobWVudHNfdjIiOnRydWUsImZlYXR1cmVfYmxvY2tfa2l0X2V4cGFuZGFibGVfYmxvY2siOmZhbHNlLCJmZWF0dXJlX2dyb3VwX2Jsb2NrIjpmYWxzZSwiZmVhdHVyZV9ibG9ja19raXRfZGVlcF9saW5rcyI6dHJ1ZSwiZmVhdHVyZV9zaG93X2Jsb2NrX2tpdF9pbl9zaGFyZV9kaWFsb2dzIjpmYWxzZSwiZmVhdHVyZV9ibG9ja19raXRfdXNlcl9ibG9jayI6ZmFsc2UsImZlYXR1cmVfYmxvY2tfa2l0X3JhZGlvX2J1dHRvbnMiOnRydWUsImZlYXR1cmVfbXJrZHduX29uX3JhZGlvX2J1dHRvbiI6dHJ1ZSwiZmVhdHVyZV9ibG9ja19raXRfdGFibGUiOmZhbHNlLCJmZWF0dXJlX2NoZWNrYm94ZXNfcmFkaW9zX2luX21lc3NhZ2VzIjp0cnVlLCJmZWF0dXJlX2lucHV0X2Jsb2NrX3B0aV93ZmJfZGlzcGF0Y2hfYWN0aW9uIjpmYWxzZSwiZmVhdHVyZV9pbnB1dF9ibG9ja3NfZW1pdF9hY3Rpb25zIjp0cnVlLCJmZWF0dXJlX2Jsb2NrX2tpdF9mdWxsX2FjdGlvbnNfc3RhdGUiOnRydWUsImZlYXR1cmVfaW5wdXRfYmxvY2tzX2luX2FwcF9ob21lIjp0cnVlLCJmZWF0dXJlX2lucHV0X2Jsb2Nrc19pbl9tZXNzYWdlcyI6ZmFsc2UsImZlYXR1cmVfYmxvY2tfa2l0X2Z1bGxfdmlld19zdGF0ZSI6dHJ1ZSwiZmVhdHVyZV9ibG9ja19raXRfYWN0aW9uX3NlY3Rpb25faW5fdmlld19zdGF0ZSI6dHJ1ZSwiZmVhdHVyZV9ibG9ja19raXRfc3RhdGVfaW5fYmxvY2tzX2FjdGlvbnMiOnRydWUsImZlYXR1cmVfYmxvY2tfa2l0X2VtcHR5X3N0YXRlX3RyYW5zbGF0aW9uX2Zvcl92aWV3X3N0YXRlIjp0cnVlLCJmZWF0dXJlX211bHRpc2VsZWN0c19pbl9hY3Rpb25zX2Jsb2NrIjpmYWxzZSwiZmVhdHVyZV9ibG9ja19raXRfcmFuZ2VfZGF0ZXBpY2tlciI6ZmFsc2UsImZlYXR1cmVfZGVsZXRlX2FwcF9ob21lc19hc3NvY2lhdGVkX3dpdGhfZGVsZXRlZF9zZXJ2aWNlIjpmYWxzZSwiZmVhdHVyZV9ibG9ja19raXRfdGltZXBpY2tlciI6dHJ1ZSwiZmVhdHVyZV9ibG9ja19raXRfdGltZXBpY2tlcl9yZW1pbmQiOnRydWUsImZlYXR1cmVfYmxvY2tfa2l0X2RhdGVwaWNrZXJfaW5wdXQiOnRydWUsImZlYXR1cmVfYmxvY2tfa2l0X2FwcF9iZXRhIjp0cnVlLCJmZWF0dXJlX2FkZF9hcHBfaG9tZV90ZWFtX25hbWUiOmZhbHNlLCJmZWF0dXJlX2JlYWNvbl9qc19lcnJvcnMiOmZhbHNlLCJmZWF0dXJlX2JlYWNvbl9qc19hZG1pbl9lcnJvcnMiOmZhbHNlLCJmZWF0dXJlX3VzZXJfYXBwX2Rpc2FibGVfc3BlZWRfYnVtcCI6dHJ1ZSwiZmVhdHVyZV90cmFjdG9yX3NoYXJlZF9pbnZpdGVfbGluayI6dHJ1ZSwiZmVhdHVyZV9uZXd4cF8yMTE5Ijp0cnVlLCJmZWF0dXJlX3RyYWN0b3JfYmFja3VwX2NoYW5uZWxuYW1lX2NvcHkiOnRydWUsImZlYXR1cmVfZGVncmFkZWRfcnRtX2Fsd2F5c19mYWlscyI6ZmFsc2UsImZlYXR1cmVfYXBwc19tYW5hZ2VfcGVybWlzc2lvbnNfc2NvcGVfY2hhbmdlcyI6dHJ1ZSwiZmVhdHVyZV9yZW1pbmRlcl9jcm9zc193b3Jrc3BhY2UiOnRydWUsImZlYXR1cmVfcDJwIjpmYWxzZSwiZmVhdHVyZV9jbGFzc2ljX25hdiI6ZmFsc2UsImZlYXR1cmVfbmV3X3JlYWN0aW9ucyI6dHJ1ZSwiZmVhdHVyZV9wYWdlc19leGFtcGxlIjpmYWxzZSwiZmVhdHVyZV9zb25pY19waW5zIjpmYWxzZSwiZmVhdHVyZV9zb25pY192aWRlb19wbGFjZWhvbGRlciI6dHJ1ZSwiZmVhdHVyZV9pYXAxIjpmYWxzZSwiZmVhdHVyZV9pYV9nYSI6dHJ1ZSwiZmVhdHVyZV9pYV9kZWJ1Z19vZmYiOmZhbHNlLCJmZWF0dXJlX2lhX2kxOG4iOnRydWUsImZlYXR1cmVfaWFfdGhlbWVzIjp0cnVlLCJmZWF0dXJlX2lhX21lbWJlcl9wcm9maWxlIjp0cnVlLCJmZWF0dXJlX3dvcmtzcGFjZV9zY2ltX21hbmFnZW1lbnQiOmZhbHNlLCJmZWF0dXJlX3VuaWZpZWRfbWVtYmVyIjpmYWxzZSwiZmVhdHVyZV90dXJuX21wZG1fbm90aWZzX29uIjp0cnVlLCJmZWF0dXJlX2Rlc2t0b3BfcmVsb2FkX29uX2dlbmVyaWNfZXJyb3IiOnRydWUsImZlYXR1cmVfZGVza3RvcF9leHRlbmRfYXBwX21lbnUiOmZhbHNlLCJmZWF0dXJlX2Rlc2t0b3BfcmVzdGFydF9zZXJ2aWNlX3dvcmtlciI6ZmFsc2UsImZlYXR1cmVfZGVza3RvcF9zeXN0ZW1fbm90aWZpY2F0aW9uX3BsYXliYWNrIjpmYWxzZSwiZmVhdHVyZV9hMTF5X2R5c2xleGljIjpmYWxzZSwiZmVhdHVyZV9kb2xvcmVzIjpmYWxzZSwiZmVhdHVyZV9kZXNrdG9wX2ZvcmNlX3Byb2R1Y3Rpb25fY2hhbm5lbCI6ZmFsc2UsImZlYXR1cmVfZGVza3RvcF9sb2dzX3VwbG9hZCI6ZmFsc2UsImZlYXR1cmVfbWFjb3NfZGlzYWJsZV9odyI6dHJ1ZSwiZmVhdHVyZV9hdF9oZXJlX3dhcm5pbmciOmZhbHNlLCJmZWF0dXJlX2JvdHNfbm90X21lbWJlcnMiOnRydWUsImZlYXR1cmVfd3RhX3N0b3BfY3JlYXRpb24iOnRydWUsImZlYXR1cmVfbTExbl9jaGFubmVsX2RldGFpbHMiOmZhbHNlLCJmZWF0dXJlX3BsYXRmb3JtX2RlcHJlY2F0aW9uc19mZSI6dHJ1ZSwiZmVhdHVyZV9jaGFubmVsX2FjdGlvbnMiOnRydWUsImZlYXR1cmVfc2hvcnRjdXRzX3Byb21wdCI6dHJ1ZSwiZmVhdHVyZV9uZXdfY29sb3JfcGlja2VyX3N0cmluZ3MiOmZhbHNlLCJmZWF0dXJlX2FjY2Vzc2libGVfZGlhbG9ncyI6dHJ1ZSwiZmVhdHVyZV9hY2Nlc3NpYmxlX2Vtb2ppX3NraW5fdG9uZV9waWNrZXIiOnRydWUsImZlYXR1cmVfbmV3X3N0cmluZ3NfZm9yX2Jyb3dzZXJfdmlld3MiOmZhbHNlLCJmZWF0dXJlX2NhbGxzX2NsaXBib2FyZF9icm9hZGNhc3Rpbmdfb3B0aW4iOnRydWUsImZlYXR1cmVfc2NyZWVuX3NoYXJlX25lZWRzX2Flcm8iOmZhbHNlLCJmZWF0dXJlX2FjY2Vzc2libGVfZnNfZGlhbG9ncyI6dHJ1ZSwiZmVhdHVyZV9jaGFubmVsX2hlYWRlcl9sYWJlbHMiOmZhbHNlLCJmZWF0dXJlX3RyYXBfa2Jfd2l0aGluX2ZzX21vZGFscyI6dHJ1ZSwiZmVhdHVyZV9tb2Rlcm5faW1hZ2Vfdmlld2VyIjp0cnVlLCJmZWF0dXJlX2Vtb2ppX2J5X2lkIjp0cnVlLCJmZWF0dXJlX21jX21pZ3JhdGlvbl9iYW5uZXIiOnRydWUsImZlYXR1cmVfYXJpYV9hcHBsaWNhdGlvbl9tb2RlIjpmYWxzZSwiZmVhdHVyZV91cGRhdGVfbXVsdGl3b3Jrc3BhY2VfY2hhbm5lbF9tb2RhbCI6dHJ1ZSwiZmVhdHVyZV9tb2Rlcm5fcmVxdWVzdF93b3Jrc3BhY2VfZGlhbG9nIjpmYWxzZSwiZmVhdHVyZV93b3Jrc3BhY2VfYXBwc19tYW5hZ2VfZ2FudHJ5IjpmYWxzZSwiZmVhdHVyZV93b3Jrc3BhY2VfYXBwc19tYW5hZ2VfZ2FudHJ5X3YyX3IxIjp0cnVlLCJmZWF0dXJlX2FwcF9hZG1pbl9idXR0b25zX3NwZWVkYnVtcCI6ZmFsc2UsImZlYXR1cmVfbW9kZXJuX3Byb2ZpbGVfZmxleHBhbmUiOmZhbHNlLCJmZWF0dXJlX3NjZ19jb252ZXJzaW9uX2NoYW5uZWxzIjp0cnVlLCJmZWF0dXJlX2VudGVycHJpc2VfcmV0ZW50aW9uX2FsbG93X292ZXJyaWRlX29uX29yZ19sZXZlbF9jaGFubmVscyI6ZmFsc2UsImZlYXR1cmVfZW50ZXJwcmlzZV9yZXRlbnRpb25fYWRtaW5fcmV0ZW50aW9uX2J5X2NjbSI6ZmFsc2UsImZlYXR1cmVfZXhwb3J0c19maWx0ZXIiOnRydWUsImZlYXR1cmVfdHJhY2tfdGltZV9zcGVudCI6dHJ1ZSwiZmVhdHVyZV9jaGFubmVsX2ludml0ZV90b2tlbml6YXRpb24iOnRydWUsImZlYXR1cmVfaW1wb3J0c19jYW5jZWwiOnRydWUsImZlYXR1cmVfZW1haWxfd29ya29iamVjdF91aSI6ZmFsc2UsImZlYXR1cmVfZW1haWxfbm90aWZ5IjpmYWxzZSwiZmVhdHVyZV9lbWFpbF9mb3JjZV9kb3dubG9hZCI6dHJ1ZSwiZmVhdHVyZV9vZmZpY2VfZGlyZWN0b3J5IjpmYWxzZSwiZmVhdHVyZV9jYWxlbmRhcl9zaW1wbGVfYWdlbmRhX3ZpZXciOmZhbHNlLCJmZWF0dXJlX3RlYW1fdGhlbWVzIjpmYWxzZSwiZmVhdHVyZV91bmZ1cmxfbWV0YWRhdGEiOmZhbHNlLCJmZWF0dXJlX3BhcGVyY2xpcF9jb2FjaG1hcmtfZXhwZXJpbWVudHMiOnRydWUsImZlYXR1cmVfcGx1c19tZW51X2FkZF9hcHBzX2xpbmsiOmZhbHNlLCJmZWF0dXJlX3JlbmFtZV9jaGFubmVsX2Rpc2FibGVfZmVlZGJhY2tfaTE4biI6ZmFsc2UsImZlYXR1cmVfcmVjZW50X2ZpbGVzX29tbmlwaWNrZXIiOmZhbHNlLCJmZWF0dXJlX3JlY2VudF9kZXNrdG9wX2ZpbGVzIjpmYWxzZSwiZmVhdHVyZV9lbWFpbF9maWxlX3VuZnVybF9mb3JtYXQiOnRydWUsImZlYXR1cmVfbGlua19wcm90b2NvbF9iZXRhIjpmYWxzZSwiZmVhdHVyZV9zdHJpcGVfbGlnaHRfbGVnYWN5X3B1cmNoYXNlX21vZGUiOmZhbHNlLCJmZWF0dXJlX2NoZWNrb3V0X2ZvcmNlX2ludG9fbGVnYWN5IjpmYWxzZSwiZmVhdHVyZV9zb25pY19wbGFjZWhvbGRlcl9sYWJlbHMiOmZhbHNlLCJmZWF0dXJlX3NvbmljX2VzY19jcmVhdGlvbiI6ZmFsc2UsImZlYXR1cmVfZGFuZ2Vyb3VzbHlfZ3VhcmRfaWFfdHJhbnNsYXRpb25zIjpmYWxzZSwiZmVhdHVyZV9pYV9jb250ZXh0X21lbnVzIjpmYWxzZSwiZmVhdHVyZV9pYV9sYXlvdXQiOmZhbHNlLCJmZWF0dXJlX21pc2NfaWFfYTExeV90cmFuc2xhdGlvbnMiOmZhbHNlLCJmZWF0dXJlX3RocmVhZGVkX2NhbGxfYmxvY2siOmZhbHNlLCJmZWF0dXJlX2VuYWJsZV9yZWFkX3RpbWVfdmFsaWRhdGlvbnNfZm9yX3Nob3J0Y3V0cyI6ZmFsc2UsImZlYXR1cmVfbWVzc2FnZV9hY3Rpb25zX2luX2FwcF9hY3Rpb25zX2ZyYW1ld29ya19jbGllbnQiOnRydWUsImZlYXR1cmVfbWVzc2FnZV9hY3Rpb25zX2luX2FwcF9hY3Rpb25zX2ZyYW1ld29ya19kZXZlbG9wZXIiOnRydWUsImZlYXR1cmVfc2xhY2tfbWVzc2FnZV9hdHRhY2htZW50X3Rvb2x0aXAiOmZhbHNlLCJmZWF0dXJlX2VudGVycHJpc2VfbW9iaWxlX2RldmljZV9jaGVjayI6dHJ1ZSwiZmVhdHVyZV9uZXd4cF80NDAyIjp0cnVlLCJmZWF0dXJlX3NoYXJlZF9jaGFubmVsc19jdXN0b21fZW1vamlzX3VybCI6ZmFsc2UsImZlYXR1cmVfbmV3X2NvcHlfZm9yX2lkZW50aXR5X2Jhc2ljIjpmYWxzZSwiZmVhdHVyZV9zb25pY19sZWF2ZV93b3Jrc3BhY2VfZGlhbG9nIjpmYWxzZSwiZmVhdHVyZV9zaGFyZWRfY2hhbm5lbHNfbmV3X3VzZXJfdHJpYWwiOnRydWUsImZlYXR1cmVfc2hhcmVkX2NoYW5uZWxzX2ludml0ZXJfdHJpYWwiOmZhbHNlLCJmZWF0dXJlX3NjX2ludml0ZV9qb2luX3BlbmRpbmdfY2hhbm5lbF9hY3Rpb24iOmZhbHNlLCJmZWF0dXJlX3NoYXJlZF9jaGFubmVsc19pbnZpdGVyX3RyaWFsX2JhYnlfdGVhbXMiOmZhbHNlLCJmZWF0dXJlX3NoYXJlZF9jaGFubmVsc19tdWx0aV9lbWFpbF9pbnZpdGUiOnRydWUsImZlYXR1cmVfc2hhcmVkX2NoYW5uZWxzXzkwX2RheV90cmlhbCI6dHJ1ZSwiZmVhdHVyZV9zaGFyZWRfY2hhbm5lbHNfOTBfZGF5X3RyaWFsX2ludml0ZXIiOmZhbHNlLCJmZWF0dXJlX3NoYXJlZF9jaGFubmVsc19oYXBwaWVyX3BhdGhzIjpmYWxzZSwiZmVhdHVyZV9sYXRlX3BheW1lbnRfc3VjY2Vzc19ub3RpZmljYXRpb24iOmZhbHNlLCJmZWF0dXJlX2F1c3RyYWxpYV90YXhfY2hhbmdlX25vdGlmaWNhdGlvbiI6ZmFsc2UsImZlYXR1cmVfc2hhcmVkX2NoYW5uZWxfaW52aXRlc192MiI6dHJ1ZSwiZmVhdHVyZV9iZXR0ZXJfaW52aXRlc19jYWxsX3YyX2FwaSI6dHJ1ZSwiZmVhdHVyZV9zaGFyZWRfY2hhbm5lbHNfaW52aXRlX2NyZWF0ZV9lZHVjYXRpb24iOnRydWUsImZlYXR1cmVfc2hhcmVkX2NoYW5uZWxzX2ludml0ZV9lbWFpbF9ib3VuY2Vfbm90aWZpY2F0aW9uIjp0cnVlLCJmZWF0dXJlX3NoYXJlZF9jaGFubmVsc19pbnZpdGVfZW1haWxfcmVtaW5kZXIiOnRydWUsImZlYXR1cmVfc2hhcmVkX2NoYW5uZWxzX2NvbnRlbnQiOnRydWUsImZlYXR1cmVfc2hhcmVkX2NoYW5uZWxzX3RyaWFsX2VkdSI6dHJ1ZSwiZmVhdHVyZV91c2VyX2ludml0ZV9lbWFpbF9ib3VuY2Vfbm90aWZpY2F0aW9uX3RyYW5zbGF0aW9uIjp0cnVlLCJmZWF0dXJlX3BhaWRfb25ib2FyZGluZ19wYWdldXBkYXRlIjp0cnVlLCJmZWF0dXJlX3RyYWNlX3dlYmFwcF9pbml0Ijp0cnVlLCJmZWF0dXJlX3RyYWNlX2pxX2luaXQiOnRydWUsImZlYXR1cmVfdHJpYWxfZW5kX2wxMG4iOmZhbHNlLCJmZWF0dXJlX3RyaWFsX2VuZGluZ19lbWFpbF91cGRhdGVzIjp0cnVlLCJmZWF0dXJlX3dvcmtzcGFjZV9tZW51X3BsYW5faW5mbyI6dHJ1ZSwiZmVhdHVyZV9wYXJ0bmVyX3Rlcm1zX2kxOG4iOmZhbHNlLCJmZWF0dXJlX3BhcnRuZXJfZmFxX2kxOG4iOnRydWUsImZlYXR1cmVfdHJpYWxfZXhwaXJhdGlvbl9kYXRlX2kxOG4iOmZhbHNlLCJmZWF0dXJlX3N0cmlwZV9jb21wbGV0ZWx5X2Rvd25fYmFubmVyIjpmYWxzZSwiZmVhdHVyZV9mYWlyX2JpbGxpbmdfZGV0YWlsX2ludm9pY2Vfc3RhdGVtZW50cyI6ZmFsc2UsImZlYXR1cmVfY2hlY2tvdXRfemlwX2F1dG9jb21wbGV0ZV90cmFuc2xhdGlvbnMiOnRydWUsImZlYXR1cmVfYmlsbGluZ19tZW1iZXJfZW1haWxfdXBkYXRlcyI6ZmFsc2UsImZlYXR1cmVfZmFpcl9iaWxsaW5nX2JhY2tlbmRfcmVmYWN0b3IiOmZhbHNlLCJmZWF0dXJlX3VhZV90YXhfaWRfY29sbGVjdGlvbiI6dHJ1ZSwiZmVhdHVyZV9jaGlsZV90YXhfaWRfY29sbGVjdGlvbiI6dHJ1ZSwiZmVhdHVyZV9rc2FfdGF4X2lkX2NvbGxlY3Rpb24iOnRydWUsImZlYXR1cmVfaW5kb25lc2lhX3RheF9jaGFuZ2Vfbm90aWZpY2F0aW9uIjpmYWxzZSwiZmVhdHVyZV9pbmRvbmVzaWFfdGF4X2Fzc2Vzc21lbnQiOmZhbHNlLCJmZWF0dXJlX2NhcGl0YWxpemVfc2luZ2xlX2NoYW5uZWxfc3RhdHVzIjpmYWxzZSwiZmVhdHVyZV9lbnRlcnByaXNlX2FuYWx5dGljc18yMDE5X3EzX2VuaGFuY2VtZW50cyI6ZmFsc2UsImZlYXR1cmVfbW9kZXJuaXplX29yZ19kYXNoX2NoYXJ0cyI6dHJ1ZSwiZmVhdHVyZV9tb2Rlcm5pemVfb3JnX3RlYW1fYW5hbHl0aWNzIjpmYWxzZSwiZmVhdHVyZV9tZXNzYWdlc19mcm9tX2FwcHNfYW5hbHl0aWNzIjpmYWxzZSwiZmVhdHVyZV9vcmdfbGV2ZWxfYXBwcyI6ZmFsc2UsImZlYXR1cmVfb3JnX2xldmVsX2FwcHNfY3VzdG9tIjpmYWxzZSwiZmVhdHVyZV9vcmdfbGV2ZWxfYXBwc19hZG1pbl9iZXRhIjpmYWxzZSwiZmVhdHVyZV9zc29fdmFsaWRhdGVfYXVkaWVuY2UiOnRydWUsImZlYXR1cmVfY2hhbm5lbF9zZWN0aW9ucyI6dHJ1ZSwiZmVhdHVyZV9jaGFubmVsX3NlY3Rpb25zX3NpZGViYXJfYmVoYXZpb3JfdWkiOmZhbHNlLCJmZWF0dXJlX2FuYWx5dGljc19zY2ltX2ZpZWxkc19wYWlkIjpmYWxzZSwiZmVhdHVyZV9nb29nbGVfZGlyZWN0b3J5X2ludml0ZXMiOmZhbHNlLCJmZWF0dXJlX21pZ3JhdGVfZ29vZ2xlX2RpcmVjdG9yeV9hcGlzIjp0cnVlLCJmZWF0dXJlX3NlYXJjaF9yZXN1bHRzX3ZpcnR1YWxpemVkIjpmYWxzZSwiZmVhdHVyZV9zaG93X2VtYWlsX2ZvcndhcmRlZF9ieSI6ZmFsc2UsImZlYXR1cmVfbmV3X2Vub3VnaF9wZXJpb2RpY19yZWxvYWRzIjpmYWxzZSwiZmVhdHVyZV9idWlsZGVyX3dvcmtmbG93X2FjdGl2aXR5Ijp0cnVlLCJmZWF0dXJlX2J1aWxkZXJfZXhwb3J0X2Zvcm1fY3N2X2FkbWluIjp0cnVlLCJmZWF0dXJlX2hlYWRlcl9ibG9jayI6dHJ1ZSwiZmVhdHVyZV9oZWFkZXJfYmxvY2tfYmtiIjp0cnVlLCJmZWF0dXJlX3JhdGVfbGltaXRfYXBwX2NyZWF0aW9uIjp0cnVlLCJmZWF0dXJlX2dpcGh5X3Nob3J0Y3V0IjpmYWxzZSwiZmVhdHVyZV9kb3dubG9hZF9maW5kZXJfdXBkYXRlIjp0cnVlLCJmZWF0dXJlX3NoYXJlX21vZGFsX2RpYWxvZyI6ZmFsc2UsImZlYXR1cmVfb25lZHJpdmVfZXJyb3JfdHJhbnNsYXRpb25zIjp0cnVlLCJmZWF0dXJlX3B1dF9hX21lbnRpb25fb25faXQiOnRydWUsImZlYXR1cmVfYnJvd3Nlcl9waWNrZXIiOnRydWUsImZlYXR1cmVfZWR1XzEwMSI6dHJ1ZSwiZmVhdHVyZV9uZXd4cF80Njg4Ijp0cnVlLCJmZWF0dXJlX2FwcF9kaXJfZ3Jhbl9ib3Rfc3VibWl0Ijp0cnVlLCJmZWF0dXJlX2FwcF9kaXJfd29ya2Zsb3dfc3RlcHMiOnRydWUsImZlYXR1cmVfYXBwX2Rpcl93b3JrZmxvd19zdGVwc19jYXJvdXNlbCI6ZmFsc2UsImZlYXR1cmVfYXBwX2Rpcl93b3JrZmxvd19zdGVwc19wcm9tbyI6ZmFsc2UsImZlYXR1cmVfYXBwX2xpc3RpbmdfcmVmcmVzaCI6dHJ1ZSwiZmVhdHVyZV9hcHBfbGlzdGluZ19yZWZyZXNoX3Njb3BlcyI6dHJ1ZSwiZmVhdHVyZV9hcHBfbGlzdGluZ19yZWZyZXNoX3B0XzIiOmZhbHNlLCJmZWF0dXJlX2hjX3VwZGF0ZWRfdGl0bGUiOmZhbHNlLCJmZWF0dXJlX3BhcnNlY19tZXRob2RzIjpmYWxzZSwiZmVhdHVyZV9zb3VsX3NlYXJjaGVycyI6ZmFsc2UsImZlYXR1cmVfc25kX3F1ZXJ5X3JlZmluZW1lbnRzIjp0cnVlLCJmZWF0dXJlX2VtYWlsX2NsYXNzaWZpY2F0aW9uIjp0cnVlLCJmZWF0dXJlX3ByaW1hcnlfb3duZXJfY29uc2lzdGVudF9yb2xlcyI6dHJ1ZSwiZmVhdHVyZV9pbnZpdGVfdG9fY2hhbm5lbF9ieV9lbWFpbF91aSI6dHJ1ZSwiZmVhdHVyZV9lZHVfMTEwIjp0cnVlLCJmZWF0dXJlX3Npd3NfbGlua3MiOmZhbHNlLCJmZWF0dXJlX2xvY2FsZV9pdF9JVCI6ZmFsc2UsImZlYXR1cmVfbG9jYWxlX2tvX0tSIjpmYWxzZSwiZmVhdHVyZV9sb2NhbGVfcnVfUlUiOmZhbHNlLCJmZWF0dXJlX2xvY2FsZV96aF9DTiI6ZmFsc2UsImZlYXR1cmVfbG9jYWxlX3poX1RXIjpmYWxzZSwiZmVhdHVyZV9zZWFyY2hfZmlsdGVyX2ZpbGVfYXR0YWNobWVudHMiOmZhbHNlLCJmZWF0dXJlX21wZG1fYXVkaWVuY2VfZXhwYW5zaW9uIjp0cnVlLCJmZWF0dXJlX3JvYnVzdF9nZXRfZm9ybV9kYXRhIjp0cnVlLCJmZWF0dXJlX25ld3hwXzQzMTIiOmZhbHNlLCJmZWF0dXJlX2NlX2VuZ19zZWFyY2hfemVuZGVza19hcGkiOmZhbHNlLCJmZWF0dXJlX2JrX2Vycm9yX21lc3NhZ2luZyI6dHJ1ZSwiZmVhdHVyZV9sYXJnZV9lbW9qaV9pbl90b29sdGlwIjp0cnVlLCJmZWF0dXJlX25ld3hwXzM3OTUiOmZhbHNlLCJmZWF0dXJlX25ld19ub3RpZmljYXRpb25zX3N0cmluZyI6ZmFsc2UsImZlYXR1cmVfYXBwc19ldmVudF9hdXRob3JpemF0aW9uc19saXN0X2VuZHBvaW50X2E3ZTUxZiI6dHJ1ZSwiZmVhdHVyZV9ndWFyZF9jaGFubmVsX2RldGFpbHNfdHJhbnNsYXRpb25zIjpmYWxzZSwiZmVhdHVyZV9zYV9ub3RpZl9lbmhhbmNlbWVudHMiOnRydWUsImZlYXR1cmVfdmVyaWZpZWRfb3Jnc19mZSI6ZmFsc2UsImZlYXR1cmVfcmVmaW5lX3lvdXJfc2VhcmNoX2kxOG4iOnRydWUsImZlYXR1cmVfbmV3eHBfNDU5NyI6dHJ1ZSwiZmVhdHVyZV9maWxlX2FjdGlvbnNfZml4IjpmYWxzZSwiZmVhdHVyZV9pbmxpbmVfZmVlZGJhY2siOmZhbHNlLCJmZWF0dXJlX2VkdV8xODIiOnRydWUsImZlYXR1cmVfY3JlZGl0X2Jhbm5lcl9iYXNpY190cmFuc2xhdGlvbnMiOmZhbHNlLCJmZWF0dXJlX2lkcl9iYWNrZmlsbHMiOmZhbHNlLCJmZWF0dXJlX2VkdV8xODciOnRydWUsImZlYXR1cmVfYWRkX3RvX2NoYW5uZWxfcHJvdG90eXBlIjpmYWxzZSwiZmVhdHVyZV9zdHJpcGVfaGFja19taWdyYXRpb24iOmZhbHNlLCJmZWF0dXJlX3BhaWRfYmVuZWZpdHNfYWxlcnRfdHJhbnNsYXRpb25zIjp0cnVlLCJmZWF0dXJlX3BsYW5fYmVuZWZpdHNfZGF5X29uZV90cmlhbF9oZWFkZXJfdXBkYXRlX2kxOG4iOnRydWUsImZlYXR1cmVfdHJpYWxfYXdhcmVuZXNzX3RyYW5zbGF0aW9ucyI6dHJ1ZSwiZmVhdHVyZV9jYWxsc19sb2NhdGlvbl93YXJuaW5nX3RyYW5zbGF0aW9ucyI6ZmFsc2UsImZlYXR1cmVfZXNjX3dob19jYW5fcmVxdWVzdF9wcmVmIjpmYWxzZSwiZmVhdHVyZV9zaWRlYmFyX3RyaWFsX2JhZGdlX3RyYW5zbGF0aW9ucyI6ZmFsc2UsImNsaWVudF9sb2dzIjp7IjAiOnsibnVtYmVycyI6WyIwIl0sInVzZXJfZmFjaW5nIjpmYWxzZX0sIjIiOnsibnVtYmVycyI6WyIyIl0sInVzZXJfZmFjaW5nIjpmYWxzZX0sIjQiOnsibnVtYmVycyI6WyI0Il0sInVzZXJfZmFjaW5nIjpmYWxzZX0sIjUiOnsibnVtYmVycyI6WyI1Il0sInVzZXJfZmFjaW5nIjpmYWxzZX0sIjIzIjp7Im51bWJlcnMiOlsiMjMiXSwidXNlcl9mYWNpbmciOmZhbHNlfSwic291bmRzIjp7Im5hbWUiOiJzb3VuZHMiLCJudW1iZXJzIjpbIjM3Il19LCIzNyI6eyJuYW1lIjoic291bmRzIiwibnVtYmVycyI6WyIzNyJdLCJ1c2VyX2ZhY2luZyI6dHJ1ZX0sIjQ3Ijp7Im51bWJlcnMiOlsiNDciXSwidXNlcl9mYWNpbmciOmZhbHNlfSwiNDgiOnsibnVtYmVycyI6WyI0OCJdLCJ1c2VyX2ZhY2luZyI6ZmFsc2V9LCJNZXNzYWdlIEhpc3RvcnkiOnsibmFtZSI6Ik1lc3NhZ2UgSGlzdG9yeSIsIm51bWJlcnMiOlsiNTgiXX0sIjU4Ijp7Im5hbWUiOiJNZXNzYWdlIEhpc3RvcnkiLCJudW1iZXJzIjpbIjU4Il0sInVzZXJfZmFjaW5nIjp0cnVlfSwiNjciOnsibnVtYmVycyI6WyI2NyJdLCJ1c2VyX2ZhY2luZyI6ZmFsc2V9LCI3MiI6eyJudW1iZXJzIjpbIjcyIl0sInVzZXJfZmFjaW5nIjpmYWxzZX0sIjczIjp7Im51bWJlcnMiOlsiNzMiXSwidXNlcl9mYWNpbmciOmZhbHNlfSwiODIiOnsibnVtYmVycyI6WyI4MiJdLCJ1c2VyX2ZhY2luZyI6ZmFsc2V9LCI4OCI6eyJudW1iZXJzIjpbIjg4Il0sInVzZXJfZmFjaW5nIjpmYWxzZX0sIjkxIjp7Im51bWJlcnMiOlsiOTEiXSwidXNlcl9mYWNpbmciOmZhbHNlfSwiOTMiOnsibnVtYmVycyI6WyI5MyJdLCJ1c2VyX2ZhY2luZyI6ZmFsc2V9LCI5NiI6eyJudW1iZXJzIjpbIjk2Il0sInVzZXJfZmFjaW5nIjpmYWxzZX0sIjk5Ijp7Im51bWJlcnMiOlsiOTkiXSwidXNlcl9mYWNpbmciOmZhbHNlfSwiQ2hhbm5lbCBNYXJraW5nIChNUykiOnsibmFtZSI6IkNoYW5uZWwgTWFya2luZyAoTVMpIiwibnVtYmVycyI6WyIxNDEiXX0sIjE0MSI6eyJuYW1lIjoiQ2hhbm5lbCBNYXJraW5nIChNUykiLCJudW1iZXJzIjpbIjE0MSJdLCJ1c2VyX2ZhY2luZyI6dHJ1ZX0sIkNoYW5uZWwgTWFya2luZyAoQ2xpZW50KSI6eyJuYW1lIjoiQ2hhbm5lbCBNYXJraW5nIChDbGllbnQpIiwibnVtYmVycyI6WyIxNDIiXX0sIjE0MiI6eyJuYW1lIjoiQ2hhbm5lbCBNYXJraW5nIChDbGllbnQpIiwibnVtYmVycyI6WyIxNDIiXSwidXNlcl9mYWNpbmciOnRydWV9LCJDbG9zZSBPbGQgSU1zIChDbGllbnQpIjp7Im5hbWUiOiJDbG9zZSBPbGQgSU1zIChDbGllbnQpIiwibnVtYmVycyI6WyIyMjEiXX0sIjIyMSI6eyJuYW1lIjoiQ2xvc2UgT2xkIElNcyAoQ2xpZW50KSIsIm51bWJlcnMiOlsiMjIxIl0sInVzZXJfZmFjaW5nIjp0cnVlfSwiMzY1Ijp7Im51bWJlcnMiOlsiMzY1Il0sInVzZXJfZmFjaW5nIjpmYWxzZX0sIjM4OSI6eyJudW1iZXJzIjpbIjM4OSJdLCJ1c2VyX2ZhY2luZyI6ZmFsc2V9LCI0MzgiOnsibnVtYmVycyI6WyI0MzgiXSwidXNlcl9mYWNpbmciOmZhbHNlfSwiNDQ0Ijp7Im51bWJlcnMiOlsiNDQ0Il0sInVzZXJfZmFjaW5nIjpmYWxzZX0sIjQ4MSI6eyJudW1iZXJzIjpbIjQ4MSJdLCJ1c2VyX2ZhY2luZyI6ZmFsc2V9LCI0ODgiOnsibnVtYmVycyI6WyI0ODgiXSwidXNlcl9mYWNpbmciOmZhbHNlfSwiNTI5Ijp7Im51bWJlcnMiOlsiNTI5Il0sInVzZXJfZmFjaW5nIjpmYWxzZX0sIjU1MiI6eyJudW1iZXJzIjpbIjU1MiJdLCJ1c2VyX2ZhY2luZyI6ZmFsc2V9LCJkYXNoYm9hcmQiOnsibmFtZSI6ImRhc2hib2FyZCIsIm51bWJlcnMiOlsiNjY2Il19LCI2NjYiOnsibmFtZSI6ImRhc2hib2FyZCIsIm51bWJlcnMiOlsiNjY2Il0sInVzZXJfZmFjaW5nIjpmYWxzZX0sIjY2NyI6eyJudW1iZXJzIjpbIjY2NyJdLCJ1c2VyX2ZhY2luZyI6ZmFsc2V9LCI3NzMiOnsibnVtYmVycyI6WyI3NzMiXSwidXNlcl9mYWNpbmciOmZhbHNlfSwiNzc3Ijp7Im51bWJlcnMiOlsiNzc3Il0sInVzZXJfZmFjaW5nIjpmYWxzZX0sIjc5NCI6eyJudW1iZXJzIjpbIjc5NCJdLCJ1c2VyX2ZhY2luZyI6ZmFsc2V9LCJDbGllbnQgUmVzcG9uc2l2ZW5lc3MiOnsibmFtZSI6IkNsaWVudCBSZXNwb25zaXZlbmVzcyIsInVzZXJfZmFjaW5nIjpmYWxzZSwibnVtYmVycyI6WyI4MDgiXX0sIjgwOCI6eyJuYW1lIjoiQ2xpZW50IFJlc3BvbnNpdmVuZXNzIiwidXNlcl9mYWNpbmciOmZhbHNlLCJudW1iZXJzIjpbIjgwOCJdfSwiTWVzc2FnZSBQYW5lIFNjcm9sbGluZyI6eyJuYW1lIjoiTWVzc2FnZSBQYW5lIFNjcm9sbGluZyIsIm51bWJlcnMiOlsiODg4Il19LCI4ODgiOnsibmFtZSI6Ik1lc3NhZ2UgUGFuZSBTY3JvbGxpbmciLCJudW1iZXJzIjpbIjg4OCJdLCJ1c2VyX2ZhY2luZyI6dHJ1ZX0sIlVucmVhZCBiYW5uZXIgYW5kIGRpdmlkZXIiOnsibmFtZSI6IlVucmVhZCBiYW5uZXIgYW5kIGRpdmlkZXIiLCJudW1iZXJzIjpbIjk5OSJdfSwiOTk5Ijp7Im5hbWUiOiJVbnJlYWQgYmFubmVyIGFuZCBkaXZpZGVyIiwibnVtYmVycyI6WyI5OTkiXSwidXNlcl9mYWNpbmciOnRydWV9LCIxMDAwIjp7Im51bWJlcnMiOlsiMTAwMCJdLCJ1c2VyX2ZhY2luZyI6ZmFsc2V9LCJEdXBsaWNhdGUgYmFkZ2VzIChkZXNrdG9wIGFwcCBpY29ucykiOnsibmFtZSI6IkR1cGxpY2F0ZSBiYWRnZXMgKGRlc2t0b3AgYXBwIGljb25zKSIsIm51bWJlcnMiOlsiMTcwMSJdfSwiMTcwMSI6eyJuYW1lIjoiRHVwbGljYXRlIGJhZGdlcyAoZGVza3RvcCBhcHAgaWNvbnMpIiwibnVtYmVycyI6WyIxNzAxIl0sInVzZXJfZmFjaW5nIjp0cnVlfSwiTWVtYmVycyI6eyJuYW1lIjoiTWVtYmVycyIsIm51bWJlcnMiOlsiMTk3NSJdfSwiMTk3NSI6eyJuYW1lIjoiTWVtYmVycyIsIm51bWJlcnMiOlsiMTk3NSJdLCJ1c2VyX2ZhY2luZyI6dHJ1ZX0sImxhenkgbG9hZGluZyI6eyJuYW1lIjoibGF6eSBsb2FkaW5nIiwibnVtYmVycyI6WyIxOTg5Il19LCIxOTg5Ijp7Im5hbWUiOiJsYXp5IGxvYWRpbmciLCJudW1iZXJzIjpbIjE5ODkiXSwidXNlcl9mYWNpbmciOnRydWV9LCJ0aGluX2NoYW5uZWxfbWVtYmVyc2hpcCI6eyJuYW1lIjoidGhpbl9jaGFubmVsX21lbWJlcnNoaXAiLCJudW1iZXJzIjpbIjE5OTAiXX0sIjE5OTAiOnsibmFtZSI6InRoaW5fY2hhbm5lbF9tZW1iZXJzaGlwIiwibnVtYmVycyI6WyIxOTkwIl0sInVzZXJfZmFjaW5nIjp0cnVlfSwic3RhdHMiOnsibmFtZSI6InN0YXRzIiwibnVtYmVycyI6WyIxOTkxIl19LCIxOTkxIjp7Im5hbWUiOiJzdGF0cyIsIm51bWJlcnMiOlsiMTk5MSJdLCJ1c2VyX2ZhY2luZyI6dHJ1ZX0sIm1zIjp7Im5hbWUiOiJtcyIsIm51bWJlcnMiOlsiMTk5NiJdfSwiMTk5NiI6eyJuYW1lIjoibXMiLCJudW1iZXJzIjpbIjE5OTYiXSwidXNlcl9mYWNpbmciOnRydWV9LCJzaGFyZWRfY2hhbm5lbHNfY29ubmVjdGlvbiI6eyJuYW1lIjoic2hhcmVkX2NoYW5uZWxzX2Nvbm5lY3Rpb24iLCJudW1iZXJzIjpbIjE5OTkiXX0sIjE5OTkiOnsibmFtZSI6InNoYXJlZF9jaGFubmVsc19jb25uZWN0aW9uIiwibnVtYmVycyI6WyIxOTk5Il0sInVzZXJfZmFjaW5nIjpmYWxzZX0sImRuZCI6eyJuYW1lIjoiZG5kIiwibnVtYmVycyI6WyIyMDAyIl19LCIyMDAyIjp7Im5hbWUiOiJkbmQiLCJudW1iZXJzIjpbIjIwMDIiXSwidXNlcl9mYWNpbmciOnRydWV9LCIyMDAzIjp7Im51bWJlcnMiOlsiMjAwMyJdLCJ1c2VyX2ZhY2luZyI6ZmFsc2V9LCJUaHJlYWRzIjp7Im5hbWUiOiJUaHJlYWRzIiwibnVtYmVycyI6WyIyMDA0Il19LCIyMDA0Ijp7Im5hbWUiOiJUaHJlYWRzIiwibnVtYmVycyI6WyIyMDA0Il0sInVzZXJfZmFjaW5nIjp0cnVlfSwiMjAwNSI6eyJudW1iZXJzIjpbIjIwMDUiXSwidXNlcl9mYWNpbmciOmZhbHNlfSwiUmVhY3Rpb25zIjp7Im5hbWUiOiJSZWFjdGlvbnMiLCJudW1iZXJzIjpbIjIwMDYiXX0sIjIwMDYiOnsibmFtZSI6IlJlYWN0aW9ucyIsIm51bWJlcnMiOlsiMjAwNiJdLCJ1c2VyX2ZhY2luZyI6dHJ1ZX0sIlRTU1NCLmZvY3VzVGFiQW5kU3dpdGNoVG9DaGFubmVsIjp7Im5hbWUiOiJUU1NTQi5mb2N1c1RhYkFuZFN3aXRjaFRvQ2hhbm5lbCIsIm51bWJlcnMiOlsiMjAwNyJdfSwiMjAwNyI6eyJuYW1lIjoiVFNTU0IuZm9jdXNUYWJBbmRTd2l0Y2hUb0NoYW5uZWwiLCJudW1iZXJzIjpbIjIwMDciXSwidXNlcl9mYWNpbmciOmZhbHNlfSwiUHJlc2VuY2UgRGV0ZWN0aW9uIjp7Im5hbWUiOiJQcmVzZW5jZSBEZXRlY3Rpb24iLCJudW1iZXJzIjpbIjIwMTciXX0sIjIwMTciOnsibmFtZSI6IlByZXNlbmNlIERldGVjdGlvbiIsIm51bWJlcnMiOlsiMjAxNyJdLCJ1c2VyX2ZhY2luZyI6dHJ1ZX0sIm1jX3NpYnMiOnsibmFtZSI6Im1jX3NpYnMiLCJudW1iZXJzIjpbIjk5OTkiXX0sIjk5OTkiOnsibmFtZSI6Im1jX3NpYnMiLCJudW1iZXJzIjpbIjk5OTkiXSwidXNlcl9mYWNpbmciOmZhbHNlfSwiTWVtYmVyIHNlYXJjaGluZyI6eyJuYW1lIjoiTWVtYmVyIHNlYXJjaGluZyIsIm51bWJlcnMiOlsiOTAyMTEiXX0sIjkwMjExIjp7Im5hbWUiOiJNZW1iZXIgc2VhcmNoaW5nIiwibnVtYmVycyI6WyI5MDIxMSJdLCJ1c2VyX2ZhY2luZyI6dHJ1ZX0sIjk4NzY1Ijp7Im51bWJlcnMiOlsiOTg3NjUiXSwidXNlcl9mYWNpbmciOmZhbHNlfSwiODY3NTMwOSI6eyJudW1iZXJzIjpbIjg2NzUzMDkiXSwidXNlcl9mYWNpbmciOmZhbHNlfX19OwoJYm9vdF9kYXRhLnN0YXJ0X21zID0gRGF0ZS5ub3coKTsKPC9zY3JpcHQ+PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPnZhciBUU19sYXN0X2xvZ19kYXRlID0gbnVsbDsKdmFyIFRTTWFrZUxvZ0RhdGUgPSBmdW5jdGlvbigpIHsKCXZhciBkYXRlID0gbmV3IERhdGUoKTsKCgl2YXIgeSA9IGRhdGUuZ2V0RnVsbFllYXIoKTsKCXZhciBtbyA9IGRhdGUuZ2V0TW9udGgoKSsxOwoJdmFyIGQgPSBkYXRlLmdldERhdGUoKTsKCgl2YXIgdGltZSA9IHsKCSAgaDogZGF0ZS5nZXRIb3VycygpLAoJICBtaTogZGF0ZS5nZXRNaW51dGVzKCksCgkgIHM6IGRhdGUuZ2V0U2Vjb25kcygpLAoJICBtczogZGF0ZS5nZXRNaWxsaXNlY29uZHMoKQoJfTsKCglPYmplY3Qua2V5cyh0aW1lKS5tYXAoZnVuY3Rpb24obW9tZW50LCBpbmRleCkgewoJCWlmIChtb21lbnQgPT0gJ21zJykgewoJCQlpZiAodGltZVttb21lbnRdIDwgMTApIHsKCQkJCXRpbWVbbW9tZW50XSA9IHRpbWVbbW9tZW50XSsnMDAnOwoJCQl9IGVsc2UgaWYgKHRpbWVbbW9tZW50XSA8IDEwMCkgewoJCQkJdGltZVttb21lbnRdID0gdGltZVttb21lbnRdKycwJzsKCQkJfQoJCX0gZWxzZSBpZiAodGltZVttb21lbnRdIDwgMTApIHsKCQkJdGltZVttb21lbnRdID0gJzAnICsgdGltZVttb21lbnRdOwoJCX0KCX0pOwoKCXZhciBzdHIgPSB5ICsgJy8nICsgbW8gKyAnLycgKyBkICsgJyAnICsgdGltZS5oICsgJzonICsgdGltZS5taSArICc6JyArIHRpbWUucyArICcuJyArIHRpbWUubXM7CglpZiAoVFNfbGFzdF9sb2dfZGF0ZSkgewoJCXZhciBkaWZmID0gZGF0ZS1UU19sYXN0X2xvZ19kYXRlOwoJCS8vc3RyKz0gJyAoJytkaWZmKydtcyknOwoJfQoJVFNfbGFzdF9sb2dfZGF0ZSA9IGRhdGU7CglyZXR1cm4gc3RyKycgJzsKfQoKdmFyIHBhcnNlRGVlcExpbmtSZXF1ZXN0ID0gZnVuY3Rpb24oY29kZSkgewoJdmFyIG0gPSBjb2RlLm1hdGNoKC8iaWQiOiIoW0NER11bQS1aMC05XXs4LH0pIi8pOwoJdmFyIGlkID0gbSA/IG1bMV0gOiBudWxsOwoKCW0gPSBjb2RlLm1hdGNoKC8idGVhbSI6IihUW0EtWjAtOV17OCx9KSIvKTsKCXZhciB0ZWFtID0gbSA/IG1bMV0gOiBudWxsOwoKCW0gPSBjb2RlLm1hdGNoKC8ibWVzc2FnZSI6IihbMC05XStcLlswLTldKykiLyk7Cgl2YXIgbWVzc2FnZSA9IG0gPyBtWzFdIDogbnVsbDsKCglyZXR1cm4geyBpZDogaWQsIHRlYW06IHRlYW0sIG1lc3NhZ2U6IG1lc3NhZ2UgfTsKfQoKaWYgKCdyZW5kZXJlckV2YWxBc3luYycgaW4gd2luZG93KSB7Cgl2YXIgb3JpZ1JlbmRlcmVyRXZhbEFzeW5jID0gd2luZG93LnJlbmRlcmVyRXZhbEFzeW5jOwoJd2luZG93LnJlbmRlcmVyRXZhbEFzeW5jID0gZnVuY3Rpb24oYmxvYikgewoJCXRyeSB7CgkJCXZhciBkYXRhID0gSlNPTi5wYXJzZShkZWNvZGVVUklDb21wb25lbnQoYXRvYihibG9iKSkpOwoJCQlpZiAoZGF0YS5jb2RlLm1hdGNoKC9oYW5kbGVEZWVwTGluay8pKSB7CgkJCQl2YXIgcmVxdWVzdCA9IHBhcnNlRGVlcExpbmtSZXF1ZXN0KGRhdGEuY29kZSk7CgkJCQlpZiAoIXJlcXVlc3QuaWQgfHwgIXJlcXVlc3QudGVhbSB8fCAhcmVxdWVzdC5tZXNzYWdlKSByZXR1cm47CgoJCQkJcmVxdWVzdC5jbWQgPSAnY2hhbm5lbCc7CgkJCQlUU1NTQi5oYW5kbGVEZWVwTGlua1dpdGhBcmdzKEpTT04uc3RyaW5naWZ5KHJlcXVlc3QpKTsKCQkJCXJldHVybjsKCQkJfSBlbHNlIHsKCQkJCW9yaWdSZW5kZXJlckV2YWxBc3luYyhibG9iKTsKCQkJfQoJCX0gY2F0Y2ggKGUpIHsKCQl9Cgl9Cn08L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+dmFyIFRTU1NCID0gewoJY2FsbDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQp9Ozwvc2NyaXB0PjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vYS5zbGFjay1lZGdlLmNvbS9idjEtOC9yb2xsdXAtY29yZV9yZXF1aXJlZF9saWJzLjFkZWI3N2Y0N2NkNTIxZjJjYTI1Lm1pbi5qcyIgb25sb2FkPSJ3aW5kb3cuX2NkbiA/IF9jZG4ub2sodGhpcywgYXJndW1lbnRzKSA6IG51bGwiIG9uZXJyb3I9IndpbmRvdy5fY2RuID8gX2Nkbi5mYWlsZWQodGhpcywgYXJndW1lbnRzKSA6IG51bGwiIGNyb3Nzb3JpZ2luPSJhbm9ueW1vdXMiPjwvc2NyaXB0PjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vYS5zbGFjay1lZGdlLmNvbS9idjEtOC9tb2Rlcm4udmVuZG9yLjQ5ZGM1ZWZhNWE1YTNiYTg5YmRjLm1pbi5qcyIgb25sb2FkPSJ3aW5kb3cuX2NkbiA/IF9jZG4ub2sodGhpcywgYXJndW1lbnRzKSA6IG51bGwiIG9uZXJyb3I9IndpbmRvdy5fY2RuID8gX2Nkbi5mYWlsZWQodGhpcywgYXJndW1lbnRzKSA6IG51bGwiIGNyb3Nzb3JpZ2luPSJhbm9ueW1vdXMiPjwvc2NyaXB0PjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vYS5zbGFjay1lZGdlLmNvbS9idjEtOC9hcHBsaWNhdGlvbi4xYWY4ZWU3MDdlNTA2NTkxZDI0Mi5taW4uanMiIG9ubG9hZD0id2luZG93Ll9jZG4gPyBfY2RuLm9rKHRoaXMsIGFyZ3VtZW50cykgOiBudWxsIiBvbmVycm9yPSJ3aW5kb3cuX2NkbiA/IF9jZG4uZmFpbGVkKHRoaXMsIGFyZ3VtZW50cykgOiBudWxsIiBjcm9zc29yaWdpbj0iYW5vbnltb3VzIj48L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL2Euc2xhY2stZWRnZS5jb20vYnYxLTgvcm9sbHVwLWNvcmVfcmVxdWlyZWRfdHMuODhkMTFkODRhZGQyZTI2MGQwNjIubWluLmpzIiBvbmxvYWQ9IndpbmRvdy5fY2RuID8gX2Nkbi5vayh0aGlzLCBhcmd1bWVudHMpIDogbnVsbCIgb25lcnJvcj0id2luZG93Ll9jZG4gPyBfY2RuLmZhaWxlZCh0aGlzLCBhcmd1bWVudHMpIDogbnVsbCIgY3Jvc3NvcmlnaW49ImFub255bW91cyI+PC9zY3JpcHQ+PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tL2J2MS04L3JvbGx1cC1jb3JlX3dlYi5mYzhmYTEwMmI1MTM4NGQ3NDAwMy5taW4uanMiIG9ubG9hZD0id2luZG93Ll9jZG4gPyBfY2RuLm9rKHRoaXMsIGFyZ3VtZW50cykgOiBudWxsIiBvbmVycm9yPSJ3aW5kb3cuX2NkbiA/IF9jZG4uZmFpbGVkKHRoaXMsIGFyZ3VtZW50cykgOiBudWxsIiBjcm9zc29yaWdpbj0iYW5vbnltb3VzIj48L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL2Euc2xhY2stZWRnZS5jb20vYnYxLTgvcm9sbHVwLWFwaV9kb2NzLmU2Zjc1OGEyYjk3NjgxOTA5MTVmLm1pbi5qcyIgb25sb2FkPSJ3aW5kb3cuX2NkbiA/IF9jZG4ub2sodGhpcywgYXJndW1lbnRzKSA6IG51bGwiIG9uZXJyb3I9IndpbmRvdy5fY2RuID8gX2Nkbi5mYWlsZWQodGhpcywgYXJndW1lbnRzKSA6IG51bGwiIGNyb3Nzb3JpZ2luPSJhbm9ueW1vdXMiPjwvc2NyaXB0PjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vYS5zbGFjay1lZGdlLmNvbS9idjEtOC9yb2xsdXAtc2Vjb25kYXJ5X2FfcmVxdWlyZWQuMDRiYTMyYzZmYmQ2MjcwMGI0NjAubWluLmpzIiBvbmxvYWQ9IndpbmRvdy5fY2RuID8gX2Nkbi5vayh0aGlzLCBhcmd1bWVudHMpIDogbnVsbCIgb25lcnJvcj0id2luZG93Ll9jZG4gPyBfY2RuLmZhaWxlZCh0aGlzLCBhcmd1bWVudHMpIDogbnVsbCIgY3Jvc3NvcmlnaW49ImFub255bW91cyI+PC9zY3JpcHQ+PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tL2J2MS04L3JvbGx1cC1zZWNvbmRhcnlfYl9yZXF1aXJlZC40ZjcxNDdlYTQ5NzQyNTIxNGU3Zi5taW4uanMiIG9ubG9hZD0id2luZG93Ll9jZG4gPyBfY2RuLm9rKHRoaXMsIGFyZ3VtZW50cykgOiBudWxsIiBvbmVycm9yPSJ3aW5kb3cuX2NkbiA/IF9jZG4uZmFpbGVkKHRoaXMsIGFyZ3VtZW50cykgOiBudWxsIiBjcm9zc29yaWdpbj0iYW5vbnltb3VzIj48L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL2Euc2xhY2stZWRnZS5jb20vYnYxLTgvZm9vdGVyLmYxNWIzY2JmNDY4NzcxNDdmMDY2Lm1pbi5qcyIgb25sb2FkPSJ3aW5kb3cuX2NkbiA/IF9jZG4ub2sodGhpcywgYXJndW1lbnRzKSA6IG51bGwiIG9uZXJyb3I9IndpbmRvdy5fY2RuID8gX2Nkbi5mYWlsZWQodGhpcywgYXJndW1lbnRzKSA6IG51bGwiIGNyb3Nzb3JpZ2luPSJhbm9ueW1vdXMiPjwvc2NyaXB0PjxzY3JpcHQ+CQkJd2luZG93LmJvb3RfZGF0YSA9IHdpbmRvdy5ib290X2RhdGEgfHwge307CgkJCWJvb3RfZGF0YS5ub19sb2dpbiA9IHRydWU7CgkJCWJvb3RfZGF0YS5hcHAgPSAnYXBpJzsKCQkJYm9vdF9kYXRhLmFwaV91cmwgPSAnL2FwaS8nOwoJCQlib290X2RhdGEuYXBwX2lkID0gIiI7CgkJCWJvb3RfZGF0YS5hcHBfbmFtZSA9ICIiOwoJCQlib290X2RhdGEubnVtX3RlYW1zID0gMDsKCQkJYm9vdF9kYXRhLnJlc2VydmVkX2NvbW1hbmRzID0gW107CgkJCWJvb3RfZGF0YS5udW1fY29tbWFuZHMgPSAwOwoJCQlib290X2RhdGEuc3Vkb191cmwgPSAiIjsKCQkJYm9vdF9kYXRhLmFwaV90b2tlbiA9ICIiOwoJCQlUUy5ib290KGJvb3RfZGF0YSk7PC9zY3JpcHQ+PHNjcmlwdD4JCWhsanMuY29uZmlndXJlKHtsYW5ndWFnZXM6IFsnanNvbicsICdiYXNoJywgJ2phdmFzY3JpcHQnLCAnaHR0cCcsICdqYXZhJywgJ3B5dGhvbiddfSk7CgkJaGxqcy5pbml0SGlnaGxpZ2h0aW5nT25Mb2FkKCk7PC9zY3JpcHQ+Cgo8IS0tIHNsYWNrLXd3dy1oaHZtLW1haW4taWFkLWozeDQvIDIwMjAtMTAtMDYgMTc6MTM6MDQvIHZmNDY3MTRmMjMyN2EwOTk1ZTM1OWJjYmYzMmVlZTc0ZGUxM2NhMmNkLyBCOkggLS0+Cgo8L2JvZHk+PC9odG1sPg== + recorded_at: Wed, 07 Oct 2020 00:13:05 GMT +- request: + method: get + uri: https://slack.com/api/?token=1234 + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 301 + message: Moved Permanently + headers: + Date: + - Wed, 07 Oct 2020 00:21:31 GMT + Server: + - Apache + Vary: + - Accept-Encoding + Location: + - https://slack.com/api?token=1234 + Content-Length: + - '0' + Content-Type: + - text/html + X-Via: + - haproxy-www-2arg,haproxy-edge-pdx-1nke + body: + encoding: UTF-8 + string: '' + recorded_at: Wed, 07 Oct 2020 00:21:31 GMT +- request: + method: get + uri: https://slack.com/api?token=1234 + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 301 + message: Moved Permanently + headers: + Date: + - Wed, 07 Oct 2020 00:21:31 GMT + Server: + - Apache + Vary: + - Accept-Encoding + Location: + - https://api.slack.com?token=1234 + Content-Length: + - '0' + Content-Type: + - text/html + X-Via: + - haproxy-www-tgou,haproxy-edge-pdx-cre0 + body: + encoding: UTF-8 + string: '' + recorded_at: Wed, 07 Oct 2020 00:21:31 GMT +- request: + method: get + uri: https://api.slack.com/?token=1234 + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Date: + - Wed, 07 Oct 2020 00:21:32 GMT + Server: + - Apache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + X-Slack-Backend: + - r + Vary: + - Accept-Encoding + X-Xss-Protection: + - '0' + X-Frame-Options: + - SAMEORIGIN + Set-Cookie: + - b=7vso57len8z4tzd8b7i0c8p73; expires=Mon, 07-Oct-2030 00:21:32 GMT; Max-Age=315532800; + path=/; domain=.slack.com; secure; SameSite=None + - x=7vso57len8z4tzd8b7i0c8p73.1602030092; expires=Wed, 07-Oct-2020 00:36:32 + GMT; Max-Age=900; path=/; domain=.slack.com; secure; SameSite=None + Content-Length: + - '19388' + Content-Type: + - text/html; charset=utf-8 + X-Via: + - haproxy-www-cwvz,haproxy-edge-pdx-fil8 + body: + encoding: ASCII-8BIT + string: !binary |- + PCFET0NUWVBFIGh0bWw+PGh0bWwgbGFuZz0iZW4tVVMiIGNsYXNzPSIiPjxoZWFkPjxzY3JpcHQ+d2luZG93LnRzX2VuZHBvaW50X3VybCA9ICJodHRwczpcL1wvc2xhY2suY29tXC9iZWFjb25cL3RpbWluZyI7KGZ1bmN0aW9uKGUpIHsKCXZhciBuPURhdGUubm93P0RhdGUubm93KCk6K25ldyBEYXRlLHI9ZS5wZXJmb3JtYW5jZXx8e30sdD1bXSxhPXt9LGk9ZnVuY3Rpb24oZSxuKXtmb3IodmFyIHI9MCxhPXQubGVuZ3RoLGk9W107YT5yO3IrKyl0W3JdW2VdPT1uJiZpLnB1c2godFtyXSk7cmV0dXJuIGl9LG89ZnVuY3Rpb24oZSxuKXtmb3IodmFyIHIsYT10Lmxlbmd0aDthLS07KXI9dFthXSxyLmVudHJ5VHlwZSE9ZXx8dm9pZCAwIT09biYmci5uYW1lIT1ufHx0LnNwbGljZShhLDEpfTtyLm5vd3x8KHIubm93PXIud2Via2l0Tm93fHxyLm1vek5vd3x8ci5tc05vd3x8ZnVuY3Rpb24oKXtyZXR1cm4oRGF0ZS5ub3c/RGF0ZS5ub3coKTorbmV3IERhdGUpLW59KSxyLm1hcmt8fChyLm1hcms9ci53ZWJraXRNYXJrfHxmdW5jdGlvbihlKXt2YXIgbj17bmFtZTplLGVudHJ5VHlwZToibWFyayIsc3RhcnRUaW1lOnIubm93KCksZHVyYXRpb246MH07dC5wdXNoKG4pLGFbZV09bn0pLHIubWVhc3VyZXx8KHIubWVhc3VyZT1yLndlYmtpdE1lYXN1cmV8fGZ1bmN0aW9uKGUsbixyKXtuPWFbbl0uc3RhcnRUaW1lLHI9YVtyXS5zdGFydFRpbWUsdC5wdXNoKHtuYW1lOmUsZW50cnlUeXBlOiJtZWFzdXJlIixzdGFydFRpbWU6bixkdXJhdGlvbjpyLW59KX0pLHIuZ2V0RW50cmllc0J5VHlwZXx8KHIuZ2V0RW50cmllc0J5VHlwZT1yLndlYmtpdEdldEVudHJpZXNCeVR5cGV8fGZ1bmN0aW9uKGUpe3JldHVybiBpKCJlbnRyeVR5cGUiLGUpfSksci5nZXRFbnRyaWVzQnlOYW1lfHwoci5nZXRFbnRyaWVzQnlOYW1lPXIud2Via2l0R2V0RW50cmllc0J5TmFtZXx8ZnVuY3Rpb24oZSl7cmV0dXJuIGkoIm5hbWUiLGUpfSksci5jbGVhck1hcmtzfHwoci5jbGVhck1hcmtzPXIud2Via2l0Q2xlYXJNYXJrc3x8ZnVuY3Rpb24oZSl7bygibWFyayIsZSl9KSxyLmNsZWFyTWVhc3VyZXN8fChyLmNsZWFyTWVhc3VyZXM9ci53ZWJraXRDbGVhck1lYXN1cmVzfHxmdW5jdGlvbihlKXtvKCJtZWFzdXJlIixlKX0pLGUucGVyZm9ybWFuY2U9ciwiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiYoZGVmaW5lLmFtZHx8ZGVmaW5lLmFqcykmJmRlZmluZSgicGVyZm9ybWFuY2UiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIHJ9KSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lCn0pKHdpbmRvdyk7PC9zY3JpcHQ+PHNjcmlwdD4KCihmdW5jdGlvbiAoKSB7CgkKCXdpbmRvdy5UU01hcmsgPSBmdW5jdGlvbiAobWFya19sYWJlbCkgewoJCWlmICghd2luZG93LnBlcmZvcm1hbmNlIHx8ICF3aW5kb3cucGVyZm9ybWFuY2UubWFyaykgcmV0dXJuOwoJCXBlcmZvcm1hbmNlLm1hcmsobWFya19sYWJlbCk7Cgl9OwoJd2luZG93LlRTTWFyaygnc3RhcnRfbG9hZCcpOwoKCQoJd2luZG93LlRTTWVhc3VyZUFuZEJlYWNvbiA9IGZ1bmN0aW9uIChtZWFzdXJlX2xhYmVsLCBzdGFydF9tYXJrX2xhYmVsKSB7CgkJaWYgKCF3aW5kb3cucGVyZm9ybWFuY2UgfHwgIXdpbmRvdy5wZXJmb3JtYW5jZS5tYXJrIHx8ICF3aW5kb3cucGVyZm9ybWFuY2UubWVhc3VyZSkgewoJCQlyZXR1cm47CgkJfQoKCQlwZXJmb3JtYW5jZS5tYXJrKHN0YXJ0X21hcmtfbGFiZWwgKyAnX2VuZCcpOwoKCQl0cnkgewoJCQlwZXJmb3JtYW5jZS5tZWFzdXJlKG1lYXN1cmVfbGFiZWwsIHN0YXJ0X21hcmtfbGFiZWwsIHN0YXJ0X21hcmtfbGFiZWwgKyAnX2VuZCcpOwoJCQl3aW5kb3cuVFNCZWFjb24obWVhc3VyZV9sYWJlbCwgcGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5TmFtZShtZWFzdXJlX2xhYmVsKVswXS5kdXJhdGlvbik7CgkJfSBjYXRjaCAoZSkgewoJCQkKCQl9Cgl9OwoKCQoJaWYgKCdzZW5kQmVhY29uJyBpbiBuYXZpZ2F0b3IpIHsKCQl3aW5kb3cuVFNCZWFjb24gPSBmdW5jdGlvbiAobGFiZWwsIHZhbHVlKSB7CgkJCXZhciBlbmRwb2ludF91cmwgPSB3aW5kb3cudHNfZW5kcG9pbnRfdXJsIHx8ICdodHRwczovL3NsYWNrLmNvbS9iZWFjb24vdGltaW5nJzsKCQkJbmF2aWdhdG9yLnNlbmRCZWFjb24oCgkJCQllbmRwb2ludF91cmwgKyAnP2RhdGE9JyArIGVuY29kZVVSSUNvbXBvbmVudChsYWJlbCArICc6JyArIHZhbHVlKSwKCQkJCScnCgkJCSk7CgkJfTsKCX0gZWxzZSB7CgkJd2luZG93LlRTQmVhY29uID0gZnVuY3Rpb24gKGxhYmVsLCB2YWx1ZSkgewoJCQl2YXIgZW5kcG9pbnRfdXJsID0gd2luZG93LnRzX2VuZHBvaW50X3VybCB8fCAnaHR0cHM6Ly9zbGFjay5jb20vYmVhY29uL3RpbWluZyc7CgkJCW5ldyBJbWFnZSgpLnNyYyA9IGVuZHBvaW50X3VybCArICc/ZGF0YT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGxhYmVsICsgJzonICsgdmFsdWUpOwoJCX07Cgl9Cn0pKCk7Cjwvc2NyaXB0PjxzY3JpcHQ+d2luZG93LlRTTWFyaygnc3RlcF9sb2FkJyk7PC9zY3JpcHQ+PG5vc2NyaXB0PjxtZXRhIGh0dHAtZXF1aXY9InJlZnJlc2giIGNvbnRlbnQ9IjA7IFVSTD0vP3Rva2VuPTEyMzQmYW1wO25vanNtb2RlPTEiPjwvbm9zY3JpcHQ+PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPnZhciBzYWZlX2hvc3RzID0gWydhcHAub3B0aW1pemVseS5jb20nLCAndGlueXNwZWNrLmRldi5zbGFjay5jb20nXTsKCmlmIChzZWxmICE9PSB0b3AgJiYgc2FmZV9ob3N0cy5pbmRleE9mKHRvcC5sb2NhdGlvbi5ob3N0KSA9PT0gLTEpIHsKCXdpbmRvdy5kb2N1bWVudC53cml0ZSgKCQknXHUwMDNDc3R5bGU+Ym9keSAqIHtkaXNwbGF5Om5vbmUgIWltcG9ydGFudDt9XHUwMDNDL3N0eWxlPlx1MDAzQ2EgaHJlZj0iIyIgb25jbGljaz0nICsKCQkJJyJ0b3AubG9jYXRpb24uaHJlZj13aW5kb3cubG9jYXRpb24uaHJlZiIgc3R5bGU9ImRpc3BsYXk6YmxvY2sgIWltcG9ydGFudDtwYWRkaW5nOjEwcHgiPkdvIHRvIFNsYWNrLmNvbVx1MDAzQy9hPicKCSk7Cn0KCihmdW5jdGlvbigpIHsKCXZhciB0aW1lcjsKCWlmIChzZWxmICE9PSB0b3AgJiYgc2FmZV9ob3N0cy5pbmRleE9mKHRvcC5sb2NhdGlvbi5ob3N0KSA9PT0gLTEpIHsKCQl0aW1lciA9IHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKCQkJaWYgKHdpbmRvdykgewoJCQkJdHJ5IHsKCQkJCQl2YXIgcGFnZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhZ2UnKTsKCQkJCQl2YXIgY2xpZW50RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xpZW50LXVpJyk7CgkJCQkJdmFyIHNlY3Rpb25FbHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCduYXYsIGhlYWRlciwgc2VjdGlvbicpOwoKCQkJCQlwYWdlRWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwYWdlRWwpOwoJCQkJCWNsaWVudEVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2xpZW50RWwpOwoJCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgc2VjdGlvbkVscy5sZW5ndGg7IGkrKykgewoJCQkJCQlzZWN0aW9uRWxzW2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc2VjdGlvbkVsc1tpXSk7CgkJCQkJfQoJCQkJCXdpbmRvdy5UUyA9IG51bGw7CgkJCQkJd2luZG93LlREID0gbnVsbDsKCQkJCQl3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aW1lcik7CgkJCQl9IGNhdGNoIChlKSB7fQkKCQkJfQoJCX0sIDIwMCk7Cgl9Cn0pKCk7PC9zY3JpcHQ+PHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmNvb2tpZWxhdy5vcmcvc2NyaXB0dGVtcGxhdGVzL290U0RLU3R1Yi5qcyIgZGF0YS1kb2N1bWVudC1sYW5ndWFnZT0idHJ1ZSIgZGF0YS1kb21haW4tc2NyaXB0PSJmZTc4ZmQ4Ni1iNThiLTRmMGMtYTMxMS1kZDkyNGViMDg3MzYiPjwvc2NyaXB0PjxzY3JpcHQ+CmZ1bmN0aW9uIE9wdGFub25XcmFwcGVyKCkgewoJd2luZG93LmRhdGFMYXllci5wdXNoKHtldmVudDonT25lVHJ1c3RHcm91cHNVcGRhdGVkJ30pOwoJCglPcHRhbm9uLk9uQ29uc2VudENoYW5nZWQoZnVuY3Rpb24oKSB7CgkJaWYgKHdpbmRvdy5kcmlmdCAmJiB3aW5kb3cuT25ldHJ1c3RBY3RpdmVHcm91cHMgJiYgd2luZG93Lk9uZXRydXN0QWN0aXZlR3JvdXBzLmluY2x1ZGVzKCdDMDAwMycpKSB7CgkJZHJpZnQubG9hZCgnYTZ5cmk0YjgyenY3Jyk7Cgl9CgkJaWYgKHdpbmRvdy5URCAmJiB3aW5kb3cuVEQuY2xvZykgewoJCQl3aW5kb3cuVEQuY2xvZy50cmFjaygnV0VCU0lURV9DTElDSycsIHsKCQkJCSd0cmlnZ2VyJzogd2luZG93Lk9uZXRydXN0QWN0aXZlR3JvdXBzLAoJCQkJJ3N0ZXAnOidjb25zZW50X2NoYW5nZWQnLAoJCQkJJ2NvbnRleHRzJzogewoJCQkJCSd1aV9jb250ZXh0JzogewoJCQkJCQknc3RlcCc6IFRELmJvb3RfZGF0YS5jbG9nX3VpX3N0ZXAsCgkJCQkJCSdhY3Rpb24nOiAnc2V0dGluZ3MnLAoJCQkJCQkndWlfY29tcG9uZW50JzogJ2luY19jb29raWVfYmFubmVyX3YyJwoJCQkJCX0KCQkJCX0KCQkJfSk7CgkJfQoJfSk7Cn08L3NjcmlwdD48dGl0bGU+U2xhY2sgQVBJIHwgU2xhY2s8L3RpdGxlPjxtZXRhIG5hbWU9IkhhbmRoZWxkRnJpZW5kbHkiIGNvbnRlbnQ9InRydWUiPjxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wIj48bWV0YSBuYW1lPSJhdXRob3IiIGNvbnRlbnQ9IlNsYWNrIj48bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iU2xhY2sgQVBJcyBhbGxvdyB5b3UgdG8gaW50ZWdyYXRlIGNvbXBsZXggc2VydmljZXMgd2l0aCBTbGFjayB0byBnbyBiZXlvbmQgdGhlIGludGVncmF0aW9ucyB3ZSBwcm92aWRlIG91dCBvZiB0aGUgYm94LiI+PG1ldGEgcHJvcGVydHk9Im9nOnR5cGUiIGNvbnRlbnQ9IndlYnNpdGUiPjxtZXRhIHByb3BlcnR5PSJvZzpzaXRlX25hbWUiIGNvbnRlbnQ9IlNsYWNrIj48bWV0YSBwcm9wZXJ0eT0ib2c6dGl0bGUiIGNvbnRlbnQ9IlNsYWNrIEFQSSI+PG1ldGEgcHJvcGVydHk9Im9nOmltYWdlIiBjb250ZW50PSJodHRwczovL2Euc2xhY2stZWRnZS5jb20vODA1ODgvaW1nL3NlcnZpY2VzL2FwaV8yMDAucG5nIj48bWV0YSBwcm9wZXJ0eT0ib2c6ZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlNsYWNrIEFQSXMgYWxsb3cgeW91IHRvIGludGVncmF0ZSBjb21wbGV4IHNlcnZpY2VzIHdpdGggU2xhY2sgdG8gZ28gYmV5b25kIHRoZSBpbnRlZ3JhdGlvbnMgd2UgcHJvdmlkZSBvdXQgb2YgdGhlIGJveC4iPjxtZXRhIHByb3BlcnR5PSJvZzp1cmwiIGNvbnRlbnQ9Imh0dHBzOi8vc2xhY2suY29tLyI+PG1ldGEgbmFtZT0idHdpdHRlcjpzaXRlIiBjb250ZW50PSJAc2xhY2thcGkiPjxtZXRhIG5hbWU9InR3aXR0ZXI6Y2FyZCIgY29udGVudD0ic3VtbWFyeSI+PGxpbmsgaHJlZj0iaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tLzg5NDRlL3N0eWxlL3JvbGx1cC1zbGFja19raXRfbGVnYWN5X2FkYXB0ZXJzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgb25sb2FkPSJ3aW5kb3cuX2NkbiA/IF9jZG4ub2sodGhpcywgYXJndW1lbnRzKSA6IG51bGwiIG9uZXJyb3I9IndpbmRvdy5fY2RuID8gX2Nkbi5mYWlsZWQodGhpcywgYXJndW1lbnRzKSA6IG51bGwiIGNyb3Nzb3JpZ2luPSJhbm9ueW1vdXMiPjxsaW5rIGhyZWY9Imh0dHBzOi8vYS5zbGFjay1lZGdlLmNvbS9jNjM3ZS9zdHlsZS9yb2xsdXAtYXBpX3NpdGUuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBvbmxvYWQ9IndpbmRvdy5fY2RuID8gX2Nkbi5vayh0aGlzLCBhcmd1bWVudHMpIDogbnVsbCIgb25lcnJvcj0id2luZG93Ll9jZG4gPyBfY2RuLmZhaWxlZCh0aGlzLCBhcmd1bWVudHMpIDogbnVsbCIgY3Jvc3NvcmlnaW49ImFub255bW91cyI+PGxpbmsgaHJlZj0iaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tL2J2MS04L21vZGVybi52ZW5kb3IuZWQxNDQ2YS5taW4uY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBvbmxvYWQ9IndpbmRvdy5fY2RuID8gX2Nkbi5vayh0aGlzLCBhcmd1bWVudHMpIDogbnVsbCIgb25lcnJvcj0id2luZG93Ll9jZG4gPyBfY2RuLmZhaWxlZCh0aGlzLCBhcmd1bWVudHMpIDogbnVsbCIgY3Jvc3NvcmlnaW49ImFub255bW91cyI+PGxpbmsgaHJlZj0iaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tL2VjNDM5L3N0eWxlL3JvbGx1cC1zbGFja19raXRfaGVscGVycy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgaWQ9InNsYWNrX2tpdF9oZWxwZXJzX3N0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBvbmxvYWQ9IndpbmRvdy5fY2RuID8gX2Nkbi5vayh0aGlzLCBhcmd1bWVudHMpIDogbnVsbCIgb25lcnJvcj0id2luZG93Ll9jZG4gPyBfY2RuLmZhaWxlZCh0aGlzLCBhcmd1bWVudHMpIDogbnVsbCIgY3Jvc3NvcmlnaW49ImFub255bW91cyI+PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tL2J2MS04L3dlYnBhY2subWFuaWZlc3QuZmY4YTYzMWQzMzNjMzkyZDZjNzkubWluLmpzIiBvbmxvYWQ9IndpbmRvdy5fY2RuID8gX2Nkbi5vayh0aGlzLCBhcmd1bWVudHMpIDogbnVsbCIgb25lcnJvcj0id2luZG93Ll9jZG4gPyBfY2RuLmZhaWxlZCh0aGlzLCBhcmd1bWVudHMpIDogbnVsbCIgY3Jvc3NvcmlnaW49ImFub255bW91cyI+PC9zY3JpcHQ+PGxpbmsgaWQ9ImZhdmljb24iIHJlbD0ic2hvcnRjdXQgaWNvbiIgaHJlZj0iaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tLzgwNTg4L21hcmtldGluZy9pbWcvbWV0YS9mYXZpY29uLTMyLnBuZyIgc2l6ZXM9IjE2eDE2IDMyeDMyIDQ4eDQ4IiB0eXBlPSJpbWFnZS9wbmciPjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93LmRhdGFMYXllciA9IHdpbmRvdy5kYXRhTGF5ZXIgfHwgW107CndpbmRvdy5kYXRhTGF5ZXIucHVzaCh7CgknZ3RtLnN0YXJ0JzogRGF0ZS5ub3coKSwKCSdldmVudCcgOiAnZ3RtLmpzJywKCSdzZWN1cmVfcGFnZScgOiBmYWxzZSwKfSk7CnZhciBmaXJzdFNjcmlwdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKVswXTsKdmFyIHRoaXNTY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKdGhpc1NjcmlwdC5hc3luYyA9IHRydWU7CnRoaXNTY3JpcHQuc3JjID0gJy8vd3d3Lmdvb2dsZXRhZ21hbmFnZXIuY29tL2d0bS5qcz9pZD1HVE0tS0gyTFBLJzsKZmlyc3RTY3JpcHQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpc1NjcmlwdCwgZmlyc3RTY3JpcHQpOwo8L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbihlKSB7Cgl2YXIgZ3RtRGF0YUxheWVyID0gd2luZG93LmRhdGFMYXllciB8fCBbXTsKCXZhciBndG1UYWdzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnKltkYXRhLWd0bS1jbGlja10nKTsKCXZhciBndG1DbGlja0hhbmRsZXIgPSBmdW5jdGlvbihjKSB7CgkJdmFyIGd0bV9ldmVudHMgPSB0aGlzLmdldEF0dHJpYnV0ZSgnZGF0YS1ndG0tY2xpY2snKTsKCQlpZiAoIWd0bV9ldmVudHMpIHJldHVybjsKCQl2YXIgZ3RtX2V2ZW50c19hcnIgPSBndG1fZXZlbnRzLnNwbGl0KCIsIik7CgkJZm9yKHZhciBlPTA7IGUgPCBndG1fZXZlbnRzX2Fyci5sZW5ndGg7IGUrKykgewoJCQl2YXIgZXYgPSBndG1fZXZlbnRzX2FycltlXS50cmltKCk7CgkJCWd0bURhdGFMYXllci5wdXNoKHsgJ2V2ZW50JzogZXYgfSk7CgkJfQoJfTsKCWZvcih2YXIgZz0wOyBnIDwgZ3RtVGFncy5sZW5ndGg7IGcrKyl7CgkJdmFyIGVsZW0gPSBndG1UYWdzW2ddOwoJCWVsZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBndG1DbGlja0hhbmRsZXIpOwoJfQp9KTsKPC9zY3JpcHQ+PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgooZnVuY3Rpb24oZSxjLGIsZixkLGcsYSl7ZS5TbGFja0JlYWNvbk9iamVjdD1kOwplW2RdPWVbZF18fGZ1bmN0aW9uKCl7KGVbZF0ucT1lW2RdLnF8fFtdKS5wdXNoKFsxKm5ldyBEYXRlKCksYXJndW1lbnRzXSl9OwplW2RdLmw9MSpuZXcgRGF0ZSgpO2c9Yy5jcmVhdGVFbGVtZW50KGIpO2E9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXTsKZy5hc3luYz0xO2cuc3JjPWY7YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEpCn0pKHdpbmRvdyxkb2N1bWVudCwic2NyaXB0IiwiaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tL2J2MS04L3NsYWNrX2JlYWNvbi5iZWRjMTJjMTZmMjc5NTE5OTI2ZC5taW4uanMiLCJzYiIpOwp3aW5kb3cuc2IoJ3NldCcsICd0b2tlbicsICczMzA3ZjQzNjk2M2UwMmQ0ZjllYjg1Y2U1MTU5NzQ0YycpOwp3aW5kb3cuc2IoJ3RyYWNrJywgJ3BhZ2V2aWV3Jyk7Cjwvc2NyaXB0PjxsaW5rIHJlbD0iYWx0ZXJuYXRlIiB0eXBlPSJhcHBsaWNhdGlvbi9yc3MreG1sIiB0aXRsZT0iUmVjZW50IGNoYW5nZXMgdG8gdGhlIFNsYWNrIHBsYXRmb3JtIFJTUyBGZWVkIiBocmVmPSIvY2hhbmdlbG9nLnJzcyI+PC9oZWFkPjxib2R5IGNsYXNzPSJhcGkgbGlnaHRfdGhlbWUgZmVhdHVyZV9yZWxhdGVkX2NvbnRlbnQiPjxoZWFkZXI+PGRpdiBjbGFzcz0iZGlzcGxheV9mbGV4IGZ1bGxfd2lkdGggZmxleF9kaXJlY3Rpb25fcm93IGFsaWduX2l0ZW1zX2NlbnRlciBoZWFkZXJfd3JhcHBlciI+PGEgaWQ9Im1lbnVfdG9nZ2xlIiBjbGFzcz0ibm9fdHJhbnNpdGlvbiBzaG93X29uX21vYmlsZSBuYXZfaWNvbl9saW5rIj48dHMtaWNvbiBjbGFzcz0iYy1pY29uIG51ZGdlX3RvcF8xIGMtaWNvbi0tbWVudSIgYXJpYS1oaWRkZW49InRydWUiPjwvdHMtaWNvbj48L2E+PGRpdiBjbGFzcz0iZmxleF9vbmUgYXBpX2hlYWRlcl9sb2dvIj48YSBocmVmPSJodHRwczovL2FwaS5zbGFjay5jb20vIiBpZD0iaGVhZGVyX2xvZ28iIGNsYXNzPSJhcGkiPjxpbWcgYWx0PSJTbGFjayBBUEkiIHNyYz0iaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tLzgwNTg4L2ltZy9zbGFja19hcGlfbG9nb192b2d1ZS5wbmciPjwvYT48L2Rpdj48YSBocmVmPSJodHRwczovL2FwaS5zbGFjay5jb20vc2VhcmNoIiBjbGFzcz0ic2VhcmNoX25hdl9saW5rIHNob3dfb25fbW9iaWxlIGZsZXhfbm9uZSBuYXZfaWNvbl9saW5rIj48dHMtaWNvbiBjbGFzcz0iYy1pY29uIGMtaWNvbi0tc2VhcmNoLW1lZGl1bSIgYXJpYS1oaWRkZW49InRydWUiPjwvdHMtaWNvbj48L2E+PGRpdiBjbGFzcz0ic2VhcmNoX25hdl9pbmxpbmUgaGlkZV9vbl9tb2JpbGUgZmxleF9vbmUgYXBpX2hlYWRlcl9zZWFyY2hfYmFyIj48Zm9ybSBjbGFzcz0ic2VhcmNoIiBhY2NlcHQtY2hhcnNldD0iVVRGLTgiIGFjdGlvbj0iL3NlYXJjaCIgbWV0aG9kPSJnZXQiIHJvbGU9InNlYXJjaCI+PGRpdiBjbGFzcz0iYy1maWx0ZXJfaW5wdXQgYXBpX3NlYXJjaCIgcm9sZT0icHJlc2VudGF0aW9uIj48dHMtaWNvbiBjbGFzcz0iYy1pY29uIG51ZGdlX3RvcF8xIGMtaWNvbi0tc2VhcmNoLW1lZGl1bSBzbWFsbF9yaWdodF9wYWRkaW5nIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC90cy1pY29uPjxpbnB1dCBjbGFzcz0ic2VhcmNoX2lucHV0IiBpZD0icXVlcnkiIG5hbWU9InF1ZXJ5IiB2YWx1ZT0iIiB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0iU2VhcmNoIiBkYXRhLXNtYWxscGxhY2Vob2xkZXI9IlNlYXJjaCB0aGUgZG9jdW1lbnRhdGlvbiI+PC9kaXY+PC9mb3JtPjwvZGl2PjxkaXYgY2xhc3M9ImhpZGVfb25fbW9iaWxlIGZsZXhfbm9uZSBhcGlfaGVhZGVyX25hdiI+PGRpdiBjbGFzcz0iaGVhZGVyX25hdiI+PGEgaHJlZj0iaHR0cHM6Ly9zbGFjay5jb20vc2lnbmluIiBjbGFzcz0iYnRuIGhlYWRlcl9idG4gZmxvYXRfcmlnaHQiIGRhdGEtcWE9InNpZ25faW4iPkdvIHRvIFNsYWNrPC9hPjxkaXYgY2xhc3M9ImhlYWRlcl9saW5rcyBmbG9hdF9yaWdodCI+PGEgaHJlZj0iLyNyZWFkX3RoZV9kb2NzIiBjbGFzcz0iYWN0aXZlIiBkYXRhLXFhPSJkb2N1bWVudGF0aW9uIj5Eb2N1bWVudGF0aW9uPC9hPiA8YSBocmVmPSIvdHV0b3JpYWxzIiBkYXRhLXFhPSJ0dXRvcmlhbHMiPlR1dG9yaWFsczwvYT4gPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9Ac2xhY2thcGkiIHRhcmdldD0ibmV3IiBkYXRhLXFhPSJ0d2l0dGVyIj5Ud2l0dGVyPC9hPjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImFsZXJ0X3BhZ2Vfc3RhY2tlZCI+PGRpdiBjbGFzcz0iYWxlcnRfcGFnZSBhbGVydF9zdWNjZXNzIGhpZGRlbiBmYWRlIGFwaV9hbGVydF9wYWdlIiBkYXRhLWpzPSJhcGlfYWxlcnRfcGFnZSI+PGkgY2xhc3M9InRzX2ljb24gdHNfaWNvbl9jaGVja19jaXJjbGVfbyI+PC9pPlN1Y2Nlc3MhPC9kaXY+PC9kaXY+PC9oZWFkZXI+PGRpdiBpZD0icGFnZSIgY2xhc3M9ImxheW91dF90aHJlZV9jb2wgbGF5b3V0X2hvbWVwYWdlIj48ZGl2IGNsYXNzPSJhcGlfaG9tZV9iYW5uZXJfY29udGFpbmVyIGZ1bGxfd2lkdGggZGlzcGxheV9mbGV4IGZsZXhfZGlyZWN0aW9uX2NvbHVtbiBhbGlnbl9pdGVtc19jZW50ZXIganVzdGlmeV9jb250ZW50X2NlbnRlciBhbGlnbl9jZW50ZXIgbmV1dHJhbF93aGl0ZSI+PGRpdiBjbGFzcz0iYXBpX2hvbWVfYmFubmVyX2JhY2tncm91bmRfaW1hZ2UgcG9zaXRpb25fYWJzb2x1dGUiPjwvZGl2PjxoMSBjbGFzcz0ibmV1dHJhbF93aGl0ZSBhcGlfaG9tZV9iYW5uZXJfaGVhZGluZyI+QnVpbGQ8L2gxPjxkaXYgY2xhc3M9ImFwaV9ob21lX2Jhbm5lcl9oZWFkaW5nX2xpc3RfY29udGFpbmVyIG92ZXJmbG93X2hpZGRlbiBwb3NpdGlvbl9yZWxhdGl2ZSI+PHVsIGNsYXNzPSJhcGlfaG9tZV9iYW5uZXJfaGVhZGluZ19saXN0IG5vX2xpc3Rfc3R5bGUgcG9zaXRpb25fcmVsYXRpdmUgbmV1dHJhbF93aGl0ZSBub3JtYWwgbm9fbWFyZ2luIj48bGkgY2xhc3M9ImFwaV9ob21lX2Jhbm5lcl9oZWFkaW5nX2xpc3RfaXRlbSI+PGEgaHJlZj0iL2ludGVybmFsLWludGVncmF0aW9ucyI+aW50ZXJuYWwgdG9vbHM8L2E+PC9saT48bGkgY2xhc3M9ImFwaV9ob21lX2Jhbm5lcl9oZWFkaW5nX2xpc3RfaXRlbSI+PGEgaHJlZj0iL3N0YXJ0L2J1aWxkaW5nL3dvcmtmbG93LWJ1aWxkZXIiPnNpbXBsaWZpZWQgd29ya2Zsb3dzPC9hPjwvbGk+PGxpIGNsYXNzPSJhcGlfaG9tZV9iYW5uZXJfaGVhZGluZ19saXN0X2l0ZW0iPjxhIGhyZWY9Ii9ib3QtdXNlcnMiPmJyaWxsaWFudCBib3RzPC9hPjwvbGk+PGxpIGNsYXNzPSJhcGlfaG9tZV9iYW5uZXJfaGVhZGluZ19saXN0X2l0ZW0iPjxhIGhyZWY9Ii9zdGFydC9vdmVydmlldyI+dXNlZnVsIGFwcHM8L2E+PC9saT48bGkgY2xhc3M9ImFwaV9ob21lX2Jhbm5lcl9oZWFkaW5nX2xpc3RfaXRlbSI+PGEgaHJlZj0iL2ludGVybmFsLWludGVncmF0aW9ucyI+aW50ZXJuYWwgdG9vbHM8L2E+PC9saT48L3VsPjxkaXYgY2xhc3M9ImFwaV9ob21lX2Jhbm5lcl9naXptbyBwb3NpdGlvbl9hYnNvbHV0ZSI+PGRpdiBjbGFzcz0iYXBpX2hvbWVfYmFubmVyX2dpem1vX2JlbHQiPjwvZGl2PjxkaXYgY2xhc3M9ImFwaV9ob21lX2Jhbm5lcl9naXptb19nZWFyIGFwaV9ob21lX2Jhbm5lcl9naXptb19nZWFyX3RvcCI+PC9kaXY+PGRpdiBjbGFzcz0iYXBpX2hvbWVfYmFubmVyX2dpem1vX2dlYXIgYXBpX2hvbWVfYmFubmVyX2dpem1vX2dlYXJfYm90dG9tIj48L2Rpdj48L2Rpdj48L2Rpdj48YSBjbGFzcz0iYnRuIGJ0bl9sYXJnZSBhcGlfaG9tZV9iYW5uZXJfYnV0dG9uIG1lZGl1bV90b3BfbWFyZ2luIGxlZnRfcGFkZGluZyByaWdodF9wYWRkaW5nIiBocmVmPSIvYXBwcz9uZXdfYXBwPTEiIGRhdGEtY2xvZy1ldmVudD0iQVBQX0RJUkVDVE9SWV9XRUJTSVRFX0NMSUNLIiBkYXRhLWNsb2ctcGFyYW1zPSJjbGlja190YXJnZXQ9YXBpX2hlYWRlcl9zdGFydF9idWlsZGluZ19idG4iIGRhdGEtZ3RtLWNsaWNrPSJBUElTdGFydEJ1aWxkaW5nIj5TdGFydCBCdWlsZGluZzwvYT48L2Rpdj48ZGl2IGlkPSJwYWdlX2NvbnRlbnRzIiBjbGFzcz0iY2xlYXJmaXggYXBpX2hvbWVfcGFnZV9jb250ZW50cyAiPjxkaXYgY2xhc3M9ImFwaV9jb2xfd3JhcHBlciI+PG5hdiBpZD0iYXBpX25hdiIgY2xhc3M9ImNvbCBodWIgZXhwYW5kaW5nX25hdiI+PGRpdiBjbGFzcz0ic2lkZWJhcl9tZW51IHNob3dfb25fbW9iaWxlIj48aDQgY2xhc3M9InNpZGViYXJfbWVudV9oZWFkZXIiPk15IFNsYWNrIEFQSTwvaDQ+PHVsIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdCI+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtIGlzX2FjdGl2ZSIgaHJlZj0iLyNyZWFkX3RoZV9kb2NzIj5Eb2N1bWVudGF0aW9uPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3R1dG9yaWFscyI+VHV0b3JpYWxzPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2FwcHMiPllvdXIgQXBwczwvYT48L2xpPjwvdWw+PC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl9uYXYiPjxkaXYgY2xhc3M9InNpZGViYXJfZXhwYW5kYWJsZV9uYXYiPjxkaXYgY2xhc3M9InNpZGViYXJfZ3JvdXAgZ3JvdXBfY29sbGFwc2VkIiBkYXRhLWRvY3NuYXY9Imdyb3VwIiBpZD0iaHViX2dyb3VwX3N0YXJ0Ij48ZGl2IGNsYXNzPSJzaWRlYmFyX2dyb3VwX3RpdGxlIiBkYXRhLWRvY3NuYXY9InRvZ2dsZSIgZGF0YS10YXJnZXQ9Imh1Yl9ncm91cF9zdGFydCI+PGkgY2xhc3M9ImMtaWNvbiBjLWljb24tLW1hcCI+PC9pPlN0YXJ0IGxlYXJuaW5nPC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl9ncm91cF9jb2xsYXBzZSI+PGRpdiBjbGFzcz0ic2lkZWJhcl9tZW51Ij48dWwgY2xhc3M9InNpZGViYXJfbWVudV9saXN0Ij48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvc3RhcnQiIHRhcmdldD0iIiB0aXRsZT0iT3ZlcnZpZXciPk92ZXJ2aWV3IDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdGFydC9vdmVydmlldyIgdGFyZ2V0PSIiIHRpdGxlPSJJbnRybyB0byB0aGUgU2xhY2sgcGxhdGZvcm0iPkludHJvIHRvIHRoZSBTbGFjayBwbGF0Zm9ybSA8L2E+PC9saT48L3VsPjwvZGl2PjxkaXYgY2xhc3M9InNpZGViYXJfbWVudSI+PGg0IGNsYXNzPSJzaWRlYmFyX21lbnVfaGVhZGVyIj5QbGFubmluZyB5b3VyIGFwcDwvaDQ+PHVsIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdCI+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3N0YXJ0L3BsYW5uaW5nIiB0YXJnZXQ9IiIgdGl0bGU9Ik92ZXJ2aWV3Ij5PdmVydmlldyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvc3RhcnQvcGxhbm5pbmcvdHJpZ2dlcnMiIHRhcmdldD0iIiB0aXRsZT0iUGxhbm5pbmcgaW50ZXJhY3Rpb24iPlBsYW5uaW5nIGludGVyYWN0aW9uIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdGFydC9wbGFubmluZy9jaG9vc2luZyIgdGFyZ2V0PSIiIHRpdGxlPSJDaG9vc2luZyBBUElzIj5DaG9vc2luZyBBUElzIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdGFydC9wbGFubmluZy9jb21tdW5pY2F0aW5nIiB0YXJnZXQ9IiIgdGl0bGU9IkNvbW11bmljYXRpbmciPkNvbW11bmljYXRpbmcgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3N0YXJ0L3BsYW5uaW5nL2d1aWRlbGluZXMiIHRhcmdldD0iIiB0aXRsZT0iSW50ZXJhY3Rpb24gZ3VpZGVsaW5lcyI+SW50ZXJhY3Rpb24gZ3VpZGVsaW5lcyA8L2E+PC9saT48L3VsPjwvZGl2PjxkaXYgY2xhc3M9InNpZGViYXJfbWVudSI+PGg0IGNsYXNzPSJzaWRlYmFyX21lbnVfaGVhZGVyIj5EZXNpZ25pbmcgYSBncmVhdCBleHBlcmllbmNlPC9oND48dWwgY2xhc3M9InNpZGViYXJfbWVudV9saXN0Ij48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvc3RhcnQvZGVzaWduaW5nIiB0YXJnZXQ9IiIgdGl0bGU9Ik92ZXJ2aWV3Ij5PdmVydmlldyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvc3RhcnQvZGVzaWduaW5nL3RhYnMiIHRhcmdldD0iIiB0aXRsZT0iRGVzaWduaW5nIGhvbWUgdGFicyI+RGVzaWduaW5nIGhvbWUgdGFicyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvc3RhcnQvZGVzaWduaW5nL21vZGFscyIgdGFyZ2V0PSIiIHRpdGxlPSJEZXNpZ25pbmcgbW9kYWxzIj5EZXNpZ25pbmcgbW9kYWxzIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdGFydC9kZXNpZ25pbmcvc2hvcnRjdXRzIiB0YXJnZXQ9IiIgdGl0bGU9IlNob3J0Y3V0IGd1aWRlbGluZXMiPlNob3J0Y3V0IGd1aWRlbGluZXMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3N0YXJ0L2Rlc2lnbmluZy92b2ljZS10b25lIiB0YXJnZXQ9IiIgdGl0bGU9IkNob29zaW5nIHZvaWNlICZhbXA7IHRvbmUiPkNob29zaW5nIHZvaWNlICZhbXA7IHRvbmUgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3N0YXJ0L2Rlc2lnbmluZy9sb2NhbGl6aW5nIiB0YXJnZXQ9IiIgdGl0bGU9IkxvY2FsaXppbmcgYXBwcyI+TG9jYWxpemluZyBhcHBzIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdGFydC9kZXNpZ25pbmcvb25ib2FyZGluZyIgdGFyZ2V0PSIiIHRpdGxlPSJPbmJvYXJkaW5nIGV4cGVyaWVuY2VzIj5PbmJvYXJkaW5nIGV4cGVyaWVuY2VzIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdGFydC9kZXNpZ25pbmcvZ3VpZGVsaW5lcyIgdGFyZ2V0PSIiIHRpdGxlPSJHZW5lcmFsIGd1aWRlbGluZXMiPkdlbmVyYWwgZ3VpZGVsaW5lcyA8L2E+PC9saT48L3VsPjwvZGl2PjxkaXYgY2xhc3M9InNpZGViYXJfbWVudSI+PGg0IGNsYXNzPSJzaWRlYmFyX21lbnVfaGVhZGVyIj5CdWlsZGluZyBhbiBhcHA8L2g0Pjx1bCBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3QiPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdGFydC9idWlsZGluZyIgdGFyZ2V0PSIiIHRpdGxlPSJPdmVydmlldyI+T3ZlcnZpZXcgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3N0YXJ0L2J1aWxkaW5nL2JvbHQtanMiIHRhcmdldD0iIiB0aXRsZT0iRGV2ZWxvcGluZyB3aXRoIEphdmFTY3JpcHQiPkRldmVsb3Bpbmcgd2l0aCBKYXZhU2NyaXB0IDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdGFydC9idWlsZGluZy9ib2x0LXB5dGhvbiIgdGFyZ2V0PSIiIHRpdGxlPSJEZXZlbG9waW5nIHdpdGggUHl0aG9uIj5EZXZlbG9waW5nIHdpdGggUHl0aG9uIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdGFydC9idWlsZGluZy9ib2x0LWphdmEiIHRhcmdldD0iIiB0aXRsZT0iRGV2ZWxvcGluZyB3aXRoIEphdmEiPkRldmVsb3Bpbmcgd2l0aCBKYXZhIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdGFydC9idWlsZGluZy93b3JrZmxvdy1idWlsZGVyIiB0YXJnZXQ9IiIgdGl0bGU9IldvcmtmbG93IEJ1aWxkZXIiPldvcmtmbG93IEJ1aWxkZXIgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2Jsb2NrLWtpdC1idWlsZGVyIiB0YXJnZXQ9IiIgdGl0bGU9IkJsb2NrIGJ1aWxkZXIiPkJsb2NrIGJ1aWxkZXIgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3Rvb2xzIiB0YXJnZXQ9IiIgdGl0bGU9IlNES3MgJmFtcDsgdG9vbHMiPlNES3MgJmFtcDsgdG9vbHMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2Jlc3QtcHJhY3RpY2VzL2JsdWVwcmludHMiIHRhcmdldD0iIiB0aXRsZT0iQXBwIGJsdWVwcmludHMiPkFwcCBibHVlcHJpbnRzIDwvYT48L2xpPjwvdWw+PC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl9tZW51Ij48aDQgY2xhc3M9InNpZGViYXJfbWVudV9oZWFkZXIiPkRpc3RyaWJ1dGluZyBhbiBhcHA8L2g0Pjx1bCBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3QiPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdGFydC9kaXN0cmlidXRpbmciIHRhcmdldD0iIiB0aXRsZT0iT3ZlcnZpZXciPk92ZXJ2aWV3IDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdGFydC9kaXN0cmlidXRpbmcvcHVibGljIiB0YXJnZXQ9IiIgdGl0bGU9IkRpc3RyaWJ1dGluZyBhcHBzIHB1YmxpY2x5Ij5EaXN0cmlidXRpbmcgYXBwcyBwdWJsaWNseSA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvc3RhcnQvZGlzdHJpYnV0aW5nL2RpcmVjdG9yeSIgdGFyZ2V0PSIiIHRpdGxlPSJVc2luZyB0aGUgQXBwIERpcmVjdG9yeSI+VXNpbmcgdGhlIEFwcCBEaXJlY3RvcnkgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3N0YXJ0L2Rpc3RyaWJ1dGluZy9ndWlkZWxpbmVzIiB0YXJnZXQ9IiIgdGl0bGU9IkFwcCBEaXJlY3RvcnkgR3VpZGVsaW5lcyI+QXBwIERpcmVjdG9yeSBHdWlkZWxpbmVzIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdGFydC9kaXN0cmlidXRpbmcvZGlyZWN0b3J5I3BvbGljaWVzIiB0YXJnZXQ9IiIgdGl0bGU9IkRldmVsb3BlciBwb2xpY2llcyI+RGV2ZWxvcGVyIHBvbGljaWVzIDwvYT48L2xpPjwvdWw+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl9ncm91cCBncm91cF9jb2xsYXBzZWQiIGRhdGEtZG9jc25hdj0iZ3JvdXAiIGlkPSJodWJfZ3JvdXBfYXV0aGVudGljYXRpb24iPjxkaXYgY2xhc3M9InNpZGViYXJfZ3JvdXBfdGl0bGUiIGRhdGEtZG9jc25hdj0idG9nZ2xlIiBkYXRhLXRhcmdldD0iaHViX2dyb3VwX2F1dGhlbnRpY2F0aW9uIj48aSBjbGFzcz0iYy1pY29uIGMtaWNvbi0tbG9jay1sYXJnZS1vIj48L2k+QXV0aGVudGljYXRpb248L2Rpdj48ZGl2IGNsYXNzPSJzaWRlYmFyX2dyb3VwX2NvbGxhcHNlIj48ZGl2IGNsYXNzPSJzaWRlYmFyX21lbnUiPjx1bCBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3QiPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9hdXRoZW50aWNhdGlvbiIgdGFyZ2V0PSIiIHRpdGxlPSJPdmVydmlldyI+T3ZlcnZpZXcgPC9hPjwvbGk+PC91bD48L2Rpdj48ZGl2IGNsYXNzPSJzaWRlYmFyX21lbnUiPjxoNCBjbGFzcz0ic2lkZWJhcl9tZW51X2hlYWRlciI+SW5zdGFsbGF0aW9uICZhbXA7IFBlcm1pc3Npb25zPC9oND48dWwgY2xhc3M9InNpZGViYXJfbWVudV9saXN0Ij48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvYXV0aGVudGljYXRpb24vYmFzaWNzIiB0YXJnZXQ9IiIgdGl0bGU9IkJhc2ljIGFwcCBzZXR1cCI+QmFzaWMgYXBwIHNldHVwIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9hdXRoZW50aWNhdGlvbi9vYXV0aC12MiIgdGFyZ2V0PSIiIHRpdGxlPSJJbnN0YWxsaW5nIHdpdGggT0F1dGgiPkluc3RhbGxpbmcgd2l0aCBPQXV0aCA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvYXV0aGVudGljYXRpb24vcXVpY2tzdGFydCIgdGFyZ2V0PSIiIHRpdGxlPSJRdWlja3N0YXJ0OiB3aGF0J3MgbmV3Ij5RdWlja3N0YXJ0OiB3aGF0J3MgbmV3IDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9hdXRoZW50aWNhdGlvbi9taWdyYXRpb24iIHRhcmdldD0iIiB0aXRsZT0iTWlncmF0aW9uIGd1aWRlIj5NaWdyYXRpb24gZ3VpZGUgPC9hPjwvbGk+PC91bD48L2Rpdj48ZGl2IGNsYXNzPSJzaWRlYmFyX21lbnUiPjxoNCBjbGFzcz0ic2lkZWJhcl9tZW51X2hlYWRlciI+U2VjdXJpdHk8L2g0Pjx1bCBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3QiPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9hdXRoZW50aWNhdGlvbi92ZXJpZnlpbmctcmVxdWVzdHMtZnJvbS1zbGFjayIgdGFyZ2V0PSIiIHRpdGxlPSJWZXJpZnlpbmcgcmVxdWVzdHMiPlZlcmlmeWluZyByZXF1ZXN0cyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvYXV0aGVudGljYXRpb24vYmVzdC1wcmFjdGljZXMiIHRhcmdldD0iIiB0aXRsZT0iQmVzdCBwcmFjdGljZXMiPkJlc3QgcHJhY3RpY2VzIDwvYT48L2xpPjwvdWw+PC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl9tZW51Ij48aDQgY2xhc3M9InNpZGViYXJfbWVudV9oZWFkZXIiPlJlZmVyZW5jZTwvaDQ+PHVsIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdCI+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2F1dGhlbnRpY2F0aW9uL3Rva2VuLXR5cGVzIiB0YXJnZXQ9IiIgdGl0bGU9IlRva2VuIHR5cGVzIj5Ub2tlbiB0eXBlcyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvc2NvcGVzIiB0YXJnZXQ9IiIgdGl0bGU9IlNjb3BlcyI+U2NvcGVzIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9kb2NzL3NpZ24taW4td2l0aC1zbGFjayIgdGFyZ2V0PSIiIHRpdGxlPSJTaWduIGluIHdpdGggU2xhY2siPlNpZ24gaW4gd2l0aCBTbGFjayA8L2E+PC9saT48L3VsPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InNpZGViYXJfZ3JvdXAgZ3JvdXBfY29sbGFwc2VkIiBkYXRhLWRvY3NuYXY9Imdyb3VwIiBpZD0iaHViX2dyb3VwX3N1cmZhY2VzIj48ZGl2IGNsYXNzPSJzaWRlYmFyX2dyb3VwX3RpdGxlIiBkYXRhLWRvY3NuYXY9InRvZ2dsZSIgZGF0YS10YXJnZXQ9Imh1Yl9ncm91cF9zdXJmYWNlcyI+PGkgY2xhc3M9ImMtaWNvbiBjLWljb24tLWduLW1lbnUtc21hbGwiPjwvaT5TdXJmYWNlczwvZGl2PjxkaXYgY2xhc3M9InNpZGViYXJfZ3JvdXBfY29sbGFwc2UiPjxkaXYgY2xhc3M9InNpZGViYXJfbWVudSI+PHVsIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdCI+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3N1cmZhY2VzIiB0YXJnZXQ9IiIgdGl0bGU9Ik92ZXJ2aWV3Ij5PdmVydmlldyA8L2E+PC9saT48L3VsPjwvZGl2PjxkaXYgY2xhc3M9InNpZGViYXJfbWVudSI+PGg0IGNsYXNzPSJzaWRlYmFyX21lbnVfaGVhZGVyIj5Ib21lIHRhYnM8L2g0Pjx1bCBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3QiPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdXJmYWNlcy90YWJzIiB0YXJnZXQ9IiIgdGl0bGU9Ik92ZXJ2aWV3Ij5PdmVydmlldyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvc3VyZmFjZXMvdGFicy91c2luZyIgdGFyZ2V0PSIiIHRpdGxlPSJVc2luZyB5b3VyIEhvbWUgdGFiIj5Vc2luZyB5b3VyIEhvbWUgdGFiIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdXJmYWNlcy90YWJzL2V2ZW50cyIgdGFyZ2V0PSIiIHRpdGxlPSJFdmVudHMgaW4gQXBwIEhvbWUiPkV2ZW50cyBpbiBBcHAgSG9tZSA8L2E+PC9saT48L3VsPjwvZGl2PjxkaXYgY2xhc3M9InNpZGViYXJfbWVudSI+PGg0IGNsYXNzPSJzaWRlYmFyX21lbnVfaGVhZGVyIj5Nb2RhbHM8L2g0Pjx1bCBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3QiPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdXJmYWNlcy9tb2RhbHMiIHRhcmdldD0iIiB0aXRsZT0iT3ZlcnZpZXciPk92ZXJ2aWV3IDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdXJmYWNlcy9tb2RhbHMvdXNpbmciIHRhcmdldD0iIiB0aXRsZT0iVXNpbmcgbW9kYWxzIj5Vc2luZyBtb2RhbHMgPC9hPjwvbGk+PC91bD48L2Rpdj48ZGl2IGNsYXNzPSJzaWRlYmFyX21lbnUiPjxoNCBjbGFzcz0ic2lkZWJhcl9tZW51X2hlYWRlciI+TWVzc2FnZXM8L2g0Pjx1bCBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3QiPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9zdXJmYWNlcy9tZXNzYWdlcyIgdGFyZ2V0PSIiIHRpdGxlPSJPdmVydmlldyI+T3ZlcnZpZXcgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL21lc3NhZ2luZy9zZW5kaW5nIiB0YXJnZXQ9IiIgdGl0bGU9IlNlbmRpbmcgbWVzc2FnZXMiPlNlbmRpbmcgbWVzc2FnZXMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL21lc3NhZ2luZy9jb21wb3NpbmcvbGF5b3V0cyIgdGFyZ2V0PSIiIHRpdGxlPSJSaWNoIG1lc3NhZ2UgbGF5b3V0cyI+UmljaCBtZXNzYWdlIGxheW91dHMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL21lc3NhZ2luZy9pbnRlcmFjdGl2aXR5IiB0YXJnZXQ9IiIgdGl0bGU9IkludGVyYWN0aXZlIG1lc3NhZ2VzIj5JbnRlcmFjdGl2ZSBtZXNzYWdlcyA8L2E+PC9saT48L3VsPjwvZGl2PjxkaXYgY2xhc3M9InNpZGViYXJfbWVudSI+PGg0IGNsYXNzPSJzaWRlYmFyX21lbnVfaGVhZGVyIj5SZWZlcmVuY2U8L2g0Pjx1bCBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3QiPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9yZWZlcmVuY2Uvc3VyZmFjZXMvdmlld3MiIHRhcmdldD0iIiB0aXRsZT0iRGVmaW5pbmcgdmlld3MiPkRlZmluaW5nIHZpZXdzIDwvYT48L2xpPjwvdWw+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl9ncm91cCBncm91cF9jb2xsYXBzZWQiIGRhdGEtZG9jc25hdj0iZ3JvdXAiIGlkPSJodWJfZ3JvdXBfYmxvY2traXQiPjxkaXYgY2xhc3M9InNpZGViYXJfZ3JvdXBfdGl0bGUiIGRhdGEtZG9jc25hdj0idG9nZ2xlIiBkYXRhLXRhcmdldD0iaHViX2dyb3VwX2Jsb2Nra2l0Ij48aSBjbGFzcz0iYy1pY29uIGMtaWNvbi0tYmxvY2tzIj48L2k+QmxvY2sgS2l0PC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl9ncm91cF9jb2xsYXBzZSI+PGRpdiBjbGFzcz0ic2lkZWJhcl9tZW51Ij48dWwgY2xhc3M9InNpZGViYXJfbWVudV9saXN0Ij48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvYmxvY2sta2l0IiB0YXJnZXQ9IiIgdGl0bGU9Ik92ZXJ2aWV3Ij5PdmVydmlldyA8L2E+PC9saT48L3VsPjwvZGl2PjxkaXYgY2xhc3M9InNpZGViYXJfbWVudSI+PGg0IGNsYXNzPSJzaWRlYmFyX21lbnVfaGVhZGVyIj5CbG9jayBiYXNpY3M8L2g0Pjx1bCBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3QiPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9ibG9jay1raXQvYnVpbGRpbmciIHRhcmdldD0iIiB0aXRsZT0iQnVpbGRpbmcgYmxvY2tzIj5CdWlsZGluZyBibG9ja3MgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2Jsb2NrLWtpdC9pbnRlcmFjdGl2aXR5IiB0YXJnZXQ9IiIgdGl0bGU9IkludGVyYWN0aXZpdHkgaW4gQmxvY2sgS2l0Ij5JbnRlcmFjdGl2aXR5IGluIEJsb2NrIEtpdCA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvdG9vbHMvYmxvY2sta2l0LWJ1aWxkZXIiIHRhcmdldD0iIiB0aXRsZT0iQmxvY2sgS2l0IEJ1aWxkZXIiPkJsb2NrIEtpdCBCdWlsZGVyIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii90b29scy9ibG9jay1raXQtYnVpbGRlcj90ZW1wbGF0ZT0xIiB0YXJnZXQ9IiIgdGl0bGU9IkFwcCB0ZW1wbGF0ZXMiPkFwcCB0ZW1wbGF0ZXMgPC9hPjwvbGk+PC91bD48L2Rpdj48ZGl2IGNsYXNzPSJzaWRlYmFyX21lbnUiPjxoNCBjbGFzcz0ic2lkZWJhcl9tZW51X2hlYWRlciI+UmVmZXJlbmNlPC9oND48dWwgY2xhc3M9InNpZGViYXJfbWVudV9saXN0Ij48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvcmVmZXJlbmNlL2Jsb2NrLWtpdCIgdGFyZ2V0PSIiIHRpdGxlPSJPdmVydmlldyI+T3ZlcnZpZXcgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3JlZmVyZW5jZS9ibG9jay1raXQvYmxvY2tzIiB0YXJnZXQ9IiIgdGl0bGU9IkJsb2NrcyI+QmxvY2tzIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9yZWZlcmVuY2UvYmxvY2sta2l0L2Jsb2NrLWVsZW1lbnRzIiB0YXJnZXQ9IiIgdGl0bGU9IkJsb2NrIGVsZW1lbnRzIj5CbG9jayBlbGVtZW50cyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvcmVmZXJlbmNlL2Jsb2NrLWtpdC9pbnRlcmFjdGl2ZS1jb21wb25lbnRzIiB0YXJnZXQ9IiIgdGl0bGU9IkludGVyYWN0aXZlIGNvbXBvbmVudHMiPkludGVyYWN0aXZlIGNvbXBvbmVudHMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3JlZmVyZW5jZS9ibG9jay1raXQvY29tcG9zaXRpb24tb2JqZWN0cyIgdGFyZ2V0PSIiIHRpdGxlPSJDb21wb3NpdGlvbiBvYmplY3RzIj5Db21wb3NpdGlvbiBvYmplY3RzIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9yZWZlcmVuY2UvYmxvY2sta2l0L3ZpZXdzIiB0YXJnZXQ9IiIgdGl0bGU9IkRlZmluaW5nIHZpZXdzIj5EZWZpbmluZyB2aWV3cyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvcmVmZXJlbmNlL2ludGVyYWN0aW9uLXBheWxvYWRzL2Jsb2NrLWFjdGlvbnMiIHRhcmdldD0iIiB0aXRsZT0iYmxvY2tfYWN0aW9ucyBwYXlsb2FkcyI+YmxvY2tfYWN0aW9ucyBwYXlsb2FkcyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvcmVmZXJlbmNlL2ludGVyYWN0aW9uLXBheWxvYWRzL3ZpZXdzIiB0YXJnZXQ9IiIgdGl0bGU9IlZpZXcgaW50ZXJhY3Rpb24gcGF5bG9hZHMiPlZpZXcgaW50ZXJhY3Rpb24gcGF5bG9hZHMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2Jsb2NrLWtpdC9kaWFsb2dzLXRvLW1vZGFscyIgdGFyZ2V0PSIiIHRpdGxlPSJVcGdyYWRpbmcgdG8gbW9kYWxzIj5VcGdyYWRpbmcgdG8gbW9kYWxzIDwvYT48L2xpPjwvdWw+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl9ncm91cCBncm91cF9jb2xsYXBzZWQiIGRhdGEtZG9jc25hdj0iZ3JvdXAiIGlkPSJodWJfZ3JvdXBfaW50ZXJhY3Rpdml0eSI+PGRpdiBjbGFzcz0ic2lkZWJhcl9ncm91cF90aXRsZSIgZGF0YS1kb2NzbmF2PSJ0b2dnbGUiIGRhdGEtdGFyZ2V0PSJodWJfZ3JvdXBfaW50ZXJhY3Rpdml0eSI+PGkgY2xhc3M9ImMtaWNvbiBjLWljb24tLXBsdWciPjwvaT5JbnRlcmFjdGl2aXR5PC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl9ncm91cF9jb2xsYXBzZSI+PGRpdiBjbGFzcz0ic2lkZWJhcl9tZW51Ij48dWwgY2xhc3M9InNpZGViYXJfbWVudV9saXN0Ij48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvaW50ZXJhY3Rpdml0eSIgdGFyZ2V0PSIiIHRpdGxlPSJPdmVydmlldyI+T3ZlcnZpZXcgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2ludGVyYWN0aXZpdHkvaGFuZGxpbmciIHRhcmdldD0iIiB0aXRsZT0iSGFuZGxpbmcgdXNlciBpbnRlcmFjdGlvbiI+SGFuZGxpbmcgdXNlciBpbnRlcmFjdGlvbiA8L2E+PC9saT48L3VsPjwvZGl2PjxkaXYgY2xhc3M9InNpZGViYXJfbWVudSI+PGg0IGNsYXNzPSJzaWRlYmFyX21lbnVfaGVhZGVyIj5FbnRyeSBwb2ludHM8L2g0Pjx1bCBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3QiPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9pbnRlcmFjdGl2aXR5L2VudHJ5LXBvaW50cyIgdGFyZ2V0PSIiIHRpdGxlPSJPdmVydmlldyI+T3ZlcnZpZXcgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2ludGVyYWN0aXZpdHkvc2hvcnRjdXRzIyIgdGFyZ2V0PSIiIHRpdGxlPSJTaG9ydGN1dHMiPlNob3J0Y3V0cyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvaW50ZXJhY3Rpdml0eS9zbGFzaC1jb21tYW5kcyIgdGFyZ2V0PSIiIHRpdGxlPSJTbGFzaCBDb21tYW5kcyI+U2xhc2ggQ29tbWFuZHMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2ludGVyYWN0aXZpdHkvY29tcG9uZW50cyIgdGFyZ2V0PSIiIHRpdGxlPSJJbnRlcmFjdGl2ZSBjb21wb25lbnRzIj5JbnRlcmFjdGl2ZSBjb21wb25lbnRzIDwvYT48L2xpPjwvdWw+PC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl9tZW51Ij48aDQgY2xhc3M9InNpZGViYXJfbWVudV9oZWFkZXIiPlNob3J0Y3V0czwvaDQ+PHVsIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdCI+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2ludGVyYWN0aXZpdHkvc2hvcnRjdXRzIiB0YXJnZXQ9IiIgdGl0bGU9Ik92ZXJ2aWV3Ij5PdmVydmlldyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvaW50ZXJhY3Rpdml0eS9zaG9ydGN1dHMvdXNpbmciIHRhcmdldD0iIiB0aXRsZT0iSW1wbGVtZW50aW5nIHNob3J0Y3V0cyI+SW1wbGVtZW50aW5nIHNob3J0Y3V0cyA8L2E+PC9saT48L3VsPjwvZGl2PjxkaXYgY2xhc3M9InNpZGViYXJfbWVudSI+PGg0IGNsYXNzPSJzaWRlYmFyX21lbnVfaGVhZGVyIj5JbnRlcmFjdGlvbiBwYXlsb2FkczwvaDQ+PHVsIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdCI+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3JlZmVyZW5jZS9pbnRlcmFjdGlvbi1wYXlsb2FkcyIgdGFyZ2V0PSIiIHRpdGxlPSJPdmVydmlldyI+T3ZlcnZpZXcgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3JlZmVyZW5jZS9pbnRlcmFjdGlvbi1wYXlsb2Fkcy9zaG9ydGN1dHMiIHRhcmdldD0iIiB0aXRsZT0iU2hvcnRjdXRzIHBheWxvYWRzIj5TaG9ydGN1dHMgcGF5bG9hZHMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3JlZmVyZW5jZS9pbnRlcmFjdGlvbi1wYXlsb2Fkcy9ibG9jay1hY3Rpb25zIiB0YXJnZXQ9IiIgdGl0bGU9ImJsb2NrX2FjdGlvbnMgcGF5bG9hZHMiPmJsb2NrX2FjdGlvbnMgcGF5bG9hZHMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3JlZmVyZW5jZS9pbnRlcmFjdGlvbi1wYXlsb2Fkcy92aWV3cyIgdGFyZ2V0PSIiIHRpdGxlPSJWaWV3IGludGVyYWN0aW9uIHBheWxvYWRzIj5WaWV3IGludGVyYWN0aW9uIHBheWxvYWRzIDwvYT48L2xpPjwvdWw+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl9ncm91cCBncm91cF9jb2xsYXBzZWQiIGRhdGEtZG9jc25hdj0iZ3JvdXAiIGlkPSJodWJfZ3JvdXBfbWVzc2FnaW5nIj48ZGl2IGNsYXNzPSJzaWRlYmFyX2dyb3VwX3RpdGxlIiBkYXRhLWRvY3NuYXY9InRvZ2dsZSIgZGF0YS10YXJnZXQ9Imh1Yl9ncm91cF9tZXNzYWdpbmciPjxpIGNsYXNzPSJjLWljb24gYy1pY29uLS1kbSI+PC9pPk1lc3NhZ2luZzwvZGl2PjxkaXYgY2xhc3M9InNpZGViYXJfZ3JvdXBfY29sbGFwc2UiPjxkaXYgY2xhc3M9InNpZGViYXJfbWVudSI+PGg0IGNsYXNzPSJzaWRlYmFyX21lbnVfaGVhZGVyIj5NYW5hZ2luZyBtZXNzYWdlczwvaDQ+PHVsIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdCI+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL21lc3NhZ2luZy9tYW5hZ2luZyIgdGFyZ2V0PSIiIHRpdGxlPSJPdmVydmlldyI+T3ZlcnZpZXcgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL21lc3NhZ2luZy9yZXRyaWV2aW5nIiB0YXJnZXQ9IiIgdGl0bGU9IlJldHJpZXZpbmcgbWVzc2FnZXMiPlJldHJpZXZpbmcgbWVzc2FnZXMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL21lc3NhZ2luZy9zZW5kaW5nIiB0YXJnZXQ9IiIgdGl0bGU9IlNlbmRpbmcgbWVzc2FnZXMiPlNlbmRpbmcgbWVzc2FnZXMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL21lc3NhZ2luZy9tb2RpZnlpbmciIHRhcmdldD0iIiB0aXRsZT0iTW9kaWZ5aW5nIG1lc3NhZ2VzIj5Nb2RpZnlpbmcgbWVzc2FnZXMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL21lc3NhZ2luZy9zY2hlZHVsaW5nIiB0YXJnZXQ9IiIgdGl0bGU9IlNjaGVkdWxpbmcgbWVzc2FnZXMiPlNjaGVkdWxpbmcgbWVzc2FnZXMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL21lc3NhZ2luZy93ZWJob29rcyIgdGFyZ2V0PSIiIHRpdGxlPSJVc2luZyBXZWJob29rcyI+VXNpbmcgV2ViaG9va3MgPC9hPjwvbGk+PC91bD48L2Rpdj48ZGl2IGNsYXNzPSJzaWRlYmFyX21lbnUiPjxoNCBjbGFzcz0ic2lkZWJhcl9tZW51X2hlYWRlciI+Q29tcG9zaW5nIG1lc3NhZ2VzPC9oND48dWwgY2xhc3M9InNpZGViYXJfbWVudV9saXN0Ij48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvbWVzc2FnaW5nL2NvbXBvc2luZyIgdGFyZ2V0PSIiIHRpdGxlPSJPdmVydmlldyI+T3ZlcnZpZXcgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL21lc3NhZ2luZy9jb21wb3NpbmcvZm9ybWF0dGluZyIgdGFyZ2V0PSIiIHRpdGxlPSJGb3JtYXR0aW5nIHRleHQiPkZvcm1hdHRpbmcgdGV4dCA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvbWVzc2FnaW5nL2NvbXBvc2luZy9sYXlvdXRzIiB0YXJnZXQ9IiIgdGl0bGU9Ik1lc3NhZ2UgbGF5b3V0cyI+TWVzc2FnZSBsYXlvdXRzIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9tZXNzYWdpbmcvaW50ZXJhY3Rpdml0eSIgdGFyZ2V0PSIiIHRpdGxlPSJJbnRlcmFjdGl2ZSBtZXNzYWdlcyI+SW50ZXJhY3RpdmUgbWVzc2FnZXMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3Rvb2xzL2Jsb2NrLWtpdC1idWlsZGVyIiB0YXJnZXQ9IiIgdGl0bGU9IkJsb2NrIEtpdCBCdWlsZGVyIj5CbG9jayBLaXQgQnVpbGRlciA8L2E+PC9saT48L3VsPjwvZGl2PjxkaXYgY2xhc3M9InNpZGViYXJfbWVudSI+PGg0IGNsYXNzPSJzaWRlYmFyX21lbnVfaGVhZGVyIj5Xb3JraW5nIHdpdGggZmlsZXM8L2g0Pjx1bCBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3QiPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9tZXNzYWdpbmcvZmlsZXMiIHRhcmdldD0iIiB0aXRsZT0iT3ZlcnZpZXciPk92ZXJ2aWV3IDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9tZXNzYWdpbmcvZmlsZXMvc2V0dXAiIHRhcmdldD0iIiB0aXRsZT0iUHJlcGFyaW5nIHlvdXIgYXBwIGZvciBmaWxlcyI+UHJlcGFyaW5nIHlvdXIgYXBwIGZvciBmaWxlcyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvbWVzc2FnaW5nL2ZpbGVzL3VwbG9hZGluZyIgdGFyZ2V0PSIiIHRpdGxlPSJVcGxvYWRpbmcgZmlsZXMgdG8gU2xhY2siPlVwbG9hZGluZyBmaWxlcyB0byBTbGFjayA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvbWVzc2FnaW5nL2ZpbGVzL3JlbW90ZSIgdGFyZ2V0PSIiIHRpdGxlPSJBZGRpbmcgcmVtb3RlIGZpbGVzIj5BZGRpbmcgcmVtb3RlIGZpbGVzIDwvYT48L2xpPjwvdWw+PC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl9tZW51Ij48aDQgY2xhc3M9InNpZGViYXJfbWVudV9oZWFkZXIiPlJlZmVyZW5jZTwvaDQ+PHVsIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdCI+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3JlZmVyZW5jZS9tZXNzYWdpbmcvcGF5bG9hZCIgdGFyZ2V0PSIiIHRpdGxlPSJNZXNzYWdlcyI+TWVzc2FnZXMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3JlZmVyZW5jZS9ibG9jay1raXQvYmxvY2tzIiB0YXJnZXQ9IiIgdGl0bGU9IkJsb2NrcyI+QmxvY2tzIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9yZWZlcmVuY2UvbWVzc2FnaW5nL2F0dGFjaG1lbnRzIiB0YXJnZXQ9IiIgdGl0bGU9IlNlY29uZGFyeSBhdHRhY2htZW50cyI+U2Vjb25kYXJ5IGF0dGFjaG1lbnRzIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9yZWZlcmVuY2UvbWVzc2FnaW5nL2xpbmstdW5mdXJsaW5nIiB0YXJnZXQ9IiIgdGl0bGU9IkxpbmsgdW5mdXJsaW5nIj5MaW5rIHVuZnVybGluZyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvbWVzc2FnaW5nL2F0dGFjaG1lbnRzLXRvLWJsb2NrcyIgdGFyZ2V0PSIiIHRpdGxlPSJVcGdyYWRpbmcgdG8gYmxvY2tzIj5VcGdyYWRpbmcgdG8gYmxvY2tzIDwvYT48L2xpPjwvdWw+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl9ncm91cCBncm91cF9jb2xsYXBzZWQiIGRhdGEtZG9jc25hdj0iZ3JvdXAiIGlkPSJodWJfZ3JvdXBfYXBpcyI+PGRpdiBjbGFzcz0ic2lkZWJhcl9ncm91cF90aXRsZSIgZGF0YS1kb2NzbmF2PSJ0b2dnbGUiIGRhdGEtdGFyZ2V0PSJodWJfZ3JvdXBfYXBpcyI+PGkgY2xhc3M9ImMtaWNvbiBjLWljb24tLWNvZ3MiPjwvaT5BUElzPC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl9ncm91cF9jb2xsYXBzZSI+PGRpdiBjbGFzcz0ic2lkZWJhcl9tZW51Ij48dWwgY2xhc3M9InNpZGViYXJfbWVudV9saXN0Ij48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvYXBpcyIgdGFyZ2V0PSIiIHRpdGxlPSJPdmVydmlldyI+T3ZlcnZpZXcgPC9hPjwvbGk+PC91bD48L2Rpdj48ZGl2IGNsYXNzPSJzaWRlYmFyX21lbnUiPjxoNCBjbGFzcz0ic2lkZWJhcl9tZW51X2hlYWRlciI+VXNhZ2UgZ3VpZGVzPC9oND48dWwgY2xhc3M9InNpZGViYXJfbWVudV9saXN0Ij48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvd2ViIiB0YXJnZXQ9IiIgdGl0bGU9IlVzaW5nIHRoZSBXZWIgQVBJIj5Vc2luZyB0aGUgV2ViIEFQSSA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvZXZlbnRzLWFwaSIgdGFyZ2V0PSIiIHRpdGxlPSJVc2luZyB0aGUgRXZlbnRzIEFQSSI+VXNpbmcgdGhlIEV2ZW50cyBBUEkgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2RvY3MvcGFnaW5hdGlvbiIgdGFyZ2V0PSIiIHRpdGxlPSJQYWdpbmF0aW9uIj5QYWdpbmF0aW9uIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9kb2NzL3JhdGUtbGltaXRzIiB0YXJnZXQ9IiIgdGl0bGU9IlJhdGUgbGltaXRzIj5SYXRlIGxpbWl0cyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvYXBpcy9jaGFubmVscy1iZXR3ZWVuLW9yZ3MiIHRhcmdldD0iIiB0aXRsZT0iQ2hhbm5lbHMgYmV0d2VlbiBvcmdzIj5DaGFubmVscyBiZXR3ZWVuIG9yZ3MgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2RvY3Mvc2xhY2stc3RhdHVzIiB0YXJnZXQ9IiIgdGl0bGU9IlN0YXR1cyBBUEkiPlN0YXR1cyBBUEkgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2FwaXMvY2FsbHMiIHRhcmdldD0iIiB0aXRsZT0iQ2FsbHMgQVBJIj5DYWxscyBBUEkgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2RvY3MvcHJlc2VuY2UtYW5kLXN0YXR1cyIgdGFyZ2V0PSIiIHRpdGxlPSJQcmVzZW5jZSAmYW1wOyBzdGF0dXMiPlByZXNlbmNlICZhbXA7IHN0YXR1cyA8L2E+PC9saT48L3VsPjwvZGl2PjxkaXYgY2xhc3M9InNpZGViYXJfbWVudSI+PGg0IGNsYXNzPSJzaWRlYmFyX21lbnVfaGVhZGVyIj5SZWZlcmVuY2U8L2g0Pjx1bCBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3QiPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9tZXRob2RzIiB0YXJnZXQ9IiIgdGl0bGU9Ik1ldGhvZHMiPk1ldGhvZHMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2V2ZW50cyIgdGFyZ2V0PSIiIHRpdGxlPSJFdmVudCB0eXBlcyI+RXZlbnQgdHlwZXMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3R5cGVzIiB0YXJnZXQ9IiIgdGl0bGU9Ik9iamVjdCB0eXBlcyI+T2JqZWN0IHR5cGVzIDwvYT48L2xpPjwvdWw+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl9ncm91cCBncm91cF9jb2xsYXBzZWQiIGRhdGEtZG9jc25hdj0iZ3JvdXAiIGlkPSJodWJfZ3JvdXBfd29ya2Zsb3dzIj48ZGl2IGNsYXNzPSJzaWRlYmFyX2dyb3VwX3RpdGxlIiBkYXRhLWRvY3NuYXY9InRvZ2dsZSIgZGF0YS10YXJnZXQ9Imh1Yl9ncm91cF93b3JrZmxvd3MiPjxpIGNsYXNzPSJjLWljb24gYy1pY29uLS1tYWdpYyI+PC9pPldvcmtmbG93czwvZGl2PjxkaXYgY2xhc3M9InNpZGViYXJfZ3JvdXBfY29sbGFwc2UiPjxkaXYgY2xhc3M9InNpZGViYXJfbWVudSI+PHVsIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdCI+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3dvcmtmbG93cyIgdGFyZ2V0PSIiIHRpdGxlPSJPdmVydmlldyI+T3ZlcnZpZXcgPC9hPjwvbGk+PC91bD48L2Rpdj48ZGl2IGNsYXNzPSJzaWRlYmFyX21lbnUiPjxoNCBjbGFzcz0ic2lkZWJhcl9tZW51X2hlYWRlciI+V29ya2Zsb3dzIGZvciB1c2VyczwvaDQ+PHVsIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdCI+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3dvcmtmbG93cyNpbnRybyIgdGFyZ2V0PSIiIHRpdGxlPSJJbnRyb2R1Y3Rpb24iPkludHJvZHVjdGlvbiA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvd29ya2Zsb3dzI2J1aWxkaW5nX3dvcmtmbG93cyIgdGFyZ2V0PSIiIHRpdGxlPSJCdWlsZGluZyB3b3JrZmxvd3MiPkJ1aWxkaW5nIHdvcmtmbG93cyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSJodHRwczovL3NsYWNrLmNvbS9zbGFjay10aXBzL3dvcmtmbG93LWJ1aWxkZXItZXhhbXBsZXMiIHRhcmdldD0iX2JsYW5rIiB0aXRsZT0iUHJlLWJ1aWx0IHdvcmtmbG93cyI+UHJlLWJ1aWx0IHdvcmtmbG93cyA8dHMtaWNvbiBjbGFzcz0idHNfaWNvbl9leHRlcm5hbF9saW5rIj48L3RzLWljb24+PC9hPjwvbGk+PC91bD48L2Rpdj48ZGl2IGNsYXNzPSJzaWRlYmFyX21lbnUiPjxoNCBjbGFzcz0ic2lkZWJhcl9tZW51X2hlYWRlciI+V29ya2Zsb3dzIGZvciBkZXZlbG9wZXJzPC9oND48dWwgY2xhc3M9InNpZGViYXJfbWVudV9saXN0Ij48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvd29ya2Zsb3dzI3dlYmhvb2tzIiB0YXJnZXQ9IiIgdGl0bGU9IldlYmhvb2sgdHJpZ2dlcnMiPldlYmhvb2sgdHJpZ2dlcnMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3dvcmtmbG93cy9zdGVwcyIgdGFyZ2V0PSIiIHRpdGxlPSJTdGVwcyBmcm9tIGFwcHMiPlN0ZXBzIGZyb20gYXBwcyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2xhY2thcGkvd29ya2Zsb3ctcG93ZXJ1cHMiIHRhcmdldD0iIiB0aXRsZT0iV29ya2Zsb3cgUG93ZXJ1cHMiPldvcmtmbG93IFBvd2VydXBzIDwvYT48L2xpPjwvdWw+PC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl9tZW51Ij48aDQgY2xhc3M9InNpZGViYXJfbWVudV9oZWFkZXIiPlJlZmVyZW5jZTwvaDQ+PHVsIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdCI+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3JlZmVyZW5jZS93b3JrZmxvd3MvY29uZmlndXJhdGlvbi12aWV3IiB0YXJnZXQ9IiIgdGl0bGU9IkNvbmZpZ3VyYXRpb24gdmlld3MiPkNvbmZpZ3VyYXRpb24gdmlld3MgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3JlZmVyZW5jZS93b3JrZmxvd3Mvd29ya2Zsb3dfc3RlcCIgdGFyZ2V0PSIiIHRpdGxlPSJ3b3JrZmxvd19zdGVwIj53b3JrZmxvd19zdGVwIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9yZWZlcmVuY2Uvd29ya2Zsb3dzL3dvcmtmbG93X3N0ZXBfZWRpdCIgdGFyZ2V0PSIiIHRpdGxlPSJ3b3JrZmxvd19zdGVwX2VkaXQiPndvcmtmbG93X3N0ZXBfZWRpdCA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvZXZlbnRzL3dvcmtmbG93X3N0ZXBfZXhlY3V0ZSIgdGFyZ2V0PSIiIHRpdGxlPSJ3b3JrZmxvd19zdGVwX2V4ZWN1dGUiPndvcmtmbG93X3N0ZXBfZXhlY3V0ZSA8L2E+PC9saT48L3VsPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InNpZGViYXJfZ3JvdXAgZ3JvdXBfY29sbGFwc2VkIiBkYXRhLWRvY3NuYXY9Imdyb3VwIiBpZD0iaHViX2dyb3VwX2VudGVycHJpc2UiPjxkaXYgY2xhc3M9InNpZGViYXJfZ3JvdXBfdGl0bGUiIGRhdGEtZG9jc25hdj0idG9nZ2xlIiBkYXRhLXRhcmdldD0iaHViX2dyb3VwX2VudGVycHJpc2UiPjxpIGNsYXNzPSJjLWljb24gYy1pY29uLS1idWlsZGluZyI+PC9pPkVudGVycHJpc2U8L2Rpdj48ZGl2IGNsYXNzPSJzaWRlYmFyX2dyb3VwX2NvbGxhcHNlIj48ZGl2IGNsYXNzPSJzaWRlYmFyX21lbnUiPjxoNCBjbGFzcz0ic2lkZWJhcl9tZW51X2hlYWRlciI+RW50ZXJwcmlzZSBHcmlkPC9oND48dWwgY2xhc3M9InNpZGViYXJfbWVudV9saXN0Ij48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvZW50ZXJwcmlzZS9ncmlkIiB0YXJnZXQ9IiIgdGl0bGU9Ik92ZXJ2aWV3Ij5PdmVydmlldyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvZW50ZXJwcmlzZS9ncmlkL2RldmVsb3BpbmciIHRhcmdldD0iIiB0aXRsZT0iUHJlcGFyaW5nIHlvdXIgYXBwcyI+UHJlcGFyaW5nIHlvdXIgYXBwcyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvZW50ZXJwcmlzZS9ncmlkL3Rlc3RpbmciIHRhcmdldD0iIiB0aXRsZT0iVGVzdGluZyBvbiBHcmlkIj5UZXN0aW5nIG9uIEdyaWQgPC9hPjwvbGk+PC91bD48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJzaWRlYmFyX2dyb3VwIGdyb3VwX2NvbGxhcHNlZCIgZGF0YS1kb2NzbmF2PSJncm91cCIgaWQ9Imh1Yl9ncm91cF9hZG1pbnMiPjxkaXYgY2xhc3M9InNpZGViYXJfZ3JvdXBfdGl0bGUiIGRhdGEtZG9jc25hdj0idG9nZ2xlIiBkYXRhLXRhcmdldD0iaHViX2dyb3VwX2FkbWlucyI+PGkgY2xhc3M9ImMtaWNvbiBjLWljb24tLWZpbHRlcnMiPjwvaT5BcHBzIGZvciBBZG1pbnM8L2Rpdj48ZGl2IGNsYXNzPSJzaWRlYmFyX2dyb3VwX2NvbGxhcHNlIj48ZGl2IGNsYXNzPSJzaWRlYmFyX21lbnUiPjx1bCBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3QiPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9hZG1pbnMiIHRhcmdldD0iIiB0aXRsZT0iT3ZlcnZpZXciPk92ZXJ2aWV3IDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9hZG1pbnMvY2hhbm5lbHMiIHRhcmdldD0iIiB0aXRsZT0iTWFuYWdpbmcgY2hhbm5lbHMiPk1hbmFnaW5nIGNoYW5uZWxzIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9hZG1pbnMvYXBwcm92YWxzIiB0YXJnZXQ9IiIgdGl0bGU9Ik1hbmFnaW5nIGFwcCBhcHByb3ZhbHMiPk1hbmFnaW5nIGFwcCBhcHByb3ZhbHMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2FkbWlucy93b3Jrc3BhY2VzIiB0YXJnZXQ9IiIgdGl0bGU9Ik1hbmFnaW5nIHVzZXJzIj5NYW5hZ2luZyB1c2VycyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvYWRtaW5zL2ludml0aW5nIiB0YXJnZXQ9IiIgdGl0bGU9Ik1hbmFnaW5nIGludml0ZSByZXF1ZXN0cyI+TWFuYWdpbmcgaW52aXRlIHJlcXVlc3RzIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9tZXRob2RzL2FkbWluLnVzZXJzLnNlc3Npb24ucmVzZXQiIHRhcmdldD0iIiB0aXRsZT0iUmVzZXR0aW5nIHNlc3Npb25zIj5SZXNldHRpbmcgc2Vzc2lvbnMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2FkbWlucy9zY2ltIiB0YXJnZXQ9IiIgdGl0bGU9IlByb3Zpc2lvbmluZyB3aXRoIFNDSU0iPlByb3Zpc2lvbmluZyB3aXRoIFNDSU0gPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2FkbWlucy9hdWRpdC1sb2dzIiB0YXJnZXQ9IiIgdGl0bGU9IkF1ZGl0IExvZ3MgQVBJIj5BdWRpdCBMb2dzIEFQSSA8L2E+PC9saT48L3VsPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InNpZGViYXJfZ3JvdXAgc2lkZWJhcl9yZWZlcmVuY2VfbGluayI+PGRpdiBjbGFzcz0ic2lkZWJhcl9ncm91cF90aXRsZSI+PGkgY2xhc3M9ImMtaWNvbiBjLWljb24tLWNvZGUiPjwvaT48YSBocmVmPSIvcmVmZXJlbmNlIj5SZWZlcmVuY2U8L2E+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl90cmF2ZWxpbmdfbmF2Ij48ZGl2IGNsYXNzPSJzaWRlYmFyX21lbnUiPjx1bCBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3QiPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9jaGFuZ2Vsb2ciIHRhcmdldD0iIiB0aXRsZT0iQ2hhbmdlbG9nIj5DaGFuZ2Vsb2cgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL2RldmVsb3Blci1iZXRhIiB0YXJnZXQ9IiIgdGl0bGU9IkJldGEgZmVhdHVyZXMiPkJldGEgZmVhdHVyZXMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iaHR0cHM6Ly9tZWRpdW0uY29tL3NsYWNrLWRldmVsb3Blci1ibG9nIiB0YXJnZXQ9IiIgdGl0bGU9IkRldmVsb3BlciBibG9nIj5EZXZlbG9wZXIgYmxvZyA8L2E+PC9saT48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvcm9hZG1hcCIgdGFyZ2V0PSIiIHRpdGxlPSJSb2FkbWFwIj5Sb2FkbWFwIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vc2xhY2thcGkiIHRhcmdldD0iIiB0aXRsZT0iQFNsYWNrQVBJIj5AU2xhY2tBUEkgPC9hPjwvbGk+PC91bD48L2Rpdj48ZGl2IGNsYXNzPSJzaWRlYmFyX21lbnUiPjxoNCBjbGFzcz0ic2lkZWJhcl9tZW51X2hlYWRlciI+UmVzb3VyY2VzPC9oND48dWwgY2xhc3M9InNpZGViYXJfbWVudV9saXN0Ij48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvdG9vbHMiIHRhcmdldD0iIiB0aXRsZT0iT3VyIHRvb2xzIj5PdXIgdG9vbHMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iL3N1cHBvcnQiIHRhcmdldD0iIiB0aXRsZT0iR2V0IHN1cHBvcnQiPkdldCBzdXBwb3J0IDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Imh0dHBzOi8vc2xhY2suY29tL3BhcnRuZXJzIiB0YXJnZXQ9IiIgdGl0bGU9IlBhcnRuZXIgd2l0aCB1cyI+UGFydG5lciB3aXRoIHVzIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9sYW5nL2phLWpwIiB0YXJnZXQ9IiIgdGl0bGU9IvCfh6/wn4e1ICDml6XmnKzoqp4iPvCfh6/wn4e1ICDml6XmnKzoqp4gPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iaHR0cHM6Ly9zbGFjay5jb20vdGVybXMtb2Ytc2VydmljZS9hcGkiIHRhcmdldD0iIiB0aXRsZT0iQVBJIFRlcm1zIG9mIFNlcnZpY2UiPkFQSSBUZXJtcyBvZiBTZXJ2aWNlIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Imh0dHBzOi8vc2xhY2suY29tL2RldmVsb3BlcnMvZnVuZCIgdGFyZ2V0PSIiIHRpdGxlPSJTbGFjayBGdW5kIj5TbGFjayBGdW5kIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9mYXEiIHRhcmdldD0iIiB0aXRsZT0iRkFRIj5GQVEgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iaHR0cHM6Ly9zbGFjay5lbmdpbmVlcmluZyIgdGFyZ2V0PSIiIHRpdGxlPSJTbGFjayBFbmdpbmVlcmluZyI+U2xhY2sgRW5naW5lZXJpbmcgPC9hPjwvbGk+PC91bD48L2Rpdj48ZGl2IGNsYXNzPSJzaWRlYmFyX21lbnUiPjxoNCBjbGFzcz0ic2lkZWJhcl9tZW51X2hlYWRlciI+Q29tbXVuaXR5PC9oND48dWwgY2xhc3M9InNpZGViYXJfbWVudV9saXN0Ij48bGk+PGEgY2xhc3M9InNpZGViYXJfbWVudV9saXN0X2l0ZW0gIiBocmVmPSIvY29tbXVuaXR5IiB0YXJnZXQ9IiIgdGl0bGU9IlRvb2xzIGFuZCByZXNvdXJjZXMiPlRvb2xzIGFuZCByZXNvdXJjZXMgPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJzaWRlYmFyX21lbnVfbGlzdF9pdGVtICIgaHJlZj0iaHR0cHM6Ly9zbGFja2NvbW11bml0eS5jb20/dXRtX21lZGl1bT1yZWZlcnJhbCZhbXA7dXRtX3NvdXJjZT1hcGlzbGFjayZhbXA7dXRtX2NhbXBhaWduPWZ5MjAtUTEwMy1zcGNsYXVuY2giIHRhcmdldD0iIiB0aXRsZT0iR3JvdXBzIGFuZCBldmVudHMiPkdyb3VwcyBhbmQgZXZlbnRzIDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9jb21tdW5pdHkvY29kZS1vZi1jb25kdWN0IiB0YXJnZXQ9IiIgdGl0bGU9IkNvZGUgb2YgQ29uZHVjdCI+Q29kZSBvZiBDb25kdWN0IDwvYT48L2xpPjxsaT48YSBjbGFzcz0ic2lkZWJhcl9tZW51X2xpc3RfaXRlbSAiIGhyZWY9Ii9kb2NzL2hvc3RpbmciIHRhcmdldD0iIiB0aXRsZT0iSG9zdGluZyBwcm92aWRlcnMiPkhvc3RpbmcgcHJvdmlkZXJzIDwvYT48L2xpPjwvdWw+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ic2lkZWJhcl9tZW51IHNpZGViYXJfaGVscF9saW5rIj48cD48YSBkYXRhLWd0bS1jbGljaz0iQVBJR2V0SGVscCIgZGF0YS1jbG9nLWV2ZW50PSJBUFBfRElSRUNUT1JZX1dFQlNJVEVfQ0xJQ0siIGRhdGEtY2xvZy1wYXJhbXM9ImNsaWNrX3RhcmdldD1hcGlfbmF2X2dldF9oZWxwX2J0biIgaHJlZj0iL3N1cHBvcnQ/cmVmPWFwaV9uYXYiIGNsYXNzPSJidG4iPkdldCBIZWxwPC9hPjwvcD48L2Rpdj48L2Rpdj48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPihmdW5jdGlvbigpIHsKCWNvbnN0IG5hdkNvbGxhcHNlciA9IChldmUpID0+IHsKCQljb25zdCB0YXJnZXRfaWQgPSBldmUuc3JjRWxlbWVudC5kYXRhc2V0LnRhcmdldDsKCQl2YXIgdGFyZ2V0X2dyb3VwID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignIycrdGFyZ2V0X2lkKTsKCQl0YXJnZXRfZ3JvdXAuY2xhc3NMaXN0LnRvZ2dsZSgnZ3JvdXBfZXhwYW5kZWQnKTsKCQl0YXJnZXRfZ3JvdXAuY2xhc3NMaXN0LnRvZ2dsZSgnZ3JvdXBfY29sbGFwc2VkJyk7Cgl9OwoJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtZG9jc25hdj10b2dnbGVdJykuZm9yRWFjaCgodG9nZ2xlKSA9PiB7CgkJdG9nZ2xlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbmF2Q29sbGFwc2VyKQoJfSk7Cn0pKCk7PC9zY3JpcHQ+PC9uYXY+PGRpdiBpZD0iYXBpX21haW5fY29udGVudCIgY2xhc3M9ImNvbCI+PGRpdiBjbGFzcz0iY2FyZCI+PHNlY3Rpb24+PGRpdiBjbGFzcz0iYm90dG9tX21hcmdpbiI+PGZvcm0gY2xhc3M9InNlYXJjaCIgYWNjZXB0LWNoYXJzZXQ9IlVURi04IiBhY3Rpb249Ii9zZWFyY2giIG1ldGhvZD0iZ2V0IiByb2xlPSJzZWFyY2giPjxkaXYgY2xhc3M9ImNsZWFyZml4Ij48ZGl2IGNsYXNzPSJjb2wgc3Bhbl8xMF9vZl8xMiBzbWFsbF9sZWZ0X3BhZGRpbmciPjxkaXYgY2xhc3M9ImMtZmlsdGVyX2lucHV0IGFwaV9zZWFyY2giIHJvbGU9InByZXNlbnRhdGlvbiI+PHRzLWljb24gY2xhc3M9ImMtaWNvbiBudWRnZV90b3BfMSBjLWljb24tLXNlYXJjaC1tZWRpdW0gc21hbGxfcmlnaHRfcGFkZGluZyIgYXJpYS1oaWRkZW49InRydWUiPjwvdHMtaWNvbj48aW5wdXQgY2xhc3M9InNlYXJjaF9pbnB1dCIgaWQ9InF1ZXJ5IiBuYW1lPSJxdWVyeSIgdmFsdWU9IiIgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9IlNlYXJjaCBvdXIgZG9jcywgdHV0b3JpYWxzLCBjaGFuZ2Vsb2dzLCBhbmQgbW9yZSIgZGF0YS1zbWFsbHBsYWNlaG9sZGVyPSJTZWFyY2ggdGhlIGRvY3VtZW50YXRpb24iPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImZyb20iIHZhbHVlPSJob21lIj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJjb2wgc3Bhbl8yX29mXzEyIG5vX3BhZGRpbmcgbm9fbWFyZ2luIj48aW5wdXQgdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGZ1bGxfd2lkdGgiIHZhbHVlPSJTZWFyY2giPjwvZGl2PjwvZGl2PjwvZm9ybT48L2Rpdj48L3NlY3Rpb24+PHNlY3Rpb24+PGRpdiBjbGFzcz0iZGlzcGxheV9mbGV4IGFsaWduX2l0ZW1zX2NlbnRlciBhcGlfaG9tZV9leGFtcGxlX3JvdyI+PGRpdiBjbGFzcz0iZmxleF9ub25lIGFwaV9ob21lX2V4YW1wbGVfaW1hZ2VfY29udGFpbmVyIj48aW1nIHNyYz0iaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tLzlhYTk2L2ltZy9hcGkvaG9tZXBhZ2VfZXhhbXBsZV92aXNpdGJvdC5wbmciIHNyY3NldD0iaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tLzlhYTk2L2ltZy9hcGkvaG9tZXBhZ2VfZXhhbXBsZV92aXNpdGJvdC5wbmcgMXgsIGh0dHBzOi8vYS5zbGFjay1lZGdlLmNvbS85YWE5Ni9pbWcvYXBpL2hvbWVwYWdlX2V4YW1wbGVfdmlzaXRib3RAMngucG5nIDJ4Ij48L2Rpdj48ZGl2IGNsYXNzPSJhcGlfaG9tZV9leGFtcGxlX3RleHRfY29udGFpbmVyIj48aDMgY2xhc3M9ImJsYWNrIj5TZW5kIG1lc3NhZ2VzPC9oMz48cD5NZXNzYWdlcyBhcmUgdGhlIGJ1aWxkaW5nIGJsb2NrcyBvZiBhcHBzIGFuZCBib3RzLiBTdGFydCBmcm9tICZsZHF1bztIZWxsbywgd29ybGQsJnJkcXVvOyBvciBjb25uZWN0IGEgc2VydmljZSB5b3UgYWxyZWFkeSB1c2UuPC9wPjxhc2lkZSBjbGFzcz0ic21hbGwiPkxlYXJuIGFib3V0IDxhIGhyZWY9Ii9kb2NzL21lc3NhZ2VzIj5tZXNzYWdlczwvYT4gJmFtcDsgPGEgaHJlZj0iL21lc3NhZ2luZy93ZWJob29rcyI+aW5jb21pbmcgd2ViaG9va3M8L2E+LjwvYXNpZGU+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iZGlzcGxheV9mbGV4IGFsaWduX2l0ZW1zX2NlbnRlciBhcGlfaG9tZV9leGFtcGxlX3JvdyI+PGRpdiBjbGFzcz0iYXBpX2hvbWVfZXhhbXBsZV90ZXh0X2NvbnRhaW5lciI+PGgzIGNsYXNzPSJibGFjayI+R2l2ZSB1c2VycyBhIHNob3J0Y3V0PC9oMz48cD5IZWxwIHVzZXJzIGRpc2NvdmVyIHdoYXQgeW91ciBhcHAgY2FuIGRvIHdpdGggU2hvcnRjdXRzLjwvcD48YXNpZGUgY2xhc3M9InNtYWxsIj5MZWFybiBhYm91dCA8YSBocmVmPSIvaW50ZXJhY3Rpdml0eS9zaG9ydGN1dHMiPlNob3J0Y3V0czwvYT4gJmFtcDsgPGEgaHJlZj0iL3N1cmZhY2VzL21vZGFscyI+TW9kYWxzPC9hPi48L2FzaWRlPjwvZGl2PjxkaXYgY2xhc3M9ImZsZXhfbm9uZSBhcGlfaG9tZV9leGFtcGxlX2ltYWdlX2NvbnRhaW5lciI+PGltZyBzcmM9Imh0dHBzOi8vYS5zbGFjay1lZGdlLmNvbS85YWE5Ni9pbWcvYXBpL2hvbWVwYWdlX2hlbHBkZXNrX3Nob3J0Y3V0LnBuZyIgc3Jjc2V0PSJodHRwczovL2Euc2xhY2stZWRnZS5jb20vOWFhOTYvaW1nL2FwaS9ob21lcGFnZV9oZWxwZGVza19zaG9ydGN1dC5wbmcgMXgsIGh0dHBzOi8vYS5zbGFjay1lZGdlLmNvbS85YWE5Ni9pbWcvYXBpL2hvbWVwYWdlX2hlbHBkZXNrX3Nob3J0Y3V0QDJ4LnBuZyAyeCI+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iZGlzcGxheV9mbGV4IGFsaWduX2l0ZW1zX2NlbnRlciBhcGlfaG9tZV9leGFtcGxlX3JvdyI+PGRpdiBjbGFzcz0iZmxleF9ub25lIGFwaV9ob21lX2V4YW1wbGVfaW1hZ2VfY29udGFpbmVyIj48aW1nIHNyYz0iaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tL2U5YzhmL2ltZy9hcGkvaG9tZXBhZ2VfZXhhbXBsZV93b3JrZmxvdy5wbmciIHNyY3NldD0iaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tL2U5YzhmL2ltZy9hcGkvaG9tZXBhZ2VfZXhhbXBsZV93b3JrZmxvdy5wbmcgMXgsIGh0dHBzOi8vYS5zbGFjay1lZGdlLmNvbS9lOWM4Zi9pbWcvYXBpL2hvbWVwYWdlX2V4YW1wbGVfd29ya2Zsb3dAMngucG5nIDJ4Ij48L2Rpdj48ZGl2IGNsYXNzPSJhcGlfaG9tZV9leGFtcGxlX3RleHRfY29udGFpbmVyIj48aDMgY2xhc3M9ImJsYWNrIj5BdXRvbWF0ZSB3aXRoIHdvcmtmbG93czwvaDM+PHA+SGFybmVzcyB0aGUgcG93ZXIgb2YgYXBwcywgd2l0aG91dCB0aGUgY29kZS48L3A+PGFzaWRlIGNsYXNzPSJzbWFsbCI+IExlYXJuIGFib3V0IDxhIGhyZWY9Ii9zdGFydC9idWlsZGluZy93b3JrZmxvdy1idWlsZGVyIj5Xb3JrZmxvdyBCdWlsZGVyPC9hPi4gPC9hc2lkZT48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJkaXNwbGF5X2ZsZXggYWxpZ25faXRlbXNfY2VudGVyIGFwaV9ob21lX2V4YW1wbGVfcm93Ij48ZGl2IGNsYXNzPSJhcGlfaG9tZV9leGFtcGxlX3RleHRfY29udGFpbmVyIj48aDMgY2xhc3M9ImJsYWNrIj5DcmVhdGUgc2ltcGxlIGludGVyYWN0aW9uczwvaDM+PHA+WW91ciBhcHAgY2FuIHJlc3BvbmQgdG8gdXNlciBhY3Rpdml0eSwgYW5kIGJ1dHRvbnMgbGV0IHVzZXJzIGNvbXBsZXRlIHNpbXBsZSB0YXNrcyAobGlrZSByZXF1ZXN0cyBhbmQgYXBwcm92YWxzKS48L3A+PGFzaWRlIGNsYXNzPSJzbWFsbCI+IExlYXJuIGFib3V0IDxhIGhyZWY9Ii9pbnRlcmFjdGl2ZS1tZXNzYWdlcyI+SW50ZXJhY3RpdmUgY29tcG9uZW50czwvYT4gJmFtcDsgPGEgaHJlZj0iL2V2ZW50cy1hcGkiPkV2ZW50cyBBUEk8L2E+LiA8L2FzaWRlPjwvZGl2PjxkaXYgY2xhc3M9ImZsZXhfbm9uZSBhcGlfaG9tZV9leGFtcGxlX2ltYWdlX2NvbnRhaW5lciI+PGltZyBzcmM9Imh0dHBzOi8vYS5zbGFjay1lZGdlLmNvbS85YWE5Ni9pbWcvYXBpL2hvbWVwYWdlX2V4YW1wbGVfaGlyZXRyb24ucG5nIiBzcmNzZXQ9Imh0dHBzOi8vYS5zbGFjay1lZGdlLmNvbS85YWE5Ni9pbWcvYXBpL2hvbWVwYWdlX2V4YW1wbGVfaGlyZXRyb24ucG5nIDF4LCBodHRwczovL2Euc2xhY2stZWRnZS5jb20vOWFhOTYvaW1nL2FwaS9ob21lcGFnZV9leGFtcGxlX2hpcmV0cm9uQDJ4LnBuZyAyeCI+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iZGlzcGxheV9mbGV4IGFsaWduX2l0ZW1zX2NlbnRlciBhcGlfaG9tZV9leGFtcGxlX3JvdyI+PGRpdiBjbGFzcz0iZmxleF9ub25lIGFwaV9ob21lX2V4YW1wbGVfaW1hZ2VfY29udGFpbmVyIj48aW1nIHNyYz0iaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tLzlhYTk2L2ltZy9hcGkvaG9tZXBhZ2VfZXhhbXBsZV9leHBlbnNpYm90LnBuZyIgc3Jjc2V0PSJodHRwczovL2Euc2xhY2stZWRnZS5jb20vOWFhOTYvaW1nL2FwaS9ob21lcGFnZV9leGFtcGxlX2V4cGVuc2lib3QucG5nIDF4LCBodHRwczovL2Euc2xhY2stZWRnZS5jb20vOWFhOTYvaW1nL2FwaS9ob21lcGFnZV9leGFtcGxlX2V4cGVuc2lib3RAMngucG5nIDJ4Ij48L2Rpdj48ZGl2IGNsYXNzPSJhcGlfaG9tZV9leGFtcGxlX3RleHRfY29udGFpbmVyIj48aDMgY2xhc3M9ImJsYWNrIj5TZXQgdXAgaW50ZXJuYWwgdG9vbHM8L2gzPjxwPk5lZWQgYSBzbGFzaCBjb21tYW5kIG9yIGEgYm90IGp1c3QgZm9yIHlvdXIgdGVhbT8gQWxsIG91ciB0b29scyBjYW4gYmUgdXNlZCBmb3IgaW50ZXJuYWwgaW50ZWdyYXRpb25zLjwvcD48YXNpZGUgY2xhc3M9InNtYWxsIj5MZWFybiBhYm91dCA8YSBocmVmPSIvaW50ZXJuYWwtaW50ZWdyYXRpb25zIj5JbnRlcm5hbCBpbnRlZ3JhdGlvbnM8L2E+LjwvYXNpZGU+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iZGlzcGxheV9mbGV4IGFsaWduX2l0ZW1zX2NlbnRlciBhcGlfaG9tZV9leGFtcGxlX3JvdyI+PGRpdiBjbGFzcz0iYXBpX2hvbWVfZXhhbXBsZV90ZXh0X2NvbnRhaW5lciI+PGgzIGNsYXNzPSJibGFjayI+UHVibGlzaCB5b3VyIGFwcDwvaDM+PHA+U3VibWl0IHlvdXIgYXBwIHRvIHRoZSBTbGFjayBBcHAgRGlyZWN0b3J5LCBhbmQgcmVhY2ggbWlsbGlvbnMgb2YgZGFpbHkgYWN0aXZlIFNsYWNrIHVzZXJzLjwvcD48YXNpZGUgY2xhc3M9InNtYWxsIj5MZWFybiBhYm91dCB0aGUgPGEgaHJlZj0iL2RvY3Mvc2xhY2stYXBwcy1jaGVja2xpc3QiPkFwcCBkaXJlY3RvcnkgY2hlY2tsaXN0PC9hPi48L2FzaWRlPjwvZGl2PjxkaXYgY2xhc3M9ImZsZXhfbm9uZSBhcGlfaG9tZV9leGFtcGxlX2ltYWdlX2NvbnRhaW5lciI+PGltZyBzcmM9Imh0dHBzOi8vYS5zbGFjay1lZGdlLmNvbS84MDU4OC9pbWcvYXBpL2hvbWVwYWdlX2V4YW1wbGVfY2hlY2tsaXN0LnBuZyIgc3Jjc2V0PSJodHRwczovL2Euc2xhY2stZWRnZS5jb20vODA1ODgvaW1nL2FwaS9ob21lcGFnZV9leGFtcGxlX2NoZWNrbGlzdC5wbmcgMXgsIGh0dHBzOi8vYS5zbGFjay1lZGdlLmNvbS84MDU4OC9pbWcvYXBpL2hvbWVwYWdlX2V4YW1wbGVfY2hlY2tsaXN0QDJ4LnBuZyAyeCI+PC9kaXY+PC9kaXY+PC9zZWN0aW9uPjxzZWN0aW9uPjxoMiBjbGFzcz0iYWxpZ25fY2VudGVyIGJsYWNrIj5MYXRlc3QgZnJvbSB0aGUgY2hhbmdlbG9nPGltZyBzcmM9Imh0dHBzOi8vYS5zbGFjay1lZGdlLmNvbS84MDU4OC9pbWcvYXBpL2hvbWVwYWdlX2Jsb2dfc2hhcGVzLnBuZyIgc3Jjc2V0PSJodHRwczovL2Euc2xhY2stZWRnZS5jb20vODA1ODgvaW1nL2FwaS9ob21lcGFnZV9ibG9nX3NoYXBlcy5wbmcgMXgsIGh0dHBzOi8vYS5zbGFjay1lZGdlLmNvbS84MDU4OC9pbWcvYXBpL2hvbWVwYWdlX2Jsb2dfc2hhcGVzQDJ4LnBuZyAyeCIgY2xhc3M9ImFwaV9ob21lX2Jsb2dfaW1hZ2UgbGVmdF9tYXJnaW4iPjwvaDI+PGRpdiBjbGFzcz0iYm90dG9tX2JvcmRlciBkaXNwbGF5X2ZsZXggc21hbGxfdG9wX3BhZGRpbmcgc21hbGxfYm90dG9tX3BhZGRpbmciPjxkaXYgY2xhc3M9ImFwaV9ob21lX2Jsb2dfcG9zdF9taWRkbGVfY29udGFpbmVyIHNtYWxsX2xlZnRfcGFkZGluZyBmbGV4X25vbmUiPjxzcGFuPk9jdCA2LCAyMDIwPC9zcGFuPjwvZGl2PjxkaXY+PHAgY2xhc3M9Im5vcm1hbCI+PGEgY2xhc3M9ImluZGlmZmVyZW50X2dyZXkiIGhyZWY9Ii9zdXJmYWNlcy9tZXNzYWdlcyI+QmxvY2sgS2l0IGNoZWNrYm94ZXMgYW5kIHJhZGlvIGJ1dHRvbnMgYXJlIG5vdyBhdmFpbGFibGUgdG8gdXNlIGluIG1lc3NhZ2VzLiBRdWlja2x5IGFuZCBjb252ZXJzYXRpb25hbGx5IGNvbGxlY3QgaW5mb3JtYXRpb24gZnJvbSB1c2VycyBieSA8YSBocmVmPSIvcmVmZXJlbmNlL2Jsb2NrLWtpdC9pbnRlcmFjdGl2ZS1jb21wb25lbnRzIj5pbmNsdWRpbmcgdGhlbSBpbmxpbmU8L2E+Lgo8L2E+PC9wPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImJvdHRvbV9ib3JkZXIgZGlzcGxheV9mbGV4IHNtYWxsX3RvcF9wYWRkaW5nIHNtYWxsX2JvdHRvbV9wYWRkaW5nIj48ZGl2IGNsYXNzPSJhcGlfaG9tZV9ibG9nX3Bvc3RfbWlkZGxlX2NvbnRhaW5lciBzbWFsbF9sZWZ0X3BhZGRpbmcgZmxleF9ub25lIj48c3Bhbj5PY3QgNiwgMjAyMDwvc3Bhbj48L2Rpdj48ZGl2PjxwIGNsYXNzPSJub3JtYWwiPjxhIGNsYXNzPSJpbmRpZmZlcmVudF9ncmV5IiBocmVmPSIvcmVmZXJlbmNlL2Jsb2NrLWtpdC9ibG9ja3MjaW5wdXQiPkdhdGhlciBkYXRhIGZyb20gdXNlcnMgZGlyZWN0bHkgZnJvbSB5b3VyIEFwcCBIb21l4oCUPGEgaHJlZj0iL3JlZmVyZW5jZS9ibG9jay1raXQvYmxvY2tzI2lucHV0Ij5pbnB1dCBibG9ja3M8L2E+IGNhbiBub3cgYmUgYWRkZWQgdG8gPGEgaHJlZj0iL3N1cmZhY2VzL3RhYnMiPkhvbWUgdGFiczwvYT4uIEFkZGl0aW9uYWxseSwgaW5wdXQgYmxvY2tzIGNhbiBub3cgZGlzcGF0Y2ggPGEgaHJlZj0iL3JlZmVyZW5jZS9pbnRlcmFjdGlvbi1wYXlsb2Fkcy9ibG9jay1hY3Rpb25zIj48Y29kZT5ibG9ja19hY3Rpb25zPC9jb2RlPiBwYXlsb2FkczwvYT4gd2hlbiBzb21lb25lIGludGVyYWN0cyB3aXRoIHRoZW0uIDxhIGhyZWY9Ii9yZWZlcmVuY2UvYmxvY2sta2l0L2Jsb2NrcyNpbnB1dCI+UmVhZCBhYm91dCB0aGUgbmV3IDxjb2RlPmRpc3BhdGNoX2FjdGlvbnM8L2NvZGU+IGZsYWc8L2E+Lgo8L2E+PC9wPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImJvdHRvbV9ib3JkZXIgZGlzcGxheV9mbGV4IHNtYWxsX3RvcF9wYWRkaW5nIHNtYWxsX2JvdHRvbV9wYWRkaW5nIj48ZGl2IGNsYXNzPSJhcGlfaG9tZV9ibG9nX3Bvc3RfbWlkZGxlX2NvbnRhaW5lciBzbWFsbF9sZWZ0X3BhZGRpbmcgZmxleF9ub25lIj48c3Bhbj5PY3QgMSwgMjAyMDwvc3Bhbj48L2Rpdj48ZGl2PjxwIGNsYXNzPSJub3JtYWwiPjxhIGNsYXNzPSJpbmRpZmZlcmVudF9ncmV5IiBocmVmPSJodHRwczovL3NsYWNrLmNvbS9hcHBzIj5XZSByZWZyZXNoZWQgdGhlIGxvb2sgb2YgeW91ciBhcHAncyBsaXN0aW5nIGluIHRoZSA8YSBocmVmPSJodHRwczovL3NsYWNrLmNvbS9hcHBzIj5BcHAgRGlyZWN0b3J5PC9hPi4gQW1vbmcgdGhlIGNoYW5nZXM6IGEgPHN0cm9uZz5GZWF0dXJlczwvc3Ryb25nPiB0YWIgc2hvd3MgeW91ciBhcHAncyA8YSBocmVmPSIvaW50ZXJhY3Rpdml0eS9lbnRyeS1wb2ludHMiPmVudHJ5IHBvaW50czwvYT7igJRsaWtlIDxhIGhyZWY9Ii9pbnRlcmFjdGl2aXR5L3Nob3J0Y3V0cyI+c2hvcnRjdXRzPC9hPiBhbmQgPGEgaHJlZj0iL2ludGVyYWN0aXZpdHkvc2xhc2gtY29tbWFuZHMiPnNsYXNoIGNvbW1hbmRzPC9hPi4KPC9hPjwvcD48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJub3JtYWxfcGFkZGluZ190b3AgbGFyZ2VfbWFyZ2luX2JvdHRvbSBhbGlnbl9jZW50ZXIiPjxwIGNsYXNzPSJsYXJnZV90b3BfbWFyZ2luIHZlcnlfbGFyZ2VfYm90dG9tX21hcmdpbiI+QnJvd3NlIG1vcmUgb2YgdGhlIENoYW5nZWxvZyA8YSBocmVmPSIvY2hhbmdlbG9nIj5oZXJlPC9hPi48L3A+PC9kaXY+PC9zZWN0aW9uPjxzZWN0aW9uPjxoMiBjbGFzcz0iYWxpZ25fY2VudGVyIGJsYWNrIj5MYXRlc3QgZnJvbSB0aGUgcGxhdGZvcm0gYmxvZzxpbWcgc3JjPSJodHRwczovL2Euc2xhY2stZWRnZS5jb20vODA1ODgvaW1nL2FwaS9ob21lcGFnZV9ibG9nX3NoYXBlcy5wbmciIHNyY3NldD0iaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tLzgwNTg4L2ltZy9hcGkvaG9tZXBhZ2VfYmxvZ19zaGFwZXMucG5nIDF4LCBodHRwczovL2Euc2xhY2stZWRnZS5jb20vODA1ODgvaW1nL2FwaS9ob21lcGFnZV9ibG9nX3NoYXBlc0AyeC5wbmcgMngiIGNsYXNzPSJhcGlfaG9tZV9ibG9nX2ltYWdlIGxlZnRfbWFyZ2luIj48L2gyPjxkaXYgY2xhc3M9ImJvdHRvbV9ib3JkZXIgZGlzcGxheV9mbGV4IHNtYWxsX3RvcF9wYWRkaW5nIHNtYWxsX2JvdHRvbV9wYWRkaW5nIj48ZGl2IGNsYXNzPSJhcGlfaG9tZV9ibG9nX3Bvc3RfbWlkZGxlX2NvbnRhaW5lciBsZWZ0X3BhZGRpbmcgZmxleF9ub25lIj48c3Bhbj5BdWcgMTgsIDIwMjA8L3NwYW4+PC9kaXY+PGRpdj48aDQgY2xhc3M9Im5vcm1hbCI+PGEgY2xhc3M9ImluZGlmZmVyZW50X2dyZXkiIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9zbGFjay1kZXZlbG9wZXItYmxvZy9tdWx0aXBseS15b3VyLWFwcHMtcmVhY2gtd2l0aC1zbGFjay1jb25uZWN0LWY2ZTM5Nzg4ZjY5OT9zb3VyY2U9cnNzLS0tLWQ3NmMwNjA1YjkyMi0tLTQiPk11bHRpcGx5IHlvdXIgYXBw4oCZcyByZWFjaCB3aXRoIFNsYWNrIENvbm5lY3Q8L2E+PC9oND48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJib3R0b21fYm9yZGVyIGRpc3BsYXlfZmxleCBzbWFsbF90b3BfcGFkZGluZyBzbWFsbF9ib3R0b21fcGFkZGluZyI+PGRpdiBjbGFzcz0iYXBpX2hvbWVfYmxvZ19wb3N0X21pZGRsZV9jb250YWluZXIgbGVmdF9wYWRkaW5nIGZsZXhfbm9uZSI+PHNwYW4+QXVnIDQsIDIwMjA8L3NwYW4+PC9kaXY+PGRpdj48aDQgY2xhc3M9Im5vcm1hbCI+PGEgY2xhc3M9ImluZGlmZmVyZW50X2dyZXkiIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9zbGFjay1kZXZlbG9wZXItYmxvZy9zbGFjay1vbi1zbGFjay1kZWxpdmVyaW5nLWltcGFjdGZ1bC1pbnRlcm5hbC1wcm9kdWN0cy05ZjNlNjI0MDM0OTI/c291cmNlPXJzcy0tLS1kNzZjMDYwNWI5MjItLS00Ij5TbGFjayBvbiBTbGFjazogRGVsaXZlcmluZyBpbXBhY3RmdWwgaW50ZXJuYWwgcHJvZHVjdHM8L2E+PC9oND48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJib3R0b21fYm9yZGVyIGRpc3BsYXlfZmxleCBzbWFsbF90b3BfcGFkZGluZyBzbWFsbF9ib3R0b21fcGFkZGluZyI+PGRpdiBjbGFzcz0iYXBpX2hvbWVfYmxvZ19wb3N0X21pZGRsZV9jb250YWluZXIgbGVmdF9wYWRkaW5nIGZsZXhfbm9uZSI+PHNwYW4+SnVsIDI5LCAyMDIwPC9zcGFuPjwvZGl2PjxkaXY+PGg0IGNsYXNzPSJub3JtYWwiPjxhIGNsYXNzPSJpbmRpZmZlcmVudF9ncmV5IiBocmVmPSJodHRwczovL21lZGl1bS5jb20vc2xhY2stZGV2ZWxvcGVyLWJsb2cvYS1uZXctZGVzaWduLWFwcHJvYWNoLTYzNjFiZDU0NmI3P3NvdXJjZT1yc3MtLS0tZDc2YzA2MDViOTIyLS0tNCI+QSBuZXcgZGVzaWduIGFwcHJvYWNoPC9hPjwvaDQ+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ibm9ybWFsX3BhZGRpbmdfdG9wIGxhcmdlX21hcmdpbl9ib3R0b20gYWxpZ25fY2VudGVyIj48cCBjbGFzcz0ibGFyZ2VfdG9wX21hcmdpbiB2ZXJ5X2xhcmdlX2JvdHRvbV9tYXJnaW4iPkJyb3dzZSBtb3JlIG9mIHRoZSBQbGF0Zm9ybSBCbG9nIDxhIGhyZWY9Imh0dHBzOi8vbWVkaXVtLmNvbS9zbGFjay1kZXZlbG9wZXItYmxvZyI+aGVyZTwvYT4uPC9wPjwvZGl2Pjwvc2VjdGlvbj48c2VjdGlvbj48aDIgY2xhc3M9ImFsaWduX2NlbnRlciBibGFjayI+UmVjZW50IHR1dG9yaWFsczxpbWcgc3JjPSJodHRwczovL2Euc2xhY2stZWRnZS5jb20vODA1ODgvaW1nL2FwaS9ob21lcGFnZV9ibG9nX3NoYXBlcy5wbmciIHNyY3NldD0iaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tLzgwNTg4L2ltZy9hcGkvaG9tZXBhZ2VfYmxvZ19zaGFwZXMucG5nIDF4LCBodHRwczovL2Euc2xhY2stZWRnZS5jb20vODA1ODgvaW1nL2FwaS9ob21lcGFnZV9ibG9nX3NoYXBlc0AyeC5wbmcgMngiIGNsYXNzPSJhcGlfaG9tZV9ibG9nX2ltYWdlIGxlZnRfbWFyZ2luIj48L2gyPjxkaXYgY2xhc3M9ImJvdHRvbV9ib3JkZXIgZGlzcGxheV9mbGV4IHNtYWxsX3RvcF9wYWRkaW5nIHNtYWxsX2JvdHRvbV9wYWRkaW5nIj48ZGl2IGNsYXNzPSJmbGV4X25vbmUiPjwvZGl2PjxkaXYgY2xhc3M9ImFwaV9ob21lX2Jsb2dfcG9zdF9taWRkbGVfY29udGFpbmVyIHNtYWxsX2xlZnRfcGFkZGluZyBmbGV4X25vbmUiPjxzdHJvbmc+U2FyYWggQmFybmVrb3c8L3N0cm9uZz48YnI+PHNwYW4+SnVsIDI5LCAyMDIwPC9zcGFuPjwvZGl2PjxkaXY+PGg0IGNsYXNzPSJub3JtYWwiPjxhIGNsYXNzPSJpbmRpZmZlcmVudF9ncmV5IiBocmVmPSIvdHV0b3JpYWxzL3dvcmtmbG93LWJ1aWxkZXItc3RlcHMiPldvcmtmbG93IEJ1aWxkZXIgU3RlcHMgZnJvbSBBcHBzPC9hPjwvaDQ+PHA+TGVhcm4gaG93IHRvIGNvbmZpZ3VyZSBhIFdvcmtmbG93IEJ1aWxkZXIgU3RlcCBmcm9tIHlvdXIgQXBwLiA8YSBocmVmPSIvdHV0b3JpYWxzL3dvcmtmbG93LWJ1aWxkZXItc3RlcHMiPlJlYWQgTW9yZTwvYT48L3A+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iYm90dG9tX2JvcmRlciBkaXNwbGF5X2ZsZXggc21hbGxfdG9wX3BhZGRpbmcgc21hbGxfYm90dG9tX3BhZGRpbmciPjxkaXYgY2xhc3M9ImZsZXhfbm9uZSI+PC9kaXY+PGRpdiBjbGFzcz0iYXBpX2hvbWVfYmxvZ19wb3N0X21pZGRsZV9jb250YWluZXIgc21hbGxfbGVmdF9wYWRkaW5nIGZsZXhfbm9uZSI+PHN0cm9uZz5KYXNvbiBXb25nPC9zdHJvbmc+PGJyPjxzcGFuPkF1ZyAxNywgMjAyMDwvc3Bhbj48L2Rpdj48ZGl2PjxoNCBjbGFzcz0ibm9ybWFsIj48YSBjbGFzcz0iaW5kaWZmZXJlbnRfZ3JleSIgaHJlZj0iL3R1dG9yaWFscy9pbnRyby10by1tb2RhbHMtYmxvY2sta2l0Ij5JbnRyb2R1Y3Rpb24gdG8gTW9kYWxzIGFuZCBCbG9jayBLaXQ8L2E+PC9oND48cD5Zb3VyIHZlcnkgb3duIFNsYWNrIGFwcCEuIDxhIGhyZWY9Ii90dXRvcmlhbHMvaW50cm8tdG8tbW9kYWxzLWJsb2NrLWtpdCI+UmVhZCBNb3JlPC9hPjwvcD48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJib3R0b21fYm9yZGVyIGRpc3BsYXlfZmxleCBzbWFsbF90b3BfcGFkZGluZyBzbWFsbF9ib3R0b21fcGFkZGluZyI+PGRpdiBjbGFzcz0iZmxleF9ub25lIj48L2Rpdj48ZGl2IGNsYXNzPSJhcGlfaG9tZV9ibG9nX3Bvc3RfbWlkZGxlX2NvbnRhaW5lciBzbWFsbF9sZWZ0X3BhZGRpbmcgZmxleF9ub25lIj48c3Ryb25nPlN0ZXZlIEdpbGw8L3N0cm9uZz48YnI+PHNwYW4+RmViIDQsIDIwMjA8L3NwYW4+PC9kaXY+PGRpdj48aDQgY2xhc3M9Im5vcm1hbCI+PGEgY2xhc3M9ImluZGlmZmVyZW50X2dyZXkiIGhyZWY9Ii90dXRvcmlhbHMvdW5kZXJzdGFuZGluZy1vYXV0aC1zY29wZXMtYm90Ij5VbmRlcnN0YW5kaW5nIE9BdXRoIHNjb3BlcyBmb3IgQm90czwvYT48L2g0PjxwPkxlYXJuIGhvdyB1c2UgcmVxdWVzdCBzY29wZXMgdXNpbmcgT0F1dGguIDxhIGhyZWY9Ii90dXRvcmlhbHMvdW5kZXJzdGFuZGluZy1vYXV0aC1zY29wZXMtYm90Ij5SZWFkIE1vcmU8L2E+PC9wPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9Im5vcm1hbF9wYWRkaW5nX3RvcCBsYXJnZV9tYXJnaW5fYm90dG9tIGFsaWduX2NlbnRlciI+PHAgY2xhc3M9ImxhcmdlX3RvcF9tYXJnaW4gdmVyeV9sYXJnZV9ib3R0b21fbWFyZ2luIj5Ccm93c2UgbW9yZSB0dXRvcmlhbHMgPGEgaHJlZj0iL3R1dG9yaWFscyI+aGVyZTwvYT4uPC9wPjwvZGl2Pjwvc2VjdGlvbj48c2VjdGlvbiBjbGFzcz0iYXBpX2hvbWVfc3RhcnRfbGVhcm5pbmdfYmFubmVyIG5ldXRyYWxfd2hpdGUgZGlzcGxheV9mbGV4IGFsaWduX2l0ZW1zX2NlbnRlciBqdXN0aWZ5X2NvbnRlbnRfY2VudGVyIHZlcnlfbGFyZ2VfYm90dG9tX21hcmdpbiI+PGRpdiBjbGFzcz0ic3Bhbl8xX29mXzMgYWxpZ25fY2VudGVyIj48aW1nIHNyYz0iaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tLzgwNTg4L2ltZy9pbnRlZ3JhdGlvbnNfZm9yX3lvdXJfdGVhbS5wbmciIHNyY3NldD0iaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tLzgwNTg4L2ltZy9pbnRlZ3JhdGlvbnNfZm9yX3lvdXJfdGVhbS5wbmcgMXgsIGh0dHBzOi8vYS5zbGFjay1lZGdlLmNvbS84MDU4OC9pbWcvaW50ZWdyYXRpb25zX2Zvcl95b3VyX3RlYW1AMngucG5nIDJ4Ij48L2Rpdj48ZGl2IGNsYXNzPSJzcGFuXzJfb2ZfMyB2ZXJ5X2xhcmdlX3JpZ2h0X3BhZGRpbmciPjxoMyBjbGFzcz0iYXBpX2hvbWVfc3RhcnRfbGVhcm5pbmdfaGVhZGluZyBibGFjayI+V2FudCB0byBkaXZlIGRlZXBlcj88L2gzPjxwIGNsYXNzPSJhcGlfaG9tZV9zdGFydF9sZWFybmluZ19zdWJoZWFkaW5nIHNtYWxsX3RvcF9tYXJnaW4gbGFyZ2VfYm90dG9tX21hcmdpbiI+RkFRcywgdHV0b3JpYWxzLCBhbmQgbW9yZSAmbWRhc2g7IHJlYWQgdXAgb24gaG93IHRvIG1ha2UgeW91ciBhcHAgc2hpbmUuPC9wPjxhIGNsYXNzPSJidG4gYnRuX2xhcmdlIGFwaV9ob21lX3N0YXJ0X2xlYXJuaW5nX2J1dHRvbiBsZWZ0X3BhZGRpbmcgcmlnaHRfcGFkZGluZyIgZGF0YS1jbG9nLWV2ZW50PSJBUFBfRElSRUNUT1JZX1dFQlNJVEVfQ0xJQ0siIGRhdGEtY2xvZy1wYXJhbXM9ImNsaWNrX3RhcmdldD1hcGlfc3RhcnRfbGVhcm5pbmdfYnRuIiBkYXRhLWd0bS1jbGljaz0iQVBJU3RhcnRMZWFybmluZyIgaHJlZj0iL3N0YXJ0Ij5TdGFydCBMZWFybmluZzwvYT48L2Rpdj48L3NlY3Rpb24+PHNlY3Rpb24gY2xhc3M9ImFsaWduX2NlbnRlciBwb3NpdGlvbl9yZWxhdGl2ZSBhcGlfaG9tZV9sb29raW5nX21vcmUiPjxoNCBjbGFzcz0iYmxhY2siPjx0cy1pY29uIGNsYXNzPSJ0c19pY29uX2Vtb2ppX29iamVjdHMgbWlhbWlfcGluayBzbWFsbF9yaWdodF9tYXJnaW4iPjwvdHMtaWNvbj5Mb29raW5nIGZvciBtb3JlPzwvaDQ+PHAgY2xhc3M9ImxhcmdlX2JvdHRvbV9tYXJnaW4iPlRoZXNlIGhhbmR5IGxpbmtzIHdpbGwgaGVscCB5b3UgZ2V0IG9uIHlvdXIgd2F5LjwvcD48ZGl2IGNsYXNzPSJkaXNwbGF5X2ZsZXggYm90dG9tX21hcmdpbiBhcGlfaG9tZV9sb29raW5nX21vcmVfbGlua19jb250YWluZXIgYm9sZCI+PGEgaHJlZj0iaHR0cHM6Ly9zbGFjay5jb20vZGV2ZWxvcGVycy9mdW5kIiBjbGFzcz0iYXBpX2hvbWVfbG9va2luZ19tb3JlX2xpbmsgcG9zaXRpb25fcmVsYXRpdmUgZmxleF9vbmUgZGlzcGxheV9mbGV4IGFsaWduX2l0ZW1zX2NlbnRlciBqdXN0aWZ5X2NvbnRlbnRfY2VudGVyIGNoYXJjb2FsX2dyZXkgbmV1dHJhbF93aGl0ZV9iZyBub191bmRlcmxpbmUiPlNsYWNrIEZ1bmQ8L2E+PGEgaHJlZj0iaHR0cHM6Ly90cmVsbG8uY29tL2IvWm5UUXl1bVEvc2xhY2stcGxhdGZvcm0tcm9hZG1hcCIgY2xhc3M9ImFwaV9ob21lX2xvb2tpbmdfbW9yZV9saW5rIHBvc2l0aW9uX3JlbGF0aXZlIGZsZXhfb25lIGRpc3BsYXlfZmxleCBhbGlnbl9pdGVtc19jZW50ZXIganVzdGlmeV9jb250ZW50X2NlbnRlciBjaGFyY29hbF9ncmV5IG5ldXRyYWxfd2hpdGVfYmcgbm9fdW5kZXJsaW5lIj5QbGF0Zm9ybSBSb2FkbWFwPC9hPjxhIGhyZWY9Ii90b29scyIgY2xhc3M9ImFwaV9ob21lX2xvb2tpbmdfbW9yZV9saW5rIHBvc2l0aW9uX3JlbGF0aXZlIGZsZXhfb25lIGRpc3BsYXlfZmxleCBhbGlnbl9pdGVtc19jZW50ZXIganVzdGlmeV9jb250ZW50X2NlbnRlciBjaGFyY29hbF9ncmV5IG5ldXRyYWxfd2hpdGVfYmcgbm9fdW5kZXJsaW5lIj5Ub29scyBhbmQgU0RLczwvYT48L2Rpdj48L3NlY3Rpb24+PC9kaXY+PC9kaXY+PGRpdiBpZD0iYXBpX2FkZGVkX2NvbnRlbnQiIGNsYXNzPSJjb2wgY29udGVudF9jb2x1bW4gYWRkZWRfY29sdW1uIj48L2Rpdj48L2Rpdj48ZGl2IGlkPSJvdmVybGF5Ij48L2Rpdj48ZGl2IGNsYXNzPSJjbGVhcl9ib3RoIj48L2Rpdj48L2Rpdj48L2Rpdj48Zm9vdGVyIGRhdGEtcWE9ImZvb3RlciI+PHNlY3Rpb24gY2xhc3M9ImxpbmtzIj48ZGl2IGNsYXNzPSJncmlkIj48ZGl2IGNsYXNzPSJjb2wgc3Bhbl8xX29mXzQgbmF2X2NvbCI+PHVsPjxsaSBjbGFzcz0iY2F0XzEiPlVzaW5nIFNsYWNrPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9zbGFjay5jb20vaXMiIGRhdGEtcWE9InByb2R1Y3RfZm9vdGVyIiBkYXRhLWNsb2ctZXZlbnQ9IldFQlNJVEVfQ0xJQ0siIGRhdGEtY2xvZy1wYXJhbXM9ImNsaWNrX3RhcmdldD1mb290ZXJfcHJvZHVjdCI+UHJvZHVjdDwvYT48L2xpPjxsaT48YSBocmVmPSJodHRwczovL3NsYWNrLmNvbS9lbnRlcnByaXNlIiBkYXRhLXFhPSJlbnRlcnByaXNlX2Zvb3RlciIgZGF0YS1jbG9nLWV2ZW50PSJXRUJTSVRFX0NMSUNLIiBkYXRhLWNsb2ctcGFyYW1zPSJjbGlja190YXJnZXQ9Zm9vdGVyX2VudGVycHJpc2UiPkVudGVycHJpc2U8L2E+PC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9zbGFjay5jb20vcHJpY2luZz91aV9zdGVwPTI4JmFtcDt1aV9lbGVtZW50PTUiIGRhdGEtcWE9InByaWNpbmdfZm9vdGVyIiBkYXRhLWNsb2ctZXZlbnQ9IldFQlNJVEVfQ0xJQ0siIGRhdGEtY2xvZy1wYXJhbXM9ImNsaWNrX3RhcmdldD1mb290ZXJfcHJpY2luZyI+UHJpY2luZzwvYT48L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dldC5zbGFjay5oZWxwL2hjL2VuLXVzIiBkYXRhLXFhPSJzdXBwb3J0X2Zvb3RlciIgZGF0YS1jbG9nLWV2ZW50PSJXRUJTSVRFX0NMSUNLIiBkYXRhLWNsb2ctcGFyYW1zPSJjbGlja190YXJnZXQ9Zm9vdGVyX3N1cHBvcnQiPlN1cHBvcnQ8L2E+PC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9zbGFjay5jb20vZ3VpZGVzIiBkYXRhLXFhPSJnZXR0aW5nX3N0YXJ0ZWQiIGRhdGEtY2xvZy1ldmVudD0iV0VCU0lURV9DTElDSyIgZGF0YS1jbG9nLXBhcmFtcz0iY2xpY2tfdGFyZ2V0PWZvb3Rlcl9nZXR0aW5nX3N0YXJ0ZWQiPlNsYWNrIEd1aWRlczwvYT48L2xpPjxsaT48YSBocmVmPSJodHRwczovL3NsYWNrLmNvbS9hcHBzIiBkYXRhLXFhPSJhcHBfZGlyZWN0b3J5IiBkYXRhLWNsb2ctZXZlbnQ9IldFQlNJVEVfQ0xJQ0siIGRhdGEtY2xvZy1wYXJhbXM9ImNsaWNrX3RhcmdldD1mb290ZXJfYXBwX2RpcmVjdG9yeSI+QXBwIERpcmVjdG9yeTwvYT48L2xpPjxsaT48YSBocmVmPSJodHRwczovL2FwaS5zbGFjay5jb20vIiBkYXRhLXFhPSJhcGkiIGRhdGEtY2xvZy1ldmVudD0iV0VCU0lURV9DTElDSyIgZGF0YS1jbG9nLXBhcmFtcz0iY2xpY2tfdGFyZ2V0PWZvb3Rlcl9hcGkiPkFQSTwvYT48L2xpPjwvdWw+PC9kaXY+PGRpdiBjbGFzcz0iY29sIHNwYW5fMV9vZl80IG5hdl9jb2wiPjx1bD48bGkgY2xhc3M9ImNhdF8yIj5TbGFjayA8dHMtaWNvbiBjbGFzcz0idHNfaWNvbl9oZWFydCI+PC90cy1pY29uPjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vc2xhY2suY29tL2pvYnMiIGRhdGEtcWE9ImpvYnMiIGRhdGEtY2xvZy1ldmVudD0iV0VCU0lURV9DTElDSyIgZGF0YS1jbG9nLXBhcmFtcz0iY2xpY2tfdGFyZ2V0PWZvb3Rlcl9qb2JzIj5Kb2JzPC9hPjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vc2xhY2suY29tL2N1c3RvbWVycyIgZGF0YS1xYT0iY3VzdG9tZXJzIiBkYXRhLWNsb2ctZXZlbnQ9IldFQlNJVEVfQ0xJQ0siIGRhdGEtY2xvZy1wYXJhbXM9ImNsaWNrX3RhcmdldD1mb290ZXJfY3VzdG9tZXJzIj5DdXN0b21lcnM8L2E+PC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9zbGFjay5jb20vZGV2ZWxvcGVycyIgZGF0YS1xYT0iZGV2ZWxvcGVycyIgZGF0YS1jbG9nLWV2ZW50PSJXRUJTSVRFX0NMSUNLIiBkYXRhLWNsb2ctcGFyYW1zPSJjbGlja190YXJnZXQ9Zm9vdGVyX2RldmVsb3BlcnMiPkRldmVsb3BlcnM8L2E+PC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9zbGFjay5jb20vZXZlbnRzIiBkYXRhLXFhPSJldmVudHMiIGRhdGEtY2xvZy1ldmVudD0iV0VCU0lURV9DTElDSyIgZGF0YS1jbG9nLXBhcmFtcz0iY2xpY2tfdGFyZ2V0PWZvb3Rlcl9ldmVudHMiPkV2ZW50czwvYT48L2xpPjxsaT48YSBocmVmPSJodHRwczovL3NsYWNraHEuY29tLyIgZGF0YS1xYT0iYmxvZ19mb290ZXIiIGRhdGEtY2xvZy1ldmVudD0iV0VCU0lURV9DTElDSyIgZGF0YS1jbG9nLXBhcmFtcz0iY2xpY2tfdGFyZ2V0PWZvb3Rlcl9ibG9nIj5CbG9nPC9hPjwvbGk+PC91bD48L2Rpdj48ZGl2IGNsYXNzPSJjb2wgc3Bhbl8xX29mXzQgbmF2X2NvbCI+PHVsPjxsaSBjbGFzcz0iY2F0XzMiPkxlZ2FsPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9zbGFjay5jb20vcHJpdmFjeS1wb2xpY3kiIGRhdGEtcWE9InByaXZhY3kiIGRhdGEtY2xvZy1ldmVudD0iV0VCU0lURV9DTElDSyIgZGF0YS1jbG9nLXBhcmFtcz0iY2xpY2tfdGFyZ2V0PWZvb3Rlcl9wcml2YWN5Ij5Qcml2YWN5PC9hPjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vc2xhY2suY29tL3NlY3VyaXR5IiBkYXRhLXFhPSJzZWN1cml0eSIgZGF0YS1jbG9nLWV2ZW50PSJXRUJTSVRFX0NMSUNLIiBkYXRhLWNsb2ctcGFyYW1zPSJjbGlja190YXJnZXQ9Zm9vdGVyX3NlY3VyaXR5Ij5TZWN1cml0eTwvYT48L2xpPjxsaT48YSBocmVmPSJodHRwczovL3NsYWNrLmNvbS90ZXJtcy1vZi1zZXJ2aWNlIiBkYXRhLXFhPSJ0b3MiIGRhdGEtY2xvZy1ldmVudD0iV0VCU0lURV9DTElDSyIgZGF0YS1jbG9nLXBhcmFtcz0iY2xpY2tfdGFyZ2V0PWZvb3Rlcl90b3MiPlRlcm1zIG9mIFNlcnZpY2U8L2E+PC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9zbGFjay5jb20vcG9saWNpZXMiIGRhdGEtcWE9InBvbGljaWVzIiBkYXRhLWNsb2ctZXZlbnQ9IldFQlNJVEVfQ0xJQ0siIGRhdGEtY2xvZy1wYXJhbXM9ImNsaWNrX3RhcmdldD1mb290ZXJfcG9saWNpZXMiPlBvbGljaWVzPC9hPjwvbGk+PC91bD48L2Rpdj48ZGl2IGNsYXNzPSJjb2wgc3Bhbl8xX29mXzQgbmF2X2NvbCI+PHVsPjxsaSBjbGFzcz0iY2F0XzQiPkhhbmR5IExpbmtzPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9zbGFjay5jb20vZG93bmxvYWRzIiBkYXRhLXFhPSJkb3dubG9hZHMiIGRhdGEtY2xvZy1ldmVudD0iV0VCU0lURV9DTElDSyIgZGF0YS1jbG9nLXBhcmFtcz0iY2xpY2tfdGFyZ2V0PWZvb3Rlcl9kb3dubG9hZHMiPkRvd25sb2FkIGRlc2t0b3AgYXBwPC9hPjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vc2xhY2suY29tL2Rvd25sb2FkcyIgZGF0YS1xYT0iZG93bmxvYWRzX21vYmlsZSIgZGF0YS1jbG9nLWV2ZW50PSJXRUJTSVRFX0NMSUNLIiBkYXRhLWNsb2ctcGFyYW1zPSJjbGlja190YXJnZXQ9Zm9vdGVyX2Rvd25sb2Fkc19tb2JpbGUiPkRvd25sb2FkIG1vYmlsZSBhcHA8L2E+PC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9zbGFjay5jb20vYnJhbmQtZ3VpZGVsaW5lcyIgZGF0YS1xYT0iYnJhbmRfZ3VpZGVsaW5lcyIgZGF0YS1jbG9nLWV2ZW50PSJXRUJTSVRFX0NMSUNLIiBkYXRhLWNsb2ctcGFyYW1zPSJjbGlja190YXJnZXQ9Zm9vdGVyX2JyYW5kX2d1aWRlbGluZXMiPkJyYW5kIEd1aWRlbGluZXM8L2E+PC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9zbGFja2F0d29yay5jb20iIGRhdGEtcWE9InNsYWNrX2F0X3dvcmsiIGRhdGEtY2xvZy1ldmVudD0iV0VCU0lURV9DTElDSyIgZGF0YS1jbG9nLXBhcmFtcz0iY2xpY2tfdGFyZ2V0PWZvb3Rlcl9zbGFja19hdF93b3JrIj5TbGFjayBhdCBXb3JrPC9hPjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vc3RhdHVzLnNsYWNrLmNvbS8iIGRhdGEtcWE9InN0YXR1cyIgZGF0YS1jbG9nLWV2ZW50PSJXRUJTSVRFX0NMSUNLIiBkYXRhLWNsb2ctcGFyYW1zPSJjbGlja190YXJnZXQ9Zm9vdGVyX3N0YXR1cyI+U3RhdHVzPC9hPjwvbGk+PC91bD48L2Rpdj48L2Rpdj48L3NlY3Rpb24+PGRpdiBjbGFzcz0iZm9vdG5vdGUiPjxzZWN0aW9uPjxhIGhyZWY9Imh0dHBzOi8vc2xhY2suY29tIiBhcmlhLWxhYmVsPSJTbGFjayBob21lcGFnZSIgZGF0YS1jbG9nLWV2ZW50PSJXRUJTSVRFX0NMSUNLIiBkYXRhLWNsb2ctcGFyYW1zPSJjbGlja190YXJnZXQ9Zm9vdGVyX3NsYWNrX2ljb24iPjx0cy1pY29uIGNsYXNzPSJjLWljb24tLXNsYWNrIiBhcmlhLWhpZGRlbj48L3RzLWljb24+PC9hPjx1bD48bGk+PGEgaHJlZj0iaHR0cHM6Ly9zbGFjay5jb20vaGVscC9jb250YWN0IiBkYXRhLXFhPSJjb250YWN0X3VzIiBkYXRhLWNsb2ctZXZlbnQ9IldFQlNJVEVfQ0xJQ0siIGRhdGEtY2xvZy1wYXJhbXM9ImNsaWNrX3RhcmdldD1mb290ZXJfY29udGFjdF91cyI+Q29udGFjdCBVczwvYT48L2xpPjxsaT48YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL1NsYWNrSFEiIGRhdGEtcWE9InNsYWNrX3R3aXR0ZXIiIGRhdGEtY2xvZy1ldmVudD0iV0VCU0lURV9DTElDSyIgZGF0YS1jbG9nLXBhcmFtcz0iY2xpY2tfdGFyZ2V0PWZvb3Rlcl9zbGFja190d2l0dGVyIiBhcmlhLWxhYmVsPSJTbGFjayBvbiBUd2l0dGVyIj48dHMtaWNvbiBjbGFzcz0idHNfaWNvbl90d2l0dGVyIiBhcmlhLWhpZGRlbj48L3RzLWljb24+PC9hPjwvbGk+PGxpIGNsYXNzPSJ5dCI+PGEgaHJlZj0iaHR0cHM6Ly93d3cueW91dHViZS5jb20vY2hhbm5lbC9VQ1kzWUVDZ2VCY0xDeklyRkxQNGdibHciIGRhdGEtcWE9InNsYWNrX3lvdXR1YmUiIGRhdGEtY2xvZy1ldmVudD0iV0VCU0lURV9DTElDSyIgZGF0YS1jbG9nLXBhcmFtcz0iY2xpY2tfdGFyZ2V0PWZvb3Rlcl9zbGFja195b3V0dWJlIiBhcmlhLWxhYmVsPSJTbGFjayBvbiBZb3VUdWJlIj48dHMtaWNvbiBjbGFzcz0idHNfaWNvbl95b3V0dWJlIiBhcmlhLWhpZGRlbj48L3RzLWljb24+PC9hPjwvbGk+PC91bD48L3NlY3Rpb24+PC9kaXY+PC9mb290ZXI+PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgovKioKICogQSBwbGFjZWhvbGRlciBmdW5jdGlvbiB0aGF0IHRoZSBidWlsZCBzY3JpcHQgdXNlcyB0bwogKiByZXBsYWNlIGZpbGUgcGF0aHMgd2l0aCB0aGVpciBDRE4gdmVyc2lvbnMuCiAqCiAqIEBwYXJhbSB7U3RyaW5nfSBmaWxlX3BhdGggLSBGaWxlIHBhdGgKICogQHJldHVybnMge1N0cmluZ30KICovCmZ1bmN0aW9uIHZ2dihmaWxlX3BhdGgpIHsKCQkgdmFyIHZ2dl93YXJuaW5nID0gJ1lvdSBjYW5ub3QgdXNlIHZ2diBvbiBkeW5hbWljIHZhbHVlcy4gUGxlYXNlIG1ha2Ugc3VyZSB5b3Ugb25seSBwYXNzIGluIHN0YXRpYyBmaWxlIHBhdGhzLic7IGlmICh3aW5kb3cuVFMgJiYgd2luZG93LlRTLndhcm4pIHsgd2luZG93LlRTLndhcm4odnZ2X3dhcm5pbmcpOyB9IGVsc2UgeyBjb25zb2xlLndhcm4odnZ2X3dhcm5pbmcpOyB9IAoJcmV0dXJuIGZpbGVfcGF0aDsKfQoKdmFyIGNkbl91cmwgPSAiaHR0cHM6XC9cL2Euc2xhY2stZWRnZS5jb20iOwp2YXIgdnZ2X2Fic191cmwgPSAiaHR0cHM6XC9cL3NsYWNrLmNvbVwvIjsKdmFyIGluY19qc19zZXR1cF9kYXRhID0gewoJZW1vamlfc2hlZXRzOiB7CgkJYXBwbGU6ICdodHRwczovL2Euc2xhY2stZWRnZS5jb20vODA1ODgvaW1nL2Vtb2ppXzIwMTdfMTJfMDYvc2hlZXRfYXBwbGVfNjRfaW5kZXhlZF8yNTYucG5nJywKCQlnb29nbGU6ICdodHRwczovL2Euc2xhY2stZWRnZS5jb20vODA1ODgvaW1nL2Vtb2ppXzIwMTdfMTJfMDYvc2hlZXRfZ29vZ2xlXzY0X2luZGV4ZWRfMjU2LnBuZycsCgl9LAp9Owo8L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CS8vIGNvbW1vbiBib290X2RhdGEKCXZhciBib290X2RhdGEgPSB7ImFwaV91cmwiOiJcL2FwaVwvIiwiYXBwIjoiZmFsc2UiLCJ1c2VyX2lkIjpudWxsLCJ0ZWFtX2lkIjoiVDAwMDAwMDAwIiwidmlzaXRvcl91aWQiOiI3dnNvNTdsZW44ejR0emQ4YjdpMGM4cDczIiwibm9fbG9naW4iOnRydWUsInZlcnNpb25fdHMiOiIxNjAyMDI0NDIyIiwidmVyc2lvbl91aWQiOiJmNDY3MTRmMjMyN2EwOTk1ZTM1OWJjYmYzMmVlZTc0ZGUxM2NhMmNkIiwiY2FjaGVfdmVyc2lvbiI6InYyMS1ub21hZCIsImNhY2hlX3RzX3ZlcnNpb24iOiJ2Mi1idW5ueSIsInJlZGlyX2RvbWFpbiI6InNsYWNrLXJlZGlyLm5ldCIsInNpZ25pbl91cmwiOiJodHRwczpcL1wvc2xhY2suY29tXC9zaWduaW4iLCJhYnNfcm9vdF91cmwiOiJodHRwczpcL1wvc2xhY2suY29tXC8iLCJ0ZWFtX3VybCI6IiIsImltYWdlX3Byb3h5X3VybCI6Imh0dHBzOlwvXC9zbGFjay1pbWdzLmNvbVwvIiwiYmVhY29uX3RpbWluZ191cmwiOiJodHRwczpcL1wvc2xhY2suY29tXC9iZWFjb25cL3RpbWluZyIsImJlYWNvbl9lcnJvcl91cmwiOiJodHRwczpcL1wvc2xhY2suY29tXC9iZWFjb25cL2Vycm9yIiwiY2xvZ191cmwiOiJjbG9nXC90cmFja1wvIiwiYXBpX3Rva2VuIjoiIiwidnZ2X3BhdGhzIjp7Imx6X3N0cmluZyI6Imh0dHBzOlwvXC9hLnNsYWNrLWVkZ2UuY29tXC9idjEtOFwvbHotc3RyaW5nLTEuNC40Lndvcmtlci44ZGUxYjAwZDY3MGZmM2RjNzA2YTAuanMiLCJjb2RlbWlycm9yIjoiaHR0cHM6XC9cL2Euc2xhY2stZWRnZS5jb21cL2J2MS04XC9jb2RlbWlycm9yLm1pbi41MjZmOTM2OTI0ZWVmMThmMDBiYi5taW4uanMiLCJjb2RlbWlycm9yX2FkZG9uX3NpbXBsZSI6Imh0dHBzOlwvXC9hLnNsYWNrLWVkZ2UuY29tXC9idjEtOFwvY29kZW1pcnJvcl9zaW1wbGUuOWJjNzZiYjMyNjBhNWVkMGU1ZGMubWluLmpzIiwiY29kZW1pcnJvcl9sb2FkIjoiaHR0cHM6XC9cL2Euc2xhY2stZWRnZS5jb21cL2J2MS04XC9jb2RlbWlycm9yX2xvYWQuZjFhMzdmNGU0ODZiMmMyMjEwNWIubWluLmpzIiwiY29kZW1pcnJvcl9maWxlcyI6eyJqYXZhc2NyaXB0IjoiaHR0cHM6XC9cL2Euc2xhY2stZWRnZS5jb21cL2J2MS04XC9jb2RlbWlycm9yX2xhbmdfamF2YXNjcmlwdC5iMjk1ZWY4NzZlZWRhZmU4M2IzOS5taW4uanMifX0sIm5vdGlmaWNhdGlvbl9zb3VuZHMiOlt7InZhbHVlIjoiYjIubXAzIiwibGFiZWwiOiJEaW5nIiwidXJsIjoiaHR0cHM6XC9cL2Euc2xhY2stZWRnZS5jb21cLzdlOTFcL3NvdW5kc1wvcHVzaFwvYjIubXAzIiwidXJsX29nZyI6Imh0dHBzOlwvXC9hLnNsYWNrLWVkZ2UuY29tXC80NmViYlwvc291bmRzXC9wdXNoXC9iMi5vZ2cifSx7InZhbHVlIjoiYW5pbWFsX3N0aWNrLm1wMyIsImxhYmVsIjoiQm9pbmciLCJ1cmwiOiJodHRwczpcL1wvYS5zbGFjay1lZGdlLmNvbVwvN2U5MVwvc291bmRzXC9wdXNoXC9hbmltYWxfc3RpY2subXAzIiwidXJsX29nZyI6Imh0dHBzOlwvXC9hLnNsYWNrLWVkZ2UuY29tXC80NmViYlwvc291bmRzXC9wdXNoXC9hbmltYWxfc3RpY2sub2dnIn0seyJ2YWx1ZSI6ImJlZW5fdHJlZS5tcDMiLCJsYWJlbCI6IkRyb3AiLCJ1cmwiOiJodHRwczpcL1wvYS5zbGFjay1lZGdlLmNvbVwvN2U5MVwvc291bmRzXC9wdXNoXC9iZWVuX3RyZWUubXAzIiwidXJsX29nZyI6Imh0dHBzOlwvXC9hLnNsYWNrLWVkZ2UuY29tXC80NmViYlwvc291bmRzXC9wdXNoXC9iZWVuX3RyZWUub2dnIn0seyJ2YWx1ZSI6ImNvbXBsZXRlX3F1ZXN0X3JlcXVpcmVtZW50Lm1wMyIsImxhYmVsIjoiVGEtZGEiLCJ1cmwiOiJodHRwczpcL1wvYS5zbGFjay1lZGdlLmNvbVwvN2U5MVwvc291bmRzXC9wdXNoXC9jb21wbGV0ZV9xdWVzdF9yZXF1aXJlbWVudC5tcDMiLCJ1cmxfb2dnIjoiaHR0cHM6XC9cL2Euc2xhY2stZWRnZS5jb21cLzQ2ZWJiXC9zb3VuZHNcL3B1c2hcL2NvbXBsZXRlX3F1ZXN0X3JlcXVpcmVtZW50Lm9nZyJ9LHsidmFsdWUiOiJjb25maXJtX2RlbGl2ZXJ5Lm1wMyIsImxhYmVsIjoiUGxpbmsiLCJ1cmwiOiJodHRwczpcL1wvYS5zbGFjay1lZGdlLmNvbVwvN2U5MVwvc291bmRzXC9wdXNoXC9jb25maXJtX2RlbGl2ZXJ5Lm1wMyIsInVybF9vZ2ciOiJodHRwczpcL1wvYS5zbGFjay1lZGdlLmNvbVwvNDZlYmJcL3NvdW5kc1wvcHVzaFwvY29uZmlybV9kZWxpdmVyeS5vZ2cifSx7InZhbHVlIjoiZmxpdHRlcmJ1Zy5tcDMiLCJsYWJlbCI6IldvdyIsInVybCI6Imh0dHBzOlwvXC9hLnNsYWNrLWVkZ2UuY29tXC83ZTkxXC9zb3VuZHNcL3B1c2hcL2ZsaXR0ZXJidWcubXAzIiwidXJsX29nZyI6Imh0dHBzOlwvXC9hLnNsYWNrLWVkZ2UuY29tXC80NmViYlwvc291bmRzXC9wdXNoXC9mbGl0dGVyYnVnLm9nZyJ9LHsidmFsdWUiOiJoZXJlX3lvdV9nb19saWdodGVyLm1wMyIsImxhYmVsIjoiSGVyZSB5b3UgZ28iLCJ1cmwiOiJodHRwczpcL1wvYS5zbGFjay1lZGdlLmNvbVwvN2U5MVwvc291bmRzXC9wdXNoXC9oZXJlX3lvdV9nb19saWdodGVyLm1wMyIsInVybF9vZ2ciOiJodHRwczpcL1wvYS5zbGFjay1lZGdlLmNvbVwvNDZlYmJcL3NvdW5kc1wvcHVzaFwvaGVyZV95b3VfZ29fbGlnaHRlci5vZ2cifSx7InZhbHVlIjoiaGlfZmxvd2Vyc19oaXQubXAzIiwibGFiZWwiOiJIaSIsInVybCI6Imh0dHBzOlwvXC9hLnNsYWNrLWVkZ2UuY29tXC83ZTkxXC9zb3VuZHNcL3B1c2hcL2hpX2Zsb3dlcnNfaGl0Lm1wMyIsInVybF9vZ2ciOiJodHRwczpcL1wvYS5zbGFjay1lZGdlLmNvbVwvNDZlYmJcL3NvdW5kc1wvcHVzaFwvaGlfZmxvd2Vyc19oaXQub2dnIn0seyJ2YWx1ZSI6Imtub2NrX2JydXNoLm1wMyIsImxhYmVsIjoiS25vY2sgQnJ1c2giLCJ1cmwiOiJodHRwczpcL1wvYS5zbGFjay1lZGdlLmNvbVwvN2U5MVwvc291bmRzXC9wdXNoXC9rbm9ja19icnVzaC5tcDMiLCJ1cmxfb2dnIjoiaHR0cHM6XC9cL2Euc2xhY2stZWRnZS5jb21cLzQ2ZWJiXC9zb3VuZHNcL3B1c2hcL2tub2NrX2JydXNoLm9nZyJ9LHsidmFsdWUiOiJzYXZlX2FuZF9jaGVja291dC5tcDMiLCJsYWJlbCI6Ildob2EhIiwidXJsIjoiaHR0cHM6XC9cL2Euc2xhY2stZWRnZS5jb21cLzdlOTFcL3NvdW5kc1wvcHVzaFwvc2F2ZV9hbmRfY2hlY2tvdXQubXAzIiwidXJsX29nZyI6Imh0dHBzOlwvXC9hLnNsYWNrLWVkZ2UuY29tXC80NmViYlwvc291bmRzXC9wdXNoXC9zYXZlX2FuZF9jaGVja291dC5vZ2cifSx7InZhbHVlIjoiaXRlbV9waWNrdXAubXAzIiwibGFiZWwiOiJZb2luayIsInVybCI6Imh0dHBzOlwvXC9hLnNsYWNrLWVkZ2UuY29tXC83ZTkxXC9zb3VuZHNcL3B1c2hcL2l0ZW1fcGlja3VwLm1wMyIsInVybF9vZ2ciOiJodHRwczpcL1wvYS5zbGFjay1lZGdlLmNvbVwvNDZlYmJcL3NvdW5kc1wvcHVzaFwvaXRlbV9waWNrdXAub2dnIn0seyJ2YWx1ZSI6Imh1bW11cy5tcDMiLCJsYWJlbCI6Ikh1bW11cyIsInVybCI6Imh0dHBzOlwvXC9hLnNsYWNrLWVkZ2UuY29tXC83ZmE5XC9zb3VuZHNcL3B1c2hcL2h1bW11cy5tcDMiLCJ1cmxfb2dnIjoiaHR0cHM6XC9cL2Euc2xhY2stZWRnZS5jb21cLzQ2ZWJiXC9zb3VuZHNcL3B1c2hcL2h1bW11cy5vZ2cifSx7InZhbHVlIjoibm9uZSIsImxhYmVsIjoiTm9uZSJ9XSwiYWxlcnRfc291bmRzIjpbeyJ2YWx1ZSI6ImZyb2cubXAzIiwibGFiZWwiOiJGcm9nIiwidXJsIjoiaHR0cHM6XC9cL3NsYWNrLmdsb2JhbC5zc2wuZmFzdGx5Lm5ldFwvYTM0YVwvc291bmRzXC9mcm9nLm1wMyJ9XSwiY2FsbF9zb3VuZHMiOlt7InZhbHVlIjoiY2FsbFwvYWxlcnRfdjIubXAzIiwibGFiZWwiOiJBbGVydCIsInVybCI6Imh0dHBzOlwvXC9zbGFjay5nbG9iYWwuc3NsLmZhc3RseS5uZXRcLzA4ZjdcL3NvdW5kc1wvY2FsbFwvYWxlcnRfdjIubXAzIn0seyJ2YWx1ZSI6ImNhbGxcL2luY29taW5nX3JpbmdfdjIubXAzIiwibGFiZWwiOiJJbmNvbWluZyByaW5nIiwidXJsIjoiaHR0cHM6XC9cL3NsYWNrLmdsb2JhbC5zc2wuZmFzdGx5Lm5ldFwvMDhmN1wvc291bmRzXC9jYWxsXC9pbmNvbWluZ19yaW5nX3YyLm1wMyJ9LHsidmFsdWUiOiJjYWxsXC9vdXRnb2luZ19yaW5nX3YyLm1wMyIsImxhYmVsIjoiT3V0Z29pbmcgcmluZyIsInVybCI6Imh0dHBzOlwvXC9zbGFjay5nbG9iYWwuc3NsLmZhc3RseS5uZXRcLzA4ZjdcL3NvdW5kc1wvY2FsbFwvb3V0Z29pbmdfcmluZ192Mi5tcDMifSx7InZhbHVlIjoiY2FsbFwvcG9wX3YyLm1wMyIsImxhYmVsIjoiSW5jb21pbmcgcmVhY3Rpb24iLCJ1cmwiOiJodHRwczpcL1wvc2xhY2suZ2xvYmFsLnNzbC5mYXN0bHkubmV0XC8wOGY3XC9zb3VuZHNcL2NhbGxcL3BvcF92Mi5tcDMifSx7InZhbHVlIjoiY2FsbFwvdGhleV9sZWZ0X2NhbGxfdjIubXAzIiwibGFiZWwiOiJUaGV5IGxlZnQgY2FsbCIsInVybCI6Imh0dHBzOlwvXC9zbGFjay5nbG9iYWwuc3NsLmZhc3RseS5uZXRcLzA4ZjdcL3NvdW5kc1wvY2FsbFwvdGhleV9sZWZ0X2NhbGxfdjIubXAzIn0seyJ2YWx1ZSI6ImNhbGxcL3lvdV9sZWZ0X2NhbGxfdjIubXAzIiwibGFiZWwiOiJZb3UgbGVmdCBjYWxsIiwidXJsIjoiaHR0cHM6XC9cL3NsYWNrLmdsb2JhbC5zc2wuZmFzdGx5Lm5ldFwvMDhmN1wvc291bmRzXC9jYWxsXC95b3VfbGVmdF9jYWxsX3YyLm1wMyJ9LHsidmFsdWUiOiJjYWxsXC90aGV5X2pvaW5lZF9jYWxsX3YyLm1wMyIsImxhYmVsIjoiVGhleSBqb2luZWQgY2FsbCIsInVybCI6Imh0dHBzOlwvXC9zbGFjay5nbG9iYWwuc3NsLmZhc3RseS5uZXRcLzA4ZjdcL3NvdW5kc1wvY2FsbFwvdGhleV9qb2luZWRfY2FsbF92Mi5tcDMifSx7InZhbHVlIjoiY2FsbFwveW91X2pvaW5lZF9jYWxsX3YyLm1wMyIsImxhYmVsIjoiWW91IGpvaW5lZCBjYWxsIiwidXJsIjoiaHR0cHM6XC9cL3NsYWNrLmdsb2JhbC5zc2wuZmFzdGx5Lm5ldFwvMDhmN1wvc291bmRzXC9jYWxsXC95b3Vfam9pbmVkX2NhbGxfdjIubXAzIn0seyJ2YWx1ZSI6ImNhbGxcL2NvbmZpcm1hdGlvbl92Mi5tcDMiLCJsYWJlbCI6IkNvbmZpcm1hdGlvbiIsInVybCI6Imh0dHBzOlwvXC9zbGFjay5nbG9iYWwuc3NsLmZhc3RseS5uZXRcLzA4ZjdcL3NvdW5kc1wvY2FsbFwvY29uZmlybWF0aW9uX3YyLm1wMyJ9XSwiY2FsbF9zb3VuZHNfdmVyc2lvbiI6InYyIiwiaW1nIjp7ImFwcF9pY29uIjoiaHR0cHM6XC9cL2Euc2xhY2stZWRnZS5jb21cLzgwNTg4XC9pbWdcL3NsYWNrX2dyb3dsX2ljb25fdm9ndWUucG5nIn0sInBhZ2VfbmVlZHNfZW50ZXJwcmlzZSI6ZmFsc2UsInBhZ2VfbmVlZHNfY3VzdG9tX2Vtb2ppIjpmYWxzZSwiaXNfZGVwcmVjYXRlZF93ZWJjbGllbnRfYnJvd3NlciI6ZmFsc2UsImlzX3Vuc3VwcG9ydGVkX3dlYmNsaWVudF9icm93c2VyIjp0cnVlLCJkZWZhdWx0X3R6IjoiQW1lcmljYVwvTG9zX0FuZ2VsZXMiLCJmZWF0dXJlX2Rpc3BsYXlfZW1haWxfYWRkcmVzc2VzX3RvX3JhZGlvIjpmYWxzZSwiZmVhdHVyZV9pY29uX2J1dHRvbl9hcmlhX2xhYmVsX2kxOG4iOmZhbHNlLCJmZWF0dXJlX2FsdF9jaGFubmVsc19yZWR1Y2VyIjpmYWxzZSwiZmVhdHVyZV9qc2ZfMTYxOSI6dHJ1ZSwiZmVhdHVyZV9kZXNrdG9wX2xhenlfbG9hZF9lbW9qaSI6ZmFsc2UsImZlYXR1cmVfZWR1Xzg4X2dhIjpmYWxzZSwiZmVhdHVyZV9leHBvcnRfcHJlZl90b19kaXNhYmxlIjpmYWxzZSwiZmVhdHVyZV9hZGRfbWVtYmVyX3N0YXRzX2FwaSI6ZmFsc2UsImZlYXR1cmVfbWVtYmVyX2FuYWx5dGljc19wZXJtaXNzaW9ucyI6ZmFsc2UsImZlYXR1cmVfYnVsa191c2VyX3JlYWN0aXZhdGlvbl9ncmlkIjp0cnVlLCJmZWF0dXJlX2J1aWxkZXJfbXVsdGlzdGVwX2NvbGxhYm9yYXRvcnNfbW9kYWwiOmZhbHNlLCJmZWF0dXJlX2J1aWxkZXJfYWxsb3dfY3VzdG9tX3RpbWVfc2NoZWR1bGVkX3RyaWdnZXIiOnRydWUsImZlYXR1cmVfYnVpbGRlcl9zY2hlZHVsZWRfdHJpZ2dlciI6dHJ1ZSwiZmVhdHVyZV9idWlsZGVyX21lc3NhZ2VfYnV0dG9uX2hlbHBlcl90ZXh0IjpmYWxzZSwiZmVhdHVyZV9idWlsZGVyX2NyZWF0aW9uX29yZ19wb2xpY3kiOnRydWUsImZlYXR1cmVfYnVpbGRlcl9leHRlbnNpb25zIjp0cnVlLCJmZWF0dXJlX2J1aWxkZXJfZXh0ZW5zaW9uX3N0ZXBzX3ByZWYiOnRydWUsImZlYXR1cmVfYnVpbGRlcl9hY2Nlc3NfZXJyb3JfY29udGVudCI6ZmFsc2UsImZlYXR1cmVfYnVpbGRlcl9wYWdpbmF0ZV93b3JrZmxvd3NfbGlzdCI6ZmFsc2UsImZlYXR1cmVfYnVpbGRlcl9zdGVwX2xpYnJhcnkiOnRydWUsImZlYXR1cmVfYnVpbGRlcl90ZWFtX2FwcHNfdHJhbnNsYXRpb25zIjpmYWxzZSwiZmVhdHVyZV9idWlsZGVyX2FwcHNfY29sbGVjdGlvbl9saW5rIjpmYWxzZSwiZmVhdHVyZV9hcHBzX2Nhbl9zdWJtaXRfd2l0aF93b3JrZmxvd19zdGVwcyI6dHJ1ZSwiZmVhdHVyZV9idWlsZGVyX2ZlZWRiYWNrX2J1dHRvbiI6ZmFsc2UsImZlYXR1cmVfYnVpbGRlcl9tZXNzYWdlX3N0ZXBfcmljaF90ZXh0Ijp0cnVlLCJmZWF0dXJlX2NoaW1lX2FjY2Vzc19jaGVjayI6dHJ1ZSwiZmVhdHVyZV9hcHBfdmlld3NfdjEiOnRydWUsImZlYXR1cmVfYXVkaXRfbG9nc192aWV3IjpmYWxzZSwiZmVhdHVyZV9hdWRpdF9sb2dzX3ZpZXdfd29ya3NwYWNlIjpmYWxzZSwiZmVhdHVyZV9vcmdfdGVhbXNfaW5fbG9jYWxfY29uZmlnIjp0cnVlLCJmZWF0dXJlX2RhdGFfbG9jYXRpb25fbmV3X3RyYW5zbGF0aW9ucyI6ZmFsc2UsImZlYXR1cmVfZGVmYXVsdF9icm93c2VyX2NvbnRyb2xfdjIiOnRydWUsImZlYXR1cmVfYWNjZXNzaWJsZV9zZWxlY3RzIjp0cnVlLCJmZWF0dXJlX3NlbGVjdF9vbl90YWIiOnRydWUsImZlYXR1cmVfcHJvbm91bnNfaW5fcHJvZmlsZSI6ZmFsc2UsImZlYXR1cmVfYnVpbGRlcl9kaXNhYmxlX2dsb2JhbF90cmlnZ2VycyI6dHJ1ZSwiZmVhdHVyZV93b3JrZmxvd19idWlsZGVyX2VuYWJsZWRfb3JnX3NldHRpbmciOnRydWUsImZlYXR1cmVfYnVpbGRlcl9jYW5fYWNjZXNzIjpmYWxzZSwiZmVhdHVyZV9hbHdheXNfc2hvd19hcmNoaXZlX2NoYW5uZWxfb3B0aW9uIjp0cnVlLCJmZWF0dXJlX29yZ19kYXNoYm9hcmRfZ2FudHJ5X2FjY2VzcyI6ZmFsc2UsImZlYXR1cmVfb3JnX2Rhc2hfZ2FudHJ5X3JlZGlyZWN0IjpmYWxzZSwiZmVhdHVyZV9pbmZvX2JhcnJpZXJzIjpmYWxzZSwiZmVhdHVyZV9kYXkyX3NoYXJlX21vZGFsIjpmYWxzZSwiZmVhdHVyZV9ncmFudWxhcl9kbmQiOmZhbHNlLCJmZWF0dXJlX2N1c3RvbV9kbmRfdHJhbnNsYXRpb25zIjpmYWxzZSwiZmVhdHVyZV9pbmZvcm1hdGl2ZV9hbm5vdW5jZV9vbmx5X2Zvb3Rlcl90cmFuc2xhdGlvbnMiOmZhbHNlLCJmZWF0dXJlX2NvbnRleHRfYmFyX3R6X2lzc3VlcyI6ZmFsc2UsImZlYXR1cmVfbmV3eHBfNDQwMSI6dHJ1ZSwiZmVhdHVyZV9uZXd4cF80MjgxIjp0cnVlLCJmZWF0dXJlX25ld3hwXzM4NDgiOnRydWUsImZlYXR1cmVfZGF5MV9jb252byI6dHJ1ZSwiZmVhdHVyZV9kYXkxX2NvbWZ5X3NpZGViYXJfY29weSI6ZmFsc2UsImZlYXR1cmVfZGF5MV9jcmVhdG9yX2xhbmRpbmdfY29weSI6ZmFsc2UsImZlYXR1cmVfY2hhbm5lbF9icm93c2VyX2RheTEiOnRydWUsImZlYXR1cmVfYmFubmVyX2FwcF9yZWNzIjp0cnVlLCJmZWF0dXJlX2NvcHlfam9pbmVyX2Zsb3ciOnRydWUsImZlYXR1cmVfYXBwcm92ZWRfb3JncyI6ZmFsc2UsImZlYXR1cmVfbmV3eHBfMzI3OSI6dHJ1ZSwiZmVhdHVyZV9uZXd4cF80MTYwIjp0cnVlLCJmZWF0dXJlX25ld3hwXzQxNTMiOnRydWUsImZlYXR1cmVfbmV3eHBfNDIwMiI6dHJ1ZSwiZmVhdHVyZV9uZXd4cF80MzEzIjpmYWxzZSwiZmVhdHVyZV90aW55c3BlY2siOmZhbHNlLCJmZWF0dXJlX3FyX2NvZGVfaW52aXRlIjpmYWxzZSwiZmVhdHVyZV9nZW5lcmF0ZV9saWdodHdlaWdodF9kbV9saW5rIjpmYWxzZSwiZmVhdHVyZV9jb25uZWN0X2RtX2Vhcmx5X2FjY2VzcyI6dHJ1ZSwiZmVhdHVyZV9zbGFja19jb25uZWN0X2RtX2FjY2VwdF9jb3B5Ijp0cnVlLCJmZWF0dXJlX3NsYWNrX2Nvbm5lY3RfZG1fcHJlZnMiOnRydWUsImZlYXR1cmVfb2x1Z19lc2NfY2hhbm5lbHNfd29yayI6dHJ1ZSwiZmVhdHVyZV9vbHVnX3JlbW92ZV9yZXF1aXJlZF93b3Jrc3BhY2Vfc2V0dGluZyI6ZmFsc2UsImZlYXR1cmVfZGF0YV90YWJsZV9pbl9vcmdfbGV2ZWxfdXNlcl9ncm91cHMiOmZhbHNlLCJmZWF0dXJlX29yZ19zZXR0aW5nc19tMTFuIjpmYWxzZSwiZmVhdHVyZV9kZXByZWNhdGVfZ2V0X21lbWJlcl9ieV9uYW1lIjpmYWxzZSwiZmVhdHVyZV91bmtub3duX2ZpbGVzIjp0cnVlLCJmZWF0dXJlX3Vua25vd25fbWVzc2FnZXMiOnRydWUsImZlYXR1cmVfYWRkX21lc3NhZ2VfcGVyZiI6ZmFsc2UsImZlYXR1cmVfZml4X2N1c3RvbV9lbW9qaV9lcnJvcnMiOnRydWUsImZlYXR1cmVfbW9kZXJuX2RlbGV0ZV9maWxlIjp0cnVlLCJmZWF0dXJlX2NvcHlfY2hhbm5lbF9saW5rIjp0cnVlLCJmZWF0dXJlX2NvbGxhcHNlX3JlYWN0aW9ucyI6ZmFsc2UsImZlYXR1cmVfaWFfc3RhdHVzX2J1dHRvbiI6dHJ1ZSwiZmVhdHVyZV9mdWxsX3Byb2ZpbGVfbGluayI6dHJ1ZSwiZmVhdHVyZV9wcmludF9wZGYiOmZhbHNlLCJmZWF0dXJlX3NhZmFyaTEwX2RlcHJlY2F0aW9uIjp0cnVlLCJmZWF0dXJlX3NhZmFyaTEwX2RlcHJlY2F0aW9uX21vZGFsIjp0cnVlLCJmZWF0dXJlX3NhZmFyaTEwX2RlcHJlY2F0aW9uX2Jsb2NrIjpmYWxzZSwiZmVhdHVyZV9kZXNrdG9wNDYwX2RlcHJlY2F0aW9uIjpmYWxzZSwiZmVhdHVyZV9kZXNrdG9wNDYwX2RlcHJlY2F0aW9uX2Jsb2NrIjpmYWxzZSwiZmVhdHVyZV9lbWFpbF93b3JrZmxvdyI6ZmFsc2UsImZlYXR1cmVfd2lkZXJfcmVhY3Rpb25fdGlwIjpmYWxzZSwiZmVhdHVyZV9maWxlX3BpY2tlcl9zZWFyY2giOmZhbHNlLCJmZWF0dXJlX3NvcnRfYnlfcmVjZW5jeV9wb3N0X3YxIjpmYWxzZSwiZmVhdHVyZV9zZW5kX2ZhaWxlZF90b2FzdCI6ZmFsc2UsImZlYXR1cmVfYXVkaW9fcGxheWVyIjpmYWxzZSwiZmVhdHVyZV9lYWdlcmx5X21hcmtfYnJvYWRjYXN0cyI6ZmFsc2UsImZlYXR1cmVfc2hvd19yZXBsaWVzX2ltbWVkaWF0ZWx5IjpmYWxzZSwiZmVhdHVyZV9jb21wb3Nlcl9lc2NhcGVfaGF0Y2giOmZhbHNlLCJmZWF0dXJlX2NvbXBvc2VyX2VtYWlsX2NsYXNzaWZpY2F0aW9uIjpmYWxzZSwiZmVhdHVyZV9hbWF6b25fYTExeV9jdXN0b21fc3RhdHVzX2Vtb2ppIjp0cnVlLCJmZWF0dXJlX2J5ZV9zbGFja2JvdF9oZWxwIjp0cnVlLCJmZWF0dXJlX2FsbF9kbV9tdXRlX2JvdHMiOnRydWUsImZlYXR1cmVfZmlsZV90aHJlYWRzIjp0cnVlLCJmZWF0dXJlX2Jyb2FkY2FzdF9pbmRpY2F0b3IiOnRydWUsImZlYXR1cmVfbmV3X3JlcGxpZXNfYWZ0ZXJfYmNhc3QiOnRydWUsImZlYXR1cmVfc29uaWNfZW1vamkiOnRydWUsImZlYXR1cmVfZW1vamlfMTIiOmZhbHNlLCJmZWF0dXJlX2VtYWlsX2luZ2VzdGlvbiI6ZmFsc2UsImZlYXR1cmVfYXR0YWNobWVudHNfaW5saW5lIjpmYWxzZSwiZmVhdHVyZV9maXhfZmlsZXMiOnRydWUsImZlYXR1cmVfYWFhX2FkbWluX2FwaXMiOnRydWUsImZlYXR1cmVfcmVtb3ZlX2FjdGlvbnNfZnJvbV9zaWRlYmFyIjpmYWxzZSwiZmVhdHVyZV9zaG9ydGN1dHNfdjJfZWR1Y2F0aW9uIjp0cnVlLCJmZWF0dXJlX3BhZF8xNTM0IjpmYWxzZSwiZmVhdHVyZV9zaG9ydGN1dHNfbWVudV9jbGVhbnVwX2kxOG4iOmZhbHNlLCJmZWF0dXJlX2FwcF9sYXVuY2hlcl9hZGRfaWNvbiI6ZmFsc2UsImZlYXR1cmVfYXBwX2xhdW5jaGVyX2Jhbm5lcnMiOmZhbHNlLCJmZWF0dXJlX2FwcF9sYXVuY2hlcl9zZWFyY2hfcGFnaW5hdGlvbiI6ZmFsc2UsImZlYXR1cmVfY2hhbm5lbF9zaWRlYmFyX2RyYWZ0c19zZWN0aW9uIjp0cnVlLCJmZWF0dXJlX25hdmlnYXRlX2hpc3RvcnkiOnRydWUsImZlYXR1cmVfaTE4bl9kcmFmdHMiOmZhbHNlLCJmZWF0dXJlX2NvbXBvc2VyX3VyYV9tcGRtIjpmYWxzZSwiZmVhdHVyZV9yZWNlbnRfc3RhdHVzX2RlbGV0ZSI6ZmFsc2UsImZlYXR1cmVfY29tcG9zZV9mbG93IjpmYWxzZSwiZmVhdHVyZV9jb21wb3NlX2Zsb3dfeHdzIjp0cnVlLCJmZWF0dXJlX2Zhc3Rlcl9jb3VudF9hbGxfdW5yZWFkcyI6dHJ1ZSwiZmVhdHVyZV9zb25pY191c2VyX2dyb3VwcyI6ZmFsc2UsImZlYXR1cmVfY2hhbm5lbF9zZWxlY3Rvcl9mb3JfdGVhbV9ndWVzdHNfdXBkYXRlIjpmYWxzZSwiZmVhdHVyZV9za19kYXRhX3RhYmxlX2ExMXkiOmZhbHNlLCJmZWF0dXJlX3NrX2RhdGFfdGFibGVfcGlubmVkX3Jvd3NfYW5kX2NvbHVtbnMiOmZhbHNlLCJmZWF0dXJlX2Rlc2t0b3Bfc3ltcHRvbV9ldmVudHMiOmZhbHNlLCJmZWF0dXJlX2RhdGFfcmVzaWRlbmN5X2RlYnVnZ2luZyI6ZmFsc2UsImZlYXR1cmVfbmV3X3N1YnRlYW1fbGlua2VkX2NoYW5uZWxfbGltaXQiOnRydWUsImZlYXR1cmVfc3VidGVhbV91c2VyX2xpbWl0Ijp0cnVlLCJmZWF0dXJlX2VudF9hZG1pbl9hcHByb3ZlZF9hcHBzX3YyIjp0cnVlLCJmZWF0dXJlX2Rhc2hib2FyZF9zb3J0YWJsZV9saXN0cyI6ZmFsc2UsImZlYXR1cmVfc2tfbG9hZGluZ19idXR0b25fbW90aW9ucyI6dHJ1ZSwiZmVhdHVyZV9za19iYXNlX2ljb24iOmZhbHNlLCJmZWF0dXJlX3NrX2Jhc2ljX3NlbGVjdF9hcmlhbGFiZWwiOmZhbHNlLCJmZWF0dXJlX3NrX3JlcXVpcmVkX2FyaWFsYWJlbCI6ZmFsc2UsImZlYXR1cmVfY2VfZW5nX2Nvbm5lY3RfZG1zIjpmYWxzZSwiZmVhdHVyZV9jZV9lbmdfc2VhcmNoX2RlbW8iOmZhbHNlLCJmZWF0dXJlX2NlX2VuZ19oZWxwX3ZpdGVzcyI6ZmFsc2UsImZlYXR1cmVfY2VfZW5nX3ZlcmlmaWVkX3RpY2tldHMiOmZhbHNlLCJmZWF0dXJlX2FwcF9kaXJfcGhvZW5peCI6ZmFsc2UsImZlYXR1cmVfc2hhcmVkX2NoYW5uZWxzX211bHRpX29yZyI6ZmFsc2UsImZlYXR1cmVfc2hhcmVkX2NoYW5uZWxzX211bHRpX29yZ19tcGltIjp0cnVlLCJmZWF0dXJlX3NoYXJlZF9jaGFubmVsc19tdWx0aV9vcmdfbXBpbV9mZSI6dHJ1ZSwiZmVhdHVyZV9jaGF0X21waW1fb3Blbl9yZWZhY3Rvcl9mZV9jb3B5Ijp0cnVlLCJmZWF0dXJlX2ZpbmRfYW5fYWRtaW5fZGlzY29ubmVjdF9leHBsYWluZXIiOmZhbHNlLCJmZWF0dXJlX3NoYXJlZF9jaGFubmVsc19tdWx0aV9vcmdfaW52aXRlc19iZSI6ZmFsc2UsImZlYXR1cmVfbXVsdGlfb3JnX2ludml0ZV91bmZ1cmwiOnRydWUsImZlYXR1cmVfc2hhcmVkX2NoYW5uZWxzX2xlZ2FjeV9yZWNvbm5lY3QiOnRydWUsImZlYXR1cmVfc2hhcmVkX2NoYW5uZWxzX211bHRpX29yZ19xYV9saW1pdF9vdmVycmlkZSI6ZmFsc2UsImZlYXR1cmVfbXVsdGlfd29ya3NwYWNlX3NoYXJlZF9jaGFubmVsc19iZSI6ZmFsc2UsImZlYXR1cmVfbXdzY194d3NfdG9fZXNjIjpmYWxzZSwiZmVhdHVyZV9yZXZva2VfZXNjX2ludml0ZXNfZmUiOmZhbHNlLCJmZWF0dXJlX213c2NfZXNjX3RvX3h3cyI6ZmFsc2UsImZlYXR1cmVfcmVtb3ZlX2RvdWJsZV9yaW5ncyI6ZmFsc2UsImZlYXR1cmVfcmVtb3ZlX2RvdWJsZV9kaWFtb25kcyI6ZmFsc2UsImZlYXR1cmVfY2hhbm5lbHNfdmlld19pbl9tc2MiOmZhbHNlLCJmZWF0dXJlX3NoYXJlZF9jaGFubmVsc19lbW9qaV9kZWxpZ2h0Ijp0cnVlLCJmZWF0dXJlX2NyZWF0ZV9wcml2YXRlX2NfY2hhbm5lbHMiOmZhbHNlLCJmZWF0dXJlX2dkcHJfdXNlcl9qb2luX3RvcyI6dHJ1ZSwiZmVhdHVyZV91c2VyX2ludml0ZV90b3NfYXByaWxfMjAxOCI6dHJ1ZSwiZmVhdHVyZV9ub19tb3JlX2dldF9vcmlnaW5hdGluZ190ZWFtX2ZlIjp0cnVlLCJmZWF0dXJlX3JvbGVzX2FyZV9mcmVzaF9waGFzZV8xIjpmYWxzZSwiZmVhdHVyZV9jaGFubmVsX21nbXRfbWVzc2FnZV9jb3VudCI6ZmFsc2UsImZlYXR1cmVfYW9wc18zMzIwX3JldHVybl91c2VyX2lkc19hbmRfZXJyb3Jfc3RyaW5ncyI6dHJ1ZSwiZmVhdHVyZV9mdW5uZWxfY2FrZSI6ZmFsc2UsImZlYXR1cmVfbmV1ZV90eXBlIjpmYWxzZSwiZmVhdHVyZV9jdXN0X2FjcV9pMThuX3R3ZWFrcyI6ZmFsc2UsImZlYXR1cmVfZXhwb3J0c19jb3B5X3VwZGF0ZXMiOnRydWUsImZlYXR1cmVfd2hpdGVsaXN0X3plbmRlc2tfY2hhdF93aWRnZXQiOmZhbHNlLCJmZWF0dXJlX2NvbW1lbmRhdGlvbnNfc3B5Ijp0cnVlLCJmZWF0dXJlX3h3c19pMThuIjpmYWxzZSwiZmVhdHVyZV91c2VfaW1ncHJveHlfcmVzaXppbmciOnRydWUsImZlYXR1cmVfc2hhcmVfbWVudGlvbl9jb21tZW50X2NsZWFudXAiOmZhbHNlLCJmZWF0dXJlX2JvYXJkc19pMThuIjpmYWxzZSwiZmVhdHVyZV9kaXNhYmxlX2JrX2luX3RocmVhZCI6ZmFsc2UsImZlYXR1cmVfbmV3X2xvY2FsZV90b2FzdCI6dHJ1ZSwiZmVhdHVyZV9jaGFubmVsX2V4cG9ydHMiOmZhbHNlLCJmZWF0dXJlX2RvY3NfbWVudGlvbnNfYW5kX2NoYW5uZWxzIjpmYWxzZSwiZmVhdHVyZV9jYWxsc19zdXJ2ZXlfcmVxdWVzdF9yZXNwb25zZSI6dHJ1ZSwiZmVhdHVyZV90b2tlbl9pcF93aGl0ZWxpc3QiOnRydWUsImZlYXR1cmVfc2lkZWJhcl90aGVtZV91bmRvIjp0cnVlLCJmZWF0dXJlX2FsbG93X2ludHJhX3dvcmRfZm9ybWF0dGluZyI6dHJ1ZSwiZmVhdHVyZV9pMThuX2NoYW5uZWxzX3ZhbGlkYXRlX2Vtb2ppIjp0cnVlLCJmZWF0dXJlX2Z3X2VuZ19ub3JtYWxpemF0aW9uIjp0cnVlLCJmZWF0dXJlX3NsaW1fc2Nyb2xsYmFyIjpmYWxzZSwiZmVhdHVyZV9wcmltYXJ5X3NlYXJjaCI6ZmFsc2UsImZlYXR1cmVfbW9kZXJuX3NvdW5kcyI6ZmFsc2UsImZlYXR1cmVfcXVpY2tfY29weV9jb2RlX2Jsb2NrcyI6dHJ1ZSwiZmVhdHVyZV9zdGVlcGxlX2NodXJjaCI6dHJ1ZSwiZmVhdHVyZV9zdGVlcGxlX2NodXJjaF9saW5rIjp0cnVlLCJmZWF0dXJlX3N0ZWVwbGVfY2h1cmNoX2V4dCI6dHJ1ZSwiZmVhdHVyZV9zdHJvbGxlcnNfdG9fcGVyY2giOnRydWUsImZlYXR1cmVfZmlsZV9icm93c2VyX3YyIjpmYWxzZSwiZmVhdHVyZV9wZW9wbGVfc2VhcmNoIjpmYWxzZSwiZmVhdHVyZV9yZWFjdF9tZXNzYWdlcyI6dHJ1ZSwiZmVhdHVyZV9lZGdlX3VwbG9hZF9wcm94eV9jaGVjayI6ZmFsc2UsImZlYXR1cmVfdW5yZWFkX2NvdW50c19kZWxheSI6dHJ1ZSwiZmVhdHVyZV9sZWdhY3lfZmlsZV91cGxvYWRfYW5hbHl0aWNzIjp0cnVlLCJmZWF0dXJlX21wZG1fbGltaXRfY2hhbm5lbF9jcmVhdGlvbiI6ZmFsc2UsImZlYXR1cmVfc25pcHBldF9tb2Rlc19pMThuIjpmYWxzZSwiZmVhdHVyZV9la21fbWVzc2FnZV9yZXZvY2F0aW9uX3BvbGxpbmdfdGVzdCI6ZmFsc2UsImZlYXR1cmVfdGVhbV9hZG1pbnNfbGlzdF9hcGkiOnRydWUsImZlYXR1cmVfbW92ZWRfZGV0YWlscyI6ZmFsc2UsImZlYXR1cmVfbXNfbGF0ZXN0Ijp0cnVlLCJmZWF0dXJlX2d1ZXN0c191c2VfZW50aXRsZW1lbnRzIjp0cnVlLCJmZWF0dXJlX3Jvb21zX2pvaW5fYXBpIjp0cnVlLCJmZWF0dXJlX3Jvb21zX2pvaW5fdXJsIjpmYWxzZSwiZmVhdHVyZV9jYWxsc19zaXBfaW50ZWdyYXRpb25fbGFiZWxzIjpmYWxzZSwiZmVhdHVyZV90YXNrc192MV9jb3B5IjpmYWxzZSwiZmVhdHVyZV9jYWxsc19jb252ZXJzYXRpb25zIjpmYWxzZSwiZmVhdHVyZV9jdXN0b21fc3RhdHVzX2NhbGVuZGFyX3N5bmNfY29weSI6dHJ1ZSwiZmVhdHVyZV9jdXN0b21fc3RhdHVzX2NhbGVuZGFyX3N5bmMiOmZhbHNlLCJmZWF0dXJlX21hc2tfdW5kb2N1bWVudGVkX2Vycm9ycyI6ZmFsc2UsImZlYXR1cmVfYXBwX2FjdGlvbnNfYWRtaW5fcGFnZXMiOnRydWUsImZlYXR1cmVfYXBwX3ZpZXdzX3JlbWluZGVycyI6dHJ1ZSwiZmVhdHVyZV9yZW1pbmRlcnNfb3JnX3NoYXJkIjpmYWxzZSwiZmVhdHVyZV9yZW1pbmRlcnNfZ3JpZF9taWdyYXRpb25zX29yZ19zaGFyZCI6dHJ1ZSwiZmVhdHVyZV9ibG9ja3NfcmVtaW5kZXJzX2xpc3QiOmZhbHNlLCJmZWF0dXJlX21lc3NhZ2VfYmxvY2tzIjpmYWxzZSwiZmVhdHVyZV9zaWxlbmNlX2FwcF9kbXMiOmZhbHNlLCJmZWF0dXJlX3NldF90el9hdXRvbWF0aWNhbGx5Ijp0cnVlLCJmZWF0dXJlX2NvbmZpcm1fY2xlYXJfYWxsX3VucmVhZHNfcHJlZiI6dHJ1ZSwiZmVhdHVyZV9ibG9ja19tb3VudHMiOnRydWUsImZlYXR1cmVfYXR0YWNobWVudHNfdjIiOnRydWUsImZlYXR1cmVfYmxvY2tfa2l0X2V4cGFuZGFibGVfYmxvY2siOmZhbHNlLCJmZWF0dXJlX2dyb3VwX2Jsb2NrIjpmYWxzZSwiZmVhdHVyZV9ibG9ja19raXRfZGVlcF9saW5rcyI6dHJ1ZSwiZmVhdHVyZV9zaG93X2Jsb2NrX2tpdF9pbl9zaGFyZV9kaWFsb2dzIjpmYWxzZSwiZmVhdHVyZV9ibG9ja19raXRfdXNlcl9ibG9jayI6ZmFsc2UsImZlYXR1cmVfYmxvY2tfa2l0X3JhZGlvX2J1dHRvbnMiOnRydWUsImZlYXR1cmVfbXJrZHduX29uX3JhZGlvX2J1dHRvbiI6dHJ1ZSwiZmVhdHVyZV9ibG9ja19raXRfdGFibGUiOmZhbHNlLCJmZWF0dXJlX2NoZWNrYm94ZXNfcmFkaW9zX2luX21lc3NhZ2VzIjp0cnVlLCJmZWF0dXJlX2lucHV0X2Jsb2NrX3B0aV93ZmJfZGlzcGF0Y2hfYWN0aW9uIjpmYWxzZSwiZmVhdHVyZV9pbnB1dF9ibG9ja3NfZW1pdF9hY3Rpb25zIjp0cnVlLCJmZWF0dXJlX2Jsb2NrX2tpdF9mdWxsX2FjdGlvbnNfc3RhdGUiOnRydWUsImZlYXR1cmVfaW5wdXRfYmxvY2tzX2luX2FwcF9ob21lIjp0cnVlLCJmZWF0dXJlX2lucHV0X2Jsb2Nrc19pbl9tZXNzYWdlcyI6ZmFsc2UsImZlYXR1cmVfYmxvY2tfa2l0X2Z1bGxfdmlld19zdGF0ZSI6dHJ1ZSwiZmVhdHVyZV9ibG9ja19raXRfYWN0aW9uX3NlY3Rpb25faW5fdmlld19zdGF0ZSI6dHJ1ZSwiZmVhdHVyZV9ibG9ja19raXRfc3RhdGVfaW5fYmxvY2tzX2FjdGlvbnMiOnRydWUsImZlYXR1cmVfYmxvY2tfa2l0X2VtcHR5X3N0YXRlX3RyYW5zbGF0aW9uX2Zvcl92aWV3X3N0YXRlIjp0cnVlLCJmZWF0dXJlX211bHRpc2VsZWN0c19pbl9hY3Rpb25zX2Jsb2NrIjpmYWxzZSwiZmVhdHVyZV9ibG9ja19raXRfcmFuZ2VfZGF0ZXBpY2tlciI6ZmFsc2UsImZlYXR1cmVfZGVsZXRlX2FwcF9ob21lc19hc3NvY2lhdGVkX3dpdGhfZGVsZXRlZF9zZXJ2aWNlIjpmYWxzZSwiZmVhdHVyZV9ibG9ja19raXRfdGltZXBpY2tlciI6dHJ1ZSwiZmVhdHVyZV9ibG9ja19raXRfdGltZXBpY2tlcl9yZW1pbmQiOnRydWUsImZlYXR1cmVfYmxvY2tfa2l0X2RhdGVwaWNrZXJfaW5wdXQiOnRydWUsImZlYXR1cmVfYmxvY2tfa2l0X2FwcF9iZXRhIjp0cnVlLCJmZWF0dXJlX2FkZF9hcHBfaG9tZV90ZWFtX25hbWUiOmZhbHNlLCJmZWF0dXJlX2JlYWNvbl9qc19lcnJvcnMiOmZhbHNlLCJmZWF0dXJlX2JlYWNvbl9qc19hZG1pbl9lcnJvcnMiOmZhbHNlLCJmZWF0dXJlX3VzZXJfYXBwX2Rpc2FibGVfc3BlZWRfYnVtcCI6dHJ1ZSwiZmVhdHVyZV90cmFjdG9yX3NoYXJlZF9pbnZpdGVfbGluayI6dHJ1ZSwiZmVhdHVyZV9uZXd4cF8yMTE5Ijp0cnVlLCJmZWF0dXJlX3RyYWN0b3JfYmFja3VwX2NoYW5uZWxuYW1lX2NvcHkiOnRydWUsImZlYXR1cmVfZGVncmFkZWRfcnRtX2Fsd2F5c19mYWlscyI6ZmFsc2UsImZlYXR1cmVfYXBwc19tYW5hZ2VfcGVybWlzc2lvbnNfc2NvcGVfY2hhbmdlcyI6dHJ1ZSwiZmVhdHVyZV9yZW1pbmRlcl9jcm9zc193b3Jrc3BhY2UiOnRydWUsImZlYXR1cmVfcDJwIjpmYWxzZSwiZmVhdHVyZV9jbGFzc2ljX25hdiI6ZmFsc2UsImZlYXR1cmVfbmV3X3JlYWN0aW9ucyI6dHJ1ZSwiZmVhdHVyZV9wYWdlc19leGFtcGxlIjpmYWxzZSwiZmVhdHVyZV9zb25pY19waW5zIjpmYWxzZSwiZmVhdHVyZV9zb25pY192aWRlb19wbGFjZWhvbGRlciI6dHJ1ZSwiZmVhdHVyZV9pYXAxIjpmYWxzZSwiZmVhdHVyZV9pYV9nYSI6dHJ1ZSwiZmVhdHVyZV9pYV9kZWJ1Z19vZmYiOmZhbHNlLCJmZWF0dXJlX2lhX2kxOG4iOnRydWUsImZlYXR1cmVfaWFfdGhlbWVzIjp0cnVlLCJmZWF0dXJlX2lhX21lbWJlcl9wcm9maWxlIjp0cnVlLCJmZWF0dXJlX3dvcmtzcGFjZV9zY2ltX21hbmFnZW1lbnQiOmZhbHNlLCJmZWF0dXJlX3VuaWZpZWRfbWVtYmVyIjpmYWxzZSwiZmVhdHVyZV90dXJuX21wZG1fbm90aWZzX29uIjp0cnVlLCJmZWF0dXJlX2Rlc2t0b3BfcmVsb2FkX29uX2dlbmVyaWNfZXJyb3IiOnRydWUsImZlYXR1cmVfZGVza3RvcF9leHRlbmRfYXBwX21lbnUiOmZhbHNlLCJmZWF0dXJlX2Rlc2t0b3BfcmVzdGFydF9zZXJ2aWNlX3dvcmtlciI6ZmFsc2UsImZlYXR1cmVfZGVza3RvcF9zeXN0ZW1fbm90aWZpY2F0aW9uX3BsYXliYWNrIjpmYWxzZSwiZmVhdHVyZV9hMTF5X2R5c2xleGljIjpmYWxzZSwiZmVhdHVyZV9kb2xvcmVzIjpmYWxzZSwiZmVhdHVyZV9kZXNrdG9wX2ZvcmNlX3Byb2R1Y3Rpb25fY2hhbm5lbCI6ZmFsc2UsImZlYXR1cmVfZGVza3RvcF9sb2dzX3VwbG9hZCI6ZmFsc2UsImZlYXR1cmVfbWFjb3NfZGlzYWJsZV9odyI6dHJ1ZSwiZmVhdHVyZV9hdF9oZXJlX3dhcm5pbmciOmZhbHNlLCJmZWF0dXJlX2JvdHNfbm90X21lbWJlcnMiOnRydWUsImZlYXR1cmVfd3RhX3N0b3BfY3JlYXRpb24iOnRydWUsImZlYXR1cmVfbTExbl9jaGFubmVsX2RldGFpbHMiOmZhbHNlLCJmZWF0dXJlX3BsYXRmb3JtX2RlcHJlY2F0aW9uc19mZSI6dHJ1ZSwiZmVhdHVyZV9jaGFubmVsX2FjdGlvbnMiOnRydWUsImZlYXR1cmVfc2hvcnRjdXRzX3Byb21wdCI6dHJ1ZSwiZmVhdHVyZV9uZXdfY29sb3JfcGlja2VyX3N0cmluZ3MiOmZhbHNlLCJmZWF0dXJlX2FjY2Vzc2libGVfZGlhbG9ncyI6dHJ1ZSwiZmVhdHVyZV9hY2Nlc3NpYmxlX2Vtb2ppX3NraW5fdG9uZV9waWNrZXIiOnRydWUsImZlYXR1cmVfbmV3X3N0cmluZ3NfZm9yX2Jyb3dzZXJfdmlld3MiOmZhbHNlLCJmZWF0dXJlX2NhbGxzX2NsaXBib2FyZF9icm9hZGNhc3Rpbmdfb3B0aW4iOnRydWUsImZlYXR1cmVfc2NyZWVuX3NoYXJlX25lZWRzX2Flcm8iOmZhbHNlLCJmZWF0dXJlX2FjY2Vzc2libGVfZnNfZGlhbG9ncyI6dHJ1ZSwiZmVhdHVyZV9jaGFubmVsX2hlYWRlcl9sYWJlbHMiOmZhbHNlLCJmZWF0dXJlX3RyYXBfa2Jfd2l0aGluX2ZzX21vZGFscyI6dHJ1ZSwiZmVhdHVyZV9tb2Rlcm5faW1hZ2Vfdmlld2VyIjp0cnVlLCJmZWF0dXJlX2Vtb2ppX2J5X2lkIjp0cnVlLCJmZWF0dXJlX21jX21pZ3JhdGlvbl9iYW5uZXIiOnRydWUsImZlYXR1cmVfYXJpYV9hcHBsaWNhdGlvbl9tb2RlIjpmYWxzZSwiZmVhdHVyZV91cGRhdGVfbXVsdGl3b3Jrc3BhY2VfY2hhbm5lbF9tb2RhbCI6dHJ1ZSwiZmVhdHVyZV9tb2Rlcm5fcmVxdWVzdF93b3Jrc3BhY2VfZGlhbG9nIjpmYWxzZSwiZmVhdHVyZV93b3Jrc3BhY2VfYXBwc19tYW5hZ2VfZ2FudHJ5IjpmYWxzZSwiZmVhdHVyZV93b3Jrc3BhY2VfYXBwc19tYW5hZ2VfZ2FudHJ5X3YyX3IxIjp0cnVlLCJmZWF0dXJlX2FwcF9hZG1pbl9idXR0b25zX3NwZWVkYnVtcCI6ZmFsc2UsImZlYXR1cmVfbW9kZXJuX3Byb2ZpbGVfZmxleHBhbmUiOmZhbHNlLCJmZWF0dXJlX3NjZ19jb252ZXJzaW9uX2NoYW5uZWxzIjp0cnVlLCJmZWF0dXJlX2VudGVycHJpc2VfcmV0ZW50aW9uX2FsbG93X292ZXJyaWRlX29uX29yZ19sZXZlbF9jaGFubmVscyI6ZmFsc2UsImZlYXR1cmVfZW50ZXJwcmlzZV9yZXRlbnRpb25fYWRtaW5fcmV0ZW50aW9uX2J5X2NjbSI6ZmFsc2UsImZlYXR1cmVfZXhwb3J0c19maWx0ZXIiOnRydWUsImZlYXR1cmVfdHJhY2tfdGltZV9zcGVudCI6dHJ1ZSwiZmVhdHVyZV9jaGFubmVsX2ludml0ZV90b2tlbml6YXRpb24iOnRydWUsImZlYXR1cmVfaW1wb3J0c19jYW5jZWwiOnRydWUsImZlYXR1cmVfZW1haWxfd29ya29iamVjdF91aSI6ZmFsc2UsImZlYXR1cmVfZW1haWxfbm90aWZ5IjpmYWxzZSwiZmVhdHVyZV9lbWFpbF9mb3JjZV9kb3dubG9hZCI6dHJ1ZSwiZmVhdHVyZV9vZmZpY2VfZGlyZWN0b3J5IjpmYWxzZSwiZmVhdHVyZV9jYWxlbmRhcl9zaW1wbGVfYWdlbmRhX3ZpZXciOmZhbHNlLCJmZWF0dXJlX3RlYW1fdGhlbWVzIjpmYWxzZSwiZmVhdHVyZV91bmZ1cmxfbWV0YWRhdGEiOmZhbHNlLCJmZWF0dXJlX3BhcGVyY2xpcF9jb2FjaG1hcmtfZXhwZXJpbWVudHMiOnRydWUsImZlYXR1cmVfcGx1c19tZW51X2FkZF9hcHBzX2xpbmsiOmZhbHNlLCJmZWF0dXJlX3JlbmFtZV9jaGFubmVsX2Rpc2FibGVfZmVlZGJhY2tfaTE4biI6ZmFsc2UsImZlYXR1cmVfcmVjZW50X2ZpbGVzX29tbmlwaWNrZXIiOmZhbHNlLCJmZWF0dXJlX3JlY2VudF9kZXNrdG9wX2ZpbGVzIjpmYWxzZSwiZmVhdHVyZV9lbWFpbF9maWxlX3VuZnVybF9mb3JtYXQiOnRydWUsImZlYXR1cmVfbGlua19wcm90b2NvbF9iZXRhIjpmYWxzZSwiZmVhdHVyZV9zdHJpcGVfbGlnaHRfbGVnYWN5X3B1cmNoYXNlX21vZGUiOmZhbHNlLCJmZWF0dXJlX2NoZWNrb3V0X2ZvcmNlX2ludG9fbGVnYWN5IjpmYWxzZSwiZmVhdHVyZV9zb25pY19wbGFjZWhvbGRlcl9sYWJlbHMiOmZhbHNlLCJmZWF0dXJlX3NvbmljX2VzY19jcmVhdGlvbiI6ZmFsc2UsImZlYXR1cmVfZGFuZ2Vyb3VzbHlfZ3VhcmRfaWFfdHJhbnNsYXRpb25zIjpmYWxzZSwiZmVhdHVyZV9pYV9jb250ZXh0X21lbnVzIjpmYWxzZSwiZmVhdHVyZV9pYV9sYXlvdXQiOmZhbHNlLCJmZWF0dXJlX21pc2NfaWFfYTExeV90cmFuc2xhdGlvbnMiOmZhbHNlLCJmZWF0dXJlX3RocmVhZGVkX2NhbGxfYmxvY2siOmZhbHNlLCJmZWF0dXJlX2VuYWJsZV9yZWFkX3RpbWVfdmFsaWRhdGlvbnNfZm9yX3Nob3J0Y3V0cyI6ZmFsc2UsImZlYXR1cmVfbWVzc2FnZV9hY3Rpb25zX2luX2FwcF9hY3Rpb25zX2ZyYW1ld29ya19jbGllbnQiOnRydWUsImZlYXR1cmVfbWVzc2FnZV9hY3Rpb25zX2luX2FwcF9hY3Rpb25zX2ZyYW1ld29ya19kZXZlbG9wZXIiOnRydWUsImZlYXR1cmVfc2xhY2tfbWVzc2FnZV9hdHRhY2htZW50X3Rvb2x0aXAiOmZhbHNlLCJmZWF0dXJlX2VudGVycHJpc2VfbW9iaWxlX2RldmljZV9jaGVjayI6dHJ1ZSwiZmVhdHVyZV9uZXd4cF80NDAyIjp0cnVlLCJmZWF0dXJlX3NoYXJlZF9jaGFubmVsc19jdXN0b21fZW1vamlzX3VybCI6ZmFsc2UsImZlYXR1cmVfbmV3X2NvcHlfZm9yX2lkZW50aXR5X2Jhc2ljIjpmYWxzZSwiZmVhdHVyZV9zb25pY19sZWF2ZV93b3Jrc3BhY2VfZGlhbG9nIjpmYWxzZSwiZmVhdHVyZV9zaGFyZWRfY2hhbm5lbHNfbmV3X3VzZXJfdHJpYWwiOnRydWUsImZlYXR1cmVfc2hhcmVkX2NoYW5uZWxzX2ludml0ZXJfdHJpYWwiOmZhbHNlLCJmZWF0dXJlX3NjX2ludml0ZV9qb2luX3BlbmRpbmdfY2hhbm5lbF9hY3Rpb24iOmZhbHNlLCJmZWF0dXJlX3NoYXJlZF9jaGFubmVsc19pbnZpdGVyX3RyaWFsX2JhYnlfdGVhbXMiOmZhbHNlLCJmZWF0dXJlX3NoYXJlZF9jaGFubmVsc19tdWx0aV9lbWFpbF9pbnZpdGUiOnRydWUsImZlYXR1cmVfc2hhcmVkX2NoYW5uZWxzXzkwX2RheV90cmlhbCI6dHJ1ZSwiZmVhdHVyZV9zaGFyZWRfY2hhbm5lbHNfOTBfZGF5X3RyaWFsX2ludml0ZXIiOmZhbHNlLCJmZWF0dXJlX3NoYXJlZF9jaGFubmVsc19oYXBwaWVyX3BhdGhzIjpmYWxzZSwiZmVhdHVyZV9sYXRlX3BheW1lbnRfc3VjY2Vzc19ub3RpZmljYXRpb24iOmZhbHNlLCJmZWF0dXJlX2F1c3RyYWxpYV90YXhfY2hhbmdlX25vdGlmaWNhdGlvbiI6ZmFsc2UsImZlYXR1cmVfc2hhcmVkX2NoYW5uZWxfaW52aXRlc192MiI6dHJ1ZSwiZmVhdHVyZV9iZXR0ZXJfaW52aXRlc19jYWxsX3YyX2FwaSI6dHJ1ZSwiZmVhdHVyZV9zaGFyZWRfY2hhbm5lbHNfaW52aXRlX2NyZWF0ZV9lZHVjYXRpb24iOnRydWUsImZlYXR1cmVfc2hhcmVkX2NoYW5uZWxzX2ludml0ZV9lbWFpbF9ib3VuY2Vfbm90aWZpY2F0aW9uIjp0cnVlLCJmZWF0dXJlX3NoYXJlZF9jaGFubmVsc19pbnZpdGVfZW1haWxfcmVtaW5kZXIiOnRydWUsImZlYXR1cmVfc2hhcmVkX2NoYW5uZWxzX2NvbnRlbnQiOnRydWUsImZlYXR1cmVfc2hhcmVkX2NoYW5uZWxzX3RyaWFsX2VkdSI6dHJ1ZSwiZmVhdHVyZV91c2VyX2ludml0ZV9lbWFpbF9ib3VuY2Vfbm90aWZpY2F0aW9uX3RyYW5zbGF0aW9uIjp0cnVlLCJmZWF0dXJlX3BhaWRfb25ib2FyZGluZ19wYWdldXBkYXRlIjp0cnVlLCJmZWF0dXJlX3RyYWNlX3dlYmFwcF9pbml0Ijp0cnVlLCJmZWF0dXJlX3RyYWNlX2pxX2luaXQiOnRydWUsImZlYXR1cmVfdHJpYWxfZW5kX2wxMG4iOmZhbHNlLCJmZWF0dXJlX3RyaWFsX2VuZGluZ19lbWFpbF91cGRhdGVzIjp0cnVlLCJmZWF0dXJlX3dvcmtzcGFjZV9tZW51X3BsYW5faW5mbyI6dHJ1ZSwiZmVhdHVyZV9wYXJ0bmVyX3Rlcm1zX2kxOG4iOmZhbHNlLCJmZWF0dXJlX3BhcnRuZXJfZmFxX2kxOG4iOnRydWUsImZlYXR1cmVfdHJpYWxfZXhwaXJhdGlvbl9kYXRlX2kxOG4iOmZhbHNlLCJmZWF0dXJlX3N0cmlwZV9jb21wbGV0ZWx5X2Rvd25fYmFubmVyIjpmYWxzZSwiZmVhdHVyZV9mYWlyX2JpbGxpbmdfZGV0YWlsX2ludm9pY2Vfc3RhdGVtZW50cyI6ZmFsc2UsImZlYXR1cmVfY2hlY2tvdXRfemlwX2F1dG9jb21wbGV0ZV90cmFuc2xhdGlvbnMiOnRydWUsImZlYXR1cmVfYmlsbGluZ19tZW1iZXJfZW1haWxfdXBkYXRlcyI6ZmFsc2UsImZlYXR1cmVfZmFpcl9iaWxsaW5nX2JhY2tlbmRfcmVmYWN0b3IiOmZhbHNlLCJmZWF0dXJlX3VhZV90YXhfaWRfY29sbGVjdGlvbiI6dHJ1ZSwiZmVhdHVyZV9jaGlsZV90YXhfaWRfY29sbGVjdGlvbiI6dHJ1ZSwiZmVhdHVyZV9rc2FfdGF4X2lkX2NvbGxlY3Rpb24iOnRydWUsImZlYXR1cmVfaW5kb25lc2lhX3RheF9jaGFuZ2Vfbm90aWZpY2F0aW9uIjpmYWxzZSwiZmVhdHVyZV9pbmRvbmVzaWFfdGF4X2Fzc2Vzc21lbnQiOmZhbHNlLCJmZWF0dXJlX2NhcGl0YWxpemVfc2luZ2xlX2NoYW5uZWxfc3RhdHVzIjpmYWxzZSwiZmVhdHVyZV9lbnRlcnByaXNlX2FuYWx5dGljc18yMDE5X3EzX2VuaGFuY2VtZW50cyI6ZmFsc2UsImZlYXR1cmVfbW9kZXJuaXplX29yZ19kYXNoX2NoYXJ0cyI6dHJ1ZSwiZmVhdHVyZV9tb2Rlcm5pemVfb3JnX3RlYW1fYW5hbHl0aWNzIjpmYWxzZSwiZmVhdHVyZV9tZXNzYWdlc19mcm9tX2FwcHNfYW5hbHl0aWNzIjpmYWxzZSwiZmVhdHVyZV9vcmdfbGV2ZWxfYXBwcyI6ZmFsc2UsImZlYXR1cmVfb3JnX2xldmVsX2FwcHNfY3VzdG9tIjpmYWxzZSwiZmVhdHVyZV9vcmdfbGV2ZWxfYXBwc19hZG1pbl9iZXRhIjpmYWxzZSwiZmVhdHVyZV9zc29fdmFsaWRhdGVfYXVkaWVuY2UiOnRydWUsImZlYXR1cmVfY2hhbm5lbF9zZWN0aW9ucyI6dHJ1ZSwiZmVhdHVyZV9jaGFubmVsX3NlY3Rpb25zX3NpZGViYXJfYmVoYXZpb3JfdWkiOmZhbHNlLCJmZWF0dXJlX2FuYWx5dGljc19zY2ltX2ZpZWxkc19wYWlkIjpmYWxzZSwiZmVhdHVyZV9nb29nbGVfZGlyZWN0b3J5X2ludml0ZXMiOmZhbHNlLCJmZWF0dXJlX21pZ3JhdGVfZ29vZ2xlX2RpcmVjdG9yeV9hcGlzIjp0cnVlLCJmZWF0dXJlX3NlYXJjaF9yZXN1bHRzX3ZpcnR1YWxpemVkIjpmYWxzZSwiZmVhdHVyZV9zaG93X2VtYWlsX2ZvcndhcmRlZF9ieSI6ZmFsc2UsImZlYXR1cmVfbmV3X2Vub3VnaF9wZXJpb2RpY19yZWxvYWRzIjpmYWxzZSwiZmVhdHVyZV9idWlsZGVyX3dvcmtmbG93X2FjdGl2aXR5Ijp0cnVlLCJmZWF0dXJlX2J1aWxkZXJfZXhwb3J0X2Zvcm1fY3N2X2FkbWluIjp0cnVlLCJmZWF0dXJlX2hlYWRlcl9ibG9jayI6dHJ1ZSwiZmVhdHVyZV9oZWFkZXJfYmxvY2tfYmtiIjp0cnVlLCJmZWF0dXJlX3JhdGVfbGltaXRfYXBwX2NyZWF0aW9uIjp0cnVlLCJmZWF0dXJlX2dpcGh5X3Nob3J0Y3V0IjpmYWxzZSwiZmVhdHVyZV9kb3dubG9hZF9maW5kZXJfdXBkYXRlIjp0cnVlLCJmZWF0dXJlX3NoYXJlX21vZGFsX2RpYWxvZyI6ZmFsc2UsImZlYXR1cmVfb25lZHJpdmVfZXJyb3JfdHJhbnNsYXRpb25zIjp0cnVlLCJmZWF0dXJlX3B1dF9hX21lbnRpb25fb25faXQiOnRydWUsImZlYXR1cmVfYnJvd3Nlcl9waWNrZXIiOnRydWUsImZlYXR1cmVfZWR1XzEwMSI6dHJ1ZSwiZmVhdHVyZV9uZXd4cF80Njg4Ijp0cnVlLCJmZWF0dXJlX2FwcF9kaXJfZ3Jhbl9ib3Rfc3VibWl0Ijp0cnVlLCJmZWF0dXJlX2FwcF9kaXJfd29ya2Zsb3dfc3RlcHMiOnRydWUsImZlYXR1cmVfYXBwX2Rpcl93b3JrZmxvd19zdGVwc19jYXJvdXNlbCI6ZmFsc2UsImZlYXR1cmVfYXBwX2Rpcl93b3JrZmxvd19zdGVwc19wcm9tbyI6ZmFsc2UsImZlYXR1cmVfYXBwX2xpc3RpbmdfcmVmcmVzaCI6dHJ1ZSwiZmVhdHVyZV9hcHBfbGlzdGluZ19yZWZyZXNoX3Njb3BlcyI6dHJ1ZSwiZmVhdHVyZV9hcHBfbGlzdGluZ19yZWZyZXNoX3B0XzIiOmZhbHNlLCJmZWF0dXJlX2hjX3VwZGF0ZWRfdGl0bGUiOmZhbHNlLCJmZWF0dXJlX3BhcnNlY19tZXRob2RzIjpmYWxzZSwiZmVhdHVyZV9zb3VsX3NlYXJjaGVycyI6ZmFsc2UsImZlYXR1cmVfc25kX3F1ZXJ5X3JlZmluZW1lbnRzIjp0cnVlLCJmZWF0dXJlX2VtYWlsX2NsYXNzaWZpY2F0aW9uIjp0cnVlLCJmZWF0dXJlX3ByaW1hcnlfb3duZXJfY29uc2lzdGVudF9yb2xlcyI6dHJ1ZSwiZmVhdHVyZV9pbnZpdGVfdG9fY2hhbm5lbF9ieV9lbWFpbF91aSI6dHJ1ZSwiZmVhdHVyZV9lZHVfMTEwIjp0cnVlLCJmZWF0dXJlX3Npd3NfbGlua3MiOmZhbHNlLCJmZWF0dXJlX2xvY2FsZV9pdF9JVCI6ZmFsc2UsImZlYXR1cmVfbG9jYWxlX2tvX0tSIjpmYWxzZSwiZmVhdHVyZV9sb2NhbGVfcnVfUlUiOmZhbHNlLCJmZWF0dXJlX2xvY2FsZV96aF9DTiI6ZmFsc2UsImZlYXR1cmVfbG9jYWxlX3poX1RXIjpmYWxzZSwiZmVhdHVyZV9zZWFyY2hfZmlsdGVyX2ZpbGVfYXR0YWNobWVudHMiOmZhbHNlLCJmZWF0dXJlX21wZG1fYXVkaWVuY2VfZXhwYW5zaW9uIjp0cnVlLCJmZWF0dXJlX3JvYnVzdF9nZXRfZm9ybV9kYXRhIjp0cnVlLCJmZWF0dXJlX25ld3hwXzQzMTIiOmZhbHNlLCJmZWF0dXJlX2NlX2VuZ19zZWFyY2hfemVuZGVza19hcGkiOmZhbHNlLCJmZWF0dXJlX2JrX2Vycm9yX21lc3NhZ2luZyI6dHJ1ZSwiZmVhdHVyZV9sYXJnZV9lbW9qaV9pbl90b29sdGlwIjp0cnVlLCJmZWF0dXJlX25ld3hwXzM3OTUiOmZhbHNlLCJmZWF0dXJlX25ld19ub3RpZmljYXRpb25zX3N0cmluZyI6ZmFsc2UsImZlYXR1cmVfYXBwc19ldmVudF9hdXRob3JpemF0aW9uc19saXN0X2VuZHBvaW50X2E3ZTUxZiI6dHJ1ZSwiZmVhdHVyZV9ndWFyZF9jaGFubmVsX2RldGFpbHNfdHJhbnNsYXRpb25zIjpmYWxzZSwiZmVhdHVyZV9zYV9ub3RpZl9lbmhhbmNlbWVudHMiOnRydWUsImZlYXR1cmVfdmVyaWZpZWRfb3Jnc19mZSI6ZmFsc2UsImZlYXR1cmVfcmVmaW5lX3lvdXJfc2VhcmNoX2kxOG4iOnRydWUsImZlYXR1cmVfbmV3eHBfNDU5NyI6dHJ1ZSwiZmVhdHVyZV9maWxlX2FjdGlvbnNfZml4IjpmYWxzZSwiZmVhdHVyZV9pbmxpbmVfZmVlZGJhY2siOmZhbHNlLCJmZWF0dXJlX2VkdV8xODIiOnRydWUsImZlYXR1cmVfY3JlZGl0X2Jhbm5lcl9iYXNpY190cmFuc2xhdGlvbnMiOmZhbHNlLCJmZWF0dXJlX2lkcl9iYWNrZmlsbHMiOmZhbHNlLCJmZWF0dXJlX2VkdV8xODciOnRydWUsImZlYXR1cmVfYWRkX3RvX2NoYW5uZWxfcHJvdG90eXBlIjpmYWxzZSwiZmVhdHVyZV9zdHJpcGVfaGFja19taWdyYXRpb24iOmZhbHNlLCJmZWF0dXJlX3BhaWRfYmVuZWZpdHNfYWxlcnRfdHJhbnNsYXRpb25zIjp0cnVlLCJmZWF0dXJlX3BsYW5fYmVuZWZpdHNfZGF5X29uZV90cmlhbF9oZWFkZXJfdXBkYXRlX2kxOG4iOnRydWUsImZlYXR1cmVfdHJpYWxfYXdhcmVuZXNzX3RyYW5zbGF0aW9ucyI6dHJ1ZSwiZmVhdHVyZV9jYWxsc19sb2NhdGlvbl93YXJuaW5nX3RyYW5zbGF0aW9ucyI6ZmFsc2UsImZlYXR1cmVfZXNjX3dob19jYW5fcmVxdWVzdF9wcmVmIjpmYWxzZSwiZmVhdHVyZV9zaWRlYmFyX3RyaWFsX2JhZGdlX3RyYW5zbGF0aW9ucyI6ZmFsc2UsImNsaWVudF9sb2dzIjp7IjAiOnsibnVtYmVycyI6WyIwIl0sInVzZXJfZmFjaW5nIjpmYWxzZX0sIjIiOnsibnVtYmVycyI6WyIyIl0sInVzZXJfZmFjaW5nIjpmYWxzZX0sIjQiOnsibnVtYmVycyI6WyI0Il0sInVzZXJfZmFjaW5nIjpmYWxzZX0sIjUiOnsibnVtYmVycyI6WyI1Il0sInVzZXJfZmFjaW5nIjpmYWxzZX0sIjIzIjp7Im51bWJlcnMiOlsiMjMiXSwidXNlcl9mYWNpbmciOmZhbHNlfSwic291bmRzIjp7Im5hbWUiOiJzb3VuZHMiLCJudW1iZXJzIjpbIjM3Il19LCIzNyI6eyJuYW1lIjoic291bmRzIiwibnVtYmVycyI6WyIzNyJdLCJ1c2VyX2ZhY2luZyI6dHJ1ZX0sIjQ3Ijp7Im51bWJlcnMiOlsiNDciXSwidXNlcl9mYWNpbmciOmZhbHNlfSwiNDgiOnsibnVtYmVycyI6WyI0OCJdLCJ1c2VyX2ZhY2luZyI6ZmFsc2V9LCJNZXNzYWdlIEhpc3RvcnkiOnsibmFtZSI6Ik1lc3NhZ2UgSGlzdG9yeSIsIm51bWJlcnMiOlsiNTgiXX0sIjU4Ijp7Im5hbWUiOiJNZXNzYWdlIEhpc3RvcnkiLCJudW1iZXJzIjpbIjU4Il0sInVzZXJfZmFjaW5nIjp0cnVlfSwiNjciOnsibnVtYmVycyI6WyI2NyJdLCJ1c2VyX2ZhY2luZyI6ZmFsc2V9LCI3MiI6eyJudW1iZXJzIjpbIjcyIl0sInVzZXJfZmFjaW5nIjpmYWxzZX0sIjczIjp7Im51bWJlcnMiOlsiNzMiXSwidXNlcl9mYWNpbmciOmZhbHNlfSwiODIiOnsibnVtYmVycyI6WyI4MiJdLCJ1c2VyX2ZhY2luZyI6ZmFsc2V9LCI4OCI6eyJudW1iZXJzIjpbIjg4Il0sInVzZXJfZmFjaW5nIjpmYWxzZX0sIjkxIjp7Im51bWJlcnMiOlsiOTEiXSwidXNlcl9mYWNpbmciOmZhbHNlfSwiOTMiOnsibnVtYmVycyI6WyI5MyJdLCJ1c2VyX2ZhY2luZyI6ZmFsc2V9LCI5NiI6eyJudW1iZXJzIjpbIjk2Il0sInVzZXJfZmFjaW5nIjpmYWxzZX0sIjk5Ijp7Im51bWJlcnMiOlsiOTkiXSwidXNlcl9mYWNpbmciOmZhbHNlfSwiQ2hhbm5lbCBNYXJraW5nIChNUykiOnsibmFtZSI6IkNoYW5uZWwgTWFya2luZyAoTVMpIiwibnVtYmVycyI6WyIxNDEiXX0sIjE0MSI6eyJuYW1lIjoiQ2hhbm5lbCBNYXJraW5nIChNUykiLCJudW1iZXJzIjpbIjE0MSJdLCJ1c2VyX2ZhY2luZyI6dHJ1ZX0sIkNoYW5uZWwgTWFya2luZyAoQ2xpZW50KSI6eyJuYW1lIjoiQ2hhbm5lbCBNYXJraW5nIChDbGllbnQpIiwibnVtYmVycyI6WyIxNDIiXX0sIjE0MiI6eyJuYW1lIjoiQ2hhbm5lbCBNYXJraW5nIChDbGllbnQpIiwibnVtYmVycyI6WyIxNDIiXSwidXNlcl9mYWNpbmciOnRydWV9LCJDbG9zZSBPbGQgSU1zIChDbGllbnQpIjp7Im5hbWUiOiJDbG9zZSBPbGQgSU1zIChDbGllbnQpIiwibnVtYmVycyI6WyIyMjEiXX0sIjIyMSI6eyJuYW1lIjoiQ2xvc2UgT2xkIElNcyAoQ2xpZW50KSIsIm51bWJlcnMiOlsiMjIxIl0sInVzZXJfZmFjaW5nIjp0cnVlfSwiMzY1Ijp7Im51bWJlcnMiOlsiMzY1Il0sInVzZXJfZmFjaW5nIjpmYWxzZX0sIjM4OSI6eyJudW1iZXJzIjpbIjM4OSJdLCJ1c2VyX2ZhY2luZyI6ZmFsc2V9LCI0MzgiOnsibnVtYmVycyI6WyI0MzgiXSwidXNlcl9mYWNpbmciOmZhbHNlfSwiNDQ0Ijp7Im51bWJlcnMiOlsiNDQ0Il0sInVzZXJfZmFjaW5nIjpmYWxzZX0sIjQ4MSI6eyJudW1iZXJzIjpbIjQ4MSJdLCJ1c2VyX2ZhY2luZyI6ZmFsc2V9LCI0ODgiOnsibnVtYmVycyI6WyI0ODgiXSwidXNlcl9mYWNpbmciOmZhbHNlfSwiNTI5Ijp7Im51bWJlcnMiOlsiNTI5Il0sInVzZXJfZmFjaW5nIjpmYWxzZX0sIjU1MiI6eyJudW1iZXJzIjpbIjU1MiJdLCJ1c2VyX2ZhY2luZyI6ZmFsc2V9LCJkYXNoYm9hcmQiOnsibmFtZSI6ImRhc2hib2FyZCIsIm51bWJlcnMiOlsiNjY2Il19LCI2NjYiOnsibmFtZSI6ImRhc2hib2FyZCIsIm51bWJlcnMiOlsiNjY2Il0sInVzZXJfZmFjaW5nIjpmYWxzZX0sIjY2NyI6eyJudW1iZXJzIjpbIjY2NyJdLCJ1c2VyX2ZhY2luZyI6ZmFsc2V9LCI3NzMiOnsibnVtYmVycyI6WyI3NzMiXSwidXNlcl9mYWNpbmciOmZhbHNlfSwiNzc3Ijp7Im51bWJlcnMiOlsiNzc3Il0sInVzZXJfZmFjaW5nIjpmYWxzZX0sIjc5NCI6eyJudW1iZXJzIjpbIjc5NCJdLCJ1c2VyX2ZhY2luZyI6ZmFsc2V9LCJDbGllbnQgUmVzcG9uc2l2ZW5lc3MiOnsibmFtZSI6IkNsaWVudCBSZXNwb25zaXZlbmVzcyIsInVzZXJfZmFjaW5nIjpmYWxzZSwibnVtYmVycyI6WyI4MDgiXX0sIjgwOCI6eyJuYW1lIjoiQ2xpZW50IFJlc3BvbnNpdmVuZXNzIiwidXNlcl9mYWNpbmciOmZhbHNlLCJudW1iZXJzIjpbIjgwOCJdfSwiTWVzc2FnZSBQYW5lIFNjcm9sbGluZyI6eyJuYW1lIjoiTWVzc2FnZSBQYW5lIFNjcm9sbGluZyIsIm51bWJlcnMiOlsiODg4Il19LCI4ODgiOnsibmFtZSI6Ik1lc3NhZ2UgUGFuZSBTY3JvbGxpbmciLCJudW1iZXJzIjpbIjg4OCJdLCJ1c2VyX2ZhY2luZyI6dHJ1ZX0sIlVucmVhZCBiYW5uZXIgYW5kIGRpdmlkZXIiOnsibmFtZSI6IlVucmVhZCBiYW5uZXIgYW5kIGRpdmlkZXIiLCJudW1iZXJzIjpbIjk5OSJdfSwiOTk5Ijp7Im5hbWUiOiJVbnJlYWQgYmFubmVyIGFuZCBkaXZpZGVyIiwibnVtYmVycyI6WyI5OTkiXSwidXNlcl9mYWNpbmciOnRydWV9LCIxMDAwIjp7Im51bWJlcnMiOlsiMTAwMCJdLCJ1c2VyX2ZhY2luZyI6ZmFsc2V9LCJEdXBsaWNhdGUgYmFkZ2VzIChkZXNrdG9wIGFwcCBpY29ucykiOnsibmFtZSI6IkR1cGxpY2F0ZSBiYWRnZXMgKGRlc2t0b3AgYXBwIGljb25zKSIsIm51bWJlcnMiOlsiMTcwMSJdfSwiMTcwMSI6eyJuYW1lIjoiRHVwbGljYXRlIGJhZGdlcyAoZGVza3RvcCBhcHAgaWNvbnMpIiwibnVtYmVycyI6WyIxNzAxIl0sInVzZXJfZmFjaW5nIjp0cnVlfSwiTWVtYmVycyI6eyJuYW1lIjoiTWVtYmVycyIsIm51bWJlcnMiOlsiMTk3NSJdfSwiMTk3NSI6eyJuYW1lIjoiTWVtYmVycyIsIm51bWJlcnMiOlsiMTk3NSJdLCJ1c2VyX2ZhY2luZyI6dHJ1ZX0sImxhenkgbG9hZGluZyI6eyJuYW1lIjoibGF6eSBsb2FkaW5nIiwibnVtYmVycyI6WyIxOTg5Il19LCIxOTg5Ijp7Im5hbWUiOiJsYXp5IGxvYWRpbmciLCJudW1iZXJzIjpbIjE5ODkiXSwidXNlcl9mYWNpbmciOnRydWV9LCJ0aGluX2NoYW5uZWxfbWVtYmVyc2hpcCI6eyJuYW1lIjoidGhpbl9jaGFubmVsX21lbWJlcnNoaXAiLCJudW1iZXJzIjpbIjE5OTAiXX0sIjE5OTAiOnsibmFtZSI6InRoaW5fY2hhbm5lbF9tZW1iZXJzaGlwIiwibnVtYmVycyI6WyIxOTkwIl0sInVzZXJfZmFjaW5nIjp0cnVlfSwic3RhdHMiOnsibmFtZSI6InN0YXRzIiwibnVtYmVycyI6WyIxOTkxIl19LCIxOTkxIjp7Im5hbWUiOiJzdGF0cyIsIm51bWJlcnMiOlsiMTk5MSJdLCJ1c2VyX2ZhY2luZyI6dHJ1ZX0sIm1zIjp7Im5hbWUiOiJtcyIsIm51bWJlcnMiOlsiMTk5NiJdfSwiMTk5NiI6eyJuYW1lIjoibXMiLCJudW1iZXJzIjpbIjE5OTYiXSwidXNlcl9mYWNpbmciOnRydWV9LCJzaGFyZWRfY2hhbm5lbHNfY29ubmVjdGlvbiI6eyJuYW1lIjoic2hhcmVkX2NoYW5uZWxzX2Nvbm5lY3Rpb24iLCJudW1iZXJzIjpbIjE5OTkiXX0sIjE5OTkiOnsibmFtZSI6InNoYXJlZF9jaGFubmVsc19jb25uZWN0aW9uIiwibnVtYmVycyI6WyIxOTk5Il0sInVzZXJfZmFjaW5nIjpmYWxzZX0sImRuZCI6eyJuYW1lIjoiZG5kIiwibnVtYmVycyI6WyIyMDAyIl19LCIyMDAyIjp7Im5hbWUiOiJkbmQiLCJudW1iZXJzIjpbIjIwMDIiXSwidXNlcl9mYWNpbmciOnRydWV9LCIyMDAzIjp7Im51bWJlcnMiOlsiMjAwMyJdLCJ1c2VyX2ZhY2luZyI6ZmFsc2V9LCJUaHJlYWRzIjp7Im5hbWUiOiJUaHJlYWRzIiwibnVtYmVycyI6WyIyMDA0Il19LCIyMDA0Ijp7Im5hbWUiOiJUaHJlYWRzIiwibnVtYmVycyI6WyIyMDA0Il0sInVzZXJfZmFjaW5nIjp0cnVlfSwiMjAwNSI6eyJudW1iZXJzIjpbIjIwMDUiXSwidXNlcl9mYWNpbmciOmZhbHNlfSwiUmVhY3Rpb25zIjp7Im5hbWUiOiJSZWFjdGlvbnMiLCJudW1iZXJzIjpbIjIwMDYiXX0sIjIwMDYiOnsibmFtZSI6IlJlYWN0aW9ucyIsIm51bWJlcnMiOlsiMjAwNiJdLCJ1c2VyX2ZhY2luZyI6dHJ1ZX0sIlRTU1NCLmZvY3VzVGFiQW5kU3dpdGNoVG9DaGFubmVsIjp7Im5hbWUiOiJUU1NTQi5mb2N1c1RhYkFuZFN3aXRjaFRvQ2hhbm5lbCIsIm51bWJlcnMiOlsiMjAwNyJdfSwiMjAwNyI6eyJuYW1lIjoiVFNTU0IuZm9jdXNUYWJBbmRTd2l0Y2hUb0NoYW5uZWwiLCJudW1iZXJzIjpbIjIwMDciXSwidXNlcl9mYWNpbmciOmZhbHNlfSwiUHJlc2VuY2UgRGV0ZWN0aW9uIjp7Im5hbWUiOiJQcmVzZW5jZSBEZXRlY3Rpb24iLCJudW1iZXJzIjpbIjIwMTciXX0sIjIwMTciOnsibmFtZSI6IlByZXNlbmNlIERldGVjdGlvbiIsIm51bWJlcnMiOlsiMjAxNyJdLCJ1c2VyX2ZhY2luZyI6dHJ1ZX0sIm1jX3NpYnMiOnsibmFtZSI6Im1jX3NpYnMiLCJudW1iZXJzIjpbIjk5OTkiXX0sIjk5OTkiOnsibmFtZSI6Im1jX3NpYnMiLCJudW1iZXJzIjpbIjk5OTkiXSwidXNlcl9mYWNpbmciOmZhbHNlfSwiTWVtYmVyIHNlYXJjaGluZyI6eyJuYW1lIjoiTWVtYmVyIHNlYXJjaGluZyIsIm51bWJlcnMiOlsiOTAyMTEiXX0sIjkwMjExIjp7Im5hbWUiOiJNZW1iZXIgc2VhcmNoaW5nIiwibnVtYmVycyI6WyI5MDIxMSJdLCJ1c2VyX2ZhY2luZyI6dHJ1ZX0sIjk4NzY1Ijp7Im51bWJlcnMiOlsiOTg3NjUiXSwidXNlcl9mYWNpbmciOmZhbHNlfSwiODY3NTMwOSI6eyJudW1iZXJzIjpbIjg2NzUzMDkiXSwidXNlcl9mYWNpbmciOmZhbHNlfX19OwoJYm9vdF9kYXRhLnN0YXJ0X21zID0gRGF0ZS5ub3coKTsKPC9zY3JpcHQ+PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPnZhciBUU19sYXN0X2xvZ19kYXRlID0gbnVsbDsKdmFyIFRTTWFrZUxvZ0RhdGUgPSBmdW5jdGlvbigpIHsKCXZhciBkYXRlID0gbmV3IERhdGUoKTsKCgl2YXIgeSA9IGRhdGUuZ2V0RnVsbFllYXIoKTsKCXZhciBtbyA9IGRhdGUuZ2V0TW9udGgoKSsxOwoJdmFyIGQgPSBkYXRlLmdldERhdGUoKTsKCgl2YXIgdGltZSA9IHsKCSAgaDogZGF0ZS5nZXRIb3VycygpLAoJICBtaTogZGF0ZS5nZXRNaW51dGVzKCksCgkgIHM6IGRhdGUuZ2V0U2Vjb25kcygpLAoJICBtczogZGF0ZS5nZXRNaWxsaXNlY29uZHMoKQoJfTsKCglPYmplY3Qua2V5cyh0aW1lKS5tYXAoZnVuY3Rpb24obW9tZW50LCBpbmRleCkgewoJCWlmIChtb21lbnQgPT0gJ21zJykgewoJCQlpZiAodGltZVttb21lbnRdIDwgMTApIHsKCQkJCXRpbWVbbW9tZW50XSA9IHRpbWVbbW9tZW50XSsnMDAnOwoJCQl9IGVsc2UgaWYgKHRpbWVbbW9tZW50XSA8IDEwMCkgewoJCQkJdGltZVttb21lbnRdID0gdGltZVttb21lbnRdKycwJzsKCQkJfQoJCX0gZWxzZSBpZiAodGltZVttb21lbnRdIDwgMTApIHsKCQkJdGltZVttb21lbnRdID0gJzAnICsgdGltZVttb21lbnRdOwoJCX0KCX0pOwoKCXZhciBzdHIgPSB5ICsgJy8nICsgbW8gKyAnLycgKyBkICsgJyAnICsgdGltZS5oICsgJzonICsgdGltZS5taSArICc6JyArIHRpbWUucyArICcuJyArIHRpbWUubXM7CglpZiAoVFNfbGFzdF9sb2dfZGF0ZSkgewoJCXZhciBkaWZmID0gZGF0ZS1UU19sYXN0X2xvZ19kYXRlOwoJCS8vc3RyKz0gJyAoJytkaWZmKydtcyknOwoJfQoJVFNfbGFzdF9sb2dfZGF0ZSA9IGRhdGU7CglyZXR1cm4gc3RyKycgJzsKfQoKdmFyIHBhcnNlRGVlcExpbmtSZXF1ZXN0ID0gZnVuY3Rpb24oY29kZSkgewoJdmFyIG0gPSBjb2RlLm1hdGNoKC8iaWQiOiIoW0NER11bQS1aMC05XXs4LH0pIi8pOwoJdmFyIGlkID0gbSA/IG1bMV0gOiBudWxsOwoKCW0gPSBjb2RlLm1hdGNoKC8idGVhbSI6IihUW0EtWjAtOV17OCx9KSIvKTsKCXZhciB0ZWFtID0gbSA/IG1bMV0gOiBudWxsOwoKCW0gPSBjb2RlLm1hdGNoKC8ibWVzc2FnZSI6IihbMC05XStcLlswLTldKykiLyk7Cgl2YXIgbWVzc2FnZSA9IG0gPyBtWzFdIDogbnVsbDsKCglyZXR1cm4geyBpZDogaWQsIHRlYW06IHRlYW0sIG1lc3NhZ2U6IG1lc3NhZ2UgfTsKfQoKaWYgKCdyZW5kZXJlckV2YWxBc3luYycgaW4gd2luZG93KSB7Cgl2YXIgb3JpZ1JlbmRlcmVyRXZhbEFzeW5jID0gd2luZG93LnJlbmRlcmVyRXZhbEFzeW5jOwoJd2luZG93LnJlbmRlcmVyRXZhbEFzeW5jID0gZnVuY3Rpb24oYmxvYikgewoJCXRyeSB7CgkJCXZhciBkYXRhID0gSlNPTi5wYXJzZShkZWNvZGVVUklDb21wb25lbnQoYXRvYihibG9iKSkpOwoJCQlpZiAoZGF0YS5jb2RlLm1hdGNoKC9oYW5kbGVEZWVwTGluay8pKSB7CgkJCQl2YXIgcmVxdWVzdCA9IHBhcnNlRGVlcExpbmtSZXF1ZXN0KGRhdGEuY29kZSk7CgkJCQlpZiAoIXJlcXVlc3QuaWQgfHwgIXJlcXVlc3QudGVhbSB8fCAhcmVxdWVzdC5tZXNzYWdlKSByZXR1cm47CgoJCQkJcmVxdWVzdC5jbWQgPSAnY2hhbm5lbCc7CgkJCQlUU1NTQi5oYW5kbGVEZWVwTGlua1dpdGhBcmdzKEpTT04uc3RyaW5naWZ5KHJlcXVlc3QpKTsKCQkJCXJldHVybjsKCQkJfSBlbHNlIHsKCQkJCW9yaWdSZW5kZXJlckV2YWxBc3luYyhibG9iKTsKCQkJfQoJCX0gY2F0Y2ggKGUpIHsKCQl9Cgl9Cn08L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+dmFyIFRTU1NCID0gewoJY2FsbDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQp9Ozwvc2NyaXB0PjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vYS5zbGFjay1lZGdlLmNvbS9idjEtOC9yb2xsdXAtY29yZV9yZXF1aXJlZF9saWJzLjFkZWI3N2Y0N2NkNTIxZjJjYTI1Lm1pbi5qcyIgb25sb2FkPSJ3aW5kb3cuX2NkbiA/IF9jZG4ub2sodGhpcywgYXJndW1lbnRzKSA6IG51bGwiIG9uZXJyb3I9IndpbmRvdy5fY2RuID8gX2Nkbi5mYWlsZWQodGhpcywgYXJndW1lbnRzKSA6IG51bGwiIGNyb3Nzb3JpZ2luPSJhbm9ueW1vdXMiPjwvc2NyaXB0PjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vYS5zbGFjay1lZGdlLmNvbS9idjEtOC9tb2Rlcm4udmVuZG9yLjQ5ZGM1ZWZhNWE1YTNiYTg5YmRjLm1pbi5qcyIgb25sb2FkPSJ3aW5kb3cuX2NkbiA/IF9jZG4ub2sodGhpcywgYXJndW1lbnRzKSA6IG51bGwiIG9uZXJyb3I9IndpbmRvdy5fY2RuID8gX2Nkbi5mYWlsZWQodGhpcywgYXJndW1lbnRzKSA6IG51bGwiIGNyb3Nzb3JpZ2luPSJhbm9ueW1vdXMiPjwvc2NyaXB0PjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vYS5zbGFjay1lZGdlLmNvbS9idjEtOC9hcHBsaWNhdGlvbi4xYWY4ZWU3MDdlNTA2NTkxZDI0Mi5taW4uanMiIG9ubG9hZD0id2luZG93Ll9jZG4gPyBfY2RuLm9rKHRoaXMsIGFyZ3VtZW50cykgOiBudWxsIiBvbmVycm9yPSJ3aW5kb3cuX2NkbiA/IF9jZG4uZmFpbGVkKHRoaXMsIGFyZ3VtZW50cykgOiBudWxsIiBjcm9zc29yaWdpbj0iYW5vbnltb3VzIj48L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL2Euc2xhY2stZWRnZS5jb20vYnYxLTgvcm9sbHVwLWNvcmVfcmVxdWlyZWRfdHMuODhkMTFkODRhZGQyZTI2MGQwNjIubWluLmpzIiBvbmxvYWQ9IndpbmRvdy5fY2RuID8gX2Nkbi5vayh0aGlzLCBhcmd1bWVudHMpIDogbnVsbCIgb25lcnJvcj0id2luZG93Ll9jZG4gPyBfY2RuLmZhaWxlZCh0aGlzLCBhcmd1bWVudHMpIDogbnVsbCIgY3Jvc3NvcmlnaW49ImFub255bW91cyI+PC9zY3JpcHQ+PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tL2J2MS04L3JvbGx1cC1jb3JlX3dlYi5mYzhmYTEwMmI1MTM4NGQ3NDAwMy5taW4uanMiIG9ubG9hZD0id2luZG93Ll9jZG4gPyBfY2RuLm9rKHRoaXMsIGFyZ3VtZW50cykgOiBudWxsIiBvbmVycm9yPSJ3aW5kb3cuX2NkbiA/IF9jZG4uZmFpbGVkKHRoaXMsIGFyZ3VtZW50cykgOiBudWxsIiBjcm9zc29yaWdpbj0iYW5vbnltb3VzIj48L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL2Euc2xhY2stZWRnZS5jb20vYnYxLTgvcm9sbHVwLWFwaV9kb2NzLmU2Zjc1OGEyYjk3NjgxOTA5MTVmLm1pbi5qcyIgb25sb2FkPSJ3aW5kb3cuX2NkbiA/IF9jZG4ub2sodGhpcywgYXJndW1lbnRzKSA6IG51bGwiIG9uZXJyb3I9IndpbmRvdy5fY2RuID8gX2Nkbi5mYWlsZWQodGhpcywgYXJndW1lbnRzKSA6IG51bGwiIGNyb3Nzb3JpZ2luPSJhbm9ueW1vdXMiPjwvc2NyaXB0PjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vYS5zbGFjay1lZGdlLmNvbS9idjEtOC9yb2xsdXAtc2Vjb25kYXJ5X2FfcmVxdWlyZWQuMDRiYTMyYzZmYmQ2MjcwMGI0NjAubWluLmpzIiBvbmxvYWQ9IndpbmRvdy5fY2RuID8gX2Nkbi5vayh0aGlzLCBhcmd1bWVudHMpIDogbnVsbCIgb25lcnJvcj0id2luZG93Ll9jZG4gPyBfY2RuLmZhaWxlZCh0aGlzLCBhcmd1bWVudHMpIDogbnVsbCIgY3Jvc3NvcmlnaW49ImFub255bW91cyI+PC9zY3JpcHQ+PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly9hLnNsYWNrLWVkZ2UuY29tL2J2MS04L3JvbGx1cC1zZWNvbmRhcnlfYl9yZXF1aXJlZC40ZjcxNDdlYTQ5NzQyNTIxNGU3Zi5taW4uanMiIG9ubG9hZD0id2luZG93Ll9jZG4gPyBfY2RuLm9rKHRoaXMsIGFyZ3VtZW50cykgOiBudWxsIiBvbmVycm9yPSJ3aW5kb3cuX2NkbiA/IF9jZG4uZmFpbGVkKHRoaXMsIGFyZ3VtZW50cykgOiBudWxsIiBjcm9zc29yaWdpbj0iYW5vbnltb3VzIj48L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL2Euc2xhY2stZWRnZS5jb20vYnYxLTgvZm9vdGVyLmYxNWIzY2JmNDY4NzcxNDdmMDY2Lm1pbi5qcyIgb25sb2FkPSJ3aW5kb3cuX2NkbiA/IF9jZG4ub2sodGhpcywgYXJndW1lbnRzKSA6IG51bGwiIG9uZXJyb3I9IndpbmRvdy5fY2RuID8gX2Nkbi5mYWlsZWQodGhpcywgYXJndW1lbnRzKSA6IG51bGwiIGNyb3Nzb3JpZ2luPSJhbm9ueW1vdXMiPjwvc2NyaXB0PjxzY3JpcHQ+CQkJd2luZG93LmJvb3RfZGF0YSA9IHdpbmRvdy5ib290X2RhdGEgfHwge307CgkJCWJvb3RfZGF0YS5ub19sb2dpbiA9IHRydWU7CgkJCWJvb3RfZGF0YS5hcHAgPSAnYXBpJzsKCQkJYm9vdF9kYXRhLmFwaV91cmwgPSAnL2FwaS8nOwoJCQlib290X2RhdGEuYXBwX2lkID0gIiI7CgkJCWJvb3RfZGF0YS5hcHBfbmFtZSA9ICIiOwoJCQlib290X2RhdGEubnVtX3RlYW1zID0gMDsKCQkJYm9vdF9kYXRhLnJlc2VydmVkX2NvbW1hbmRzID0gW107CgkJCWJvb3RfZGF0YS5udW1fY29tbWFuZHMgPSAwOwoJCQlib290X2RhdGEuc3Vkb191cmwgPSAiIjsKCQkJYm9vdF9kYXRhLmFwaV90b2tlbiA9ICIiOwoJCQlUUy5ib290KGJvb3RfZGF0YSk7PC9zY3JpcHQ+PHNjcmlwdD4JCWhsanMuY29uZmlndXJlKHtsYW5ndWFnZXM6IFsnanNvbicsICdiYXNoJywgJ2phdmFzY3JpcHQnLCAnaHR0cCcsICdqYXZhJywgJ3B5dGhvbiddfSk7CgkJaGxqcy5pbml0SGlnaGxpZ2h0aW5nT25Mb2FkKCk7PC9zY3JpcHQ+Cgo8IS0tIHNsYWNrLXd3dy1oaHZtLW1haW4taWFkLWhwMDcvIDIwMjAtMTAtMDYgMTc6MjE6MzIvIHZmNDY3MTRmMjMyN2EwOTk1ZTM1OWJjYmYzMmVlZTc0ZGUxM2NhMmNkLyBCOkggLS0+Cgo8L2JvZHk+PC9odG1sPg== + recorded_at: Wed, 07 Oct 2020 00:21:32 GMT +- request: + method: get + uri: https://slack.com/api/users.list?token=1234 + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Date: + - Wed, 07 Oct 2020 00:23:44 GMT + Server: + - Apache + X-Slack-Req-Id: + - be4b240e8958837f84369bb0f0120199 + Referrer-Policy: + - no-referrer + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, + x-b3-sampled, x-b3-flags + Vary: + - Accept-Encoding + X-Slack-Backend: + - r + Access-Control-Allow-Origin: + - "*" + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + X-Content-Type-Options: + - nosniff + X-Xss-Protection: + - '0' + Content-Length: + - '55' + Content-Type: + - application/json; charset=utf-8 + X-Via: + - haproxy-www-cv6x,haproxy-edge-pdx-68eo + body: + encoding: ASCII-8BIT + string: '{"ok":false,"error":"invalid_auth"}' + recorded_at: Wed, 07 Oct 2020 00:23:44 GMT +recorded_with: VCR 6.0.0 diff --git a/test/recipient_test.rb b/test/recipient_test.rb index 1077ce88..d6cbdd91 100644 --- a/test/recipient_test.rb +++ b/test/recipient_test.rb @@ -1,7 +1,34 @@ require_relative "test_helper" -describe "self.get" do - it "gets a response from API" do +describe "Recipient class" do + before do + @new_recipient = Recipient.new(3432) + end + + describe "initialize" do + it "check that recipient has correct id" do + expect(@new_recipient.slack_id).must_equal 3432 + end + end + + describe "self.get" do + it "gets a response from API" do + VCR.use_cassette("recipient_get") do + response = Recipient.get("https://slack.com/api/users.list") + expect(response).must_be_kind_of HTTParty::Response + end + end + + it "raises error if API response was bad" do + VCR.use_cassette("recipient_get") do + expect{Recipient.get("https://slack.com/api/users.list", parameters: {token: "1234"} )}.must_raise SlackApiError + end + end + end + describe "self.list" do + it "raises error if invoked without subclassing" do + expect {Recipient.list}.must_raise NotImplementedError + end end end \ No newline at end of file diff --git a/test/test_helper.rb b/test/test_helper.rb index c6bfc389..3479e0ec 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -13,6 +13,12 @@ require "dotenv" Dotenv.load +require_relative "../lib/channel" +require_relative "../lib/recipient" +require_relative "../lib/slack_api_error" +require_relative "../lib/user" +require_relative "../lib/workspace" + Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new VCR.configure do |config| From 01c1a70b92e24d9a4552514254d515811ecffb50 Mon Sep 17 00:00:00 2001 From: Ringo Alcock Date: Tue, 6 Oct 2020 17:48:53 -0700 Subject: [PATCH 12/26] define channel tests and add exception handling --- lib/channel.rb | 3 ++ test/cassettes/channel_get.yml | 72 ++++++++++++++++++++++++++++++++++ test/channel_test.rb | 37 ++++++++++++++++- 3 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 test/cassettes/channel_get.yml diff --git a/lib/channel.rb b/lib/channel.rb index 30a62561..a8d73edf 100644 --- a/lib/channel.rb +++ b/lib/channel.rb @@ -11,6 +11,9 @@ class Channel < Recipient BASE_URL = "https://slack.com/api/conversations.list" def initialize(slack_id, name, topic, member_count) + + raise SlackApiError if [slack_id, name, topic, member_count].include? nil + super(slack_id) @name = name @topic = topic diff --git a/test/cassettes/channel_get.yml b/test/cassettes/channel_get.yml new file mode 100644 index 00000000..7e1f50fd --- /dev/null +++ b/test/cassettes/channel_get.yml @@ -0,0 +1,72 @@ +--- +http_interactions: +- request: + method: get + uri: https://slack.com/api/conversations.list?token= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Date: + - Wed, 07 Oct 2020 00:33:11 GMT + Server: + - Apache + X-Slack-Req-Id: + - d5d42a6b6c21b24d830c50ad3771b197 + X-Oauth-Scopes: + - chat:write,channels:read,users:read + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + Access-Control-Allow-Origin: + - "*" + X-Slack-Backend: + - r + X-Content-Type-Options: + - nosniff + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - channels:read,groups:read,mpim:read,im:read,read + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, + x-b3-sampled, x-b3-flags + Vary: + - Accept-Encoding + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Content-Length: + - '643' + Content-Type: + - application/json; charset=utf-8 + X-Via: + - haproxy-www-rfbf,haproxy-edge-pdx-5vxz + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channels":[{"id":"C01BKP67695","name":"random","is_channel":true,"is_group":false,"is_im":false,"created":1601939471,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"random","is_shared":false,"parent_conversation":null,"creator":"U01C0FJ2NR0","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["T01BKP66VQF"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":false,"is_private":false,"is_mpim":false,"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"This + channel is for... well, everything else. It\u2019s a place for team jokes, + spur-of-the-moment ideas, and funny GIFs. Go wild!","creator":"U01C0FJ2NR0","last_set":1601939471},"previous_names":[],"num_members":3},{"id":"C01BXCX7A8M","name":"general","is_channel":true,"is_group":false,"is_im":false,"created":1601939471,"is_archived":false,"is_general":true,"unlinked":0,"name_normalized":"general","is_shared":false,"parent_conversation":null,"creator":"U01C0FJ2NR0","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["T01BKP66VQF"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":false,"is_private":false,"is_mpim":false,"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"This + is the one channel that will always include everyone. It\u2019s a great spot + for announcements and team-wide conversations.","creator":"U01C0FJ2NR0","last_set":1601939471},"previous_names":[],"num_members":2},{"id":"C01BXD088JH","name":"slack-cli","is_channel":true,"is_group":false,"is_im":false,"created":1601939607,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"slack-cli","is_shared":false,"parent_conversation":null,"creator":"U01C0FJ2NR0","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["T01BKP66VQF"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":false,"is_private":false,"is_mpim":false,"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"This + *channel* is for working on a project. Hold meetings, share docs, and make + decisions together with your team.","creator":"U01C0FJ2NR0","last_set":1601939607},"previous_names":[],"num_members":2}],"response_metadata":{"next_cursor":""}}' + recorded_at: Wed, 07 Oct 2020 00:33:11 GMT +recorded_with: VCR 6.0.0 diff --git a/test/channel_test.rb b/test/channel_test.rb index a46e6816..71276daf 100644 --- a/test/channel_test.rb +++ b/test/channel_test.rb @@ -1 +1,36 @@ -require_relative "test_helper" \ No newline at end of file +require_relative "test_helper" + +describe "Channel class" do + describe "initialize" do + it "makes a channel with correct attributes" do + @fake_channel = Channel.new(2398, "boats", "just some pictures of boats", 1000) + + expect(@fake_channel).must_be_kind_of Channel + expect(@fake_channel.slack_id).must_equal 2398 + expect(@fake_channel.name).must_equal "boats" + expect(@fake_channel.topic).must_equal "just some pictures of boats" + expect(@fake_channel.member_count).must_equal 1000 + end + + it "raises an error if passed any bad information" do + expect { Channel.new(nil, "mistake", "place for messing up", 1) }.must_raise SlackApiError + end + end + + describe "self.list" do + it "check the first channel in the list is accurate" do + VCR.use_cassette("channel_get") do + first_channel = Channel.list.first + expect(first_channel.name).must_equal "random" + expect(first_channel.slack_id).must_equal "C01BKP67695" + expect(first_channel.member_count).must_equal 3 + end + end + + it "check that self.list returns the correct number of elements" do + VCR.use_cassette("channel_get") do + expect(Channel.list.length).must_equal 3 + end + end + end +end \ No newline at end of file From 2a3d65cde3f6d9cc54322250550c5d77e1b1cb22 Mon Sep 17 00:00:00 2001 From: Ringo Alcock Date: Tue, 6 Oct 2020 17:59:04 -0700 Subject: [PATCH 13/26] write user tests and add exception handling --- lib/user.rb | 3 ++ test/cassettes/user_get.yml | 76 +++++++++++++++++++++++++++++++++++++ test/user_test.rb | 40 ++++++++++++++++++- 3 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 test/cassettes/user_get.yml diff --git a/lib/user.rb b/lib/user.rb index fb0c41e7..f6c94dc2 100644 --- a/lib/user.rb +++ b/lib/user.rb @@ -11,6 +11,9 @@ class User < Recipient BASE_URL = "https://slack.com/api/users.list" def initialize(slack_id, username, real_name, status_text, status_emoji) + + raise SlackApiError if [slack_id, username, real_name, status_text, status_emoji].include? nil + super(slack_id) @username = username @real_name = real_name diff --git a/test/cassettes/user_get.yml b/test/cassettes/user_get.yml new file mode 100644 index 00000000..b119b21e --- /dev/null +++ b/test/cassettes/user_get.yml @@ -0,0 +1,76 @@ +--- +http_interactions: +- request: + method: get + uri: https://slack.com/api/users.list?token= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Date: + - Wed, 07 Oct 2020 00:51:16 GMT + Server: + - Apache + X-Slack-Req-Id: + - 8f0a4cde02915ec0577a1687b1ce6379 + X-Oauth-Scopes: + - chat:write,channels:read,users:read,channels:join + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + Access-Control-Allow-Origin: + - "*" + X-Slack-Backend: + - r + X-Content-Type-Options: + - nosniff + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - users:read + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, + x-b3-sampled, x-b3-flags + Vary: + - Accept-Encoding + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Content-Length: + - '1250' + Content-Type: + - application/json; charset=utf-8 + X-Via: + - haproxy-www-d35h,haproxy-edge-pdx-vs95 + body: + encoding: ASCII-8BIT + string: '{"ok":true,"members":[{"id":"USLACKBOT","team_id":"T01BKP66VQF","name":"slackbot","deleted":false,"color":"757575","real_name":"Slackbot","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Slackbot","real_name_normalized":"Slackbot","display_name":"Slackbot","display_name_normalized":"Slackbot","fields":null,"status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"sv41d8cd98f0","always_active":true,"first_name":"slackbot","last_name":"","image_24":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_24.png","image_32":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_32.png","image_48":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_48.png","image_72":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_72.png","image_192":"https:\/\/a.slack-edge.com\/80588\/marketing\/img\/avatars\/slackbot\/avatar-slackbot.png","image_512":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_512.png","status_text_canonical":"","team":"T01BKP66VQF"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":0},{"id":"U01BKP9SFK9","team_id":"T01BKP66VQF","name":"ringo.alcock","deleted":false,"color":"4bbe2e","real_name":"Ringo","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Ringo","real_name_normalized":"Ringo","display_name":"Ringo","display_name_normalized":"Ringo","fields":null,"status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g08f17ccf64b","image_24":"https:\/\/secure.gravatar.com\/avatar\/08f17ccf64bc02a830ff6d94158bb7d0.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/08f17ccf64bc02a830ff6d94158bb7d0.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/08f17ccf64bc02a830ff6d94158bb7d0.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/08f17ccf64bc02a830ff6d94158bb7d0.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/08f17ccf64bc02a830ff6d94158bb7d0.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/08f17ccf64bc02a830ff6d94158bb7d0.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-512.png","status_text_canonical":"","team":"T01BKP66VQF"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1601939635},{"id":"U01BXDDM9D3","team_id":"T01BKP66VQF","name":"slack_shack_ringo_api","deleted":false,"color":"3c989f","real_name":"Slack + Shack - Ringo - API Project","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Slack + Shack - Ringo - API Project","real_name_normalized":"Slack Shack - Ringo - + API Project","display_name":"","display_name_normalized":"","fields":null,"status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g80470ef0045","api_app_id":"A01CD505VFB","always_active":false,"bot_id":"B01CQBDFDH6","image_24":"https:\/\/secure.gravatar.com\/avatar\/80470ef0045f14e6eabaa7de2a9a3cf1.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0007-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/80470ef0045f14e6eabaa7de2a9a3cf1.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0007-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/80470ef0045f14e6eabaa7de2a9a3cf1.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0007-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/80470ef0045f14e6eabaa7de2a9a3cf1.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0007-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/80470ef0045f14e6eabaa7de2a9a3cf1.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0007-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/80470ef0045f14e6eabaa7de2a9a3cf1.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0007-512.png","status_text_canonical":"","team":"T01BKP66VQF"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":true,"is_app_user":false,"updated":1601940231},{"id":"U01C0FJ2NR0","team_id":"T01BKP66VQF","name":"jasylop","deleted":false,"color":"9f69e7","real_name":"jasylop","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"jasylop","real_name_normalized":"jasylop","display_name":"","display_name_normalized":"","fields":null,"status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g9cad2c21b75","image_24":"https:\/\/secure.gravatar.com\/avatar\/9cad2c21b7556014e0c7d631350bfa6f.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/9cad2c21b7556014e0c7d631350bfa6f.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/9cad2c21b7556014e0c7d631350bfa6f.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/9cad2c21b7556014e0c7d631350bfa6f.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/9cad2c21b7556014e0c7d631350bfa6f.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/9cad2c21b7556014e0c7d631350bfa6f.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-512.png","status_text_canonical":"","team":"T01BKP66VQF"},"is_admin":true,"is_owner":true,"is_primary_owner":true,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1601939471},{"id":"U01CD4VSXRP","team_id":"T01BKP66VQF","name":"earth_jasmine_api_pro","deleted":false,"color":"e7392d","real_name":"Earth + - Jasmine - API Project","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight + Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Earth + - Jasmine - API Project","real_name_normalized":"Earth - Jasmine - API Project","display_name":"","display_name_normalized":"","fields":null,"status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"gc21fc0f73d1","api_app_id":"A01BTPM845U","always_active":false,"bot_id":"B01BXD5J81K","image_24":"https:\/\/secure.gravatar.com\/avatar\/c21fc0f73d1ef7d3240a2ef839f929cf.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0006-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/c21fc0f73d1ef7d3240a2ef839f929cf.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0006-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/c21fc0f73d1ef7d3240a2ef839f929cf.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0006-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/c21fc0f73d1ef7d3240a2ef839f929cf.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0006-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/c21fc0f73d1ef7d3240a2ef839f929cf.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0006-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/c21fc0f73d1ef7d3240a2ef839f929cf.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0006-512.png","status_text_canonical":"","team":"T01BKP66VQF"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":true,"is_app_user":false,"updated":1601939850}],"cache_ts":1602031876,"response_metadata":{"next_cursor":""}}' + recorded_at: Wed, 07 Oct 2020 00:51:16 GMT +recorded_with: VCR 6.0.0 diff --git a/test/user_test.rb b/test/user_test.rb index a46e6816..2c1020d5 100644 --- a/test/user_test.rb +++ b/test/user_test.rb @@ -1 +1,39 @@ -require_relative "test_helper" \ No newline at end of file +require_relative "test_helper" + +describe "User" do + describe "initialize" do + it "makes a user with correct attributes" do + @fake_user = User.new(2398, "Troy", "Troy Barnes", "on a boat with Levar Burton", ":D") + + expect(@fake_user).must_be_kind_of User + expect(@fake_user.slack_id).must_equal 2398 + expect(@fake_user.username).must_equal "Troy" + expect(@fake_user.real_name).must_equal "Troy Barnes" + expect(@fake_user.status_text).must_equal "on a boat with Levar Burton" + expect(@fake_user.status_emoji).must_equal ":D" + end + + it "raises an error if passed any bad information" do + expect { User.new(2398, nil, "Troy Barnes", "on a boat with Levar Burton", ":D") }.must_raise SlackApiError + end + end + + describe "self.list" do + it "check the first user in the list is accurate" do + VCR.use_cassette("user_get") do + first_user = User.list.first + expect(first_user.username).must_equal "slackbot" + expect(first_user.slack_id).must_equal "USLACKBOT" + expect(first_user.status_text).must_equal "" + expect(first_user.status_emoji).must_equal "" + expect(first_user.real_name).must_equal "Slackbot" + end + end + + it "check that self.list returns the correct number of elements" do + VCR.use_cassette("user_get") do + expect(User.list.length).must_equal 5 + end + end + end +end \ No newline at end of file From 951e6809369b84d151ecacc892d2528759a23ae5 Mon Sep 17 00:00:00 2001 From: Ringo Alcock Date: Tue, 6 Oct 2020 18:11:25 -0700 Subject: [PATCH 14/26] write tests for workspace --- lib/recipient.rb | 1 - lib/slack.rb | 1 - test/cassettes/workspace_get.yml | 145 +++++++++++++++++++++++++++++++ test/workspace_test.rb | 57 +++++++++++- 4 files changed, 201 insertions(+), 3 deletions(-) create mode 100644 test/cassettes/workspace_get.yml diff --git a/lib/recipient.rb b/lib/recipient.rb index 981c192d..0c05b450 100644 --- a/lib/recipient.rb +++ b/lib/recipient.rb @@ -26,5 +26,4 @@ def self.get(url, parameters: { token: KEY } ) def self.list raise NotImplementedError end - end \ No newline at end of file diff --git a/lib/slack.rb b/lib/slack.rb index dd9fee98..f98d782e 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -43,7 +43,6 @@ def main # response = HTTParty.get(URL, query: { token: KEY } ) - # blah blah as part of code # if "list users" # tp workspace.list("users") diff --git a/test/cassettes/workspace_get.yml b/test/cassettes/workspace_get.yml new file mode 100644 index 00000000..cb83e658 --- /dev/null +++ b/test/cassettes/workspace_get.yml @@ -0,0 +1,145 @@ +--- +http_interactions: +- request: + method: get + uri: https://slack.com/api/users.list?token= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Date: + - Wed, 07 Oct 2020 01:04:33 GMT + Server: + - Apache + X-Slack-Req-Id: + - f72fb8852432afe32769235086cd1ec9 + X-Oauth-Scopes: + - chat:write,channels:read,users:read + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + Access-Control-Allow-Origin: + - "*" + X-Slack-Backend: + - r + X-Content-Type-Options: + - nosniff + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - users:read + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, + x-b3-sampled, x-b3-flags + Vary: + - Accept-Encoding + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Content-Length: + - '1250' + Content-Type: + - application/json; charset=utf-8 + X-Via: + - haproxy-www-ouwk,haproxy-edge-pdx-sqqp + body: + encoding: ASCII-8BIT + string: '{"ok":true,"members":[{"id":"USLACKBOT","team_id":"T01BKP66VQF","name":"slackbot","deleted":false,"color":"757575","real_name":"Slackbot","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Slackbot","real_name_normalized":"Slackbot","display_name":"Slackbot","display_name_normalized":"Slackbot","fields":null,"status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"sv41d8cd98f0","always_active":true,"first_name":"slackbot","last_name":"","image_24":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_24.png","image_32":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_32.png","image_48":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_48.png","image_72":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_72.png","image_192":"https:\/\/a.slack-edge.com\/80588\/marketing\/img\/avatars\/slackbot\/avatar-slackbot.png","image_512":"https:\/\/a.slack-edge.com\/80588\/img\/slackbot_512.png","status_text_canonical":"","team":"T01BKP66VQF"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":0},{"id":"U01BKP9SFK9","team_id":"T01BKP66VQF","name":"ringo.alcock","deleted":false,"color":"4bbe2e","real_name":"Ringo","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Ringo","real_name_normalized":"Ringo","display_name":"Ringo","display_name_normalized":"Ringo","fields":null,"status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g08f17ccf64b","image_24":"https:\/\/secure.gravatar.com\/avatar\/08f17ccf64bc02a830ff6d94158bb7d0.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/08f17ccf64bc02a830ff6d94158bb7d0.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/08f17ccf64bc02a830ff6d94158bb7d0.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/08f17ccf64bc02a830ff6d94158bb7d0.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/08f17ccf64bc02a830ff6d94158bb7d0.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/08f17ccf64bc02a830ff6d94158bb7d0.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0015-512.png","status_text_canonical":"","team":"T01BKP66VQF"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1601939635},{"id":"U01BXDDM9D3","team_id":"T01BKP66VQF","name":"slack_shack_ringo_api","deleted":false,"color":"3c989f","real_name":"Slack + Shack - Ringo - API Project","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Slack + Shack - Ringo - API Project","real_name_normalized":"Slack Shack - Ringo - + API Project","display_name":"","display_name_normalized":"","fields":null,"status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g80470ef0045","api_app_id":"A01CD505VFB","always_active":false,"bot_id":"B01CQBDFDH6","image_24":"https:\/\/secure.gravatar.com\/avatar\/80470ef0045f14e6eabaa7de2a9a3cf1.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0007-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/80470ef0045f14e6eabaa7de2a9a3cf1.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0007-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/80470ef0045f14e6eabaa7de2a9a3cf1.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0007-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/80470ef0045f14e6eabaa7de2a9a3cf1.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0007-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/80470ef0045f14e6eabaa7de2a9a3cf1.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0007-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/80470ef0045f14e6eabaa7de2a9a3cf1.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0007-512.png","status_text_canonical":"","team":"T01BKP66VQF"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":true,"is_app_user":false,"updated":1601940231},{"id":"U01C0FJ2NR0","team_id":"T01BKP66VQF","name":"jasylop","deleted":false,"color":"9f69e7","real_name":"jasylop","tz":"America\/Los_Angeles","tz_label":"Pacific + Daylight Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"jasylop","real_name_normalized":"jasylop","display_name":"","display_name_normalized":"","fields":null,"status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"g9cad2c21b75","image_24":"https:\/\/secure.gravatar.com\/avatar\/9cad2c21b7556014e0c7d631350bfa6f.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/9cad2c21b7556014e0c7d631350bfa6f.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/9cad2c21b7556014e0c7d631350bfa6f.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/9cad2c21b7556014e0c7d631350bfa6f.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/9cad2c21b7556014e0c7d631350bfa6f.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/9cad2c21b7556014e0c7d631350bfa6f.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0022-512.png","status_text_canonical":"","team":"T01BKP66VQF"},"is_admin":true,"is_owner":true,"is_primary_owner":true,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"is_app_user":false,"updated":1601939471},{"id":"U01CD4VSXRP","team_id":"T01BKP66VQF","name":"earth_jasmine_api_pro","deleted":false,"color":"e7392d","real_name":"Earth + - Jasmine - API Project","tz":"America\/Los_Angeles","tz_label":"Pacific Daylight + Time","tz_offset":-25200,"profile":{"title":"","phone":"","skype":"","real_name":"Earth + - Jasmine - API Project","real_name_normalized":"Earth - Jasmine - API Project","display_name":"","display_name_normalized":"","fields":null,"status_text":"","status_emoji":"","status_expiration":0,"avatar_hash":"gc21fc0f73d1","api_app_id":"A01BTPM845U","always_active":false,"bot_id":"B01BXD5J81K","image_24":"https:\/\/secure.gravatar.com\/avatar\/c21fc0f73d1ef7d3240a2ef839f929cf.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0006-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/c21fc0f73d1ef7d3240a2ef839f929cf.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0006-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/c21fc0f73d1ef7d3240a2ef839f929cf.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0006-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/c21fc0f73d1ef7d3240a2ef839f929cf.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0006-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/c21fc0f73d1ef7d3240a2ef839f929cf.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0006-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/c21fc0f73d1ef7d3240a2ef839f929cf.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0006-512.png","status_text_canonical":"","team":"T01BKP66VQF"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":true,"is_app_user":false,"updated":1601939850}],"cache_ts":1602032673,"response_metadata":{"next_cursor":""}}' + recorded_at: Wed, 07 Oct 2020 01:04:33 GMT +- request: + method: get + uri: https://slack.com/api/conversations.list?token= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Date: + - Wed, 07 Oct 2020 01:04:34 GMT + Server: + - Apache + X-Slack-Req-Id: + - 38609ab760bbf9ad424b8484034a7534 + X-Oauth-Scopes: + - chat:write,channels:read,users:read + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + Access-Control-Allow-Origin: + - "*" + X-Slack-Backend: + - r + X-Content-Type-Options: + - nosniff + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - channels:read,groups:read,mpim:read,im:read,read + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, + x-b3-sampled, x-b3-flags + Vary: + - Accept-Encoding + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Content-Length: + - '643' + Content-Type: + - application/json; charset=utf-8 + X-Via: + - haproxy-www-osln,haproxy-edge-pdx-raf5 + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channels":[{"id":"C01BKP67695","name":"random","is_channel":true,"is_group":false,"is_im":false,"created":1601939471,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"random","is_shared":false,"parent_conversation":null,"creator":"U01C0FJ2NR0","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["T01BKP66VQF"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":false,"is_private":false,"is_mpim":false,"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"This + channel is for... well, everything else. It\u2019s a place for team jokes, + spur-of-the-moment ideas, and funny GIFs. Go wild!","creator":"U01C0FJ2NR0","last_set":1601939471},"previous_names":[],"num_members":3},{"id":"C01BXCX7A8M","name":"general","is_channel":true,"is_group":false,"is_im":false,"created":1601939471,"is_archived":false,"is_general":true,"unlinked":0,"name_normalized":"general","is_shared":false,"parent_conversation":null,"creator":"U01C0FJ2NR0","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["T01BKP66VQF"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":false,"is_private":false,"is_mpim":false,"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"This + is the one channel that will always include everyone. It\u2019s a great spot + for announcements and team-wide conversations.","creator":"U01C0FJ2NR0","last_set":1601939471},"previous_names":[],"num_members":2},{"id":"C01BXD088JH","name":"slack-cli","is_channel":true,"is_group":false,"is_im":false,"created":1601939607,"is_archived":false,"is_general":false,"unlinked":0,"name_normalized":"slack-cli","is_shared":false,"parent_conversation":null,"creator":"U01C0FJ2NR0","is_ext_shared":false,"is_org_shared":false,"shared_team_ids":["T01BKP66VQF"],"pending_shared":[],"pending_connected_team_ids":[],"is_pending_ext_shared":false,"is_member":false,"is_private":false,"is_mpim":false,"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"This + *channel* is for working on a project. Hold meetings, share docs, and make + decisions together with your team.","creator":"U01C0FJ2NR0","last_set":1601939607},"previous_names":[],"num_members":2}],"response_metadata":{"next_cursor":""}}' + recorded_at: Wed, 07 Oct 2020 01:04:34 GMT +recorded_with: VCR 6.0.0 diff --git a/test/workspace_test.rb b/test/workspace_test.rb index a46e6816..60309d12 100644 --- a/test/workspace_test.rb +++ b/test/workspace_test.rb @@ -1 +1,56 @@ -require_relative "test_helper" \ No newline at end of file +require_relative "test_helper" + +describe "Workspace" do + describe "initialize" do + it "makes a workspace with the correct variables" do + VCR.use_cassette("workspace_get") do + @fake_workspace = Workspace.new + + expect(@fake_workspace).must_be_instance_of Workspace + expect(@fake_workspace.users).must_be_instance_of Array + expect(@fake_workspace.channels).must_be_instance_of Array + end + end + end + + describe "list" do + before do + VCR.use_cassette("workspace_get") do + @workspace = Workspace.new + end + end + it "check first user in workspace.users is correct" do + first_user = @workspace.users.first + expect(first_user.username).must_equal "slackbot" + expect(first_user.slack_id).must_equal "USLACKBOT" + expect(first_user.status_text).must_equal "" + expect(first_user.status_emoji).must_equal "" + expect(first_user.real_name).must_equal "Slackbot" + end + + it "check count of users in workspace is accurate" do + expect(@workspace.users.length).must_equal 5 + end + + it "check that the users are an instance of User" do + @workspace.users.each do |user| + expect(user).must_be_kind_of User + end + end + + it "check first channel in workspace.channels is correct" do + first_channel = @workspace.channels.first + expect(first_channel.name).must_equal "random" + expect(first_channel.slack_id).must_equal "C01BKP67695" + expect(first_channel.member_count).must_equal 3 + end + + it "check count of channels in workspace is accurate" do + expect(@workspace.channels.length).must_equal 3 + end + + it "check that the channels are an instance of Channel" do + expect(@workspace.channels.first).must_be_instance_of Channel + end + end +end \ No newline at end of file From cc601cfec566ee4bd0eb697e58a8784f461d6932 Mon Sep 17 00:00:00 2001 From: Ringo Alcock Date: Wed, 7 Oct 2020 11:51:19 -0700 Subject: [PATCH 15/26] write tests for select method, define select method, implement select in slack.rb --- lib/slack.rb | 20 ++++++++++++++- lib/workspace.rb | 12 ++++++++- test/workspace_test.rb | 58 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+), 2 deletions(-) diff --git a/lib/slack.rb b/lib/slack.rb index f98d782e..d948b0cf 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -13,7 +13,7 @@ def main #puts load information (number of users and channels, etc) puts "There are #{workspace.users.length} users and #{workspace.channels.length} channels".colorize(:light_yellow) - options = "\nWhat would you like to do?\n— list users\n— list channels\n— quit\n".colorize(:light_green) + options = "\nWhat would you like to do?\n— list users\n— list channels\n— select user\n— select channel\n— details\n— quit\n".colorize(:light_green) while true puts options @@ -26,6 +26,24 @@ def main tp workspace.list("users") when "list channels" tp workspace.list("channels") + when "select user" + puts "please enter user slack ID or username" + input = gets.chomp.downcase + looked_for_user = workspace.select("user", input: input) + if looked_for_user + puts "you have selected #{looked_for_user.username}" + else + puts "we could not find that user" + end + when "select channel" + puts "please enter channel slack ID or name" + input = gets.chomp.downcase + looked_for_channel = workspace.select("channel", input: input) + if looked_for_channel + puts "you have selected #{looked_for_channel.name}" + else + puts "we could not find that channel" + end when "quit" break else diff --git a/lib/workspace.rb b/lib/workspace.rb index 6f2e6f41..0f55ea62 100644 --- a/lib/workspace.rb +++ b/lib/workspace.rb @@ -4,11 +4,12 @@ class Workspace - attr_reader :users, :channels + attr_reader :users, :channels, :selected def initialize @users = User.list @channels = Channel.list + @selected = nil end def list(thing_to_print) @@ -21,4 +22,13 @@ def list(thing_to_print) end end + def select(recipient_type, input: nil) + if recipient_type == "user" + @selected = @users.find {|user| user.username.downcase == input || user.slack_id.downcase == input} + elsif recipient_type == "channel" + @selected = @channels.find {|channel| channel.name.downcase == input || channel.slack_id.downcase == input} + end + return @selected + end + end \ No newline at end of file diff --git a/test/workspace_test.rb b/test/workspace_test.rb index 60309d12..795da2af 100644 --- a/test/workspace_test.rb +++ b/test/workspace_test.rb @@ -53,4 +53,62 @@ expect(@workspace.channels.first).must_be_instance_of Channel end end + + describe "select user/channel" do + before do + VCR.use_cassette("workspace_get") do + @workspace = Workspace.new + end + end + + it "returns an instance of user when select user is called" do + expect(@workspace.select("user", input: "slackbot")).must_be_instance_of User + end + + it "returns an instance of channel when select channel is called" do + expect(@workspace.select("channel", input: "random")).must_be_instance_of Channel + end + + it "returns the channel with name matching input name" do + expect(@workspace.select("channel", input: "random").name).must_equal "random" + end + + it "returns the user with name matching input name" do + expect(@workspace.select("user", input: "slackbot").username).must_equal "slackbot" + end + + it "returns the channel with correct name when called by id #" do + expect(@workspace.select("channel", input: "C01BKP67695".downcase).name).must_equal "random" + end + + it "returns the user with correct name when called by id #" do + expect(@workspace.select("user", input: "USLACKBOT".downcase).username).must_equal "slackbot" + end + + it "returns nil if there is no such user" do + expect(@workspace.select("user", input: "Abed")).must_be_nil + end + + it "returns nil if there is no such channel" do + expect(@workspace.select("channel", input: "Greendale")).must_be_nil + end + + it "assigns the requested user to the @selected instance variable" do + @workspace.select("user", input: "slack_shack_ringo_api") + + expect(@workspace.selected.username).must_equal "slack_shack_ringo_api" + expect(@workspace.selected).must_be_kind_of User + end + + it "assigns the requested channel to the @selected instance variable" do + @workspace.select("channel", input: "random") + + expect(@workspace.selected.name).must_equal "random" + expect(@workspace.selected).must_be_kind_of Channel + end + + it "returns nil if user does not provide name or slack_id" do + expect(@workspace.select("user")).must_be_nil + end + end end \ No newline at end of file From a5aebc0ba8bad28f275255d58bdf20236f3e14d2 Mon Sep 17 00:00:00 2001 From: Ringo Alcock Date: Wed, 7 Oct 2020 16:10:00 -0700 Subject: [PATCH 16/26] wrote tests for and defined details method --- lib/channel.rb | 5 +++++ lib/recipient.rb | 4 ++++ lib/user.rb | 5 +++++ test/channel_test.rb | 15 +++++++++++++++ test/recipient_test.rb | 7 +++++++ test/user_test.rb | 15 +++++++++++++++ 6 files changed, 51 insertions(+) diff --git a/lib/channel.rb b/lib/channel.rb index a8d73edf..f9f9477a 100644 --- a/lib/channel.rb +++ b/lib/channel.rb @@ -33,4 +33,9 @@ def self.list return all_our_pretty_channels end + def details + output = "Name: #{name}\nSlack ID: #{slack_id}\nMember Count: #{member_count}\nTopic: #{topic}" + return output + end + end \ No newline at end of file diff --git a/lib/recipient.rb b/lib/recipient.rb index 0c05b450..db438b55 100644 --- a/lib/recipient.rb +++ b/lib/recipient.rb @@ -26,4 +26,8 @@ def self.get(url, parameters: { token: KEY } ) def self.list raise NotImplementedError end + + def details + raise NotImplementedError + end end \ No newline at end of file diff --git a/lib/user.rb b/lib/user.rb index f6c94dc2..c8905859 100644 --- a/lib/user.rb +++ b/lib/user.rb @@ -34,4 +34,9 @@ def self.list end return all_our_pretty_users end + + def details + output = "Username: #{username}\nReal Name: #{real_name}\nSlack ID: #{slack_id}\nStatus: #{status_text}\nStatus Emoji: #{status_emoji}" + return output + end end \ No newline at end of file diff --git a/test/channel_test.rb b/test/channel_test.rb index 71276daf..0a57cbd1 100644 --- a/test/channel_test.rb +++ b/test/channel_test.rb @@ -33,4 +33,19 @@ end end end + + describe "details" do + before do + @channel = Channel.new("34839", "Name", "a place where human beings talk about things", 10) + end + + it "returns an instance of string" do + expect(@channel.details).must_be_instance_of String + end + + it "returns accurate details for an specific user" do + output = "Name: Name\nSlack ID: 34839\nMember Count: 10\nTopic: a place where human beings talk about things" + expect(@channel.details).must_equal output + end + end end \ No newline at end of file diff --git a/test/recipient_test.rb b/test/recipient_test.rb index d6cbdd91..932dda67 100644 --- a/test/recipient_test.rb +++ b/test/recipient_test.rb @@ -31,4 +31,11 @@ expect {Recipient.list}.must_raise NotImplementedError end end + + describe "details" do + it "raises error if invoked without subclassing" do + @new_recipient = Recipient.new(20020202) + expect {@new_recipient.details}.must_raise NotImplementedError + end + end end \ No newline at end of file diff --git a/test/user_test.rb b/test/user_test.rb index 2c1020d5..ddba0ca7 100644 --- a/test/user_test.rb +++ b/test/user_test.rb @@ -36,4 +36,19 @@ end end end + + describe "details" do + before do + @user = User.new("34839", "Name", "Real Name", "status text", ":thumbsup:" ) + end + + it "returns an instance of string" do + expect(@user.details).must_be_instance_of String + end + + it "returns accurate details for an specific user" do + output = "Username: Name\nReal Name: Real Name\nSlack ID: 34839\nStatus: status text\nStatus Emoji: :thumbsup:" + expect(@user.details).must_equal output + end + end end \ No newline at end of file From be4abee88d16500965ddcf152bdfb3defab16e59 Mon Sep 17 00:00:00 2001 From: Ringo Alcock Date: Wed, 7 Oct 2020 16:10:45 -0700 Subject: [PATCH 17/26] implement details method --- lib/slack.rb | 2 ++ lib/workspace.rb | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/lib/slack.rb b/lib/slack.rb index d948b0cf..f6af99d6 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -44,6 +44,8 @@ def main else puts "we could not find that channel" end + when "details" + puts workspace.details when "quit" break else diff --git a/lib/workspace.rb b/lib/workspace.rb index 0f55ea62..f87bf5a9 100644 --- a/lib/workspace.rb +++ b/lib/workspace.rb @@ -31,4 +31,9 @@ def select(recipient_type, input: nil) return @selected end + def details + return "Please select user or channel, first." if @selected == nil + return @selected.details + end + end \ No newline at end of file From af20912546620eec450b32466e14745731786cda Mon Sep 17 00:00:00 2001 From: Ringo Alcock Date: Wed, 7 Oct 2020 16:11:16 -0700 Subject: [PATCH 18/26] wrote tests for workspace.details --- test/workspace_test.rb | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/test/workspace_test.rb b/test/workspace_test.rb index 795da2af..b51ebc43 100644 --- a/test/workspace_test.rb +++ b/test/workspace_test.rb @@ -111,4 +111,24 @@ expect(@workspace.select("user")).must_be_nil end end + + describe "details" do + before do + VCR.use_cassette("workspace_get") do + @workspace = Workspace.new + end + end + + it "catches and appropriately deals with a nil input" do + output = "Please select user or channel, first." + expect(@workspace.details).must_equal output + end + + it "returns a string" do + output = "Please select user or channel, first." + @workspace.select("channel", input: "random") + expect(@workspace.details).must_be_kind_of String + expect(@workspace.details).wont_equal output + end + end end \ No newline at end of file From a1d4f4a24ee771beb18c26c5d464768db3c1c60a Mon Sep 17 00:00:00 2001 From: Ringo Alcock Date: Wed, 7 Oct 2020 17:40:04 -0700 Subject: [PATCH 19/26] define post method for recipient and write tests --- lib/recipient.rb | 13 ++++++ test/cassettes/recipient_post.yml | 66 ++++++++++++++++++++++++++++++ test/cassettes/workspace_post.yml | 68 +++++++++++++++++++++++++++++++ test/recipient_test.rb | 16 ++++++++ 4 files changed, 163 insertions(+) create mode 100644 test/cassettes/recipient_post.yml create mode 100644 test/cassettes/workspace_post.yml diff --git a/lib/recipient.rb b/lib/recipient.rb index db438b55..ab6874ec 100644 --- a/lib/recipient.rb +++ b/lib/recipient.rb @@ -23,6 +23,19 @@ def self.get(url, parameters: { token: KEY } ) return response end + def post(message) + post_url = "https://slack.com/api/chat.postMessage" + body = { + token: KEY, + text: message, + channel: slack_id + } + response = HTTParty.post(post_url, body: body) + + raise SlackApiError unless response['ok'] + return "Your message was delivered!" + end + def self.list raise NotImplementedError end diff --git a/test/cassettes/recipient_post.yml b/test/cassettes/recipient_post.yml new file mode 100644 index 00000000..5463272c --- /dev/null +++ b/test/cassettes/recipient_post.yml @@ -0,0 +1,66 @@ +--- +http_interactions: +- request: + method: post + uri: https://slack.com/api/chat.postMessage + body: + encoding: UTF-8 + string: token=&text=message&channel=20020202 + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Date: + - Wed, 07 Oct 2020 23:54:13 GMT + Server: + - Apache + X-Slack-Req-Id: + - 2b09807127b4b617d8d112687447490f + X-Oauth-Scopes: + - chat:write,channels:read,users:read,channels:join + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + Access-Control-Allow-Origin: + - "*" + X-Slack-Backend: + - r + X-Content-Type-Options: + - nosniff + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - chat:write + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, + x-b3-sampled, x-b3-flags + Vary: + - Accept-Encoding + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Content-Length: + - '60' + Content-Type: + - application/json; charset=utf-8 + X-Via: + - haproxy-www-zmc8,haproxy-edge-pdx-1cbr + body: + encoding: ASCII-8BIT + string: '{"ok":false,"error":"channel_not_found"}' + recorded_at: Wed, 07 Oct 2020 23:54:13 GMT +recorded_with: VCR 6.0.0 diff --git a/test/cassettes/workspace_post.yml b/test/cassettes/workspace_post.yml new file mode 100644 index 00000000..4e8e1c43 --- /dev/null +++ b/test/cassettes/workspace_post.yml @@ -0,0 +1,68 @@ +--- +http_interactions: +- request: + method: post + uri: https://slack.com/api/chat.postMessage + body: + encoding: UTF-8 + string: token=&text=Hello%2C%20Random%20Channel%21&channel=C01BKP67695 + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Date: + - Wed, 07 Oct 2020 23:57:02 GMT + Server: + - Apache + X-Slack-Req-Id: + - 73ec0f4bf5582063d6b85c444b8b142e + X-Oauth-Scopes: + - chat:write,channels:read,users:read,channels:join + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + Access-Control-Allow-Origin: + - "*" + X-Slack-Backend: + - r + X-Content-Type-Options: + - nosniff + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - chat:write + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, + x-b3-sampled, x-b3-flags + Vary: + - Accept-Encoding + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Content-Length: + - '348' + Content-Type: + - application/json; charset=utf-8 + X-Via: + - haproxy-www-f98x,haproxy-edge-pdx-g0kg + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channel":"C01BKP67695","ts":"1602115022.000100","message":{"bot_id":"B01BXD5J81K","type":"message","text":"Hello, + Random Channel!","user":"U01CD4VSXRP","ts":"1602115022.000100","team":"T01BKP66VQF","bot_profile":{"id":"B01BXD5J81K","deleted":false,"name":"Earth + - Jasmine - API Project","updated":1601939850,"app_id":"A01BTPM845U","icons":{"image_36":"https:\/\/a.slack-edge.com\/80588\/img\/plugins\/app\/bot_36.png","image_48":"https:\/\/a.slack-edge.com\/80588\/img\/plugins\/app\/bot_48.png","image_72":"https:\/\/a.slack-edge.com\/80588\/img\/plugins\/app\/service_72.png"},"team_id":"T01BKP66VQF"}}}' + recorded_at: Wed, 07 Oct 2020 23:57:02 GMT +recorded_with: VCR 6.0.0 diff --git a/test/recipient_test.rb b/test/recipient_test.rb index 932dda67..0d5b3baa 100644 --- a/test/recipient_test.rb +++ b/test/recipient_test.rb @@ -38,4 +38,20 @@ expect {@new_recipient.details}.must_raise NotImplementedError end end + + describe "post" do + + it "raises an error if message could not be delivered" do + VCR.use_cassette("recipient_post") do + @new_recipient = Recipient.new(20020202) + expect{@new_recipient.post("message")}.must_raise SlackApiError + end + end + + # it "returns a string when message sent to valid channel" do + # VCR.use_cassette("recipient_post") do + # expect() + # end + # end + end end \ No newline at end of file From b180d690eab5dec803746681ac73ee70c5ae2c6f Mon Sep 17 00:00:00 2001 From: Ringo Alcock Date: Wed, 7 Oct 2020 17:40:53 -0700 Subject: [PATCH 20/26] define is_selected? and send_message methods and write tests --- lib/workspace.rb | 10 +++++++++- test/workspace_test.rb | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/lib/workspace.rb b/lib/workspace.rb index f87bf5a9..3aaf4bd7 100644 --- a/lib/workspace.rb +++ b/lib/workspace.rb @@ -31,9 +31,17 @@ def select(recipient_type, input: nil) return @selected end + def is_selected? + return !!@selected + end + def details - return "Please select user or channel, first." if @selected == nil + return "Please select user or channel, first." unless is_selected? return @selected.details end + def send_message(text) + return "Please select user or channel, first." unless is_selected? + return @selected.post(text) + end end \ No newline at end of file diff --git a/test/workspace_test.rb b/test/workspace_test.rb index b51ebc43..09feae91 100644 --- a/test/workspace_test.rb +++ b/test/workspace_test.rb @@ -131,4 +131,42 @@ expect(@workspace.details).wont_equal output end end + + describe "send message" do + before do + VCR.use_cassette("workspace_get") do + @workspace = Workspace.new + end + end + + it "sends message to valid channel" do + VCR.use_cassette("workspace_post") do + @workspace.select("channel", input: "random") + expect(@workspace.send_message("Hello, Random Channel!")).must_equal "Your message was delivered!" + end + end + + it "warns user if they didn't select user/channel first" do + VCR.use_cassette("workspace_post") do + expect(@workspace.send_message("hedgehog!")).must_equal "Please select user or channel, first." + end + end + end + + describe "is_selected?" do + before do + VCR.use_cassette("workspace_get") do + @workspace = Workspace.new + end + end + + it "returns false if workspace does not have a selected recipient" do + expect(@workspace.is_selected?).must_equal false + end + + it "returns true if workspace does have a selected recipient" do + @workspace.select("user", input: "slackbot") + expect(@workspace.is_selected?).must_equal true + end + end end \ No newline at end of file From 4f1f9ab22d8693955c024a646aab2f7084d0d653 Mon Sep 17 00:00:00 2001 From: Ringo Alcock Date: Wed, 7 Oct 2020 17:41:48 -0700 Subject: [PATCH 21/26] update slack.rb for send message and clean up comments --- lib/slack.rb | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/lib/slack.rb b/lib/slack.rb index f6af99d6..63b484ea 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -13,7 +13,7 @@ def main #puts load information (number of users and channels, etc) puts "There are #{workspace.users.length} users and #{workspace.channels.length} channels".colorize(:light_yellow) - options = "\nWhat would you like to do?\n— list users\n— list channels\n— select user\n— select channel\n— details\n— quit\n".colorize(:light_green) + options = "\nWhat would you like to do?\n— list users\n— list channels\n— select user\n— select channel\n— details\n- send message\n— quit\n".colorize(:light_green) while true puts options @@ -46,6 +46,14 @@ def main end when "details" puts workspace.details + when "send message" + if workspace.is_selected? + puts "what message would you like to send?" + text = gets.chomp + puts workspace.send_message(text) + else + puts workspace.send_message("I didn't pick a user/channel D:") + end when "quit" break else @@ -58,15 +66,4 @@ def main main if __FILE__ == $PROGRAM_NAME -# URL = "https://slack.com/api/conversations.list" -# KEY = ENV["SLACK_TOKEN"] -# response = HTTParty.get(URL, query: { token: KEY } ) - - -# blah blah as part of code -# if "list users" -# tp workspace.list("users") -# if "list channels" -# tp workspace.list("channels") - # TODO look into soft wrap or continue on new line for table_print \ No newline at end of file From b522158cb2fead43816a149208348c16c58caf99 Mon Sep 17 00:00:00 2001 From: Ringo Alcock Date: Thu, 8 Oct 2020 16:27:23 -0700 Subject: [PATCH 22/26] define customize_bot method and write tests --- bot-settings.json | 1 + lib/workspace.rb | 20 +++++++++++++++++--- test/workspace_test.rb | 14 ++++++++++++++ 3 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 bot-settings.json diff --git a/bot-settings.json b/bot-settings.json new file mode 100644 index 00000000..b551a517 --- /dev/null +++ b/bot-settings.json @@ -0,0 +1 @@ +{"icon_emoji":":kissing_heart:","username":"murder_bot"} \ No newline at end of file diff --git a/lib/workspace.rb b/lib/workspace.rb index 3aaf4bd7..3d89252f 100644 --- a/lib/workspace.rb +++ b/lib/workspace.rb @@ -1,7 +1,9 @@ require 'table_print' +require 'json' require_relative 'user' require_relative 'channel' + class Workspace attr_reader :users, :channels, :selected @@ -22,11 +24,11 @@ def list(thing_to_print) end end - def select(recipient_type, input: nil) + def select(recipient_type, input: "") if recipient_type == "user" - @selected = @users.find {|user| user.username.downcase == input || user.slack_id.downcase == input} + @selected = @users.find {|user| user.username.downcase == input.downcase || user.slack_id.downcase == input.downcase } elsif recipient_type == "channel" - @selected = @channels.find {|channel| channel.name.downcase == input || channel.slack_id.downcase == input} + @selected = @channels.find {|channel| channel.name.downcase == input.downcase || channel.slack_id.downcase == input.downcase } end return @selected end @@ -44,4 +46,16 @@ def send_message(text) return "Please select user or channel, first." unless is_selected? return @selected.post(text) end + + def customize_bot(username, emoji) + # we format in hash + body = { + icon_emoji: emoji, + username: username + } + # save hash to json file + File.open("bot-settings.json","w") do |f| + f.write(body.to_json) + end + end end \ No newline at end of file diff --git a/test/workspace_test.rb b/test/workspace_test.rb index 09feae91..0cec74a5 100644 --- a/test/workspace_test.rb +++ b/test/workspace_test.rb @@ -169,4 +169,18 @@ expect(@workspace.is_selected?).must_equal true end end + + describe "customize_bot" do + before do + VCR.use_cassette("workspace_get") do + @workspace = Workspace.new + end + end + + it "stores the emoji and username it's given in the json file" do + json = {"icon_emoji" => ":kissing_heart:","username" => "murder_bot"} + @workspace.customize_bot("murder_bot", ":kissing_heart:") + expect(JSON.parse(File.read("bot-settings.json"))).must_equal json + end + end end \ No newline at end of file From edf8037688c979f5498dbe9053da5d64beee5e48 Mon Sep 17 00:00:00 2001 From: Ringo Alcock Date: Thu, 8 Oct 2020 16:27:51 -0700 Subject: [PATCH 23/26] modify post method for customize_bot and write tests --- lib/recipient.rb | 7 +++++++ test/recipient_test.rb | 15 ++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/lib/recipient.rb b/lib/recipient.rb index ab6874ec..f1165795 100644 --- a/lib/recipient.rb +++ b/lib/recipient.rb @@ -30,6 +30,13 @@ def post(message) text: message, channel: slack_id } + + begin + bot_attributes = JSON.parse(File.read("bot-settings.json")) + body.merge!(bot_attributes) + rescue JSON::ParserError + end + response = HTTParty.post(post_url, body: body) raise SlackApiError unless response['ok'] diff --git a/test/recipient_test.rb b/test/recipient_test.rb index 0d5b3baa..56a36225 100644 --- a/test/recipient_test.rb +++ b/test/recipient_test.rb @@ -48,10 +48,15 @@ end end - # it "returns a string when message sent to valid channel" do - # VCR.use_cassette("recipient_post") do - # expect() - # end - # end + it "rescues an error if the bot-settings.json file is empty" do + VCR.use_cassette("recipient_post") do + File.open("bot-settings.json","w") do |f| + f.write("") + end + @new_recipient = Recipient.new("U01BKP9SFK9") + expect(@new_recipient.post("message")).must_equal "Your message was delivered!" + + end + end end end \ No newline at end of file From 51fb26661bad497c1736f3e001f58e538a0a320f Mon Sep 17 00:00:00 2001 From: Ringo Alcock Date: Thu, 8 Oct 2020 16:28:35 -0700 Subject: [PATCH 24/26] integrate customize_bot to driver code --- lib/slack.rb | 13 +- test/cassettes/recipient_post.yml | 190 ++++++++++++++++++++++++++++++ test/cassettes/workspace_post.yml | 129 ++++++++++++++++++++ 3 files changed, 329 insertions(+), 3 deletions(-) diff --git a/lib/slack.rb b/lib/slack.rb index 63b484ea..706cc5c8 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -13,7 +13,7 @@ def main #puts load information (number of users and channels, etc) puts "There are #{workspace.users.length} users and #{workspace.channels.length} channels".colorize(:light_yellow) - options = "\nWhat would you like to do?\n— list users\n— list channels\n— select user\n— select channel\n— details\n- send message\n— quit\n".colorize(:light_green) + options = "\nWhat would you like to do?\n— list users\n— list channels\n— select user\n— select channel\n— details\n- send message\n- customize bot\n— quit\n".colorize(:light_green) while true puts options @@ -28,7 +28,7 @@ def main tp workspace.list("channels") when "select user" puts "please enter user slack ID or username" - input = gets.chomp.downcase + input = gets.chomp looked_for_user = workspace.select("user", input: input) if looked_for_user puts "you have selected #{looked_for_user.username}" @@ -37,7 +37,7 @@ def main end when "select channel" puts "please enter channel slack ID or name" - input = gets.chomp.downcase + input = gets.chomp looked_for_channel = workspace.select("channel", input: input) if looked_for_channel puts "you have selected #{looked_for_channel.name}" @@ -54,6 +54,13 @@ def main else puts workspace.send_message("I didn't pick a user/channel D:") end + when "customize bot" + puts "what would you like to name the bot?" + username = gets.chomp + puts "what emoji would you like to give the bot?" + emoji = gets.chomp + workspace.customize_bot(username, emoji) + puts "enjoy your power to change the names and faces of others" when "quit" break else diff --git a/test/cassettes/recipient_post.yml b/test/cassettes/recipient_post.yml index 5463272c..96b1c177 100644 --- a/test/cassettes/recipient_post.yml +++ b/test/cassettes/recipient_post.yml @@ -63,4 +63,194 @@ http_interactions: encoding: ASCII-8BIT string: '{"ok":false,"error":"channel_not_found"}' recorded_at: Wed, 07 Oct 2020 23:54:13 GMT +- request: + method: post + uri: https://slack.com/api/chat.postMessage + body: + encoding: UTF-8 + string: token=&text=message&channel=20020202&icon_emoji=%3Agrinning%3A&username=Earth%20-%20Jasmine%20-%20API%20Project + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Date: + - Thu, 08 Oct 2020 23:04:54 GMT + Server: + - Apache + X-Slack-Req-Id: + - ba3440230563ed3b3dab6d0a2818d1db + X-Oauth-Scopes: + - chat:write,channels:read,users:read,chat:write.customize + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + Access-Control-Allow-Origin: + - "*" + X-Slack-Backend: + - r + X-Content-Type-Options: + - nosniff + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - chat:write + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, + x-b3-sampled, x-b3-flags + Vary: + - Accept-Encoding + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Content-Length: + - '60' + Content-Type: + - application/json; charset=utf-8 + X-Via: + - haproxy-www-ouwk,haproxy-edge-pdx-jpry + body: + encoding: ASCII-8BIT + string: '{"ok":false,"error":"channel_not_found"}' + recorded_at: Thu, 08 Oct 2020 23:04:54 GMT +- request: + method: post + uri: https://slack.com/api/chat.postMessage + body: + encoding: UTF-8 + string: token=&text=message&channel=20020202&icon_emoji=%3Akissing_heart%3A&username=murder_bot + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Date: + - Thu, 08 Oct 2020 23:06:30 GMT + Server: + - Apache + X-Slack-Req-Id: + - fb55512b0203815216475e7631d9c381 + X-Oauth-Scopes: + - chat:write,channels:read,users:read,chat:write.customize + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + Access-Control-Allow-Origin: + - "*" + X-Slack-Backend: + - r + X-Content-Type-Options: + - nosniff + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - chat:write + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, + x-b3-sampled, x-b3-flags + Vary: + - Accept-Encoding + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Content-Length: + - '60' + Content-Type: + - application/json; charset=utf-8 + X-Via: + - haproxy-www-q20r,haproxy-edge-pdx-636g + body: + encoding: ASCII-8BIT + string: '{"ok":false,"error":"channel_not_found"}' + recorded_at: Thu, 08 Oct 2020 23:06:30 GMT +- request: + method: post + uri: https://slack.com/api/chat.postMessage + body: + encoding: UTF-8 + string: token=&text=message&channel=U01BKP9SFK9 + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Date: + - Thu, 08 Oct 2020 23:20:53 GMT + Server: + - Apache + X-Slack-Req-Id: + - 4e35aab286f70e741a12f53fc74baa3d + X-Oauth-Scopes: + - chat:write,channels:read,users:read,chat:write.customize + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + Access-Control-Allow-Origin: + - "*" + X-Slack-Backend: + - r + X-Content-Type-Options: + - nosniff + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - chat:write + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, + x-b3-sampled, x-b3-flags + Vary: + - Accept-Encoding + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Content-Length: + - '335' + Content-Type: + - application/json; charset=utf-8 + X-Via: + - haproxy-www-mki5,haproxy-edge-pdx-23kb + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channel":"D01C0N3V11R","ts":"1602199253.000100","message":{"bot_id":"B01CQBDFDH6","type":"message","text":"message","user":"U01BXDDM9D3","ts":"1602199253.000100","team":"T01BKP66VQF","bot_profile":{"id":"B01CQBDFDH6","deleted":false,"name":"Slack + Shack - Ringo - API Project","updated":1601940231,"app_id":"A01CD505VFB","icons":{"image_36":"https:\/\/a.slack-edge.com\/80588\/img\/plugins\/app\/bot_36.png","image_48":"https:\/\/a.slack-edge.com\/80588\/img\/plugins\/app\/bot_48.png","image_72":"https:\/\/a.slack-edge.com\/80588\/img\/plugins\/app\/service_72.png"},"team_id":"T01BKP66VQF"}}}' + recorded_at: Thu, 08 Oct 2020 23:20:53 GMT recorded_with: VCR 6.0.0 diff --git a/test/cassettes/workspace_post.yml b/test/cassettes/workspace_post.yml index 4e8e1c43..e5e17f8b 100644 --- a/test/cassettes/workspace_post.yml +++ b/test/cassettes/workspace_post.yml @@ -65,4 +65,133 @@ http_interactions: Random Channel!","user":"U01CD4VSXRP","ts":"1602115022.000100","team":"T01BKP66VQF","bot_profile":{"id":"B01BXD5J81K","deleted":false,"name":"Earth - Jasmine - API Project","updated":1601939850,"app_id":"A01BTPM845U","icons":{"image_36":"https:\/\/a.slack-edge.com\/80588\/img\/plugins\/app\/bot_36.png","image_48":"https:\/\/a.slack-edge.com\/80588\/img\/plugins\/app\/bot_48.png","image_72":"https:\/\/a.slack-edge.com\/80588\/img\/plugins\/app\/service_72.png"},"team_id":"T01BKP66VQF"}}}' recorded_at: Wed, 07 Oct 2020 23:57:02 GMT +- request: + method: post + uri: https://slack.com/api/chat.postMessage + body: + encoding: UTF-8 + string: token=&text=Hello%2C%20Random%20Channel%21&channel=C01BKP67695&icon_emoji=%3Agrinning%3A&username=Earth%20-%20Jasmine%20-%20API%20Project + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Date: + - Thu, 08 Oct 2020 23:04:55 GMT + Server: + - Apache + X-Slack-Req-Id: + - 8caec83aca74c3d63474cb9ed0636710 + X-Oauth-Scopes: + - chat:write,channels:read,users:read,chat:write.customize + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + Access-Control-Allow-Origin: + - "*" + X-Slack-Backend: + - r + X-Content-Type-Options: + - nosniff + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - chat:write + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, + x-b3-sampled, x-b3-flags + Vary: + - Accept-Encoding + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Content-Length: + - '269' + Content-Type: + - application/json; charset=utf-8 + X-Via: + - haproxy-www-cyj4,haproxy-edge-pdx-rj19 + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channel":"C01BKP67695","ts":"1602198295.002100","message":{"type":"message","subtype":"bot_message","text":"Hello, + Random Channel!","ts":"1602198295.002100","username":"Earth - Jasmine - API + Project","icons":{"emoji":":grinning:","image_64":"https:\/\/a.slack-edge.com\/80588\/img\/emoji_2017_12_06\/apple\/1f600.png"},"bot_id":"B01CQBDFDH6"}}' + recorded_at: Thu, 08 Oct 2020 23:04:55 GMT +- request: + method: post + uri: https://slack.com/api/chat.postMessage + body: + encoding: UTF-8 + string: token=&text=Hello%2C%20Random%20Channel%21&channel=C01BKP67695&icon_emoji=%3Akissing_heart%3A&username=murder_bot + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Date: + - Thu, 08 Oct 2020 23:06:30 GMT + Server: + - Apache + X-Slack-Req-Id: + - 2f3f6e342f2eb56a3a9e4273e84213fb + X-Oauth-Scopes: + - chat:write,channels:read,users:read,chat:write.customize + Access-Control-Expose-Headers: + - x-slack-req-id, retry-after + Access-Control-Allow-Origin: + - "*" + X-Slack-Backend: + - r + X-Content-Type-Options: + - nosniff + Expires: + - Mon, 26 Jul 1997 05:00:00 GMT + Cache-Control: + - private, no-cache, no-store, must-revalidate + X-Xss-Protection: + - '0' + X-Accepted-Oauth-Scopes: + - chat:write + Access-Control-Allow-Headers: + - slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, + x-b3-sampled, x-b3-flags + Vary: + - Accept-Encoding + Pragma: + - no-cache + Strict-Transport-Security: + - max-age=31536000; includeSubDomains; preload + Referrer-Policy: + - no-referrer + Content-Length: + - '256' + Content-Type: + - application/json; charset=utf-8 + X-Via: + - haproxy-www-h4fh,haproxy-edge-pdx-1g64 + body: + encoding: ASCII-8BIT + string: '{"ok":true,"channel":"C01BKP67695","ts":"1602198390.002200","message":{"type":"message","subtype":"bot_message","text":"Hello, + Random Channel!","ts":"1602198390.002200","username":"murder_bot","icons":{"emoji":":kissing_heart:","image_64":"https:\/\/a.slack-edge.com\/80588\/img\/emoji_2017_12_06\/apple\/1f618.png"},"bot_id":"B01CQBDFDH6"}}' + recorded_at: Thu, 08 Oct 2020 23:06:30 GMT recorded_with: VCR 6.0.0 From cde04a01dfc1ec0828ccb7f497144c91e43c3623 Mon Sep 17 00:00:00 2001 From: Ringo Alcock Date: Thu, 8 Oct 2020 17:41:27 -0700 Subject: [PATCH 25/26] refactor list method and write tests --- lib/workspace.rb | 6 ++---- test/workspace_test.rb | 47 +++++++++++++++++++++++++++++------------- 2 files changed, 35 insertions(+), 18 deletions(-) diff --git a/lib/workspace.rb b/lib/workspace.rb index 3d89252f..c9269f38 100644 --- a/lib/workspace.rb +++ b/lib/workspace.rb @@ -16,11 +16,9 @@ def initialize def list(thing_to_print) if thing_to_print == "users" - printable_users = @users.map { |user| { "User Name" => user.username, "Real Name" => user.real_name, "Slack ID" => user.slack_id} } - return printable_users + return [@users, :slack_id, :real_name, :username] elsif thing_to_print == "channels" - printable_users = @channels.map { |channel| {"Channel Name" => channel.name, "Member Count" => channel.member_count, "Slack ID" => channel.slack_id, "Topic" => channel.topic} } - return printable_users + return [@channels, :name, :member_count, :slack_id, :topic] end end diff --git a/test/workspace_test.rb b/test/workspace_test.rb index 0cec74a5..89e3dc72 100644 --- a/test/workspace_test.rb +++ b/test/workspace_test.rb @@ -2,23 +2,18 @@ describe "Workspace" do describe "initialize" do - it "makes a workspace with the correct variables" do - VCR.use_cassette("workspace_get") do - @fake_workspace = Workspace.new - - expect(@fake_workspace).must_be_instance_of Workspace - expect(@fake_workspace.users).must_be_instance_of Array - expect(@fake_workspace.channels).must_be_instance_of Array - end - end - end - - describe "list" do before do VCR.use_cassette("workspace_get") do @workspace = Workspace.new end end + + it "makes a workspace with the correct variables" do + expect(@workspace).must_be_instance_of Workspace + expect(@workspace.users).must_be_instance_of Array + expect(@workspace.channels).must_be_instance_of Array + end + it "check first user in workspace.users is correct" do first_user = @workspace.users.first expect(first_user.username).must_equal "slackbot" @@ -54,6 +49,30 @@ end end + describe "list" do + before do + VCR.use_cassette("workspace_get") do + @workspace = Workspace.new + end + end + + it "returns an array" do + expect(@workspace.list("users")).must_be_kind_of Array + expect(@workspace.list("channels")).must_be_kind_of Array + end + + it "returns the correct headers" do + expect(@workspace.list("channels")).must_include :name + expect(@workspace.list("channels")).must_include :member_count + expect(@workspace.list("channels")).must_include :slack_id + expect(@workspace.list("channels")).must_include :topic + + expect(@workspace.list("users")).must_include :slack_id + expect(@workspace.list("users")).must_include :real_name + expect(@workspace.list("users")).must_include :username + end + end + describe "select user/channel" do before do VCR.use_cassette("workspace_get") do @@ -94,9 +113,9 @@ end it "assigns the requested user to the @selected instance variable" do - @workspace.select("user", input: "slack_shack_ringo_api") + @workspace.select("user", input: "slackbot") - expect(@workspace.selected.username).must_equal "slack_shack_ringo_api" + expect(@workspace.selected.username).must_equal "slackbot" expect(@workspace.selected).must_be_kind_of User end From ba4e7ffd8c5d54e967bbd948f70f3e5742459b70 Mon Sep 17 00:00:00 2001 From: Ringo Alcock Date: Thu, 8 Oct 2020 17:42:29 -0700 Subject: [PATCH 26/26] minor clean up --- bot-settings.json | 1 - lib/recipient.rb | 13 +++++-------- lib/slack.rb | 19 +++++++++++++------ test/channel_test.rb | 4 ++-- test/user_test.rb | 4 ++-- 5 files changed, 22 insertions(+), 19 deletions(-) diff --git a/bot-settings.json b/bot-settings.json index b551a517..e69de29b 100644 --- a/bot-settings.json +++ b/bot-settings.json @@ -1 +0,0 @@ -{"icon_emoji":":kissing_heart:","username":"murder_bot"} \ No newline at end of file diff --git a/lib/recipient.rb b/lib/recipient.rb index f1165795..89f0089b 100644 --- a/lib/recipient.rb +++ b/lib/recipient.rb @@ -7,9 +7,7 @@ class Recipient attr_reader :slack_id - # GET_BASE_URL = "https://slack.com/api/" - # MESSAGE_BASE_URL = - # # child classes will append their own url suffixes + KEY = ENV["SLACK_TOKEN"] def initialize(slack_id) @@ -18,8 +16,7 @@ def initialize(slack_id) def self.get(url, parameters: { token: KEY } ) response = HTTParty.get(url, query: parameters ) - raise SlackApiError unless response['ok'] - + raise SlackApiError, "Error when getting info from #{url}" unless response['ok'] return response end @@ -39,15 +36,15 @@ def post(message) response = HTTParty.post(post_url, body: body) - raise SlackApiError unless response['ok'] + raise SlackApiError, "Error when posting #{message}" unless response['ok'] return "Your message was delivered!" end def self.list - raise NotImplementedError + raise NotImplementedError, "Call me in a child class" end def details - raise NotImplementedError + raise NotImplementedError, "Call me in a child class" end end \ No newline at end of file diff --git a/lib/slack.rb b/lib/slack.rb index 706cc5c8..f31588de 100755 --- a/lib/slack.rb +++ b/lib/slack.rb @@ -9,8 +9,8 @@ def main puts "Welcome to the Ada Slack CLI!".colorize(:light_yellow) workspace = Workspace.new + tp.set :max_width, 200 - #puts load information (number of users and channels, etc) puts "There are #{workspace.users.length} users and #{workspace.channels.length} channels".colorize(:light_yellow) options = "\nWhat would you like to do?\n— list users\n— list channels\n— select user\n— select channel\n— details\n- send message\n- customize bot\n— quit\n".colorize(:light_green) @@ -22,10 +22,13 @@ def main puts case user_input + when "list users" - tp workspace.list("users") + tp *workspace.list("users") + when "list channels" - tp workspace.list("channels") + tp *workspace.list("channels") + when "select user" puts "please enter user slack ID or username" input = gets.chomp @@ -35,6 +38,7 @@ def main else puts "we could not find that user" end + when "select channel" puts "please enter channel slack ID or name" input = gets.chomp @@ -44,16 +48,19 @@ def main else puts "we could not find that channel" end + when "details" puts workspace.details + when "send message" if workspace.is_selected? puts "what message would you like to send?" text = gets.chomp puts workspace.send_message(text) else - puts workspace.send_message("I didn't pick a user/channel D:") + puts "Please select user or channel, first." end + when "customize bot" puts "what would you like to name the bot?" username = gets.chomp @@ -61,8 +68,10 @@ def main emoji = gets.chomp workspace.customize_bot(username, emoji) puts "enjoy your power to change the names and faces of others" + when "quit" break + else puts "I told you your options, buddy... try again.".colorize(:light_magenta) end @@ -72,5 +81,3 @@ def main end main if __FILE__ == $PROGRAM_NAME - -# TODO look into soft wrap or continue on new line for table_print \ No newline at end of file diff --git a/test/channel_test.rb b/test/channel_test.rb index 0a57cbd1..2f0778bd 100644 --- a/test/channel_test.rb +++ b/test/channel_test.rb @@ -36,7 +36,7 @@ describe "details" do before do - @channel = Channel.new("34839", "Name", "a place where human beings talk about things", 10) + @channel = Channel.new("C01BKP67695", "random", "This channel is for... well, everything else. It’s a place for team jokes, spur-of-the-moment ideas, and funny GIFs. Go wild!", 3) end it "returns an instance of string" do @@ -44,7 +44,7 @@ end it "returns accurate details for an specific user" do - output = "Name: Name\nSlack ID: 34839\nMember Count: 10\nTopic: a place where human beings talk about things" + output = "Name: random\nSlack ID: C01BKP67695\nMember Count: 3\nTopic: This channel is for... well, everything else. It’s a place for team jokes, spur-of-the-moment ideas, and funny GIFs. Go wild!" expect(@channel.details).must_equal output end end diff --git a/test/user_test.rb b/test/user_test.rb index ddba0ca7..9529c3da 100644 --- a/test/user_test.rb +++ b/test/user_test.rb @@ -39,7 +39,7 @@ describe "details" do before do - @user = User.new("34839", "Name", "Real Name", "status text", ":thumbsup:" ) + @user = User.new("USLACKBOT", "slackbot", "Slackbot", "", "" ) end it "returns an instance of string" do @@ -47,7 +47,7 @@ end it "returns accurate details for an specific user" do - output = "Username: Name\nReal Name: Real Name\nSlack ID: 34839\nStatus: status text\nStatus Emoji: :thumbsup:" + output = "Username: slackbot\nReal Name: Slackbot\nSlack ID: USLACKBOT\nStatus: \nStatus Emoji: " expect(@user.details).must_equal output end end