From 2d465d279d58fdd529cfaf9724a72040c261a869 Mon Sep 17 00:00:00 2001 From: Altynbek Orumbayev Date: Fri, 31 Jan 2025 01:08:18 +0100 Subject: [PATCH 1/3] chore: wip --- .../artifacts/base_d_asa/base_d_asa_client.py | 220 +- .../fixed_coupon_bond_client.py | 242 +- .../perpetual_bond/perpetual_bond_client.py | 242 +- .../zero_coupon_bond_client.py | 220 +- .../base_d_asa/BaseDAsa.approval.puya.map | 13963 ++++++++++++++++ .../base_d_asa/BaseDAsa.approval.teal | 2857 ++++ .../base_d_asa/BaseDAsa.arc32.json | 756 + .../base_d_asa/BaseDAsa.clear.puya.map | 25 + .../base_d_asa/BaseDAsa.clear.teal | 7 + tests/base_d_asa/conftest.py | 17 +- tests/base_d_asa/test_asset_config.py | 34 +- tests/base_d_asa/test_asset_create.py | 36 +- tests/base_d_asa/test_asset_update.py | 14 +- tests/base_d_asa/test_get_time_events.py | 15 +- tests/base_d_asa/test_open_account.py | 93 +- 15 files changed, 18203 insertions(+), 538 deletions(-) create mode 100644 smart_contracts/base_d_asa/BaseDAsa.approval.puya.map create mode 100644 smart_contracts/base_d_asa/BaseDAsa.approval.teal create mode 100644 smart_contracts/base_d_asa/BaseDAsa.arc32.json create mode 100644 smart_contracts/base_d_asa/BaseDAsa.clear.puya.map create mode 100644 smart_contracts/base_d_asa/BaseDAsa.clear.teal diff --git a/smart_contracts/artifacts/base_d_asa/base_d_asa_client.py b/smart_contracts/artifacts/base_d_asa/base_d_asa_client.py index 28bc0d2..3a48257 100644 --- a/smart_contracts/artifacts/base_d_asa/base_d_asa_client.py +++ b/smart_contracts/artifacts/base_d_asa/base_d_asa_client.py @@ -1054,145 +1054,165 @@ def get_all(self) -> GlobalStateValue: ) return typing.cast(GlobalStateValue, converted) + @property def arranger(self) -> bytes: - """Get the current value of the arranger key in global_state state""" - value = self.app_client.state.global_state.get_value("arranger") - if isinstance(value, dict) and "AVMBytes" in self._struct_classes: - return self._struct_classes["AVMBytes"](**value) # type: ignore - return typing.cast(bytes, value) + """Get the current value of the arranger key in global_state state""" + value = self.app_client.state.global_state.get_value("arranger") + if isinstance(value, dict) and "AVMBytes" in self._struct_classes: + return self._struct_classes["AVMBytes"](**value) # type: ignore + return typing.cast(bytes, value) + @property def circulating_units(self) -> int: - """Get the current value of the circulating_units key in global_state state""" - value = self.app_client.state.global_state.get_value("circulating_units") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the circulating_units key in global_state state""" + value = self.app_client.state.global_state.get_value("circulating_units") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def day_count_convention(self) -> int: - """Get the current value of the day_count_convention key in global_state state""" - value = self.app_client.state.global_state.get_value("day_count_convention") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the day_count_convention key in global_state state""" + value = self.app_client.state.global_state.get_value("day_count_convention") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def defaulted(self) -> int: - """Get the current value of the defaulted key in global_state state""" - value = self.app_client.state.global_state.get_value("defaulted") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the defaulted key in global_state state""" + value = self.app_client.state.global_state.get_value("defaulted") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def denomination_asset_id(self) -> int: - """Get the current value of the denomination_asset_id key in global_state state""" - value = self.app_client.state.global_state.get_value("denomination_asset_id") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the denomination_asset_id key in global_state state""" + value = self.app_client.state.global_state.get_value("denomination_asset_id") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def interest_rate(self) -> int: - """Get the current value of the interest_rate key in global_state state""" - value = self.app_client.state.global_state.get_value("interest_rate") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the interest_rate key in global_state state""" + value = self.app_client.state.global_state.get_value("interest_rate") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def issuance_date(self) -> int: - """Get the current value of the issuance_date key in global_state state""" - value = self.app_client.state.global_state.get_value("issuance_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the issuance_date key in global_state state""" + value = self.app_client.state.global_state.get_value("issuance_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def maturity_date(self) -> int: - """Get the current value of the maturity_date key in global_state state""" - value = self.app_client.state.global_state.get_value("maturity_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the maturity_date key in global_state state""" + value = self.app_client.state.global_state.get_value("maturity_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def metadata(self) -> bytes: - """Get the current value of the metadata key in global_state state""" - value = self.app_client.state.global_state.get_value("metadata") - if isinstance(value, dict) and "AVMBytes" in self._struct_classes: - return self._struct_classes["AVMBytes"](**value) # type: ignore - return typing.cast(bytes, value) + """Get the current value of the metadata key in global_state state""" + value = self.app_client.state.global_state.get_value("metadata") + if isinstance(value, dict) and "AVMBytes" in self._struct_classes: + return self._struct_classes["AVMBytes"](**value) # type: ignore + return typing.cast(bytes, value) + @property def primary_distribution_closure_date(self) -> int: - """Get the current value of the primary_distribution_closure_date key in global_state state""" - value = self.app_client.state.global_state.get_value("primary_distribution_closure_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the primary_distribution_closure_date key in global_state state""" + value = self.app_client.state.global_state.get_value("primary_distribution_closure_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def primary_distribution_opening_date(self) -> int: - """Get the current value of the primary_distribution_opening_date key in global_state state""" - value = self.app_client.state.global_state.get_value("primary_distribution_opening_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the primary_distribution_opening_date key in global_state state""" + value = self.app_client.state.global_state.get_value("primary_distribution_opening_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def principal_discount(self) -> int: - """Get the current value of the principal_discount key in global_state state""" - value = self.app_client.state.global_state.get_value("principal_discount") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the principal_discount key in global_state state""" + value = self.app_client.state.global_state.get_value("principal_discount") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def secondary_market_closure_date(self) -> int: - """Get the current value of the secondary_market_closure_date key in global_state state""" - value = self.app_client.state.global_state.get_value("secondary_market_closure_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the secondary_market_closure_date key in global_state state""" + value = self.app_client.state.global_state.get_value("secondary_market_closure_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def secondary_market_opening_date(self) -> int: - """Get the current value of the secondary_market_opening_date key in global_state state""" - value = self.app_client.state.global_state.get_value("secondary_market_opening_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the secondary_market_opening_date key in global_state state""" + value = self.app_client.state.global_state.get_value("secondary_market_opening_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def settlement_asset_id(self) -> int: - """Get the current value of the settlement_asset_id key in global_state state""" - value = self.app_client.state.global_state.get_value("settlement_asset_id") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the settlement_asset_id key in global_state state""" + value = self.app_client.state.global_state.get_value("settlement_asset_id") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def status(self) -> int: - """Get the current value of the status key in global_state state""" - value = self.app_client.state.global_state.get_value("status") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the status key in global_state state""" + value = self.app_client.state.global_state.get_value("status") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def suspended(self) -> int: - """Get the current value of the suspended key in global_state state""" - value = self.app_client.state.global_state.get_value("suspended") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the suspended key in global_state state""" + value = self.app_client.state.global_state.get_value("suspended") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def total_coupons(self) -> int: - """Get the current value of the total_coupons key in global_state state""" - value = self.app_client.state.global_state.get_value("total_coupons") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the total_coupons key in global_state state""" + value = self.app_client.state.global_state.get_value("total_coupons") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def total_units(self) -> int: - """Get the current value of the total_units key in global_state state""" - value = self.app_client.state.global_state.get_value("total_units") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the total_units key in global_state state""" + value = self.app_client.state.global_state.get_value("total_units") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def unit_value(self) -> int: - """Get the current value of the unit_value key in global_state state""" - value = self.app_client.state.global_state.get_value("unit_value") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the unit_value key in global_state state""" + value = self.app_client.state.global_state.get_value("unit_value") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) class BaseDAsaClient: """Client for interacting with BaseDAsa smart contract""" diff --git a/smart_contracts/artifacts/fixed_coupon_bond/fixed_coupon_bond_client.py b/smart_contracts/artifacts/fixed_coupon_bond/fixed_coupon_bond_client.py index 0cdb39a..d04c29b 100644 --- a/smart_contracts/artifacts/fixed_coupon_bond/fixed_coupon_bond_client.py +++ b/smart_contracts/artifacts/fixed_coupon_bond/fixed_coupon_bond_client.py @@ -1397,159 +1397,181 @@ def get_all(self) -> GlobalStateValue: ) return typing.cast(GlobalStateValue, converted) + @property def arranger(self) -> bytes: - """Get the current value of the arranger key in global_state state""" - value = self.app_client.state.global_state.get_value("arranger") - if isinstance(value, dict) and "AVMBytes" in self._struct_classes: - return self._struct_classes["AVMBytes"](**value) # type: ignore - return typing.cast(bytes, value) + """Get the current value of the arranger key in global_state state""" + value = self.app_client.state.global_state.get_value("arranger") + if isinstance(value, dict) and "AVMBytes" in self._struct_classes: + return self._struct_classes["AVMBytes"](**value) # type: ignore + return typing.cast(bytes, value) + @property def circulating_units(self) -> int: - """Get the current value of the circulating_units key in global_state state""" - value = self.app_client.state.global_state.get_value("circulating_units") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the circulating_units key in global_state state""" + value = self.app_client.state.global_state.get_value("circulating_units") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def day_count_convention(self) -> int: - """Get the current value of the day_count_convention key in global_state state""" - value = self.app_client.state.global_state.get_value("day_count_convention") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the day_count_convention key in global_state state""" + value = self.app_client.state.global_state.get_value("day_count_convention") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def defaulted(self) -> int: - """Get the current value of the defaulted key in global_state state""" - value = self.app_client.state.global_state.get_value("defaulted") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the defaulted key in global_state state""" + value = self.app_client.state.global_state.get_value("defaulted") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def denomination_asset_id(self) -> int: - """Get the current value of the denomination_asset_id key in global_state state""" - value = self.app_client.state.global_state.get_value("denomination_asset_id") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the denomination_asset_id key in global_state state""" + value = self.app_client.state.global_state.get_value("denomination_asset_id") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def due_coupons_watermark(self) -> int: - """Get the current value of the due_coupons_watermark key in global_state state""" - value = self.app_client.state.global_state.get_value("due_coupons_watermark") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the due_coupons_watermark key in global_state state""" + value = self.app_client.state.global_state.get_value("due_coupons_watermark") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def interest_rate(self) -> int: - """Get the current value of the interest_rate key in global_state state""" - value = self.app_client.state.global_state.get_value("interest_rate") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the interest_rate key in global_state state""" + value = self.app_client.state.global_state.get_value("interest_rate") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def issuance_date(self) -> int: - """Get the current value of the issuance_date key in global_state state""" - value = self.app_client.state.global_state.get_value("issuance_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the issuance_date key in global_state state""" + value = self.app_client.state.global_state.get_value("issuance_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def maturity_date(self) -> int: - """Get the current value of the maturity_date key in global_state state""" - value = self.app_client.state.global_state.get_value("maturity_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the maturity_date key in global_state state""" + value = self.app_client.state.global_state.get_value("maturity_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def metadata(self) -> bytes: - """Get the current value of the metadata key in global_state state""" - value = self.app_client.state.global_state.get_value("metadata") - if isinstance(value, dict) and "AVMBytes" in self._struct_classes: - return self._struct_classes["AVMBytes"](**value) # type: ignore - return typing.cast(bytes, value) + """Get the current value of the metadata key in global_state state""" + value = self.app_client.state.global_state.get_value("metadata") + if isinstance(value, dict) and "AVMBytes" in self._struct_classes: + return self._struct_classes["AVMBytes"](**value) # type: ignore + return typing.cast(bytes, value) + @property def paid_coupon_units(self) -> int: - """Get the current value of the paid_coupon_units key in global_state state""" - value = self.app_client.state.global_state.get_value("paid_coupon_units") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the paid_coupon_units key in global_state state""" + value = self.app_client.state.global_state.get_value("paid_coupon_units") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def primary_distribution_closure_date(self) -> int: - """Get the current value of the primary_distribution_closure_date key in global_state state""" - value = self.app_client.state.global_state.get_value("primary_distribution_closure_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the primary_distribution_closure_date key in global_state state""" + value = self.app_client.state.global_state.get_value("primary_distribution_closure_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def primary_distribution_opening_date(self) -> int: - """Get the current value of the primary_distribution_opening_date key in global_state state""" - value = self.app_client.state.global_state.get_value("primary_distribution_opening_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the primary_distribution_opening_date key in global_state state""" + value = self.app_client.state.global_state.get_value("primary_distribution_opening_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def principal_discount(self) -> int: - """Get the current value of the principal_discount key in global_state state""" - value = self.app_client.state.global_state.get_value("principal_discount") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the principal_discount key in global_state state""" + value = self.app_client.state.global_state.get_value("principal_discount") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def secondary_market_closure_date(self) -> int: - """Get the current value of the secondary_market_closure_date key in global_state state""" - value = self.app_client.state.global_state.get_value("secondary_market_closure_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the secondary_market_closure_date key in global_state state""" + value = self.app_client.state.global_state.get_value("secondary_market_closure_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def secondary_market_opening_date(self) -> int: - """Get the current value of the secondary_market_opening_date key in global_state state""" - value = self.app_client.state.global_state.get_value("secondary_market_opening_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the secondary_market_opening_date key in global_state state""" + value = self.app_client.state.global_state.get_value("secondary_market_opening_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def settlement_asset_id(self) -> int: - """Get the current value of the settlement_asset_id key in global_state state""" - value = self.app_client.state.global_state.get_value("settlement_asset_id") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the settlement_asset_id key in global_state state""" + value = self.app_client.state.global_state.get_value("settlement_asset_id") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def status(self) -> int: - """Get the current value of the status key in global_state state""" - value = self.app_client.state.global_state.get_value("status") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the status key in global_state state""" + value = self.app_client.state.global_state.get_value("status") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def suspended(self) -> int: - """Get the current value of the suspended key in global_state state""" - value = self.app_client.state.global_state.get_value("suspended") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the suspended key in global_state state""" + value = self.app_client.state.global_state.get_value("suspended") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def total_coupons(self) -> int: - """Get the current value of the total_coupons key in global_state state""" - value = self.app_client.state.global_state.get_value("total_coupons") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the total_coupons key in global_state state""" + value = self.app_client.state.global_state.get_value("total_coupons") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def total_units(self) -> int: - """Get the current value of the total_units key in global_state state""" - value = self.app_client.state.global_state.get_value("total_units") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the total_units key in global_state state""" + value = self.app_client.state.global_state.get_value("total_units") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def unit_value(self) -> int: - """Get the current value of the unit_value key in global_state state""" - value = self.app_client.state.global_state.get_value("unit_value") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the unit_value key in global_state state""" + value = self.app_client.state.global_state.get_value("unit_value") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) class FixedCouponBondClient: """Client for interacting with FixedCouponBond smart contract""" diff --git a/smart_contracts/artifacts/perpetual_bond/perpetual_bond_client.py b/smart_contracts/artifacts/perpetual_bond/perpetual_bond_client.py index 96c7135..c6b298c 100644 --- a/smart_contracts/artifacts/perpetual_bond/perpetual_bond_client.py +++ b/smart_contracts/artifacts/perpetual_bond/perpetual_bond_client.py @@ -1396,159 +1396,181 @@ def get_all(self) -> GlobalStateValue: ) return typing.cast(GlobalStateValue, converted) + @property def arranger(self) -> bytes: - """Get the current value of the arranger key in global_state state""" - value = self.app_client.state.global_state.get_value("arranger") - if isinstance(value, dict) and "AVMBytes" in self._struct_classes: - return self._struct_classes["AVMBytes"](**value) # type: ignore - return typing.cast(bytes, value) + """Get the current value of the arranger key in global_state state""" + value = self.app_client.state.global_state.get_value("arranger") + if isinstance(value, dict) and "AVMBytes" in self._struct_classes: + return self._struct_classes["AVMBytes"](**value) # type: ignore + return typing.cast(bytes, value) + @property def circulating_units(self) -> int: - """Get the current value of the circulating_units key in global_state state""" - value = self.app_client.state.global_state.get_value("circulating_units") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the circulating_units key in global_state state""" + value = self.app_client.state.global_state.get_value("circulating_units") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def coupon_period(self) -> int: - """Get the current value of the coupon_period key in global_state state""" - value = self.app_client.state.global_state.get_value("coupon_period") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the coupon_period key in global_state state""" + value = self.app_client.state.global_state.get_value("coupon_period") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def day_count_convention(self) -> int: - """Get the current value of the day_count_convention key in global_state state""" - value = self.app_client.state.global_state.get_value("day_count_convention") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the day_count_convention key in global_state state""" + value = self.app_client.state.global_state.get_value("day_count_convention") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def defaulted(self) -> int: - """Get the current value of the defaulted key in global_state state""" - value = self.app_client.state.global_state.get_value("defaulted") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the defaulted key in global_state state""" + value = self.app_client.state.global_state.get_value("defaulted") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def denomination_asset_id(self) -> int: - """Get the current value of the denomination_asset_id key in global_state state""" - value = self.app_client.state.global_state.get_value("denomination_asset_id") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the denomination_asset_id key in global_state state""" + value = self.app_client.state.global_state.get_value("denomination_asset_id") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def interest_rate(self) -> int: - """Get the current value of the interest_rate key in global_state state""" - value = self.app_client.state.global_state.get_value("interest_rate") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the interest_rate key in global_state state""" + value = self.app_client.state.global_state.get_value("interest_rate") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def issuance_date(self) -> int: - """Get the current value of the issuance_date key in global_state state""" - value = self.app_client.state.global_state.get_value("issuance_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the issuance_date key in global_state state""" + value = self.app_client.state.global_state.get_value("issuance_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def maturity_date(self) -> int: - """Get the current value of the maturity_date key in global_state state""" - value = self.app_client.state.global_state.get_value("maturity_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the maturity_date key in global_state state""" + value = self.app_client.state.global_state.get_value("maturity_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def metadata(self) -> bytes: - """Get the current value of the metadata key in global_state state""" - value = self.app_client.state.global_state.get_value("metadata") - if isinstance(value, dict) and "AVMBytes" in self._struct_classes: - return self._struct_classes["AVMBytes"](**value) # type: ignore - return typing.cast(bytes, value) + """Get the current value of the metadata key in global_state state""" + value = self.app_client.state.global_state.get_value("metadata") + if isinstance(value, dict) and "AVMBytes" in self._struct_classes: + return self._struct_classes["AVMBytes"](**value) # type: ignore + return typing.cast(bytes, value) + @property def paid_coupon_units(self) -> int: - """Get the current value of the paid_coupon_units key in global_state state""" - value = self.app_client.state.global_state.get_value("paid_coupon_units") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the paid_coupon_units key in global_state state""" + value = self.app_client.state.global_state.get_value("paid_coupon_units") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def primary_distribution_closure_date(self) -> int: - """Get the current value of the primary_distribution_closure_date key in global_state state""" - value = self.app_client.state.global_state.get_value("primary_distribution_closure_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the primary_distribution_closure_date key in global_state state""" + value = self.app_client.state.global_state.get_value("primary_distribution_closure_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def primary_distribution_opening_date(self) -> int: - """Get the current value of the primary_distribution_opening_date key in global_state state""" - value = self.app_client.state.global_state.get_value("primary_distribution_opening_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the primary_distribution_opening_date key in global_state state""" + value = self.app_client.state.global_state.get_value("primary_distribution_opening_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def principal_discount(self) -> int: - """Get the current value of the principal_discount key in global_state state""" - value = self.app_client.state.global_state.get_value("principal_discount") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the principal_discount key in global_state state""" + value = self.app_client.state.global_state.get_value("principal_discount") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def secondary_market_closure_date(self) -> int: - """Get the current value of the secondary_market_closure_date key in global_state state""" - value = self.app_client.state.global_state.get_value("secondary_market_closure_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the secondary_market_closure_date key in global_state state""" + value = self.app_client.state.global_state.get_value("secondary_market_closure_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def secondary_market_opening_date(self) -> int: - """Get the current value of the secondary_market_opening_date key in global_state state""" - value = self.app_client.state.global_state.get_value("secondary_market_opening_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the secondary_market_opening_date key in global_state state""" + value = self.app_client.state.global_state.get_value("secondary_market_opening_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def settlement_asset_id(self) -> int: - """Get the current value of the settlement_asset_id key in global_state state""" - value = self.app_client.state.global_state.get_value("settlement_asset_id") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the settlement_asset_id key in global_state state""" + value = self.app_client.state.global_state.get_value("settlement_asset_id") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def status(self) -> int: - """Get the current value of the status key in global_state state""" - value = self.app_client.state.global_state.get_value("status") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the status key in global_state state""" + value = self.app_client.state.global_state.get_value("status") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def suspended(self) -> int: - """Get the current value of the suspended key in global_state state""" - value = self.app_client.state.global_state.get_value("suspended") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the suspended key in global_state state""" + value = self.app_client.state.global_state.get_value("suspended") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def total_coupons(self) -> int: - """Get the current value of the total_coupons key in global_state state""" - value = self.app_client.state.global_state.get_value("total_coupons") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the total_coupons key in global_state state""" + value = self.app_client.state.global_state.get_value("total_coupons") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def total_units(self) -> int: - """Get the current value of the total_units key in global_state state""" - value = self.app_client.state.global_state.get_value("total_units") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the total_units key in global_state state""" + value = self.app_client.state.global_state.get_value("total_units") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def unit_value(self) -> int: - """Get the current value of the unit_value key in global_state state""" - value = self.app_client.state.global_state.get_value("unit_value") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the unit_value key in global_state state""" + value = self.app_client.state.global_state.get_value("unit_value") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) class PerpetualBondClient: """Client for interacting with PerpetualBond smart contract""" diff --git a/smart_contracts/artifacts/zero_coupon_bond/zero_coupon_bond_client.py b/smart_contracts/artifacts/zero_coupon_bond/zero_coupon_bond_client.py index bbc9702..28e3dbc 100644 --- a/smart_contracts/artifacts/zero_coupon_bond/zero_coupon_bond_client.py +++ b/smart_contracts/artifacts/zero_coupon_bond/zero_coupon_bond_client.py @@ -1266,145 +1266,165 @@ def get_all(self) -> GlobalStateValue: ) return typing.cast(GlobalStateValue, converted) + @property def arranger(self) -> bytes: - """Get the current value of the arranger key in global_state state""" - value = self.app_client.state.global_state.get_value("arranger") - if isinstance(value, dict) and "AVMBytes" in self._struct_classes: - return self._struct_classes["AVMBytes"](**value) # type: ignore - return typing.cast(bytes, value) + """Get the current value of the arranger key in global_state state""" + value = self.app_client.state.global_state.get_value("arranger") + if isinstance(value, dict) and "AVMBytes" in self._struct_classes: + return self._struct_classes["AVMBytes"](**value) # type: ignore + return typing.cast(bytes, value) + @property def circulating_units(self) -> int: - """Get the current value of the circulating_units key in global_state state""" - value = self.app_client.state.global_state.get_value("circulating_units") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the circulating_units key in global_state state""" + value = self.app_client.state.global_state.get_value("circulating_units") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def day_count_convention(self) -> int: - """Get the current value of the day_count_convention key in global_state state""" - value = self.app_client.state.global_state.get_value("day_count_convention") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the day_count_convention key in global_state state""" + value = self.app_client.state.global_state.get_value("day_count_convention") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def defaulted(self) -> int: - """Get the current value of the defaulted key in global_state state""" - value = self.app_client.state.global_state.get_value("defaulted") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the defaulted key in global_state state""" + value = self.app_client.state.global_state.get_value("defaulted") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def denomination_asset_id(self) -> int: - """Get the current value of the denomination_asset_id key in global_state state""" - value = self.app_client.state.global_state.get_value("denomination_asset_id") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the denomination_asset_id key in global_state state""" + value = self.app_client.state.global_state.get_value("denomination_asset_id") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def interest_rate(self) -> int: - """Get the current value of the interest_rate key in global_state state""" - value = self.app_client.state.global_state.get_value("interest_rate") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the interest_rate key in global_state state""" + value = self.app_client.state.global_state.get_value("interest_rate") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def issuance_date(self) -> int: - """Get the current value of the issuance_date key in global_state state""" - value = self.app_client.state.global_state.get_value("issuance_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the issuance_date key in global_state state""" + value = self.app_client.state.global_state.get_value("issuance_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def maturity_date(self) -> int: - """Get the current value of the maturity_date key in global_state state""" - value = self.app_client.state.global_state.get_value("maturity_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the maturity_date key in global_state state""" + value = self.app_client.state.global_state.get_value("maturity_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def metadata(self) -> bytes: - """Get the current value of the metadata key in global_state state""" - value = self.app_client.state.global_state.get_value("metadata") - if isinstance(value, dict) and "AVMBytes" in self._struct_classes: - return self._struct_classes["AVMBytes"](**value) # type: ignore - return typing.cast(bytes, value) + """Get the current value of the metadata key in global_state state""" + value = self.app_client.state.global_state.get_value("metadata") + if isinstance(value, dict) and "AVMBytes" in self._struct_classes: + return self._struct_classes["AVMBytes"](**value) # type: ignore + return typing.cast(bytes, value) + @property def primary_distribution_closure_date(self) -> int: - """Get the current value of the primary_distribution_closure_date key in global_state state""" - value = self.app_client.state.global_state.get_value("primary_distribution_closure_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the primary_distribution_closure_date key in global_state state""" + value = self.app_client.state.global_state.get_value("primary_distribution_closure_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def primary_distribution_opening_date(self) -> int: - """Get the current value of the primary_distribution_opening_date key in global_state state""" - value = self.app_client.state.global_state.get_value("primary_distribution_opening_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the primary_distribution_opening_date key in global_state state""" + value = self.app_client.state.global_state.get_value("primary_distribution_opening_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def principal_discount(self) -> int: - """Get the current value of the principal_discount key in global_state state""" - value = self.app_client.state.global_state.get_value("principal_discount") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the principal_discount key in global_state state""" + value = self.app_client.state.global_state.get_value("principal_discount") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def secondary_market_closure_date(self) -> int: - """Get the current value of the secondary_market_closure_date key in global_state state""" - value = self.app_client.state.global_state.get_value("secondary_market_closure_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the secondary_market_closure_date key in global_state state""" + value = self.app_client.state.global_state.get_value("secondary_market_closure_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def secondary_market_opening_date(self) -> int: - """Get the current value of the secondary_market_opening_date key in global_state state""" - value = self.app_client.state.global_state.get_value("secondary_market_opening_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the secondary_market_opening_date key in global_state state""" + value = self.app_client.state.global_state.get_value("secondary_market_opening_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def settlement_asset_id(self) -> int: - """Get the current value of the settlement_asset_id key in global_state state""" - value = self.app_client.state.global_state.get_value("settlement_asset_id") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the settlement_asset_id key in global_state state""" + value = self.app_client.state.global_state.get_value("settlement_asset_id") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def status(self) -> int: - """Get the current value of the status key in global_state state""" - value = self.app_client.state.global_state.get_value("status") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the status key in global_state state""" + value = self.app_client.state.global_state.get_value("status") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def suspended(self) -> int: - """Get the current value of the suspended key in global_state state""" - value = self.app_client.state.global_state.get_value("suspended") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the suspended key in global_state state""" + value = self.app_client.state.global_state.get_value("suspended") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def total_coupons(self) -> int: - """Get the current value of the total_coupons key in global_state state""" - value = self.app_client.state.global_state.get_value("total_coupons") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the total_coupons key in global_state state""" + value = self.app_client.state.global_state.get_value("total_coupons") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def total_units(self) -> int: - """Get the current value of the total_units key in global_state state""" - value = self.app_client.state.global_state.get_value("total_units") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the total_units key in global_state state""" + value = self.app_client.state.global_state.get_value("total_units") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + @property def unit_value(self) -> int: - """Get the current value of the unit_value key in global_state state""" - value = self.app_client.state.global_state.get_value("unit_value") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + """Get the current value of the unit_value key in global_state state""" + value = self.app_client.state.global_state.get_value("unit_value") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) class ZeroCouponBondClient: """Client for interacting with ZeroCouponBond smart contract""" diff --git a/smart_contracts/base_d_asa/BaseDAsa.approval.puya.map b/smart_contracts/base_d_asa/BaseDAsa.approval.puya.map new file mode 100644 index 0000000..c84c203 --- /dev/null +++ b/smart_contracts/base_d_asa/BaseDAsa.approval.puya.map @@ -0,0 +1,13963 @@ +{ + "version": 3, + "sources": [ + "contract.py" + ], + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCmD;;AAAf;;AAA5B;AAkBA;;AAA6B;AAA7B;AACA;;AAA2B;AAA3B;AACA;;AAAkB;AAAlB;AACA;;AAA4B;AAA5B;AAGA;;AAAgB;;AAAhB;AAGA;;AAAmB;AAAnB;AACA;AAAyB;AAAzB;AAGA;;AAA0B;AAA1B;AAGA;;AAAqB;AAArB;AAIA;;AAAqB;AAArB;AAKA;;AAAyC;AAAzC;AACA;;AAAyC;AAAzC;AACA;;AAAqB;AAArB;AACA;;AAAqC;AAArC;AACA;;AAAqC;AAArC;AACA;AAAqB;AAArB;AAGA;AAAc;AAAd;AACA;;AAAiB;AAAjB;AACA;;AAAiB;AAAjB;AAnER;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AAw7BK;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAbA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAbA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAjBA;;AAAA;AAAA;AAAA;;AAAA;AA74BL;;;AA64BK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAvCA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAdA;;AAAA;AAAA;AAAA;;AAAA;AAx1BL;;;AAw1BK;;;AAAA;;AAvBA;;AAAA;AAAA;AAAA;;AAAA;AAj0BL;;;AAAA;;;AAi0BK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAlBA;;AAAA;AAAA;AAAA;;AAAA;AA/yBL;;;AA+yBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA1CA;;AAAA;AAAA;AAAA;;AAAA;AArwBL;;;AAAA;;;AAqwBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA9BA;;AAAA;AAAA;AAAA;;AAAA;AAvuBL;;;AAuuBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAnCA;;AAAA;AAAA;AAAA;;AAAA;AApsBL;;;AAAA;;;AAosBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAhDA;;AAAA;AAAA;AAAA;;AAAA;AAppBL;;;AAAA;;;AAopBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA/DA;;AAAA;AAAA;AAAA;;AAAA;AArlBL;;;AAAA;;;AAAA;;;AAqlBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAxDA;;AAAA;AAAA;AAAA;;AAAA;AA7hBL;;;AA6hBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AArFA;;AAAA;AAAA;AAAA;;AAAA;AAxcL;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAwcK;;;AAAA;;AAXA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AA7bL;;;AA6bK;;;AAAA;;AAZA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAjbL;;;AAAA;;;AAibK;;;AAAA;;AAAL;;;AASQ;;AAAA;;AAAA;AACA;;AAAA;;AAAA;;AAER;;;AAQQ;;;AACA;;AAAA;;AAAA;;AA5WR;;;AAEe;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAP;;AA4WR;;;;;;;;AA2CQ;;;AACO;AAAA;AAAA;AAAA;AAAA;AAAP;AAG+B;;AAAA;AAAA;AA/V3B;;;AAAuC;;AAAA;;AAAA;AAAA;;AAAA;AAAvC;;;;AADJ;AAMA;;AAAA;;AAAA;AA8V6B;;AAAA;AAxVF;AAAA;;AAAA;AAAA;AAAvB;;AAAA;AADJ;AAMA;;AAAA;AAAA;AAEA;AAIQ;;AAHO;AAAA;;AAAA;AAAA;AACI;;AACF;;;;;;;AAHjB;;;;;AAAA;AAsVI;;AAAA;AAAmB;;AAAA;AAAnB;AAAA;AAAA;AADJ;AAGA;;AAAA;;AAAA;AACmB;AAAnB;;AAAA;AAAA;AAC0B;;AAAA;AAA1B;;AAAA;AAAA;AAGiC;;AAAA;AAAA;AAAA;;AAnV1B;;;AAAA;;AAEH;;;AAFG;AAAA;;;;AAAP;AAOA;;AAAA;;AAAA;AAgV0B;;AAAA;AAAA;;AA3UnB;AAAA;;AAAA;AAAA;AAAf;;;AACY;;AAAA;AAIJ;;AAAA;;AAAA;AAIW;;AAAA;AAAA;AAAJ;AAAA;AAAP;AAIA;;AAAA;AAAA;AACG;AAAA;;AAAA;AAAA;AAAX;;;AACY;;AAAA;;AAAA;;AAAA;;AAAA;AAKA;;AAAA;AAAA;AAAsB;AAAA;;AAAA;AAAA;AAAqB;AAArB;AAAtB;AADJ;AAiUA;;AAAA;;;AAAA;;AAvSA;;AAAA;;AAAA;;AAAA;;AAAA;AACyC;;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAzC;;AAAA;AAAA;AAGyC;AAAA;;;AAAA;AAAzC;;AAAA;AAAA;AAGqB;;;AAAA;AAArB;;AAAA;AAAA;AAGG;;AAAA;AAAA;AAAA;AAAA;;AAAsB;AAAA;;AAAA;AAAA;AAAqB;AAArB;AAAtB;AAAX;;;AACiC;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAArB;AAAA;AAAA;AAIO;;AAAA;AAAA;AAAJ;AAAP;AA+RA;AAAc;;AAAd;;;;;;;;;;AApUR;;;;;;AAGY;;AAAA;;;AAAA;AAAA;;;AAAA;AACE;;AADF;AADJ;AAIiB;;AAAA;AAAA;AAAqB;AAArB;AAAP;AAAA;;AAAA;;AAAA;AAAlB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKqB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAT;AAAA;;AAAA;;AAC0B;AAAL;AAAA;AAAA;;AAAZ;AAAA;AAAA;AAAA;AAAA;AAAT;AAAA;;AACO;AAAP;AACG;AAAA;;AAAA;AAAA;AAA6B;;;AAA7B;AAAf;;;AAEwB;;AAAA;;AAAA;AAAmB;;;;AAApB;AAAA;AAAP;;;;;;;;;AAsThB;;;;AAqBQ;;;AAleO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAmeA;AAAP;AACA;;;AAEO;;AAAA;AAAA;AAAP;AAAA;AACyC;AAAtC;;;;AAAX;;;AACY;;AAAA;;;;AAAA;;;;;;;;AAEA;AAAA;;AAAA;AAAA;AACG;;AAAA;;;AAAA;AAAA;;AAAA;;;AAAA;AADH;AAAA;;AAAA;AADJ;AAMA;;AAAA;AAAA;AAGG;AAAA;AAAA;AAAA;AAAX;;;AAEgB;AAAA;AAAA;AAAA;AAEI;;AAAA;AAAA;AADD;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AADH;AAAA;;AAAA;AADJ;AAMA;;AAAA;AAAA;AAKI;AAAA;;AAAA;AAAA;AAD0B;AAI1B;AAAA;;AAAA;AAAA;AAD0B;AAJ3B;AAAP;;AAAA;AA1fR;;;AAEmB;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAigBR;;;AAqBQ;;;AACA;;;AACO;;AAAA;AAAA;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;;AAAP;AASS;;;;;;;;AADT;;AAAA;;;;;;;;;;;;;;AA6BQ;AANwB;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AADJ;AAII;;AAAA;;;AADJ;AAKW;;AAAZ;AAAP;AAAA;AAXmC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACyD;;AAAA;;;AAAzD;;;;AAJ2B;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACuD;;AAAA;;;AAAvD;;;;AAN2B;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAEI;;AAAA;;;AADJ;;;;AAPwB;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AADJ;AAII;;AAAA;;;AADJ;;;;AALA;;AAAA;;AAAA;;;;;;;;AA8BhB;;;AAkBQ;;;AACA;;;AACO;;AAAA;AAAA;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;;AAAP;AASS;;;;;;;AAFT;;AAAA;;;;;;;;;;;;AAkBQ;AAHuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAGW;;AAAZ;AAAP;AAAA;AAP+B;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAJuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAJuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAJuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;;;;;AAiBhB;;;AAoBQ;;;AAxoBO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAyoBA;AAAP;AACA;;;AACA;;;AAC8B;;AAAvB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAEgC;;AAEtB;;AAFsB;AAGjB;;AAHiB;AAIf;;AAJe;AAKlB;;;AALkB;AAAhC;AAOmB;;AAAZ;AAAP;AAvoBR;;;;AAIsB;;AAFQ;;AAElB;AAAA;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;;;;;;AAXR;;;AAEmB;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AA+oBR;;;AAkBQ;;;AACA;;;AAxmB0B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AA2mBe;AAAA;AAAA;AAAA;;;AAAA;AAAf;AAAA;;AACA;;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA7aG;AAAA;AAAA;AAAA;AAAX;;;AACY;AAAc;;AAAd;AA+aC;;AAAA;AAAuC;;AAAZ;AADzB;AAAP;AAAA;AAIR;;;;;;;AAzrBe;AAAA;AAAA;AAAA;AAAe;;AAAf;AAyLH;;;AACI;AAAA;;AAAA;AAAA;AACD;;AAAA;AAAA;;AADC;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AADC;;AAAA;AADC;;;;AAFR;AAxJc;;AAFQ;;AAElB;AAAA;AAAA;;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;AAuC0B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AA+oBA;;;AACA;;;AACO;;AAAA;AAAP;AAAA;AAEI;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAyC;AAAA;;AAAA;AAAA;AAAzC;AADJ;AAIA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAEI;;AAAA;AAAA;AAAA;;;AAAA;AAAA;AADkC;AAAtC;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAGuD;AAAA;;AAAA;AAAA;AAAZ;AAA3C;;AAAA;AAAA;AAAA;AAAA;;AAAA;AACmB;AAAA;;AAAA;AAAA;AAAmB;AAAA;AAAA;AAAA;AAAnB;AAAZ;AAAP;;AAAA;;;;;;;;;AAER;;;AAcQ;;;AACiB;;;AAAO;AAAxB;;AAAA;AAAA;AACmB;;AAAZ;AAAP;AAnsBR;;;;AAIsB;;AAFQ;;AAElB;AAAA;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;;;;;;AAksBR;;;AAkBQ;;;AAjsB0B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAmsBA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AACmB;;AAAZ;AAAP;AAER;;;;AAluBsB;;AAFQ;;AAElB;AAAA;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;AA+uBiB;;;AAAO;AAAxB;;AAAA;AAAA;;;;;;AAER;;;AAUsB;AAAd;AACG;;AAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAA1B;AAAA;;;;;;;AAAA;;AAAA;;;AACe;;;;;;;AAEf;AAAA;;AAAA;AAAA;AAAX;;;AAC0B;;AAAd;;AAGkC;AAAA;;AAAA;AAAA;AAAZ;AACU;AAAA;;AAAA;AAAA;AAAZ;AAjkBjB;AAAA;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;AAkkBmB;AACC;AAAA;;AAAA;AAAA;AAAZ;AACqB;AAAA;;AAAA;AAAA;AAAX;AAAA;;;AACU;AAAA;;AAAA;AAAA;AAAZ;AAAA;;;AACO;AAAA;;AAAA;AAAA;AAAZ;AAAA;;;AACW;AAAA;;AAAA;AAAA;AAAZ;AACkB;AAAA;AAAA;AAAA;AAAZ;AAEf;AAAA;;AAAA;AAAA;AAD8B;AAI9B;AAAA;;AAAA;AAAA;AAD8B;AAGR;AAAA;;AAAA;AAAA;AAAZ;AACY;AAAA;AAAA;AAAA;AAAZ;AACW;AAAA;;AAAA;AAAA;AAAf;;;AAAA;AAAA;;AAAA;AACE;;AAAA;AAAA;;;AAnBT;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAP;;AAAA;AAsBR;;;AA3vBkC;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AA0wBO;AAAA;AAAP;AAER;;;AAQsB;;;;AA11BP;AAAA;AAAA;AAAA;AAAe;;AAAf;AA21Bf;;;AAC0B;;AAAA;AAAA;AAAA;;AAAA;AAClB;;AAAA;AAAA;AAER;;;AASwB;AAAA;;AAAA;AAAA;AAAZ;AACY;AAAA;;AAAA;AAAA;AAAZ;AAFG;AAAA;;;;AAAA;AAAA;AAAP;AAKR;;;AAS4C;AAAA;;AAAA;AAAA;AAApC", + "op_pc_offset": 0, + "pc_events": { + "1": { + "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.__algopy_entrypoint_with_init", + "params": {}, + "block": "main", + "stack_in": [], + "op": "intcblock 0 1 8 4 200" + }, + "9": { + "op": "bytecblock 0x151f7c75 \"circulating_units\" \"status\" \"maturity_date\" \"unit_value\" \"total_units\" \"total_coupons\" 0x52333023 0x52323023 \"denomination_asset_id\" \"settlement_asset_id\" \"day_count_convention\" \"metadata\" \"principal_discount\" \"primary_distribution_opening_date\" \"primary_distribution_closure_date\" \"issuance_date\" \"secondary_market_opening_date\" \"secondary_market_closure_date\" \"suspended\" \"defaulted\" \"interest_rate\" 0x74696d654576656e7473 0x52373023 0x52363023 0x52353023 0x52343023 0x0000000000000000 0x636f75706f6e5261746573 0x068101 0x52383023" + }, + "430": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "432": { + "op": "bnz main_after_if_else@2", + "stack_out": [] + }, + "435": { + "op": "bytec 8 // 0x52323023" + }, + "437": { + "op": "global ZeroAddress" + }, + "439": { + "op": "app_global_put" + }, + "440": { + "op": "bytec 9 // \"denomination_asset_id\"" + }, + "442": { + "op": "intc_0 // 0" + }, + "443": { + "op": "app_global_put" + }, + "444": { + "op": "bytec 10 // \"settlement_asset_id\"" + }, + "446": { + "op": "intc_0 // 0" + }, + "447": { + "op": "app_global_put" + }, + "448": { + "op": "bytec 4 // \"unit_value\"" + }, + "450": { + "op": "intc_0 // 0" + }, + "451": { + "op": "app_global_put" + }, + "452": { + "op": "bytec 11 // \"day_count_convention\"" + }, + "454": { + "op": "intc_0 // 0" + }, + "455": { + "op": "app_global_put" + }, + "456": { + "op": "bytec 12 // \"metadata\"" + }, + "458": { + "op": "pushbytes 0x" + }, + "460": { + "op": "app_global_put" + }, + "461": { + "op": "bytec 5 // \"total_units\"" + }, + "463": { + "op": "intc_0 // 0" + }, + "464": { + "op": "app_global_put" + }, + "465": { + "op": "bytec_1 // \"circulating_units\"" + }, + "466": { + "op": "intc_0 // 0" + }, + "467": { + "op": "app_global_put" + }, + "468": { + "op": "bytec 13 // \"principal_discount\"" + }, + "470": { + "op": "intc_0 // 0" + }, + "471": { + "op": "app_global_put" + }, + "472": { + "op": "bytec 21 // \"interest_rate\"" + }, + "474": { + "op": "intc_0 // 0" + }, + "475": { + "op": "app_global_put" + }, + "476": { + "op": "bytec 6 // \"total_coupons\"" + }, + "478": { + "op": "intc_0 // 0" + }, + "479": { + "op": "app_global_put" + }, + "480": { + "op": "bytec 14 // \"primary_distribution_opening_date\"" + }, + "482": { + "op": "intc_0 // 0" + }, + "483": { + "op": "app_global_put" + }, + "484": { + "op": "bytec 15 // \"primary_distribution_closure_date\"" + }, + "486": { + "op": "intc_0 // 0" + }, + "487": { + "op": "app_global_put" + }, + "488": { + "op": "bytec 16 // \"issuance_date\"" + }, + "490": { + "op": "intc_0 // 0" + }, + "491": { + "op": "app_global_put" + }, + "492": { + "op": "bytec 17 // \"secondary_market_opening_date\"" + }, + "494": { + "op": "intc_0 // 0" + }, + "495": { + "op": "app_global_put" + }, + "496": { + "op": "bytec 18 // \"secondary_market_closure_date\"" + }, + "498": { + "op": "intc_0 // 0" + }, + "499": { + "op": "app_global_put" + }, + "500": { + "op": "bytec_3 // \"maturity_date\"" + }, + "501": { + "op": "intc_0 // 0" + }, + "502": { + "op": "app_global_put" + }, + "503": { + "op": "bytec_2 // \"status\"" + }, + "504": { + "op": "intc_0 // 0" + }, + "505": { + "op": "app_global_put" + }, + "506": { + "op": "bytec 19 // \"suspended\"" + }, + "508": { + "op": "intc_0 // 0" + }, + "509": { + "op": "app_global_put" + }, + "510": { + "op": "bytec 20 // \"defaulted\"" + }, + "512": { + "op": "intc_0 // 0" + }, + "513": { + "op": "app_global_put" + }, + "514": { + "block": "main_after_if_else@2", + "stack_in": [], + "op": "txn NumAppArgs", + "defined_out": [ + "tmp%0#2" + ], + "stack_out": [ + "tmp%0#2" + ] + }, + "516": { + "op": "bz main_after_if_else@22", + "stack_out": [] + }, + "519": { + "op": "pushbytess 0x3f0efc6c 0x25dba95b 0x89474134 0x1d6fc255 0xfef74567 0xb8fc1390 0x3d43d1f0 0xebd96b2f 0x6c85e3ee 0xf63ace8d 0xbbcca18a 0x1a7babb4 0x402dba47 0xed02759f 0xfad2173e 0x08efea35 0xe4a5ab54 // method \"asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void\", method \"asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void\", method \"asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void\", method \"set_secondary_time_events(uint64[])(uint64,uint64)\", method \"assign_role(address,uint8,byte[])uint64\", method \"revoke_role(address,uint8)uint64\", method \"open_account(address,address)uint64\", method \"close_account(address)(uint64,uint64)\", method \"primary_distribution(address,uint64)uint64\", method \"set_asset_suspension(bool)uint64\", method \"set_account_suspension(address,bool)uint64\", method \"set_default_status(bool)void\", method \"get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)\", method \"get_account_info(address)(address,uint64,uint64,uint64,bool)\", method \"get_time_events()uint64[]\", method \"get_secondary_market_schedule()uint64[]\", method \"get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)\"" + }, + "606": { + "op": "txna ApplicationArgs 0" + }, + "609": { + "op": "match main_asset_create_route@5 main_asset_update_route@6 main_asset_config_route@7 main_set_secondary_time_events_route@8 main_assign_role_route@9 main_revoke_role_route@10 main_open_account_route@11 main_close_account_route@12 main_primary_distribution_route@13 main_set_asset_suspension_route@14 main_set_account_suspension_route@15 main_set_default_status_route@16 main_get_asset_info_route@17 main_get_account_info_route@18 main_get_time_events_route@19 main_get_secondary_market_schedule_route@20 main_get_asset_metadata_route@21" + }, + "645": { + "block": "main_after_if_else@22", + "stack_in": [], + "op": "intc_0 // 0", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "646": { + "op": "return" + }, + "647": { + "block": "main_get_asset_metadata_route@21", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%120#0" + ], + "stack_out": [ + "tmp%120#0" + ] + }, + "649": { + "op": "!", + "defined_out": [ + "tmp%121#0" + ], + "stack_out": [ + "tmp%121#0" + ] + }, + "650": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "651": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%122#0" + ], + "stack_out": [ + "tmp%122#0" + ] + }, + "653": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "654": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.get_asset_metadata", + "op": "callsub get_asset_metadata", + "defined_out": [ + "tmp%124#0" + ], + "stack_out": [ + "tmp%124#0" + ] + }, + "657": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "tmp%124#0" + ], + "stack_out": [ + "tmp%124#0", + "0x151f7c75" + ] + }, + "658": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "tmp%124#0" + ] + }, + "659": { + "op": "concat", + "defined_out": [ + "tmp%125#0" + ], + "stack_out": [ + "tmp%125#0" + ] + }, + "660": { + "op": "log", + "stack_out": [] + }, + "661": { + "op": "intc_1 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "662": { + "op": "return" + }, + "663": { + "block": "main_get_secondary_market_schedule_route@20", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%114#0" + ], + "stack_out": [ + "tmp%114#0" + ] + }, + "665": { + "op": "!", + "defined_out": [ + "tmp%115#0" + ], + "stack_out": [ + "tmp%115#0" + ] + }, + "666": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "667": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%116#0" + ], + "stack_out": [ + "tmp%116#0" + ] + }, + "669": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "670": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.get_secondary_market_schedule", + "op": "callsub get_secondary_market_schedule", + "defined_out": [ + "tmp%118#0" + ], + "stack_out": [ + "tmp%118#0" + ] + }, + "673": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "tmp%118#0" + ], + "stack_out": [ + "tmp%118#0", + "0x151f7c75" + ] + }, + "674": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "tmp%118#0" + ] + }, + "675": { + "op": "concat", + "defined_out": [ + "tmp%119#0" + ], + "stack_out": [ + "tmp%119#0" + ] + }, + "676": { + "op": "log", + "stack_out": [] + }, + "677": { + "op": "intc_1 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "678": { + "op": "return" + }, + "679": { + "block": "main_get_time_events_route@19", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%108#0" + ], + "stack_out": [ + "tmp%108#0" + ] + }, + "681": { + "op": "!", + "defined_out": [ + "tmp%109#0" + ], + "stack_out": [ + "tmp%109#0" + ] + }, + "682": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "683": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%110#0" + ], + "stack_out": [ + "tmp%110#0" + ] + }, + "685": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "686": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.get_time_events", + "op": "callsub get_time_events", + "defined_out": [ + "tmp%112#0" + ], + "stack_out": [ + "tmp%112#0" + ] + }, + "689": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "tmp%112#0" + ], + "stack_out": [ + "tmp%112#0", + "0x151f7c75" + ] + }, + "690": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "tmp%112#0" + ] + }, + "691": { + "op": "concat", + "defined_out": [ + "tmp%113#0" + ], + "stack_out": [ + "tmp%113#0" + ] + }, + "692": { + "op": "log", + "stack_out": [] + }, + "693": { + "op": "intc_1 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "694": { + "op": "return" + }, + "695": { + "block": "main_get_account_info_route@18", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%101#0" + ], + "stack_out": [ + "tmp%101#0" + ] + }, + "697": { + "op": "!", + "defined_out": [ + "tmp%102#0" + ], + "stack_out": [ + "tmp%102#0" + ] + }, + "698": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "699": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%103#0" + ], + "stack_out": [ + "tmp%103#0" + ] + }, + "701": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "702": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%105#0" + ], + "stack_out": [ + "tmp%105#0" + ] + }, + "705": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.get_account_info", + "op": "callsub get_account_info", + "defined_out": [ + "tmp%106#0" + ], + "stack_out": [ + "tmp%106#0" + ] + }, + "708": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "tmp%106#0" + ], + "stack_out": [ + "tmp%106#0", + "0x151f7c75" + ] + }, + "709": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "tmp%106#0" + ] + }, + "710": { + "op": "concat", + "defined_out": [ + "tmp%107#0" + ], + "stack_out": [ + "tmp%107#0" + ] + }, + "711": { + "op": "log", + "stack_out": [] + }, + "712": { + "op": "intc_1 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "713": { + "op": "return" + }, + "714": { + "block": "main_get_asset_info_route@17", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%95#0" + ], + "stack_out": [ + "tmp%95#0" + ] + }, + "716": { + "op": "!", + "defined_out": [ + "tmp%96#0" + ], + "stack_out": [ + "tmp%96#0" + ] + }, + "717": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "718": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%97#0" + ], + "stack_out": [ + "tmp%97#0" + ] + }, + "720": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "721": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.get_asset_info", + "op": "callsub get_asset_info", + "defined_out": [ + "tmp%99#0" + ], + "stack_out": [ + "tmp%99#0" + ] + }, + "724": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "tmp%99#0" + ], + "stack_out": [ + "tmp%99#0", + "0x151f7c75" + ] + }, + "725": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "tmp%99#0" + ] + }, + "726": { + "op": "concat", + "defined_out": [ + "tmp%100#0" + ], + "stack_out": [ + "tmp%100#0" + ] + }, + "727": { + "op": "log", + "stack_out": [] + }, + "728": { + "op": "intc_1 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "729": { + "op": "return" + }, + "730": { + "block": "main_set_default_status_route@16", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%90#0" + ], + "stack_out": [ + "tmp%90#0" + ] + }, + "732": { + "op": "!", + "defined_out": [ + "tmp%91#0" + ], + "stack_out": [ + "tmp%91#0" + ] + }, + "733": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "734": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%92#0" + ], + "stack_out": [ + "tmp%92#0" + ] + }, + "736": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "737": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%94#0" + ], + "stack_out": [ + "tmp%94#0" + ] + }, + "740": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.set_default_status", + "op": "callsub set_default_status", + "stack_out": [] + }, + "743": { + "op": "intc_1 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "744": { + "op": "return" + }, + "745": { + "block": "main_set_account_suspension_route@15", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%82#0" + ], + "stack_out": [ + "tmp%82#0" + ] + }, + "747": { + "op": "!", + "defined_out": [ + "tmp%83#0" + ], + "stack_out": [ + "tmp%83#0" + ] + }, + "748": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "749": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%84#0" + ], + "stack_out": [ + "tmp%84#0" + ] + }, + "751": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "752": { + "op": "txna ApplicationArgs 1" + }, + "755": { + "op": "txna ApplicationArgs 2", + "defined_out": [ + "tmp%86#0", + "tmp%87#0" + ], + "stack_out": [ + "tmp%86#0", + "tmp%87#0" + ] + }, + "758": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.set_account_suspension", + "op": "callsub set_account_suspension", + "defined_out": [ + "tmp%88#0" + ], + "stack_out": [ + "tmp%88#0" + ] + }, + "761": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "tmp%88#0" + ], + "stack_out": [ + "tmp%88#0", + "0x151f7c75" + ] + }, + "762": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "tmp%88#0" + ] + }, + "763": { + "op": "concat", + "defined_out": [ + "tmp%89#0" + ], + "stack_out": [ + "tmp%89#0" + ] + }, + "764": { + "op": "log", + "stack_out": [] + }, + "765": { + "op": "intc_1 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "766": { + "op": "return" + }, + "767": { + "block": "main_set_asset_suspension_route@14", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%75#0" + ], + "stack_out": [ + "tmp%75#0" + ] + }, + "769": { + "op": "!", + "defined_out": [ + "tmp%76#0" + ], + "stack_out": [ + "tmp%76#0" + ] + }, + "770": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "771": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%77#0" + ], + "stack_out": [ + "tmp%77#0" + ] + }, + "773": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "774": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%79#0" + ], + "stack_out": [ + "tmp%79#0" + ] + }, + "777": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.set_asset_suspension", + "op": "callsub set_asset_suspension", + "defined_out": [ + "tmp%80#0" + ], + "stack_out": [ + "tmp%80#0" + ] + }, + "780": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "tmp%80#0" + ], + "stack_out": [ + "tmp%80#0", + "0x151f7c75" + ] + }, + "781": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "tmp%80#0" + ] + }, + "782": { + "op": "concat", + "defined_out": [ + "tmp%81#0" + ], + "stack_out": [ + "tmp%81#0" + ] + }, + "783": { + "op": "log", + "stack_out": [] + }, + "784": { + "op": "intc_1 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "785": { + "op": "return" + }, + "786": { + "block": "main_primary_distribution_route@13", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%67#0" + ], + "stack_out": [ + "tmp%67#0" + ] + }, + "788": { + "op": "!", + "defined_out": [ + "tmp%68#0" + ], + "stack_out": [ + "tmp%68#0" + ] + }, + "789": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "790": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%69#0" + ], + "stack_out": [ + "tmp%69#0" + ] + }, + "792": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "793": { + "op": "txna ApplicationArgs 1" + }, + "796": { + "op": "txna ApplicationArgs 2", + "defined_out": [ + "tmp%71#0", + "tmp%72#0" + ], + "stack_out": [ + "tmp%71#0", + "tmp%72#0" + ] + }, + "799": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.primary_distribution", + "op": "callsub primary_distribution", + "defined_out": [ + "tmp%73#0" + ], + "stack_out": [ + "tmp%73#0" + ] + }, + "802": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "tmp%73#0" + ], + "stack_out": [ + "tmp%73#0", + "0x151f7c75" + ] + }, + "803": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "tmp%73#0" + ] + }, + "804": { + "op": "concat", + "defined_out": [ + "tmp%74#0" + ], + "stack_out": [ + "tmp%74#0" + ] + }, + "805": { + "op": "log", + "stack_out": [] + }, + "806": { + "op": "intc_1 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "807": { + "op": "return" + }, + "808": { + "block": "main_close_account_route@12", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%60#0" + ], + "stack_out": [ + "tmp%60#0" + ] + }, + "810": { + "op": "!", + "defined_out": [ + "tmp%61#0" + ], + "stack_out": [ + "tmp%61#0" + ] + }, + "811": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "812": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%62#0" + ], + "stack_out": [ + "tmp%62#0" + ] + }, + "814": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "815": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%64#0" + ], + "stack_out": [ + "tmp%64#0" + ] + }, + "818": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.close_account", + "op": "callsub close_account", + "defined_out": [ + "tmp%65#0" + ], + "stack_out": [ + "tmp%65#0" + ] + }, + "821": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "tmp%65#0" + ], + "stack_out": [ + "tmp%65#0", + "0x151f7c75" + ] + }, + "822": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "tmp%65#0" + ] + }, + "823": { + "op": "concat", + "defined_out": [ + "tmp%66#0" + ], + "stack_out": [ + "tmp%66#0" + ] + }, + "824": { + "op": "log", + "stack_out": [] + }, + "825": { + "op": "intc_1 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "826": { + "op": "return" + }, + "827": { + "block": "main_open_account_route@11", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%52#0" + ], + "stack_out": [ + "tmp%52#0" + ] + }, + "829": { + "op": "!", + "defined_out": [ + "tmp%53#0" + ], + "stack_out": [ + "tmp%53#0" + ] + }, + "830": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "831": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%54#0" + ], + "stack_out": [ + "tmp%54#0" + ] + }, + "833": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "834": { + "op": "txna ApplicationArgs 1" + }, + "837": { + "op": "txna ApplicationArgs 2", + "defined_out": [ + "tmp%56#0", + "tmp%57#0" + ], + "stack_out": [ + "tmp%56#0", + "tmp%57#0" + ] + }, + "840": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.open_account", + "op": "callsub open_account", + "defined_out": [ + "tmp%58#0" + ], + "stack_out": [ + "tmp%58#0" + ] + }, + "843": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "tmp%58#0" + ], + "stack_out": [ + "tmp%58#0", + "0x151f7c75" + ] + }, + "844": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "tmp%58#0" + ] + }, + "845": { + "op": "concat", + "defined_out": [ + "tmp%59#0" + ], + "stack_out": [ + "tmp%59#0" + ] + }, + "846": { + "op": "log", + "stack_out": [] + }, + "847": { + "op": "intc_1 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "848": { + "op": "return" + }, + "849": { + "block": "main_revoke_role_route@10", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%44#0" + ], + "stack_out": [ + "tmp%44#0" + ] + }, + "851": { + "op": "!", + "defined_out": [ + "tmp%45#0" + ], + "stack_out": [ + "tmp%45#0" + ] + }, + "852": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "853": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%46#0" + ], + "stack_out": [ + "tmp%46#0" + ] + }, + "855": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "856": { + "op": "txna ApplicationArgs 1" + }, + "859": { + "op": "txna ApplicationArgs 2", + "defined_out": [ + "tmp%48#0", + "tmp%49#0" + ], + "stack_out": [ + "tmp%48#0", + "tmp%49#0" + ] + }, + "862": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.revoke_role", + "op": "callsub revoke_role", + "defined_out": [ + "tmp%50#0" + ], + "stack_out": [ + "tmp%50#0" + ] + }, + "865": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "tmp%50#0" + ], + "stack_out": [ + "tmp%50#0", + "0x151f7c75" + ] + }, + "866": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "tmp%50#0" + ] + }, + "867": { + "op": "concat", + "defined_out": [ + "tmp%51#0" + ], + "stack_out": [ + "tmp%51#0" + ] + }, + "868": { + "op": "log", + "stack_out": [] + }, + "869": { + "op": "intc_1 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "870": { + "op": "return" + }, + "871": { + "block": "main_assign_role_route@9", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%35#0" + ], + "stack_out": [ + "tmp%35#0" + ] + }, + "873": { + "op": "!", + "defined_out": [ + "tmp%36#0" + ], + "stack_out": [ + "tmp%36#0" + ] + }, + "874": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "875": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%37#0" + ], + "stack_out": [ + "tmp%37#0" + ] + }, + "877": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "878": { + "op": "txna ApplicationArgs 1" + }, + "881": { + "op": "txna ApplicationArgs 2" + }, + "884": { + "op": "txna ApplicationArgs 3", + "defined_out": [ + "tmp%39#0", + "tmp%40#0", + "tmp%41#0" + ], + "stack_out": [ + "tmp%39#0", + "tmp%40#0", + "tmp%41#0" + ] + }, + "887": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assign_role", + "op": "callsub assign_role", + "defined_out": [ + "tmp%42#0" + ], + "stack_out": [ + "tmp%42#0" + ] + }, + "890": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "tmp%42#0" + ], + "stack_out": [ + "tmp%42#0", + "0x151f7c75" + ] + }, + "891": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "tmp%42#0" + ] + }, + "892": { + "op": "concat", + "defined_out": [ + "tmp%43#0" + ], + "stack_out": [ + "tmp%43#0" + ] + }, + "893": { + "op": "log", + "stack_out": [] + }, + "894": { + "op": "intc_1 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "895": { + "op": "return" + }, + "896": { + "block": "main_set_secondary_time_events_route@8", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%28#0" + ], + "stack_out": [ + "tmp%28#0" + ] + }, + "898": { + "op": "!", + "defined_out": [ + "tmp%29#0" + ], + "stack_out": [ + "tmp%29#0" + ] + }, + "899": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "900": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%30#0" + ], + "stack_out": [ + "tmp%30#0" + ] + }, + "902": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "903": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%32#0" + ], + "stack_out": [ + "tmp%32#0" + ] + }, + "906": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.set_secondary_time_events", + "op": "callsub set_secondary_time_events", + "defined_out": [ + "tmp%33#0" + ], + "stack_out": [ + "tmp%33#0" + ] + }, + "909": { + "op": "bytec_0 // 0x151f7c75", + "defined_out": [ + "0x151f7c75", + "tmp%33#0" + ], + "stack_out": [ + "tmp%33#0", + "0x151f7c75" + ] + }, + "910": { + "op": "swap", + "stack_out": [ + "0x151f7c75", + "tmp%33#0" + ] + }, + "911": { + "op": "concat", + "defined_out": [ + "tmp%34#0" + ], + "stack_out": [ + "tmp%34#0" + ] + }, + "912": { + "op": "log", + "stack_out": [] + }, + "913": { + "op": "intc_1 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "914": { + "op": "return" + }, + "915": { + "block": "main_asset_config_route@7", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%14#0" + ], + "stack_out": [ + "tmp%14#0" + ] + }, + "917": { + "op": "!", + "defined_out": [ + "tmp%15#0" + ], + "stack_out": [ + "tmp%15#0" + ] + }, + "918": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "919": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%16#0" + ], + "stack_out": [ + "tmp%16#0" + ] + }, + "921": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "922": { + "op": "txna ApplicationArgs 1" + }, + "925": { + "op": "txna ApplicationArgs 2" + }, + "928": { + "op": "txna ApplicationArgs 3" + }, + "931": { + "op": "txna ApplicationArgs 4" + }, + "934": { + "op": "txna ApplicationArgs 5" + }, + "937": { + "op": "txna ApplicationArgs 6" + }, + "940": { + "op": "txna ApplicationArgs 7" + }, + "943": { + "op": "txna ApplicationArgs 8" + }, + "946": { + "op": "txna ApplicationArgs 9" + }, + "949": { + "op": "txna ApplicationArgs 10", + "defined_out": [ + "tmp%18#0", + "tmp%19#0", + "tmp%20#0", + "tmp%21#0", + "tmp%22#0", + "tmp%23#0", + "tmp%24#0", + "tmp%25#0", + "tmp%26#0", + "tmp%27#0" + ], + "stack_out": [ + "tmp%18#0", + "tmp%19#0", + "tmp%20#0", + "tmp%21#0", + "tmp%22#0", + "tmp%23#0", + "tmp%24#0", + "tmp%25#0", + "tmp%26#0", + "tmp%27#0" + ] + }, + "952": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.asset_config", + "op": "callsub asset_config", + "stack_out": [] + }, + "955": { + "op": "intc_1 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "956": { + "op": "return" + }, + "957": { + "block": "main_asset_update_route@6", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%9#0" + ], + "stack_out": [ + "tmp%9#0" + ] + }, + "959": { + "op": "intc_3 // UpdateApplication", + "defined_out": [ + "UpdateApplication", + "tmp%9#0" + ], + "stack_out": [ + "tmp%9#0", + "UpdateApplication" + ] + }, + "960": { + "op": "==", + "defined_out": [ + "tmp%10#0" + ], + "stack_out": [ + "tmp%10#0" + ] + }, + "961": { + "error": "OnCompletion is not UpdateApplication", + "op": "assert // OnCompletion is not UpdateApplication", + "stack_out": [] + }, + "962": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%11#0" + ], + "stack_out": [ + "tmp%11#0" + ] + }, + "964": { + "error": "can only call when not creating", + "op": "assert // can only call when not creating", + "stack_out": [] + }, + "965": { + "op": "txna ApplicationArgs 1", + "defined_out": [ + "tmp%13#0" + ], + "stack_out": [ + "tmp%13#0" + ] + }, + "968": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.asset_update", + "op": "callsub asset_update", + "stack_out": [] + }, + "971": { + "op": "intc_1 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "972": { + "op": "return" + }, + "973": { + "block": "main_asset_create_route@5", + "stack_in": [], + "op": "txn OnCompletion", + "defined_out": [ + "tmp%3#0" + ], + "stack_out": [ + "tmp%3#0" + ] + }, + "975": { + "op": "!", + "defined_out": [ + "tmp%4#0" + ], + "stack_out": [ + "tmp%4#0" + ] + }, + "976": { + "error": "OnCompletion is not NoOp", + "op": "assert // OnCompletion is not NoOp", + "stack_out": [] + }, + "977": { + "op": "txn ApplicationID", + "defined_out": [ + "tmp%5#0" + ], + "stack_out": [ + "tmp%5#0" + ] + }, + "979": { + "op": "!", + "defined_out": [ + "tmp%6#0" + ], + "stack_out": [ + "tmp%6#0" + ] + }, + "980": { + "error": "can only call when creating", + "op": "assert // can only call when creating", + "stack_out": [] + }, + "981": { + "op": "txna ApplicationArgs 1" + }, + "984": { + "op": "txna ApplicationArgs 2", + "defined_out": [ + "tmp%7#0", + "tmp%8#0" + ], + "stack_out": [ + "tmp%7#0", + "tmp%8#0" + ] + }, + "987": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.asset_create", + "op": "callsub asset_create", + "stack_out": [] + }, + "990": { + "op": "intc_1 // 1", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "991": { + "op": "return" + }, + "992": { + "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.asset_create", + "params": { + "arranger#0": "bytes", + "metadata#0": "bytes" + }, + "block": "asset_create", + "stack_in": [], + "op": "proto 2 0" + }, + "995": { + "op": "bytec 8 // 0x52323023", + "defined_out": [ + "0x52323023" + ], + "stack_out": [ + "0x52323023" + ] + }, + "997": { + "op": "frame_dig -2", + "defined_out": [ + "0x52323023", + "arranger#0 (copy)" + ], + "stack_out": [ + "0x52323023", + "arranger#0 (copy)" + ] + }, + "999": { + "op": "app_global_put", + "stack_out": [] + }, + "1000": { + "op": "bytec 12 // \"metadata\"", + "defined_out": [ + "\"metadata\"" + ], + "stack_out": [ + "\"metadata\"" + ] + }, + "1002": { + "op": "frame_dig -1", + "defined_out": [ + "\"metadata\"", + "metadata#0 (copy)" + ], + "stack_out": [ + "\"metadata\"", + "metadata#0 (copy)" + ] + }, + "1004": { + "op": "app_global_put", + "stack_out": [] + }, + "1005": { + "retsub": true, + "op": "retsub" + }, + "1006": { + "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.asset_update", + "params": { + "metadata#0": "bytes" + }, + "block": "asset_update", + "stack_in": [], + "op": "proto 1 0" + }, + "1009": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_caller_is_arranger", + "op": "callsub assert_caller_is_arranger" + }, + "1012": { + "op": "bytec 12 // \"metadata\"", + "defined_out": [ + "\"metadata\"" + ], + "stack_out": [ + "\"metadata\"" + ] + }, + "1014": { + "op": "frame_dig -1", + "defined_out": [ + "\"metadata\"", + "metadata#0 (copy)" + ], + "stack_out": [ + "\"metadata\"", + "metadata#0 (copy)" + ] + }, + "1016": { + "op": "app_global_put", + "stack_out": [] + }, + "1017": { + "retsub": true, + "op": "retsub" + }, + "1018": { + "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_caller_is_arranger", + "params": {}, + "block": "assert_caller_is_arranger", + "stack_in": [], + "op": "proto 0 0" + }, + "1021": { + "op": "txn Sender", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "1023": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "0" + ] + }, + "1024": { + "op": "bytec 8 // 0x52323023", + "defined_out": [ + "0", + "0x52323023", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "0", + "0x52323023" + ] + }, + "1026": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1027": { + "error": "check self.arranger exists", + "op": "assert // check self.arranger exists", + "stack_out": [ + "tmp%0#0", + "maybe_value%0#0" + ] + }, + "1028": { + "op": "==", + "defined_out": [ + "tmp%1#0" + ], + "stack_out": [ + "tmp%1#0" + ] + }, + "1029": { + "error": "Not authorized", + "op": "assert // Not authorized", + "stack_out": [] + }, + "1030": { + "retsub": true, + "op": "retsub" + }, + "1031": { + "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.asset_config", + "params": { + "denomination_asset_id#0": "bytes", + "settlement_asset_id#0": "bytes", + "principal#0": "bytes", + "principal_discount#0": "bytes", + "minimum_denomination#0": "bytes", + "day_count_convention#0": "bytes", + "interest_rate#0": "bytes", + "coupon_rates#0": "bytes", + "time_events#0": "bytes", + "time_periods#0": "bytes" + }, + "block": "asset_config", + "stack_in": [], + "op": "proto 10 0" + }, + "1034": { + "op": "intc_0 // 0", + "stack_out": [ + "array_head_and_tail%0#0" + ] + }, + "1035": { + "op": "pushbytes \"\"", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1" + ] + }, + "1037": { + "op": "dupn 2", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1" + ] + }, + "1039": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_caller_is_arranger", + "op": "callsub assert_caller_is_arranger" + }, + "1042": { + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "0" + ] + }, + "1043": { + "op": "bytec_2 // \"status\"", + "defined_out": [ + "\"status\"", + "0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "0", + "\"status\"" + ] + }, + "1044": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1045": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "maybe_value%0#0" + ] + }, + "1046": { + "op": "!", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "tmp%0#0" + ] + }, + "1047": { + "error": "D-ASA already configured", + "op": "assert // D-ASA already configured", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1" + ] + }, + "1048": { + "op": "frame_dig -10", + "defined_out": [ + "denomination_asset_id#0 (copy)" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#0 (copy)" + ] + }, + "1050": { + "op": "btoi", + "defined_out": [ + "denomination_asset_id#1" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1" + ] + }, + "1051": { + "op": "dup", + "defined_out": [ + "denomination_asset_id#1" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "denomination_asset_id#1" + ] + }, + "1052": { + "op": "bz asset_config_bool_false@4", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1" + ] + }, + "1055": { + "op": "frame_dig 4" + }, + "1057": { + "op": "asset_params_get AssetCreator" + }, + "1059": { + "error": "asset exists", + "op": "assert // asset exists" + }, + "1060": { + "op": "global ZeroAddress" + }, + "1062": { + "op": "!=" + }, + "1063": { + "op": "bz asset_config_bool_false@4" + }, + "1066": { + "op": "intc_1 // 1" + }, + "1067": { + "block": "asset_config_bool_merge@5", + "stack_in": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "and_result%0#0" + ], + "error": "Denomination asset is not properly set", + "op": "assert // Denomination asset is not properly set", + "defined_out": [], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1" + ] + }, + "1068": { + "op": "bytec 9 // \"denomination_asset_id\"", + "defined_out": [ + "\"denomination_asset_id\"" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "\"denomination_asset_id\"" + ] + }, + "1070": { + "op": "frame_dig 4", + "defined_out": [ + "\"denomination_asset_id\"", + "denomination_asset_id#1" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "\"denomination_asset_id\"", + "denomination_asset_id#1" + ] + }, + "1072": { + "op": "app_global_put", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1" + ] + }, + "1073": { + "op": "frame_dig -9", + "defined_out": [ + "denomination_asset_id#1", + "settlement_asset_id#0 (copy)" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "settlement_asset_id#0 (copy)" + ] + }, + "1075": { + "op": "btoi", + "defined_out": [ + "denomination_asset_id#1", + "settlement_asset_id#1" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "settlement_asset_id#1" + ] + }, + "1076": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "denomination_asset_id#1", + "settlement_asset_id#1" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "settlement_asset_id#1", + "0" + ] + }, + "1077": { + "op": "bytec 9 // \"denomination_asset_id\"", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "settlement_asset_id#1", + "0", + "\"denomination_asset_id\"" + ] + }, + "1079": { + "op": "app_global_get_ex", + "defined_out": [ + "denomination_asset_id#1", + "maybe_exists%0#0", + "maybe_value%0#0", + "settlement_asset_id#1" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "settlement_asset_id#1", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1080": { + "error": "check self.denomination_asset_id exists", + "op": "assert // check self.denomination_asset_id exists", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "settlement_asset_id#1", + "maybe_value%0#0" + ] + }, + "1081": { + "op": "dig 1", + "defined_out": [ + "denomination_asset_id#1", + "maybe_value%0#0", + "settlement_asset_id#1", + "settlement_asset_id#1 (copy)" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "settlement_asset_id#1", + "maybe_value%0#0", + "settlement_asset_id#1 (copy)" + ] + }, + "1083": { + "op": "==", + "defined_out": [ + "denomination_asset_id#1", + "settlement_asset_id#1", + "tmp%0#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "settlement_asset_id#1", + "tmp%0#0" + ] + }, + "1084": { + "error": "Different settlement asset not supported, must be equal to denomination asset", + "op": "assert // Different settlement asset not supported, must be equal to denomination asset", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "settlement_asset_id#1" + ] + }, + "1085": { + "op": "bytec 10 // \"settlement_asset_id\"", + "defined_out": [ + "\"settlement_asset_id\"", + "denomination_asset_id#1", + "settlement_asset_id#1" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "settlement_asset_id#1", + "\"settlement_asset_id\"" + ] + }, + "1087": { + "op": "swap", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "\"settlement_asset_id\"", + "settlement_asset_id#1" + ] + }, + "1088": { + "op": "app_global_put", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1" + ] + }, + "1089": { + "op": "itxn_begin" + }, + "1090": { + "op": "global MinTxnFee", + "defined_out": [ + "denomination_asset_id#1", + "inner_txn_params%0%%param_Fee_idx_0#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "inner_txn_params%0%%param_Fee_idx_0#0" + ] + }, + "1092": { + "op": "intc_0 // 0", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "inner_txn_params%0%%param_Fee_idx_0#0", + "0" + ] + }, + "1093": { + "op": "bytec 10 // \"settlement_asset_id\"", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "inner_txn_params%0%%param_Fee_idx_0#0", + "0", + "\"settlement_asset_id\"" + ] + }, + "1095": { + "op": "app_global_get_ex", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "inner_txn_params%0%%param_Fee_idx_0#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1096": { + "error": "check self.settlement_asset_id exists", + "op": "assert // check self.settlement_asset_id exists", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "inner_txn_params%0%%param_Fee_idx_0#0", + "maybe_value%0#0" + ] + }, + "1097": { + "op": "global CurrentApplicationAddress", + "defined_out": [ + "denomination_asset_id#1", + "inner_txn_params%0%%param_AssetReceiver_idx_0#0", + "inner_txn_params%0%%param_Fee_idx_0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "inner_txn_params%0%%param_Fee_idx_0#0", + "maybe_value%0#0", + "inner_txn_params%0%%param_AssetReceiver_idx_0#0" + ] + }, + "1099": { + "op": "intc_0 // 0", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "inner_txn_params%0%%param_Fee_idx_0#0", + "maybe_value%0#0", + "inner_txn_params%0%%param_AssetReceiver_idx_0#0", + "0" + ] + }, + "1100": { + "op": "itxn_field AssetAmount", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "inner_txn_params%0%%param_Fee_idx_0#0", + "maybe_value%0#0", + "inner_txn_params%0%%param_AssetReceiver_idx_0#0" + ] + }, + "1102": { + "op": "itxn_field AssetReceiver", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "inner_txn_params%0%%param_Fee_idx_0#0", + "maybe_value%0#0" + ] + }, + "1104": { + "op": "itxn_field XferAsset", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "inner_txn_params%0%%param_Fee_idx_0#0" + ] + }, + "1106": { + "op": "intc_3 // axfer", + "defined_out": [ + "axfer", + "denomination_asset_id#1", + "inner_txn_params%0%%param_Fee_idx_0#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "inner_txn_params%0%%param_Fee_idx_0#0", + "axfer" + ] + }, + "1107": { + "op": "itxn_field TypeEnum", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "inner_txn_params%0%%param_Fee_idx_0#0" + ] + }, + "1109": { + "op": "itxn_field Fee", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1" + ] + }, + "1111": { + "op": "itxn_submit" + }, + "1112": { + "op": "frame_dig -8", + "defined_out": [ + "denomination_asset_id#1", + "principal#0 (copy)" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "principal#0 (copy)" + ] + }, + "1114": { + "op": "btoi", + "defined_out": [ + "denomination_asset_id#1", + "tmp%5#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%5#0" + ] + }, + "1115": { + "op": "frame_dig -6", + "defined_out": [ + "denomination_asset_id#1", + "minimum_denomination#0 (copy)", + "tmp%5#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%5#0", + "minimum_denomination#0 (copy)" + ] + }, + "1117": { + "op": "btoi", + "defined_out": [ + "denomination_asset_id#1", + "tmp%5#0", + "tmp%6#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%5#0", + "tmp%6#0" + ] + }, + "1118": { + "op": "dup2", + "defined_out": [ + "denomination_asset_id#1", + "tmp%5#0", + "tmp%5#0 (copy)", + "tmp%6#0", + "tmp%6#0 (copy)" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%5#0", + "tmp%6#0", + "tmp%5#0 (copy)", + "tmp%6#0 (copy)" + ] + }, + "1119": { + "op": "%", + "defined_out": [ + "denomination_asset_id#1", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0" + ] + }, + "1120": { + "op": "!", + "defined_out": [ + "denomination_asset_id#1", + "tmp%5#0", + "tmp%6#0", + "tmp%8#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%5#0", + "tmp%6#0", + "tmp%8#0" + ] + }, + "1121": { + "error": "Minimum denomination is not a divisor of principal", + "op": "assert // Minimum denomination is not a divisor of principal", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%5#0", + "tmp%6#0" + ] + }, + "1122": { + "op": "bytec 4 // \"unit_value\"", + "defined_out": [ + "\"unit_value\"", + "denomination_asset_id#1", + "tmp%5#0", + "tmp%6#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%5#0", + "tmp%6#0", + "\"unit_value\"" + ] + }, + "1124": { + "op": "dig 1", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%5#0", + "tmp%6#0", + "\"unit_value\"", + "tmp%6#0 (copy)" + ] + }, + "1126": { + "op": "app_global_put", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%5#0", + "tmp%6#0" + ] + }, + "1127": { + "op": "/", + "defined_out": [ + "denomination_asset_id#1", + "new_state_value%1#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "new_state_value%1#0" + ] + }, + "1128": { + "op": "bytec 5 // \"total_units\"", + "defined_out": [ + "\"total_units\"", + "denomination_asset_id#1", + "new_state_value%1#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "new_state_value%1#0", + "\"total_units\"" + ] + }, + "1130": { + "op": "swap", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "\"total_units\"", + "new_state_value%1#0" + ] + }, + "1131": { + "op": "app_global_put", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1" + ] + }, + "1132": { + "op": "frame_dig -7", + "defined_out": [ + "denomination_asset_id#1", + "principal_discount#0 (copy)" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "principal_discount#0 (copy)" + ] + }, + "1134": { + "op": "btoi", + "defined_out": [ + "denomination_asset_id#1", + "new_state_value%2#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "new_state_value%2#0" + ] + }, + "1135": { + "op": "bytec 13 // \"principal_discount\"", + "defined_out": [ + "\"principal_discount\"", + "denomination_asset_id#1", + "new_state_value%2#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "new_state_value%2#0", + "\"principal_discount\"" + ] + }, + "1137": { + "op": "swap", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "\"principal_discount\"", + "new_state_value%2#0" + ] + }, + "1138": { + "op": "app_global_put", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1" + ] + }, + "1139": { + "op": "frame_dig -5", + "defined_out": [ + "day_count_convention#0 (copy)", + "denomination_asset_id#1" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "day_count_convention#0 (copy)" + ] + }, + "1141": { + "op": "btoi", + "defined_out": [ + "day_count_convention#1", + "denomination_asset_id#1" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "day_count_convention#1" + ] + }, + "1142": { + "op": "dup", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "day_count_convention#1", + "day_count_convention#1" + ] + }, + "1143": { + "op": "frame_bury 1", + "defined_out": [ + "day_count_convention#1", + "denomination_asset_id#1" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "day_count_convention#1" + ] + }, + "1145": { + "op": "bz asset_config_bool_true@16", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1" + ] + }, + "1148": { + "op": "frame_dig 1" + }, + "1150": { + "op": "pushint 255 // 255" + }, + "1153": { + "op": "==" + }, + "1154": { + "op": "bz asset_config_bool_false@17" + }, + "1157": { + "block": "asset_config_bool_true@16", + "stack_in": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1" + ], + "op": "intc_1 // 1", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "or_result%0#0" + ] + }, + "1158": { + "block": "asset_config_bool_merge@18", + "stack_in": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "or_result%0#0" + ], + "error": "Invalid day-count convention ID", + "op": "assert // Invalid day-count convention ID", + "defined_out": [], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1" + ] + }, + "1159": { + "op": "bytec 11 // \"day_count_convention\"", + "defined_out": [ + "\"day_count_convention\"" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "\"day_count_convention\"" + ] + }, + "1161": { + "op": "frame_dig 1", + "defined_out": [ + "\"day_count_convention\"", + "day_count_convention#1" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "\"day_count_convention\"", + "day_count_convention#1" + ] + }, + "1163": { + "op": "app_global_put", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1" + ] + }, + "1164": { + "op": "frame_dig -4", + "defined_out": [ + "day_count_convention#1", + "interest_rate#0 (copy)" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "interest_rate#0 (copy)" + ] + }, + "1166": { + "op": "btoi", + "defined_out": [ + "day_count_convention#1", + "interest_rate#1" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "interest_rate#1" + ] + }, + "1167": { + "op": "frame_bury 2", + "defined_out": [ + "day_count_convention#1", + "interest_rate#1" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1" + ] + }, + "1169": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "day_count_convention#1", + "interest_rate#1" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "0" + ] + }, + "1170": { + "op": "bytec 13 // \"principal_discount\"", + "defined_out": [ + "\"principal_discount\"", + "0", + "day_count_convention#1", + "interest_rate#1" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "0", + "\"principal_discount\"" + ] + }, + "1172": { + "op": "app_global_get_ex", + "defined_out": [ + "day_count_convention#1", + "interest_rate#1", + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1173": { + "error": "check self.principal_discount exists", + "op": "assert // check self.principal_discount exists", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "maybe_value%0#0" + ] + }, + "1174": { + "op": "bnz asset_config_after_if_else@24", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1" + ] + }, + "1177": { + "op": "frame_dig 2" + }, + "1179": { + "error": "Interest rate is not properly defined", + "op": "assert // Interest rate is not properly defined" + }, + "1180": { + "block": "asset_config_after_if_else@24", + "stack_in": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1" + ], + "op": "bytec 21 // \"interest_rate\"", + "defined_out": [ + "\"interest_rate\"" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "\"interest_rate\"" + ] + }, + "1182": { + "op": "frame_dig 2", + "defined_out": [ + "\"interest_rate\"", + "interest_rate#1" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "\"interest_rate\"", + "interest_rate#1" + ] + }, + "1184": { + "op": "app_global_put", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1" + ] + }, + "1185": { + "op": "frame_dig -3", + "defined_out": [ + "coupon_rates#0 (copy)", + "interest_rate#1" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "coupon_rates#0 (copy)" + ] + }, + "1187": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "coupon_rates#0 (copy)", + "interest_rate#1" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "coupon_rates#0 (copy)", + "0" + ] + }, + "1188": { + "op": "extract_uint16", + "defined_out": [ + "interest_rate#1", + "tmp%0#5" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%0#5" + ] + }, + "1189": { + "op": "dup", + "defined_out": [ + "interest_rate#1", + "tmp%0#5", + "tmp%0#5 (copy)" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%0#5", + "tmp%0#5 (copy)" + ] + }, + "1190": { + "op": "!", + "defined_out": [ + "interest_rate#1", + "tmp%0#5", + "tmp%1#2" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%0#5", + "tmp%1#2" + ] + }, + "1191": { + "error": "Coupon rates are not properly defined", + "op": "assert // Coupon rates are not properly defined", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%0#5" + ] + }, + "1192": { + "op": "bytec 6 // \"total_coupons\"", + "defined_out": [ + "\"total_coupons\"", + "interest_rate#1", + "tmp%0#5" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%0#5", + "\"total_coupons\"" + ] + }, + "1194": { + "op": "swap", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "\"total_coupons\"", + "tmp%0#5" + ] + }, + "1195": { + "op": "app_global_put", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1" + ] + }, + "1196": { + "op": "intc_0 // 0", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "0" + ] + }, + "1197": { + "op": "bytec 6 // \"total_coupons\"", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "0", + "\"total_coupons\"" + ] + }, + "1199": { + "op": "app_global_get_ex", + "defined_out": [ + "interest_rate#1", + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1200": { + "error": "check self.total_coupons exists", + "op": "assert // check self.total_coupons exists", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "maybe_value%0#0" + ] + }, + "1201": { + "op": "bz asset_config_after_if_else@32", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1" + ] + }, + "1204": { + "op": "bytec 28 // 0x636f75706f6e5261746573" + }, + "1206": { + "op": "box_del" + }, + "1207": { + "op": "pop" + }, + "1208": { + "op": "bytec 28 // 0x636f75706f6e5261746573" + }, + "1210": { + "op": "frame_dig -3" + }, + "1212": { + "op": "box_put" + }, + "1213": { + "block": "asset_config_after_if_else@32", + "stack_in": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1" + ], + "op": "frame_dig -2", + "defined_out": [ + "time_events#0 (copy)" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "time_events#0 (copy)" + ] + }, + "1215": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "time_events#0 (copy)" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "time_events#0 (copy)", + "0" + ] + }, + "1216": { + "op": "extract_uint16", + "defined_out": [ + "tmp%0#5" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%0#5" + ] + }, + "1217": { + "op": "intc_0 // 0", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%0#5", + "0" + ] + }, + "1218": { + "op": "bytec 6 // \"total_coupons\"", + "defined_out": [ + "\"total_coupons\"", + "0", + "tmp%0#5" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%0#5", + "0", + "\"total_coupons\"" + ] + }, + "1220": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "tmp%0#5" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%0#5", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1221": { + "error": "check self.total_coupons exists", + "op": "assert // check self.total_coupons exists", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%0#5", + "maybe_value%0#0" + ] + }, + "1222": { + "op": "intc_3 // 4", + "defined_out": [ + "4", + "maybe_value%0#0", + "tmp%0#5" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%0#5", + "maybe_value%0#0", + "4" + ] + }, + "1223": { + "op": "+", + "defined_out": [ + "tmp%0#5", + "tmp%1#5" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%0#5", + "tmp%1#5" + ] + }, + "1224": { + "op": "==", + "defined_out": [ + "tmp%2#1" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%2#1" + ] + }, + "1225": { + "error": "Time events length is invalid", + "op": "assert // Time events length is invalid", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1" + ] + }, + "1226": { + "op": "frame_dig -2", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "time_events#0 (copy)" + ] + }, + "1228": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_time_events_sorted", + "op": "callsub assert_time_events_sorted", + "defined_out": [ + "time_events#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "time_events#0" + ] + }, + "1231": { + "op": "frame_bury -2", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1" + ] + }, + "1233": { + "op": "bytec 22 // 0x74696d654576656e7473", + "defined_out": [ + "0x74696d654576656e7473" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "0x74696d654576656e7473" + ] + }, + "1235": { + "op": "box_del", + "defined_out": [ + "{box_del}" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "{box_del}" + ] + }, + "1236": { + "op": "pop", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1" + ] + }, + "1237": { + "op": "bytec 22 // 0x74696d654576656e7473", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "0x74696d654576656e7473" + ] + }, + "1239": { + "op": "frame_dig -2", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "0x74696d654576656e7473", + "time_events#0 (copy)" + ] + }, + "1241": { + "op": "box_put", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1" + ] + }, + "1242": { + "op": "frame_dig -2", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "time_events#0 (copy)" + ] + }, + "1244": { + "op": "extract 2 0", + "defined_out": [ + "array_head_and_tail%0#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "array_head_and_tail%0#0" + ] + }, + "1247": { + "op": "dup", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "array_head_and_tail%0#0", + "array_head_and_tail%0#0" + ] + }, + "1248": { + "op": "frame_bury 0", + "defined_out": [ + "array_head_and_tail%0#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "array_head_and_tail%0#0" + ] + }, + "1250": { + "op": "dup", + "defined_out": [ + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)" + ] + }, + "1251": { + "error": "Index access is out of bounds", + "op": "extract 0 8 // on error: Index access is out of bounds", + "defined_out": [ + "array_head_and_tail%0#0", + "tmp%0#8" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "array_head_and_tail%0#0", + "tmp%0#8" + ] + }, + "1254": { + "op": "btoi", + "defined_out": [ + "array_head_and_tail%0#0", + "new_state_value%0#2" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "array_head_and_tail%0#0", + "new_state_value%0#2" + ] + }, + "1255": { + "op": "bytec 14 // \"primary_distribution_opening_date\"", + "defined_out": [ + "\"primary_distribution_opening_date\"", + "array_head_and_tail%0#0", + "new_state_value%0#2" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "array_head_and_tail%0#0", + "new_state_value%0#2", + "\"primary_distribution_opening_date\"" + ] + }, + "1257": { + "op": "swap", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "array_head_and_tail%0#0", + "\"primary_distribution_opening_date\"", + "new_state_value%0#2" + ] + }, + "1258": { + "op": "app_global_put", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "array_head_and_tail%0#0" + ] + }, + "1259": { + "op": "dup", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)" + ] + }, + "1260": { + "error": "Index access is out of bounds", + "op": "extract 8 8 // on error: Index access is out of bounds", + "defined_out": [ + "array_head_and_tail%0#0", + "tmp%1#1" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "array_head_and_tail%0#0", + "tmp%1#1" + ] + }, + "1263": { + "op": "btoi", + "defined_out": [ + "array_head_and_tail%0#0", + "new_state_value%1#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "array_head_and_tail%0#0", + "new_state_value%1#0" + ] + }, + "1264": { + "op": "bytec 15 // \"primary_distribution_closure_date\"", + "defined_out": [ + "\"primary_distribution_closure_date\"", + "array_head_and_tail%0#0", + "new_state_value%1#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "array_head_and_tail%0#0", + "new_state_value%1#0", + "\"primary_distribution_closure_date\"" + ] + }, + "1266": { + "op": "swap", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "array_head_and_tail%0#0", + "\"primary_distribution_closure_date\"", + "new_state_value%1#0" + ] + }, + "1267": { + "op": "app_global_put", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "array_head_and_tail%0#0" + ] + }, + "1268": { + "error": "Index access is out of bounds", + "op": "extract 16 8 // on error: Index access is out of bounds", + "defined_out": [ + "array_head_and_tail%0#0", + "tmp%2#3" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%2#3" + ] + }, + "1271": { + "op": "btoi", + "defined_out": [ + "array_head_and_tail%0#0", + "new_state_value%2#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "new_state_value%2#0" + ] + }, + "1272": { + "op": "bytec 16 // \"issuance_date\"", + "defined_out": [ + "\"issuance_date\"", + "array_head_and_tail%0#0", + "new_state_value%2#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "new_state_value%2#0", + "\"issuance_date\"" + ] + }, + "1274": { + "op": "swap", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "\"issuance_date\"", + "new_state_value%2#0" + ] + }, + "1275": { + "op": "app_global_put", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1" + ] + }, + "1276": { + "op": "frame_dig -2", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "time_events#0 (copy)" + ] + }, + "1278": { + "op": "intc_0 // 0", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "time_events#0 (copy)", + "0" + ] + }, + "1279": { + "op": "extract_uint16", + "defined_out": [ + "array_head_and_tail%0#0", + "tmp%3#1" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%3#1" + ] + }, + "1280": { + "op": "dup", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%3#1", + "tmp%3#1" + ] + }, + "1281": { + "op": "frame_bury 3", + "defined_out": [ + "array_head_and_tail%0#0", + "tmp%3#1" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%3#1" + ] + }, + "1283": { + "op": "intc_0 // 0", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%3#1", + "0" + ] + }, + "1284": { + "op": "bytec 6 // \"total_coupons\"", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%3#1", + "0", + "\"total_coupons\"" + ] + }, + "1286": { + "op": "app_global_get_ex", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%3#1", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1287": { + "error": "check self.total_coupons exists", + "op": "assert // check self.total_coupons exists", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%3#1", + "maybe_value%0#0" + ] + }, + "1288": { + "op": "intc_3 // 4", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%3#1", + "maybe_value%0#0", + "4" + ] + }, + "1289": { + "op": "+", + "defined_out": [ + "array_head_and_tail%0#0", + "tmp%3#1", + "tmp%4#1" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%3#1", + "tmp%4#1" + ] + }, + "1290": { + "op": "==", + "defined_out": [ + "array_head_and_tail%0#0", + "tmp%3#1", + "tmp%5#1" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%5#1" + ] + }, + "1291": { + "op": "bz asset_config_after_if_else@38", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1" + ] + }, + "1294": { + "op": "frame_dig 3" + }, + "1296": { + "op": "intc_1 // 1" + }, + "1297": { + "op": "-" + }, + "1298": { + "op": "intc_2 // 8" + }, + "1299": { + "op": "*" + }, + "1300": { + "op": "frame_dig 0" + }, + "1302": { + "op": "swap" + }, + "1303": { + "op": "intc_2 // 8" + }, + "1304": { + "error": "Index access is out of bounds", + "op": "extract3 // on error: Index access is out of bounds" + }, + "1305": { + "op": "btoi" + }, + "1306": { + "op": "bytec_3 // \"maturity_date\"" + }, + "1307": { + "op": "swap" + }, + "1308": { + "op": "app_global_put" + }, + "1309": { + "block": "asset_config_after_if_else@38", + "stack_in": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1" + ], + "op": "frame_dig -1", + "defined_out": [ + "time_periods#0 (copy)" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "time_periods#0 (copy)" + ] + }, + "1311": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "time_periods#0 (copy)" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "time_periods#0 (copy)", + "0" + ] + }, + "1312": { + "op": "extract_uint16", + "defined_out": [ + "tmp%0#5" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%0#5" + ] + }, + "1313": { + "op": "!", + "defined_out": [ + "tmp%1#2" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "tmp%1#2" + ] + }, + "1314": { + "error": "Time periods are not properly defined", + "op": "assert // Time periods are not properly defined", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1" + ] + }, + "1315": { + "op": "bytec_2 // \"status\"", + "defined_out": [ + "\"status\"" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "\"status\"" + ] + }, + "1316": { + "op": "pushint 100 // 100", + "defined_out": [ + "\"status\"", + "100" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "\"status\"", + "100" + ] + }, + "1318": { + "op": "app_global_put", + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1" + ] + }, + "1319": { + "retsub": true, + "op": "retsub" + }, + "1320": { + "block": "asset_config_bool_false@17", + "stack_in": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1" + ], + "op": "intc_0 // 0", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "or_result%0#0" + ] + }, + "1321": { + "op": "b asset_config_bool_merge@18" + }, + "1324": { + "block": "asset_config_bool_false@4", + "stack_in": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1" + ], + "op": "intc_0 // 0", + "defined_out": [ + "and_result%0#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "day_count_convention#1", + "interest_rate#1", + "tmp%3#1", + "denomination_asset_id#1", + "and_result%0#0" + ] + }, + "1325": { + "op": "b asset_config_bool_merge@5" + }, + "1328": { + "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_time_events_sorted", + "params": { + "time_events#0": "bytes" + }, + "block": "assert_time_events_sorted", + "stack_in": [], + "op": "proto 1 1" + }, + "1331": { + "op": "pushbytes \"\"", + "stack_out": [ + "time_f#0" + ] + }, + "1333": { + "op": "dup", + "stack_out": [ + "time_f#0", + "time_i#0" + ] + }, + "1334": { + "op": "frame_dig -1", + "defined_out": [ + "time_events#0 (copy)" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "time_events#0 (copy)" + ] + }, + "1336": { + "op": "extract 2 0", + "defined_out": [ + "array_head_and_tail%0#0" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0" + ] + }, + "1339": { + "op": "dup", + "defined_out": [ + "array_head_and_tail%0#0" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "array_head_and_tail%0#0" + ] + }, + "1340": { + "error": "Index access is out of bounds", + "op": "extract 0 8 // on error: Index access is out of bounds", + "defined_out": [ + "array_head_and_tail%0#0", + "tmp%0#0" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%0#0" + ] + }, + "1343": { + "op": "btoi", + "defined_out": [ + "array_head_and_tail%0#0", + "tmp%1#0" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%1#0" + ] + }, + "1344": { + "op": "global LatestTimestamp", + "defined_out": [ + "array_head_and_tail%0#0", + "tmp%1#0", + "tmp%2#0" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%1#0", + "tmp%2#0" + ] + }, + "1346": { + "op": ">", + "defined_out": [ + "array_head_and_tail%0#0", + "tmp%3#0" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%3#0" + ] + }, + "1347": { + "error": "Time events must be set in the future", + "op": "assert // Time events must be set in the future", + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0" + ] + }, + "1348": { + "op": "frame_dig -1", + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "time_events#0 (copy)" + ] + }, + "1350": { + "op": "intc_0 // 0", + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "time_events#0 (copy)", + "0" + ] + }, + "1351": { + "op": "extract_uint16", + "defined_out": [ + "array_head_and_tail%0#0", + "tmp%4#0" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%4#0" + ] + }, + "1352": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "array_head_and_tail%0#0", + "tmp%4#0" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%4#0", + "1" + ] + }, + "1353": { + "op": "-", + "defined_out": [ + "array_head_and_tail%0#0", + "tmp%5#0" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0" + ] + }, + "1354": { + "op": "intc_0 // 0", + "defined_out": [ + "_t#0", + "array_head_and_tail%0#0", + "tmp%5#0" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0" + ] + }, + "1355": { + "block": "assert_time_events_sorted_for_header@1", + "stack_in": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0" + ], + "op": "frame_dig 4", + "defined_out": [ + "_t#0" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "_t#0" + ] + }, + "1357": { + "op": "frame_dig 3", + "defined_out": [ + "_t#0", + "tmp%5#0" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "_t#0", + "tmp%5#0" + ] + }, + "1359": { + "op": "<", + "defined_out": [ + "_t#0", + "continue_looping%0#0", + "tmp%5#0" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "continue_looping%0#0" + ] + }, + "1360": { + "op": "bz assert_time_events_sorted_after_for@6", + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0" + ] + }, + "1363": { + "block": "assert_time_events_sorted_while_top@8", + "stack_in": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0" + ], + "op": "pushint 75 // 75" + }, + "1365": { + "op": "global OpcodeBudget", + "defined_out": [ + "75", + "tmp%0#1" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "75", + "tmp%0#1" + ] + }, + "1367": { + "op": ">", + "defined_out": [ + "tmp%1#1" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "tmp%1#1" + ] + }, + "1368": { + "op": "bz assert_time_events_sorted_after_while@14", + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0" + ] + }, + "1371": { + "op": "itxn_begin" + }, + "1372": { + "op": "pushint 6 // appl" + }, + "1374": { + "op": "itxn_field TypeEnum" + }, + "1376": { + "op": "pushint 5 // DeleteApplication" + }, + "1378": { + "op": "itxn_field OnCompletion" + }, + "1380": { + "op": "bytec 29 // 0x068101" + }, + "1382": { + "op": "itxn_field ApprovalProgram" + }, + "1384": { + "op": "bytec 29 // 0x068101" + }, + "1386": { + "op": "itxn_field ClearStateProgram" + }, + "1388": { + "op": "global MinTxnFee" + }, + "1390": { + "op": "itxn_field Fee" + }, + "1392": { + "op": "itxn_submit" + }, + "1393": { + "op": "b assert_time_events_sorted_while_top@8" + }, + "1396": { + "block": "assert_time_events_sorted_after_while@14", + "stack_in": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0" + ], + "op": "frame_dig 4", + "defined_out": [ + "_t#0" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "_t#0" + ] + }, + "1398": { + "op": "dup", + "defined_out": [ + "_t#0", + "_t#0 (copy)" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "_t#0", + "_t#0 (copy)" + ] + }, + "1399": { + "op": "intc_2 // 8", + "defined_out": [ + "8", + "_t#0", + "_t#0 (copy)" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "_t#0", + "_t#0 (copy)", + "8" + ] + }, + "1400": { + "op": "*", + "defined_out": [ + "_t#0", + "item_offset%1#0" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "_t#0", + "item_offset%1#0" + ] + }, + "1401": { + "op": "frame_dig 2", + "defined_out": [ + "_t#0", + "array_head_and_tail%0#0", + "item_offset%1#0" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "_t#0", + "item_offset%1#0", + "array_head_and_tail%0#0" + ] + }, + "1403": { + "op": "dup", + "defined_out": [ + "_t#0", + "array_head_and_tail%0#0", + "array_head_and_tail%0#0 (copy)", + "item_offset%1#0" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "_t#0", + "item_offset%1#0", + "array_head_and_tail%0#0 (copy)", + "array_head_and_tail%0#0 (copy)" + ] + }, + "1404": { + "op": "cover 3", + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "array_head_and_tail%0#0", + "_t#0", + "item_offset%1#0", + "array_head_and_tail%0#0 (copy)" + ] + }, + "1406": { + "op": "swap", + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "array_head_and_tail%0#0", + "_t#0", + "array_head_and_tail%0#0 (copy)", + "item_offset%1#0" + ] + }, + "1407": { + "op": "intc_2 // 8", + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "array_head_and_tail%0#0", + "_t#0", + "array_head_and_tail%0#0 (copy)", + "item_offset%1#0", + "8" + ] + }, + "1408": { + "error": "Index access is out of bounds", + "op": "extract3 // on error: Index access is out of bounds", + "defined_out": [ + "_t#0", + "array_head_and_tail%0#0", + "tmp%6#0" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "array_head_and_tail%0#0", + "_t#0", + "tmp%6#0" + ] + }, + "1409": { + "op": "btoi", + "defined_out": [ + "_t#0", + "array_head_and_tail%0#0", + "time_i#0" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "array_head_and_tail%0#0", + "_t#0", + "time_i#0" + ] + }, + "1410": { + "op": "dup", + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "array_head_and_tail%0#0", + "_t#0", + "time_i#0", + "time_i#0 (copy)" + ] + }, + "1411": { + "op": "cover 3", + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "time_i#0", + "array_head_and_tail%0#0", + "_t#0", + "time_i#0" + ] + }, + "1413": { + "op": "frame_bury 1", + "defined_out": [ + "_t#0", + "array_head_and_tail%0#0", + "time_i#0" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "time_i#0", + "array_head_and_tail%0#0", + "_t#0" + ] + }, + "1415": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "_t#0", + "array_head_and_tail%0#0", + "time_i#0" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "time_i#0", + "array_head_and_tail%0#0", + "_t#0", + "1" + ] + }, + "1416": { + "op": "+", + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "time_i#0", + "array_head_and_tail%0#0", + "_t#0" + ] + }, + "1417": { + "op": "dup", + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "time_i#0", + "array_head_and_tail%0#0", + "_t#0", + "_t#0" + ] + }, + "1418": { + "op": "frame_bury 4", + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "time_i#0", + "array_head_and_tail%0#0", + "_t#0" + ] + }, + "1420": { + "op": "intc_2 // 8", + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "time_i#0", + "array_head_and_tail%0#0", + "_t#0", + "8" + ] + }, + "1421": { + "op": "*", + "defined_out": [ + "_t#0", + "array_head_and_tail%0#0", + "item_offset%2#0", + "time_i#0" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "time_i#0", + "array_head_and_tail%0#0", + "item_offset%2#0" + ] + }, + "1422": { + "op": "intc_2 // 8", + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "time_i#0", + "array_head_and_tail%0#0", + "item_offset%2#0", + "8" + ] + }, + "1423": { + "error": "Index access is out of bounds", + "op": "extract3 // on error: Index access is out of bounds", + "defined_out": [ + "_t#0", + "array_head_and_tail%0#0", + "time_i#0", + "tmp%8#0" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "time_i#0", + "tmp%8#0" + ] + }, + "1424": { + "op": "btoi", + "defined_out": [ + "_t#0", + "array_head_and_tail%0#0", + "time_f#0", + "time_i#0" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "time_i#0", + "time_f#0" + ] + }, + "1425": { + "op": "dup", + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "time_i#0", + "time_f#0", + "time_f#0" + ] + }, + "1426": { + "op": "frame_bury 0", + "defined_out": [ + "_t#0", + "array_head_and_tail%0#0", + "time_f#0", + "time_i#0" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "time_i#0", + "time_f#0" + ] + }, + "1428": { + "op": "<", + "defined_out": [ + "_t#0", + "array_head_and_tail%0#0", + "time_f#0", + "time_i#0", + "tmp%9#0" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "tmp%9#0" + ] + }, + "1429": { + "error": "Time events must be sorted in strictly ascending order", + "op": "assert // Time events must be sorted in strictly ascending order", + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0" + ] + }, + "1430": { + "op": "intc_0 // 0", + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "0" + ] + }, + "1431": { + "op": "bytec 11 // \"day_count_convention\"", + "defined_out": [ + "\"day_count_convention\"", + "0", + "_t#0", + "array_head_and_tail%0#0", + "time_f#0", + "time_i#0" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "0", + "\"day_count_convention\"" + ] + }, + "1433": { + "op": "app_global_get_ex", + "defined_out": [ + "_t#0", + "array_head_and_tail%0#0", + "maybe_exists%0#0", + "maybe_value%0#0", + "time_f#0", + "time_i#0" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1434": { + "error": "check self.day_count_convention exists", + "op": "assert // check self.day_count_convention exists", + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "maybe_value%0#0" + ] + }, + "1435": { + "op": "pushint 255 // 255", + "defined_out": [ + "255", + "_t#0", + "array_head_and_tail%0#0", + "maybe_value%0#0", + "time_f#0", + "time_i#0" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "maybe_value%0#0", + "255" + ] + }, + "1438": { + "op": "!=", + "defined_out": [ + "_t#0", + "array_head_and_tail%0#0", + "time_f#0", + "time_i#0", + "tmp%10#0" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "tmp%10#0" + ] + }, + "1439": { + "op": "bz assert_time_events_sorted_for_header@1", + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0" + ] + }, + "1442": { + "op": "frame_dig 0" + }, + "1444": { + "op": "frame_dig 1" + }, + "1446": { + "op": "-" + }, + "1447": { + "op": "pushint 86400 // 86400" + }, + "1451": { + "op": "%" + }, + "1452": { + "op": "!" + }, + "1453": { + "error": "Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)", + "op": "assert // Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)" + }, + "1454": { + "op": "b assert_time_events_sorted_for_header@1" + }, + "1457": { + "block": "assert_time_events_sorted_after_for@6", + "stack_in": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0" + ], + "op": "frame_dig -1", + "defined_out": [ + "time_events#0 (copy)" + ], + "stack_out": [ + "time_f#0", + "time_i#0", + "array_head_and_tail%0#0", + "tmp%5#0", + "_t#0", + "time_events#0 (copy)" + ] + }, + "1459": { + "op": "frame_bury 0" + }, + "1461": { + "retsub": true, + "op": "retsub" + }, + "1462": { + "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.set_secondary_time_events", + "params": { + "secondary_market_time_events#0": "bytes" + }, + "block": "set_secondary_time_events", + "stack_in": [], + "op": "proto 1 1" + }, + "1465": { + "op": "intc_0 // 0", + "stack_out": [ + "array_head_and_tail%0#0" + ] + }, + "1466": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_caller_is_arranger", + "op": "callsub assert_caller_is_arranger" + }, + "1469": { + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "0" + ] + }, + "1470": { + "op": "bytec_2 // \"status\"", + "defined_out": [ + "\"status\"", + "0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "0", + "\"status\"" + ] + }, + "1471": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1472": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "array_head_and_tail%0#0", + "maybe_value%0#0" + ] + }, + "1473": { + "op": "intc 4 // 200", + "defined_out": [ + "200", + "maybe_value%0#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "maybe_value%0#0", + "200" + ] + }, + "1475": { + "op": "==", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "tmp%0#1" + ] + }, + "1476": { + "op": "!", + "defined_out": [ + "tmp%1#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "tmp%1#0" + ] + }, + "1477": { + "error": "Not authorized", + "op": "assert // Not authorized", + "stack_out": [ + "array_head_and_tail%0#0" + ] + }, + "1478": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_is_not_defaulted", + "op": "callsub assert_is_not_defaulted" + }, + "1481": { + "op": "frame_dig -1", + "defined_out": [ + "secondary_market_time_events#0 (copy)" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#0 (copy)" + ] + }, + "1483": { + "op": "intc_0 // 0", + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#0 (copy)", + "0" + ] + }, + "1484": { + "op": "extract_uint16", + "defined_out": [ + "tmp%2#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "tmp%2#0" + ] + }, + "1485": { + "op": "dup", + "defined_out": [ + "tmp%2#0", + "tmp%2#0 (copy)" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "tmp%2#0", + "tmp%2#0 (copy)" + ] + }, + "1486": { + "error": "Time events length is invalid", + "op": "assert // Time events length is invalid", + "stack_out": [ + "array_head_and_tail%0#0", + "tmp%2#0" + ] + }, + "1487": { + "op": "intc_1 // 1", + "defined_out": [ + "1", + "tmp%2#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "tmp%2#0", + "1" + ] + }, + "1488": { + "op": ">", + "defined_out": [ + "tmp%5#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "tmp%5#0" + ] + }, + "1489": { + "op": "frame_dig -1", + "defined_out": [ + "secondary_market_time_events#5", + "tmp%5#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "tmp%5#0", + "secondary_market_time_events#5" + ] + }, + "1491": { + "op": "swap", + "defined_out": [ + "secondary_market_time_events#5", + "tmp%5#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5", + "tmp%5#0" + ] + }, + "1492": { + "op": "bz set_secondary_time_events_after_if_else@2", + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5" + ] + }, + "1495": { + "op": "frame_dig -1" + }, + "1497": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_time_events_sorted", + "op": "callsub assert_time_events_sorted" + }, + "1500": { + "op": "dup" + }, + "1501": { + "op": "frame_bury -1" + }, + "1503": { + "op": "frame_bury 1" + }, + "1505": { + "block": "set_secondary_time_events_after_if_else@2", + "stack_in": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5" + ], + "op": "frame_dig 1", + "defined_out": [ + "secondary_market_time_events#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5", + "secondary_market_time_events#0" + ] + }, + "1507": { + "op": "frame_bury -1", + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5" + ] + }, + "1509": { + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5", + "0" + ] + }, + "1510": { + "op": "bytec 16 // \"issuance_date\"", + "defined_out": [ + "\"issuance_date\"", + "0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5", + "0", + "\"issuance_date\"" + ] + }, + "1512": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1513": { + "error": "check self.issuance_date exists", + "op": "assert // check self.issuance_date exists", + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5", + "maybe_value%0#0" + ] + }, + "1514": { + "op": "frame_dig -1", + "defined_out": [ + "maybe_value%0#0", + "secondary_market_time_events#0 (copy)" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5", + "maybe_value%0#0", + "secondary_market_time_events#0 (copy)" + ] + }, + "1516": { + "op": "extract 2 0", + "defined_out": [ + "array_head_and_tail%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5", + "maybe_value%0#0", + "array_head_and_tail%0#0" + ] + }, + "1519": { + "op": "dup", + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5", + "maybe_value%0#0", + "array_head_and_tail%0#0", + "array_head_and_tail%0#0" + ] + }, + "1520": { + "op": "frame_bury 0", + "defined_out": [ + "array_head_and_tail%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5", + "maybe_value%0#0", + "array_head_and_tail%0#0" + ] + }, + "1522": { + "error": "Index access is out of bounds", + "op": "extract 0 8 // on error: Index access is out of bounds", + "defined_out": [ + "array_head_and_tail%0#0", + "maybe_value%0#0", + "tmp%6#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5", + "maybe_value%0#0", + "tmp%6#0" + ] + }, + "1525": { + "op": "btoi", + "defined_out": [ + "array_head_and_tail%0#0", + "maybe_value%0#0", + "tmp%7#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5", + "maybe_value%0#0", + "tmp%7#0" + ] + }, + "1526": { + "op": "swap", + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5", + "tmp%7#0", + "maybe_value%0#0" + ] + }, + "1527": { + "op": "dig 1", + "defined_out": [ + "array_head_and_tail%0#0", + "maybe_value%0#0", + "tmp%7#0", + "tmp%7#0 (copy)" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5", + "tmp%7#0", + "maybe_value%0#0", + "tmp%7#0 (copy)" + ] + }, + "1529": { + "op": "<=", + "defined_out": [ + "array_head_and_tail%0#0", + "tmp%7#0", + "tmp%8#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5", + "tmp%7#0", + "tmp%8#0" + ] + }, + "1530": { + "error": "Invalid secondary market opening date", + "op": "assert // Invalid secondary market opening date", + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5", + "tmp%7#0" + ] + }, + "1531": { + "op": "bytec 17 // \"secondary_market_opening_date\"", + "defined_out": [ + "\"secondary_market_opening_date\"", + "array_head_and_tail%0#0", + "tmp%7#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5", + "tmp%7#0", + "\"secondary_market_opening_date\"" + ] + }, + "1533": { + "op": "swap", + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5", + "\"secondary_market_opening_date\"", + "tmp%7#0" + ] + }, + "1534": { + "op": "app_global_put", + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5" + ] + }, + "1535": { + "op": "intc_0 // 0", + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5", + "0" + ] + }, + "1536": { + "op": "bytec_3 // \"maturity_date\"", + "defined_out": [ + "\"maturity_date\"", + "0", + "array_head_and_tail%0#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5", + "0", + "\"maturity_date\"" + ] + }, + "1537": { + "op": "app_global_get_ex", + "defined_out": [ + "array_head_and_tail%0#0", + "maybe_exists%1#0", + "maybe_value%1#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "1538": { + "error": "check self.maturity_date exists", + "op": "assert // check self.maturity_date exists", + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5", + "maybe_value%1#0" + ] + }, + "1539": { + "op": "bz set_secondary_time_events_after_if_else@4", + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5" + ] + }, + "1542": { + "op": "intc_0 // 0" + }, + "1543": { + "op": "bytec_3 // \"maturity_date\"" + }, + "1544": { + "op": "app_global_get_ex" + }, + "1545": { + "error": "check self.maturity_date exists", + "op": "assert // check self.maturity_date exists" + }, + "1546": { + "op": "frame_dig -1" + }, + "1548": { + "op": "intc_0 // 0" + }, + "1549": { + "op": "extract_uint16" + }, + "1550": { + "op": "intc_1 // 1" + }, + "1551": { + "op": "-" + }, + "1552": { + "op": "intc_2 // 8" + }, + "1553": { + "op": "*" + }, + "1554": { + "op": "frame_dig 0" + }, + "1556": { + "op": "swap" + }, + "1557": { + "op": "intc_2 // 8" + }, + "1558": { + "error": "Index access is out of bounds", + "op": "extract3 // on error: Index access is out of bounds" + }, + "1559": { + "op": "btoi" + }, + "1560": { + "op": "swap" + }, + "1561": { + "op": "dig 1" + }, + "1563": { + "op": ">=" + }, + "1564": { + "error": "Invalid secondary market closure date", + "op": "assert // Invalid secondary market closure date" + }, + "1565": { + "op": "bytec 18 // \"secondary_market_closure_date\"" + }, + "1567": { + "op": "swap" + }, + "1568": { + "op": "app_global_put" + }, + "1569": { + "block": "set_secondary_time_events_after_if_else@4", + "stack_in": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5" + ], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5", + "0" + ] + }, + "1570": { + "op": "bytec 17 // \"secondary_market_opening_date\"", + "defined_out": [ + "\"secondary_market_opening_date\"", + "0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5", + "0", + "\"secondary_market_opening_date\"" + ] + }, + "1572": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%3#0", + "maybe_value%3#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5", + "maybe_value%3#0", + "maybe_exists%3#0" + ] + }, + "1573": { + "error": "check self.secondary_market_opening_date exists", + "op": "assert // check self.secondary_market_opening_date exists", + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5", + "maybe_value%3#0" + ] + }, + "1574": { + "op": "itob", + "defined_out": [ + "val_as_bytes%0#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5", + "val_as_bytes%0#0" + ] + }, + "1575": { + "op": "intc_0 // 0", + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5", + "val_as_bytes%0#0", + "0" + ] + }, + "1576": { + "op": "bytec 18 // \"secondary_market_closure_date\"", + "defined_out": [ + "\"secondary_market_closure_date\"", + "0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5", + "val_as_bytes%0#0", + "0", + "\"secondary_market_closure_date\"" + ] + }, + "1578": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%4#0", + "maybe_value%4#0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5", + "val_as_bytes%0#0", + "maybe_value%4#0", + "maybe_exists%4#0" + ] + }, + "1579": { + "error": "check self.secondary_market_closure_date exists", + "op": "assert // check self.secondary_market_closure_date exists", + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5", + "val_as_bytes%0#0", + "maybe_value%4#0" + ] + }, + "1580": { + "op": "itob", + "defined_out": [ + "val_as_bytes%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5", + "val_as_bytes%0#0", + "val_as_bytes%1#0" + ] + }, + "1581": { + "op": "concat", + "defined_out": [ + "encoded_tuple_buffer%2#0" + ], + "stack_out": [ + "array_head_and_tail%0#0", + "secondary_market_time_events#5", + "encoded_tuple_buffer%2#0" + ] + }, + "1582": { + "op": "frame_bury 0" + }, + "1584": { + "retsub": true, + "op": "retsub" + }, + "1585": { + "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_is_not_defaulted", + "params": {}, + "block": "assert_is_not_defaulted", + "stack_in": [], + "op": "proto 0 0" + }, + "1588": { + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "1589": { + "op": "bytec 20 // \"defaulted\"", + "defined_out": [ + "\"defaulted\"", + "0" + ], + "stack_out": [ + "0", + "\"defaulted\"" + ] + }, + "1591": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1592": { + "error": "check self.defaulted exists", + "op": "assert // check self.defaulted exists", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "1593": { + "op": "!", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "1594": { + "error": "Defaulted", + "op": "assert // Defaulted", + "stack_out": [] + }, + "1595": { + "retsub": true, + "op": "retsub" + }, + "1596": { + "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.assign_role", + "params": { + "role_address#0": "bytes", + "role#0": "bytes", + "config#0": "bytes" + }, + "block": "assign_role", + "stack_in": [], + "op": "proto 3 1" + }, + "1599": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_caller_is_arranger", + "op": "callsub assert_caller_is_arranger" + }, + "1602": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_is_not_defaulted", + "op": "callsub assert_is_not_defaulted" + }, + "1605": { + "op": "frame_dig -2", + "defined_out": [ + "role#0 (copy)" + ], + "stack_out": [ + "role#0 (copy)" + ] + }, + "1607": { + "op": "btoi", + "defined_out": [ + "awst_tmp%0#0" + ], + "stack_out": [ + "awst_tmp%0#0" + ] + }, + "1608": { + "op": "dup", + "defined_out": [ + "awst_tmp%0#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "awst_tmp%0#0" + ] + }, + "1609": { + "op": "pushint 20 // 20", + "defined_out": [ + "20", + "awst_tmp%0#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "awst_tmp%0#0", + "20" + ] + }, + "1611": { + "op": "==", + "defined_out": [ + "awst_tmp%0#0", + "tmp%0#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%0#0" + ] + }, + "1612": { + "op": "bnz assign_role_bool_true@6", + "stack_out": [ + "awst_tmp%0#0" + ] + }, + "1615": { + "op": "frame_dig 0" + }, + "1617": { + "op": "pushint 40 // 40" + }, + "1619": { + "op": "==" + }, + "1620": { + "op": "bnz assign_role_bool_true@6" + }, + "1623": { + "op": "frame_dig 0" + }, + "1625": { + "op": "pushint 50 // 50" + }, + "1627": { + "op": "==" + }, + "1628": { + "op": "bnz assign_role_bool_true@6" + }, + "1631": { + "op": "frame_dig 0" + }, + "1633": { + "op": "pushint 60 // 60" + }, + "1635": { + "op": "==" + }, + "1636": { + "op": "bnz assign_role_bool_true@6" + }, + "1639": { + "op": "frame_dig 0" + }, + "1641": { + "op": "pushint 70 // 70" + }, + "1643": { + "op": "==" + }, + "1644": { + "op": "bnz assign_role_bool_true@6" + }, + "1647": { + "op": "frame_dig 0" + }, + "1649": { + "op": "pushint 80 // 80" + }, + "1651": { + "op": "==" + }, + "1652": { + "op": "bz assign_role_bool_false@7" + }, + "1655": { + "block": "assign_role_bool_true@6", + "stack_in": [ + "awst_tmp%0#0" + ], + "op": "intc_1 // 1", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "or_result%0#0" + ] + }, + "1656": { + "block": "assign_role_bool_merge@8", + "stack_in": [ + "awst_tmp%0#0", + "or_result%0#0" + ], + "error": "Invalid role identifier", + "op": "assert // Invalid role identifier", + "defined_out": [], + "stack_out": [ + "awst_tmp%0#0" + ] + }, + "1657": { + "op": "pushints 20 40 50 60 70 80 // 20, 40, 50, 60, 70, 80", + "defined_out": [ + "20", + "40", + "50", + "60", + "70", + "80" + ], + "stack_out": [ + "awst_tmp%0#0", + "20", + "40", + "50", + "60", + "70", + "80" + ] + }, + "1665": { + "op": "frame_dig 0", + "defined_out": [ + "20", + "40", + "50", + "60", + "70", + "80", + "awst_tmp%0#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "20", + "40", + "50", + "60", + "70", + "80", + "awst_tmp%0#0" + ] + }, + "1667": { + "op": "match assign_role_switch_case_0@9 assign_role_switch_case_1@10 assign_role_switch_case_2@11 assign_role_switch_case_3@12 assign_role_switch_case_4@13 assign_role_switch_case_5@14", + "stack_out": [ + "awst_tmp%0#0" + ] + }, + "1681": { + "op": "err" + }, + "1682": { + "block": "assign_role_switch_case_5@14", + "stack_in": [ + "awst_tmp%0#0" + ], + "op": "bytec 30 // 0x52383023", + "defined_out": [ + "0x52383023" + ], + "stack_out": [ + "awst_tmp%0#0", + "0x52383023" + ] + }, + "1684": { + "op": "frame_dig -3", + "defined_out": [ + "0x52383023", + "role_address#0 (copy)" + ], + "stack_out": [ + "awst_tmp%0#0", + "0x52383023", + "role_address#0 (copy)" + ] + }, + "1686": { + "op": "concat", + "defined_out": [ + "tmp%19#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%19#0" + ] + }, + "1687": { + "op": "dup", + "defined_out": [ + "tmp%19#0", + "tmp%19#0 (copy)" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%19#0", + "tmp%19#0 (copy)" + ] + }, + "1688": { + "op": "box_len", + "defined_out": [ + "maybe_exists%4#0", + "maybe_value%4#0", + "tmp%19#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%19#0", + "maybe_value%4#0", + "maybe_exists%4#0" + ] + }, + "1689": { + "op": "bury 1", + "stack_out": [ + "awst_tmp%0#0", + "tmp%19#0", + "maybe_exists%4#0" + ] + }, + "1691": { + "op": "!", + "defined_out": [ + "tmp%19#0", + "tmp%20#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%19#0", + "tmp%20#0" + ] + }, + "1692": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "awst_tmp%0#0", + "tmp%19#0" + ] + }, + "1693": { + "op": "frame_dig -1", + "defined_out": [ + "config#0 (copy)", + "tmp%19#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%19#0", + "config#0 (copy)" + ] + }, + "1695": { + "op": "extract 2 0", + "defined_out": [ + "new_box_value%4#0", + "tmp%19#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%19#0", + "new_box_value%4#0" + ] + }, + "1698": { + "op": "box_put", + "stack_out": [ + "awst_tmp%0#0" + ] + }, + "1699": { + "block": "assign_role_switch_case_next@16", + "stack_in": [ + "awst_tmp%0#0" + ], + "op": "global LatestTimestamp", + "defined_out": [ + "to_encode%0#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "to_encode%0#0" + ] + }, + "1701": { + "op": "itob", + "defined_out": [ + "val_as_bytes%0#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "val_as_bytes%0#0" + ] + }, + "1702": { + "op": "swap" + }, + "1703": { + "retsub": true, + "op": "retsub" + }, + "1704": { + "block": "assign_role_switch_case_4@13", + "stack_in": [ + "awst_tmp%0#0" + ], + "op": "bytec 23 // 0x52373023", + "defined_out": [ + "0x52373023" + ], + "stack_out": [ + "awst_tmp%0#0", + "0x52373023" + ] + }, + "1706": { + "op": "frame_dig -3", + "defined_out": [ + "0x52373023", + "role_address#0 (copy)" + ], + "stack_out": [ + "awst_tmp%0#0", + "0x52373023", + "role_address#0 (copy)" + ] + }, + "1708": { + "op": "concat", + "defined_out": [ + "tmp%16#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%16#0" + ] + }, + "1709": { + "op": "dup", + "defined_out": [ + "tmp%16#0", + "tmp%16#0 (copy)" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%16#0", + "tmp%16#0 (copy)" + ] + }, + "1710": { + "op": "box_len", + "defined_out": [ + "maybe_exists%3#0", + "maybe_value%3#0", + "tmp%16#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%16#0", + "maybe_value%3#0", + "maybe_exists%3#0" + ] + }, + "1711": { + "op": "bury 1", + "stack_out": [ + "awst_tmp%0#0", + "tmp%16#0", + "maybe_exists%3#0" + ] + }, + "1713": { + "op": "!", + "defined_out": [ + "tmp%16#0", + "tmp%17#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%16#0", + "tmp%17#0" + ] + }, + "1714": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "awst_tmp%0#0", + "tmp%16#0" + ] + }, + "1715": { + "op": "frame_dig -1", + "defined_out": [ + "config#0 (copy)", + "tmp%16#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%16#0", + "config#0 (copy)" + ] + }, + "1717": { + "op": "extract 2 0", + "defined_out": [ + "new_box_value%3#0", + "tmp%16#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%16#0", + "new_box_value%3#0" + ] + }, + "1720": { + "op": "box_put", + "stack_out": [ + "awst_tmp%0#0" + ] + }, + "1721": { + "op": "b assign_role_switch_case_next@16" + }, + "1724": { + "block": "assign_role_switch_case_3@12", + "stack_in": [ + "awst_tmp%0#0" + ], + "op": "bytec 24 // 0x52363023", + "defined_out": [ + "0x52363023" + ], + "stack_out": [ + "awst_tmp%0#0", + "0x52363023" + ] + }, + "1726": { + "op": "frame_dig -3", + "defined_out": [ + "0x52363023", + "role_address#0 (copy)" + ], + "stack_out": [ + "awst_tmp%0#0", + "0x52363023", + "role_address#0 (copy)" + ] + }, + "1728": { + "op": "concat", + "defined_out": [ + "tmp%13#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%13#0" + ] + }, + "1729": { + "op": "dup", + "defined_out": [ + "tmp%13#0", + "tmp%13#0 (copy)" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%13#0", + "tmp%13#0 (copy)" + ] + }, + "1730": { + "op": "box_len", + "defined_out": [ + "maybe_exists%2#0", + "maybe_value%2#0", + "tmp%13#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%13#0", + "maybe_value%2#0", + "maybe_exists%2#0" + ] + }, + "1731": { + "op": "bury 1", + "stack_out": [ + "awst_tmp%0#0", + "tmp%13#0", + "maybe_exists%2#0" + ] + }, + "1733": { + "op": "!", + "defined_out": [ + "tmp%13#0", + "tmp%14#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%13#0", + "tmp%14#0" + ] + }, + "1734": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "awst_tmp%0#0", + "tmp%13#0" + ] + }, + "1735": { + "op": "frame_dig -1", + "defined_out": [ + "config#0 (copy)", + "tmp%13#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%13#0", + "config#0 (copy)" + ] + }, + "1737": { + "op": "extract 2 0", + "defined_out": [ + "new_box_value%2#0", + "tmp%13#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%13#0", + "new_box_value%2#0" + ] + }, + "1740": { + "op": "box_put", + "stack_out": [ + "awst_tmp%0#0" + ] + }, + "1741": { + "op": "b assign_role_switch_case_next@16" + }, + "1744": { + "block": "assign_role_switch_case_2@11", + "stack_in": [ + "awst_tmp%0#0" + ], + "op": "bytec 25 // 0x52353023", + "defined_out": [ + "0x52353023" + ], + "stack_out": [ + "awst_tmp%0#0", + "0x52353023" + ] + }, + "1746": { + "op": "frame_dig -3", + "defined_out": [ + "0x52353023", + "role_address#0 (copy)" + ], + "stack_out": [ + "awst_tmp%0#0", + "0x52353023", + "role_address#0 (copy)" + ] + }, + "1748": { + "op": "concat", + "defined_out": [ + "tmp%10#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%10#0" + ] + }, + "1749": { + "op": "dup", + "defined_out": [ + "tmp%10#0", + "tmp%10#0 (copy)" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%10#0", + "tmp%10#0 (copy)" + ] + }, + "1750": { + "op": "box_len", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#0", + "tmp%10#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%10#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "1751": { + "op": "bury 1", + "stack_out": [ + "awst_tmp%0#0", + "tmp%10#0", + "maybe_exists%1#0" + ] + }, + "1753": { + "op": "!", + "defined_out": [ + "tmp%10#0", + "tmp%11#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%10#0", + "tmp%11#0" + ] + }, + "1754": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "awst_tmp%0#0", + "tmp%10#0" + ] + }, + "1755": { + "op": "frame_dig -1", + "defined_out": [ + "config#0 (copy)", + "tmp%10#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%10#0", + "config#0 (copy)" + ] + }, + "1757": { + "op": "extract 2 0", + "defined_out": [ + "new_box_value%1#0", + "tmp%10#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%10#0", + "new_box_value%1#0" + ] + }, + "1760": { + "op": "box_put", + "stack_out": [ + "awst_tmp%0#0" + ] + }, + "1761": { + "op": "b assign_role_switch_case_next@16" + }, + "1764": { + "block": "assign_role_switch_case_1@10", + "stack_in": [ + "awst_tmp%0#0" + ], + "op": "bytec 26 // 0x52343023", + "defined_out": [ + "0x52343023" + ], + "stack_out": [ + "awst_tmp%0#0", + "0x52343023" + ] + }, + "1766": { + "op": "frame_dig -3", + "defined_out": [ + "0x52343023", + "role_address#0 (copy)" + ], + "stack_out": [ + "awst_tmp%0#0", + "0x52343023", + "role_address#0 (copy)" + ] + }, + "1768": { + "op": "concat", + "defined_out": [ + "tmp%7#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%7#0" + ] + }, + "1769": { + "op": "dup", + "defined_out": [ + "tmp%7#0", + "tmp%7#0 (copy)" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%7#0", + "tmp%7#0 (copy)" + ] + }, + "1770": { + "op": "box_len", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "tmp%7#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%7#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1771": { + "op": "bury 1", + "stack_out": [ + "awst_tmp%0#0", + "tmp%7#0", + "maybe_exists%0#0" + ] + }, + "1773": { + "op": "!", + "defined_out": [ + "tmp%7#0", + "tmp%8#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%7#0", + "tmp%8#0" + ] + }, + "1774": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "awst_tmp%0#0", + "tmp%7#0" + ] + }, + "1775": { + "op": "frame_dig -1", + "defined_out": [ + "config#0 (copy)", + "tmp%7#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%7#0", + "config#0 (copy)" + ] + }, + "1777": { + "op": "extract 2 0", + "defined_out": [ + "new_box_value%0#0", + "tmp%7#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%7#0", + "new_box_value%0#0" + ] + }, + "1780": { + "op": "box_put", + "stack_out": [ + "awst_tmp%0#0" + ] + }, + "1781": { + "op": "b assign_role_switch_case_next@16" + }, + "1784": { + "block": "assign_role_switch_case_0@9", + "stack_in": [ + "awst_tmp%0#0" + ], + "op": "bytec 8 // 0x52323023", + "defined_out": [ + "0x52323023" + ], + "stack_out": [ + "awst_tmp%0#0", + "0x52323023" + ] + }, + "1786": { + "op": "frame_dig -3", + "defined_out": [ + "0x52323023", + "role_address#0 (copy)" + ], + "stack_out": [ + "awst_tmp%0#0", + "0x52323023", + "role_address#0 (copy)" + ] + }, + "1788": { + "op": "app_global_put", + "stack_out": [ + "awst_tmp%0#0" + ] + }, + "1789": { + "op": "b assign_role_switch_case_next@16" + }, + "1792": { + "block": "assign_role_bool_false@7", + "stack_in": [ + "awst_tmp%0#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "or_result%0#0" + ] + }, + "1793": { + "op": "b assign_role_bool_merge@8" + }, + "1796": { + "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.revoke_role", + "params": { + "role_address#0": "bytes", + "role#0": "bytes" + }, + "block": "revoke_role", + "stack_in": [], + "op": "proto 2 1" + }, + "1799": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_caller_is_arranger", + "op": "callsub assert_caller_is_arranger" + }, + "1802": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_is_not_defaulted", + "op": "callsub assert_is_not_defaulted" + }, + "1805": { + "op": "frame_dig -1", + "defined_out": [ + "role#0 (copy)" + ], + "stack_out": [ + "role#0 (copy)" + ] + }, + "1807": { + "op": "btoi", + "defined_out": [ + "awst_tmp%0#0" + ], + "stack_out": [ + "awst_tmp%0#0" + ] + }, + "1808": { + "op": "dup", + "defined_out": [ + "awst_tmp%0#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "awst_tmp%0#0" + ] + }, + "1809": { + "op": "pushint 40 // 40", + "defined_out": [ + "40", + "awst_tmp%0#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "awst_tmp%0#0", + "40" + ] + }, + "1811": { + "op": "==", + "defined_out": [ + "awst_tmp%0#0", + "tmp%0#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%0#0" + ] + }, + "1812": { + "op": "bnz revoke_role_bool_true@5", + "stack_out": [ + "awst_tmp%0#0" + ] + }, + "1815": { + "op": "frame_dig 0" + }, + "1817": { + "op": "pushint 50 // 50" + }, + "1819": { + "op": "==" + }, + "1820": { + "op": "bnz revoke_role_bool_true@5" + }, + "1823": { + "op": "frame_dig 0" + }, + "1825": { + "op": "pushint 60 // 60" + }, + "1827": { + "op": "==" + }, + "1828": { + "op": "bnz revoke_role_bool_true@5" + }, + "1831": { + "op": "frame_dig 0" + }, + "1833": { + "op": "pushint 70 // 70" + }, + "1835": { + "op": "==" + }, + "1836": { + "op": "bnz revoke_role_bool_true@5" + }, + "1839": { + "op": "frame_dig 0" + }, + "1841": { + "op": "pushint 80 // 80" + }, + "1843": { + "op": "==" + }, + "1844": { + "op": "bz revoke_role_bool_false@6" + }, + "1847": { + "block": "revoke_role_bool_true@5", + "stack_in": [ + "awst_tmp%0#0" + ], + "op": "intc_1 // 1", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "or_result%0#0" + ] + }, + "1848": { + "block": "revoke_role_bool_merge@7", + "stack_in": [ + "awst_tmp%0#0", + "or_result%0#0" + ], + "error": "Invalid role identifier", + "op": "assert // Invalid role identifier", + "defined_out": [], + "stack_out": [ + "awst_tmp%0#0" + ] + }, + "1849": { + "op": "pushints 40 50 60 70 80 // 40, 50, 60, 70, 80", + "defined_out": [ + "40", + "50", + "60", + "70", + "80" + ], + "stack_out": [ + "awst_tmp%0#0", + "40", + "50", + "60", + "70", + "80" + ] + }, + "1856": { + "op": "frame_dig 0", + "defined_out": [ + "40", + "50", + "60", + "70", + "80", + "awst_tmp%0#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "40", + "50", + "60", + "70", + "80", + "awst_tmp%0#0" + ] + }, + "1858": { + "op": "match revoke_role_switch_case_0@8 revoke_role_switch_case_1@9 revoke_role_switch_case_2@10 revoke_role_switch_case_3@11 revoke_role_switch_case_4@12", + "stack_out": [ + "awst_tmp%0#0" + ] + }, + "1870": { + "op": "err" + }, + "1871": { + "block": "revoke_role_switch_case_4@12", + "stack_in": [ + "awst_tmp%0#0" + ], + "op": "bytec 30 // 0x52383023", + "defined_out": [ + "0x52383023" + ], + "stack_out": [ + "awst_tmp%0#0", + "0x52383023" + ] + }, + "1873": { + "op": "frame_dig -2", + "defined_out": [ + "0x52383023", + "role_address#0 (copy)" + ], + "stack_out": [ + "awst_tmp%0#0", + "0x52383023", + "role_address#0 (copy)" + ] + }, + "1875": { + "op": "concat", + "defined_out": [ + "tmp%14#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%14#0" + ] + }, + "1876": { + "op": "dup", + "defined_out": [ + "tmp%14#0", + "tmp%14#0 (copy)" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%14#0", + "tmp%14#0 (copy)" + ] + }, + "1877": { + "op": "box_len", + "defined_out": [ + "maybe_exists%4#0", + "maybe_value%4#0", + "tmp%14#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%14#0", + "maybe_value%4#0", + "maybe_exists%4#0" + ] + }, + "1878": { + "op": "bury 1", + "stack_out": [ + "awst_tmp%0#0", + "tmp%14#0", + "maybe_exists%4#0" + ] + }, + "1880": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "awst_tmp%0#0", + "tmp%14#0" + ] + }, + "1881": { + "op": "box_del", + "defined_out": [ + "{box_del}" + ], + "stack_out": [ + "awst_tmp%0#0", + "{box_del}" + ] + }, + "1882": { + "op": "pop", + "stack_out": [ + "awst_tmp%0#0" + ] + }, + "1883": { + "block": "revoke_role_switch_case_next@14", + "stack_in": [ + "awst_tmp%0#0" + ], + "op": "global LatestTimestamp", + "defined_out": [ + "to_encode%0#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "to_encode%0#0" + ] + }, + "1885": { + "op": "itob", + "defined_out": [ + "val_as_bytes%0#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "val_as_bytes%0#0" + ] + }, + "1886": { + "op": "swap" + }, + "1887": { + "retsub": true, + "op": "retsub" + }, + "1888": { + "block": "revoke_role_switch_case_3@11", + "stack_in": [ + "awst_tmp%0#0" + ], + "op": "bytec 23 // 0x52373023", + "defined_out": [ + "0x52373023" + ], + "stack_out": [ + "awst_tmp%0#0", + "0x52373023" + ] + }, + "1890": { + "op": "frame_dig -2", + "defined_out": [ + "0x52373023", + "role_address#0 (copy)" + ], + "stack_out": [ + "awst_tmp%0#0", + "0x52373023", + "role_address#0 (copy)" + ] + }, + "1892": { + "op": "concat", + "defined_out": [ + "tmp%12#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%12#0" + ] + }, + "1893": { + "op": "dup", + "defined_out": [ + "tmp%12#0", + "tmp%12#0 (copy)" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%12#0", + "tmp%12#0 (copy)" + ] + }, + "1894": { + "op": "box_len", + "defined_out": [ + "maybe_exists%3#0", + "maybe_value%3#0", + "tmp%12#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%12#0", + "maybe_value%3#0", + "maybe_exists%3#0" + ] + }, + "1895": { + "op": "bury 1", + "stack_out": [ + "awst_tmp%0#0", + "tmp%12#0", + "maybe_exists%3#0" + ] + }, + "1897": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "awst_tmp%0#0", + "tmp%12#0" + ] + }, + "1898": { + "op": "box_del", + "defined_out": [ + "{box_del}" + ], + "stack_out": [ + "awst_tmp%0#0", + "{box_del}" + ] + }, + "1899": { + "op": "pop", + "stack_out": [ + "awst_tmp%0#0" + ] + }, + "1900": { + "op": "b revoke_role_switch_case_next@14" + }, + "1903": { + "block": "revoke_role_switch_case_2@10", + "stack_in": [ + "awst_tmp%0#0" + ], + "op": "bytec 24 // 0x52363023", + "defined_out": [ + "0x52363023" + ], + "stack_out": [ + "awst_tmp%0#0", + "0x52363023" + ] + }, + "1905": { + "op": "frame_dig -2", + "defined_out": [ + "0x52363023", + "role_address#0 (copy)" + ], + "stack_out": [ + "awst_tmp%0#0", + "0x52363023", + "role_address#0 (copy)" + ] + }, + "1907": { + "op": "concat", + "defined_out": [ + "tmp%10#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%10#0" + ] + }, + "1908": { + "op": "dup", + "defined_out": [ + "tmp%10#0", + "tmp%10#0 (copy)" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%10#0", + "tmp%10#0 (copy)" + ] + }, + "1909": { + "op": "box_len", + "defined_out": [ + "maybe_exists%2#0", + "maybe_value%2#0", + "tmp%10#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%10#0", + "maybe_value%2#0", + "maybe_exists%2#0" + ] + }, + "1910": { + "op": "bury 1", + "stack_out": [ + "awst_tmp%0#0", + "tmp%10#0", + "maybe_exists%2#0" + ] + }, + "1912": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "awst_tmp%0#0", + "tmp%10#0" + ] + }, + "1913": { + "op": "box_del", + "defined_out": [ + "{box_del}" + ], + "stack_out": [ + "awst_tmp%0#0", + "{box_del}" + ] + }, + "1914": { + "op": "pop", + "stack_out": [ + "awst_tmp%0#0" + ] + }, + "1915": { + "op": "b revoke_role_switch_case_next@14" + }, + "1918": { + "block": "revoke_role_switch_case_1@9", + "stack_in": [ + "awst_tmp%0#0" + ], + "op": "bytec 25 // 0x52353023", + "defined_out": [ + "0x52353023" + ], + "stack_out": [ + "awst_tmp%0#0", + "0x52353023" + ] + }, + "1920": { + "op": "frame_dig -2", + "defined_out": [ + "0x52353023", + "role_address#0 (copy)" + ], + "stack_out": [ + "awst_tmp%0#0", + "0x52353023", + "role_address#0 (copy)" + ] + }, + "1922": { + "op": "concat", + "defined_out": [ + "tmp%8#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%8#0" + ] + }, + "1923": { + "op": "dup", + "defined_out": [ + "tmp%8#0", + "tmp%8#0 (copy)" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%8#0", + "tmp%8#0 (copy)" + ] + }, + "1924": { + "op": "box_len", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#0", + "tmp%8#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%8#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "1925": { + "op": "bury 1", + "stack_out": [ + "awst_tmp%0#0", + "tmp%8#0", + "maybe_exists%1#0" + ] + }, + "1927": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "awst_tmp%0#0", + "tmp%8#0" + ] + }, + "1928": { + "op": "box_del", + "defined_out": [ + "{box_del}" + ], + "stack_out": [ + "awst_tmp%0#0", + "{box_del}" + ] + }, + "1929": { + "op": "pop", + "stack_out": [ + "awst_tmp%0#0" + ] + }, + "1930": { + "op": "b revoke_role_switch_case_next@14" + }, + "1933": { + "block": "revoke_role_switch_case_0@8", + "stack_in": [ + "awst_tmp%0#0" + ], + "op": "bytec 26 // 0x52343023", + "defined_out": [ + "0x52343023" + ], + "stack_out": [ + "awst_tmp%0#0", + "0x52343023" + ] + }, + "1935": { + "op": "frame_dig -2", + "defined_out": [ + "0x52343023", + "role_address#0 (copy)" + ], + "stack_out": [ + "awst_tmp%0#0", + "0x52343023", + "role_address#0 (copy)" + ] + }, + "1937": { + "op": "concat", + "defined_out": [ + "tmp%6#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%6#0" + ] + }, + "1938": { + "op": "dup", + "defined_out": [ + "tmp%6#0", + "tmp%6#0 (copy)" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%6#0", + "tmp%6#0 (copy)" + ] + }, + "1939": { + "op": "box_len", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "tmp%6#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "tmp%6#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1940": { + "op": "bury 1", + "stack_out": [ + "awst_tmp%0#0", + "tmp%6#0", + "maybe_exists%0#0" + ] + }, + "1942": { + "error": "Invalid account role address", + "op": "assert // Invalid account role address", + "stack_out": [ + "awst_tmp%0#0", + "tmp%6#0" + ] + }, + "1943": { + "op": "box_del", + "defined_out": [ + "{box_del}" + ], + "stack_out": [ + "awst_tmp%0#0", + "{box_del}" + ] + }, + "1944": { + "op": "pop", + "stack_out": [ + "awst_tmp%0#0" + ] + }, + "1945": { + "op": "b revoke_role_switch_case_next@14" + }, + "1948": { + "block": "revoke_role_bool_false@6", + "stack_in": [ + "awst_tmp%0#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "or_result%0#0" + ], + "stack_out": [ + "awst_tmp%0#0", + "or_result%0#0" + ] + }, + "1949": { + "op": "b revoke_role_bool_merge@7" + }, + "1952": { + "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.open_account", + "params": { + "holding_address#0": "bytes", + "payment_address#0": "bytes" + }, + "block": "open_account", + "stack_in": [], + "op": "proto 2 1" + }, + "1955": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_caller_is_account_manager", + "op": "callsub assert_caller_is_account_manager" + }, + "1958": { + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "1959": { + "op": "bytec_2 // \"status\"", + "defined_out": [ + "\"status\"", + "0" + ], + "stack_out": [ + "0", + "\"status\"" + ] + }, + "1960": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1961": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "1962": { + "op": "intc 4 // 200", + "defined_out": [ + "200", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "200" + ] + }, + "1964": { + "op": "==", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1" + ] + }, + "1965": { + "op": "!", + "defined_out": [ + "tmp%1#0" + ], + "stack_out": [ + "tmp%1#0" + ] + }, + "1966": { + "error": "Not authorized", + "op": "assert // Not authorized", + "stack_out": [] + }, + "1967": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_is_not_defaulted", + "op": "callsub assert_is_not_defaulted" + }, + "1970": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_is_not_suspended", + "op": "callsub assert_is_not_suspended" + }, + "1973": { + "op": "bytec 7 // 0x52333023", + "defined_out": [ + "0x52333023" + ], + "stack_out": [ + "0x52333023" + ] + }, + "1975": { + "op": "frame_dig -2", + "defined_out": [ + "0x52333023", + "holding_address#0 (copy)" + ], + "stack_out": [ + "0x52333023", + "holding_address#0 (copy)" + ] + }, + "1977": { + "op": "concat", + "defined_out": [ + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0" + ] + }, + "1978": { + "op": "dup", + "defined_out": [ + "tmp%2#0", + "tmp%2#0 (copy)" + ], + "stack_out": [ + "tmp%2#0", + "tmp%2#0 (copy)" + ] + }, + "1979": { + "op": "box_len", + "stack_out": [ + "tmp%2#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "1980": { + "op": "bury 1", + "stack_out": [ + "tmp%2#0", + "maybe_exists%0#0" + ] + }, + "1982": { + "op": "!", + "defined_out": [ + "tmp%2#0", + "tmp%3#0" + ], + "stack_out": [ + "tmp%2#0", + "tmp%3#0" + ] + }, + "1983": { + "error": "Invalid account holding address", + "op": "assert // Invalid account holding address", + "stack_out": [ + "tmp%2#0" + ] + }, + "1984": { + "op": "frame_dig -1", + "defined_out": [ + "payment_address#0 (copy)", + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0", + "payment_address#0 (copy)" + ] + }, + "1986": { + "op": "bytec 27 // 0x0000000000000000", + "defined_out": [ + "0x0000000000000000", + "payment_address#0 (copy)", + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0", + "payment_address#0 (copy)", + "0x0000000000000000" + ] + }, + "1988": { + "op": "concat", + "defined_out": [ + "encoded_tuple_buffer%2#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0", + "encoded_tuple_buffer%2#0" + ] + }, + "1989": { + "op": "bytec 27 // 0x0000000000000000", + "stack_out": [ + "tmp%2#0", + "encoded_tuple_buffer%2#0", + "0x0000000000000000" + ] + }, + "1991": { + "op": "concat", + "defined_out": [ + "encoded_tuple_buffer%3#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0", + "encoded_tuple_buffer%3#0" + ] + }, + "1992": { + "op": "bytec 27 // 0x0000000000000000", + "stack_out": [ + "tmp%2#0", + "encoded_tuple_buffer%3#0", + "0x0000000000000000" + ] + }, + "1994": { + "op": "concat", + "defined_out": [ + "encoded_tuple_buffer%4#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0", + "encoded_tuple_buffer%4#0" + ] + }, + "1995": { + "op": "pushbytes 0x00", + "defined_out": [ + "0x00", + "encoded_tuple_buffer%4#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0", + "encoded_tuple_buffer%4#0", + "0x00" + ] + }, + "1998": { + "op": "concat", + "defined_out": [ + "encoded_tuple_buffer%5#0", + "tmp%2#0" + ], + "stack_out": [ + "tmp%2#0", + "encoded_tuple_buffer%5#0" + ] + }, + "1999": { + "op": "box_put", + "stack_out": [] + }, + "2000": { + "op": "global LatestTimestamp", + "defined_out": [ + "to_encode%0#0" + ], + "stack_out": [ + "to_encode%0#0" + ] + }, + "2002": { + "op": "itob", + "defined_out": [ + "val_as_bytes%0#0" + ], + "stack_out": [ + "val_as_bytes%0#0" + ] + }, + "2003": { + "retsub": true, + "op": "retsub" + }, + "2004": { + "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_caller_is_account_manager", + "params": {}, + "block": "assert_caller_is_account_manager", + "stack_in": [], + "op": "proto 0 0" + }, + "2007": { + "op": "intc_0 // 0" + }, + "2008": { + "op": "bytec 26 // 0x52343023" + }, + "2010": { + "op": "txn Sender", + "defined_out": [ + "0x52343023", + "caller#0" + ], + "stack_out": [ + "tmp%2#0", + "0x52343023", + "caller#0" + ] + }, + "2012": { + "op": "concat", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%2#0", + "tmp%0#0" + ] + }, + "2013": { + "op": "dup", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%2#0", + "tmp%0#0", + "tmp%0#0" + ] + }, + "2014": { + "op": "box_len", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%2#0", + "tmp%0#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2015": { + "op": "bury 1", + "stack_out": [ + "tmp%2#0", + "tmp%0#0", + "maybe_exists%0#0" + ] + }, + "2017": { + "op": "bz assert_caller_is_account_manager_bool_false@4", + "stack_out": [ + "tmp%2#0", + "tmp%0#0" + ] + }, + "2020": { + "op": "frame_dig 1" + }, + "2022": { + "op": "box_get" + }, + "2023": { + "error": "check self.account_manager entry exists", + "op": "assert // check self.account_manager entry exists" + }, + "2024": { + "error": "Index access is out of bounds", + "op": "extract 0 8 // on error: Index access is out of bounds" + }, + "2027": { + "op": "global LatestTimestamp" + }, + "2029": { + "op": "itob" + }, + "2030": { + "op": "dup" + }, + "2031": { + "op": "frame_bury 0" + }, + "2033": { + "op": "b<=" + }, + "2034": { + "op": "bz assert_caller_is_account_manager_bool_false@4" + }, + "2037": { + "op": "frame_dig 1" + }, + "2039": { + "op": "box_get" + }, + "2040": { + "error": "check self.account_manager entry exists", + "op": "assert // check self.account_manager entry exists" + }, + "2041": { + "error": "Index access is out of bounds", + "op": "extract 8 8 // on error: Index access is out of bounds" + }, + "2044": { + "op": "frame_dig 0" + }, + "2046": { + "op": "b>=" + }, + "2047": { + "op": "bz assert_caller_is_account_manager_bool_false@4" + }, + "2050": { + "op": "intc_1 // 1" + }, + "2051": { + "block": "assert_caller_is_account_manager_bool_merge@5", + "stack_in": [ + "tmp%2#0", + "tmp%0#0", + "and_result%0#0" + ], + "error": "Not authorized", + "op": "assert // Not authorized", + "defined_out": [], + "stack_out": [ + "tmp%2#0", + "tmp%0#0" + ] + }, + "2052": { + "retsub": true, + "op": "retsub" + }, + "2053": { + "block": "assert_caller_is_account_manager_bool_false@4", + "stack_in": [ + "tmp%2#0", + "tmp%0#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "and_result%0#0" + ], + "stack_out": [ + "tmp%2#0", + "tmp%0#0", + "and_result%0#0" + ] + }, + "2054": { + "op": "b assert_caller_is_account_manager_bool_merge@5" + }, + "2057": { + "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_is_not_suspended", + "params": {}, + "block": "assert_is_not_suspended", + "stack_in": [], + "op": "proto 0 0" + }, + "2060": { + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "2061": { + "op": "bytec 19 // \"suspended\"", + "defined_out": [ + "\"suspended\"", + "0" + ], + "stack_out": [ + "0", + "\"suspended\"" + ] + }, + "2063": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2064": { + "error": "check self.suspended exists", + "op": "assert // check self.suspended exists", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "2065": { + "op": "!", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%0#0" + ] + }, + "2066": { + "error": "Suspended operations", + "op": "assert // Suspended operations", + "stack_out": [] + }, + "2067": { + "retsub": true, + "op": "retsub" + }, + "2068": { + "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.close_account", + "params": { + "holding_address#0": "bytes" + }, + "block": "close_account", + "stack_in": [], + "op": "proto 1 1" + }, + "2071": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_caller_is_account_manager", + "op": "callsub assert_caller_is_account_manager" + }, + "2074": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_is_not_defaulted", + "op": "callsub assert_is_not_defaulted" + }, + "2077": { + "op": "bytec 7 // 0x52333023", + "defined_out": [ + "0x52333023" + ], + "stack_out": [ + "0x52333023" + ] + }, + "2079": { + "op": "frame_dig -1", + "defined_out": [ + "0x52333023", + "holding_address#0 (copy)" + ], + "stack_out": [ + "0x52333023", + "holding_address#0 (copy)" + ] + }, + "2081": { + "op": "concat", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1" + ] + }, + "2082": { + "op": "dup", + "defined_out": [ + "tmp%0#1", + "tmp%0#1 (copy)" + ], + "stack_out": [ + "tmp%0#1", + "tmp%0#1 (copy)" + ] + }, + "2083": { + "op": "box_len", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#1", + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1", + "maybe_value%0#1", + "maybe_exists%0#0" + ] + }, + "2084": { + "op": "bury 1", + "stack_out": [ + "tmp%0#1", + "maybe_exists%0#0" + ] + }, + "2086": { + "error": "Invalid account holding address", + "op": "assert // Invalid account holding address", + "stack_out": [ + "tmp%0#1" + ] + }, + "2087": { + "op": "dup", + "stack_out": [ + "tmp%0#1", + "tmp%0#1 (copy)" + ] + }, + "2088": { + "op": "box_get", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2089": { + "error": "check self.account entry exists", + "op": "assert // check self.account entry exists", + "stack_out": [ + "tmp%0#1", + "maybe_value%0#0" + ] + }, + "2090": { + "error": "Index access is out of bounds", + "op": "extract 32 8 // on error: Index access is out of bounds", + "defined_out": [ + "tmp%0#1", + "tmp%1#0" + ], + "stack_out": [ + "tmp%0#1", + "tmp%1#0" + ] + }, + "2093": { + "op": "btoi", + "defined_out": [ + "closed_units#0", + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1", + "closed_units#0" + ] + }, + "2094": { + "op": "dup", + "stack_out": [ + "tmp%0#1", + "closed_units#0", + "closed_units#0 (copy)" + ] + }, + "2095": { + "op": "uncover 2", + "defined_out": [ + "closed_units#0", + "tmp%0#1" + ], + "stack_out": [ + "closed_units#0", + "closed_units#0", + "tmp%0#1" + ] + }, + "2097": { + "op": "box_del", + "defined_out": [ + "closed_units#0", + "{box_del}" + ], + "stack_out": [ + "closed_units#0", + "closed_units#0", + "{box_del}" + ] + }, + "2098": { + "op": "pop", + "stack_out": [ + "closed_units#0", + "closed_units#0" + ] + }, + "2099": { + "op": "intc_0 // 0", + "stack_out": [ + "closed_units#0", + "closed_units#0", + "0" + ] + }, + "2100": { + "op": "bytec_1 // \"circulating_units\"", + "defined_out": [ + "\"circulating_units\"", + "0", + "closed_units#0" + ], + "stack_out": [ + "closed_units#0", + "closed_units#0", + "0", + "\"circulating_units\"" + ] + }, + "2101": { + "op": "app_global_get_ex", + "defined_out": [ + "closed_units#0", + "maybe_exists%1#0", + "maybe_value%1#0" + ], + "stack_out": [ + "closed_units#0", + "closed_units#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "2102": { + "error": "check self.circulating_units exists", + "op": "assert // check self.circulating_units exists", + "stack_out": [ + "closed_units#0", + "closed_units#0", + "maybe_value%1#0" + ] + }, + "2103": { + "op": "swap", + "stack_out": [ + "closed_units#0", + "maybe_value%1#0", + "closed_units#0" + ] + }, + "2104": { + "op": "-", + "defined_out": [ + "closed_units#0", + "new_state_value%0#0" + ], + "stack_out": [ + "closed_units#0", + "new_state_value%0#0" + ] + }, + "2105": { + "op": "bytec_1 // \"circulating_units\"", + "stack_out": [ + "closed_units#0", + "new_state_value%0#0", + "\"circulating_units\"" + ] + }, + "2106": { + "op": "swap", + "stack_out": [ + "closed_units#0", + "\"circulating_units\"", + "new_state_value%0#0" + ] + }, + "2107": { + "op": "app_global_put", + "stack_out": [ + "closed_units#0" + ] + }, + "2108": { + "op": "intc_0 // 0", + "stack_out": [ + "closed_units#0", + "0" + ] + }, + "2109": { + "op": "bytec_1 // \"circulating_units\"", + "stack_out": [ + "closed_units#0", + "0", + "\"circulating_units\"" + ] + }, + "2110": { + "op": "app_global_get_ex", + "stack_out": [ + "closed_units#0", + "maybe_value%0#1", + "maybe_exists%0#0" + ] + }, + "2111": { + "error": "check self.circulating_units exists", + "op": "assert // check self.circulating_units exists", + "stack_out": [ + "closed_units#0", + "maybe_value%0#1" + ] + }, + "2112": { + "op": "bnz close_account_after_if_else@3", + "stack_out": [ + "closed_units#0" + ] + }, + "2115": { + "op": "bytec_2 // \"status\"" + }, + "2116": { + "op": "intc 4 // 200" + }, + "2118": { + "op": "app_global_put" + }, + "2119": { + "block": "close_account_after_if_else@3", + "stack_in": [ + "closed_units#0" + ], + "op": "frame_dig 0", + "defined_out": [ + "closed_units#0" + ], + "stack_out": [ + "closed_units#0", + "closed_units#0" + ] + }, + "2121": { + "op": "itob", + "defined_out": [ + "closed_units#0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "closed_units#0", + "val_as_bytes%0#0" + ] + }, + "2122": { + "op": "global LatestTimestamp", + "defined_out": [ + "closed_units#0", + "to_encode%0#0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "closed_units#0", + "val_as_bytes%0#0", + "to_encode%0#0" + ] + }, + "2124": { + "op": "itob", + "defined_out": [ + "closed_units#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "closed_units#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0" + ] + }, + "2125": { + "op": "concat", + "defined_out": [ + "closed_units#0", + "encoded_tuple_buffer%2#0" + ], + "stack_out": [ + "closed_units#0", + "encoded_tuple_buffer%2#0" + ] + }, + "2126": { + "op": "swap" + }, + "2127": { + "retsub": true, + "op": "retsub" + }, + "2128": { + "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.primary_distribution", + "params": { + "holding_address#0": "bytes", + "units#0": "bytes" + }, + "block": "primary_distribution", + "stack_in": [], + "op": "proto 2 1" + }, + "2131": { + "op": "intc_0 // 0", + "stack_out": [ + "tmp%0#2" + ] + }, + "2132": { + "op": "dup", + "stack_out": [ + "tmp%0#2", + "tmp%2#2" + ] + }, + "2133": { + "op": "pushbytes \"\"", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0" + ] + }, + "2135": { + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "0" + ] + }, + "2136": { + "op": "bytec_2 // \"status\"", + "defined_out": [ + "\"status\"", + "0" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "0", + "\"status\"" + ] + }, + "2137": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2138": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "maybe_value%0#0" + ] + }, + "2139": { + "op": "pushint 100 // 100", + "defined_out": [ + "100", + "maybe_value%0#0" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "maybe_value%0#0", + "100" + ] + }, + "2141": { + "op": "==", + "defined_out": [ + "tmp%0#4" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#4" + ] + }, + "2142": { + "op": "bz primary_distribution_bool_false@5", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0" + ] + }, + "2145": { + "op": "intc_0 // 0" + }, + "2146": { + "op": "bytec 14 // \"primary_distribution_opening_date\"" + }, + "2148": { + "op": "app_global_get_ex" + }, + "2149": { + "error": "check self.primary_distribution_opening_date exists", + "op": "assert // check self.primary_distribution_opening_date exists" + }, + "2150": { + "op": "global LatestTimestamp" + }, + "2152": { + "op": "dup" + }, + "2153": { + "op": "frame_bury 2" + }, + "2155": { + "op": "<=" + }, + "2156": { + "op": "bz primary_distribution_bool_false@5" + }, + "2159": { + "op": "intc_0 // 0" + }, + "2160": { + "op": "bytec 15 // \"primary_distribution_closure_date\"" + }, + "2162": { + "op": "app_global_get_ex" + }, + "2163": { + "error": "check self.primary_distribution_closure_date exists", + "op": "assert // check self.primary_distribution_closure_date exists" + }, + "2164": { + "op": "frame_dig 2" + }, + "2166": { + "op": ">" + }, + "2167": { + "op": "bz primary_distribution_bool_false@5" + }, + "2170": { + "op": "intc_1 // 1" + }, + "2171": { + "block": "primary_distribution_bool_merge@6", + "stack_in": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "and_result%0#0" + ], + "error": "Primary distribution is closed", + "op": "assert // Primary distribution is closed", + "defined_out": [], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0" + ] + }, + "2172": { + "op": "bytec 25 // 0x52353023" + }, + "2174": { + "op": "txn Sender", + "defined_out": [ + "0x52353023", + "caller#0" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "0x52353023", + "caller#0" + ] + }, + "2176": { + "op": "concat", + "defined_out": [ + "tmp%0#2" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2" + ] + }, + "2177": { + "op": "dup", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "tmp%0#2" + ] + }, + "2178": { + "op": "frame_bury 0", + "defined_out": [ + "tmp%0#2" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2" + ] + }, + "2180": { + "op": "box_len", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "tmp%0#2" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2181": { + "op": "bury 1", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "maybe_exists%0#0" + ] + }, + "2183": { + "op": "bz primary_distribution_bool_false@12", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0" + ] + }, + "2186": { + "op": "frame_dig 0" + }, + "2188": { + "op": "box_get" + }, + "2189": { + "error": "check self.primary_dealer entry exists", + "op": "assert // check self.primary_dealer entry exists" + }, + "2190": { + "error": "Index access is out of bounds", + "op": "extract 0 8 // on error: Index access is out of bounds" + }, + "2193": { + "op": "global LatestTimestamp" + }, + "2195": { + "op": "itob" + }, + "2196": { + "op": "dup" + }, + "2197": { + "op": "frame_bury 1" + }, + "2199": { + "op": "b<=" + }, + "2200": { + "op": "bz primary_distribution_bool_false@12" + }, + "2203": { + "op": "frame_dig 0" + }, + "2205": { + "op": "box_get" + }, + "2206": { + "error": "check self.primary_dealer entry exists", + "op": "assert // check self.primary_dealer entry exists" + }, + "2207": { + "error": "Index access is out of bounds", + "op": "extract 8 8 // on error: Index access is out of bounds" + }, + "2210": { + "op": "frame_dig 1" + }, + "2212": { + "op": "b>=" + }, + "2213": { + "op": "bz primary_distribution_bool_false@12" + }, + "2216": { + "op": "intc_1 // 1" + }, + "2217": { + "block": "primary_distribution_bool_merge@13", + "stack_in": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "and_result%0#0" + ], + "error": "Not authorized", + "op": "assert // Not authorized", + "defined_out": [], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0" + ] + }, + "2218": { + "op": "bytec 7 // 0x52333023", + "defined_out": [ + "0x52333023" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "0x52333023" + ] + }, + "2220": { + "op": "frame_dig -2", + "defined_out": [ + "0x52333023", + "holding_address#0 (copy)" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "0x52333023", + "holding_address#0 (copy)" + ] + }, + "2222": { + "op": "concat", + "defined_out": [ + "tmp%0#2" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2" + ] + }, + "2223": { + "op": "dup", + "defined_out": [ + "tmp%0#2", + "tmp%0#2 (copy)" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "tmp%0#2 (copy)" + ] + }, + "2224": { + "op": "box_len", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "tmp%0#2" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2225": { + "op": "bury 1", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "maybe_exists%0#0" + ] + }, + "2227": { + "error": "Invalid account holding address", + "op": "assert // Invalid account holding address", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2" + ] + }, + "2228": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_is_not_defaulted", + "op": "callsub assert_is_not_defaulted" + }, + "2231": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_is_not_suspended", + "op": "callsub assert_is_not_suspended" + }, + "2234": { + "op": "frame_dig -1", + "defined_out": [ + "tmp%0#2", + "units#0 (copy)" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "units#0 (copy)" + ] + }, + "2236": { + "op": "btoi", + "defined_out": [ + "tmp%0#0", + "tmp%0#2" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "tmp%0#0" + ] + }, + "2237": { + "op": "dup", + "defined_out": [ + "tmp%0#0", + "tmp%0#0 (copy)", + "tmp%0#2" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "tmp%0#0", + "tmp%0#0 (copy)" + ] + }, + "2238": { + "error": "Can not distribute zero units", + "op": "assert // Can not distribute zero units", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "tmp%0#0" + ] + }, + "2239": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "tmp%0#0", + "tmp%0#2" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "tmp%0#0", + "0" + ] + }, + "2240": { + "op": "bytec_1 // \"circulating_units\"", + "defined_out": [ + "\"circulating_units\"", + "0", + "tmp%0#0", + "tmp%0#2" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "tmp%0#0", + "0", + "\"circulating_units\"" + ] + }, + "2241": { + "op": "app_global_get_ex", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "tmp%0#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2242": { + "error": "check self.circulating_units exists", + "op": "assert // check self.circulating_units exists", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "tmp%0#0", + "maybe_value%0#0" + ] + }, + "2243": { + "op": "dig 1", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "tmp%0#0", + "maybe_value%0#0", + "tmp%0#0 (copy)" + ] + }, + "2245": { + "op": "+", + "defined_out": [ + "tmp%0#0", + "tmp%0#2", + "tmp%3#0" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "tmp%0#0", + "tmp%3#0" + ] + }, + "2246": { + "op": "intc_0 // 0", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "tmp%0#0", + "tmp%3#0", + "0" + ] + }, + "2247": { + "op": "bytec 5 // \"total_units\"", + "defined_out": [ + "\"total_units\"", + "0", + "tmp%0#0", + "tmp%0#2", + "tmp%3#0" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "tmp%0#0", + "tmp%3#0", + "0", + "\"total_units\"" + ] + }, + "2249": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#0", + "tmp%0#0", + "tmp%0#2", + "tmp%3#0" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "tmp%0#0", + "tmp%3#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "2250": { + "error": "check self.total_units exists", + "op": "assert // check self.total_units exists", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "tmp%0#0", + "tmp%3#0", + "maybe_value%1#0" + ] + }, + "2251": { + "op": "<=", + "defined_out": [ + "tmp%0#0", + "tmp%0#2", + "tmp%4#0" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "tmp%0#0", + "tmp%4#0" + ] + }, + "2252": { + "error": "Insufficient remaining D-ASA units", + "op": "assert // Insufficient remaining D-ASA units", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "tmp%0#0" + ] + }, + "2253": { + "op": "intc_0 // 0", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "tmp%0#0", + "0" + ] + }, + "2254": { + "op": "bytec_1 // \"circulating_units\"", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "tmp%0#0", + "0", + "\"circulating_units\"" + ] + }, + "2255": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%2#0", + "maybe_value%2#0", + "tmp%0#0", + "tmp%0#2" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "tmp%0#0", + "maybe_value%2#0", + "maybe_exists%2#0" + ] + }, + "2256": { + "error": "check self.circulating_units exists", + "op": "assert // check self.circulating_units exists", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "tmp%0#0", + "maybe_value%2#0" + ] + }, + "2257": { + "op": "dig 1", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "tmp%0#0", + "maybe_value%2#0", + "tmp%0#0 (copy)" + ] + }, + "2259": { + "op": "+", + "defined_out": [ + "new_state_value%0#0", + "tmp%0#0", + "tmp%0#2" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "tmp%0#0", + "new_state_value%0#0" + ] + }, + "2260": { + "op": "bytec_1 // \"circulating_units\"", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "tmp%0#0", + "new_state_value%0#0", + "\"circulating_units\"" + ] + }, + "2261": { + "op": "swap", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "tmp%0#0", + "\"circulating_units\"", + "new_state_value%0#0" + ] + }, + "2262": { + "op": "app_global_put", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "tmp%0#0" + ] + }, + "2263": { + "op": "dig 1", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "tmp%0#0", + "tmp%0#2 (copy)" + ] + }, + "2265": { + "op": "box_get", + "defined_out": [ + "maybe_exists%3#0", + "maybe_value%3#0", + "tmp%0#0", + "tmp%0#2" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "tmp%0#0", + "maybe_value%3#0", + "maybe_exists%3#0" + ] + }, + "2266": { + "error": "check self.account entry exists", + "op": "assert // check self.account entry exists", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "tmp%0#0", + "maybe_value%3#0" + ] + }, + "2267": { + "error": "Index access is out of bounds", + "op": "extract 32 8 // on error: Index access is out of bounds", + "defined_out": [ + "tmp%0#0", + "tmp%0#2", + "tmp%7#0" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "tmp%0#0", + "tmp%7#0" + ] + }, + "2270": { + "op": "btoi", + "defined_out": [ + "tmp%0#0", + "tmp%0#2", + "tmp%8#0" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "tmp%0#0", + "tmp%8#0" + ] + }, + "2271": { + "op": "+", + "defined_out": [ + "tmp%0#2", + "to_encode%0#0" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "to_encode%0#0" + ] + }, + "2272": { + "op": "itob", + "defined_out": [ + "tmp%0#2", + "val_as_bytes%0#0" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "val_as_bytes%0#0" + ] + }, + "2273": { + "op": "dig 1", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "val_as_bytes%0#0", + "tmp%0#2 (copy)" + ] + }, + "2275": { + "op": "box_get", + "defined_out": [ + "maybe_exists%4#0", + "maybe_value%4#0", + "tmp%0#2", + "val_as_bytes%0#0" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "val_as_bytes%0#0", + "maybe_value%4#0", + "maybe_exists%4#0" + ] + }, + "2276": { + "error": "check self.account entry exists", + "op": "assert // check self.account entry exists", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "val_as_bytes%0#0", + "maybe_value%4#0" + ] + }, + "2277": { + "op": "swap", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "maybe_value%4#0", + "val_as_bytes%0#0" + ] + }, + "2278": { + "op": "replace2 32", + "defined_out": [ + "tmp%0#2", + "updated_data%0#0" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "updated_data%0#0" + ] + }, + "2280": { + "op": "dig 1", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "updated_data%0#0", + "tmp%0#2 (copy)" + ] + }, + "2282": { + "op": "swap", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "tmp%0#2 (copy)", + "updated_data%0#0" + ] + }, + "2283": { + "op": "box_put", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2" + ] + }, + "2284": { + "op": "intc_0 // 0", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "0" + ] + }, + "2285": { + "op": "bytec 4 // \"unit_value\"", + "defined_out": [ + "\"unit_value\"", + "0", + "tmp%0#2" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "0", + "\"unit_value\"" + ] + }, + "2287": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%5#0", + "maybe_value%5#0", + "tmp%0#2" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "maybe_value%5#0", + "maybe_exists%5#0" + ] + }, + "2288": { + "error": "check self.unit_value exists", + "op": "assert // check self.unit_value exists", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "maybe_value%5#0" + ] + }, + "2289": { + "op": "itob", + "defined_out": [ + "tmp%0#2", + "val_as_bytes%1#0" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "val_as_bytes%1#0" + ] + }, + "2290": { + "op": "dig 1", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "val_as_bytes%1#0", + "tmp%0#2 (copy)" + ] + }, + "2292": { + "op": "box_get", + "defined_out": [ + "maybe_exists%6#0", + "maybe_value%6#0", + "tmp%0#2", + "val_as_bytes%1#0" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "val_as_bytes%1#0", + "maybe_value%6#0", + "maybe_exists%6#0" + ] + }, + "2293": { + "error": "check self.account entry exists", + "op": "assert // check self.account entry exists", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "val_as_bytes%1#0", + "maybe_value%6#0" + ] + }, + "2294": { + "op": "swap", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "maybe_value%6#0", + "val_as_bytes%1#0" + ] + }, + "2295": { + "op": "replace2 40", + "defined_out": [ + "tmp%0#2", + "updated_data%1#0" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "tmp%0#2", + "updated_data%1#0" + ] + }, + "2297": { + "op": "box_put", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0" + ] + }, + "2298": { + "op": "intc_0 // 0", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "0" + ] + }, + "2299": { + "op": "bytec 5 // \"total_units\"", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "0", + "\"total_units\"" + ] + }, + "2301": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%7#0", + "maybe_value%7#0", + "tmp%0#2" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "maybe_value%7#0", + "maybe_exists%7#0" + ] + }, + "2302": { + "error": "check self.total_units exists", + "op": "assert // check self.total_units exists", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "maybe_value%7#0" + ] + }, + "2303": { + "op": "intc_0 // 0", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "maybe_value%7#0", + "0" + ] + }, + "2304": { + "op": "bytec_1 // \"circulating_units\"", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "maybe_value%7#0", + "0", + "\"circulating_units\"" + ] + }, + "2305": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%8#0", + "maybe_value%7#0", + "maybe_value%8#0", + "tmp%0#2" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "maybe_value%7#0", + "maybe_value%8#0", + "maybe_exists%8#0" + ] + }, + "2306": { + "error": "check self.circulating_units exists", + "op": "assert // check self.circulating_units exists", + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "maybe_value%7#0", + "maybe_value%8#0" + ] + }, + "2307": { + "op": "-", + "defined_out": [ + "tmp%0#2", + "to_encode%1#0" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "to_encode%1#0" + ] + }, + "2308": { + "op": "itob", + "defined_out": [ + "tmp%0#2", + "val_as_bytes%2#0" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "val_as_bytes%2#0" + ] + }, + "2309": { + "op": "frame_bury 0" + }, + "2311": { + "retsub": true, + "op": "retsub" + }, + "2312": { + "block": "primary_distribution_bool_false@12", + "stack_in": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "and_result%0#0" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "and_result%0#0" + ] + }, + "2313": { + "op": "b primary_distribution_bool_merge@13" + }, + "2316": { + "block": "primary_distribution_bool_false@5", + "stack_in": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "and_result%0#0" + ], + "stack_out": [ + "tmp%0#2", + "tmp%2#2", + "awst_tmp%0#0", + "and_result%0#0" + ] + }, + "2317": { + "op": "b primary_distribution_bool_merge@6" + }, + "2320": { + "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.set_asset_suspension", + "params": { + "suspended#0": "bytes" + }, + "block": "set_asset_suspension", + "stack_in": [], + "op": "proto 1 1" + }, + "2323": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_caller_is_authority", + "op": "callsub assert_caller_is_authority" + }, + "2326": { + "op": "frame_dig -1", + "defined_out": [ + "suspended#0 (copy)" + ], + "stack_out": [ + "suspended#0 (copy)" + ] + }, + "2328": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "suspended#0 (copy)" + ], + "stack_out": [ + "suspended#0 (copy)", + "0" + ] + }, + "2329": { + "op": "getbit", + "defined_out": [ + "reinterpret_uint64%0#0" + ], + "stack_out": [ + "reinterpret_uint64%0#0" + ] + }, + "2330": { + "op": "bytec 19 // \"suspended\"", + "defined_out": [ + "\"suspended\"", + "reinterpret_uint64%0#0" + ], + "stack_out": [ + "reinterpret_uint64%0#0", + "\"suspended\"" + ] + }, + "2332": { + "op": "swap", + "stack_out": [ + "\"suspended\"", + "reinterpret_uint64%0#0" + ] + }, + "2333": { + "op": "app_global_put", + "stack_out": [] + }, + "2334": { + "op": "global LatestTimestamp", + "defined_out": [ + "to_encode%0#0" + ], + "stack_out": [ + "to_encode%0#0" + ] + }, + "2336": { + "op": "itob", + "defined_out": [ + "val_as_bytes%0#0" + ], + "stack_out": [ + "val_as_bytes%0#0" + ] + }, + "2337": { + "retsub": true, + "op": "retsub" + }, + "2338": { + "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_caller_is_authority", + "params": {}, + "block": "assert_caller_is_authority", + "stack_in": [], + "op": "proto 0 0" + }, + "2341": { + "op": "intc_0 // 0" + }, + "2342": { + "op": "bytec 23 // 0x52373023" + }, + "2344": { + "op": "txn Sender", + "defined_out": [ + "0x52373023", + "caller#0" + ], + "stack_out": [ + "tmp%2#0", + "0x52373023", + "caller#0" + ] + }, + "2346": { + "op": "concat", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%2#0", + "tmp%0#0" + ] + }, + "2347": { + "op": "dup", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%2#0", + "tmp%0#0", + "tmp%0#0" + ] + }, + "2348": { + "op": "box_len", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%2#0", + "tmp%0#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2349": { + "op": "bury 1", + "stack_out": [ + "tmp%2#0", + "tmp%0#0", + "maybe_exists%0#0" + ] + }, + "2351": { + "op": "bz assert_caller_is_authority_bool_false@4", + "stack_out": [ + "tmp%2#0", + "tmp%0#0" + ] + }, + "2354": { + "op": "frame_dig 1" + }, + "2356": { + "op": "box_get" + }, + "2357": { + "error": "check self.authority entry exists", + "op": "assert // check self.authority entry exists" + }, + "2358": { + "error": "Index access is out of bounds", + "op": "extract 0 8 // on error: Index access is out of bounds" + }, + "2361": { + "op": "global LatestTimestamp" + }, + "2363": { + "op": "itob" + }, + "2364": { + "op": "dup" + }, + "2365": { + "op": "frame_bury 0" + }, + "2367": { + "op": "b<=" + }, + "2368": { + "op": "bz assert_caller_is_authority_bool_false@4" + }, + "2371": { + "op": "frame_dig 1" + }, + "2373": { + "op": "box_get" + }, + "2374": { + "error": "check self.authority entry exists", + "op": "assert // check self.authority entry exists" + }, + "2375": { + "error": "Index access is out of bounds", + "op": "extract 8 8 // on error: Index access is out of bounds" + }, + "2378": { + "op": "frame_dig 0" + }, + "2380": { + "op": "b>=" + }, + "2381": { + "op": "bz assert_caller_is_authority_bool_false@4" + }, + "2384": { + "op": "intc_1 // 1" + }, + "2385": { + "block": "assert_caller_is_authority_bool_merge@5", + "stack_in": [ + "tmp%2#0", + "tmp%0#0", + "and_result%0#0" + ], + "error": "Not authorized", + "op": "assert // Not authorized", + "defined_out": [], + "stack_out": [ + "tmp%2#0", + "tmp%0#0" + ] + }, + "2386": { + "retsub": true, + "op": "retsub" + }, + "2387": { + "block": "assert_caller_is_authority_bool_false@4", + "stack_in": [ + "tmp%2#0", + "tmp%0#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "and_result%0#0" + ], + "stack_out": [ + "tmp%2#0", + "tmp%0#0", + "and_result%0#0" + ] + }, + "2388": { + "op": "b assert_caller_is_authority_bool_merge@5" + }, + "2391": { + "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.set_account_suspension", + "params": { + "holding_address#0": "bytes", + "suspended#0": "bytes" + }, + "block": "set_account_suspension", + "stack_in": [], + "op": "proto 2 1" + }, + "2394": { + "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_caller_is_authority", + "op": "callsub assert_caller_is_authority" + }, + "2397": { + "op": "bytec 7 // 0x52333023", + "defined_out": [ + "0x52333023" + ], + "stack_out": [ + "0x52333023" + ] + }, + "2399": { + "op": "frame_dig -2", + "defined_out": [ + "0x52333023", + "holding_address#0 (copy)" + ], + "stack_out": [ + "0x52333023", + "holding_address#0 (copy)" + ] + }, + "2401": { + "op": "concat", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1" + ] + }, + "2402": { + "op": "dup", + "defined_out": [ + "tmp%0#1", + "tmp%0#1 (copy)" + ], + "stack_out": [ + "tmp%0#1", + "tmp%0#1 (copy)" + ] + }, + "2403": { + "op": "box_len", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#1", + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1", + "maybe_value%0#1", + "maybe_exists%0#0" + ] + }, + "2404": { + "op": "bury 1", + "stack_out": [ + "tmp%0#1", + "maybe_exists%0#0" + ] + }, + "2406": { + "error": "Invalid account holding address", + "op": "assert // Invalid account holding address", + "stack_out": [ + "tmp%0#1" + ] + }, + "2407": { + "op": "dup", + "stack_out": [ + "tmp%0#1", + "tmp%0#1 (copy)" + ] + }, + "2408": { + "op": "box_get", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2409": { + "error": "check self.account entry exists", + "op": "assert // check self.account entry exists", + "stack_out": [ + "tmp%0#1", + "maybe_value%0#0" + ] + }, + "2410": { + "op": "frame_dig -1", + "defined_out": [ + "maybe_value%0#0", + "suspended#0 (copy)", + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1", + "maybe_value%0#0", + "suspended#0 (copy)" + ] + }, + "2412": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "maybe_value%0#0", + "suspended#0 (copy)", + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1", + "maybe_value%0#0", + "suspended#0 (copy)", + "0" + ] + }, + "2413": { + "op": "getbit", + "defined_out": [ + "is_true%0#0", + "maybe_value%0#0", + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1", + "maybe_value%0#0", + "is_true%0#0" + ] + }, + "2414": { + "op": "pushint 448 // 448" + }, + "2417": { + "op": "swap", + "defined_out": [ + "448", + "is_true%0#0", + "maybe_value%0#0", + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1", + "maybe_value%0#0", + "448", + "is_true%0#0" + ] + }, + "2418": { + "op": "setbit", + "defined_out": [ + "tmp%0#1", + "updated_data%0#0" + ], + "stack_out": [ + "tmp%0#1", + "updated_data%0#0" + ] + }, + "2419": { + "op": "box_put", + "stack_out": [] + }, + "2420": { + "op": "global LatestTimestamp", + "defined_out": [ + "to_encode%0#0" + ], + "stack_out": [ + "to_encode%0#0" + ] + }, + "2422": { + "op": "itob", + "defined_out": [ + "val_as_bytes%0#0" + ], + "stack_out": [ + "val_as_bytes%0#0" + ] + }, + "2423": { + "retsub": true, + "op": "retsub" + }, + "2424": { + "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.set_default_status", + "params": { + "defaulted#0": "bytes" + }, + "block": "set_default_status", + "stack_in": [], + "op": "proto 1 0" + }, + "2427": { + "op": "intc_0 // 0" + }, + "2428": { + "op": "bytec 24 // 0x52363023" + }, + "2430": { + "op": "txn Sender", + "defined_out": [ + "0x52363023", + "caller#0" + ], + "stack_out": [ + "tmp%2#0", + "0x52363023", + "caller#0" + ] + }, + "2432": { + "op": "concat", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%2#0", + "tmp%0#0" + ] + }, + "2433": { + "op": "dup", + "defined_out": [ + "tmp%0#0" + ], + "stack_out": [ + "tmp%2#0", + "tmp%0#0", + "tmp%0#0" + ] + }, + "2434": { + "op": "box_len", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "tmp%0#0" + ], + "stack_out": [ + "tmp%2#0", + "tmp%0#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2435": { + "op": "bury 1", + "stack_out": [ + "tmp%2#0", + "tmp%0#0", + "maybe_exists%0#0" + ] + }, + "2437": { + "op": "bz set_default_status_bool_false@5", + "stack_out": [ + "tmp%2#0", + "tmp%0#0" + ] + }, + "2440": { + "op": "frame_dig 1" + }, + "2442": { + "op": "box_get" + }, + "2443": { + "error": "check self.trustee entry exists", + "op": "assert // check self.trustee entry exists" + }, + "2444": { + "error": "Index access is out of bounds", + "op": "extract 0 8 // on error: Index access is out of bounds" + }, + "2447": { + "op": "global LatestTimestamp" + }, + "2449": { + "op": "itob" + }, + "2450": { + "op": "dup" + }, + "2451": { + "op": "frame_bury 0" + }, + "2453": { + "op": "b<=" + }, + "2454": { + "op": "bz set_default_status_bool_false@5" + }, + "2457": { + "op": "frame_dig 1" + }, + "2459": { + "op": "box_get" + }, + "2460": { + "error": "check self.trustee entry exists", + "op": "assert // check self.trustee entry exists" + }, + "2461": { + "error": "Index access is out of bounds", + "op": "extract 8 8 // on error: Index access is out of bounds" + }, + "2464": { + "op": "frame_dig 0" + }, + "2466": { + "op": "b>=" + }, + "2467": { + "op": "bz set_default_status_bool_false@5" + }, + "2470": { + "op": "intc_1 // 1" + }, + "2471": { + "block": "set_default_status_bool_merge@6", + "stack_in": [ + "tmp%2#0", + "tmp%0#0", + "and_result%0#0" + ], + "error": "Not authorized", + "op": "assert // Not authorized", + "defined_out": [], + "stack_out": [ + "tmp%2#0", + "tmp%0#0" + ] + }, + "2472": { + "op": "frame_dig -1", + "defined_out": [ + "defaulted#0 (copy)" + ], + "stack_out": [ + "tmp%2#0", + "tmp%0#0", + "defaulted#0 (copy)" + ] + }, + "2474": { + "op": "intc_0 // 0", + "defined_out": [ + "0", + "defaulted#0 (copy)" + ], + "stack_out": [ + "tmp%2#0", + "tmp%0#0", + "defaulted#0 (copy)", + "0" + ] + }, + "2475": { + "op": "getbit", + "defined_out": [ + "reinterpret_uint64%0#0" + ], + "stack_out": [ + "tmp%2#0", + "tmp%0#0", + "reinterpret_uint64%0#0" + ] + }, + "2476": { + "op": "bytec 20 // \"defaulted\"", + "defined_out": [ + "\"defaulted\"", + "reinterpret_uint64%0#0" + ], + "stack_out": [ + "tmp%2#0", + "tmp%0#0", + "reinterpret_uint64%0#0", + "\"defaulted\"" + ] + }, + "2478": { + "op": "swap", + "stack_out": [ + "tmp%2#0", + "tmp%0#0", + "\"defaulted\"", + "reinterpret_uint64%0#0" + ] + }, + "2479": { + "op": "app_global_put", + "stack_out": [ + "tmp%2#0", + "tmp%0#0" + ] + }, + "2480": { + "retsub": true, + "op": "retsub" + }, + "2481": { + "block": "set_default_status_bool_false@5", + "stack_in": [ + "tmp%2#0", + "tmp%0#0" + ], + "op": "intc_0 // 0", + "defined_out": [ + "and_result%0#0" + ], + "stack_out": [ + "tmp%2#0", + "tmp%0#0", + "and_result%0#0" + ] + }, + "2482": { + "op": "b set_default_status_bool_merge@6" + }, + "2485": { + "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.get_asset_info", + "params": {}, + "block": "get_asset_info", + "stack_in": [], + "op": "proto 0 1" + }, + "2488": { + "op": "intc_0 // 0" + }, + "2489": { + "op": "dup" + }, + "2490": { + "op": "global LatestTimestamp" + }, + "2492": { + "op": "intc_0 // 0" + }, + "2493": { + "op": "bytec_3 // \"maturity_date\"", + "defined_out": [ + "\"maturity_date\"", + "0", + "performance#0", + "tmp%0#0" + ], + "stack_out": [ + "performance#0", + "performance#0", + "tmp%0#0", + "0", + "\"maturity_date\"" + ] + }, + "2494": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "performance#0", + "tmp%0#0" + ], + "stack_out": [ + "performance#0", + "performance#0", + "tmp%0#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2495": { + "op": "swap", + "stack_out": [ + "performance#0", + "performance#0", + "tmp%0#0", + "maybe_exists%0#0", + "maybe_value%0#0" + ] + }, + "2496": { + "op": "dup", + "stack_out": [ + "performance#0", + "performance#0", + "tmp%0#0", + "maybe_exists%0#0", + "maybe_value%0#0", + "maybe_value%0#0 (copy)" + ] + }, + "2497": { + "op": "cover 2", + "stack_out": [ + "performance#0", + "performance#0", + "tmp%0#0", + "maybe_value%0#0", + "maybe_exists%0#0", + "maybe_value%0#0" + ] + }, + "2499": { + "op": "cover 4", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "performance#0", + "tmp%0#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#0", + "tmp%0#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2501": { + "error": "check self.maturity_date exists", + "op": "assert // check self.maturity_date exists", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#0", + "tmp%0#0", + "maybe_value%0#0" + ] + }, + "2502": { + "op": ">", + "defined_out": [ + "maybe_value%0#0", + "performance#0", + "performance#8", + "tmp%1#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "tmp%1#0" + ] + }, + "2503": { + "op": "bz get_asset_info_after_if_else@3", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8" + ] + }, + "2506": { + "op": "frame_dig 0" + }, + "2508": { + "op": "frame_bury 2" + }, + "2510": { + "op": "frame_dig 1" + }, + "2512": { + "op": "bz get_asset_info_after_if_else@3" + }, + "2515": { + "op": "intc_3 // 4" + }, + "2516": { + "op": "frame_bury 2" + }, + "2518": { + "block": "get_asset_info_after_if_else@3", + "stack_in": [ + "performance#0", + "maybe_value%0#0", + "performance#8" + ], + "op": "frame_dig 2", + "defined_out": [ + "performance#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "performance#0" + ] + }, + "2520": { + "op": "frame_bury 0", + "defined_out": [ + "performance#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8" + ] + }, + "2522": { + "op": "intc_0 // 0", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "0" + ] + }, + "2523": { + "op": "bytec 20 // \"defaulted\"", + "defined_out": [ + "\"defaulted\"", + "0", + "performance#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "0", + "\"defaulted\"" + ] + }, + "2525": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#0", + "performance#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "2526": { + "error": "check self.defaulted exists", + "op": "assert // check self.defaulted exists", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "maybe_value%1#0" + ] + }, + "2527": { + "op": "bz get_asset_info_after_if_else@5", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8" + ] + }, + "2530": { + "op": "pushint 3 // 3" + }, + "2532": { + "op": "frame_bury 0" + }, + "2534": { + "block": "get_asset_info_after_if_else@5", + "stack_in": [ + "performance#0", + "maybe_value%0#0", + "performance#8" + ], + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "0" + ] + }, + "2535": { + "op": "bytec 9 // \"denomination_asset_id\"", + "defined_out": [ + "\"denomination_asset_id\"", + "0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "0", + "\"denomination_asset_id\"" + ] + }, + "2537": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%2#0", + "maybe_value%2#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "maybe_value%2#0", + "maybe_exists%2#0" + ] + }, + "2538": { + "error": "check self.denomination_asset_id exists", + "op": "assert // check self.denomination_asset_id exists", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "maybe_value%2#0" + ] + }, + "2539": { + "op": "itob", + "defined_out": [ + "val_as_bytes%0#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0" + ] + }, + "2540": { + "op": "intc_0 // 0", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "0" + ] + }, + "2541": { + "op": "bytec 10 // \"settlement_asset_id\"", + "defined_out": [ + "\"settlement_asset_id\"", + "0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "0", + "\"settlement_asset_id\"" + ] + }, + "2543": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%3#0", + "maybe_value%3#0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "maybe_value%3#0", + "maybe_exists%3#0" + ] + }, + "2544": { + "error": "check self.settlement_asset_id exists", + "op": "assert // check self.settlement_asset_id exists", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "maybe_value%3#0" + ] + }, + "2545": { + "op": "itob", + "defined_out": [ + "val_as_bytes%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0" + ] + }, + "2546": { + "op": "intc_0 // 0", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "0" + ] + }, + "2547": { + "op": "bytec_1 // \"circulating_units\"", + "defined_out": [ + "\"circulating_units\"", + "0", + "val_as_bytes%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "0", + "\"circulating_units\"" + ] + }, + "2548": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2549": { + "error": "check self.circulating_units exists", + "op": "assert // check self.circulating_units exists", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "maybe_value%0#0" + ] + }, + "2550": { + "op": "intc_0 // 0", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "maybe_value%0#0", + "0" + ] + }, + "2551": { + "op": "bytec 4 // \"unit_value\"", + "defined_out": [ + "\"unit_value\"", + "0", + "maybe_value%0#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "maybe_value%0#0", + "0", + "\"unit_value\"" + ] + }, + "2553": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%0#0", + "maybe_value%1#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "maybe_value%0#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "2554": { + "error": "check self.unit_value exists", + "op": "assert // check self.unit_value exists", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "maybe_value%0#0", + "maybe_value%1#0" + ] + }, + "2555": { + "op": "*", + "defined_out": [ + "maybe_value%0#0", + "tmp%0#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "tmp%0#0" + ] + }, + "2556": { + "op": "itob", + "defined_out": [ + "maybe_value%0#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0" + ] + }, + "2557": { + "op": "intc_0 // 0", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "0" + ] + }, + "2558": { + "op": "bytec 4 // \"unit_value\"", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "0", + "\"unit_value\"" + ] + }, + "2560": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%4#0", + "maybe_value%0#0", + "maybe_value%4#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "maybe_value%4#0", + "maybe_exists%4#0" + ] + }, + "2561": { + "error": "check self.unit_value exists", + "op": "assert // check self.unit_value exists", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "maybe_value%4#0" + ] + }, + "2562": { + "op": "itob", + "defined_out": [ + "maybe_value%0#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0" + ] + }, + "2563": { + "op": "intc_0 // 0", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "0" + ] + }, + "2564": { + "op": "bytec 11 // \"day_count_convention\"", + "defined_out": [ + "\"day_count_convention\"", + "0", + "maybe_value%0#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "0", + "\"day_count_convention\"" + ] + }, + "2566": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%5#0", + "maybe_value%0#0", + "maybe_value%5#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "maybe_value%5#0", + "maybe_exists%5#0" + ] + }, + "2567": { + "error": "check self.day_count_convention exists", + "op": "assert // check self.day_count_convention exists", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "maybe_value%5#0" + ] + }, + "2568": { + "op": "itob", + "defined_out": [ + "maybe_value%0#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "val_as_bytes%4#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "val_as_bytes%4#0" + ] + }, + "2569": { + "op": "extract 7 1", + "defined_out": [ + "maybe_value%0#0", + "tmp%4#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0" + ] + }, + "2572": { + "op": "intc_0 // 0", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "0" + ] + }, + "2573": { + "op": "bytec 13 // \"principal_discount\"", + "defined_out": [ + "\"principal_discount\"", + "0", + "maybe_value%0#0", + "tmp%4#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "0", + "\"principal_discount\"" + ] + }, + "2575": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%6#0", + "maybe_value%0#0", + "maybe_value%6#0", + "tmp%4#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "maybe_value%6#0", + "maybe_exists%6#0" + ] + }, + "2576": { + "error": "check self.principal_discount exists", + "op": "assert // check self.principal_discount exists", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "maybe_value%6#0" + ] + }, + "2577": { + "op": "itob", + "defined_out": [ + "maybe_value%0#0", + "tmp%4#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "val_as_bytes%5#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "val_as_bytes%5#0" + ] + }, + "2578": { + "op": "extract 6 2", + "defined_out": [ + "maybe_value%0#0", + "tmp%4#0", + "tmp%5#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0" + ] + }, + "2581": { + "op": "intc_0 // 0", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "0" + ] + }, + "2582": { + "op": "bytec 21 // \"interest_rate\"", + "defined_out": [ + "\"interest_rate\"", + "0", + "maybe_value%0#0", + "tmp%4#0", + "tmp%5#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "0", + "\"interest_rate\"" + ] + }, + "2584": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%7#0", + "maybe_value%0#0", + "maybe_value%7#0", + "tmp%4#0", + "tmp%5#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "maybe_value%7#0", + "maybe_exists%7#0" + ] + }, + "2585": { + "error": "check self.interest_rate exists", + "op": "assert // check self.interest_rate exists", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "maybe_value%7#0" + ] + }, + "2586": { + "op": "itob", + "defined_out": [ + "maybe_value%0#0", + "tmp%4#0", + "tmp%5#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "val_as_bytes%6#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "val_as_bytes%6#0" + ] + }, + "2587": { + "op": "extract 6 2", + "defined_out": [ + "maybe_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0" + ] + }, + "2590": { + "op": "intc_0 // 0", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "0" + ] + }, + "2591": { + "op": "bytec 5 // \"total_units\"", + "defined_out": [ + "\"total_units\"", + "0", + "maybe_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "0", + "\"total_units\"" + ] + }, + "2593": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%8#0", + "maybe_value%0#0", + "maybe_value%8#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "maybe_value%8#0", + "maybe_exists%8#0" + ] + }, + "2594": { + "error": "check self.total_units exists", + "op": "assert // check self.total_units exists", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "maybe_value%8#0" + ] + }, + "2595": { + "op": "itob", + "defined_out": [ + "maybe_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "val_as_bytes%7#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0" + ] + }, + "2596": { + "op": "intc_0 // 0", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "0" + ] + }, + "2597": { + "op": "bytec_1 // \"circulating_units\"", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "0", + "\"circulating_units\"" + ] + }, + "2598": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%9#0", + "maybe_value%0#0", + "maybe_value%9#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "val_as_bytes%7#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "maybe_value%9#0", + "maybe_exists%9#0" + ] + }, + "2599": { + "error": "check self.circulating_units exists", + "op": "assert // check self.circulating_units exists", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "maybe_value%9#0" + ] + }, + "2600": { + "op": "itob", + "defined_out": [ + "maybe_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0" + ] + }, + "2601": { + "op": "intc_0 // 0", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "0" + ] + }, + "2602": { + "op": "bytec 14 // \"primary_distribution_opening_date\"", + "defined_out": [ + "\"primary_distribution_opening_date\"", + "0", + "maybe_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "0", + "\"primary_distribution_opening_date\"" + ] + }, + "2604": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%10#0", + "maybe_value%0#0", + "maybe_value%10#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "maybe_value%10#0", + "maybe_exists%10#0" + ] + }, + "2605": { + "error": "check self.primary_distribution_opening_date exists", + "op": "assert // check self.primary_distribution_opening_date exists", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "maybe_value%10#0" + ] + }, + "2606": { + "op": "itob", + "defined_out": [ + "maybe_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0" + ] + }, + "2607": { + "op": "intc_0 // 0", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "0" + ] + }, + "2608": { + "op": "bytec 15 // \"primary_distribution_closure_date\"", + "defined_out": [ + "\"primary_distribution_closure_date\"", + "0", + "maybe_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "0", + "\"primary_distribution_closure_date\"" + ] + }, + "2610": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%11#0", + "maybe_value%0#0", + "maybe_value%11#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "maybe_value%11#0", + "maybe_exists%11#0" + ] + }, + "2611": { + "error": "check self.primary_distribution_closure_date exists", + "op": "assert // check self.primary_distribution_closure_date exists", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "maybe_value%11#0" + ] + }, + "2612": { + "op": "itob", + "defined_out": [ + "maybe_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%10#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0" + ] + }, + "2613": { + "op": "intc_0 // 0", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "0" + ] + }, + "2614": { + "op": "bytec 16 // \"issuance_date\"", + "defined_out": [ + "\"issuance_date\"", + "0", + "maybe_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%10#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "0", + "\"issuance_date\"" + ] + }, + "2616": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%12#0", + "maybe_value%0#0", + "maybe_value%12#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%10#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "maybe_value%12#0", + "maybe_exists%12#0" + ] + }, + "2617": { + "error": "check self.issuance_date exists", + "op": "assert // check self.issuance_date exists", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "maybe_value%12#0" + ] + }, + "2618": { + "op": "itob", + "defined_out": [ + "maybe_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0" + ] + }, + "2619": { + "op": "intc_0 // 0", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "0" + ] + }, + "2620": { + "op": "bytec_3 // \"maturity_date\"", + "defined_out": [ + "\"maturity_date\"", + "0", + "maybe_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "0", + "\"maturity_date\"" + ] + }, + "2621": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%13#0", + "maybe_value%0#0", + "maybe_value%13#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "maybe_value%13#0", + "maybe_exists%13#0" + ] + }, + "2622": { + "error": "check self.maturity_date exists", + "op": "assert // check self.maturity_date exists", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "maybe_value%13#0" + ] + }, + "2623": { + "op": "itob", + "defined_out": [ + "maybe_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0" + ] + }, + "2624": { + "op": "intc_0 // 0", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "0" + ] + }, + "2625": { + "op": "bytec 19 // \"suspended\"", + "defined_out": [ + "\"suspended\"", + "0", + "maybe_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "0", + "\"suspended\"" + ] + }, + "2627": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%14#0", + "maybe_value%0#0", + "maybe_value%14#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "maybe_value%14#0", + "maybe_exists%14#0" + ] + }, + "2628": { + "error": "check self.suspended exists", + "op": "assert // check self.suspended exists", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "maybe_value%14#0" + ] + }, + "2629": { + "op": "pushbytes 0x00", + "defined_out": [ + "0x00", + "maybe_value%0#0", + "maybe_value%14#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "maybe_value%14#0", + "0x00" + ] + }, + "2632": { + "op": "intc_0 // 0", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "maybe_value%14#0", + "0x00", + "0" + ] + }, + "2633": { + "op": "uncover 2", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "0x00", + "0", + "maybe_value%14#0" + ] + }, + "2635": { + "op": "setbit", + "defined_out": [ + "encoded_bool%0#0", + "maybe_value%0#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "encoded_bool%0#0" + ] + }, + "2636": { + "op": "frame_dig 0", + "defined_out": [ + "encoded_bool%0#0", + "maybe_value%0#0", + "performance#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "encoded_bool%0#0", + "performance#0" + ] + }, + "2638": { + "op": "itob", + "defined_out": [ + "encoded_bool%0#0", + "maybe_value%0#0", + "performance#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "val_as_bytes%13#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "encoded_bool%0#0", + "val_as_bytes%13#0" + ] + }, + "2639": { + "op": "extract 7 1", + "defined_out": [ + "encoded_bool%0#0", + "maybe_value%0#0", + "performance#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "encoded_bool%0#0", + "tmp%7#0" + ] + }, + "2642": { + "op": "uncover 14" + }, + "2644": { + "op": "uncover 14", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "encoded_bool%0#0", + "tmp%7#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0" + ] + }, + "2646": { + "op": "concat", + "defined_out": [ + "encoded_bool%0#0", + "encoded_tuple_buffer%2#0", + "maybe_value%0#0", + "performance#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "encoded_bool%0#0", + "tmp%7#0", + "encoded_tuple_buffer%2#0" + ] + }, + "2647": { + "op": "uncover 13", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "encoded_bool%0#0", + "tmp%7#0", + "encoded_tuple_buffer%2#0", + "val_as_bytes%2#0" + ] + }, + "2649": { + "op": "concat", + "defined_out": [ + "encoded_bool%0#0", + "encoded_tuple_buffer%3#0", + "maybe_value%0#0", + "performance#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "val_as_bytes%3#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%3#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "encoded_bool%0#0", + "tmp%7#0", + "encoded_tuple_buffer%3#0" + ] + }, + "2650": { + "op": "uncover 12", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "encoded_bool%0#0", + "tmp%7#0", + "encoded_tuple_buffer%3#0", + "val_as_bytes%3#0" + ] + }, + "2652": { + "op": "concat", + "defined_out": [ + "encoded_bool%0#0", + "encoded_tuple_buffer%4#0", + "maybe_value%0#0", + "performance#0", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "tmp%4#0", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "encoded_bool%0#0", + "tmp%7#0", + "encoded_tuple_buffer%4#0" + ] + }, + "2653": { + "op": "uncover 11", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "encoded_bool%0#0", + "tmp%7#0", + "encoded_tuple_buffer%4#0", + "tmp%4#0" + ] + }, + "2655": { + "op": "concat", + "defined_out": [ + "encoded_bool%0#0", + "encoded_tuple_buffer%5#0", + "maybe_value%0#0", + "performance#0", + "tmp%5#0", + "tmp%6#0", + "tmp%7#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "tmp%5#0", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "encoded_bool%0#0", + "tmp%7#0", + "encoded_tuple_buffer%5#0" + ] + }, + "2656": { + "op": "uncover 10", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "encoded_bool%0#0", + "tmp%7#0", + "encoded_tuple_buffer%5#0", + "tmp%5#0" + ] + }, + "2658": { + "op": "concat", + "defined_out": [ + "encoded_bool%0#0", + "encoded_tuple_buffer%6#0", + "maybe_value%0#0", + "performance#0", + "tmp%6#0", + "tmp%7#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "tmp%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "encoded_bool%0#0", + "tmp%7#0", + "encoded_tuple_buffer%6#0" + ] + }, + "2659": { + "op": "uncover 9", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "encoded_bool%0#0", + "tmp%7#0", + "encoded_tuple_buffer%6#0", + "tmp%6#0" + ] + }, + "2661": { + "op": "concat", + "defined_out": [ + "encoded_bool%0#0", + "encoded_tuple_buffer%7#0", + "maybe_value%0#0", + "performance#0", + "tmp%7#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "encoded_bool%0#0", + "tmp%7#0", + "encoded_tuple_buffer%7#0" + ] + }, + "2662": { + "op": "uncover 8", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "encoded_bool%0#0", + "tmp%7#0", + "encoded_tuple_buffer%7#0", + "val_as_bytes%7#0" + ] + }, + "2664": { + "op": "concat", + "defined_out": [ + "encoded_bool%0#0", + "encoded_tuple_buffer%8#0", + "maybe_value%0#0", + "performance#0", + "tmp%7#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "encoded_bool%0#0", + "tmp%7#0", + "encoded_tuple_buffer%8#0" + ] + }, + "2665": { + "op": "uncover 7", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "encoded_bool%0#0", + "tmp%7#0", + "encoded_tuple_buffer%8#0", + "val_as_bytes%8#0" + ] + }, + "2667": { + "op": "concat", + "defined_out": [ + "encoded_bool%0#0", + "encoded_tuple_buffer%9#0", + "maybe_value%0#0", + "performance#0", + "tmp%7#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "val_as_bytes%9#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "encoded_bool%0#0", + "tmp%7#0", + "encoded_tuple_buffer%9#0" + ] + }, + "2668": { + "op": "uncover 6", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "encoded_bool%0#0", + "tmp%7#0", + "encoded_tuple_buffer%9#0", + "val_as_bytes%9#0" + ] + }, + "2670": { + "op": "concat", + "defined_out": [ + "encoded_bool%0#0", + "encoded_tuple_buffer%10#0", + "maybe_value%0#0", + "performance#0", + "tmp%7#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "encoded_bool%0#0", + "tmp%7#0", + "encoded_tuple_buffer%10#0" + ] + }, + "2671": { + "op": "uncover 5", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "encoded_bool%0#0", + "tmp%7#0", + "encoded_tuple_buffer%10#0", + "val_as_bytes%10#0" + ] + }, + "2673": { + "op": "concat", + "defined_out": [ + "encoded_bool%0#0", + "encoded_tuple_buffer%11#0", + "maybe_value%0#0", + "performance#0", + "tmp%7#0", + "val_as_bytes%11#0", + "val_as_bytes%12#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%11#0", + "val_as_bytes%12#0", + "encoded_bool%0#0", + "tmp%7#0", + "encoded_tuple_buffer%11#0" + ] + }, + "2674": { + "op": "uncover 4", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%12#0", + "encoded_bool%0#0", + "tmp%7#0", + "encoded_tuple_buffer%11#0", + "val_as_bytes%11#0" + ] + }, + "2676": { + "op": "concat", + "defined_out": [ + "encoded_bool%0#0", + "encoded_tuple_buffer%12#0", + "maybe_value%0#0", + "performance#0", + "tmp%7#0", + "val_as_bytes%12#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "val_as_bytes%12#0", + "encoded_bool%0#0", + "tmp%7#0", + "encoded_tuple_buffer%12#0" + ] + }, + "2677": { + "op": "uncover 3", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "encoded_bool%0#0", + "tmp%7#0", + "encoded_tuple_buffer%12#0", + "val_as_bytes%12#0" + ] + }, + "2679": { + "op": "concat", + "defined_out": [ + "encoded_bool%0#0", + "encoded_tuple_buffer%13#0", + "maybe_value%0#0", + "performance#0", + "tmp%7#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "encoded_bool%0#0", + "tmp%7#0", + "encoded_tuple_buffer%13#0" + ] + }, + "2680": { + "op": "uncover 2", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "tmp%7#0", + "encoded_tuple_buffer%13#0", + "encoded_bool%0#0" + ] + }, + "2682": { + "op": "concat", + "defined_out": [ + "encoded_tuple_buffer%14#0", + "maybe_value%0#0", + "performance#0", + "tmp%7#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "tmp%7#0", + "encoded_tuple_buffer%14#0" + ] + }, + "2683": { + "op": "swap", + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "encoded_tuple_buffer%14#0", + "tmp%7#0" + ] + }, + "2684": { + "op": "concat", + "defined_out": [ + "encoded_tuple_buffer%15#0", + "maybe_value%0#0", + "performance#0" + ], + "stack_out": [ + "performance#0", + "maybe_value%0#0", + "performance#8", + "encoded_tuple_buffer%15#0" + ] + }, + "2685": { + "op": "frame_bury 0" + }, + "2687": { + "retsub": true, + "op": "retsub" + }, + "2688": { + "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.get_account_info", + "params": { + "holding_address#0": "bytes" + }, + "block": "get_account_info", + "stack_in": [], + "op": "proto 1 1" + }, + "2691": { + "op": "bytec 7 // 0x52333023", + "defined_out": [ + "0x52333023" + ], + "stack_out": [ + "0x52333023" + ] + }, + "2693": { + "op": "frame_dig -1", + "defined_out": [ + "0x52333023", + "holding_address#0 (copy)" + ], + "stack_out": [ + "0x52333023", + "holding_address#0 (copy)" + ] + }, + "2695": { + "op": "concat", + "defined_out": [ + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1" + ] + }, + "2696": { + "op": "dup", + "defined_out": [ + "tmp%0#1", + "tmp%0#1 (copy)" + ], + "stack_out": [ + "tmp%0#1", + "tmp%0#1 (copy)" + ] + }, + "2697": { + "op": "box_len", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#1", + "tmp%0#1" + ], + "stack_out": [ + "tmp%0#1", + "maybe_value%0#1", + "maybe_exists%0#0" + ] + }, + "2698": { + "op": "bury 1", + "stack_out": [ + "tmp%0#1", + "maybe_exists%0#0" + ] + }, + "2700": { + "error": "Invalid account holding address", + "op": "assert // Invalid account holding address", + "stack_out": [ + "tmp%0#1" + ] + }, + "2701": { + "op": "box_get", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2702": { + "error": "check self.account entry exists", + "op": "assert // check self.account entry exists", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "2703": { + "retsub": true, + "op": "retsub" + }, + "2704": { + "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.get_time_events", + "params": {}, + "block": "get_time_events", + "stack_in": [], + "op": "proto 0 1" + }, + "2707": { + "op": "pushbytes 0x0000" + }, + "2711": { + "op": "intc_0 // 0" + }, + "2712": { + "op": "bytec_2 // \"status\"", + "defined_out": [ + "\"status\"", + "0", + "time_events#0" + ], + "stack_out": [ + "time_events#0", + "0", + "\"status\"" + ] + }, + "2713": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0", + "time_events#0" + ], + "stack_out": [ + "time_events#0", + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2714": { + "error": "check self.status exists", + "op": "assert // check self.status exists", + "stack_out": [ + "time_events#0", + "maybe_value%0#0" + ] + }, + "2715": { + "op": "pushint 100 // 100", + "defined_out": [ + "100", + "maybe_value%0#0", + "time_events#0" + ], + "stack_out": [ + "time_events#0", + "maybe_value%0#0", + "100" + ] + }, + "2717": { + "op": "==", + "defined_out": [ + "time_events#0", + "tmp%0#1" + ], + "stack_out": [ + "time_events#0", + "tmp%0#1" + ] + }, + "2718": { + "op": "bz get_time_events_after_if_else@2", + "stack_out": [ + "time_events#0" + ] + }, + "2721": { + "op": "bytec 22 // 0x74696d654576656e7473" + }, + "2723": { + "op": "box_get" + }, + "2724": { + "op": "swap" + }, + "2725": { + "op": "frame_bury 0" + }, + "2727": { + "error": "check self.time_events exists", + "op": "assert // check self.time_events exists" + }, + "2728": { + "block": "get_time_events_after_if_else@2", + "stack_in": [ + "time_events#0" + ], + "op": "frame_dig 0", + "defined_out": [ + "time_events#0" + ], + "stack_out": [ + "time_events#0", + "time_events#0" + ] + }, + "2730": { + "op": "swap" + }, + "2731": { + "retsub": true, + "op": "retsub" + }, + "2732": { + "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.get_secondary_market_schedule", + "params": {}, + "block": "get_secondary_market_schedule", + "stack_in": [], + "op": "proto 0 1" + }, + "2735": { + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "2736": { + "op": "bytec 17 // \"secondary_market_opening_date\"", + "defined_out": [ + "\"secondary_market_opening_date\"", + "0" + ], + "stack_out": [ + "0", + "\"secondary_market_opening_date\"" + ] + }, + "2738": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2739": { + "error": "check self.secondary_market_opening_date exists", + "op": "assert // check self.secondary_market_opening_date exists", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "2740": { + "op": "itob", + "defined_out": [ + "val_as_bytes%0#0" + ], + "stack_out": [ + "val_as_bytes%0#0" + ] + }, + "2741": { + "op": "intc_0 // 0", + "stack_out": [ + "val_as_bytes%0#0", + "0" + ] + }, + "2742": { + "op": "bytec 18 // \"secondary_market_closure_date\"", + "defined_out": [ + "\"secondary_market_closure_date\"", + "0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "val_as_bytes%0#0", + "0", + "\"secondary_market_closure_date\"" + ] + }, + "2744": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%1#0", + "maybe_value%1#0", + "val_as_bytes%0#0" + ], + "stack_out": [ + "val_as_bytes%0#0", + "maybe_value%1#0", + "maybe_exists%1#0" + ] + }, + "2745": { + "error": "check self.secondary_market_closure_date exists", + "op": "assert // check self.secondary_market_closure_date exists", + "stack_out": [ + "val_as_bytes%0#0", + "maybe_value%1#0" + ] + }, + "2746": { + "op": "itob", + "defined_out": [ + "val_as_bytes%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "val_as_bytes%0#0", + "val_as_bytes%1#0" + ] + }, + "2747": { + "op": "concat", + "defined_out": [ + "result%1#0" + ], + "stack_out": [ + "result%1#0" + ] + }, + "2748": { + "op": "pushbytes 0x0002", + "defined_out": [ + "0x0002", + "result%1#0" + ], + "stack_out": [ + "result%1#0", + "0x0002" + ] + }, + "2752": { + "op": "swap", + "stack_out": [ + "0x0002", + "result%1#0" + ] + }, + "2753": { + "op": "concat", + "defined_out": [ + "array_data%0#0" + ], + "stack_out": [ + "array_data%0#0" + ] + }, + "2754": { + "retsub": true, + "op": "retsub" + }, + "2755": { + "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.get_asset_metadata", + "params": {}, + "block": "get_asset_metadata", + "stack_in": [], + "op": "proto 0 1" + }, + "2758": { + "op": "intc_0 // 0", + "defined_out": [ + "0" + ], + "stack_out": [ + "0" + ] + }, + "2759": { + "op": "bytec 12 // \"metadata\"", + "defined_out": [ + "\"metadata\"", + "0" + ], + "stack_out": [ + "0", + "\"metadata\"" + ] + }, + "2761": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%0#0", + "maybe_value%0#0" + ], + "stack_out": [ + "maybe_value%0#0", + "maybe_exists%0#0" + ] + }, + "2762": { + "error": "check self.metadata exists", + "op": "assert // check self.metadata exists", + "stack_out": [ + "maybe_value%0#0" + ] + }, + "2763": { + "retsub": true, + "op": "retsub" + } + } +} \ No newline at end of file diff --git a/smart_contracts/base_d_asa/BaseDAsa.approval.teal b/smart_contracts/base_d_asa/BaseDAsa.approval.teal new file mode 100644 index 0000000..b7e9736 --- /dev/null +++ b/smart_contracts/base_d_asa/BaseDAsa.approval.teal @@ -0,0 +1,2857 @@ +#pragma version 10 +#pragma typetrack false + +// smart_contracts.base_d_asa.contract.BaseDAsa.__algopy_entrypoint_with_init() -> uint64: +main: + intcblock 0 1 8 4 200 + bytecblock 0x151f7c75 "circulating_units" "status" "maturity_date" "unit_value" "total_units" "total_coupons" 0x52333023 0x52323023 "denomination_asset_id" "settlement_asset_id" "day_count_convention" "metadata" "principal_discount" "primary_distribution_opening_date" "primary_distribution_closure_date" "issuance_date" "secondary_market_opening_date" "secondary_market_closure_date" "suspended" "defaulted" "interest_rate" 0x74696d654576656e7473 0x52373023 0x52363023 0x52353023 0x52343023 0x0000000000000000 0x636f75706f6e5261746573 0x068101 0x52383023 + txn ApplicationID + bnz main_after_if_else@2 + // smart_contracts/base_d_asa/contract.py:41-42 + // # Role Based Access Control + // self.arranger = GlobalState(Account(), key=cst.PREFIX_ID_ARRANGER) + bytec 8 // 0x52323023 + global ZeroAddress + app_global_put + // smart_contracts/base_d_asa/contract.py:59-60 + // # Asset Configuration + // self.denomination_asset_id = UInt64() + bytec 9 // "denomination_asset_id" + intc_0 // 0 + app_global_put + // smart_contracts/base_d_asa/contract.py:61 + // self.settlement_asset_id = UInt64() + bytec 10 // "settlement_asset_id" + intc_0 // 0 + app_global_put + // smart_contracts/base_d_asa/contract.py:62 + // self.unit_value = UInt64() + bytec 4 // "unit_value" + intc_0 // 0 + app_global_put + // smart_contracts/base_d_asa/contract.py:63 + // self.day_count_convention = UInt64() + bytec 11 // "day_count_convention" + intc_0 // 0 + app_global_put + // smart_contracts/base_d_asa/contract.py:65-66 + // # Metadata + // self.metadata = Bytes() + bytec 12 // "metadata" + pushbytes 0x + app_global_put + // smart_contracts/base_d_asa/contract.py:68-69 + // # Supply + // self.total_units = UInt64() + bytec 5 // "total_units" + intc_0 // 0 + app_global_put + // smart_contracts/base_d_asa/contract.py:70 + // self.circulating_units = UInt64() + bytec_1 // "circulating_units" + intc_0 // 0 + app_global_put + // smart_contracts/base_d_asa/contract.py:72-73 + // # Principal + // self.principal_discount = UInt64() + bytec 13 // "principal_discount" + intc_0 // 0 + app_global_put + // smart_contracts/base_d_asa/contract.py:75-76 + // # Interest + // self.interest_rate = UInt64() + bytec 21 // "interest_rate" + intc_0 // 0 + app_global_put + // smart_contracts/base_d_asa/contract.py:80 + // self.total_coupons = UInt64() + bytec 6 // "total_coupons" + intc_0 // 0 + app_global_put + // smart_contracts/base_d_asa/contract.py:85 + // self.primary_distribution_opening_date = UInt64() + bytec 14 // "primary_distribution_opening_date" + intc_0 // 0 + app_global_put + // smart_contracts/base_d_asa/contract.py:86 + // self.primary_distribution_closure_date = UInt64() + bytec 15 // "primary_distribution_closure_date" + intc_0 // 0 + app_global_put + // smart_contracts/base_d_asa/contract.py:87 + // self.issuance_date = UInt64() + bytec 16 // "issuance_date" + intc_0 // 0 + app_global_put + // smart_contracts/base_d_asa/contract.py:88 + // self.secondary_market_opening_date = UInt64() + bytec 17 // "secondary_market_opening_date" + intc_0 // 0 + app_global_put + // smart_contracts/base_d_asa/contract.py:89 + // self.secondary_market_closure_date = UInt64() + bytec 18 // "secondary_market_closure_date" + intc_0 // 0 + app_global_put + // smart_contracts/base_d_asa/contract.py:90 + // self.maturity_date = UInt64() + bytec_3 // "maturity_date" + intc_0 // 0 + app_global_put + // smart_contracts/base_d_asa/contract.py:92-93 + // # Status + // self.status = UInt64(cfg.STATUS_EMPTY) + bytec_2 // "status" + intc_0 // 0 + app_global_put + // smart_contracts/base_d_asa/contract.py:94 + // self.suspended = UInt64() + bytec 19 // "suspended" + intc_0 // 0 + app_global_put + // smart_contracts/base_d_asa/contract.py:95 + // self.defaulted = UInt64() + bytec 20 // "defaulted" + intc_0 // 0 + app_global_put + +main_after_if_else@2: + // smart_contracts/base_d_asa/contract.py:28 + // class BaseDAsa(ARC4Contract): + txn NumAppArgs + bz main_after_if_else@22 + pushbytess 0x3f0efc6c 0x25dba95b 0x89474134 0x1d6fc255 0xfef74567 0xb8fc1390 0x3d43d1f0 0xebd96b2f 0x6c85e3ee 0xf63ace8d 0xbbcca18a 0x1a7babb4 0x402dba47 0xed02759f 0xfad2173e 0x08efea35 0xe4a5ab54 // method "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", method "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", method "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", method "set_secondary_time_events(uint64[])(uint64,uint64)", method "assign_role(address,uint8,byte[])uint64", method "revoke_role(address,uint8)uint64", method "open_account(address,address)uint64", method "close_account(address)(uint64,uint64)", method "primary_distribution(address,uint64)uint64", method "set_asset_suspension(bool)uint64", method "set_account_suspension(address,bool)uint64", method "set_default_status(bool)void", method "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", method "get_account_info(address)(address,uint64,uint64,uint64,bool)", method "get_time_events()uint64[]", method "get_secondary_market_schedule()uint64[]", method "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)" + txna ApplicationArgs 0 + match main_asset_create_route@5 main_asset_update_route@6 main_asset_config_route@7 main_set_secondary_time_events_route@8 main_assign_role_route@9 main_revoke_role_route@10 main_open_account_route@11 main_close_account_route@12 main_primary_distribution_route@13 main_set_asset_suspension_route@14 main_set_account_suspension_route@15 main_set_default_status_route@16 main_get_asset_info_route@17 main_get_account_info_route@18 main_get_time_events_route@19 main_get_secondary_market_schedule_route@20 main_get_asset_metadata_route@21 + +main_after_if_else@22: + // smart_contracts/base_d_asa/contract.py:28 + // class BaseDAsa(ARC4Contract): + intc_0 // 0 + return + +main_get_asset_metadata_route@21: + // smart_contracts/base_d_asa/contract.py:980 + // @arc4.abimethod(readonly=True) + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + callsub get_asset_metadata + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + +main_get_secondary_market_schedule_route@20: + // smart_contracts/base_d_asa/contract.py:967 + // @arc4.abimethod(readonly=True) + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + callsub get_secondary_market_schedule + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + +main_get_time_events_route@19: + // smart_contracts/base_d_asa/contract.py:954 + // @arc4.abimethod(readonly=True) + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + callsub get_time_events + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + +main_get_account_info_route@18: + // smart_contracts/base_d_asa/contract.py:937 + // @arc4.abimethod(readonly=True) + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/base_d_asa/contract.py:28 + // class BaseDAsa(ARC4Contract): + txna ApplicationArgs 1 + // smart_contracts/base_d_asa/contract.py:937 + // @arc4.abimethod(readonly=True) + callsub get_account_info + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + +main_get_asset_info_route@17: + // smart_contracts/base_d_asa/contract.py:898 + // @arc4.abimethod(readonly=True) + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + callsub get_asset_info + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + +main_set_default_status_route@16: + // smart_contracts/base_d_asa/contract.py:884 + // @arc4.abimethod + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/base_d_asa/contract.py:28 + // class BaseDAsa(ARC4Contract): + txna ApplicationArgs 1 + // smart_contracts/base_d_asa/contract.py:884 + // @arc4.abimethod + callsub set_default_status + intc_1 // 1 + return + +main_set_account_suspension_route@15: + // smart_contracts/base_d_asa/contract.py:861 + // @arc4.abimethod + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/base_d_asa/contract.py:28 + // class BaseDAsa(ARC4Contract): + txna ApplicationArgs 1 + txna ApplicationArgs 2 + // smart_contracts/base_d_asa/contract.py:861 + // @arc4.abimethod + callsub set_account_suspension + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + +main_set_asset_suspension_route@14: + // smart_contracts/base_d_asa/contract.py:843 + // @arc4.abimethod + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/base_d_asa/contract.py:28 + // class BaseDAsa(ARC4Contract): + txna ApplicationArgs 1 + // smart_contracts/base_d_asa/contract.py:843 + // @arc4.abimethod + callsub set_asset_suspension + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + +main_primary_distribution_route@13: + // smart_contracts/base_d_asa/contract.py:801 + // @arc4.abimethod + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/base_d_asa/contract.py:28 + // class BaseDAsa(ARC4Contract): + txna ApplicationArgs 1 + txna ApplicationArgs 2 + // smart_contracts/base_d_asa/contract.py:801 + // @arc4.abimethod + callsub primary_distribution + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + +main_close_account_route@12: + // smart_contracts/base_d_asa/contract.py:771 + // @arc4.abimethod + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/base_d_asa/contract.py:28 + // class BaseDAsa(ARC4Contract): + txna ApplicationArgs 1 + // smart_contracts/base_d_asa/contract.py:771 + // @arc4.abimethod + callsub close_account + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + +main_open_account_route@11: + // smart_contracts/base_d_asa/contract.py:736 + // @arc4.abimethod + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/base_d_asa/contract.py:28 + // class BaseDAsa(ARC4Contract): + txna ApplicationArgs 1 + txna ApplicationArgs 2 + // smart_contracts/base_d_asa/contract.py:736 + // @arc4.abimethod + callsub open_account + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + +main_revoke_role_route@10: + // smart_contracts/base_d_asa/contract.py:688 + // @arc4.abimethod + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/base_d_asa/contract.py:28 + // class BaseDAsa(ARC4Contract): + txna ApplicationArgs 1 + txna ApplicationArgs 2 + // smart_contracts/base_d_asa/contract.py:688 + // @arc4.abimethod + callsub revoke_role + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + +main_assign_role_route@9: + // smart_contracts/base_d_asa/contract.py:625 + // @arc4.abimethod + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/base_d_asa/contract.py:28 + // class BaseDAsa(ARC4Contract): + txna ApplicationArgs 1 + txna ApplicationArgs 2 + txna ApplicationArgs 3 + // smart_contracts/base_d_asa/contract.py:625 + // @arc4.abimethod + callsub assign_role + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + +main_set_secondary_time_events_route@8: + // smart_contracts/base_d_asa/contract.py:569 + // @arc4.abimethod + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/base_d_asa/contract.py:28 + // class BaseDAsa(ARC4Contract): + txna ApplicationArgs 1 + // smart_contracts/base_d_asa/contract.py:569 + // @arc4.abimethod + callsub set_secondary_time_events + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + return + +main_asset_config_route@7: + // smart_contracts/base_d_asa/contract.py:484 + // @arc4.abimethod + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // smart_contracts/base_d_asa/contract.py:28 + // class BaseDAsa(ARC4Contract): + txna ApplicationArgs 1 + txna ApplicationArgs 2 + txna ApplicationArgs 3 + txna ApplicationArgs 4 + txna ApplicationArgs 5 + txna ApplicationArgs 6 + txna ApplicationArgs 7 + txna ApplicationArgs 8 + txna ApplicationArgs 9 + txna ApplicationArgs 10 + // smart_contracts/base_d_asa/contract.py:484 + // @arc4.abimethod + callsub asset_config + intc_1 // 1 + return + +main_asset_update_route@6: + // smart_contracts/base_d_asa/contract.py:473 + // @arc4.abimethod(allow_actions=["UpdateApplication"]) + txn OnCompletion + intc_3 // UpdateApplication + == + assert // OnCompletion is not UpdateApplication + txn ApplicationID + assert // can only call when not creating + // smart_contracts/base_d_asa/contract.py:28 + // class BaseDAsa(ARC4Contract): + txna ApplicationArgs 1 + // smart_contracts/base_d_asa/contract.py:473 + // @arc4.abimethod(allow_actions=["UpdateApplication"]) + callsub asset_update + intc_1 // 1 + return + +main_asset_create_route@5: + // smart_contracts/base_d_asa/contract.py:461 + // @arc4.abimethod(create="require") + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + ! + assert // can only call when creating + // smart_contracts/base_d_asa/contract.py:28 + // class BaseDAsa(ARC4Contract): + txna ApplicationArgs 1 + txna ApplicationArgs 2 + // smart_contracts/base_d_asa/contract.py:461 + // @arc4.abimethod(create="require") + callsub asset_create + intc_1 // 1 + return + + +// smart_contracts.base_d_asa.contract.BaseDAsa.asset_create(arranger: bytes, metadata: bytes) -> void: +asset_create: + // smart_contracts/base_d_asa/contract.py:461-462 + // @arc4.abimethod(create="require") + // def asset_create(self, arranger: arc4.Address, metadata: typ.AssetMetadata) -> None: + proto 2 0 + // smart_contracts/base_d_asa/contract.py:470 + // self.arranger.value = arranger.native + bytec 8 // 0x52323023 + frame_dig -2 + app_global_put + // smart_contracts/base_d_asa/contract.py:471 + // self.metadata = metadata.bytes + bytec 12 // "metadata" + frame_dig -1 + app_global_put + retsub + + +// smart_contracts.base_d_asa.contract.BaseDAsa.asset_update(metadata: bytes) -> void: +asset_update: + // smart_contracts/base_d_asa/contract.py:473-474 + // @arc4.abimethod(allow_actions=["UpdateApplication"]) + // def asset_update(self, metadata: typ.AssetMetadata) -> None: + proto 1 0 + // smart_contracts/base_d_asa/contract.py:478-481 + // # The reference implementation grants the update permissions to the Arranger. + // # Other implementations may disable D-ASA application updatability or change its authorizations. + // # ⚠️ WARNING: Application updates must be executed VERY carefully, as they might introduce breaking changes. + // self.assert_caller_is_arranger() + callsub assert_caller_is_arranger + // smart_contracts/base_d_asa/contract.py:482 + // self.metadata = metadata.bytes + bytec 12 // "metadata" + frame_dig -1 + app_global_put + retsub + + +// smart_contracts.base_d_asa.contract.BaseDAsa.assert_caller_is_arranger() -> void: +assert_caller_is_arranger: + // smart_contracts/base_d_asa/contract.py:118-119 + // @subroutine + // def assert_caller_is_arranger(self) -> None: + proto 0 0 + // smart_contracts/base_d_asa/contract.py:120 + // assert Txn.sender == self.arranger.value, err.UNAUTHORIZED + txn Sender + intc_0 // 0 + bytec 8 // 0x52323023 + app_global_get_ex + assert // check self.arranger exists + == + assert // Not authorized + retsub + + +// smart_contracts.base_d_asa.contract.BaseDAsa.asset_config(denomination_asset_id: bytes, settlement_asset_id: bytes, principal: bytes, principal_discount: bytes, minimum_denomination: bytes, day_count_convention: bytes, interest_rate: bytes, coupon_rates: bytes, time_events: bytes, time_periods: bytes) -> void: +asset_config: + // smart_contracts/base_d_asa/contract.py:484-497 + // @arc4.abimethod + // def asset_config( + // self, + // denomination_asset_id: arc4.UInt64, + // settlement_asset_id: arc4.UInt64, + // principal: arc4.UInt64, + // principal_discount: arc4.UInt64, + // minimum_denomination: arc4.UInt64, + // day_count_convention: arc4.UInt8, + // interest_rate: arc4.UInt16, + // coupon_rates: typ.CouponRates, + // time_events: typ.TimeEvents, + // time_periods: typ.TimePeriods, + // ) -> None: + proto 10 0 + intc_0 // 0 + pushbytes "" + dupn 2 + // smart_contracts/base_d_asa/contract.py:527 + // self.assert_caller_is_arranger() + callsub assert_caller_is_arranger + // smart_contracts/base_d_asa/contract.py:528 + // assert self.status == cfg.STATUS_EMPTY, err.ALREADY_CONFIGURED + intc_0 // 0 + bytec_2 // "status" + app_global_get_ex + assert // check self.status exists + ! + assert // D-ASA already configured + // smart_contracts/base_d_asa/contract.py:530-531 + // # Set Denomination Asset + // self.assert_denomination_asset(denomination_asset_id.native) + frame_dig -10 + btoi + dup + // smart_contracts/base_d_asa/contract.py:180 + // denomination_asset_id != UInt64(0) and Asset(denomination_asset_id).creator + bz asset_config_bool_false@4 + frame_dig 4 + asset_params_get AssetCreator + assert // asset exists + global ZeroAddress + != + bz asset_config_bool_false@4 + intc_1 // 1 + +asset_config_bool_merge@5: + // smart_contracts/base_d_asa/contract.py:178-181 + // # The reference implementation has on-chain denomination with ASA + // assert ( + // denomination_asset_id != UInt64(0) and Asset(denomination_asset_id).creator + // ), err.INVALID_DENOMINATION + assert // Denomination asset is not properly set + // smart_contracts/base_d_asa/contract.py:185 + // self.denomination_asset_id = denomination_asset_id + bytec 9 // "denomination_asset_id" + frame_dig 4 + app_global_put + // smart_contracts/base_d_asa/contract.py:534-535 + // # Set Denomination Asset + // self.assert_settlement_asset(settlement_asset_id.native) + frame_dig -9 + btoi + // smart_contracts/base_d_asa/contract.py:191 + // settlement_asset_id == self.denomination_asset_id + intc_0 // 0 + bytec 9 // "denomination_asset_id" + app_global_get_ex + assert // check self.denomination_asset_id exists + dig 1 + == + // smart_contracts/base_d_asa/contract.py:189-192 + // # The reference implementation settlement asset is the denomination asset + // assert ( + // settlement_asset_id == self.denomination_asset_id + // ), err.INVALID_SETTLEMENT_ASSET + assert // Different settlement asset not supported, must be equal to denomination asset + // smart_contracts/base_d_asa/contract.py:196 + // self.settlement_asset_id = settlement_asset_id + bytec 10 // "settlement_asset_id" + swap + app_global_put + // smart_contracts/base_d_asa/contract.py:197-203 + // # The reference implementation has on-chain settlement with ASA + // itxn.AssetTransfer( + // xfer_asset=self.settlement_asset_id, + // asset_receiver=Global.current_application_address, + // asset_amount=0, + // fee=Global.min_txn_fee, + // ).submit() + itxn_begin + // smart_contracts/base_d_asa/contract.py:202 + // fee=Global.min_txn_fee, + global MinTxnFee + // smart_contracts/base_d_asa/contract.py:199 + // xfer_asset=self.settlement_asset_id, + intc_0 // 0 + bytec 10 // "settlement_asset_id" + app_global_get_ex + assert // check self.settlement_asset_id exists + // smart_contracts/base_d_asa/contract.py:200 + // asset_receiver=Global.current_application_address, + global CurrentApplicationAddress + // smart_contracts/base_d_asa/contract.py:201 + // asset_amount=0, + intc_0 // 0 + itxn_field AssetAmount + itxn_field AssetReceiver + itxn_field XferAsset + // smart_contracts/base_d_asa/contract.py:197-198 + // # The reference implementation has on-chain settlement with ASA + // itxn.AssetTransfer( + intc_3 // axfer + itxn_field TypeEnum + itxn_field Fee + // smart_contracts/base_d_asa/contract.py:197-203 + // # The reference implementation has on-chain settlement with ASA + // itxn.AssetTransfer( + // xfer_asset=self.settlement_asset_id, + // asset_receiver=Global.current_application_address, + // asset_amount=0, + // fee=Global.min_txn_fee, + // ).submit() + itxn_submit + // smart_contracts/base_d_asa/contract.py:540 + // principal.native % minimum_denomination.native == 0 + frame_dig -8 + btoi + frame_dig -6 + btoi + dup2 + % + ! + // smart_contracts/base_d_asa/contract.py:538-541 + // # Set Principal and Minimum Denomination + // assert ( + // principal.native % minimum_denomination.native == 0 + // ), err.INVALID_MINIMUM_DENOMINATION + assert // Minimum denomination is not a divisor of principal + // smart_contracts/base_d_asa/contract.py:542 + // self.unit_value = minimum_denomination.native + bytec 4 // "unit_value" + dig 1 + app_global_put + // smart_contracts/base_d_asa/contract.py:543 + // self.total_units = principal.native // minimum_denomination.native + / + bytec 5 // "total_units" + swap + app_global_put + // smart_contracts/base_d_asa/contract.py:544 + // self.principal_discount = principal_discount.native + frame_dig -7 + btoi + bytec 13 // "principal_discount" + swap + app_global_put + // smart_contracts/base_d_asa/contract.py:546-547 + // # Set Day-Count Convention + // self.assert_day_count_convention(day_count_convention.native) + frame_dig -5 + btoi + dup + frame_bury 1 + // smart_contracts/base_d_asa/contract.py:207-211 + // # The reference implementation supports only the Actual/Actual and Continuous day-count conventions + // assert day_count_convention in ( + // UInt64(cst.DCC_A_A), + // UInt64(cst.DCC_CONT), + // ), err.INVALID_DAY_COUNT_CONVENTION + bz asset_config_bool_true@16 + frame_dig 1 + // smart_contracts/base_d_asa/contract.py:210 + // UInt64(cst.DCC_CONT), + pushint 255 // 255 + // smart_contracts/base_d_asa/contract.py:207-211 + // # The reference implementation supports only the Actual/Actual and Continuous day-count conventions + // assert day_count_convention in ( + // UInt64(cst.DCC_A_A), + // UInt64(cst.DCC_CONT), + // ), err.INVALID_DAY_COUNT_CONVENTION + == + bz asset_config_bool_false@17 + +asset_config_bool_true@16: + intc_1 // 1 + +asset_config_bool_merge@18: + // smart_contracts/base_d_asa/contract.py:207-211 + // # The reference implementation supports only the Actual/Actual and Continuous day-count conventions + // assert day_count_convention in ( + // UInt64(cst.DCC_A_A), + // UInt64(cst.DCC_CONT), + // ), err.INVALID_DAY_COUNT_CONVENTION + assert // Invalid day-count convention ID + // smart_contracts/base_d_asa/contract.py:215 + // self.day_count_convention = day_count_convention + bytec 11 // "day_count_convention" + frame_dig 1 + app_global_put + // smart_contracts/base_d_asa/contract.py:550-551 + // # Set Interest Rate + // self.assert_interest_rate(interest_rate.native) + frame_dig -4 + btoi + frame_bury 2 + // smart_contracts/base_d_asa/contract.py:219-220 + // # This subroutine must be used after the principal discount has been set + // if not self.principal_discount: + intc_0 // 0 + bytec 13 // "principal_discount" + app_global_get_ex + assert // check self.principal_discount exists + bnz asset_config_after_if_else@24 + // smart_contracts/base_d_asa/contract.py:221 + // assert interest_rate > UInt64(0), err.INVALID_INTEREST_RATE + frame_dig 2 + assert // Interest rate is not properly defined + +asset_config_after_if_else@24: + // smart_contracts/base_d_asa/contract.py:225 + // self.interest_rate = interest_rate + bytec 21 // "interest_rate" + frame_dig 2 + app_global_put + // smart_contracts/base_d_asa/contract.py:229 + // assert not coupon_rates.length, err.INVALID_COUPON_RATES + frame_dig -3 + intc_0 // 0 + extract_uint16 + dup + ! + assert // Coupon rates are not properly defined + // smart_contracts/base_d_asa/contract.py:233 + // self.total_coupons = coupon_rates.length + bytec 6 // "total_coupons" + swap + app_global_put + // smart_contracts/base_d_asa/contract.py:234 + // if self.total_coupons: + intc_0 // 0 + bytec 6 // "total_coupons" + app_global_get_ex + assert // check self.total_coupons exists + bz asset_config_after_if_else@32 + // smart_contracts/base_d_asa/contract.py:235 + // self.coupon_rates.value = coupon_rates.copy() + bytec 28 // 0x636f75706f6e5261746573 + box_del + pop + bytec 28 // 0x636f75706f6e5261746573 + frame_dig -3 + box_put + +asset_config_after_if_else@32: + // smart_contracts/base_d_asa/contract.py:240 + // time_events.length == self.total_coupons + cfg.TIME_SCHEDULE_LIMITS + frame_dig -2 + intc_0 // 0 + extract_uint16 + intc_0 // 0 + bytec 6 // "total_coupons" + app_global_get_ex + assert // check self.total_coupons exists + intc_3 // 4 + + + == + // smart_contracts/base_d_asa/contract.py:239-241 + // assert ( + // time_events.length == self.total_coupons + cfg.TIME_SCHEDULE_LIMITS + // ), err.INVALID_TIME_EVENTS_LENGTH + assert // Time events length is invalid + // smart_contracts/base_d_asa/contract.py:560 + // self.assert_time_events_sorted(time_events) + frame_dig -2 + callsub assert_time_events_sorted + frame_bury -2 + // smart_contracts/base_d_asa/contract.py:265 + // self.time_events.value = time_events.copy() + bytec 22 // 0x74696d654576656e7473 + box_del + pop + bytec 22 // 0x74696d654576656e7473 + frame_dig -2 + box_put + // smart_contracts/base_d_asa/contract.py:266-268 + // self.primary_distribution_opening_date = time_events[ + // cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX + // ].native + frame_dig -2 + extract 2 0 + dup + frame_bury 0 + dup + extract 0 8 // on error: Index access is out of bounds + btoi + // smart_contracts/base_d_asa/contract.py:266 + // self.primary_distribution_opening_date = time_events[ + bytec 14 // "primary_distribution_opening_date" + // smart_contracts/base_d_asa/contract.py:266-268 + // self.primary_distribution_opening_date = time_events[ + // cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX + // ].native + swap + app_global_put + // smart_contracts/base_d_asa/contract.py:269-271 + // self.primary_distribution_closure_date = time_events[ + // cfg.PRIMARY_DISTRIBUTION_CLOSURE_DATE_IDX + // ].native + dup + extract 8 8 // on error: Index access is out of bounds + btoi + // smart_contracts/base_d_asa/contract.py:269 + // self.primary_distribution_closure_date = time_events[ + bytec 15 // "primary_distribution_closure_date" + // smart_contracts/base_d_asa/contract.py:269-271 + // self.primary_distribution_closure_date = time_events[ + // cfg.PRIMARY_DISTRIBUTION_CLOSURE_DATE_IDX + // ].native + swap + app_global_put + // smart_contracts/base_d_asa/contract.py:272 + // self.issuance_date = time_events[cfg.ISSUANCE_DATE_IDX].native + extract 16 8 // on error: Index access is out of bounds + btoi + bytec 16 // "issuance_date" + swap + app_global_put + // smart_contracts/base_d_asa/contract.py:274-275 + // # Some D-ASA may not have a maturity date (e.g., perpetuals) + // if time_events.length == self.total_coupons + cfg.TIME_SCHEDULE_LIMITS: + frame_dig -2 + intc_0 // 0 + extract_uint16 + dup + frame_bury 3 + intc_0 // 0 + bytec 6 // "total_coupons" + app_global_get_ex + assert // check self.total_coupons exists + intc_3 // 4 + + + == + bz asset_config_after_if_else@38 + // smart_contracts/base_d_asa/contract.py:276 + // self.maturity_date = time_events[cfg.MATURITY_DATE_IDX].native + frame_dig 3 + intc_1 // 1 + - + intc_2 // 8 + * + frame_dig 0 + swap + intc_2 // 8 + extract3 // on error: Index access is out of bounds + btoi + bytec_3 // "maturity_date" + swap + app_global_put + +asset_config_after_if_else@38: + // smart_contracts/base_d_asa/contract.py:280 + // assert not time_periods.length, err.INVALID_TIME_PERIODS + frame_dig -1 + intc_0 // 0 + extract_uint16 + ! + assert // Time periods are not properly defined + // smart_contracts/base_d_asa/contract.py:567 + // self.status = UInt64(cfg.STATUS_ACTIVE) + bytec_2 // "status" + pushint 100 // 100 + app_global_put + retsub + +asset_config_bool_false@17: + intc_0 // 0 + b asset_config_bool_merge@18 + +asset_config_bool_false@4: + intc_0 // 0 + b asset_config_bool_merge@5 + + +// smart_contracts.base_d_asa.contract.BaseDAsa.assert_time_events_sorted(time_events: bytes) -> bytes: +assert_time_events_sorted: + // smart_contracts/base_d_asa/contract.py:243-244 + // @subroutine + // def assert_time_events_sorted(self, time_events: typ.TimeEvents) -> None: + proto 1 1 + pushbytes "" + dup + // smart_contracts/base_d_asa/contract.py:246 + // time_events[cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX].native + frame_dig -1 + extract 2 0 + dup + extract 0 8 // on error: Index access is out of bounds + btoi + // smart_contracts/base_d_asa/contract.py:247 + // > Global.latest_timestamp + global LatestTimestamp + // smart_contracts/base_d_asa/contract.py:246-247 + // time_events[cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX].native + // > Global.latest_timestamp + > + // smart_contracts/base_d_asa/contract.py:245-248 + // assert ( + // time_events[cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX].native + // > Global.latest_timestamp + // ), err.INVALID_TIME + assert // Time events must be set in the future + // smart_contracts/base_d_asa/contract.py:249 + // for _t in urange(time_events.length - 1): + frame_dig -1 + intc_0 // 0 + extract_uint16 + intc_1 // 1 + - + intc_0 // 0 + +assert_time_events_sorted_for_header@1: + // smart_contracts/base_d_asa/contract.py:249 + // for _t in urange(time_events.length - 1): + frame_dig 4 + frame_dig 3 + < + bz assert_time_events_sorted_after_for@6 + +assert_time_events_sorted_while_top@8: + pushint 75 // 75 + global OpcodeBudget + > + bz assert_time_events_sorted_after_while@14 + itxn_begin + pushint 6 // appl + itxn_field TypeEnum + pushint 5 // DeleteApplication + itxn_field OnCompletion + bytec 29 // 0x068101 + itxn_field ApprovalProgram + bytec 29 // 0x068101 + itxn_field ClearStateProgram + global MinTxnFee + itxn_field Fee + itxn_submit + b assert_time_events_sorted_while_top@8 + +assert_time_events_sorted_after_while@14: + // smart_contracts/base_d_asa/contract.py:254 + // time_i = time_events[_t].native + frame_dig 4 + dup + intc_2 // 8 + * + frame_dig 2 + dup + cover 3 + swap + intc_2 // 8 + extract3 // on error: Index access is out of bounds + btoi + dup + cover 3 + frame_bury 1 + // smart_contracts/base_d_asa/contract.py:255 + // time_f = time_events[_t + 1].native + intc_1 // 1 + + + dup + frame_bury 4 + intc_2 // 8 + * + intc_2 // 8 + extract3 // on error: Index access is out of bounds + btoi + dup + frame_bury 0 + // smart_contracts/base_d_asa/contract.py:256 + // assert time_f > time_i, err.INVALID_SORTING + < + assert // Time events must be sorted in strictly ascending order + // smart_contracts/base_d_asa/contract.py:257 + // if self.day_count_convention != UInt64(cst.DCC_CONT): + intc_0 // 0 + bytec 11 // "day_count_convention" + app_global_get_ex + assert // check self.day_count_convention exists + pushint 255 // 255 + != + bz assert_time_events_sorted_for_header@1 + // smart_contracts/base_d_asa/contract.py:258-259 + // # The reference implementation requires time periods expressed in days for regular day-count conventions + // assert (time_f - time_i) % UInt64( + frame_dig 0 + frame_dig 1 + - + // smart_contracts/base_d_asa/contract.py:258-261 + // # The reference implementation requires time periods expressed in days for regular day-count conventions + // assert (time_f - time_i) % UInt64( + // cst.DAY_2_SEC + // ) == 0, err.INVALID_TIME_PERIOD + pushint 86400 // 86400 + % + ! + assert // Time periods in Actual/Actual day count convention must be multiples of a day (in seconds) + b assert_time_events_sorted_for_header@1 + +assert_time_events_sorted_after_for@6: + frame_dig -1 + frame_bury 0 + retsub + + +// smart_contracts.base_d_asa.contract.BaseDAsa.set_secondary_time_events(secondary_market_time_events: bytes) -> bytes: +set_secondary_time_events: + // smart_contracts/base_d_asa/contract.py:569-572 + // @arc4.abimethod + // def set_secondary_time_events( + // self, secondary_market_time_events: typ.TimeEvents + // ) -> typ.SecondaryMarketSchedule: + proto 1 1 + intc_0 // 0 + // smart_contracts/base_d_asa/contract.py:590 + // self.assert_caller_is_arranger() + callsub assert_caller_is_arranger + // smart_contracts/base_d_asa/contract.py:108 + // return self.status == cfg.STATUS_ENDED + intc_0 // 0 + bytec_2 // "status" + app_global_get_ex + assert // check self.status exists + intc 4 // 200 + == + // smart_contracts/base_d_asa/contract.py:591 + // assert not self.status_is_ended(), err.UNAUTHORIZED + ! + assert // Not authorized + // smart_contracts/base_d_asa/contract.py:592 + // self.assert_is_not_defaulted() + callsub assert_is_not_defaulted + // smart_contracts/base_d_asa/contract.py:594 + // assert secondary_market_time_events.length >= 1, err.INVALID_TIME_EVENTS_LENGTH + frame_dig -1 + intc_0 // 0 + extract_uint16 + dup + assert // Time events length is invalid + // smart_contracts/base_d_asa/contract.py:595 + // if secondary_market_time_events.length > 1: + intc_1 // 1 + > + frame_dig -1 + swap + bz set_secondary_time_events_after_if_else@2 + // smart_contracts/base_d_asa/contract.py:596 + // self.assert_time_events_sorted(secondary_market_time_events) + frame_dig -1 + callsub assert_time_events_sorted + dup + frame_bury -1 + frame_bury 1 + +set_secondary_time_events_after_if_else@2: + frame_dig 1 + frame_bury -1 + // smart_contracts/base_d_asa/contract.py:598 + // self.issuance_date + intc_0 // 0 + bytec 16 // "issuance_date" + app_global_get_ex + assert // check self.issuance_date exists + // smart_contracts/base_d_asa/contract.py:599-601 + // <= secondary_market_time_events[ + // cfg.SECONDARY_MARKET_OPENING_DATE_IDX + // ].native + frame_dig -1 + extract 2 0 + dup + frame_bury 0 + extract 0 8 // on error: Index access is out of bounds + btoi + // smart_contracts/base_d_asa/contract.py:598-601 + // self.issuance_date + // <= secondary_market_time_events[ + // cfg.SECONDARY_MARKET_OPENING_DATE_IDX + // ].native + swap + dig 1 + <= + // smart_contracts/base_d_asa/contract.py:597-602 + // assert ( + // self.issuance_date + // <= secondary_market_time_events[ + // cfg.SECONDARY_MARKET_OPENING_DATE_IDX + // ].native + // ), err.INVALID_SECONDARY_OPENING_DATE + assert // Invalid secondary market opening date + // smart_contracts/base_d_asa/contract.py:603 + // self.secondary_market_opening_date = secondary_market_time_events[ + bytec 17 // "secondary_market_opening_date" + // smart_contracts/base_d_asa/contract.py:603-605 + // self.secondary_market_opening_date = secondary_market_time_events[ + // cfg.SECONDARY_MARKET_OPENING_DATE_IDX + // ].native + swap + app_global_put + // smart_contracts/base_d_asa/contract.py:606 + // if self.maturity_date: + intc_0 // 0 + bytec_3 // "maturity_date" + app_global_get_ex + assert // check self.maturity_date exists + bz set_secondary_time_events_after_if_else@4 + // smart_contracts/base_d_asa/contract.py:608 + // self.maturity_date + intc_0 // 0 + bytec_3 // "maturity_date" + app_global_get_ex + assert // check self.maturity_date exists + // smart_contracts/base_d_asa/contract.py:610 + // cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX + frame_dig -1 + intc_0 // 0 + extract_uint16 + // smart_contracts/base_d_asa/contract.py:609-611 + // >= secondary_market_time_events[ + // cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX + // ].native + intc_1 // 1 + - + intc_2 // 8 + * + frame_dig 0 + swap + intc_2 // 8 + extract3 // on error: Index access is out of bounds + btoi + // smart_contracts/base_d_asa/contract.py:608-611 + // self.maturity_date + // >= secondary_market_time_events[ + // cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX + // ].native + swap + dig 1 + >= + // smart_contracts/base_d_asa/contract.py:607-612 + // assert ( + // self.maturity_date + // >= secondary_market_time_events[ + // cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX + // ].native + // ), err.INVALID_SECONDARY_CLOSURE_DATE + assert // Invalid secondary market closure date + // smart_contracts/base_d_asa/contract.py:613 + // self.secondary_market_closure_date = secondary_market_time_events[ + bytec 18 // "secondary_market_closure_date" + // smart_contracts/base_d_asa/contract.py:613-615 + // self.secondary_market_closure_date = secondary_market_time_events[ + // cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX + // ].native + swap + app_global_put + +set_secondary_time_events_after_if_else@4: + // smart_contracts/base_d_asa/contract.py:618 + // self.secondary_market_opening_date + intc_0 // 0 + bytec 17 // "secondary_market_opening_date" + app_global_get_ex + assert // check self.secondary_market_opening_date exists + // smart_contracts/base_d_asa/contract.py:617-619 + // secondary_market_opening_date=arc4.UInt64( + // self.secondary_market_opening_date + // ), + itob + // smart_contracts/base_d_asa/contract.py:621 + // self.secondary_market_closure_date + intc_0 // 0 + bytec 18 // "secondary_market_closure_date" + app_global_get_ex + assert // check self.secondary_market_closure_date exists + // smart_contracts/base_d_asa/contract.py:620-622 + // secondary_market_closure_date=arc4.UInt64( + // self.secondary_market_closure_date + // ), + itob + // smart_contracts/base_d_asa/contract.py:616-623 + // return typ.SecondaryMarketSchedule( + // secondary_market_opening_date=arc4.UInt64( + // self.secondary_market_opening_date + // ), + // secondary_market_closure_date=arc4.UInt64( + // self.secondary_market_closure_date + // ), + // ) + concat + frame_bury 0 + retsub + + +// smart_contracts.base_d_asa.contract.BaseDAsa.assert_is_not_defaulted() -> void: +assert_is_not_defaulted: + // smart_contracts/base_d_asa/contract.py:110-111 + // @subroutine + // def assert_is_not_defaulted(self) -> None: + proto 0 0 + // smart_contracts/base_d_asa/contract.py:112 + // assert not self.defaulted, err.DEFAULTED + intc_0 // 0 + bytec 20 // "defaulted" + app_global_get_ex + assert // check self.defaulted exists + ! + assert // Defaulted + retsub + + +// smart_contracts.base_d_asa.contract.BaseDAsa.assign_role(role_address: bytes, role: bytes, config: bytes) -> bytes: +assign_role: + // smart_contracts/base_d_asa/contract.py:625-628 + // @arc4.abimethod + // def assign_role( + // self, role_address: arc4.Address, role: arc4.UInt8, config: arc4.DynamicBytes + // ) -> arc4.UInt64: + proto 3 1 + // smart_contracts/base_d_asa/contract.py:646 + // self.assert_caller_is_arranger() + callsub assert_caller_is_arranger + // smart_contracts/base_d_asa/contract.py:647 + // self.assert_is_not_defaulted() + callsub assert_is_not_defaulted + // smart_contracts/base_d_asa/contract.py:648 + // assert role.native in ( + frame_dig -2 + btoi + dup + // smart_contracts/base_d_asa/contract.py:649 + // UInt64(cst.ROLE_ARRANGER), + pushint 20 // 20 + // smart_contracts/base_d_asa/contract.py:648-655 + // assert role.native in ( + // UInt64(cst.ROLE_ARRANGER), + // UInt64(cst.ROLE_ACCOUNT_MANAGER), + // UInt64(cst.ROLE_PRIMARY_DEALER), + // UInt64(cst.ROLE_TRUSTEE), + // UInt64(cst.ROLE_AUTHORITY), + // UInt64(cst.ROLE_INTEREST_ORACLE), + // ), err.INVALID_ROLE + == + bnz assign_role_bool_true@6 + frame_dig 0 + // smart_contracts/base_d_asa/contract.py:650 + // UInt64(cst.ROLE_ACCOUNT_MANAGER), + pushint 40 // 40 + // smart_contracts/base_d_asa/contract.py:648-655 + // assert role.native in ( + // UInt64(cst.ROLE_ARRANGER), + // UInt64(cst.ROLE_ACCOUNT_MANAGER), + // UInt64(cst.ROLE_PRIMARY_DEALER), + // UInt64(cst.ROLE_TRUSTEE), + // UInt64(cst.ROLE_AUTHORITY), + // UInt64(cst.ROLE_INTEREST_ORACLE), + // ), err.INVALID_ROLE + == + bnz assign_role_bool_true@6 + frame_dig 0 + // smart_contracts/base_d_asa/contract.py:651 + // UInt64(cst.ROLE_PRIMARY_DEALER), + pushint 50 // 50 + // smart_contracts/base_d_asa/contract.py:648-655 + // assert role.native in ( + // UInt64(cst.ROLE_ARRANGER), + // UInt64(cst.ROLE_ACCOUNT_MANAGER), + // UInt64(cst.ROLE_PRIMARY_DEALER), + // UInt64(cst.ROLE_TRUSTEE), + // UInt64(cst.ROLE_AUTHORITY), + // UInt64(cst.ROLE_INTEREST_ORACLE), + // ), err.INVALID_ROLE + == + bnz assign_role_bool_true@6 + frame_dig 0 + // smart_contracts/base_d_asa/contract.py:652 + // UInt64(cst.ROLE_TRUSTEE), + pushint 60 // 60 + // smart_contracts/base_d_asa/contract.py:648-655 + // assert role.native in ( + // UInt64(cst.ROLE_ARRANGER), + // UInt64(cst.ROLE_ACCOUNT_MANAGER), + // UInt64(cst.ROLE_PRIMARY_DEALER), + // UInt64(cst.ROLE_TRUSTEE), + // UInt64(cst.ROLE_AUTHORITY), + // UInt64(cst.ROLE_INTEREST_ORACLE), + // ), err.INVALID_ROLE + == + bnz assign_role_bool_true@6 + frame_dig 0 + // smart_contracts/base_d_asa/contract.py:653 + // UInt64(cst.ROLE_AUTHORITY), + pushint 70 // 70 + // smart_contracts/base_d_asa/contract.py:648-655 + // assert role.native in ( + // UInt64(cst.ROLE_ARRANGER), + // UInt64(cst.ROLE_ACCOUNT_MANAGER), + // UInt64(cst.ROLE_PRIMARY_DEALER), + // UInt64(cst.ROLE_TRUSTEE), + // UInt64(cst.ROLE_AUTHORITY), + // UInt64(cst.ROLE_INTEREST_ORACLE), + // ), err.INVALID_ROLE + == + bnz assign_role_bool_true@6 + frame_dig 0 + // smart_contracts/base_d_asa/contract.py:654 + // UInt64(cst.ROLE_INTEREST_ORACLE), + pushint 80 // 80 + // smart_contracts/base_d_asa/contract.py:648-655 + // assert role.native in ( + // UInt64(cst.ROLE_ARRANGER), + // UInt64(cst.ROLE_ACCOUNT_MANAGER), + // UInt64(cst.ROLE_PRIMARY_DEALER), + // UInt64(cst.ROLE_TRUSTEE), + // UInt64(cst.ROLE_AUTHORITY), + // UInt64(cst.ROLE_INTEREST_ORACLE), + // ), err.INVALID_ROLE + == + bz assign_role_bool_false@7 + +assign_role_bool_true@6: + intc_1 // 1 + +assign_role_bool_merge@8: + // smart_contracts/base_d_asa/contract.py:648-655 + // assert role.native in ( + // UInt64(cst.ROLE_ARRANGER), + // UInt64(cst.ROLE_ACCOUNT_MANAGER), + // UInt64(cst.ROLE_PRIMARY_DEALER), + // UInt64(cst.ROLE_TRUSTEE), + // UInt64(cst.ROLE_AUTHORITY), + // UInt64(cst.ROLE_INTEREST_ORACLE), + // ), err.INVALID_ROLE + assert // Invalid role identifier + // smart_contracts/base_d_asa/contract.py:657 + // case UInt64(cst.ROLE_ARRANGER): + pushints 20 40 50 60 70 80 // 20, 40, 50, 60, 70, 80 + // smart_contracts/base_d_asa/contract.py:656-685 + // match role.native: + // case UInt64(cst.ROLE_ARRANGER): + // self.arranger.value = role_address.native + // case UInt64(cst.ROLE_ACCOUNT_MANAGER): + // assert ( + // role_address not in self.account_manager + // ), err.INVALID_ROLE_ADDRESS + // self.account_manager[role_address] = typ.RoleConfig.from_bytes( + // config.native + // ) + // case UInt64(cst.ROLE_PRIMARY_DEALER): + // assert role_address not in self.primary_dealer, err.INVALID_ROLE_ADDRESS + // self.primary_dealer[role_address] = typ.RoleConfig.from_bytes( + // config.native + // ) + // case UInt64(cst.ROLE_TRUSTEE): + // assert role_address not in self.trustee, err.INVALID_ROLE_ADDRESS + // self.trustee[role_address] = typ.RoleConfig.from_bytes(config.native) + // case UInt64(cst.ROLE_AUTHORITY): + // assert role_address not in self.authority, err.INVALID_ROLE_ADDRESS + // self.authority[role_address] = typ.RoleConfig.from_bytes(config.native) + // case UInt64(cst.ROLE_INTEREST_ORACLE): + // assert ( + // role_address not in self.interest_oracle + // ), err.INVALID_ROLE_ADDRESS + // self.interest_oracle[role_address] = typ.RoleConfig.from_bytes( + // config.native + // ) + // case _: + // op.err() + frame_dig 0 + match assign_role_switch_case_0@9 assign_role_switch_case_1@10 assign_role_switch_case_2@11 assign_role_switch_case_3@12 assign_role_switch_case_4@13 assign_role_switch_case_5@14 + // smart_contracts/base_d_asa/contract.py:685 + // op.err() + err + +assign_role_switch_case_5@14: + // smart_contracts/base_d_asa/contract.py:679 + // role_address not in self.interest_oracle + bytec 30 // 0x52383023 + frame_dig -3 + concat + dup + box_len + bury 1 + ! + // smart_contracts/base_d_asa/contract.py:678-680 + // assert ( + // role_address not in self.interest_oracle + // ), err.INVALID_ROLE_ADDRESS + assert // Invalid account role address + // smart_contracts/base_d_asa/contract.py:682 + // config.native + frame_dig -1 + extract 2 0 + // smart_contracts/base_d_asa/contract.py:681-683 + // self.interest_oracle[role_address] = typ.RoleConfig.from_bytes( + // config.native + // ) + box_put + +assign_role_switch_case_next@16: + // smart_contracts/base_d_asa/contract.py:686 + // return arc4.UInt64(Global.latest_timestamp) + global LatestTimestamp + itob + swap + retsub + +assign_role_switch_case_4@13: + // smart_contracts/base_d_asa/contract.py:675 + // assert role_address not in self.authority, err.INVALID_ROLE_ADDRESS + bytec 23 // 0x52373023 + frame_dig -3 + concat + dup + box_len + bury 1 + ! + assert // Invalid account role address + // smart_contracts/base_d_asa/contract.py:676 + // self.authority[role_address] = typ.RoleConfig.from_bytes(config.native) + frame_dig -1 + extract 2 0 + box_put + b assign_role_switch_case_next@16 + +assign_role_switch_case_3@12: + // smart_contracts/base_d_asa/contract.py:672 + // assert role_address not in self.trustee, err.INVALID_ROLE_ADDRESS + bytec 24 // 0x52363023 + frame_dig -3 + concat + dup + box_len + bury 1 + ! + assert // Invalid account role address + // smart_contracts/base_d_asa/contract.py:673 + // self.trustee[role_address] = typ.RoleConfig.from_bytes(config.native) + frame_dig -1 + extract 2 0 + box_put + b assign_role_switch_case_next@16 + +assign_role_switch_case_2@11: + // smart_contracts/base_d_asa/contract.py:667 + // assert role_address not in self.primary_dealer, err.INVALID_ROLE_ADDRESS + bytec 25 // 0x52353023 + frame_dig -3 + concat + dup + box_len + bury 1 + ! + assert // Invalid account role address + // smart_contracts/base_d_asa/contract.py:669 + // config.native + frame_dig -1 + extract 2 0 + // smart_contracts/base_d_asa/contract.py:668-670 + // self.primary_dealer[role_address] = typ.RoleConfig.from_bytes( + // config.native + // ) + box_put + b assign_role_switch_case_next@16 + +assign_role_switch_case_1@10: + // smart_contracts/base_d_asa/contract.py:661 + // role_address not in self.account_manager + bytec 26 // 0x52343023 + frame_dig -3 + concat + dup + box_len + bury 1 + ! + // smart_contracts/base_d_asa/contract.py:660-662 + // assert ( + // role_address not in self.account_manager + // ), err.INVALID_ROLE_ADDRESS + assert // Invalid account role address + // smart_contracts/base_d_asa/contract.py:664 + // config.native + frame_dig -1 + extract 2 0 + // smart_contracts/base_d_asa/contract.py:663-665 + // self.account_manager[role_address] = typ.RoleConfig.from_bytes( + // config.native + // ) + box_put + b assign_role_switch_case_next@16 + +assign_role_switch_case_0@9: + // smart_contracts/base_d_asa/contract.py:658 + // self.arranger.value = role_address.native + bytec 8 // 0x52323023 + frame_dig -3 + app_global_put + b assign_role_switch_case_next@16 + +assign_role_bool_false@7: + intc_0 // 0 + b assign_role_bool_merge@8 + + +// smart_contracts.base_d_asa.contract.BaseDAsa.revoke_role(role_address: bytes, role: bytes) -> bytes: +revoke_role: + // smart_contracts/base_d_asa/contract.py:688-689 + // @arc4.abimethod + // def revoke_role(self, role_address: arc4.Address, role: arc4.UInt8) -> arc4.UInt64: + proto 2 1 + // smart_contracts/base_d_asa/contract.py:706 + // self.assert_caller_is_arranger() + callsub assert_caller_is_arranger + // smart_contracts/base_d_asa/contract.py:707 + // self.assert_is_not_defaulted() + callsub assert_is_not_defaulted + // smart_contracts/base_d_asa/contract.py:708 + // assert role.native in ( + frame_dig -1 + btoi + dup + // smart_contracts/base_d_asa/contract.py:709 + // UInt64(cst.ROLE_ACCOUNT_MANAGER), + pushint 40 // 40 + // smart_contracts/base_d_asa/contract.py:708-714 + // assert role.native in ( + // UInt64(cst.ROLE_ACCOUNT_MANAGER), + // UInt64(cst.ROLE_PRIMARY_DEALER), + // UInt64(cst.ROLE_TRUSTEE), + // UInt64(cst.ROLE_AUTHORITY), + // UInt64(cst.ROLE_INTEREST_ORACLE), + // ), err.INVALID_ROLE + == + bnz revoke_role_bool_true@5 + frame_dig 0 + // smart_contracts/base_d_asa/contract.py:710 + // UInt64(cst.ROLE_PRIMARY_DEALER), + pushint 50 // 50 + // smart_contracts/base_d_asa/contract.py:708-714 + // assert role.native in ( + // UInt64(cst.ROLE_ACCOUNT_MANAGER), + // UInt64(cst.ROLE_PRIMARY_DEALER), + // UInt64(cst.ROLE_TRUSTEE), + // UInt64(cst.ROLE_AUTHORITY), + // UInt64(cst.ROLE_INTEREST_ORACLE), + // ), err.INVALID_ROLE + == + bnz revoke_role_bool_true@5 + frame_dig 0 + // smart_contracts/base_d_asa/contract.py:711 + // UInt64(cst.ROLE_TRUSTEE), + pushint 60 // 60 + // smart_contracts/base_d_asa/contract.py:708-714 + // assert role.native in ( + // UInt64(cst.ROLE_ACCOUNT_MANAGER), + // UInt64(cst.ROLE_PRIMARY_DEALER), + // UInt64(cst.ROLE_TRUSTEE), + // UInt64(cst.ROLE_AUTHORITY), + // UInt64(cst.ROLE_INTEREST_ORACLE), + // ), err.INVALID_ROLE + == + bnz revoke_role_bool_true@5 + frame_dig 0 + // smart_contracts/base_d_asa/contract.py:712 + // UInt64(cst.ROLE_AUTHORITY), + pushint 70 // 70 + // smart_contracts/base_d_asa/contract.py:708-714 + // assert role.native in ( + // UInt64(cst.ROLE_ACCOUNT_MANAGER), + // UInt64(cst.ROLE_PRIMARY_DEALER), + // UInt64(cst.ROLE_TRUSTEE), + // UInt64(cst.ROLE_AUTHORITY), + // UInt64(cst.ROLE_INTEREST_ORACLE), + // ), err.INVALID_ROLE + == + bnz revoke_role_bool_true@5 + frame_dig 0 + // smart_contracts/base_d_asa/contract.py:713 + // UInt64(cst.ROLE_INTEREST_ORACLE), + pushint 80 // 80 + // smart_contracts/base_d_asa/contract.py:708-714 + // assert role.native in ( + // UInt64(cst.ROLE_ACCOUNT_MANAGER), + // UInt64(cst.ROLE_PRIMARY_DEALER), + // UInt64(cst.ROLE_TRUSTEE), + // UInt64(cst.ROLE_AUTHORITY), + // UInt64(cst.ROLE_INTEREST_ORACLE), + // ), err.INVALID_ROLE + == + bz revoke_role_bool_false@6 + +revoke_role_bool_true@5: + intc_1 // 1 + +revoke_role_bool_merge@7: + // smart_contracts/base_d_asa/contract.py:708-714 + // assert role.native in ( + // UInt64(cst.ROLE_ACCOUNT_MANAGER), + // UInt64(cst.ROLE_PRIMARY_DEALER), + // UInt64(cst.ROLE_TRUSTEE), + // UInt64(cst.ROLE_AUTHORITY), + // UInt64(cst.ROLE_INTEREST_ORACLE), + // ), err.INVALID_ROLE + assert // Invalid role identifier + // smart_contracts/base_d_asa/contract.py:716-717 + // # Arranger role can not be revoked (just rotated) + // case UInt64(cst.ROLE_ACCOUNT_MANAGER): + pushints 40 50 60 70 80 // 40, 50, 60, 70, 80 + // smart_contracts/base_d_asa/contract.py:715-733 + // match role.native: + // # Arranger role can not be revoked (just rotated) + // case UInt64(cst.ROLE_ACCOUNT_MANAGER): + // assert role_address in self.account_manager, err.INVALID_ROLE_ADDRESS + // op.Box.delete(cst.PREFIX_ID_ACCOUNT_MANAGER + role_address.bytes) + // case UInt64(cst.ROLE_PRIMARY_DEALER): + // assert role_address in self.primary_dealer, err.INVALID_ROLE_ADDRESS + // op.Box.delete(cst.PREFIX_ID_PRIMARY_DEALER + role_address.bytes) + // case UInt64(cst.ROLE_TRUSTEE): + // assert role_address in self.trustee, err.INVALID_ROLE_ADDRESS + // op.Box.delete(cst.PREFIX_ID_TRUSTEE + role_address.bytes) + // case UInt64(cst.ROLE_AUTHORITY): + // assert role_address in self.authority, err.INVALID_ROLE_ADDRESS + // op.Box.delete(cst.PREFIX_ID_AUTHORITY + role_address.bytes) + // case UInt64(cst.ROLE_INTEREST_ORACLE): + // assert role_address in self.interest_oracle, err.INVALID_ROLE_ADDRESS + // op.Box.delete(cst.PREFIX_ID_INTEREST_ORACLE + role_address.bytes) + // case _: + // op.err() + frame_dig 0 + match revoke_role_switch_case_0@8 revoke_role_switch_case_1@9 revoke_role_switch_case_2@10 revoke_role_switch_case_3@11 revoke_role_switch_case_4@12 + // smart_contracts/base_d_asa/contract.py:733 + // op.err() + err + +revoke_role_switch_case_4@12: + // smart_contracts/base_d_asa/contract.py:730 + // assert role_address in self.interest_oracle, err.INVALID_ROLE_ADDRESS + bytec 30 // 0x52383023 + frame_dig -2 + concat + dup + box_len + bury 1 + assert // Invalid account role address + // smart_contracts/base_d_asa/contract.py:731 + // op.Box.delete(cst.PREFIX_ID_INTEREST_ORACLE + role_address.bytes) + box_del + pop + +revoke_role_switch_case_next@14: + // smart_contracts/base_d_asa/contract.py:734 + // return arc4.UInt64(Global.latest_timestamp) + global LatestTimestamp + itob + swap + retsub + +revoke_role_switch_case_3@11: + // smart_contracts/base_d_asa/contract.py:727 + // assert role_address in self.authority, err.INVALID_ROLE_ADDRESS + bytec 23 // 0x52373023 + frame_dig -2 + concat + dup + box_len + bury 1 + assert // Invalid account role address + // smart_contracts/base_d_asa/contract.py:728 + // op.Box.delete(cst.PREFIX_ID_AUTHORITY + role_address.bytes) + box_del + pop + b revoke_role_switch_case_next@14 + +revoke_role_switch_case_2@10: + // smart_contracts/base_d_asa/contract.py:724 + // assert role_address in self.trustee, err.INVALID_ROLE_ADDRESS + bytec 24 // 0x52363023 + frame_dig -2 + concat + dup + box_len + bury 1 + assert // Invalid account role address + // smart_contracts/base_d_asa/contract.py:725 + // op.Box.delete(cst.PREFIX_ID_TRUSTEE + role_address.bytes) + box_del + pop + b revoke_role_switch_case_next@14 + +revoke_role_switch_case_1@9: + // smart_contracts/base_d_asa/contract.py:721 + // assert role_address in self.primary_dealer, err.INVALID_ROLE_ADDRESS + bytec 25 // 0x52353023 + frame_dig -2 + concat + dup + box_len + bury 1 + assert // Invalid account role address + // smart_contracts/base_d_asa/contract.py:722 + // op.Box.delete(cst.PREFIX_ID_PRIMARY_DEALER + role_address.bytes) + box_del + pop + b revoke_role_switch_case_next@14 + +revoke_role_switch_case_0@8: + // smart_contracts/base_d_asa/contract.py:718 + // assert role_address in self.account_manager, err.INVALID_ROLE_ADDRESS + bytec 26 // 0x52343023 + frame_dig -2 + concat + dup + box_len + bury 1 + assert // Invalid account role address + // smart_contracts/base_d_asa/contract.py:719 + // op.Box.delete(cst.PREFIX_ID_ACCOUNT_MANAGER + role_address.bytes) + box_del + pop + b revoke_role_switch_case_next@14 + +revoke_role_bool_false@6: + intc_0 // 0 + b revoke_role_bool_merge@7 + + +// smart_contracts.base_d_asa.contract.BaseDAsa.open_account(holding_address: bytes, payment_address: bytes) -> bytes: +open_account: + // smart_contracts/base_d_asa/contract.py:736-739 + // @arc4.abimethod + // def open_account( + // self, holding_address: arc4.Address, payment_address: arc4.Address + // ) -> arc4.UInt64: + proto 2 1 + // smart_contracts/base_d_asa/contract.py:756 + // self.assert_caller_is_account_manager() + callsub assert_caller_is_account_manager + // smart_contracts/base_d_asa/contract.py:108 + // return self.status == cfg.STATUS_ENDED + intc_0 // 0 + bytec_2 // "status" + app_global_get_ex + assert // check self.status exists + intc 4 // 200 + == + // smart_contracts/base_d_asa/contract.py:757 + // assert not self.status_is_ended(), err.UNAUTHORIZED + ! + assert // Not authorized + // smart_contracts/base_d_asa/contract.py:758 + // self.assert_is_not_defaulted() + callsub assert_is_not_defaulted + // smart_contracts/base_d_asa/contract.py:759 + // self.assert_is_not_suspended() + callsub assert_is_not_suspended + // smart_contracts/base_d_asa/contract.py:760 + // assert holding_address not in self.account, err.INVALID_HOLDING_ADDRESS + bytec 7 // 0x52333023 + frame_dig -2 + concat + dup + box_len + bury 1 + ! + assert // Invalid account holding address + // smart_contracts/base_d_asa/contract.py:762-768 + // self.account[holding_address] = typ.AccountInfo( + // payment_address=payment_address, + // units=arc4.UInt64(), + // unit_value=arc4.UInt64(), + // paid_coupons=arc4.UInt64(), + // suspended=arc4.Bool(), + // ) + frame_dig -1 + // smart_contracts/base_d_asa/contract.py:764 + // units=arc4.UInt64(), + bytec 27 // 0x0000000000000000 + // smart_contracts/base_d_asa/contract.py:762-768 + // self.account[holding_address] = typ.AccountInfo( + // payment_address=payment_address, + // units=arc4.UInt64(), + // unit_value=arc4.UInt64(), + // paid_coupons=arc4.UInt64(), + // suspended=arc4.Bool(), + // ) + concat + // smart_contracts/base_d_asa/contract.py:765 + // unit_value=arc4.UInt64(), + bytec 27 // 0x0000000000000000 + // smart_contracts/base_d_asa/contract.py:762-768 + // self.account[holding_address] = typ.AccountInfo( + // payment_address=payment_address, + // units=arc4.UInt64(), + // unit_value=arc4.UInt64(), + // paid_coupons=arc4.UInt64(), + // suspended=arc4.Bool(), + // ) + concat + // smart_contracts/base_d_asa/contract.py:766 + // paid_coupons=arc4.UInt64(), + bytec 27 // 0x0000000000000000 + // smart_contracts/base_d_asa/contract.py:762-768 + // self.account[holding_address] = typ.AccountInfo( + // payment_address=payment_address, + // units=arc4.UInt64(), + // unit_value=arc4.UInt64(), + // paid_coupons=arc4.UInt64(), + // suspended=arc4.Bool(), + // ) + concat + // smart_contracts/base_d_asa/contract.py:767 + // suspended=arc4.Bool(), + pushbytes 0x00 + // smart_contracts/base_d_asa/contract.py:762-768 + // self.account[holding_address] = typ.AccountInfo( + // payment_address=payment_address, + // units=arc4.UInt64(), + // unit_value=arc4.UInt64(), + // paid_coupons=arc4.UInt64(), + // suspended=arc4.Bool(), + // ) + concat + box_put + // smart_contracts/base_d_asa/contract.py:769 + // return arc4.UInt64(Global.latest_timestamp) + global LatestTimestamp + itob + retsub + + +// smart_contracts.base_d_asa.contract.BaseDAsa.assert_caller_is_account_manager() -> void: +assert_caller_is_account_manager: + // smart_contracts/base_d_asa/contract.py:122-123 + // @subroutine + // def assert_caller_is_account_manager(self) -> None: + proto 0 0 + intc_0 // 0 + // smart_contracts/base_d_asa/contract.py:126 + // caller in self.account_manager + bytec 26 // 0x52343023 + // smart_contracts/base_d_asa/contract.py:124 + // caller = arc4.Address(Txn.sender) + txn Sender + // smart_contracts/base_d_asa/contract.py:126 + // caller in self.account_manager + concat + dup + box_len + bury 1 + // smart_contracts/base_d_asa/contract.py:126-129 + // caller in self.account_manager + // and self.account_manager[caller].role_validity_start + // <= Global.latest_timestamp + // <= self.account_manager[caller].role_validity_end + bz assert_caller_is_account_manager_bool_false@4 + // smart_contracts/base_d_asa/contract.py:127 + // and self.account_manager[caller].role_validity_start + frame_dig 1 + box_get + assert // check self.account_manager entry exists + extract 0 8 // on error: Index access is out of bounds + // smart_contracts/base_d_asa/contract.py:128 + // <= Global.latest_timestamp + global LatestTimestamp + // smart_contracts/base_d_asa/contract.py:127-128 + // and self.account_manager[caller].role_validity_start + // <= Global.latest_timestamp + itob + dup + frame_bury 0 + b<= + // smart_contracts/base_d_asa/contract.py:127-129 + // and self.account_manager[caller].role_validity_start + // <= Global.latest_timestamp + // <= self.account_manager[caller].role_validity_end + bz assert_caller_is_account_manager_bool_false@4 + // smart_contracts/base_d_asa/contract.py:129 + // <= self.account_manager[caller].role_validity_end + frame_dig 1 + box_get + assert // check self.account_manager entry exists + extract 8 8 // on error: Index access is out of bounds + // smart_contracts/base_d_asa/contract.py:128-129 + // <= Global.latest_timestamp + // <= self.account_manager[caller].role_validity_end + frame_dig 0 + b>= + // smart_contracts/base_d_asa/contract.py:127-129 + // and self.account_manager[caller].role_validity_start + // <= Global.latest_timestamp + // <= self.account_manager[caller].role_validity_end + bz assert_caller_is_account_manager_bool_false@4 + intc_1 // 1 + +assert_caller_is_account_manager_bool_merge@5: + // smart_contracts/base_d_asa/contract.py:125-130 + // assert ( + // caller in self.account_manager + // and self.account_manager[caller].role_validity_start + // <= Global.latest_timestamp + // <= self.account_manager[caller].role_validity_end + // ), err.UNAUTHORIZED + assert // Not authorized + retsub + +assert_caller_is_account_manager_bool_false@4: + intc_0 // 0 + b assert_caller_is_account_manager_bool_merge@5 + + +// smart_contracts.base_d_asa.contract.BaseDAsa.assert_is_not_suspended() -> void: +assert_is_not_suspended: + // smart_contracts/base_d_asa/contract.py:114-115 + // @subroutine + // def assert_is_not_suspended(self) -> None: + proto 0 0 + // smart_contracts/base_d_asa/contract.py:116 + // assert not self.suspended, err.SUSPENDED + intc_0 // 0 + bytec 19 // "suspended" + app_global_get_ex + assert // check self.suspended exists + ! + assert // Suspended operations + retsub + + +// smart_contracts.base_d_asa.contract.BaseDAsa.close_account(holding_address: bytes) -> bytes: +close_account: + // smart_contracts/base_d_asa/contract.py:771-774 + // @arc4.abimethod + // def close_account( + // self, holding_address: arc4.Address + // ) -> arc4.Tuple[arc4.UInt64, arc4.UInt64]: + proto 1 1 + // smart_contracts/base_d_asa/contract.py:789 + // self.assert_caller_is_account_manager() + callsub assert_caller_is_account_manager + // smart_contracts/base_d_asa/contract.py:790 + // self.assert_is_not_defaulted() + callsub assert_is_not_defaulted + // smart_contracts/base_d_asa/contract.py:174 + // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS + bytec 7 // 0x52333023 + frame_dig -1 + concat + dup + box_len + bury 1 + assert // Invalid account holding address + // smart_contracts/base_d_asa/contract.py:793 + // closed_units = self.account[holding_address].units.native + dup + box_get + assert // check self.account entry exists + extract 32 8 // on error: Index access is out of bounds + btoi + dup + uncover 2 + // smart_contracts/base_d_asa/contract.py:794 + // op.Box.delete(cst.PREFIX_ID_ACCOUNT + holding_address.bytes) + box_del + pop + // smart_contracts/base_d_asa/contract.py:795 + // self.circulating_units -= closed_units + intc_0 // 0 + bytec_1 // "circulating_units" + app_global_get_ex + assert // check self.circulating_units exists + swap + - + bytec_1 // "circulating_units" + swap + app_global_put + // smart_contracts/base_d_asa/contract.py:366 + // if self.circulating_units == 0: + intc_0 // 0 + bytec_1 // "circulating_units" + app_global_get_ex + assert // check self.circulating_units exists + bnz close_account_after_if_else@3 + // smart_contracts/base_d_asa/contract.py:367 + // self.status = UInt64(cfg.STATUS_ENDED) + bytec_2 // "status" + intc 4 // 200 + app_global_put + +close_account_after_if_else@3: + // smart_contracts/base_d_asa/contract.py:798 + // (arc4.UInt64(closed_units), arc4.UInt64(Global.latest_timestamp)) + frame_dig 0 + itob + global LatestTimestamp + itob + // smart_contracts/base_d_asa/contract.py:797-799 + // return arc4.Tuple( + // (arc4.UInt64(closed_units), arc4.UInt64(Global.latest_timestamp)) + // ) + concat + swap + retsub + + +// smart_contracts.base_d_asa.contract.BaseDAsa.primary_distribution(holding_address: bytes, units: bytes) -> bytes: +primary_distribution: + // smart_contracts/base_d_asa/contract.py:801-804 + // @arc4.abimethod + // def primary_distribution( + // self, holding_address: arc4.Address, units: arc4.UInt64 + // ) -> arc4.UInt64: + proto 2 1 + intc_0 // 0 + dup + pushbytes "" + // smart_contracts/base_d_asa/contract.py:104 + // return self.status == cfg.STATUS_ACTIVE + intc_0 // 0 + bytec_2 // "status" + app_global_get_ex + assert // check self.status exists + pushint 100 // 100 + == + // smart_contracts/base_d_asa/contract.py:289-292 + // self.status_is_active() + // and self.primary_distribution_opening_date + // <= Global.latest_timestamp + // < self.primary_distribution_closure_date + bz primary_distribution_bool_false@5 + // smart_contracts/base_d_asa/contract.py:290 + // and self.primary_distribution_opening_date + intc_0 // 0 + bytec 14 // "primary_distribution_opening_date" + app_global_get_ex + assert // check self.primary_distribution_opening_date exists + // smart_contracts/base_d_asa/contract.py:291 + // <= Global.latest_timestamp + global LatestTimestamp + dup + frame_bury 2 + // smart_contracts/base_d_asa/contract.py:290-291 + // and self.primary_distribution_opening_date + // <= Global.latest_timestamp + <= + // smart_contracts/base_d_asa/contract.py:290-292 + // and self.primary_distribution_opening_date + // <= Global.latest_timestamp + // < self.primary_distribution_closure_date + bz primary_distribution_bool_false@5 + // smart_contracts/base_d_asa/contract.py:292 + // < self.primary_distribution_closure_date + intc_0 // 0 + bytec 15 // "primary_distribution_closure_date" + app_global_get_ex + assert // check self.primary_distribution_closure_date exists + // smart_contracts/base_d_asa/contract.py:291-292 + // <= Global.latest_timestamp + // < self.primary_distribution_closure_date + frame_dig 2 + > + // smart_contracts/base_d_asa/contract.py:290-292 + // and self.primary_distribution_opening_date + // <= Global.latest_timestamp + // < self.primary_distribution_closure_date + bz primary_distribution_bool_false@5 + intc_1 // 1 + +primary_distribution_bool_merge@6: + // smart_contracts/base_d_asa/contract.py:288-293 + // assert ( + // self.status_is_active() + // and self.primary_distribution_opening_date + // <= Global.latest_timestamp + // < self.primary_distribution_closure_date + // ), err.PRIMARY_DISTRIBUTION_CLOSED + assert // Primary distribution is closed + // smart_contracts/base_d_asa/contract.py:136 + // caller in self.primary_dealer + bytec 25 // 0x52353023 + // smart_contracts/base_d_asa/contract.py:134 + // caller = arc4.Address(Txn.sender) + txn Sender + // smart_contracts/base_d_asa/contract.py:136 + // caller in self.primary_dealer + concat + dup + frame_bury 0 + box_len + bury 1 + // smart_contracts/base_d_asa/contract.py:136-139 + // caller in self.primary_dealer + // and self.primary_dealer[caller].role_validity_start + // <= Global.latest_timestamp + // <= self.primary_dealer[caller].role_validity_end + bz primary_distribution_bool_false@12 + // smart_contracts/base_d_asa/contract.py:137 + // and self.primary_dealer[caller].role_validity_start + frame_dig 0 + box_get + assert // check self.primary_dealer entry exists + extract 0 8 // on error: Index access is out of bounds + // smart_contracts/base_d_asa/contract.py:138 + // <= Global.latest_timestamp + global LatestTimestamp + // smart_contracts/base_d_asa/contract.py:137-138 + // and self.primary_dealer[caller].role_validity_start + // <= Global.latest_timestamp + itob + dup + frame_bury 1 + b<= + // smart_contracts/base_d_asa/contract.py:137-139 + // and self.primary_dealer[caller].role_validity_start + // <= Global.latest_timestamp + // <= self.primary_dealer[caller].role_validity_end + bz primary_distribution_bool_false@12 + // smart_contracts/base_d_asa/contract.py:139 + // <= self.primary_dealer[caller].role_validity_end + frame_dig 0 + box_get + assert // check self.primary_dealer entry exists + extract 8 8 // on error: Index access is out of bounds + // smart_contracts/base_d_asa/contract.py:138-139 + // <= Global.latest_timestamp + // <= self.primary_dealer[caller].role_validity_end + frame_dig 1 + b>= + // smart_contracts/base_d_asa/contract.py:137-139 + // and self.primary_dealer[caller].role_validity_start + // <= Global.latest_timestamp + // <= self.primary_dealer[caller].role_validity_end + bz primary_distribution_bool_false@12 + intc_1 // 1 + +primary_distribution_bool_merge@13: + // smart_contracts/base_d_asa/contract.py:135-140 + // assert ( + // caller in self.primary_dealer + // and self.primary_dealer[caller].role_validity_start + // <= Global.latest_timestamp + // <= self.primary_dealer[caller].role_validity_end + // ), err.UNAUTHORIZED + assert // Not authorized + // smart_contracts/base_d_asa/contract.py:174 + // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS + bytec 7 // 0x52333023 + frame_dig -2 + concat + dup + box_len + bury 1 + assert // Invalid account holding address + // smart_contracts/base_d_asa/contract.py:829 + // self.assert_is_not_defaulted() + callsub assert_is_not_defaulted + // smart_contracts/base_d_asa/contract.py:830 + // self.assert_is_not_suspended() + callsub assert_is_not_suspended + // smart_contracts/base_d_asa/contract.py:831 + // assert units.native > 0, err.ZERO_UNITS + frame_dig -1 + btoi + dup + assert // Can not distribute zero units + // smart_contracts/base_d_asa/contract.py:833 + // self.circulating_units + units.native <= self.total_units + intc_0 // 0 + bytec_1 // "circulating_units" + app_global_get_ex + assert // check self.circulating_units exists + dig 1 + + + intc_0 // 0 + bytec 5 // "total_units" + app_global_get_ex + assert // check self.total_units exists + <= + // smart_contracts/base_d_asa/contract.py:832-834 + // assert ( + // self.circulating_units + units.native <= self.total_units + // ), err.OVER_DISTRIBUTION + assert // Insufficient remaining D-ASA units + // smart_contracts/base_d_asa/contract.py:836 + // self.circulating_units += units.native + intc_0 // 0 + bytec_1 // "circulating_units" + app_global_get_ex + assert // check self.circulating_units exists + dig 1 + + + bytec_1 // "circulating_units" + swap + app_global_put + // smart_contracts/base_d_asa/contract.py:838 + // self.account[holding_address].units.native + units.native + dig 1 + box_get + assert // check self.account entry exists + extract 32 8 // on error: Index access is out of bounds + btoi + + + // smart_contracts/base_d_asa/contract.py:837-839 + // self.account[holding_address].units = arc4.UInt64( + // self.account[holding_address].units.native + units.native + // ) + itob + // smart_contracts/base_d_asa/contract.py:837 + // self.account[holding_address].units = arc4.UInt64( + dig 1 + box_get + assert // check self.account entry exists + // smart_contracts/base_d_asa/contract.py:837-839 + // self.account[holding_address].units = arc4.UInt64( + // self.account[holding_address].units.native + units.native + // ) + swap + replace2 32 + dig 1 + swap + box_put + // smart_contracts/base_d_asa/contract.py:840 + // self.account[holding_address].unit_value = arc4.UInt64(self.unit_value) + intc_0 // 0 + bytec 4 // "unit_value" + app_global_get_ex + assert // check self.unit_value exists + itob + dig 1 + box_get + assert // check self.account entry exists + swap + replace2 40 + box_put + // smart_contracts/base_d_asa/contract.py:841 + // return arc4.UInt64(self.total_units - self.circulating_units) + intc_0 // 0 + bytec 5 // "total_units" + app_global_get_ex + assert // check self.total_units exists + intc_0 // 0 + bytec_1 // "circulating_units" + app_global_get_ex + assert // check self.circulating_units exists + - + itob + frame_bury 0 + retsub + +primary_distribution_bool_false@12: + intc_0 // 0 + b primary_distribution_bool_merge@13 + +primary_distribution_bool_false@5: + intc_0 // 0 + b primary_distribution_bool_merge@6 + + +// smart_contracts.base_d_asa.contract.BaseDAsa.set_asset_suspension(suspended: bytes) -> bytes: +set_asset_suspension: + // smart_contracts/base_d_asa/contract.py:843-844 + // @arc4.abimethod + // def set_asset_suspension(self, suspended: arc4.Bool) -> arc4.UInt64: + proto 1 1 + // smart_contracts/base_d_asa/contract.py:857 + // self.assert_caller_is_authority() + callsub assert_caller_is_authority + // smart_contracts/base_d_asa/contract.py:858 + // self.suspended = UInt64(suspended.native) + frame_dig -1 + intc_0 // 0 + getbit + bytec 19 // "suspended" + swap + app_global_put + // smart_contracts/base_d_asa/contract.py:859 + // return arc4.UInt64(Global.latest_timestamp) + global LatestTimestamp + itob + retsub + + +// smart_contracts.base_d_asa.contract.BaseDAsa.assert_caller_is_authority() -> void: +assert_caller_is_authority: + // smart_contracts/base_d_asa/contract.py:152-153 + // @subroutine + // def assert_caller_is_authority(self) -> None: + proto 0 0 + intc_0 // 0 + // smart_contracts/base_d_asa/contract.py:156 + // caller in self.authority + bytec 23 // 0x52373023 + // smart_contracts/base_d_asa/contract.py:154 + // caller = arc4.Address(Txn.sender) + txn Sender + // smart_contracts/base_d_asa/contract.py:156 + // caller in self.authority + concat + dup + box_len + bury 1 + // smart_contracts/base_d_asa/contract.py:156-159 + // caller in self.authority + // and self.authority[caller].role_validity_start + // <= Global.latest_timestamp + // <= self.authority[caller].role_validity_end + bz assert_caller_is_authority_bool_false@4 + // smart_contracts/base_d_asa/contract.py:157 + // and self.authority[caller].role_validity_start + frame_dig 1 + box_get + assert // check self.authority entry exists + extract 0 8 // on error: Index access is out of bounds + // smart_contracts/base_d_asa/contract.py:158 + // <= Global.latest_timestamp + global LatestTimestamp + // smart_contracts/base_d_asa/contract.py:157-158 + // and self.authority[caller].role_validity_start + // <= Global.latest_timestamp + itob + dup + frame_bury 0 + b<= + // smart_contracts/base_d_asa/contract.py:157-159 + // and self.authority[caller].role_validity_start + // <= Global.latest_timestamp + // <= self.authority[caller].role_validity_end + bz assert_caller_is_authority_bool_false@4 + // smart_contracts/base_d_asa/contract.py:159 + // <= self.authority[caller].role_validity_end + frame_dig 1 + box_get + assert // check self.authority entry exists + extract 8 8 // on error: Index access is out of bounds + // smart_contracts/base_d_asa/contract.py:158-159 + // <= Global.latest_timestamp + // <= self.authority[caller].role_validity_end + frame_dig 0 + b>= + // smart_contracts/base_d_asa/contract.py:157-159 + // and self.authority[caller].role_validity_start + // <= Global.latest_timestamp + // <= self.authority[caller].role_validity_end + bz assert_caller_is_authority_bool_false@4 + intc_1 // 1 + +assert_caller_is_authority_bool_merge@5: + // smart_contracts/base_d_asa/contract.py:155-160 + // assert ( + // caller in self.authority + // and self.authority[caller].role_validity_start + // <= Global.latest_timestamp + // <= self.authority[caller].role_validity_end + // ), err.UNAUTHORIZED + assert // Not authorized + retsub + +assert_caller_is_authority_bool_false@4: + intc_0 // 0 + b assert_caller_is_authority_bool_merge@5 + + +// smart_contracts.base_d_asa.contract.BaseDAsa.set_account_suspension(holding_address: bytes, suspended: bytes) -> bytes: +set_account_suspension: + // smart_contracts/base_d_asa/contract.py:861-864 + // @arc4.abimethod + // def set_account_suspension( + // self, holding_address: arc4.Address, suspended: arc4.Bool + // ) -> arc4.UInt64: + proto 2 1 + // smart_contracts/base_d_asa/contract.py:879 + // self.assert_caller_is_authority() + callsub assert_caller_is_authority + // smart_contracts/base_d_asa/contract.py:174 + // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS + bytec 7 // 0x52333023 + frame_dig -2 + concat + dup + box_len + bury 1 + assert // Invalid account holding address + // smart_contracts/base_d_asa/contract.py:881 + // self.account[holding_address].suspended = suspended + dup + box_get + assert // check self.account entry exists + frame_dig -1 + intc_0 // 0 + getbit + pushint 448 // 448 + swap + setbit + box_put + // smart_contracts/base_d_asa/contract.py:882 + // return arc4.UInt64(Global.latest_timestamp) + global LatestTimestamp + itob + retsub + + +// smart_contracts.base_d_asa.contract.BaseDAsa.set_default_status(defaulted: bytes) -> void: +set_default_status: + // smart_contracts/base_d_asa/contract.py:884-885 + // @arc4.abimethod + // def set_default_status(self, defaulted: arc4.Bool) -> None: + proto 1 0 + intc_0 // 0 + // smart_contracts/base_d_asa/contract.py:146 + // caller in self.trustee + bytec 24 // 0x52363023 + // smart_contracts/base_d_asa/contract.py:144 + // caller = arc4.Address(Txn.sender) + txn Sender + // smart_contracts/base_d_asa/contract.py:146 + // caller in self.trustee + concat + dup + box_len + bury 1 + // smart_contracts/base_d_asa/contract.py:146-149 + // caller in self.trustee + // and self.trustee[caller].role_validity_start + // <= Global.latest_timestamp + // <= self.trustee[caller].role_validity_end + bz set_default_status_bool_false@5 + // smart_contracts/base_d_asa/contract.py:147 + // and self.trustee[caller].role_validity_start + frame_dig 1 + box_get + assert // check self.trustee entry exists + extract 0 8 // on error: Index access is out of bounds + // smart_contracts/base_d_asa/contract.py:148 + // <= Global.latest_timestamp + global LatestTimestamp + // smart_contracts/base_d_asa/contract.py:147-148 + // and self.trustee[caller].role_validity_start + // <= Global.latest_timestamp + itob + dup + frame_bury 0 + b<= + // smart_contracts/base_d_asa/contract.py:147-149 + // and self.trustee[caller].role_validity_start + // <= Global.latest_timestamp + // <= self.trustee[caller].role_validity_end + bz set_default_status_bool_false@5 + // smart_contracts/base_d_asa/contract.py:149 + // <= self.trustee[caller].role_validity_end + frame_dig 1 + box_get + assert // check self.trustee entry exists + extract 8 8 // on error: Index access is out of bounds + // smart_contracts/base_d_asa/contract.py:148-149 + // <= Global.latest_timestamp + // <= self.trustee[caller].role_validity_end + frame_dig 0 + b>= + // smart_contracts/base_d_asa/contract.py:147-149 + // and self.trustee[caller].role_validity_start + // <= Global.latest_timestamp + // <= self.trustee[caller].role_validity_end + bz set_default_status_bool_false@5 + intc_1 // 1 + +set_default_status_bool_merge@6: + // smart_contracts/base_d_asa/contract.py:145-150 + // assert ( + // caller in self.trustee + // and self.trustee[caller].role_validity_start + // <= Global.latest_timestamp + // <= self.trustee[caller].role_validity_end + // ), err.UNAUTHORIZED + assert // Not authorized + // smart_contracts/base_d_asa/contract.py:896 + // self.defaulted = UInt64(defaulted.native) + frame_dig -1 + intc_0 // 0 + getbit + bytec 20 // "defaulted" + swap + app_global_put + retsub + +set_default_status_bool_false@5: + intc_0 // 0 + b set_default_status_bool_merge@6 + + +// smart_contracts.base_d_asa.contract.BaseDAsa.get_asset_info() -> bytes: +get_asset_info: + // smart_contracts/base_d_asa/contract.py:898-899 + // @arc4.abimethod(readonly=True) + // def get_asset_info(self) -> typ.AssetInfo: + proto 0 1 + // smart_contracts/base_d_asa/contract.py:908 + // performance = UInt64(cst.PRF_PERFORMANT) + intc_0 // 0 + dup + // smart_contracts/base_d_asa/contract.py:909 + // if Global.latest_timestamp > self.maturity_date > 0: + global LatestTimestamp + intc_0 // 0 + bytec_3 // "maturity_date" + app_global_get_ex + swap + dup + cover 2 + cover 4 + assert // check self.maturity_date exists + > + bz get_asset_info_after_if_else@3 + frame_dig 0 + frame_bury 2 + frame_dig 1 + bz get_asset_info_after_if_else@3 + // smart_contracts/base_d_asa/contract.py:910 + // performance = UInt64(cst.PRF_MATURED) + intc_3 // 4 + frame_bury 2 + +get_asset_info_after_if_else@3: + frame_dig 2 + frame_bury 0 + // smart_contracts/base_d_asa/contract.py:911-912 + // # The reference implementation has no grace or delinquency periods + // if self.defaulted: + intc_0 // 0 + bytec 20 // "defaulted" + app_global_get_ex + assert // check self.defaulted exists + bz get_asset_info_after_if_else@5 + // smart_contracts/base_d_asa/contract.py:913 + // performance = UInt64(cst.PRF_DEFAULTED) + pushint 3 // 3 + frame_bury 0 + +get_asset_info_after_if_else@5: + // smart_contracts/base_d_asa/contract.py:916 + // denomination_asset_id=arc4.UInt64(self.denomination_asset_id), + intc_0 // 0 + bytec 9 // "denomination_asset_id" + app_global_get_ex + assert // check self.denomination_asset_id exists + itob + // smart_contracts/base_d_asa/contract.py:917 + // settlement_asset_id=arc4.UInt64(self.settlement_asset_id), + intc_0 // 0 + bytec 10 // "settlement_asset_id" + app_global_get_ex + assert // check self.settlement_asset_id exists + itob + // smart_contracts/base_d_asa/contract.py:340 + // return self.circulating_units * self.unit_value + intc_0 // 0 + bytec_1 // "circulating_units" + app_global_get_ex + assert // check self.circulating_units exists + intc_0 // 0 + bytec 4 // "unit_value" + app_global_get_ex + assert // check self.unit_value exists + * + // smart_contracts/base_d_asa/contract.py:918 + // outstanding_principal=arc4.UInt64(self.outstanding_principal()), + itob + // smart_contracts/base_d_asa/contract.py:919 + // unit_value=arc4.UInt64(self.unit_value), + intc_0 // 0 + bytec 4 // "unit_value" + app_global_get_ex + assert // check self.unit_value exists + itob + // smart_contracts/base_d_asa/contract.py:920 + // day_count_convention=arc4.UInt8(self.day_count_convention), + intc_0 // 0 + bytec 11 // "day_count_convention" + app_global_get_ex + assert // check self.day_count_convention exists + itob + extract 7 1 + // smart_contracts/base_d_asa/contract.py:921 + // principal_discount=arc4.UInt16(self.principal_discount), + intc_0 // 0 + bytec 13 // "principal_discount" + app_global_get_ex + assert // check self.principal_discount exists + itob + extract 6 2 + // smart_contracts/base_d_asa/contract.py:922 + // interest_rate=arc4.UInt16(self.interest_rate), + intc_0 // 0 + bytec 21 // "interest_rate" + app_global_get_ex + assert // check self.interest_rate exists + itob + extract 6 2 + // smart_contracts/base_d_asa/contract.py:923 + // total_supply=arc4.UInt64(self.total_units), + intc_0 // 0 + bytec 5 // "total_units" + app_global_get_ex + assert // check self.total_units exists + itob + // smart_contracts/base_d_asa/contract.py:924 + // circulating_supply=arc4.UInt64(self.circulating_units), + intc_0 // 0 + bytec_1 // "circulating_units" + app_global_get_ex + assert // check self.circulating_units exists + itob + // smart_contracts/base_d_asa/contract.py:926 + // self.primary_distribution_opening_date + intc_0 // 0 + bytec 14 // "primary_distribution_opening_date" + app_global_get_ex + assert // check self.primary_distribution_opening_date exists + // smart_contracts/base_d_asa/contract.py:925-927 + // primary_distribution_opening_date=arc4.UInt64( + // self.primary_distribution_opening_date + // ), + itob + // smart_contracts/base_d_asa/contract.py:929 + // self.primary_distribution_closure_date + intc_0 // 0 + bytec 15 // "primary_distribution_closure_date" + app_global_get_ex + assert // check self.primary_distribution_closure_date exists + // smart_contracts/base_d_asa/contract.py:928-930 + // primary_distribution_closure_date=arc4.UInt64( + // self.primary_distribution_closure_date + // ), + itob + // smart_contracts/base_d_asa/contract.py:931 + // issuance_date=arc4.UInt64(self.issuance_date), + intc_0 // 0 + bytec 16 // "issuance_date" + app_global_get_ex + assert // check self.issuance_date exists + itob + // smart_contracts/base_d_asa/contract.py:932 + // maturity_date=arc4.UInt64(self.maturity_date), + intc_0 // 0 + bytec_3 // "maturity_date" + app_global_get_ex + assert // check self.maturity_date exists + itob + // smart_contracts/base_d_asa/contract.py:933 + // suspended=arc4.Bool(bool(self.suspended)), + intc_0 // 0 + bytec 19 // "suspended" + app_global_get_ex + assert // check self.suspended exists + pushbytes 0x00 + intc_0 // 0 + uncover 2 + setbit + // smart_contracts/base_d_asa/contract.py:934 + // performance=arc4.UInt8(performance), + frame_dig 0 + itob + extract 7 1 + // smart_contracts/base_d_asa/contract.py:915-935 + // return typ.AssetInfo( + // denomination_asset_id=arc4.UInt64(self.denomination_asset_id), + // settlement_asset_id=arc4.UInt64(self.settlement_asset_id), + // outstanding_principal=arc4.UInt64(self.outstanding_principal()), + // unit_value=arc4.UInt64(self.unit_value), + // day_count_convention=arc4.UInt8(self.day_count_convention), + // principal_discount=arc4.UInt16(self.principal_discount), + // interest_rate=arc4.UInt16(self.interest_rate), + // total_supply=arc4.UInt64(self.total_units), + // circulating_supply=arc4.UInt64(self.circulating_units), + // primary_distribution_opening_date=arc4.UInt64( + // self.primary_distribution_opening_date + // ), + // primary_distribution_closure_date=arc4.UInt64( + // self.primary_distribution_closure_date + // ), + // issuance_date=arc4.UInt64(self.issuance_date), + // maturity_date=arc4.UInt64(self.maturity_date), + // suspended=arc4.Bool(bool(self.suspended)), + // performance=arc4.UInt8(performance), + // ) + uncover 14 + uncover 14 + concat + uncover 13 + concat + uncover 12 + concat + uncover 11 + concat + uncover 10 + concat + uncover 9 + concat + uncover 8 + concat + uncover 7 + concat + uncover 6 + concat + uncover 5 + concat + uncover 4 + concat + uncover 3 + concat + uncover 2 + concat + swap + concat + frame_bury 0 + retsub + + +// smart_contracts.base_d_asa.contract.BaseDAsa.get_account_info(holding_address: bytes) -> bytes: +get_account_info: + // smart_contracts/base_d_asa/contract.py:937-938 + // @arc4.abimethod(readonly=True) + // def get_account_info(self, holding_address: arc4.Address) -> typ.AccountInfo: + proto 1 1 + // smart_contracts/base_d_asa/contract.py:174 + // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS + bytec 7 // 0x52333023 + frame_dig -1 + concat + dup + box_len + bury 1 + assert // Invalid account holding address + // smart_contracts/base_d_asa/contract.py:952 + // return self.account[holding_address] + box_get + assert // check self.account entry exists + retsub + + +// smart_contracts.base_d_asa.contract.BaseDAsa.get_time_events() -> bytes: +get_time_events: + // smart_contracts/base_d_asa/contract.py:954-955 + // @arc4.abimethod(readonly=True) + // def get_time_events(self) -> typ.TimeEvents: + proto 0 1 + // smart_contracts/base_d_asa/contract.py:962 + // time_events = typ.TimeEvents() + pushbytes 0x0000 + // smart_contracts/base_d_asa/contract.py:104 + // return self.status == cfg.STATUS_ACTIVE + intc_0 // 0 + bytec_2 // "status" + app_global_get_ex + assert // check self.status exists + pushint 100 // 100 + == + // smart_contracts/base_d_asa/contract.py:963 + // if self.status_is_active(): + bz get_time_events_after_if_else@2 + // smart_contracts/base_d_asa/contract.py:964 + // time_events = self.time_events.value.copy() + bytec 22 // 0x74696d654576656e7473 + box_get + swap + frame_bury 0 + assert // check self.time_events exists + +get_time_events_after_if_else@2: + // smart_contracts/base_d_asa/contract.py:965 + // return time_events + frame_dig 0 + swap + retsub + + +// smart_contracts.base_d_asa.contract.BaseDAsa.get_secondary_market_schedule() -> bytes: +get_secondary_market_schedule: + // smart_contracts/base_d_asa/contract.py:967-968 + // @arc4.abimethod(readonly=True) + // def get_secondary_market_schedule(self) -> typ.TimeEvents: + proto 0 1 + // smart_contracts/base_d_asa/contract.py:976 + // arc4.UInt64(self.secondary_market_opening_date), + intc_0 // 0 + bytec 17 // "secondary_market_opening_date" + app_global_get_ex + assert // check self.secondary_market_opening_date exists + itob + // smart_contracts/base_d_asa/contract.py:977 + // arc4.UInt64(self.secondary_market_closure_date), + intc_0 // 0 + bytec 18 // "secondary_market_closure_date" + app_global_get_ex + assert // check self.secondary_market_closure_date exists + itob + // smart_contracts/base_d_asa/contract.py:975-978 + // return typ.TimeEvents( + // arc4.UInt64(self.secondary_market_opening_date), + // arc4.UInt64(self.secondary_market_closure_date), + // ) + concat + pushbytes 0x0002 + swap + concat + retsub + + +// smart_contracts.base_d_asa.contract.BaseDAsa.get_asset_metadata() -> bytes: +get_asset_metadata: + // smart_contracts/base_d_asa/contract.py:980-981 + // @arc4.abimethod(readonly=True) + // def get_asset_metadata(self) -> typ.AssetMetadata: + proto 0 1 + // smart_contracts/base_d_asa/contract.py:989 + // return typ.AssetMetadata.from_bytes(self.metadata) + intc_0 // 0 + bytec 12 // "metadata" + app_global_get_ex + assert // check self.metadata exists + retsub diff --git a/smart_contracts/base_d_asa/BaseDAsa.arc32.json b/smart_contracts/base_d_asa/BaseDAsa.arc32.json new file mode 100644 index 0000000..78f9fb8 --- /dev/null +++ b/smart_contracts/base_d_asa/BaseDAsa.arc32.json @@ -0,0 +1,756 @@ +{ + "hints": { + "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void": { + "call_config": { + "no_op": "CREATE" + }, + "structs": { + "metadata": { + "name": "AssetMetadata", + "elements": [ + [ + "contract_type", + "uint8" + ], + [ + "calendar", + "uint8" + ], + [ + "business_day_convention", + "uint8" + ], + [ + "end_of_month_convention", + "uint8" + ], + [ + "prepayment_effect", + "uint8" + ], + [ + "penalty_type", + "uint8" + ], + [ + "prospectus_hash", + "byte[32]" + ], + [ + "prospectus_url", + "string" + ] + ] + } + } + }, + "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void": { + "call_config": { + "update_application": "CALL" + }, + "structs": { + "metadata": { + "name": "AssetMetadata", + "elements": [ + [ + "contract_type", + "uint8" + ], + [ + "calendar", + "uint8" + ], + [ + "business_day_convention", + "uint8" + ], + [ + "end_of_month_convention", + "uint8" + ], + [ + "prepayment_effect", + "uint8" + ], + [ + "penalty_type", + "uint8" + ], + [ + "prospectus_hash", + "byte[32]" + ], + [ + "prospectus_url", + "string" + ] + ] + } + } + }, + "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void": { + "call_config": { + "no_op": "CALL" + } + }, + "set_secondary_time_events(uint64[])(uint64,uint64)": { + "call_config": { + "no_op": "CALL" + }, + "structs": { + "output": { + "name": "SecondaryMarketSchedule", + "elements": [ + [ + "secondary_market_opening_date", + "uint64" + ], + [ + "secondary_market_closure_date", + "uint64" + ] + ] + } + } + }, + "assign_role(address,uint8,byte[])uint64": { + "call_config": { + "no_op": "CALL" + } + }, + "revoke_role(address,uint8)uint64": { + "call_config": { + "no_op": "CALL" + } + }, + "open_account(address,address)uint64": { + "call_config": { + "no_op": "CALL" + } + }, + "close_account(address)(uint64,uint64)": { + "call_config": { + "no_op": "CALL" + } + }, + "primary_distribution(address,uint64)uint64": { + "call_config": { + "no_op": "CALL" + } + }, + "set_asset_suspension(bool)uint64": { + "call_config": { + "no_op": "CALL" + } + }, + "set_account_suspension(address,bool)uint64": { + "call_config": { + "no_op": "CALL" + } + }, + "set_default_status(bool)void": { + "call_config": { + "no_op": "CALL" + } + }, + "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)": { + "read_only": true, + "call_config": { + "no_op": "CALL" + }, + "structs": { + "output": { + "name": "AssetInfo", + "elements": [ + [ + "denomination_asset_id", + "uint64" + ], + [ + "settlement_asset_id", + "uint64" + ], + [ + "outstanding_principal", + "uint64" + ], + [ + "unit_value", + "uint64" + ], + [ + "day_count_convention", + "uint8" + ], + [ + "principal_discount", + "uint16" + ], + [ + "interest_rate", + "uint16" + ], + [ + "total_supply", + "uint64" + ], + [ + "circulating_supply", + "uint64" + ], + [ + "primary_distribution_opening_date", + "uint64" + ], + [ + "primary_distribution_closure_date", + "uint64" + ], + [ + "issuance_date", + "uint64" + ], + [ + "maturity_date", + "uint64" + ], + [ + "suspended", + "bool" + ], + [ + "performance", + "uint8" + ] + ] + } + } + }, + "get_account_info(address)(address,uint64,uint64,uint64,bool)": { + "read_only": true, + "call_config": { + "no_op": "CALL" + }, + "structs": { + "output": { + "name": "AccountInfo", + "elements": [ + [ + "payment_address", + "address" + ], + [ + "units", + "uint64" + ], + [ + "unit_value", + "uint64" + ], + [ + "paid_coupons", + "uint64" + ], + [ + "suspended", + "bool" + ] + ] + } + } + }, + "get_time_events()uint64[]": { + "read_only": true, + "call_config": { + "no_op": "CALL" + } + }, + "get_secondary_market_schedule()uint64[]": { + "read_only": true, + "call_config": { + "no_op": "CALL" + } + }, + "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)": { + "read_only": true, + "call_config": { + "no_op": "CALL" + }, + "structs": { + "output": { + "name": "AssetMetadata", + "elements": [ + [ + "contract_type", + "uint8" + ], + [ + "calendar", + "uint8" + ], + [ + "business_day_convention", + "uint8" + ], + [ + "end_of_month_convention", + "uint8" + ], + [ + "prepayment_effect", + "uint8" + ], + [ + "penalty_type", + "uint8" + ], + [ + "prospectus_hash", + "byte[32]" + ], + [ + "prospectus_url", + "string" + ] + ] + } + } + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCA0IDIwMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJjaXJjdWxhdGluZ191bml0cyIgInN0YXR1cyIgIm1hdHVyaXR5X2RhdGUiICJ1bml0X3ZhbHVlIiAidG90YWxfdW5pdHMiICJ0b3RhbF9jb3Vwb25zIiAweDUyMzMzMDIzIDB4NTIzMjMwMjMgImRlbm9taW5hdGlvbl9hc3NldF9pZCIgInNldHRsZW1lbnRfYXNzZXRfaWQiICJkYXlfY291bnRfY29udmVudGlvbiIgIm1ldGFkYXRhIiAicHJpbmNpcGFsX2Rpc2NvdW50IiAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIiAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIiAiaXNzdWFuY2VfZGF0ZSIgInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIiAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiICJzdXNwZW5kZWQiICJkZWZhdWx0ZWQiICJpbnRlcmVzdF9yYXRlIiAweDc0Njk2ZDY1NDU3NjY1NmU3NDczIDB4NTIzNzMwMjMgMHg1MjM2MzAyMyAweDUyMzUzMDIzIDB4NTIzNDMwMjMgMHgwMDAwMDAwMDAwMDAwMDAwIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MyAweDA2ODEwMSAweDUyMzgzMDIzCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MS00MgogICAgLy8gIyBSb2xlIEJhc2VkIEFjY2VzcyBDb250cm9sCiAgICAvLyBzZWxmLmFycmFuZ2VyID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9BUlJBTkdFUikKICAgIGJ5dGVjIDggLy8gMHg1MjMyMzAyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTktNjAKICAgIC8vICMgQXNzZXQgQ29uZmlndXJhdGlvbgogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBVSW50NjQoKQogICAgYnl0ZWMgOSAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MQogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkID0gVUludDY0KCkKICAgIGJ5dGVjIDEwIC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MgogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gInVuaXRfdmFsdWUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDExIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUtNjYKICAgIC8vICMgTWV0YWRhdGEKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBCeXRlcygpCiAgICBieXRlYyAxMiAvLyAibWV0YWRhdGEiCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OC02OQogICAgLy8gIyBTdXBwbHkKICAgIC8vIHNlbGYudG90YWxfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWMgNSAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwCiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3Mi03MwogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50ID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJwcmluY2lwYWxfZGlzY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1LTc2CiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmludGVyZXN0X3JhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMjEgLy8gImludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgwCiAgICAvLyBzZWxmLnRvdGFsX2NvdXBvbnMgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAidG90YWxfY291cG9ucyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODUKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDE0IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NwogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDE2IC8vICJpc3N1YW5jZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OAogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNyAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDE4IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlY18zIC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5Mi05MwogICAgLy8gIyBTdGF0dXMKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGNmZy5TVEFUVVNfRU1QVFkpCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBzZWxmLnN1c3BlbmRlZCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxOSAvLyAic3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NQogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gImRlZmF1bHRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2FmdGVyX2lmX2Vsc2VAMjIKICAgIHB1c2hieXRlc3MgMHgzZjBlZmM2YyAweDI1ZGJhOTViIDB4ODk0NzQxMzQgMHgxZDZmYzI1NSAweGZlZjc0NTY3IDB4YjhmYzEzOTAgMHgzZDQzZDFmMCAweGViZDk2YjJmIDB4NmM4NWUzZWUgMHhmNjNhY2U4ZCAweGJiY2NhMThhIDB4MWE3YmFiYjQgMHg0MDJkYmE0NyAweGVkMDI3NTlmIDB4ZmFkMjE3M2UgMHgwOGVmZWEzNSAweGU0YTVhYjU0IC8vIG1ldGhvZCAiYXNzZXRfY3JlYXRlKGFkZHJlc3MsKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LGJ5dGVbMzJdLHN0cmluZykpdm9pZCIsIG1ldGhvZCAiYXNzZXRfdXBkYXRlKCh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCxieXRlWzMyXSxzdHJpbmcpKXZvaWQiLCBtZXRob2QgImFzc2V0X2NvbmZpZyh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQxNix1aW50MTZbXSx1aW50NjRbXSwodWludDY0LHVpbnQ2NClbXSl2b2lkIiwgbWV0aG9kICJzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKHVpbnQ2NFtdKSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiYXNzaWduX3JvbGUoYWRkcmVzcyx1aW50OCxieXRlW10pdWludDY0IiwgbWV0aG9kICJyZXZva2Vfcm9sZShhZGRyZXNzLHVpbnQ4KXVpbnQ2NCIsIG1ldGhvZCAib3Blbl9hY2NvdW50KGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImNsb3NlX2FjY291bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAic2V0X2Fzc2V0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInNldF9hY2NvdW50X3N1c3BlbnNpb24oYWRkcmVzcyxib29sKXVpbnQ2NCIsIG1ldGhvZCAic2V0X2RlZmF1bHRfc3RhdHVzKGJvb2wpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2luZm8oKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQxNix1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X2FjY291bnRfaW5mbyhhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wpIiwgbWV0aG9kICJnZXRfdGltZV9ldmVudHMoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSgpdWludDY0W10iLCBtZXRob2QgImdldF9hc3NldF9tZXRhZGF0YSgpKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LGJ5dGVbMzJdLHN0cmluZykiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2Fzc2V0X2NyZWF0ZV9yb3V0ZUA1IG1haW5fYXNzZXRfdXBkYXRlX3JvdXRlQDYgbWFpbl9hc3NldF9jb25maWdfcm91dGVANyBtYWluX3NldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfcm91dGVAOCBtYWluX2Fzc2lnbl9yb2xlX3JvdXRlQDkgbWFpbl9yZXZva2Vfcm9sZV9yb3V0ZUAxMCBtYWluX29wZW5fYWNjb3VudF9yb3V0ZUAxMSBtYWluX2Nsb3NlX2FjY291bnRfcm91dGVAMTIgbWFpbl9wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9yb3V0ZUAxMyBtYWluX3NldF9hc3NldF9zdXNwZW5zaW9uX3JvdXRlQDE0IG1haW5fc2V0X2FjY291bnRfc3VzcGVuc2lvbl9yb3V0ZUAxNSBtYWluX3NldF9kZWZhdWx0X3N0YXR1c19yb3V0ZUAxNiBtYWluX2dldF9hc3NldF9pbmZvX3JvdXRlQDE3IG1haW5fZ2V0X2FjY291bnRfaW5mb19yb3V0ZUAxOCBtYWluX2dldF90aW1lX2V2ZW50c19yb3V0ZUAxOSBtYWluX2dldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlX3JvdXRlQDIwIG1haW5fZ2V0X2Fzc2V0X21ldGFkYXRhX3JvdXRlQDIxCgptYWluX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21ldGFkYXRhX3JvdXRlQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYXNzZXRfbWV0YWRhdGEKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGVfcm91dGVAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF90aW1lX2V2ZW50c19yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X3RpbWVfZXZlbnRzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hY2NvdW50X2luZm9fcm91dGVAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hY2NvdW50X2luZm8KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2luZm9fcm91dGVAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hc3NldF9pbmZvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9kZWZhdWx0X3N0YXR1c19yb3V0ZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBjbGFzcyBCYXNlREFzYShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X2RlZmF1bHRfc3RhdHVzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9hY2NvdW50X3N1c3BlbnNpb25fcm91dGVAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9hY2NvdW50X3N1c3BlbnNpb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0X2Fzc2V0X3N1c3BlbnNpb25fcm91dGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9hc3NldF9zdXNwZW5zaW9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3ByaW1hcnlfZGlzdHJpYnV0aW9uX3JvdXRlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODAxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jbG9zZV9hY2NvdW50X3JvdXRlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBjbG9zZV9hY2NvdW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX29wZW5fYWNjb3VudF9yb3V0ZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBjbGFzcyBCYXNlREFzYShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgb3Blbl9hY2NvdW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3Jldm9rZV9yb2xlX3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2ODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiByZXZva2Vfcm9sZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NpZ25fcm9sZV9yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NpZ25fcm9sZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzZXRfY29uZmlnX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0ODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0ODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NldF9jb25maWcKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzZXRfdXBkYXRlX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMyAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IFVwZGF0ZUFwcGxpY2F0aW9uCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBjbGFzcyBCYXNlREFzYShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBjYWxsc3ViIGFzc2V0X3VwZGF0ZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF9jcmVhdGVfcm91dGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgY2FsbHN1YiBhc3NldF9jcmVhdGUKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NldF9jcmVhdGUoYXJyYW5nZXI6IGJ5dGVzLCBtZXRhZGF0YTogYnl0ZXMpIC0+IHZvaWQ6CmFzc2V0X2NyZWF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2MS00NjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgLy8gZGVmIGFzc2V0X2NyZWF0ZShzZWxmLCBhcnJhbmdlcjogYXJjNC5BZGRyZXNzLCBtZXRhZGF0YTogdHlwLkFzc2V0TWV0YWRhdGEpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3MAogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IGFycmFuZ2VyLm5hdGl2ZQogICAgYnl0ZWMgOCAvLyAweDUyMzIzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzEKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YS5ieXRlcwogICAgYnl0ZWMgMTIgLy8gIm1ldGFkYXRhIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXRfdXBkYXRlKG1ldGFkYXRhOiBieXRlcykgLT4gdm9pZDoKYXNzZXRfdXBkYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDczLTQ3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIGFzc2V0X3VwZGF0ZShzZWxmLCBtZXRhZGF0YTogdHlwLkFzc2V0TWV0YWRhdGEpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3OC00ODEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgZGlzYWJsZSBELUFTQSBhcHBsaWNhdGlvbiB1cGRhdGFiaWxpdHkgb3IgY2hhbmdlIGl0cyBhdXRob3JpemF0aW9ucy4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleSBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ4MgogICAgLy8gc2VsZi5tZXRhZGF0YSA9IG1ldGFkYXRhLmJ5dGVzCiAgICBieXRlYyAxMiAvLyAibWV0YWRhdGEiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExOC0xMTkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYuYXJyYW5nZXIudmFsdWUsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vIDB4NTIzMjMwMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2V0X2NvbmZpZyhkZW5vbWluYXRpb25fYXNzZXRfaWQ6IGJ5dGVzLCBzZXR0bGVtZW50X2Fzc2V0X2lkOiBieXRlcywgcHJpbmNpcGFsOiBieXRlcywgcHJpbmNpcGFsX2Rpc2NvdW50OiBieXRlcywgbWluaW11bV9kZW5vbWluYXRpb246IGJ5dGVzLCBkYXlfY291bnRfY29udmVudGlvbjogYnl0ZXMsIGludGVyZXN0X3JhdGU6IGJ5dGVzLCBjb3Vwb25fcmF0ZXM6IGJ5dGVzLCB0aW1lX2V2ZW50czogYnl0ZXMsIHRpbWVfcGVyaW9kczogYnl0ZXMpIC0+IHZvaWQ6CmFzc2V0X2NvbmZpZzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ4NC00OTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2V0X2NvbmZpZygKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgcHJpbmNpcGFsOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBwcmluY2lwYWxfZGlzY291bnQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIG1pbmltdW1fZGVub21pbmF0aW9uOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBkYXlfY291bnRfY29udmVudGlvbjogYXJjNC5VSW50OCwKICAgIC8vICAgICBpbnRlcmVzdF9yYXRlOiBhcmM0LlVJbnQxNiwKICAgIC8vICAgICBjb3Vwb25fcmF0ZXM6IHR5cC5Db3Vwb25SYXRlcywKICAgIC8vICAgICB0aW1lX2V2ZW50czogdHlwLlRpbWVFdmVudHMsCiAgICAvLyAgICAgdGltZV9wZXJpb2RzOiB0eXAuVGltZVBlcmlvZHMsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAxMCAwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUyNwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTI4CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTVBUWSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzAtNTMxCiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuYXNzZXJ0X2Rlbm9taW5hdGlvbl9hc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xMAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODAKICAgIC8vIGRlbm9taW5hdGlvbl9hc3NldF9pZCAhPSBVSW50NjQoMCkgYW5kIEFzc2V0KGRlbm9taW5hdGlvbl9hc3NldF9pZCkuY3JlYXRvcgogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANAogICAgZnJhbWVfZGlnIDQKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBhc3NldF9jb25maWdfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3OC0xODEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gZGVub21pbmF0aW9uIHdpdGggQVNBCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZCAhPSBVSW50NjQoMCkgYW5kIEFzc2V0KGRlbm9taW5hdGlvbl9hc3NldF9pZCkuY3JlYXRvcgogICAgLy8gKSwgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBkZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGJ5dGVjIDkgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGZyYW1lX2RpZyA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTM0LTUzNQogICAgLy8gIyBTZXQgRGVub21pbmF0aW9uIEFzc2V0CiAgICAvLyBzZWxmLmFzc2VydF9zZXR0bGVtZW50X2Fzc2V0KHNldHRsZW1lbnRfYXNzZXRfaWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC05CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTEKICAgIC8vIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkIGV4aXN0cwogICAgZGlnIDEKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODktMTkyCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyAxMCAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTctMjAzCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDIKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTkKICAgIC8vIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDAKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjAxCiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTctMTk4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIGludGNfMyAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5Ny0yMDMKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NDAKICAgIC8vIHByaW5jaXBhbC5uYXRpdmUgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUgPT0gMAogICAgZnJhbWVfZGlnIC04CiAgICBidG9pCiAgICBmcmFtZV9kaWcgLTYKICAgIGJ0b2kKICAgIGR1cDIKICAgICUKICAgICEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUzOC01NDEKICAgIC8vICMgU2V0IFByaW5jaXBhbCBhbmQgTWluaW11bSBEZW5vbWluYXRpb24KICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJpbmNpcGFsLm5hdGl2ZSAlIG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZSA9PSAwCiAgICAvLyApLCBlcnIuSU5WQUxJRF9NSU5JTVVNX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIE1pbmltdW0gZGVub21pbmF0aW9uIGlzIG5vdCBhIGRpdmlzb3Igb2YgcHJpbmNpcGFsCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NDIKICAgIC8vIHNlbGYudW5pdF92YWx1ZSA9IG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZQogICAgYnl0ZWMgNCAvLyAidW5pdF92YWx1ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gcHJpbmNpcGFsLm5hdGl2ZSAvLyBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUKICAgIC8KICAgIGJ5dGVjIDUgLy8gInRvdGFsX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU0NAogICAgLy8gc2VsZi5wcmluY2lwYWxfZGlzY291bnQgPSBwcmluY2lwYWxfZGlzY291bnQubmF0aXZlCiAgICBmcmFtZV9kaWcgLTcKICAgIGJ0b2kKICAgIGJ5dGVjIDEzIC8vICJwcmluY2lwYWxfZGlzY291bnQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQ2LTU0NwogICAgLy8gIyBTZXQgRGF5LUNvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuYXNzZXJ0X2RheV9jb3VudF9jb252ZW50aW9uKGRheV9jb3VudF9jb252ZW50aW9uLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtNQogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNy0yMTEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGZyYW1lX2RpZyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTAKICAgIC8vIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgcHVzaGludCAyNTUgLy8gMjU1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDctMjExCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICA9PQogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmFzc2V0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDctMjExCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICBhc3NlcnQgLy8gSW52YWxpZCBkYXktY291bnQgY29udmVudGlvbiBJRAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjE1CiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIGJ5dGVjIDExIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGZyYW1lX2RpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTUwLTU1MQogICAgLy8gIyBTZXQgSW50ZXJlc3QgUmF0ZQogICAgLy8gc2VsZi5hc3NlcnRfaW50ZXJlc3RfcmF0ZShpbnRlcmVzdF9yYXRlLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtNAogICAgYnRvaQogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTktMjIwCiAgICAvLyAjIFRoaXMgc3Vicm91dGluZSBtdXN0IGJlIHVzZWQgYWZ0ZXIgdGhlIHByaW5jaXBhbCBkaXNjb3VudCBoYXMgYmVlbiBzZXQKICAgIC8vIGlmIG5vdCBzZWxmLnByaW5jaXBhbF9kaXNjb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIGJueiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjIxCiAgICAvLyBhc3NlcnQgaW50ZXJlc3RfcmF0ZSA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfSU5URVJFU1RfUkFURQogICAgZnJhbWVfZGlnIDIKICAgIGFzc2VydCAvLyBJbnRlcmVzdCByYXRlIGlzIG5vdCBwcm9wZXJseSBkZWZpbmVkCgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gc2VsZi5pbnRlcmVzdF9yYXRlID0gaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgMjEgLy8gImludGVyZXN0X3JhdGUiCiAgICBmcmFtZV9kaWcgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyOQogICAgLy8gYXNzZXJ0IG5vdCBjb3Vwb25fcmF0ZXMubGVuZ3RoLCBlcnIuSU5WQUxJRF9DT1VQT05fUkFURVMKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgICEKICAgIGFzc2VydCAvLyBDb3Vwb24gcmF0ZXMgYXJlIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMzMKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IGNvdXBvbl9yYXRlcy5sZW5ndGgKICAgIGJ5dGVjIDYgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjM0CiAgICAvLyBpZiBzZWxmLnRvdGFsX2NvdXBvbnM6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgYnogYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gc2VsZi5jb3Vwb25fcmF0ZXMudmFsdWUgPSBjb3Vwb25fcmF0ZXMuY29weSgpCiAgICBieXRlYyAyOCAvLyAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMjggLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBmcmFtZV9kaWcgLTMKICAgIGJveF9wdXQKCmFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDMyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQwCiAgICAvLyB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIGludGNfMyAvLyA0CiAgICArCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjM5LTI0MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTCiAgICAvLyApLCBlcnIuSU5WQUxJRF9USU1FX0VWRU5UU19MRU5HVEgKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBsZW5ndGggaXMgaW52YWxpZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTYwCiAgICAvLyBzZWxmLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQodGltZV9ldmVudHMpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY1CiAgICAvLyBzZWxmLnRpbWVfZXZlbnRzLnZhbHVlID0gdGltZV9ldmVudHMuY29weSgpCiAgICBieXRlYyAyMiAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDIyIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY2LTI2OAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY2CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTQgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2Ni0yNjgKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY5LTI3MQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGR1cAogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjkKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICBieXRlYyAxNSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY5LTI3MQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzIKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSA9IHRpbWVfZXZlbnRzW2NmZy5JU1NVQU5DRV9EQVRFX0lEWF0ubmF0aXZlCiAgICBleHRyYWN0IDE2IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBieXRlYyAxNiAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzQtMjc1CiAgICAvLyAjIFNvbWUgRC1BU0EgbWF5IG5vdCBoYXZlIGEgbWF0dXJpdHkgZGF0ZSAoZS5nLiwgcGVycGV0dWFscykKICAgIC8vIGlmIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBpbnRjXzMgLy8gNAogICAgKwogICAgPT0KICAgIGJ6IGFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDM4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzYKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRpbWVfZXZlbnRzW2NmZy5NQVRVUklUWV9EQVRFX0lEWF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnl0ZWNfMyAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0Cgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4MAogICAgLy8gYXNzZXJ0IG5vdCB0aW1lX3BlcmlvZHMubGVuZ3RoLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRFMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICAhCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGFyZSBub3QgcHJvcGVybHkgZGVmaW5lZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTY3CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VAMTc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NldF9jb25maWdfYm9vbF9tZXJnZUAxOAoKYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHRpbWVfZXZlbnRzOiBieXRlcykgLT4gYnl0ZXM6CmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDMtMjQ0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQoc2VsZiwgdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzKSAtPiBOb25lOgogICAgcHJvdG8gMSAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ2CiAgICAvLyB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ3CiAgICAvLyA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDYtMjQ3CiAgICAvLyB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0ubmF0aXZlCiAgICAvLyA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDUtMjQ4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXS5uYXRpdmUKICAgIC8vICAgICA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyApLCBlcnIuSU5WQUxJRF9USU1FCiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ5CiAgICAvLyBmb3IgX3QgaW4gdXJhbmdlKHRpbWVfZXZlbnRzLmxlbmd0aCAtIDEpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzAgLy8gMAoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDkKICAgIC8vIGZvciBfdCBpbiB1cmFuZ2UodGltZV9ldmVudHMubGVuZ3RoIC0gMSk6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDMKICAgIDwKICAgIGJ6IGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDYKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfd2hpbGVfdG9wQDg6CiAgICBwdXNoaW50IDc1IC8vIDc1CiAgICBnbG9iYWwgT3Bjb2RlQnVkZ2V0CiAgICA+CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX3doaWxlQDE0CiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgMjkgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyAyOSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfd2hpbGVfdG9wQDgKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfd2hpbGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTQKICAgIC8vIHRpbWVfaSA9IHRpbWVfZXZlbnRzW190XS5uYXRpdmUKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjU1CiAgICAvLyB0aW1lX2YgPSB0aW1lX2V2ZW50c1tfdCArIDFdLm5hdGl2ZQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gYXNzZXJ0IHRpbWVfZiA+IHRpbWVfaSwgZXJyLklOVkFMSURfU09SVElORwogICAgPAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjU3CiAgICAvLyBpZiBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uICE9IFVJbnQ2NChjc3QuRENDX0NPTlQpOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIHB1c2hpbnQgMjU1IC8vIDI1NQogICAgIT0KICAgIGJ6IGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfZm9yX2hlYWRlckAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTgtMjU5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGltZSBwZXJpb2RzIGV4cHJlc3NlZCBpbiBkYXlzIGZvciByZWd1bGFyIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0ICh0aW1lX2YgLSB0aW1lX2kpICUgVUludDY0KAogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTgtMjYxCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGltZSBwZXJpb2RzIGV4cHJlc3NlZCBpbiBkYXlzIGZvciByZWd1bGFyIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0ICh0aW1lX2YgLSB0aW1lX2kpICUgVUludDY0KAogICAgLy8gICAgIGNzdC5EQVlfMl9TRUMKICAgIC8vICkgPT0gMCwgZXJyLklOVkFMSURfVElNRV9QRVJJT0QKICAgIHB1c2hpbnQgODY0MDAgLy8gODY0MDAKICAgICUKICAgICEKICAgIGFzc2VydCAvLyBUaW1lIHBlcmlvZHMgaW4gQWN0dWFsL0FjdHVhbCBkYXkgY291bnQgY29udmVudGlvbiBtdXN0IGJlIG11bHRpcGxlcyBvZiBhIGRheSAoaW4gc2Vjb25kcykKICAgIGIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDEKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDY6CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cyhzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzOiBieXRlcykgLT4gYnl0ZXM6CnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NjktNTcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKAogICAgLy8gICAgIHNlbGYsIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzCiAgICAvLyApIC0+IHR5cC5TZWNvbmRhcnlNYXJrZXRTY2hlZHVsZToKICAgIHByb3RvIDEgMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5MAogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjIDQgLy8gMjAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTkxCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTkyCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5NAogICAgLy8gYXNzZXJ0IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID49IDEsIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTUKICAgIC8vIGlmIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID4gMToKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTYKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMQogICAgZnJhbWVfYnVyeSAxCgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTgKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTktNjAxCiAgICAvLyA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTgtNjAxCiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGRpZyAxCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk3LTYwMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vICAgICA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyAgICAgXS5uYXRpdmUKICAgIC8vICksIGVyci5JTlZBTElEX1NFQ09OREFSWV9PUEVOSU5HX0RBVEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNlY29uZGFyeSBtYXJrZXQgb3BlbmluZyBkYXRlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDMKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTcgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjAzLTYwNQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDYKICAgIC8vIGlmIHNlbGYubWF0dXJpdHlfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICBieiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjA4CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTAKICAgIC8vIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDktNjExCiAgICAvLyA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDgtNjExCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIC8vID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGRpZyAxCiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjA3LTYxMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIC8vICAgICA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyAgICAgXS5uYXRpdmUKICAgIC8vICksIGVyci5JTlZBTElEX1NFQ09OREFSWV9DTE9TVVJFX0RBVEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNlY29uZGFyeSBtYXJrZXQgY2xvc3VyZSBkYXRlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTMKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTggLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjEzLTYxNQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxOAogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxNy02MTkKICAgIC8vIHNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MjEKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MjAtNjIyCiAgICAvLyBzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyApLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjE2LTYyMwogICAgLy8gcmV0dXJuIHR5cC5TZWNvbmRhcnlNYXJrZXRTY2hlZHVsZSgKICAgIC8vICAgICBzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gICAgICksCiAgICAvLyAgICAgc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkgLT4gdm9pZDoKYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTAtMTExCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExMgogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmRlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJkZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzaWduX3JvbGUocm9sZV9hZGRyZXNzOiBieXRlcywgcm9sZTogYnl0ZXMsIGNvbmZpZzogYnl0ZXMpIC0+IGJ5dGVzOgphc3NpZ25fcm9sZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyNS02MjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2lnbl9yb2xlKAogICAgLy8gICAgIHNlbGYsIHJvbGVfYWRkcmVzczogYXJjNC5BZGRyZXNzLCByb2xlOiBhcmM0LlVJbnQ4LCBjb25maWc6IGFyYzQuRHluYW1pY0J5dGVzCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDYKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0NwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ5CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgcHVzaGludCAyMCAvLyAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgtNjU1CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUxCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MCAvLyA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MgogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MCAvLyA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MwogICAgLy8gVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwIC8vIDcwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgtNjU1CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU0CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0OC02NTUKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBhc3NpZ25fcm9sZV9ib29sX2ZhbHNlQDcKCmFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18xIC8vIDEKCmFzc2lnbl9yb2xlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0OC02NTUKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU3CiAgICAvLyBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICBwdXNoaW50cyAyMCA0MCA1MCA2MCA3MCA4MCAvLyAyMCwgNDAsIDUwLCA2MCwgNzAsIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTYtNjg1CiAgICAvLyBtYXRjaCByb2xlLm5hdGl2ZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MubmF0aXZlCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICAgICAgICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoKQogICAgZnJhbWVfZGlnIDAKICAgIG1hdGNoIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzBAOSBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8xQDEwIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzJAMTEgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzVAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4NQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfNUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3OQogICAgLy8gcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgYnl0ZWMgMzAgLy8gMHg1MjM4MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzgtNjgwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4MgogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjgxLTY4MwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gKQogICAgYm94X3B1dAoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4NgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgc3dhcAogICAgcmV0c3ViCgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njc1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyMzczMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzYKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzNAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNCAvLyAweDUyMzYzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzMKICAgIC8vIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgYm94X3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8yQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzNTMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2OQogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY4LTY3MAogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICBjb25maWcubmF0aXZlCiAgICAvLyApCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzFAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjEKICAgIC8vIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDI2IC8vIDB4NTIzNDMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjYwLTY2MgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjQKICAgIC8vIGNvbmZpZy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2My02NjUKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICkKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMEA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU4CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzLm5hdGl2ZQogICAgYnl0ZWMgOCAvLyAweDUyMzIzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2lnbl9yb2xlX2Jvb2xfbWVyZ2VAOAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnJldm9rZV9yb2xlKHJvbGVfYWRkcmVzczogYnl0ZXMsIHJvbGU6IGJ5dGVzKSAtPiBieXRlczoKcmV2b2tlX3JvbGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2ODgtNjg5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiByZXZva2Vfcm9sZShzZWxmLCByb2xlX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcm9sZTogYXJjNC5VSW50OCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwNgogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA3CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDkKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgcHVzaGludCA0MCAvLyA0MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4LTcxNAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTAKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwIC8vIDUwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDgtNzE0CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiByZXZva2Vfcm9sZV9ib29sX3RydWVANQogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxMQogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MCAvLyA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4LTcxNAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTIKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgcHVzaGludCA3MCAvLyA3MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4LTcxNAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTMKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgcHVzaGludCA4MCAvLyA4MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4LTcxNAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiByZXZva2Vfcm9sZV9ib29sX2ZhbHNlQDYKCnJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1OgogICAgaW50Y18xIC8vIDEKCnJldm9rZV9yb2xlX2Jvb2xfbWVyZ2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxNi03MTcKICAgIC8vICMgQXJyYW5nZXIgcm9sZSBjYW4gbm90IGJlIHJldm9rZWQgKGp1c3Qgcm90YXRlZCkKICAgIC8vIGNhc2UgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50cyA0MCA1MCA2MCA3MCA4MCAvLyA0MCwgNTAsIDYwLCA3MCwgODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxNS03MzMKICAgIC8vIG1hdGNoIHJvbGUubmF0aXZlOgogICAgLy8gICAgICMgQXJyYW5nZXIgcm9sZSBjYW4gbm90IGJlIHJldm9rZWQgKGp1c3Qgcm90YXRlZCkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FDQ09VTlRfTUFOQUdFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9QUklNQVJZX0RFQUxFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfVFJVU1RFRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FVVEhPUklUWSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0lOVEVSRVNUX09SQUNMRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycigpCiAgICBmcmFtZV9kaWcgMAogICAgbWF0Y2ggcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMEA4IHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzFAOSByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8yQDEwIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzNAMTEgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfNEAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzMzCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV80QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzMwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDMwIC8vIDB4NTIzODMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczMQogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0lOVEVSRVNUX09SQUNMRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczNAogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgc3dhcAogICAgcmV0c3ViCgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8zQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzI3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzNzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyOAogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FVVEhPUklUWSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8yQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzI0CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNCAvLyAweDUyMzYzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjUKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9UUlVTVEVFICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzFAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzNTMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyMgogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1BSSU1BUllfREVBTEVSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzBAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxOAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNiAvLyAweDUyMzQzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTkKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BQ0NPVU5UX01BTkFHRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfYm9vbF9mYWxzZUA2OgogICAgaW50Y18wIC8vIDAKICAgIGIgcmV2b2tlX3JvbGVfYm9vbF9tZXJnZUA3CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Eub3Blbl9hY2NvdW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHBheW1lbnRfYWRkcmVzczogYnl0ZXMpIC0+IGJ5dGVzOgpvcGVuX2FjY291bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MzYtNzM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBvcGVuX2FjY291bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHBheW1lbnRfYWRkcmVzczogYXJjNC5BZGRyZXNzCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTYKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjIDQgLy8gMjAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU4CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1OQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjAKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA3IC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2Mi03NjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjQKICAgIC8vIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICBieXRlYyAyNyAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2Mi03NjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjUKICAgIC8vIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDI3IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzYyLTc2OAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2NgogICAgLy8gcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICBieXRlYyAyNyAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2Mi03NjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjcKICAgIC8vIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIHB1c2hieXRlcyAweDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY5CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIyLTEyMwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDI2IC8vIDB4NTIzNDMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2LTEyOQogICAgLy8gY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjcKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyOAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNy0xMjgKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjkKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyOC0xMjkKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI1LTEzMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X3N1c3BlbmRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExNC0xMTUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTE2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInN1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmNsb3NlX2FjY291bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gYnl0ZXM6CmNsb3NlX2FjY291bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NzEtNzc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBjbG9zZV9hY2NvdW50KAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzCiAgICAvLyApIC0+IGFyYzQuVHVwbGVbYXJjNC5VSW50NjQsIGFyYzQuVUludDY0XToKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzg5CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5MAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDcgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzkzCiAgICAvLyBjbG9zZWRfdW5pdHMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3OTQKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BQ0NPVU5UICsgaG9sZGluZ19hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3OTUKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgLT0gY2xvc2VkX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjYKICAgIC8vIGlmIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgPT0gMDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGJueiBjbG9zZV9hY2NvdW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzY3CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0VOREVEKQogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgaW50YyA0IC8vIDIwMAogICAgYXBwX2dsb2JhbF9wdXQKCmNsb3NlX2FjY291bnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzk4CiAgICAvLyAoYXJjNC5VSW50NjQoY2xvc2VkX3VuaXRzKSwgYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApKQogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5Ny03OTkKICAgIC8vIHJldHVybiBhcmM0LlR1cGxlKAogICAgLy8gICAgIChhcmM0LlVJbnQ2NChjbG9zZWRfdW5pdHMpLCBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkpCiAgICAvLyApCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnByaW1hcnlfZGlzdHJpYnV0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiBieXRlcykgLT4gYnl0ZXM6CnByaW1hcnlfZGlzdHJpYnV0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODAxLTgwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcHJpbWFyeV9kaXN0cmlidXRpb24oCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHVuaXRzOiBhcmM0LlVJbnQ2NAogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDQKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMCAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODktMjkyCiAgICAvLyBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTAKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkxCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5MC0yOTEKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTAtMjkyCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5MgogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkxLTI5MgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGZyYW1lX2RpZyAyCiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTAtMjkyCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODgtMjkzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyAgICAgYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU0VECiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgY2xvc2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICBieXRlYyAyNSAvLyAweDUyMzUzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzQKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzYtMTM5CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzcKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGVhbGVyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzgKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzctMTM4CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzctMTM5CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kZWFsZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzOC0xMzkKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNy0xMzkKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMgogICAgaW50Y18xIC8vIDEKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzUtMTQwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICAvLyAgICAgYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA3IC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyOQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzAKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMxCiAgICAvLyBhc3NlcnQgdW5pdHMubmF0aXZlID4gMCwgZXJyLlpFUk9fVU5JVFMKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICBhc3NlcnQgLy8gQ2FuIG5vdCBkaXN0cmlidXRlIHplcm8gdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMwogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyArIHVuaXRzLm5hdGl2ZSA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMi04MzQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5jaXJjdWxhdGluZ191bml0cyArIHVuaXRzLm5hdGl2ZSA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICAvLyApLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzYKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKz0gdW5pdHMubmF0aXZlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM3LTgzOQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM3LTgzOQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIC8vICkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDMyCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gYXJjNC5VSW50NjQoc2VsZi51bml0X3ZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgIGl0b2IKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmVwbGFjZTIgNDAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0MQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMgLSBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgLQogICAgaXRvYgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTI6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDEzCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfYXNzZXRfc3VzcGVuc2lvbihzdXNwZW5kZWQ6IGJ5dGVzKSAtPiBieXRlczoKc2V0X2Fzc2V0X3N1c3BlbnNpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDMtODQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfYXNzZXRfc3VzcGVuc2lvbihzZWxmLCBzdXNwZW5kZWQ6IGFyYzQuQm9vbCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg1NwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NTgKICAgIC8vIHNlbGYuc3VzcGVuZGVkID0gVUludDY0KHN1c3BlbmRlZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ5dGVjIDE5IC8vICJzdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODU5CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUyLTE1MwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIGJ5dGVjIDIzIC8vIDB4NTIzNzMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU2LTE1OQogICAgLy8gY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTcKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdXRob3JpdHkgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1OAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1Ny0xNTgKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTctMTU5CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTkKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdXRob3JpdHkgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1OC0xNTkKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTctMTU5CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU1LTE2MAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIC8vICAgICBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X2FjY291bnRfc3VzcGVuc2lvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBzdXNwZW5kZWQ6IGJ5dGVzKSAtPiBieXRlczoKc2V0X2FjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2MS04NjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9hY2NvdW50X3N1c3BlbnNpb24oCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHN1c3BlbmRlZDogYXJjNC5Cb29sCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NzkKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA3IC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4MQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHB1c2hpbnQgNDQ4IC8vIDQ0OAogICAgc3dhcAogICAgc2V0Yml0CiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODIKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnNldF9kZWZhdWx0X3N0YXR1cyhkZWZhdWx0ZWQ6IGJ5dGVzKSAtPiB2b2lkOgpzZXRfZGVmYXVsdF9zdGF0dXM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODQtODg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfZGVmYXVsdF9zdGF0dXMoc2VsZiwgZGVmYXVsdGVkOiBhcmM0LkJvb2wpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIGJ5dGVjIDI0IC8vIDB4NTIzNjMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Ni0xNDkKICAgIC8vIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cnVzdGVlIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDgKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDctMTQ4CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Ny0xNDkKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0OQogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cnVzdGVlIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDgtMTQ5CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Ny0xNDkKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgpzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ1LTE1MAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICAvLyAgICAgYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5NgogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBVSW50NjQoZGVmYXVsdGVkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgYnl0ZWMgMjAgLy8gImRlZmF1bHRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCnNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9tZXJnZUA2CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X2Fzc2V0X2luZm8oKSAtPiBieXRlczoKZ2V0X2Fzc2V0X2luZm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTgtODk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfaW5mbyhzZWxmKSAtPiB0eXAuQXNzZXRJbmZvOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDgKICAgIC8vIHBlcmZvcm1hbmNlID0gVUludDY0KGNzdC5QUkZfUEVSRk9STUFOVCkKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwOQogICAgLy8gaWYgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBzZWxmLm1hdHVyaXR5X2RhdGUgPiAwOgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb3ZlciA0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPgogICAgYnogZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUAzCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgMQogICAgYnogZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTAKICAgIC8vIHBlcmZvcm1hbmNlID0gVUludDY0KGNzdC5QUkZfTUFUVVJFRCkKICAgIGludGNfMyAvLyA0CiAgICBmcmFtZV9idXJ5IDIKCmdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VAMzoKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMS05MTIKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgbm8gZ3JhY2Ugb3IgZGVsaW5xdWVuY3kgcGVyaW9kcwogICAgLy8gaWYgc2VsZi5kZWZhdWx0ZWQ6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImRlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZWZhdWx0ZWQgZXhpc3RzCiAgICBieiBnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMwogICAgLy8gcGVyZm9ybWFuY2UgPSBVSW50NjQoY3N0LlBSRl9ERUZBVUxURUQpCiAgICBwdXNoaW50IDMgLy8gMwogICAgZnJhbWVfYnVyeSAwCgpnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTYKICAgIC8vIGRlbm9taW5hdGlvbl9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNwogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDAKICAgIC8vIHJldHVybiBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE4CiAgICAvLyBvdXRzdGFuZGluZ19wcmluY2lwYWw9YXJjNC5VSW50NjQoc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwoKSksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTkKICAgIC8vIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoc2VsZi51bml0X3ZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjAKICAgIC8vIGRheV9jb3VudF9jb252ZW50aW9uPWFyYzQuVUludDgoc2VsZi5kYXlfY291bnRfY29udmVudGlvbiksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgaXRvYgogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyMQogICAgLy8gcHJpbmNpcGFsX2Rpc2NvdW50PWFyYzQuVUludDE2KHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50KSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjIKICAgIC8vIGludGVyZXN0X3JhdGU9YXJjNC5VSW50MTYoc2VsZi5pbnRlcmVzdF9yYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMSAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyMwogICAgLy8gdG90YWxfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTI0CiAgICAvLyBjaXJjdWxhdGluZ19zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi5jaXJjdWxhdGluZ191bml0cyksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjUtOTI3CiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjkKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjgtOTMwCiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzEKICAgIC8vIGlzc3VhbmNlX2RhdGU9YXJjNC5VSW50NjQoc2VsZi5pc3N1YW5jZV9kYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTMyCiAgICAvLyBtYXR1cml0eV9kYXRlPWFyYzQuVUludDY0KHNlbGYubWF0dXJpdHlfZGF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTMzCiAgICAvLyBzdXNwZW5kZWQ9YXJjNC5Cb29sKGJvb2woc2VsZi5zdXNwZW5kZWQpKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN1c3BlbmRlZCBleGlzdHMKICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNAogICAgLy8gcGVyZm9ybWFuY2U9YXJjNC5VSW50OChwZXJmb3JtYW5jZSksCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNS05MzUKICAgIC8vIHJldHVybiB0eXAuQXNzZXRJbmZvKAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCksCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLAogICAgLy8gICAgIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCgpKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSksCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIC8vICAgICBwcmluY2lwYWxfZGlzY291bnQ9YXJjNC5VSW50MTYoc2VsZi5wcmluY2lwYWxfZGlzY291bnQpLAogICAgLy8gICAgIGludGVyZXN0X3JhdGU9YXJjNC5VSW50MTYoc2VsZi5pbnRlcmVzdF9yYXRlKSwKICAgIC8vICAgICB0b3RhbF9zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi50b3RhbF91bml0cyksCiAgICAvLyAgICAgY2lyY3VsYXRpbmdfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMpLAogICAgLy8gICAgIHByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICApLAogICAgLy8gICAgIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIC8vICAgICApLAogICAgLy8gICAgIGlzc3VhbmNlX2RhdGU9YXJjNC5VSW50NjQoc2VsZi5pc3N1YW5jZV9kYXRlKSwKICAgIC8vICAgICBtYXR1cml0eV9kYXRlPWFyYzQuVUludDY0KHNlbGYubWF0dXJpdHlfZGF0ZSksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbChib29sKHNlbGYuc3VzcGVuZGVkKSksCiAgICAvLyAgICAgcGVyZm9ybWFuY2U9YXJjNC5VSW50OChwZXJmb3JtYW5jZSksCiAgICAvLyApCiAgICB1bmNvdmVyIDE0CiAgICB1bmNvdmVyIDE0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X2FjY291bnRfaW5mbyhob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2FjY291bnRfaW5mbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNy05MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hY2NvdW50X2luZm8oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MpIC0+IHR5cC5BY2NvdW50SW5mbzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA3IC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1MgogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X3RpbWVfZXZlbnRzKCkgLT4gYnl0ZXM6CmdldF90aW1lX2V2ZW50czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1NC05NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF90aW1lX2V2ZW50cyhzZWxmKSAtPiB0eXAuVGltZUV2ZW50czoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTYyCiAgICAvLyB0aW1lX2V2ZW50cyA9IHR5cC5UaW1lRXZlbnRzKCkKICAgIHB1c2hieXRlcyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2MwogICAgLy8gaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCk6CiAgICBieiBnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NjQKICAgIC8vIHRpbWVfZXZlbnRzID0gc2VsZi50aW1lX2V2ZW50cy52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDIyIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9ldmVudHMgZXhpc3RzCgpnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTY1CiAgICAvLyByZXR1cm4gdGltZV9ldmVudHMKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSgpIC0+IGJ5dGVzOgpnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2Ny05NjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlKHNlbGYpIC0+IHR5cC5UaW1lRXZlbnRzOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NzYKICAgIC8vIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk3NwogICAgLy8gYXJjNC5VSW50NjQoc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTc1LTk3OAogICAgLy8gcmV0dXJuIHR5cC5UaW1lRXZlbnRzKAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUpLAogICAgLy8gKQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hc3NldF9tZXRhZGF0YSgpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbWV0YWRhdGE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5ODAtOTgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbWV0YWRhdGEoc2VsZikgLT4gdHlwLkFzc2V0TWV0YWRhdGE6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk4OQogICAgLy8gcmV0dXJuIHR5cC5Bc3NldE1ldGFkYXRhLmZyb21fYnl0ZXMoc2VsZi5tZXRhZGF0YSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAibWV0YWRhdGEiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWV0YWRhdGEgZXhpc3RzCiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "state": { + "global": { + "num_byte_slices": 2, + "num_uints": 18 + }, + "local": { + "num_byte_slices": 0, + "num_uints": 0 + } + }, + "schema": { + "global": { + "declared": { + "arranger": { + "type": "bytes", + "key": "R20#" + }, + "circulating_units": { + "type": "uint64", + "key": "circulating_units" + }, + "day_count_convention": { + "type": "uint64", + "key": "day_count_convention" + }, + "defaulted": { + "type": "uint64", + "key": "defaulted" + }, + "denomination_asset_id": { + "type": "uint64", + "key": "denomination_asset_id" + }, + "interest_rate": { + "type": "uint64", + "key": "interest_rate" + }, + "issuance_date": { + "type": "uint64", + "key": "issuance_date" + }, + "maturity_date": { + "type": "uint64", + "key": "maturity_date" + }, + "metadata": { + "type": "bytes", + "key": "metadata" + }, + "primary_distribution_closure_date": { + "type": "uint64", + "key": "primary_distribution_closure_date" + }, + "primary_distribution_opening_date": { + "type": "uint64", + "key": "primary_distribution_opening_date" + }, + "principal_discount": { + "type": "uint64", + "key": "principal_discount" + }, + "secondary_market_closure_date": { + "type": "uint64", + "key": "secondary_market_closure_date" + }, + "secondary_market_opening_date": { + "type": "uint64", + "key": "secondary_market_opening_date" + }, + "settlement_asset_id": { + "type": "uint64", + "key": "settlement_asset_id" + }, + "status": { + "type": "uint64", + "key": "status" + }, + "suspended": { + "type": "uint64", + "key": "suspended" + }, + "total_coupons": { + "type": "uint64", + "key": "total_coupons" + }, + "total_units": { + "type": "uint64", + "key": "total_units" + }, + "unit_value": { + "type": "uint64", + "key": "unit_value" + } + }, + "reserved": {} + }, + "local": { + "declared": {}, + "reserved": {} + } + }, + "contract": { + "name": "BaseDAsa", + "desc": "\n Base D-ASA Class implementing common interfaces and state schema:\n\n - Asset creation and configuration\n - Role-based access control\n - Account management (creation, suspension, close-out)\n - Time schedule with no coupons and maturity date\n - Primary distribution\n - Getters (asset info, account info, time events)\n ", + "methods": [ + { + "name": "asset_create", + "args": [ + { + "type": "address", + "name": "arranger", + "desc": "D-ASA Arranger Address" + }, + { + "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", + "name": "metadata", + "desc": "D-ASA metadata" + } + ], + "readonly": false, + "returns": { + "type": "void" + }, + "desc": "Create a new D-ASA" + }, + { + "name": "asset_update", + "args": [ + { + "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", + "name": "metadata" + } + ], + "readonly": false, + "returns": { + "type": "void" + }, + "desc": "Update D-ASA application." + }, + { + "name": "asset_config", + "args": [ + { + "type": "uint64", + "name": "denomination_asset_id", + "desc": "Denomination asset identifier" + }, + { + "type": "uint64", + "name": "settlement_asset_id", + "desc": "Settlement asset identifier" + }, + { + "type": "uint64", + "name": "principal", + "desc": "Principal, expressed in denomination asset" + }, + { + "type": "uint64", + "name": "principal_discount", + "desc": "Principal discount in bps" + }, + { + "type": "uint64", + "name": "minimum_denomination", + "desc": "Minimum denomination, expressed in denomination asset" + }, + { + "type": "uint8", + "name": "day_count_convention", + "desc": "Day-count convention for interests calculation" + }, + { + "type": "uint16", + "name": "interest_rate", + "desc": "Interest rate in bps" + }, + { + "type": "uint16[]", + "name": "coupon_rates", + "desc": "Coupon interest rates in bps" + }, + { + "type": "uint64[]", + "name": "time_events", + "desc": "Time events (strictly ascending order)" + }, + { + "type": "(uint64,uint64)[]", + "name": "time_periods", + "desc": "Time periods of recurring time events" + } + ], + "readonly": false, + "returns": { + "type": "void" + }, + "desc": "Configure the Debt Algorand Standard Application" + }, + { + "name": "set_secondary_time_events", + "args": [ + { + "type": "uint64[]", + "name": "secondary_market_time_events", + "desc": "Secondary market time events (strictly ascending order)" + } + ], + "readonly": false, + "returns": { + "type": "(uint64,uint64)", + "desc": "Secondary Market Opening Date, Secondary Market Closure Date" + }, + "desc": "Set secondary market time schedule" + }, + { + "name": "assign_role", + "args": [ + { + "type": "address", + "name": "role_address", + "desc": "Account Role Address" + }, + { + "type": "uint8", + "name": "role", + "desc": "Role identifier" + }, + { + "type": "byte[]", + "name": "config", + "desc": "Role configuration (Optional)" + } + ], + "readonly": false, + "returns": { + "type": "uint64", + "desc": "Timestamp of the role assignment" + }, + "desc": "Assign a role to an address" + }, + { + "name": "revoke_role", + "args": [ + { + "type": "address", + "name": "role_address", + "desc": "Account Role Address" + }, + { + "type": "uint8", + "name": "role", + "desc": "Role identifier" + } + ], + "readonly": false, + "returns": { + "type": "uint64", + "desc": "Timestamp of the role revocation" + }, + "desc": "Revoke a role from an address" + }, + { + "name": "open_account", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + }, + { + "type": "address", + "name": "payment_address", + "desc": "Account Payment Address" + } + ], + "readonly": false, + "returns": { + "type": "uint64", + "desc": "Timestamp of the account opening" + }, + "desc": "Open D-ASA account" + }, + { + "name": "close_account", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + } + ], + "readonly": false, + "returns": { + "type": "(uint64,uint64)", + "desc": "Closed units, Timestamp of the account closing" + }, + "desc": "Close D-ASA account" + }, + { + "name": "primary_distribution", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + }, + { + "type": "uint64", + "name": "units", + "desc": "Amount of D-ASA units to distribute" + } + ], + "readonly": false, + "returns": { + "type": "uint64", + "desc": "Remaining D-ASA units to be distributed" + }, + "desc": "Distribute D-ASA units to accounts according the primary market" + }, + { + "name": "set_asset_suspension", + "args": [ + { + "type": "bool", + "name": "suspended", + "desc": "Suspension status" + } + ], + "readonly": false, + "returns": { + "type": "uint64", + "desc": "Timestamp of the set asset suspension status" + }, + "desc": "Set asset suspension status" + }, + { + "name": "set_account_suspension", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + }, + { + "type": "bool", + "name": "suspended", + "desc": "Suspension status" + } + ], + "readonly": false, + "returns": { + "type": "uint64", + "desc": "Timestamp of the set account suspension status" + }, + "desc": "Set account suspension status" + }, + { + "name": "set_default_status", + "args": [ + { + "type": "bool", + "name": "defaulted", + "desc": "Default status" + } + ], + "readonly": false, + "returns": { + "type": "void" + }, + "desc": "Set D-ASA default status" + }, + { + "name": "get_asset_info", + "args": [], + "readonly": true, + "returns": { + "type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", + "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Performance" + }, + "desc": "Get D-ASA info" + }, + { + "name": "get_account_info", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + } + ], + "readonly": true, + "returns": { + "type": "(address,uint64,uint64,uint64,bool)", + "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended" + }, + "desc": "Get account info" + }, + { + "name": "get_time_events", + "args": [], + "readonly": true, + "returns": { + "type": "uint64[]", + "desc": "Time events" + }, + "desc": "Get D-ASA time events" + }, + { + "name": "get_secondary_market_schedule", + "args": [], + "readonly": true, + "returns": { + "type": "uint64[]", + "desc": "Secondary market schedule" + }, + "desc": "Get secondary market schedule" + }, + { + "name": "get_asset_metadata", + "args": [], + "readonly": true, + "returns": { + "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", + "desc": "Contract type, Calendar, Business day convention, End of month convention, Early repayment effect, Early repayment penalty type, Prospectus hash, Prospectus URL" + }, + "desc": "Get D-ASA metadata" + } + ], + "networks": {} + }, + "bare_call_config": {} +} \ No newline at end of file diff --git a/smart_contracts/base_d_asa/BaseDAsa.clear.puya.map b/smart_contracts/base_d_asa/BaseDAsa.clear.puya.map new file mode 100644 index 0000000..7e7f2c0 --- /dev/null +++ b/smart_contracts/base_d_asa/BaseDAsa.clear.puya.map @@ -0,0 +1,25 @@ +{ + "version": 3, + "sources": [], + "mappings": ";;;", + "op_pc_offset": 0, + "pc_events": { + "1": { + "subroutine": "algopy.arc4.ARC4Contract.clear_state_program", + "params": {}, + "block": "main", + "stack_in": [], + "op": "pushint 1 // 1", + "defined_out": [ + "1" + ], + "stack_out": [ + "1" + ] + }, + "3": { + "op": "return", + "stack_out": [] + } + } +} \ No newline at end of file diff --git a/smart_contracts/base_d_asa/BaseDAsa.clear.teal b/smart_contracts/base_d_asa/BaseDAsa.clear.teal new file mode 100644 index 0000000..a433105 --- /dev/null +++ b/smart_contracts/base_d_asa/BaseDAsa.clear.teal @@ -0,0 +1,7 @@ +#pragma version 10 +#pragma typetrack false + +// algopy.arc4.ARC4Contract.clear_state_program() -> uint64: +main: + pushint 1 // 1 + return diff --git a/tests/base_d_asa/conftest.py b/tests/base_d_asa/conftest.py index 4054b28..1ac74a1 100644 --- a/tests/base_d_asa/conftest.py +++ b/tests/base_d_asa/conftest.py @@ -17,6 +17,7 @@ AssignRoleArgs, BaseDAsaClient, BaseDAsaFactory, + CommonAppCallParams, OpenAccountArgs, PrimaryDistributionArgs, SetAssetSuspensionArgs, @@ -198,7 +199,7 @@ def primary_dealer( account_to_fund=account.address, min_spending_balance=INITIAL_ALGO_FUNDS, ) - state = base_d_asa_client_active.send.get_global_state() + state = base_d_asa_client_active.state.global_state role_config = utils.set_role_config( state.primary_distribution_opening_date, state.primary_distribution_closure_date ) @@ -256,11 +257,14 @@ def base_d_asa_client_primary( ) -> BaseDAsaClient: state = base_d_asa_client_active.state.global_state.get_all() base_d_asa_client_active.send.set_secondary_time_events( - SetSecondaryTimeEventsArgs( - secondary_market_time_events=[state.issuance_date, state.maturity_date] + args=SetSecondaryTimeEventsArgs( + secondary_market_time_events=[ + state["issuance_date"], + state["maturity_date"], + ] ) ) - utils.time_warp(state.primary_distribution_opening_date) + utils.time_warp(state["primary_distribution_opening_date"]) return base_d_asa_client_active @@ -295,7 +299,7 @@ def base_d_asa_client_ongoing( base_d_asa_client_primary: BaseDAsaClient, ) -> BaseDAsaClient: state = base_d_asa_client_primary.state.global_state.get_all() - utils.time_warp(state.issuance_date) + utils.time_warp(state["issuance_date"]) return base_d_asa_client_primary @@ -305,5 +309,8 @@ def base_d_asa_client_suspended( ) -> BaseDAsaClient: base_d_asa_client_ongoing.send.set_asset_suspension( SetAssetSuspensionArgs(suspended=True), + params=CommonAppCallParams( + sender=authority.address, + ), ) return base_d_asa_client_ongoing diff --git a/tests/base_d_asa/test_asset_config.py b/tests/base_d_asa/test_asset_config.py index bc68bc8..e8be090 100644 --- a/tests/base_d_asa/test_asset_config.py +++ b/tests/base_d_asa/test_asset_config.py @@ -29,54 +29,54 @@ def test_pass_asset_config( expected_time_events = base_d_asa_client_empty.send.get_time_events().abi_return # Asset Configuration - assert state.denomination_asset_id() == currency.id - assert state.settlement_asset_id() == state.denomination_asset_id() - assert state.unit_value() == base_d_asa_cfg.minimum_denomination - assert state.day_count_convention() == base_d_asa_cfg.day_count_convention + assert state.denomination_asset_id == currency.id + assert state.settlement_asset_id == state.denomination_asset_id + assert state.unit_value == base_d_asa_cfg.minimum_denomination + assert state.day_count_convention == base_d_asa_cfg.day_count_convention # Principal and Supply assert ( - state.total_units() + state.total_units == base_d_asa_cfg.principal // base_d_asa_cfg.minimum_denomination ) - assert not state.circulating_units() - assert not state.principal_discount() + assert not state.circulating_units + assert not state.principal_discount # Interest Rate - assert state.interest_rate() == base_d_asa_cfg.interest_rate + assert state.interest_rate == base_d_asa_cfg.interest_rate # Coupons assert expected_coupon_rates == base_d_asa_cfg.coupon_rates - assert state.total_coupons() == base_d_asa_cfg.total_coupons + assert state.total_coupons == base_d_asa_cfg.total_coupons # Time Schedule assert expected_time_events == base_d_asa_cfg.time_events assert ( - state.primary_distribution_opening_date() + state.primary_distribution_opening_date == base_d_asa_cfg.time_events[sc_cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX] # == time_schedule_limits.primary_distribution_opening_date ) assert ( - state.primary_distribution_closure_date() + state.primary_distribution_closure_date == base_d_asa_cfg.time_events[sc_cfg.PRIMARY_DISTRIBUTION_CLOSURE_DATE_IDX] # == time_schedule_limits.primary_distribution_closure_date ) assert ( - state.issuance_date() + state.issuance_date == base_d_asa_cfg.time_events[sc_cfg.ISSUANCE_DATE_IDX] # == time_schedule_limits.issuance_date ) - assert not state.secondary_market_opening_date() - assert not state.secondary_market_closure_date() + assert not state.secondary_market_opening_date + assert not state.secondary_market_closure_date assert ( - state.maturity_date() + state.maturity_date == base_d_asa_cfg.time_events[sc_cfg.MATURITY_DATE_IDX] # == time_schedule_limits.maturity_date ) # Status - assert state.status() == sc_cfg.STATUS_ACTIVE - assert not state.suspended() + assert state.status == sc_cfg.STATUS_ACTIVE + assert not state.suspended def test_fail_unauthorized( diff --git a/tests/base_d_asa/test_asset_create.py b/tests/base_d_asa/test_asset_create.py index de50624..2688152 100644 --- a/tests/base_d_asa/test_asset_create.py +++ b/tests/base_d_asa/test_asset_create.py @@ -29,16 +29,16 @@ def test_pass_asset_create( state = base_d_asa_client.state.global_state # Roles - assert encode_address(state.arranger()) == arranger.address + assert encode_address(state.arranger) == arranger.address # Asset Configuration - assert not state.denomination_asset_id() - assert not state.settlement_asset_id() - assert not state.unit_value() - assert not state.day_count_convention() + assert not state.denomination_asset_id + assert not state.settlement_asset_id + assert not state.unit_value + assert not state.day_count_convention # Metadata - assert state.metadata() == TupleType( + assert state.metadata == TupleType( [ UintType(8), # Contract Type UintType(8), # Calendar @@ -63,24 +63,24 @@ def test_pass_asset_create( ) # Principal and Supply - assert not state.total_units() - assert not state.circulating_units() - assert not state.principal_discount() + assert not state.total_units + assert not state.circulating_units + assert not state.principal_discount # Coupons - assert not state.total_coupons() + assert not state.total_coupons # Time Schedule - assert not state.primary_distribution_opening_date() - assert not state.primary_distribution_closure_date() - assert not state.issuance_date() - assert not state.secondary_market_opening_date() - assert not state.secondary_market_closure_date() - assert not state.maturity_date() + assert not state.primary_distribution_opening_date + assert not state.primary_distribution_closure_date + assert not state.issuance_date + assert not state.secondary_market_opening_date + assert not state.secondary_market_closure_date + assert not state.maturity_date # Status - assert state.status() == sc_cfg.STATUS_EMPTY - assert not state.suspended() + assert state.status == sc_cfg.STATUS_EMPTY + assert not state.suspended def test_fail_invalid_state_schema() -> None: diff --git a/tests/base_d_asa/test_asset_update.py b/tests/base_d_asa/test_asset_update.py index 37f0408..614041a 100644 --- a/tests/base_d_asa/test_asset_update.py +++ b/tests/base_d_asa/test_asset_update.py @@ -5,6 +5,7 @@ from smart_contracts import errors as err from smart_contracts.artifacts.base_d_asa.base_d_asa_client import ( AssetMetadata, + AssetUpdateArgs, BaseDAsaClient, CommonAppCallParams, ) @@ -25,7 +26,9 @@ def test_pass_update( prospectus_hash=bytes(32), prospectus_url="Updated Prospectus", ) - base_d_asa_client_active.send.asset_update(metadata=updated_metadata) + base_d_asa_client_active.send.update.asset_update( + args=AssetUpdateArgs(metadata=updated_metadata) + ) metadata = base_d_asa_client_active.send.get_asset_metadata().abi_return assert metadata.prospectus_url == updated_metadata.prospectus_url @@ -36,9 +39,8 @@ def test_fail_unauthorized( base_d_asa_client_active: BaseDAsaClient, ) -> None: with pytest.raises(LogicError, match=err.UNAUTHORIZED): - base_d_asa_client_active.send.asset_update( - metadata=asset_metadata, - transaction_parameters=CommonAppCallParams( - sender=oscar.address, signer=oscar.signer - ), + base_d_asa_client_active.send.update.asset_update( + args=AssetUpdateArgs(metadata=asset_metadata), + params=CommonAppCallParams(sender=oscar.address, signer=oscar.signer), + compilation_params={}, ) diff --git a/tests/base_d_asa/test_get_time_events.py b/tests/base_d_asa/test_get_time_events.py index d0cde00..e062aec 100644 --- a/tests/base_d_asa/test_get_time_events.py +++ b/tests/base_d_asa/test_get_time_events.py @@ -1,6 +1,3 @@ -from algokit_utils import OnCompleteCallParameters - -from smart_contracts import constants as sc_cst from smart_contracts.artifacts.base_d_asa.base_d_asa_client import BaseDAsaClient from tests.utils import DAsaConfig @@ -8,18 +5,10 @@ def test_pass_get_time_events( base_d_asa_cfg: DAsaConfig, base_d_asa_client_active: BaseDAsaClient ) -> None: - time_events = base_d_asa_client_active.get_time_events( - transaction_parameters=OnCompleteCallParameters( - boxes=[(base_d_asa_client_active.app_id, sc_cst.BOX_ID_TIME_EVENTS)] - ) - ).return_value + time_events = base_d_asa_client_active.send.get_time_events().abi_return assert time_events == base_d_asa_cfg.time_events def test_pass_not_configured(base_d_asa_client_empty: BaseDAsaClient) -> None: - time_events = base_d_asa_client_empty.get_time_events( - transaction_parameters=OnCompleteCallParameters( - boxes=[(base_d_asa_client_empty.app_id, sc_cst.BOX_ID_TIME_EVENTS)] - ) - ).return_value + time_events = base_d_asa_client_empty.send.get_time_events().abi_return assert not time_events diff --git a/tests/base_d_asa/test_open_account.py b/tests/base_d_asa/test_open_account.py index 2349b04..e2555a4 100644 --- a/tests/base_d_asa/test_open_account.py +++ b/tests/base_d_asa/test_open_account.py @@ -2,14 +2,19 @@ import pytest from algokit_utils import ( + AlgoAmount, AlgorandClient, LogicError, - OnCompleteCallParameters, SigningAccount, ) from smart_contracts import errors as err -from smart_contracts.artifacts.base_d_asa.base_d_asa_client import BaseDAsaClient +from smart_contracts.artifacts.base_d_asa.base_d_asa_client import ( + BaseDAsaClient, + CommonAppCallParams, + GetAccountInfoArgs, + OpenAccountArgs, +) from tests.utils import DAsaAccount, DAsaAccountManager ACCOUNT_TEST_UNITS: Final[int] = 7 @@ -23,32 +28,26 @@ def test_pass_open_account( holding = algorand.account.random() payment = algorand.account.random() - base_d_asa_client_empty.open_account( - holding_address=holding.address, - payment_address=payment.address, - transaction_parameters=OnCompleteCallParameters( + base_d_asa_client_empty.send.open_account( + args=OpenAccountArgs( + holding_address=holding.address, + payment_address=payment.address, + ), + params=CommonAppCallParams( + sender=account_manager.address, signer=account_manager.signer, - boxes=[ - (base_d_asa_client_empty.app_id, account_manager.box_id), - ( - base_d_asa_client_empty.app_id, - DAsaAccount.box_id_from_address(holding.address), - ), - ], + static_fee=AlgoAmount.from_algo(1), ), ) - d_asa_account_info = base_d_asa_client_empty.get_account_info( - holding_address=holding.address, - transaction_parameters=OnCompleteCallParameters( - boxes=[ - ( - base_d_asa_client_empty.app_id, - DAsaAccount.box_id_from_address(holding.address), - ) - ] + d_asa_account_info = base_d_asa_client_empty.send.get_account_info( + args=GetAccountInfoArgs( + holding_address=holding.address, ), - ).return_value + params=CommonAppCallParams( + signer=account_manager.signer, + ), + ).abi_return assert d_asa_account_info.payment_address == payment.address assert d_asa_account_info.units == 0 @@ -66,21 +65,10 @@ def test_fail_unauthorized_caller( payment = algorand.account.random() with pytest.raises(LogicError, match=err.UNAUTHORIZED): - base_d_asa_client_empty.open_account( - holding_address=holding.address, - payment_address=payment.address, - transaction_parameters=OnCompleteCallParameters( - signer=oscar.signer, - boxes=[ - ( - base_d_asa_client_empty.app_id, - DAsaAccountManager.box_id_from_address(oscar.address), - ), - ( - base_d_asa_client_empty.app_id, - DAsaAccount.box_id_from_address(holding.address), - ), - ], + base_d_asa_client_empty.send.open_account( + args=(holding.address, payment.address), + params=CommonAppCallParams( + sender=oscar.address, ), ) @@ -102,18 +90,10 @@ def test_fail_suspended( payment = algorand.account.random() with pytest.raises(LogicError, match=err.SUSPENDED): - base_d_asa_client_suspended.open_account( - holding_address=holding.address, - payment_address=payment.address, - transaction_parameters=OnCompleteCallParameters( - signer=account_manager.signer, - boxes=[ - (base_d_asa_client_suspended.app_id, account_manager.box_id), - ( - base_d_asa_client_suspended.app_id, - DAsaAccount.box_id_from_address(holding.address), - ), - ], + base_d_asa_client_suspended.send.open_account( + args=(holding.address, payment.address), + params=CommonAppCallParams( + sender=account_manager.address, ), ) @@ -124,14 +104,9 @@ def test_fail_invalid_holding_address( account_a: DAsaAccount, ) -> None: with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): - base_d_asa_client_empty.open_account( - holding_address=account_a.holding_address, - payment_address=account_a.payment_address, - transaction_parameters=OnCompleteCallParameters( - signer=account_manager.signer, - boxes=[ - (base_d_asa_client_empty.app_id, account_manager.box_id), - (base_d_asa_client_empty.app_id, account_a.box_id), - ], + base_d_asa_client_empty.send.open_account( + args=(account_a.holding_address, account_a.payment_address), + params=CommonAppCallParams( + sender=account_manager.address, ), ) From a79f5a5b8cbeaaa0cac9cbec4fbeb5429b3f55cc Mon Sep 17 00:00:00 2001 From: Altynbek Orumbayev Date: Fri, 31 Jan 2025 14:37:29 +0100 Subject: [PATCH 2/3] chore: remove temporary artifacts --- .../base_d_asa/BaseDAsa.approval.puya.map | 13963 ---------------- .../base_d_asa/BaseDAsa.approval.teal | 2857 ---- .../base_d_asa/BaseDAsa.arc32.json | 756 - .../base_d_asa/BaseDAsa.clear.puya.map | 25 - .../base_d_asa/BaseDAsa.clear.teal | 7 - 5 files changed, 17608 deletions(-) delete mode 100644 smart_contracts/base_d_asa/BaseDAsa.approval.puya.map delete mode 100644 smart_contracts/base_d_asa/BaseDAsa.approval.teal delete mode 100644 smart_contracts/base_d_asa/BaseDAsa.arc32.json delete mode 100644 smart_contracts/base_d_asa/BaseDAsa.clear.puya.map delete mode 100644 smart_contracts/base_d_asa/BaseDAsa.clear.teal diff --git a/smart_contracts/base_d_asa/BaseDAsa.approval.puya.map b/smart_contracts/base_d_asa/BaseDAsa.approval.puya.map deleted file mode 100644 index c84c203..0000000 --- a/smart_contracts/base_d_asa/BaseDAsa.approval.puya.map +++ /dev/null @@ -1,13963 +0,0 @@ -{ - "version": 3, - "sources": [ - "contract.py" - ], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCmD;;AAAf;;AAA5B;AAkBA;;AAA6B;AAA7B;AACA;;AAA2B;AAA3B;AACA;;AAAkB;AAAlB;AACA;;AAA4B;AAA5B;AAGA;;AAAgB;;AAAhB;AAGA;;AAAmB;AAAnB;AACA;AAAyB;AAAzB;AAGA;;AAA0B;AAA1B;AAGA;;AAAqB;AAArB;AAIA;;AAAqB;AAArB;AAKA;;AAAyC;AAAzC;AACA;;AAAyC;AAAzC;AACA;;AAAqB;AAArB;AACA;;AAAqC;AAArC;AACA;;AAAqC;AAArC;AACA;AAAqB;AAArB;AAGA;AAAc;AAAd;AACA;;AAAiB;AAAjB;AACA;;AAAiB;AAAjB;AAnER;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AAw7BK;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAbA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAbA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAjBA;;AAAA;AAAA;AAAA;;AAAA;AA74BL;;;AA64BK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAvCA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAdA;;AAAA;AAAA;AAAA;;AAAA;AAx1BL;;;AAw1BK;;;AAAA;;AAvBA;;AAAA;AAAA;AAAA;;AAAA;AAj0BL;;;AAAA;;;AAi0BK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAlBA;;AAAA;AAAA;AAAA;;AAAA;AA/yBL;;;AA+yBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA1CA;;AAAA;AAAA;AAAA;;AAAA;AArwBL;;;AAAA;;;AAqwBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA9BA;;AAAA;AAAA;AAAA;;AAAA;AAvuBL;;;AAuuBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAnCA;;AAAA;AAAA;AAAA;;AAAA;AApsBL;;;AAAA;;;AAosBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAhDA;;AAAA;AAAA;AAAA;;AAAA;AAppBL;;;AAAA;;;AAopBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA/DA;;AAAA;AAAA;AAAA;;AAAA;AArlBL;;;AAAA;;;AAAA;;;AAqlBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAxDA;;AAAA;AAAA;AAAA;;AAAA;AA7hBL;;;AA6hBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AArFA;;AAAA;AAAA;AAAA;;AAAA;AAxcL;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAwcK;;;AAAA;;AAXA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AA7bL;;;AA6bK;;;AAAA;;AAZA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAjbL;;;AAAA;;;AAibK;;;AAAA;;AAAL;;;AASQ;;AAAA;;AAAA;AACA;;AAAA;;AAAA;;AAER;;;AAQQ;;;AACA;;AAAA;;AAAA;;AA5WR;;;AAEe;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAP;;AA4WR;;;;;;;;AA2CQ;;;AACO;AAAA;AAAA;AAAA;AAAA;AAAP;AAG+B;;AAAA;AAAA;AA/V3B;;;AAAuC;;AAAA;;AAAA;AAAA;;AAAA;AAAvC;;;;AADJ;AAMA;;AAAA;;AAAA;AA8V6B;;AAAA;AAxVF;AAAA;;AAAA;AAAA;AAAvB;;AAAA;AADJ;AAMA;;AAAA;AAAA;AAEA;AAIQ;;AAHO;AAAA;;AAAA;AAAA;AACI;;AACF;;;;;;;AAHjB;;;;;AAAA;AAsVI;;AAAA;AAAmB;;AAAA;AAAnB;AAAA;AAAA;AADJ;AAGA;;AAAA;;AAAA;AACmB;AAAnB;;AAAA;AAAA;AAC0B;;AAAA;AAA1B;;AAAA;AAAA;AAGiC;;AAAA;AAAA;AAAA;;AAnV1B;;;AAAA;;AAEH;;;AAFG;AAAA;;;;AAAP;AAOA;;AAAA;;AAAA;AAgV0B;;AAAA;AAAA;;AA3UnB;AAAA;;AAAA;AAAA;AAAf;;;AACY;;AAAA;AAIJ;;AAAA;;AAAA;AAIW;;AAAA;AAAA;AAAJ;AAAA;AAAP;AAIA;;AAAA;AAAA;AACG;AAAA;;AAAA;AAAA;AAAX;;;AACY;;AAAA;;AAAA;;AAAA;;AAAA;AAKA;;AAAA;AAAA;AAAsB;AAAA;;AAAA;AAAA;AAAqB;AAArB;AAAtB;AADJ;AAiUA;;AAAA;;;AAAA;;AAvSA;;AAAA;;AAAA;;AAAA;;AAAA;AACyC;;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAzC;;AAAA;AAAA;AAGyC;AAAA;;;AAAA;AAAzC;;AAAA;AAAA;AAGqB;;;AAAA;AAArB;;AAAA;AAAA;AAGG;;AAAA;AAAA;AAAA;AAAA;;AAAsB;AAAA;;AAAA;AAAA;AAAqB;AAArB;AAAtB;AAAX;;;AACiC;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAArB;AAAA;AAAA;AAIO;;AAAA;AAAA;AAAJ;AAAP;AA+RA;AAAc;;AAAd;;;;;;;;;;AApUR;;;;;;AAGY;;AAAA;;;AAAA;AAAA;;;AAAA;AACE;;AADF;AADJ;AAIiB;;AAAA;AAAA;AAAqB;AAArB;AAAP;AAAA;;AAAA;;AAAA;AAAlB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKqB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAT;AAAA;;AAAA;;AAC0B;AAAL;AAAA;AAAA;;AAAZ;AAAA;AAAA;AAAA;AAAA;AAAT;AAAA;;AACO;AAAP;AACG;AAAA;;AAAA;AAAA;AAA6B;;;AAA7B;AAAf;;;AAEwB;;AAAA;;AAAA;AAAmB;;;;AAApB;AAAA;AAAP;;;;;;;;;AAsThB;;;;AAqBQ;;;AAleO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAmeA;AAAP;AACA;;;AAEO;;AAAA;AAAA;AAAP;AAAA;AACyC;AAAtC;;;;AAAX;;;AACY;;AAAA;;;;AAAA;;;;;;;;AAEA;AAAA;;AAAA;AAAA;AACG;;AAAA;;;AAAA;AAAA;;AAAA;;;AAAA;AADH;AAAA;;AAAA;AADJ;AAMA;;AAAA;AAAA;AAGG;AAAA;AAAA;AAAA;AAAX;;;AAEgB;AAAA;AAAA;AAAA;AAEI;;AAAA;AAAA;AADD;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AADH;AAAA;;AAAA;AADJ;AAMA;;AAAA;AAAA;AAKI;AAAA;;AAAA;AAAA;AAD0B;AAI1B;AAAA;;AAAA;AAAA;AAD0B;AAJ3B;AAAP;;AAAA;AA1fR;;;AAEmB;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAigBR;;;AAqBQ;;;AACA;;;AACO;;AAAA;AAAA;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;;AAAP;AASS;;;;;;;;AADT;;AAAA;;;;;;;;;;;;;;AA6BQ;AANwB;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AADJ;AAII;;AAAA;;;AADJ;AAKW;;AAAZ;AAAP;AAAA;AAXmC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACyD;;AAAA;;;AAAzD;;;;AAJ2B;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACuD;;AAAA;;;AAAvD;;;;AAN2B;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAEI;;AAAA;;;AADJ;;;;AAPwB;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AADJ;AAII;;AAAA;;;AADJ;;;;AALA;;AAAA;;AAAA;;;;;;;;AA8BhB;;;AAkBQ;;;AACA;;;AACO;;AAAA;AAAA;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;;AAAP;AASS;;;;;;;AAFT;;AAAA;;;;;;;;;;;;AAkBQ;AAHuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAGW;;AAAZ;AAAP;AAAA;AAP+B;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAJuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAJuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAJuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;;;;;AAiBhB;;;AAoBQ;;;AAxoBO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAyoBA;AAAP;AACA;;;AACA;;;AAC8B;;AAAvB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAEgC;;AAEtB;;AAFsB;AAGjB;;AAHiB;AAIf;;AAJe;AAKlB;;;AALkB;AAAhC;AAOmB;;AAAZ;AAAP;AAvoBR;;;;AAIsB;;AAFQ;;AAElB;AAAA;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;;;;;;AAXR;;;AAEmB;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AA+oBR;;;AAkBQ;;;AACA;;;AAxmB0B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AA2mBe;AAAA;AAAA;AAAA;;;AAAA;AAAf;AAAA;;AACA;;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA7aG;AAAA;AAAA;AAAA;AAAX;;;AACY;AAAc;;AAAd;AA+aC;;AAAA;AAAuC;;AAAZ;AADzB;AAAP;AAAA;AAIR;;;;;;;AAzrBe;AAAA;AAAA;AAAA;AAAe;;AAAf;AAyLH;;;AACI;AAAA;;AAAA;AAAA;AACD;;AAAA;AAAA;;AADC;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AADC;;AAAA;AADC;;;;AAFR;AAxJc;;AAFQ;;AAElB;AAAA;AAAA;;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;AAuC0B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AA+oBA;;;AACA;;;AACO;;AAAA;AAAP;AAAA;AAEI;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAyC;AAAA;;AAAA;AAAA;AAAzC;AADJ;AAIA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAEI;;AAAA;AAAA;AAAA;;;AAAA;AAAA;AADkC;AAAtC;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAGuD;AAAA;;AAAA;AAAA;AAAZ;AAA3C;;AAAA;AAAA;AAAA;AAAA;;AAAA;AACmB;AAAA;;AAAA;AAAA;AAAmB;AAAA;AAAA;AAAA;AAAnB;AAAZ;AAAP;;AAAA;;;;;;;;;AAER;;;AAcQ;;;AACiB;;;AAAO;AAAxB;;AAAA;AAAA;AACmB;;AAAZ;AAAP;AAnsBR;;;;AAIsB;;AAFQ;;AAElB;AAAA;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;;;;;;AAksBR;;;AAkBQ;;;AAjsB0B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAmsBA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AACmB;;AAAZ;AAAP;AAER;;;;AAluBsB;;AAFQ;;AAElB;AAAA;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;AA+uBiB;;;AAAO;AAAxB;;AAAA;AAAA;;;;;;AAER;;;AAUsB;AAAd;AACG;;AAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAA1B;AAAA;;;;;;;AAAA;;AAAA;;;AACe;;;;;;;AAEf;AAAA;;AAAA;AAAA;AAAX;;;AAC0B;;AAAd;;AAGkC;AAAA;;AAAA;AAAA;AAAZ;AACU;AAAA;;AAAA;AAAA;AAAZ;AAjkBjB;AAAA;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;AAkkBmB;AACC;AAAA;;AAAA;AAAA;AAAZ;AACqB;AAAA;;AAAA;AAAA;AAAX;AAAA;;;AACU;AAAA;;AAAA;AAAA;AAAZ;AAAA;;;AACO;AAAA;;AAAA;AAAA;AAAZ;AAAA;;;AACW;AAAA;;AAAA;AAAA;AAAZ;AACkB;AAAA;AAAA;AAAA;AAAZ;AAEf;AAAA;;AAAA;AAAA;AAD8B;AAI9B;AAAA;;AAAA;AAAA;AAD8B;AAGR;AAAA;;AAAA;AAAA;AAAZ;AACY;AAAA;AAAA;AAAA;AAAZ;AACW;AAAA;;AAAA;AAAA;AAAf;;;AAAA;AAAA;;AAAA;AACE;;AAAA;AAAA;;;AAnBT;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAP;;AAAA;AAsBR;;;AA3vBkC;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AA0wBO;AAAA;AAAP;AAER;;;AAQsB;;;;AA11BP;AAAA;AAAA;AAAA;AAAe;;AAAf;AA21Bf;;;AAC0B;;AAAA;AAAA;AAAA;;AAAA;AAClB;;AAAA;AAAA;AAER;;;AASwB;AAAA;;AAAA;AAAA;AAAZ;AACY;AAAA;;AAAA;AAAA;AAAZ;AAFG;AAAA;;;;AAAA;AAAA;AAAP;AAKR;;;AAS4C;AAAA;;AAAA;AAAA;AAApC", - "op_pc_offset": 0, - "pc_events": { - "1": { - "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.__algopy_entrypoint_with_init", - "params": {}, - "block": "main", - "stack_in": [], - "op": "intcblock 0 1 8 4 200" - }, - "9": { - "op": "bytecblock 0x151f7c75 \"circulating_units\" \"status\" \"maturity_date\" \"unit_value\" \"total_units\" \"total_coupons\" 0x52333023 0x52323023 \"denomination_asset_id\" \"settlement_asset_id\" \"day_count_convention\" \"metadata\" \"principal_discount\" \"primary_distribution_opening_date\" \"primary_distribution_closure_date\" \"issuance_date\" \"secondary_market_opening_date\" \"secondary_market_closure_date\" \"suspended\" \"defaulted\" \"interest_rate\" 0x74696d654576656e7473 0x52373023 0x52363023 0x52353023 0x52343023 0x0000000000000000 0x636f75706f6e5261746573 0x068101 0x52383023" - }, - "430": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "432": { - "op": "bnz main_after_if_else@2", - "stack_out": [] - }, - "435": { - "op": "bytec 8 // 0x52323023" - }, - "437": { - "op": "global ZeroAddress" - }, - "439": { - "op": "app_global_put" - }, - "440": { - "op": "bytec 9 // \"denomination_asset_id\"" - }, - "442": { - "op": "intc_0 // 0" - }, - "443": { - "op": "app_global_put" - }, - "444": { - "op": "bytec 10 // \"settlement_asset_id\"" - }, - "446": { - "op": "intc_0 // 0" - }, - "447": { - "op": "app_global_put" - }, - "448": { - "op": "bytec 4 // \"unit_value\"" - }, - "450": { - "op": "intc_0 // 0" - }, - "451": { - "op": "app_global_put" - }, - "452": { - "op": "bytec 11 // \"day_count_convention\"" - }, - "454": { - "op": "intc_0 // 0" - }, - "455": { - "op": "app_global_put" - }, - "456": { - "op": "bytec 12 // \"metadata\"" - }, - "458": { - "op": "pushbytes 0x" - }, - "460": { - "op": "app_global_put" - }, - "461": { - "op": "bytec 5 // \"total_units\"" - }, - "463": { - "op": "intc_0 // 0" - }, - "464": { - "op": "app_global_put" - }, - "465": { - "op": "bytec_1 // \"circulating_units\"" - }, - "466": { - "op": "intc_0 // 0" - }, - "467": { - "op": "app_global_put" - }, - "468": { - "op": "bytec 13 // \"principal_discount\"" - }, - "470": { - "op": "intc_0 // 0" - }, - "471": { - "op": "app_global_put" - }, - "472": { - "op": "bytec 21 // \"interest_rate\"" - }, - "474": { - "op": "intc_0 // 0" - }, - "475": { - "op": "app_global_put" - }, - "476": { - "op": "bytec 6 // \"total_coupons\"" - }, - "478": { - "op": "intc_0 // 0" - }, - "479": { - "op": "app_global_put" - }, - "480": { - "op": "bytec 14 // \"primary_distribution_opening_date\"" - }, - "482": { - "op": "intc_0 // 0" - }, - "483": { - "op": "app_global_put" - }, - "484": { - "op": "bytec 15 // \"primary_distribution_closure_date\"" - }, - "486": { - "op": "intc_0 // 0" - }, - "487": { - "op": "app_global_put" - }, - "488": { - "op": "bytec 16 // \"issuance_date\"" - }, - "490": { - "op": "intc_0 // 0" - }, - "491": { - "op": "app_global_put" - }, - "492": { - "op": "bytec 17 // \"secondary_market_opening_date\"" - }, - "494": { - "op": "intc_0 // 0" - }, - "495": { - "op": "app_global_put" - }, - "496": { - "op": "bytec 18 // \"secondary_market_closure_date\"" - }, - "498": { - "op": "intc_0 // 0" - }, - "499": { - "op": "app_global_put" - }, - "500": { - "op": "bytec_3 // \"maturity_date\"" - }, - "501": { - "op": "intc_0 // 0" - }, - "502": { - "op": "app_global_put" - }, - "503": { - "op": "bytec_2 // \"status\"" - }, - "504": { - "op": "intc_0 // 0" - }, - "505": { - "op": "app_global_put" - }, - "506": { - "op": "bytec 19 // \"suspended\"" - }, - "508": { - "op": "intc_0 // 0" - }, - "509": { - "op": "app_global_put" - }, - "510": { - "op": "bytec 20 // \"defaulted\"" - }, - "512": { - "op": "intc_0 // 0" - }, - "513": { - "op": "app_global_put" - }, - "514": { - "block": "main_after_if_else@2", - "stack_in": [], - "op": "txn NumAppArgs", - "defined_out": [ - "tmp%0#2" - ], - "stack_out": [ - "tmp%0#2" - ] - }, - "516": { - "op": "bz main_after_if_else@22", - "stack_out": [] - }, - "519": { - "op": "pushbytess 0x3f0efc6c 0x25dba95b 0x89474134 0x1d6fc255 0xfef74567 0xb8fc1390 0x3d43d1f0 0xebd96b2f 0x6c85e3ee 0xf63ace8d 0xbbcca18a 0x1a7babb4 0x402dba47 0xed02759f 0xfad2173e 0x08efea35 0xe4a5ab54 // method \"asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void\", method \"asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void\", method \"asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void\", method \"set_secondary_time_events(uint64[])(uint64,uint64)\", method \"assign_role(address,uint8,byte[])uint64\", method \"revoke_role(address,uint8)uint64\", method \"open_account(address,address)uint64\", method \"close_account(address)(uint64,uint64)\", method \"primary_distribution(address,uint64)uint64\", method \"set_asset_suspension(bool)uint64\", method \"set_account_suspension(address,bool)uint64\", method \"set_default_status(bool)void\", method \"get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)\", method \"get_account_info(address)(address,uint64,uint64,uint64,bool)\", method \"get_time_events()uint64[]\", method \"get_secondary_market_schedule()uint64[]\", method \"get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)\"" - }, - "606": { - "op": "txna ApplicationArgs 0" - }, - "609": { - "op": "match main_asset_create_route@5 main_asset_update_route@6 main_asset_config_route@7 main_set_secondary_time_events_route@8 main_assign_role_route@9 main_revoke_role_route@10 main_open_account_route@11 main_close_account_route@12 main_primary_distribution_route@13 main_set_asset_suspension_route@14 main_set_account_suspension_route@15 main_set_default_status_route@16 main_get_asset_info_route@17 main_get_account_info_route@18 main_get_time_events_route@19 main_get_secondary_market_schedule_route@20 main_get_asset_metadata_route@21" - }, - "645": { - "block": "main_after_if_else@22", - "stack_in": [], - "op": "intc_0 // 0", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "646": { - "op": "return" - }, - "647": { - "block": "main_get_asset_metadata_route@21", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%120#0" - ], - "stack_out": [ - "tmp%120#0" - ] - }, - "649": { - "op": "!", - "defined_out": [ - "tmp%121#0" - ], - "stack_out": [ - "tmp%121#0" - ] - }, - "650": { - "error": "OnCompletion is not NoOp", - "op": "assert // OnCompletion is not NoOp", - "stack_out": [] - }, - "651": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%122#0" - ], - "stack_out": [ - "tmp%122#0" - ] - }, - "653": { - "error": "can only call when not creating", - "op": "assert // can only call when not creating", - "stack_out": [] - }, - "654": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.get_asset_metadata", - "op": "callsub get_asset_metadata", - "defined_out": [ - "tmp%124#0" - ], - "stack_out": [ - "tmp%124#0" - ] - }, - "657": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "tmp%124#0" - ], - "stack_out": [ - "tmp%124#0", - "0x151f7c75" - ] - }, - "658": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "tmp%124#0" - ] - }, - "659": { - "op": "concat", - "defined_out": [ - "tmp%125#0" - ], - "stack_out": [ - "tmp%125#0" - ] - }, - "660": { - "op": "log", - "stack_out": [] - }, - "661": { - "op": "intc_1 // 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "662": { - "op": "return" - }, - "663": { - "block": "main_get_secondary_market_schedule_route@20", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%114#0" - ], - "stack_out": [ - "tmp%114#0" - ] - }, - "665": { - "op": "!", - "defined_out": [ - "tmp%115#0" - ], - "stack_out": [ - "tmp%115#0" - ] - }, - "666": { - "error": "OnCompletion is not NoOp", - "op": "assert // OnCompletion is not NoOp", - "stack_out": [] - }, - "667": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%116#0" - ], - "stack_out": [ - "tmp%116#0" - ] - }, - "669": { - "error": "can only call when not creating", - "op": "assert // can only call when not creating", - "stack_out": [] - }, - "670": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.get_secondary_market_schedule", - "op": "callsub get_secondary_market_schedule", - "defined_out": [ - "tmp%118#0" - ], - "stack_out": [ - "tmp%118#0" - ] - }, - "673": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "tmp%118#0" - ], - "stack_out": [ - "tmp%118#0", - "0x151f7c75" - ] - }, - "674": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "tmp%118#0" - ] - }, - "675": { - "op": "concat", - "defined_out": [ - "tmp%119#0" - ], - "stack_out": [ - "tmp%119#0" - ] - }, - "676": { - "op": "log", - "stack_out": [] - }, - "677": { - "op": "intc_1 // 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "678": { - "op": "return" - }, - "679": { - "block": "main_get_time_events_route@19", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%108#0" - ], - "stack_out": [ - "tmp%108#0" - ] - }, - "681": { - "op": "!", - "defined_out": [ - "tmp%109#0" - ], - "stack_out": [ - "tmp%109#0" - ] - }, - "682": { - "error": "OnCompletion is not NoOp", - "op": "assert // OnCompletion is not NoOp", - "stack_out": [] - }, - "683": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%110#0" - ], - "stack_out": [ - "tmp%110#0" - ] - }, - "685": { - "error": "can only call when not creating", - "op": "assert // can only call when not creating", - "stack_out": [] - }, - "686": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.get_time_events", - "op": "callsub get_time_events", - "defined_out": [ - "tmp%112#0" - ], - "stack_out": [ - "tmp%112#0" - ] - }, - "689": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "tmp%112#0" - ], - "stack_out": [ - "tmp%112#0", - "0x151f7c75" - ] - }, - "690": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "tmp%112#0" - ] - }, - "691": { - "op": "concat", - "defined_out": [ - "tmp%113#0" - ], - "stack_out": [ - "tmp%113#0" - ] - }, - "692": { - "op": "log", - "stack_out": [] - }, - "693": { - "op": "intc_1 // 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "694": { - "op": "return" - }, - "695": { - "block": "main_get_account_info_route@18", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%101#0" - ], - "stack_out": [ - "tmp%101#0" - ] - }, - "697": { - "op": "!", - "defined_out": [ - "tmp%102#0" - ], - "stack_out": [ - "tmp%102#0" - ] - }, - "698": { - "error": "OnCompletion is not NoOp", - "op": "assert // OnCompletion is not NoOp", - "stack_out": [] - }, - "699": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%103#0" - ], - "stack_out": [ - "tmp%103#0" - ] - }, - "701": { - "error": "can only call when not creating", - "op": "assert // can only call when not creating", - "stack_out": [] - }, - "702": { - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%105#0" - ], - "stack_out": [ - "tmp%105#0" - ] - }, - "705": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.get_account_info", - "op": "callsub get_account_info", - "defined_out": [ - "tmp%106#0" - ], - "stack_out": [ - "tmp%106#0" - ] - }, - "708": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "tmp%106#0" - ], - "stack_out": [ - "tmp%106#0", - "0x151f7c75" - ] - }, - "709": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "tmp%106#0" - ] - }, - "710": { - "op": "concat", - "defined_out": [ - "tmp%107#0" - ], - "stack_out": [ - "tmp%107#0" - ] - }, - "711": { - "op": "log", - "stack_out": [] - }, - "712": { - "op": "intc_1 // 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "713": { - "op": "return" - }, - "714": { - "block": "main_get_asset_info_route@17", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%95#0" - ], - "stack_out": [ - "tmp%95#0" - ] - }, - "716": { - "op": "!", - "defined_out": [ - "tmp%96#0" - ], - "stack_out": [ - "tmp%96#0" - ] - }, - "717": { - "error": "OnCompletion is not NoOp", - "op": "assert // OnCompletion is not NoOp", - "stack_out": [] - }, - "718": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%97#0" - ], - "stack_out": [ - "tmp%97#0" - ] - }, - "720": { - "error": "can only call when not creating", - "op": "assert // can only call when not creating", - "stack_out": [] - }, - "721": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.get_asset_info", - "op": "callsub get_asset_info", - "defined_out": [ - "tmp%99#0" - ], - "stack_out": [ - "tmp%99#0" - ] - }, - "724": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "tmp%99#0" - ], - "stack_out": [ - "tmp%99#0", - "0x151f7c75" - ] - }, - "725": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "tmp%99#0" - ] - }, - "726": { - "op": "concat", - "defined_out": [ - "tmp%100#0" - ], - "stack_out": [ - "tmp%100#0" - ] - }, - "727": { - "op": "log", - "stack_out": [] - }, - "728": { - "op": "intc_1 // 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "729": { - "op": "return" - }, - "730": { - "block": "main_set_default_status_route@16", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%90#0" - ], - "stack_out": [ - "tmp%90#0" - ] - }, - "732": { - "op": "!", - "defined_out": [ - "tmp%91#0" - ], - "stack_out": [ - "tmp%91#0" - ] - }, - "733": { - "error": "OnCompletion is not NoOp", - "op": "assert // OnCompletion is not NoOp", - "stack_out": [] - }, - "734": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%92#0" - ], - "stack_out": [ - "tmp%92#0" - ] - }, - "736": { - "error": "can only call when not creating", - "op": "assert // can only call when not creating", - "stack_out": [] - }, - "737": { - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%94#0" - ], - "stack_out": [ - "tmp%94#0" - ] - }, - "740": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.set_default_status", - "op": "callsub set_default_status", - "stack_out": [] - }, - "743": { - "op": "intc_1 // 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "744": { - "op": "return" - }, - "745": { - "block": "main_set_account_suspension_route@15", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%82#0" - ], - "stack_out": [ - "tmp%82#0" - ] - }, - "747": { - "op": "!", - "defined_out": [ - "tmp%83#0" - ], - "stack_out": [ - "tmp%83#0" - ] - }, - "748": { - "error": "OnCompletion is not NoOp", - "op": "assert // OnCompletion is not NoOp", - "stack_out": [] - }, - "749": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%84#0" - ], - "stack_out": [ - "tmp%84#0" - ] - }, - "751": { - "error": "can only call when not creating", - "op": "assert // can only call when not creating", - "stack_out": [] - }, - "752": { - "op": "txna ApplicationArgs 1" - }, - "755": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "tmp%86#0", - "tmp%87#0" - ], - "stack_out": [ - "tmp%86#0", - "tmp%87#0" - ] - }, - "758": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.set_account_suspension", - "op": "callsub set_account_suspension", - "defined_out": [ - "tmp%88#0" - ], - "stack_out": [ - "tmp%88#0" - ] - }, - "761": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "tmp%88#0" - ], - "stack_out": [ - "tmp%88#0", - "0x151f7c75" - ] - }, - "762": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "tmp%88#0" - ] - }, - "763": { - "op": "concat", - "defined_out": [ - "tmp%89#0" - ], - "stack_out": [ - "tmp%89#0" - ] - }, - "764": { - "op": "log", - "stack_out": [] - }, - "765": { - "op": "intc_1 // 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "766": { - "op": "return" - }, - "767": { - "block": "main_set_asset_suspension_route@14", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%75#0" - ], - "stack_out": [ - "tmp%75#0" - ] - }, - "769": { - "op": "!", - "defined_out": [ - "tmp%76#0" - ], - "stack_out": [ - "tmp%76#0" - ] - }, - "770": { - "error": "OnCompletion is not NoOp", - "op": "assert // OnCompletion is not NoOp", - "stack_out": [] - }, - "771": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%77#0" - ], - "stack_out": [ - "tmp%77#0" - ] - }, - "773": { - "error": "can only call when not creating", - "op": "assert // can only call when not creating", - "stack_out": [] - }, - "774": { - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%79#0" - ], - "stack_out": [ - "tmp%79#0" - ] - }, - "777": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.set_asset_suspension", - "op": "callsub set_asset_suspension", - "defined_out": [ - "tmp%80#0" - ], - "stack_out": [ - "tmp%80#0" - ] - }, - "780": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "tmp%80#0" - ], - "stack_out": [ - "tmp%80#0", - "0x151f7c75" - ] - }, - "781": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "tmp%80#0" - ] - }, - "782": { - "op": "concat", - "defined_out": [ - "tmp%81#0" - ], - "stack_out": [ - "tmp%81#0" - ] - }, - "783": { - "op": "log", - "stack_out": [] - }, - "784": { - "op": "intc_1 // 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "785": { - "op": "return" - }, - "786": { - "block": "main_primary_distribution_route@13", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%67#0" - ], - "stack_out": [ - "tmp%67#0" - ] - }, - "788": { - "op": "!", - "defined_out": [ - "tmp%68#0" - ], - "stack_out": [ - "tmp%68#0" - ] - }, - "789": { - "error": "OnCompletion is not NoOp", - "op": "assert // OnCompletion is not NoOp", - "stack_out": [] - }, - "790": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%69#0" - ], - "stack_out": [ - "tmp%69#0" - ] - }, - "792": { - "error": "can only call when not creating", - "op": "assert // can only call when not creating", - "stack_out": [] - }, - "793": { - "op": "txna ApplicationArgs 1" - }, - "796": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "tmp%71#0", - "tmp%72#0" - ], - "stack_out": [ - "tmp%71#0", - "tmp%72#0" - ] - }, - "799": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.primary_distribution", - "op": "callsub primary_distribution", - "defined_out": [ - "tmp%73#0" - ], - "stack_out": [ - "tmp%73#0" - ] - }, - "802": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "tmp%73#0" - ], - "stack_out": [ - "tmp%73#0", - "0x151f7c75" - ] - }, - "803": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "tmp%73#0" - ] - }, - "804": { - "op": "concat", - "defined_out": [ - "tmp%74#0" - ], - "stack_out": [ - "tmp%74#0" - ] - }, - "805": { - "op": "log", - "stack_out": [] - }, - "806": { - "op": "intc_1 // 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "807": { - "op": "return" - }, - "808": { - "block": "main_close_account_route@12", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%60#0" - ], - "stack_out": [ - "tmp%60#0" - ] - }, - "810": { - "op": "!", - "defined_out": [ - "tmp%61#0" - ], - "stack_out": [ - "tmp%61#0" - ] - }, - "811": { - "error": "OnCompletion is not NoOp", - "op": "assert // OnCompletion is not NoOp", - "stack_out": [] - }, - "812": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%62#0" - ], - "stack_out": [ - "tmp%62#0" - ] - }, - "814": { - "error": "can only call when not creating", - "op": "assert // can only call when not creating", - "stack_out": [] - }, - "815": { - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%64#0" - ], - "stack_out": [ - "tmp%64#0" - ] - }, - "818": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.close_account", - "op": "callsub close_account", - "defined_out": [ - "tmp%65#0" - ], - "stack_out": [ - "tmp%65#0" - ] - }, - "821": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "tmp%65#0" - ], - "stack_out": [ - "tmp%65#0", - "0x151f7c75" - ] - }, - "822": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "tmp%65#0" - ] - }, - "823": { - "op": "concat", - "defined_out": [ - "tmp%66#0" - ], - "stack_out": [ - "tmp%66#0" - ] - }, - "824": { - "op": "log", - "stack_out": [] - }, - "825": { - "op": "intc_1 // 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "826": { - "op": "return" - }, - "827": { - "block": "main_open_account_route@11", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%52#0" - ], - "stack_out": [ - "tmp%52#0" - ] - }, - "829": { - "op": "!", - "defined_out": [ - "tmp%53#0" - ], - "stack_out": [ - "tmp%53#0" - ] - }, - "830": { - "error": "OnCompletion is not NoOp", - "op": "assert // OnCompletion is not NoOp", - "stack_out": [] - }, - "831": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%54#0" - ], - "stack_out": [ - "tmp%54#0" - ] - }, - "833": { - "error": "can only call when not creating", - "op": "assert // can only call when not creating", - "stack_out": [] - }, - "834": { - "op": "txna ApplicationArgs 1" - }, - "837": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "tmp%56#0", - "tmp%57#0" - ], - "stack_out": [ - "tmp%56#0", - "tmp%57#0" - ] - }, - "840": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.open_account", - "op": "callsub open_account", - "defined_out": [ - "tmp%58#0" - ], - "stack_out": [ - "tmp%58#0" - ] - }, - "843": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "tmp%58#0" - ], - "stack_out": [ - "tmp%58#0", - "0x151f7c75" - ] - }, - "844": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "tmp%58#0" - ] - }, - "845": { - "op": "concat", - "defined_out": [ - "tmp%59#0" - ], - "stack_out": [ - "tmp%59#0" - ] - }, - "846": { - "op": "log", - "stack_out": [] - }, - "847": { - "op": "intc_1 // 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "848": { - "op": "return" - }, - "849": { - "block": "main_revoke_role_route@10", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%44#0" - ], - "stack_out": [ - "tmp%44#0" - ] - }, - "851": { - "op": "!", - "defined_out": [ - "tmp%45#0" - ], - "stack_out": [ - "tmp%45#0" - ] - }, - "852": { - "error": "OnCompletion is not NoOp", - "op": "assert // OnCompletion is not NoOp", - "stack_out": [] - }, - "853": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%46#0" - ], - "stack_out": [ - "tmp%46#0" - ] - }, - "855": { - "error": "can only call when not creating", - "op": "assert // can only call when not creating", - "stack_out": [] - }, - "856": { - "op": "txna ApplicationArgs 1" - }, - "859": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "tmp%48#0", - "tmp%49#0" - ], - "stack_out": [ - "tmp%48#0", - "tmp%49#0" - ] - }, - "862": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.revoke_role", - "op": "callsub revoke_role", - "defined_out": [ - "tmp%50#0" - ], - "stack_out": [ - "tmp%50#0" - ] - }, - "865": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "tmp%50#0" - ], - "stack_out": [ - "tmp%50#0", - "0x151f7c75" - ] - }, - "866": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "tmp%50#0" - ] - }, - "867": { - "op": "concat", - "defined_out": [ - "tmp%51#0" - ], - "stack_out": [ - "tmp%51#0" - ] - }, - "868": { - "op": "log", - "stack_out": [] - }, - "869": { - "op": "intc_1 // 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "870": { - "op": "return" - }, - "871": { - "block": "main_assign_role_route@9", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%35#0" - ], - "stack_out": [ - "tmp%35#0" - ] - }, - "873": { - "op": "!", - "defined_out": [ - "tmp%36#0" - ], - "stack_out": [ - "tmp%36#0" - ] - }, - "874": { - "error": "OnCompletion is not NoOp", - "op": "assert // OnCompletion is not NoOp", - "stack_out": [] - }, - "875": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%37#0" - ], - "stack_out": [ - "tmp%37#0" - ] - }, - "877": { - "error": "can only call when not creating", - "op": "assert // can only call when not creating", - "stack_out": [] - }, - "878": { - "op": "txna ApplicationArgs 1" - }, - "881": { - "op": "txna ApplicationArgs 2" - }, - "884": { - "op": "txna ApplicationArgs 3", - "defined_out": [ - "tmp%39#0", - "tmp%40#0", - "tmp%41#0" - ], - "stack_out": [ - "tmp%39#0", - "tmp%40#0", - "tmp%41#0" - ] - }, - "887": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assign_role", - "op": "callsub assign_role", - "defined_out": [ - "tmp%42#0" - ], - "stack_out": [ - "tmp%42#0" - ] - }, - "890": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "tmp%42#0" - ], - "stack_out": [ - "tmp%42#0", - "0x151f7c75" - ] - }, - "891": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "tmp%42#0" - ] - }, - "892": { - "op": "concat", - "defined_out": [ - "tmp%43#0" - ], - "stack_out": [ - "tmp%43#0" - ] - }, - "893": { - "op": "log", - "stack_out": [] - }, - "894": { - "op": "intc_1 // 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "895": { - "op": "return" - }, - "896": { - "block": "main_set_secondary_time_events_route@8", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%28#0" - ], - "stack_out": [ - "tmp%28#0" - ] - }, - "898": { - "op": "!", - "defined_out": [ - "tmp%29#0" - ], - "stack_out": [ - "tmp%29#0" - ] - }, - "899": { - "error": "OnCompletion is not NoOp", - "op": "assert // OnCompletion is not NoOp", - "stack_out": [] - }, - "900": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%30#0" - ], - "stack_out": [ - "tmp%30#0" - ] - }, - "902": { - "error": "can only call when not creating", - "op": "assert // can only call when not creating", - "stack_out": [] - }, - "903": { - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%32#0" - ], - "stack_out": [ - "tmp%32#0" - ] - }, - "906": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.set_secondary_time_events", - "op": "callsub set_secondary_time_events", - "defined_out": [ - "tmp%33#0" - ], - "stack_out": [ - "tmp%33#0" - ] - }, - "909": { - "op": "bytec_0 // 0x151f7c75", - "defined_out": [ - "0x151f7c75", - "tmp%33#0" - ], - "stack_out": [ - "tmp%33#0", - "0x151f7c75" - ] - }, - "910": { - "op": "swap", - "stack_out": [ - "0x151f7c75", - "tmp%33#0" - ] - }, - "911": { - "op": "concat", - "defined_out": [ - "tmp%34#0" - ], - "stack_out": [ - "tmp%34#0" - ] - }, - "912": { - "op": "log", - "stack_out": [] - }, - "913": { - "op": "intc_1 // 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "914": { - "op": "return" - }, - "915": { - "block": "main_asset_config_route@7", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%14#0" - ], - "stack_out": [ - "tmp%14#0" - ] - }, - "917": { - "op": "!", - "defined_out": [ - "tmp%15#0" - ], - "stack_out": [ - "tmp%15#0" - ] - }, - "918": { - "error": "OnCompletion is not NoOp", - "op": "assert // OnCompletion is not NoOp", - "stack_out": [] - }, - "919": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%16#0" - ], - "stack_out": [ - "tmp%16#0" - ] - }, - "921": { - "error": "can only call when not creating", - "op": "assert // can only call when not creating", - "stack_out": [] - }, - "922": { - "op": "txna ApplicationArgs 1" - }, - "925": { - "op": "txna ApplicationArgs 2" - }, - "928": { - "op": "txna ApplicationArgs 3" - }, - "931": { - "op": "txna ApplicationArgs 4" - }, - "934": { - "op": "txna ApplicationArgs 5" - }, - "937": { - "op": "txna ApplicationArgs 6" - }, - "940": { - "op": "txna ApplicationArgs 7" - }, - "943": { - "op": "txna ApplicationArgs 8" - }, - "946": { - "op": "txna ApplicationArgs 9" - }, - "949": { - "op": "txna ApplicationArgs 10", - "defined_out": [ - "tmp%18#0", - "tmp%19#0", - "tmp%20#0", - "tmp%21#0", - "tmp%22#0", - "tmp%23#0", - "tmp%24#0", - "tmp%25#0", - "tmp%26#0", - "tmp%27#0" - ], - "stack_out": [ - "tmp%18#0", - "tmp%19#0", - "tmp%20#0", - "tmp%21#0", - "tmp%22#0", - "tmp%23#0", - "tmp%24#0", - "tmp%25#0", - "tmp%26#0", - "tmp%27#0" - ] - }, - "952": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.asset_config", - "op": "callsub asset_config", - "stack_out": [] - }, - "955": { - "op": "intc_1 // 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "956": { - "op": "return" - }, - "957": { - "block": "main_asset_update_route@6", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%9#0" - ], - "stack_out": [ - "tmp%9#0" - ] - }, - "959": { - "op": "intc_3 // UpdateApplication", - "defined_out": [ - "UpdateApplication", - "tmp%9#0" - ], - "stack_out": [ - "tmp%9#0", - "UpdateApplication" - ] - }, - "960": { - "op": "==", - "defined_out": [ - "tmp%10#0" - ], - "stack_out": [ - "tmp%10#0" - ] - }, - "961": { - "error": "OnCompletion is not UpdateApplication", - "op": "assert // OnCompletion is not UpdateApplication", - "stack_out": [] - }, - "962": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%11#0" - ], - "stack_out": [ - "tmp%11#0" - ] - }, - "964": { - "error": "can only call when not creating", - "op": "assert // can only call when not creating", - "stack_out": [] - }, - "965": { - "op": "txna ApplicationArgs 1", - "defined_out": [ - "tmp%13#0" - ], - "stack_out": [ - "tmp%13#0" - ] - }, - "968": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.asset_update", - "op": "callsub asset_update", - "stack_out": [] - }, - "971": { - "op": "intc_1 // 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "972": { - "op": "return" - }, - "973": { - "block": "main_asset_create_route@5", - "stack_in": [], - "op": "txn OnCompletion", - "defined_out": [ - "tmp%3#0" - ], - "stack_out": [ - "tmp%3#0" - ] - }, - "975": { - "op": "!", - "defined_out": [ - "tmp%4#0" - ], - "stack_out": [ - "tmp%4#0" - ] - }, - "976": { - "error": "OnCompletion is not NoOp", - "op": "assert // OnCompletion is not NoOp", - "stack_out": [] - }, - "977": { - "op": "txn ApplicationID", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "tmp%5#0" - ] - }, - "979": { - "op": "!", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "tmp%6#0" - ] - }, - "980": { - "error": "can only call when creating", - "op": "assert // can only call when creating", - "stack_out": [] - }, - "981": { - "op": "txna ApplicationArgs 1" - }, - "984": { - "op": "txna ApplicationArgs 2", - "defined_out": [ - "tmp%7#0", - "tmp%8#0" - ], - "stack_out": [ - "tmp%7#0", - "tmp%8#0" - ] - }, - "987": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.asset_create", - "op": "callsub asset_create", - "stack_out": [] - }, - "990": { - "op": "intc_1 // 1", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "991": { - "op": "return" - }, - "992": { - "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.asset_create", - "params": { - "arranger#0": "bytes", - "metadata#0": "bytes" - }, - "block": "asset_create", - "stack_in": [], - "op": "proto 2 0" - }, - "995": { - "op": "bytec 8 // 0x52323023", - "defined_out": [ - "0x52323023" - ], - "stack_out": [ - "0x52323023" - ] - }, - "997": { - "op": "frame_dig -2", - "defined_out": [ - "0x52323023", - "arranger#0 (copy)" - ], - "stack_out": [ - "0x52323023", - "arranger#0 (copy)" - ] - }, - "999": { - "op": "app_global_put", - "stack_out": [] - }, - "1000": { - "op": "bytec 12 // \"metadata\"", - "defined_out": [ - "\"metadata\"" - ], - "stack_out": [ - "\"metadata\"" - ] - }, - "1002": { - "op": "frame_dig -1", - "defined_out": [ - "\"metadata\"", - "metadata#0 (copy)" - ], - "stack_out": [ - "\"metadata\"", - "metadata#0 (copy)" - ] - }, - "1004": { - "op": "app_global_put", - "stack_out": [] - }, - "1005": { - "retsub": true, - "op": "retsub" - }, - "1006": { - "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.asset_update", - "params": { - "metadata#0": "bytes" - }, - "block": "asset_update", - "stack_in": [], - "op": "proto 1 0" - }, - "1009": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "1012": { - "op": "bytec 12 // \"metadata\"", - "defined_out": [ - "\"metadata\"" - ], - "stack_out": [ - "\"metadata\"" - ] - }, - "1014": { - "op": "frame_dig -1", - "defined_out": [ - "\"metadata\"", - "metadata#0 (copy)" - ], - "stack_out": [ - "\"metadata\"", - "metadata#0 (copy)" - ] - }, - "1016": { - "op": "app_global_put", - "stack_out": [] - }, - "1017": { - "retsub": true, - "op": "retsub" - }, - "1018": { - "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_caller_is_arranger", - "params": {}, - "block": "assert_caller_is_arranger", - "stack_in": [], - "op": "proto 0 0" - }, - "1021": { - "op": "txn Sender", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "1023": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "0" - ] - }, - "1024": { - "op": "bytec 8 // 0x52323023", - "defined_out": [ - "0", - "0x52323023", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "0", - "0x52323023" - ] - }, - "1026": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1027": { - "error": "check self.arranger exists", - "op": "assert // check self.arranger exists", - "stack_out": [ - "tmp%0#0", - "maybe_value%0#0" - ] - }, - "1028": { - "op": "==", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "1029": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [] - }, - "1030": { - "retsub": true, - "op": "retsub" - }, - "1031": { - "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.asset_config", - "params": { - "denomination_asset_id#0": "bytes", - "settlement_asset_id#0": "bytes", - "principal#0": "bytes", - "principal_discount#0": "bytes", - "minimum_denomination#0": "bytes", - "day_count_convention#0": "bytes", - "interest_rate#0": "bytes", - "coupon_rates#0": "bytes", - "time_events#0": "bytes", - "time_periods#0": "bytes" - }, - "block": "asset_config", - "stack_in": [], - "op": "proto 10 0" - }, - "1034": { - "op": "intc_0 // 0", - "stack_out": [ - "array_head_and_tail%0#0" - ] - }, - "1035": { - "op": "pushbytes \"\"", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1" - ] - }, - "1037": { - "op": "dupn 2", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1" - ] - }, - "1039": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "1042": { - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "0" - ] - }, - "1043": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "0", - "\"status\"" - ] - }, - "1044": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1045": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "maybe_value%0#0" - ] - }, - "1046": { - "op": "!", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "tmp%0#0" - ] - }, - "1047": { - "error": "D-ASA already configured", - "op": "assert // D-ASA already configured", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1" - ] - }, - "1048": { - "op": "frame_dig -10", - "defined_out": [ - "denomination_asset_id#0 (copy)" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#0 (copy)" - ] - }, - "1050": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#1" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1" - ] - }, - "1051": { - "op": "dup", - "defined_out": [ - "denomination_asset_id#1" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "denomination_asset_id#1" - ] - }, - "1052": { - "op": "bz asset_config_bool_false@4", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1" - ] - }, - "1055": { - "op": "frame_dig 4" - }, - "1057": { - "op": "asset_params_get AssetCreator" - }, - "1059": { - "error": "asset exists", - "op": "assert // asset exists" - }, - "1060": { - "op": "global ZeroAddress" - }, - "1062": { - "op": "!=" - }, - "1063": { - "op": "bz asset_config_bool_false@4" - }, - "1066": { - "op": "intc_1 // 1" - }, - "1067": { - "block": "asset_config_bool_merge@5", - "stack_in": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "and_result%0#0" - ], - "error": "Denomination asset is not properly set", - "op": "assert // Denomination asset is not properly set", - "defined_out": [], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1" - ] - }, - "1068": { - "op": "bytec 9 // \"denomination_asset_id\"", - "defined_out": [ - "\"denomination_asset_id\"" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "\"denomination_asset_id\"" - ] - }, - "1070": { - "op": "frame_dig 4", - "defined_out": [ - "\"denomination_asset_id\"", - "denomination_asset_id#1" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "\"denomination_asset_id\"", - "denomination_asset_id#1" - ] - }, - "1072": { - "op": "app_global_put", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1" - ] - }, - "1073": { - "op": "frame_dig -9", - "defined_out": [ - "denomination_asset_id#1", - "settlement_asset_id#0 (copy)" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "settlement_asset_id#0 (copy)" - ] - }, - "1075": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#1", - "settlement_asset_id#1" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "settlement_asset_id#1" - ] - }, - "1076": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "denomination_asset_id#1", - "settlement_asset_id#1" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "settlement_asset_id#1", - "0" - ] - }, - "1077": { - "op": "bytec 9 // \"denomination_asset_id\"", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "settlement_asset_id#1", - "0", - "\"denomination_asset_id\"" - ] - }, - "1079": { - "op": "app_global_get_ex", - "defined_out": [ - "denomination_asset_id#1", - "maybe_exists%0#0", - "maybe_value%0#0", - "settlement_asset_id#1" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "settlement_asset_id#1", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1080": { - "error": "check self.denomination_asset_id exists", - "op": "assert // check self.denomination_asset_id exists", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "settlement_asset_id#1", - "maybe_value%0#0" - ] - }, - "1081": { - "op": "dig 1", - "defined_out": [ - "denomination_asset_id#1", - "maybe_value%0#0", - "settlement_asset_id#1", - "settlement_asset_id#1 (copy)" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "settlement_asset_id#1", - "maybe_value%0#0", - "settlement_asset_id#1 (copy)" - ] - }, - "1083": { - "op": "==", - "defined_out": [ - "denomination_asset_id#1", - "settlement_asset_id#1", - "tmp%0#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "settlement_asset_id#1", - "tmp%0#0" - ] - }, - "1084": { - "error": "Different settlement asset not supported, must be equal to denomination asset", - "op": "assert // Different settlement asset not supported, must be equal to denomination asset", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "settlement_asset_id#1" - ] - }, - "1085": { - "op": "bytec 10 // \"settlement_asset_id\"", - "defined_out": [ - "\"settlement_asset_id\"", - "denomination_asset_id#1", - "settlement_asset_id#1" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "settlement_asset_id#1", - "\"settlement_asset_id\"" - ] - }, - "1087": { - "op": "swap", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "\"settlement_asset_id\"", - "settlement_asset_id#1" - ] - }, - "1088": { - "op": "app_global_put", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1" - ] - }, - "1089": { - "op": "itxn_begin" - }, - "1090": { - "op": "global MinTxnFee", - "defined_out": [ - "denomination_asset_id#1", - "inner_txn_params%0%%param_Fee_idx_0#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1092": { - "op": "intc_0 // 0", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "inner_txn_params%0%%param_Fee_idx_0#0", - "0" - ] - }, - "1093": { - "op": "bytec 10 // \"settlement_asset_id\"", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "inner_txn_params%0%%param_Fee_idx_0#0", - "0", - "\"settlement_asset_id\"" - ] - }, - "1095": { - "op": "app_global_get_ex", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "inner_txn_params%0%%param_Fee_idx_0#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1096": { - "error": "check self.settlement_asset_id exists", - "op": "assert // check self.settlement_asset_id exists", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "inner_txn_params%0%%param_Fee_idx_0#0", - "maybe_value%0#0" - ] - }, - "1097": { - "op": "global CurrentApplicationAddress", - "defined_out": [ - "denomination_asset_id#1", - "inner_txn_params%0%%param_AssetReceiver_idx_0#0", - "inner_txn_params%0%%param_Fee_idx_0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "inner_txn_params%0%%param_Fee_idx_0#0", - "maybe_value%0#0", - "inner_txn_params%0%%param_AssetReceiver_idx_0#0" - ] - }, - "1099": { - "op": "intc_0 // 0", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "inner_txn_params%0%%param_Fee_idx_0#0", - "maybe_value%0#0", - "inner_txn_params%0%%param_AssetReceiver_idx_0#0", - "0" - ] - }, - "1100": { - "op": "itxn_field AssetAmount", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "inner_txn_params%0%%param_Fee_idx_0#0", - "maybe_value%0#0", - "inner_txn_params%0%%param_AssetReceiver_idx_0#0" - ] - }, - "1102": { - "op": "itxn_field AssetReceiver", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "inner_txn_params%0%%param_Fee_idx_0#0", - "maybe_value%0#0" - ] - }, - "1104": { - "op": "itxn_field XferAsset", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1106": { - "op": "intc_3 // axfer", - "defined_out": [ - "axfer", - "denomination_asset_id#1", - "inner_txn_params%0%%param_Fee_idx_0#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "inner_txn_params%0%%param_Fee_idx_0#0", - "axfer" - ] - }, - "1107": { - "op": "itxn_field TypeEnum", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "inner_txn_params%0%%param_Fee_idx_0#0" - ] - }, - "1109": { - "op": "itxn_field Fee", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1" - ] - }, - "1111": { - "op": "itxn_submit" - }, - "1112": { - "op": "frame_dig -8", - "defined_out": [ - "denomination_asset_id#1", - "principal#0 (copy)" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "principal#0 (copy)" - ] - }, - "1114": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#1", - "tmp%5#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%5#0" - ] - }, - "1115": { - "op": "frame_dig -6", - "defined_out": [ - "denomination_asset_id#1", - "minimum_denomination#0 (copy)", - "tmp%5#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%5#0", - "minimum_denomination#0 (copy)" - ] - }, - "1117": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#1", - "tmp%5#0", - "tmp%6#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%5#0", - "tmp%6#0" - ] - }, - "1118": { - "op": "dup2", - "defined_out": [ - "denomination_asset_id#1", - "tmp%5#0", - "tmp%5#0 (copy)", - "tmp%6#0", - "tmp%6#0 (copy)" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%5#0", - "tmp%6#0", - "tmp%5#0 (copy)", - "tmp%6#0 (copy)" - ] - }, - "1119": { - "op": "%", - "defined_out": [ - "denomination_asset_id#1", - "tmp%5#0", - "tmp%6#0", - "tmp%7#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%5#0", - "tmp%6#0", - "tmp%7#0" - ] - }, - "1120": { - "op": "!", - "defined_out": [ - "denomination_asset_id#1", - "tmp%5#0", - "tmp%6#0", - "tmp%8#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%5#0", - "tmp%6#0", - "tmp%8#0" - ] - }, - "1121": { - "error": "Minimum denomination is not a divisor of principal", - "op": "assert // Minimum denomination is not a divisor of principal", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%5#0", - "tmp%6#0" - ] - }, - "1122": { - "op": "bytec 4 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"", - "denomination_asset_id#1", - "tmp%5#0", - "tmp%6#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%5#0", - "tmp%6#0", - "\"unit_value\"" - ] - }, - "1124": { - "op": "dig 1", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%5#0", - "tmp%6#0", - "\"unit_value\"", - "tmp%6#0 (copy)" - ] - }, - "1126": { - "op": "app_global_put", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%5#0", - "tmp%6#0" - ] - }, - "1127": { - "op": "/", - "defined_out": [ - "denomination_asset_id#1", - "new_state_value%1#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "new_state_value%1#0" - ] - }, - "1128": { - "op": "bytec 5 // \"total_units\"", - "defined_out": [ - "\"total_units\"", - "denomination_asset_id#1", - "new_state_value%1#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "new_state_value%1#0", - "\"total_units\"" - ] - }, - "1130": { - "op": "swap", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "\"total_units\"", - "new_state_value%1#0" - ] - }, - "1131": { - "op": "app_global_put", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1" - ] - }, - "1132": { - "op": "frame_dig -7", - "defined_out": [ - "denomination_asset_id#1", - "principal_discount#0 (copy)" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "principal_discount#0 (copy)" - ] - }, - "1134": { - "op": "btoi", - "defined_out": [ - "denomination_asset_id#1", - "new_state_value%2#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "new_state_value%2#0" - ] - }, - "1135": { - "op": "bytec 13 // \"principal_discount\"", - "defined_out": [ - "\"principal_discount\"", - "denomination_asset_id#1", - "new_state_value%2#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "new_state_value%2#0", - "\"principal_discount\"" - ] - }, - "1137": { - "op": "swap", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "\"principal_discount\"", - "new_state_value%2#0" - ] - }, - "1138": { - "op": "app_global_put", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1" - ] - }, - "1139": { - "op": "frame_dig -5", - "defined_out": [ - "day_count_convention#0 (copy)", - "denomination_asset_id#1" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "day_count_convention#0 (copy)" - ] - }, - "1141": { - "op": "btoi", - "defined_out": [ - "day_count_convention#1", - "denomination_asset_id#1" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "day_count_convention#1" - ] - }, - "1142": { - "op": "dup", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "day_count_convention#1", - "day_count_convention#1" - ] - }, - "1143": { - "op": "frame_bury 1", - "defined_out": [ - "day_count_convention#1", - "denomination_asset_id#1" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "day_count_convention#1" - ] - }, - "1145": { - "op": "bz asset_config_bool_true@16", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1" - ] - }, - "1148": { - "op": "frame_dig 1" - }, - "1150": { - "op": "pushint 255 // 255" - }, - "1153": { - "op": "==" - }, - "1154": { - "op": "bz asset_config_bool_false@17" - }, - "1157": { - "block": "asset_config_bool_true@16", - "stack_in": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1" - ], - "op": "intc_1 // 1", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "or_result%0#0" - ] - }, - "1158": { - "block": "asset_config_bool_merge@18", - "stack_in": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "or_result%0#0" - ], - "error": "Invalid day-count convention ID", - "op": "assert // Invalid day-count convention ID", - "defined_out": [], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1" - ] - }, - "1159": { - "op": "bytec 11 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "\"day_count_convention\"" - ] - }, - "1161": { - "op": "frame_dig 1", - "defined_out": [ - "\"day_count_convention\"", - "day_count_convention#1" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "\"day_count_convention\"", - "day_count_convention#1" - ] - }, - "1163": { - "op": "app_global_put", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1" - ] - }, - "1164": { - "op": "frame_dig -4", - "defined_out": [ - "day_count_convention#1", - "interest_rate#0 (copy)" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "interest_rate#0 (copy)" - ] - }, - "1166": { - "op": "btoi", - "defined_out": [ - "day_count_convention#1", - "interest_rate#1" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "interest_rate#1" - ] - }, - "1167": { - "op": "frame_bury 2", - "defined_out": [ - "day_count_convention#1", - "interest_rate#1" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1" - ] - }, - "1169": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "day_count_convention#1", - "interest_rate#1" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "0" - ] - }, - "1170": { - "op": "bytec 13 // \"principal_discount\"", - "defined_out": [ - "\"principal_discount\"", - "0", - "day_count_convention#1", - "interest_rate#1" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "0", - "\"principal_discount\"" - ] - }, - "1172": { - "op": "app_global_get_ex", - "defined_out": [ - "day_count_convention#1", - "interest_rate#1", - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1173": { - "error": "check self.principal_discount exists", - "op": "assert // check self.principal_discount exists", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "maybe_value%0#0" - ] - }, - "1174": { - "op": "bnz asset_config_after_if_else@24", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1" - ] - }, - "1177": { - "op": "frame_dig 2" - }, - "1179": { - "error": "Interest rate is not properly defined", - "op": "assert // Interest rate is not properly defined" - }, - "1180": { - "block": "asset_config_after_if_else@24", - "stack_in": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1" - ], - "op": "bytec 21 // \"interest_rate\"", - "defined_out": [ - "\"interest_rate\"" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "\"interest_rate\"" - ] - }, - "1182": { - "op": "frame_dig 2", - "defined_out": [ - "\"interest_rate\"", - "interest_rate#1" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "\"interest_rate\"", - "interest_rate#1" - ] - }, - "1184": { - "op": "app_global_put", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1" - ] - }, - "1185": { - "op": "frame_dig -3", - "defined_out": [ - "coupon_rates#0 (copy)", - "interest_rate#1" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "coupon_rates#0 (copy)" - ] - }, - "1187": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "coupon_rates#0 (copy)", - "interest_rate#1" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "coupon_rates#0 (copy)", - "0" - ] - }, - "1188": { - "op": "extract_uint16", - "defined_out": [ - "interest_rate#1", - "tmp%0#5" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%0#5" - ] - }, - "1189": { - "op": "dup", - "defined_out": [ - "interest_rate#1", - "tmp%0#5", - "tmp%0#5 (copy)" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%0#5", - "tmp%0#5 (copy)" - ] - }, - "1190": { - "op": "!", - "defined_out": [ - "interest_rate#1", - "tmp%0#5", - "tmp%1#2" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%0#5", - "tmp%1#2" - ] - }, - "1191": { - "error": "Coupon rates are not properly defined", - "op": "assert // Coupon rates are not properly defined", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%0#5" - ] - }, - "1192": { - "op": "bytec 6 // \"total_coupons\"", - "defined_out": [ - "\"total_coupons\"", - "interest_rate#1", - "tmp%0#5" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%0#5", - "\"total_coupons\"" - ] - }, - "1194": { - "op": "swap", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "\"total_coupons\"", - "tmp%0#5" - ] - }, - "1195": { - "op": "app_global_put", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1" - ] - }, - "1196": { - "op": "intc_0 // 0", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "0" - ] - }, - "1197": { - "op": "bytec 6 // \"total_coupons\"", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "0", - "\"total_coupons\"" - ] - }, - "1199": { - "op": "app_global_get_ex", - "defined_out": [ - "interest_rate#1", - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1200": { - "error": "check self.total_coupons exists", - "op": "assert // check self.total_coupons exists", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "maybe_value%0#0" - ] - }, - "1201": { - "op": "bz asset_config_after_if_else@32", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1" - ] - }, - "1204": { - "op": "bytec 28 // 0x636f75706f6e5261746573" - }, - "1206": { - "op": "box_del" - }, - "1207": { - "op": "pop" - }, - "1208": { - "op": "bytec 28 // 0x636f75706f6e5261746573" - }, - "1210": { - "op": "frame_dig -3" - }, - "1212": { - "op": "box_put" - }, - "1213": { - "block": "asset_config_after_if_else@32", - "stack_in": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1" - ], - "op": "frame_dig -2", - "defined_out": [ - "time_events#0 (copy)" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "time_events#0 (copy)" - ] - }, - "1215": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "time_events#0 (copy)" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "time_events#0 (copy)", - "0" - ] - }, - "1216": { - "op": "extract_uint16", - "defined_out": [ - "tmp%0#5" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%0#5" - ] - }, - "1217": { - "op": "intc_0 // 0", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%0#5", - "0" - ] - }, - "1218": { - "op": "bytec 6 // \"total_coupons\"", - "defined_out": [ - "\"total_coupons\"", - "0", - "tmp%0#5" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%0#5", - "0", - "\"total_coupons\"" - ] - }, - "1220": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "tmp%0#5" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%0#5", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1221": { - "error": "check self.total_coupons exists", - "op": "assert // check self.total_coupons exists", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%0#5", - "maybe_value%0#0" - ] - }, - "1222": { - "op": "intc_3 // 4", - "defined_out": [ - "4", - "maybe_value%0#0", - "tmp%0#5" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%0#5", - "maybe_value%0#0", - "4" - ] - }, - "1223": { - "op": "+", - "defined_out": [ - "tmp%0#5", - "tmp%1#5" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%0#5", - "tmp%1#5" - ] - }, - "1224": { - "op": "==", - "defined_out": [ - "tmp%2#1" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%2#1" - ] - }, - "1225": { - "error": "Time events length is invalid", - "op": "assert // Time events length is invalid", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1" - ] - }, - "1226": { - "op": "frame_dig -2", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "time_events#0 (copy)" - ] - }, - "1228": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_time_events_sorted", - "op": "callsub assert_time_events_sorted", - "defined_out": [ - "time_events#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "time_events#0" - ] - }, - "1231": { - "op": "frame_bury -2", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1" - ] - }, - "1233": { - "op": "bytec 22 // 0x74696d654576656e7473", - "defined_out": [ - "0x74696d654576656e7473" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "0x74696d654576656e7473" - ] - }, - "1235": { - "op": "box_del", - "defined_out": [ - "{box_del}" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "{box_del}" - ] - }, - "1236": { - "op": "pop", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1" - ] - }, - "1237": { - "op": "bytec 22 // 0x74696d654576656e7473", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "0x74696d654576656e7473" - ] - }, - "1239": { - "op": "frame_dig -2", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "0x74696d654576656e7473", - "time_events#0 (copy)" - ] - }, - "1241": { - "op": "box_put", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1" - ] - }, - "1242": { - "op": "frame_dig -2", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "time_events#0 (copy)" - ] - }, - "1244": { - "op": "extract 2 0", - "defined_out": [ - "array_head_and_tail%0#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "array_head_and_tail%0#0" - ] - }, - "1247": { - "op": "dup", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "array_head_and_tail%0#0", - "array_head_and_tail%0#0" - ] - }, - "1248": { - "op": "frame_bury 0", - "defined_out": [ - "array_head_and_tail%0#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "array_head_and_tail%0#0" - ] - }, - "1250": { - "op": "dup", - "defined_out": [ - "array_head_and_tail%0#0", - "array_head_and_tail%0#0 (copy)" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "array_head_and_tail%0#0", - "array_head_and_tail%0#0 (copy)" - ] - }, - "1251": { - "error": "Index access is out of bounds", - "op": "extract 0 8 // on error: Index access is out of bounds", - "defined_out": [ - "array_head_and_tail%0#0", - "tmp%0#8" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "array_head_and_tail%0#0", - "tmp%0#8" - ] - }, - "1254": { - "op": "btoi", - "defined_out": [ - "array_head_and_tail%0#0", - "new_state_value%0#2" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "array_head_and_tail%0#0", - "new_state_value%0#2" - ] - }, - "1255": { - "op": "bytec 14 // \"primary_distribution_opening_date\"", - "defined_out": [ - "\"primary_distribution_opening_date\"", - "array_head_and_tail%0#0", - "new_state_value%0#2" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "array_head_and_tail%0#0", - "new_state_value%0#2", - "\"primary_distribution_opening_date\"" - ] - }, - "1257": { - "op": "swap", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "array_head_and_tail%0#0", - "\"primary_distribution_opening_date\"", - "new_state_value%0#2" - ] - }, - "1258": { - "op": "app_global_put", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "array_head_and_tail%0#0" - ] - }, - "1259": { - "op": "dup", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "array_head_and_tail%0#0", - "array_head_and_tail%0#0 (copy)" - ] - }, - "1260": { - "error": "Index access is out of bounds", - "op": "extract 8 8 // on error: Index access is out of bounds", - "defined_out": [ - "array_head_and_tail%0#0", - "tmp%1#1" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "array_head_and_tail%0#0", - "tmp%1#1" - ] - }, - "1263": { - "op": "btoi", - "defined_out": [ - "array_head_and_tail%0#0", - "new_state_value%1#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "array_head_and_tail%0#0", - "new_state_value%1#0" - ] - }, - "1264": { - "op": "bytec 15 // \"primary_distribution_closure_date\"", - "defined_out": [ - "\"primary_distribution_closure_date\"", - "array_head_and_tail%0#0", - "new_state_value%1#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "array_head_and_tail%0#0", - "new_state_value%1#0", - "\"primary_distribution_closure_date\"" - ] - }, - "1266": { - "op": "swap", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "array_head_and_tail%0#0", - "\"primary_distribution_closure_date\"", - "new_state_value%1#0" - ] - }, - "1267": { - "op": "app_global_put", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "array_head_and_tail%0#0" - ] - }, - "1268": { - "error": "Index access is out of bounds", - "op": "extract 16 8 // on error: Index access is out of bounds", - "defined_out": [ - "array_head_and_tail%0#0", - "tmp%2#3" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%2#3" - ] - }, - "1271": { - "op": "btoi", - "defined_out": [ - "array_head_and_tail%0#0", - "new_state_value%2#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "new_state_value%2#0" - ] - }, - "1272": { - "op": "bytec 16 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "array_head_and_tail%0#0", - "new_state_value%2#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "new_state_value%2#0", - "\"issuance_date\"" - ] - }, - "1274": { - "op": "swap", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "\"issuance_date\"", - "new_state_value%2#0" - ] - }, - "1275": { - "op": "app_global_put", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1" - ] - }, - "1276": { - "op": "frame_dig -2", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "time_events#0 (copy)" - ] - }, - "1278": { - "op": "intc_0 // 0", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "time_events#0 (copy)", - "0" - ] - }, - "1279": { - "op": "extract_uint16", - "defined_out": [ - "array_head_and_tail%0#0", - "tmp%3#1" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%3#1" - ] - }, - "1280": { - "op": "dup", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%3#1", - "tmp%3#1" - ] - }, - "1281": { - "op": "frame_bury 3", - "defined_out": [ - "array_head_and_tail%0#0", - "tmp%3#1" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%3#1" - ] - }, - "1283": { - "op": "intc_0 // 0", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%3#1", - "0" - ] - }, - "1284": { - "op": "bytec 6 // \"total_coupons\"", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%3#1", - "0", - "\"total_coupons\"" - ] - }, - "1286": { - "op": "app_global_get_ex", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%3#1", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1287": { - "error": "check self.total_coupons exists", - "op": "assert // check self.total_coupons exists", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%3#1", - "maybe_value%0#0" - ] - }, - "1288": { - "op": "intc_3 // 4", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%3#1", - "maybe_value%0#0", - "4" - ] - }, - "1289": { - "op": "+", - "defined_out": [ - "array_head_and_tail%0#0", - "tmp%3#1", - "tmp%4#1" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%3#1", - "tmp%4#1" - ] - }, - "1290": { - "op": "==", - "defined_out": [ - "array_head_and_tail%0#0", - "tmp%3#1", - "tmp%5#1" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%5#1" - ] - }, - "1291": { - "op": "bz asset_config_after_if_else@38", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1" - ] - }, - "1294": { - "op": "frame_dig 3" - }, - "1296": { - "op": "intc_1 // 1" - }, - "1297": { - "op": "-" - }, - "1298": { - "op": "intc_2 // 8" - }, - "1299": { - "op": "*" - }, - "1300": { - "op": "frame_dig 0" - }, - "1302": { - "op": "swap" - }, - "1303": { - "op": "intc_2 // 8" - }, - "1304": { - "error": "Index access is out of bounds", - "op": "extract3 // on error: Index access is out of bounds" - }, - "1305": { - "op": "btoi" - }, - "1306": { - "op": "bytec_3 // \"maturity_date\"" - }, - "1307": { - "op": "swap" - }, - "1308": { - "op": "app_global_put" - }, - "1309": { - "block": "asset_config_after_if_else@38", - "stack_in": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1" - ], - "op": "frame_dig -1", - "defined_out": [ - "time_periods#0 (copy)" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "time_periods#0 (copy)" - ] - }, - "1311": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "time_periods#0 (copy)" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "time_periods#0 (copy)", - "0" - ] - }, - "1312": { - "op": "extract_uint16", - "defined_out": [ - "tmp%0#5" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%0#5" - ] - }, - "1313": { - "op": "!", - "defined_out": [ - "tmp%1#2" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "tmp%1#2" - ] - }, - "1314": { - "error": "Time periods are not properly defined", - "op": "assert // Time periods are not properly defined", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1" - ] - }, - "1315": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "\"status\"" - ] - }, - "1316": { - "op": "pushint 100 // 100", - "defined_out": [ - "\"status\"", - "100" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "\"status\"", - "100" - ] - }, - "1318": { - "op": "app_global_put", - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1" - ] - }, - "1319": { - "retsub": true, - "op": "retsub" - }, - "1320": { - "block": "asset_config_bool_false@17", - "stack_in": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1" - ], - "op": "intc_0 // 0", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "or_result%0#0" - ] - }, - "1321": { - "op": "b asset_config_bool_merge@18" - }, - "1324": { - "block": "asset_config_bool_false@4", - "stack_in": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "day_count_convention#1", - "interest_rate#1", - "tmp%3#1", - "denomination_asset_id#1", - "and_result%0#0" - ] - }, - "1325": { - "op": "b asset_config_bool_merge@5" - }, - "1328": { - "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_time_events_sorted", - "params": { - "time_events#0": "bytes" - }, - "block": "assert_time_events_sorted", - "stack_in": [], - "op": "proto 1 1" - }, - "1331": { - "op": "pushbytes \"\"", - "stack_out": [ - "time_f#0" - ] - }, - "1333": { - "op": "dup", - "stack_out": [ - "time_f#0", - "time_i#0" - ] - }, - "1334": { - "op": "frame_dig -1", - "defined_out": [ - "time_events#0 (copy)" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "time_events#0 (copy)" - ] - }, - "1336": { - "op": "extract 2 0", - "defined_out": [ - "array_head_and_tail%0#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0" - ] - }, - "1339": { - "op": "dup", - "defined_out": [ - "array_head_and_tail%0#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "array_head_and_tail%0#0" - ] - }, - "1340": { - "error": "Index access is out of bounds", - "op": "extract 0 8 // on error: Index access is out of bounds", - "defined_out": [ - "array_head_and_tail%0#0", - "tmp%0#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%0#0" - ] - }, - "1343": { - "op": "btoi", - "defined_out": [ - "array_head_and_tail%0#0", - "tmp%1#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%1#0" - ] - }, - "1344": { - "op": "global LatestTimestamp", - "defined_out": [ - "array_head_and_tail%0#0", - "tmp%1#0", - "tmp%2#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%1#0", - "tmp%2#0" - ] - }, - "1346": { - "op": ">", - "defined_out": [ - "array_head_and_tail%0#0", - "tmp%3#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%3#0" - ] - }, - "1347": { - "error": "Time events must be set in the future", - "op": "assert // Time events must be set in the future", - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0" - ] - }, - "1348": { - "op": "frame_dig -1", - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "time_events#0 (copy)" - ] - }, - "1350": { - "op": "intc_0 // 0", - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "time_events#0 (copy)", - "0" - ] - }, - "1351": { - "op": "extract_uint16", - "defined_out": [ - "array_head_and_tail%0#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%4#0" - ] - }, - "1352": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "array_head_and_tail%0#0", - "tmp%4#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%4#0", - "1" - ] - }, - "1353": { - "op": "-", - "defined_out": [ - "array_head_and_tail%0#0", - "tmp%5#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0" - ] - }, - "1354": { - "op": "intc_0 // 0", - "defined_out": [ - "_t#0", - "array_head_and_tail%0#0", - "tmp%5#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0" - ] - }, - "1355": { - "block": "assert_time_events_sorted_for_header@1", - "stack_in": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0" - ], - "op": "frame_dig 4", - "defined_out": [ - "_t#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "_t#0" - ] - }, - "1357": { - "op": "frame_dig 3", - "defined_out": [ - "_t#0", - "tmp%5#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "_t#0", - "tmp%5#0" - ] - }, - "1359": { - "op": "<", - "defined_out": [ - "_t#0", - "continue_looping%0#0", - "tmp%5#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "continue_looping%0#0" - ] - }, - "1360": { - "op": "bz assert_time_events_sorted_after_for@6", - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0" - ] - }, - "1363": { - "block": "assert_time_events_sorted_while_top@8", - "stack_in": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0" - ], - "op": "pushint 75 // 75" - }, - "1365": { - "op": "global OpcodeBudget", - "defined_out": [ - "75", - "tmp%0#1" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "75", - "tmp%0#1" - ] - }, - "1367": { - "op": ">", - "defined_out": [ - "tmp%1#1" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "tmp%1#1" - ] - }, - "1368": { - "op": "bz assert_time_events_sorted_after_while@14", - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0" - ] - }, - "1371": { - "op": "itxn_begin" - }, - "1372": { - "op": "pushint 6 // appl" - }, - "1374": { - "op": "itxn_field TypeEnum" - }, - "1376": { - "op": "pushint 5 // DeleteApplication" - }, - "1378": { - "op": "itxn_field OnCompletion" - }, - "1380": { - "op": "bytec 29 // 0x068101" - }, - "1382": { - "op": "itxn_field ApprovalProgram" - }, - "1384": { - "op": "bytec 29 // 0x068101" - }, - "1386": { - "op": "itxn_field ClearStateProgram" - }, - "1388": { - "op": "global MinTxnFee" - }, - "1390": { - "op": "itxn_field Fee" - }, - "1392": { - "op": "itxn_submit" - }, - "1393": { - "op": "b assert_time_events_sorted_while_top@8" - }, - "1396": { - "block": "assert_time_events_sorted_after_while@14", - "stack_in": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0" - ], - "op": "frame_dig 4", - "defined_out": [ - "_t#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "_t#0" - ] - }, - "1398": { - "op": "dup", - "defined_out": [ - "_t#0", - "_t#0 (copy)" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "_t#0", - "_t#0 (copy)" - ] - }, - "1399": { - "op": "intc_2 // 8", - "defined_out": [ - "8", - "_t#0", - "_t#0 (copy)" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "_t#0", - "_t#0 (copy)", - "8" - ] - }, - "1400": { - "op": "*", - "defined_out": [ - "_t#0", - "item_offset%1#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "_t#0", - "item_offset%1#0" - ] - }, - "1401": { - "op": "frame_dig 2", - "defined_out": [ - "_t#0", - "array_head_and_tail%0#0", - "item_offset%1#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "_t#0", - "item_offset%1#0", - "array_head_and_tail%0#0" - ] - }, - "1403": { - "op": "dup", - "defined_out": [ - "_t#0", - "array_head_and_tail%0#0", - "array_head_and_tail%0#0 (copy)", - "item_offset%1#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "_t#0", - "item_offset%1#0", - "array_head_and_tail%0#0 (copy)", - "array_head_and_tail%0#0 (copy)" - ] - }, - "1404": { - "op": "cover 3", - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "array_head_and_tail%0#0", - "_t#0", - "item_offset%1#0", - "array_head_and_tail%0#0 (copy)" - ] - }, - "1406": { - "op": "swap", - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "array_head_and_tail%0#0", - "_t#0", - "array_head_and_tail%0#0 (copy)", - "item_offset%1#0" - ] - }, - "1407": { - "op": "intc_2 // 8", - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "array_head_and_tail%0#0", - "_t#0", - "array_head_and_tail%0#0 (copy)", - "item_offset%1#0", - "8" - ] - }, - "1408": { - "error": "Index access is out of bounds", - "op": "extract3 // on error: Index access is out of bounds", - "defined_out": [ - "_t#0", - "array_head_and_tail%0#0", - "tmp%6#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "array_head_and_tail%0#0", - "_t#0", - "tmp%6#0" - ] - }, - "1409": { - "op": "btoi", - "defined_out": [ - "_t#0", - "array_head_and_tail%0#0", - "time_i#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "array_head_and_tail%0#0", - "_t#0", - "time_i#0" - ] - }, - "1410": { - "op": "dup", - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "array_head_and_tail%0#0", - "_t#0", - "time_i#0", - "time_i#0 (copy)" - ] - }, - "1411": { - "op": "cover 3", - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "time_i#0", - "array_head_and_tail%0#0", - "_t#0", - "time_i#0" - ] - }, - "1413": { - "op": "frame_bury 1", - "defined_out": [ - "_t#0", - "array_head_and_tail%0#0", - "time_i#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "time_i#0", - "array_head_and_tail%0#0", - "_t#0" - ] - }, - "1415": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "_t#0", - "array_head_and_tail%0#0", - "time_i#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "time_i#0", - "array_head_and_tail%0#0", - "_t#0", - "1" - ] - }, - "1416": { - "op": "+", - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "time_i#0", - "array_head_and_tail%0#0", - "_t#0" - ] - }, - "1417": { - "op": "dup", - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "time_i#0", - "array_head_and_tail%0#0", - "_t#0", - "_t#0" - ] - }, - "1418": { - "op": "frame_bury 4", - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "time_i#0", - "array_head_and_tail%0#0", - "_t#0" - ] - }, - "1420": { - "op": "intc_2 // 8", - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "time_i#0", - "array_head_and_tail%0#0", - "_t#0", - "8" - ] - }, - "1421": { - "op": "*", - "defined_out": [ - "_t#0", - "array_head_and_tail%0#0", - "item_offset%2#0", - "time_i#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "time_i#0", - "array_head_and_tail%0#0", - "item_offset%2#0" - ] - }, - "1422": { - "op": "intc_2 // 8", - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "time_i#0", - "array_head_and_tail%0#0", - "item_offset%2#0", - "8" - ] - }, - "1423": { - "error": "Index access is out of bounds", - "op": "extract3 // on error: Index access is out of bounds", - "defined_out": [ - "_t#0", - "array_head_and_tail%0#0", - "time_i#0", - "tmp%8#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "time_i#0", - "tmp%8#0" - ] - }, - "1424": { - "op": "btoi", - "defined_out": [ - "_t#0", - "array_head_and_tail%0#0", - "time_f#0", - "time_i#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "time_i#0", - "time_f#0" - ] - }, - "1425": { - "op": "dup", - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "time_i#0", - "time_f#0", - "time_f#0" - ] - }, - "1426": { - "op": "frame_bury 0", - "defined_out": [ - "_t#0", - "array_head_and_tail%0#0", - "time_f#0", - "time_i#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "time_i#0", - "time_f#0" - ] - }, - "1428": { - "op": "<", - "defined_out": [ - "_t#0", - "array_head_and_tail%0#0", - "time_f#0", - "time_i#0", - "tmp%9#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "tmp%9#0" - ] - }, - "1429": { - "error": "Time events must be sorted in strictly ascending order", - "op": "assert // Time events must be sorted in strictly ascending order", - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0" - ] - }, - "1430": { - "op": "intc_0 // 0", - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "0" - ] - }, - "1431": { - "op": "bytec 11 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"", - "0", - "_t#0", - "array_head_and_tail%0#0", - "time_f#0", - "time_i#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "0", - "\"day_count_convention\"" - ] - }, - "1433": { - "op": "app_global_get_ex", - "defined_out": [ - "_t#0", - "array_head_and_tail%0#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "time_f#0", - "time_i#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1434": { - "error": "check self.day_count_convention exists", - "op": "assert // check self.day_count_convention exists", - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "maybe_value%0#0" - ] - }, - "1435": { - "op": "pushint 255 // 255", - "defined_out": [ - "255", - "_t#0", - "array_head_and_tail%0#0", - "maybe_value%0#0", - "time_f#0", - "time_i#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "maybe_value%0#0", - "255" - ] - }, - "1438": { - "op": "!=", - "defined_out": [ - "_t#0", - "array_head_and_tail%0#0", - "time_f#0", - "time_i#0", - "tmp%10#0" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "tmp%10#0" - ] - }, - "1439": { - "op": "bz assert_time_events_sorted_for_header@1", - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0" - ] - }, - "1442": { - "op": "frame_dig 0" - }, - "1444": { - "op": "frame_dig 1" - }, - "1446": { - "op": "-" - }, - "1447": { - "op": "pushint 86400 // 86400" - }, - "1451": { - "op": "%" - }, - "1452": { - "op": "!" - }, - "1453": { - "error": "Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)", - "op": "assert // Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)" - }, - "1454": { - "op": "b assert_time_events_sorted_for_header@1" - }, - "1457": { - "block": "assert_time_events_sorted_after_for@6", - "stack_in": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0" - ], - "op": "frame_dig -1", - "defined_out": [ - "time_events#0 (copy)" - ], - "stack_out": [ - "time_f#0", - "time_i#0", - "array_head_and_tail%0#0", - "tmp%5#0", - "_t#0", - "time_events#0 (copy)" - ] - }, - "1459": { - "op": "frame_bury 0" - }, - "1461": { - "retsub": true, - "op": "retsub" - }, - "1462": { - "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.set_secondary_time_events", - "params": { - "secondary_market_time_events#0": "bytes" - }, - "block": "set_secondary_time_events", - "stack_in": [], - "op": "proto 1 1" - }, - "1465": { - "op": "intc_0 // 0", - "stack_out": [ - "array_head_and_tail%0#0" - ] - }, - "1466": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "1469": { - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "0" - ] - }, - "1470": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "0", - "\"status\"" - ] - }, - "1471": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1472": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "array_head_and_tail%0#0", - "maybe_value%0#0" - ] - }, - "1473": { - "op": "intc 4 // 200", - "defined_out": [ - "200", - "maybe_value%0#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "maybe_value%0#0", - "200" - ] - }, - "1475": { - "op": "==", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "tmp%0#1" - ] - }, - "1476": { - "op": "!", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "tmp%1#0" - ] - }, - "1477": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [ - "array_head_and_tail%0#0" - ] - }, - "1478": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_is_not_defaulted", - "op": "callsub assert_is_not_defaulted" - }, - "1481": { - "op": "frame_dig -1", - "defined_out": [ - "secondary_market_time_events#0 (copy)" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#0 (copy)" - ] - }, - "1483": { - "op": "intc_0 // 0", - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#0 (copy)", - "0" - ] - }, - "1484": { - "op": "extract_uint16", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "tmp%2#0" - ] - }, - "1485": { - "op": "dup", - "defined_out": [ - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "1486": { - "error": "Time events length is invalid", - "op": "assert // Time events length is invalid", - "stack_out": [ - "array_head_and_tail%0#0", - "tmp%2#0" - ] - }, - "1487": { - "op": "intc_1 // 1", - "defined_out": [ - "1", - "tmp%2#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "tmp%2#0", - "1" - ] - }, - "1488": { - "op": ">", - "defined_out": [ - "tmp%5#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "tmp%5#0" - ] - }, - "1489": { - "op": "frame_dig -1", - "defined_out": [ - "secondary_market_time_events#5", - "tmp%5#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "tmp%5#0", - "secondary_market_time_events#5" - ] - }, - "1491": { - "op": "swap", - "defined_out": [ - "secondary_market_time_events#5", - "tmp%5#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5", - "tmp%5#0" - ] - }, - "1492": { - "op": "bz set_secondary_time_events_after_if_else@2", - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5" - ] - }, - "1495": { - "op": "frame_dig -1" - }, - "1497": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_time_events_sorted", - "op": "callsub assert_time_events_sorted" - }, - "1500": { - "op": "dup" - }, - "1501": { - "op": "frame_bury -1" - }, - "1503": { - "op": "frame_bury 1" - }, - "1505": { - "block": "set_secondary_time_events_after_if_else@2", - "stack_in": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5" - ], - "op": "frame_dig 1", - "defined_out": [ - "secondary_market_time_events#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5", - "secondary_market_time_events#0" - ] - }, - "1507": { - "op": "frame_bury -1", - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5" - ] - }, - "1509": { - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5", - "0" - ] - }, - "1510": { - "op": "bytec 16 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5", - "0", - "\"issuance_date\"" - ] - }, - "1512": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1513": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5", - "maybe_value%0#0" - ] - }, - "1514": { - "op": "frame_dig -1", - "defined_out": [ - "maybe_value%0#0", - "secondary_market_time_events#0 (copy)" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5", - "maybe_value%0#0", - "secondary_market_time_events#0 (copy)" - ] - }, - "1516": { - "op": "extract 2 0", - "defined_out": [ - "array_head_and_tail%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5", - "maybe_value%0#0", - "array_head_and_tail%0#0" - ] - }, - "1519": { - "op": "dup", - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5", - "maybe_value%0#0", - "array_head_and_tail%0#0", - "array_head_and_tail%0#0" - ] - }, - "1520": { - "op": "frame_bury 0", - "defined_out": [ - "array_head_and_tail%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5", - "maybe_value%0#0", - "array_head_and_tail%0#0" - ] - }, - "1522": { - "error": "Index access is out of bounds", - "op": "extract 0 8 // on error: Index access is out of bounds", - "defined_out": [ - "array_head_and_tail%0#0", - "maybe_value%0#0", - "tmp%6#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5", - "maybe_value%0#0", - "tmp%6#0" - ] - }, - "1525": { - "op": "btoi", - "defined_out": [ - "array_head_and_tail%0#0", - "maybe_value%0#0", - "tmp%7#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5", - "maybe_value%0#0", - "tmp%7#0" - ] - }, - "1526": { - "op": "swap", - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5", - "tmp%7#0", - "maybe_value%0#0" - ] - }, - "1527": { - "op": "dig 1", - "defined_out": [ - "array_head_and_tail%0#0", - "maybe_value%0#0", - "tmp%7#0", - "tmp%7#0 (copy)" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5", - "tmp%7#0", - "maybe_value%0#0", - "tmp%7#0 (copy)" - ] - }, - "1529": { - "op": "<=", - "defined_out": [ - "array_head_and_tail%0#0", - "tmp%7#0", - "tmp%8#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5", - "tmp%7#0", - "tmp%8#0" - ] - }, - "1530": { - "error": "Invalid secondary market opening date", - "op": "assert // Invalid secondary market opening date", - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5", - "tmp%7#0" - ] - }, - "1531": { - "op": "bytec 17 // \"secondary_market_opening_date\"", - "defined_out": [ - "\"secondary_market_opening_date\"", - "array_head_and_tail%0#0", - "tmp%7#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5", - "tmp%7#0", - "\"secondary_market_opening_date\"" - ] - }, - "1533": { - "op": "swap", - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5", - "\"secondary_market_opening_date\"", - "tmp%7#0" - ] - }, - "1534": { - "op": "app_global_put", - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5" - ] - }, - "1535": { - "op": "intc_0 // 0", - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5", - "0" - ] - }, - "1536": { - "op": "bytec_3 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "0", - "array_head_and_tail%0#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5", - "0", - "\"maturity_date\"" - ] - }, - "1537": { - "op": "app_global_get_ex", - "defined_out": [ - "array_head_and_tail%0#0", - "maybe_exists%1#0", - "maybe_value%1#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "1538": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5", - "maybe_value%1#0" - ] - }, - "1539": { - "op": "bz set_secondary_time_events_after_if_else@4", - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5" - ] - }, - "1542": { - "op": "intc_0 // 0" - }, - "1543": { - "op": "bytec_3 // \"maturity_date\"" - }, - "1544": { - "op": "app_global_get_ex" - }, - "1545": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists" - }, - "1546": { - "op": "frame_dig -1" - }, - "1548": { - "op": "intc_0 // 0" - }, - "1549": { - "op": "extract_uint16" - }, - "1550": { - "op": "intc_1 // 1" - }, - "1551": { - "op": "-" - }, - "1552": { - "op": "intc_2 // 8" - }, - "1553": { - "op": "*" - }, - "1554": { - "op": "frame_dig 0" - }, - "1556": { - "op": "swap" - }, - "1557": { - "op": "intc_2 // 8" - }, - "1558": { - "error": "Index access is out of bounds", - "op": "extract3 // on error: Index access is out of bounds" - }, - "1559": { - "op": "btoi" - }, - "1560": { - "op": "swap" - }, - "1561": { - "op": "dig 1" - }, - "1563": { - "op": ">=" - }, - "1564": { - "error": "Invalid secondary market closure date", - "op": "assert // Invalid secondary market closure date" - }, - "1565": { - "op": "bytec 18 // \"secondary_market_closure_date\"" - }, - "1567": { - "op": "swap" - }, - "1568": { - "op": "app_global_put" - }, - "1569": { - "block": "set_secondary_time_events_after_if_else@4", - "stack_in": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5", - "0" - ] - }, - "1570": { - "op": "bytec 17 // \"secondary_market_opening_date\"", - "defined_out": [ - "\"secondary_market_opening_date\"", - "0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5", - "0", - "\"secondary_market_opening_date\"" - ] - }, - "1572": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%3#0", - "maybe_value%3#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "1573": { - "error": "check self.secondary_market_opening_date exists", - "op": "assert // check self.secondary_market_opening_date exists", - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5", - "maybe_value%3#0" - ] - }, - "1574": { - "op": "itob", - "defined_out": [ - "val_as_bytes%0#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5", - "val_as_bytes%0#0" - ] - }, - "1575": { - "op": "intc_0 // 0", - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5", - "val_as_bytes%0#0", - "0" - ] - }, - "1576": { - "op": "bytec 18 // \"secondary_market_closure_date\"", - "defined_out": [ - "\"secondary_market_closure_date\"", - "0", - "val_as_bytes%0#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5", - "val_as_bytes%0#0", - "0", - "\"secondary_market_closure_date\"" - ] - }, - "1578": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%4#0", - "maybe_value%4#0", - "val_as_bytes%0#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5", - "val_as_bytes%0#0", - "maybe_value%4#0", - "maybe_exists%4#0" - ] - }, - "1579": { - "error": "check self.secondary_market_closure_date exists", - "op": "assert // check self.secondary_market_closure_date exists", - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5", - "val_as_bytes%0#0", - "maybe_value%4#0" - ] - }, - "1580": { - "op": "itob", - "defined_out": [ - "val_as_bytes%0#0", - "val_as_bytes%1#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5", - "val_as_bytes%0#0", - "val_as_bytes%1#0" - ] - }, - "1581": { - "op": "concat", - "defined_out": [ - "encoded_tuple_buffer%2#0" - ], - "stack_out": [ - "array_head_and_tail%0#0", - "secondary_market_time_events#5", - "encoded_tuple_buffer%2#0" - ] - }, - "1582": { - "op": "frame_bury 0" - }, - "1584": { - "retsub": true, - "op": "retsub" - }, - "1585": { - "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_is_not_defaulted", - "params": {}, - "block": "assert_is_not_defaulted", - "stack_in": [], - "op": "proto 0 0" - }, - "1588": { - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "1589": { - "op": "bytec 20 // \"defaulted\"", - "defined_out": [ - "\"defaulted\"", - "0" - ], - "stack_out": [ - "0", - "\"defaulted\"" - ] - }, - "1591": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1592": { - "error": "check self.defaulted exists", - "op": "assert // check self.defaulted exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "1593": { - "op": "!", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "1594": { - "error": "Defaulted", - "op": "assert // Defaulted", - "stack_out": [] - }, - "1595": { - "retsub": true, - "op": "retsub" - }, - "1596": { - "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.assign_role", - "params": { - "role_address#0": "bytes", - "role#0": "bytes", - "config#0": "bytes" - }, - "block": "assign_role", - "stack_in": [], - "op": "proto 3 1" - }, - "1599": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "1602": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_is_not_defaulted", - "op": "callsub assert_is_not_defaulted" - }, - "1605": { - "op": "frame_dig -2", - "defined_out": [ - "role#0 (copy)" - ], - "stack_out": [ - "role#0 (copy)" - ] - }, - "1607": { - "op": "btoi", - "defined_out": [ - "awst_tmp%0#0" - ], - "stack_out": [ - "awst_tmp%0#0" - ] - }, - "1608": { - "op": "dup", - "defined_out": [ - "awst_tmp%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "awst_tmp%0#0" - ] - }, - "1609": { - "op": "pushint 20 // 20", - "defined_out": [ - "20", - "awst_tmp%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "awst_tmp%0#0", - "20" - ] - }, - "1611": { - "op": "==", - "defined_out": [ - "awst_tmp%0#0", - "tmp%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%0#0" - ] - }, - "1612": { - "op": "bnz assign_role_bool_true@6", - "stack_out": [ - "awst_tmp%0#0" - ] - }, - "1615": { - "op": "frame_dig 0" - }, - "1617": { - "op": "pushint 40 // 40" - }, - "1619": { - "op": "==" - }, - "1620": { - "op": "bnz assign_role_bool_true@6" - }, - "1623": { - "op": "frame_dig 0" - }, - "1625": { - "op": "pushint 50 // 50" - }, - "1627": { - "op": "==" - }, - "1628": { - "op": "bnz assign_role_bool_true@6" - }, - "1631": { - "op": "frame_dig 0" - }, - "1633": { - "op": "pushint 60 // 60" - }, - "1635": { - "op": "==" - }, - "1636": { - "op": "bnz assign_role_bool_true@6" - }, - "1639": { - "op": "frame_dig 0" - }, - "1641": { - "op": "pushint 70 // 70" - }, - "1643": { - "op": "==" - }, - "1644": { - "op": "bnz assign_role_bool_true@6" - }, - "1647": { - "op": "frame_dig 0" - }, - "1649": { - "op": "pushint 80 // 80" - }, - "1651": { - "op": "==" - }, - "1652": { - "op": "bz assign_role_bool_false@7" - }, - "1655": { - "block": "assign_role_bool_true@6", - "stack_in": [ - "awst_tmp%0#0" - ], - "op": "intc_1 // 1", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "or_result%0#0" - ] - }, - "1656": { - "block": "assign_role_bool_merge@8", - "stack_in": [ - "awst_tmp%0#0", - "or_result%0#0" - ], - "error": "Invalid role identifier", - "op": "assert // Invalid role identifier", - "defined_out": [], - "stack_out": [ - "awst_tmp%0#0" - ] - }, - "1657": { - "op": "pushints 20 40 50 60 70 80 // 20, 40, 50, 60, 70, 80", - "defined_out": [ - "20", - "40", - "50", - "60", - "70", - "80" - ], - "stack_out": [ - "awst_tmp%0#0", - "20", - "40", - "50", - "60", - "70", - "80" - ] - }, - "1665": { - "op": "frame_dig 0", - "defined_out": [ - "20", - "40", - "50", - "60", - "70", - "80", - "awst_tmp%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "20", - "40", - "50", - "60", - "70", - "80", - "awst_tmp%0#0" - ] - }, - "1667": { - "op": "match assign_role_switch_case_0@9 assign_role_switch_case_1@10 assign_role_switch_case_2@11 assign_role_switch_case_3@12 assign_role_switch_case_4@13 assign_role_switch_case_5@14", - "stack_out": [ - "awst_tmp%0#0" - ] - }, - "1681": { - "op": "err" - }, - "1682": { - "block": "assign_role_switch_case_5@14", - "stack_in": [ - "awst_tmp%0#0" - ], - "op": "bytec 30 // 0x52383023", - "defined_out": [ - "0x52383023" - ], - "stack_out": [ - "awst_tmp%0#0", - "0x52383023" - ] - }, - "1684": { - "op": "frame_dig -3", - "defined_out": [ - "0x52383023", - "role_address#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "0x52383023", - "role_address#0 (copy)" - ] - }, - "1686": { - "op": "concat", - "defined_out": [ - "tmp%19#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%19#0" - ] - }, - "1687": { - "op": "dup", - "defined_out": [ - "tmp%19#0", - "tmp%19#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%19#0", - "tmp%19#0 (copy)" - ] - }, - "1688": { - "op": "box_len", - "defined_out": [ - "maybe_exists%4#0", - "maybe_value%4#0", - "tmp%19#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%19#0", - "maybe_value%4#0", - "maybe_exists%4#0" - ] - }, - "1689": { - "op": "bury 1", - "stack_out": [ - "awst_tmp%0#0", - "tmp%19#0", - "maybe_exists%4#0" - ] - }, - "1691": { - "op": "!", - "defined_out": [ - "tmp%19#0", - "tmp%20#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%19#0", - "tmp%20#0" - ] - }, - "1692": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "awst_tmp%0#0", - "tmp%19#0" - ] - }, - "1693": { - "op": "frame_dig -1", - "defined_out": [ - "config#0 (copy)", - "tmp%19#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%19#0", - "config#0 (copy)" - ] - }, - "1695": { - "op": "extract 2 0", - "defined_out": [ - "new_box_value%4#0", - "tmp%19#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%19#0", - "new_box_value%4#0" - ] - }, - "1698": { - "op": "box_put", - "stack_out": [ - "awst_tmp%0#0" - ] - }, - "1699": { - "block": "assign_role_switch_case_next@16", - "stack_in": [ - "awst_tmp%0#0" - ], - "op": "global LatestTimestamp", - "defined_out": [ - "to_encode%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "to_encode%0#0" - ] - }, - "1701": { - "op": "itob", - "defined_out": [ - "val_as_bytes%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "val_as_bytes%0#0" - ] - }, - "1702": { - "op": "swap" - }, - "1703": { - "retsub": true, - "op": "retsub" - }, - "1704": { - "block": "assign_role_switch_case_4@13", - "stack_in": [ - "awst_tmp%0#0" - ], - "op": "bytec 23 // 0x52373023", - "defined_out": [ - "0x52373023" - ], - "stack_out": [ - "awst_tmp%0#0", - "0x52373023" - ] - }, - "1706": { - "op": "frame_dig -3", - "defined_out": [ - "0x52373023", - "role_address#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "0x52373023", - "role_address#0 (copy)" - ] - }, - "1708": { - "op": "concat", - "defined_out": [ - "tmp%16#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%16#0" - ] - }, - "1709": { - "op": "dup", - "defined_out": [ - "tmp%16#0", - "tmp%16#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%16#0", - "tmp%16#0 (copy)" - ] - }, - "1710": { - "op": "box_len", - "defined_out": [ - "maybe_exists%3#0", - "maybe_value%3#0", - "tmp%16#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%16#0", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "1711": { - "op": "bury 1", - "stack_out": [ - "awst_tmp%0#0", - "tmp%16#0", - "maybe_exists%3#0" - ] - }, - "1713": { - "op": "!", - "defined_out": [ - "tmp%16#0", - "tmp%17#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%16#0", - "tmp%17#0" - ] - }, - "1714": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "awst_tmp%0#0", - "tmp%16#0" - ] - }, - "1715": { - "op": "frame_dig -1", - "defined_out": [ - "config#0 (copy)", - "tmp%16#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%16#0", - "config#0 (copy)" - ] - }, - "1717": { - "op": "extract 2 0", - "defined_out": [ - "new_box_value%3#0", - "tmp%16#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%16#0", - "new_box_value%3#0" - ] - }, - "1720": { - "op": "box_put", - "stack_out": [ - "awst_tmp%0#0" - ] - }, - "1721": { - "op": "b assign_role_switch_case_next@16" - }, - "1724": { - "block": "assign_role_switch_case_3@12", - "stack_in": [ - "awst_tmp%0#0" - ], - "op": "bytec 24 // 0x52363023", - "defined_out": [ - "0x52363023" - ], - "stack_out": [ - "awst_tmp%0#0", - "0x52363023" - ] - }, - "1726": { - "op": "frame_dig -3", - "defined_out": [ - "0x52363023", - "role_address#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "0x52363023", - "role_address#0 (copy)" - ] - }, - "1728": { - "op": "concat", - "defined_out": [ - "tmp%13#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%13#0" - ] - }, - "1729": { - "op": "dup", - "defined_out": [ - "tmp%13#0", - "tmp%13#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%13#0", - "tmp%13#0 (copy)" - ] - }, - "1730": { - "op": "box_len", - "defined_out": [ - "maybe_exists%2#0", - "maybe_value%2#0", - "tmp%13#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%13#0", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "1731": { - "op": "bury 1", - "stack_out": [ - "awst_tmp%0#0", - "tmp%13#0", - "maybe_exists%2#0" - ] - }, - "1733": { - "op": "!", - "defined_out": [ - "tmp%13#0", - "tmp%14#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%13#0", - "tmp%14#0" - ] - }, - "1734": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "awst_tmp%0#0", - "tmp%13#0" - ] - }, - "1735": { - "op": "frame_dig -1", - "defined_out": [ - "config#0 (copy)", - "tmp%13#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%13#0", - "config#0 (copy)" - ] - }, - "1737": { - "op": "extract 2 0", - "defined_out": [ - "new_box_value%2#0", - "tmp%13#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%13#0", - "new_box_value%2#0" - ] - }, - "1740": { - "op": "box_put", - "stack_out": [ - "awst_tmp%0#0" - ] - }, - "1741": { - "op": "b assign_role_switch_case_next@16" - }, - "1744": { - "block": "assign_role_switch_case_2@11", - "stack_in": [ - "awst_tmp%0#0" - ], - "op": "bytec 25 // 0x52353023", - "defined_out": [ - "0x52353023" - ], - "stack_out": [ - "awst_tmp%0#0", - "0x52353023" - ] - }, - "1746": { - "op": "frame_dig -3", - "defined_out": [ - "0x52353023", - "role_address#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "0x52353023", - "role_address#0 (copy)" - ] - }, - "1748": { - "op": "concat", - "defined_out": [ - "tmp%10#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%10#0" - ] - }, - "1749": { - "op": "dup", - "defined_out": [ - "tmp%10#0", - "tmp%10#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%10#0", - "tmp%10#0 (copy)" - ] - }, - "1750": { - "op": "box_len", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0", - "tmp%10#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%10#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "1751": { - "op": "bury 1", - "stack_out": [ - "awst_tmp%0#0", - "tmp%10#0", - "maybe_exists%1#0" - ] - }, - "1753": { - "op": "!", - "defined_out": [ - "tmp%10#0", - "tmp%11#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%10#0", - "tmp%11#0" - ] - }, - "1754": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "awst_tmp%0#0", - "tmp%10#0" - ] - }, - "1755": { - "op": "frame_dig -1", - "defined_out": [ - "config#0 (copy)", - "tmp%10#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%10#0", - "config#0 (copy)" - ] - }, - "1757": { - "op": "extract 2 0", - "defined_out": [ - "new_box_value%1#0", - "tmp%10#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%10#0", - "new_box_value%1#0" - ] - }, - "1760": { - "op": "box_put", - "stack_out": [ - "awst_tmp%0#0" - ] - }, - "1761": { - "op": "b assign_role_switch_case_next@16" - }, - "1764": { - "block": "assign_role_switch_case_1@10", - "stack_in": [ - "awst_tmp%0#0" - ], - "op": "bytec 26 // 0x52343023", - "defined_out": [ - "0x52343023" - ], - "stack_out": [ - "awst_tmp%0#0", - "0x52343023" - ] - }, - "1766": { - "op": "frame_dig -3", - "defined_out": [ - "0x52343023", - "role_address#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "0x52343023", - "role_address#0 (copy)" - ] - }, - "1768": { - "op": "concat", - "defined_out": [ - "tmp%7#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%7#0" - ] - }, - "1769": { - "op": "dup", - "defined_out": [ - "tmp%7#0", - "tmp%7#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%7#0", - "tmp%7#0 (copy)" - ] - }, - "1770": { - "op": "box_len", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "tmp%7#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%7#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1771": { - "op": "bury 1", - "stack_out": [ - "awst_tmp%0#0", - "tmp%7#0", - "maybe_exists%0#0" - ] - }, - "1773": { - "op": "!", - "defined_out": [ - "tmp%7#0", - "tmp%8#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%7#0", - "tmp%8#0" - ] - }, - "1774": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "awst_tmp%0#0", - "tmp%7#0" - ] - }, - "1775": { - "op": "frame_dig -1", - "defined_out": [ - "config#0 (copy)", - "tmp%7#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%7#0", - "config#0 (copy)" - ] - }, - "1777": { - "op": "extract 2 0", - "defined_out": [ - "new_box_value%0#0", - "tmp%7#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%7#0", - "new_box_value%0#0" - ] - }, - "1780": { - "op": "box_put", - "stack_out": [ - "awst_tmp%0#0" - ] - }, - "1781": { - "op": "b assign_role_switch_case_next@16" - }, - "1784": { - "block": "assign_role_switch_case_0@9", - "stack_in": [ - "awst_tmp%0#0" - ], - "op": "bytec 8 // 0x52323023", - "defined_out": [ - "0x52323023" - ], - "stack_out": [ - "awst_tmp%0#0", - "0x52323023" - ] - }, - "1786": { - "op": "frame_dig -3", - "defined_out": [ - "0x52323023", - "role_address#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "0x52323023", - "role_address#0 (copy)" - ] - }, - "1788": { - "op": "app_global_put", - "stack_out": [ - "awst_tmp%0#0" - ] - }, - "1789": { - "op": "b assign_role_switch_case_next@16" - }, - "1792": { - "block": "assign_role_bool_false@7", - "stack_in": [ - "awst_tmp%0#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "or_result%0#0" - ] - }, - "1793": { - "op": "b assign_role_bool_merge@8" - }, - "1796": { - "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.revoke_role", - "params": { - "role_address#0": "bytes", - "role#0": "bytes" - }, - "block": "revoke_role", - "stack_in": [], - "op": "proto 2 1" - }, - "1799": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_caller_is_arranger", - "op": "callsub assert_caller_is_arranger" - }, - "1802": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_is_not_defaulted", - "op": "callsub assert_is_not_defaulted" - }, - "1805": { - "op": "frame_dig -1", - "defined_out": [ - "role#0 (copy)" - ], - "stack_out": [ - "role#0 (copy)" - ] - }, - "1807": { - "op": "btoi", - "defined_out": [ - "awst_tmp%0#0" - ], - "stack_out": [ - "awst_tmp%0#0" - ] - }, - "1808": { - "op": "dup", - "defined_out": [ - "awst_tmp%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "awst_tmp%0#0" - ] - }, - "1809": { - "op": "pushint 40 // 40", - "defined_out": [ - "40", - "awst_tmp%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "awst_tmp%0#0", - "40" - ] - }, - "1811": { - "op": "==", - "defined_out": [ - "awst_tmp%0#0", - "tmp%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%0#0" - ] - }, - "1812": { - "op": "bnz revoke_role_bool_true@5", - "stack_out": [ - "awst_tmp%0#0" - ] - }, - "1815": { - "op": "frame_dig 0" - }, - "1817": { - "op": "pushint 50 // 50" - }, - "1819": { - "op": "==" - }, - "1820": { - "op": "bnz revoke_role_bool_true@5" - }, - "1823": { - "op": "frame_dig 0" - }, - "1825": { - "op": "pushint 60 // 60" - }, - "1827": { - "op": "==" - }, - "1828": { - "op": "bnz revoke_role_bool_true@5" - }, - "1831": { - "op": "frame_dig 0" - }, - "1833": { - "op": "pushint 70 // 70" - }, - "1835": { - "op": "==" - }, - "1836": { - "op": "bnz revoke_role_bool_true@5" - }, - "1839": { - "op": "frame_dig 0" - }, - "1841": { - "op": "pushint 80 // 80" - }, - "1843": { - "op": "==" - }, - "1844": { - "op": "bz revoke_role_bool_false@6" - }, - "1847": { - "block": "revoke_role_bool_true@5", - "stack_in": [ - "awst_tmp%0#0" - ], - "op": "intc_1 // 1", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "or_result%0#0" - ] - }, - "1848": { - "block": "revoke_role_bool_merge@7", - "stack_in": [ - "awst_tmp%0#0", - "or_result%0#0" - ], - "error": "Invalid role identifier", - "op": "assert // Invalid role identifier", - "defined_out": [], - "stack_out": [ - "awst_tmp%0#0" - ] - }, - "1849": { - "op": "pushints 40 50 60 70 80 // 40, 50, 60, 70, 80", - "defined_out": [ - "40", - "50", - "60", - "70", - "80" - ], - "stack_out": [ - "awst_tmp%0#0", - "40", - "50", - "60", - "70", - "80" - ] - }, - "1856": { - "op": "frame_dig 0", - "defined_out": [ - "40", - "50", - "60", - "70", - "80", - "awst_tmp%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "40", - "50", - "60", - "70", - "80", - "awst_tmp%0#0" - ] - }, - "1858": { - "op": "match revoke_role_switch_case_0@8 revoke_role_switch_case_1@9 revoke_role_switch_case_2@10 revoke_role_switch_case_3@11 revoke_role_switch_case_4@12", - "stack_out": [ - "awst_tmp%0#0" - ] - }, - "1870": { - "op": "err" - }, - "1871": { - "block": "revoke_role_switch_case_4@12", - "stack_in": [ - "awst_tmp%0#0" - ], - "op": "bytec 30 // 0x52383023", - "defined_out": [ - "0x52383023" - ], - "stack_out": [ - "awst_tmp%0#0", - "0x52383023" - ] - }, - "1873": { - "op": "frame_dig -2", - "defined_out": [ - "0x52383023", - "role_address#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "0x52383023", - "role_address#0 (copy)" - ] - }, - "1875": { - "op": "concat", - "defined_out": [ - "tmp%14#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%14#0" - ] - }, - "1876": { - "op": "dup", - "defined_out": [ - "tmp%14#0", - "tmp%14#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%14#0", - "tmp%14#0 (copy)" - ] - }, - "1877": { - "op": "box_len", - "defined_out": [ - "maybe_exists%4#0", - "maybe_value%4#0", - "tmp%14#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%14#0", - "maybe_value%4#0", - "maybe_exists%4#0" - ] - }, - "1878": { - "op": "bury 1", - "stack_out": [ - "awst_tmp%0#0", - "tmp%14#0", - "maybe_exists%4#0" - ] - }, - "1880": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "awst_tmp%0#0", - "tmp%14#0" - ] - }, - "1881": { - "op": "box_del", - "defined_out": [ - "{box_del}" - ], - "stack_out": [ - "awst_tmp%0#0", - "{box_del}" - ] - }, - "1882": { - "op": "pop", - "stack_out": [ - "awst_tmp%0#0" - ] - }, - "1883": { - "block": "revoke_role_switch_case_next@14", - "stack_in": [ - "awst_tmp%0#0" - ], - "op": "global LatestTimestamp", - "defined_out": [ - "to_encode%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "to_encode%0#0" - ] - }, - "1885": { - "op": "itob", - "defined_out": [ - "val_as_bytes%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "val_as_bytes%0#0" - ] - }, - "1886": { - "op": "swap" - }, - "1887": { - "retsub": true, - "op": "retsub" - }, - "1888": { - "block": "revoke_role_switch_case_3@11", - "stack_in": [ - "awst_tmp%0#0" - ], - "op": "bytec 23 // 0x52373023", - "defined_out": [ - "0x52373023" - ], - "stack_out": [ - "awst_tmp%0#0", - "0x52373023" - ] - }, - "1890": { - "op": "frame_dig -2", - "defined_out": [ - "0x52373023", - "role_address#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "0x52373023", - "role_address#0 (copy)" - ] - }, - "1892": { - "op": "concat", - "defined_out": [ - "tmp%12#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%12#0" - ] - }, - "1893": { - "op": "dup", - "defined_out": [ - "tmp%12#0", - "tmp%12#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%12#0", - "tmp%12#0 (copy)" - ] - }, - "1894": { - "op": "box_len", - "defined_out": [ - "maybe_exists%3#0", - "maybe_value%3#0", - "tmp%12#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%12#0", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "1895": { - "op": "bury 1", - "stack_out": [ - "awst_tmp%0#0", - "tmp%12#0", - "maybe_exists%3#0" - ] - }, - "1897": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "awst_tmp%0#0", - "tmp%12#0" - ] - }, - "1898": { - "op": "box_del", - "defined_out": [ - "{box_del}" - ], - "stack_out": [ - "awst_tmp%0#0", - "{box_del}" - ] - }, - "1899": { - "op": "pop", - "stack_out": [ - "awst_tmp%0#0" - ] - }, - "1900": { - "op": "b revoke_role_switch_case_next@14" - }, - "1903": { - "block": "revoke_role_switch_case_2@10", - "stack_in": [ - "awst_tmp%0#0" - ], - "op": "bytec 24 // 0x52363023", - "defined_out": [ - "0x52363023" - ], - "stack_out": [ - "awst_tmp%0#0", - "0x52363023" - ] - }, - "1905": { - "op": "frame_dig -2", - "defined_out": [ - "0x52363023", - "role_address#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "0x52363023", - "role_address#0 (copy)" - ] - }, - "1907": { - "op": "concat", - "defined_out": [ - "tmp%10#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%10#0" - ] - }, - "1908": { - "op": "dup", - "defined_out": [ - "tmp%10#0", - "tmp%10#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%10#0", - "tmp%10#0 (copy)" - ] - }, - "1909": { - "op": "box_len", - "defined_out": [ - "maybe_exists%2#0", - "maybe_value%2#0", - "tmp%10#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%10#0", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "1910": { - "op": "bury 1", - "stack_out": [ - "awst_tmp%0#0", - "tmp%10#0", - "maybe_exists%2#0" - ] - }, - "1912": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "awst_tmp%0#0", - "tmp%10#0" - ] - }, - "1913": { - "op": "box_del", - "defined_out": [ - "{box_del}" - ], - "stack_out": [ - "awst_tmp%0#0", - "{box_del}" - ] - }, - "1914": { - "op": "pop", - "stack_out": [ - "awst_tmp%0#0" - ] - }, - "1915": { - "op": "b revoke_role_switch_case_next@14" - }, - "1918": { - "block": "revoke_role_switch_case_1@9", - "stack_in": [ - "awst_tmp%0#0" - ], - "op": "bytec 25 // 0x52353023", - "defined_out": [ - "0x52353023" - ], - "stack_out": [ - "awst_tmp%0#0", - "0x52353023" - ] - }, - "1920": { - "op": "frame_dig -2", - "defined_out": [ - "0x52353023", - "role_address#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "0x52353023", - "role_address#0 (copy)" - ] - }, - "1922": { - "op": "concat", - "defined_out": [ - "tmp%8#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%8#0" - ] - }, - "1923": { - "op": "dup", - "defined_out": [ - "tmp%8#0", - "tmp%8#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%8#0", - "tmp%8#0 (copy)" - ] - }, - "1924": { - "op": "box_len", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0", - "tmp%8#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%8#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "1925": { - "op": "bury 1", - "stack_out": [ - "awst_tmp%0#0", - "tmp%8#0", - "maybe_exists%1#0" - ] - }, - "1927": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "awst_tmp%0#0", - "tmp%8#0" - ] - }, - "1928": { - "op": "box_del", - "defined_out": [ - "{box_del}" - ], - "stack_out": [ - "awst_tmp%0#0", - "{box_del}" - ] - }, - "1929": { - "op": "pop", - "stack_out": [ - "awst_tmp%0#0" - ] - }, - "1930": { - "op": "b revoke_role_switch_case_next@14" - }, - "1933": { - "block": "revoke_role_switch_case_0@8", - "stack_in": [ - "awst_tmp%0#0" - ], - "op": "bytec 26 // 0x52343023", - "defined_out": [ - "0x52343023" - ], - "stack_out": [ - "awst_tmp%0#0", - "0x52343023" - ] - }, - "1935": { - "op": "frame_dig -2", - "defined_out": [ - "0x52343023", - "role_address#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "0x52343023", - "role_address#0 (copy)" - ] - }, - "1937": { - "op": "concat", - "defined_out": [ - "tmp%6#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%6#0" - ] - }, - "1938": { - "op": "dup", - "defined_out": [ - "tmp%6#0", - "tmp%6#0 (copy)" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%6#0", - "tmp%6#0 (copy)" - ] - }, - "1939": { - "op": "box_len", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "tmp%6#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "tmp%6#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1940": { - "op": "bury 1", - "stack_out": [ - "awst_tmp%0#0", - "tmp%6#0", - "maybe_exists%0#0" - ] - }, - "1942": { - "error": "Invalid account role address", - "op": "assert // Invalid account role address", - "stack_out": [ - "awst_tmp%0#0", - "tmp%6#0" - ] - }, - "1943": { - "op": "box_del", - "defined_out": [ - "{box_del}" - ], - "stack_out": [ - "awst_tmp%0#0", - "{box_del}" - ] - }, - "1944": { - "op": "pop", - "stack_out": [ - "awst_tmp%0#0" - ] - }, - "1945": { - "op": "b revoke_role_switch_case_next@14" - }, - "1948": { - "block": "revoke_role_bool_false@6", - "stack_in": [ - "awst_tmp%0#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "or_result%0#0" - ], - "stack_out": [ - "awst_tmp%0#0", - "or_result%0#0" - ] - }, - "1949": { - "op": "b revoke_role_bool_merge@7" - }, - "1952": { - "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.open_account", - "params": { - "holding_address#0": "bytes", - "payment_address#0": "bytes" - }, - "block": "open_account", - "stack_in": [], - "op": "proto 2 1" - }, - "1955": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_caller_is_account_manager", - "op": "callsub assert_caller_is_account_manager" - }, - "1958": { - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "1959": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0" - ], - "stack_out": [ - "0", - "\"status\"" - ] - }, - "1960": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1961": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "1962": { - "op": "intc 4 // 200", - "defined_out": [ - "200", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "200" - ] - }, - "1964": { - "op": "==", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "1965": { - "op": "!", - "defined_out": [ - "tmp%1#0" - ], - "stack_out": [ - "tmp%1#0" - ] - }, - "1966": { - "error": "Not authorized", - "op": "assert // Not authorized", - "stack_out": [] - }, - "1967": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_is_not_defaulted", - "op": "callsub assert_is_not_defaulted" - }, - "1970": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_is_not_suspended", - "op": "callsub assert_is_not_suspended" - }, - "1973": { - "op": "bytec 7 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "0x52333023" - ] - }, - "1975": { - "op": "frame_dig -2", - "defined_out": [ - "0x52333023", - "holding_address#0 (copy)" - ], - "stack_out": [ - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "1977": { - "op": "concat", - "defined_out": [ - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0" - ] - }, - "1978": { - "op": "dup", - "defined_out": [ - "tmp%2#0", - "tmp%2#0 (copy)" - ], - "stack_out": [ - "tmp%2#0", - "tmp%2#0 (copy)" - ] - }, - "1979": { - "op": "box_len", - "stack_out": [ - "tmp%2#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "1980": { - "op": "bury 1", - "stack_out": [ - "tmp%2#0", - "maybe_exists%0#0" - ] - }, - "1982": { - "op": "!", - "defined_out": [ - "tmp%2#0", - "tmp%3#0" - ], - "stack_out": [ - "tmp%2#0", - "tmp%3#0" - ] - }, - "1983": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "tmp%2#0" - ] - }, - "1984": { - "op": "frame_dig -1", - "defined_out": [ - "payment_address#0 (copy)", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "payment_address#0 (copy)" - ] - }, - "1986": { - "op": "bytec 27 // 0x0000000000000000", - "defined_out": [ - "0x0000000000000000", - "payment_address#0 (copy)", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "payment_address#0 (copy)", - "0x0000000000000000" - ] - }, - "1988": { - "op": "concat", - "defined_out": [ - "encoded_tuple_buffer%2#0", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "encoded_tuple_buffer%2#0" - ] - }, - "1989": { - "op": "bytec 27 // 0x0000000000000000", - "stack_out": [ - "tmp%2#0", - "encoded_tuple_buffer%2#0", - "0x0000000000000000" - ] - }, - "1991": { - "op": "concat", - "defined_out": [ - "encoded_tuple_buffer%3#0", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "encoded_tuple_buffer%3#0" - ] - }, - "1992": { - "op": "bytec 27 // 0x0000000000000000", - "stack_out": [ - "tmp%2#0", - "encoded_tuple_buffer%3#0", - "0x0000000000000000" - ] - }, - "1994": { - "op": "concat", - "defined_out": [ - "encoded_tuple_buffer%4#0", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "encoded_tuple_buffer%4#0" - ] - }, - "1995": { - "op": "pushbytes 0x00", - "defined_out": [ - "0x00", - "encoded_tuple_buffer%4#0", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "encoded_tuple_buffer%4#0", - "0x00" - ] - }, - "1998": { - "op": "concat", - "defined_out": [ - "encoded_tuple_buffer%5#0", - "tmp%2#0" - ], - "stack_out": [ - "tmp%2#0", - "encoded_tuple_buffer%5#0" - ] - }, - "1999": { - "op": "box_put", - "stack_out": [] - }, - "2000": { - "op": "global LatestTimestamp", - "defined_out": [ - "to_encode%0#0" - ], - "stack_out": [ - "to_encode%0#0" - ] - }, - "2002": { - "op": "itob", - "defined_out": [ - "val_as_bytes%0#0" - ], - "stack_out": [ - "val_as_bytes%0#0" - ] - }, - "2003": { - "retsub": true, - "op": "retsub" - }, - "2004": { - "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_caller_is_account_manager", - "params": {}, - "block": "assert_caller_is_account_manager", - "stack_in": [], - "op": "proto 0 0" - }, - "2007": { - "op": "intc_0 // 0" - }, - "2008": { - "op": "bytec 26 // 0x52343023" - }, - "2010": { - "op": "txn Sender", - "defined_out": [ - "0x52343023", - "caller#0" - ], - "stack_out": [ - "tmp%2#0", - "0x52343023", - "caller#0" - ] - }, - "2012": { - "op": "concat", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%2#0", - "tmp%0#0" - ] - }, - "2013": { - "op": "dup", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%2#0", - "tmp%0#0", - "tmp%0#0" - ] - }, - "2014": { - "op": "box_len", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%2#0", - "tmp%0#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2015": { - "op": "bury 1", - "stack_out": [ - "tmp%2#0", - "tmp%0#0", - "maybe_exists%0#0" - ] - }, - "2017": { - "op": "bz assert_caller_is_account_manager_bool_false@4", - "stack_out": [ - "tmp%2#0", - "tmp%0#0" - ] - }, - "2020": { - "op": "frame_dig 1" - }, - "2022": { - "op": "box_get" - }, - "2023": { - "error": "check self.account_manager entry exists", - "op": "assert // check self.account_manager entry exists" - }, - "2024": { - "error": "Index access is out of bounds", - "op": "extract 0 8 // on error: Index access is out of bounds" - }, - "2027": { - "op": "global LatestTimestamp" - }, - "2029": { - "op": "itob" - }, - "2030": { - "op": "dup" - }, - "2031": { - "op": "frame_bury 0" - }, - "2033": { - "op": "b<=" - }, - "2034": { - "op": "bz assert_caller_is_account_manager_bool_false@4" - }, - "2037": { - "op": "frame_dig 1" - }, - "2039": { - "op": "box_get" - }, - "2040": { - "error": "check self.account_manager entry exists", - "op": "assert // check self.account_manager entry exists" - }, - "2041": { - "error": "Index access is out of bounds", - "op": "extract 8 8 // on error: Index access is out of bounds" - }, - "2044": { - "op": "frame_dig 0" - }, - "2046": { - "op": "b>=" - }, - "2047": { - "op": "bz assert_caller_is_account_manager_bool_false@4" - }, - "2050": { - "op": "intc_1 // 1" - }, - "2051": { - "block": "assert_caller_is_account_manager_bool_merge@5", - "stack_in": [ - "tmp%2#0", - "tmp%0#0", - "and_result%0#0" - ], - "error": "Not authorized", - "op": "assert // Not authorized", - "defined_out": [], - "stack_out": [ - "tmp%2#0", - "tmp%0#0" - ] - }, - "2052": { - "retsub": true, - "op": "retsub" - }, - "2053": { - "block": "assert_caller_is_account_manager_bool_false@4", - "stack_in": [ - "tmp%2#0", - "tmp%0#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "tmp%2#0", - "tmp%0#0", - "and_result%0#0" - ] - }, - "2054": { - "op": "b assert_caller_is_account_manager_bool_merge@5" - }, - "2057": { - "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_is_not_suspended", - "params": {}, - "block": "assert_is_not_suspended", - "stack_in": [], - "op": "proto 0 0" - }, - "2060": { - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "2061": { - "op": "bytec 19 // \"suspended\"", - "defined_out": [ - "\"suspended\"", - "0" - ], - "stack_out": [ - "0", - "\"suspended\"" - ] - }, - "2063": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2064": { - "error": "check self.suspended exists", - "op": "assert // check self.suspended exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "2065": { - "op": "!", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%0#0" - ] - }, - "2066": { - "error": "Suspended operations", - "op": "assert // Suspended operations", - "stack_out": [] - }, - "2067": { - "retsub": true, - "op": "retsub" - }, - "2068": { - "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.close_account", - "params": { - "holding_address#0": "bytes" - }, - "block": "close_account", - "stack_in": [], - "op": "proto 1 1" - }, - "2071": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_caller_is_account_manager", - "op": "callsub assert_caller_is_account_manager" - }, - "2074": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_is_not_defaulted", - "op": "callsub assert_is_not_defaulted" - }, - "2077": { - "op": "bytec 7 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "0x52333023" - ] - }, - "2079": { - "op": "frame_dig -1", - "defined_out": [ - "0x52333023", - "holding_address#0 (copy)" - ], - "stack_out": [ - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "2081": { - "op": "concat", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "2082": { - "op": "dup", - "defined_out": [ - "tmp%0#1", - "tmp%0#1 (copy)" - ], - "stack_out": [ - "tmp%0#1", - "tmp%0#1 (copy)" - ] - }, - "2083": { - "op": "box_len", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#1", - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1", - "maybe_value%0#1", - "maybe_exists%0#0" - ] - }, - "2084": { - "op": "bury 1", - "stack_out": [ - "tmp%0#1", - "maybe_exists%0#0" - ] - }, - "2086": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "tmp%0#1" - ] - }, - "2087": { - "op": "dup", - "stack_out": [ - "tmp%0#1", - "tmp%0#1 (copy)" - ] - }, - "2088": { - "op": "box_get", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2089": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "tmp%0#1", - "maybe_value%0#0" - ] - }, - "2090": { - "error": "Index access is out of bounds", - "op": "extract 32 8 // on error: Index access is out of bounds", - "defined_out": [ - "tmp%0#1", - "tmp%1#0" - ], - "stack_out": [ - "tmp%0#1", - "tmp%1#0" - ] - }, - "2093": { - "op": "btoi", - "defined_out": [ - "closed_units#0", - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1", - "closed_units#0" - ] - }, - "2094": { - "op": "dup", - "stack_out": [ - "tmp%0#1", - "closed_units#0", - "closed_units#0 (copy)" - ] - }, - "2095": { - "op": "uncover 2", - "defined_out": [ - "closed_units#0", - "tmp%0#1" - ], - "stack_out": [ - "closed_units#0", - "closed_units#0", - "tmp%0#1" - ] - }, - "2097": { - "op": "box_del", - "defined_out": [ - "closed_units#0", - "{box_del}" - ], - "stack_out": [ - "closed_units#0", - "closed_units#0", - "{box_del}" - ] - }, - "2098": { - "op": "pop", - "stack_out": [ - "closed_units#0", - "closed_units#0" - ] - }, - "2099": { - "op": "intc_0 // 0", - "stack_out": [ - "closed_units#0", - "closed_units#0", - "0" - ] - }, - "2100": { - "op": "bytec_1 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0", - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "closed_units#0", - "0", - "\"circulating_units\"" - ] - }, - "2101": { - "op": "app_global_get_ex", - "defined_out": [ - "closed_units#0", - "maybe_exists%1#0", - "maybe_value%1#0" - ], - "stack_out": [ - "closed_units#0", - "closed_units#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2102": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "closed_units#0", - "closed_units#0", - "maybe_value%1#0" - ] - }, - "2103": { - "op": "swap", - "stack_out": [ - "closed_units#0", - "maybe_value%1#0", - "closed_units#0" - ] - }, - "2104": { - "op": "-", - "defined_out": [ - "closed_units#0", - "new_state_value%0#0" - ], - "stack_out": [ - "closed_units#0", - "new_state_value%0#0" - ] - }, - "2105": { - "op": "bytec_1 // \"circulating_units\"", - "stack_out": [ - "closed_units#0", - "new_state_value%0#0", - "\"circulating_units\"" - ] - }, - "2106": { - "op": "swap", - "stack_out": [ - "closed_units#0", - "\"circulating_units\"", - "new_state_value%0#0" - ] - }, - "2107": { - "op": "app_global_put", - "stack_out": [ - "closed_units#0" - ] - }, - "2108": { - "op": "intc_0 // 0", - "stack_out": [ - "closed_units#0", - "0" - ] - }, - "2109": { - "op": "bytec_1 // \"circulating_units\"", - "stack_out": [ - "closed_units#0", - "0", - "\"circulating_units\"" - ] - }, - "2110": { - "op": "app_global_get_ex", - "stack_out": [ - "closed_units#0", - "maybe_value%0#1", - "maybe_exists%0#0" - ] - }, - "2111": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "closed_units#0", - "maybe_value%0#1" - ] - }, - "2112": { - "op": "bnz close_account_after_if_else@3", - "stack_out": [ - "closed_units#0" - ] - }, - "2115": { - "op": "bytec_2 // \"status\"" - }, - "2116": { - "op": "intc 4 // 200" - }, - "2118": { - "op": "app_global_put" - }, - "2119": { - "block": "close_account_after_if_else@3", - "stack_in": [ - "closed_units#0" - ], - "op": "frame_dig 0", - "defined_out": [ - "closed_units#0" - ], - "stack_out": [ - "closed_units#0", - "closed_units#0" - ] - }, - "2121": { - "op": "itob", - "defined_out": [ - "closed_units#0", - "val_as_bytes%0#0" - ], - "stack_out": [ - "closed_units#0", - "val_as_bytes%0#0" - ] - }, - "2122": { - "op": "global LatestTimestamp", - "defined_out": [ - "closed_units#0", - "to_encode%0#0", - "val_as_bytes%0#0" - ], - "stack_out": [ - "closed_units#0", - "val_as_bytes%0#0", - "to_encode%0#0" - ] - }, - "2124": { - "op": "itob", - "defined_out": [ - "closed_units#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0" - ], - "stack_out": [ - "closed_units#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0" - ] - }, - "2125": { - "op": "concat", - "defined_out": [ - "closed_units#0", - "encoded_tuple_buffer%2#0" - ], - "stack_out": [ - "closed_units#0", - "encoded_tuple_buffer%2#0" - ] - }, - "2126": { - "op": "swap" - }, - "2127": { - "retsub": true, - "op": "retsub" - }, - "2128": { - "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.primary_distribution", - "params": { - "holding_address#0": "bytes", - "units#0": "bytes" - }, - "block": "primary_distribution", - "stack_in": [], - "op": "proto 2 1" - }, - "2131": { - "op": "intc_0 // 0", - "stack_out": [ - "tmp%0#2" - ] - }, - "2132": { - "op": "dup", - "stack_out": [ - "tmp%0#2", - "tmp%2#2" - ] - }, - "2133": { - "op": "pushbytes \"\"", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0" - ] - }, - "2135": { - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "0" - ] - }, - "2136": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "0", - "\"status\"" - ] - }, - "2137": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2138": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "maybe_value%0#0" - ] - }, - "2139": { - "op": "pushint 100 // 100", - "defined_out": [ - "100", - "maybe_value%0#0" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "maybe_value%0#0", - "100" - ] - }, - "2141": { - "op": "==", - "defined_out": [ - "tmp%0#4" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#4" - ] - }, - "2142": { - "op": "bz primary_distribution_bool_false@5", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0" - ] - }, - "2145": { - "op": "intc_0 // 0" - }, - "2146": { - "op": "bytec 14 // \"primary_distribution_opening_date\"" - }, - "2148": { - "op": "app_global_get_ex" - }, - "2149": { - "error": "check self.primary_distribution_opening_date exists", - "op": "assert // check self.primary_distribution_opening_date exists" - }, - "2150": { - "op": "global LatestTimestamp" - }, - "2152": { - "op": "dup" - }, - "2153": { - "op": "frame_bury 2" - }, - "2155": { - "op": "<=" - }, - "2156": { - "op": "bz primary_distribution_bool_false@5" - }, - "2159": { - "op": "intc_0 // 0" - }, - "2160": { - "op": "bytec 15 // \"primary_distribution_closure_date\"" - }, - "2162": { - "op": "app_global_get_ex" - }, - "2163": { - "error": "check self.primary_distribution_closure_date exists", - "op": "assert // check self.primary_distribution_closure_date exists" - }, - "2164": { - "op": "frame_dig 2" - }, - "2166": { - "op": ">" - }, - "2167": { - "op": "bz primary_distribution_bool_false@5" - }, - "2170": { - "op": "intc_1 // 1" - }, - "2171": { - "block": "primary_distribution_bool_merge@6", - "stack_in": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "and_result%0#0" - ], - "error": "Primary distribution is closed", - "op": "assert // Primary distribution is closed", - "defined_out": [], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0" - ] - }, - "2172": { - "op": "bytec 25 // 0x52353023" - }, - "2174": { - "op": "txn Sender", - "defined_out": [ - "0x52353023", - "caller#0" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "0x52353023", - "caller#0" - ] - }, - "2176": { - "op": "concat", - "defined_out": [ - "tmp%0#2" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2" - ] - }, - "2177": { - "op": "dup", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "tmp%0#2" - ] - }, - "2178": { - "op": "frame_bury 0", - "defined_out": [ - "tmp%0#2" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2" - ] - }, - "2180": { - "op": "box_len", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "tmp%0#2" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2181": { - "op": "bury 1", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "maybe_exists%0#0" - ] - }, - "2183": { - "op": "bz primary_distribution_bool_false@12", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0" - ] - }, - "2186": { - "op": "frame_dig 0" - }, - "2188": { - "op": "box_get" - }, - "2189": { - "error": "check self.primary_dealer entry exists", - "op": "assert // check self.primary_dealer entry exists" - }, - "2190": { - "error": "Index access is out of bounds", - "op": "extract 0 8 // on error: Index access is out of bounds" - }, - "2193": { - "op": "global LatestTimestamp" - }, - "2195": { - "op": "itob" - }, - "2196": { - "op": "dup" - }, - "2197": { - "op": "frame_bury 1" - }, - "2199": { - "op": "b<=" - }, - "2200": { - "op": "bz primary_distribution_bool_false@12" - }, - "2203": { - "op": "frame_dig 0" - }, - "2205": { - "op": "box_get" - }, - "2206": { - "error": "check self.primary_dealer entry exists", - "op": "assert // check self.primary_dealer entry exists" - }, - "2207": { - "error": "Index access is out of bounds", - "op": "extract 8 8 // on error: Index access is out of bounds" - }, - "2210": { - "op": "frame_dig 1" - }, - "2212": { - "op": "b>=" - }, - "2213": { - "op": "bz primary_distribution_bool_false@12" - }, - "2216": { - "op": "intc_1 // 1" - }, - "2217": { - "block": "primary_distribution_bool_merge@13", - "stack_in": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "and_result%0#0" - ], - "error": "Not authorized", - "op": "assert // Not authorized", - "defined_out": [], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0" - ] - }, - "2218": { - "op": "bytec 7 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "0x52333023" - ] - }, - "2220": { - "op": "frame_dig -2", - "defined_out": [ - "0x52333023", - "holding_address#0 (copy)" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "2222": { - "op": "concat", - "defined_out": [ - "tmp%0#2" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2" - ] - }, - "2223": { - "op": "dup", - "defined_out": [ - "tmp%0#2", - "tmp%0#2 (copy)" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "tmp%0#2 (copy)" - ] - }, - "2224": { - "op": "box_len", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "tmp%0#2" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2225": { - "op": "bury 1", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "maybe_exists%0#0" - ] - }, - "2227": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2" - ] - }, - "2228": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_is_not_defaulted", - "op": "callsub assert_is_not_defaulted" - }, - "2231": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_is_not_suspended", - "op": "callsub assert_is_not_suspended" - }, - "2234": { - "op": "frame_dig -1", - "defined_out": [ - "tmp%0#2", - "units#0 (copy)" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "units#0 (copy)" - ] - }, - "2236": { - "op": "btoi", - "defined_out": [ - "tmp%0#0", - "tmp%0#2" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "tmp%0#0" - ] - }, - "2237": { - "op": "dup", - "defined_out": [ - "tmp%0#0", - "tmp%0#0 (copy)", - "tmp%0#2" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "tmp%0#0", - "tmp%0#0 (copy)" - ] - }, - "2238": { - "error": "Can not distribute zero units", - "op": "assert // Can not distribute zero units", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "tmp%0#0" - ] - }, - "2239": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "tmp%0#0", - "tmp%0#2" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "tmp%0#0", - "0" - ] - }, - "2240": { - "op": "bytec_1 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0", - "tmp%0#0", - "tmp%0#2" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "tmp%0#0", - "0", - "\"circulating_units\"" - ] - }, - "2241": { - "op": "app_global_get_ex", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "tmp%0#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2242": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "tmp%0#0", - "maybe_value%0#0" - ] - }, - "2243": { - "op": "dig 1", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "tmp%0#0", - "maybe_value%0#0", - "tmp%0#0 (copy)" - ] - }, - "2245": { - "op": "+", - "defined_out": [ - "tmp%0#0", - "tmp%0#2", - "tmp%3#0" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "tmp%0#0", - "tmp%3#0" - ] - }, - "2246": { - "op": "intc_0 // 0", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "tmp%0#0", - "tmp%3#0", - "0" - ] - }, - "2247": { - "op": "bytec 5 // \"total_units\"", - "defined_out": [ - "\"total_units\"", - "0", - "tmp%0#0", - "tmp%0#2", - "tmp%3#0" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "tmp%0#0", - "tmp%3#0", - "0", - "\"total_units\"" - ] - }, - "2249": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0", - "tmp%0#0", - "tmp%0#2", - "tmp%3#0" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "tmp%0#0", - "tmp%3#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2250": { - "error": "check self.total_units exists", - "op": "assert // check self.total_units exists", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "tmp%0#0", - "tmp%3#0", - "maybe_value%1#0" - ] - }, - "2251": { - "op": "<=", - "defined_out": [ - "tmp%0#0", - "tmp%0#2", - "tmp%4#0" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "tmp%0#0", - "tmp%4#0" - ] - }, - "2252": { - "error": "Insufficient remaining D-ASA units", - "op": "assert // Insufficient remaining D-ASA units", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "tmp%0#0" - ] - }, - "2253": { - "op": "intc_0 // 0", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "tmp%0#0", - "0" - ] - }, - "2254": { - "op": "bytec_1 // \"circulating_units\"", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "tmp%0#0", - "0", - "\"circulating_units\"" - ] - }, - "2255": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%2#0", - "maybe_value%2#0", - "tmp%0#0", - "tmp%0#2" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "tmp%0#0", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "2256": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "tmp%0#0", - "maybe_value%2#0" - ] - }, - "2257": { - "op": "dig 1", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "tmp%0#0", - "maybe_value%2#0", - "tmp%0#0 (copy)" - ] - }, - "2259": { - "op": "+", - "defined_out": [ - "new_state_value%0#0", - "tmp%0#0", - "tmp%0#2" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "tmp%0#0", - "new_state_value%0#0" - ] - }, - "2260": { - "op": "bytec_1 // \"circulating_units\"", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "tmp%0#0", - "new_state_value%0#0", - "\"circulating_units\"" - ] - }, - "2261": { - "op": "swap", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "tmp%0#0", - "\"circulating_units\"", - "new_state_value%0#0" - ] - }, - "2262": { - "op": "app_global_put", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "tmp%0#0" - ] - }, - "2263": { - "op": "dig 1", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "tmp%0#0", - "tmp%0#2 (copy)" - ] - }, - "2265": { - "op": "box_get", - "defined_out": [ - "maybe_exists%3#0", - "maybe_value%3#0", - "tmp%0#0", - "tmp%0#2" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "tmp%0#0", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "2266": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "tmp%0#0", - "maybe_value%3#0" - ] - }, - "2267": { - "error": "Index access is out of bounds", - "op": "extract 32 8 // on error: Index access is out of bounds", - "defined_out": [ - "tmp%0#0", - "tmp%0#2", - "tmp%7#0" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "tmp%0#0", - "tmp%7#0" - ] - }, - "2270": { - "op": "btoi", - "defined_out": [ - "tmp%0#0", - "tmp%0#2", - "tmp%8#0" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "tmp%0#0", - "tmp%8#0" - ] - }, - "2271": { - "op": "+", - "defined_out": [ - "tmp%0#2", - "to_encode%0#0" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "to_encode%0#0" - ] - }, - "2272": { - "op": "itob", - "defined_out": [ - "tmp%0#2", - "val_as_bytes%0#0" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "val_as_bytes%0#0" - ] - }, - "2273": { - "op": "dig 1", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "val_as_bytes%0#0", - "tmp%0#2 (copy)" - ] - }, - "2275": { - "op": "box_get", - "defined_out": [ - "maybe_exists%4#0", - "maybe_value%4#0", - "tmp%0#2", - "val_as_bytes%0#0" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "val_as_bytes%0#0", - "maybe_value%4#0", - "maybe_exists%4#0" - ] - }, - "2276": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "val_as_bytes%0#0", - "maybe_value%4#0" - ] - }, - "2277": { - "op": "swap", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "maybe_value%4#0", - "val_as_bytes%0#0" - ] - }, - "2278": { - "op": "replace2 32", - "defined_out": [ - "tmp%0#2", - "updated_data%0#0" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "updated_data%0#0" - ] - }, - "2280": { - "op": "dig 1", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "updated_data%0#0", - "tmp%0#2 (copy)" - ] - }, - "2282": { - "op": "swap", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "tmp%0#2 (copy)", - "updated_data%0#0" - ] - }, - "2283": { - "op": "box_put", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2" - ] - }, - "2284": { - "op": "intc_0 // 0", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "0" - ] - }, - "2285": { - "op": "bytec 4 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"", - "0", - "tmp%0#2" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "0", - "\"unit_value\"" - ] - }, - "2287": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%5#0", - "maybe_value%5#0", - "tmp%0#2" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "maybe_value%5#0", - "maybe_exists%5#0" - ] - }, - "2288": { - "error": "check self.unit_value exists", - "op": "assert // check self.unit_value exists", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "maybe_value%5#0" - ] - }, - "2289": { - "op": "itob", - "defined_out": [ - "tmp%0#2", - "val_as_bytes%1#0" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "val_as_bytes%1#0" - ] - }, - "2290": { - "op": "dig 1", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "val_as_bytes%1#0", - "tmp%0#2 (copy)" - ] - }, - "2292": { - "op": "box_get", - "defined_out": [ - "maybe_exists%6#0", - "maybe_value%6#0", - "tmp%0#2", - "val_as_bytes%1#0" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "val_as_bytes%1#0", - "maybe_value%6#0", - "maybe_exists%6#0" - ] - }, - "2293": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "val_as_bytes%1#0", - "maybe_value%6#0" - ] - }, - "2294": { - "op": "swap", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "maybe_value%6#0", - "val_as_bytes%1#0" - ] - }, - "2295": { - "op": "replace2 40", - "defined_out": [ - "tmp%0#2", - "updated_data%1#0" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "tmp%0#2", - "updated_data%1#0" - ] - }, - "2297": { - "op": "box_put", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0" - ] - }, - "2298": { - "op": "intc_0 // 0", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "0" - ] - }, - "2299": { - "op": "bytec 5 // \"total_units\"", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "0", - "\"total_units\"" - ] - }, - "2301": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%7#0", - "maybe_value%7#0", - "tmp%0#2" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "maybe_value%7#0", - "maybe_exists%7#0" - ] - }, - "2302": { - "error": "check self.total_units exists", - "op": "assert // check self.total_units exists", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "maybe_value%7#0" - ] - }, - "2303": { - "op": "intc_0 // 0", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "maybe_value%7#0", - "0" - ] - }, - "2304": { - "op": "bytec_1 // \"circulating_units\"", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "maybe_value%7#0", - "0", - "\"circulating_units\"" - ] - }, - "2305": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%8#0", - "maybe_value%7#0", - "maybe_value%8#0", - "tmp%0#2" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "maybe_value%7#0", - "maybe_value%8#0", - "maybe_exists%8#0" - ] - }, - "2306": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "maybe_value%7#0", - "maybe_value%8#0" - ] - }, - "2307": { - "op": "-", - "defined_out": [ - "tmp%0#2", - "to_encode%1#0" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "to_encode%1#0" - ] - }, - "2308": { - "op": "itob", - "defined_out": [ - "tmp%0#2", - "val_as_bytes%2#0" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "val_as_bytes%2#0" - ] - }, - "2309": { - "op": "frame_bury 0" - }, - "2311": { - "retsub": true, - "op": "retsub" - }, - "2312": { - "block": "primary_distribution_bool_false@12", - "stack_in": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "and_result%0#0" - ] - }, - "2313": { - "op": "b primary_distribution_bool_merge@13" - }, - "2316": { - "block": "primary_distribution_bool_false@5", - "stack_in": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "tmp%0#2", - "tmp%2#2", - "awst_tmp%0#0", - "and_result%0#0" - ] - }, - "2317": { - "op": "b primary_distribution_bool_merge@6" - }, - "2320": { - "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.set_asset_suspension", - "params": { - "suspended#0": "bytes" - }, - "block": "set_asset_suspension", - "stack_in": [], - "op": "proto 1 1" - }, - "2323": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_caller_is_authority", - "op": "callsub assert_caller_is_authority" - }, - "2326": { - "op": "frame_dig -1", - "defined_out": [ - "suspended#0 (copy)" - ], - "stack_out": [ - "suspended#0 (copy)" - ] - }, - "2328": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "suspended#0 (copy)" - ], - "stack_out": [ - "suspended#0 (copy)", - "0" - ] - }, - "2329": { - "op": "getbit", - "defined_out": [ - "reinterpret_uint64%0#0" - ], - "stack_out": [ - "reinterpret_uint64%0#0" - ] - }, - "2330": { - "op": "bytec 19 // \"suspended\"", - "defined_out": [ - "\"suspended\"", - "reinterpret_uint64%0#0" - ], - "stack_out": [ - "reinterpret_uint64%0#0", - "\"suspended\"" - ] - }, - "2332": { - "op": "swap", - "stack_out": [ - "\"suspended\"", - "reinterpret_uint64%0#0" - ] - }, - "2333": { - "op": "app_global_put", - "stack_out": [] - }, - "2334": { - "op": "global LatestTimestamp", - "defined_out": [ - "to_encode%0#0" - ], - "stack_out": [ - "to_encode%0#0" - ] - }, - "2336": { - "op": "itob", - "defined_out": [ - "val_as_bytes%0#0" - ], - "stack_out": [ - "val_as_bytes%0#0" - ] - }, - "2337": { - "retsub": true, - "op": "retsub" - }, - "2338": { - "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_caller_is_authority", - "params": {}, - "block": "assert_caller_is_authority", - "stack_in": [], - "op": "proto 0 0" - }, - "2341": { - "op": "intc_0 // 0" - }, - "2342": { - "op": "bytec 23 // 0x52373023" - }, - "2344": { - "op": "txn Sender", - "defined_out": [ - "0x52373023", - "caller#0" - ], - "stack_out": [ - "tmp%2#0", - "0x52373023", - "caller#0" - ] - }, - "2346": { - "op": "concat", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%2#0", - "tmp%0#0" - ] - }, - "2347": { - "op": "dup", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%2#0", - "tmp%0#0", - "tmp%0#0" - ] - }, - "2348": { - "op": "box_len", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%2#0", - "tmp%0#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2349": { - "op": "bury 1", - "stack_out": [ - "tmp%2#0", - "tmp%0#0", - "maybe_exists%0#0" - ] - }, - "2351": { - "op": "bz assert_caller_is_authority_bool_false@4", - "stack_out": [ - "tmp%2#0", - "tmp%0#0" - ] - }, - "2354": { - "op": "frame_dig 1" - }, - "2356": { - "op": "box_get" - }, - "2357": { - "error": "check self.authority entry exists", - "op": "assert // check self.authority entry exists" - }, - "2358": { - "error": "Index access is out of bounds", - "op": "extract 0 8 // on error: Index access is out of bounds" - }, - "2361": { - "op": "global LatestTimestamp" - }, - "2363": { - "op": "itob" - }, - "2364": { - "op": "dup" - }, - "2365": { - "op": "frame_bury 0" - }, - "2367": { - "op": "b<=" - }, - "2368": { - "op": "bz assert_caller_is_authority_bool_false@4" - }, - "2371": { - "op": "frame_dig 1" - }, - "2373": { - "op": "box_get" - }, - "2374": { - "error": "check self.authority entry exists", - "op": "assert // check self.authority entry exists" - }, - "2375": { - "error": "Index access is out of bounds", - "op": "extract 8 8 // on error: Index access is out of bounds" - }, - "2378": { - "op": "frame_dig 0" - }, - "2380": { - "op": "b>=" - }, - "2381": { - "op": "bz assert_caller_is_authority_bool_false@4" - }, - "2384": { - "op": "intc_1 // 1" - }, - "2385": { - "block": "assert_caller_is_authority_bool_merge@5", - "stack_in": [ - "tmp%2#0", - "tmp%0#0", - "and_result%0#0" - ], - "error": "Not authorized", - "op": "assert // Not authorized", - "defined_out": [], - "stack_out": [ - "tmp%2#0", - "tmp%0#0" - ] - }, - "2386": { - "retsub": true, - "op": "retsub" - }, - "2387": { - "block": "assert_caller_is_authority_bool_false@4", - "stack_in": [ - "tmp%2#0", - "tmp%0#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "tmp%2#0", - "tmp%0#0", - "and_result%0#0" - ] - }, - "2388": { - "op": "b assert_caller_is_authority_bool_merge@5" - }, - "2391": { - "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.set_account_suspension", - "params": { - "holding_address#0": "bytes", - "suspended#0": "bytes" - }, - "block": "set_account_suspension", - "stack_in": [], - "op": "proto 2 1" - }, - "2394": { - "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_caller_is_authority", - "op": "callsub assert_caller_is_authority" - }, - "2397": { - "op": "bytec 7 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "0x52333023" - ] - }, - "2399": { - "op": "frame_dig -2", - "defined_out": [ - "0x52333023", - "holding_address#0 (copy)" - ], - "stack_out": [ - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "2401": { - "op": "concat", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "2402": { - "op": "dup", - "defined_out": [ - "tmp%0#1", - "tmp%0#1 (copy)" - ], - "stack_out": [ - "tmp%0#1", - "tmp%0#1 (copy)" - ] - }, - "2403": { - "op": "box_len", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#1", - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1", - "maybe_value%0#1", - "maybe_exists%0#0" - ] - }, - "2404": { - "op": "bury 1", - "stack_out": [ - "tmp%0#1", - "maybe_exists%0#0" - ] - }, - "2406": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "tmp%0#1" - ] - }, - "2407": { - "op": "dup", - "stack_out": [ - "tmp%0#1", - "tmp%0#1 (copy)" - ] - }, - "2408": { - "op": "box_get", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2409": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "tmp%0#1", - "maybe_value%0#0" - ] - }, - "2410": { - "op": "frame_dig -1", - "defined_out": [ - "maybe_value%0#0", - "suspended#0 (copy)", - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1", - "maybe_value%0#0", - "suspended#0 (copy)" - ] - }, - "2412": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "maybe_value%0#0", - "suspended#0 (copy)", - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1", - "maybe_value%0#0", - "suspended#0 (copy)", - "0" - ] - }, - "2413": { - "op": "getbit", - "defined_out": [ - "is_true%0#0", - "maybe_value%0#0", - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1", - "maybe_value%0#0", - "is_true%0#0" - ] - }, - "2414": { - "op": "pushint 448 // 448" - }, - "2417": { - "op": "swap", - "defined_out": [ - "448", - "is_true%0#0", - "maybe_value%0#0", - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1", - "maybe_value%0#0", - "448", - "is_true%0#0" - ] - }, - "2418": { - "op": "setbit", - "defined_out": [ - "tmp%0#1", - "updated_data%0#0" - ], - "stack_out": [ - "tmp%0#1", - "updated_data%0#0" - ] - }, - "2419": { - "op": "box_put", - "stack_out": [] - }, - "2420": { - "op": "global LatestTimestamp", - "defined_out": [ - "to_encode%0#0" - ], - "stack_out": [ - "to_encode%0#0" - ] - }, - "2422": { - "op": "itob", - "defined_out": [ - "val_as_bytes%0#0" - ], - "stack_out": [ - "val_as_bytes%0#0" - ] - }, - "2423": { - "retsub": true, - "op": "retsub" - }, - "2424": { - "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.set_default_status", - "params": { - "defaulted#0": "bytes" - }, - "block": "set_default_status", - "stack_in": [], - "op": "proto 1 0" - }, - "2427": { - "op": "intc_0 // 0" - }, - "2428": { - "op": "bytec 24 // 0x52363023" - }, - "2430": { - "op": "txn Sender", - "defined_out": [ - "0x52363023", - "caller#0" - ], - "stack_out": [ - "tmp%2#0", - "0x52363023", - "caller#0" - ] - }, - "2432": { - "op": "concat", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%2#0", - "tmp%0#0" - ] - }, - "2433": { - "op": "dup", - "defined_out": [ - "tmp%0#0" - ], - "stack_out": [ - "tmp%2#0", - "tmp%0#0", - "tmp%0#0" - ] - }, - "2434": { - "op": "box_len", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "tmp%0#0" - ], - "stack_out": [ - "tmp%2#0", - "tmp%0#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2435": { - "op": "bury 1", - "stack_out": [ - "tmp%2#0", - "tmp%0#0", - "maybe_exists%0#0" - ] - }, - "2437": { - "op": "bz set_default_status_bool_false@5", - "stack_out": [ - "tmp%2#0", - "tmp%0#0" - ] - }, - "2440": { - "op": "frame_dig 1" - }, - "2442": { - "op": "box_get" - }, - "2443": { - "error": "check self.trustee entry exists", - "op": "assert // check self.trustee entry exists" - }, - "2444": { - "error": "Index access is out of bounds", - "op": "extract 0 8 // on error: Index access is out of bounds" - }, - "2447": { - "op": "global LatestTimestamp" - }, - "2449": { - "op": "itob" - }, - "2450": { - "op": "dup" - }, - "2451": { - "op": "frame_bury 0" - }, - "2453": { - "op": "b<=" - }, - "2454": { - "op": "bz set_default_status_bool_false@5" - }, - "2457": { - "op": "frame_dig 1" - }, - "2459": { - "op": "box_get" - }, - "2460": { - "error": "check self.trustee entry exists", - "op": "assert // check self.trustee entry exists" - }, - "2461": { - "error": "Index access is out of bounds", - "op": "extract 8 8 // on error: Index access is out of bounds" - }, - "2464": { - "op": "frame_dig 0" - }, - "2466": { - "op": "b>=" - }, - "2467": { - "op": "bz set_default_status_bool_false@5" - }, - "2470": { - "op": "intc_1 // 1" - }, - "2471": { - "block": "set_default_status_bool_merge@6", - "stack_in": [ - "tmp%2#0", - "tmp%0#0", - "and_result%0#0" - ], - "error": "Not authorized", - "op": "assert // Not authorized", - "defined_out": [], - "stack_out": [ - "tmp%2#0", - "tmp%0#0" - ] - }, - "2472": { - "op": "frame_dig -1", - "defined_out": [ - "defaulted#0 (copy)" - ], - "stack_out": [ - "tmp%2#0", - "tmp%0#0", - "defaulted#0 (copy)" - ] - }, - "2474": { - "op": "intc_0 // 0", - "defined_out": [ - "0", - "defaulted#0 (copy)" - ], - "stack_out": [ - "tmp%2#0", - "tmp%0#0", - "defaulted#0 (copy)", - "0" - ] - }, - "2475": { - "op": "getbit", - "defined_out": [ - "reinterpret_uint64%0#0" - ], - "stack_out": [ - "tmp%2#0", - "tmp%0#0", - "reinterpret_uint64%0#0" - ] - }, - "2476": { - "op": "bytec 20 // \"defaulted\"", - "defined_out": [ - "\"defaulted\"", - "reinterpret_uint64%0#0" - ], - "stack_out": [ - "tmp%2#0", - "tmp%0#0", - "reinterpret_uint64%0#0", - "\"defaulted\"" - ] - }, - "2478": { - "op": "swap", - "stack_out": [ - "tmp%2#0", - "tmp%0#0", - "\"defaulted\"", - "reinterpret_uint64%0#0" - ] - }, - "2479": { - "op": "app_global_put", - "stack_out": [ - "tmp%2#0", - "tmp%0#0" - ] - }, - "2480": { - "retsub": true, - "op": "retsub" - }, - "2481": { - "block": "set_default_status_bool_false@5", - "stack_in": [ - "tmp%2#0", - "tmp%0#0" - ], - "op": "intc_0 // 0", - "defined_out": [ - "and_result%0#0" - ], - "stack_out": [ - "tmp%2#0", - "tmp%0#0", - "and_result%0#0" - ] - }, - "2482": { - "op": "b set_default_status_bool_merge@6" - }, - "2485": { - "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.get_asset_info", - "params": {}, - "block": "get_asset_info", - "stack_in": [], - "op": "proto 0 1" - }, - "2488": { - "op": "intc_0 // 0" - }, - "2489": { - "op": "dup" - }, - "2490": { - "op": "global LatestTimestamp" - }, - "2492": { - "op": "intc_0 // 0" - }, - "2493": { - "op": "bytec_3 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "0", - "performance#0", - "tmp%0#0" - ], - "stack_out": [ - "performance#0", - "performance#0", - "tmp%0#0", - "0", - "\"maturity_date\"" - ] - }, - "2494": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "performance#0", - "tmp%0#0" - ], - "stack_out": [ - "performance#0", - "performance#0", - "tmp%0#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2495": { - "op": "swap", - "stack_out": [ - "performance#0", - "performance#0", - "tmp%0#0", - "maybe_exists%0#0", - "maybe_value%0#0" - ] - }, - "2496": { - "op": "dup", - "stack_out": [ - "performance#0", - "performance#0", - "tmp%0#0", - "maybe_exists%0#0", - "maybe_value%0#0", - "maybe_value%0#0 (copy)" - ] - }, - "2497": { - "op": "cover 2", - "stack_out": [ - "performance#0", - "performance#0", - "tmp%0#0", - "maybe_value%0#0", - "maybe_exists%0#0", - "maybe_value%0#0" - ] - }, - "2499": { - "op": "cover 4", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "performance#0", - "tmp%0#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#0", - "tmp%0#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2501": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#0", - "tmp%0#0", - "maybe_value%0#0" - ] - }, - "2502": { - "op": ">", - "defined_out": [ - "maybe_value%0#0", - "performance#0", - "performance#8", - "tmp%1#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "tmp%1#0" - ] - }, - "2503": { - "op": "bz get_asset_info_after_if_else@3", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8" - ] - }, - "2506": { - "op": "frame_dig 0" - }, - "2508": { - "op": "frame_bury 2" - }, - "2510": { - "op": "frame_dig 1" - }, - "2512": { - "op": "bz get_asset_info_after_if_else@3" - }, - "2515": { - "op": "intc_3 // 4" - }, - "2516": { - "op": "frame_bury 2" - }, - "2518": { - "block": "get_asset_info_after_if_else@3", - "stack_in": [ - "performance#0", - "maybe_value%0#0", - "performance#8" - ], - "op": "frame_dig 2", - "defined_out": [ - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "performance#0" - ] - }, - "2520": { - "op": "frame_bury 0", - "defined_out": [ - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8" - ] - }, - "2522": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "0" - ] - }, - "2523": { - "op": "bytec 20 // \"defaulted\"", - "defined_out": [ - "\"defaulted\"", - "0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "0", - "\"defaulted\"" - ] - }, - "2525": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2526": { - "error": "check self.defaulted exists", - "op": "assert // check self.defaulted exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "maybe_value%1#0" - ] - }, - "2527": { - "op": "bz get_asset_info_after_if_else@5", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8" - ] - }, - "2530": { - "op": "pushint 3 // 3" - }, - "2532": { - "op": "frame_bury 0" - }, - "2534": { - "block": "get_asset_info_after_if_else@5", - "stack_in": [ - "performance#0", - "maybe_value%0#0", - "performance#8" - ], - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "0" - ] - }, - "2535": { - "op": "bytec 9 // \"denomination_asset_id\"", - "defined_out": [ - "\"denomination_asset_id\"", - "0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "0", - "\"denomination_asset_id\"" - ] - }, - "2537": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%2#0", - "maybe_value%2#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "maybe_value%2#0", - "maybe_exists%2#0" - ] - }, - "2538": { - "error": "check self.denomination_asset_id exists", - "op": "assert // check self.denomination_asset_id exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "maybe_value%2#0" - ] - }, - "2539": { - "op": "itob", - "defined_out": [ - "val_as_bytes%0#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0" - ] - }, - "2540": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "0" - ] - }, - "2541": { - "op": "bytec 10 // \"settlement_asset_id\"", - "defined_out": [ - "\"settlement_asset_id\"", - "0", - "val_as_bytes%0#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "0", - "\"settlement_asset_id\"" - ] - }, - "2543": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%3#0", - "maybe_value%3#0", - "val_as_bytes%0#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "maybe_value%3#0", - "maybe_exists%3#0" - ] - }, - "2544": { - "error": "check self.settlement_asset_id exists", - "op": "assert // check self.settlement_asset_id exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "maybe_value%3#0" - ] - }, - "2545": { - "op": "itob", - "defined_out": [ - "val_as_bytes%0#0", - "val_as_bytes%1#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0" - ] - }, - "2546": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "0" - ] - }, - "2547": { - "op": "bytec_1 // \"circulating_units\"", - "defined_out": [ - "\"circulating_units\"", - "0", - "val_as_bytes%0#0", - "val_as_bytes%1#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "0", - "\"circulating_units\"" - ] - }, - "2548": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2549": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "maybe_value%0#0" - ] - }, - "2550": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "maybe_value%0#0", - "0" - ] - }, - "2551": { - "op": "bytec 4 // \"unit_value\"", - "defined_out": [ - "\"unit_value\"", - "0", - "maybe_value%0#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "maybe_value%0#0", - "0", - "\"unit_value\"" - ] - }, - "2553": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "maybe_value%0#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2554": { - "error": "check self.unit_value exists", - "op": "assert // check self.unit_value exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "maybe_value%0#0", - "maybe_value%1#0" - ] - }, - "2555": { - "op": "*", - "defined_out": [ - "maybe_value%0#0", - "tmp%0#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "tmp%0#0" - ] - }, - "2556": { - "op": "itob", - "defined_out": [ - "maybe_value%0#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0" - ] - }, - "2557": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "0" - ] - }, - "2558": { - "op": "bytec 4 // \"unit_value\"", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "0", - "\"unit_value\"" - ] - }, - "2560": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%4#0", - "maybe_value%0#0", - "maybe_value%4#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "maybe_value%4#0", - "maybe_exists%4#0" - ] - }, - "2561": { - "error": "check self.unit_value exists", - "op": "assert // check self.unit_value exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "maybe_value%4#0" - ] - }, - "2562": { - "op": "itob", - "defined_out": [ - "maybe_value%0#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0" - ] - }, - "2563": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "0" - ] - }, - "2564": { - "op": "bytec 11 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"", - "0", - "maybe_value%0#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "0", - "\"day_count_convention\"" - ] - }, - "2566": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%5#0", - "maybe_value%0#0", - "maybe_value%5#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "maybe_value%5#0", - "maybe_exists%5#0" - ] - }, - "2567": { - "error": "check self.day_count_convention exists", - "op": "assert // check self.day_count_convention exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "maybe_value%5#0" - ] - }, - "2568": { - "op": "itob", - "defined_out": [ - "maybe_value%0#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "val_as_bytes%4#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "val_as_bytes%4#0" - ] - }, - "2569": { - "op": "extract 7 1", - "defined_out": [ - "maybe_value%0#0", - "tmp%4#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0" - ] - }, - "2572": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "0" - ] - }, - "2573": { - "op": "bytec 13 // \"principal_discount\"", - "defined_out": [ - "\"principal_discount\"", - "0", - "maybe_value%0#0", - "tmp%4#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "0", - "\"principal_discount\"" - ] - }, - "2575": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%6#0", - "maybe_value%0#0", - "maybe_value%6#0", - "tmp%4#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "maybe_value%6#0", - "maybe_exists%6#0" - ] - }, - "2576": { - "error": "check self.principal_discount exists", - "op": "assert // check self.principal_discount exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "maybe_value%6#0" - ] - }, - "2577": { - "op": "itob", - "defined_out": [ - "maybe_value%0#0", - "tmp%4#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "val_as_bytes%5#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "val_as_bytes%5#0" - ] - }, - "2578": { - "op": "extract 6 2", - "defined_out": [ - "maybe_value%0#0", - "tmp%4#0", - "tmp%5#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0" - ] - }, - "2581": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "0" - ] - }, - "2582": { - "op": "bytec 21 // \"interest_rate\"", - "defined_out": [ - "\"interest_rate\"", - "0", - "maybe_value%0#0", - "tmp%4#0", - "tmp%5#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "0", - "\"interest_rate\"" - ] - }, - "2584": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%7#0", - "maybe_value%0#0", - "maybe_value%7#0", - "tmp%4#0", - "tmp%5#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "maybe_value%7#0", - "maybe_exists%7#0" - ] - }, - "2585": { - "error": "check self.interest_rate exists", - "op": "assert // check self.interest_rate exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "maybe_value%7#0" - ] - }, - "2586": { - "op": "itob", - "defined_out": [ - "maybe_value%0#0", - "tmp%4#0", - "tmp%5#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "val_as_bytes%6#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "val_as_bytes%6#0" - ] - }, - "2587": { - "op": "extract 6 2", - "defined_out": [ - "maybe_value%0#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0" - ] - }, - "2590": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "0" - ] - }, - "2591": { - "op": "bytec 5 // \"total_units\"", - "defined_out": [ - "\"total_units\"", - "0", - "maybe_value%0#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "0", - "\"total_units\"" - ] - }, - "2593": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%8#0", - "maybe_value%0#0", - "maybe_value%8#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "maybe_value%8#0", - "maybe_exists%8#0" - ] - }, - "2594": { - "error": "check self.total_units exists", - "op": "assert // check self.total_units exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "maybe_value%8#0" - ] - }, - "2595": { - "op": "itob", - "defined_out": [ - "maybe_value%0#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "val_as_bytes%7#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0" - ] - }, - "2596": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "0" - ] - }, - "2597": { - "op": "bytec_1 // \"circulating_units\"", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "0", - "\"circulating_units\"" - ] - }, - "2598": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%9#0", - "maybe_value%0#0", - "maybe_value%9#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "val_as_bytes%7#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "maybe_value%9#0", - "maybe_exists%9#0" - ] - }, - "2599": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "maybe_value%9#0" - ] - }, - "2600": { - "op": "itob", - "defined_out": [ - "maybe_value%0#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0" - ] - }, - "2601": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "0" - ] - }, - "2602": { - "op": "bytec 14 // \"primary_distribution_opening_date\"", - "defined_out": [ - "\"primary_distribution_opening_date\"", - "0", - "maybe_value%0#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "0", - "\"primary_distribution_opening_date\"" - ] - }, - "2604": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%10#0", - "maybe_value%0#0", - "maybe_value%10#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "maybe_value%10#0", - "maybe_exists%10#0" - ] - }, - "2605": { - "error": "check self.primary_distribution_opening_date exists", - "op": "assert // check self.primary_distribution_opening_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "maybe_value%10#0" - ] - }, - "2606": { - "op": "itob", - "defined_out": [ - "maybe_value%0#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0" - ] - }, - "2607": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "0" - ] - }, - "2608": { - "op": "bytec 15 // \"primary_distribution_closure_date\"", - "defined_out": [ - "\"primary_distribution_closure_date\"", - "0", - "maybe_value%0#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "0", - "\"primary_distribution_closure_date\"" - ] - }, - "2610": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%11#0", - "maybe_value%0#0", - "maybe_value%11#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "maybe_value%11#0", - "maybe_exists%11#0" - ] - }, - "2611": { - "error": "check self.primary_distribution_closure_date exists", - "op": "assert // check self.primary_distribution_closure_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "maybe_value%11#0" - ] - }, - "2612": { - "op": "itob", - "defined_out": [ - "maybe_value%0#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%10#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0" - ] - }, - "2613": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "0" - ] - }, - "2614": { - "op": "bytec 16 // \"issuance_date\"", - "defined_out": [ - "\"issuance_date\"", - "0", - "maybe_value%0#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%10#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "0", - "\"issuance_date\"" - ] - }, - "2616": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%12#0", - "maybe_value%0#0", - "maybe_value%12#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%10#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "maybe_value%12#0", - "maybe_exists%12#0" - ] - }, - "2617": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "maybe_value%12#0" - ] - }, - "2618": { - "op": "itob", - "defined_out": [ - "maybe_value%0#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0" - ] - }, - "2619": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "0" - ] - }, - "2620": { - "op": "bytec_3 // \"maturity_date\"", - "defined_out": [ - "\"maturity_date\"", - "0", - "maybe_value%0#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "0", - "\"maturity_date\"" - ] - }, - "2621": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%13#0", - "maybe_value%0#0", - "maybe_value%13#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "maybe_value%13#0", - "maybe_exists%13#0" - ] - }, - "2622": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "maybe_value%13#0" - ] - }, - "2623": { - "op": "itob", - "defined_out": [ - "maybe_value%0#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0" - ] - }, - "2624": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "0" - ] - }, - "2625": { - "op": "bytec 19 // \"suspended\"", - "defined_out": [ - "\"suspended\"", - "0", - "maybe_value%0#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "0", - "\"suspended\"" - ] - }, - "2627": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%14#0", - "maybe_value%0#0", - "maybe_value%14#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "maybe_value%14#0", - "maybe_exists%14#0" - ] - }, - "2628": { - "error": "check self.suspended exists", - "op": "assert // check self.suspended exists", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "maybe_value%14#0" - ] - }, - "2629": { - "op": "pushbytes 0x00", - "defined_out": [ - "0x00", - "maybe_value%0#0", - "maybe_value%14#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "maybe_value%14#0", - "0x00" - ] - }, - "2632": { - "op": "intc_0 // 0", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "maybe_value%14#0", - "0x00", - "0" - ] - }, - "2633": { - "op": "uncover 2", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "0x00", - "0", - "maybe_value%14#0" - ] - }, - "2635": { - "op": "setbit", - "defined_out": [ - "encoded_bool%0#0", - "maybe_value%0#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "encoded_bool%0#0" - ] - }, - "2636": { - "op": "frame_dig 0", - "defined_out": [ - "encoded_bool%0#0", - "maybe_value%0#0", - "performance#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "encoded_bool%0#0", - "performance#0" - ] - }, - "2638": { - "op": "itob", - "defined_out": [ - "encoded_bool%0#0", - "maybe_value%0#0", - "performance#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "val_as_bytes%13#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "encoded_bool%0#0", - "val_as_bytes%13#0" - ] - }, - "2639": { - "op": "extract 7 1", - "defined_out": [ - "encoded_bool%0#0", - "maybe_value%0#0", - "performance#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "tmp%7#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "encoded_bool%0#0", - "tmp%7#0" - ] - }, - "2642": { - "op": "uncover 14" - }, - "2644": { - "op": "uncover 14", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "encoded_bool%0#0", - "tmp%7#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0" - ] - }, - "2646": { - "op": "concat", - "defined_out": [ - "encoded_bool%0#0", - "encoded_tuple_buffer%2#0", - "maybe_value%0#0", - "performance#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "tmp%7#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%2#0", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "encoded_bool%0#0", - "tmp%7#0", - "encoded_tuple_buffer%2#0" - ] - }, - "2647": { - "op": "uncover 13", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "encoded_bool%0#0", - "tmp%7#0", - "encoded_tuple_buffer%2#0", - "val_as_bytes%2#0" - ] - }, - "2649": { - "op": "concat", - "defined_out": [ - "encoded_bool%0#0", - "encoded_tuple_buffer%3#0", - "maybe_value%0#0", - "performance#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "tmp%7#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "val_as_bytes%3#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%3#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "encoded_bool%0#0", - "tmp%7#0", - "encoded_tuple_buffer%3#0" - ] - }, - "2650": { - "op": "uncover 12", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "encoded_bool%0#0", - "tmp%7#0", - "encoded_tuple_buffer%3#0", - "val_as_bytes%3#0" - ] - }, - "2652": { - "op": "concat", - "defined_out": [ - "encoded_bool%0#0", - "encoded_tuple_buffer%4#0", - "maybe_value%0#0", - "performance#0", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "tmp%7#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "tmp%4#0", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "encoded_bool%0#0", - "tmp%7#0", - "encoded_tuple_buffer%4#0" - ] - }, - "2653": { - "op": "uncover 11", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "encoded_bool%0#0", - "tmp%7#0", - "encoded_tuple_buffer%4#0", - "tmp%4#0" - ] - }, - "2655": { - "op": "concat", - "defined_out": [ - "encoded_bool%0#0", - "encoded_tuple_buffer%5#0", - "maybe_value%0#0", - "performance#0", - "tmp%5#0", - "tmp%6#0", - "tmp%7#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "tmp%5#0", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "encoded_bool%0#0", - "tmp%7#0", - "encoded_tuple_buffer%5#0" - ] - }, - "2656": { - "op": "uncover 10", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "encoded_bool%0#0", - "tmp%7#0", - "encoded_tuple_buffer%5#0", - "tmp%5#0" - ] - }, - "2658": { - "op": "concat", - "defined_out": [ - "encoded_bool%0#0", - "encoded_tuple_buffer%6#0", - "maybe_value%0#0", - "performance#0", - "tmp%6#0", - "tmp%7#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "tmp%6#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "encoded_bool%0#0", - "tmp%7#0", - "encoded_tuple_buffer%6#0" - ] - }, - "2659": { - "op": "uncover 9", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "encoded_bool%0#0", - "tmp%7#0", - "encoded_tuple_buffer%6#0", - "tmp%6#0" - ] - }, - "2661": { - "op": "concat", - "defined_out": [ - "encoded_bool%0#0", - "encoded_tuple_buffer%7#0", - "maybe_value%0#0", - "performance#0", - "tmp%7#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%7#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "encoded_bool%0#0", - "tmp%7#0", - "encoded_tuple_buffer%7#0" - ] - }, - "2662": { - "op": "uncover 8", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "encoded_bool%0#0", - "tmp%7#0", - "encoded_tuple_buffer%7#0", - "val_as_bytes%7#0" - ] - }, - "2664": { - "op": "concat", - "defined_out": [ - "encoded_bool%0#0", - "encoded_tuple_buffer%8#0", - "maybe_value%0#0", - "performance#0", - "tmp%7#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "val_as_bytes%8#0", - "val_as_bytes%9#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%8#0", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "encoded_bool%0#0", - "tmp%7#0", - "encoded_tuple_buffer%8#0" - ] - }, - "2665": { - "op": "uncover 7", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "encoded_bool%0#0", - "tmp%7#0", - "encoded_tuple_buffer%8#0", - "val_as_bytes%8#0" - ] - }, - "2667": { - "op": "concat", - "defined_out": [ - "encoded_bool%0#0", - "encoded_tuple_buffer%9#0", - "maybe_value%0#0", - "performance#0", - "tmp%7#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "val_as_bytes%9#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%9#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "encoded_bool%0#0", - "tmp%7#0", - "encoded_tuple_buffer%9#0" - ] - }, - "2668": { - "op": "uncover 6", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "encoded_bool%0#0", - "tmp%7#0", - "encoded_tuple_buffer%9#0", - "val_as_bytes%9#0" - ] - }, - "2670": { - "op": "concat", - "defined_out": [ - "encoded_bool%0#0", - "encoded_tuple_buffer%10#0", - "maybe_value%0#0", - "performance#0", - "tmp%7#0", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%10#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "encoded_bool%0#0", - "tmp%7#0", - "encoded_tuple_buffer%10#0" - ] - }, - "2671": { - "op": "uncover 5", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "encoded_bool%0#0", - "tmp%7#0", - "encoded_tuple_buffer%10#0", - "val_as_bytes%10#0" - ] - }, - "2673": { - "op": "concat", - "defined_out": [ - "encoded_bool%0#0", - "encoded_tuple_buffer%11#0", - "maybe_value%0#0", - "performance#0", - "tmp%7#0", - "val_as_bytes%11#0", - "val_as_bytes%12#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%11#0", - "val_as_bytes%12#0", - "encoded_bool%0#0", - "tmp%7#0", - "encoded_tuple_buffer%11#0" - ] - }, - "2674": { - "op": "uncover 4", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%12#0", - "encoded_bool%0#0", - "tmp%7#0", - "encoded_tuple_buffer%11#0", - "val_as_bytes%11#0" - ] - }, - "2676": { - "op": "concat", - "defined_out": [ - "encoded_bool%0#0", - "encoded_tuple_buffer%12#0", - "maybe_value%0#0", - "performance#0", - "tmp%7#0", - "val_as_bytes%12#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "val_as_bytes%12#0", - "encoded_bool%0#0", - "tmp%7#0", - "encoded_tuple_buffer%12#0" - ] - }, - "2677": { - "op": "uncover 3", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "encoded_bool%0#0", - "tmp%7#0", - "encoded_tuple_buffer%12#0", - "val_as_bytes%12#0" - ] - }, - "2679": { - "op": "concat", - "defined_out": [ - "encoded_bool%0#0", - "encoded_tuple_buffer%13#0", - "maybe_value%0#0", - "performance#0", - "tmp%7#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "encoded_bool%0#0", - "tmp%7#0", - "encoded_tuple_buffer%13#0" - ] - }, - "2680": { - "op": "uncover 2", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "tmp%7#0", - "encoded_tuple_buffer%13#0", - "encoded_bool%0#0" - ] - }, - "2682": { - "op": "concat", - "defined_out": [ - "encoded_tuple_buffer%14#0", - "maybe_value%0#0", - "performance#0", - "tmp%7#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "tmp%7#0", - "encoded_tuple_buffer%14#0" - ] - }, - "2683": { - "op": "swap", - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "encoded_tuple_buffer%14#0", - "tmp%7#0" - ] - }, - "2684": { - "op": "concat", - "defined_out": [ - "encoded_tuple_buffer%15#0", - "maybe_value%0#0", - "performance#0" - ], - "stack_out": [ - "performance#0", - "maybe_value%0#0", - "performance#8", - "encoded_tuple_buffer%15#0" - ] - }, - "2685": { - "op": "frame_bury 0" - }, - "2687": { - "retsub": true, - "op": "retsub" - }, - "2688": { - "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.get_account_info", - "params": { - "holding_address#0": "bytes" - }, - "block": "get_account_info", - "stack_in": [], - "op": "proto 1 1" - }, - "2691": { - "op": "bytec 7 // 0x52333023", - "defined_out": [ - "0x52333023" - ], - "stack_out": [ - "0x52333023" - ] - }, - "2693": { - "op": "frame_dig -1", - "defined_out": [ - "0x52333023", - "holding_address#0 (copy)" - ], - "stack_out": [ - "0x52333023", - "holding_address#0 (copy)" - ] - }, - "2695": { - "op": "concat", - "defined_out": [ - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1" - ] - }, - "2696": { - "op": "dup", - "defined_out": [ - "tmp%0#1", - "tmp%0#1 (copy)" - ], - "stack_out": [ - "tmp%0#1", - "tmp%0#1 (copy)" - ] - }, - "2697": { - "op": "box_len", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#1", - "tmp%0#1" - ], - "stack_out": [ - "tmp%0#1", - "maybe_value%0#1", - "maybe_exists%0#0" - ] - }, - "2698": { - "op": "bury 1", - "stack_out": [ - "tmp%0#1", - "maybe_exists%0#0" - ] - }, - "2700": { - "error": "Invalid account holding address", - "op": "assert // Invalid account holding address", - "stack_out": [ - "tmp%0#1" - ] - }, - "2701": { - "op": "box_get", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2702": { - "error": "check self.account entry exists", - "op": "assert // check self.account entry exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "2703": { - "retsub": true, - "op": "retsub" - }, - "2704": { - "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.get_time_events", - "params": {}, - "block": "get_time_events", - "stack_in": [], - "op": "proto 0 1" - }, - "2707": { - "op": "pushbytes 0x0000" - }, - "2711": { - "op": "intc_0 // 0" - }, - "2712": { - "op": "bytec_2 // \"status\"", - "defined_out": [ - "\"status\"", - "0", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "0", - "\"status\"" - ] - }, - "2713": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2714": { - "error": "check self.status exists", - "op": "assert // check self.status exists", - "stack_out": [ - "time_events#0", - "maybe_value%0#0" - ] - }, - "2715": { - "op": "pushint 100 // 100", - "defined_out": [ - "100", - "maybe_value%0#0", - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "maybe_value%0#0", - "100" - ] - }, - "2717": { - "op": "==", - "defined_out": [ - "time_events#0", - "tmp%0#1" - ], - "stack_out": [ - "time_events#0", - "tmp%0#1" - ] - }, - "2718": { - "op": "bz get_time_events_after_if_else@2", - "stack_out": [ - "time_events#0" - ] - }, - "2721": { - "op": "bytec 22 // 0x74696d654576656e7473" - }, - "2723": { - "op": "box_get" - }, - "2724": { - "op": "swap" - }, - "2725": { - "op": "frame_bury 0" - }, - "2727": { - "error": "check self.time_events exists", - "op": "assert // check self.time_events exists" - }, - "2728": { - "block": "get_time_events_after_if_else@2", - "stack_in": [ - "time_events#0" - ], - "op": "frame_dig 0", - "defined_out": [ - "time_events#0" - ], - "stack_out": [ - "time_events#0", - "time_events#0" - ] - }, - "2730": { - "op": "swap" - }, - "2731": { - "retsub": true, - "op": "retsub" - }, - "2732": { - "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.get_secondary_market_schedule", - "params": {}, - "block": "get_secondary_market_schedule", - "stack_in": [], - "op": "proto 0 1" - }, - "2735": { - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "2736": { - "op": "bytec 17 // \"secondary_market_opening_date\"", - "defined_out": [ - "\"secondary_market_opening_date\"", - "0" - ], - "stack_out": [ - "0", - "\"secondary_market_opening_date\"" - ] - }, - "2738": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2739": { - "error": "check self.secondary_market_opening_date exists", - "op": "assert // check self.secondary_market_opening_date exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "2740": { - "op": "itob", - "defined_out": [ - "val_as_bytes%0#0" - ], - "stack_out": [ - "val_as_bytes%0#0" - ] - }, - "2741": { - "op": "intc_0 // 0", - "stack_out": [ - "val_as_bytes%0#0", - "0" - ] - }, - "2742": { - "op": "bytec 18 // \"secondary_market_closure_date\"", - "defined_out": [ - "\"secondary_market_closure_date\"", - "0", - "val_as_bytes%0#0" - ], - "stack_out": [ - "val_as_bytes%0#0", - "0", - "\"secondary_market_closure_date\"" - ] - }, - "2744": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%1#0", - "maybe_value%1#0", - "val_as_bytes%0#0" - ], - "stack_out": [ - "val_as_bytes%0#0", - "maybe_value%1#0", - "maybe_exists%1#0" - ] - }, - "2745": { - "error": "check self.secondary_market_closure_date exists", - "op": "assert // check self.secondary_market_closure_date exists", - "stack_out": [ - "val_as_bytes%0#0", - "maybe_value%1#0" - ] - }, - "2746": { - "op": "itob", - "defined_out": [ - "val_as_bytes%0#0", - "val_as_bytes%1#0" - ], - "stack_out": [ - "val_as_bytes%0#0", - "val_as_bytes%1#0" - ] - }, - "2747": { - "op": "concat", - "defined_out": [ - "result%1#0" - ], - "stack_out": [ - "result%1#0" - ] - }, - "2748": { - "op": "pushbytes 0x0002", - "defined_out": [ - "0x0002", - "result%1#0" - ], - "stack_out": [ - "result%1#0", - "0x0002" - ] - }, - "2752": { - "op": "swap", - "stack_out": [ - "0x0002", - "result%1#0" - ] - }, - "2753": { - "op": "concat", - "defined_out": [ - "array_data%0#0" - ], - "stack_out": [ - "array_data%0#0" - ] - }, - "2754": { - "retsub": true, - "op": "retsub" - }, - "2755": { - "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.get_asset_metadata", - "params": {}, - "block": "get_asset_metadata", - "stack_in": [], - "op": "proto 0 1" - }, - "2758": { - "op": "intc_0 // 0", - "defined_out": [ - "0" - ], - "stack_out": [ - "0" - ] - }, - "2759": { - "op": "bytec 12 // \"metadata\"", - "defined_out": [ - "\"metadata\"", - "0" - ], - "stack_out": [ - "0", - "\"metadata\"" - ] - }, - "2761": { - "op": "app_global_get_ex", - "defined_out": [ - "maybe_exists%0#0", - "maybe_value%0#0" - ], - "stack_out": [ - "maybe_value%0#0", - "maybe_exists%0#0" - ] - }, - "2762": { - "error": "check self.metadata exists", - "op": "assert // check self.metadata exists", - "stack_out": [ - "maybe_value%0#0" - ] - }, - "2763": { - "retsub": true, - "op": "retsub" - } - } -} \ No newline at end of file diff --git a/smart_contracts/base_d_asa/BaseDAsa.approval.teal b/smart_contracts/base_d_asa/BaseDAsa.approval.teal deleted file mode 100644 index b7e9736..0000000 --- a/smart_contracts/base_d_asa/BaseDAsa.approval.teal +++ /dev/null @@ -1,2857 +0,0 @@ -#pragma version 10 -#pragma typetrack false - -// smart_contracts.base_d_asa.contract.BaseDAsa.__algopy_entrypoint_with_init() -> uint64: -main: - intcblock 0 1 8 4 200 - bytecblock 0x151f7c75 "circulating_units" "status" "maturity_date" "unit_value" "total_units" "total_coupons" 0x52333023 0x52323023 "denomination_asset_id" "settlement_asset_id" "day_count_convention" "metadata" "principal_discount" "primary_distribution_opening_date" "primary_distribution_closure_date" "issuance_date" "secondary_market_opening_date" "secondary_market_closure_date" "suspended" "defaulted" "interest_rate" 0x74696d654576656e7473 0x52373023 0x52363023 0x52353023 0x52343023 0x0000000000000000 0x636f75706f6e5261746573 0x068101 0x52383023 - txn ApplicationID - bnz main_after_if_else@2 - // smart_contracts/base_d_asa/contract.py:41-42 - // # Role Based Access Control - // self.arranger = GlobalState(Account(), key=cst.PREFIX_ID_ARRANGER) - bytec 8 // 0x52323023 - global ZeroAddress - app_global_put - // smart_contracts/base_d_asa/contract.py:59-60 - // # Asset Configuration - // self.denomination_asset_id = UInt64() - bytec 9 // "denomination_asset_id" - intc_0 // 0 - app_global_put - // smart_contracts/base_d_asa/contract.py:61 - // self.settlement_asset_id = UInt64() - bytec 10 // "settlement_asset_id" - intc_0 // 0 - app_global_put - // smart_contracts/base_d_asa/contract.py:62 - // self.unit_value = UInt64() - bytec 4 // "unit_value" - intc_0 // 0 - app_global_put - // smart_contracts/base_d_asa/contract.py:63 - // self.day_count_convention = UInt64() - bytec 11 // "day_count_convention" - intc_0 // 0 - app_global_put - // smart_contracts/base_d_asa/contract.py:65-66 - // # Metadata - // self.metadata = Bytes() - bytec 12 // "metadata" - pushbytes 0x - app_global_put - // smart_contracts/base_d_asa/contract.py:68-69 - // # Supply - // self.total_units = UInt64() - bytec 5 // "total_units" - intc_0 // 0 - app_global_put - // smart_contracts/base_d_asa/contract.py:70 - // self.circulating_units = UInt64() - bytec_1 // "circulating_units" - intc_0 // 0 - app_global_put - // smart_contracts/base_d_asa/contract.py:72-73 - // # Principal - // self.principal_discount = UInt64() - bytec 13 // "principal_discount" - intc_0 // 0 - app_global_put - // smart_contracts/base_d_asa/contract.py:75-76 - // # Interest - // self.interest_rate = UInt64() - bytec 21 // "interest_rate" - intc_0 // 0 - app_global_put - // smart_contracts/base_d_asa/contract.py:80 - // self.total_coupons = UInt64() - bytec 6 // "total_coupons" - intc_0 // 0 - app_global_put - // smart_contracts/base_d_asa/contract.py:85 - // self.primary_distribution_opening_date = UInt64() - bytec 14 // "primary_distribution_opening_date" - intc_0 // 0 - app_global_put - // smart_contracts/base_d_asa/contract.py:86 - // self.primary_distribution_closure_date = UInt64() - bytec 15 // "primary_distribution_closure_date" - intc_0 // 0 - app_global_put - // smart_contracts/base_d_asa/contract.py:87 - // self.issuance_date = UInt64() - bytec 16 // "issuance_date" - intc_0 // 0 - app_global_put - // smart_contracts/base_d_asa/contract.py:88 - // self.secondary_market_opening_date = UInt64() - bytec 17 // "secondary_market_opening_date" - intc_0 // 0 - app_global_put - // smart_contracts/base_d_asa/contract.py:89 - // self.secondary_market_closure_date = UInt64() - bytec 18 // "secondary_market_closure_date" - intc_0 // 0 - app_global_put - // smart_contracts/base_d_asa/contract.py:90 - // self.maturity_date = UInt64() - bytec_3 // "maturity_date" - intc_0 // 0 - app_global_put - // smart_contracts/base_d_asa/contract.py:92-93 - // # Status - // self.status = UInt64(cfg.STATUS_EMPTY) - bytec_2 // "status" - intc_0 // 0 - app_global_put - // smart_contracts/base_d_asa/contract.py:94 - // self.suspended = UInt64() - bytec 19 // "suspended" - intc_0 // 0 - app_global_put - // smart_contracts/base_d_asa/contract.py:95 - // self.defaulted = UInt64() - bytec 20 // "defaulted" - intc_0 // 0 - app_global_put - -main_after_if_else@2: - // smart_contracts/base_d_asa/contract.py:28 - // class BaseDAsa(ARC4Contract): - txn NumAppArgs - bz main_after_if_else@22 - pushbytess 0x3f0efc6c 0x25dba95b 0x89474134 0x1d6fc255 0xfef74567 0xb8fc1390 0x3d43d1f0 0xebd96b2f 0x6c85e3ee 0xf63ace8d 0xbbcca18a 0x1a7babb4 0x402dba47 0xed02759f 0xfad2173e 0x08efea35 0xe4a5ab54 // method "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", method "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void", method "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", method "set_secondary_time_events(uint64[])(uint64,uint64)", method "assign_role(address,uint8,byte[])uint64", method "revoke_role(address,uint8)uint64", method "open_account(address,address)uint64", method "close_account(address)(uint64,uint64)", method "primary_distribution(address,uint64)uint64", method "set_asset_suspension(bool)uint64", method "set_account_suspension(address,bool)uint64", method "set_default_status(bool)void", method "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", method "get_account_info(address)(address,uint64,uint64,uint64,bool)", method "get_time_events()uint64[]", method "get_secondary_market_schedule()uint64[]", method "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)" - txna ApplicationArgs 0 - match main_asset_create_route@5 main_asset_update_route@6 main_asset_config_route@7 main_set_secondary_time_events_route@8 main_assign_role_route@9 main_revoke_role_route@10 main_open_account_route@11 main_close_account_route@12 main_primary_distribution_route@13 main_set_asset_suspension_route@14 main_set_account_suspension_route@15 main_set_default_status_route@16 main_get_asset_info_route@17 main_get_account_info_route@18 main_get_time_events_route@19 main_get_secondary_market_schedule_route@20 main_get_asset_metadata_route@21 - -main_after_if_else@22: - // smart_contracts/base_d_asa/contract.py:28 - // class BaseDAsa(ARC4Contract): - intc_0 // 0 - return - -main_get_asset_metadata_route@21: - // smart_contracts/base_d_asa/contract.py:980 - // @arc4.abimethod(readonly=True) - txn OnCompletion - ! - assert // OnCompletion is not NoOp - txn ApplicationID - assert // can only call when not creating - callsub get_asset_metadata - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -main_get_secondary_market_schedule_route@20: - // smart_contracts/base_d_asa/contract.py:967 - // @arc4.abimethod(readonly=True) - txn OnCompletion - ! - assert // OnCompletion is not NoOp - txn ApplicationID - assert // can only call when not creating - callsub get_secondary_market_schedule - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -main_get_time_events_route@19: - // smart_contracts/base_d_asa/contract.py:954 - // @arc4.abimethod(readonly=True) - txn OnCompletion - ! - assert // OnCompletion is not NoOp - txn ApplicationID - assert // can only call when not creating - callsub get_time_events - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -main_get_account_info_route@18: - // smart_contracts/base_d_asa/contract.py:937 - // @arc4.abimethod(readonly=True) - txn OnCompletion - ! - assert // OnCompletion is not NoOp - txn ApplicationID - assert // can only call when not creating - // smart_contracts/base_d_asa/contract.py:28 - // class BaseDAsa(ARC4Contract): - txna ApplicationArgs 1 - // smart_contracts/base_d_asa/contract.py:937 - // @arc4.abimethod(readonly=True) - callsub get_account_info - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -main_get_asset_info_route@17: - // smart_contracts/base_d_asa/contract.py:898 - // @arc4.abimethod(readonly=True) - txn OnCompletion - ! - assert // OnCompletion is not NoOp - txn ApplicationID - assert // can only call when not creating - callsub get_asset_info - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -main_set_default_status_route@16: - // smart_contracts/base_d_asa/contract.py:884 - // @arc4.abimethod - txn OnCompletion - ! - assert // OnCompletion is not NoOp - txn ApplicationID - assert // can only call when not creating - // smart_contracts/base_d_asa/contract.py:28 - // class BaseDAsa(ARC4Contract): - txna ApplicationArgs 1 - // smart_contracts/base_d_asa/contract.py:884 - // @arc4.abimethod - callsub set_default_status - intc_1 // 1 - return - -main_set_account_suspension_route@15: - // smart_contracts/base_d_asa/contract.py:861 - // @arc4.abimethod - txn OnCompletion - ! - assert // OnCompletion is not NoOp - txn ApplicationID - assert // can only call when not creating - // smart_contracts/base_d_asa/contract.py:28 - // class BaseDAsa(ARC4Contract): - txna ApplicationArgs 1 - txna ApplicationArgs 2 - // smart_contracts/base_d_asa/contract.py:861 - // @arc4.abimethod - callsub set_account_suspension - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -main_set_asset_suspension_route@14: - // smart_contracts/base_d_asa/contract.py:843 - // @arc4.abimethod - txn OnCompletion - ! - assert // OnCompletion is not NoOp - txn ApplicationID - assert // can only call when not creating - // smart_contracts/base_d_asa/contract.py:28 - // class BaseDAsa(ARC4Contract): - txna ApplicationArgs 1 - // smart_contracts/base_d_asa/contract.py:843 - // @arc4.abimethod - callsub set_asset_suspension - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -main_primary_distribution_route@13: - // smart_contracts/base_d_asa/contract.py:801 - // @arc4.abimethod - txn OnCompletion - ! - assert // OnCompletion is not NoOp - txn ApplicationID - assert // can only call when not creating - // smart_contracts/base_d_asa/contract.py:28 - // class BaseDAsa(ARC4Contract): - txna ApplicationArgs 1 - txna ApplicationArgs 2 - // smart_contracts/base_d_asa/contract.py:801 - // @arc4.abimethod - callsub primary_distribution - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -main_close_account_route@12: - // smart_contracts/base_d_asa/contract.py:771 - // @arc4.abimethod - txn OnCompletion - ! - assert // OnCompletion is not NoOp - txn ApplicationID - assert // can only call when not creating - // smart_contracts/base_d_asa/contract.py:28 - // class BaseDAsa(ARC4Contract): - txna ApplicationArgs 1 - // smart_contracts/base_d_asa/contract.py:771 - // @arc4.abimethod - callsub close_account - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -main_open_account_route@11: - // smart_contracts/base_d_asa/contract.py:736 - // @arc4.abimethod - txn OnCompletion - ! - assert // OnCompletion is not NoOp - txn ApplicationID - assert // can only call when not creating - // smart_contracts/base_d_asa/contract.py:28 - // class BaseDAsa(ARC4Contract): - txna ApplicationArgs 1 - txna ApplicationArgs 2 - // smart_contracts/base_d_asa/contract.py:736 - // @arc4.abimethod - callsub open_account - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -main_revoke_role_route@10: - // smart_contracts/base_d_asa/contract.py:688 - // @arc4.abimethod - txn OnCompletion - ! - assert // OnCompletion is not NoOp - txn ApplicationID - assert // can only call when not creating - // smart_contracts/base_d_asa/contract.py:28 - // class BaseDAsa(ARC4Contract): - txna ApplicationArgs 1 - txna ApplicationArgs 2 - // smart_contracts/base_d_asa/contract.py:688 - // @arc4.abimethod - callsub revoke_role - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -main_assign_role_route@9: - // smart_contracts/base_d_asa/contract.py:625 - // @arc4.abimethod - txn OnCompletion - ! - assert // OnCompletion is not NoOp - txn ApplicationID - assert // can only call when not creating - // smart_contracts/base_d_asa/contract.py:28 - // class BaseDAsa(ARC4Contract): - txna ApplicationArgs 1 - txna ApplicationArgs 2 - txna ApplicationArgs 3 - // smart_contracts/base_d_asa/contract.py:625 - // @arc4.abimethod - callsub assign_role - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -main_set_secondary_time_events_route@8: - // smart_contracts/base_d_asa/contract.py:569 - // @arc4.abimethod - txn OnCompletion - ! - assert // OnCompletion is not NoOp - txn ApplicationID - assert // can only call when not creating - // smart_contracts/base_d_asa/contract.py:28 - // class BaseDAsa(ARC4Contract): - txna ApplicationArgs 1 - // smart_contracts/base_d_asa/contract.py:569 - // @arc4.abimethod - callsub set_secondary_time_events - bytec_0 // 0x151f7c75 - swap - concat - log - intc_1 // 1 - return - -main_asset_config_route@7: - // smart_contracts/base_d_asa/contract.py:484 - // @arc4.abimethod - txn OnCompletion - ! - assert // OnCompletion is not NoOp - txn ApplicationID - assert // can only call when not creating - // smart_contracts/base_d_asa/contract.py:28 - // class BaseDAsa(ARC4Contract): - txna ApplicationArgs 1 - txna ApplicationArgs 2 - txna ApplicationArgs 3 - txna ApplicationArgs 4 - txna ApplicationArgs 5 - txna ApplicationArgs 6 - txna ApplicationArgs 7 - txna ApplicationArgs 8 - txna ApplicationArgs 9 - txna ApplicationArgs 10 - // smart_contracts/base_d_asa/contract.py:484 - // @arc4.abimethod - callsub asset_config - intc_1 // 1 - return - -main_asset_update_route@6: - // smart_contracts/base_d_asa/contract.py:473 - // @arc4.abimethod(allow_actions=["UpdateApplication"]) - txn OnCompletion - intc_3 // UpdateApplication - == - assert // OnCompletion is not UpdateApplication - txn ApplicationID - assert // can only call when not creating - // smart_contracts/base_d_asa/contract.py:28 - // class BaseDAsa(ARC4Contract): - txna ApplicationArgs 1 - // smart_contracts/base_d_asa/contract.py:473 - // @arc4.abimethod(allow_actions=["UpdateApplication"]) - callsub asset_update - intc_1 // 1 - return - -main_asset_create_route@5: - // smart_contracts/base_d_asa/contract.py:461 - // @arc4.abimethod(create="require") - txn OnCompletion - ! - assert // OnCompletion is not NoOp - txn ApplicationID - ! - assert // can only call when creating - // smart_contracts/base_d_asa/contract.py:28 - // class BaseDAsa(ARC4Contract): - txna ApplicationArgs 1 - txna ApplicationArgs 2 - // smart_contracts/base_d_asa/contract.py:461 - // @arc4.abimethod(create="require") - callsub asset_create - intc_1 // 1 - return - - -// smart_contracts.base_d_asa.contract.BaseDAsa.asset_create(arranger: bytes, metadata: bytes) -> void: -asset_create: - // smart_contracts/base_d_asa/contract.py:461-462 - // @arc4.abimethod(create="require") - // def asset_create(self, arranger: arc4.Address, metadata: typ.AssetMetadata) -> None: - proto 2 0 - // smart_contracts/base_d_asa/contract.py:470 - // self.arranger.value = arranger.native - bytec 8 // 0x52323023 - frame_dig -2 - app_global_put - // smart_contracts/base_d_asa/contract.py:471 - // self.metadata = metadata.bytes - bytec 12 // "metadata" - frame_dig -1 - app_global_put - retsub - - -// smart_contracts.base_d_asa.contract.BaseDAsa.asset_update(metadata: bytes) -> void: -asset_update: - // smart_contracts/base_d_asa/contract.py:473-474 - // @arc4.abimethod(allow_actions=["UpdateApplication"]) - // def asset_update(self, metadata: typ.AssetMetadata) -> None: - proto 1 0 - // smart_contracts/base_d_asa/contract.py:478-481 - // # The reference implementation grants the update permissions to the Arranger. - // # Other implementations may disable D-ASA application updatability or change its authorizations. - // # ⚠️ WARNING: Application updates must be executed VERY carefully, as they might introduce breaking changes. - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // smart_contracts/base_d_asa/contract.py:482 - // self.metadata = metadata.bytes - bytec 12 // "metadata" - frame_dig -1 - app_global_put - retsub - - -// smart_contracts.base_d_asa.contract.BaseDAsa.assert_caller_is_arranger() -> void: -assert_caller_is_arranger: - // smart_contracts/base_d_asa/contract.py:118-119 - // @subroutine - // def assert_caller_is_arranger(self) -> None: - proto 0 0 - // smart_contracts/base_d_asa/contract.py:120 - // assert Txn.sender == self.arranger.value, err.UNAUTHORIZED - txn Sender - intc_0 // 0 - bytec 8 // 0x52323023 - app_global_get_ex - assert // check self.arranger exists - == - assert // Not authorized - retsub - - -// smart_contracts.base_d_asa.contract.BaseDAsa.asset_config(denomination_asset_id: bytes, settlement_asset_id: bytes, principal: bytes, principal_discount: bytes, minimum_denomination: bytes, day_count_convention: bytes, interest_rate: bytes, coupon_rates: bytes, time_events: bytes, time_periods: bytes) -> void: -asset_config: - // smart_contracts/base_d_asa/contract.py:484-497 - // @arc4.abimethod - // def asset_config( - // self, - // denomination_asset_id: arc4.UInt64, - // settlement_asset_id: arc4.UInt64, - // principal: arc4.UInt64, - // principal_discount: arc4.UInt64, - // minimum_denomination: arc4.UInt64, - // day_count_convention: arc4.UInt8, - // interest_rate: arc4.UInt16, - // coupon_rates: typ.CouponRates, - // time_events: typ.TimeEvents, - // time_periods: typ.TimePeriods, - // ) -> None: - proto 10 0 - intc_0 // 0 - pushbytes "" - dupn 2 - // smart_contracts/base_d_asa/contract.py:527 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // smart_contracts/base_d_asa/contract.py:528 - // assert self.status == cfg.STATUS_EMPTY, err.ALREADY_CONFIGURED - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - ! - assert // D-ASA already configured - // smart_contracts/base_d_asa/contract.py:530-531 - // # Set Denomination Asset - // self.assert_denomination_asset(denomination_asset_id.native) - frame_dig -10 - btoi - dup - // smart_contracts/base_d_asa/contract.py:180 - // denomination_asset_id != UInt64(0) and Asset(denomination_asset_id).creator - bz asset_config_bool_false@4 - frame_dig 4 - asset_params_get AssetCreator - assert // asset exists - global ZeroAddress - != - bz asset_config_bool_false@4 - intc_1 // 1 - -asset_config_bool_merge@5: - // smart_contracts/base_d_asa/contract.py:178-181 - // # The reference implementation has on-chain denomination with ASA - // assert ( - // denomination_asset_id != UInt64(0) and Asset(denomination_asset_id).creator - // ), err.INVALID_DENOMINATION - assert // Denomination asset is not properly set - // smart_contracts/base_d_asa/contract.py:185 - // self.denomination_asset_id = denomination_asset_id - bytec 9 // "denomination_asset_id" - frame_dig 4 - app_global_put - // smart_contracts/base_d_asa/contract.py:534-535 - // # Set Denomination Asset - // self.assert_settlement_asset(settlement_asset_id.native) - frame_dig -9 - btoi - // smart_contracts/base_d_asa/contract.py:191 - // settlement_asset_id == self.denomination_asset_id - intc_0 // 0 - bytec 9 // "denomination_asset_id" - app_global_get_ex - assert // check self.denomination_asset_id exists - dig 1 - == - // smart_contracts/base_d_asa/contract.py:189-192 - // # The reference implementation settlement asset is the denomination asset - // assert ( - // settlement_asset_id == self.denomination_asset_id - // ), err.INVALID_SETTLEMENT_ASSET - assert // Different settlement asset not supported, must be equal to denomination asset - // smart_contracts/base_d_asa/contract.py:196 - // self.settlement_asset_id = settlement_asset_id - bytec 10 // "settlement_asset_id" - swap - app_global_put - // smart_contracts/base_d_asa/contract.py:197-203 - // # The reference implementation has on-chain settlement with ASA - // itxn.AssetTransfer( - // xfer_asset=self.settlement_asset_id, - // asset_receiver=Global.current_application_address, - // asset_amount=0, - // fee=Global.min_txn_fee, - // ).submit() - itxn_begin - // smart_contracts/base_d_asa/contract.py:202 - // fee=Global.min_txn_fee, - global MinTxnFee - // smart_contracts/base_d_asa/contract.py:199 - // xfer_asset=self.settlement_asset_id, - intc_0 // 0 - bytec 10 // "settlement_asset_id" - app_global_get_ex - assert // check self.settlement_asset_id exists - // smart_contracts/base_d_asa/contract.py:200 - // asset_receiver=Global.current_application_address, - global CurrentApplicationAddress - // smart_contracts/base_d_asa/contract.py:201 - // asset_amount=0, - intc_0 // 0 - itxn_field AssetAmount - itxn_field AssetReceiver - itxn_field XferAsset - // smart_contracts/base_d_asa/contract.py:197-198 - // # The reference implementation has on-chain settlement with ASA - // itxn.AssetTransfer( - intc_3 // axfer - itxn_field TypeEnum - itxn_field Fee - // smart_contracts/base_d_asa/contract.py:197-203 - // # The reference implementation has on-chain settlement with ASA - // itxn.AssetTransfer( - // xfer_asset=self.settlement_asset_id, - // asset_receiver=Global.current_application_address, - // asset_amount=0, - // fee=Global.min_txn_fee, - // ).submit() - itxn_submit - // smart_contracts/base_d_asa/contract.py:540 - // principal.native % minimum_denomination.native == 0 - frame_dig -8 - btoi - frame_dig -6 - btoi - dup2 - % - ! - // smart_contracts/base_d_asa/contract.py:538-541 - // # Set Principal and Minimum Denomination - // assert ( - // principal.native % minimum_denomination.native == 0 - // ), err.INVALID_MINIMUM_DENOMINATION - assert // Minimum denomination is not a divisor of principal - // smart_contracts/base_d_asa/contract.py:542 - // self.unit_value = minimum_denomination.native - bytec 4 // "unit_value" - dig 1 - app_global_put - // smart_contracts/base_d_asa/contract.py:543 - // self.total_units = principal.native // minimum_denomination.native - / - bytec 5 // "total_units" - swap - app_global_put - // smart_contracts/base_d_asa/contract.py:544 - // self.principal_discount = principal_discount.native - frame_dig -7 - btoi - bytec 13 // "principal_discount" - swap - app_global_put - // smart_contracts/base_d_asa/contract.py:546-547 - // # Set Day-Count Convention - // self.assert_day_count_convention(day_count_convention.native) - frame_dig -5 - btoi - dup - frame_bury 1 - // smart_contracts/base_d_asa/contract.py:207-211 - // # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - // assert day_count_convention in ( - // UInt64(cst.DCC_A_A), - // UInt64(cst.DCC_CONT), - // ), err.INVALID_DAY_COUNT_CONVENTION - bz asset_config_bool_true@16 - frame_dig 1 - // smart_contracts/base_d_asa/contract.py:210 - // UInt64(cst.DCC_CONT), - pushint 255 // 255 - // smart_contracts/base_d_asa/contract.py:207-211 - // # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - // assert day_count_convention in ( - // UInt64(cst.DCC_A_A), - // UInt64(cst.DCC_CONT), - // ), err.INVALID_DAY_COUNT_CONVENTION - == - bz asset_config_bool_false@17 - -asset_config_bool_true@16: - intc_1 // 1 - -asset_config_bool_merge@18: - // smart_contracts/base_d_asa/contract.py:207-211 - // # The reference implementation supports only the Actual/Actual and Continuous day-count conventions - // assert day_count_convention in ( - // UInt64(cst.DCC_A_A), - // UInt64(cst.DCC_CONT), - // ), err.INVALID_DAY_COUNT_CONVENTION - assert // Invalid day-count convention ID - // smart_contracts/base_d_asa/contract.py:215 - // self.day_count_convention = day_count_convention - bytec 11 // "day_count_convention" - frame_dig 1 - app_global_put - // smart_contracts/base_d_asa/contract.py:550-551 - // # Set Interest Rate - // self.assert_interest_rate(interest_rate.native) - frame_dig -4 - btoi - frame_bury 2 - // smart_contracts/base_d_asa/contract.py:219-220 - // # This subroutine must be used after the principal discount has been set - // if not self.principal_discount: - intc_0 // 0 - bytec 13 // "principal_discount" - app_global_get_ex - assert // check self.principal_discount exists - bnz asset_config_after_if_else@24 - // smart_contracts/base_d_asa/contract.py:221 - // assert interest_rate > UInt64(0), err.INVALID_INTEREST_RATE - frame_dig 2 - assert // Interest rate is not properly defined - -asset_config_after_if_else@24: - // smart_contracts/base_d_asa/contract.py:225 - // self.interest_rate = interest_rate - bytec 21 // "interest_rate" - frame_dig 2 - app_global_put - // smart_contracts/base_d_asa/contract.py:229 - // assert not coupon_rates.length, err.INVALID_COUPON_RATES - frame_dig -3 - intc_0 // 0 - extract_uint16 - dup - ! - assert // Coupon rates are not properly defined - // smart_contracts/base_d_asa/contract.py:233 - // self.total_coupons = coupon_rates.length - bytec 6 // "total_coupons" - swap - app_global_put - // smart_contracts/base_d_asa/contract.py:234 - // if self.total_coupons: - intc_0 // 0 - bytec 6 // "total_coupons" - app_global_get_ex - assert // check self.total_coupons exists - bz asset_config_after_if_else@32 - // smart_contracts/base_d_asa/contract.py:235 - // self.coupon_rates.value = coupon_rates.copy() - bytec 28 // 0x636f75706f6e5261746573 - box_del - pop - bytec 28 // 0x636f75706f6e5261746573 - frame_dig -3 - box_put - -asset_config_after_if_else@32: - // smart_contracts/base_d_asa/contract.py:240 - // time_events.length == self.total_coupons + cfg.TIME_SCHEDULE_LIMITS - frame_dig -2 - intc_0 // 0 - extract_uint16 - intc_0 // 0 - bytec 6 // "total_coupons" - app_global_get_ex - assert // check self.total_coupons exists - intc_3 // 4 - + - == - // smart_contracts/base_d_asa/contract.py:239-241 - // assert ( - // time_events.length == self.total_coupons + cfg.TIME_SCHEDULE_LIMITS - // ), err.INVALID_TIME_EVENTS_LENGTH - assert // Time events length is invalid - // smart_contracts/base_d_asa/contract.py:560 - // self.assert_time_events_sorted(time_events) - frame_dig -2 - callsub assert_time_events_sorted - frame_bury -2 - // smart_contracts/base_d_asa/contract.py:265 - // self.time_events.value = time_events.copy() - bytec 22 // 0x74696d654576656e7473 - box_del - pop - bytec 22 // 0x74696d654576656e7473 - frame_dig -2 - box_put - // smart_contracts/base_d_asa/contract.py:266-268 - // self.primary_distribution_opening_date = time_events[ - // cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX - // ].native - frame_dig -2 - extract 2 0 - dup - frame_bury 0 - dup - extract 0 8 // on error: Index access is out of bounds - btoi - // smart_contracts/base_d_asa/contract.py:266 - // self.primary_distribution_opening_date = time_events[ - bytec 14 // "primary_distribution_opening_date" - // smart_contracts/base_d_asa/contract.py:266-268 - // self.primary_distribution_opening_date = time_events[ - // cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX - // ].native - swap - app_global_put - // smart_contracts/base_d_asa/contract.py:269-271 - // self.primary_distribution_closure_date = time_events[ - // cfg.PRIMARY_DISTRIBUTION_CLOSURE_DATE_IDX - // ].native - dup - extract 8 8 // on error: Index access is out of bounds - btoi - // smart_contracts/base_d_asa/contract.py:269 - // self.primary_distribution_closure_date = time_events[ - bytec 15 // "primary_distribution_closure_date" - // smart_contracts/base_d_asa/contract.py:269-271 - // self.primary_distribution_closure_date = time_events[ - // cfg.PRIMARY_DISTRIBUTION_CLOSURE_DATE_IDX - // ].native - swap - app_global_put - // smart_contracts/base_d_asa/contract.py:272 - // self.issuance_date = time_events[cfg.ISSUANCE_DATE_IDX].native - extract 16 8 // on error: Index access is out of bounds - btoi - bytec 16 // "issuance_date" - swap - app_global_put - // smart_contracts/base_d_asa/contract.py:274-275 - // # Some D-ASA may not have a maturity date (e.g., perpetuals) - // if time_events.length == self.total_coupons + cfg.TIME_SCHEDULE_LIMITS: - frame_dig -2 - intc_0 // 0 - extract_uint16 - dup - frame_bury 3 - intc_0 // 0 - bytec 6 // "total_coupons" - app_global_get_ex - assert // check self.total_coupons exists - intc_3 // 4 - + - == - bz asset_config_after_if_else@38 - // smart_contracts/base_d_asa/contract.py:276 - // self.maturity_date = time_events[cfg.MATURITY_DATE_IDX].native - frame_dig 3 - intc_1 // 1 - - - intc_2 // 8 - * - frame_dig 0 - swap - intc_2 // 8 - extract3 // on error: Index access is out of bounds - btoi - bytec_3 // "maturity_date" - swap - app_global_put - -asset_config_after_if_else@38: - // smart_contracts/base_d_asa/contract.py:280 - // assert not time_periods.length, err.INVALID_TIME_PERIODS - frame_dig -1 - intc_0 // 0 - extract_uint16 - ! - assert // Time periods are not properly defined - // smart_contracts/base_d_asa/contract.py:567 - // self.status = UInt64(cfg.STATUS_ACTIVE) - bytec_2 // "status" - pushint 100 // 100 - app_global_put - retsub - -asset_config_bool_false@17: - intc_0 // 0 - b asset_config_bool_merge@18 - -asset_config_bool_false@4: - intc_0 // 0 - b asset_config_bool_merge@5 - - -// smart_contracts.base_d_asa.contract.BaseDAsa.assert_time_events_sorted(time_events: bytes) -> bytes: -assert_time_events_sorted: - // smart_contracts/base_d_asa/contract.py:243-244 - // @subroutine - // def assert_time_events_sorted(self, time_events: typ.TimeEvents) -> None: - proto 1 1 - pushbytes "" - dup - // smart_contracts/base_d_asa/contract.py:246 - // time_events[cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX].native - frame_dig -1 - extract 2 0 - dup - extract 0 8 // on error: Index access is out of bounds - btoi - // smart_contracts/base_d_asa/contract.py:247 - // > Global.latest_timestamp - global LatestTimestamp - // smart_contracts/base_d_asa/contract.py:246-247 - // time_events[cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX].native - // > Global.latest_timestamp - > - // smart_contracts/base_d_asa/contract.py:245-248 - // assert ( - // time_events[cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX].native - // > Global.latest_timestamp - // ), err.INVALID_TIME - assert // Time events must be set in the future - // smart_contracts/base_d_asa/contract.py:249 - // for _t in urange(time_events.length - 1): - frame_dig -1 - intc_0 // 0 - extract_uint16 - intc_1 // 1 - - - intc_0 // 0 - -assert_time_events_sorted_for_header@1: - // smart_contracts/base_d_asa/contract.py:249 - // for _t in urange(time_events.length - 1): - frame_dig 4 - frame_dig 3 - < - bz assert_time_events_sorted_after_for@6 - -assert_time_events_sorted_while_top@8: - pushint 75 // 75 - global OpcodeBudget - > - bz assert_time_events_sorted_after_while@14 - itxn_begin - pushint 6 // appl - itxn_field TypeEnum - pushint 5 // DeleteApplication - itxn_field OnCompletion - bytec 29 // 0x068101 - itxn_field ApprovalProgram - bytec 29 // 0x068101 - itxn_field ClearStateProgram - global MinTxnFee - itxn_field Fee - itxn_submit - b assert_time_events_sorted_while_top@8 - -assert_time_events_sorted_after_while@14: - // smart_contracts/base_d_asa/contract.py:254 - // time_i = time_events[_t].native - frame_dig 4 - dup - intc_2 // 8 - * - frame_dig 2 - dup - cover 3 - swap - intc_2 // 8 - extract3 // on error: Index access is out of bounds - btoi - dup - cover 3 - frame_bury 1 - // smart_contracts/base_d_asa/contract.py:255 - // time_f = time_events[_t + 1].native - intc_1 // 1 - + - dup - frame_bury 4 - intc_2 // 8 - * - intc_2 // 8 - extract3 // on error: Index access is out of bounds - btoi - dup - frame_bury 0 - // smart_contracts/base_d_asa/contract.py:256 - // assert time_f > time_i, err.INVALID_SORTING - < - assert // Time events must be sorted in strictly ascending order - // smart_contracts/base_d_asa/contract.py:257 - // if self.day_count_convention != UInt64(cst.DCC_CONT): - intc_0 // 0 - bytec 11 // "day_count_convention" - app_global_get_ex - assert // check self.day_count_convention exists - pushint 255 // 255 - != - bz assert_time_events_sorted_for_header@1 - // smart_contracts/base_d_asa/contract.py:258-259 - // # The reference implementation requires time periods expressed in days for regular day-count conventions - // assert (time_f - time_i) % UInt64( - frame_dig 0 - frame_dig 1 - - - // smart_contracts/base_d_asa/contract.py:258-261 - // # The reference implementation requires time periods expressed in days for regular day-count conventions - // assert (time_f - time_i) % UInt64( - // cst.DAY_2_SEC - // ) == 0, err.INVALID_TIME_PERIOD - pushint 86400 // 86400 - % - ! - assert // Time periods in Actual/Actual day count convention must be multiples of a day (in seconds) - b assert_time_events_sorted_for_header@1 - -assert_time_events_sorted_after_for@6: - frame_dig -1 - frame_bury 0 - retsub - - -// smart_contracts.base_d_asa.contract.BaseDAsa.set_secondary_time_events(secondary_market_time_events: bytes) -> bytes: -set_secondary_time_events: - // smart_contracts/base_d_asa/contract.py:569-572 - // @arc4.abimethod - // def set_secondary_time_events( - // self, secondary_market_time_events: typ.TimeEvents - // ) -> typ.SecondaryMarketSchedule: - proto 1 1 - intc_0 // 0 - // smart_contracts/base_d_asa/contract.py:590 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // smart_contracts/base_d_asa/contract.py:108 - // return self.status == cfg.STATUS_ENDED - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - intc 4 // 200 - == - // smart_contracts/base_d_asa/contract.py:591 - // assert not self.status_is_ended(), err.UNAUTHORIZED - ! - assert // Not authorized - // smart_contracts/base_d_asa/contract.py:592 - // self.assert_is_not_defaulted() - callsub assert_is_not_defaulted - // smart_contracts/base_d_asa/contract.py:594 - // assert secondary_market_time_events.length >= 1, err.INVALID_TIME_EVENTS_LENGTH - frame_dig -1 - intc_0 // 0 - extract_uint16 - dup - assert // Time events length is invalid - // smart_contracts/base_d_asa/contract.py:595 - // if secondary_market_time_events.length > 1: - intc_1 // 1 - > - frame_dig -1 - swap - bz set_secondary_time_events_after_if_else@2 - // smart_contracts/base_d_asa/contract.py:596 - // self.assert_time_events_sorted(secondary_market_time_events) - frame_dig -1 - callsub assert_time_events_sorted - dup - frame_bury -1 - frame_bury 1 - -set_secondary_time_events_after_if_else@2: - frame_dig 1 - frame_bury -1 - // smart_contracts/base_d_asa/contract.py:598 - // self.issuance_date - intc_0 // 0 - bytec 16 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - // smart_contracts/base_d_asa/contract.py:599-601 - // <= secondary_market_time_events[ - // cfg.SECONDARY_MARKET_OPENING_DATE_IDX - // ].native - frame_dig -1 - extract 2 0 - dup - frame_bury 0 - extract 0 8 // on error: Index access is out of bounds - btoi - // smart_contracts/base_d_asa/contract.py:598-601 - // self.issuance_date - // <= secondary_market_time_events[ - // cfg.SECONDARY_MARKET_OPENING_DATE_IDX - // ].native - swap - dig 1 - <= - // smart_contracts/base_d_asa/contract.py:597-602 - // assert ( - // self.issuance_date - // <= secondary_market_time_events[ - // cfg.SECONDARY_MARKET_OPENING_DATE_IDX - // ].native - // ), err.INVALID_SECONDARY_OPENING_DATE - assert // Invalid secondary market opening date - // smart_contracts/base_d_asa/contract.py:603 - // self.secondary_market_opening_date = secondary_market_time_events[ - bytec 17 // "secondary_market_opening_date" - // smart_contracts/base_d_asa/contract.py:603-605 - // self.secondary_market_opening_date = secondary_market_time_events[ - // cfg.SECONDARY_MARKET_OPENING_DATE_IDX - // ].native - swap - app_global_put - // smart_contracts/base_d_asa/contract.py:606 - // if self.maturity_date: - intc_0 // 0 - bytec_3 // "maturity_date" - app_global_get_ex - assert // check self.maturity_date exists - bz set_secondary_time_events_after_if_else@4 - // smart_contracts/base_d_asa/contract.py:608 - // self.maturity_date - intc_0 // 0 - bytec_3 // "maturity_date" - app_global_get_ex - assert // check self.maturity_date exists - // smart_contracts/base_d_asa/contract.py:610 - // cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX - frame_dig -1 - intc_0 // 0 - extract_uint16 - // smart_contracts/base_d_asa/contract.py:609-611 - // >= secondary_market_time_events[ - // cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX - // ].native - intc_1 // 1 - - - intc_2 // 8 - * - frame_dig 0 - swap - intc_2 // 8 - extract3 // on error: Index access is out of bounds - btoi - // smart_contracts/base_d_asa/contract.py:608-611 - // self.maturity_date - // >= secondary_market_time_events[ - // cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX - // ].native - swap - dig 1 - >= - // smart_contracts/base_d_asa/contract.py:607-612 - // assert ( - // self.maturity_date - // >= secondary_market_time_events[ - // cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX - // ].native - // ), err.INVALID_SECONDARY_CLOSURE_DATE - assert // Invalid secondary market closure date - // smart_contracts/base_d_asa/contract.py:613 - // self.secondary_market_closure_date = secondary_market_time_events[ - bytec 18 // "secondary_market_closure_date" - // smart_contracts/base_d_asa/contract.py:613-615 - // self.secondary_market_closure_date = secondary_market_time_events[ - // cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX - // ].native - swap - app_global_put - -set_secondary_time_events_after_if_else@4: - // smart_contracts/base_d_asa/contract.py:618 - // self.secondary_market_opening_date - intc_0 // 0 - bytec 17 // "secondary_market_opening_date" - app_global_get_ex - assert // check self.secondary_market_opening_date exists - // smart_contracts/base_d_asa/contract.py:617-619 - // secondary_market_opening_date=arc4.UInt64( - // self.secondary_market_opening_date - // ), - itob - // smart_contracts/base_d_asa/contract.py:621 - // self.secondary_market_closure_date - intc_0 // 0 - bytec 18 // "secondary_market_closure_date" - app_global_get_ex - assert // check self.secondary_market_closure_date exists - // smart_contracts/base_d_asa/contract.py:620-622 - // secondary_market_closure_date=arc4.UInt64( - // self.secondary_market_closure_date - // ), - itob - // smart_contracts/base_d_asa/contract.py:616-623 - // return typ.SecondaryMarketSchedule( - // secondary_market_opening_date=arc4.UInt64( - // self.secondary_market_opening_date - // ), - // secondary_market_closure_date=arc4.UInt64( - // self.secondary_market_closure_date - // ), - // ) - concat - frame_bury 0 - retsub - - -// smart_contracts.base_d_asa.contract.BaseDAsa.assert_is_not_defaulted() -> void: -assert_is_not_defaulted: - // smart_contracts/base_d_asa/contract.py:110-111 - // @subroutine - // def assert_is_not_defaulted(self) -> None: - proto 0 0 - // smart_contracts/base_d_asa/contract.py:112 - // assert not self.defaulted, err.DEFAULTED - intc_0 // 0 - bytec 20 // "defaulted" - app_global_get_ex - assert // check self.defaulted exists - ! - assert // Defaulted - retsub - - -// smart_contracts.base_d_asa.contract.BaseDAsa.assign_role(role_address: bytes, role: bytes, config: bytes) -> bytes: -assign_role: - // smart_contracts/base_d_asa/contract.py:625-628 - // @arc4.abimethod - // def assign_role( - // self, role_address: arc4.Address, role: arc4.UInt8, config: arc4.DynamicBytes - // ) -> arc4.UInt64: - proto 3 1 - // smart_contracts/base_d_asa/contract.py:646 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // smart_contracts/base_d_asa/contract.py:647 - // self.assert_is_not_defaulted() - callsub assert_is_not_defaulted - // smart_contracts/base_d_asa/contract.py:648 - // assert role.native in ( - frame_dig -2 - btoi - dup - // smart_contracts/base_d_asa/contract.py:649 - // UInt64(cst.ROLE_ARRANGER), - pushint 20 // 20 - // smart_contracts/base_d_asa/contract.py:648-655 - // assert role.native in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz assign_role_bool_true@6 - frame_dig 0 - // smart_contracts/base_d_asa/contract.py:650 - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - pushint 40 // 40 - // smart_contracts/base_d_asa/contract.py:648-655 - // assert role.native in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz assign_role_bool_true@6 - frame_dig 0 - // smart_contracts/base_d_asa/contract.py:651 - // UInt64(cst.ROLE_PRIMARY_DEALER), - pushint 50 // 50 - // smart_contracts/base_d_asa/contract.py:648-655 - // assert role.native in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz assign_role_bool_true@6 - frame_dig 0 - // smart_contracts/base_d_asa/contract.py:652 - // UInt64(cst.ROLE_TRUSTEE), - pushint 60 // 60 - // smart_contracts/base_d_asa/contract.py:648-655 - // assert role.native in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz assign_role_bool_true@6 - frame_dig 0 - // smart_contracts/base_d_asa/contract.py:653 - // UInt64(cst.ROLE_AUTHORITY), - pushint 70 // 70 - // smart_contracts/base_d_asa/contract.py:648-655 - // assert role.native in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz assign_role_bool_true@6 - frame_dig 0 - // smart_contracts/base_d_asa/contract.py:654 - // UInt64(cst.ROLE_INTEREST_ORACLE), - pushint 80 // 80 - // smart_contracts/base_d_asa/contract.py:648-655 - // assert role.native in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bz assign_role_bool_false@7 - -assign_role_bool_true@6: - intc_1 // 1 - -assign_role_bool_merge@8: - // smart_contracts/base_d_asa/contract.py:648-655 - // assert role.native in ( - // UInt64(cst.ROLE_ARRANGER), - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - assert // Invalid role identifier - // smart_contracts/base_d_asa/contract.py:657 - // case UInt64(cst.ROLE_ARRANGER): - pushints 20 40 50 60 70 80 // 20, 40, 50, 60, 70, 80 - // smart_contracts/base_d_asa/contract.py:656-685 - // match role.native: - // case UInt64(cst.ROLE_ARRANGER): - // self.arranger.value = role_address.native - // case UInt64(cst.ROLE_ACCOUNT_MANAGER): - // assert ( - // role_address not in self.account_manager - // ), err.INVALID_ROLE_ADDRESS - // self.account_manager[role_address] = typ.RoleConfig.from_bytes( - // config.native - // ) - // case UInt64(cst.ROLE_PRIMARY_DEALER): - // assert role_address not in self.primary_dealer, err.INVALID_ROLE_ADDRESS - // self.primary_dealer[role_address] = typ.RoleConfig.from_bytes( - // config.native - // ) - // case UInt64(cst.ROLE_TRUSTEE): - // assert role_address not in self.trustee, err.INVALID_ROLE_ADDRESS - // self.trustee[role_address] = typ.RoleConfig.from_bytes(config.native) - // case UInt64(cst.ROLE_AUTHORITY): - // assert role_address not in self.authority, err.INVALID_ROLE_ADDRESS - // self.authority[role_address] = typ.RoleConfig.from_bytes(config.native) - // case UInt64(cst.ROLE_INTEREST_ORACLE): - // assert ( - // role_address not in self.interest_oracle - // ), err.INVALID_ROLE_ADDRESS - // self.interest_oracle[role_address] = typ.RoleConfig.from_bytes( - // config.native - // ) - // case _: - // op.err() - frame_dig 0 - match assign_role_switch_case_0@9 assign_role_switch_case_1@10 assign_role_switch_case_2@11 assign_role_switch_case_3@12 assign_role_switch_case_4@13 assign_role_switch_case_5@14 - // smart_contracts/base_d_asa/contract.py:685 - // op.err() - err - -assign_role_switch_case_5@14: - // smart_contracts/base_d_asa/contract.py:679 - // role_address not in self.interest_oracle - bytec 30 // 0x52383023 - frame_dig -3 - concat - dup - box_len - bury 1 - ! - // smart_contracts/base_d_asa/contract.py:678-680 - // assert ( - // role_address not in self.interest_oracle - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:682 - // config.native - frame_dig -1 - extract 2 0 - // smart_contracts/base_d_asa/contract.py:681-683 - // self.interest_oracle[role_address] = typ.RoleConfig.from_bytes( - // config.native - // ) - box_put - -assign_role_switch_case_next@16: - // smart_contracts/base_d_asa/contract.py:686 - // return arc4.UInt64(Global.latest_timestamp) - global LatestTimestamp - itob - swap - retsub - -assign_role_switch_case_4@13: - // smart_contracts/base_d_asa/contract.py:675 - // assert role_address not in self.authority, err.INVALID_ROLE_ADDRESS - bytec 23 // 0x52373023 - frame_dig -3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:676 - // self.authority[role_address] = typ.RoleConfig.from_bytes(config.native) - frame_dig -1 - extract 2 0 - box_put - b assign_role_switch_case_next@16 - -assign_role_switch_case_3@12: - // smart_contracts/base_d_asa/contract.py:672 - // assert role_address not in self.trustee, err.INVALID_ROLE_ADDRESS - bytec 24 // 0x52363023 - frame_dig -3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:673 - // self.trustee[role_address] = typ.RoleConfig.from_bytes(config.native) - frame_dig -1 - extract 2 0 - box_put - b assign_role_switch_case_next@16 - -assign_role_switch_case_2@11: - // smart_contracts/base_d_asa/contract.py:667 - // assert role_address not in self.primary_dealer, err.INVALID_ROLE_ADDRESS - bytec 25 // 0x52353023 - frame_dig -3 - concat - dup - box_len - bury 1 - ! - assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:669 - // config.native - frame_dig -1 - extract 2 0 - // smart_contracts/base_d_asa/contract.py:668-670 - // self.primary_dealer[role_address] = typ.RoleConfig.from_bytes( - // config.native - // ) - box_put - b assign_role_switch_case_next@16 - -assign_role_switch_case_1@10: - // smart_contracts/base_d_asa/contract.py:661 - // role_address not in self.account_manager - bytec 26 // 0x52343023 - frame_dig -3 - concat - dup - box_len - bury 1 - ! - // smart_contracts/base_d_asa/contract.py:660-662 - // assert ( - // role_address not in self.account_manager - // ), err.INVALID_ROLE_ADDRESS - assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:664 - // config.native - frame_dig -1 - extract 2 0 - // smart_contracts/base_d_asa/contract.py:663-665 - // self.account_manager[role_address] = typ.RoleConfig.from_bytes( - // config.native - // ) - box_put - b assign_role_switch_case_next@16 - -assign_role_switch_case_0@9: - // smart_contracts/base_d_asa/contract.py:658 - // self.arranger.value = role_address.native - bytec 8 // 0x52323023 - frame_dig -3 - app_global_put - b assign_role_switch_case_next@16 - -assign_role_bool_false@7: - intc_0 // 0 - b assign_role_bool_merge@8 - - -// smart_contracts.base_d_asa.contract.BaseDAsa.revoke_role(role_address: bytes, role: bytes) -> bytes: -revoke_role: - // smart_contracts/base_d_asa/contract.py:688-689 - // @arc4.abimethod - // def revoke_role(self, role_address: arc4.Address, role: arc4.UInt8) -> arc4.UInt64: - proto 2 1 - // smart_contracts/base_d_asa/contract.py:706 - // self.assert_caller_is_arranger() - callsub assert_caller_is_arranger - // smart_contracts/base_d_asa/contract.py:707 - // self.assert_is_not_defaulted() - callsub assert_is_not_defaulted - // smart_contracts/base_d_asa/contract.py:708 - // assert role.native in ( - frame_dig -1 - btoi - dup - // smart_contracts/base_d_asa/contract.py:709 - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - pushint 40 // 40 - // smart_contracts/base_d_asa/contract.py:708-714 - // assert role.native in ( - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz revoke_role_bool_true@5 - frame_dig 0 - // smart_contracts/base_d_asa/contract.py:710 - // UInt64(cst.ROLE_PRIMARY_DEALER), - pushint 50 // 50 - // smart_contracts/base_d_asa/contract.py:708-714 - // assert role.native in ( - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz revoke_role_bool_true@5 - frame_dig 0 - // smart_contracts/base_d_asa/contract.py:711 - // UInt64(cst.ROLE_TRUSTEE), - pushint 60 // 60 - // smart_contracts/base_d_asa/contract.py:708-714 - // assert role.native in ( - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz revoke_role_bool_true@5 - frame_dig 0 - // smart_contracts/base_d_asa/contract.py:712 - // UInt64(cst.ROLE_AUTHORITY), - pushint 70 // 70 - // smart_contracts/base_d_asa/contract.py:708-714 - // assert role.native in ( - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bnz revoke_role_bool_true@5 - frame_dig 0 - // smart_contracts/base_d_asa/contract.py:713 - // UInt64(cst.ROLE_INTEREST_ORACLE), - pushint 80 // 80 - // smart_contracts/base_d_asa/contract.py:708-714 - // assert role.native in ( - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - == - bz revoke_role_bool_false@6 - -revoke_role_bool_true@5: - intc_1 // 1 - -revoke_role_bool_merge@7: - // smart_contracts/base_d_asa/contract.py:708-714 - // assert role.native in ( - // UInt64(cst.ROLE_ACCOUNT_MANAGER), - // UInt64(cst.ROLE_PRIMARY_DEALER), - // UInt64(cst.ROLE_TRUSTEE), - // UInt64(cst.ROLE_AUTHORITY), - // UInt64(cst.ROLE_INTEREST_ORACLE), - // ), err.INVALID_ROLE - assert // Invalid role identifier - // smart_contracts/base_d_asa/contract.py:716-717 - // # Arranger role can not be revoked (just rotated) - // case UInt64(cst.ROLE_ACCOUNT_MANAGER): - pushints 40 50 60 70 80 // 40, 50, 60, 70, 80 - // smart_contracts/base_d_asa/contract.py:715-733 - // match role.native: - // # Arranger role can not be revoked (just rotated) - // case UInt64(cst.ROLE_ACCOUNT_MANAGER): - // assert role_address in self.account_manager, err.INVALID_ROLE_ADDRESS - // op.Box.delete(cst.PREFIX_ID_ACCOUNT_MANAGER + role_address.bytes) - // case UInt64(cst.ROLE_PRIMARY_DEALER): - // assert role_address in self.primary_dealer, err.INVALID_ROLE_ADDRESS - // op.Box.delete(cst.PREFIX_ID_PRIMARY_DEALER + role_address.bytes) - // case UInt64(cst.ROLE_TRUSTEE): - // assert role_address in self.trustee, err.INVALID_ROLE_ADDRESS - // op.Box.delete(cst.PREFIX_ID_TRUSTEE + role_address.bytes) - // case UInt64(cst.ROLE_AUTHORITY): - // assert role_address in self.authority, err.INVALID_ROLE_ADDRESS - // op.Box.delete(cst.PREFIX_ID_AUTHORITY + role_address.bytes) - // case UInt64(cst.ROLE_INTEREST_ORACLE): - // assert role_address in self.interest_oracle, err.INVALID_ROLE_ADDRESS - // op.Box.delete(cst.PREFIX_ID_INTEREST_ORACLE + role_address.bytes) - // case _: - // op.err() - frame_dig 0 - match revoke_role_switch_case_0@8 revoke_role_switch_case_1@9 revoke_role_switch_case_2@10 revoke_role_switch_case_3@11 revoke_role_switch_case_4@12 - // smart_contracts/base_d_asa/contract.py:733 - // op.err() - err - -revoke_role_switch_case_4@12: - // smart_contracts/base_d_asa/contract.py:730 - // assert role_address in self.interest_oracle, err.INVALID_ROLE_ADDRESS - bytec 30 // 0x52383023 - frame_dig -2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:731 - // op.Box.delete(cst.PREFIX_ID_INTEREST_ORACLE + role_address.bytes) - box_del - pop - -revoke_role_switch_case_next@14: - // smart_contracts/base_d_asa/contract.py:734 - // return arc4.UInt64(Global.latest_timestamp) - global LatestTimestamp - itob - swap - retsub - -revoke_role_switch_case_3@11: - // smart_contracts/base_d_asa/contract.py:727 - // assert role_address in self.authority, err.INVALID_ROLE_ADDRESS - bytec 23 // 0x52373023 - frame_dig -2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:728 - // op.Box.delete(cst.PREFIX_ID_AUTHORITY + role_address.bytes) - box_del - pop - b revoke_role_switch_case_next@14 - -revoke_role_switch_case_2@10: - // smart_contracts/base_d_asa/contract.py:724 - // assert role_address in self.trustee, err.INVALID_ROLE_ADDRESS - bytec 24 // 0x52363023 - frame_dig -2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:725 - // op.Box.delete(cst.PREFIX_ID_TRUSTEE + role_address.bytes) - box_del - pop - b revoke_role_switch_case_next@14 - -revoke_role_switch_case_1@9: - // smart_contracts/base_d_asa/contract.py:721 - // assert role_address in self.primary_dealer, err.INVALID_ROLE_ADDRESS - bytec 25 // 0x52353023 - frame_dig -2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:722 - // op.Box.delete(cst.PREFIX_ID_PRIMARY_DEALER + role_address.bytes) - box_del - pop - b revoke_role_switch_case_next@14 - -revoke_role_switch_case_0@8: - // smart_contracts/base_d_asa/contract.py:718 - // assert role_address in self.account_manager, err.INVALID_ROLE_ADDRESS - bytec 26 // 0x52343023 - frame_dig -2 - concat - dup - box_len - bury 1 - assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:719 - // op.Box.delete(cst.PREFIX_ID_ACCOUNT_MANAGER + role_address.bytes) - box_del - pop - b revoke_role_switch_case_next@14 - -revoke_role_bool_false@6: - intc_0 // 0 - b revoke_role_bool_merge@7 - - -// smart_contracts.base_d_asa.contract.BaseDAsa.open_account(holding_address: bytes, payment_address: bytes) -> bytes: -open_account: - // smart_contracts/base_d_asa/contract.py:736-739 - // @arc4.abimethod - // def open_account( - // self, holding_address: arc4.Address, payment_address: arc4.Address - // ) -> arc4.UInt64: - proto 2 1 - // smart_contracts/base_d_asa/contract.py:756 - // self.assert_caller_is_account_manager() - callsub assert_caller_is_account_manager - // smart_contracts/base_d_asa/contract.py:108 - // return self.status == cfg.STATUS_ENDED - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - intc 4 // 200 - == - // smart_contracts/base_d_asa/contract.py:757 - // assert not self.status_is_ended(), err.UNAUTHORIZED - ! - assert // Not authorized - // smart_contracts/base_d_asa/contract.py:758 - // self.assert_is_not_defaulted() - callsub assert_is_not_defaulted - // smart_contracts/base_d_asa/contract.py:759 - // self.assert_is_not_suspended() - callsub assert_is_not_suspended - // smart_contracts/base_d_asa/contract.py:760 - // assert holding_address not in self.account, err.INVALID_HOLDING_ADDRESS - bytec 7 // 0x52333023 - frame_dig -2 - concat - dup - box_len - bury 1 - ! - assert // Invalid account holding address - // smart_contracts/base_d_asa/contract.py:762-768 - // self.account[holding_address] = typ.AccountInfo( - // payment_address=payment_address, - // units=arc4.UInt64(), - // unit_value=arc4.UInt64(), - // paid_coupons=arc4.UInt64(), - // suspended=arc4.Bool(), - // ) - frame_dig -1 - // smart_contracts/base_d_asa/contract.py:764 - // units=arc4.UInt64(), - bytec 27 // 0x0000000000000000 - // smart_contracts/base_d_asa/contract.py:762-768 - // self.account[holding_address] = typ.AccountInfo( - // payment_address=payment_address, - // units=arc4.UInt64(), - // unit_value=arc4.UInt64(), - // paid_coupons=arc4.UInt64(), - // suspended=arc4.Bool(), - // ) - concat - // smart_contracts/base_d_asa/contract.py:765 - // unit_value=arc4.UInt64(), - bytec 27 // 0x0000000000000000 - // smart_contracts/base_d_asa/contract.py:762-768 - // self.account[holding_address] = typ.AccountInfo( - // payment_address=payment_address, - // units=arc4.UInt64(), - // unit_value=arc4.UInt64(), - // paid_coupons=arc4.UInt64(), - // suspended=arc4.Bool(), - // ) - concat - // smart_contracts/base_d_asa/contract.py:766 - // paid_coupons=arc4.UInt64(), - bytec 27 // 0x0000000000000000 - // smart_contracts/base_d_asa/contract.py:762-768 - // self.account[holding_address] = typ.AccountInfo( - // payment_address=payment_address, - // units=arc4.UInt64(), - // unit_value=arc4.UInt64(), - // paid_coupons=arc4.UInt64(), - // suspended=arc4.Bool(), - // ) - concat - // smart_contracts/base_d_asa/contract.py:767 - // suspended=arc4.Bool(), - pushbytes 0x00 - // smart_contracts/base_d_asa/contract.py:762-768 - // self.account[holding_address] = typ.AccountInfo( - // payment_address=payment_address, - // units=arc4.UInt64(), - // unit_value=arc4.UInt64(), - // paid_coupons=arc4.UInt64(), - // suspended=arc4.Bool(), - // ) - concat - box_put - // smart_contracts/base_d_asa/contract.py:769 - // return arc4.UInt64(Global.latest_timestamp) - global LatestTimestamp - itob - retsub - - -// smart_contracts.base_d_asa.contract.BaseDAsa.assert_caller_is_account_manager() -> void: -assert_caller_is_account_manager: - // smart_contracts/base_d_asa/contract.py:122-123 - // @subroutine - // def assert_caller_is_account_manager(self) -> None: - proto 0 0 - intc_0 // 0 - // smart_contracts/base_d_asa/contract.py:126 - // caller in self.account_manager - bytec 26 // 0x52343023 - // smart_contracts/base_d_asa/contract.py:124 - // caller = arc4.Address(Txn.sender) - txn Sender - // smart_contracts/base_d_asa/contract.py:126 - // caller in self.account_manager - concat - dup - box_len - bury 1 - // smart_contracts/base_d_asa/contract.py:126-129 - // caller in self.account_manager - // and self.account_manager[caller].role_validity_start - // <= Global.latest_timestamp - // <= self.account_manager[caller].role_validity_end - bz assert_caller_is_account_manager_bool_false@4 - // smart_contracts/base_d_asa/contract.py:127 - // and self.account_manager[caller].role_validity_start - frame_dig 1 - box_get - assert // check self.account_manager entry exists - extract 0 8 // on error: Index access is out of bounds - // smart_contracts/base_d_asa/contract.py:128 - // <= Global.latest_timestamp - global LatestTimestamp - // smart_contracts/base_d_asa/contract.py:127-128 - // and self.account_manager[caller].role_validity_start - // <= Global.latest_timestamp - itob - dup - frame_bury 0 - b<= - // smart_contracts/base_d_asa/contract.py:127-129 - // and self.account_manager[caller].role_validity_start - // <= Global.latest_timestamp - // <= self.account_manager[caller].role_validity_end - bz assert_caller_is_account_manager_bool_false@4 - // smart_contracts/base_d_asa/contract.py:129 - // <= self.account_manager[caller].role_validity_end - frame_dig 1 - box_get - assert // check self.account_manager entry exists - extract 8 8 // on error: Index access is out of bounds - // smart_contracts/base_d_asa/contract.py:128-129 - // <= Global.latest_timestamp - // <= self.account_manager[caller].role_validity_end - frame_dig 0 - b>= - // smart_contracts/base_d_asa/contract.py:127-129 - // and self.account_manager[caller].role_validity_start - // <= Global.latest_timestamp - // <= self.account_manager[caller].role_validity_end - bz assert_caller_is_account_manager_bool_false@4 - intc_1 // 1 - -assert_caller_is_account_manager_bool_merge@5: - // smart_contracts/base_d_asa/contract.py:125-130 - // assert ( - // caller in self.account_manager - // and self.account_manager[caller].role_validity_start - // <= Global.latest_timestamp - // <= self.account_manager[caller].role_validity_end - // ), err.UNAUTHORIZED - assert // Not authorized - retsub - -assert_caller_is_account_manager_bool_false@4: - intc_0 // 0 - b assert_caller_is_account_manager_bool_merge@5 - - -// smart_contracts.base_d_asa.contract.BaseDAsa.assert_is_not_suspended() -> void: -assert_is_not_suspended: - // smart_contracts/base_d_asa/contract.py:114-115 - // @subroutine - // def assert_is_not_suspended(self) -> None: - proto 0 0 - // smart_contracts/base_d_asa/contract.py:116 - // assert not self.suspended, err.SUSPENDED - intc_0 // 0 - bytec 19 // "suspended" - app_global_get_ex - assert // check self.suspended exists - ! - assert // Suspended operations - retsub - - -// smart_contracts.base_d_asa.contract.BaseDAsa.close_account(holding_address: bytes) -> bytes: -close_account: - // smart_contracts/base_d_asa/contract.py:771-774 - // @arc4.abimethod - // def close_account( - // self, holding_address: arc4.Address - // ) -> arc4.Tuple[arc4.UInt64, arc4.UInt64]: - proto 1 1 - // smart_contracts/base_d_asa/contract.py:789 - // self.assert_caller_is_account_manager() - callsub assert_caller_is_account_manager - // smart_contracts/base_d_asa/contract.py:790 - // self.assert_is_not_defaulted() - callsub assert_is_not_defaulted - // smart_contracts/base_d_asa/contract.py:174 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec 7 // 0x52333023 - frame_dig -1 - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // smart_contracts/base_d_asa/contract.py:793 - // closed_units = self.account[holding_address].units.native - dup - box_get - assert // check self.account entry exists - extract 32 8 // on error: Index access is out of bounds - btoi - dup - uncover 2 - // smart_contracts/base_d_asa/contract.py:794 - // op.Box.delete(cst.PREFIX_ID_ACCOUNT + holding_address.bytes) - box_del - pop - // smart_contracts/base_d_asa/contract.py:795 - // self.circulating_units -= closed_units - intc_0 // 0 - bytec_1 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - swap - - - bytec_1 // "circulating_units" - swap - app_global_put - // smart_contracts/base_d_asa/contract.py:366 - // if self.circulating_units == 0: - intc_0 // 0 - bytec_1 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - bnz close_account_after_if_else@3 - // smart_contracts/base_d_asa/contract.py:367 - // self.status = UInt64(cfg.STATUS_ENDED) - bytec_2 // "status" - intc 4 // 200 - app_global_put - -close_account_after_if_else@3: - // smart_contracts/base_d_asa/contract.py:798 - // (arc4.UInt64(closed_units), arc4.UInt64(Global.latest_timestamp)) - frame_dig 0 - itob - global LatestTimestamp - itob - // smart_contracts/base_d_asa/contract.py:797-799 - // return arc4.Tuple( - // (arc4.UInt64(closed_units), arc4.UInt64(Global.latest_timestamp)) - // ) - concat - swap - retsub - - -// smart_contracts.base_d_asa.contract.BaseDAsa.primary_distribution(holding_address: bytes, units: bytes) -> bytes: -primary_distribution: - // smart_contracts/base_d_asa/contract.py:801-804 - // @arc4.abimethod - // def primary_distribution( - // self, holding_address: arc4.Address, units: arc4.UInt64 - // ) -> arc4.UInt64: - proto 2 1 - intc_0 // 0 - dup - pushbytes "" - // smart_contracts/base_d_asa/contract.py:104 - // return self.status == cfg.STATUS_ACTIVE - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 // 100 - == - // smart_contracts/base_d_asa/contract.py:289-292 - // self.status_is_active() - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - bz primary_distribution_bool_false@5 - // smart_contracts/base_d_asa/contract.py:290 - // and self.primary_distribution_opening_date - intc_0 // 0 - bytec 14 // "primary_distribution_opening_date" - app_global_get_ex - assert // check self.primary_distribution_opening_date exists - // smart_contracts/base_d_asa/contract.py:291 - // <= Global.latest_timestamp - global LatestTimestamp - dup - frame_bury 2 - // smart_contracts/base_d_asa/contract.py:290-291 - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - <= - // smart_contracts/base_d_asa/contract.py:290-292 - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - bz primary_distribution_bool_false@5 - // smart_contracts/base_d_asa/contract.py:292 - // < self.primary_distribution_closure_date - intc_0 // 0 - bytec 15 // "primary_distribution_closure_date" - app_global_get_ex - assert // check self.primary_distribution_closure_date exists - // smart_contracts/base_d_asa/contract.py:291-292 - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - frame_dig 2 - > - // smart_contracts/base_d_asa/contract.py:290-292 - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - bz primary_distribution_bool_false@5 - intc_1 // 1 - -primary_distribution_bool_merge@6: - // smart_contracts/base_d_asa/contract.py:288-293 - // assert ( - // self.status_is_active() - // and self.primary_distribution_opening_date - // <= Global.latest_timestamp - // < self.primary_distribution_closure_date - // ), err.PRIMARY_DISTRIBUTION_CLOSED - assert // Primary distribution is closed - // smart_contracts/base_d_asa/contract.py:136 - // caller in self.primary_dealer - bytec 25 // 0x52353023 - // smart_contracts/base_d_asa/contract.py:134 - // caller = arc4.Address(Txn.sender) - txn Sender - // smart_contracts/base_d_asa/contract.py:136 - // caller in self.primary_dealer - concat - dup - frame_bury 0 - box_len - bury 1 - // smart_contracts/base_d_asa/contract.py:136-139 - // caller in self.primary_dealer - // and self.primary_dealer[caller].role_validity_start - // <= Global.latest_timestamp - // <= self.primary_dealer[caller].role_validity_end - bz primary_distribution_bool_false@12 - // smart_contracts/base_d_asa/contract.py:137 - // and self.primary_dealer[caller].role_validity_start - frame_dig 0 - box_get - assert // check self.primary_dealer entry exists - extract 0 8 // on error: Index access is out of bounds - // smart_contracts/base_d_asa/contract.py:138 - // <= Global.latest_timestamp - global LatestTimestamp - // smart_contracts/base_d_asa/contract.py:137-138 - // and self.primary_dealer[caller].role_validity_start - // <= Global.latest_timestamp - itob - dup - frame_bury 1 - b<= - // smart_contracts/base_d_asa/contract.py:137-139 - // and self.primary_dealer[caller].role_validity_start - // <= Global.latest_timestamp - // <= self.primary_dealer[caller].role_validity_end - bz primary_distribution_bool_false@12 - // smart_contracts/base_d_asa/contract.py:139 - // <= self.primary_dealer[caller].role_validity_end - frame_dig 0 - box_get - assert // check self.primary_dealer entry exists - extract 8 8 // on error: Index access is out of bounds - // smart_contracts/base_d_asa/contract.py:138-139 - // <= Global.latest_timestamp - // <= self.primary_dealer[caller].role_validity_end - frame_dig 1 - b>= - // smart_contracts/base_d_asa/contract.py:137-139 - // and self.primary_dealer[caller].role_validity_start - // <= Global.latest_timestamp - // <= self.primary_dealer[caller].role_validity_end - bz primary_distribution_bool_false@12 - intc_1 // 1 - -primary_distribution_bool_merge@13: - // smart_contracts/base_d_asa/contract.py:135-140 - // assert ( - // caller in self.primary_dealer - // and self.primary_dealer[caller].role_validity_start - // <= Global.latest_timestamp - // <= self.primary_dealer[caller].role_validity_end - // ), err.UNAUTHORIZED - assert // Not authorized - // smart_contracts/base_d_asa/contract.py:174 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec 7 // 0x52333023 - frame_dig -2 - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // smart_contracts/base_d_asa/contract.py:829 - // self.assert_is_not_defaulted() - callsub assert_is_not_defaulted - // smart_contracts/base_d_asa/contract.py:830 - // self.assert_is_not_suspended() - callsub assert_is_not_suspended - // smart_contracts/base_d_asa/contract.py:831 - // assert units.native > 0, err.ZERO_UNITS - frame_dig -1 - btoi - dup - assert // Can not distribute zero units - // smart_contracts/base_d_asa/contract.py:833 - // self.circulating_units + units.native <= self.total_units - intc_0 // 0 - bytec_1 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - dig 1 - + - intc_0 // 0 - bytec 5 // "total_units" - app_global_get_ex - assert // check self.total_units exists - <= - // smart_contracts/base_d_asa/contract.py:832-834 - // assert ( - // self.circulating_units + units.native <= self.total_units - // ), err.OVER_DISTRIBUTION - assert // Insufficient remaining D-ASA units - // smart_contracts/base_d_asa/contract.py:836 - // self.circulating_units += units.native - intc_0 // 0 - bytec_1 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - dig 1 - + - bytec_1 // "circulating_units" - swap - app_global_put - // smart_contracts/base_d_asa/contract.py:838 - // self.account[holding_address].units.native + units.native - dig 1 - box_get - assert // check self.account entry exists - extract 32 8 // on error: Index access is out of bounds - btoi - + - // smart_contracts/base_d_asa/contract.py:837-839 - // self.account[holding_address].units = arc4.UInt64( - // self.account[holding_address].units.native + units.native - // ) - itob - // smart_contracts/base_d_asa/contract.py:837 - // self.account[holding_address].units = arc4.UInt64( - dig 1 - box_get - assert // check self.account entry exists - // smart_contracts/base_d_asa/contract.py:837-839 - // self.account[holding_address].units = arc4.UInt64( - // self.account[holding_address].units.native + units.native - // ) - swap - replace2 32 - dig 1 - swap - box_put - // smart_contracts/base_d_asa/contract.py:840 - // self.account[holding_address].unit_value = arc4.UInt64(self.unit_value) - intc_0 // 0 - bytec 4 // "unit_value" - app_global_get_ex - assert // check self.unit_value exists - itob - dig 1 - box_get - assert // check self.account entry exists - swap - replace2 40 - box_put - // smart_contracts/base_d_asa/contract.py:841 - // return arc4.UInt64(self.total_units - self.circulating_units) - intc_0 // 0 - bytec 5 // "total_units" - app_global_get_ex - assert // check self.total_units exists - intc_0 // 0 - bytec_1 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - - - itob - frame_bury 0 - retsub - -primary_distribution_bool_false@12: - intc_0 // 0 - b primary_distribution_bool_merge@13 - -primary_distribution_bool_false@5: - intc_0 // 0 - b primary_distribution_bool_merge@6 - - -// smart_contracts.base_d_asa.contract.BaseDAsa.set_asset_suspension(suspended: bytes) -> bytes: -set_asset_suspension: - // smart_contracts/base_d_asa/contract.py:843-844 - // @arc4.abimethod - // def set_asset_suspension(self, suspended: arc4.Bool) -> arc4.UInt64: - proto 1 1 - // smart_contracts/base_d_asa/contract.py:857 - // self.assert_caller_is_authority() - callsub assert_caller_is_authority - // smart_contracts/base_d_asa/contract.py:858 - // self.suspended = UInt64(suspended.native) - frame_dig -1 - intc_0 // 0 - getbit - bytec 19 // "suspended" - swap - app_global_put - // smart_contracts/base_d_asa/contract.py:859 - // return arc4.UInt64(Global.latest_timestamp) - global LatestTimestamp - itob - retsub - - -// smart_contracts.base_d_asa.contract.BaseDAsa.assert_caller_is_authority() -> void: -assert_caller_is_authority: - // smart_contracts/base_d_asa/contract.py:152-153 - // @subroutine - // def assert_caller_is_authority(self) -> None: - proto 0 0 - intc_0 // 0 - // smart_contracts/base_d_asa/contract.py:156 - // caller in self.authority - bytec 23 // 0x52373023 - // smart_contracts/base_d_asa/contract.py:154 - // caller = arc4.Address(Txn.sender) - txn Sender - // smart_contracts/base_d_asa/contract.py:156 - // caller in self.authority - concat - dup - box_len - bury 1 - // smart_contracts/base_d_asa/contract.py:156-159 - // caller in self.authority - // and self.authority[caller].role_validity_start - // <= Global.latest_timestamp - // <= self.authority[caller].role_validity_end - bz assert_caller_is_authority_bool_false@4 - // smart_contracts/base_d_asa/contract.py:157 - // and self.authority[caller].role_validity_start - frame_dig 1 - box_get - assert // check self.authority entry exists - extract 0 8 // on error: Index access is out of bounds - // smart_contracts/base_d_asa/contract.py:158 - // <= Global.latest_timestamp - global LatestTimestamp - // smart_contracts/base_d_asa/contract.py:157-158 - // and self.authority[caller].role_validity_start - // <= Global.latest_timestamp - itob - dup - frame_bury 0 - b<= - // smart_contracts/base_d_asa/contract.py:157-159 - // and self.authority[caller].role_validity_start - // <= Global.latest_timestamp - // <= self.authority[caller].role_validity_end - bz assert_caller_is_authority_bool_false@4 - // smart_contracts/base_d_asa/contract.py:159 - // <= self.authority[caller].role_validity_end - frame_dig 1 - box_get - assert // check self.authority entry exists - extract 8 8 // on error: Index access is out of bounds - // smart_contracts/base_d_asa/contract.py:158-159 - // <= Global.latest_timestamp - // <= self.authority[caller].role_validity_end - frame_dig 0 - b>= - // smart_contracts/base_d_asa/contract.py:157-159 - // and self.authority[caller].role_validity_start - // <= Global.latest_timestamp - // <= self.authority[caller].role_validity_end - bz assert_caller_is_authority_bool_false@4 - intc_1 // 1 - -assert_caller_is_authority_bool_merge@5: - // smart_contracts/base_d_asa/contract.py:155-160 - // assert ( - // caller in self.authority - // and self.authority[caller].role_validity_start - // <= Global.latest_timestamp - // <= self.authority[caller].role_validity_end - // ), err.UNAUTHORIZED - assert // Not authorized - retsub - -assert_caller_is_authority_bool_false@4: - intc_0 // 0 - b assert_caller_is_authority_bool_merge@5 - - -// smart_contracts.base_d_asa.contract.BaseDAsa.set_account_suspension(holding_address: bytes, suspended: bytes) -> bytes: -set_account_suspension: - // smart_contracts/base_d_asa/contract.py:861-864 - // @arc4.abimethod - // def set_account_suspension( - // self, holding_address: arc4.Address, suspended: arc4.Bool - // ) -> arc4.UInt64: - proto 2 1 - // smart_contracts/base_d_asa/contract.py:879 - // self.assert_caller_is_authority() - callsub assert_caller_is_authority - // smart_contracts/base_d_asa/contract.py:174 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec 7 // 0x52333023 - frame_dig -2 - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // smart_contracts/base_d_asa/contract.py:881 - // self.account[holding_address].suspended = suspended - dup - box_get - assert // check self.account entry exists - frame_dig -1 - intc_0 // 0 - getbit - pushint 448 // 448 - swap - setbit - box_put - // smart_contracts/base_d_asa/contract.py:882 - // return arc4.UInt64(Global.latest_timestamp) - global LatestTimestamp - itob - retsub - - -// smart_contracts.base_d_asa.contract.BaseDAsa.set_default_status(defaulted: bytes) -> void: -set_default_status: - // smart_contracts/base_d_asa/contract.py:884-885 - // @arc4.abimethod - // def set_default_status(self, defaulted: arc4.Bool) -> None: - proto 1 0 - intc_0 // 0 - // smart_contracts/base_d_asa/contract.py:146 - // caller in self.trustee - bytec 24 // 0x52363023 - // smart_contracts/base_d_asa/contract.py:144 - // caller = arc4.Address(Txn.sender) - txn Sender - // smart_contracts/base_d_asa/contract.py:146 - // caller in self.trustee - concat - dup - box_len - bury 1 - // smart_contracts/base_d_asa/contract.py:146-149 - // caller in self.trustee - // and self.trustee[caller].role_validity_start - // <= Global.latest_timestamp - // <= self.trustee[caller].role_validity_end - bz set_default_status_bool_false@5 - // smart_contracts/base_d_asa/contract.py:147 - // and self.trustee[caller].role_validity_start - frame_dig 1 - box_get - assert // check self.trustee entry exists - extract 0 8 // on error: Index access is out of bounds - // smart_contracts/base_d_asa/contract.py:148 - // <= Global.latest_timestamp - global LatestTimestamp - // smart_contracts/base_d_asa/contract.py:147-148 - // and self.trustee[caller].role_validity_start - // <= Global.latest_timestamp - itob - dup - frame_bury 0 - b<= - // smart_contracts/base_d_asa/contract.py:147-149 - // and self.trustee[caller].role_validity_start - // <= Global.latest_timestamp - // <= self.trustee[caller].role_validity_end - bz set_default_status_bool_false@5 - // smart_contracts/base_d_asa/contract.py:149 - // <= self.trustee[caller].role_validity_end - frame_dig 1 - box_get - assert // check self.trustee entry exists - extract 8 8 // on error: Index access is out of bounds - // smart_contracts/base_d_asa/contract.py:148-149 - // <= Global.latest_timestamp - // <= self.trustee[caller].role_validity_end - frame_dig 0 - b>= - // smart_contracts/base_d_asa/contract.py:147-149 - // and self.trustee[caller].role_validity_start - // <= Global.latest_timestamp - // <= self.trustee[caller].role_validity_end - bz set_default_status_bool_false@5 - intc_1 // 1 - -set_default_status_bool_merge@6: - // smart_contracts/base_d_asa/contract.py:145-150 - // assert ( - // caller in self.trustee - // and self.trustee[caller].role_validity_start - // <= Global.latest_timestamp - // <= self.trustee[caller].role_validity_end - // ), err.UNAUTHORIZED - assert // Not authorized - // smart_contracts/base_d_asa/contract.py:896 - // self.defaulted = UInt64(defaulted.native) - frame_dig -1 - intc_0 // 0 - getbit - bytec 20 // "defaulted" - swap - app_global_put - retsub - -set_default_status_bool_false@5: - intc_0 // 0 - b set_default_status_bool_merge@6 - - -// smart_contracts.base_d_asa.contract.BaseDAsa.get_asset_info() -> bytes: -get_asset_info: - // smart_contracts/base_d_asa/contract.py:898-899 - // @arc4.abimethod(readonly=True) - // def get_asset_info(self) -> typ.AssetInfo: - proto 0 1 - // smart_contracts/base_d_asa/contract.py:908 - // performance = UInt64(cst.PRF_PERFORMANT) - intc_0 // 0 - dup - // smart_contracts/base_d_asa/contract.py:909 - // if Global.latest_timestamp > self.maturity_date > 0: - global LatestTimestamp - intc_0 // 0 - bytec_3 // "maturity_date" - app_global_get_ex - swap - dup - cover 2 - cover 4 - assert // check self.maturity_date exists - > - bz get_asset_info_after_if_else@3 - frame_dig 0 - frame_bury 2 - frame_dig 1 - bz get_asset_info_after_if_else@3 - // smart_contracts/base_d_asa/contract.py:910 - // performance = UInt64(cst.PRF_MATURED) - intc_3 // 4 - frame_bury 2 - -get_asset_info_after_if_else@3: - frame_dig 2 - frame_bury 0 - // smart_contracts/base_d_asa/contract.py:911-912 - // # The reference implementation has no grace or delinquency periods - // if self.defaulted: - intc_0 // 0 - bytec 20 // "defaulted" - app_global_get_ex - assert // check self.defaulted exists - bz get_asset_info_after_if_else@5 - // smart_contracts/base_d_asa/contract.py:913 - // performance = UInt64(cst.PRF_DEFAULTED) - pushint 3 // 3 - frame_bury 0 - -get_asset_info_after_if_else@5: - // smart_contracts/base_d_asa/contract.py:916 - // denomination_asset_id=arc4.UInt64(self.denomination_asset_id), - intc_0 // 0 - bytec 9 // "denomination_asset_id" - app_global_get_ex - assert // check self.denomination_asset_id exists - itob - // smart_contracts/base_d_asa/contract.py:917 - // settlement_asset_id=arc4.UInt64(self.settlement_asset_id), - intc_0 // 0 - bytec 10 // "settlement_asset_id" - app_global_get_ex - assert // check self.settlement_asset_id exists - itob - // smart_contracts/base_d_asa/contract.py:340 - // return self.circulating_units * self.unit_value - intc_0 // 0 - bytec_1 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - intc_0 // 0 - bytec 4 // "unit_value" - app_global_get_ex - assert // check self.unit_value exists - * - // smart_contracts/base_d_asa/contract.py:918 - // outstanding_principal=arc4.UInt64(self.outstanding_principal()), - itob - // smart_contracts/base_d_asa/contract.py:919 - // unit_value=arc4.UInt64(self.unit_value), - intc_0 // 0 - bytec 4 // "unit_value" - app_global_get_ex - assert // check self.unit_value exists - itob - // smart_contracts/base_d_asa/contract.py:920 - // day_count_convention=arc4.UInt8(self.day_count_convention), - intc_0 // 0 - bytec 11 // "day_count_convention" - app_global_get_ex - assert // check self.day_count_convention exists - itob - extract 7 1 - // smart_contracts/base_d_asa/contract.py:921 - // principal_discount=arc4.UInt16(self.principal_discount), - intc_0 // 0 - bytec 13 // "principal_discount" - app_global_get_ex - assert // check self.principal_discount exists - itob - extract 6 2 - // smart_contracts/base_d_asa/contract.py:922 - // interest_rate=arc4.UInt16(self.interest_rate), - intc_0 // 0 - bytec 21 // "interest_rate" - app_global_get_ex - assert // check self.interest_rate exists - itob - extract 6 2 - // smart_contracts/base_d_asa/contract.py:923 - // total_supply=arc4.UInt64(self.total_units), - intc_0 // 0 - bytec 5 // "total_units" - app_global_get_ex - assert // check self.total_units exists - itob - // smart_contracts/base_d_asa/contract.py:924 - // circulating_supply=arc4.UInt64(self.circulating_units), - intc_0 // 0 - bytec_1 // "circulating_units" - app_global_get_ex - assert // check self.circulating_units exists - itob - // smart_contracts/base_d_asa/contract.py:926 - // self.primary_distribution_opening_date - intc_0 // 0 - bytec 14 // "primary_distribution_opening_date" - app_global_get_ex - assert // check self.primary_distribution_opening_date exists - // smart_contracts/base_d_asa/contract.py:925-927 - // primary_distribution_opening_date=arc4.UInt64( - // self.primary_distribution_opening_date - // ), - itob - // smart_contracts/base_d_asa/contract.py:929 - // self.primary_distribution_closure_date - intc_0 // 0 - bytec 15 // "primary_distribution_closure_date" - app_global_get_ex - assert // check self.primary_distribution_closure_date exists - // smart_contracts/base_d_asa/contract.py:928-930 - // primary_distribution_closure_date=arc4.UInt64( - // self.primary_distribution_closure_date - // ), - itob - // smart_contracts/base_d_asa/contract.py:931 - // issuance_date=arc4.UInt64(self.issuance_date), - intc_0 // 0 - bytec 16 // "issuance_date" - app_global_get_ex - assert // check self.issuance_date exists - itob - // smart_contracts/base_d_asa/contract.py:932 - // maturity_date=arc4.UInt64(self.maturity_date), - intc_0 // 0 - bytec_3 // "maturity_date" - app_global_get_ex - assert // check self.maturity_date exists - itob - // smart_contracts/base_d_asa/contract.py:933 - // suspended=arc4.Bool(bool(self.suspended)), - intc_0 // 0 - bytec 19 // "suspended" - app_global_get_ex - assert // check self.suspended exists - pushbytes 0x00 - intc_0 // 0 - uncover 2 - setbit - // smart_contracts/base_d_asa/contract.py:934 - // performance=arc4.UInt8(performance), - frame_dig 0 - itob - extract 7 1 - // smart_contracts/base_d_asa/contract.py:915-935 - // return typ.AssetInfo( - // denomination_asset_id=arc4.UInt64(self.denomination_asset_id), - // settlement_asset_id=arc4.UInt64(self.settlement_asset_id), - // outstanding_principal=arc4.UInt64(self.outstanding_principal()), - // unit_value=arc4.UInt64(self.unit_value), - // day_count_convention=arc4.UInt8(self.day_count_convention), - // principal_discount=arc4.UInt16(self.principal_discount), - // interest_rate=arc4.UInt16(self.interest_rate), - // total_supply=arc4.UInt64(self.total_units), - // circulating_supply=arc4.UInt64(self.circulating_units), - // primary_distribution_opening_date=arc4.UInt64( - // self.primary_distribution_opening_date - // ), - // primary_distribution_closure_date=arc4.UInt64( - // self.primary_distribution_closure_date - // ), - // issuance_date=arc4.UInt64(self.issuance_date), - // maturity_date=arc4.UInt64(self.maturity_date), - // suspended=arc4.Bool(bool(self.suspended)), - // performance=arc4.UInt8(performance), - // ) - uncover 14 - uncover 14 - concat - uncover 13 - concat - uncover 12 - concat - uncover 11 - concat - uncover 10 - concat - uncover 9 - concat - uncover 8 - concat - uncover 7 - concat - uncover 6 - concat - uncover 5 - concat - uncover 4 - concat - uncover 3 - concat - uncover 2 - concat - swap - concat - frame_bury 0 - retsub - - -// smart_contracts.base_d_asa.contract.BaseDAsa.get_account_info(holding_address: bytes) -> bytes: -get_account_info: - // smart_contracts/base_d_asa/contract.py:937-938 - // @arc4.abimethod(readonly=True) - // def get_account_info(self, holding_address: arc4.Address) -> typ.AccountInfo: - proto 1 1 - // smart_contracts/base_d_asa/contract.py:174 - // assert holding_address in self.account, err.INVALID_HOLDING_ADDRESS - bytec 7 // 0x52333023 - frame_dig -1 - concat - dup - box_len - bury 1 - assert // Invalid account holding address - // smart_contracts/base_d_asa/contract.py:952 - // return self.account[holding_address] - box_get - assert // check self.account entry exists - retsub - - -// smart_contracts.base_d_asa.contract.BaseDAsa.get_time_events() -> bytes: -get_time_events: - // smart_contracts/base_d_asa/contract.py:954-955 - // @arc4.abimethod(readonly=True) - // def get_time_events(self) -> typ.TimeEvents: - proto 0 1 - // smart_contracts/base_d_asa/contract.py:962 - // time_events = typ.TimeEvents() - pushbytes 0x0000 - // smart_contracts/base_d_asa/contract.py:104 - // return self.status == cfg.STATUS_ACTIVE - intc_0 // 0 - bytec_2 // "status" - app_global_get_ex - assert // check self.status exists - pushint 100 // 100 - == - // smart_contracts/base_d_asa/contract.py:963 - // if self.status_is_active(): - bz get_time_events_after_if_else@2 - // smart_contracts/base_d_asa/contract.py:964 - // time_events = self.time_events.value.copy() - bytec 22 // 0x74696d654576656e7473 - box_get - swap - frame_bury 0 - assert // check self.time_events exists - -get_time_events_after_if_else@2: - // smart_contracts/base_d_asa/contract.py:965 - // return time_events - frame_dig 0 - swap - retsub - - -// smart_contracts.base_d_asa.contract.BaseDAsa.get_secondary_market_schedule() -> bytes: -get_secondary_market_schedule: - // smart_contracts/base_d_asa/contract.py:967-968 - // @arc4.abimethod(readonly=True) - // def get_secondary_market_schedule(self) -> typ.TimeEvents: - proto 0 1 - // smart_contracts/base_d_asa/contract.py:976 - // arc4.UInt64(self.secondary_market_opening_date), - intc_0 // 0 - bytec 17 // "secondary_market_opening_date" - app_global_get_ex - assert // check self.secondary_market_opening_date exists - itob - // smart_contracts/base_d_asa/contract.py:977 - // arc4.UInt64(self.secondary_market_closure_date), - intc_0 // 0 - bytec 18 // "secondary_market_closure_date" - app_global_get_ex - assert // check self.secondary_market_closure_date exists - itob - // smart_contracts/base_d_asa/contract.py:975-978 - // return typ.TimeEvents( - // arc4.UInt64(self.secondary_market_opening_date), - // arc4.UInt64(self.secondary_market_closure_date), - // ) - concat - pushbytes 0x0002 - swap - concat - retsub - - -// smart_contracts.base_d_asa.contract.BaseDAsa.get_asset_metadata() -> bytes: -get_asset_metadata: - // smart_contracts/base_d_asa/contract.py:980-981 - // @arc4.abimethod(readonly=True) - // def get_asset_metadata(self) -> typ.AssetMetadata: - proto 0 1 - // smart_contracts/base_d_asa/contract.py:989 - // return typ.AssetMetadata.from_bytes(self.metadata) - intc_0 // 0 - bytec 12 // "metadata" - app_global_get_ex - assert // check self.metadata exists - retsub diff --git a/smart_contracts/base_d_asa/BaseDAsa.arc32.json b/smart_contracts/base_d_asa/BaseDAsa.arc32.json deleted file mode 100644 index 78f9fb8..0000000 --- a/smart_contracts/base_d_asa/BaseDAsa.arc32.json +++ /dev/null @@ -1,756 +0,0 @@ -{ - "hints": { - "asset_create(address,(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void": { - "call_config": { - "no_op": "CREATE" - }, - "structs": { - "metadata": { - "name": "AssetMetadata", - "elements": [ - [ - "contract_type", - "uint8" - ], - [ - "calendar", - "uint8" - ], - [ - "business_day_convention", - "uint8" - ], - [ - "end_of_month_convention", - "uint8" - ], - [ - "prepayment_effect", - "uint8" - ], - [ - "penalty_type", - "uint8" - ], - [ - "prospectus_hash", - "byte[32]" - ], - [ - "prospectus_url", - "string" - ] - ] - } - } - }, - "asset_update((uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string))void": { - "call_config": { - "update_application": "CALL" - }, - "structs": { - "metadata": { - "name": "AssetMetadata", - "elements": [ - [ - "contract_type", - "uint8" - ], - [ - "calendar", - "uint8" - ], - [ - "business_day_convention", - "uint8" - ], - [ - "end_of_month_convention", - "uint8" - ], - [ - "prepayment_effect", - "uint8" - ], - [ - "penalty_type", - "uint8" - ], - [ - "prospectus_hash", - "byte[32]" - ], - [ - "prospectus_url", - "string" - ] - ] - } - } - }, - "asset_config(uint64,uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void": { - "call_config": { - "no_op": "CALL" - } - }, - "set_secondary_time_events(uint64[])(uint64,uint64)": { - "call_config": { - "no_op": "CALL" - }, - "structs": { - "output": { - "name": "SecondaryMarketSchedule", - "elements": [ - [ - "secondary_market_opening_date", - "uint64" - ], - [ - "secondary_market_closure_date", - "uint64" - ] - ] - } - } - }, - "assign_role(address,uint8,byte[])uint64": { - "call_config": { - "no_op": "CALL" - } - }, - "revoke_role(address,uint8)uint64": { - "call_config": { - "no_op": "CALL" - } - }, - "open_account(address,address)uint64": { - "call_config": { - "no_op": "CALL" - } - }, - "close_account(address)(uint64,uint64)": { - "call_config": { - "no_op": "CALL" - } - }, - "primary_distribution(address,uint64)uint64": { - "call_config": { - "no_op": "CALL" - } - }, - "set_asset_suspension(bool)uint64": { - "call_config": { - "no_op": "CALL" - } - }, - "set_account_suspension(address,bool)uint64": { - "call_config": { - "no_op": "CALL" - } - }, - "set_default_status(bool)void": { - "call_config": { - "no_op": "CALL" - } - }, - "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)": { - "read_only": true, - "call_config": { - "no_op": "CALL" - }, - "structs": { - "output": { - "name": "AssetInfo", - "elements": [ - [ - "denomination_asset_id", - "uint64" - ], - [ - "settlement_asset_id", - "uint64" - ], - [ - "outstanding_principal", - "uint64" - ], - [ - "unit_value", - "uint64" - ], - [ - "day_count_convention", - "uint8" - ], - [ - "principal_discount", - "uint16" - ], - [ - "interest_rate", - "uint16" - ], - [ - "total_supply", - "uint64" - ], - [ - "circulating_supply", - "uint64" - ], - [ - "primary_distribution_opening_date", - "uint64" - ], - [ - "primary_distribution_closure_date", - "uint64" - ], - [ - "issuance_date", - "uint64" - ], - [ - "maturity_date", - "uint64" - ], - [ - "suspended", - "bool" - ], - [ - "performance", - "uint8" - ] - ] - } - } - }, - "get_account_info(address)(address,uint64,uint64,uint64,bool)": { - "read_only": true, - "call_config": { - "no_op": "CALL" - }, - "structs": { - "output": { - "name": "AccountInfo", - "elements": [ - [ - "payment_address", - "address" - ], - [ - "units", - "uint64" - ], - [ - "unit_value", - "uint64" - ], - [ - "paid_coupons", - "uint64" - ], - [ - "suspended", - "bool" - ] - ] - } - } - }, - "get_time_events()uint64[]": { - "read_only": true, - "call_config": { - "no_op": "CALL" - } - }, - "get_secondary_market_schedule()uint64[]": { - "read_only": true, - "call_config": { - "no_op": "CALL" - } - }, - "get_asset_metadata()(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)": { - "read_only": true, - "call_config": { - "no_op": "CALL" - }, - "structs": { - "output": { - "name": "AssetMetadata", - "elements": [ - [ - "contract_type", - "uint8" - ], - [ - "calendar", - "uint8" - ], - [ - "business_day_convention", - "uint8" - ], - [ - "end_of_month_convention", - "uint8" - ], - [ - "prepayment_effect", - "uint8" - ], - [ - "penalty_type", - "uint8" - ], - [ - "prospectus_hash", - "byte[32]" - ], - [ - "prospectus_url", - "string" - ] - ] - } - } - } - }, - "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCA0IDIwMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJjaXJjdWxhdGluZ191bml0cyIgInN0YXR1cyIgIm1hdHVyaXR5X2RhdGUiICJ1bml0X3ZhbHVlIiAidG90YWxfdW5pdHMiICJ0b3RhbF9jb3Vwb25zIiAweDUyMzMzMDIzIDB4NTIzMjMwMjMgImRlbm9taW5hdGlvbl9hc3NldF9pZCIgInNldHRsZW1lbnRfYXNzZXRfaWQiICJkYXlfY291bnRfY29udmVudGlvbiIgIm1ldGFkYXRhIiAicHJpbmNpcGFsX2Rpc2NvdW50IiAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIiAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIiAiaXNzdWFuY2VfZGF0ZSIgInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIiAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiICJzdXNwZW5kZWQiICJkZWZhdWx0ZWQiICJpbnRlcmVzdF9yYXRlIiAweDc0Njk2ZDY1NDU3NjY1NmU3NDczIDB4NTIzNzMwMjMgMHg1MjM2MzAyMyAweDUyMzUzMDIzIDB4NTIzNDMwMjMgMHgwMDAwMDAwMDAwMDAwMDAwIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MyAweDA2ODEwMSAweDUyMzgzMDIzCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MS00MgogICAgLy8gIyBSb2xlIEJhc2VkIEFjY2VzcyBDb250cm9sCiAgICAvLyBzZWxmLmFycmFuZ2VyID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9BUlJBTkdFUikKICAgIGJ5dGVjIDggLy8gMHg1MjMyMzAyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTktNjAKICAgIC8vICMgQXNzZXQgQ29uZmlndXJhdGlvbgogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBVSW50NjQoKQogICAgYnl0ZWMgOSAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MQogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkID0gVUludDY0KCkKICAgIGJ5dGVjIDEwIC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MgogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gInVuaXRfdmFsdWUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDExIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUtNjYKICAgIC8vICMgTWV0YWRhdGEKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBCeXRlcygpCiAgICBieXRlYyAxMiAvLyAibWV0YWRhdGEiCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OC02OQogICAgLy8gIyBTdXBwbHkKICAgIC8vIHNlbGYudG90YWxfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWMgNSAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwCiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3Mi03MwogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50ID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJwcmluY2lwYWxfZGlzY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1LTc2CiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmludGVyZXN0X3JhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMjEgLy8gImludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgwCiAgICAvLyBzZWxmLnRvdGFsX2NvdXBvbnMgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAidG90YWxfY291cG9ucyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODUKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDE0IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NwogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDE2IC8vICJpc3N1YW5jZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OAogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNyAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDE4IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlY18zIC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5Mi05MwogICAgLy8gIyBTdGF0dXMKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGNmZy5TVEFUVVNfRU1QVFkpCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBzZWxmLnN1c3BlbmRlZCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxOSAvLyAic3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NQogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gImRlZmF1bHRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2FmdGVyX2lmX2Vsc2VAMjIKICAgIHB1c2hieXRlc3MgMHgzZjBlZmM2YyAweDI1ZGJhOTViIDB4ODk0NzQxMzQgMHgxZDZmYzI1NSAweGZlZjc0NTY3IDB4YjhmYzEzOTAgMHgzZDQzZDFmMCAweGViZDk2YjJmIDB4NmM4NWUzZWUgMHhmNjNhY2U4ZCAweGJiY2NhMThhIDB4MWE3YmFiYjQgMHg0MDJkYmE0NyAweGVkMDI3NTlmIDB4ZmFkMjE3M2UgMHgwOGVmZWEzNSAweGU0YTVhYjU0IC8vIG1ldGhvZCAiYXNzZXRfY3JlYXRlKGFkZHJlc3MsKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LGJ5dGVbMzJdLHN0cmluZykpdm9pZCIsIG1ldGhvZCAiYXNzZXRfdXBkYXRlKCh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCxieXRlWzMyXSxzdHJpbmcpKXZvaWQiLCBtZXRob2QgImFzc2V0X2NvbmZpZyh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQxNix1aW50MTZbXSx1aW50NjRbXSwodWludDY0LHVpbnQ2NClbXSl2b2lkIiwgbWV0aG9kICJzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKHVpbnQ2NFtdKSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiYXNzaWduX3JvbGUoYWRkcmVzcyx1aW50OCxieXRlW10pdWludDY0IiwgbWV0aG9kICJyZXZva2Vfcm9sZShhZGRyZXNzLHVpbnQ4KXVpbnQ2NCIsIG1ldGhvZCAib3Blbl9hY2NvdW50KGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImNsb3NlX2FjY291bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAic2V0X2Fzc2V0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInNldF9hY2NvdW50X3N1c3BlbnNpb24oYWRkcmVzcyxib29sKXVpbnQ2NCIsIG1ldGhvZCAic2V0X2RlZmF1bHRfc3RhdHVzKGJvb2wpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2luZm8oKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQxNix1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X2FjY291bnRfaW5mbyhhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wpIiwgbWV0aG9kICJnZXRfdGltZV9ldmVudHMoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSgpdWludDY0W10iLCBtZXRob2QgImdldF9hc3NldF9tZXRhZGF0YSgpKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LGJ5dGVbMzJdLHN0cmluZykiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2Fzc2V0X2NyZWF0ZV9yb3V0ZUA1IG1haW5fYXNzZXRfdXBkYXRlX3JvdXRlQDYgbWFpbl9hc3NldF9jb25maWdfcm91dGVANyBtYWluX3NldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfcm91dGVAOCBtYWluX2Fzc2lnbl9yb2xlX3JvdXRlQDkgbWFpbl9yZXZva2Vfcm9sZV9yb3V0ZUAxMCBtYWluX29wZW5fYWNjb3VudF9yb3V0ZUAxMSBtYWluX2Nsb3NlX2FjY291bnRfcm91dGVAMTIgbWFpbl9wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9yb3V0ZUAxMyBtYWluX3NldF9hc3NldF9zdXNwZW5zaW9uX3JvdXRlQDE0IG1haW5fc2V0X2FjY291bnRfc3VzcGVuc2lvbl9yb3V0ZUAxNSBtYWluX3NldF9kZWZhdWx0X3N0YXR1c19yb3V0ZUAxNiBtYWluX2dldF9hc3NldF9pbmZvX3JvdXRlQDE3IG1haW5fZ2V0X2FjY291bnRfaW5mb19yb3V0ZUAxOCBtYWluX2dldF90aW1lX2V2ZW50c19yb3V0ZUAxOSBtYWluX2dldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlX3JvdXRlQDIwIG1haW5fZ2V0X2Fzc2V0X21ldGFkYXRhX3JvdXRlQDIxCgptYWluX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21ldGFkYXRhX3JvdXRlQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYXNzZXRfbWV0YWRhdGEKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGVfcm91dGVAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF90aW1lX2V2ZW50c19yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X3RpbWVfZXZlbnRzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hY2NvdW50X2luZm9fcm91dGVAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hY2NvdW50X2luZm8KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2luZm9fcm91dGVAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hc3NldF9pbmZvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9kZWZhdWx0X3N0YXR1c19yb3V0ZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBjbGFzcyBCYXNlREFzYShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X2RlZmF1bHRfc3RhdHVzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9hY2NvdW50X3N1c3BlbnNpb25fcm91dGVAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9hY2NvdW50X3N1c3BlbnNpb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0X2Fzc2V0X3N1c3BlbnNpb25fcm91dGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9hc3NldF9zdXNwZW5zaW9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3ByaW1hcnlfZGlzdHJpYnV0aW9uX3JvdXRlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODAxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jbG9zZV9hY2NvdW50X3JvdXRlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBjbG9zZV9hY2NvdW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX29wZW5fYWNjb3VudF9yb3V0ZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBjbGFzcyBCYXNlREFzYShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgb3Blbl9hY2NvdW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3Jldm9rZV9yb2xlX3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2ODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiByZXZva2Vfcm9sZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NpZ25fcm9sZV9yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NpZ25fcm9sZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzZXRfY29uZmlnX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0ODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0ODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NldF9jb25maWcKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzZXRfdXBkYXRlX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMyAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IFVwZGF0ZUFwcGxpY2F0aW9uCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBjbGFzcyBCYXNlREFzYShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBjYWxsc3ViIGFzc2V0X3VwZGF0ZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF9jcmVhdGVfcm91dGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgY2FsbHN1YiBhc3NldF9jcmVhdGUKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NldF9jcmVhdGUoYXJyYW5nZXI6IGJ5dGVzLCBtZXRhZGF0YTogYnl0ZXMpIC0+IHZvaWQ6CmFzc2V0X2NyZWF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2MS00NjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgLy8gZGVmIGFzc2V0X2NyZWF0ZShzZWxmLCBhcnJhbmdlcjogYXJjNC5BZGRyZXNzLCBtZXRhZGF0YTogdHlwLkFzc2V0TWV0YWRhdGEpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3MAogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IGFycmFuZ2VyLm5hdGl2ZQogICAgYnl0ZWMgOCAvLyAweDUyMzIzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzEKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YS5ieXRlcwogICAgYnl0ZWMgMTIgLy8gIm1ldGFkYXRhIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXRfdXBkYXRlKG1ldGFkYXRhOiBieXRlcykgLT4gdm9pZDoKYXNzZXRfdXBkYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDczLTQ3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIGFzc2V0X3VwZGF0ZShzZWxmLCBtZXRhZGF0YTogdHlwLkFzc2V0TWV0YWRhdGEpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3OC00ODEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgZGlzYWJsZSBELUFTQSBhcHBsaWNhdGlvbiB1cGRhdGFiaWxpdHkgb3IgY2hhbmdlIGl0cyBhdXRob3JpemF0aW9ucy4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleSBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ4MgogICAgLy8gc2VsZi5tZXRhZGF0YSA9IG1ldGFkYXRhLmJ5dGVzCiAgICBieXRlYyAxMiAvLyAibWV0YWRhdGEiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExOC0xMTkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYuYXJyYW5nZXIudmFsdWUsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vIDB4NTIzMjMwMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2V0X2NvbmZpZyhkZW5vbWluYXRpb25fYXNzZXRfaWQ6IGJ5dGVzLCBzZXR0bGVtZW50X2Fzc2V0X2lkOiBieXRlcywgcHJpbmNpcGFsOiBieXRlcywgcHJpbmNpcGFsX2Rpc2NvdW50OiBieXRlcywgbWluaW11bV9kZW5vbWluYXRpb246IGJ5dGVzLCBkYXlfY291bnRfY29udmVudGlvbjogYnl0ZXMsIGludGVyZXN0X3JhdGU6IGJ5dGVzLCBjb3Vwb25fcmF0ZXM6IGJ5dGVzLCB0aW1lX2V2ZW50czogYnl0ZXMsIHRpbWVfcGVyaW9kczogYnl0ZXMpIC0+IHZvaWQ6CmFzc2V0X2NvbmZpZzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ4NC00OTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2V0X2NvbmZpZygKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgcHJpbmNpcGFsOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBwcmluY2lwYWxfZGlzY291bnQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIG1pbmltdW1fZGVub21pbmF0aW9uOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBkYXlfY291bnRfY29udmVudGlvbjogYXJjNC5VSW50OCwKICAgIC8vICAgICBpbnRlcmVzdF9yYXRlOiBhcmM0LlVJbnQxNiwKICAgIC8vICAgICBjb3Vwb25fcmF0ZXM6IHR5cC5Db3Vwb25SYXRlcywKICAgIC8vICAgICB0aW1lX2V2ZW50czogdHlwLlRpbWVFdmVudHMsCiAgICAvLyAgICAgdGltZV9wZXJpb2RzOiB0eXAuVGltZVBlcmlvZHMsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAxMCAwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUyNwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTI4CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTVBUWSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzAtNTMxCiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuYXNzZXJ0X2Rlbm9taW5hdGlvbl9hc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xMAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODAKICAgIC8vIGRlbm9taW5hdGlvbl9hc3NldF9pZCAhPSBVSW50NjQoMCkgYW5kIEFzc2V0KGRlbm9taW5hdGlvbl9hc3NldF9pZCkuY3JlYXRvcgogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANAogICAgZnJhbWVfZGlnIDQKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBhc3NldF9jb25maWdfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3OC0xODEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gZGVub21pbmF0aW9uIHdpdGggQVNBCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZCAhPSBVSW50NjQoMCkgYW5kIEFzc2V0KGRlbm9taW5hdGlvbl9hc3NldF9pZCkuY3JlYXRvcgogICAgLy8gKSwgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBkZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGJ5dGVjIDkgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGZyYW1lX2RpZyA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTM0LTUzNQogICAgLy8gIyBTZXQgRGVub21pbmF0aW9uIEFzc2V0CiAgICAvLyBzZWxmLmFzc2VydF9zZXR0bGVtZW50X2Fzc2V0KHNldHRsZW1lbnRfYXNzZXRfaWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC05CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTEKICAgIC8vIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkIGV4aXN0cwogICAgZGlnIDEKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODktMTkyCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyAxMCAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTctMjAzCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDIKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTkKICAgIC8vIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDAKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjAxCiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTctMTk4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIGludGNfMyAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5Ny0yMDMKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NDAKICAgIC8vIHByaW5jaXBhbC5uYXRpdmUgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUgPT0gMAogICAgZnJhbWVfZGlnIC04CiAgICBidG9pCiAgICBmcmFtZV9kaWcgLTYKICAgIGJ0b2kKICAgIGR1cDIKICAgICUKICAgICEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUzOC01NDEKICAgIC8vICMgU2V0IFByaW5jaXBhbCBhbmQgTWluaW11bSBEZW5vbWluYXRpb24KICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJpbmNpcGFsLm5hdGl2ZSAlIG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZSA9PSAwCiAgICAvLyApLCBlcnIuSU5WQUxJRF9NSU5JTVVNX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIE1pbmltdW0gZGVub21pbmF0aW9uIGlzIG5vdCBhIGRpdmlzb3Igb2YgcHJpbmNpcGFsCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NDIKICAgIC8vIHNlbGYudW5pdF92YWx1ZSA9IG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZQogICAgYnl0ZWMgNCAvLyAidW5pdF92YWx1ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gcHJpbmNpcGFsLm5hdGl2ZSAvLyBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUKICAgIC8KICAgIGJ5dGVjIDUgLy8gInRvdGFsX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU0NAogICAgLy8gc2VsZi5wcmluY2lwYWxfZGlzY291bnQgPSBwcmluY2lwYWxfZGlzY291bnQubmF0aXZlCiAgICBmcmFtZV9kaWcgLTcKICAgIGJ0b2kKICAgIGJ5dGVjIDEzIC8vICJwcmluY2lwYWxfZGlzY291bnQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQ2LTU0NwogICAgLy8gIyBTZXQgRGF5LUNvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuYXNzZXJ0X2RheV9jb3VudF9jb252ZW50aW9uKGRheV9jb3VudF9jb252ZW50aW9uLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtNQogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNy0yMTEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGZyYW1lX2RpZyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTAKICAgIC8vIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgcHVzaGludCAyNTUgLy8gMjU1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDctMjExCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICA9PQogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmFzc2V0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDctMjExCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICBhc3NlcnQgLy8gSW52YWxpZCBkYXktY291bnQgY29udmVudGlvbiBJRAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjE1CiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIGJ5dGVjIDExIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGZyYW1lX2RpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTUwLTU1MQogICAgLy8gIyBTZXQgSW50ZXJlc3QgUmF0ZQogICAgLy8gc2VsZi5hc3NlcnRfaW50ZXJlc3RfcmF0ZShpbnRlcmVzdF9yYXRlLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtNAogICAgYnRvaQogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTktMjIwCiAgICAvLyAjIFRoaXMgc3Vicm91dGluZSBtdXN0IGJlIHVzZWQgYWZ0ZXIgdGhlIHByaW5jaXBhbCBkaXNjb3VudCBoYXMgYmVlbiBzZXQKICAgIC8vIGlmIG5vdCBzZWxmLnByaW5jaXBhbF9kaXNjb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIGJueiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjIxCiAgICAvLyBhc3NlcnQgaW50ZXJlc3RfcmF0ZSA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfSU5URVJFU1RfUkFURQogICAgZnJhbWVfZGlnIDIKICAgIGFzc2VydCAvLyBJbnRlcmVzdCByYXRlIGlzIG5vdCBwcm9wZXJseSBkZWZpbmVkCgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gc2VsZi5pbnRlcmVzdF9yYXRlID0gaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgMjEgLy8gImludGVyZXN0X3JhdGUiCiAgICBmcmFtZV9kaWcgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyOQogICAgLy8gYXNzZXJ0IG5vdCBjb3Vwb25fcmF0ZXMubGVuZ3RoLCBlcnIuSU5WQUxJRF9DT1VQT05fUkFURVMKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgICEKICAgIGFzc2VydCAvLyBDb3Vwb24gcmF0ZXMgYXJlIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMzMKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IGNvdXBvbl9yYXRlcy5sZW5ndGgKICAgIGJ5dGVjIDYgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjM0CiAgICAvLyBpZiBzZWxmLnRvdGFsX2NvdXBvbnM6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgYnogYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gc2VsZi5jb3Vwb25fcmF0ZXMudmFsdWUgPSBjb3Vwb25fcmF0ZXMuY29weSgpCiAgICBieXRlYyAyOCAvLyAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMjggLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBmcmFtZV9kaWcgLTMKICAgIGJveF9wdXQKCmFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDMyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQwCiAgICAvLyB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIGludGNfMyAvLyA0CiAgICArCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjM5LTI0MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTCiAgICAvLyApLCBlcnIuSU5WQUxJRF9USU1FX0VWRU5UU19MRU5HVEgKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBsZW5ndGggaXMgaW52YWxpZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTYwCiAgICAvLyBzZWxmLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQodGltZV9ldmVudHMpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY1CiAgICAvLyBzZWxmLnRpbWVfZXZlbnRzLnZhbHVlID0gdGltZV9ldmVudHMuY29weSgpCiAgICBieXRlYyAyMiAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDIyIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY2LTI2OAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY2CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTQgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2Ni0yNjgKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY5LTI3MQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGR1cAogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjkKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICBieXRlYyAxNSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY5LTI3MQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzIKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSA9IHRpbWVfZXZlbnRzW2NmZy5JU1NVQU5DRV9EQVRFX0lEWF0ubmF0aXZlCiAgICBleHRyYWN0IDE2IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBieXRlYyAxNiAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzQtMjc1CiAgICAvLyAjIFNvbWUgRC1BU0EgbWF5IG5vdCBoYXZlIGEgbWF0dXJpdHkgZGF0ZSAoZS5nLiwgcGVycGV0dWFscykKICAgIC8vIGlmIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBpbnRjXzMgLy8gNAogICAgKwogICAgPT0KICAgIGJ6IGFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDM4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzYKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRpbWVfZXZlbnRzW2NmZy5NQVRVUklUWV9EQVRFX0lEWF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnl0ZWNfMyAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0Cgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4MAogICAgLy8gYXNzZXJ0IG5vdCB0aW1lX3BlcmlvZHMubGVuZ3RoLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRFMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICAhCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGFyZSBub3QgcHJvcGVybHkgZGVmaW5lZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTY3CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VAMTc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NldF9jb25maWdfYm9vbF9tZXJnZUAxOAoKYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHRpbWVfZXZlbnRzOiBieXRlcykgLT4gYnl0ZXM6CmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDMtMjQ0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQoc2VsZiwgdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzKSAtPiBOb25lOgogICAgcHJvdG8gMSAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ2CiAgICAvLyB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ3CiAgICAvLyA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDYtMjQ3CiAgICAvLyB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0ubmF0aXZlCiAgICAvLyA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDUtMjQ4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXS5uYXRpdmUKICAgIC8vICAgICA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyApLCBlcnIuSU5WQUxJRF9USU1FCiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ5CiAgICAvLyBmb3IgX3QgaW4gdXJhbmdlKHRpbWVfZXZlbnRzLmxlbmd0aCAtIDEpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzAgLy8gMAoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDkKICAgIC8vIGZvciBfdCBpbiB1cmFuZ2UodGltZV9ldmVudHMubGVuZ3RoIC0gMSk6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDMKICAgIDwKICAgIGJ6IGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDYKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfd2hpbGVfdG9wQDg6CiAgICBwdXNoaW50IDc1IC8vIDc1CiAgICBnbG9iYWwgT3Bjb2RlQnVkZ2V0CiAgICA+CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX3doaWxlQDE0CiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgMjkgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyAyOSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfd2hpbGVfdG9wQDgKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfd2hpbGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTQKICAgIC8vIHRpbWVfaSA9IHRpbWVfZXZlbnRzW190XS5uYXRpdmUKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjU1CiAgICAvLyB0aW1lX2YgPSB0aW1lX2V2ZW50c1tfdCArIDFdLm5hdGl2ZQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gYXNzZXJ0IHRpbWVfZiA+IHRpbWVfaSwgZXJyLklOVkFMSURfU09SVElORwogICAgPAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjU3CiAgICAvLyBpZiBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uICE9IFVJbnQ2NChjc3QuRENDX0NPTlQpOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIHB1c2hpbnQgMjU1IC8vIDI1NQogICAgIT0KICAgIGJ6IGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfZm9yX2hlYWRlckAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTgtMjU5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGltZSBwZXJpb2RzIGV4cHJlc3NlZCBpbiBkYXlzIGZvciByZWd1bGFyIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0ICh0aW1lX2YgLSB0aW1lX2kpICUgVUludDY0KAogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTgtMjYxCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGltZSBwZXJpb2RzIGV4cHJlc3NlZCBpbiBkYXlzIGZvciByZWd1bGFyIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0ICh0aW1lX2YgLSB0aW1lX2kpICUgVUludDY0KAogICAgLy8gICAgIGNzdC5EQVlfMl9TRUMKICAgIC8vICkgPT0gMCwgZXJyLklOVkFMSURfVElNRV9QRVJJT0QKICAgIHB1c2hpbnQgODY0MDAgLy8gODY0MDAKICAgICUKICAgICEKICAgIGFzc2VydCAvLyBUaW1lIHBlcmlvZHMgaW4gQWN0dWFsL0FjdHVhbCBkYXkgY291bnQgY29udmVudGlvbiBtdXN0IGJlIG11bHRpcGxlcyBvZiBhIGRheSAoaW4gc2Vjb25kcykKICAgIGIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDEKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDY6CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cyhzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzOiBieXRlcykgLT4gYnl0ZXM6CnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NjktNTcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKAogICAgLy8gICAgIHNlbGYsIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzCiAgICAvLyApIC0+IHR5cC5TZWNvbmRhcnlNYXJrZXRTY2hlZHVsZToKICAgIHByb3RvIDEgMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5MAogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjIDQgLy8gMjAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTkxCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTkyCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5NAogICAgLy8gYXNzZXJ0IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID49IDEsIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTUKICAgIC8vIGlmIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID4gMToKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTYKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMQogICAgZnJhbWVfYnVyeSAxCgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTgKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTktNjAxCiAgICAvLyA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTgtNjAxCiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGRpZyAxCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk3LTYwMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vICAgICA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyAgICAgXS5uYXRpdmUKICAgIC8vICksIGVyci5JTlZBTElEX1NFQ09OREFSWV9PUEVOSU5HX0RBVEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNlY29uZGFyeSBtYXJrZXQgb3BlbmluZyBkYXRlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDMKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTcgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjAzLTYwNQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDYKICAgIC8vIGlmIHNlbGYubWF0dXJpdHlfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICBieiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjA4CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTAKICAgIC8vIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDktNjExCiAgICAvLyA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDgtNjExCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIC8vID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGRpZyAxCiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjA3LTYxMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIC8vICAgICA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyAgICAgXS5uYXRpdmUKICAgIC8vICksIGVyci5JTlZBTElEX1NFQ09OREFSWV9DTE9TVVJFX0RBVEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNlY29uZGFyeSBtYXJrZXQgY2xvc3VyZSBkYXRlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTMKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTggLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjEzLTYxNQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxOAogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxNy02MTkKICAgIC8vIHNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MjEKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MjAtNjIyCiAgICAvLyBzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyApLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjE2LTYyMwogICAgLy8gcmV0dXJuIHR5cC5TZWNvbmRhcnlNYXJrZXRTY2hlZHVsZSgKICAgIC8vICAgICBzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gICAgICksCiAgICAvLyAgICAgc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkgLT4gdm9pZDoKYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTAtMTExCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExMgogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmRlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJkZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzaWduX3JvbGUocm9sZV9hZGRyZXNzOiBieXRlcywgcm9sZTogYnl0ZXMsIGNvbmZpZzogYnl0ZXMpIC0+IGJ5dGVzOgphc3NpZ25fcm9sZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyNS02MjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2lnbl9yb2xlKAogICAgLy8gICAgIHNlbGYsIHJvbGVfYWRkcmVzczogYXJjNC5BZGRyZXNzLCByb2xlOiBhcmM0LlVJbnQ4LCBjb25maWc6IGFyYzQuRHluYW1pY0J5dGVzCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDYKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0NwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ5CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgcHVzaGludCAyMCAvLyAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgtNjU1CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUxCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MCAvLyA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MgogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MCAvLyA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MwogICAgLy8gVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwIC8vIDcwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgtNjU1CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU0CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0OC02NTUKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBhc3NpZ25fcm9sZV9ib29sX2ZhbHNlQDcKCmFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18xIC8vIDEKCmFzc2lnbl9yb2xlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0OC02NTUKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU3CiAgICAvLyBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICBwdXNoaW50cyAyMCA0MCA1MCA2MCA3MCA4MCAvLyAyMCwgNDAsIDUwLCA2MCwgNzAsIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTYtNjg1CiAgICAvLyBtYXRjaCByb2xlLm5hdGl2ZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MubmF0aXZlCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICAgICAgICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoKQogICAgZnJhbWVfZGlnIDAKICAgIG1hdGNoIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzBAOSBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8xQDEwIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzJAMTEgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzVAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4NQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfNUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3OQogICAgLy8gcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgYnl0ZWMgMzAgLy8gMHg1MjM4MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzgtNjgwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4MgogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjgxLTY4MwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gKQogICAgYm94X3B1dAoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4NgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgc3dhcAogICAgcmV0c3ViCgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njc1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyMzczMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzYKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzNAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNCAvLyAweDUyMzYzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzMKICAgIC8vIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgYm94X3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8yQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzNTMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2OQogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY4LTY3MAogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICBjb25maWcubmF0aXZlCiAgICAvLyApCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzFAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjEKICAgIC8vIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDI2IC8vIDB4NTIzNDMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjYwLTY2MgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjQKICAgIC8vIGNvbmZpZy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2My02NjUKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICkKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMEA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU4CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzLm5hdGl2ZQogICAgYnl0ZWMgOCAvLyAweDUyMzIzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2lnbl9yb2xlX2Jvb2xfbWVyZ2VAOAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnJldm9rZV9yb2xlKHJvbGVfYWRkcmVzczogYnl0ZXMsIHJvbGU6IGJ5dGVzKSAtPiBieXRlczoKcmV2b2tlX3JvbGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2ODgtNjg5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiByZXZva2Vfcm9sZShzZWxmLCByb2xlX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcm9sZTogYXJjNC5VSW50OCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwNgogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA3CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDkKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgcHVzaGludCA0MCAvLyA0MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4LTcxNAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTAKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwIC8vIDUwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDgtNzE0CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiByZXZva2Vfcm9sZV9ib29sX3RydWVANQogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxMQogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MCAvLyA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4LTcxNAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTIKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgcHVzaGludCA3MCAvLyA3MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4LTcxNAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTMKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgcHVzaGludCA4MCAvLyA4MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4LTcxNAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiByZXZva2Vfcm9sZV9ib29sX2ZhbHNlQDYKCnJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1OgogICAgaW50Y18xIC8vIDEKCnJldm9rZV9yb2xlX2Jvb2xfbWVyZ2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxNi03MTcKICAgIC8vICMgQXJyYW5nZXIgcm9sZSBjYW4gbm90IGJlIHJldm9rZWQgKGp1c3Qgcm90YXRlZCkKICAgIC8vIGNhc2UgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50cyA0MCA1MCA2MCA3MCA4MCAvLyA0MCwgNTAsIDYwLCA3MCwgODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxNS03MzMKICAgIC8vIG1hdGNoIHJvbGUubmF0aXZlOgogICAgLy8gICAgICMgQXJyYW5nZXIgcm9sZSBjYW4gbm90IGJlIHJldm9rZWQgKGp1c3Qgcm90YXRlZCkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FDQ09VTlRfTUFOQUdFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9QUklNQVJZX0RFQUxFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfVFJVU1RFRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FVVEhPUklUWSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0lOVEVSRVNUX09SQUNMRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycigpCiAgICBmcmFtZV9kaWcgMAogICAgbWF0Y2ggcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMEA4IHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzFAOSByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8yQDEwIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzNAMTEgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfNEAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzMzCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV80QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzMwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDMwIC8vIDB4NTIzODMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczMQogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0lOVEVSRVNUX09SQUNMRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczNAogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgc3dhcAogICAgcmV0c3ViCgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8zQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzI3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzNzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyOAogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FVVEhPUklUWSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8yQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzI0CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNCAvLyAweDUyMzYzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjUKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9UUlVTVEVFICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzFAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzNTMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyMgogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1BSSU1BUllfREVBTEVSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzBAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxOAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNiAvLyAweDUyMzQzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTkKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BQ0NPVU5UX01BTkFHRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfYm9vbF9mYWxzZUA2OgogICAgaW50Y18wIC8vIDAKICAgIGIgcmV2b2tlX3JvbGVfYm9vbF9tZXJnZUA3CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Eub3Blbl9hY2NvdW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHBheW1lbnRfYWRkcmVzczogYnl0ZXMpIC0+IGJ5dGVzOgpvcGVuX2FjY291bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MzYtNzM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBvcGVuX2FjY291bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHBheW1lbnRfYWRkcmVzczogYXJjNC5BZGRyZXNzCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTYKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjIDQgLy8gMjAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU4CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1OQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjAKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA3IC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2Mi03NjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjQKICAgIC8vIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICBieXRlYyAyNyAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2Mi03NjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjUKICAgIC8vIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDI3IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzYyLTc2OAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2NgogICAgLy8gcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICBieXRlYyAyNyAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2Mi03NjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjcKICAgIC8vIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIHB1c2hieXRlcyAweDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY5CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIyLTEyMwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDI2IC8vIDB4NTIzNDMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2LTEyOQogICAgLy8gY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjcKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyOAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNy0xMjgKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjkKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyOC0xMjkKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI1LTEzMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X3N1c3BlbmRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExNC0xMTUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTE2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInN1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmNsb3NlX2FjY291bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gYnl0ZXM6CmNsb3NlX2FjY291bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NzEtNzc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBjbG9zZV9hY2NvdW50KAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzCiAgICAvLyApIC0+IGFyYzQuVHVwbGVbYXJjNC5VSW50NjQsIGFyYzQuVUludDY0XToKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzg5CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5MAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDcgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzkzCiAgICAvLyBjbG9zZWRfdW5pdHMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3OTQKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BQ0NPVU5UICsgaG9sZGluZ19hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3OTUKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgLT0gY2xvc2VkX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjYKICAgIC8vIGlmIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgPT0gMDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGJueiBjbG9zZV9hY2NvdW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzY3CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0VOREVEKQogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgaW50YyA0IC8vIDIwMAogICAgYXBwX2dsb2JhbF9wdXQKCmNsb3NlX2FjY291bnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzk4CiAgICAvLyAoYXJjNC5VSW50NjQoY2xvc2VkX3VuaXRzKSwgYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApKQogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5Ny03OTkKICAgIC8vIHJldHVybiBhcmM0LlR1cGxlKAogICAgLy8gICAgIChhcmM0LlVJbnQ2NChjbG9zZWRfdW5pdHMpLCBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkpCiAgICAvLyApCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnByaW1hcnlfZGlzdHJpYnV0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiBieXRlcykgLT4gYnl0ZXM6CnByaW1hcnlfZGlzdHJpYnV0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODAxLTgwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcHJpbWFyeV9kaXN0cmlidXRpb24oCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHVuaXRzOiBhcmM0LlVJbnQ2NAogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDQKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMCAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODktMjkyCiAgICAvLyBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTAKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkxCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5MC0yOTEKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTAtMjkyCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5MgogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkxLTI5MgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGZyYW1lX2RpZyAyCiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTAtMjkyCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODgtMjkzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyAgICAgYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU0VECiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgY2xvc2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICBieXRlYyAyNSAvLyAweDUyMzUzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzQKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzYtMTM5CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzcKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGVhbGVyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzgKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzctMTM4CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzctMTM5CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kZWFsZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzOC0xMzkKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNy0xMzkKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMgogICAgaW50Y18xIC8vIDEKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzUtMTQwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICAvLyAgICAgYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA3IC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyOQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzAKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMxCiAgICAvLyBhc3NlcnQgdW5pdHMubmF0aXZlID4gMCwgZXJyLlpFUk9fVU5JVFMKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICBhc3NlcnQgLy8gQ2FuIG5vdCBkaXN0cmlidXRlIHplcm8gdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMwogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyArIHVuaXRzLm5hdGl2ZSA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMi04MzQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5jaXJjdWxhdGluZ191bml0cyArIHVuaXRzLm5hdGl2ZSA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICAvLyApLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzYKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKz0gdW5pdHMubmF0aXZlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM3LTgzOQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM3LTgzOQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIC8vICkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDMyCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gYXJjNC5VSW50NjQoc2VsZi51bml0X3ZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgIGl0b2IKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmVwbGFjZTIgNDAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0MQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMgLSBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgLQogICAgaXRvYgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTI6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDEzCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfYXNzZXRfc3VzcGVuc2lvbihzdXNwZW5kZWQ6IGJ5dGVzKSAtPiBieXRlczoKc2V0X2Fzc2V0X3N1c3BlbnNpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDMtODQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfYXNzZXRfc3VzcGVuc2lvbihzZWxmLCBzdXNwZW5kZWQ6IGFyYzQuQm9vbCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg1NwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NTgKICAgIC8vIHNlbGYuc3VzcGVuZGVkID0gVUludDY0KHN1c3BlbmRlZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ5dGVjIDE5IC8vICJzdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODU5CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUyLTE1MwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIGJ5dGVjIDIzIC8vIDB4NTIzNzMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU2LTE1OQogICAgLy8gY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTcKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdXRob3JpdHkgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1OAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1Ny0xNTgKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTctMTU5CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTkKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdXRob3JpdHkgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1OC0xNTkKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTctMTU5CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU1LTE2MAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIC8vICAgICBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X2FjY291bnRfc3VzcGVuc2lvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBzdXNwZW5kZWQ6IGJ5dGVzKSAtPiBieXRlczoKc2V0X2FjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2MS04NjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9hY2NvdW50X3N1c3BlbnNpb24oCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHN1c3BlbmRlZDogYXJjNC5Cb29sCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NzkKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA3IC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4MQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHB1c2hpbnQgNDQ4IC8vIDQ0OAogICAgc3dhcAogICAgc2V0Yml0CiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODIKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnNldF9kZWZhdWx0X3N0YXR1cyhkZWZhdWx0ZWQ6IGJ5dGVzKSAtPiB2b2lkOgpzZXRfZGVmYXVsdF9zdGF0dXM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODQtODg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfZGVmYXVsdF9zdGF0dXMoc2VsZiwgZGVmYXVsdGVkOiBhcmM0LkJvb2wpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIGJ5dGVjIDI0IC8vIDB4NTIzNjMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Ni0xNDkKICAgIC8vIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cnVzdGVlIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDgKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDctMTQ4CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Ny0xNDkKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0OQogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cnVzdGVlIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDgtMTQ5CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Ny0xNDkKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgpzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ1LTE1MAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICAvLyAgICAgYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5NgogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBVSW50NjQoZGVmYXVsdGVkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgYnl0ZWMgMjAgLy8gImRlZmF1bHRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCnNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9tZXJnZUA2CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X2Fzc2V0X2luZm8oKSAtPiBieXRlczoKZ2V0X2Fzc2V0X2luZm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTgtODk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfaW5mbyhzZWxmKSAtPiB0eXAuQXNzZXRJbmZvOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDgKICAgIC8vIHBlcmZvcm1hbmNlID0gVUludDY0KGNzdC5QUkZfUEVSRk9STUFOVCkKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwOQogICAgLy8gaWYgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBzZWxmLm1hdHVyaXR5X2RhdGUgPiAwOgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb3ZlciA0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPgogICAgYnogZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUAzCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgMQogICAgYnogZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTAKICAgIC8vIHBlcmZvcm1hbmNlID0gVUludDY0KGNzdC5QUkZfTUFUVVJFRCkKICAgIGludGNfMyAvLyA0CiAgICBmcmFtZV9idXJ5IDIKCmdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VAMzoKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMS05MTIKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgbm8gZ3JhY2Ugb3IgZGVsaW5xdWVuY3kgcGVyaW9kcwogICAgLy8gaWYgc2VsZi5kZWZhdWx0ZWQ6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImRlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZWZhdWx0ZWQgZXhpc3RzCiAgICBieiBnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMwogICAgLy8gcGVyZm9ybWFuY2UgPSBVSW50NjQoY3N0LlBSRl9ERUZBVUxURUQpCiAgICBwdXNoaW50IDMgLy8gMwogICAgZnJhbWVfYnVyeSAwCgpnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTYKICAgIC8vIGRlbm9taW5hdGlvbl9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNwogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDAKICAgIC8vIHJldHVybiBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE4CiAgICAvLyBvdXRzdGFuZGluZ19wcmluY2lwYWw9YXJjNC5VSW50NjQoc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwoKSksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTkKICAgIC8vIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoc2VsZi51bml0X3ZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjAKICAgIC8vIGRheV9jb3VudF9jb252ZW50aW9uPWFyYzQuVUludDgoc2VsZi5kYXlfY291bnRfY29udmVudGlvbiksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgaXRvYgogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyMQogICAgLy8gcHJpbmNpcGFsX2Rpc2NvdW50PWFyYzQuVUludDE2KHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50KSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjIKICAgIC8vIGludGVyZXN0X3JhdGU9YXJjNC5VSW50MTYoc2VsZi5pbnRlcmVzdF9yYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMSAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyMwogICAgLy8gdG90YWxfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTI0CiAgICAvLyBjaXJjdWxhdGluZ19zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi5jaXJjdWxhdGluZ191bml0cyksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjUtOTI3CiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjkKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjgtOTMwCiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzEKICAgIC8vIGlzc3VhbmNlX2RhdGU9YXJjNC5VSW50NjQoc2VsZi5pc3N1YW5jZV9kYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTMyCiAgICAvLyBtYXR1cml0eV9kYXRlPWFyYzQuVUludDY0KHNlbGYubWF0dXJpdHlfZGF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTMzCiAgICAvLyBzdXNwZW5kZWQ9YXJjNC5Cb29sKGJvb2woc2VsZi5zdXNwZW5kZWQpKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN1c3BlbmRlZCBleGlzdHMKICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNAogICAgLy8gcGVyZm9ybWFuY2U9YXJjNC5VSW50OChwZXJmb3JtYW5jZSksCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNS05MzUKICAgIC8vIHJldHVybiB0eXAuQXNzZXRJbmZvKAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCksCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLAogICAgLy8gICAgIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCgpKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSksCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIC8vICAgICBwcmluY2lwYWxfZGlzY291bnQ9YXJjNC5VSW50MTYoc2VsZi5wcmluY2lwYWxfZGlzY291bnQpLAogICAgLy8gICAgIGludGVyZXN0X3JhdGU9YXJjNC5VSW50MTYoc2VsZi5pbnRlcmVzdF9yYXRlKSwKICAgIC8vICAgICB0b3RhbF9zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi50b3RhbF91bml0cyksCiAgICAvLyAgICAgY2lyY3VsYXRpbmdfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMpLAogICAgLy8gICAgIHByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICApLAogICAgLy8gICAgIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIC8vICAgICApLAogICAgLy8gICAgIGlzc3VhbmNlX2RhdGU9YXJjNC5VSW50NjQoc2VsZi5pc3N1YW5jZV9kYXRlKSwKICAgIC8vICAgICBtYXR1cml0eV9kYXRlPWFyYzQuVUludDY0KHNlbGYubWF0dXJpdHlfZGF0ZSksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbChib29sKHNlbGYuc3VzcGVuZGVkKSksCiAgICAvLyAgICAgcGVyZm9ybWFuY2U9YXJjNC5VSW50OChwZXJmb3JtYW5jZSksCiAgICAvLyApCiAgICB1bmNvdmVyIDE0CiAgICB1bmNvdmVyIDE0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X2FjY291bnRfaW5mbyhob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2FjY291bnRfaW5mbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNy05MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hY2NvdW50X2luZm8oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MpIC0+IHR5cC5BY2NvdW50SW5mbzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA3IC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1MgogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X3RpbWVfZXZlbnRzKCkgLT4gYnl0ZXM6CmdldF90aW1lX2V2ZW50czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1NC05NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF90aW1lX2V2ZW50cyhzZWxmKSAtPiB0eXAuVGltZUV2ZW50czoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTYyCiAgICAvLyB0aW1lX2V2ZW50cyA9IHR5cC5UaW1lRXZlbnRzKCkKICAgIHB1c2hieXRlcyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2MwogICAgLy8gaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCk6CiAgICBieiBnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NjQKICAgIC8vIHRpbWVfZXZlbnRzID0gc2VsZi50aW1lX2V2ZW50cy52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDIyIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9ldmVudHMgZXhpc3RzCgpnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTY1CiAgICAvLyByZXR1cm4gdGltZV9ldmVudHMKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSgpIC0+IGJ5dGVzOgpnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2Ny05NjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlKHNlbGYpIC0+IHR5cC5UaW1lRXZlbnRzOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NzYKICAgIC8vIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk3NwogICAgLy8gYXJjNC5VSW50NjQoc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTc1LTk3OAogICAgLy8gcmV0dXJuIHR5cC5UaW1lRXZlbnRzKAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUpLAogICAgLy8gKQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hc3NldF9tZXRhZGF0YSgpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbWV0YWRhdGE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5ODAtOTgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbWV0YWRhdGEoc2VsZikgLT4gdHlwLkFzc2V0TWV0YWRhdGE6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk4OQogICAgLy8gcmV0dXJuIHR5cC5Bc3NldE1ldGFkYXRhLmZyb21fYnl0ZXMoc2VsZi5tZXRhZGF0YSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAibWV0YWRhdGEiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWV0YWRhdGEgZXhpc3RzCiAgICByZXRzdWIK", - "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" - }, - "state": { - "global": { - "num_byte_slices": 2, - "num_uints": 18 - }, - "local": { - "num_byte_slices": 0, - "num_uints": 0 - } - }, - "schema": { - "global": { - "declared": { - "arranger": { - "type": "bytes", - "key": "R20#" - }, - "circulating_units": { - "type": "uint64", - "key": "circulating_units" - }, - "day_count_convention": { - "type": "uint64", - "key": "day_count_convention" - }, - "defaulted": { - "type": "uint64", - "key": "defaulted" - }, - "denomination_asset_id": { - "type": "uint64", - "key": "denomination_asset_id" - }, - "interest_rate": { - "type": "uint64", - "key": "interest_rate" - }, - "issuance_date": { - "type": "uint64", - "key": "issuance_date" - }, - "maturity_date": { - "type": "uint64", - "key": "maturity_date" - }, - "metadata": { - "type": "bytes", - "key": "metadata" - }, - "primary_distribution_closure_date": { - "type": "uint64", - "key": "primary_distribution_closure_date" - }, - "primary_distribution_opening_date": { - "type": "uint64", - "key": "primary_distribution_opening_date" - }, - "principal_discount": { - "type": "uint64", - "key": "principal_discount" - }, - "secondary_market_closure_date": { - "type": "uint64", - "key": "secondary_market_closure_date" - }, - "secondary_market_opening_date": { - "type": "uint64", - "key": "secondary_market_opening_date" - }, - "settlement_asset_id": { - "type": "uint64", - "key": "settlement_asset_id" - }, - "status": { - "type": "uint64", - "key": "status" - }, - "suspended": { - "type": "uint64", - "key": "suspended" - }, - "total_coupons": { - "type": "uint64", - "key": "total_coupons" - }, - "total_units": { - "type": "uint64", - "key": "total_units" - }, - "unit_value": { - "type": "uint64", - "key": "unit_value" - } - }, - "reserved": {} - }, - "local": { - "declared": {}, - "reserved": {} - } - }, - "contract": { - "name": "BaseDAsa", - "desc": "\n Base D-ASA Class implementing common interfaces and state schema:\n\n - Asset creation and configuration\n - Role-based access control\n - Account management (creation, suspension, close-out)\n - Time schedule with no coupons and maturity date\n - Primary distribution\n - Getters (asset info, account info, time events)\n ", - "methods": [ - { - "name": "asset_create", - "args": [ - { - "type": "address", - "name": "arranger", - "desc": "D-ASA Arranger Address" - }, - { - "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - "name": "metadata", - "desc": "D-ASA metadata" - } - ], - "readonly": false, - "returns": { - "type": "void" - }, - "desc": "Create a new D-ASA" - }, - { - "name": "asset_update", - "args": [ - { - "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - "name": "metadata" - } - ], - "readonly": false, - "returns": { - "type": "void" - }, - "desc": "Update D-ASA application." - }, - { - "name": "asset_config", - "args": [ - { - "type": "uint64", - "name": "denomination_asset_id", - "desc": "Denomination asset identifier" - }, - { - "type": "uint64", - "name": "settlement_asset_id", - "desc": "Settlement asset identifier" - }, - { - "type": "uint64", - "name": "principal", - "desc": "Principal, expressed in denomination asset" - }, - { - "type": "uint64", - "name": "principal_discount", - "desc": "Principal discount in bps" - }, - { - "type": "uint64", - "name": "minimum_denomination", - "desc": "Minimum denomination, expressed in denomination asset" - }, - { - "type": "uint8", - "name": "day_count_convention", - "desc": "Day-count convention for interests calculation" - }, - { - "type": "uint16", - "name": "interest_rate", - "desc": "Interest rate in bps" - }, - { - "type": "uint16[]", - "name": "coupon_rates", - "desc": "Coupon interest rates in bps" - }, - { - "type": "uint64[]", - "name": "time_events", - "desc": "Time events (strictly ascending order)" - }, - { - "type": "(uint64,uint64)[]", - "name": "time_periods", - "desc": "Time periods of recurring time events" - } - ], - "readonly": false, - "returns": { - "type": "void" - }, - "desc": "Configure the Debt Algorand Standard Application" - }, - { - "name": "set_secondary_time_events", - "args": [ - { - "type": "uint64[]", - "name": "secondary_market_time_events", - "desc": "Secondary market time events (strictly ascending order)" - } - ], - "readonly": false, - "returns": { - "type": "(uint64,uint64)", - "desc": "Secondary Market Opening Date, Secondary Market Closure Date" - }, - "desc": "Set secondary market time schedule" - }, - { - "name": "assign_role", - "args": [ - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - }, - { - "type": "uint8", - "name": "role", - "desc": "Role identifier" - }, - { - "type": "byte[]", - "name": "config", - "desc": "Role configuration (Optional)" - } - ], - "readonly": false, - "returns": { - "type": "uint64", - "desc": "Timestamp of the role assignment" - }, - "desc": "Assign a role to an address" - }, - { - "name": "revoke_role", - "args": [ - { - "type": "address", - "name": "role_address", - "desc": "Account Role Address" - }, - { - "type": "uint8", - "name": "role", - "desc": "Role identifier" - } - ], - "readonly": false, - "returns": { - "type": "uint64", - "desc": "Timestamp of the role revocation" - }, - "desc": "Revoke a role from an address" - }, - { - "name": "open_account", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "address", - "name": "payment_address", - "desc": "Account Payment Address" - } - ], - "readonly": false, - "returns": { - "type": "uint64", - "desc": "Timestamp of the account opening" - }, - "desc": "Open D-ASA account" - }, - { - "name": "close_account", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - } - ], - "readonly": false, - "returns": { - "type": "(uint64,uint64)", - "desc": "Closed units, Timestamp of the account closing" - }, - "desc": "Close D-ASA account" - }, - { - "name": "primary_distribution", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "uint64", - "name": "units", - "desc": "Amount of D-ASA units to distribute" - } - ], - "readonly": false, - "returns": { - "type": "uint64", - "desc": "Remaining D-ASA units to be distributed" - }, - "desc": "Distribute D-ASA units to accounts according the primary market" - }, - { - "name": "set_asset_suspension", - "args": [ - { - "type": "bool", - "name": "suspended", - "desc": "Suspension status" - } - ], - "readonly": false, - "returns": { - "type": "uint64", - "desc": "Timestamp of the set asset suspension status" - }, - "desc": "Set asset suspension status" - }, - { - "name": "set_account_suspension", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - }, - { - "type": "bool", - "name": "suspended", - "desc": "Suspension status" - } - ], - "readonly": false, - "returns": { - "type": "uint64", - "desc": "Timestamp of the set account suspension status" - }, - "desc": "Set account suspension status" - }, - { - "name": "set_default_status", - "args": [ - { - "type": "bool", - "name": "defaulted", - "desc": "Default status" - } - ], - "readonly": false, - "returns": { - "type": "void" - }, - "desc": "Set D-ASA default status" - }, - { - "name": "get_asset_info", - "args": [], - "readonly": true, - "returns": { - "type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", - "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Performance" - }, - "desc": "Get D-ASA info" - }, - { - "name": "get_account_info", - "args": [ - { - "type": "address", - "name": "holding_address", - "desc": "Account Holding Address" - } - ], - "readonly": true, - "returns": { - "type": "(address,uint64,uint64,uint64,bool)", - "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended" - }, - "desc": "Get account info" - }, - { - "name": "get_time_events", - "args": [], - "readonly": true, - "returns": { - "type": "uint64[]", - "desc": "Time events" - }, - "desc": "Get D-ASA time events" - }, - { - "name": "get_secondary_market_schedule", - "args": [], - "readonly": true, - "returns": { - "type": "uint64[]", - "desc": "Secondary market schedule" - }, - "desc": "Get secondary market schedule" - }, - { - "name": "get_asset_metadata", - "args": [], - "readonly": true, - "returns": { - "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", - "desc": "Contract type, Calendar, Business day convention, End of month convention, Early repayment effect, Early repayment penalty type, Prospectus hash, Prospectus URL" - }, - "desc": "Get D-ASA metadata" - } - ], - "networks": {} - }, - "bare_call_config": {} -} \ No newline at end of file diff --git a/smart_contracts/base_d_asa/BaseDAsa.clear.puya.map b/smart_contracts/base_d_asa/BaseDAsa.clear.puya.map deleted file mode 100644 index 7e7f2c0..0000000 --- a/smart_contracts/base_d_asa/BaseDAsa.clear.puya.map +++ /dev/null @@ -1,25 +0,0 @@ -{ - "version": 3, - "sources": [], - "mappings": ";;;", - "op_pc_offset": 0, - "pc_events": { - "1": { - "subroutine": "algopy.arc4.ARC4Contract.clear_state_program", - "params": {}, - "block": "main", - "stack_in": [], - "op": "pushint 1 // 1", - "defined_out": [ - "1" - ], - "stack_out": [ - "1" - ] - }, - "3": { - "op": "return", - "stack_out": [] - } - } -} \ No newline at end of file diff --git a/smart_contracts/base_d_asa/BaseDAsa.clear.teal b/smart_contracts/base_d_asa/BaseDAsa.clear.teal deleted file mode 100644 index a433105..0000000 --- a/smart_contracts/base_d_asa/BaseDAsa.clear.teal +++ /dev/null @@ -1,7 +0,0 @@ -#pragma version 10 -#pragma typetrack false - -// algopy.arc4.ARC4Contract.clear_state_program() -> uint64: -main: - pushint 1 // 1 - return From 156f0252d07118b8d8eed772c2bfa86233a4e172 Mon Sep 17 00:00:00 2001 From: Altynbek Orumbayev Date: Fri, 31 Jan 2025 17:24:26 +0100 Subject: [PATCH 3/3] chore: adding arc56; addressing pr comments --- README.md | 8 +- poetry.lock | 12 +- pyproject.toml | 32 +- smart_contracts/__main__.py | 4 +- smart_contracts/_helpers/build.py | 6 +- .../artifacts/base_d_asa/BaseDAsa.arc56.json | 1257 ++++++++++++ .../artifacts/base_d_asa/base_d_asa_client.py | 294 ++- .../FixedCouponBond.arc56.json | 1764 +++++++++++++++++ .../fixed_coupon_bond_client.py | 318 ++- .../perpetual_bond/PerpetualBond.arc56.json | 1756 ++++++++++++++++ .../perpetual_bond/perpetual_bond_client.py | 316 ++- .../ZeroCouponBond.arc56.json | 1591 +++++++++++++++ .../zero_coupon_bond_client.py | 302 ++- tests/base_d_asa/conftest.py | 12 +- tests/base_d_asa/test_asset_config.py | 20 +- tests/base_d_asa/test_asset_update.py | 9 +- tests/base_d_asa/test_open_account.py | 25 +- tests/base_d_asa/test_primary_distribution.py | 12 +- tests/base_d_asa/test_set_asset_suspension.py | 4 +- .../test_set_secondary_time_schedule.py | 12 +- tests/fixed_coupon_bond/test_asset_config.py | 10 +- .../fixed_coupon_bond/test_asset_transfer.py | 16 +- .../test_get_payment_amount.py | 4 +- tests/fixed_coupon_bond/test_pay_coupon.py | 10 +- tests/fixed_coupon_bond/test_pay_principal.py | 10 +- tests/perpetual_bond/test_asset_config.py | 10 +- .../perpetual_bond/test_get_payment_amount.py | 4 +- tests/perpetual_bond/test_pay_coupon.py | 10 +- .../test_update_interest_rate.py | 6 +- tests/zero_coupon_bond/test_asset_config.py | 10 +- tests/zero_coupon_bond/test_asset_transfer.py | 14 +- .../test_get_payment_amount.py | 4 +- tests/zero_coupon_bond/test_pay_principal.py | 8 +- 33 files changed, 7454 insertions(+), 416 deletions(-) create mode 100644 smart_contracts/artifacts/base_d_asa/BaseDAsa.arc56.json create mode 100644 smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.arc56.json create mode 100644 smart_contracts/artifacts/perpetual_bond/PerpetualBond.arc56.json create mode 100644 smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.arc56.json diff --git a/README.md b/README.md index d6c9c07..356d46f 100644 --- a/README.md +++ b/README.md @@ -7,10 +7,10 @@ Documentation: https://cusma.github.io/d-asa/ D-ASA examples deployed on TestNet: | Type | App ID | App Spec | -|-------------------|--------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------| -| Zero Coupon Bond] | [733151482](https://lora.algokit.io/testnet/application/733151482) | [ARC-32](https://github.com/cusma/d-asa/blob/main/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.arc32.json) | -| Fixed Coupon Bond | [733151497](https://lora.algokit.io/testnet/application/733151497) | [ARC-32](https://github.com/cusma/d-asa/blob/main/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.arc32.json) | -| Perpetual Bond | [733151498](https://lora.algokit.io/testnet/application/733151498) | [ARC-32](https://github.com/cusma/d-asa/blob/main/smart_contracts/artifacts/perpetual_bond/PerpetualBond.arc32.json) | +| ----------------- | ------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------- | +| Zero Coupon Bond] | [733151482](https://lora.algokit.io/testnet/application/733151482) | [ARC-56](https://github.com/cusma/d-asa/blob/main/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.arc56.json) | +| Fixed Coupon Bond | [733151497](https://lora.algokit.io/testnet/application/733151497) | [ARC-56](https://github.com/cusma/d-asa/blob/main/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.arc56.json) | +| Perpetual Bond | [733151498](https://lora.algokit.io/testnet/application/733151498) | [ARC-56](https://github.com/cusma/d-asa/blob/main/smart_contracts/artifacts/perpetual_bond/PerpetualBond.arc56.json) | 1. Download the App Spec JSON file; 1. Navigate to the [Lora App Lab](https://lora.algokit.io/testnet/app-lab); diff --git a/poetry.lock b/poetry.lock index f2fa2ea..4d38057 100644 --- a/poetry.lock +++ b/poetry.lock @@ -124,25 +124,25 @@ frozenlist = ">=1.1.0" [[package]] name = "algokit-client-generator" -version = "2.0.0b1" +version = "2.0.0b2" description = "Algorand typed client Generator" optional = false python-versions = "<4.0,>=3.10" files = [ - {file = "algokit_client_generator-2.0.0b1-py3-none-any.whl", hash = "sha256:7ca00c42e92fda3523ac9f7667a75eace3a738323b0ec1c0c52775e08dcd5949"}, + {file = "algokit_client_generator-2.0.0b2-py3-none-any.whl", hash = "sha256:f5305ba53a5ee61581a0efa6297ab5512d51e7ce1f188e38c43e233be4c5b7e2"}, ] [package.dependencies] -algokit-utils = ">=3.0.0b2,<4.0.0" +algokit-utils = ">=3.0.0b3,<4.0.0" [[package]] name = "algokit-utils" -version = "3.0.0b2" +version = "3.0.0b3" description = "Utilities for Algorand development for use by AlgoKit" optional = false python-versions = "<4.0,>=3.10" files = [ - {file = "algokit_utils-3.0.0b2-py3-none-any.whl", hash = "sha256:661a0225393b2d868b76b1c5d71ab256187b39334ef90a692217b0c8bc88aaf3"}, + {file = "algokit_utils-3.0.0b3-py3-none-any.whl", hash = "sha256:10b1bf26f2a81747ae4990b328c394070c2725778bbf0997661adfdf91ab60be"}, ] [package.dependencies] @@ -2170,4 +2170,4 @@ propcache = ">=0.2.0" [metadata] lock-version = "2.0" python-versions = "^3.12" -content-hash = "0a6f81ccd95abdd7fccf42d536d0ef0fb1038bfb4499be4e5e10b0f54a8506dd" +content-hash = "2a1e9c7f913dae4b11ccedbbd3eacecd6926d2ae65583c8a513aa8be2e28c725" diff --git a/pyproject.toml b/pyproject.toml index 95c9fe0..7e39938 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,18 +9,25 @@ maintainers = ["cusma "] readme = ["README.md", "docs/SUMMARY.md"] documentation = "https://cusma.github.io/d-asa/" repository = "https://github.com/cusma/d-asa" -keywords = ["algorand", "blockchain", "debt", "finance", "tokenization", "actus"] +keywords = [ + "algorand", + "blockchain", + "debt", + "finance", + "tokenization", + "actus", +] [tool.poetry.dependencies] python = "^3.12" -algokit-utils = "^3.0.0b2" +algokit-utils = "^3.0.0b3" python-dotenv = "^1.0.0" algorand-python = "^2.5.0" algorand-python-testing = "^0.4.1" [tool.poetry.group.dev.dependencies] -algokit-client-generator = "^2.0.0b1" -black = {extras = ["d"], version = "^24.10.0"} +algokit-client-generator = "^2.0.0b2" +black = { extras = ["d"], version = "^24.10.0" } ruff = "^0.9.2" mypy = "==1.11.2" pytest = "^8.3.4" @@ -36,7 +43,22 @@ build-backend = "poetry.core.masonry.api" [tool.ruff] line-length = 120 -select = ["E", "F", "ANN", "UP", "N", "C4", "B", "A", "YTT", "W", "FBT", "Q", "RUF", "I"] +select = [ + "E", + "F", + "ANN", + "UP", + "N", + "C4", + "B", + "A", + "YTT", + "W", + "FBT", + "Q", + "RUF", + "I", +] ignore = [ "ANN101", # no type for self "ANN102", # no type for cls diff --git a/smart_contracts/__main__.py b/smart_contracts/__main__.py index 9c691ba..cf123a4 100644 --- a/smart_contracts/__main__.py +++ b/smart_contracts/__main__.py @@ -44,12 +44,12 @@ def main(action: str, contract_name: str | None = None) -> None: ( file.name for file in output_dir.iterdir() - if file.is_file() and file.suffixes == [".arc32", ".json"] + if file.is_file() and file.suffixes == [".arc56", ".json"] ), None, ) if app_spec_file_name is None: - raise Exception("Could not deploy app, .arc32.json file not found") + raise Exception("Could not deploy app, .arc56.json file not found") app_spec_path = output_dir / app_spec_file_name if contract.deploy: logger.info(f"Deploying app {contract.name}") diff --git a/smart_contracts/_helpers/build.py b/smart_contracts/_helpers/build.py index 3461154..2635462 100644 --- a/smart_contracts/_helpers/build.py +++ b/smart_contracts/_helpers/build.py @@ -30,7 +30,7 @@ def build(output_dir: Path, contract_path: Path) -> Path: "python", contract_path.absolute(), f"--out-dir={output_dir}", - "--output-arc32", + "--output-arc56", "--output-source-map", ], stdout=subprocess.PIPE, @@ -40,12 +40,12 @@ def build(output_dir: Path, contract_path: Path) -> Path: if build_result.returncode: raise Exception(f"Could not build contract:\n{build_result.stdout}") - app_spec_file_names = [file.name for file in output_dir.glob("*.arc32.json")] + app_spec_file_names = [file.name for file in output_dir.glob("*.arc56.json")] app_spec_file_name = None for app_spec_file_name in app_spec_file_names: if app_spec_file_name is None: logger.warning( - "No '*.arc32.json' file found (likely a logic signature being compiled). Skipping client generation." + "No '*.arc56.json' file found (likely a logic signature being compiled). Skipping client generation." ) continue print(app_spec_file_name) diff --git a/smart_contracts/artifacts/base_d_asa/BaseDAsa.arc56.json b/smart_contracts/artifacts/base_d_asa/BaseDAsa.arc56.json new file mode 100644 index 0000000..95eb511 --- /dev/null +++ b/smart_contracts/artifacts/base_d_asa/BaseDAsa.arc56.json @@ -0,0 +1,1257 @@ +{ + "name": "BaseDAsa", + "structs": { + "AccountInfo": [ + { + "name": "payment_address", + "type": "address" + }, + { + "name": "units", + "type": "uint64" + }, + { + "name": "unit_value", + "type": "uint64" + }, + { + "name": "paid_coupons", + "type": "uint64" + }, + { + "name": "suspended", + "type": "bool" + } + ], + "AssetInfo": [ + { + "name": "denomination_asset_id", + "type": "uint64" + }, + { + "name": "settlement_asset_id", + "type": "uint64" + }, + { + "name": "outstanding_principal", + "type": "uint64" + }, + { + "name": "unit_value", + "type": "uint64" + }, + { + "name": "day_count_convention", + "type": "uint8" + }, + { + "name": "principal_discount", + "type": "uint16" + }, + { + "name": "interest_rate", + "type": "uint16" + }, + { + "name": "total_supply", + "type": "uint64" + }, + { + "name": "circulating_supply", + "type": "uint64" + }, + { + "name": "primary_distribution_opening_date", + "type": "uint64" + }, + { + "name": "primary_distribution_closure_date", + "type": "uint64" + }, + { + "name": "issuance_date", + "type": "uint64" + }, + { + "name": "maturity_date", + "type": "uint64" + }, + { + "name": "suspended", + "type": "bool" + }, + { + "name": "performance", + "type": "uint8" + } + ], + "AssetMetadata": [ + { + "name": "contract_type", + "type": "uint8" + }, + { + "name": "calendar", + "type": "uint8" + }, + { + "name": "business_day_convention", + "type": "uint8" + }, + { + "name": "end_of_month_convention", + "type": "uint8" + }, + { + "name": "prepayment_effect", + "type": "uint8" + }, + { + "name": "penalty_type", + "type": "uint8" + }, + { + "name": "prospectus_hash", + "type": "byte[32]" + }, + { + "name": "prospectus_url", + "type": "string" + } + ], + "RoleConfig": [ + { + "name": "role_validity_start", + "type": "uint64" + }, + { + "name": "role_validity_end", + "type": "uint64" + } + ], + "SecondaryMarketSchedule": [ + { + "name": "secondary_market_opening_date", + "type": "uint64" + }, + { + "name": "secondary_market_closure_date", + "type": "uint64" + } + ] + }, + "methods": [ + { + "name": "asset_create", + "args": [ + { + "type": "address", + "name": "arranger", + "desc": "D-ASA Arranger Address" + }, + { + "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", + "struct": "AssetMetadata", + "name": "metadata", + "desc": "D-ASA metadata" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "readonly": false, + "desc": "Create a new D-ASA", + "events": [], + "recommendations": {} + }, + { + "name": "asset_update", + "args": [ + { + "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", + "struct": "AssetMetadata", + "name": "metadata" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "UpdateApplication" + ] + }, + "readonly": false, + "desc": "Update D-ASA application.", + "events": [], + "recommendations": {} + }, + { + "name": "asset_config", + "args": [ + { + "type": "uint64", + "name": "denomination_asset_id", + "desc": "Denomination asset identifier" + }, + { + "type": "uint64", + "name": "settlement_asset_id", + "desc": "Settlement asset identifier" + }, + { + "type": "uint64", + "name": "principal", + "desc": "Principal, expressed in denomination asset" + }, + { + "type": "uint64", + "name": "principal_discount", + "desc": "Principal discount in bps" + }, + { + "type": "uint64", + "name": "minimum_denomination", + "desc": "Minimum denomination, expressed in denomination asset" + }, + { + "type": "uint8", + "name": "day_count_convention", + "desc": "Day-count convention for interests calculation" + }, + { + "type": "uint16", + "name": "interest_rate", + "desc": "Interest rate in bps" + }, + { + "type": "uint16[]", + "name": "coupon_rates", + "desc": "Coupon interest rates in bps" + }, + { + "type": "uint64[]", + "name": "time_events", + "desc": "Time events (strictly ascending order)" + }, + { + "type": "(uint64,uint64)[]", + "name": "time_periods", + "desc": "Time periods of recurring time events" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Configure the Debt Algorand Standard Application", + "events": [], + "recommendations": {} + }, + { + "name": "set_secondary_time_events", + "args": [ + { + "type": "uint64[]", + "name": "secondary_market_time_events", + "desc": "Secondary market time events (strictly ascending order)" + } + ], + "returns": { + "type": "(uint64,uint64)", + "struct": "SecondaryMarketSchedule", + "desc": "Secondary Market Opening Date, Secondary Market Closure Date" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Set secondary market time schedule", + "events": [], + "recommendations": {} + }, + { + "name": "assign_role", + "args": [ + { + "type": "address", + "name": "role_address", + "desc": "Account Role Address" + }, + { + "type": "uint8", + "name": "role", + "desc": "Role identifier" + }, + { + "type": "byte[]", + "name": "config", + "desc": "Role configuration (Optional)" + } + ], + "returns": { + "type": "uint64", + "desc": "Timestamp of the role assignment" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Assign a role to an address", + "events": [], + "recommendations": {} + }, + { + "name": "revoke_role", + "args": [ + { + "type": "address", + "name": "role_address", + "desc": "Account Role Address" + }, + { + "type": "uint8", + "name": "role", + "desc": "Role identifier" + } + ], + "returns": { + "type": "uint64", + "desc": "Timestamp of the role revocation" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Revoke a role from an address", + "events": [], + "recommendations": {} + }, + { + "name": "open_account", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + }, + { + "type": "address", + "name": "payment_address", + "desc": "Account Payment Address" + } + ], + "returns": { + "type": "uint64", + "desc": "Timestamp of the account opening" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Open D-ASA account", + "events": [], + "recommendations": {} + }, + { + "name": "close_account", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + } + ], + "returns": { + "type": "(uint64,uint64)", + "desc": "Closed units, Timestamp of the account closing" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Close D-ASA account", + "events": [], + "recommendations": {} + }, + { + "name": "primary_distribution", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + }, + { + "type": "uint64", + "name": "units", + "desc": "Amount of D-ASA units to distribute" + } + ], + "returns": { + "type": "uint64", + "desc": "Remaining D-ASA units to be distributed" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Distribute D-ASA units to accounts according the primary market", + "events": [], + "recommendations": {} + }, + { + "name": "set_asset_suspension", + "args": [ + { + "type": "bool", + "name": "suspended", + "desc": "Suspension status" + } + ], + "returns": { + "type": "uint64", + "desc": "Timestamp of the set asset suspension status" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Set asset suspension status", + "events": [], + "recommendations": {} + }, + { + "name": "set_account_suspension", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + }, + { + "type": "bool", + "name": "suspended", + "desc": "Suspension status" + } + ], + "returns": { + "type": "uint64", + "desc": "Timestamp of the set account suspension status" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Set account suspension status", + "events": [], + "recommendations": {} + }, + { + "name": "set_default_status", + "args": [ + { + "type": "bool", + "name": "defaulted", + "desc": "Default status" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Set D-ASA default status", + "events": [], + "recommendations": {} + }, + { + "name": "get_asset_info", + "args": [], + "returns": { + "type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", + "struct": "AssetInfo", + "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Performance" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get D-ASA info", + "events": [], + "recommendations": {} + }, + { + "name": "get_account_info", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + } + ], + "returns": { + "type": "(address,uint64,uint64,uint64,bool)", + "struct": "AccountInfo", + "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get account info", + "events": [], + "recommendations": {} + }, + { + "name": "get_time_events", + "args": [], + "returns": { + "type": "uint64[]", + "desc": "Time events" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get D-ASA time events", + "events": [], + "recommendations": {} + }, + { + "name": "get_secondary_market_schedule", + "args": [], + "returns": { + "type": "uint64[]", + "desc": "Secondary market schedule" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get secondary market schedule", + "events": [], + "recommendations": {} + }, + { + "name": "get_asset_metadata", + "args": [], + "returns": { + "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", + "struct": "AssetMetadata", + "desc": "Contract type, Calendar, Business day convention, End of month convention, Early repayment effect, Early repayment penalty type, Prospectus hash, Prospectus URL" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get D-ASA metadata", + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "desc": "\n Base D-ASA Class implementing common interfaces and state schema:\n\n - Asset creation and configuration\n - Role-based access control\n - Account management (creation, suspension, close-out)\n - Time schedule with no coupons and maturity date\n - Primary distribution\n - Getters (asset info, account info, time events)\n ", + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 18, + "bytes": 2 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "arranger": { + "keyType": "AVMBytes", + "valueType": "AVMBytes", + "key": "UjIwIw==" + }, + "denomination_asset_id": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk" + }, + "settlement_asset_id": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "c2V0dGxlbWVudF9hc3NldF9pZA==" + }, + "unit_value": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "dW5pdF92YWx1ZQ==" + }, + "day_count_convention": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=" + }, + "metadata": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "bWV0YWRhdGE=" + }, + "total_units": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "dG90YWxfdW5pdHM=" + }, + "circulating_units": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "Y2lyY3VsYXRpbmdfdW5pdHM=" + }, + "principal_discount": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cHJpbmNpcGFsX2Rpc2NvdW50" + }, + "interest_rate": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "aW50ZXJlc3RfcmF0ZQ==" + }, + "total_coupons": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "dG90YWxfY291cG9ucw==" + }, + "primary_distribution_opening_date": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRl" + }, + "primary_distribution_closure_date": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRl" + }, + "issuance_date": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "aXNzdWFuY2VfZGF0ZQ==" + }, + "secondary_market_opening_date": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "c2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU=" + }, + "secondary_market_closure_date": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "c2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU=" + }, + "maturity_date": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "bWF0dXJpdHlfZGF0ZQ==" + }, + "status": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "c3RhdHVz" + }, + "suspended": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "c3VzcGVuZGVk" + }, + "defaulted": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "ZGVmYXVsdGVk" + } + }, + "local": {}, + "box": { + "coupon_rates": { + "keyType": "AVMBytes", + "valueType": "uint16[]", + "key": "Y291cG9uUmF0ZXM=" + }, + "time_events": { + "keyType": "AVMBytes", + "valueType": "uint64[]", + "key": "dGltZUV2ZW50cw==" + }, + "time_periods": { + "keyType": "AVMBytes", + "valueType": "(uint64,uint64)[]", + "key": "dGltZVBlcmlvZHM=" + } + } + }, + "maps": { + "global": {}, + "local": {}, + "box": { + "account_manager": { + "keyType": "address", + "valueType": "RoleConfig", + "prefix": "UjQwIw==" + }, + "primary_dealer": { + "keyType": "address", + "valueType": "RoleConfig", + "prefix": "UjUwIw==" + }, + "trustee": { + "keyType": "address", + "valueType": "RoleConfig", + "prefix": "UjYwIw==" + }, + "authority": { + "keyType": "address", + "valueType": "RoleConfig", + "prefix": "UjcwIw==" + }, + "interest_oracle": { + "keyType": "address", + "valueType": "RoleConfig", + "prefix": "UjgwIw==" + }, + "account": { + "keyType": "address", + "valueType": "AccountInfo", + "prefix": "UjMwIw==" + } + } + } + }, + "bareActions": { + "create": [], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 2238 + ], + "errorMessage": "Can not distribute zero units" + }, + { + "pc": [ + 1191 + ], + "errorMessage": "Coupon rates are not properly defined" + }, + { + "pc": [ + 1047 + ], + "errorMessage": "D-ASA already configured" + }, + { + "pc": [ + 1594 + ], + "errorMessage": "Defaulted" + }, + { + "pc": [ + 1067 + ], + "errorMessage": "Denomination asset is not properly set" + }, + { + "pc": [ + 1084 + ], + "errorMessage": "Different settlement asset not supported, must be equal to denomination asset" + }, + { + "pc": [ + 1251, + 1260, + 1268, + 1304, + 1340, + 1408, + 1423, + 1522, + 1558, + 2024, + 2041, + 2090, + 2190, + 2207, + 2267, + 2358, + 2375, + 2444, + 2461 + ], + "errorMessage": "Index access is out of bounds" + }, + { + "pc": [ + 2252 + ], + "errorMessage": "Insufficient remaining D-ASA units" + }, + { + "pc": [ + 1179 + ], + "errorMessage": "Interest rate is not properly defined" + }, + { + "pc": [ + 1983, + 2086, + 2227, + 2406, + 2700 + ], + "errorMessage": "Invalid account holding address" + }, + { + "pc": [ + 1692, + 1714, + 1734, + 1754, + 1774, + 1880, + 1897, + 1912, + 1927, + 1942 + ], + "errorMessage": "Invalid account role address" + }, + { + "pc": [ + 1158 + ], + "errorMessage": "Invalid day-count convention ID" + }, + { + "pc": [ + 1656, + 1848 + ], + "errorMessage": "Invalid role identifier" + }, + { + "pc": [ + 1564 + ], + "errorMessage": "Invalid secondary market closure date" + }, + { + "pc": [ + 1530 + ], + "errorMessage": "Invalid secondary market opening date" + }, + { + "pc": [ + 1121 + ], + "errorMessage": "Minimum denomination is not a divisor of principal" + }, + { + "pc": [ + 1029, + 1477, + 1966, + 2051, + 2217, + 2385, + 2471 + ], + "errorMessage": "Not authorized" + }, + { + "pc": [ + 650, + 666, + 682, + 698, + 717, + 733, + 748, + 770, + 789, + 811, + 830, + 852, + 874, + 899, + 918, + 976 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 961 + ], + "errorMessage": "OnCompletion is not UpdateApplication" + }, + { + "pc": [ + 2171 + ], + "errorMessage": "Primary distribution is closed" + }, + { + "pc": [ + 2066 + ], + "errorMessage": "Suspended operations" + }, + { + "pc": [ + 1225, + 1486 + ], + "errorMessage": "Time events length is invalid" + }, + { + "pc": [ + 1347 + ], + "errorMessage": "Time events must be set in the future" + }, + { + "pc": [ + 1429 + ], + "errorMessage": "Time events must be sorted in strictly ascending order" + }, + { + "pc": [ + 1314 + ], + "errorMessage": "Time periods are not properly defined" + }, + { + "pc": [ + 1453 + ], + "errorMessage": "Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)" + }, + { + "pc": [ + 1059 + ], + "errorMessage": "asset exists" + }, + { + "pc": [ + 980 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 653, + 669, + 685, + 701, + 720, + 736, + 751, + 773, + 792, + 814, + 833, + 855, + 877, + 902, + 921, + 964 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 2089, + 2266, + 2276, + 2293, + 2409, + 2702 + ], + "errorMessage": "check self.account entry exists" + }, + { + "pc": [ + 2023, + 2040 + ], + "errorMessage": "check self.account_manager entry exists" + }, + { + "pc": [ + 1027 + ], + "errorMessage": "check self.arranger exists" + }, + { + "pc": [ + 2357, + 2374 + ], + "errorMessage": "check self.authority entry exists" + }, + { + "pc": [ + 2102, + 2111, + 2242, + 2256, + 2306, + 2549, + 2599 + ], + "errorMessage": "check self.circulating_units exists" + }, + { + "pc": [ + 1434, + 2567 + ], + "errorMessage": "check self.day_count_convention exists" + }, + { + "pc": [ + 1592, + 2526 + ], + "errorMessage": "check self.defaulted exists" + }, + { + "pc": [ + 1080, + 2538 + ], + "errorMessage": "check self.denomination_asset_id exists" + }, + { + "pc": [ + 2585 + ], + "errorMessage": "check self.interest_rate exists" + }, + { + "pc": [ + 1513, + 2617 + ], + "errorMessage": "check self.issuance_date exists" + }, + { + "pc": [ + 1538, + 1545, + 2501, + 2622 + ], + "errorMessage": "check self.maturity_date exists" + }, + { + "pc": [ + 2762 + ], + "errorMessage": "check self.metadata exists" + }, + { + "pc": [ + 2189, + 2206 + ], + "errorMessage": "check self.primary_dealer entry exists" + }, + { + "pc": [ + 2163, + 2611 + ], + "errorMessage": "check self.primary_distribution_closure_date exists" + }, + { + "pc": [ + 2149, + 2605 + ], + "errorMessage": "check self.primary_distribution_opening_date exists" + }, + { + "pc": [ + 1173, + 2576 + ], + "errorMessage": "check self.principal_discount exists" + }, + { + "pc": [ + 1579, + 2745 + ], + "errorMessage": "check self.secondary_market_closure_date exists" + }, + { + "pc": [ + 1573, + 2739 + ], + "errorMessage": "check self.secondary_market_opening_date exists" + }, + { + "pc": [ + 1096, + 2544 + ], + "errorMessage": "check self.settlement_asset_id exists" + }, + { + "pc": [ + 1045, + 1472, + 1961, + 2138, + 2714 + ], + "errorMessage": "check self.status exists" + }, + { + "pc": [ + 2064, + 2628 + ], + "errorMessage": "check self.suspended exists" + }, + { + "pc": [ + 2727 + ], + "errorMessage": "check self.time_events exists" + }, + { + "pc": [ + 1200, + 1221, + 1287 + ], + "errorMessage": "check self.total_coupons exists" + }, + { + "pc": [ + 2250, + 2302, + 2594 + ], + "errorMessage": "check self.total_units exists" + }, + { + "pc": [ + 2443, + 2460 + ], + "errorMessage": "check self.trustee entry exists" + }, + { + "pc": [ + 2288, + 2554, + 2561 + ], + "errorMessage": "check self.unit_value exists" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCA0IDIwMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJjaXJjdWxhdGluZ191bml0cyIgInN0YXR1cyIgIm1hdHVyaXR5X2RhdGUiICJ1bml0X3ZhbHVlIiAidG90YWxfdW5pdHMiICJ0b3RhbF9jb3Vwb25zIiAweDUyMzMzMDIzIDB4NTIzMjMwMjMgImRlbm9taW5hdGlvbl9hc3NldF9pZCIgInNldHRsZW1lbnRfYXNzZXRfaWQiICJkYXlfY291bnRfY29udmVudGlvbiIgIm1ldGFkYXRhIiAicHJpbmNpcGFsX2Rpc2NvdW50IiAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIiAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIiAiaXNzdWFuY2VfZGF0ZSIgInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIiAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiICJzdXNwZW5kZWQiICJkZWZhdWx0ZWQiICJpbnRlcmVzdF9yYXRlIiAweDc0Njk2ZDY1NDU3NjY1NmU3NDczIDB4NTIzNzMwMjMgMHg1MjM2MzAyMyAweDUyMzUzMDIzIDB4NTIzNDMwMjMgMHgwMDAwMDAwMDAwMDAwMDAwIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MyAweDA2ODEwMSAweDUyMzgzMDIzCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MS00MgogICAgLy8gIyBSb2xlIEJhc2VkIEFjY2VzcyBDb250cm9sCiAgICAvLyBzZWxmLmFycmFuZ2VyID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9BUlJBTkdFUikKICAgIGJ5dGVjIDggLy8gMHg1MjMyMzAyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTktNjAKICAgIC8vICMgQXNzZXQgQ29uZmlndXJhdGlvbgogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBVSW50NjQoKQogICAgYnl0ZWMgOSAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MQogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkID0gVUludDY0KCkKICAgIGJ5dGVjIDEwIC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MgogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gInVuaXRfdmFsdWUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDExIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUtNjYKICAgIC8vICMgTWV0YWRhdGEKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBCeXRlcygpCiAgICBieXRlYyAxMiAvLyAibWV0YWRhdGEiCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OC02OQogICAgLy8gIyBTdXBwbHkKICAgIC8vIHNlbGYudG90YWxfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWMgNSAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwCiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3Mi03MwogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50ID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJwcmluY2lwYWxfZGlzY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1LTc2CiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmludGVyZXN0X3JhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMjEgLy8gImludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgwCiAgICAvLyBzZWxmLnRvdGFsX2NvdXBvbnMgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAidG90YWxfY291cG9ucyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODUKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDE0IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NwogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDE2IC8vICJpc3N1YW5jZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OAogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNyAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDE4IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlY18zIC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5Mi05MwogICAgLy8gIyBTdGF0dXMKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGNmZy5TVEFUVVNfRU1QVFkpCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBzZWxmLnN1c3BlbmRlZCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxOSAvLyAic3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NQogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gImRlZmF1bHRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2FmdGVyX2lmX2Vsc2VAMjIKICAgIHB1c2hieXRlc3MgMHgzZjBlZmM2YyAweDI1ZGJhOTViIDB4ODk0NzQxMzQgMHgxZDZmYzI1NSAweGZlZjc0NTY3IDB4YjhmYzEzOTAgMHgzZDQzZDFmMCAweGViZDk2YjJmIDB4NmM4NWUzZWUgMHhmNjNhY2U4ZCAweGJiY2NhMThhIDB4MWE3YmFiYjQgMHg0MDJkYmE0NyAweGVkMDI3NTlmIDB4ZmFkMjE3M2UgMHgwOGVmZWEzNSAweGU0YTVhYjU0IC8vIG1ldGhvZCAiYXNzZXRfY3JlYXRlKGFkZHJlc3MsKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LGJ5dGVbMzJdLHN0cmluZykpdm9pZCIsIG1ldGhvZCAiYXNzZXRfdXBkYXRlKCh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCxieXRlWzMyXSxzdHJpbmcpKXZvaWQiLCBtZXRob2QgImFzc2V0X2NvbmZpZyh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQxNix1aW50MTZbXSx1aW50NjRbXSwodWludDY0LHVpbnQ2NClbXSl2b2lkIiwgbWV0aG9kICJzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKHVpbnQ2NFtdKSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiYXNzaWduX3JvbGUoYWRkcmVzcyx1aW50OCxieXRlW10pdWludDY0IiwgbWV0aG9kICJyZXZva2Vfcm9sZShhZGRyZXNzLHVpbnQ4KXVpbnQ2NCIsIG1ldGhvZCAib3Blbl9hY2NvdW50KGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImNsb3NlX2FjY291bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAic2V0X2Fzc2V0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInNldF9hY2NvdW50X3N1c3BlbnNpb24oYWRkcmVzcyxib29sKXVpbnQ2NCIsIG1ldGhvZCAic2V0X2RlZmF1bHRfc3RhdHVzKGJvb2wpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2luZm8oKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQxNix1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X2FjY291bnRfaW5mbyhhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wpIiwgbWV0aG9kICJnZXRfdGltZV9ldmVudHMoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSgpdWludDY0W10iLCBtZXRob2QgImdldF9hc3NldF9tZXRhZGF0YSgpKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LGJ5dGVbMzJdLHN0cmluZykiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2Fzc2V0X2NyZWF0ZV9yb3V0ZUA1IG1haW5fYXNzZXRfdXBkYXRlX3JvdXRlQDYgbWFpbl9hc3NldF9jb25maWdfcm91dGVANyBtYWluX3NldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfcm91dGVAOCBtYWluX2Fzc2lnbl9yb2xlX3JvdXRlQDkgbWFpbl9yZXZva2Vfcm9sZV9yb3V0ZUAxMCBtYWluX29wZW5fYWNjb3VudF9yb3V0ZUAxMSBtYWluX2Nsb3NlX2FjY291bnRfcm91dGVAMTIgbWFpbl9wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9yb3V0ZUAxMyBtYWluX3NldF9hc3NldF9zdXNwZW5zaW9uX3JvdXRlQDE0IG1haW5fc2V0X2FjY291bnRfc3VzcGVuc2lvbl9yb3V0ZUAxNSBtYWluX3NldF9kZWZhdWx0X3N0YXR1c19yb3V0ZUAxNiBtYWluX2dldF9hc3NldF9pbmZvX3JvdXRlQDE3IG1haW5fZ2V0X2FjY291bnRfaW5mb19yb3V0ZUAxOCBtYWluX2dldF90aW1lX2V2ZW50c19yb3V0ZUAxOSBtYWluX2dldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlX3JvdXRlQDIwIG1haW5fZ2V0X2Fzc2V0X21ldGFkYXRhX3JvdXRlQDIxCgptYWluX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21ldGFkYXRhX3JvdXRlQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYXNzZXRfbWV0YWRhdGEKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGVfcm91dGVAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF90aW1lX2V2ZW50c19yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X3RpbWVfZXZlbnRzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hY2NvdW50X2luZm9fcm91dGVAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hY2NvdW50X2luZm8KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2luZm9fcm91dGVAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hc3NldF9pbmZvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9kZWZhdWx0X3N0YXR1c19yb3V0ZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBjbGFzcyBCYXNlREFzYShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X2RlZmF1bHRfc3RhdHVzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9hY2NvdW50X3N1c3BlbnNpb25fcm91dGVAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9hY2NvdW50X3N1c3BlbnNpb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0X2Fzc2V0X3N1c3BlbnNpb25fcm91dGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9hc3NldF9zdXNwZW5zaW9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3ByaW1hcnlfZGlzdHJpYnV0aW9uX3JvdXRlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODAxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jbG9zZV9hY2NvdW50X3JvdXRlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBjbG9zZV9hY2NvdW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX29wZW5fYWNjb3VudF9yb3V0ZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBjbGFzcyBCYXNlREFzYShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgb3Blbl9hY2NvdW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3Jldm9rZV9yb2xlX3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2ODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiByZXZva2Vfcm9sZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NpZ25fcm9sZV9yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NpZ25fcm9sZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzZXRfY29uZmlnX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0ODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0ODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NldF9jb25maWcKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzZXRfdXBkYXRlX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMyAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IFVwZGF0ZUFwcGxpY2F0aW9uCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBjbGFzcyBCYXNlREFzYShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBjYWxsc3ViIGFzc2V0X3VwZGF0ZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF9jcmVhdGVfcm91dGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgY2FsbHN1YiBhc3NldF9jcmVhdGUKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NldF9jcmVhdGUoYXJyYW5nZXI6IGJ5dGVzLCBtZXRhZGF0YTogYnl0ZXMpIC0+IHZvaWQ6CmFzc2V0X2NyZWF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2MS00NjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgLy8gZGVmIGFzc2V0X2NyZWF0ZShzZWxmLCBhcnJhbmdlcjogYXJjNC5BZGRyZXNzLCBtZXRhZGF0YTogdHlwLkFzc2V0TWV0YWRhdGEpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3MAogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IGFycmFuZ2VyLm5hdGl2ZQogICAgYnl0ZWMgOCAvLyAweDUyMzIzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzEKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YS5ieXRlcwogICAgYnl0ZWMgMTIgLy8gIm1ldGFkYXRhIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXRfdXBkYXRlKG1ldGFkYXRhOiBieXRlcykgLT4gdm9pZDoKYXNzZXRfdXBkYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDczLTQ3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIGFzc2V0X3VwZGF0ZShzZWxmLCBtZXRhZGF0YTogdHlwLkFzc2V0TWV0YWRhdGEpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3OC00ODEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgZGlzYWJsZSBELUFTQSBhcHBsaWNhdGlvbiB1cGRhdGFiaWxpdHkgb3IgY2hhbmdlIGl0cyBhdXRob3JpemF0aW9ucy4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleSBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ4MgogICAgLy8gc2VsZi5tZXRhZGF0YSA9IG1ldGFkYXRhLmJ5dGVzCiAgICBieXRlYyAxMiAvLyAibWV0YWRhdGEiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExOC0xMTkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYuYXJyYW5nZXIudmFsdWUsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vIDB4NTIzMjMwMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2V0X2NvbmZpZyhkZW5vbWluYXRpb25fYXNzZXRfaWQ6IGJ5dGVzLCBzZXR0bGVtZW50X2Fzc2V0X2lkOiBieXRlcywgcHJpbmNpcGFsOiBieXRlcywgcHJpbmNpcGFsX2Rpc2NvdW50OiBieXRlcywgbWluaW11bV9kZW5vbWluYXRpb246IGJ5dGVzLCBkYXlfY291bnRfY29udmVudGlvbjogYnl0ZXMsIGludGVyZXN0X3JhdGU6IGJ5dGVzLCBjb3Vwb25fcmF0ZXM6IGJ5dGVzLCB0aW1lX2V2ZW50czogYnl0ZXMsIHRpbWVfcGVyaW9kczogYnl0ZXMpIC0+IHZvaWQ6CmFzc2V0X2NvbmZpZzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ4NC00OTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2V0X2NvbmZpZygKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgcHJpbmNpcGFsOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBwcmluY2lwYWxfZGlzY291bnQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIG1pbmltdW1fZGVub21pbmF0aW9uOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBkYXlfY291bnRfY29udmVudGlvbjogYXJjNC5VSW50OCwKICAgIC8vICAgICBpbnRlcmVzdF9yYXRlOiBhcmM0LlVJbnQxNiwKICAgIC8vICAgICBjb3Vwb25fcmF0ZXM6IHR5cC5Db3Vwb25SYXRlcywKICAgIC8vICAgICB0aW1lX2V2ZW50czogdHlwLlRpbWVFdmVudHMsCiAgICAvLyAgICAgdGltZV9wZXJpb2RzOiB0eXAuVGltZVBlcmlvZHMsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAxMCAwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUyNwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTI4CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTVBUWSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzAtNTMxCiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuYXNzZXJ0X2Rlbm9taW5hdGlvbl9hc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xMAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODAKICAgIC8vIGRlbm9taW5hdGlvbl9hc3NldF9pZCAhPSBVSW50NjQoMCkgYW5kIEFzc2V0KGRlbm9taW5hdGlvbl9hc3NldF9pZCkuY3JlYXRvcgogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANAogICAgZnJhbWVfZGlnIDQKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBhc3NldF9jb25maWdfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3OC0xODEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gZGVub21pbmF0aW9uIHdpdGggQVNBCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZCAhPSBVSW50NjQoMCkgYW5kIEFzc2V0KGRlbm9taW5hdGlvbl9hc3NldF9pZCkuY3JlYXRvcgogICAgLy8gKSwgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBkZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGJ5dGVjIDkgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGZyYW1lX2RpZyA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTM0LTUzNQogICAgLy8gIyBTZXQgRGVub21pbmF0aW9uIEFzc2V0CiAgICAvLyBzZWxmLmFzc2VydF9zZXR0bGVtZW50X2Fzc2V0KHNldHRsZW1lbnRfYXNzZXRfaWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC05CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTEKICAgIC8vIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkIGV4aXN0cwogICAgZGlnIDEKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODktMTkyCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyAxMCAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTctMjAzCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDIKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTkKICAgIC8vIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDAKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjAxCiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTctMTk4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIGludGNfMyAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5Ny0yMDMKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NDAKICAgIC8vIHByaW5jaXBhbC5uYXRpdmUgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUgPT0gMAogICAgZnJhbWVfZGlnIC04CiAgICBidG9pCiAgICBmcmFtZV9kaWcgLTYKICAgIGJ0b2kKICAgIGR1cDIKICAgICUKICAgICEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUzOC01NDEKICAgIC8vICMgU2V0IFByaW5jaXBhbCBhbmQgTWluaW11bSBEZW5vbWluYXRpb24KICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJpbmNpcGFsLm5hdGl2ZSAlIG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZSA9PSAwCiAgICAvLyApLCBlcnIuSU5WQUxJRF9NSU5JTVVNX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIE1pbmltdW0gZGVub21pbmF0aW9uIGlzIG5vdCBhIGRpdmlzb3Igb2YgcHJpbmNpcGFsCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NDIKICAgIC8vIHNlbGYudW5pdF92YWx1ZSA9IG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZQogICAgYnl0ZWMgNCAvLyAidW5pdF92YWx1ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gcHJpbmNpcGFsLm5hdGl2ZSAvLyBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUKICAgIC8KICAgIGJ5dGVjIDUgLy8gInRvdGFsX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU0NAogICAgLy8gc2VsZi5wcmluY2lwYWxfZGlzY291bnQgPSBwcmluY2lwYWxfZGlzY291bnQubmF0aXZlCiAgICBmcmFtZV9kaWcgLTcKICAgIGJ0b2kKICAgIGJ5dGVjIDEzIC8vICJwcmluY2lwYWxfZGlzY291bnQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQ2LTU0NwogICAgLy8gIyBTZXQgRGF5LUNvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuYXNzZXJ0X2RheV9jb3VudF9jb252ZW50aW9uKGRheV9jb3VudF9jb252ZW50aW9uLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtNQogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNy0yMTEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGZyYW1lX2RpZyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTAKICAgIC8vIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgcHVzaGludCAyNTUgLy8gMjU1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDctMjExCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICA9PQogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmFzc2V0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDctMjExCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICBhc3NlcnQgLy8gSW52YWxpZCBkYXktY291bnQgY29udmVudGlvbiBJRAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjE1CiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIGJ5dGVjIDExIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGZyYW1lX2RpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTUwLTU1MQogICAgLy8gIyBTZXQgSW50ZXJlc3QgUmF0ZQogICAgLy8gc2VsZi5hc3NlcnRfaW50ZXJlc3RfcmF0ZShpbnRlcmVzdF9yYXRlLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtNAogICAgYnRvaQogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTktMjIwCiAgICAvLyAjIFRoaXMgc3Vicm91dGluZSBtdXN0IGJlIHVzZWQgYWZ0ZXIgdGhlIHByaW5jaXBhbCBkaXNjb3VudCBoYXMgYmVlbiBzZXQKICAgIC8vIGlmIG5vdCBzZWxmLnByaW5jaXBhbF9kaXNjb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIGJueiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjIxCiAgICAvLyBhc3NlcnQgaW50ZXJlc3RfcmF0ZSA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfSU5URVJFU1RfUkFURQogICAgZnJhbWVfZGlnIDIKICAgIGFzc2VydCAvLyBJbnRlcmVzdCByYXRlIGlzIG5vdCBwcm9wZXJseSBkZWZpbmVkCgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gc2VsZi5pbnRlcmVzdF9yYXRlID0gaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgMjEgLy8gImludGVyZXN0X3JhdGUiCiAgICBmcmFtZV9kaWcgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyOQogICAgLy8gYXNzZXJ0IG5vdCBjb3Vwb25fcmF0ZXMubGVuZ3RoLCBlcnIuSU5WQUxJRF9DT1VQT05fUkFURVMKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgICEKICAgIGFzc2VydCAvLyBDb3Vwb24gcmF0ZXMgYXJlIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMzMKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IGNvdXBvbl9yYXRlcy5sZW5ndGgKICAgIGJ5dGVjIDYgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjM0CiAgICAvLyBpZiBzZWxmLnRvdGFsX2NvdXBvbnM6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgYnogYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gc2VsZi5jb3Vwb25fcmF0ZXMudmFsdWUgPSBjb3Vwb25fcmF0ZXMuY29weSgpCiAgICBieXRlYyAyOCAvLyAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMjggLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBmcmFtZV9kaWcgLTMKICAgIGJveF9wdXQKCmFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDMyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQwCiAgICAvLyB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIGludGNfMyAvLyA0CiAgICArCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjM5LTI0MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTCiAgICAvLyApLCBlcnIuSU5WQUxJRF9USU1FX0VWRU5UU19MRU5HVEgKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBsZW5ndGggaXMgaW52YWxpZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTYwCiAgICAvLyBzZWxmLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQodGltZV9ldmVudHMpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY1CiAgICAvLyBzZWxmLnRpbWVfZXZlbnRzLnZhbHVlID0gdGltZV9ldmVudHMuY29weSgpCiAgICBieXRlYyAyMiAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDIyIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY2LTI2OAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY2CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTQgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2Ni0yNjgKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY5LTI3MQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGR1cAogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjkKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICBieXRlYyAxNSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY5LTI3MQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzIKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSA9IHRpbWVfZXZlbnRzW2NmZy5JU1NVQU5DRV9EQVRFX0lEWF0ubmF0aXZlCiAgICBleHRyYWN0IDE2IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBieXRlYyAxNiAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzQtMjc1CiAgICAvLyAjIFNvbWUgRC1BU0EgbWF5IG5vdCBoYXZlIGEgbWF0dXJpdHkgZGF0ZSAoZS5nLiwgcGVycGV0dWFscykKICAgIC8vIGlmIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBpbnRjXzMgLy8gNAogICAgKwogICAgPT0KICAgIGJ6IGFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDM4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzYKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRpbWVfZXZlbnRzW2NmZy5NQVRVUklUWV9EQVRFX0lEWF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnl0ZWNfMyAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0Cgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4MAogICAgLy8gYXNzZXJ0IG5vdCB0aW1lX3BlcmlvZHMubGVuZ3RoLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRFMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICAhCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGFyZSBub3QgcHJvcGVybHkgZGVmaW5lZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTY3CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VAMTc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NldF9jb25maWdfYm9vbF9tZXJnZUAxOAoKYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHRpbWVfZXZlbnRzOiBieXRlcykgLT4gYnl0ZXM6CmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDMtMjQ0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQoc2VsZiwgdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzKSAtPiBOb25lOgogICAgcHJvdG8gMSAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ2CiAgICAvLyB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ3CiAgICAvLyA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDYtMjQ3CiAgICAvLyB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0ubmF0aXZlCiAgICAvLyA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDUtMjQ4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXS5uYXRpdmUKICAgIC8vICAgICA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyApLCBlcnIuSU5WQUxJRF9USU1FCiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ5CiAgICAvLyBmb3IgX3QgaW4gdXJhbmdlKHRpbWVfZXZlbnRzLmxlbmd0aCAtIDEpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzAgLy8gMAoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDkKICAgIC8vIGZvciBfdCBpbiB1cmFuZ2UodGltZV9ldmVudHMubGVuZ3RoIC0gMSk6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDMKICAgIDwKICAgIGJ6IGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDYKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfd2hpbGVfdG9wQDg6CiAgICBwdXNoaW50IDc1IC8vIDc1CiAgICBnbG9iYWwgT3Bjb2RlQnVkZ2V0CiAgICA+CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX3doaWxlQDE0CiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgMjkgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyAyOSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfd2hpbGVfdG9wQDgKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfd2hpbGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTQKICAgIC8vIHRpbWVfaSA9IHRpbWVfZXZlbnRzW190XS5uYXRpdmUKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjU1CiAgICAvLyB0aW1lX2YgPSB0aW1lX2V2ZW50c1tfdCArIDFdLm5hdGl2ZQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gYXNzZXJ0IHRpbWVfZiA+IHRpbWVfaSwgZXJyLklOVkFMSURfU09SVElORwogICAgPAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjU3CiAgICAvLyBpZiBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uICE9IFVJbnQ2NChjc3QuRENDX0NPTlQpOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIHB1c2hpbnQgMjU1IC8vIDI1NQogICAgIT0KICAgIGJ6IGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfZm9yX2hlYWRlckAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTgtMjU5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGltZSBwZXJpb2RzIGV4cHJlc3NlZCBpbiBkYXlzIGZvciByZWd1bGFyIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0ICh0aW1lX2YgLSB0aW1lX2kpICUgVUludDY0KAogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTgtMjYxCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGltZSBwZXJpb2RzIGV4cHJlc3NlZCBpbiBkYXlzIGZvciByZWd1bGFyIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0ICh0aW1lX2YgLSB0aW1lX2kpICUgVUludDY0KAogICAgLy8gICAgIGNzdC5EQVlfMl9TRUMKICAgIC8vICkgPT0gMCwgZXJyLklOVkFMSURfVElNRV9QRVJJT0QKICAgIHB1c2hpbnQgODY0MDAgLy8gODY0MDAKICAgICUKICAgICEKICAgIGFzc2VydCAvLyBUaW1lIHBlcmlvZHMgaW4gQWN0dWFsL0FjdHVhbCBkYXkgY291bnQgY29udmVudGlvbiBtdXN0IGJlIG11bHRpcGxlcyBvZiBhIGRheSAoaW4gc2Vjb25kcykKICAgIGIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDEKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDY6CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cyhzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzOiBieXRlcykgLT4gYnl0ZXM6CnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NjktNTcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKAogICAgLy8gICAgIHNlbGYsIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzCiAgICAvLyApIC0+IHR5cC5TZWNvbmRhcnlNYXJrZXRTY2hlZHVsZToKICAgIHByb3RvIDEgMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5MAogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjIDQgLy8gMjAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTkxCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTkyCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5NAogICAgLy8gYXNzZXJ0IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID49IDEsIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTUKICAgIC8vIGlmIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID4gMToKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTYKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMQogICAgZnJhbWVfYnVyeSAxCgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTgKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTktNjAxCiAgICAvLyA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTgtNjAxCiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGRpZyAxCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk3LTYwMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vICAgICA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyAgICAgXS5uYXRpdmUKICAgIC8vICksIGVyci5JTlZBTElEX1NFQ09OREFSWV9PUEVOSU5HX0RBVEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNlY29uZGFyeSBtYXJrZXQgb3BlbmluZyBkYXRlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDMKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTcgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjAzLTYwNQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDYKICAgIC8vIGlmIHNlbGYubWF0dXJpdHlfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICBieiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjA4CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTAKICAgIC8vIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDktNjExCiAgICAvLyA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDgtNjExCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIC8vID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGRpZyAxCiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjA3LTYxMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIC8vICAgICA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyAgICAgXS5uYXRpdmUKICAgIC8vICksIGVyci5JTlZBTElEX1NFQ09OREFSWV9DTE9TVVJFX0RBVEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNlY29uZGFyeSBtYXJrZXQgY2xvc3VyZSBkYXRlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTMKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTggLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjEzLTYxNQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxOAogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxNy02MTkKICAgIC8vIHNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MjEKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MjAtNjIyCiAgICAvLyBzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyApLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjE2LTYyMwogICAgLy8gcmV0dXJuIHR5cC5TZWNvbmRhcnlNYXJrZXRTY2hlZHVsZSgKICAgIC8vICAgICBzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gICAgICksCiAgICAvLyAgICAgc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkgLT4gdm9pZDoKYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTAtMTExCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExMgogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmRlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJkZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzaWduX3JvbGUocm9sZV9hZGRyZXNzOiBieXRlcywgcm9sZTogYnl0ZXMsIGNvbmZpZzogYnl0ZXMpIC0+IGJ5dGVzOgphc3NpZ25fcm9sZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyNS02MjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2lnbl9yb2xlKAogICAgLy8gICAgIHNlbGYsIHJvbGVfYWRkcmVzczogYXJjNC5BZGRyZXNzLCByb2xlOiBhcmM0LlVJbnQ4LCBjb25maWc6IGFyYzQuRHluYW1pY0J5dGVzCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDYKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0NwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ5CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgcHVzaGludCAyMCAvLyAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgtNjU1CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUxCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MCAvLyA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MgogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MCAvLyA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MwogICAgLy8gVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwIC8vIDcwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgtNjU1CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU0CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0OC02NTUKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBhc3NpZ25fcm9sZV9ib29sX2ZhbHNlQDcKCmFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18xIC8vIDEKCmFzc2lnbl9yb2xlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0OC02NTUKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU3CiAgICAvLyBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICBwdXNoaW50cyAyMCA0MCA1MCA2MCA3MCA4MCAvLyAyMCwgNDAsIDUwLCA2MCwgNzAsIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTYtNjg1CiAgICAvLyBtYXRjaCByb2xlLm5hdGl2ZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MubmF0aXZlCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICAgICAgICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoKQogICAgZnJhbWVfZGlnIDAKICAgIG1hdGNoIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzBAOSBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8xQDEwIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzJAMTEgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzVAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4NQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfNUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3OQogICAgLy8gcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgYnl0ZWMgMzAgLy8gMHg1MjM4MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzgtNjgwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4MgogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjgxLTY4MwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gKQogICAgYm94X3B1dAoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4NgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgc3dhcAogICAgcmV0c3ViCgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njc1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyMzczMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzYKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzNAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNCAvLyAweDUyMzYzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzMKICAgIC8vIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgYm94X3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8yQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzNTMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2OQogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY4LTY3MAogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICBjb25maWcubmF0aXZlCiAgICAvLyApCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzFAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjEKICAgIC8vIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDI2IC8vIDB4NTIzNDMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjYwLTY2MgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjQKICAgIC8vIGNvbmZpZy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2My02NjUKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICkKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMEA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU4CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzLm5hdGl2ZQogICAgYnl0ZWMgOCAvLyAweDUyMzIzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2lnbl9yb2xlX2Jvb2xfbWVyZ2VAOAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnJldm9rZV9yb2xlKHJvbGVfYWRkcmVzczogYnl0ZXMsIHJvbGU6IGJ5dGVzKSAtPiBieXRlczoKcmV2b2tlX3JvbGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2ODgtNjg5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiByZXZva2Vfcm9sZShzZWxmLCByb2xlX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcm9sZTogYXJjNC5VSW50OCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwNgogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA3CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDkKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgcHVzaGludCA0MCAvLyA0MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4LTcxNAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTAKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwIC8vIDUwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDgtNzE0CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiByZXZva2Vfcm9sZV9ib29sX3RydWVANQogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxMQogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MCAvLyA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4LTcxNAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTIKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgcHVzaGludCA3MCAvLyA3MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4LTcxNAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTMKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgcHVzaGludCA4MCAvLyA4MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4LTcxNAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiByZXZva2Vfcm9sZV9ib29sX2ZhbHNlQDYKCnJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1OgogICAgaW50Y18xIC8vIDEKCnJldm9rZV9yb2xlX2Jvb2xfbWVyZ2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxNi03MTcKICAgIC8vICMgQXJyYW5nZXIgcm9sZSBjYW4gbm90IGJlIHJldm9rZWQgKGp1c3Qgcm90YXRlZCkKICAgIC8vIGNhc2UgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50cyA0MCA1MCA2MCA3MCA4MCAvLyA0MCwgNTAsIDYwLCA3MCwgODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxNS03MzMKICAgIC8vIG1hdGNoIHJvbGUubmF0aXZlOgogICAgLy8gICAgICMgQXJyYW5nZXIgcm9sZSBjYW4gbm90IGJlIHJldm9rZWQgKGp1c3Qgcm90YXRlZCkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FDQ09VTlRfTUFOQUdFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9QUklNQVJZX0RFQUxFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfVFJVU1RFRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FVVEhPUklUWSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0lOVEVSRVNUX09SQUNMRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycigpCiAgICBmcmFtZV9kaWcgMAogICAgbWF0Y2ggcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMEA4IHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzFAOSByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8yQDEwIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzNAMTEgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfNEAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzMzCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV80QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzMwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDMwIC8vIDB4NTIzODMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczMQogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0lOVEVSRVNUX09SQUNMRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczNAogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgc3dhcAogICAgcmV0c3ViCgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8zQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzI3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzNzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyOAogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FVVEhPUklUWSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8yQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzI0CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNCAvLyAweDUyMzYzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjUKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9UUlVTVEVFICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzFAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzNTMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyMgogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1BSSU1BUllfREVBTEVSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzBAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxOAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNiAvLyAweDUyMzQzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTkKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BQ0NPVU5UX01BTkFHRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfYm9vbF9mYWxzZUA2OgogICAgaW50Y18wIC8vIDAKICAgIGIgcmV2b2tlX3JvbGVfYm9vbF9tZXJnZUA3CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Eub3Blbl9hY2NvdW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHBheW1lbnRfYWRkcmVzczogYnl0ZXMpIC0+IGJ5dGVzOgpvcGVuX2FjY291bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MzYtNzM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBvcGVuX2FjY291bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHBheW1lbnRfYWRkcmVzczogYXJjNC5BZGRyZXNzCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTYKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjIDQgLy8gMjAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU4CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1OQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjAKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA3IC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2Mi03NjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjQKICAgIC8vIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICBieXRlYyAyNyAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2Mi03NjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjUKICAgIC8vIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDI3IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzYyLTc2OAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2NgogICAgLy8gcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICBieXRlYyAyNyAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2Mi03NjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjcKICAgIC8vIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIHB1c2hieXRlcyAweDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY5CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIyLTEyMwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDI2IC8vIDB4NTIzNDMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2LTEyOQogICAgLy8gY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjcKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyOAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNy0xMjgKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjkKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyOC0xMjkKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI1LTEzMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X3N1c3BlbmRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExNC0xMTUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTE2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInN1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmNsb3NlX2FjY291bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gYnl0ZXM6CmNsb3NlX2FjY291bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NzEtNzc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBjbG9zZV9hY2NvdW50KAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzCiAgICAvLyApIC0+IGFyYzQuVHVwbGVbYXJjNC5VSW50NjQsIGFyYzQuVUludDY0XToKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzg5CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5MAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDcgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzkzCiAgICAvLyBjbG9zZWRfdW5pdHMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3OTQKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BQ0NPVU5UICsgaG9sZGluZ19hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3OTUKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgLT0gY2xvc2VkX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjYKICAgIC8vIGlmIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgPT0gMDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGJueiBjbG9zZV9hY2NvdW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzY3CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0VOREVEKQogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgaW50YyA0IC8vIDIwMAogICAgYXBwX2dsb2JhbF9wdXQKCmNsb3NlX2FjY291bnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzk4CiAgICAvLyAoYXJjNC5VSW50NjQoY2xvc2VkX3VuaXRzKSwgYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApKQogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5Ny03OTkKICAgIC8vIHJldHVybiBhcmM0LlR1cGxlKAogICAgLy8gICAgIChhcmM0LlVJbnQ2NChjbG9zZWRfdW5pdHMpLCBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkpCiAgICAvLyApCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnByaW1hcnlfZGlzdHJpYnV0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiBieXRlcykgLT4gYnl0ZXM6CnByaW1hcnlfZGlzdHJpYnV0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODAxLTgwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcHJpbWFyeV9kaXN0cmlidXRpb24oCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHVuaXRzOiBhcmM0LlVJbnQ2NAogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDQKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMCAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODktMjkyCiAgICAvLyBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTAKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkxCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5MC0yOTEKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTAtMjkyCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5MgogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkxLTI5MgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGZyYW1lX2RpZyAyCiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTAtMjkyCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODgtMjkzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyAgICAgYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU0VECiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgY2xvc2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICBieXRlYyAyNSAvLyAweDUyMzUzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzQKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzYtMTM5CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzcKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGVhbGVyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzgKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzctMTM4CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzctMTM5CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kZWFsZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzOC0xMzkKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNy0xMzkKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMgogICAgaW50Y18xIC8vIDEKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzUtMTQwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICAvLyAgICAgYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA3IC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyOQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzAKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMxCiAgICAvLyBhc3NlcnQgdW5pdHMubmF0aXZlID4gMCwgZXJyLlpFUk9fVU5JVFMKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICBhc3NlcnQgLy8gQ2FuIG5vdCBkaXN0cmlidXRlIHplcm8gdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMwogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyArIHVuaXRzLm5hdGl2ZSA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMi04MzQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5jaXJjdWxhdGluZ191bml0cyArIHVuaXRzLm5hdGl2ZSA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICAvLyApLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzYKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKz0gdW5pdHMubmF0aXZlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM3LTgzOQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM3LTgzOQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIC8vICkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDMyCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gYXJjNC5VSW50NjQoc2VsZi51bml0X3ZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgIGl0b2IKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmVwbGFjZTIgNDAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0MQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMgLSBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgLQogICAgaXRvYgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTI6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDEzCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfYXNzZXRfc3VzcGVuc2lvbihzdXNwZW5kZWQ6IGJ5dGVzKSAtPiBieXRlczoKc2V0X2Fzc2V0X3N1c3BlbnNpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDMtODQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfYXNzZXRfc3VzcGVuc2lvbihzZWxmLCBzdXNwZW5kZWQ6IGFyYzQuQm9vbCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg1NwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NTgKICAgIC8vIHNlbGYuc3VzcGVuZGVkID0gVUludDY0KHN1c3BlbmRlZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ5dGVjIDE5IC8vICJzdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODU5CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUyLTE1MwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIGJ5dGVjIDIzIC8vIDB4NTIzNzMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU2LTE1OQogICAgLy8gY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTcKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdXRob3JpdHkgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1OAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1Ny0xNTgKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTctMTU5CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTkKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdXRob3JpdHkgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1OC0xNTkKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTctMTU5CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU1LTE2MAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIC8vICAgICBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X2FjY291bnRfc3VzcGVuc2lvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBzdXNwZW5kZWQ6IGJ5dGVzKSAtPiBieXRlczoKc2V0X2FjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2MS04NjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9hY2NvdW50X3N1c3BlbnNpb24oCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHN1c3BlbmRlZDogYXJjNC5Cb29sCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NzkKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA3IC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4MQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHB1c2hpbnQgNDQ4IC8vIDQ0OAogICAgc3dhcAogICAgc2V0Yml0CiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODIKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnNldF9kZWZhdWx0X3N0YXR1cyhkZWZhdWx0ZWQ6IGJ5dGVzKSAtPiB2b2lkOgpzZXRfZGVmYXVsdF9zdGF0dXM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODQtODg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfZGVmYXVsdF9zdGF0dXMoc2VsZiwgZGVmYXVsdGVkOiBhcmM0LkJvb2wpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIGJ5dGVjIDI0IC8vIDB4NTIzNjMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Ni0xNDkKICAgIC8vIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cnVzdGVlIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDgKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDctMTQ4CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Ny0xNDkKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0OQogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cnVzdGVlIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDgtMTQ5CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Ny0xNDkKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgpzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ1LTE1MAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICAvLyAgICAgYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5NgogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBVSW50NjQoZGVmYXVsdGVkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgYnl0ZWMgMjAgLy8gImRlZmF1bHRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCnNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9tZXJnZUA2CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X2Fzc2V0X2luZm8oKSAtPiBieXRlczoKZ2V0X2Fzc2V0X2luZm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTgtODk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfaW5mbyhzZWxmKSAtPiB0eXAuQXNzZXRJbmZvOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDgKICAgIC8vIHBlcmZvcm1hbmNlID0gVUludDY0KGNzdC5QUkZfUEVSRk9STUFOVCkKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwOQogICAgLy8gaWYgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBzZWxmLm1hdHVyaXR5X2RhdGUgPiAwOgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb3ZlciA0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPgogICAgYnogZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUAzCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgMQogICAgYnogZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTAKICAgIC8vIHBlcmZvcm1hbmNlID0gVUludDY0KGNzdC5QUkZfTUFUVVJFRCkKICAgIGludGNfMyAvLyA0CiAgICBmcmFtZV9idXJ5IDIKCmdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VAMzoKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMS05MTIKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgbm8gZ3JhY2Ugb3IgZGVsaW5xdWVuY3kgcGVyaW9kcwogICAgLy8gaWYgc2VsZi5kZWZhdWx0ZWQ6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImRlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZWZhdWx0ZWQgZXhpc3RzCiAgICBieiBnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMwogICAgLy8gcGVyZm9ybWFuY2UgPSBVSW50NjQoY3N0LlBSRl9ERUZBVUxURUQpCiAgICBwdXNoaW50IDMgLy8gMwogICAgZnJhbWVfYnVyeSAwCgpnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTYKICAgIC8vIGRlbm9taW5hdGlvbl9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNwogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDAKICAgIC8vIHJldHVybiBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE4CiAgICAvLyBvdXRzdGFuZGluZ19wcmluY2lwYWw9YXJjNC5VSW50NjQoc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwoKSksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTkKICAgIC8vIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoc2VsZi51bml0X3ZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjAKICAgIC8vIGRheV9jb3VudF9jb252ZW50aW9uPWFyYzQuVUludDgoc2VsZi5kYXlfY291bnRfY29udmVudGlvbiksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgaXRvYgogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyMQogICAgLy8gcHJpbmNpcGFsX2Rpc2NvdW50PWFyYzQuVUludDE2KHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50KSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjIKICAgIC8vIGludGVyZXN0X3JhdGU9YXJjNC5VSW50MTYoc2VsZi5pbnRlcmVzdF9yYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMSAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyMwogICAgLy8gdG90YWxfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTI0CiAgICAvLyBjaXJjdWxhdGluZ19zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi5jaXJjdWxhdGluZ191bml0cyksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjUtOTI3CiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjkKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjgtOTMwCiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzEKICAgIC8vIGlzc3VhbmNlX2RhdGU9YXJjNC5VSW50NjQoc2VsZi5pc3N1YW5jZV9kYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTMyCiAgICAvLyBtYXR1cml0eV9kYXRlPWFyYzQuVUludDY0KHNlbGYubWF0dXJpdHlfZGF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTMzCiAgICAvLyBzdXNwZW5kZWQ9YXJjNC5Cb29sKGJvb2woc2VsZi5zdXNwZW5kZWQpKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN1c3BlbmRlZCBleGlzdHMKICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNAogICAgLy8gcGVyZm9ybWFuY2U9YXJjNC5VSW50OChwZXJmb3JtYW5jZSksCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNS05MzUKICAgIC8vIHJldHVybiB0eXAuQXNzZXRJbmZvKAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCksCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLAogICAgLy8gICAgIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCgpKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSksCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIC8vICAgICBwcmluY2lwYWxfZGlzY291bnQ9YXJjNC5VSW50MTYoc2VsZi5wcmluY2lwYWxfZGlzY291bnQpLAogICAgLy8gICAgIGludGVyZXN0X3JhdGU9YXJjNC5VSW50MTYoc2VsZi5pbnRlcmVzdF9yYXRlKSwKICAgIC8vICAgICB0b3RhbF9zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi50b3RhbF91bml0cyksCiAgICAvLyAgICAgY2lyY3VsYXRpbmdfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMpLAogICAgLy8gICAgIHByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICApLAogICAgLy8gICAgIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIC8vICAgICApLAogICAgLy8gICAgIGlzc3VhbmNlX2RhdGU9YXJjNC5VSW50NjQoc2VsZi5pc3N1YW5jZV9kYXRlKSwKICAgIC8vICAgICBtYXR1cml0eV9kYXRlPWFyYzQuVUludDY0KHNlbGYubWF0dXJpdHlfZGF0ZSksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbChib29sKHNlbGYuc3VzcGVuZGVkKSksCiAgICAvLyAgICAgcGVyZm9ybWFuY2U9YXJjNC5VSW50OChwZXJmb3JtYW5jZSksCiAgICAvLyApCiAgICB1bmNvdmVyIDE0CiAgICB1bmNvdmVyIDE0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X2FjY291bnRfaW5mbyhob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2FjY291bnRfaW5mbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNy05MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hY2NvdW50X2luZm8oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MpIC0+IHR5cC5BY2NvdW50SW5mbzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA3IC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1MgogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X3RpbWVfZXZlbnRzKCkgLT4gYnl0ZXM6CmdldF90aW1lX2V2ZW50czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1NC05NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF90aW1lX2V2ZW50cyhzZWxmKSAtPiB0eXAuVGltZUV2ZW50czoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTYyCiAgICAvLyB0aW1lX2V2ZW50cyA9IHR5cC5UaW1lRXZlbnRzKCkKICAgIHB1c2hieXRlcyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2MwogICAgLy8gaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCk6CiAgICBieiBnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NjQKICAgIC8vIHRpbWVfZXZlbnRzID0gc2VsZi50aW1lX2V2ZW50cy52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDIyIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9ldmVudHMgZXhpc3RzCgpnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTY1CiAgICAvLyByZXR1cm4gdGltZV9ldmVudHMKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSgpIC0+IGJ5dGVzOgpnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2Ny05NjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlKHNlbGYpIC0+IHR5cC5UaW1lRXZlbnRzOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NzYKICAgIC8vIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk3NwogICAgLy8gYXJjNC5VSW50NjQoc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTc1LTk3OAogICAgLy8gcmV0dXJuIHR5cC5UaW1lRXZlbnRzKAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUpLAogICAgLy8gKQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hc3NldF9tZXRhZGF0YSgpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbWV0YWRhdGE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5ODAtOTgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbWV0YWRhdGEoc2VsZikgLT4gdHlwLkFzc2V0TWV0YWRhdGE6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk4OQogICAgLy8gcmV0dXJuIHR5cC5Bc3NldE1ldGFkYXRhLmZyb21fYnl0ZXMoc2VsZi5tZXRhZGF0YSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAibWV0YWRhdGEiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWV0YWRhdGEgZXhpc3RzCiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "byteCode": { + "approval": "CiAFAAEIBMgBJh8EFR98dRFjaXJjdWxhdGluZ191bml0cwZzdGF0dXMNbWF0dXJpdHlfZGF0ZQp1bml0X3ZhbHVlC3RvdGFsX3VuaXRzDXRvdGFsX2NvdXBvbnMEUjMwIwRSMjAjFWRlbm9taW5hdGlvbl9hc3NldF9pZBNzZXR0bGVtZW50X2Fzc2V0X2lkFGRheV9jb3VudF9jb252ZW50aW9uCG1ldGFkYXRhEnByaW5jaXBhbF9kaXNjb3VudCFwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUhcHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlDWlzc3VhbmNlX2RhdGUdc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUdc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUJc3VzcGVuZGVkCWRlZmF1bHRlZA1pbnRlcmVzdF9yYXRlCnRpbWVFdmVudHMEUjcwIwRSNjAjBFI1MCMEUjQwIwgAAAAAAAAAAAtjb3Vwb25SYXRlcwMGgQEEUjgwIzEYQABPJwgyA2cnCSJnJwoiZycEImcnCyJnJwyAAGcnBSJnKSJnJw0iZycVImcnBiJnJw4iZycPImcnECJnJxEiZycSImcrImcqImcnEyJnJxQiZzEbQQB+ghEEPw78bAQl26lbBIlHQTQEHW/CVQT+90VnBLj8E5AEPUPR8ATr2WsvBGyF4+4E9jrOjQS7zKGKBBp7q7QEQC26RwTtAnWfBPrSFz4ECO/qNQTkpatUNhoAjhEBSAE4AQ4A+wDiAMwAtgCjAI0AegBkAFUARQAyACIAEgACIkMxGRREMRhEiAgyKExQsCNDMRkURDEYRIgICyhMULAjQzEZFEQxGESIB98oTFCwI0MxGRREMRhENhoBiAe8KExQsCNDMRkURDEYRIgG4ShMULAjQzEZFEQxGEQ2GgGIBpEjQzEZFEQxGEQ2GgE2GgKIBl4oTFCwI0MxGRREMRhENhoBiAYEKExQsCNDMRkURDEYRDYaATYaAogFLihMULAjQzEZFEQxGEQ2GgGIBN8oTFCwI0MxGRREMRhENhoBNhoCiARVKExQsCNDMRkURDEYRDYaATYaAogDoyhMULAjQzEZFEQxGEQ2GgE2GgI2GgOIAsIoTFCwI0MxGRREMRhENhoBiAIpKExQsCNDMRkURDEYRDYaATYaAjYaAzYaBDYaBTYaBjYaBzYaCDYaCTYaCogATCNDMRklEkQxGEQ2GgGIACMjQzEZFEQxGBRENhoBNhoCiAACI0OKAgAnCIv+ZycMi/9niYoBAIgABicMi/9niYoAADEAIicIZUQSRImKCgAigABHAoj/6CIqZUQURIv2F0lBAQ2LBHELRDIDE0EBAiNEJwmLBGeL9xciJwllREsBEkQnCkxnsTIAIicKZUQyCiKyErIUshElshCyAbOL+BeL+hdKGBREJwRLAWcKJwVMZ4v5FycNTGeL+xdJjAFBAAmLAYH/ARJBAKMjRCcLiwFni/wXjAIiJw1lREAAA4sCRCcViwJni/0iWUkURCcGTGciJwZlREEACSccvEgnHIv9v4v+IlkiJwZlRCUIEkSL/ogAYYz+Jxa8SCcWi/6/i/5XAgBJjABJVwAIFycOTGdJVwgIFycPTGdXEAgXJxBMZ4v+IllJjAMiJwZlRCUIEkEAD4sDIwkkC4sATCRYFytMZ4v/IlkURCqBZGeJIkL/WiJC/vuKAQGAAEmL/1cCAElXAAgXMgcNRIv/IlkjCSKLBIsDDEEAXoFLMgwNQQAZsYEGshCBBbIZJx2yHicdsh8yALIBs0L/34sESSQLiwJJTgNMJFgXSU4DjAEjCEmMBCQLJFgXSYwADEQiJwtlRIH/ARNB/6mLAIsBCYGAowUYFERC/5qL/4wAiYoBASKI/j0iKmVEIQQSFESIAGiL/yJZSUQjDYv/TEEACov/iP9USYz/jAGLAYz/IicQZUSL/1cCAEmMAFcACBdMSwEORCcRTGciK2VEQQAbIitlRIv/IlkjCSQLiwBMJFgXTEsBD0QnEkxnIicRZUQWIicSZUQWUIwAiYoAACInFGVEFESJigMBiP24iP/si/4XSYEUEkAAKIsAgSgSQAAgiwCBMhJAABiLAIE8EkAAEIsAgUYSQAAIiwCBUBJBAIkjRIMGFCgyPEZQiwCOBgBnAFMAPwArABcAAQAnHov9UEm9RQEURIv/VwIAvzIHFkyJJxeL/VBJvUUBFESL/1cCAL9C/+cnGIv9UEm9RQEURIv/VwIAv0L/0ycZi/1QSb1FARREi/9XAgC/Qv+/JxqL/VBJvUUBFESL/1cCAL9C/6snCIv9Z0L/oyJC/3SKAgGI/PCI/ySL/xdJgSgSQAAgiwCBMhJAABiLAIE8EkAAEIsAgUYSQAAIiwCBUBJBAGUjRIMFKDI8RlCLAI4FAD8AMAAhABIAAQAnHov+UEm9RQFEvEgyBxZMiScXi/5QSb1FAUS8SEL/7CcYi/5QSb1FAUS8SEL/3ScZi/5QSb1FAUS8SEL/zicai/5QSb1FAUS8SEL/vyJC/5iKAgGIAC4iKmVEIQQSFESI/n+IAFQnB4v+UEm9RQEURIv/JxtQJxtQJxtQgAEAUL8yBxaJigAAIicaMQBQSb1FAUEAIYsBvkRXAAgyBxZJjACmQQAQiwG+RFcICIsAp0EAAyNEiSJC//qKAAAiJxNlRBREiYoBAYj/uoj+FCcHi/9QSb1FAURJvkRXIAgXSU8CvEgiKWVETAkpTGciKWVEQAAEKiEEZ4sAFjIHFlBMiYoCASJJgAAiKmVEgWQSQQCrIicOZUQyB0mMAg5BAJ0iJw9lRIsCDUEAkiNEJxkxAFBJjAC9RQFBAH6LAL5EVwAIMgcWSYwBpkEAbYsAvkRXCAiLAadBAGAjRCcHi/5QSb1FAUSI/XqI/0+L/xdJRCIpZURLAQgiJwVlRA5EIillREsBCClMZ0sBvkRXIAgXCBZLAb5ETFwgSwFMvyInBGVEFksBvkRMXCi/IicFZUQiKWVECRaMAIkiQv+dIkL/a4oBAYgADIv/IlMnE0xnMgcWiYoAACInFzEAUEm9RQFBACGLAb5EVwAIMgcWSYwApkEAEIsBvkRXCAiLAKdBAAMjRIkiQv/6igIBiP/FJweL/lBJvUUBREm+RIv/IlOBwANMVL8yBxaJigEAIicYMQBQSb1FAUEAKYsBvkRXAAgyBxZJjACmQQAYiwG+RFcICIsAp0EACyNEi/8iUycUTGeJIkL/8ooAASJJMgciK2VMSU4CTgREDUEADIsAjAKLAUEAAyWMAosCjAAiJxRlREEABIEDjAAiJwllRBYiJwplRBYiKWVEIicEZUQLFiInBGVEFiInC2VEFlcHASInDWVEFlcGAiInFWVEFlcGAiInBWVEFiIpZUQWIicOZUQWIicPZUQWIicQZUQWIitlRBYiJxNlRIABACJPAlSLABZXBwFPDk8OUE8NUE8MUE8LUE8KUE8JUE8IUE8HUE8GUE8FUE8EUE8DUE8CUExQjACJigEBJweL/1BJvUUBRL5EiYoAAYACAAAiKmVEgWQSQQAHJxa+TIwARIsATImKAAEiJxFlRBYiJxJlRBZQgAIAAkxQiYoAASInDGVEiQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 4, + "minor": 2, + "patch": 1 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/smart_contracts/artifacts/base_d_asa/base_d_asa_client.py b/smart_contracts/artifacts/base_d_asa/base_d_asa_client.py index 3a48257..a04fdc2 100644 --- a/smart_contracts/artifacts/base_d_asa/base_d_asa_client.py +++ b/smart_contracts/artifacts/base_d_asa/base_d_asa_client.py @@ -19,7 +19,7 @@ import algokit_utils from algokit_utils import AlgorandClient as _AlgoKitAlgorandClient -_APP_SPEC_JSON = r"""{"arcs": [], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA Arranger Address", "name": "arranger"}, {"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "desc": "D-ASA metadata", "name": "metadata", "struct": "AssetMetadata"}], "name": "asset_create", "returns": {"type": "void"}, "desc": "Create a new D-ASA", "events": []}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [{"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "name": "metadata", "struct": "AssetMetadata"}], "name": "asset_update", "returns": {"type": "void"}, "desc": "Update D-ASA application.", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Denomination asset identifier", "name": "denomination_asset_id"}, {"type": "uint64", "desc": "Settlement asset identifier", "name": "settlement_asset_id"}, {"type": "uint64", "desc": "Principal, expressed in denomination asset", "name": "principal"}, {"type": "uint64", "desc": "Principal discount in bps", "name": "principal_discount"}, {"type": "uint64", "desc": "Minimum denomination, expressed in denomination asset", "name": "minimum_denomination"}, {"type": "uint8", "desc": "Day-count convention for interests calculation", "name": "day_count_convention"}, {"type": "uint16", "desc": "Interest rate in bps", "name": "interest_rate"}, {"type": "uint16[]", "desc": "Coupon interest rates in bps", "name": "coupon_rates"}, {"type": "uint64[]", "desc": "Time events (strictly ascending order)", "name": "time_events"}, {"type": "(uint64,uint64)[]", "desc": "Time periods of recurring time events", "name": "time_periods"}], "name": "asset_config", "returns": {"type": "void"}, "desc": "Configure the Debt Algorand Standard Application", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64[]", "desc": "Secondary market time events (strictly ascending order)", "name": "secondary_market_time_events"}], "name": "set_secondary_time_events", "returns": {"type": "(uint64,uint64)", "desc": "Secondary Market Opening Date, Secondary Market Closure Date", "struct": "SecondaryMarketSchedule"}, "desc": "Set secondary market time schedule", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "uint8", "desc": "Role identifier", "name": "role"}, {"type": "byte[]", "desc": "Role configuration (Optional)", "name": "config"}], "name": "assign_role", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Assign a role to an address", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "uint8", "desc": "Role identifier", "name": "role"}], "name": "revoke_role", "returns": {"type": "uint64", "desc": "Timestamp of the role revocation"}, "desc": "Revoke a role from an address", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "open_account", "returns": {"type": "uint64", "desc": "Timestamp of the account opening"}, "desc": "Open D-ASA account", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "close_account", "returns": {"type": "(uint64,uint64)", "desc": "Closed units, Timestamp of the account closing"}, "desc": "Close D-ASA account", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "uint64", "desc": "Amount of D-ASA units to distribute", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64", "desc": "Remaining D-ASA units to be distributed"}, "desc": "Distribute D-ASA units to accounts according the primary market", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "set_asset_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set asset suspension status"}, "desc": "Set asset suspension status", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "set_account_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set account suspension status"}, "desc": "Set account suspension status", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Default status", "name": "defaulted"}], "name": "set_default_status", "returns": {"type": "void"}, "desc": "Set D-ASA default status", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_asset_info", "returns": {"type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Performance", "struct": "AssetInfo"}, "desc": "Get D-ASA info", "events": [], "readonly": true}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "get_account_info", "returns": {"type": "(address,uint64,uint64,uint64,bool)", "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended", "struct": "AccountInfo"}, "desc": "Get account info", "events": [], "readonly": true}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_time_events", "returns": {"type": "uint64[]", "desc": "Time events"}, "desc": "Get D-ASA time events", "events": [], "readonly": true}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_secondary_market_schedule", "returns": {"type": "uint64[]", "desc": "Secondary market schedule"}, "desc": "Get secondary market schedule", "events": [], "readonly": true}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_asset_metadata", "returns": {"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "desc": "Contract type, Calendar, Business day convention, End of month convention, Early repayment effect, Early repayment penalty type, Prospectus hash, Prospectus URL", "struct": "AssetMetadata"}, "desc": "Get D-ASA metadata", "events": [], "readonly": true}], "name": "BaseDAsa", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UjIwIw==", "keyType": "AVMString", "valueType": "AVMBytes"}, "circulating_units": {"key": "Y2lyY3VsYXRpbmdfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "defaulted": {"key": "ZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_rate": {"key": "aW50ZXJlc3RfcmF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "issuance_date": {"key": "aXNzdWFuY2VfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "metadata": {"key": "bWV0YWRhdGE=", "keyType": "AVMString", "valueType": "AVMBytes"}, "primary_distribution_closure_date": {"key": "cHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "primary_distribution_opening_date": {"key": "cHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "principal_discount": {"key": "cHJpbmNpcGFsX2Rpc2NvdW50", "keyType": "AVMString", "valueType": "AVMUint64"}, "secondary_market_closure_date": {"key": "c2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU=", "keyType": "AVMString", "valueType": "AVMUint64"}, "secondary_market_opening_date": {"key": "c2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU=", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "suspended": {"key": "c3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_coupons": {"key": "dG90YWxfY291cG9ucw==", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "unit_value": {"key": "dW5pdF92YWx1ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 2, "ints": 18}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AssetMetadata": [{"name": "contract_type", "type": "uint8"}, {"name": "calendar", "type": "uint8"}, {"name": "business_day_convention", "type": "uint8"}, {"name": "end_of_month_convention", "type": "uint8"}, {"name": "prepayment_effect", "type": "uint8"}, {"name": "penalty_type", "type": "uint8"}, {"name": "prospectus_hash", "type": "byte[32]"}, {"name": "prospectus_url", "type": "string"}], "SecondaryMarketSchedule": [{"name": "secondary_market_opening_date", "type": "uint64"}, {"name": "secondary_market_closure_date", "type": "uint64"}], "AssetInfo": [{"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "unit_value", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "principal_discount", "type": "uint16"}, {"name": "interest_rate", "type": "uint16"}, {"name": "total_supply", "type": "uint64"}, {"name": "circulating_supply", "type": "uint64"}, {"name": "primary_distribution_opening_date", "type": "uint64"}, {"name": "primary_distribution_closure_date", "type": "uint64"}, {"name": "issuance_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "performance", "type": "uint8"}], "AccountInfo": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "unit_value", "type": "uint64"}, {"name": "paid_coupons", "type": "uint64"}, {"name": "suspended", "type": "bool"}]}, "desc": "\n Base D-ASA Class implementing common interfaces and state schema:\n\n - Asset creation and configuration\n - Role-based access control\n - Account management (creation, suspension, close-out)\n - Time schedule with no coupons and maturity date\n - Primary distribution\n - Getters (asset info, account info, time events)\n ", "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCA0IDIwMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJjaXJjdWxhdGluZ191bml0cyIgInN0YXR1cyIgIm1hdHVyaXR5X2RhdGUiICJ1bml0X3ZhbHVlIiAidG90YWxfdW5pdHMiICJ0b3RhbF9jb3Vwb25zIiAweDUyMzMzMDIzIDB4NTIzMjMwMjMgImRlbm9taW5hdGlvbl9hc3NldF9pZCIgInNldHRsZW1lbnRfYXNzZXRfaWQiICJkYXlfY291bnRfY29udmVudGlvbiIgIm1ldGFkYXRhIiAicHJpbmNpcGFsX2Rpc2NvdW50IiAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIiAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIiAiaXNzdWFuY2VfZGF0ZSIgInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIiAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiICJzdXNwZW5kZWQiICJkZWZhdWx0ZWQiICJpbnRlcmVzdF9yYXRlIiAweDc0Njk2ZDY1NDU3NjY1NmU3NDczIDB4NTIzNzMwMjMgMHg1MjM2MzAyMyAweDUyMzUzMDIzIDB4NTIzNDMwMjMgMHgwMDAwMDAwMDAwMDAwMDAwIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MyAweDA2ODEwMSAweDUyMzgzMDIzCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MS00MgogICAgLy8gIyBSb2xlIEJhc2VkIEFjY2VzcyBDb250cm9sCiAgICAvLyBzZWxmLmFycmFuZ2VyID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9BUlJBTkdFUikKICAgIGJ5dGVjIDggLy8gMHg1MjMyMzAyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTktNjAKICAgIC8vICMgQXNzZXQgQ29uZmlndXJhdGlvbgogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBVSW50NjQoKQogICAgYnl0ZWMgOSAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MQogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkID0gVUludDY0KCkKICAgIGJ5dGVjIDEwIC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MgogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gInVuaXRfdmFsdWUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDExIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUtNjYKICAgIC8vICMgTWV0YWRhdGEKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBCeXRlcygpCiAgICBieXRlYyAxMiAvLyAibWV0YWRhdGEiCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OC02OQogICAgLy8gIyBTdXBwbHkKICAgIC8vIHNlbGYudG90YWxfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWMgNSAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwCiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3Mi03MwogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50ID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJwcmluY2lwYWxfZGlzY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1LTc2CiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmludGVyZXN0X3JhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMjEgLy8gImludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgwCiAgICAvLyBzZWxmLnRvdGFsX2NvdXBvbnMgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAidG90YWxfY291cG9ucyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODUKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDE0IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NwogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDE2IC8vICJpc3N1YW5jZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OAogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNyAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDE4IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlY18zIC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5Mi05MwogICAgLy8gIyBTdGF0dXMKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGNmZy5TVEFUVVNfRU1QVFkpCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBzZWxmLnN1c3BlbmRlZCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxOSAvLyAic3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NQogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gImRlZmF1bHRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2FmdGVyX2lmX2Vsc2VAMjIKICAgIHB1c2hieXRlc3MgMHgzZjBlZmM2YyAweDI1ZGJhOTViIDB4ODk0NzQxMzQgMHgxZDZmYzI1NSAweGZlZjc0NTY3IDB4YjhmYzEzOTAgMHgzZDQzZDFmMCAweGViZDk2YjJmIDB4NmM4NWUzZWUgMHhmNjNhY2U4ZCAweGJiY2NhMThhIDB4MWE3YmFiYjQgMHg0MDJkYmE0NyAweGVkMDI3NTlmIDB4ZmFkMjE3M2UgMHgwOGVmZWEzNSAweGU0YTVhYjU0IC8vIG1ldGhvZCAiYXNzZXRfY3JlYXRlKGFkZHJlc3MsKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LGJ5dGVbMzJdLHN0cmluZykpdm9pZCIsIG1ldGhvZCAiYXNzZXRfdXBkYXRlKCh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCxieXRlWzMyXSxzdHJpbmcpKXZvaWQiLCBtZXRob2QgImFzc2V0X2NvbmZpZyh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQxNix1aW50MTZbXSx1aW50NjRbXSwodWludDY0LHVpbnQ2NClbXSl2b2lkIiwgbWV0aG9kICJzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKHVpbnQ2NFtdKSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiYXNzaWduX3JvbGUoYWRkcmVzcyx1aW50OCxieXRlW10pdWludDY0IiwgbWV0aG9kICJyZXZva2Vfcm9sZShhZGRyZXNzLHVpbnQ4KXVpbnQ2NCIsIG1ldGhvZCAib3Blbl9hY2NvdW50KGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImNsb3NlX2FjY291bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAic2V0X2Fzc2V0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInNldF9hY2NvdW50X3N1c3BlbnNpb24oYWRkcmVzcyxib29sKXVpbnQ2NCIsIG1ldGhvZCAic2V0X2RlZmF1bHRfc3RhdHVzKGJvb2wpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2luZm8oKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQxNix1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X2FjY291bnRfaW5mbyhhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wpIiwgbWV0aG9kICJnZXRfdGltZV9ldmVudHMoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSgpdWludDY0W10iLCBtZXRob2QgImdldF9hc3NldF9tZXRhZGF0YSgpKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LGJ5dGVbMzJdLHN0cmluZykiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2Fzc2V0X2NyZWF0ZV9yb3V0ZUA1IG1haW5fYXNzZXRfdXBkYXRlX3JvdXRlQDYgbWFpbl9hc3NldF9jb25maWdfcm91dGVANyBtYWluX3NldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfcm91dGVAOCBtYWluX2Fzc2lnbl9yb2xlX3JvdXRlQDkgbWFpbl9yZXZva2Vfcm9sZV9yb3V0ZUAxMCBtYWluX29wZW5fYWNjb3VudF9yb3V0ZUAxMSBtYWluX2Nsb3NlX2FjY291bnRfcm91dGVAMTIgbWFpbl9wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9yb3V0ZUAxMyBtYWluX3NldF9hc3NldF9zdXNwZW5zaW9uX3JvdXRlQDE0IG1haW5fc2V0X2FjY291bnRfc3VzcGVuc2lvbl9yb3V0ZUAxNSBtYWluX3NldF9kZWZhdWx0X3N0YXR1c19yb3V0ZUAxNiBtYWluX2dldF9hc3NldF9pbmZvX3JvdXRlQDE3IG1haW5fZ2V0X2FjY291bnRfaW5mb19yb3V0ZUAxOCBtYWluX2dldF90aW1lX2V2ZW50c19yb3V0ZUAxOSBtYWluX2dldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlX3JvdXRlQDIwIG1haW5fZ2V0X2Fzc2V0X21ldGFkYXRhX3JvdXRlQDIxCgptYWluX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21ldGFkYXRhX3JvdXRlQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYXNzZXRfbWV0YWRhdGEKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGVfcm91dGVAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF90aW1lX2V2ZW50c19yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X3RpbWVfZXZlbnRzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hY2NvdW50X2luZm9fcm91dGVAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hY2NvdW50X2luZm8KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2luZm9fcm91dGVAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hc3NldF9pbmZvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9kZWZhdWx0X3N0YXR1c19yb3V0ZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBjbGFzcyBCYXNlREFzYShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X2RlZmF1bHRfc3RhdHVzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9hY2NvdW50X3N1c3BlbnNpb25fcm91dGVAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9hY2NvdW50X3N1c3BlbnNpb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0X2Fzc2V0X3N1c3BlbnNpb25fcm91dGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9hc3NldF9zdXNwZW5zaW9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3ByaW1hcnlfZGlzdHJpYnV0aW9uX3JvdXRlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODAxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jbG9zZV9hY2NvdW50X3JvdXRlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBjbG9zZV9hY2NvdW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX29wZW5fYWNjb3VudF9yb3V0ZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBjbGFzcyBCYXNlREFzYShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgb3Blbl9hY2NvdW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3Jldm9rZV9yb2xlX3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2ODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiByZXZva2Vfcm9sZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NpZ25fcm9sZV9yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NpZ25fcm9sZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzZXRfY29uZmlnX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0ODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0ODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NldF9jb25maWcKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzZXRfdXBkYXRlX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMyAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IFVwZGF0ZUFwcGxpY2F0aW9uCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBjbGFzcyBCYXNlREFzYShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBjYWxsc3ViIGFzc2V0X3VwZGF0ZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF9jcmVhdGVfcm91dGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgY2FsbHN1YiBhc3NldF9jcmVhdGUKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NldF9jcmVhdGUoYXJyYW5nZXI6IGJ5dGVzLCBtZXRhZGF0YTogYnl0ZXMpIC0+IHZvaWQ6CmFzc2V0X2NyZWF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2MS00NjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgLy8gZGVmIGFzc2V0X2NyZWF0ZShzZWxmLCBhcnJhbmdlcjogYXJjNC5BZGRyZXNzLCBtZXRhZGF0YTogdHlwLkFzc2V0TWV0YWRhdGEpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3MAogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IGFycmFuZ2VyLm5hdGl2ZQogICAgYnl0ZWMgOCAvLyAweDUyMzIzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzEKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YS5ieXRlcwogICAgYnl0ZWMgMTIgLy8gIm1ldGFkYXRhIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXRfdXBkYXRlKG1ldGFkYXRhOiBieXRlcykgLT4gdm9pZDoKYXNzZXRfdXBkYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDczLTQ3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIGFzc2V0X3VwZGF0ZShzZWxmLCBtZXRhZGF0YTogdHlwLkFzc2V0TWV0YWRhdGEpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3OC00ODEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgZGlzYWJsZSBELUFTQSBhcHBsaWNhdGlvbiB1cGRhdGFiaWxpdHkgb3IgY2hhbmdlIGl0cyBhdXRob3JpemF0aW9ucy4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleSBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ4MgogICAgLy8gc2VsZi5tZXRhZGF0YSA9IG1ldGFkYXRhLmJ5dGVzCiAgICBieXRlYyAxMiAvLyAibWV0YWRhdGEiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExOC0xMTkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYuYXJyYW5nZXIudmFsdWUsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vIDB4NTIzMjMwMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2V0X2NvbmZpZyhkZW5vbWluYXRpb25fYXNzZXRfaWQ6IGJ5dGVzLCBzZXR0bGVtZW50X2Fzc2V0X2lkOiBieXRlcywgcHJpbmNpcGFsOiBieXRlcywgcHJpbmNpcGFsX2Rpc2NvdW50OiBieXRlcywgbWluaW11bV9kZW5vbWluYXRpb246IGJ5dGVzLCBkYXlfY291bnRfY29udmVudGlvbjogYnl0ZXMsIGludGVyZXN0X3JhdGU6IGJ5dGVzLCBjb3Vwb25fcmF0ZXM6IGJ5dGVzLCB0aW1lX2V2ZW50czogYnl0ZXMsIHRpbWVfcGVyaW9kczogYnl0ZXMpIC0+IHZvaWQ6CmFzc2V0X2NvbmZpZzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ4NC00OTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2V0X2NvbmZpZygKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgcHJpbmNpcGFsOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBwcmluY2lwYWxfZGlzY291bnQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIG1pbmltdW1fZGVub21pbmF0aW9uOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBkYXlfY291bnRfY29udmVudGlvbjogYXJjNC5VSW50OCwKICAgIC8vICAgICBpbnRlcmVzdF9yYXRlOiBhcmM0LlVJbnQxNiwKICAgIC8vICAgICBjb3Vwb25fcmF0ZXM6IHR5cC5Db3Vwb25SYXRlcywKICAgIC8vICAgICB0aW1lX2V2ZW50czogdHlwLlRpbWVFdmVudHMsCiAgICAvLyAgICAgdGltZV9wZXJpb2RzOiB0eXAuVGltZVBlcmlvZHMsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAxMCAwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUyNwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTI4CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTVBUWSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzAtNTMxCiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuYXNzZXJ0X2Rlbm9taW5hdGlvbl9hc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xMAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODAKICAgIC8vIGRlbm9taW5hdGlvbl9hc3NldF9pZCAhPSBVSW50NjQoMCkgYW5kIEFzc2V0KGRlbm9taW5hdGlvbl9hc3NldF9pZCkuY3JlYXRvcgogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANAogICAgZnJhbWVfZGlnIDQKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBhc3NldF9jb25maWdfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3OC0xODEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gZGVub21pbmF0aW9uIHdpdGggQVNBCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZCAhPSBVSW50NjQoMCkgYW5kIEFzc2V0KGRlbm9taW5hdGlvbl9hc3NldF9pZCkuY3JlYXRvcgogICAgLy8gKSwgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBkZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGJ5dGVjIDkgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGZyYW1lX2RpZyA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTM0LTUzNQogICAgLy8gIyBTZXQgRGVub21pbmF0aW9uIEFzc2V0CiAgICAvLyBzZWxmLmFzc2VydF9zZXR0bGVtZW50X2Fzc2V0KHNldHRsZW1lbnRfYXNzZXRfaWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC05CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTEKICAgIC8vIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkIGV4aXN0cwogICAgZGlnIDEKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODktMTkyCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyAxMCAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTctMjAzCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDIKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTkKICAgIC8vIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDAKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjAxCiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTctMTk4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIGludGNfMyAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5Ny0yMDMKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NDAKICAgIC8vIHByaW5jaXBhbC5uYXRpdmUgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUgPT0gMAogICAgZnJhbWVfZGlnIC04CiAgICBidG9pCiAgICBmcmFtZV9kaWcgLTYKICAgIGJ0b2kKICAgIGR1cDIKICAgICUKICAgICEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUzOC01NDEKICAgIC8vICMgU2V0IFByaW5jaXBhbCBhbmQgTWluaW11bSBEZW5vbWluYXRpb24KICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJpbmNpcGFsLm5hdGl2ZSAlIG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZSA9PSAwCiAgICAvLyApLCBlcnIuSU5WQUxJRF9NSU5JTVVNX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIE1pbmltdW0gZGVub21pbmF0aW9uIGlzIG5vdCBhIGRpdmlzb3Igb2YgcHJpbmNpcGFsCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NDIKICAgIC8vIHNlbGYudW5pdF92YWx1ZSA9IG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZQogICAgYnl0ZWMgNCAvLyAidW5pdF92YWx1ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gcHJpbmNpcGFsLm5hdGl2ZSAvLyBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUKICAgIC8KICAgIGJ5dGVjIDUgLy8gInRvdGFsX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU0NAogICAgLy8gc2VsZi5wcmluY2lwYWxfZGlzY291bnQgPSBwcmluY2lwYWxfZGlzY291bnQubmF0aXZlCiAgICBmcmFtZV9kaWcgLTcKICAgIGJ0b2kKICAgIGJ5dGVjIDEzIC8vICJwcmluY2lwYWxfZGlzY291bnQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQ2LTU0NwogICAgLy8gIyBTZXQgRGF5LUNvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuYXNzZXJ0X2RheV9jb3VudF9jb252ZW50aW9uKGRheV9jb3VudF9jb252ZW50aW9uLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtNQogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNy0yMTEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGZyYW1lX2RpZyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTAKICAgIC8vIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgcHVzaGludCAyNTUgLy8gMjU1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDctMjExCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICA9PQogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmFzc2V0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDctMjExCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICBhc3NlcnQgLy8gSW52YWxpZCBkYXktY291bnQgY29udmVudGlvbiBJRAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjE1CiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIGJ5dGVjIDExIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGZyYW1lX2RpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTUwLTU1MQogICAgLy8gIyBTZXQgSW50ZXJlc3QgUmF0ZQogICAgLy8gc2VsZi5hc3NlcnRfaW50ZXJlc3RfcmF0ZShpbnRlcmVzdF9yYXRlLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtNAogICAgYnRvaQogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTktMjIwCiAgICAvLyAjIFRoaXMgc3Vicm91dGluZSBtdXN0IGJlIHVzZWQgYWZ0ZXIgdGhlIHByaW5jaXBhbCBkaXNjb3VudCBoYXMgYmVlbiBzZXQKICAgIC8vIGlmIG5vdCBzZWxmLnByaW5jaXBhbF9kaXNjb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIGJueiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjIxCiAgICAvLyBhc3NlcnQgaW50ZXJlc3RfcmF0ZSA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfSU5URVJFU1RfUkFURQogICAgZnJhbWVfZGlnIDIKICAgIGFzc2VydCAvLyBJbnRlcmVzdCByYXRlIGlzIG5vdCBwcm9wZXJseSBkZWZpbmVkCgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gc2VsZi5pbnRlcmVzdF9yYXRlID0gaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgMjEgLy8gImludGVyZXN0X3JhdGUiCiAgICBmcmFtZV9kaWcgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyOQogICAgLy8gYXNzZXJ0IG5vdCBjb3Vwb25fcmF0ZXMubGVuZ3RoLCBlcnIuSU5WQUxJRF9DT1VQT05fUkFURVMKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgICEKICAgIGFzc2VydCAvLyBDb3Vwb24gcmF0ZXMgYXJlIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMzMKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IGNvdXBvbl9yYXRlcy5sZW5ndGgKICAgIGJ5dGVjIDYgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjM0CiAgICAvLyBpZiBzZWxmLnRvdGFsX2NvdXBvbnM6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgYnogYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gc2VsZi5jb3Vwb25fcmF0ZXMudmFsdWUgPSBjb3Vwb25fcmF0ZXMuY29weSgpCiAgICBieXRlYyAyOCAvLyAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMjggLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBmcmFtZV9kaWcgLTMKICAgIGJveF9wdXQKCmFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDMyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQwCiAgICAvLyB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIGludGNfMyAvLyA0CiAgICArCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjM5LTI0MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTCiAgICAvLyApLCBlcnIuSU5WQUxJRF9USU1FX0VWRU5UU19MRU5HVEgKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBsZW5ndGggaXMgaW52YWxpZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTYwCiAgICAvLyBzZWxmLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQodGltZV9ldmVudHMpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY1CiAgICAvLyBzZWxmLnRpbWVfZXZlbnRzLnZhbHVlID0gdGltZV9ldmVudHMuY29weSgpCiAgICBieXRlYyAyMiAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDIyIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY2LTI2OAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY2CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTQgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2Ni0yNjgKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY5LTI3MQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGR1cAogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjkKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICBieXRlYyAxNSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY5LTI3MQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzIKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSA9IHRpbWVfZXZlbnRzW2NmZy5JU1NVQU5DRV9EQVRFX0lEWF0ubmF0aXZlCiAgICBleHRyYWN0IDE2IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBieXRlYyAxNiAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzQtMjc1CiAgICAvLyAjIFNvbWUgRC1BU0EgbWF5IG5vdCBoYXZlIGEgbWF0dXJpdHkgZGF0ZSAoZS5nLiwgcGVycGV0dWFscykKICAgIC8vIGlmIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBpbnRjXzMgLy8gNAogICAgKwogICAgPT0KICAgIGJ6IGFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDM4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzYKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRpbWVfZXZlbnRzW2NmZy5NQVRVUklUWV9EQVRFX0lEWF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnl0ZWNfMyAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0Cgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4MAogICAgLy8gYXNzZXJ0IG5vdCB0aW1lX3BlcmlvZHMubGVuZ3RoLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRFMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICAhCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGFyZSBub3QgcHJvcGVybHkgZGVmaW5lZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTY3CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VAMTc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NldF9jb25maWdfYm9vbF9tZXJnZUAxOAoKYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHRpbWVfZXZlbnRzOiBieXRlcykgLT4gYnl0ZXM6CmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDMtMjQ0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQoc2VsZiwgdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzKSAtPiBOb25lOgogICAgcHJvdG8gMSAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ2CiAgICAvLyB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ3CiAgICAvLyA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDYtMjQ3CiAgICAvLyB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0ubmF0aXZlCiAgICAvLyA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDUtMjQ4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXS5uYXRpdmUKICAgIC8vICAgICA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyApLCBlcnIuSU5WQUxJRF9USU1FCiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ5CiAgICAvLyBmb3IgX3QgaW4gdXJhbmdlKHRpbWVfZXZlbnRzLmxlbmd0aCAtIDEpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzAgLy8gMAoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDkKICAgIC8vIGZvciBfdCBpbiB1cmFuZ2UodGltZV9ldmVudHMubGVuZ3RoIC0gMSk6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDMKICAgIDwKICAgIGJ6IGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDYKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfd2hpbGVfdG9wQDg6CiAgICBwdXNoaW50IDc1IC8vIDc1CiAgICBnbG9iYWwgT3Bjb2RlQnVkZ2V0CiAgICA+CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX3doaWxlQDE0CiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgMjkgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyAyOSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfd2hpbGVfdG9wQDgKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfd2hpbGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTQKICAgIC8vIHRpbWVfaSA9IHRpbWVfZXZlbnRzW190XS5uYXRpdmUKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjU1CiAgICAvLyB0aW1lX2YgPSB0aW1lX2V2ZW50c1tfdCArIDFdLm5hdGl2ZQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gYXNzZXJ0IHRpbWVfZiA+IHRpbWVfaSwgZXJyLklOVkFMSURfU09SVElORwogICAgPAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjU3CiAgICAvLyBpZiBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uICE9IFVJbnQ2NChjc3QuRENDX0NPTlQpOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIHB1c2hpbnQgMjU1IC8vIDI1NQogICAgIT0KICAgIGJ6IGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfZm9yX2hlYWRlckAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTgtMjU5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGltZSBwZXJpb2RzIGV4cHJlc3NlZCBpbiBkYXlzIGZvciByZWd1bGFyIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0ICh0aW1lX2YgLSB0aW1lX2kpICUgVUludDY0KAogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTgtMjYxCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGltZSBwZXJpb2RzIGV4cHJlc3NlZCBpbiBkYXlzIGZvciByZWd1bGFyIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0ICh0aW1lX2YgLSB0aW1lX2kpICUgVUludDY0KAogICAgLy8gICAgIGNzdC5EQVlfMl9TRUMKICAgIC8vICkgPT0gMCwgZXJyLklOVkFMSURfVElNRV9QRVJJT0QKICAgIHB1c2hpbnQgODY0MDAgLy8gODY0MDAKICAgICUKICAgICEKICAgIGFzc2VydCAvLyBUaW1lIHBlcmlvZHMgaW4gQWN0dWFsL0FjdHVhbCBkYXkgY291bnQgY29udmVudGlvbiBtdXN0IGJlIG11bHRpcGxlcyBvZiBhIGRheSAoaW4gc2Vjb25kcykKICAgIGIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDEKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDY6CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cyhzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzOiBieXRlcykgLT4gYnl0ZXM6CnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NjktNTcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKAogICAgLy8gICAgIHNlbGYsIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzCiAgICAvLyApIC0+IHR5cC5TZWNvbmRhcnlNYXJrZXRTY2hlZHVsZToKICAgIHByb3RvIDEgMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5MAogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjIDQgLy8gMjAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTkxCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTkyCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5NAogICAgLy8gYXNzZXJ0IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID49IDEsIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTUKICAgIC8vIGlmIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID4gMToKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTYKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMQogICAgZnJhbWVfYnVyeSAxCgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTgKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTktNjAxCiAgICAvLyA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTgtNjAxCiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGRpZyAxCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk3LTYwMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vICAgICA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyAgICAgXS5uYXRpdmUKICAgIC8vICksIGVyci5JTlZBTElEX1NFQ09OREFSWV9PUEVOSU5HX0RBVEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNlY29uZGFyeSBtYXJrZXQgb3BlbmluZyBkYXRlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDMKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTcgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjAzLTYwNQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDYKICAgIC8vIGlmIHNlbGYubWF0dXJpdHlfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICBieiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjA4CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTAKICAgIC8vIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDktNjExCiAgICAvLyA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDgtNjExCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIC8vID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGRpZyAxCiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjA3LTYxMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIC8vICAgICA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyAgICAgXS5uYXRpdmUKICAgIC8vICksIGVyci5JTlZBTElEX1NFQ09OREFSWV9DTE9TVVJFX0RBVEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNlY29uZGFyeSBtYXJrZXQgY2xvc3VyZSBkYXRlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTMKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTggLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjEzLTYxNQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxOAogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxNy02MTkKICAgIC8vIHNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MjEKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MjAtNjIyCiAgICAvLyBzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyApLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjE2LTYyMwogICAgLy8gcmV0dXJuIHR5cC5TZWNvbmRhcnlNYXJrZXRTY2hlZHVsZSgKICAgIC8vICAgICBzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gICAgICksCiAgICAvLyAgICAgc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkgLT4gdm9pZDoKYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTAtMTExCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExMgogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmRlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJkZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzaWduX3JvbGUocm9sZV9hZGRyZXNzOiBieXRlcywgcm9sZTogYnl0ZXMsIGNvbmZpZzogYnl0ZXMpIC0+IGJ5dGVzOgphc3NpZ25fcm9sZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyNS02MjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2lnbl9yb2xlKAogICAgLy8gICAgIHNlbGYsIHJvbGVfYWRkcmVzczogYXJjNC5BZGRyZXNzLCByb2xlOiBhcmM0LlVJbnQ4LCBjb25maWc6IGFyYzQuRHluYW1pY0J5dGVzCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDYKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0NwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ5CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgcHVzaGludCAyMCAvLyAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgtNjU1CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUxCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MCAvLyA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MgogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MCAvLyA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MwogICAgLy8gVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwIC8vIDcwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgtNjU1CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU0CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0OC02NTUKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBhc3NpZ25fcm9sZV9ib29sX2ZhbHNlQDcKCmFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18xIC8vIDEKCmFzc2lnbl9yb2xlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0OC02NTUKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU3CiAgICAvLyBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICBwdXNoaW50cyAyMCA0MCA1MCA2MCA3MCA4MCAvLyAyMCwgNDAsIDUwLCA2MCwgNzAsIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTYtNjg1CiAgICAvLyBtYXRjaCByb2xlLm5hdGl2ZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MubmF0aXZlCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICAgICAgICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoKQogICAgZnJhbWVfZGlnIDAKICAgIG1hdGNoIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzBAOSBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8xQDEwIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzJAMTEgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzVAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4NQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfNUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3OQogICAgLy8gcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgYnl0ZWMgMzAgLy8gMHg1MjM4MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzgtNjgwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4MgogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjgxLTY4MwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gKQogICAgYm94X3B1dAoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4NgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgc3dhcAogICAgcmV0c3ViCgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njc1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyMzczMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzYKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzNAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNCAvLyAweDUyMzYzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzMKICAgIC8vIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgYm94X3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8yQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzNTMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2OQogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY4LTY3MAogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICBjb25maWcubmF0aXZlCiAgICAvLyApCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzFAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjEKICAgIC8vIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDI2IC8vIDB4NTIzNDMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjYwLTY2MgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjQKICAgIC8vIGNvbmZpZy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2My02NjUKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICkKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMEA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU4CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzLm5hdGl2ZQogICAgYnl0ZWMgOCAvLyAweDUyMzIzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2lnbl9yb2xlX2Jvb2xfbWVyZ2VAOAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnJldm9rZV9yb2xlKHJvbGVfYWRkcmVzczogYnl0ZXMsIHJvbGU6IGJ5dGVzKSAtPiBieXRlczoKcmV2b2tlX3JvbGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2ODgtNjg5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiByZXZva2Vfcm9sZShzZWxmLCByb2xlX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcm9sZTogYXJjNC5VSW50OCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwNgogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA3CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDkKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgcHVzaGludCA0MCAvLyA0MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4LTcxNAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTAKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwIC8vIDUwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDgtNzE0CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiByZXZva2Vfcm9sZV9ib29sX3RydWVANQogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxMQogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MCAvLyA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4LTcxNAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTIKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgcHVzaGludCA3MCAvLyA3MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4LTcxNAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTMKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgcHVzaGludCA4MCAvLyA4MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4LTcxNAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiByZXZva2Vfcm9sZV9ib29sX2ZhbHNlQDYKCnJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1OgogICAgaW50Y18xIC8vIDEKCnJldm9rZV9yb2xlX2Jvb2xfbWVyZ2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxNi03MTcKICAgIC8vICMgQXJyYW5nZXIgcm9sZSBjYW4gbm90IGJlIHJldm9rZWQgKGp1c3Qgcm90YXRlZCkKICAgIC8vIGNhc2UgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50cyA0MCA1MCA2MCA3MCA4MCAvLyA0MCwgNTAsIDYwLCA3MCwgODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxNS03MzMKICAgIC8vIG1hdGNoIHJvbGUubmF0aXZlOgogICAgLy8gICAgICMgQXJyYW5nZXIgcm9sZSBjYW4gbm90IGJlIHJldm9rZWQgKGp1c3Qgcm90YXRlZCkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FDQ09VTlRfTUFOQUdFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9QUklNQVJZX0RFQUxFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfVFJVU1RFRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FVVEhPUklUWSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0lOVEVSRVNUX09SQUNMRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycigpCiAgICBmcmFtZV9kaWcgMAogICAgbWF0Y2ggcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMEA4IHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzFAOSByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8yQDEwIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzNAMTEgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfNEAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzMzCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV80QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzMwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDMwIC8vIDB4NTIzODMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczMQogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0lOVEVSRVNUX09SQUNMRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczNAogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgc3dhcAogICAgcmV0c3ViCgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8zQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzI3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzNzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyOAogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FVVEhPUklUWSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8yQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzI0CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNCAvLyAweDUyMzYzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjUKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9UUlVTVEVFICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzFAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzNTMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyMgogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1BSSU1BUllfREVBTEVSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzBAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxOAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNiAvLyAweDUyMzQzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTkKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BQ0NPVU5UX01BTkFHRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfYm9vbF9mYWxzZUA2OgogICAgaW50Y18wIC8vIDAKICAgIGIgcmV2b2tlX3JvbGVfYm9vbF9tZXJnZUA3CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Eub3Blbl9hY2NvdW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHBheW1lbnRfYWRkcmVzczogYnl0ZXMpIC0+IGJ5dGVzOgpvcGVuX2FjY291bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MzYtNzM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBvcGVuX2FjY291bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHBheW1lbnRfYWRkcmVzczogYXJjNC5BZGRyZXNzCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTYKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjIDQgLy8gMjAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU4CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1OQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjAKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA3IC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2Mi03NjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjQKICAgIC8vIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICBieXRlYyAyNyAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2Mi03NjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjUKICAgIC8vIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDI3IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzYyLTc2OAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2NgogICAgLy8gcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICBieXRlYyAyNyAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2Mi03NjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjcKICAgIC8vIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIHB1c2hieXRlcyAweDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY5CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIyLTEyMwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDI2IC8vIDB4NTIzNDMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2LTEyOQogICAgLy8gY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjcKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyOAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNy0xMjgKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjkKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyOC0xMjkKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI1LTEzMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X3N1c3BlbmRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExNC0xMTUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTE2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInN1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmNsb3NlX2FjY291bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gYnl0ZXM6CmNsb3NlX2FjY291bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NzEtNzc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBjbG9zZV9hY2NvdW50KAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzCiAgICAvLyApIC0+IGFyYzQuVHVwbGVbYXJjNC5VSW50NjQsIGFyYzQuVUludDY0XToKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzg5CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5MAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDcgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzkzCiAgICAvLyBjbG9zZWRfdW5pdHMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3OTQKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BQ0NPVU5UICsgaG9sZGluZ19hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3OTUKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgLT0gY2xvc2VkX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjYKICAgIC8vIGlmIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgPT0gMDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGJueiBjbG9zZV9hY2NvdW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzY3CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0VOREVEKQogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgaW50YyA0IC8vIDIwMAogICAgYXBwX2dsb2JhbF9wdXQKCmNsb3NlX2FjY291bnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzk4CiAgICAvLyAoYXJjNC5VSW50NjQoY2xvc2VkX3VuaXRzKSwgYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApKQogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5Ny03OTkKICAgIC8vIHJldHVybiBhcmM0LlR1cGxlKAogICAgLy8gICAgIChhcmM0LlVJbnQ2NChjbG9zZWRfdW5pdHMpLCBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkpCiAgICAvLyApCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnByaW1hcnlfZGlzdHJpYnV0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiBieXRlcykgLT4gYnl0ZXM6CnByaW1hcnlfZGlzdHJpYnV0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODAxLTgwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcHJpbWFyeV9kaXN0cmlidXRpb24oCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHVuaXRzOiBhcmM0LlVJbnQ2NAogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDQKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMCAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODktMjkyCiAgICAvLyBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTAKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkxCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5MC0yOTEKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTAtMjkyCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5MgogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkxLTI5MgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGZyYW1lX2RpZyAyCiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTAtMjkyCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODgtMjkzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyAgICAgYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU0VECiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgY2xvc2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICBieXRlYyAyNSAvLyAweDUyMzUzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzQKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzYtMTM5CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzcKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGVhbGVyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzgKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzctMTM4CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzctMTM5CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kZWFsZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzOC0xMzkKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNy0xMzkKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMgogICAgaW50Y18xIC8vIDEKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzUtMTQwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICAvLyAgICAgYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA3IC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyOQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzAKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMxCiAgICAvLyBhc3NlcnQgdW5pdHMubmF0aXZlID4gMCwgZXJyLlpFUk9fVU5JVFMKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICBhc3NlcnQgLy8gQ2FuIG5vdCBkaXN0cmlidXRlIHplcm8gdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMwogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyArIHVuaXRzLm5hdGl2ZSA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMi04MzQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5jaXJjdWxhdGluZ191bml0cyArIHVuaXRzLm5hdGl2ZSA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICAvLyApLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzYKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKz0gdW5pdHMubmF0aXZlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM3LTgzOQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM3LTgzOQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIC8vICkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDMyCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gYXJjNC5VSW50NjQoc2VsZi51bml0X3ZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgIGl0b2IKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmVwbGFjZTIgNDAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0MQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMgLSBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgLQogICAgaXRvYgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTI6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDEzCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfYXNzZXRfc3VzcGVuc2lvbihzdXNwZW5kZWQ6IGJ5dGVzKSAtPiBieXRlczoKc2V0X2Fzc2V0X3N1c3BlbnNpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDMtODQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfYXNzZXRfc3VzcGVuc2lvbihzZWxmLCBzdXNwZW5kZWQ6IGFyYzQuQm9vbCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg1NwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NTgKICAgIC8vIHNlbGYuc3VzcGVuZGVkID0gVUludDY0KHN1c3BlbmRlZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ5dGVjIDE5IC8vICJzdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODU5CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUyLTE1MwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIGJ5dGVjIDIzIC8vIDB4NTIzNzMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU2LTE1OQogICAgLy8gY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTcKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdXRob3JpdHkgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1OAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1Ny0xNTgKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTctMTU5CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTkKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdXRob3JpdHkgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1OC0xNTkKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTctMTU5CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU1LTE2MAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIC8vICAgICBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X2FjY291bnRfc3VzcGVuc2lvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBzdXNwZW5kZWQ6IGJ5dGVzKSAtPiBieXRlczoKc2V0X2FjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2MS04NjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9hY2NvdW50X3N1c3BlbnNpb24oCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHN1c3BlbmRlZDogYXJjNC5Cb29sCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NzkKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA3IC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4MQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHB1c2hpbnQgNDQ4IC8vIDQ0OAogICAgc3dhcAogICAgc2V0Yml0CiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODIKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnNldF9kZWZhdWx0X3N0YXR1cyhkZWZhdWx0ZWQ6IGJ5dGVzKSAtPiB2b2lkOgpzZXRfZGVmYXVsdF9zdGF0dXM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODQtODg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfZGVmYXVsdF9zdGF0dXMoc2VsZiwgZGVmYXVsdGVkOiBhcmM0LkJvb2wpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIGJ5dGVjIDI0IC8vIDB4NTIzNjMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Ni0xNDkKICAgIC8vIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cnVzdGVlIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDgKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDctMTQ4CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Ny0xNDkKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0OQogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cnVzdGVlIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDgtMTQ5CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Ny0xNDkKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgpzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ1LTE1MAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICAvLyAgICAgYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5NgogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBVSW50NjQoZGVmYXVsdGVkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgYnl0ZWMgMjAgLy8gImRlZmF1bHRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCnNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9tZXJnZUA2CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X2Fzc2V0X2luZm8oKSAtPiBieXRlczoKZ2V0X2Fzc2V0X2luZm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTgtODk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfaW5mbyhzZWxmKSAtPiB0eXAuQXNzZXRJbmZvOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDgKICAgIC8vIHBlcmZvcm1hbmNlID0gVUludDY0KGNzdC5QUkZfUEVSRk9STUFOVCkKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwOQogICAgLy8gaWYgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBzZWxmLm1hdHVyaXR5X2RhdGUgPiAwOgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb3ZlciA0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPgogICAgYnogZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUAzCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgMQogICAgYnogZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTAKICAgIC8vIHBlcmZvcm1hbmNlID0gVUludDY0KGNzdC5QUkZfTUFUVVJFRCkKICAgIGludGNfMyAvLyA0CiAgICBmcmFtZV9idXJ5IDIKCmdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VAMzoKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMS05MTIKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgbm8gZ3JhY2Ugb3IgZGVsaW5xdWVuY3kgcGVyaW9kcwogICAgLy8gaWYgc2VsZi5kZWZhdWx0ZWQ6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImRlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZWZhdWx0ZWQgZXhpc3RzCiAgICBieiBnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMwogICAgLy8gcGVyZm9ybWFuY2UgPSBVSW50NjQoY3N0LlBSRl9ERUZBVUxURUQpCiAgICBwdXNoaW50IDMgLy8gMwogICAgZnJhbWVfYnVyeSAwCgpnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTYKICAgIC8vIGRlbm9taW5hdGlvbl9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNwogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDAKICAgIC8vIHJldHVybiBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE4CiAgICAvLyBvdXRzdGFuZGluZ19wcmluY2lwYWw9YXJjNC5VSW50NjQoc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwoKSksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTkKICAgIC8vIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoc2VsZi51bml0X3ZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjAKICAgIC8vIGRheV9jb3VudF9jb252ZW50aW9uPWFyYzQuVUludDgoc2VsZi5kYXlfY291bnRfY29udmVudGlvbiksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgaXRvYgogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyMQogICAgLy8gcHJpbmNpcGFsX2Rpc2NvdW50PWFyYzQuVUludDE2KHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50KSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjIKICAgIC8vIGludGVyZXN0X3JhdGU9YXJjNC5VSW50MTYoc2VsZi5pbnRlcmVzdF9yYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMSAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyMwogICAgLy8gdG90YWxfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTI0CiAgICAvLyBjaXJjdWxhdGluZ19zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi5jaXJjdWxhdGluZ191bml0cyksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjUtOTI3CiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjkKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjgtOTMwCiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzEKICAgIC8vIGlzc3VhbmNlX2RhdGU9YXJjNC5VSW50NjQoc2VsZi5pc3N1YW5jZV9kYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTMyCiAgICAvLyBtYXR1cml0eV9kYXRlPWFyYzQuVUludDY0KHNlbGYubWF0dXJpdHlfZGF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTMzCiAgICAvLyBzdXNwZW5kZWQ9YXJjNC5Cb29sKGJvb2woc2VsZi5zdXNwZW5kZWQpKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN1c3BlbmRlZCBleGlzdHMKICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNAogICAgLy8gcGVyZm9ybWFuY2U9YXJjNC5VSW50OChwZXJmb3JtYW5jZSksCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNS05MzUKICAgIC8vIHJldHVybiB0eXAuQXNzZXRJbmZvKAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCksCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLAogICAgLy8gICAgIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCgpKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSksCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIC8vICAgICBwcmluY2lwYWxfZGlzY291bnQ9YXJjNC5VSW50MTYoc2VsZi5wcmluY2lwYWxfZGlzY291bnQpLAogICAgLy8gICAgIGludGVyZXN0X3JhdGU9YXJjNC5VSW50MTYoc2VsZi5pbnRlcmVzdF9yYXRlKSwKICAgIC8vICAgICB0b3RhbF9zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi50b3RhbF91bml0cyksCiAgICAvLyAgICAgY2lyY3VsYXRpbmdfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMpLAogICAgLy8gICAgIHByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICApLAogICAgLy8gICAgIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIC8vICAgICApLAogICAgLy8gICAgIGlzc3VhbmNlX2RhdGU9YXJjNC5VSW50NjQoc2VsZi5pc3N1YW5jZV9kYXRlKSwKICAgIC8vICAgICBtYXR1cml0eV9kYXRlPWFyYzQuVUludDY0KHNlbGYubWF0dXJpdHlfZGF0ZSksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbChib29sKHNlbGYuc3VzcGVuZGVkKSksCiAgICAvLyAgICAgcGVyZm9ybWFuY2U9YXJjNC5VSW50OChwZXJmb3JtYW5jZSksCiAgICAvLyApCiAgICB1bmNvdmVyIDE0CiAgICB1bmNvdmVyIDE0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X2FjY291bnRfaW5mbyhob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2FjY291bnRfaW5mbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNy05MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hY2NvdW50X2luZm8oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MpIC0+IHR5cC5BY2NvdW50SW5mbzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA3IC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1MgogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X3RpbWVfZXZlbnRzKCkgLT4gYnl0ZXM6CmdldF90aW1lX2V2ZW50czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1NC05NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF90aW1lX2V2ZW50cyhzZWxmKSAtPiB0eXAuVGltZUV2ZW50czoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTYyCiAgICAvLyB0aW1lX2V2ZW50cyA9IHR5cC5UaW1lRXZlbnRzKCkKICAgIHB1c2hieXRlcyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2MwogICAgLy8gaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCk6CiAgICBieiBnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NjQKICAgIC8vIHRpbWVfZXZlbnRzID0gc2VsZi50aW1lX2V2ZW50cy52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDIyIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9ldmVudHMgZXhpc3RzCgpnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTY1CiAgICAvLyByZXR1cm4gdGltZV9ldmVudHMKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSgpIC0+IGJ5dGVzOgpnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2Ny05NjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlKHNlbGYpIC0+IHR5cC5UaW1lRXZlbnRzOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NzYKICAgIC8vIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk3NwogICAgLy8gYXJjNC5VSW50NjQoc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTc1LTk3OAogICAgLy8gcmV0dXJuIHR5cC5UaW1lRXZlbnRzKAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUpLAogICAgLy8gKQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hc3NldF9tZXRhZGF0YSgpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbWV0YWRhdGE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5ODAtOTgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbWV0YWRhdGEoc2VsZikgLT4gdHlwLkFzc2V0TWV0YWRhdGE6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk4OQogICAgLy8gcmV0dXJuIHR5cC5Bc3NldE1ldGFkYXRhLmZyb21fYnl0ZXMoc2VsZi5tZXRhZGF0YSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAibWV0YWRhdGEiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWV0YWRhdGEgZXhpc3RzCiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"}}""" +_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA Arranger Address", "name": "arranger"}, {"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "desc": "D-ASA metadata", "name": "metadata", "struct": "AssetMetadata"}], "name": "asset_create", "returns": {"type": "void"}, "desc": "Create a new D-ASA", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [{"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "name": "metadata", "struct": "AssetMetadata"}], "name": "asset_update", "returns": {"type": "void"}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Denomination asset identifier", "name": "denomination_asset_id"}, {"type": "uint64", "desc": "Settlement asset identifier", "name": "settlement_asset_id"}, {"type": "uint64", "desc": "Principal, expressed in denomination asset", "name": "principal"}, {"type": "uint64", "desc": "Principal discount in bps", "name": "principal_discount"}, {"type": "uint64", "desc": "Minimum denomination, expressed in denomination asset", "name": "minimum_denomination"}, {"type": "uint8", "desc": "Day-count convention for interests calculation", "name": "day_count_convention"}, {"type": "uint16", "desc": "Interest rate in bps", "name": "interest_rate"}, {"type": "uint16[]", "desc": "Coupon interest rates in bps", "name": "coupon_rates"}, {"type": "uint64[]", "desc": "Time events (strictly ascending order)", "name": "time_events"}, {"type": "(uint64,uint64)[]", "desc": "Time periods of recurring time events", "name": "time_periods"}], "name": "asset_config", "returns": {"type": "void"}, "desc": "Configure the Debt Algorand Standard Application", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64[]", "desc": "Secondary market time events (strictly ascending order)", "name": "secondary_market_time_events"}], "name": "set_secondary_time_events", "returns": {"type": "(uint64,uint64)", "desc": "Secondary Market Opening Date, Secondary Market Closure Date", "struct": "SecondaryMarketSchedule"}, "desc": "Set secondary market time schedule", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "uint8", "desc": "Role identifier", "name": "role"}, {"type": "byte[]", "desc": "Role configuration (Optional)", "name": "config"}], "name": "assign_role", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Assign a role to an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "uint8", "desc": "Role identifier", "name": "role"}], "name": "revoke_role", "returns": {"type": "uint64", "desc": "Timestamp of the role revocation"}, "desc": "Revoke a role from an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "open_account", "returns": {"type": "uint64", "desc": "Timestamp of the account opening"}, "desc": "Open D-ASA account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "close_account", "returns": {"type": "(uint64,uint64)", "desc": "Closed units, Timestamp of the account closing"}, "desc": "Close D-ASA account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "uint64", "desc": "Amount of D-ASA units to distribute", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64", "desc": "Remaining D-ASA units to be distributed"}, "desc": "Distribute D-ASA units to accounts according the primary market", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "set_asset_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set asset suspension status"}, "desc": "Set asset suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "set_account_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set account suspension status"}, "desc": "Set account suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Default status", "name": "defaulted"}], "name": "set_default_status", "returns": {"type": "void"}, "desc": "Set D-ASA default status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_asset_info", "returns": {"type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Performance", "struct": "AssetInfo"}, "desc": "Get D-ASA info", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "get_account_info", "returns": {"type": "(address,uint64,uint64,uint64,bool)", "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended", "struct": "AccountInfo"}, "desc": "Get account info", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_time_events", "returns": {"type": "uint64[]", "desc": "Time events"}, "desc": "Get D-ASA time events", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_secondary_market_schedule", "returns": {"type": "uint64[]", "desc": "Secondary market schedule"}, "desc": "Get secondary market schedule", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_asset_metadata", "returns": {"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "desc": "Contract type, Calendar, Business day convention, End of month convention, Early repayment effect, Early repayment penalty type, Prospectus hash, Prospectus URL", "struct": "AssetMetadata"}, "desc": "Get D-ASA metadata", "events": [], "readonly": true, "recommendations": {}}], "name": "BaseDAsa", "state": {"keys": {"box": {"coupon_rates": {"key": "Y291cG9uUmF0ZXM=", "keyType": "AVMBytes", "valueType": "uint16[]"}, "time_events": {"key": "dGltZUV2ZW50cw==", "keyType": "AVMBytes", "valueType": "uint64[]"}, "time_periods": {"key": "dGltZVBlcmlvZHM=", "keyType": "AVMBytes", "valueType": "(uint64,uint64)[]"}}, "global": {"arranger": {"key": "UjIwIw==", "keyType": "AVMBytes", "valueType": "AVMBytes"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "unit_value": {"key": "dW5pdF92YWx1ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "metadata": {"key": "bWV0YWRhdGE=", "keyType": "AVMString", "valueType": "AVMBytes"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "circulating_units": {"key": "Y2lyY3VsYXRpbmdfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "principal_discount": {"key": "cHJpbmNpcGFsX2Rpc2NvdW50", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_rate": {"key": "aW50ZXJlc3RfcmF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_coupons": {"key": "dG90YWxfY291cG9ucw==", "keyType": "AVMString", "valueType": "AVMUint64"}, "primary_distribution_opening_date": {"key": "cHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "primary_distribution_closure_date": {"key": "cHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "issuance_date": {"key": "aXNzdWFuY2VfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "secondary_market_opening_date": {"key": "c2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU=", "keyType": "AVMString", "valueType": "AVMUint64"}, "secondary_market_closure_date": {"key": "c2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU=", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "suspended": {"key": "c3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "defaulted": {"key": "ZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjQwIw=="}, "primary_dealer": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjUwIw=="}, "trustee": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjYwIw=="}, "authority": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjcwIw=="}, "interest_oracle": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjgwIw=="}, "account": {"keyType": "address", "valueType": "AccountInfo", "prefix": "UjMwIw=="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 2, "ints": 18}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AccountInfo": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "unit_value", "type": "uint64"}, {"name": "paid_coupons", "type": "uint64"}, {"name": "suspended", "type": "bool"}], "AssetInfo": [{"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "unit_value", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "principal_discount", "type": "uint16"}, {"name": "interest_rate", "type": "uint16"}, {"name": "total_supply", "type": "uint64"}, {"name": "circulating_supply", "type": "uint64"}, {"name": "primary_distribution_opening_date", "type": "uint64"}, {"name": "primary_distribution_closure_date", "type": "uint64"}, {"name": "issuance_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "performance", "type": "uint8"}], "AssetMetadata": [{"name": "contract_type", "type": "uint8"}, {"name": "calendar", "type": "uint8"}, {"name": "business_day_convention", "type": "uint8"}, {"name": "end_of_month_convention", "type": "uint8"}, {"name": "prepayment_effect", "type": "uint8"}, {"name": "penalty_type", "type": "uint8"}, {"name": "prospectus_hash", "type": "byte[32]"}, {"name": "prospectus_url", "type": "string"}], "RoleConfig": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}], "SecondaryMarketSchedule": [{"name": "secondary_market_opening_date", "type": "uint64"}, {"name": "secondary_market_closure_date", "type": "uint64"}]}, "byteCode": {"approval": "CiAFAAEIBMgBJh8EFR98dRFjaXJjdWxhdGluZ191bml0cwZzdGF0dXMNbWF0dXJpdHlfZGF0ZQp1bml0X3ZhbHVlC3RvdGFsX3VuaXRzDXRvdGFsX2NvdXBvbnMEUjMwIwRSMjAjFWRlbm9taW5hdGlvbl9hc3NldF9pZBNzZXR0bGVtZW50X2Fzc2V0X2lkFGRheV9jb3VudF9jb252ZW50aW9uCG1ldGFkYXRhEnByaW5jaXBhbF9kaXNjb3VudCFwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUhcHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlDWlzc3VhbmNlX2RhdGUdc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUdc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUJc3VzcGVuZGVkCWRlZmF1bHRlZA1pbnRlcmVzdF9yYXRlCnRpbWVFdmVudHMEUjcwIwRSNjAjBFI1MCMEUjQwIwgAAAAAAAAAAAtjb3Vwb25SYXRlcwMGgQEEUjgwIzEYQABPJwgyA2cnCSJnJwoiZycEImcnCyJnJwyAAGcnBSJnKSJnJw0iZycVImcnBiJnJw4iZycPImcnECJnJxEiZycSImcrImcqImcnEyJnJxQiZzEbQQB+ghEEPw78bAQl26lbBIlHQTQEHW/CVQT+90VnBLj8E5AEPUPR8ATr2WsvBGyF4+4E9jrOjQS7zKGKBBp7q7QEQC26RwTtAnWfBPrSFz4ECO/qNQTkpatUNhoAjhEBSAE4AQ4A+wDiAMwAtgCjAI0AegBkAFUARQAyACIAEgACIkMxGRREMRhEiAgyKExQsCNDMRkURDEYRIgICyhMULAjQzEZFEQxGESIB98oTFCwI0MxGRREMRhENhoBiAe8KExQsCNDMRkURDEYRIgG4ShMULAjQzEZFEQxGEQ2GgGIBpEjQzEZFEQxGEQ2GgE2GgKIBl4oTFCwI0MxGRREMRhENhoBiAYEKExQsCNDMRkURDEYRDYaATYaAogFLihMULAjQzEZFEQxGEQ2GgGIBN8oTFCwI0MxGRREMRhENhoBNhoCiARVKExQsCNDMRkURDEYRDYaATYaAogDoyhMULAjQzEZFEQxGEQ2GgE2GgI2GgOIAsIoTFCwI0MxGRREMRhENhoBiAIpKExQsCNDMRkURDEYRDYaATYaAjYaAzYaBDYaBTYaBjYaBzYaCDYaCTYaCogATCNDMRklEkQxGEQ2GgGIACMjQzEZFEQxGBRENhoBNhoCiAACI0OKAgAnCIv+ZycMi/9niYoBAIgABicMi/9niYoAADEAIicIZUQSRImKCgAigABHAoj/6CIqZUQURIv2F0lBAQ2LBHELRDIDE0EBAiNEJwmLBGeL9xciJwllREsBEkQnCkxnsTIAIicKZUQyCiKyErIUshElshCyAbOL+BeL+hdKGBREJwRLAWcKJwVMZ4v5FycNTGeL+xdJjAFBAAmLAYH/ARJBAKMjRCcLiwFni/wXjAIiJw1lREAAA4sCRCcViwJni/0iWUkURCcGTGciJwZlREEACSccvEgnHIv9v4v+IlkiJwZlRCUIEkSL/ogAYYz+Jxa8SCcWi/6/i/5XAgBJjABJVwAIFycOTGdJVwgIFycPTGdXEAgXJxBMZ4v+IllJjAMiJwZlRCUIEkEAD4sDIwkkC4sATCRYFytMZ4v/IlkURCqBZGeJIkL/WiJC/vuKAQGAAEmL/1cCAElXAAgXMgcNRIv/IlkjCSKLBIsDDEEAXoFLMgwNQQAZsYEGshCBBbIZJx2yHicdsh8yALIBs0L/34sESSQLiwJJTgNMJFgXSU4DjAEjCEmMBCQLJFgXSYwADEQiJwtlRIH/ARNB/6mLAIsBCYGAowUYFERC/5qL/4wAiYoBASKI/j0iKmVEIQQSFESIAGiL/yJZSUQjDYv/TEEACov/iP9USYz/jAGLAYz/IicQZUSL/1cCAEmMAFcACBdMSwEORCcRTGciK2VEQQAbIitlRIv/IlkjCSQLiwBMJFgXTEsBD0QnEkxnIicRZUQWIicSZUQWUIwAiYoAACInFGVEFESJigMBiP24iP/si/4XSYEUEkAAKIsAgSgSQAAgiwCBMhJAABiLAIE8EkAAEIsAgUYSQAAIiwCBUBJBAIkjRIMGFCgyPEZQiwCOBgBnAFMAPwArABcAAQAnHov9UEm9RQEURIv/VwIAvzIHFkyJJxeL/VBJvUUBFESL/1cCAL9C/+cnGIv9UEm9RQEURIv/VwIAv0L/0ycZi/1QSb1FARREi/9XAgC/Qv+/JxqL/VBJvUUBFESL/1cCAL9C/6snCIv9Z0L/oyJC/3SKAgGI/PCI/ySL/xdJgSgSQAAgiwCBMhJAABiLAIE8EkAAEIsAgUYSQAAIiwCBUBJBAGUjRIMFKDI8RlCLAI4FAD8AMAAhABIAAQAnHov+UEm9RQFEvEgyBxZMiScXi/5QSb1FAUS8SEL/7CcYi/5QSb1FAUS8SEL/3ScZi/5QSb1FAUS8SEL/zicai/5QSb1FAUS8SEL/vyJC/5iKAgGIAC4iKmVEIQQSFESI/n+IAFQnB4v+UEm9RQEURIv/JxtQJxtQJxtQgAEAUL8yBxaJigAAIicaMQBQSb1FAUEAIYsBvkRXAAgyBxZJjACmQQAQiwG+RFcICIsAp0EAAyNEiSJC//qKAAAiJxNlRBREiYoBAYj/uoj+FCcHi/9QSb1FAURJvkRXIAgXSU8CvEgiKWVETAkpTGciKWVEQAAEKiEEZ4sAFjIHFlBMiYoCASJJgAAiKmVEgWQSQQCrIicOZUQyB0mMAg5BAJ0iJw9lRIsCDUEAkiNEJxkxAFBJjAC9RQFBAH6LAL5EVwAIMgcWSYwBpkEAbYsAvkRXCAiLAadBAGAjRCcHi/5QSb1FAUSI/XqI/0+L/xdJRCIpZURLAQgiJwVlRA5EIillREsBCClMZ0sBvkRXIAgXCBZLAb5ETFwgSwFMvyInBGVEFksBvkRMXCi/IicFZUQiKWVECRaMAIkiQv+dIkL/a4oBAYgADIv/IlMnE0xnMgcWiYoAACInFzEAUEm9RQFBACGLAb5EVwAIMgcWSYwApkEAEIsBvkRXCAiLAKdBAAMjRIkiQv/6igIBiP/FJweL/lBJvUUBREm+RIv/IlOBwANMVL8yBxaJigEAIicYMQBQSb1FAUEAKYsBvkRXAAgyBxZJjACmQQAYiwG+RFcICIsAp0EACyNEi/8iUycUTGeJIkL/8ooAASJJMgciK2VMSU4CTgREDUEADIsAjAKLAUEAAyWMAosCjAAiJxRlREEABIEDjAAiJwllRBYiJwplRBYiKWVEIicEZUQLFiInBGVEFiInC2VEFlcHASInDWVEFlcGAiInFWVEFlcGAiInBWVEFiIpZUQWIicOZUQWIicPZUQWIicQZUQWIitlRBYiJxNlRIABACJPAlSLABZXBwFPDk8OUE8NUE8MUE8LUE8KUE8JUE8IUE8HUE8GUE8FUE8EUE8DUE8CUExQjACJigEBJweL/1BJvUUBRL5EiYoAAYACAAAiKmVEgWQSQQAHJxa+TIwARIsATImKAAEiJxFlRBYiJxJlRBZQgAIAAkxQiYoAASInDGVEiQ==", "clear": "CoEBQw=="}, "compilerInfo": {"compiler": "puya", "compilerVersion": {"major": 4, "minor": 2, "patch": 1}}, "desc": "\n Base D-ASA Class implementing common interfaces and state schema:\n\n - Asset creation and configuration\n - Role-based access control\n - Account management (creation, suspension, close-out)\n - Time schedule with no coupons and maturity date\n - Primary distribution\n - Getters (asset info, account info, time events)\n ", "events": [], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCA0IDIwMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJjaXJjdWxhdGluZ191bml0cyIgInN0YXR1cyIgIm1hdHVyaXR5X2RhdGUiICJ1bml0X3ZhbHVlIiAidG90YWxfdW5pdHMiICJ0b3RhbF9jb3Vwb25zIiAweDUyMzMzMDIzIDB4NTIzMjMwMjMgImRlbm9taW5hdGlvbl9hc3NldF9pZCIgInNldHRsZW1lbnRfYXNzZXRfaWQiICJkYXlfY291bnRfY29udmVudGlvbiIgIm1ldGFkYXRhIiAicHJpbmNpcGFsX2Rpc2NvdW50IiAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIiAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIiAiaXNzdWFuY2VfZGF0ZSIgInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIiAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiICJzdXNwZW5kZWQiICJkZWZhdWx0ZWQiICJpbnRlcmVzdF9yYXRlIiAweDc0Njk2ZDY1NDU3NjY1NmU3NDczIDB4NTIzNzMwMjMgMHg1MjM2MzAyMyAweDUyMzUzMDIzIDB4NTIzNDMwMjMgMHgwMDAwMDAwMDAwMDAwMDAwIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MyAweDA2ODEwMSAweDUyMzgzMDIzCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MS00MgogICAgLy8gIyBSb2xlIEJhc2VkIEFjY2VzcyBDb250cm9sCiAgICAvLyBzZWxmLmFycmFuZ2VyID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9BUlJBTkdFUikKICAgIGJ5dGVjIDggLy8gMHg1MjMyMzAyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTktNjAKICAgIC8vICMgQXNzZXQgQ29uZmlndXJhdGlvbgogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBVSW50NjQoKQogICAgYnl0ZWMgOSAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MQogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkID0gVUludDY0KCkKICAgIGJ5dGVjIDEwIC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MgogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gInVuaXRfdmFsdWUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDExIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUtNjYKICAgIC8vICMgTWV0YWRhdGEKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBCeXRlcygpCiAgICBieXRlYyAxMiAvLyAibWV0YWRhdGEiCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OC02OQogICAgLy8gIyBTdXBwbHkKICAgIC8vIHNlbGYudG90YWxfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWMgNSAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwCiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3Mi03MwogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50ID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJwcmluY2lwYWxfZGlzY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1LTc2CiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmludGVyZXN0X3JhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMjEgLy8gImludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgwCiAgICAvLyBzZWxmLnRvdGFsX2NvdXBvbnMgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAidG90YWxfY291cG9ucyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODUKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDE0IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NwogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDE2IC8vICJpc3N1YW5jZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OAogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNyAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDE4IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlY18zIC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5Mi05MwogICAgLy8gIyBTdGF0dXMKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGNmZy5TVEFUVVNfRU1QVFkpCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBzZWxmLnN1c3BlbmRlZCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxOSAvLyAic3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NQogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gImRlZmF1bHRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2FmdGVyX2lmX2Vsc2VAMjIKICAgIHB1c2hieXRlc3MgMHgzZjBlZmM2YyAweDI1ZGJhOTViIDB4ODk0NzQxMzQgMHgxZDZmYzI1NSAweGZlZjc0NTY3IDB4YjhmYzEzOTAgMHgzZDQzZDFmMCAweGViZDk2YjJmIDB4NmM4NWUzZWUgMHhmNjNhY2U4ZCAweGJiY2NhMThhIDB4MWE3YmFiYjQgMHg0MDJkYmE0NyAweGVkMDI3NTlmIDB4ZmFkMjE3M2UgMHgwOGVmZWEzNSAweGU0YTVhYjU0IC8vIG1ldGhvZCAiYXNzZXRfY3JlYXRlKGFkZHJlc3MsKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LGJ5dGVbMzJdLHN0cmluZykpdm9pZCIsIG1ldGhvZCAiYXNzZXRfdXBkYXRlKCh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCxieXRlWzMyXSxzdHJpbmcpKXZvaWQiLCBtZXRob2QgImFzc2V0X2NvbmZpZyh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQxNix1aW50MTZbXSx1aW50NjRbXSwodWludDY0LHVpbnQ2NClbXSl2b2lkIiwgbWV0aG9kICJzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKHVpbnQ2NFtdKSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiYXNzaWduX3JvbGUoYWRkcmVzcyx1aW50OCxieXRlW10pdWludDY0IiwgbWV0aG9kICJyZXZva2Vfcm9sZShhZGRyZXNzLHVpbnQ4KXVpbnQ2NCIsIG1ldGhvZCAib3Blbl9hY2NvdW50KGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImNsb3NlX2FjY291bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAic2V0X2Fzc2V0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInNldF9hY2NvdW50X3N1c3BlbnNpb24oYWRkcmVzcyxib29sKXVpbnQ2NCIsIG1ldGhvZCAic2V0X2RlZmF1bHRfc3RhdHVzKGJvb2wpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2luZm8oKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQxNix1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X2FjY291bnRfaW5mbyhhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wpIiwgbWV0aG9kICJnZXRfdGltZV9ldmVudHMoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSgpdWludDY0W10iLCBtZXRob2QgImdldF9hc3NldF9tZXRhZGF0YSgpKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LGJ5dGVbMzJdLHN0cmluZykiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2Fzc2V0X2NyZWF0ZV9yb3V0ZUA1IG1haW5fYXNzZXRfdXBkYXRlX3JvdXRlQDYgbWFpbl9hc3NldF9jb25maWdfcm91dGVANyBtYWluX3NldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfcm91dGVAOCBtYWluX2Fzc2lnbl9yb2xlX3JvdXRlQDkgbWFpbl9yZXZva2Vfcm9sZV9yb3V0ZUAxMCBtYWluX29wZW5fYWNjb3VudF9yb3V0ZUAxMSBtYWluX2Nsb3NlX2FjY291bnRfcm91dGVAMTIgbWFpbl9wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9yb3V0ZUAxMyBtYWluX3NldF9hc3NldF9zdXNwZW5zaW9uX3JvdXRlQDE0IG1haW5fc2V0X2FjY291bnRfc3VzcGVuc2lvbl9yb3V0ZUAxNSBtYWluX3NldF9kZWZhdWx0X3N0YXR1c19yb3V0ZUAxNiBtYWluX2dldF9hc3NldF9pbmZvX3JvdXRlQDE3IG1haW5fZ2V0X2FjY291bnRfaW5mb19yb3V0ZUAxOCBtYWluX2dldF90aW1lX2V2ZW50c19yb3V0ZUAxOSBtYWluX2dldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlX3JvdXRlQDIwIG1haW5fZ2V0X2Fzc2V0X21ldGFkYXRhX3JvdXRlQDIxCgptYWluX2FmdGVyX2lmX2Vsc2VAMjI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21ldGFkYXRhX3JvdXRlQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYXNzZXRfbWV0YWRhdGEKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGVfcm91dGVAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF90aW1lX2V2ZW50c19yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X3RpbWVfZXZlbnRzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hY2NvdW50X2luZm9fcm91dGVAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hY2NvdW50X2luZm8KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2luZm9fcm91dGVAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hc3NldF9pbmZvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9kZWZhdWx0X3N0YXR1c19yb3V0ZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBjbGFzcyBCYXNlREFzYShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X2RlZmF1bHRfc3RhdHVzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9hY2NvdW50X3N1c3BlbnNpb25fcm91dGVAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9hY2NvdW50X3N1c3BlbnNpb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0X2Fzc2V0X3N1c3BlbnNpb25fcm91dGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9hc3NldF9zdXNwZW5zaW9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3ByaW1hcnlfZGlzdHJpYnV0aW9uX3JvdXRlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODAxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jbG9zZV9hY2NvdW50X3JvdXRlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBjbG9zZV9hY2NvdW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX29wZW5fYWNjb3VudF9yb3V0ZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBjbGFzcyBCYXNlREFzYShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgb3Blbl9hY2NvdW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3Jldm9rZV9yb2xlX3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2ODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiByZXZva2Vfcm9sZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NpZ25fcm9sZV9yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NpZ25fcm9sZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzZXRfY29uZmlnX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0ODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0ODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NldF9jb25maWcKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzZXRfdXBkYXRlX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMyAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IFVwZGF0ZUFwcGxpY2F0aW9uCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBjbGFzcyBCYXNlREFzYShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBjYWxsc3ViIGFzc2V0X3VwZGF0ZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF9jcmVhdGVfcm91dGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgY2FsbHN1YiBhc3NldF9jcmVhdGUKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NldF9jcmVhdGUoYXJyYW5nZXI6IGJ5dGVzLCBtZXRhZGF0YTogYnl0ZXMpIC0+IHZvaWQ6CmFzc2V0X2NyZWF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2MS00NjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgLy8gZGVmIGFzc2V0X2NyZWF0ZShzZWxmLCBhcnJhbmdlcjogYXJjNC5BZGRyZXNzLCBtZXRhZGF0YTogdHlwLkFzc2V0TWV0YWRhdGEpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3MAogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IGFycmFuZ2VyLm5hdGl2ZQogICAgYnl0ZWMgOCAvLyAweDUyMzIzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzEKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YS5ieXRlcwogICAgYnl0ZWMgMTIgLy8gIm1ldGFkYXRhIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXRfdXBkYXRlKG1ldGFkYXRhOiBieXRlcykgLT4gdm9pZDoKYXNzZXRfdXBkYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDczLTQ3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIGFzc2V0X3VwZGF0ZShzZWxmLCBtZXRhZGF0YTogdHlwLkFzc2V0TWV0YWRhdGEpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3OC00ODEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgZGlzYWJsZSBELUFTQSBhcHBsaWNhdGlvbiB1cGRhdGFiaWxpdHkgb3IgY2hhbmdlIGl0cyBhdXRob3JpemF0aW9ucy4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleSBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ4MgogICAgLy8gc2VsZi5tZXRhZGF0YSA9IG1ldGFkYXRhLmJ5dGVzCiAgICBieXRlYyAxMiAvLyAibWV0YWRhdGEiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExOC0xMTkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYuYXJyYW5nZXIudmFsdWUsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vIDB4NTIzMjMwMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2V0X2NvbmZpZyhkZW5vbWluYXRpb25fYXNzZXRfaWQ6IGJ5dGVzLCBzZXR0bGVtZW50X2Fzc2V0X2lkOiBieXRlcywgcHJpbmNpcGFsOiBieXRlcywgcHJpbmNpcGFsX2Rpc2NvdW50OiBieXRlcywgbWluaW11bV9kZW5vbWluYXRpb246IGJ5dGVzLCBkYXlfY291bnRfY29udmVudGlvbjogYnl0ZXMsIGludGVyZXN0X3JhdGU6IGJ5dGVzLCBjb3Vwb25fcmF0ZXM6IGJ5dGVzLCB0aW1lX2V2ZW50czogYnl0ZXMsIHRpbWVfcGVyaW9kczogYnl0ZXMpIC0+IHZvaWQ6CmFzc2V0X2NvbmZpZzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ4NC00OTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2V0X2NvbmZpZygKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgcHJpbmNpcGFsOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBwcmluY2lwYWxfZGlzY291bnQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIG1pbmltdW1fZGVub21pbmF0aW9uOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBkYXlfY291bnRfY29udmVudGlvbjogYXJjNC5VSW50OCwKICAgIC8vICAgICBpbnRlcmVzdF9yYXRlOiBhcmM0LlVJbnQxNiwKICAgIC8vICAgICBjb3Vwb25fcmF0ZXM6IHR5cC5Db3Vwb25SYXRlcywKICAgIC8vICAgICB0aW1lX2V2ZW50czogdHlwLlRpbWVFdmVudHMsCiAgICAvLyAgICAgdGltZV9wZXJpb2RzOiB0eXAuVGltZVBlcmlvZHMsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAxMCAwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUyNwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTI4CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTVBUWSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzAtNTMxCiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuYXNzZXJ0X2Rlbm9taW5hdGlvbl9hc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xMAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODAKICAgIC8vIGRlbm9taW5hdGlvbl9hc3NldF9pZCAhPSBVSW50NjQoMCkgYW5kIEFzc2V0KGRlbm9taW5hdGlvbl9hc3NldF9pZCkuY3JlYXRvcgogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANAogICAgZnJhbWVfZGlnIDQKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBhc3NldF9jb25maWdfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3OC0xODEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gZGVub21pbmF0aW9uIHdpdGggQVNBCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZCAhPSBVSW50NjQoMCkgYW5kIEFzc2V0KGRlbm9taW5hdGlvbl9hc3NldF9pZCkuY3JlYXRvcgogICAgLy8gKSwgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBkZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGJ5dGVjIDkgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGZyYW1lX2RpZyA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTM0LTUzNQogICAgLy8gIyBTZXQgRGVub21pbmF0aW9uIEFzc2V0CiAgICAvLyBzZWxmLmFzc2VydF9zZXR0bGVtZW50X2Fzc2V0KHNldHRsZW1lbnRfYXNzZXRfaWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC05CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTEKICAgIC8vIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkIGV4aXN0cwogICAgZGlnIDEKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODktMTkyCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyAxMCAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTctMjAzCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDIKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTkKICAgIC8vIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDAKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjAxCiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTctMTk4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIGludGNfMyAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5Ny0yMDMKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NDAKICAgIC8vIHByaW5jaXBhbC5uYXRpdmUgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUgPT0gMAogICAgZnJhbWVfZGlnIC04CiAgICBidG9pCiAgICBmcmFtZV9kaWcgLTYKICAgIGJ0b2kKICAgIGR1cDIKICAgICUKICAgICEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUzOC01NDEKICAgIC8vICMgU2V0IFByaW5jaXBhbCBhbmQgTWluaW11bSBEZW5vbWluYXRpb24KICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJpbmNpcGFsLm5hdGl2ZSAlIG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZSA9PSAwCiAgICAvLyApLCBlcnIuSU5WQUxJRF9NSU5JTVVNX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIE1pbmltdW0gZGVub21pbmF0aW9uIGlzIG5vdCBhIGRpdmlzb3Igb2YgcHJpbmNpcGFsCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NDIKICAgIC8vIHNlbGYudW5pdF92YWx1ZSA9IG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZQogICAgYnl0ZWMgNCAvLyAidW5pdF92YWx1ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gcHJpbmNpcGFsLm5hdGl2ZSAvLyBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUKICAgIC8KICAgIGJ5dGVjIDUgLy8gInRvdGFsX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU0NAogICAgLy8gc2VsZi5wcmluY2lwYWxfZGlzY291bnQgPSBwcmluY2lwYWxfZGlzY291bnQubmF0aXZlCiAgICBmcmFtZV9kaWcgLTcKICAgIGJ0b2kKICAgIGJ5dGVjIDEzIC8vICJwcmluY2lwYWxfZGlzY291bnQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQ2LTU0NwogICAgLy8gIyBTZXQgRGF5LUNvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuYXNzZXJ0X2RheV9jb3VudF9jb252ZW50aW9uKGRheV9jb3VudF9jb252ZW50aW9uLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtNQogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNy0yMTEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGZyYW1lX2RpZyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTAKICAgIC8vIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgcHVzaGludCAyNTUgLy8gMjU1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDctMjExCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICA9PQogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmFzc2V0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDctMjExCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICBhc3NlcnQgLy8gSW52YWxpZCBkYXktY291bnQgY29udmVudGlvbiBJRAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjE1CiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIGJ5dGVjIDExIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGZyYW1lX2RpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTUwLTU1MQogICAgLy8gIyBTZXQgSW50ZXJlc3QgUmF0ZQogICAgLy8gc2VsZi5hc3NlcnRfaW50ZXJlc3RfcmF0ZShpbnRlcmVzdF9yYXRlLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtNAogICAgYnRvaQogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTktMjIwCiAgICAvLyAjIFRoaXMgc3Vicm91dGluZSBtdXN0IGJlIHVzZWQgYWZ0ZXIgdGhlIHByaW5jaXBhbCBkaXNjb3VudCBoYXMgYmVlbiBzZXQKICAgIC8vIGlmIG5vdCBzZWxmLnByaW5jaXBhbF9kaXNjb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIGJueiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjIxCiAgICAvLyBhc3NlcnQgaW50ZXJlc3RfcmF0ZSA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfSU5URVJFU1RfUkFURQogICAgZnJhbWVfZGlnIDIKICAgIGFzc2VydCAvLyBJbnRlcmVzdCByYXRlIGlzIG5vdCBwcm9wZXJseSBkZWZpbmVkCgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gc2VsZi5pbnRlcmVzdF9yYXRlID0gaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgMjEgLy8gImludGVyZXN0X3JhdGUiCiAgICBmcmFtZV9kaWcgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyOQogICAgLy8gYXNzZXJ0IG5vdCBjb3Vwb25fcmF0ZXMubGVuZ3RoLCBlcnIuSU5WQUxJRF9DT1VQT05fUkFURVMKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgICEKICAgIGFzc2VydCAvLyBDb3Vwb24gcmF0ZXMgYXJlIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMzMKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IGNvdXBvbl9yYXRlcy5sZW5ndGgKICAgIGJ5dGVjIDYgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjM0CiAgICAvLyBpZiBzZWxmLnRvdGFsX2NvdXBvbnM6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgYnogYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gc2VsZi5jb3Vwb25fcmF0ZXMudmFsdWUgPSBjb3Vwb25fcmF0ZXMuY29weSgpCiAgICBieXRlYyAyOCAvLyAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMjggLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBmcmFtZV9kaWcgLTMKICAgIGJveF9wdXQKCmFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDMyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQwCiAgICAvLyB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIGludGNfMyAvLyA0CiAgICArCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjM5LTI0MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTCiAgICAvLyApLCBlcnIuSU5WQUxJRF9USU1FX0VWRU5UU19MRU5HVEgKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBsZW5ndGggaXMgaW52YWxpZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTYwCiAgICAvLyBzZWxmLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQodGltZV9ldmVudHMpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY1CiAgICAvLyBzZWxmLnRpbWVfZXZlbnRzLnZhbHVlID0gdGltZV9ldmVudHMuY29weSgpCiAgICBieXRlYyAyMiAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDIyIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY2LTI2OAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY2CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTQgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2Ni0yNjgKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY5LTI3MQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGR1cAogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjkKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICBieXRlYyAxNSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY5LTI3MQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzIKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSA9IHRpbWVfZXZlbnRzW2NmZy5JU1NVQU5DRV9EQVRFX0lEWF0ubmF0aXZlCiAgICBleHRyYWN0IDE2IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBieXRlYyAxNiAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzQtMjc1CiAgICAvLyAjIFNvbWUgRC1BU0EgbWF5IG5vdCBoYXZlIGEgbWF0dXJpdHkgZGF0ZSAoZS5nLiwgcGVycGV0dWFscykKICAgIC8vIGlmIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBpbnRjXzMgLy8gNAogICAgKwogICAgPT0KICAgIGJ6IGFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDM4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzYKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRpbWVfZXZlbnRzW2NmZy5NQVRVUklUWV9EQVRFX0lEWF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnl0ZWNfMyAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0Cgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4MAogICAgLy8gYXNzZXJ0IG5vdCB0aW1lX3BlcmlvZHMubGVuZ3RoLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRFMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICAhCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGFyZSBub3QgcHJvcGVybHkgZGVmaW5lZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTY3CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VAMTc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NldF9jb25maWdfYm9vbF9tZXJnZUAxOAoKYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHRpbWVfZXZlbnRzOiBieXRlcykgLT4gYnl0ZXM6CmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDMtMjQ0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQoc2VsZiwgdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzKSAtPiBOb25lOgogICAgcHJvdG8gMSAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ2CiAgICAvLyB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ3CiAgICAvLyA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDYtMjQ3CiAgICAvLyB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0ubmF0aXZlCiAgICAvLyA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDUtMjQ4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXS5uYXRpdmUKICAgIC8vICAgICA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyApLCBlcnIuSU5WQUxJRF9USU1FCiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ5CiAgICAvLyBmb3IgX3QgaW4gdXJhbmdlKHRpbWVfZXZlbnRzLmxlbmd0aCAtIDEpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzAgLy8gMAoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDkKICAgIC8vIGZvciBfdCBpbiB1cmFuZ2UodGltZV9ldmVudHMubGVuZ3RoIC0gMSk6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDMKICAgIDwKICAgIGJ6IGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDYKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfd2hpbGVfdG9wQDg6CiAgICBwdXNoaW50IDc1IC8vIDc1CiAgICBnbG9iYWwgT3Bjb2RlQnVkZ2V0CiAgICA+CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX3doaWxlQDE0CiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgMjkgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyAyOSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfd2hpbGVfdG9wQDgKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfd2hpbGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTQKICAgIC8vIHRpbWVfaSA9IHRpbWVfZXZlbnRzW190XS5uYXRpdmUKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjU1CiAgICAvLyB0aW1lX2YgPSB0aW1lX2V2ZW50c1tfdCArIDFdLm5hdGl2ZQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gYXNzZXJ0IHRpbWVfZiA+IHRpbWVfaSwgZXJyLklOVkFMSURfU09SVElORwogICAgPAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjU3CiAgICAvLyBpZiBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uICE9IFVJbnQ2NChjc3QuRENDX0NPTlQpOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIHB1c2hpbnQgMjU1IC8vIDI1NQogICAgIT0KICAgIGJ6IGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfZm9yX2hlYWRlckAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTgtMjU5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGltZSBwZXJpb2RzIGV4cHJlc3NlZCBpbiBkYXlzIGZvciByZWd1bGFyIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0ICh0aW1lX2YgLSB0aW1lX2kpICUgVUludDY0KAogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTgtMjYxCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGltZSBwZXJpb2RzIGV4cHJlc3NlZCBpbiBkYXlzIGZvciByZWd1bGFyIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0ICh0aW1lX2YgLSB0aW1lX2kpICUgVUludDY0KAogICAgLy8gICAgIGNzdC5EQVlfMl9TRUMKICAgIC8vICkgPT0gMCwgZXJyLklOVkFMSURfVElNRV9QRVJJT0QKICAgIHB1c2hpbnQgODY0MDAgLy8gODY0MDAKICAgICUKICAgICEKICAgIGFzc2VydCAvLyBUaW1lIHBlcmlvZHMgaW4gQWN0dWFsL0FjdHVhbCBkYXkgY291bnQgY29udmVudGlvbiBtdXN0IGJlIG11bHRpcGxlcyBvZiBhIGRheSAoaW4gc2Vjb25kcykKICAgIGIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDEKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDY6CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cyhzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzOiBieXRlcykgLT4gYnl0ZXM6CnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NjktNTcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKAogICAgLy8gICAgIHNlbGYsIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzCiAgICAvLyApIC0+IHR5cC5TZWNvbmRhcnlNYXJrZXRTY2hlZHVsZToKICAgIHByb3RvIDEgMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5MAogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjIDQgLy8gMjAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTkxCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTkyCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5NAogICAgLy8gYXNzZXJ0IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID49IDEsIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTUKICAgIC8vIGlmIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID4gMToKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTYKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMQogICAgZnJhbWVfYnVyeSAxCgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTgKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTktNjAxCiAgICAvLyA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTgtNjAxCiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGRpZyAxCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk3LTYwMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vICAgICA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyAgICAgXS5uYXRpdmUKICAgIC8vICksIGVyci5JTlZBTElEX1NFQ09OREFSWV9PUEVOSU5HX0RBVEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNlY29uZGFyeSBtYXJrZXQgb3BlbmluZyBkYXRlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDMKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTcgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjAzLTYwNQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDYKICAgIC8vIGlmIHNlbGYubWF0dXJpdHlfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICBieiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjA4CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTAKICAgIC8vIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDktNjExCiAgICAvLyA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDgtNjExCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIC8vID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGRpZyAxCiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjA3LTYxMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIC8vICAgICA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyAgICAgXS5uYXRpdmUKICAgIC8vICksIGVyci5JTlZBTElEX1NFQ09OREFSWV9DTE9TVVJFX0RBVEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNlY29uZGFyeSBtYXJrZXQgY2xvc3VyZSBkYXRlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTMKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTggLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjEzLTYxNQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxOAogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxNy02MTkKICAgIC8vIHNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MjEKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MjAtNjIyCiAgICAvLyBzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyApLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjE2LTYyMwogICAgLy8gcmV0dXJuIHR5cC5TZWNvbmRhcnlNYXJrZXRTY2hlZHVsZSgKICAgIC8vICAgICBzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gICAgICksCiAgICAvLyAgICAgc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkgLT4gdm9pZDoKYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTAtMTExCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExMgogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmRlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJkZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzaWduX3JvbGUocm9sZV9hZGRyZXNzOiBieXRlcywgcm9sZTogYnl0ZXMsIGNvbmZpZzogYnl0ZXMpIC0+IGJ5dGVzOgphc3NpZ25fcm9sZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyNS02MjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2lnbl9yb2xlKAogICAgLy8gICAgIHNlbGYsIHJvbGVfYWRkcmVzczogYXJjNC5BZGRyZXNzLCByb2xlOiBhcmM0LlVJbnQ4LCBjb25maWc6IGFyYzQuRHluYW1pY0J5dGVzCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDYKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0NwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ5CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgcHVzaGludCAyMCAvLyAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgtNjU1CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUxCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MCAvLyA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MgogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MCAvLyA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MwogICAgLy8gVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwIC8vIDcwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgtNjU1CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU0CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0OC02NTUKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBhc3NpZ25fcm9sZV9ib29sX2ZhbHNlQDcKCmFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18xIC8vIDEKCmFzc2lnbl9yb2xlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0OC02NTUKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU3CiAgICAvLyBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICBwdXNoaW50cyAyMCA0MCA1MCA2MCA3MCA4MCAvLyAyMCwgNDAsIDUwLCA2MCwgNzAsIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTYtNjg1CiAgICAvLyBtYXRjaCByb2xlLm5hdGl2ZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MubmF0aXZlCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICAgICAgICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoKQogICAgZnJhbWVfZGlnIDAKICAgIG1hdGNoIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzBAOSBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8xQDEwIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzJAMTEgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzVAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4NQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfNUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3OQogICAgLy8gcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgYnl0ZWMgMzAgLy8gMHg1MjM4MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzgtNjgwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4MgogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjgxLTY4MwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gKQogICAgYm94X3B1dAoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4NgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgc3dhcAogICAgcmV0c3ViCgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njc1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyMzczMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzYKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzNAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNCAvLyAweDUyMzYzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzMKICAgIC8vIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgYm94X3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8yQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzNTMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2OQogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY4LTY3MAogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICBjb25maWcubmF0aXZlCiAgICAvLyApCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzFAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjEKICAgIC8vIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDI2IC8vIDB4NTIzNDMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjYwLTY2MgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjQKICAgIC8vIGNvbmZpZy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2My02NjUKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICkKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMEA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU4CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzLm5hdGl2ZQogICAgYnl0ZWMgOCAvLyAweDUyMzIzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2lnbl9yb2xlX2Jvb2xfbWVyZ2VAOAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnJldm9rZV9yb2xlKHJvbGVfYWRkcmVzczogYnl0ZXMsIHJvbGU6IGJ5dGVzKSAtPiBieXRlczoKcmV2b2tlX3JvbGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2ODgtNjg5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiByZXZva2Vfcm9sZShzZWxmLCByb2xlX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcm9sZTogYXJjNC5VSW50OCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwNgogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA3CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDkKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgcHVzaGludCA0MCAvLyA0MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4LTcxNAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTAKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwIC8vIDUwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDgtNzE0CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiByZXZva2Vfcm9sZV9ib29sX3RydWVANQogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxMQogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MCAvLyA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4LTcxNAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTIKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgcHVzaGludCA3MCAvLyA3MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4LTcxNAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTMKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgcHVzaGludCA4MCAvLyA4MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4LTcxNAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiByZXZva2Vfcm9sZV9ib29sX2ZhbHNlQDYKCnJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1OgogICAgaW50Y18xIC8vIDEKCnJldm9rZV9yb2xlX2Jvb2xfbWVyZ2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxNi03MTcKICAgIC8vICMgQXJyYW5nZXIgcm9sZSBjYW4gbm90IGJlIHJldm9rZWQgKGp1c3Qgcm90YXRlZCkKICAgIC8vIGNhc2UgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50cyA0MCA1MCA2MCA3MCA4MCAvLyA0MCwgNTAsIDYwLCA3MCwgODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxNS03MzMKICAgIC8vIG1hdGNoIHJvbGUubmF0aXZlOgogICAgLy8gICAgICMgQXJyYW5nZXIgcm9sZSBjYW4gbm90IGJlIHJldm9rZWQgKGp1c3Qgcm90YXRlZCkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FDQ09VTlRfTUFOQUdFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9QUklNQVJZX0RFQUxFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfVFJVU1RFRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FVVEhPUklUWSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0lOVEVSRVNUX09SQUNMRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycigpCiAgICBmcmFtZV9kaWcgMAogICAgbWF0Y2ggcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMEA4IHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzFAOSByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8yQDEwIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzNAMTEgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfNEAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzMzCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV80QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzMwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDMwIC8vIDB4NTIzODMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczMQogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0lOVEVSRVNUX09SQUNMRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczNAogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgc3dhcAogICAgcmV0c3ViCgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8zQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzI3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzNzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyOAogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FVVEhPUklUWSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8yQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzI0CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNCAvLyAweDUyMzYzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjUKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9UUlVTVEVFICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzFAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyMQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzNTMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyMgogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1BSSU1BUllfREVBTEVSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzBAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxOAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNiAvLyAweDUyMzQzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTkKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BQ0NPVU5UX01BTkFHRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfYm9vbF9mYWxzZUA2OgogICAgaW50Y18wIC8vIDAKICAgIGIgcmV2b2tlX3JvbGVfYm9vbF9tZXJnZUA3CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Eub3Blbl9hY2NvdW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHBheW1lbnRfYWRkcmVzczogYnl0ZXMpIC0+IGJ5dGVzOgpvcGVuX2FjY291bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MzYtNzM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBvcGVuX2FjY291bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHBheW1lbnRfYWRkcmVzczogYXJjNC5BZGRyZXNzCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTYKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjIDQgLy8gMjAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU4CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1OQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjAKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA3IC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2Mi03NjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjQKICAgIC8vIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICBieXRlYyAyNyAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2Mi03NjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjUKICAgIC8vIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDI3IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzYyLTc2OAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2NgogICAgLy8gcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICBieXRlYyAyNyAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2Mi03NjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjcKICAgIC8vIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIHB1c2hieXRlcyAweDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY5CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIyLTEyMwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDI2IC8vIDB4NTIzNDMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2LTEyOQogICAgLy8gY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjcKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyOAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNy0xMjgKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjkKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyOC0xMjkKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI1LTEzMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X3N1c3BlbmRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExNC0xMTUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTE2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInN1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmNsb3NlX2FjY291bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gYnl0ZXM6CmNsb3NlX2FjY291bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NzEtNzc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBjbG9zZV9hY2NvdW50KAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzCiAgICAvLyApIC0+IGFyYzQuVHVwbGVbYXJjNC5VSW50NjQsIGFyYzQuVUludDY0XToKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzg5CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5MAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDcgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzkzCiAgICAvLyBjbG9zZWRfdW5pdHMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3OTQKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BQ0NPVU5UICsgaG9sZGluZ19hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3OTUKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgLT0gY2xvc2VkX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjYKICAgIC8vIGlmIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgPT0gMDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGJueiBjbG9zZV9hY2NvdW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzY3CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0VOREVEKQogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgaW50YyA0IC8vIDIwMAogICAgYXBwX2dsb2JhbF9wdXQKCmNsb3NlX2FjY291bnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzk4CiAgICAvLyAoYXJjNC5VSW50NjQoY2xvc2VkX3VuaXRzKSwgYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApKQogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5Ny03OTkKICAgIC8vIHJldHVybiBhcmM0LlR1cGxlKAogICAgLy8gICAgIChhcmM0LlVJbnQ2NChjbG9zZWRfdW5pdHMpLCBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkpCiAgICAvLyApCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnByaW1hcnlfZGlzdHJpYnV0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiBieXRlcykgLT4gYnl0ZXM6CnByaW1hcnlfZGlzdHJpYnV0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODAxLTgwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcHJpbWFyeV9kaXN0cmlidXRpb24oCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHVuaXRzOiBhcmM0LlVJbnQ2NAogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDQKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMCAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODktMjkyCiAgICAvLyBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTAKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkxCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5MC0yOTEKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTAtMjkyCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5MgogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkxLTI5MgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGZyYW1lX2RpZyAyCiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTAtMjkyCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODgtMjkzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyAgICAgYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU0VECiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgY2xvc2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICBieXRlYyAyNSAvLyAweDUyMzUzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzQKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzYtMTM5CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzcKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGVhbGVyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzgKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzctMTM4CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzctMTM5CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kZWFsZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzOC0xMzkKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNy0xMzkKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMgogICAgaW50Y18xIC8vIDEKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzUtMTQwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICAvLyAgICAgYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA3IC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyOQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzAKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMxCiAgICAvLyBhc3NlcnQgdW5pdHMubmF0aXZlID4gMCwgZXJyLlpFUk9fVU5JVFMKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICBhc3NlcnQgLy8gQ2FuIG5vdCBkaXN0cmlidXRlIHplcm8gdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMwogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyArIHVuaXRzLm5hdGl2ZSA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMi04MzQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5jaXJjdWxhdGluZ191bml0cyArIHVuaXRzLm5hdGl2ZSA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICAvLyApLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzYKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKz0gdW5pdHMubmF0aXZlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM3LTgzOQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM3LTgzOQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIC8vICkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDMyCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gYXJjNC5VSW50NjQoc2VsZi51bml0X3ZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgIGl0b2IKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmVwbGFjZTIgNDAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0MQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMgLSBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgLQogICAgaXRvYgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTI6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDEzCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfYXNzZXRfc3VzcGVuc2lvbihzdXNwZW5kZWQ6IGJ5dGVzKSAtPiBieXRlczoKc2V0X2Fzc2V0X3N1c3BlbnNpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDMtODQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfYXNzZXRfc3VzcGVuc2lvbihzZWxmLCBzdXNwZW5kZWQ6IGFyYzQuQm9vbCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg1NwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NTgKICAgIC8vIHNlbGYuc3VzcGVuZGVkID0gVUludDY0KHN1c3BlbmRlZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ5dGVjIDE5IC8vICJzdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODU5CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUyLTE1MwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIGJ5dGVjIDIzIC8vIDB4NTIzNzMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU2LTE1OQogICAgLy8gY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTcKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdXRob3JpdHkgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1OAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1Ny0xNTgKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTctMTU5CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTkKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdXRob3JpdHkgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1OC0xNTkKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTctMTU5CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU1LTE2MAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIC8vICAgICBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X2FjY291bnRfc3VzcGVuc2lvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBzdXNwZW5kZWQ6IGJ5dGVzKSAtPiBieXRlczoKc2V0X2FjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2MS04NjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9hY2NvdW50X3N1c3BlbnNpb24oCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHN1c3BlbmRlZDogYXJjNC5Cb29sCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NzkKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA3IC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4MQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHB1c2hpbnQgNDQ4IC8vIDQ0OAogICAgc3dhcAogICAgc2V0Yml0CiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODIKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnNldF9kZWZhdWx0X3N0YXR1cyhkZWZhdWx0ZWQ6IGJ5dGVzKSAtPiB2b2lkOgpzZXRfZGVmYXVsdF9zdGF0dXM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODQtODg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfZGVmYXVsdF9zdGF0dXMoc2VsZiwgZGVmYXVsdGVkOiBhcmM0LkJvb2wpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIGJ5dGVjIDI0IC8vIDB4NTIzNjMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Ni0xNDkKICAgIC8vIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cnVzdGVlIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDgKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDctMTQ4CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Ny0xNDkKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0OQogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cnVzdGVlIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDgtMTQ5CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Ny0xNDkKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgpzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ1LTE1MAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICAvLyAgICAgYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5NgogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBVSW50NjQoZGVmYXVsdGVkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgYnl0ZWMgMjAgLy8gImRlZmF1bHRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCnNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9tZXJnZUA2CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X2Fzc2V0X2luZm8oKSAtPiBieXRlczoKZ2V0X2Fzc2V0X2luZm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTgtODk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfaW5mbyhzZWxmKSAtPiB0eXAuQXNzZXRJbmZvOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDgKICAgIC8vIHBlcmZvcm1hbmNlID0gVUludDY0KGNzdC5QUkZfUEVSRk9STUFOVCkKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwOQogICAgLy8gaWYgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBzZWxmLm1hdHVyaXR5X2RhdGUgPiAwOgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb3ZlciA0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPgogICAgYnogZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUAzCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgMQogICAgYnogZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTAKICAgIC8vIHBlcmZvcm1hbmNlID0gVUludDY0KGNzdC5QUkZfTUFUVVJFRCkKICAgIGludGNfMyAvLyA0CiAgICBmcmFtZV9idXJ5IDIKCmdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VAMzoKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMS05MTIKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgbm8gZ3JhY2Ugb3IgZGVsaW5xdWVuY3kgcGVyaW9kcwogICAgLy8gaWYgc2VsZi5kZWZhdWx0ZWQ6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImRlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZWZhdWx0ZWQgZXhpc3RzCiAgICBieiBnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMwogICAgLy8gcGVyZm9ybWFuY2UgPSBVSW50NjQoY3N0LlBSRl9ERUZBVUxURUQpCiAgICBwdXNoaW50IDMgLy8gMwogICAgZnJhbWVfYnVyeSAwCgpnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTYKICAgIC8vIGRlbm9taW5hdGlvbl9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNwogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDAKICAgIC8vIHJldHVybiBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE4CiAgICAvLyBvdXRzdGFuZGluZ19wcmluY2lwYWw9YXJjNC5VSW50NjQoc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwoKSksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTkKICAgIC8vIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoc2VsZi51bml0X3ZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjAKICAgIC8vIGRheV9jb3VudF9jb252ZW50aW9uPWFyYzQuVUludDgoc2VsZi5kYXlfY291bnRfY29udmVudGlvbiksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgaXRvYgogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyMQogICAgLy8gcHJpbmNpcGFsX2Rpc2NvdW50PWFyYzQuVUludDE2KHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50KSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjIKICAgIC8vIGludGVyZXN0X3JhdGU9YXJjNC5VSW50MTYoc2VsZi5pbnRlcmVzdF9yYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMSAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyMwogICAgLy8gdG90YWxfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTI0CiAgICAvLyBjaXJjdWxhdGluZ19zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi5jaXJjdWxhdGluZ191bml0cyksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjUtOTI3CiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjkKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjgtOTMwCiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzEKICAgIC8vIGlzc3VhbmNlX2RhdGU9YXJjNC5VSW50NjQoc2VsZi5pc3N1YW5jZV9kYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTMyCiAgICAvLyBtYXR1cml0eV9kYXRlPWFyYzQuVUludDY0KHNlbGYubWF0dXJpdHlfZGF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTMzCiAgICAvLyBzdXNwZW5kZWQ9YXJjNC5Cb29sKGJvb2woc2VsZi5zdXNwZW5kZWQpKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN1c3BlbmRlZCBleGlzdHMKICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNAogICAgLy8gcGVyZm9ybWFuY2U9YXJjNC5VSW50OChwZXJmb3JtYW5jZSksCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNS05MzUKICAgIC8vIHJldHVybiB0eXAuQXNzZXRJbmZvKAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCksCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLAogICAgLy8gICAgIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCgpKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSksCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIC8vICAgICBwcmluY2lwYWxfZGlzY291bnQ9YXJjNC5VSW50MTYoc2VsZi5wcmluY2lwYWxfZGlzY291bnQpLAogICAgLy8gICAgIGludGVyZXN0X3JhdGU9YXJjNC5VSW50MTYoc2VsZi5pbnRlcmVzdF9yYXRlKSwKICAgIC8vICAgICB0b3RhbF9zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi50b3RhbF91bml0cyksCiAgICAvLyAgICAgY2lyY3VsYXRpbmdfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMpLAogICAgLy8gICAgIHByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICApLAogICAgLy8gICAgIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIC8vICAgICApLAogICAgLy8gICAgIGlzc3VhbmNlX2RhdGU9YXJjNC5VSW50NjQoc2VsZi5pc3N1YW5jZV9kYXRlKSwKICAgIC8vICAgICBtYXR1cml0eV9kYXRlPWFyYzQuVUludDY0KHNlbGYubWF0dXJpdHlfZGF0ZSksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbChib29sKHNlbGYuc3VzcGVuZGVkKSksCiAgICAvLyAgICAgcGVyZm9ybWFuY2U9YXJjNC5VSW50OChwZXJmb3JtYW5jZSksCiAgICAvLyApCiAgICB1bmNvdmVyIDE0CiAgICB1bmNvdmVyIDE0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X2FjY291bnRfaW5mbyhob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2FjY291bnRfaW5mbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNy05MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hY2NvdW50X2luZm8oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MpIC0+IHR5cC5BY2NvdW50SW5mbzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA3IC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1MgogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X3RpbWVfZXZlbnRzKCkgLT4gYnl0ZXM6CmdldF90aW1lX2V2ZW50czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1NC05NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF90aW1lX2V2ZW50cyhzZWxmKSAtPiB0eXAuVGltZUV2ZW50czoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTYyCiAgICAvLyB0aW1lX2V2ZW50cyA9IHR5cC5UaW1lRXZlbnRzKCkKICAgIHB1c2hieXRlcyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2MwogICAgLy8gaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCk6CiAgICBieiBnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NjQKICAgIC8vIHRpbWVfZXZlbnRzID0gc2VsZi50aW1lX2V2ZW50cy52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDIyIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9ldmVudHMgZXhpc3RzCgpnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTY1CiAgICAvLyByZXR1cm4gdGltZV9ldmVudHMKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSgpIC0+IGJ5dGVzOgpnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2Ny05NjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlKHNlbGYpIC0+IHR5cC5UaW1lRXZlbnRzOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NzYKICAgIC8vIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk3NwogICAgLy8gYXJjNC5VSW50NjQoc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTc1LTk3OAogICAgLy8gcmV0dXJuIHR5cC5UaW1lRXZlbnRzKAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUpLAogICAgLy8gKQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hc3NldF9tZXRhZGF0YSgpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbWV0YWRhdGE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5ODAtOTgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbWV0YWRhdGEoc2VsZikgLT4gdHlwLkFzc2V0TWV0YWRhdGE6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk4OQogICAgLy8gcmV0dXJuIHR5cC5Bc3NldE1ldGFkYXRhLmZyb21fYnl0ZXMoc2VsZi5tZXRhZGF0YSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAibWV0YWRhdGEiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWV0YWRhdGEgZXhpc3RzCiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [2238], "errorMessage": "Can not distribute zero units"}, {"pc": [1191], "errorMessage": "Coupon rates are not properly defined"}, {"pc": [1047], "errorMessage": "D-ASA already configured"}, {"pc": [1594], "errorMessage": "Defaulted"}, {"pc": [1067], "errorMessage": "Denomination asset is not properly set"}, {"pc": [1084], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset"}, {"pc": [1251, 1260, 1268, 1304, 1340, 1408, 1423, 1522, 1558, 2024, 2041, 2090, 2190, 2207, 2267, 2358, 2375, 2444, 2461], "errorMessage": "Index access is out of bounds"}, {"pc": [2252], "errorMessage": "Insufficient remaining D-ASA units"}, {"pc": [1179], "errorMessage": "Interest rate is not properly defined"}, {"pc": [1983, 2086, 2227, 2406, 2700], "errorMessage": "Invalid account holding address"}, {"pc": [1692, 1714, 1734, 1754, 1774, 1880, 1897, 1912, 1927, 1942], "errorMessage": "Invalid account role address"}, {"pc": [1158], "errorMessage": "Invalid day-count convention ID"}, {"pc": [1656, 1848], "errorMessage": "Invalid role identifier"}, {"pc": [1564], "errorMessage": "Invalid secondary market closure date"}, {"pc": [1530], "errorMessage": "Invalid secondary market opening date"}, {"pc": [1121], "errorMessage": "Minimum denomination is not a divisor of principal"}, {"pc": [1029, 1477, 1966, 2051, 2217, 2385, 2471], "errorMessage": "Not authorized"}, {"pc": [650, 666, 682, 698, 717, 733, 748, 770, 789, 811, 830, 852, 874, 899, 918, 976], "errorMessage": "OnCompletion is not NoOp"}, {"pc": [961], "errorMessage": "OnCompletion is not UpdateApplication"}, {"pc": [2171], "errorMessage": "Primary distribution is closed"}, {"pc": [2066], "errorMessage": "Suspended operations"}, {"pc": [1225, 1486], "errorMessage": "Time events length is invalid"}, {"pc": [1347], "errorMessage": "Time events must be set in the future"}, {"pc": [1429], "errorMessage": "Time events must be sorted in strictly ascending order"}, {"pc": [1314], "errorMessage": "Time periods are not properly defined"}, {"pc": [1453], "errorMessage": "Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)"}, {"pc": [1059], "errorMessage": "asset exists"}, {"pc": [980], "errorMessage": "can only call when creating"}, {"pc": [653, 669, 685, 701, 720, 736, 751, 773, 792, 814, 833, 855, 877, 902, 921, 964], "errorMessage": "can only call when not creating"}, {"pc": [2089, 2266, 2276, 2293, 2409, 2702], "errorMessage": "check self.account entry exists"}, {"pc": [2023, 2040], "errorMessage": "check self.account_manager entry exists"}, {"pc": [1027], "errorMessage": "check self.arranger exists"}, {"pc": [2357, 2374], "errorMessage": "check self.authority entry exists"}, {"pc": [2102, 2111, 2242, 2256, 2306, 2549, 2599], "errorMessage": "check self.circulating_units exists"}, {"pc": [1434, 2567], "errorMessage": "check self.day_count_convention exists"}, {"pc": [1592, 2526], "errorMessage": "check self.defaulted exists"}, {"pc": [1080, 2538], "errorMessage": "check self.denomination_asset_id exists"}, {"pc": [2585], "errorMessage": "check self.interest_rate exists"}, {"pc": [1513, 2617], "errorMessage": "check self.issuance_date exists"}, {"pc": [1538, 1545, 2501, 2622], "errorMessage": "check self.maturity_date exists"}, {"pc": [2762], "errorMessage": "check self.metadata exists"}, {"pc": [2189, 2206], "errorMessage": "check self.primary_dealer entry exists"}, {"pc": [2163, 2611], "errorMessage": "check self.primary_distribution_closure_date exists"}, {"pc": [2149, 2605], "errorMessage": "check self.primary_distribution_opening_date exists"}, {"pc": [1173, 2576], "errorMessage": "check self.principal_discount exists"}, {"pc": [1579, 2745], "errorMessage": "check self.secondary_market_closure_date exists"}, {"pc": [1573, 2739], "errorMessage": "check self.secondary_market_opening_date exists"}, {"pc": [1096, 2544], "errorMessage": "check self.settlement_asset_id exists"}, {"pc": [1045, 1472, 1961, 2138, 2714], "errorMessage": "check self.status exists"}, {"pc": [2064, 2628], "errorMessage": "check self.suspended exists"}, {"pc": [2727], "errorMessage": "check self.time_events exists"}, {"pc": [1200, 1221, 1287], "errorMessage": "check self.total_coupons exists"}, {"pc": [2250, 2302, 2594], "errorMessage": "check self.total_units exists"}, {"pc": [2443, 2460], "errorMessage": "check self.trustee entry exists"}, {"pc": [2288, 2554, 2561], "errorMessage": "check self.unit_value exists"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" APP_SPEC = algokit_utils.Arc56Contract.from_json(_APP_SPEC_JSON) def _parse_abi_args(args: typing.Any | None = None) -> list[typing.Any] | None: @@ -96,6 +96,12 @@ class AssetMetadata: prospectus_hash: bytes prospectus_url: str +@dataclasses.dataclass(frozen=True) +class RoleConfig: + """Struct for RoleConfig""" + role_validity_start: int + role_validity_end: int + @dataclasses.dataclass(frozen=True) class SecondaryMarketSchedule: """Struct for SecondaryMarketSchedule""" @@ -998,25 +1004,31 @@ def clear_state( class GlobalStateValue(typing.TypedDict): """Shape of global_state state key values""" arranger: bytes - circulating_units: int - day_count_convention: int - defaulted: int denomination_asset_id: int - interest_rate: int - issuance_date: int - maturity_date: int + settlement_asset_id: int + unit_value: int + day_count_convention: int metadata: bytes - primary_distribution_closure_date: int - primary_distribution_opening_date: int + total_units: int + circulating_units: int principal_discount: int - secondary_market_closure_date: int + interest_rate: int + total_coupons: int + primary_distribution_opening_date: int + primary_distribution_closure_date: int + issuance_date: int secondary_market_opening_date: int - settlement_asset_id: int + secondary_market_closure_date: int + maturity_date: int status: int suspended: int - total_coupons: int - total_units: int - unit_value: int + defaulted: int + +class BoxStateValue(typing.TypedDict): + """Shape of box state key values""" + coupon_rates: list[int] + time_events: list[int] + time_periods: list[tuple[int, int]] class BaseDAsaState: """Methods to access state for the current BaseDAsa app""" @@ -1031,6 +1043,13 @@ def global_state( """Methods to access global_state for the current app""" return _GlobalState(self.app_client) + @property + def box( + self + ) -> "_BoxState": + """Methods to access box for the current app""" + return _BoxState(self.app_client) + class _GlobalState: def __init__(self, app_client: algokit_utils.AppClient): self.app_client = app_client @@ -1063,73 +1082,81 @@ def arranger(self) -> bytes: return typing.cast(bytes, value) @property - def circulating_units(self) -> int: - """Get the current value of the circulating_units key in global_state state""" - value = self.app_client.state.global_state.get_value("circulating_units") + def denomination_asset_id(self) -> int: + """Get the current value of the denomination_asset_id key in global_state state""" + value = self.app_client.state.global_state.get_value("denomination_asset_id") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def day_count_convention(self) -> int: - """Get the current value of the day_count_convention key in global_state state""" - value = self.app_client.state.global_state.get_value("day_count_convention") + def settlement_asset_id(self) -> int: + """Get the current value of the settlement_asset_id key in global_state state""" + value = self.app_client.state.global_state.get_value("settlement_asset_id") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def defaulted(self) -> int: - """Get the current value of the defaulted key in global_state state""" - value = self.app_client.state.global_state.get_value("defaulted") + def unit_value(self) -> int: + """Get the current value of the unit_value key in global_state state""" + value = self.app_client.state.global_state.get_value("unit_value") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def denomination_asset_id(self) -> int: - """Get the current value of the denomination_asset_id key in global_state state""" - value = self.app_client.state.global_state.get_value("denomination_asset_id") + def day_count_convention(self) -> int: + """Get the current value of the day_count_convention key in global_state state""" + value = self.app_client.state.global_state.get_value("day_count_convention") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def interest_rate(self) -> int: - """Get the current value of the interest_rate key in global_state state""" - value = self.app_client.state.global_state.get_value("interest_rate") + def metadata(self) -> bytes: + """Get the current value of the metadata key in global_state state""" + value = self.app_client.state.global_state.get_value("metadata") + if isinstance(value, dict) and "AVMBytes" in self._struct_classes: + return self._struct_classes["AVMBytes"](**value) # type: ignore + return typing.cast(bytes, value) + + @property + def total_units(self) -> int: + """Get the current value of the total_units key in global_state state""" + value = self.app_client.state.global_state.get_value("total_units") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def issuance_date(self) -> int: - """Get the current value of the issuance_date key in global_state state""" - value = self.app_client.state.global_state.get_value("issuance_date") + def circulating_units(self) -> int: + """Get the current value of the circulating_units key in global_state state""" + value = self.app_client.state.global_state.get_value("circulating_units") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def maturity_date(self) -> int: - """Get the current value of the maturity_date key in global_state state""" - value = self.app_client.state.global_state.get_value("maturity_date") + def principal_discount(self) -> int: + """Get the current value of the principal_discount key in global_state state""" + value = self.app_client.state.global_state.get_value("principal_discount") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def metadata(self) -> bytes: - """Get the current value of the metadata key in global_state state""" - value = self.app_client.state.global_state.get_value("metadata") - if isinstance(value, dict) and "AVMBytes" in self._struct_classes: - return self._struct_classes["AVMBytes"](**value) # type: ignore - return typing.cast(bytes, value) + def interest_rate(self) -> int: + """Get the current value of the interest_rate key in global_state state""" + value = self.app_client.state.global_state.get_value("interest_rate") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) @property - def primary_distribution_closure_date(self) -> int: - """Get the current value of the primary_distribution_closure_date key in global_state state""" - value = self.app_client.state.global_state.get_value("primary_distribution_closure_date") + def total_coupons(self) -> int: + """Get the current value of the total_coupons key in global_state state""" + value = self.app_client.state.global_state.get_value("total_coupons") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @@ -1143,17 +1170,17 @@ def primary_distribution_opening_date(self) -> int: return typing.cast(int, value) @property - def principal_discount(self) -> int: - """Get the current value of the principal_discount key in global_state state""" - value = self.app_client.state.global_state.get_value("principal_discount") + def primary_distribution_closure_date(self) -> int: + """Get the current value of the primary_distribution_closure_date key in global_state state""" + value = self.app_client.state.global_state.get_value("primary_distribution_closure_date") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def secondary_market_closure_date(self) -> int: - """Get the current value of the secondary_market_closure_date key in global_state state""" - value = self.app_client.state.global_state.get_value("secondary_market_closure_date") + def issuance_date(self) -> int: + """Get the current value of the issuance_date key in global_state state""" + value = self.app_client.state.global_state.get_value("issuance_date") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @@ -1167,9 +1194,17 @@ def secondary_market_opening_date(self) -> int: return typing.cast(int, value) @property - def settlement_asset_id(self) -> int: - """Get the current value of the settlement_asset_id key in global_state state""" - value = self.app_client.state.global_state.get_value("settlement_asset_id") + def secondary_market_closure_date(self) -> int: + """Get the current value of the secondary_market_closure_date key in global_state state""" + value = self.app_client.state.global_state.get_value("secondary_market_closure_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + + @property + def maturity_date(self) -> int: + """Get the current value of the maturity_date key in global_state state""" + value = self.app_client.state.global_state.get_value("maturity_date") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @@ -1191,28 +1226,151 @@ def suspended(self) -> int: return typing.cast(int, value) @property - def total_coupons(self) -> int: - """Get the current value of the total_coupons key in global_state state""" - value = self.app_client.state.global_state.get_value("total_coupons") + def defaulted(self) -> int: + """Get the current value of the defaulted key in global_state state""" + value = self.app_client.state.global_state.get_value("defaulted") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) +class _BoxState: + def __init__(self, app_client: algokit_utils.AppClient): + self.app_client = app_client + + # Pre-generated mapping of value types to their struct classes + self._struct_classes: dict[str, typing.Type[typing.Any]] = { + "RoleConfig": RoleConfig, + "AccountInfo": AccountInfo + } + + def get_all(self) -> BoxStateValue: + """Get all current keyed values from box state""" + result = self.app_client.state.box.get_all() + if not result: + return typing.cast(BoxStateValue, {}) + + converted = {} + for key, value in result.items(): + key_info = self.app_client.app_spec.state.keys.box.get(key) + struct_class = self._struct_classes.get(key_info.value_type) if key_info else None + converted[key] = ( + struct_class(**value) if struct_class and isinstance(value, dict) + else value + ) + return typing.cast(BoxStateValue, converted) + @property - def total_units(self) -> int: - """Get the current value of the total_units key in global_state state""" - value = self.app_client.state.global_state.get_value("total_units") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + def coupon_rates(self) -> list[int]: + """Get the current value of the coupon_rates key in box state""" + value = self.app_client.state.box.get_value("coupon_rates") + if isinstance(value, dict) and "uint16[]" in self._struct_classes: + return self._struct_classes["uint16[]"](**value) # type: ignore + return typing.cast(list[int], value) @property - def unit_value(self) -> int: - """Get the current value of the unit_value key in global_state state""" - value = self.app_client.state.global_state.get_value("unit_value") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + def time_events(self) -> list[int]: + """Get the current value of the time_events key in box state""" + value = self.app_client.state.box.get_value("time_events") + if isinstance(value, dict) and "uint64[]" in self._struct_classes: + return self._struct_classes["uint64[]"](**value) # type: ignore + return typing.cast(list[int], value) + + @property + def time_periods(self) -> list[tuple[int, int]]: + """Get the current value of the time_periods key in box state""" + value = self.app_client.state.box.get_value("time_periods") + if isinstance(value, dict) and "(uint64,uint64)[]" in self._struct_classes: + return self._struct_classes["(uint64,uint64)[]"](**value) # type: ignore + return typing.cast(list[tuple[int, int]], value) + + @property + def account_manager(self) -> "_MapState[str, RoleConfig]": + """Get values from the account_manager map in box state""" + return _MapState( + self.app_client.state.box, + "account_manager", + self._struct_classes.get("RoleConfig") + ) + + @property + def primary_dealer(self) -> "_MapState[str, RoleConfig]": + """Get values from the primary_dealer map in box state""" + return _MapState( + self.app_client.state.box, + "primary_dealer", + self._struct_classes.get("RoleConfig") + ) + + @property + def trustee(self) -> "_MapState[str, RoleConfig]": + """Get values from the trustee map in box state""" + return _MapState( + self.app_client.state.box, + "trustee", + self._struct_classes.get("RoleConfig") + ) + + @property + def authority(self) -> "_MapState[str, RoleConfig]": + """Get values from the authority map in box state""" + return _MapState( + self.app_client.state.box, + "authority", + self._struct_classes.get("RoleConfig") + ) + + @property + def interest_oracle(self) -> "_MapState[str, RoleConfig]": + """Get values from the interest_oracle map in box state""" + return _MapState( + self.app_client.state.box, + "interest_oracle", + self._struct_classes.get("RoleConfig") + ) + + @property + def account(self) -> "_MapState[str, AccountInfo]": + """Get values from the account map in box state""" + return _MapState( + self.app_client.state.box, + "account", + self._struct_classes.get("AccountInfo") + ) + +_KeyType = typing.TypeVar("_KeyType") +_ValueType = typing.TypeVar("_ValueType") + +class _AppClientStateMethodsProtocol(typing.Protocol): + def get_map(self, map_name: str) -> dict[typing.Any, typing.Any]: + ... + def get_map_value(self, map_name: str, key: typing.Any) -> typing.Any | None: + ... + +class _MapState(typing.Generic[_KeyType, _ValueType]): + """Generic class for accessing state maps with strongly typed keys and values""" + + def __init__(self, state_accessor: _AppClientStateMethodsProtocol, map_name: str, + struct_class: typing.Type[_ValueType] | None = None): + self._state_accessor = state_accessor + self._map_name = map_name + self._struct_class = struct_class + + def get_map(self) -> dict[_KeyType, _ValueType]: + """Get all current values in the map""" + result = self._state_accessor.get_map(self._map_name) + if self._struct_class and result: + return {k: self._struct_class(**v) if isinstance(v, dict) else v + for k, v in result.items()} + return typing.cast(dict[_KeyType, _ValueType], result or {}) + + def get_value(self, key: _KeyType) -> _ValueType | None: + """Get a value from the map by key""" + key_value = dataclasses.asdict(key) if dataclasses.is_dataclass(key) else key # type: ignore + value = self._state_accessor.get_map_value(self._map_name, key_value) + if value is not None and self._struct_class and isinstance(value, dict): + return self._struct_class(**value) + return typing.cast(_ValueType | None, value) + class BaseDAsaClient: """Client for interacting with BaseDAsa smart contract""" diff --git a/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.arc56.json b/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.arc56.json new file mode 100644 index 0000000..8aa8628 --- /dev/null +++ b/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.arc56.json @@ -0,0 +1,1764 @@ +{ + "name": "FixedCouponBond", + "structs": { + "AccountInfo": [ + { + "name": "payment_address", + "type": "address" + }, + { + "name": "units", + "type": "uint64" + }, + { + "name": "unit_value", + "type": "uint64" + }, + { + "name": "paid_coupons", + "type": "uint64" + }, + { + "name": "suspended", + "type": "bool" + } + ], + "AssetInfo": [ + { + "name": "denomination_asset_id", + "type": "uint64" + }, + { + "name": "settlement_asset_id", + "type": "uint64" + }, + { + "name": "outstanding_principal", + "type": "uint64" + }, + { + "name": "unit_value", + "type": "uint64" + }, + { + "name": "day_count_convention", + "type": "uint8" + }, + { + "name": "principal_discount", + "type": "uint16" + }, + { + "name": "interest_rate", + "type": "uint16" + }, + { + "name": "total_supply", + "type": "uint64" + }, + { + "name": "circulating_supply", + "type": "uint64" + }, + { + "name": "primary_distribution_opening_date", + "type": "uint64" + }, + { + "name": "primary_distribution_closure_date", + "type": "uint64" + }, + { + "name": "issuance_date", + "type": "uint64" + }, + { + "name": "maturity_date", + "type": "uint64" + }, + { + "name": "suspended", + "type": "bool" + }, + { + "name": "performance", + "type": "uint8" + } + ], + "AssetMetadata": [ + { + "name": "contract_type", + "type": "uint8" + }, + { + "name": "calendar", + "type": "uint8" + }, + { + "name": "business_day_convention", + "type": "uint8" + }, + { + "name": "end_of_month_convention", + "type": "uint8" + }, + { + "name": "prepayment_effect", + "type": "uint8" + }, + { + "name": "penalty_type", + "type": "uint8" + }, + { + "name": "prospectus_hash", + "type": "byte[32]" + }, + { + "name": "prospectus_url", + "type": "string" + } + ], + "CouponsInfo": [ + { + "name": "total_coupons", + "type": "uint64" + }, + { + "name": "due_coupons", + "type": "uint64" + }, + { + "name": "next_coupon_due_date", + "type": "uint64" + }, + { + "name": "day_count_factor", + "type": "DayCountFactor" + }, + { + "name": "all_due_coupons_paid", + "type": "bool" + } + ], + "CurrentUnitsValue": [ + { + "name": "units_value", + "type": "uint64" + }, + { + "name": "accrued_interest", + "type": "uint64" + }, + { + "name": "day_count_factor", + "type": "DayCountFactor" + } + ], + "DayCountFactor": [ + { + "name": "numerator", + "type": "uint64" + }, + { + "name": "denominator", + "type": "uint64" + } + ], + "PaymentAmounts": [ + { + "name": "interest", + "type": "uint64" + }, + { + "name": "principal", + "type": "uint64" + } + ], + "PaymentResult": [ + { + "name": "amount", + "type": "uint64" + }, + { + "name": "timestamp", + "type": "uint64" + }, + { + "name": "context", + "type": "byte[]" + } + ], + "RoleConfig": [ + { + "name": "role_validity_start", + "type": "uint64" + }, + { + "name": "role_validity_end", + "type": "uint64" + } + ], + "SecondaryMarketSchedule": [ + { + "name": "secondary_market_opening_date", + "type": "uint64" + }, + { + "name": "secondary_market_closure_date", + "type": "uint64" + } + ] + }, + "methods": [ + { + "name": "asset_transfer", + "args": [ + { + "type": "address", + "name": "sender_holding_address", + "desc": "Sender Account Holding Address" + }, + { + "type": "address", + "name": "receiver_holding_address", + "desc": "Receiver Account Holding Address" + }, + { + "type": "uint64", + "name": "units", + "desc": "Amount of D-ASA units to transfer" + } + ], + "returns": { + "type": "uint64", + "desc": "Transferred actualized value in denomination asset" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Transfer D-ASA units between accounts", + "events": [], + "recommendations": {} + }, + { + "name": "pay_coupon", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + }, + { + "type": "byte[]", + "name": "payment_info", + "desc": "Additional payment information (Optional)" + } + ], + "returns": { + "type": "(uint64,uint64,byte[])", + "struct": "PaymentResult", + "desc": "Paid coupon amount in denomination asset, Payment timestamp, Payment context" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Pay due coupon to an account", + "events": [], + "recommendations": {} + }, + { + "name": "pay_principal", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + }, + { + "type": "byte[]", + "name": "payment_info", + "desc": "Additional payment information (Optional)" + } + ], + "returns": { + "type": "(uint64,uint64,byte[])", + "struct": "PaymentResult", + "desc": "Paid principal amount in denomination asset, Payment timestamp, Payment context" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Pay the outstanding principal to an account", + "events": [], + "recommendations": {} + }, + { + "name": "get_account_units_current_value", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + }, + { + "type": "uint64", + "name": "units", + "desc": "Account's units for the current value calculation" + } + ], + "returns": { + "type": "(uint64,uint64,(uint64,uint64))", + "struct": "CurrentUnitsValue", + "desc": "Units current value in denomination asset, Accrued interest in denomination asset" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get account's units current value and accrued interest", + "events": [], + "recommendations": {} + }, + { + "name": "get_coupon_rates", + "args": [], + "returns": { + "type": "uint16[]", + "desc": "Coupon rates" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get D-ASA coupon rates", + "events": [], + "recommendations": {} + }, + { + "name": "get_payment_amount", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + } + ], + "returns": { + "type": "(uint64,uint64)", + "struct": "PaymentAmounts", + "desc": "Interest amount in denomination asset, Principal amount in denomination asset" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get the next payment amount", + "events": [], + "recommendations": {} + }, + { + "name": "get_coupons_status", + "args": [], + "returns": { + "type": "(uint64,uint64,uint64,(uint64,uint64),bool)", + "struct": "CouponsInfo", + "desc": "Total coupons, Due coupons, Next coupon due date, (Day count factor numerator, Day count factor denominator), All due coupons paid" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get D-ASA coupons status", + "events": [], + "recommendations": {} + }, + { + "name": "asset_create", + "args": [ + { + "type": "address", + "name": "arranger", + "desc": "D-ASA Arranger Address" + }, + { + "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", + "struct": "AssetMetadata", + "name": "metadata", + "desc": "D-ASA metadata" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "readonly": false, + "desc": "Create a new D-ASA", + "events": [], + "recommendations": {} + }, + { + "name": "asset_update", + "args": [ + { + "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", + "struct": "AssetMetadata", + "name": "metadata" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "UpdateApplication" + ] + }, + "readonly": false, + "desc": "Update D-ASA application.", + "events": [], + "recommendations": {} + }, + { + "name": "asset_config", + "args": [ + { + "type": "uint64", + "name": "denomination_asset_id", + "desc": "Denomination asset identifier" + }, + { + "type": "uint64", + "name": "settlement_asset_id", + "desc": "Settlement asset identifier" + }, + { + "type": "uint64", + "name": "principal", + "desc": "Principal, expressed in denomination asset" + }, + { + "type": "uint64", + "name": "principal_discount", + "desc": "Principal discount in bps" + }, + { + "type": "uint64", + "name": "minimum_denomination", + "desc": "Minimum denomination, expressed in denomination asset" + }, + { + "type": "uint8", + "name": "day_count_convention", + "desc": "Day-count convention for interests calculation" + }, + { + "type": "uint16", + "name": "interest_rate", + "desc": "Interest rate in bps" + }, + { + "type": "uint16[]", + "name": "coupon_rates", + "desc": "Coupon interest rates in bps" + }, + { + "type": "uint64[]", + "name": "time_events", + "desc": "Time events (strictly ascending order)" + }, + { + "type": "(uint64,uint64)[]", + "name": "time_periods", + "desc": "Time periods of recurring time events" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Configure the Debt Algorand Standard Application", + "events": [], + "recommendations": {} + }, + { + "name": "set_secondary_time_events", + "args": [ + { + "type": "uint64[]", + "name": "secondary_market_time_events", + "desc": "Secondary market time events (strictly ascending order)" + } + ], + "returns": { + "type": "(uint64,uint64)", + "struct": "SecondaryMarketSchedule", + "desc": "Secondary Market Opening Date, Secondary Market Closure Date" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Set secondary market time schedule", + "events": [], + "recommendations": {} + }, + { + "name": "assign_role", + "args": [ + { + "type": "address", + "name": "role_address", + "desc": "Account Role Address" + }, + { + "type": "uint8", + "name": "role", + "desc": "Role identifier" + }, + { + "type": "byte[]", + "name": "config", + "desc": "Role configuration (Optional)" + } + ], + "returns": { + "type": "uint64", + "desc": "Timestamp of the role assignment" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Assign a role to an address", + "events": [], + "recommendations": {} + }, + { + "name": "revoke_role", + "args": [ + { + "type": "address", + "name": "role_address", + "desc": "Account Role Address" + }, + { + "type": "uint8", + "name": "role", + "desc": "Role identifier" + } + ], + "returns": { + "type": "uint64", + "desc": "Timestamp of the role revocation" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Revoke a role from an address", + "events": [], + "recommendations": {} + }, + { + "name": "open_account", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + }, + { + "type": "address", + "name": "payment_address", + "desc": "Account Payment Address" + } + ], + "returns": { + "type": "uint64", + "desc": "Timestamp of the account opening" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Open D-ASA account", + "events": [], + "recommendations": {} + }, + { + "name": "close_account", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + } + ], + "returns": { + "type": "(uint64,uint64)", + "desc": "Closed units, Timestamp of the account closing" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Close D-ASA account", + "events": [], + "recommendations": {} + }, + { + "name": "primary_distribution", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + }, + { + "type": "uint64", + "name": "units", + "desc": "Amount of D-ASA units to distribute" + } + ], + "returns": { + "type": "uint64", + "desc": "Remaining D-ASA units to be distributed" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Distribute D-ASA units to accounts according the primary market", + "events": [], + "recommendations": {} + }, + { + "name": "set_asset_suspension", + "args": [ + { + "type": "bool", + "name": "suspended", + "desc": "Suspension status" + } + ], + "returns": { + "type": "uint64", + "desc": "Timestamp of the set asset suspension status" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Set asset suspension status", + "events": [], + "recommendations": {} + }, + { + "name": "set_account_suspension", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + }, + { + "type": "bool", + "name": "suspended", + "desc": "Suspension status" + } + ], + "returns": { + "type": "uint64", + "desc": "Timestamp of the set account suspension status" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Set account suspension status", + "events": [], + "recommendations": {} + }, + { + "name": "set_default_status", + "args": [ + { + "type": "bool", + "name": "defaulted", + "desc": "Default status" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Set D-ASA default status", + "events": [], + "recommendations": {} + }, + { + "name": "get_asset_info", + "args": [], + "returns": { + "type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", + "struct": "AssetInfo", + "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Performance" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get D-ASA info", + "events": [], + "recommendations": {} + }, + { + "name": "get_account_info", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + } + ], + "returns": { + "type": "(address,uint64,uint64,uint64,bool)", + "struct": "AccountInfo", + "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get account info", + "events": [], + "recommendations": {} + }, + { + "name": "get_time_events", + "args": [], + "returns": { + "type": "uint64[]", + "desc": "Time events" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get D-ASA time events", + "events": [], + "recommendations": {} + }, + { + "name": "get_secondary_market_schedule", + "args": [], + "returns": { + "type": "uint64[]", + "desc": "Secondary market schedule" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get secondary market schedule", + "events": [], + "recommendations": {} + }, + { + "name": "get_asset_metadata", + "args": [], + "returns": { + "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", + "struct": "AssetMetadata", + "desc": "Contract type, Calendar, Business day convention, End of month convention, Early repayment effect, Early repayment penalty type, Prospectus hash, Prospectus URL" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get D-ASA metadata", + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "desc": "\n Fixed Coupon Bond, placed at nominal value, fixed coupon rates and payment time schedule, principal at maturity.\n ", + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 20, + "bytes": 2 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "arranger": { + "keyType": "AVMBytes", + "valueType": "AVMBytes", + "key": "UjIwIw==" + }, + "denomination_asset_id": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk" + }, + "settlement_asset_id": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "c2V0dGxlbWVudF9hc3NldF9pZA==" + }, + "unit_value": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "dW5pdF92YWx1ZQ==" + }, + "day_count_convention": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=" + }, + "metadata": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "bWV0YWRhdGE=" + }, + "total_units": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "dG90YWxfdW5pdHM=" + }, + "circulating_units": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "Y2lyY3VsYXRpbmdfdW5pdHM=" + }, + "principal_discount": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cHJpbmNpcGFsX2Rpc2NvdW50" + }, + "interest_rate": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "aW50ZXJlc3RfcmF0ZQ==" + }, + "total_coupons": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "dG90YWxfY291cG9ucw==" + }, + "primary_distribution_opening_date": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRl" + }, + "primary_distribution_closure_date": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRl" + }, + "issuance_date": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "aXNzdWFuY2VfZGF0ZQ==" + }, + "secondary_market_opening_date": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "c2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU=" + }, + "secondary_market_closure_date": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "c2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU=" + }, + "maturity_date": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "bWF0dXJpdHlfZGF0ZQ==" + }, + "status": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "c3RhdHVz" + }, + "suspended": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "c3VzcGVuZGVk" + }, + "defaulted": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "ZGVmYXVsdGVk" + }, + "due_coupons_watermark": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "ZHVlX2NvdXBvbnNfd2F0ZXJtYXJr" + }, + "paid_coupon_units": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cGFpZF9jb3Vwb25fdW5pdHM=" + } + }, + "local": {}, + "box": { + "coupon_rates": { + "keyType": "AVMBytes", + "valueType": "uint16[]", + "key": "Y291cG9uUmF0ZXM=" + }, + "time_events": { + "keyType": "AVMBytes", + "valueType": "uint64[]", + "key": "dGltZUV2ZW50cw==" + }, + "time_periods": { + "keyType": "AVMBytes", + "valueType": "(uint64,uint64)[]", + "key": "dGltZVBlcmlvZHM=" + } + } + }, + "maps": { + "global": {}, + "local": {}, + "box": { + "account_manager": { + "keyType": "address", + "valueType": "RoleConfig", + "prefix": "UjQwIw==" + }, + "primary_dealer": { + "keyType": "address", + "valueType": "RoleConfig", + "prefix": "UjUwIw==" + }, + "trustee": { + "keyType": "address", + "valueType": "RoleConfig", + "prefix": "UjYwIw==" + }, + "authority": { + "keyType": "address", + "valueType": "RoleConfig", + "prefix": "UjcwIw==" + }, + "interest_oracle": { + "keyType": "address", + "valueType": "RoleConfig", + "prefix": "UjgwIw==" + }, + "account": { + "keyType": "address", + "valueType": "AccountInfo", + "prefix": "UjMwIw==" + } + } + } + }, + "bareActions": { + "create": [], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 4035 + ], + "errorMessage": "Can not distribute zero units" + }, + { + "pc": [ + 3053 + ], + "errorMessage": "Coupon rates are not properly defined" + }, + { + "pc": [ + 2910 + ], + "errorMessage": "D-ASA already configured" + }, + { + "pc": [ + 1622 + ], + "errorMessage": "Defaulted" + }, + { + "pc": [ + 2930 + ], + "errorMessage": "Denomination asset is not properly set" + }, + { + "pc": [ + 2947 + ], + "errorMessage": "Different settlement asset not supported, must be equal to denomination asset" + }, + { + "pc": [ + 1389, + 1400, + 1407, + 1418, + 1425, + 1436, + 1443, + 1469, + 1491, + 1515, + 1533, + 1600, + 1712, + 1744, + 1768, + 1793, + 1798, + 1816, + 1954, + 1994, + 2031, + 2045, + 2089, + 2101, + 2173, + 2222, + 2253, + 2338, + 2381, + 2399, + 2502, + 2575, + 2581, + 2710, + 2802, + 2808, + 3114, + 3123, + 3131, + 3168, + 3204, + 3245, + 3260, + 3356, + 3394, + 3847, + 3864, + 3901, + 3988, + 4005, + 4064, + 4155, + 4172, + 4239, + 4256 + ], + "errorMessage": "Index access is out of bounds" + }, + { + "pc": [ + 4049 + ], + "errorMessage": "Insufficient remaining D-ASA units" + }, + { + "pc": [ + 1396 + ], + "errorMessage": "Insufficient sender units to transfer" + }, + { + "pc": [ + 3042 + ], + "errorMessage": "Interest rate is not properly defined" + }, + { + "pc": [ + 1339, + 1351, + 2027, + 2335, + 2489, + 2691, + 3807, + 3897, + 4024, + 4202, + 4496 + ], + "errorMessage": "Invalid account holding address" + }, + { + "pc": [ + 3517, + 3539, + 3559, + 3579, + 3599, + 3705, + 3722, + 3737, + 3752, + 3767 + ], + "errorMessage": "Invalid account role address" + }, + { + "pc": [ + 2514 + ], + "errorMessage": "Invalid amount of units for the account" + }, + { + "pc": [ + 3021 + ], + "errorMessage": "Invalid day-count convention ID" + }, + { + "pc": [ + 3481, + 3673 + ], + "errorMessage": "Invalid role identifier" + }, + { + "pc": [ + 3400 + ], + "errorMessage": "Invalid secondary market closure date" + }, + { + "pc": [ + 3364 + ], + "errorMessage": "Invalid secondary market opening date" + }, + { + "pc": [ + 2985 + ], + "errorMessage": "Minimum denomination is not a divisor of principal" + }, + { + "pc": [ + 2038, + 2342 + ], + "errorMessage": "No D-ASA units" + }, + { + "pc": [ + 2055 + ], + "errorMessage": "No due coupon to pay" + }, + { + "pc": [ + 1321, + 2011, + 2319, + 2892, + 3311, + 3791, + 3874, + 4015, + 4182, + 4266 + ], + "errorMessage": "Not authorized" + }, + { + "pc": [ + 2279 + ], + "errorMessage": "Not enough funds for the payment" + }, + { + "pc": [ + 2351 + ], + "errorMessage": "Not mature" + }, + { + "pc": [ + 783, + 799, + 815, + 831, + 850, + 866, + 881, + 903, + 922, + 944, + 963, + 985, + 1007, + 1032, + 1051, + 1110, + 1129, + 1145, + 1164, + 1180, + 1202, + 1224, + 1246 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 1095 + ], + "errorMessage": "OnCompletion is not UpdateApplication" + }, + { + "pc": [ + 1775, + 2059, + 2358 + ], + "errorMessage": "Pending due coupon payment" + }, + { + "pc": [ + 3969 + ], + "errorMessage": "Primary distribution is closed" + }, + { + "pc": [ + 2478 + ], + "errorMessage": "Primary distribution not yet executed" + }, + { + "pc": [ + 1315 + ], + "errorMessage": "Secondary market is closed" + }, + { + "pc": [ + 1451 + ], + "errorMessage": "Sender and receiver units are not fungible" + }, + { + "pc": [ + 1368, + 1384, + 1633 + ], + "errorMessage": "Suspended operations" + }, + { + "pc": [ + 3088, + 3320 + ], + "errorMessage": "Time events length is invalid" + }, + { + "pc": [ + 3211 + ], + "errorMessage": "Time events must be set in the future" + }, + { + "pc": [ + 3266 + ], + "errorMessage": "Time events must be sorted in strictly ascending order" + }, + { + "pc": [ + 3179 + ], + "errorMessage": "Time periods are not properly defined" + }, + { + "pc": [ + 3287 + ], + "errorMessage": "Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)" + }, + { + "pc": [ + 575 + ], + "errorMessage": "Wrong Global Bytes allocation" + }, + { + "pc": [ + 581 + ], + "errorMessage": "Wrong Global UInts allocation" + }, + { + "pc": [ + 585 + ], + "errorMessage": "Wrong Local Bytes allocation" + }, + { + "pc": [ + 589 + ], + "errorMessage": "Wrong Local UInts allocation" + }, + { + "pc": [ + 2275 + ], + "errorMessage": "account opted into asset" + }, + { + "pc": [ + 2922 + ], + "errorMessage": "asset exists" + }, + { + "pc": [ + 1114 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 786, + 802, + 818, + 834, + 853, + 869, + 884, + 906, + 925, + 947, + 966, + 988, + 1010, + 1035, + 1054, + 1098, + 1132, + 1148, + 1167, + 1183, + 1205, + 1227, + 1249 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 1355, + 1371, + 1388, + 1399, + 1406, + 1417, + 1424, + 1435, + 1442, + 1468, + 1490, + 1502, + 1514, + 1526, + 1532, + 1544, + 1555, + 1582, + 1594, + 1598, + 1767, + 1993, + 2030, + 2044, + 2088, + 2100, + 2111, + 2172, + 2191, + 2221, + 2337, + 2380, + 2398, + 2409, + 2501, + 2709, + 3900, + 4063, + 4073, + 4090, + 4205, + 4498 + ], + "errorMessage": "check self.account entry exists" + }, + { + "pc": [ + 3846, + 3863 + ], + "errorMessage": "check self.account_manager entry exists" + }, + { + "pc": [ + 2890 + ], + "errorMessage": "check self.arranger exists" + }, + { + "pc": [ + 4154, + 4171 + ], + "errorMessage": "check self.authority entry exists" + }, + { + "pc": [ + 2157, + 2391, + 2441, + 3911, + 4039, + 4053, + 4103, + 4346, + 4396 + ], + "errorMessage": "check self.circulating_units exists" + }, + { + "pc": [ + 1805, + 2243, + 2673 + ], + "errorMessage": "check self.coupon_rates exists" + }, + { + "pc": [ + 1878, + 3271, + 4364 + ], + "errorMessage": "check self.day_count_convention exists" + }, + { + "pc": [ + 1620, + 4323 + ], + "errorMessage": "check self.defaulted exists" + }, + { + "pc": [ + 2943, + 4335 + ], + "errorMessage": "check self.denomination_asset_id exists" + }, + { + "pc": [ + 1650, + 1694 + ], + "errorMessage": "check self.due_coupons_watermark exists" + }, + { + "pc": [ + 4382 + ], + "errorMessage": "check self.interest_rate exists" + }, + { + "pc": [ + 1683, + 1853, + 2623, + 2633, + 3347, + 4414 + ], + "errorMessage": "check self.issuance_date exists" + }, + { + "pc": [ + 1655, + 2349, + 3373, + 3381, + 4297, + 4420 + ], + "errorMessage": "check self.maturity_date exists" + }, + { + "pc": [ + 4555 + ], + "errorMessage": "check self.metadata exists" + }, + { + "pc": [ + 2120, + 2153 + ], + "errorMessage": "check self.paid_coupon_units exists" + }, + { + "pc": [ + 3987, + 4004 + ], + "errorMessage": "check self.primary_dealer entry exists" + }, + { + "pc": [ + 3961, + 4408 + ], + "errorMessage": "check self.primary_distribution_closure_date exists" + }, + { + "pc": [ + 2462, + 2472, + 3947, + 4402 + ], + "errorMessage": "check self.primary_distribution_opening_date exists" + }, + { + "pc": [ + 3036, + 4373 + ], + "errorMessage": "check self.principal_discount exists" + }, + { + "pc": [ + 1307, + 3415, + 4538 + ], + "errorMessage": "check self.secondary_market_closure_date exists" + }, + { + "pc": [ + 1293, + 3409, + 4532 + ], + "errorMessage": "check self.secondary_market_opening_date exists" + }, + { + "pc": [ + 2180, + 2272, + 2291, + 2959, + 4341 + ], + "errorMessage": "check self.settlement_asset_id exists" + }, + { + "pc": [ + 1283, + 2008, + 2316, + 2661, + 2697, + 2908, + 3306, + 3786, + 3937, + 4508 + ], + "errorMessage": "check self.status exists" + }, + { + "pc": [ + 1631, + 4426 + ], + "errorMessage": "check self.suspended exists" + }, + { + "pc": [ + 1704, + 1736, + 1946, + 4520 + ], + "errorMessage": "check self.time_events exists" + }, + { + "pc": [ + 1667, + 1965, + 2642, + 2721, + 2818, + 3062, + 3083, + 3150 + ], + "errorMessage": "check self.total_coupons exists" + }, + { + "pc": [ + 4047, + 4099, + 4391 + ], + "errorMessage": "check self.total_units exists" + }, + { + "pc": [ + 4238, + 4255 + ], + "errorMessage": "check self.trustee entry exists" + }, + { + "pc": [ + 4085, + 4351, + 4358 + ], + "errorMessage": "check self.unit_value exists" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLl9fYWxnb3B5X2VudHJ5cG9pbnRfd2l0aF9pbml0KCkgLT4gdWludDY0OgptYWluOgogICAgaW50Y2Jsb2NrIDAgMSA4IDEwMCA0NDggMjU1IDg2NDAwIDIwMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4NTIzMzMwMjMgImNpcmN1bGF0aW5nX3VuaXRzIiAic3RhdHVzIiAidG90YWxfY291cG9ucyIgImlzc3VhbmNlX2RhdGUiICJtYXR1cml0eV9kYXRlIiAic2V0dGxlbWVudF9hc3NldF9pZCIgMHgwMDAwMDAwMDAwMDAwMDAwICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiIDB4MDAgMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MyAidW5pdF92YWx1ZSIgImRheV9jb3VudF9jb252ZW50aW9uIiAidG90YWxfdW5pdHMiICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIgInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIiAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMgMHg1MjMyMzAyMyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIiAibWV0YWRhdGEiICJwcmluY2lwYWxfZGlzY291bnQiICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiICJzdXNwZW5kZWQiICJkZWZhdWx0ZWQiICJkdWVfY291cG9uc193YXRlcm1hcmsiICJwYWlkX2NvdXBvbl91bml0cyIgImludGVyZXN0X3JhdGUiIDB4NTIzNzMwMjMgMHg1MjM2MzAyMyAweDUyMzUzMDIzIDB4NTIzNDMwMjMgMHgwMDEyIDB4MDAwMCAweDUyMzgzMDIzIDB4MDY4MTAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MS00MgogICAgLy8gIyBSb2xlIEJhc2VkIEFjY2VzcyBDb250cm9sCiAgICAvLyBzZWxmLmFycmFuZ2VyID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9BUlJBTkdFUikKICAgIGJ5dGVjIDE4IC8vIDB4NTIzMjMwMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5LTYwCiAgICAvLyAjIEFzc2V0IENvbmZpZ3VyYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gVUludDY0KCkKICAgIGJ5dGVjIDE5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBVSW50NjQoKQogICAgYnl0ZWMgNyAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjIKICAgIC8vIHNlbGYudW5pdF92YWx1ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMiAvLyAidW5pdF92YWx1ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjMKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgMTMgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NS02NgogICAgLy8gIyBNZXRhZGF0YQogICAgLy8gc2VsZi5tZXRhZGF0YSA9IEJ5dGVzKCkKICAgIGJ5dGVjIDIwIC8vICJtZXRhZGF0YSIKICAgIHB1c2hieXRlcyAweAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4LTY5CiAgICAvLyAjIFN1cHBseQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwCiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3Mi03MwogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50ID0gVUludDY0KCkKICAgIGJ5dGVjIDIxIC8vICJwcmluY2lwYWxfZGlzY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1LTc2CiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmludGVyZXN0X3JhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMjcgLy8gImludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgwCiAgICAvLyBzZWxmLnRvdGFsX2NvdXBvbnMgPSBVSW50NjQoKQogICAgYnl0ZWMgNCAvLyAidG90YWxfY291cG9ucyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODUKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDIyIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNSAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODgKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTItOTMKICAgIC8vICMgU3RhdHVzCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0VNUFRZKQogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NAogICAgLy8gc2VsZi5zdXNwZW5kZWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjMgLy8gInN1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTUKICAgIC8vIHNlbGYuZGVmYXVsdGVkID0gVUludDY0KCkKICAgIGJ5dGVjIDI0IC8vICJkZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNi0zNwogICAgLy8gIyBTdGF0ZSBzY2hlbWEgdmFsaWRhdGlvbgogICAgLy8gYXNzZXJ0IFR4bi5nbG9iYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkdMT0JBTF9CWVRFUywgZXJyLldST05HX0dMT0JBTF9CWVRFUwogICAgdHhuIEdsb2JhbE51bUJ5dGVTbGljZQogICAgcHVzaGludCAyIC8vIDIKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozOAogICAgLy8gYXNzZXJ0IFR4bi5nbG9iYWxfbnVtX3VpbnQgPT0gY2ZnLkdMT0JBTF9VSU5UUywgZXJyLldST05HX0dMT0JBTF9VSU5UUwogICAgdHhuIEdsb2JhbE51bVVpbnQKICAgIHB1c2hpbnQgMjAgLy8gMjAKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIFVJbnRzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozOQogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuTE9DQUxfQllURVMsIGVyci5XUk9OR19MT0NBTF9CWVRFUwogICAgdHhuIExvY2FsTnVtQnl0ZVNsaWNlCiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV91aW50ID09IGNmZy5MT0NBTF9VSU5UUywgZXJyLldST05HX0xPQ0FMX1VJTlRTCiAgICB0eG4gTG9jYWxOdW1VaW50CiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQyLTQzCiAgICAvLyAjIENvdXBvbnMKICAgIC8vIHNlbGYuZHVlX2NvdXBvbnNfd2F0ZXJtYXJrID0gVUludDY0KCkKICAgIGJ5dGVjIDI1IC8vICJkdWVfY291cG9uc193YXRlcm1hcmsiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0NAogICAgLy8gc2VsZi5wYWlkX2NvdXBvbl91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAyNiAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYWZ0ZXJfaWZfZWxzZUAyOQogICAgcHVzaGJ5dGVzcyAweDRmZDZhM2NjIDB4OGNmMTRiNTEgMHg5Yzc2YjZhMyAweDQ0MzYzZDQ5IDB4NTNiZWYwNDUgMHg2N2RiNGYyMCAweGY2YTk2YzhkIDB4M2YwZWZjNmMgMHgyNWRiYTk1YiAweDg5NDc0MTM0IDB4MWQ2ZmMyNTUgMHhmZWY3NDU2NyAweGI4ZmMxMzkwIDB4M2Q0M2QxZjAgMHhlYmQ5NmIyZiAweDZjODVlM2VlIDB4ZjYzYWNlOGQgMHhiYmNjYTE4YSAweDFhN2JhYmI0IDB4NDAyZGJhNDcgMHhlZDAyNzU5ZiAweGZhZDIxNzNlIDB4MDhlZmVhMzUgMHhlNGE1YWI1NCAvLyBtZXRob2QgImFzc2V0X3RyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwYXlfY291cG9uKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LGJ5dGVbXSkiLCBtZXRob2QgInBheV9wcmluY2lwYWwoYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAiZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZShhZGRyZXNzLHVpbnQ2NCkodWludDY0LHVpbnQ2NCwodWludDY0LHVpbnQ2NCkpIiwgbWV0aG9kICJnZXRfY291cG9uX3JhdGVzKCl1aW50MTZbXSIsIG1ldGhvZCAiZ2V0X3BheW1lbnRfYW1vdW50KGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJnZXRfY291cG9uc19zdGF0dXMoKSh1aW50NjQsdWludDY0LHVpbnQ2NCwodWludDY0LHVpbnQ2NCksYm9vbCkiLCBtZXRob2QgImFzc2V0X2NyZWF0ZShhZGRyZXNzLCh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCxieXRlWzMyXSxzdHJpbmcpKXZvaWQiLCBtZXRob2QgImFzc2V0X3VwZGF0ZSgodWludDgsdWludDgsdWludDgsdWludDgsdWludDgsdWludDgsYnl0ZVszMl0sc3RyaW5nKSl2b2lkIiwgbWV0aG9kICJhc3NldF9jb25maWcodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50MTYsdWludDE2W10sdWludDY0W10sKHVpbnQ2NCx1aW50NjQpW10pdm9pZCIsIG1ldGhvZCAic2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cyh1aW50NjRbXSkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImFzc2lnbl9yb2xlKGFkZHJlc3MsdWludDgsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAicmV2b2tlX3JvbGUoYWRkcmVzcyx1aW50OCl1aW50NjQiLCBtZXRob2QgIm9wZW5fYWNjb3VudChhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJjbG9zZV9hY2NvdW50KGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInNldF9hc3NldF9zdXNwZW5zaW9uKGJvb2wpdWludDY0IiwgbWV0aG9kICJzZXRfYWNjb3VudF9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgInNldF9kZWZhdWx0X3N0YXR1cyhib29sKXZvaWQiLCBtZXRob2QgImdldF9hc3NldF9pbmZvKCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQxNix1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYm9vbCx1aW50OCkiLCBtZXRob2QgImdldF9hY2NvdW50X2luZm8oYWRkcmVzcykoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sKSIsIG1ldGhvZCAiZ2V0X3RpbWVfZXZlbnRzKCl1aW50NjRbXSIsIG1ldGhvZCAiZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfYXNzZXRfbWV0YWRhdGEoKSh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCxieXRlWzMyXSxzdHJpbmcpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9hc3NldF90cmFuc2Zlcl9yb3V0ZUA1IG1haW5fcGF5X2NvdXBvbl9yb3V0ZUA2IG1haW5fcGF5X3ByaW5jaXBhbF9yb3V0ZUA3IG1haW5fZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9yb3V0ZUA4IG1haW5fZ2V0X2NvdXBvbl9yYXRlc19yb3V0ZUA5IG1haW5fZ2V0X3BheW1lbnRfYW1vdW50X3JvdXRlQDEwIG1haW5fZ2V0X2NvdXBvbnNfc3RhdHVzX3JvdXRlQDExIG1haW5fYXNzZXRfY3JlYXRlX3JvdXRlQDEyIG1haW5fYXNzZXRfdXBkYXRlX3JvdXRlQDEzIG1haW5fYXNzZXRfY29uZmlnX3JvdXRlQDE0IG1haW5fc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19yb3V0ZUAxNSBtYWluX2Fzc2lnbl9yb2xlX3JvdXRlQDE2IG1haW5fcmV2b2tlX3JvbGVfcm91dGVAMTcgbWFpbl9vcGVuX2FjY291bnRfcm91dGVAMTggbWFpbl9jbG9zZV9hY2NvdW50X3JvdXRlQDE5IG1haW5fcHJpbWFyeV9kaXN0cmlidXRpb25fcm91dGVAMjAgbWFpbl9zZXRfYXNzZXRfc3VzcGVuc2lvbl9yb3V0ZUAyMSBtYWluX3NldF9hY2NvdW50X3N1c3BlbnNpb25fcm91dGVAMjIgbWFpbl9zZXRfZGVmYXVsdF9zdGF0dXNfcm91dGVAMjMgbWFpbl9nZXRfYXNzZXRfaW5mb19yb3V0ZUAyNCBtYWluX2dldF9hY2NvdW50X2luZm9fcm91dGVAMjUgbWFpbl9nZXRfdGltZV9ldmVudHNfcm91dGVAMjYgbWFpbl9nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZV9yb3V0ZUAyNyBtYWluX2dldF9hc3NldF9tZXRhZGF0YV9yb3V0ZUAyOAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgaW50Y18wIC8vIDAKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbWV0YWRhdGFfcm91dGVAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5ODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hc3NldF9tZXRhZGF0YQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZV9yb3V0ZUAyNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X3RpbWVfZXZlbnRzX3JvdXRlQDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfdGltZV9ldmVudHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2FjY291bnRfaW5mb19yb3V0ZUAyNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hY2NvdW50X2luZm8KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2luZm9fcm91dGVAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hc3NldF9pbmZvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9kZWZhdWx0X3N0YXR1c19yb3V0ZUAyMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9kZWZhdWx0X3N0YXR1cwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfYWNjb3VudF9zdXNwZW5zaW9uX3JvdXRlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X2FjY291bnRfc3VzcGVuc2lvbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfYXNzZXRfc3VzcGVuc2lvbl9yb3V0ZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9hc3NldF9zdXNwZW5zaW9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3ByaW1hcnlfZGlzdHJpYnV0aW9uX3JvdXRlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODAxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODAxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcHJpbWFyeV9kaXN0cmlidXRpb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fY2xvc2VfYWNjb3VudF9yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGNsb3NlX2FjY291bnQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fb3Blbl9hY2NvdW50X3JvdXRlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgb3Blbl9hY2NvdW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3Jldm9rZV9yb2xlX3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcmV2b2tlX3JvbGUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzaWduX3JvbGVfcm91dGVAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NpZ25fcm9sZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX3JvdXRlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF9jb25maWdfcm91dGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0ODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYXNzZXRfY29uZmlnCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Fzc2V0X3VwZGF0ZV9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgVXBkYXRlQXBwbGljYXRpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBjYWxsc3ViIGFzc2V0X3VwZGF0ZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF9jcmVhdGVfcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBjYWxsc3ViIGFzc2V0X2NyZWF0ZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfY291cG9uc19zdGF0dXNfcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfY291cG9uc19zdGF0dXMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X3BheW1lbnRfYW1vdW50X3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfcGF5bWVudF9hbW91bnQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2NvdXBvbl9yYXRlc19yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2NvdXBvbl9yYXRlcwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjMxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcGF5X3ByaW5jaXBhbF9yb3V0ZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBwYXlfcHJpbmNpcGFsCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3BheV9jb3Vwb25fcm91dGVANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcGF5X2NvdXBvbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF90cmFuc2Zlcl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NldF90cmFuc2ZlcgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5maXhlZF9jb3Vwb25fYm9uZC5jb250cmFjdC5GaXhlZENvdXBvbkJvbmQuYXNzZXRfdHJhbnNmZXIoc2VuZGVyX2hvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiBieXRlcykgLT4gYnl0ZXM6CmFzc2V0X3RyYW5zZmVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE1My0xNTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2V0X3RyYW5zZmVyKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgc2VuZGVyX2hvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLAogICAgLy8gICAgIHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLAogICAgLy8gICAgIHVuaXRzOiBhcmM0LlVJbnQ2NCwKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAzIDEKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDIKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTg0CiAgICAvLyB1bml0cy5uYXRpdmUsCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMyAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTgtMzAxCiAgICAvLyBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk5CiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwMAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTktMzAwCiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTktMzAxCiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDEKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwMC0zMDEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGZyYW1lX2RpZyA0CiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTktMzAxCiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA1CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk3LTMwMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gICAgIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5TRUNPTkRBUllfTUFSS0VUX0NMT1NFRAogICAgYXNzZXJ0IC8vIFNlY29uZGFyeSBtYXJrZXQgaXMgY2xvc2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNzYtMzc4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRyYW5zZmVyIHJpZ2h0IHRvIEQtQVNBIG93bmVycy4gT3RoZXIgaW1wbGVtZW50YXRpb25zIG1heSByZWxheSBvbiBvdGhlcgogICAgLy8gIyByb2xlcywgZXh0ZXJuYWwgQXBwcyB0aHJvdWdoIEMyQyBjYWxscyAoZS5nLiwgYW4gb3JkZXIgYm9vayksIG9yIG9mZi1jaGFpbiB0cmFuc2ZlciBhZ2VudHMuCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZW5kZXJfaG9sZGluZ19hZGRyZXNzLm5hdGl2ZSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0zCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNzkKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzgwCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3NAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzgzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQubmF0aXZlLCBlcnIuU1VTUEVOREVECiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGMgNCAvLyA0NDgKICAgIGdldGJpdAogICAgYnl0ZWMgMTAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM4NC0zODYKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hY2NvdW50WwogICAgLy8gICAgIHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcwogICAgLy8gXS5zdXNwZW5kZWQubmF0aXZlLCBlcnIuU1VTUEVOREVECiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjIDQgLy8gNDQ4CiAgICBnZXRiaXQKICAgIGJ5dGVjIDEwIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozODgKICAgIC8vIHVuaXRzIDw9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfZGlnIDUKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozODctMzg5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHVuaXRzIDw9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIC8vICksIGVyci5PVkVSX1RSQU5TRkVSCiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzk3CiAgICAvLyBzZW5kZXJfdW5pdF92YWx1ZSA9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlCiAgICBzd2FwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozOTgKICAgIC8vIGlmIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSA+IDA6CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnogYXNzZXRfdHJhbnNmZXJfZWxzZV9ib2R5QDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDkKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYj09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDktMzEwCiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzEwCiAgICAvLyBhbmQgc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYj09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDktMzEwCiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAxNAogICAgaW50Y18xIC8vIDEKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDgtMzExCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICAvLyAgICAgYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgLy8gKSwgZXJyLk5PTl9GVU5HSUJMRV9VTklUUwogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgdW5pdHMgYXJlIG5vdCBmdW5naWJsZQoKYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxODctMTg4CiAgICAvLyAjIFRyYW5zZmVyIGlzIGZvcmJpZGRlbiBpbiBjYXNlIG9mIHBlbmRpbmcgY291cG9uIHBheW1lbnRzCiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuY291bnRfZHVlX2NvdXBvbnMoKQogICAgY2FsbHN1YiBjb3VudF9kdWVfY291cG9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE4OQogICAgLy8gc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChzZW5kZXJfaG9sZGluZ19hZGRyZXNzLCBkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyAtMwogICAgZGlnIDEKICAgIGNhbGxzdWIgYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOTEtMTkyCiAgICAvLyAjIFRyYW5zZmVycmVkIHVuaXRzIHZhbHVlIChtdXN0IGJlIGNvbXB1dGVkIGJlZm9yZSB0aGUgdHJhbnNmZXIpCiAgICAvLyBzZW5kZXJfdW5pdF92YWx1ZSA9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTkzLTE5NQogICAgLy8gYWNjcnVlZF9pbnRlcmVzdCA9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoCiAgICAvLyAgICAgc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgdW5pdHMubmF0aXZlLCBkdWVfY291cG9ucwogICAgLy8gKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgNQogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDM0CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlIC0gdW5pdHMKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGRpZyAyCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzMtNDM1CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlIC0gdW5pdHMKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQzMwogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQzMy00MzUKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgLSB1bml0cwogICAgLy8gKQogICAgc3dhcAogICAgcmVwbGFjZTIgMzIKICAgIGRpZyAxCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzcKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgdW5jb3ZlciAzCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzYtNDM4CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzYKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQzNi00MzgKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMKICAgIC8vICkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDMyCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjAKICAgIC8vIGlmIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSA9PSAwOgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJueiBhc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDIxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjEKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUgPSBhcmM0LlVJbnQ2NCgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgOCAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIHJlcGxhY2UyIDQwCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzYyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBhcmM0LlVJbnQ2NCgpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBieXRlYyA4IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgcmVwbGFjZTIgNDgKICAgIGJveF9wdXQKCmFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAwCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQodW5pdHMubmF0aXZlICogc2VuZGVyX3VuaXRfdmFsdWUubmF0aXZlICsgYWNjcnVlZF9pbnRlcmVzdCkKICAgIGZyYW1lX2RpZyAwCiAgICBidG9pCiAgICBmcmFtZV9kaWcgNQogICAgKgogICAgZnJhbWVfZGlnIDMKICAgICsKICAgIGl0b2IKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgphc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUAxNQoKYXNzZXRfdHJhbnNmZXJfZWxzZV9ib2R5QDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDAzCiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gc2VuZGVyX3VuaXRfdmFsdWUKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBmcmFtZV9kaWcgMAogICAgcmVwbGFjZTIgNDAKICAgIGRpZyAxCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MDQtNDA2CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbCiAgICAvLyAgICAgc2VuZGVyX2hvbGRpbmdfYWRkcmVzcwogICAgLy8gXS5wYWlkX2NvdXBvbnMKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDA0CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQwNC00MDYKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IHNlbGYuYWNjb3VudFsKICAgIC8vICAgICBzZW5kZXJfaG9sZGluZ19hZGRyZXNzCiAgICAvLyBdLnBhaWRfY291cG9ucwogICAgc3dhcAogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcmVwbGFjZTIgNDgKICAgIGJveF9wdXQKICAgIGIgYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxNwoKYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUA2CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X2RlZmF1bHRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExMC0xMTEKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTEyCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjQgLy8gImRlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTE0LTExNQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTYKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMyAvLyAic3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN1c3BlbmRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5jb3VudF9kdWVfY291cG9ucygpIC0+IHVpbnQ2NDoKY291bnRfZHVlX2NvdXBvbnM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NTAtNTEKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgY291bnRfZHVlX2NvdXBvbnMoc2VsZikgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1MgogICAgLy8gY3VycmVudF90cyA9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1MwogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmR1ZV9jb3Vwb25zX3dhdGVybWFyawogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI1IC8vICJkdWVfY291cG9uc193YXRlcm1hcmsiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZHVlX2NvdXBvbnNfd2F0ZXJtYXJrIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBpZiBjdXJyZW50X3RzID49IHNlbGYubWF0dXJpdHlfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICA+PQogICAgYnogY291bnRfZHVlX2NvdXBvbnNfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1NQogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKCmNvdW50X2R1ZV9jb3Vwb25zX2FmdGVyX2lmX2Vsc2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2NwogICAgLy8gc2VsZi5kdWVfY291cG9uc193YXRlcm1hcmsgPSBkdWVfY291cG9ucwogICAgYnl0ZWMgMjUgLy8gImR1ZV9jb3Vwb25zX3dhdGVybWFyayIKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NjgKICAgIC8vIHJldHVybiBkdWVfY291cG9ucwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmNvdW50X2R1ZV9jb3Vwb25zX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBlbGlmIGN1cnJlbnRfdHMgPiBzZWxmLmlzc3VhbmNlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGNvdW50X2R1ZV9jb3Vwb25zX2FmdGVyX2lmX2Vsc2VAOAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU3CiAgICAvLyBjb3Vwb25faWR4ID0gVUludDY0KGNmZy5GSVJTVF9DT1VQT05fREFURV9JRFgpICsgc2VsZi5kdWVfY291cG9uc193YXRlcm1hcmsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNSAvLyAiZHVlX2NvdXBvbnNfd2F0ZXJtYXJrIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmR1ZV9jb3Vwb25zX3dhdGVybWFyayBleGlzdHMKICAgIHB1c2hpbnQgMyAvLyAzCiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU4CiAgICAvLyBjb3Vwb25fZHVlX2RhdGUgPSBzZWxmLnRpbWVfZXZlbnRzLnZhbHVlW2NvdXBvbl9pZHhdLm5hdGl2ZQogICAgYnl0ZWMgMTEgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9ldmVudHMgZXhpc3RzCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKCmNvdW50X2R1ZV9jb3Vwb25zX3doaWxlX3RvcEA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU5CiAgICAvLyB3aGlsZSBjdXJyZW50X3RzID49IGNvdXBvbl9kdWVfZGF0ZToKICAgIGZyYW1lX2RpZyAxCiAgICA8PQogICAgYnogY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfd2hpbGVANgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjYxCiAgICAvLyByZXF1aXJlZF9idWRnZXQ9VUludDY0KGNmZy5PUF9VUF9DT1VQT05fRFVFX0NPVU5USU5HKSwKICAgIGludGMgNSAvLyAyNTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2MgogICAgLy8gZmVlX3NvdXJjZT1PcFVwRmVlU291cmNlLkdyb3VwQ3JlZGl0LAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2MC02MwogICAgLy8gZW5zdXJlX2J1ZGdldCgKICAgIC8vICAgICByZXF1aXJlZF9idWRnZXQ9VUludDY0KGNmZy5PUF9VUF9DT1VQT05fRFVFX0NPVU5USU5HKSwKICAgIC8vICAgICBmZWVfc291cmNlPU9wVXBGZWVTb3VyY2UuR3JvdXBDcmVkaXQsCiAgICAvLyApCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2NAogICAgLy8gY291cG9uX2lkeCArPSAxCiAgICBmcmFtZV9kaWcgMAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NjUKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IHNlbGYudGltZV9ldmVudHMudmFsdWVbY291cG9uX2lkeF0ubmF0aXZlCiAgICBieXRlYyAxMSAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50aW1lX2V2ZW50cyBleGlzdHMKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYiBjb3VudF9kdWVfY291cG9uc193aGlsZV90b3BANAoKY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfd2hpbGVANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2NgogICAgLy8gZHVlX2NvdXBvbnMgPSBjb3Vwb25faWR4IC0gY2ZnLkZJUlNUX0NPVVBPTl9EQVRFX0lEWAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMyAvLyAzCiAgICAtCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfaWZfZWxzZUA4CgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBkdWVfY291cG9uczogdWludDY0KSAtPiB2b2lkOgphc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo5Mi05NQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgZHVlX2NvdXBvbnM6IFVJbnQ2NAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6OTcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9PSBkdWVfY291cG9ucwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgYj09CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6OTYtOTgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID09IGR1ZV9jb3Vwb25zCiAgICAvLyApLCBlcnIuUEVORElOR19DT1VQT05fUEFZTUVOVAogICAgYXNzZXJ0IC8vIFBlbmRpbmcgZHVlIGNvdXBvbiBwYXltZW50CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiB1aW50NjQsIGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IHVpbnQ2NDoKYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTMyLTEzNQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgdW5pdHM6IFVJbnQ2NCwgZHVlX2NvdXBvbnM6IFVJbnQ2NAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMzYtMTM3CiAgICAvLyAjIFRoZSBmb2xsb3dpbmcgYXNzZXJ0IHNhZmVndWFyZHMgdGhlIHN1YnJvdXRpbmUgZnJvbSBmb3JiaWRkZW4gaW52b2NhdGlvbnMKICAgIC8vIHNlbGYuYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoaG9sZGluZ19hZGRyZXNzLCBkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTM4CiAgICAvLyBkYXlfY291bnRfZmFjdG9yID0gc2VsZi5kYXlfY291bnRfZmFjdG9yKGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGRheV9jb3VudF9mYWN0b3IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMzkKICAgIC8vIGNvdXBvbl9hY2NydWVkX3BlcmlvZCA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yLm5hdGl2ZQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDAKICAgIC8vIGNvdXBvbl9wZXJpb2QgPSBkYXlfY291bnRfZmFjdG9yLmRlbm9taW5hdG9yLm5hdGl2ZQogICAgc3dhcAogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTQxCiAgICAvLyBuZXh0X2NvdXBvbl9yYXRlX2JwcyA9IHNlbGYuY291cG9uX3JhdGVzLnZhbHVlWwogICAgYnl0ZWMgMTcgLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb3Vwb25fcmF0ZXMgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTQxLTE0MwogICAgLy8gbmV4dF9jb3Vwb25fcmF0ZV9icHMgPSBzZWxmLmNvdXBvbl9yYXRlcy52YWx1ZVsKICAgIC8vICAgICBkdWVfY291cG9ucwogICAgLy8gXS5uYXRpdmUgICMgZHVlX2NvdXBvbnMgaXMgZXF1YWwgdG8gdGhlIDAtYmFzZSBpZHggb2YgbmV4dCBjb3Vwb24KICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAqCiAgICBwdXNoaW50IDIgLy8gMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTQ1CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDUtMTQ2CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogbmV4dF9jb3Vwb25fcmF0ZV9icHMKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDUtMTQ3CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogbmV4dF9jb3Vwb25fcmF0ZV9icHMKICAgIC8vICogY291cG9uX2FjY3J1ZWRfcGVyaW9kCiAgICB1bmNvdmVyIDIKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDkKICAgIC8vIGNzdC5CUFMgKiBjb3Vwb25fcGVyaW9kCiAgICBwdXNoaW50IDEwMDAwIC8vIDEwMDAwCiAgICB1bmNvdmVyIDIKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDUtMTUwCiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogbmV4dF9jb3Vwb25fcmF0ZV9icHMKICAgIC8vICogY291cG9uX2FjY3J1ZWRfcGVyaW9kCiAgICAvLyAvLyAoCiAgICAvLyAgICAgY3N0LkJQUyAqIGNvdXBvbl9wZXJpb2QKICAgIC8vICkgICMgZGl2LWJ5LXplcm86IGNvdXBvbl9wZXJpb2QgIT0gMCBkdWUgdG8gYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCBjaGVja3MKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDQtMTUxCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gICAgICogbmV4dF9jb3Vwb25fcmF0ZV9icHMKICAgIC8vICAgICAqIGNvdXBvbl9hY2NydWVkX3BlcmlvZAogICAgLy8gICAgIC8vICgKICAgIC8vICAgICAgICAgY3N0LkJQUyAqIGNvdXBvbl9wZXJpb2QKICAgIC8vICAgICApICAjIGRpdi1ieS16ZXJvOiBjb3Vwb25fcGVyaW9kICE9IDAgZHVlIHRvIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQgY2hlY2tzCiAgICAvLyApCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnM6IHVpbnQ2NCkgLT4gYnl0ZXM6CmRheV9jb3VudF9mYWN0b3I6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTA3LTEwOAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBkYXlfY291bnRfZmFjdG9yKHNlbGYsIGR1ZV9jb3Vwb25zOiBVSW50NjQpIC0+IHR5cC5EYXlDb3VudEZhY3RvcjoKICAgIHByb3RvIDEgMQogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMDktMTEwCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGlmIG5vdCBkdWVfY291cG9uczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IGRheV9jb3VudF9mYWN0b3JfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMTEKICAgIC8vIGFjY3J1aW5nX3N0YXJ0X3RpbWUgPSBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCgpkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMTQKICAgIC8vIGNvdXBvbl9hY2NydWVkX3BlcmlvZCA9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIC0gYWNjcnVpbmdfc3RhcnRfdGltZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZGlnIDEKICAgIC0KICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTE1CiAgICAvLyBjb3Vwb25fcGVyaW9kID0gc2VsZi5uZXh0X2NvdXBvbl9kdWVfZGF0ZShkdWVfY291cG9ucykgLSBhY2NydWluZ19zdGFydF90aW1lCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgbmV4dF9jb3Vwb25fZHVlX2RhdGUKICAgIHN3YXAKICAgIC0KICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTE2CiAgICAvLyBpZiBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID09IFVJbnQ2NChjc3QuRENDX0FfQSk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgc3dhcAogICAgZnJhbWVfYnVyeSA0CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDEKICAgIGJueiBkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzU2CiAgICAvLyByZXR1cm4gdGltZV9wZXJpb2QgLy8gVUludDY0KGNzdC5EQVlfMl9TRUMpCiAgICBmcmFtZV9kaWcgMAogICAgaW50YyA2IC8vIDg2NDAwCiAgICAvCiAgICBmcmFtZV9kaWcgMwogICAgaW50YyA2IC8vIDg2NDAwCiAgICAvCiAgICBmcmFtZV9idXJ5IDQKICAgIGZyYW1lX2J1cnkgMQoKZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjAKICAgIC8vIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChjb3Vwb25fYWNjcnVlZF9wZXJpb2QpLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gZGVub21pbmF0b3I9YXJjNC5VSW50NjQoY291cG9uX3BlcmlvZCksCiAgICBzd2FwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTE5LTEyMgogICAgLy8gcmV0dXJuIHR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQoY291cG9uX2FjY3J1ZWRfcGVyaW9kKSwKICAgIC8vICAgICBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChjb3Vwb25fcGVyaW9kKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmRheV9jb3VudF9mYWN0b3JfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NzYKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NzcKICAgIC8vIGlmIGR1ZV9jb3Vwb25zID49IFVJbnQ2NCgxKToKICAgIGZyYW1lX2RpZyAtMQogICAgYnogZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo3OAogICAgLy8gY291cG9uX2R1ZV9kYXRlID0gc2VsZi5jb3Vwb25fZHVlX2RhdGUoZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgY291cG9uX2R1ZV9kYXRlCiAgICBmcmFtZV9idXJ5IDIKCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUA4OgogICAgZnJhbWVfZGlnIDIKICAgIGIgZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDMKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmNvdXBvbl9kdWVfZGF0ZShjb3Vwb246IHVpbnQ2NCkgLT4gdWludDY0Ogpjb3Vwb25fZHVlX2RhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NzAtNzEKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgY291cG9uX2R1ZV9kYXRlKHNlbGYsIGNvdXBvbjogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo3MgogICAgLy8gcmV0dXJuIHNlbGYudGltZV9ldmVudHMudmFsdWVbY2ZnLkZJUlNUX0NPVVBPTl9EQVRFX0lEWCArIGNvdXBvbiAtIDFdLm5hdGl2ZQogICAgcHVzaGludCAzIC8vIDMKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGJ5dGVjIDExIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRpbWVfZXZlbnRzIGV4aXN0cwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLm5leHRfY291cG9uX2R1ZV9kYXRlKGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IHVpbnQ2NDoKbmV4dF9jb3Vwb25fZHVlX2RhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6ODEtODIKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgbmV4dF9jb3Vwb25fZHVlX2RhdGUoc2VsZiwgZHVlX2NvdXBvbnM6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6ODMKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBpZiBkdWVfY291cG9ucyA8IHNlbGYudG90YWxfY291cG9uczoKICAgIGR1cAogICAgYnl0ZWMgNCAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICA+CiAgICBieiBuZXh0X2NvdXBvbl9kdWVfZGF0ZV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo4NQogICAgLy8gY291cG9uX2R1ZV9kYXRlID0gc2VsZi5jb3Vwb25fZHVlX2RhdGUoZHVlX2NvdXBvbnMgKyAxKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgY2FsbHN1YiBjb3Vwb25fZHVlX2RhdGUKICAgIGZyYW1lX2J1cnkgMAoKbmV4dF9jb3Vwb25fZHVlX2RhdGVfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyByZXR1cm4gY291cG9uX2R1ZV9kYXRlCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogdWludDY0KSAtPiB1aW50NjQ6CmFjY291bnRfdW5pdHNfdmFsdWU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDItMzQ1CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFjY291bnRfdW5pdHNfdmFsdWUoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHVuaXRzOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDYKICAgIC8vIHJldHVybiB1bml0cyAqIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUubmF0aXZlCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLnBheV9jb3Vwb24oaG9sZGluZ19hZGRyZXNzOiBieXRlcywgcGF5bWVudF9pbmZvOiBieXRlcykgLT4gYnl0ZXM6CnBheV9jb3Vwb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAyLTIwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcGF5X2NvdXBvbigKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcGF5bWVudF9pbmZvOiBhcmM0LkR5bmFtaWNCeXRlcwogICAgLy8gKSAtPiB0eXAuUGF5bWVudFJlc3VsdDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA0CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18zIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMjUtMjI2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgcmVzdHJpY3QgY2FsbGVyIGF1dGhvcml6YXRpb24KICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1c19pc19hY3RpdmUoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjI3CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMjgKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXBuIDIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMzAKICAgIC8vIHVuaXRzID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMzEKICAgIC8vIGFzc2VydCB1bml0cyA+IDAsIGVyci5OT19VTklUUwogICAgYXNzZXJ0IC8vIE5vIEQtQVNBIHVuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjMyCiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuY291bnRfZHVlX2NvdXBvbnMoKQogICAgY2FsbHN1YiBjb3VudF9kdWVfY291cG9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gYWNjb3VudF9wYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMubmF0aXZlCiAgICBzd2FwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMzQKICAgIC8vIGFzc2VydCBkdWVfY291cG9ucyA+IGFjY291bnRfcGFpZF9jb3Vwb25zLCBlcnIuTk9fRFVFX0NPVVBPTgogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBObyBkdWUgY291cG9uIHRvIHBheQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIzNS0yMzgKICAgIC8vICMgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zIHZlcmlmeSBpZiBvdGhlciBhY2NvdW50cyBhcmUgc3RpbGwgd2FpdGluZyBmb3IgdGhlIHBheW1lbnQgb2YgcHJldmlvdXMgY291cG9ucwogICAgLy8gYXNzZXJ0IHNlbGYuYWxsX2R1ZV9jb3Vwb25zX3BhaWQoCiAgICAvLyAgICAgYWNjb3VudF9wYWlkX2NvdXBvbnMKICAgIC8vICksIGVyci5QRU5ESU5HX0NPVVBPTl9QQVlNRU5UCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNDEKICAgIC8vIGlmIHNlbGYuaXNfcGF5bWVudF9leGVjdXRhYmxlKGhvbGRpbmdfYWRkcmVzcyk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgaXNfcGF5bWVudF9leGVjdXRhYmxlCiAgICBieiBwYXlfY291cG9uX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjQzCiAgICAvLyBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKSwKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjQ0CiAgICAvLyBhY2NvdW50X3BhaWRfY291cG9ucyArIDEsCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNDItMjQ1CiAgICAvLyBwYXltZW50X2Ftb3VudCA9IHNlbGYuY291cG9uX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKSwKICAgIC8vICAgICBhY2NvdW50X3BhaWRfY291cG9ucyArIDEsCiAgICAvLyApCiAgICBjYWxsc3ViIGNvdXBvbl9pbnRlcmVzdF9hbW91bnQKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI0Ni0yNDcKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gcGF5bWVudCBhZ2VudAogICAgLy8gc2VsZi5hc3NlcnRfZW5vdWdoX2Z1bmRzKHBheW1lbnRfYW1vdW50KQogICAgY2FsbHN1YiBhc3NlcnRfZW5vdWdoX2Z1bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjQ4LTI0OQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyB0aGUgc2FtZSBhc3NldCBmb3IgZGVub21pbmF0aW9uIGFuZCBzZXR0bGVtZW50LCBubyBjb252ZXJzaW9uIG5lZWRlZAogICAgLy8gc2VsZi5wYXkoc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLCBwYXltZW50X2Ftb3VudCkKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgY2FsbHN1YiBwYXkKCnBheV9jb3Vwb25fYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zLm5hdGl2ZSArIDEKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1NC0yNTYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucy5uYXRpdmUgKyAxCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjU0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBhcmM0LlVJbnQ2NCgKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1NC0yNTYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucy5uYXRpdmUgKyAxCiAgICAvLyApCiAgICBzd2FwCiAgICByZXBsYWNlMiA0OAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1NwogICAgLy8gc2VsZi5wYWlkX2NvdXBvbl91bml0cyArPSB1bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJwYWlkX2NvdXBvbl91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wYWlkX2NvdXBvbl91bml0cyBleGlzdHMKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBieXRlYyAyNiAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYW1vdW50PWFyYzQuVUludDY0KHBheW1lbnRfYW1vdW50KSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNjAKICAgIC8vIHRpbWVzdGFtcD1hcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCksCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjU4LTI2MgogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50UmVzdWx0KAogICAgLy8gICAgIGFtb3VudD1hcmM0LlVJbnQ2NChwYXltZW50X2Ftb3VudCksCiAgICAvLyAgICAgdGltZXN0YW1wPWFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSwKICAgIC8vICAgICBjb250ZXh0PXBheW1lbnRfaW5mby5jb3B5KCksICAjIFRPRE86IEFkZCBpbmZvIG9uIGZhaWxlZCBwYXltZW50CiAgICAvLyApCiAgICBjb25jYXQKICAgIGJ5dGVjIDMyIC8vIDB4MDAxMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnBheV9jb3Vwb25fZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjUxLTI1MgogICAgLy8gIyBBY2NvdW50cyBzdXNwZW5kZWQgb3Igbm90IG9wdGVkIGluIGF0IHRoZSB0aW1lIG9mIHBheW1lbnRzIG11c3Qgbm90IHN0YWxsIHRoZSBELUFTQQogICAgLy8gcGF5bWVudF9hbW91bnQgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGIgcGF5X2NvdXBvbl9hZnRlcl9pZl9lbHNlQDMKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmFsbF9kdWVfY291cG9uc19wYWlkKGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IHVpbnQ2NDoKYWxsX2R1ZV9jb3Vwb25zX3BhaWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6ODgtODkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYWxsX2R1ZV9jb3Vwb25zX3BhaWQoc2VsZiwgZHVlX2NvdXBvbnM6IFVJbnQ2NCkgLT4gYm9vbDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjkwCiAgICAvLyByZXR1cm4gc2VsZi5wYWlkX2NvdXBvbl91bml0cyA+PSBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogZHVlX2NvdXBvbnMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNiAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgID49CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5pc19wYXltZW50X2V4ZWN1dGFibGUoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gdWludDY0Ogppc19wYXltZW50X2V4ZWN1dGFibGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTMtMzE0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGlzX3BheW1lbnRfZXhlY3V0YWJsZShzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcykgLT4gYm9vbDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzE2CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MubmF0aXZlLmlzX29wdGVkX2luKAogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzE3CiAgICAvLyBBc3NldChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzE2LTMxOAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLm5hdGl2ZS5pc19vcHRlZF9pbigKICAgIC8vICAgICBBc3NldChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICAvLyApCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzE2LTMxOQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLm5hdGl2ZS5pc19vcHRlZF9pbigKICAgIC8vICAgICBBc3NldChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICAvLyApCiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZC5uYXRpdmUKICAgIGJ6IGlzX3BheW1lbnRfZXhlY3V0YWJsZV9ib29sX2ZhbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxOQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQubmF0aXZlCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGMgNCAvLyA0NDgKICAgIGdldGJpdAogICAgYnl0ZWMgMTAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBibnogaXNfcGF5bWVudF9leGVjdXRhYmxlX2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKCmlzX3BheW1lbnRfZXhlY3V0YWJsZV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTUtMzIwCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5uYXRpdmUuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgICAgIEFzc2V0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCkKICAgIC8vICAgICApCiAgICAvLyAgICAgYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQubmF0aXZlCiAgICAvLyApCiAgICBzd2FwCiAgICByZXRzdWIKCmlzX3BheW1lbnRfZXhlY3V0YWJsZV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgYiBpc19wYXltZW50X2V4ZWN1dGFibGVfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6CmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDgtMzQ5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzUxCiAgICAvLyBob2xkaW5nX2FkZHJlc3MsIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1MC0zNTIKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoCiAgICAvLyAgICAgaG9sZGluZ19hZGRyZXNzLCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgY2FsbHN1YiBhY2NvdW50X3VuaXRzX3ZhbHVlCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmNvdXBvbl9pbnRlcmVzdF9hbW91bnQocHJpbmNpcGFsX2Ftb3VudDogdWludDY0LCBjb3Vwb246IHVpbnQ2NCkgLT4gdWludDY0Ogpjb3Vwb25faW50ZXJlc3RfYW1vdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEwMC0xMDMKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgY291cG9uX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZWxmLCBwcmluY2lwYWxfYW1vdW50OiBVSW50NjQsIGNvdXBvbjogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gY291cG9uX3JhdGVfYnBzID0gc2VsZi5jb3Vwb25fcmF0ZXMudmFsdWVbY291cG9uIC0gMV0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBieXRlYyAxNyAvLyAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdXBvbl9yYXRlcyBleGlzdHMKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBwdXNoaW50IDIgLy8gMgogICAgKgogICAgcHVzaGludCAyIC8vIDIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEwNQogICAgLy8gcmV0dXJuIHByaW5jaXBhbF9hbW91bnQgKiBjb3Vwb25fcmF0ZV9icHMgLy8gY3N0LkJQUwogICAgZnJhbWVfZGlnIC0yCiAgICAqCiAgICBwdXNoaW50IDEwMDAwIC8vIDEwMDAwCiAgICAvCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfZW5vdWdoX2Z1bmRzKHBheW1lbnRfYW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6CmFzc2VydF9lbm91Z2hfZnVuZHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjItMzIzCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9lbm91Z2hfZnVuZHMoc2VsZiwgcGF5bWVudF9hbW91bnQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzI1CiAgICAvLyBBc3NldChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjUtMzI2CiAgICAvLyBBc3NldChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vID49IHBheW1lbnRfYW1vdW50CiAgICBmcmFtZV9kaWcgLTEKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjQtMzI3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIEFzc2V0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCkuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gICAgID49IHBheW1lbnRfYW1vdW50CiAgICAvLyApLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5wYXkocmVjZWl2ZXI6IGJ5dGVzLCBhbW91bnQ6IHVpbnQ2NCkgLT4gdm9pZDoKcGF5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzI5LTMzMAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBwYXkoc2VsZiwgcmVjZWl2ZXI6IGFyYzQuQWRkcmVzcywgYW1vdW50OiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMzMS0zMzYKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlci5uYXRpdmUsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzM1CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzMyCiAgICAvLyB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzMxCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMzEtMzM2CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIubmF0aXZlLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLnBheV9wcmluY2lwYWwoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgcGF5bWVudF9pbmZvOiBieXRlcykgLT4gYnl0ZXM6CnBheV9wcmluY2lwYWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjY0LTI2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcGF5X3ByaW5jaXBhbCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcGF5bWVudF9pbmZvOiBhcmM0LkR5bmFtaWNCeXRlcwogICAgLy8gKSAtPiB0eXAuUGF5bWVudFJlc3VsdDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA0CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18zIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ0My00NDQKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCByZXN0cmljdCBjYWxsZXIgYXV0aG9yaXphdGlvbgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ0NQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NDYKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXBuIDIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ0OAogICAgLy8gdW5pdHMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NDkKICAgIC8vIGFzc2VydCB1bml0cyA+IDAsIGVyci5OT19VTklUUwogICAgYXNzZXJ0IC8vIE5vIEQtQVNBIHVuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NTAKICAgIC8vIGFzc2VydCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLm1hdHVyaXR5X2RhdGUsIGVyci5OT1RfTUFUVVJFCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgbWF0dXJlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjkxCiAgICAvLyBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyODktMjkyCiAgICAvLyAjIFByaW5jaXBhbCBwYXltZW50IGlzIGZvcmJpZGRlbiBpbiBjYXNlIG9mIHBlbmRpbmcgY291cG9uIHBheW1lbnRzCiAgICAvLyBhc3NlcnQgc2VsZi5hbGxfZHVlX2NvdXBvbnNfcGFpZCgKICAgIC8vICAgICBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIC8vICksIGVyci5QRU5ESU5HX0NPVVBPTl9QQVlNRU5UCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyOTUKICAgIC8vIGlmIHNlbGYuaXNfcGF5bWVudF9leGVjdXRhYmxlKGhvbGRpbmdfYWRkcmVzcyk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgaXNfcGF5bWVudF9leGVjdXRhYmxlCiAgICBieiBwYXlfcHJpbmNpcGFsX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6Mjk2CiAgICAvLyBwYXltZW50X2Ftb3VudCA9IHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgYWNjb3VudF90b3RhbF91bml0c192YWx1ZQogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6Mjk3LTI5OAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBwYXltZW50IGFnZW50CiAgICAvLyBzZWxmLmFzc2VydF9lbm91Z2hfZnVuZHMocGF5bWVudF9hbW91bnQpCiAgICBjYWxsc3ViIGFzc2VydF9lbm91Z2hfZnVuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyOTktMzAwCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIHRoZSBzYW1lIGFzc2V0IGZvciBkZW5vbWluYXRpb24gYW5kIHNldHRsZW1lbnQsIG5vIGNvbnZlcnNpb24gbmVlZGVkCiAgICAvLyBzZWxmLnBheShzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MsIHBheW1lbnRfYW1vdW50KQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBzd2FwCiAgICBjYWxsc3ViIHBheQoKcGF5X3ByaW5jaXBhbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NTcKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgLT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLQogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDU4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KCkKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGJ5dGVjIDggLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICByZXBsYWNlMiAzMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDU5CiAgICAvLyBzZWxmLmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cygpCiAgICBjYWxsc3ViIGVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjMwNwogICAgLy8gYW1vdW50PWFyYzQuVUludDY0KHBheW1lbnRfYW1vdW50KSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMDgKICAgIC8vIHRpbWVzdGFtcD1hcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCksCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzA2LTMxMAogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50UmVzdWx0KAogICAgLy8gICAgIGFtb3VudD1hcmM0LlVJbnQ2NChwYXltZW50X2Ftb3VudCksCiAgICAvLyAgICAgdGltZXN0YW1wPWFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSwKICAgIC8vICAgICBjb250ZXh0PXBheW1lbnRfaW5mby5jb3B5KCksICAjIFRPRE86IEFkZCBpbmZvIG9uIGZhaWxlZCBwYXltZW50CiAgICAvLyApCiAgICBjb25jYXQKICAgIGJ5dGVjIDMyIC8vIDB4MDAxMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgc3dhcAogICAgcmV0c3ViCgpwYXlfcHJpbmNpcGFsX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjMwMi0zMDMKICAgIC8vICMgQWNjb3VudHMgc3VzcGVuZGVkIG9yIG5vdCBvcHRlZCBpbiBhdCB0aGUgdGltZSBvZiBwYXltZW50cyBtdXN0IG5vdCBzdGFsbCB0aGUgRC1BU0EKICAgIC8vIHBheW1lbnRfYW1vdW50ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBiIHBheV9wcmluY2lwYWxfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzKCkgLT4gdm9pZDoKZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzY0LTM2NQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzY2CiAgICAvLyBpZiBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzID09IDA6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBibnogZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzY3CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0VOREVEKQogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgaW50YyA3IC8vIDIwMAogICAgYXBwX2dsb2JhbF9wdXQKCmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0c19hZnRlcl9pZl9lbHNlQDI6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMTItMzE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCB1bml0czogYXJjNC5VSW50NjQKICAgIC8vICkgLT4gdHlwLkN1cnJlbnRVbml0c1ZhbHVlOgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMzMKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMzMtMzM0CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjMzNAogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzMzLTMzNAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMzItMzM1CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyApLCBlcnIuTk9fUFJJTUFSWV9ESVNUUklCVVRJT04KICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzM4CiAgICAvLyAwIDwgdW5pdHMgPD0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ5dGVjIDggLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPgogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDcKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgaXRvYgogICAgZnJhbWVfZGlnIC0xCiAgICBiPj0KICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA3CiAgICBpbnRjXzEgLy8gMQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzM3LTMzOQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICAwIDwgdW5pdHMgPD0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9VTklUUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYW1vdW50IG9mIHVuaXRzIGZvciB0aGUgYWNjb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM0MwogICAgLy8gaG9sZGluZ19hZGRyZXNzLCB1bml0cy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNDEtMzQ0CiAgICAvLyAjIFZhbHVlIGR1cmluZyBwcmltYXJ5IGRpc3RyaWJ1dGlvbiBhbmQgYXQgbWF0dXJpdHkKICAgIC8vIGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSA9IHNlbGYuYWNjb3VudF91bml0c192YWx1ZSgKICAgIC8vICAgICBob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZQogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM0NS0zNDYKICAgIC8vICMgQWNjcnVpbmcgaW50ZXJlc3QgZHVyaW5nIHByaW1hcnkgZGlzdHJpYnV0aW9uIGFuZCBhdCBtYXR1cml0eQogICAgLy8gYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzQ3CiAgICAvLyBudW1lcmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM0OAogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM1MC0zNTEKICAgIC8vICMgQWNjcnVpbmcgaW50ZXJlc3QKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM1MgogICAgLy8gc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChob2xkaW5nX2FkZHJlc3MsIGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0yCiAgICBkaWcgMQogICAgY2FsbHN1YiBhc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM1MwogICAgLy8gaWYgc2VsZi5pc19hY2NydWluZ19pbnRlcmVzdChkdWVfY291cG9ucyk6CiAgICBjYWxsc3ViIGlzX2FjY3J1aW5nX2ludGVyZXN0CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNTQKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjYWxsc3ViIGRheV9jb3VudF9mYWN0b3IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNTUtMzU3CiAgICAvLyBhY2NydWVkX2ludGVyZXN0ID0gc2VsZi5hY2NydWVkX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZSwgZHVlX2NvdXBvbnMKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIDYKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzU4CiAgICAvLyBudW1lcmF0b3IgPSBkYXlfY291bnRfZmFjdG9yLm51bWVyYXRvci5uYXRpdmUKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNTkKICAgIC8vIGRlbm9taW5hdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvci5uYXRpdmUKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfYnVyeSAzCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzYxCiAgICAvLyB1bml0c192YWx1ZT1hcmM0LlVJbnQ2NChhY2NvdW50X3VuaXRzX25vbWluYWxfdmFsdWUpLAogICAgZnJhbWVfZGlnIDEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNjIKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3Q9YXJjNC5VSW50NjQoYWNjcnVlZF9pbnRlcmVzdCksCiAgICBmcmFtZV9kaWcgMgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM2NAogICAgLy8gbnVtZXJhdG9yPWFyYzQuVUludDY0KG51bWVyYXRvciksCiAgICBmcmFtZV9kaWcgNQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM2NQogICAgLy8gZGVub21pbmF0b3I9YXJjNC5VSW50NjQoZGVub21pbmF0b3IpLAogICAgZnJhbWVfZGlnIDMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNjMtMzY2CiAgICAvLyBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIC8vICAgICBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICAvLyApLAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzYwLTM2NwogICAgLy8gcmV0dXJuIHR5cC5DdXJyZW50VW5pdHNWYWx1ZSgKICAgIC8vICAgICB1bml0c192YWx1ZT1hcmM0LlVJbnQ2NChhY2NvdW50X3VuaXRzX25vbWluYWxfdmFsdWUpLAogICAgLy8gICAgIGFjY3J1ZWRfaW50ZXJlc3Q9YXJjNC5VSW50NjQoYWNjcnVlZF9pbnRlcmVzdCksCiAgICAvLyAgICAgZGF5X2NvdW50X2ZhY3Rvcj10eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgICAgIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChudW1lcmF0b3IpLAogICAgLy8gICAgICAgICBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VAOAoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgYiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5maXhlZF9jb3Vwb25fYm9uZC5jb250cmFjdC5GaXhlZENvdXBvbkJvbmQuaXNfYWNjcnVpbmdfaW50ZXJlc3QoZHVlX2NvdXBvbnM6IHVpbnQ2NCkgLT4gdWludDY0Ogppc19hY2NydWluZ19pbnRlcmVzdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjQtMTI1CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGlzX2FjY3J1aW5nX2ludGVyZXN0KHNlbGYsIGR1ZV9jb3Vwb25zOiBVSW50NjQpIC0+IGJvb2w6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjcKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEyNy0xMjkKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyBhbmQgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIGJ6IGlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEyOAogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTI3LTEyOQogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlICE9IDAKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vIGFuZCBkdWVfY291cG9ucyA8IHNlbGYudG90YWxfY291cG9ucwogICAgYnogaXNfYWNjcnVpbmdfaW50ZXJlc3RfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTI5CiAgICAvLyBhbmQgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgIT0gMAogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gYW5kIGR1ZV9jb3Vwb25zIDwgc2VsZi50b3RhbF9jb3Vwb25zCiAgICBieiBpc19hY2NydWluZ19pbnRlcmVzdF9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTI2LTEzMAogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmlzc3VhbmNlX2RhdGUgIT0gMAogICAgLy8gICAgIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vICAgICBhbmQgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIC8vICkKICAgIHJldHN1YgoKaXNfYWNjcnVpbmdfaW50ZXJlc3RfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjYtMTMwCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICAvLyAgICAgYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gICAgIGFuZCBkdWVfY291cG9ucyA8IHNlbGYudG90YWxfY291cG9ucwogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5nZXRfY291cG9uX3JhdGVzKCkgLT4gYnl0ZXM6CmdldF9jb3Vwb25fcmF0ZXM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzY5LTM3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2NvdXBvbl9yYXRlcyhzZWxmKSAtPiB0eXAuQ291cG9uUmF0ZXM6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNzcKICAgIC8vIGNvdXBvbl9yYXRlcyA9IHR5cC5Db3Vwb25SYXRlcygpCiAgICBieXRlYyAzMyAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMyAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6Mzc4CiAgICAvLyBpZiBzZWxmLnN0YXR1c19pc19hY3RpdmUoKToKICAgIGJ6IGdldF9jb3Vwb25fcmF0ZXNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6Mzc5CiAgICAvLyBjb3Vwb25fcmF0ZXMgPSBzZWxmLmNvdXBvbl9yYXRlcy52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDE3IC8vIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MwogICAgYm94X2dldAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb3Vwb25fcmF0ZXMgZXhpc3RzCgpnZXRfY291cG9uX3JhdGVzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozODAKICAgIC8vIHJldHVybiBjb3Vwb25fcmF0ZXMKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmdldF9wYXltZW50X2Ftb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X3BheW1lbnRfYW1vdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM4Mi0zODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9wYXltZW50X2Ftb3VudChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcykgLT4gdHlwLlBheW1lbnRBbW91bnRzOgogICAgcHJvdG8gMSAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3NAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6Mzk3CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozOTctMzk4CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBVSW50NjQoKQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IFVJbnQ2NCgpCiAgICBkdXBuIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18zIC8vIDEwMAogICAgPT0KICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozOTkKICAgIC8vIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpOgogICAgYnogZ2V0X3BheW1lbnRfYW1vdW50X2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQwMAogICAgLy8gcGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zLm5hdGl2ZQogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQwMQogICAgLy8gaWYgcGFpZF9jb3Vwb25zIDwgc2VsZi50b3RhbF9jb3Vwb25zOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIDwKICAgIGJ6IGdldF9wYXltZW50X2Ftb3VudF9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcyksCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWNjb3VudF90b3RhbF91bml0c192YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQwNQogICAgLy8gcGFpZF9jb3Vwb25zICsgMSwKICAgIGZyYW1lX2RpZyAwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQwMi00MDYKICAgIC8vICMgQ291cG9uIFBheW1lbnQKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IHNlbGYuY291cG9uX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnMgKyAxLAogICAgLy8gKQogICAgY2FsbHN1YiBjb3Vwb25faW50ZXJlc3RfYW1vdW50CiAgICBmcmFtZV9idXJ5IDIKCmdldF9wYXltZW50X2Ftb3VudF9hZnRlcl9pZl9lbHNlQDQ6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfYnVyeSA0CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSA1CgpnZXRfcGF5bWVudF9hbW91bnRfYWZ0ZXJfaWZfZWxzZUA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDExCiAgICAvLyBpbnRlcmVzdD1hcmM0LlVJbnQ2NChpbnRlcmVzdF9hbW91bnQpLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQxMgogICAgLy8gcHJpbmNpcGFsPWFyYzQuVUludDY0KHByaW5jaXBhbF9hbW91bnQpLAogICAgc3dhcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQxMC00MTMKICAgIC8vIHJldHVybiB0eXAuUGF5bWVudEFtb3VudHMoCiAgICAvLyAgICAgaW50ZXJlc3Q9YXJjNC5VSW50NjQoaW50ZXJlc3RfYW1vdW50KSwKICAgIC8vICAgICBwcmluY2lwYWw9YXJjNC5VSW50NjQocHJpbmNpcGFsX2Ftb3VudCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfcGF5bWVudF9hbW91bnRfZWxzZV9ib2R5QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDA4LTQwOQogICAgLy8gIyBQcmluY2lwYWwgUGF5bWVudAogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWNjb3VudF90b3RhbF91bml0c192YWx1ZQogICAgZnJhbWVfYnVyeSAzCiAgICBiIGdldF9wYXltZW50X2Ftb3VudF9hZnRlcl9pZl9lbHNlQDQKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmdldF9jb3Vwb25zX3N0YXR1cygpIC0+IGJ5dGVzOgpnZXRfY291cG9uc19zdGF0dXM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDE1LTQxNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2NvdXBvbnNfc3RhdHVzKHNlbGYpIC0+IHR5cC5Db3Vwb25zSW5mbzoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQyNAogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQyNQogICAgLy8gbmV4dF9jb3Vwb25fZHVlX2RhdGUgPSBzZWxmLm5leHRfY291cG9uX2R1ZV9kYXRlKGR1ZV9jb3Vwb25zKQogICAgY2FsbHN1YiBuZXh0X2NvdXBvbl9kdWVfZGF0ZQogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQyNgogICAgLy8gYWxsX2R1ZV9jb3Vwb25zX3BhaWQgPSBzZWxmLmFsbF9kdWVfY291cG9uc19wYWlkKGR1ZV9jb3Vwb25zKQogICAgZHVwCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDI3CiAgICAvLyBudW1lcmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MjgKICAgIC8vIGRlbm9taW5hdG9yID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDI5CiAgICAvLyBpZiBzZWxmLmlzX2FjY3J1aW5nX2ludGVyZXN0KGR1ZV9jb3Vwb25zKToKICAgIGNhbGxzdWIgaXNfYWNjcnVpbmdfaW50ZXJlc3QKICAgIGJ6IGdldF9jb3Vwb25zX3N0YXR1c19hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MzAKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgMAogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDMxCiAgICAvLyBudW1lcmF0b3IgPSBkYXlfY291bnRfZmFjdG9yLm51bWVyYXRvci5uYXRpdmUKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MzIKICAgIC8vIGRlbm9taW5hdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvci5uYXRpdmUKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfYnVyeSA0CgpnZXRfY291cG9uc19zdGF0dXNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQzNAogICAgLy8gdG90YWxfY291cG9ucz1hcmM0LlVJbnQ2NChzZWxmLnRvdGFsX2NvdXBvbnMpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MzUKICAgIC8vIGR1ZV9jb3Vwb25zPWFyYzQuVUludDY0KGR1ZV9jb3Vwb25zKSwKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDM2CiAgICAvLyBuZXh0X2NvdXBvbl9kdWVfZGF0ZT1hcmM0LlVJbnQ2NChuZXh0X2NvdXBvbl9kdWVfZGF0ZSksCiAgICBmcmFtZV9kaWcgMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQzOAogICAgLy8gbnVtZXJhdG9yPWFyYzQuVUludDY0KG51bWVyYXRvciksCiAgICBmcmFtZV9kaWcgMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQzOQogICAgLy8gZGVub21pbmF0b3I9YXJjNC5VSW50NjQoZGVub21pbmF0b3IpLAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MzctNDQwCiAgICAvLyBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIC8vICAgICBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICAvLyApLAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDQxCiAgICAvLyBhbGxfZHVlX2NvdXBvbnNfcGFpZD1hcmM0LkJvb2woYWxsX2R1ZV9jb3Vwb25zX3BhaWQpLAogICAgYnl0ZWMgMTAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MzMtNDQyCiAgICAvLyByZXR1cm4gdHlwLkNvdXBvbnNJbmZvKAogICAgLy8gICAgIHRvdGFsX2NvdXBvbnM9YXJjNC5VSW50NjQoc2VsZi50b3RhbF9jb3Vwb25zKSwKICAgIC8vICAgICBkdWVfY291cG9ucz1hcmM0LlVJbnQ2NChkdWVfY291cG9ucyksCiAgICAvLyAgICAgbmV4dF9jb3Vwb25fZHVlX2RhdGU9YXJjNC5VSW50NjQobmV4dF9jb3Vwb25fZHVlX2RhdGUpLAogICAgLy8gICAgIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIC8vICAgICAgICAgZGVub21pbmF0b3I9YXJjNC5VSW50NjQoZGVub21pbmF0b3IpLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYWxsX2R1ZV9jb3Vwb25zX3BhaWQ9YXJjNC5Cb29sKGFsbF9kdWVfY291cG9uc19wYWlkKSwKICAgIC8vICkKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2V0X2NyZWF0ZShhcnJhbmdlcjogYnl0ZXMsIG1ldGFkYXRhOiBieXRlcykgLT4gdm9pZDoKYXNzZXRfY3JlYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDYxLTQ2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICAvLyBkZWYgYXNzZXRfY3JlYXRlKHNlbGYsIGFycmFuZ2VyOiBhcmM0LkFkZHJlc3MsIG1ldGFkYXRhOiB0eXAuQXNzZXRNZXRhZGF0YSkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gYXJyYW5nZXIubmF0aXZlCiAgICBieXRlYyAxOCAvLyAweDUyMzIzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzEKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YS5ieXRlcwogICAgYnl0ZWMgMjAgLy8gIm1ldGFkYXRhIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXRfdXBkYXRlKG1ldGFkYXRhOiBieXRlcykgLT4gdm9pZDoKYXNzZXRfdXBkYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDczLTQ3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIGFzc2V0X3VwZGF0ZShzZWxmLCBtZXRhZGF0YTogdHlwLkFzc2V0TWV0YWRhdGEpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3OC00ODEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgZGlzYWJsZSBELUFTQSBhcHBsaWNhdGlvbiB1cGRhdGFiaWxpdHkgb3IgY2hhbmdlIGl0cyBhdXRob3JpemF0aW9ucy4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleSBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ4MgogICAgLy8gc2VsZi5tZXRhZGF0YSA9IG1ldGFkYXRhLmJ5dGVzCiAgICBieXRlYyAyMCAvLyAibWV0YWRhdGEiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExOC0xMTkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYuYXJyYW5nZXIudmFsdWUsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAweDUyMzIzMDIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NldF9jb25maWcoZGVub21pbmF0aW9uX2Fzc2V0X2lkOiBieXRlcywgc2V0dGxlbWVudF9hc3NldF9pZDogYnl0ZXMsIHByaW5jaXBhbDogYnl0ZXMsIHByaW5jaXBhbF9kaXNjb3VudDogYnl0ZXMsIG1pbmltdW1fZGVub21pbmF0aW9uOiBieXRlcywgZGF5X2NvdW50X2NvbnZlbnRpb246IGJ5dGVzLCBpbnRlcmVzdF9yYXRlOiBieXRlcywgY291cG9uX3JhdGVzOiBieXRlcywgdGltZV9ldmVudHM6IGJ5dGVzLCB0aW1lX3BlcmlvZHM6IGJ5dGVzKSAtPiB2b2lkOgphc3NldF9jb25maWc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0ODQtNDk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhc3NldF9jb25maWcoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHByaW5jaXBhbDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgcHJpbmNpcGFsX2Rpc2NvdW50OiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBtaW5pbXVtX2Rlbm9taW5hdGlvbjogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb246IGFyYzQuVUludDgsCiAgICAvLyAgICAgaW50ZXJlc3RfcmF0ZTogYXJjNC5VSW50MTYsCiAgICAvLyAgICAgY291cG9uX3JhdGVzOiB0eXAuQ291cG9uUmF0ZXMsCiAgICAvLyAgICAgdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzLAogICAgLy8gICAgIHRpbWVfcGVyaW9kczogdHlwLlRpbWVQZXJpb2RzLAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMTAgMAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MjcKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUyOAogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfRU1QVFksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTMwLTUzMQogICAgLy8gIyBTZXQgRGVub21pbmF0aW9uIEFzc2V0CiAgICAvLyBzZWxmLmFzc2VydF9kZW5vbWluYXRpb25fYXNzZXQoZGVub21pbmF0aW9uX2Fzc2V0X2lkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMTAKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTgwCiAgICAvLyBkZW5vbWluYXRpb25fYXNzZXRfaWQgIT0gVUludDY0KDApIGFuZCBBc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQpLmNyZWF0b3IKICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQKICAgIGZyYW1lX2RpZyA0CiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCmFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzgtMTgxCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQgIT0gVUludDY0KDApIGFuZCBBc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQpLmNyZWF0b3IKICAgIC8vICksIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODUKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZnJhbWVfZGlnIDQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzQtNTM1CiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuYXNzZXJ0X3NldHRsZW1lbnRfYXNzZXQoc2V0dGxlbWVudF9hc3NldF9pZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTkKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkIGV4aXN0cwogICAgZGlnIDEKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODktMTkyCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyA3IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5Ny0yMDMKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5OQogICAgLy8geGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjAwCiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk3LTE5OAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTctMjAzCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQwCiAgICAvLyBwcmluY2lwYWwubmF0aXZlICUgbWluaW11bV9kZW5vbWluYXRpb24ubmF0aXZlID09IDAKICAgIGZyYW1lX2RpZyAtOAogICAgYnRvaQogICAgZnJhbWVfZGlnIC02CiAgICBidG9pCiAgICBkdXAyCiAgICAlCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzgtNTQxCiAgICAvLyAjIFNldCBQcmluY2lwYWwgYW5kIE1pbmltdW0gRGVub21pbmF0aW9uCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByaW5jaXBhbC5uYXRpdmUgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUgPT0gMAogICAgLy8gKSwgZXJyLklOVkFMSURfTUlOSU1VTV9ERU5PTUlOQVRJT04KICAgIGFzc2VydCAvLyBNaW5pbXVtIGRlbm9taW5hdGlvbiBpcyBub3QgYSBkaXZpc29yIG9mIHByaW5jaXBhbAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQyCiAgICAvLyBzZWxmLnVuaXRfdmFsdWUgPSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUKICAgIGJ5dGVjIDEyIC8vICJ1bml0X3ZhbHVlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NDMKICAgIC8vIHNlbGYudG90YWxfdW5pdHMgPSBwcmluY2lwYWwubmF0aXZlIC8vIG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZQogICAgLwogICAgYnl0ZWMgMTQgLy8gInRvdGFsX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU0NAogICAgLy8gc2VsZi5wcmluY2lwYWxfZGlzY291bnQgPSBwcmluY2lwYWxfZGlzY291bnQubmF0aXZlCiAgICBmcmFtZV9kaWcgLTcKICAgIGJ0b2kKICAgIGJ5dGVjIDIxIC8vICJwcmluY2lwYWxfZGlzY291bnQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQ2LTU0NwogICAgLy8gIyBTZXQgRGF5LUNvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuYXNzZXJ0X2RheV9jb3VudF9jb252ZW50aW9uKGRheV9jb3VudF9jb252ZW50aW9uLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtNQogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNy0yMTEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGZyYW1lX2RpZyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTAKICAgIC8vIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgaW50YyA1IC8vIDI1NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjA3LTIxMQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgPT0KICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDE3Cgphc3NldF9jb25maWdfYm9vbF90cnVlQDE2OgogICAgaW50Y18xIC8vIDEKCmFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjA3LTIxMQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIxNQogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IGRheV9jb3VudF9jb252ZW50aW9uCiAgICBieXRlYyAxMyAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBmcmFtZV9kaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU1MC01NTEKICAgIC8vICMgU2V0IEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYuYXNzZXJ0X2ludGVyZXN0X3JhdGUoaW50ZXJlc3RfcmF0ZS5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTQKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjE5LTIyMAogICAgLy8gIyBUaGlzIHN1YnJvdXRpbmUgbXVzdCBiZSB1c2VkIGFmdGVyIHRoZSBwcmluY2lwYWwgZGlzY291bnQgaGFzIGJlZW4gc2V0CiAgICAvLyBpZiBub3Qgc2VsZi5wcmluY2lwYWxfZGlzY291bnQ6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gInByaW5jaXBhbF9kaXNjb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmluY2lwYWxfZGlzY291bnQgZXhpc3RzCiAgICBibnogYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyMQogICAgLy8gYXNzZXJ0IGludGVyZXN0X3JhdGUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0lOVEVSRVNUX1JBVEUKICAgIGZyYW1lX2RpZyAyCiAgICBhc3NlcnQgLy8gSW50ZXJlc3QgcmF0ZSBpcyBub3QgcHJvcGVybHkgZGVmaW5lZAoKYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMjUKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IGludGVyZXN0X3JhdGUKICAgIGJ5dGVjIDI3IC8vICJpbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDgKICAgIC8vIGFzc2VydCBjb3Vwb25fcmF0ZXMubGVuZ3RoLCBlcnIuSU5WQUxJRF9DT1VQT05fUkFURVMKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGFzc2VydCAvLyBDb3Vwb24gcmF0ZXMgYXJlIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMzMKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IGNvdXBvbl9yYXRlcy5sZW5ndGgKICAgIGJ5dGVjIDQgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjM0CiAgICAvLyBpZiBzZWxmLnRvdGFsX2NvdXBvbnM6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgYnogYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gc2VsZi5jb3Vwb25fcmF0ZXMudmFsdWUgPSBjb3Vwb25fcmF0ZXMuY29weSgpCiAgICBieXRlYyAxNyAvLyAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMTcgLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBmcmFtZV9kaWcgLTMKICAgIGJveF9wdXQKCmFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDMyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQwCiAgICAvLyB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIHB1c2hpbnQgNCAvLyA0CiAgICArCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjM5LTI0MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTCiAgICAvLyApLCBlcnIuSU5WQUxJRF9USU1FX0VWRU5UU19MRU5HVEgKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBsZW5ndGggaXMgaW52YWxpZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTYwCiAgICAvLyBzZWxmLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQodGltZV9ldmVudHMpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY1CiAgICAvLyBzZWxmLnRpbWVfZXZlbnRzLnZhbHVlID0gdGltZV9ldmVudHMuY29weSgpCiAgICBieXRlYyAxMSAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDExIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY2LTI2OAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY2CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgYnl0ZWMgOSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY2LTI2OAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjktMjcxCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgZHVwCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2OQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDIyIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjktMjcxCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlID0gdGltZV9ldmVudHNbY2ZnLklTU1VBTkNFX0RBVEVfSURYXS5uYXRpdmUKICAgIGV4dHJhY3QgMTYgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ5dGVjIDUgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjc0LTI3NQogICAgLy8gIyBTb21lIEQtQVNBIG1heSBub3QgaGF2ZSBhIG1hdHVyaXR5IGRhdGUgKGUuZy4sIHBlcnBldHVhbHMpCiAgICAvLyBpZiB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTOgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgcHVzaGludCA0IC8vIDQKICAgICsKICAgID09CiAgICBieiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzOAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjc2CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0aW1lX2V2ZW50c1tjZmcuTUFUVVJJVFlfREFURV9JRFhdLm5hdGl2ZQogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ5dGVjIDYgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODAKICAgIC8vIGFzc2VydCBub3QgdGltZV9wZXJpb2RzLmxlbmd0aCwgZXJyLklOVkFMSURfVElNRV9QRVJJT0RTCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgIQogICAgYXNzZXJ0IC8vIFRpbWUgcGVyaW9kcyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU2NwogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoY2ZnLlNUQVRVU19BQ1RJVkUpCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBpbnRjXzMgLy8gMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgphc3NldF9jb25maWdfYm9vbF9mYWxzZUAxNzoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDE4Cgphc3NldF9jb25maWdfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQodGltZV9ldmVudHM6IGJ5dGVzKSAtPiBieXRlczoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0My0yNDQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWxmLCB0aW1lX2V2ZW50czogdHlwLlRpbWVFdmVudHMpIC0+IE5vbmU6CiAgICBwcm90byAxIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDYKICAgIC8vIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDcKICAgIC8vID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0Ni0yNDcKICAgIC8vIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXS5uYXRpdmUKICAgIC8vID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0NS0yNDgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdLm5hdGl2ZQogICAgLy8gICAgID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5JTlZBTElEX1RJTUUKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDkKICAgIC8vIGZvciBfdCBpbiB1cmFuZ2UodGltZV9ldmVudHMubGVuZ3RoIC0gMSk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMCAvLyAwCgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gZm9yIF90IGluIHVyYW5nZSh0aW1lX2V2ZW50cy5sZW5ndGggLSAxKToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl9mb3JANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUxCiAgICAvLyByZXF1aXJlZF9idWRnZXQ9VUludDY0KGNmZy5PUF9VUF9USU1FX0VWRU5UX1NPUlRJTkcpLAogICAgcHVzaGludCA2NSAvLyA2NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUyCiAgICAvLyBmZWVfc291cmNlPU9wVXBGZWVTb3VyY2UuQXBwQWNjb3VudCwgICMgQXBwIGZ1bmRzIGFyZSBub3QgYXQgcmlzayBzaW5jZSBjYWxsZXIgaXMgdHJ1c3RlZAogICAgaW50Y18xIC8vIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1MC0yNTMKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PVVJbnQ2NChjZmcuT1BfVVBfVElNRV9FVkVOVF9TT1JUSU5HKSwKICAgIC8vICAgICBmZWVfc291cmNlPU9wVXBGZWVTb3VyY2UuQXBwQWNjb3VudCwgICMgQXBwIGZ1bmRzIGFyZSBub3QgYXQgcmlzayBzaW5jZSBjYWxsZXIgaXMgdHJ1c3RlZAogICAgLy8gKQogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTQKICAgIC8vIHRpbWVfaSA9IHRpbWVfZXZlbnRzW190XS5uYXRpdmUKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjU1CiAgICAvLyB0aW1lX2YgPSB0aW1lX2V2ZW50c1tfdCArIDFdLm5hdGl2ZQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gYXNzZXJ0IHRpbWVfZiA+IHRpbWVfaSwgZXJyLklOVkFMSURfU09SVElORwogICAgPAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjU3CiAgICAvLyBpZiBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uICE9IFVJbnQ2NChjc3QuRENDX0NPTlQpOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIGludGMgNSAvLyAyNTUKICAgICE9CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjU4LTI1OQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRpbWUgcGVyaW9kcyBleHByZXNzZWQgaW4gZGF5cyBmb3IgcmVndWxhciBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCAodGltZV9mIC0gdGltZV9pKSAlIFVJbnQ2NCgKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjU4LTI2MQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRpbWUgcGVyaW9kcyBleHByZXNzZWQgaW4gZGF5cyBmb3IgcmVndWxhciBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCAodGltZV9mIC0gdGltZV9pKSAlIFVJbnQ2NCgKICAgIC8vICAgICBjc3QuREFZXzJfU0VDCiAgICAvLyApID09IDAsIGVyci5JTlZBTElEX1RJTUVfUEVSSU9ECiAgICBpbnRjIDYgLy8gODY0MDAKICAgICUKICAgICEKICAgIGFzc2VydCAvLyBUaW1lIHBlcmlvZHMgaW4gQWN0dWFsL0FjdHVhbCBkYXkgY291bnQgY29udmVudGlvbiBtdXN0IGJlIG11bHRpcGxlcyBvZiBhIGRheSAoaW4gc2Vjb25kcykKICAgIGIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDEKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDY6CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cyhzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzOiBieXRlcykgLT4gYnl0ZXM6CnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NjktNTcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKAogICAgLy8gICAgIHNlbGYsIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzCiAgICAvLyApIC0+IHR5cC5TZWNvbmRhcnlNYXJrZXRTY2hlZHVsZToKICAgIHByb3RvIDEgMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5MAogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjIDcgLy8gMjAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTkxCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTkyCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5NAogICAgLy8gYXNzZXJ0IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID49IDEsIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTUKICAgIC8vIGlmIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID4gMToKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTYKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMQogICAgZnJhbWVfYnVyeSAxCgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTgKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5OS02MDEKICAgIC8vIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5OC02MDEKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gPD0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgZGlnIDEKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTctNjAyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gICAgIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vICAgICBdLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX09QRU5JTkdfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBvcGVuaW5nIGRhdGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwMwogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDMtNjA1CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwNgogICAgLy8gaWYgc2VsZi5tYXR1cml0eV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDgKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxMAogICAgLy8gY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwOS02MTEKICAgIC8vID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwOC02MTEKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgZGlnIDEKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDctNjEyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gICAgID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vICAgICBdLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX0NMT1NVUkVfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBjbG9zdXJlIGRhdGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxMwogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTMtNjE1CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjE4CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjE3LTYxOQogICAgLy8gc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyMQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyMC02MjIKICAgIC8vIHNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTYtNjIzCiAgICAvLyByZXR1cm4gdHlwLlNlY29uZGFyeU1hcmtldFNjaGVkdWxlKAogICAgLy8gICAgIHNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgICAgICBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gICAgICksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzaWduX3JvbGUocm9sZV9hZGRyZXNzOiBieXRlcywgcm9sZTogYnl0ZXMsIGNvbmZpZzogYnl0ZXMpIC0+IGJ5dGVzOgphc3NpZ25fcm9sZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyNS02MjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2lnbl9yb2xlKAogICAgLy8gICAgIHNlbGYsIHJvbGVfYWRkcmVzczogYXJjNC5BZGRyZXNzLCByb2xlOiBhcmM0LlVJbnQ4LCBjb25maWc6IGFyYzQuRHluYW1pY0J5dGVzCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDYKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0NwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ5CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgcHVzaGludCAyMCAvLyAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgtNjU1CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUxCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MCAvLyA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MgogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MCAvLyA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MwogICAgLy8gVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwIC8vIDcwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgtNjU1CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU0CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0OC02NTUKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBhc3NpZ25fcm9sZV9ib29sX2ZhbHNlQDcKCmFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18xIC8vIDEKCmFzc2lnbl9yb2xlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0OC02NTUKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU3CiAgICAvLyBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICBwdXNoaW50cyAyMCA0MCA1MCA2MCA3MCA4MCAvLyAyMCwgNDAsIDUwLCA2MCwgNzAsIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTYtNjg1CiAgICAvLyBtYXRjaCByb2xlLm5hdGl2ZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MubmF0aXZlCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICAgICAgICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoKQogICAgZnJhbWVfZGlnIDAKICAgIG1hdGNoIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzBAOSBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8xQDEwIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzJAMTEgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzVAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4NQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfNUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3OQogICAgLy8gcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgYnl0ZWMgMzQgLy8gMHg1MjM4MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzgtNjgwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4MgogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjgxLTY4MwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gKQogICAgYm94X3B1dAoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4NgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgc3dhcAogICAgcmV0c3ViCgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njc1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyOCAvLyAweDUyMzczMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzYKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzNAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyOSAvLyAweDUyMzYzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzMKICAgIC8vIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgYm94X3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8yQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDMwIC8vIDB4NTIzNTMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2OQogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY4LTY3MAogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICBjb25maWcubmF0aXZlCiAgICAvLyApCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzFAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjEKICAgIC8vIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDMxIC8vIDB4NTIzNDMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjYwLTY2MgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjQKICAgIC8vIGNvbmZpZy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2My02NjUKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICkKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMEA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU4CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzLm5hdGl2ZQogICAgYnl0ZWMgMTggLy8gMHg1MjMyMzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NpZ25fcm9sZV9ib29sX21lcmdlQDgKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5yZXZva2Vfcm9sZShyb2xlX2FkZHJlc3M6IGJ5dGVzLCByb2xlOiBieXRlcykgLT4gYnl0ZXM6CnJldm9rZV9yb2xlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njg4LTY4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcmV2b2tlX3JvbGUoc2VsZiwgcm9sZV9hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHJvbGU6IGFyYzQuVUludDgpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDYKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwNwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDgKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA5CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzEwCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MCAvLyA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4LTcxNAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTEKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIHB1c2hpbnQgNjAgLy8gNjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzEyCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAgLy8gNzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzEzCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogcmV2b2tlX3JvbGVfYm9vbF9mYWxzZUA2CgpyZXZva2Vfcm9sZV9ib29sX3RydWVANToKICAgIGludGNfMSAvLyAxCgpyZXZva2Vfcm9sZV9ib29sX21lcmdlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDgtNzE0CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTYtNzE3CiAgICAvLyAjIEFycmFuZ2VyIHJvbGUgY2FuIG5vdCBiZSByZXZva2VkIChqdXN0IHJvdGF0ZWQpCiAgICAvLyBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludHMgNDAgNTAgNjAgNzAgODAgLy8gNDAsIDUwLCA2MCwgNzAsIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTUtNzMzCiAgICAvLyBtYXRjaCByb2xlLm5hdGl2ZToKICAgIC8vICAgICAjIEFycmFuZ2VyIHJvbGUgY2FuIG5vdCBiZSByZXZva2VkIChqdXN0IHJvdGF0ZWQpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BQ0NPVU5UX01BTkFHRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfUFJJTUFSWV9ERUFMRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1RSVVNURUUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BVVRIT1JJVFkgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmludGVyZXN0X29yYWNsZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9JTlRFUkVTVF9PUkFDTEUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoKQogICAgZnJhbWVfZGlnIDAKICAgIG1hdGNoIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzBAOCByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8xQDkgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMCByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8zQDExIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzRAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczMwogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfNEAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczMAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmludGVyZXN0X29yYWNsZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzNCAvLyAweDUyMzgzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MzEKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9JTlRFUkVTVF9PUkFDTEUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MzQKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHN3YXAKICAgIHJldHN1YgoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyNwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyOCAvLyAweDUyMzczMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjgKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BVVRIT1JJVFkgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyNAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjkgLy8gMHg1MjM2MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzI1CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfVFJVU1RFRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8xQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMCAvLyAweDUyMzUzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjIKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9QUklNQVJZX0RFQUxFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8wQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTgKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzEgLy8gMHg1MjM0MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzE5CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQUNDT1VOVF9NQU5BR0VSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX2Jvb2xfZmFsc2VANjoKICAgIGludGNfMCAvLyAwCiAgICBiIHJldm9rZV9yb2xlX2Jvb2xfbWVyZ2VANwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLm9wZW5fYWNjb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBwYXltZW50X2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKb3Blbl9hY2NvdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzM2LTczOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgb3Blbl9hY2NvdW50KAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCBwYXltZW50X2FkZHJlc3M6IGFyYzQuQWRkcmVzcwogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU2CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50YyA3IC8vIDIwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLnN0YXR1c19pc19lbmRlZCgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICAhCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1OAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTkKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzYwCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY0CiAgICAvLyB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgYnl0ZWMgOCAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2Mi03NjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjUKICAgIC8vIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDggLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY2CiAgICAvLyBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDggLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY3CiAgICAvLyBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICBieXRlYyAxMCAvLyAweDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY5CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIyLTEyMwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDMxIC8vIDB4NTIzNDMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2LTEyOQogICAgLy8gY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjcKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyOAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNy0xMjgKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjkKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyOC0xMjkKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI1LTEzMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuY2xvc2VfYWNjb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKY2xvc2VfYWNjb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc3MS03NzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGNsb3NlX2FjY291bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MKICAgIC8vICkgLT4gYXJjNC5UdXBsZVthcmM0LlVJbnQ2NCwgYXJjNC5VSW50NjRdOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODkKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzkwCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3NAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3OTMKICAgIC8vIGNsb3NlZF91bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzk0CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQUNDT1VOVCArIGhvbGRpbmdfYWRkcmVzcy5ieXRlcykKICAgIHN3YXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzk1CiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIC09IGNsb3NlZF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZGlnIDEKICAgIC0KICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5NgogICAgLy8gc2VsZi5lbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoKQogICAgY2FsbHN1YiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5OAogICAgLy8gKGFyYzQuVUludDY0KGNsb3NlZF91bml0cyksIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSkKICAgIGl0b2IKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5Ny03OTkKICAgIC8vIHJldHVybiBhcmM0LlR1cGxlKAogICAgLy8gICAgIChhcmM0LlVJbnQ2NChjbG9zZWRfdW5pdHMpLCBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkpCiAgICAvLyApCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnByaW1hcnlfZGlzdHJpYnV0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiBieXRlcykgLT4gYnl0ZXM6CnByaW1hcnlfZGlzdHJpYnV0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODAxLTgwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcHJpbWFyeV9kaXN0cmlidXRpb24oCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHVuaXRzOiBhcmM0LlVJbnQ2NAogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDQKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjXzMgLy8gMTAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg5LTI5MgogICAgLy8gc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkwCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkxCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5MC0yOTEKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTAtMjkyCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5MgogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIyIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkxLTI5MgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGZyYW1lX2RpZyAyCiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTAtMjkyCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODgtMjkzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyAgICAgYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU0VECiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgY2xvc2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICBieXRlYyAzMCAvLyAweDUyMzUzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzQKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzYtMTM5CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzcKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGVhbGVyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzgKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzctMTM4CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzctMTM5CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kZWFsZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzOC0xMzkKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNy0xMzkKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMgogICAgaW50Y18xIC8vIDEKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzUtMTQwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICAvLyAgICAgYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyOQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzAKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMxCiAgICAvLyBhc3NlcnQgdW5pdHMubmF0aXZlID4gMCwgZXJyLlpFUk9fVU5JVFMKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICBhc3NlcnQgLy8gQ2FuIG5vdCBkaXN0cmlidXRlIHplcm8gdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMwogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyArIHVuaXRzLm5hdGl2ZSA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzItODM0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKyB1bml0cy5uYXRpdmUgPD0gc2VsZi50b3RhbF91bml0cwogICAgLy8gKSwgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHJlbWFpbmluZyBELUFTQSB1bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM2CiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICs9IHVuaXRzLm5hdGl2ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZGlnIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzOAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMubmF0aXZlCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzNy04MzkKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzNy04MzkKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBzd2FwCiAgICByZXBsYWNlMiAzMgogICAgZGlnIDEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0MAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZSA9IGFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgaXRvYgogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBzd2FwCiAgICByZXBsYWNlMiA0MAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoc2VsZi50b3RhbF91bml0cyAtIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgLQogICAgaXRvYgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTI6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDEzCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfYXNzZXRfc3VzcGVuc2lvbihzdXNwZW5kZWQ6IGJ5dGVzKSAtPiBieXRlczoKc2V0X2Fzc2V0X3N1c3BlbnNpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDMtODQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfYXNzZXRfc3VzcGVuc2lvbihzZWxmLCBzdXNwZW5kZWQ6IGFyYzQuQm9vbCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg1NwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NTgKICAgIC8vIHNlbGYuc3VzcGVuZGVkID0gVUludDY0KHN1c3BlbmRlZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ5dGVjIDIzIC8vICJzdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODU5CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUyLTE1MwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIGJ5dGVjIDI4IC8vIDB4NTIzNzMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU2LTE1OQogICAgLy8gY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTcKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdXRob3JpdHkgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1OAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1Ny0xNTgKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTctMTU5CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTkKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdXRob3JpdHkgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1OC0xNTkKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTctMTU5CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU1LTE2MAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIC8vICAgICBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X2FjY291bnRfc3VzcGVuc2lvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBzdXNwZW5kZWQ6IGJ5dGVzKSAtPiBieXRlczoKc2V0X2FjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2MS04NjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9hY2NvdW50X3N1c3BlbnNpb24oCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHN1c3BlbmRlZDogYXJjNC5Cb29sCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NzkKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4MQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGludGMgNCAvLyA0NDgKICAgIHN3YXAKICAgIHNldGJpdAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODgyCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfZGVmYXVsdF9zdGF0dXMoZGVmYXVsdGVkOiBieXRlcykgLT4gdm9pZDoKc2V0X2RlZmF1bHRfc3RhdHVzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODg0LTg4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgc2V0X2RlZmF1bHRfc3RhdHVzKHNlbGYsIGRlZmF1bHRlZDogYXJjNC5Cb29sKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICBieXRlYyAyOSAvLyAweDUyMzYzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDQKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDYtMTQ5CiAgICAvLyBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDcKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJ1c3RlZSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ4CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ3LTE0OAogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDctMTQ5CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDkKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJ1c3RlZSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ4LTE0OQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDctMTQ5CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1CiAgICBpbnRjXzEgLy8gMQoKc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NS0xNTAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgLy8gICAgIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTYKICAgIC8vIHNlbGYuZGVmYXVsdGVkID0gVUludDY0KGRlZmF1bHRlZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ5dGVjIDI0IC8vICJkZWZhdWx0ZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgpzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfbWVyZ2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hc3NldF9pbmZvKCkgLT4gYnl0ZXM6CmdldF9hc3NldF9pbmZvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODk4LTg5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2luZm8oc2VsZikgLT4gdHlwLkFzc2V0SW5mbzoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTA4CiAgICAvLyBwZXJmb3JtYW5jZSA9IFVJbnQ2NChjc3QuUFJGX1BFUkZPUk1BTlQpCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDkKICAgIC8vIGlmIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID4gc2VsZi5tYXR1cml0eV9kYXRlID4gMDoKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgY292ZXIgNAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgID4KICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VAMwogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIDEKICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTEwCiAgICAvLyBwZXJmb3JtYW5jZSA9IFVJbnQ2NChjc3QuUFJGX01BVFVSRUQpCiAgICBwdXNoaW50IDQgLy8gNAogICAgZnJhbWVfYnVyeSAyCgpnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDM6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTEtOTEyCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG5vIGdyYWNlIG9yIGRlbGlucXVlbmN5IHBlcmlvZHMKICAgIC8vIGlmIHNlbGYuZGVmYXVsdGVkOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI0IC8vICJkZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVmYXVsdGVkIGV4aXN0cwogICAgYnogZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTMKICAgIC8vIHBlcmZvcm1hbmNlID0gVUludDY0KGNzdC5QUkZfREVGQVVMVEVEKQogICAgcHVzaGludCAzIC8vIDMKICAgIGZyYW1lX2J1cnkgMAoKZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE2CiAgICAvLyBkZW5vbWluYXRpb25fYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE3CiAgICAvLyBzZXR0bGVtZW50X2Fzc2V0X2lkPWFyYzQuVUludDY0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzQwCiAgICAvLyByZXR1cm4gc2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTgKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCgpKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxOQogICAgLy8gdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NChzZWxmLnVuaXRfdmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjAKICAgIC8vIGRheV9jb3VudF9jb252ZW50aW9uPWFyYzQuVUludDgoc2VsZi5kYXlfY291bnRfY29udmVudGlvbiksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgaXRvYgogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyMQogICAgLy8gcHJpbmNpcGFsX2Rpc2NvdW50PWFyYzQuVUludDE2KHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50KSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMSAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjIKICAgIC8vIGludGVyZXN0X3JhdGU9YXJjNC5VSW50MTYoc2VsZi5pbnRlcmVzdF9yYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyMwogICAgLy8gdG90YWxfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyNAogICAgLy8gY2lyY3VsYXRpbmdfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTI2CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjUtOTI3CiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjkKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjIgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjgtOTMwCiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzEKICAgIC8vIGlzc3VhbmNlX2RhdGU9YXJjNC5VSW50NjQoc2VsZi5pc3N1YW5jZV9kYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzIKICAgIC8vIG1hdHVyaXR5X2RhdGU9YXJjNC5VSW50NjQoc2VsZi5tYXR1cml0eV9kYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzMKICAgIC8vIHN1c3BlbmRlZD1hcmM0LkJvb2woYm9vbChzZWxmLnN1c3BlbmRlZCkpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIzIC8vICJzdXNwZW5kZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3VzcGVuZGVkIGV4aXN0cwogICAgYnl0ZWMgMTAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzQKICAgIC8vIHBlcmZvcm1hbmNlPWFyYzQuVUludDgocGVyZm9ybWFuY2UpLAogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTUtOTM1CiAgICAvLyByZXR1cm4gdHlwLkFzc2V0SW5mbygKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKSwKICAgIC8vICAgICBvdXRzdGFuZGluZ19wcmluY2lwYWw9YXJjNC5VSW50NjQoc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwoKSksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NChzZWxmLnVuaXRfdmFsdWUpLAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uPWFyYzQuVUludDgoc2VsZi5kYXlfY291bnRfY29udmVudGlvbiksCiAgICAvLyAgICAgcHJpbmNpcGFsX2Rpc2NvdW50PWFyYzQuVUludDE2KHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50KSwKICAgIC8vICAgICBpbnRlcmVzdF9yYXRlPWFyYzQuVUludDE2KHNlbGYuaW50ZXJlc3RfcmF0ZSksCiAgICAvLyAgICAgdG90YWxfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMpLAogICAgLy8gICAgIGNpcmN1bGF0aW5nX3N1cHBseT1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBpc3N1YW5jZV9kYXRlPWFyYzQuVUludDY0KHNlbGYuaXNzdWFuY2VfZGF0ZSksCiAgICAvLyAgICAgbWF0dXJpdHlfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLm1hdHVyaXR5X2RhdGUpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woYm9vbChzZWxmLnN1c3BlbmRlZCkpLAogICAgLy8gICAgIHBlcmZvcm1hbmNlPWFyYzQuVUludDgocGVyZm9ybWFuY2UpLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgdW5jb3ZlciAxNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hY2NvdW50X2luZm8oaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hY2NvdW50X2luZm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzctOTM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYWNjb3VudF9pbmZvKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzKSAtPiB0eXAuQWNjb3VudEluZm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3NAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTIKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF90aW1lX2V2ZW50cygpIC0+IGJ5dGVzOgpnZXRfdGltZV9ldmVudHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTQtOTU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfdGltZV9ldmVudHMoc2VsZikgLT4gdHlwLlRpbWVFdmVudHM6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2MgogICAgLy8gdGltZV9ldmVudHMgPSB0eXAuVGltZUV2ZW50cygpCiAgICBieXRlYyAzMyAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMyAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NjMKICAgIC8vIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpOgogICAgYnogZ2V0X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTY0CiAgICAvLyB0aW1lX2V2ZW50cyA9IHNlbGYudGltZV9ldmVudHMudmFsdWUuY29weSgpCiAgICBieXRlYyAxMSAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRpbWVfZXZlbnRzIGV4aXN0cwoKZ2V0X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2NQogICAgLy8gcmV0dXJuIHRpbWVfZXZlbnRzCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUoKSAtPiBieXRlczoKZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NjctOTY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZShzZWxmKSAtPiB0eXAuVGltZUV2ZW50czoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTc2CiAgICAvLyBhcmM0LlVJbnQ2NChzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NzcKICAgIC8vIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk3NS05NzgKICAgIC8vIHJldHVybiB0eXAuVGltZUV2ZW50cygKICAgIC8vICAgICBhcmM0LlVJbnQ2NChzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NChzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfYXNzZXRfbWV0YWRhdGEoKSAtPiBieXRlczoKZ2V0X2Fzc2V0X21ldGFkYXRhOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTgwLTk4MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21ldGFkYXRhKHNlbGYpIC0+IHR5cC5Bc3NldE1ldGFkYXRhOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5ODkKICAgIC8vIHJldHVybiB0eXAuQXNzZXRNZXRhZGF0YS5mcm9tX2J5dGVzKHNlbGYubWV0YWRhdGEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gIm1ldGFkYXRhIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1ldGFkYXRhIGV4aXN0cwogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLnV0aWwuZW5zdXJlX2J1ZGdldChyZXF1aXJlZF9idWRnZXQ6IHVpbnQ2NCwgZmVlX3NvdXJjZTogdWludDY0KSAtPiB2b2lkOgplbnN1cmVfYnVkZ2V0OgogICAgcHJvdG8gMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgICsKCmVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDE6CiAgICBmcmFtZV9kaWcgMAogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA3CiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgMzUgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyAzNSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2l0Y2ggZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDMgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA2OgogICAgaXR4bl9zdWJtaXQKICAgIGIgZW5zdXJlX2J1ZGdldF93aGlsZV90b3BAMQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQ6CiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANgoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDM6CiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDYKCmVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANzoKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "byteCode": { + "approval": "CiAIAAEIZMAD/wGAowXIASYkBBUffHUEUjMwIxFjaXJjdWxhdGluZ191bml0cwZzdGF0dXMNdG90YWxfY291cG9ucw1pc3N1YW5jZV9kYXRlDW1hdHVyaXR5X2RhdGUTc2V0dGxlbWVudF9hc3NldF9pZAgAAAAAAAAAACFwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUBAAp0aW1lRXZlbnRzCnVuaXRfdmFsdWUUZGF5X2NvdW50X2NvbnZlbnRpb24LdG90YWxfdW5pdHMdc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUdc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGULY291cG9uUmF0ZXMEUjIwIxVkZW5vbWluYXRpb25fYXNzZXRfaWQIbWV0YWRhdGEScHJpbmNpcGFsX2Rpc2NvdW50IXByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQlzdXNwZW5kZWQJZGVmYXVsdGVkFWR1ZV9jb3Vwb25zX3dhdGVybWFyaxFwYWlkX2NvdXBvbl91bml0cw1pbnRlcmVzdF9yYXRlBFI3MCMEUjYwIwRSNTAjBFI0MCMCABICAAAEUjgwIwMGgQExGEAAbCcSMgNnJxMiZycHImcnDCJnJw0iZycUgABnJw4iZyoiZycVImcnGyJnJwQiZycJImcnFiJnJwUiZycPImcnECJnJwYiZysiZycXImcnGCJnMTWBAhJEMTSBFBJEMTcURDE2FEQnGSJnJxoiZzEbQQCvghgET9ajzASM8UtRBJx2tqMERDY9SQRTvvBFBGfbTyAE9qlsjQQ/DvxsBCXbqVsEiUdBNAQdb8JVBP73RWcEuPwTkAQ9Q9HwBOvZay8EbIXj7gT2Os6NBLvMoYoEGnurtARALbpHBO0CdZ8E+tIXPgQI7+o1BOSlq1Q2GgCOGAHRAbsBpQGPAX8BbAFcAUkBOAEOAPsA4gDMALYAowCNAHoAZABVAEUAMgAiABIAAiJDMRkURDEYRIgOrihMULAjQzEZFEQxGESIDocoTFCwI0MxGRREMRhEiA5eKExQsCNDMRkURDEYRDYaAYgOPChMULAjQzEZFEQxGESIDV8oTFCwI0MxGRREMRhENhoBiA0PI0MxGRREMRhENhoBNhoCiAzeKExQsCNDMRkURDEYRDYaAYgMhChMULAjQzEZFEQxGEQ2GgE2GgKIC7AoTFCwI0MxGRREMRhENhoBiAtuKExQsCNDMRkURDEYRDYaATYaAogK8ShMULAjQzEZFEQxGEQ2GgE2GgKICj8oTFCwI0MxGRREMRhENhoBNhoCNhoDiAleKExQsCNDMRkURDEYRDYaAYgIzihMULAjQzEZFEQxGEQ2GgE2GgI2GgM2GgQ2GgU2GgY2Ggc2Ggg2Ggk2GgqIBw4jQzEZgQQSRDEYRDYaAYgG5CNDMRkURDEYFEQ2GgE2GgKIBsMjQzEZFEQxGESIBmEoTFCwI0MxGRREMRhENhoBiAXzKExQsCNDMRkURDEYRIgFyihMULAjQzEZFEQxGEQ2GgE2GgKIBOkoTFCwI0MxGRREMRhENhoBNhoCiARHKExQsCNDMRkURDEYRDYaATYaAogC/ShMULAjQzEZFEQxGEQ2GgE2GgI2GgOIAAYoTFCwI0OKAwEiRwKAAEmL/xciK2VEJRJBAUAiJw9lRDIHSYwEDkEBMiInEGVEiwQNQQEnI0QxAIv9EkSIASCIASgpi/1QSYwBSb1FAUQpi/5QSYwCSb1FAURLAb5EIQRTJwoiTwJUIlMUREm+RCEEUycKIk8CVCJTFERLAb5EVyAIF4sFD0RMvkRXKAiMAL5EVyAIF0EApIsBvkRXKAiLAr5EVygIqEEAjosBvkRXMAiLAr5EVzAIqEEAfCNEiAC0i/1LAYgBKYsBSU4CvkRXKAiMAIv9iwVJTgRPAogBI4wDSb5EVyAIF0sCCRZLAb5ETFwgSwFMv4sCSb5EVyAIF08DCBZLAb5ETFwgv75EVyAIF0AAFYsBSb5EJwhcKEsBTL9JvkQnCFwwv4sAF4sFC4sDCBaMAIkiQv+BiwJJvkSLAFwoSwFMv4sBvkRLAb5ETFcwCFwwv0L/YyJC/taKAAAiJxhlRBREiYoAACInF2VEFESJigABgAAyB0kiJxllTE4CRCInBmVED0EAEyInBGVMjAJEJxmLAklOAmeMAIkiJwVlRIsBDEH/6iInGWVEgQMISYwAJwu+RFcCAEwkCyRYF4sBDkEAHSEFIogLD4sAIwhJjAAnC75EVwIATCQLJFgXQv/diwCBAwmMAkL/pYoCACmL/lC+RFcwCIv/FqhEiYoDAYv9i/+I/+SL/4gALUlXAAgXTFcICBcnEb5EVwIAi/+BAguBAlgXi/2L/ogAoAtPAguBkE5PAgsKiYoBAYAARwSL/0AAQCInBWVEMgdLAQlJTgKMAIv/iABYTAlJjAMiJw1lREyMBEyMAUAADosAIQYKiwMhBgqMBIwBiwSLARZMFlCMAIkijAKL/0EAB4v/iAAHjAKLAkL/sYoBAYEDi/8IIwknC75EVwIATCQLJFgXiYoBASJJJwRlRIv/DUEACYv/IwiI/9KMAIsATImKAgEpi/5QvkRXKAgXi/8LiYoCASIrZUQlEkSI/m6I/nYpi/5QRwK9RQFESb5EVyAIF0lOAkSI/mlMvkRXMAgXSU8CSwENRIgAV0SL/ogAYkEASov+iACMiwIjCIgAmUcCiACyiwC+RFcAIEyIALmLAEm+RFcwCBcjCBZLAb5ETFwwvyInGmVEiwEIJxpMZxYyBxZQJyBQi/9QjACJIkL/zooBASInGmVEIiplRIv/Cw+JigEBKYv/UEm+RFcAICInB2VEcABFAUEAFYsAvkQhBFMnCiJPAlQiU0AAAyNMiSJC//qKAQEpi/9QvkRXIAgXi/9MiP8JiYoCAYv/IwknEb5EVwIATIECC4ECWBeL/guBkE4KiYoBADIKIicHZURwAESL/w9EiYoCALEyACInB2VEi/+yEov+shSyEYEEshCyAbOJigIBIitlRCUSRIj9Ooj9QimL/lBHAr1FAUS+RFcgCBdEMgciJwZlRA9EiP0wiP8sRIv+iP83QQBAi/6I/2FHAoj/josAvkRXACBMiP+VIiplRIsASU4CvkRXIAgXCSpMZ0m+RCcIXCC/iAARFjIHFlAnIFCL/1BMiSJC/9GKAAAiKmVEQAAEKyEHZ4mKAgEigABHBSInCWVEQQCSMgciJwllRA9BAIcjRCmL/lBJjAC9RQFEi/8nCKVBAG6LAL5EVyAIFxaL/6dBAF8jRIv/F0mMBov+TIj94owBIowCIowFIowDiPx2SYwEi/5LAYj86IgAPkEAHosESYj9Kov+iwZPA4j85YwCSVcACBeMBVcICBeMA4sBFosCFosFFosDFlBOAlBMUIwAiSJC/54iQv92igEBIicFZURBABgyByInBWVED0EADSInBGVEi/8NQQACI4kiiYoAASchIitlRCUSQQAHJxG+TIwARIsATImKAQGAACmL/1BJvUUBRCJHBCtlRCUSTE4CQQAqiwG+RFcwCBdJjAAiJwRlRAxBACGL/4j9+osAIwiI/geMAosDjASLAowFiwSLBRZMFlCMAImL/4j92YwDQv/jigABiPuMRwKI/MlMSYj9gUwiTCJMiP9PQQASiwCI/DxJVwAIF4wDVwgIF4wEIicEZUQWiwAWiwEWiwMWiwQWUCcKIosCVE8ETwRQTwNQTwJQTFCMAImKAgAnEov+ZycUi/9niYoBAIgABicUi/9niYoAADEAIicSZUQSRImKCgAigABHAoj/6CIrZUQURIv2F0lBAQ6LBHELRDIDE0EBAyNEJxOLBGeL9xciJxNlREsBEkQnB0xnsTIAIicHZUQyCiKyErIUshGBBLIQsgGzi/gXi/oXShgURCcMSwFnCicOTGeL+RcnFUxni/sXSYwBQQAIiwEhBRJBAKQjRCcNiwFni/wXjAIiJxVlREAAA4sCRCcbiwJni/0iWUlEJwRMZyInBGVEQQAJJxG8SCcRi/2/i/4iWSInBGVEgQQIEkSL/ogAYoz+Jwu8SCcLi/6/i/5XAgBJjABJVwAIFycJTGdJVwgIFycWTGdXEAgXJwVMZ4v+IllJjAMiJwRlRIEECBJBABCLAyMJJAuLAEwkWBcnBkxni/8iWRREKyVniSJC/1kiQv76igEBgABJi/9XAgBJVwAIFzIHDUSL/yJZIwkiiwSLAwxBAECBQSOIBSyLBEkkC4sCSU4DTCRYF0lOA4wBIwhJjAQkCyRYF0mMAAxEIicNZUQhBRNB/8WLAIsBCSEGGBREQv+4i/+MAImKAQEiiP5aIitlRCEHEhREiPlai/8iWUlEIw2L/0xBAAqL/4j/ckmM/4wBiwGM/yInBWVEi/9XAgBJjABXAAgXTEsBDkQnD0xnIicGZURBABwiJwZlRIv/IlkjCSQLiwBMJFgXTEsBD0QnEExnIicPZUQWIicQZUQWUIwAiYoDAYj93oj454v+F0mBFBJAACiLAIEoEkAAIIsAgTISQAAYiwCBPBJAABCLAIFGEkAACIsAgVASQQCJI0SDBhQoMjxGUIsAjgYAZwBTAD8AKwAXAAEAJyKL/VBJvUUBFESL/1cCAL8yBxZMiScci/1QSb1FARREi/9XAgC/Qv/nJx2L/VBJvUUBFESL/1cCAL9C/9MnHov9UEm9RQEURIv/VwIAv0L/vycfi/1QSb1FARREi/9XAgC/Qv+rJxKL/WdC/6MiQv90igIBiP0WiPgfi/8XSYEoEkAAIIsAgTISQAAYiwCBPBJAABCLAIFGEkAACIsAgVASQQBlI0SDBSgyPEZQiwCOBQA/ADAAIQASAAEAJyKL/lBJvUUBRLxIMgcWTIknHIv+UEm9RQFEvEhC/+wnHYv+UEm9RQFEvEhC/90nHov+UEm9RQFEvEhC/84nH4v+UEm9RQFEvEhC/78iQv+YigIBiAAsIitlRCEHEhREiPd6iPeCKYv+UEm9RQEURIv/JwhQJwhQJwhQJwpQvzIHFomKAAAiJx8xAFBJvUUBQQAhiwG+RFcACDIHFkmMAKZBABCLAb5EVwgIiwCnQQADI0SJIkL/+ooBAYj/xYj3HCmL/1BJvUUBREm+RFcgCBdMvEgiKmVESwEJKkxniPoyFjIHFlCJigIBIkmAACIrZUQlEkEAqiInCWVEMgdJjAIOQQCcIicWZUSLAg1BAJEjRCceMQBQSYwAvUUBQQB9iwC+RFcACDIHFkmMAaZBAGyLAL5EVwgIiwGnQQBfI0Qpi/5QSb1FAUSI9pGI9pmL/xdJRCIqZURLAQgiJw5lRA5EIiplREsBCCpMZ0sBvkRXIAgXCBZLAb5ETFwgSwFMvyInDGVEFksBvkRMXCi/IicOZUQiKmVECRaMAIkiQv+eIkL/bIoBAYgADIv/IlMnF0xnMgcWiYoAACInHDEAUEm9RQFBACGLAb5EVwAIMgcWSYwApkEAEIsBvkRXCAiLAKdBAAMjRIkiQv/6igIBiP/FKYv+UEm9RQFESb5Ei/8iUyEETFS/MgcWiYoBACInHTEAUEm9RQFBACmLAb5EVwAIMgcWSYwApkEAGIsBvkRXCAiLAKdBAAsjRIv/IlMnGExniSJC//KKAAEiSTIHIicGZUxJTgJOBEQNQQANiwCMAosBQQAEgQSMAosCjAAiJxhlREEABIEDjAAiJxNlRBYiJwdlRBYiKmVEIicMZUQLFiInDGVEFiInDWVEFlcHASInFWVEFlcGAiInG2VEFlcGAiInDmVEFiIqZUQWIicJZUQWIicWZUQWIicFZUQWIicGZUQWIicXZUQnCiJPAlSLABZXBwFPDk8OUE8NUE8MUE8LUE8KUE8JUE8IUE8HUE8GUE8FUE8EUE8DUE8CUExQjACJigEBKYv/UEm9RQFEvkSJigABJyEiK2VEJRJBAAcnC75MjABEiwBMiYoAASInD2VEFiInEGVEFlCAAgACTFCJigABIicUZUSJigIAi/6BCgiLADIMDUEAKrGBBrIQgQWyGScjsh4nI7Ifi/+NAgALAASzQv/bMgCyAUL/9SKyAUL/74k=", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 4, + "minor": 2, + "patch": 1 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/smart_contracts/artifacts/fixed_coupon_bond/fixed_coupon_bond_client.py b/smart_contracts/artifacts/fixed_coupon_bond/fixed_coupon_bond_client.py index d04c29b..0527d95 100644 --- a/smart_contracts/artifacts/fixed_coupon_bond/fixed_coupon_bond_client.py +++ b/smart_contracts/artifacts/fixed_coupon_bond/fixed_coupon_bond_client.py @@ -19,7 +19,7 @@ import algokit_utils from algokit_utils import AlgorandClient as _AlgoKitAlgorandClient -_APP_SPEC_JSON = r"""{"arcs": [], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Sender Account Holding Address", "name": "sender_holding_address"}, {"type": "address", "desc": "Receiver Account Holding Address", "name": "receiver_holding_address"}, {"type": "uint64", "desc": "Amount of D-ASA units to transfer", "name": "units"}], "name": "asset_transfer", "returns": {"type": "uint64", "desc": "Transferred actualized value in denomination asset"}, "desc": "Transfer D-ASA units between accounts", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "byte[]", "desc": "Additional payment information (Optional)", "name": "payment_info"}], "name": "pay_coupon", "returns": {"type": "(uint64,uint64,byte[])", "desc": "Paid coupon amount in denomination asset, Payment timestamp, Payment context", "struct": "PaymentResult"}, "desc": "Pay due coupon to an account", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "byte[]", "desc": "Additional payment information (Optional)", "name": "payment_info"}], "name": "pay_principal", "returns": {"type": "(uint64,uint64,byte[])", "desc": "Paid principal amount in denomination asset, Payment timestamp, Payment context", "struct": "PaymentResult"}, "desc": "Pay the outstanding principal to an account", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "uint64", "desc": "Account's units for the current value calculation", "name": "units"}], "name": "get_account_units_current_value", "returns": {"type": "(uint64,uint64,(uint64,uint64))", "desc": "Units current value in denomination asset, Accrued interest in denomination asset", "struct": "CurrentUnitsValue"}, "desc": "Get account's units current value and accrued interest", "events": [], "readonly": true}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_coupon_rates", "returns": {"type": "uint16[]", "desc": "Coupon rates"}, "desc": "Get D-ASA coupon rates", "events": [], "readonly": true}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "get_payment_amount", "returns": {"type": "(uint64,uint64)", "desc": "Interest amount in denomination asset, Principal amount in denomination asset", "struct": "PaymentAmounts"}, "desc": "Get the next payment amount", "events": [], "readonly": true}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_coupons_status", "returns": {"type": "(uint64,uint64,uint64,(uint64,uint64),bool)", "desc": "Total coupons, Due coupons, Next coupon due date, (Day count factor numerator, Day count factor denominator), All due coupons paid", "struct": "CouponsInfo"}, "desc": "Get D-ASA coupons status", "events": [], "readonly": true}, {"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA Arranger Address", "name": "arranger"}, {"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "desc": "D-ASA metadata", "name": "metadata", "struct": "AssetMetadata"}], "name": "asset_create", "returns": {"type": "void"}, "desc": "Create a new D-ASA", "events": []}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [{"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "name": "metadata", "struct": "AssetMetadata"}], "name": "asset_update", "returns": {"type": "void"}, "desc": "Update D-ASA application.", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Denomination asset identifier", "name": "denomination_asset_id"}, {"type": "uint64", "desc": "Settlement asset identifier", "name": "settlement_asset_id"}, {"type": "uint64", "desc": "Principal, expressed in denomination asset", "name": "principal"}, {"type": "uint64", "desc": "Principal discount in bps", "name": "principal_discount"}, {"type": "uint64", "desc": "Minimum denomination, expressed in denomination asset", "name": "minimum_denomination"}, {"type": "uint8", "desc": "Day-count convention for interests calculation", "name": "day_count_convention"}, {"type": "uint16", "desc": "Interest rate in bps", "name": "interest_rate"}, {"type": "uint16[]", "desc": "Coupon interest rates in bps", "name": "coupon_rates"}, {"type": "uint64[]", "desc": "Time events (strictly ascending order)", "name": "time_events"}, {"type": "(uint64,uint64)[]", "desc": "Time periods of recurring time events", "name": "time_periods"}], "name": "asset_config", "returns": {"type": "void"}, "desc": "Configure the Debt Algorand Standard Application", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64[]", "desc": "Secondary market time events (strictly ascending order)", "name": "secondary_market_time_events"}], "name": "set_secondary_time_events", "returns": {"type": "(uint64,uint64)", "desc": "Secondary Market Opening Date, Secondary Market Closure Date", "struct": "SecondaryMarketSchedule"}, "desc": "Set secondary market time schedule", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "uint8", "desc": "Role identifier", "name": "role"}, {"type": "byte[]", "desc": "Role configuration (Optional)", "name": "config"}], "name": "assign_role", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Assign a role to an address", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "uint8", "desc": "Role identifier", "name": "role"}], "name": "revoke_role", "returns": {"type": "uint64", "desc": "Timestamp of the role revocation"}, "desc": "Revoke a role from an address", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "open_account", "returns": {"type": "uint64", "desc": "Timestamp of the account opening"}, "desc": "Open D-ASA account", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "close_account", "returns": {"type": "(uint64,uint64)", "desc": "Closed units, Timestamp of the account closing"}, "desc": "Close D-ASA account", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "uint64", "desc": "Amount of D-ASA units to distribute", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64", "desc": "Remaining D-ASA units to be distributed"}, "desc": "Distribute D-ASA units to accounts according the primary market", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "set_asset_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set asset suspension status"}, "desc": "Set asset suspension status", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "set_account_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set account suspension status"}, "desc": "Set account suspension status", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Default status", "name": "defaulted"}], "name": "set_default_status", "returns": {"type": "void"}, "desc": "Set D-ASA default status", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_asset_info", "returns": {"type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Performance", "struct": "AssetInfo"}, "desc": "Get D-ASA info", "events": [], "readonly": true}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "get_account_info", "returns": {"type": "(address,uint64,uint64,uint64,bool)", "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended", "struct": "AccountInfo"}, "desc": "Get account info", "events": [], "readonly": true}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_time_events", "returns": {"type": "uint64[]", "desc": "Time events"}, "desc": "Get D-ASA time events", "events": [], "readonly": true}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_secondary_market_schedule", "returns": {"type": "uint64[]", "desc": "Secondary market schedule"}, "desc": "Get secondary market schedule", "events": [], "readonly": true}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_asset_metadata", "returns": {"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "desc": "Contract type, Calendar, Business day convention, End of month convention, Early repayment effect, Early repayment penalty type, Prospectus hash, Prospectus URL", "struct": "AssetMetadata"}, "desc": "Get D-ASA metadata", "events": [], "readonly": true}], "name": "FixedCouponBond", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UjIwIw==", "keyType": "AVMString", "valueType": "AVMBytes"}, "circulating_units": {"key": "Y2lyY3VsYXRpbmdfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "defaulted": {"key": "ZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "due_coupons_watermark": {"key": "ZHVlX2NvdXBvbnNfd2F0ZXJtYXJr", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_rate": {"key": "aW50ZXJlc3RfcmF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "issuance_date": {"key": "aXNzdWFuY2VfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "metadata": {"key": "bWV0YWRhdGE=", "keyType": "AVMString", "valueType": "AVMBytes"}, "paid_coupon_units": {"key": "cGFpZF9jb3Vwb25fdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "primary_distribution_closure_date": {"key": "cHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "primary_distribution_opening_date": {"key": "cHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "principal_discount": {"key": "cHJpbmNpcGFsX2Rpc2NvdW50", "keyType": "AVMString", "valueType": "AVMUint64"}, "secondary_market_closure_date": {"key": "c2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU=", "keyType": "AVMString", "valueType": "AVMUint64"}, "secondary_market_opening_date": {"key": "c2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU=", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "suspended": {"key": "c3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_coupons": {"key": "dG90YWxfY291cG9ucw==", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "unit_value": {"key": "dW5pdF92YWx1ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 2, "ints": 20}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"PaymentResult": [{"name": "amount", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}, {"name": "context", "type": "byte[]"}], "CurrentUnitsValue": [{"name": "units_value", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "day_count_factor", "type": "(uint64,uint64)"}], "PaymentAmounts": [{"name": "interest", "type": "uint64"}, {"name": "principal", "type": "uint64"}], "CouponsInfo": [{"name": "total_coupons", "type": "uint64"}, {"name": "due_coupons", "type": "uint64"}, {"name": "next_coupon_due_date", "type": "uint64"}, {"name": "day_count_factor", "type": "(uint64,uint64)"}, {"name": "all_due_coupons_paid", "type": "bool"}], "AssetMetadata": [{"name": "contract_type", "type": "uint8"}, {"name": "calendar", "type": "uint8"}, {"name": "business_day_convention", "type": "uint8"}, {"name": "end_of_month_convention", "type": "uint8"}, {"name": "prepayment_effect", "type": "uint8"}, {"name": "penalty_type", "type": "uint8"}, {"name": "prospectus_hash", "type": "byte[32]"}, {"name": "prospectus_url", "type": "string"}], "SecondaryMarketSchedule": [{"name": "secondary_market_opening_date", "type": "uint64"}, {"name": "secondary_market_closure_date", "type": "uint64"}], "AssetInfo": [{"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "unit_value", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "principal_discount", "type": "uint16"}, {"name": "interest_rate", "type": "uint16"}, {"name": "total_supply", "type": "uint64"}, {"name": "circulating_supply", "type": "uint64"}, {"name": "primary_distribution_opening_date", "type": "uint64"}, {"name": "primary_distribution_closure_date", "type": "uint64"}, {"name": "issuance_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "performance", "type": "uint8"}], "AccountInfo": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "unit_value", "type": "uint64"}, {"name": "paid_coupons", "type": "uint64"}, {"name": "suspended", "type": "bool"}]}, "desc": "\n Fixed Coupon Bond, placed at nominal value, fixed coupon rates and payment time schedule, principal at maturity.\n ", "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLl9fYWxnb3B5X2VudHJ5cG9pbnRfd2l0aF9pbml0KCkgLT4gdWludDY0OgptYWluOgogICAgaW50Y2Jsb2NrIDAgMSA4IDEwMCA0NDggMjU1IDg2NDAwIDIwMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4NTIzMzMwMjMgImNpcmN1bGF0aW5nX3VuaXRzIiAic3RhdHVzIiAidG90YWxfY291cG9ucyIgImlzc3VhbmNlX2RhdGUiICJtYXR1cml0eV9kYXRlIiAic2V0dGxlbWVudF9hc3NldF9pZCIgMHgwMDAwMDAwMDAwMDAwMDAwICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiIDB4MDAgMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MyAidW5pdF92YWx1ZSIgImRheV9jb3VudF9jb252ZW50aW9uIiAidG90YWxfdW5pdHMiICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIgInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIiAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMgMHg1MjMyMzAyMyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIiAibWV0YWRhdGEiICJwcmluY2lwYWxfZGlzY291bnQiICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiICJzdXNwZW5kZWQiICJkZWZhdWx0ZWQiICJkdWVfY291cG9uc193YXRlcm1hcmsiICJwYWlkX2NvdXBvbl91bml0cyIgImludGVyZXN0X3JhdGUiIDB4NTIzNzMwMjMgMHg1MjM2MzAyMyAweDUyMzUzMDIzIDB4NTIzNDMwMjMgMHgwMDEyIDB4MDAwMCAweDUyMzgzMDIzIDB4MDY4MTAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MS00MgogICAgLy8gIyBSb2xlIEJhc2VkIEFjY2VzcyBDb250cm9sCiAgICAvLyBzZWxmLmFycmFuZ2VyID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9BUlJBTkdFUikKICAgIGJ5dGVjIDE4IC8vIDB4NTIzMjMwMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5LTYwCiAgICAvLyAjIEFzc2V0IENvbmZpZ3VyYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gVUludDY0KCkKICAgIGJ5dGVjIDE5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBVSW50NjQoKQogICAgYnl0ZWMgNyAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjIKICAgIC8vIHNlbGYudW5pdF92YWx1ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMiAvLyAidW5pdF92YWx1ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjMKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgMTMgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NS02NgogICAgLy8gIyBNZXRhZGF0YQogICAgLy8gc2VsZi5tZXRhZGF0YSA9IEJ5dGVzKCkKICAgIGJ5dGVjIDIwIC8vICJtZXRhZGF0YSIKICAgIHB1c2hieXRlcyAweAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4LTY5CiAgICAvLyAjIFN1cHBseQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwCiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3Mi03MwogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50ID0gVUludDY0KCkKICAgIGJ5dGVjIDIxIC8vICJwcmluY2lwYWxfZGlzY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1LTc2CiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmludGVyZXN0X3JhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMjcgLy8gImludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgwCiAgICAvLyBzZWxmLnRvdGFsX2NvdXBvbnMgPSBVSW50NjQoKQogICAgYnl0ZWMgNCAvLyAidG90YWxfY291cG9ucyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODUKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDIyIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNSAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODgKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTItOTMKICAgIC8vICMgU3RhdHVzCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0VNUFRZKQogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NAogICAgLy8gc2VsZi5zdXNwZW5kZWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjMgLy8gInN1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTUKICAgIC8vIHNlbGYuZGVmYXVsdGVkID0gVUludDY0KCkKICAgIGJ5dGVjIDI0IC8vICJkZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNi0zNwogICAgLy8gIyBTdGF0ZSBzY2hlbWEgdmFsaWRhdGlvbgogICAgLy8gYXNzZXJ0IFR4bi5nbG9iYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkdMT0JBTF9CWVRFUywgZXJyLldST05HX0dMT0JBTF9CWVRFUwogICAgdHhuIEdsb2JhbE51bUJ5dGVTbGljZQogICAgcHVzaGludCAyIC8vIDIKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozOAogICAgLy8gYXNzZXJ0IFR4bi5nbG9iYWxfbnVtX3VpbnQgPT0gY2ZnLkdMT0JBTF9VSU5UUywgZXJyLldST05HX0dMT0JBTF9VSU5UUwogICAgdHhuIEdsb2JhbE51bVVpbnQKICAgIHB1c2hpbnQgMjAgLy8gMjAKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIFVJbnRzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozOQogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuTE9DQUxfQllURVMsIGVyci5XUk9OR19MT0NBTF9CWVRFUwogICAgdHhuIExvY2FsTnVtQnl0ZVNsaWNlCiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV91aW50ID09IGNmZy5MT0NBTF9VSU5UUywgZXJyLldST05HX0xPQ0FMX1VJTlRTCiAgICB0eG4gTG9jYWxOdW1VaW50CiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQyLTQzCiAgICAvLyAjIENvdXBvbnMKICAgIC8vIHNlbGYuZHVlX2NvdXBvbnNfd2F0ZXJtYXJrID0gVUludDY0KCkKICAgIGJ5dGVjIDI1IC8vICJkdWVfY291cG9uc193YXRlcm1hcmsiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0NAogICAgLy8gc2VsZi5wYWlkX2NvdXBvbl91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAyNiAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYWZ0ZXJfaWZfZWxzZUAyOQogICAgcHVzaGJ5dGVzcyAweDRmZDZhM2NjIDB4OGNmMTRiNTEgMHg5Yzc2YjZhMyAweDQ0MzYzZDQ5IDB4NTNiZWYwNDUgMHg2N2RiNGYyMCAweGY2YTk2YzhkIDB4M2YwZWZjNmMgMHgyNWRiYTk1YiAweDg5NDc0MTM0IDB4MWQ2ZmMyNTUgMHhmZWY3NDU2NyAweGI4ZmMxMzkwIDB4M2Q0M2QxZjAgMHhlYmQ5NmIyZiAweDZjODVlM2VlIDB4ZjYzYWNlOGQgMHhiYmNjYTE4YSAweDFhN2JhYmI0IDB4NDAyZGJhNDcgMHhlZDAyNzU5ZiAweGZhZDIxNzNlIDB4MDhlZmVhMzUgMHhlNGE1YWI1NCAvLyBtZXRob2QgImFzc2V0X3RyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwYXlfY291cG9uKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LGJ5dGVbXSkiLCBtZXRob2QgInBheV9wcmluY2lwYWwoYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAiZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZShhZGRyZXNzLHVpbnQ2NCkodWludDY0LHVpbnQ2NCwodWludDY0LHVpbnQ2NCkpIiwgbWV0aG9kICJnZXRfY291cG9uX3JhdGVzKCl1aW50MTZbXSIsIG1ldGhvZCAiZ2V0X3BheW1lbnRfYW1vdW50KGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJnZXRfY291cG9uc19zdGF0dXMoKSh1aW50NjQsdWludDY0LHVpbnQ2NCwodWludDY0LHVpbnQ2NCksYm9vbCkiLCBtZXRob2QgImFzc2V0X2NyZWF0ZShhZGRyZXNzLCh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCxieXRlWzMyXSxzdHJpbmcpKXZvaWQiLCBtZXRob2QgImFzc2V0X3VwZGF0ZSgodWludDgsdWludDgsdWludDgsdWludDgsdWludDgsdWludDgsYnl0ZVszMl0sc3RyaW5nKSl2b2lkIiwgbWV0aG9kICJhc3NldF9jb25maWcodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50MTYsdWludDE2W10sdWludDY0W10sKHVpbnQ2NCx1aW50NjQpW10pdm9pZCIsIG1ldGhvZCAic2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cyh1aW50NjRbXSkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImFzc2lnbl9yb2xlKGFkZHJlc3MsdWludDgsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAicmV2b2tlX3JvbGUoYWRkcmVzcyx1aW50OCl1aW50NjQiLCBtZXRob2QgIm9wZW5fYWNjb3VudChhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJjbG9zZV9hY2NvdW50KGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInNldF9hc3NldF9zdXNwZW5zaW9uKGJvb2wpdWludDY0IiwgbWV0aG9kICJzZXRfYWNjb3VudF9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgInNldF9kZWZhdWx0X3N0YXR1cyhib29sKXZvaWQiLCBtZXRob2QgImdldF9hc3NldF9pbmZvKCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQxNix1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYm9vbCx1aW50OCkiLCBtZXRob2QgImdldF9hY2NvdW50X2luZm8oYWRkcmVzcykoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sKSIsIG1ldGhvZCAiZ2V0X3RpbWVfZXZlbnRzKCl1aW50NjRbXSIsIG1ldGhvZCAiZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfYXNzZXRfbWV0YWRhdGEoKSh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCxieXRlWzMyXSxzdHJpbmcpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9hc3NldF90cmFuc2Zlcl9yb3V0ZUA1IG1haW5fcGF5X2NvdXBvbl9yb3V0ZUA2IG1haW5fcGF5X3ByaW5jaXBhbF9yb3V0ZUA3IG1haW5fZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9yb3V0ZUA4IG1haW5fZ2V0X2NvdXBvbl9yYXRlc19yb3V0ZUA5IG1haW5fZ2V0X3BheW1lbnRfYW1vdW50X3JvdXRlQDEwIG1haW5fZ2V0X2NvdXBvbnNfc3RhdHVzX3JvdXRlQDExIG1haW5fYXNzZXRfY3JlYXRlX3JvdXRlQDEyIG1haW5fYXNzZXRfdXBkYXRlX3JvdXRlQDEzIG1haW5fYXNzZXRfY29uZmlnX3JvdXRlQDE0IG1haW5fc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19yb3V0ZUAxNSBtYWluX2Fzc2lnbl9yb2xlX3JvdXRlQDE2IG1haW5fcmV2b2tlX3JvbGVfcm91dGVAMTcgbWFpbl9vcGVuX2FjY291bnRfcm91dGVAMTggbWFpbl9jbG9zZV9hY2NvdW50X3JvdXRlQDE5IG1haW5fcHJpbWFyeV9kaXN0cmlidXRpb25fcm91dGVAMjAgbWFpbl9zZXRfYXNzZXRfc3VzcGVuc2lvbl9yb3V0ZUAyMSBtYWluX3NldF9hY2NvdW50X3N1c3BlbnNpb25fcm91dGVAMjIgbWFpbl9zZXRfZGVmYXVsdF9zdGF0dXNfcm91dGVAMjMgbWFpbl9nZXRfYXNzZXRfaW5mb19yb3V0ZUAyNCBtYWluX2dldF9hY2NvdW50X2luZm9fcm91dGVAMjUgbWFpbl9nZXRfdGltZV9ldmVudHNfcm91dGVAMjYgbWFpbl9nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZV9yb3V0ZUAyNyBtYWluX2dldF9hc3NldF9tZXRhZGF0YV9yb3V0ZUAyOAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgaW50Y18wIC8vIDAKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbWV0YWRhdGFfcm91dGVAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5ODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hc3NldF9tZXRhZGF0YQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZV9yb3V0ZUAyNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X3RpbWVfZXZlbnRzX3JvdXRlQDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfdGltZV9ldmVudHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2FjY291bnRfaW5mb19yb3V0ZUAyNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hY2NvdW50X2luZm8KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2luZm9fcm91dGVAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hc3NldF9pbmZvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9kZWZhdWx0X3N0YXR1c19yb3V0ZUAyMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9kZWZhdWx0X3N0YXR1cwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfYWNjb3VudF9zdXNwZW5zaW9uX3JvdXRlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X2FjY291bnRfc3VzcGVuc2lvbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfYXNzZXRfc3VzcGVuc2lvbl9yb3V0ZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9hc3NldF9zdXNwZW5zaW9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3ByaW1hcnlfZGlzdHJpYnV0aW9uX3JvdXRlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODAxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODAxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcHJpbWFyeV9kaXN0cmlidXRpb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fY2xvc2VfYWNjb3VudF9yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGNsb3NlX2FjY291bnQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fb3Blbl9hY2NvdW50X3JvdXRlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgb3Blbl9hY2NvdW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3Jldm9rZV9yb2xlX3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcmV2b2tlX3JvbGUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzaWduX3JvbGVfcm91dGVAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NpZ25fcm9sZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX3JvdXRlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF9jb25maWdfcm91dGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0ODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYXNzZXRfY29uZmlnCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Fzc2V0X3VwZGF0ZV9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgVXBkYXRlQXBwbGljYXRpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBjYWxsc3ViIGFzc2V0X3VwZGF0ZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF9jcmVhdGVfcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBjYWxsc3ViIGFzc2V0X2NyZWF0ZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfY291cG9uc19zdGF0dXNfcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfY291cG9uc19zdGF0dXMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X3BheW1lbnRfYW1vdW50X3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfcGF5bWVudF9hbW91bnQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2NvdXBvbl9yYXRlc19yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2NvdXBvbl9yYXRlcwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjMxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcGF5X3ByaW5jaXBhbF9yb3V0ZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBwYXlfcHJpbmNpcGFsCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3BheV9jb3Vwb25fcm91dGVANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcGF5X2NvdXBvbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF90cmFuc2Zlcl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NldF90cmFuc2ZlcgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5maXhlZF9jb3Vwb25fYm9uZC5jb250cmFjdC5GaXhlZENvdXBvbkJvbmQuYXNzZXRfdHJhbnNmZXIoc2VuZGVyX2hvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiBieXRlcykgLT4gYnl0ZXM6CmFzc2V0X3RyYW5zZmVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE1My0xNTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2V0X3RyYW5zZmVyKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgc2VuZGVyX2hvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLAogICAgLy8gICAgIHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLAogICAgLy8gICAgIHVuaXRzOiBhcmM0LlVJbnQ2NCwKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAzIDEKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDIKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTg0CiAgICAvLyB1bml0cy5uYXRpdmUsCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMyAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTgtMzAxCiAgICAvLyBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk5CiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwMAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTktMzAwCiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTktMzAxCiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDEKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwMC0zMDEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGZyYW1lX2RpZyA0CiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTktMzAxCiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA1CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk3LTMwMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gICAgIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5TRUNPTkRBUllfTUFSS0VUX0NMT1NFRAogICAgYXNzZXJ0IC8vIFNlY29uZGFyeSBtYXJrZXQgaXMgY2xvc2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNzYtMzc4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRyYW5zZmVyIHJpZ2h0IHRvIEQtQVNBIG93bmVycy4gT3RoZXIgaW1wbGVtZW50YXRpb25zIG1heSByZWxheSBvbiBvdGhlcgogICAgLy8gIyByb2xlcywgZXh0ZXJuYWwgQXBwcyB0aHJvdWdoIEMyQyBjYWxscyAoZS5nLiwgYW4gb3JkZXIgYm9vayksIG9yIG9mZi1jaGFpbiB0cmFuc2ZlciBhZ2VudHMuCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZW5kZXJfaG9sZGluZ19hZGRyZXNzLm5hdGl2ZSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0zCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNzkKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzgwCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3NAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzgzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQubmF0aXZlLCBlcnIuU1VTUEVOREVECiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGMgNCAvLyA0NDgKICAgIGdldGJpdAogICAgYnl0ZWMgMTAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM4NC0zODYKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hY2NvdW50WwogICAgLy8gICAgIHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcwogICAgLy8gXS5zdXNwZW5kZWQubmF0aXZlLCBlcnIuU1VTUEVOREVECiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjIDQgLy8gNDQ4CiAgICBnZXRiaXQKICAgIGJ5dGVjIDEwIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozODgKICAgIC8vIHVuaXRzIDw9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfZGlnIDUKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozODctMzg5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHVuaXRzIDw9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIC8vICksIGVyci5PVkVSX1RSQU5TRkVSCiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzk3CiAgICAvLyBzZW5kZXJfdW5pdF92YWx1ZSA9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlCiAgICBzd2FwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozOTgKICAgIC8vIGlmIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSA+IDA6CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnogYXNzZXRfdHJhbnNmZXJfZWxzZV9ib2R5QDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDkKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYj09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDktMzEwCiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzEwCiAgICAvLyBhbmQgc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYj09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDktMzEwCiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAxNAogICAgaW50Y18xIC8vIDEKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDgtMzExCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICAvLyAgICAgYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgLy8gKSwgZXJyLk5PTl9GVU5HSUJMRV9VTklUUwogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgdW5pdHMgYXJlIG5vdCBmdW5naWJsZQoKYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxODctMTg4CiAgICAvLyAjIFRyYW5zZmVyIGlzIGZvcmJpZGRlbiBpbiBjYXNlIG9mIHBlbmRpbmcgY291cG9uIHBheW1lbnRzCiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuY291bnRfZHVlX2NvdXBvbnMoKQogICAgY2FsbHN1YiBjb3VudF9kdWVfY291cG9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE4OQogICAgLy8gc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChzZW5kZXJfaG9sZGluZ19hZGRyZXNzLCBkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyAtMwogICAgZGlnIDEKICAgIGNhbGxzdWIgYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOTEtMTkyCiAgICAvLyAjIFRyYW5zZmVycmVkIHVuaXRzIHZhbHVlIChtdXN0IGJlIGNvbXB1dGVkIGJlZm9yZSB0aGUgdHJhbnNmZXIpCiAgICAvLyBzZW5kZXJfdW5pdF92YWx1ZSA9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTkzLTE5NQogICAgLy8gYWNjcnVlZF9pbnRlcmVzdCA9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoCiAgICAvLyAgICAgc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgdW5pdHMubmF0aXZlLCBkdWVfY291cG9ucwogICAgLy8gKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgNQogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDM0CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlIC0gdW5pdHMKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGRpZyAyCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzMtNDM1CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlIC0gdW5pdHMKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQzMwogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQzMy00MzUKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgLSB1bml0cwogICAgLy8gKQogICAgc3dhcAogICAgcmVwbGFjZTIgMzIKICAgIGRpZyAxCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzcKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgdW5jb3ZlciAzCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzYtNDM4CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzYKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQzNi00MzgKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMKICAgIC8vICkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDMyCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjAKICAgIC8vIGlmIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSA9PSAwOgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJueiBhc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDIxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjEKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUgPSBhcmM0LlVJbnQ2NCgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgOCAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIHJlcGxhY2UyIDQwCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzYyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBhcmM0LlVJbnQ2NCgpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBieXRlYyA4IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgcmVwbGFjZTIgNDgKICAgIGJveF9wdXQKCmFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAwCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQodW5pdHMubmF0aXZlICogc2VuZGVyX3VuaXRfdmFsdWUubmF0aXZlICsgYWNjcnVlZF9pbnRlcmVzdCkKICAgIGZyYW1lX2RpZyAwCiAgICBidG9pCiAgICBmcmFtZV9kaWcgNQogICAgKgogICAgZnJhbWVfZGlnIDMKICAgICsKICAgIGl0b2IKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgphc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUAxNQoKYXNzZXRfdHJhbnNmZXJfZWxzZV9ib2R5QDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDAzCiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gc2VuZGVyX3VuaXRfdmFsdWUKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBmcmFtZV9kaWcgMAogICAgcmVwbGFjZTIgNDAKICAgIGRpZyAxCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MDQtNDA2CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbCiAgICAvLyAgICAgc2VuZGVyX2hvbGRpbmdfYWRkcmVzcwogICAgLy8gXS5wYWlkX2NvdXBvbnMKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDA0CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQwNC00MDYKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IHNlbGYuYWNjb3VudFsKICAgIC8vICAgICBzZW5kZXJfaG9sZGluZ19hZGRyZXNzCiAgICAvLyBdLnBhaWRfY291cG9ucwogICAgc3dhcAogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcmVwbGFjZTIgNDgKICAgIGJveF9wdXQKICAgIGIgYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxNwoKYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUA2CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X2RlZmF1bHRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExMC0xMTEKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTEyCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjQgLy8gImRlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTE0LTExNQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTYKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMyAvLyAic3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN1c3BlbmRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5jb3VudF9kdWVfY291cG9ucygpIC0+IHVpbnQ2NDoKY291bnRfZHVlX2NvdXBvbnM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NTAtNTEKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgY291bnRfZHVlX2NvdXBvbnMoc2VsZikgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1MgogICAgLy8gY3VycmVudF90cyA9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1MwogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmR1ZV9jb3Vwb25zX3dhdGVybWFyawogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI1IC8vICJkdWVfY291cG9uc193YXRlcm1hcmsiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZHVlX2NvdXBvbnNfd2F0ZXJtYXJrIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBpZiBjdXJyZW50X3RzID49IHNlbGYubWF0dXJpdHlfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICA+PQogICAgYnogY291bnRfZHVlX2NvdXBvbnNfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1NQogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKCmNvdW50X2R1ZV9jb3Vwb25zX2FmdGVyX2lmX2Vsc2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2NwogICAgLy8gc2VsZi5kdWVfY291cG9uc193YXRlcm1hcmsgPSBkdWVfY291cG9ucwogICAgYnl0ZWMgMjUgLy8gImR1ZV9jb3Vwb25zX3dhdGVybWFyayIKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NjgKICAgIC8vIHJldHVybiBkdWVfY291cG9ucwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmNvdW50X2R1ZV9jb3Vwb25zX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBlbGlmIGN1cnJlbnRfdHMgPiBzZWxmLmlzc3VhbmNlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGNvdW50X2R1ZV9jb3Vwb25zX2FmdGVyX2lmX2Vsc2VAOAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU3CiAgICAvLyBjb3Vwb25faWR4ID0gVUludDY0KGNmZy5GSVJTVF9DT1VQT05fREFURV9JRFgpICsgc2VsZi5kdWVfY291cG9uc193YXRlcm1hcmsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNSAvLyAiZHVlX2NvdXBvbnNfd2F0ZXJtYXJrIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmR1ZV9jb3Vwb25zX3dhdGVybWFyayBleGlzdHMKICAgIHB1c2hpbnQgMyAvLyAzCiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU4CiAgICAvLyBjb3Vwb25fZHVlX2RhdGUgPSBzZWxmLnRpbWVfZXZlbnRzLnZhbHVlW2NvdXBvbl9pZHhdLm5hdGl2ZQogICAgYnl0ZWMgMTEgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9ldmVudHMgZXhpc3RzCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKCmNvdW50X2R1ZV9jb3Vwb25zX3doaWxlX3RvcEA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU5CiAgICAvLyB3aGlsZSBjdXJyZW50X3RzID49IGNvdXBvbl9kdWVfZGF0ZToKICAgIGZyYW1lX2RpZyAxCiAgICA8PQogICAgYnogY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfd2hpbGVANgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjYxCiAgICAvLyByZXF1aXJlZF9idWRnZXQ9VUludDY0KGNmZy5PUF9VUF9DT1VQT05fRFVFX0NPVU5USU5HKSwKICAgIGludGMgNSAvLyAyNTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2MgogICAgLy8gZmVlX3NvdXJjZT1PcFVwRmVlU291cmNlLkdyb3VwQ3JlZGl0LAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2MC02MwogICAgLy8gZW5zdXJlX2J1ZGdldCgKICAgIC8vICAgICByZXF1aXJlZF9idWRnZXQ9VUludDY0KGNmZy5PUF9VUF9DT1VQT05fRFVFX0NPVU5USU5HKSwKICAgIC8vICAgICBmZWVfc291cmNlPU9wVXBGZWVTb3VyY2UuR3JvdXBDcmVkaXQsCiAgICAvLyApCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2NAogICAgLy8gY291cG9uX2lkeCArPSAxCiAgICBmcmFtZV9kaWcgMAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NjUKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IHNlbGYudGltZV9ldmVudHMudmFsdWVbY291cG9uX2lkeF0ubmF0aXZlCiAgICBieXRlYyAxMSAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50aW1lX2V2ZW50cyBleGlzdHMKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYiBjb3VudF9kdWVfY291cG9uc193aGlsZV90b3BANAoKY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfd2hpbGVANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2NgogICAgLy8gZHVlX2NvdXBvbnMgPSBjb3Vwb25faWR4IC0gY2ZnLkZJUlNUX0NPVVBPTl9EQVRFX0lEWAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMyAvLyAzCiAgICAtCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfaWZfZWxzZUA4CgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBkdWVfY291cG9uczogdWludDY0KSAtPiB2b2lkOgphc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo5Mi05NQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgZHVlX2NvdXBvbnM6IFVJbnQ2NAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6OTcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9PSBkdWVfY291cG9ucwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgYj09CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6OTYtOTgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID09IGR1ZV9jb3Vwb25zCiAgICAvLyApLCBlcnIuUEVORElOR19DT1VQT05fUEFZTUVOVAogICAgYXNzZXJ0IC8vIFBlbmRpbmcgZHVlIGNvdXBvbiBwYXltZW50CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiB1aW50NjQsIGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IHVpbnQ2NDoKYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTMyLTEzNQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgdW5pdHM6IFVJbnQ2NCwgZHVlX2NvdXBvbnM6IFVJbnQ2NAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMzYtMTM3CiAgICAvLyAjIFRoZSBmb2xsb3dpbmcgYXNzZXJ0IHNhZmVndWFyZHMgdGhlIHN1YnJvdXRpbmUgZnJvbSBmb3JiaWRkZW4gaW52b2NhdGlvbnMKICAgIC8vIHNlbGYuYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoaG9sZGluZ19hZGRyZXNzLCBkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTM4CiAgICAvLyBkYXlfY291bnRfZmFjdG9yID0gc2VsZi5kYXlfY291bnRfZmFjdG9yKGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGRheV9jb3VudF9mYWN0b3IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMzkKICAgIC8vIGNvdXBvbl9hY2NydWVkX3BlcmlvZCA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yLm5hdGl2ZQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDAKICAgIC8vIGNvdXBvbl9wZXJpb2QgPSBkYXlfY291bnRfZmFjdG9yLmRlbm9taW5hdG9yLm5hdGl2ZQogICAgc3dhcAogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTQxCiAgICAvLyBuZXh0X2NvdXBvbl9yYXRlX2JwcyA9IHNlbGYuY291cG9uX3JhdGVzLnZhbHVlWwogICAgYnl0ZWMgMTcgLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb3Vwb25fcmF0ZXMgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTQxLTE0MwogICAgLy8gbmV4dF9jb3Vwb25fcmF0ZV9icHMgPSBzZWxmLmNvdXBvbl9yYXRlcy52YWx1ZVsKICAgIC8vICAgICBkdWVfY291cG9ucwogICAgLy8gXS5uYXRpdmUgICMgZHVlX2NvdXBvbnMgaXMgZXF1YWwgdG8gdGhlIDAtYmFzZSBpZHggb2YgbmV4dCBjb3Vwb24KICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAqCiAgICBwdXNoaW50IDIgLy8gMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTQ1CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDUtMTQ2CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogbmV4dF9jb3Vwb25fcmF0ZV9icHMKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDUtMTQ3CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogbmV4dF9jb3Vwb25fcmF0ZV9icHMKICAgIC8vICogY291cG9uX2FjY3J1ZWRfcGVyaW9kCiAgICB1bmNvdmVyIDIKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDkKICAgIC8vIGNzdC5CUFMgKiBjb3Vwb25fcGVyaW9kCiAgICBwdXNoaW50IDEwMDAwIC8vIDEwMDAwCiAgICB1bmNvdmVyIDIKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDUtMTUwCiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogbmV4dF9jb3Vwb25fcmF0ZV9icHMKICAgIC8vICogY291cG9uX2FjY3J1ZWRfcGVyaW9kCiAgICAvLyAvLyAoCiAgICAvLyAgICAgY3N0LkJQUyAqIGNvdXBvbl9wZXJpb2QKICAgIC8vICkgICMgZGl2LWJ5LXplcm86IGNvdXBvbl9wZXJpb2QgIT0gMCBkdWUgdG8gYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCBjaGVja3MKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDQtMTUxCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gICAgICogbmV4dF9jb3Vwb25fcmF0ZV9icHMKICAgIC8vICAgICAqIGNvdXBvbl9hY2NydWVkX3BlcmlvZAogICAgLy8gICAgIC8vICgKICAgIC8vICAgICAgICAgY3N0LkJQUyAqIGNvdXBvbl9wZXJpb2QKICAgIC8vICAgICApICAjIGRpdi1ieS16ZXJvOiBjb3Vwb25fcGVyaW9kICE9IDAgZHVlIHRvIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQgY2hlY2tzCiAgICAvLyApCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnM6IHVpbnQ2NCkgLT4gYnl0ZXM6CmRheV9jb3VudF9mYWN0b3I6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTA3LTEwOAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBkYXlfY291bnRfZmFjdG9yKHNlbGYsIGR1ZV9jb3Vwb25zOiBVSW50NjQpIC0+IHR5cC5EYXlDb3VudEZhY3RvcjoKICAgIHByb3RvIDEgMQogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMDktMTEwCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGlmIG5vdCBkdWVfY291cG9uczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IGRheV9jb3VudF9mYWN0b3JfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMTEKICAgIC8vIGFjY3J1aW5nX3N0YXJ0X3RpbWUgPSBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCgpkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMTQKICAgIC8vIGNvdXBvbl9hY2NydWVkX3BlcmlvZCA9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIC0gYWNjcnVpbmdfc3RhcnRfdGltZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZGlnIDEKICAgIC0KICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTE1CiAgICAvLyBjb3Vwb25fcGVyaW9kID0gc2VsZi5uZXh0X2NvdXBvbl9kdWVfZGF0ZShkdWVfY291cG9ucykgLSBhY2NydWluZ19zdGFydF90aW1lCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgbmV4dF9jb3Vwb25fZHVlX2RhdGUKICAgIHN3YXAKICAgIC0KICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTE2CiAgICAvLyBpZiBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID09IFVJbnQ2NChjc3QuRENDX0FfQSk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgc3dhcAogICAgZnJhbWVfYnVyeSA0CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDEKICAgIGJueiBkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzU2CiAgICAvLyByZXR1cm4gdGltZV9wZXJpb2QgLy8gVUludDY0KGNzdC5EQVlfMl9TRUMpCiAgICBmcmFtZV9kaWcgMAogICAgaW50YyA2IC8vIDg2NDAwCiAgICAvCiAgICBmcmFtZV9kaWcgMwogICAgaW50YyA2IC8vIDg2NDAwCiAgICAvCiAgICBmcmFtZV9idXJ5IDQKICAgIGZyYW1lX2J1cnkgMQoKZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjAKICAgIC8vIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChjb3Vwb25fYWNjcnVlZF9wZXJpb2QpLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gZGVub21pbmF0b3I9YXJjNC5VSW50NjQoY291cG9uX3BlcmlvZCksCiAgICBzd2FwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTE5LTEyMgogICAgLy8gcmV0dXJuIHR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQoY291cG9uX2FjY3J1ZWRfcGVyaW9kKSwKICAgIC8vICAgICBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChjb3Vwb25fcGVyaW9kKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmRheV9jb3VudF9mYWN0b3JfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NzYKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NzcKICAgIC8vIGlmIGR1ZV9jb3Vwb25zID49IFVJbnQ2NCgxKToKICAgIGZyYW1lX2RpZyAtMQogICAgYnogZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo3OAogICAgLy8gY291cG9uX2R1ZV9kYXRlID0gc2VsZi5jb3Vwb25fZHVlX2RhdGUoZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgY291cG9uX2R1ZV9kYXRlCiAgICBmcmFtZV9idXJ5IDIKCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUA4OgogICAgZnJhbWVfZGlnIDIKICAgIGIgZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDMKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmNvdXBvbl9kdWVfZGF0ZShjb3Vwb246IHVpbnQ2NCkgLT4gdWludDY0Ogpjb3Vwb25fZHVlX2RhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NzAtNzEKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgY291cG9uX2R1ZV9kYXRlKHNlbGYsIGNvdXBvbjogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo3MgogICAgLy8gcmV0dXJuIHNlbGYudGltZV9ldmVudHMudmFsdWVbY2ZnLkZJUlNUX0NPVVBPTl9EQVRFX0lEWCArIGNvdXBvbiAtIDFdLm5hdGl2ZQogICAgcHVzaGludCAzIC8vIDMKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGJ5dGVjIDExIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRpbWVfZXZlbnRzIGV4aXN0cwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLm5leHRfY291cG9uX2R1ZV9kYXRlKGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IHVpbnQ2NDoKbmV4dF9jb3Vwb25fZHVlX2RhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6ODEtODIKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgbmV4dF9jb3Vwb25fZHVlX2RhdGUoc2VsZiwgZHVlX2NvdXBvbnM6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6ODMKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBpZiBkdWVfY291cG9ucyA8IHNlbGYudG90YWxfY291cG9uczoKICAgIGR1cAogICAgYnl0ZWMgNCAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICA+CiAgICBieiBuZXh0X2NvdXBvbl9kdWVfZGF0ZV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo4NQogICAgLy8gY291cG9uX2R1ZV9kYXRlID0gc2VsZi5jb3Vwb25fZHVlX2RhdGUoZHVlX2NvdXBvbnMgKyAxKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgY2FsbHN1YiBjb3Vwb25fZHVlX2RhdGUKICAgIGZyYW1lX2J1cnkgMAoKbmV4dF9jb3Vwb25fZHVlX2RhdGVfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyByZXR1cm4gY291cG9uX2R1ZV9kYXRlCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogdWludDY0KSAtPiB1aW50NjQ6CmFjY291bnRfdW5pdHNfdmFsdWU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDItMzQ1CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFjY291bnRfdW5pdHNfdmFsdWUoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHVuaXRzOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDYKICAgIC8vIHJldHVybiB1bml0cyAqIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUubmF0aXZlCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLnBheV9jb3Vwb24oaG9sZGluZ19hZGRyZXNzOiBieXRlcywgcGF5bWVudF9pbmZvOiBieXRlcykgLT4gYnl0ZXM6CnBheV9jb3Vwb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAyLTIwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcGF5X2NvdXBvbigKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcGF5bWVudF9pbmZvOiBhcmM0LkR5bmFtaWNCeXRlcwogICAgLy8gKSAtPiB0eXAuUGF5bWVudFJlc3VsdDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA0CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18zIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMjUtMjI2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgcmVzdHJpY3QgY2FsbGVyIGF1dGhvcml6YXRpb24KICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1c19pc19hY3RpdmUoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjI3CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMjgKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXBuIDIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMzAKICAgIC8vIHVuaXRzID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMzEKICAgIC8vIGFzc2VydCB1bml0cyA+IDAsIGVyci5OT19VTklUUwogICAgYXNzZXJ0IC8vIE5vIEQtQVNBIHVuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjMyCiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuY291bnRfZHVlX2NvdXBvbnMoKQogICAgY2FsbHN1YiBjb3VudF9kdWVfY291cG9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gYWNjb3VudF9wYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMubmF0aXZlCiAgICBzd2FwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMzQKICAgIC8vIGFzc2VydCBkdWVfY291cG9ucyA+IGFjY291bnRfcGFpZF9jb3Vwb25zLCBlcnIuTk9fRFVFX0NPVVBPTgogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBObyBkdWUgY291cG9uIHRvIHBheQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIzNS0yMzgKICAgIC8vICMgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zIHZlcmlmeSBpZiBvdGhlciBhY2NvdW50cyBhcmUgc3RpbGwgd2FpdGluZyBmb3IgdGhlIHBheW1lbnQgb2YgcHJldmlvdXMgY291cG9ucwogICAgLy8gYXNzZXJ0IHNlbGYuYWxsX2R1ZV9jb3Vwb25zX3BhaWQoCiAgICAvLyAgICAgYWNjb3VudF9wYWlkX2NvdXBvbnMKICAgIC8vICksIGVyci5QRU5ESU5HX0NPVVBPTl9QQVlNRU5UCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNDEKICAgIC8vIGlmIHNlbGYuaXNfcGF5bWVudF9leGVjdXRhYmxlKGhvbGRpbmdfYWRkcmVzcyk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgaXNfcGF5bWVudF9leGVjdXRhYmxlCiAgICBieiBwYXlfY291cG9uX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjQzCiAgICAvLyBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKSwKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjQ0CiAgICAvLyBhY2NvdW50X3BhaWRfY291cG9ucyArIDEsCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNDItMjQ1CiAgICAvLyBwYXltZW50X2Ftb3VudCA9IHNlbGYuY291cG9uX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKSwKICAgIC8vICAgICBhY2NvdW50X3BhaWRfY291cG9ucyArIDEsCiAgICAvLyApCiAgICBjYWxsc3ViIGNvdXBvbl9pbnRlcmVzdF9hbW91bnQKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI0Ni0yNDcKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gcGF5bWVudCBhZ2VudAogICAgLy8gc2VsZi5hc3NlcnRfZW5vdWdoX2Z1bmRzKHBheW1lbnRfYW1vdW50KQogICAgY2FsbHN1YiBhc3NlcnRfZW5vdWdoX2Z1bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjQ4LTI0OQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyB0aGUgc2FtZSBhc3NldCBmb3IgZGVub21pbmF0aW9uIGFuZCBzZXR0bGVtZW50LCBubyBjb252ZXJzaW9uIG5lZWRlZAogICAgLy8gc2VsZi5wYXkoc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLCBwYXltZW50X2Ftb3VudCkKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgY2FsbHN1YiBwYXkKCnBheV9jb3Vwb25fYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zLm5hdGl2ZSArIDEKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1NC0yNTYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucy5uYXRpdmUgKyAxCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjU0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBhcmM0LlVJbnQ2NCgKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1NC0yNTYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucy5uYXRpdmUgKyAxCiAgICAvLyApCiAgICBzd2FwCiAgICByZXBsYWNlMiA0OAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1NwogICAgLy8gc2VsZi5wYWlkX2NvdXBvbl91bml0cyArPSB1bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJwYWlkX2NvdXBvbl91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wYWlkX2NvdXBvbl91bml0cyBleGlzdHMKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBieXRlYyAyNiAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYW1vdW50PWFyYzQuVUludDY0KHBheW1lbnRfYW1vdW50KSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNjAKICAgIC8vIHRpbWVzdGFtcD1hcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCksCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjU4LTI2MgogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50UmVzdWx0KAogICAgLy8gICAgIGFtb3VudD1hcmM0LlVJbnQ2NChwYXltZW50X2Ftb3VudCksCiAgICAvLyAgICAgdGltZXN0YW1wPWFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSwKICAgIC8vICAgICBjb250ZXh0PXBheW1lbnRfaW5mby5jb3B5KCksICAjIFRPRE86IEFkZCBpbmZvIG9uIGZhaWxlZCBwYXltZW50CiAgICAvLyApCiAgICBjb25jYXQKICAgIGJ5dGVjIDMyIC8vIDB4MDAxMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnBheV9jb3Vwb25fZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjUxLTI1MgogICAgLy8gIyBBY2NvdW50cyBzdXNwZW5kZWQgb3Igbm90IG9wdGVkIGluIGF0IHRoZSB0aW1lIG9mIHBheW1lbnRzIG11c3Qgbm90IHN0YWxsIHRoZSBELUFTQQogICAgLy8gcGF5bWVudF9hbW91bnQgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGIgcGF5X2NvdXBvbl9hZnRlcl9pZl9lbHNlQDMKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmFsbF9kdWVfY291cG9uc19wYWlkKGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IHVpbnQ2NDoKYWxsX2R1ZV9jb3Vwb25zX3BhaWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6ODgtODkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYWxsX2R1ZV9jb3Vwb25zX3BhaWQoc2VsZiwgZHVlX2NvdXBvbnM6IFVJbnQ2NCkgLT4gYm9vbDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjkwCiAgICAvLyByZXR1cm4gc2VsZi5wYWlkX2NvdXBvbl91bml0cyA+PSBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogZHVlX2NvdXBvbnMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNiAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgID49CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5pc19wYXltZW50X2V4ZWN1dGFibGUoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gdWludDY0Ogppc19wYXltZW50X2V4ZWN1dGFibGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTMtMzE0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGlzX3BheW1lbnRfZXhlY3V0YWJsZShzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcykgLT4gYm9vbDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzE2CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MubmF0aXZlLmlzX29wdGVkX2luKAogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzE3CiAgICAvLyBBc3NldChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzE2LTMxOAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLm5hdGl2ZS5pc19vcHRlZF9pbigKICAgIC8vICAgICBBc3NldChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICAvLyApCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzE2LTMxOQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLm5hdGl2ZS5pc19vcHRlZF9pbigKICAgIC8vICAgICBBc3NldChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICAvLyApCiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZC5uYXRpdmUKICAgIGJ6IGlzX3BheW1lbnRfZXhlY3V0YWJsZV9ib29sX2ZhbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxOQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQubmF0aXZlCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGMgNCAvLyA0NDgKICAgIGdldGJpdAogICAgYnl0ZWMgMTAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBibnogaXNfcGF5bWVudF9leGVjdXRhYmxlX2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKCmlzX3BheW1lbnRfZXhlY3V0YWJsZV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTUtMzIwCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5uYXRpdmUuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgICAgIEFzc2V0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCkKICAgIC8vICAgICApCiAgICAvLyAgICAgYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQubmF0aXZlCiAgICAvLyApCiAgICBzd2FwCiAgICByZXRzdWIKCmlzX3BheW1lbnRfZXhlY3V0YWJsZV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgYiBpc19wYXltZW50X2V4ZWN1dGFibGVfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6CmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDgtMzQ5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzUxCiAgICAvLyBob2xkaW5nX2FkZHJlc3MsIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1MC0zNTIKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoCiAgICAvLyAgICAgaG9sZGluZ19hZGRyZXNzLCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgY2FsbHN1YiBhY2NvdW50X3VuaXRzX3ZhbHVlCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmNvdXBvbl9pbnRlcmVzdF9hbW91bnQocHJpbmNpcGFsX2Ftb3VudDogdWludDY0LCBjb3Vwb246IHVpbnQ2NCkgLT4gdWludDY0Ogpjb3Vwb25faW50ZXJlc3RfYW1vdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEwMC0xMDMKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgY291cG9uX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZWxmLCBwcmluY2lwYWxfYW1vdW50OiBVSW50NjQsIGNvdXBvbjogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gY291cG9uX3JhdGVfYnBzID0gc2VsZi5jb3Vwb25fcmF0ZXMudmFsdWVbY291cG9uIC0gMV0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBieXRlYyAxNyAvLyAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdXBvbl9yYXRlcyBleGlzdHMKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBwdXNoaW50IDIgLy8gMgogICAgKgogICAgcHVzaGludCAyIC8vIDIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEwNQogICAgLy8gcmV0dXJuIHByaW5jaXBhbF9hbW91bnQgKiBjb3Vwb25fcmF0ZV9icHMgLy8gY3N0LkJQUwogICAgZnJhbWVfZGlnIC0yCiAgICAqCiAgICBwdXNoaW50IDEwMDAwIC8vIDEwMDAwCiAgICAvCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfZW5vdWdoX2Z1bmRzKHBheW1lbnRfYW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6CmFzc2VydF9lbm91Z2hfZnVuZHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjItMzIzCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9lbm91Z2hfZnVuZHMoc2VsZiwgcGF5bWVudF9hbW91bnQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzI1CiAgICAvLyBBc3NldChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjUtMzI2CiAgICAvLyBBc3NldChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vID49IHBheW1lbnRfYW1vdW50CiAgICBmcmFtZV9kaWcgLTEKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjQtMzI3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIEFzc2V0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCkuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gICAgID49IHBheW1lbnRfYW1vdW50CiAgICAvLyApLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5wYXkocmVjZWl2ZXI6IGJ5dGVzLCBhbW91bnQ6IHVpbnQ2NCkgLT4gdm9pZDoKcGF5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzI5LTMzMAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBwYXkoc2VsZiwgcmVjZWl2ZXI6IGFyYzQuQWRkcmVzcywgYW1vdW50OiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMzMS0zMzYKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlci5uYXRpdmUsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzM1CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzMyCiAgICAvLyB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzMxCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMzEtMzM2CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIubmF0aXZlLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLnBheV9wcmluY2lwYWwoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgcGF5bWVudF9pbmZvOiBieXRlcykgLT4gYnl0ZXM6CnBheV9wcmluY2lwYWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjY0LTI2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcGF5X3ByaW5jaXBhbCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcGF5bWVudF9pbmZvOiBhcmM0LkR5bmFtaWNCeXRlcwogICAgLy8gKSAtPiB0eXAuUGF5bWVudFJlc3VsdDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA0CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18zIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ0My00NDQKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCByZXN0cmljdCBjYWxsZXIgYXV0aG9yaXphdGlvbgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ0NQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NDYKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXBuIDIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ0OAogICAgLy8gdW5pdHMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NDkKICAgIC8vIGFzc2VydCB1bml0cyA+IDAsIGVyci5OT19VTklUUwogICAgYXNzZXJ0IC8vIE5vIEQtQVNBIHVuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NTAKICAgIC8vIGFzc2VydCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLm1hdHVyaXR5X2RhdGUsIGVyci5OT1RfTUFUVVJFCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgbWF0dXJlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjkxCiAgICAvLyBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyODktMjkyCiAgICAvLyAjIFByaW5jaXBhbCBwYXltZW50IGlzIGZvcmJpZGRlbiBpbiBjYXNlIG9mIHBlbmRpbmcgY291cG9uIHBheW1lbnRzCiAgICAvLyBhc3NlcnQgc2VsZi5hbGxfZHVlX2NvdXBvbnNfcGFpZCgKICAgIC8vICAgICBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIC8vICksIGVyci5QRU5ESU5HX0NPVVBPTl9QQVlNRU5UCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyOTUKICAgIC8vIGlmIHNlbGYuaXNfcGF5bWVudF9leGVjdXRhYmxlKGhvbGRpbmdfYWRkcmVzcyk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgaXNfcGF5bWVudF9leGVjdXRhYmxlCiAgICBieiBwYXlfcHJpbmNpcGFsX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6Mjk2CiAgICAvLyBwYXltZW50X2Ftb3VudCA9IHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgYWNjb3VudF90b3RhbF91bml0c192YWx1ZQogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6Mjk3LTI5OAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBwYXltZW50IGFnZW50CiAgICAvLyBzZWxmLmFzc2VydF9lbm91Z2hfZnVuZHMocGF5bWVudF9hbW91bnQpCiAgICBjYWxsc3ViIGFzc2VydF9lbm91Z2hfZnVuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyOTktMzAwCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIHRoZSBzYW1lIGFzc2V0IGZvciBkZW5vbWluYXRpb24gYW5kIHNldHRsZW1lbnQsIG5vIGNvbnZlcnNpb24gbmVlZGVkCiAgICAvLyBzZWxmLnBheShzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MsIHBheW1lbnRfYW1vdW50KQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBzd2FwCiAgICBjYWxsc3ViIHBheQoKcGF5X3ByaW5jaXBhbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NTcKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgLT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLQogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDU4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KCkKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGJ5dGVjIDggLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICByZXBsYWNlMiAzMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDU5CiAgICAvLyBzZWxmLmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cygpCiAgICBjYWxsc3ViIGVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjMwNwogICAgLy8gYW1vdW50PWFyYzQuVUludDY0KHBheW1lbnRfYW1vdW50KSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMDgKICAgIC8vIHRpbWVzdGFtcD1hcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCksCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzA2LTMxMAogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50UmVzdWx0KAogICAgLy8gICAgIGFtb3VudD1hcmM0LlVJbnQ2NChwYXltZW50X2Ftb3VudCksCiAgICAvLyAgICAgdGltZXN0YW1wPWFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSwKICAgIC8vICAgICBjb250ZXh0PXBheW1lbnRfaW5mby5jb3B5KCksICAjIFRPRE86IEFkZCBpbmZvIG9uIGZhaWxlZCBwYXltZW50CiAgICAvLyApCiAgICBjb25jYXQKICAgIGJ5dGVjIDMyIC8vIDB4MDAxMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgc3dhcAogICAgcmV0c3ViCgpwYXlfcHJpbmNpcGFsX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjMwMi0zMDMKICAgIC8vICMgQWNjb3VudHMgc3VzcGVuZGVkIG9yIG5vdCBvcHRlZCBpbiBhdCB0aGUgdGltZSBvZiBwYXltZW50cyBtdXN0IG5vdCBzdGFsbCB0aGUgRC1BU0EKICAgIC8vIHBheW1lbnRfYW1vdW50ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBiIHBheV9wcmluY2lwYWxfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzKCkgLT4gdm9pZDoKZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzY0LTM2NQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzY2CiAgICAvLyBpZiBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzID09IDA6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBibnogZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzY3CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0VOREVEKQogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgaW50YyA3IC8vIDIwMAogICAgYXBwX2dsb2JhbF9wdXQKCmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0c19hZnRlcl9pZl9lbHNlQDI6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMTItMzE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCB1bml0czogYXJjNC5VSW50NjQKICAgIC8vICkgLT4gdHlwLkN1cnJlbnRVbml0c1ZhbHVlOgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMzMKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMzMtMzM0CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjMzNAogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzMzLTMzNAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMzItMzM1CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyApLCBlcnIuTk9fUFJJTUFSWV9ESVNUUklCVVRJT04KICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzM4CiAgICAvLyAwIDwgdW5pdHMgPD0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ5dGVjIDggLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPgogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDcKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgaXRvYgogICAgZnJhbWVfZGlnIC0xCiAgICBiPj0KICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA3CiAgICBpbnRjXzEgLy8gMQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzM3LTMzOQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICAwIDwgdW5pdHMgPD0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9VTklUUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYW1vdW50IG9mIHVuaXRzIGZvciB0aGUgYWNjb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM0MwogICAgLy8gaG9sZGluZ19hZGRyZXNzLCB1bml0cy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNDEtMzQ0CiAgICAvLyAjIFZhbHVlIGR1cmluZyBwcmltYXJ5IGRpc3RyaWJ1dGlvbiBhbmQgYXQgbWF0dXJpdHkKICAgIC8vIGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSA9IHNlbGYuYWNjb3VudF91bml0c192YWx1ZSgKICAgIC8vICAgICBob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZQogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM0NS0zNDYKICAgIC8vICMgQWNjcnVpbmcgaW50ZXJlc3QgZHVyaW5nIHByaW1hcnkgZGlzdHJpYnV0aW9uIGFuZCBhdCBtYXR1cml0eQogICAgLy8gYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzQ3CiAgICAvLyBudW1lcmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM0OAogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM1MC0zNTEKICAgIC8vICMgQWNjcnVpbmcgaW50ZXJlc3QKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM1MgogICAgLy8gc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChob2xkaW5nX2FkZHJlc3MsIGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0yCiAgICBkaWcgMQogICAgY2FsbHN1YiBhc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM1MwogICAgLy8gaWYgc2VsZi5pc19hY2NydWluZ19pbnRlcmVzdChkdWVfY291cG9ucyk6CiAgICBjYWxsc3ViIGlzX2FjY3J1aW5nX2ludGVyZXN0CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNTQKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjYWxsc3ViIGRheV9jb3VudF9mYWN0b3IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNTUtMzU3CiAgICAvLyBhY2NydWVkX2ludGVyZXN0ID0gc2VsZi5hY2NydWVkX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZSwgZHVlX2NvdXBvbnMKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIDYKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzU4CiAgICAvLyBudW1lcmF0b3IgPSBkYXlfY291bnRfZmFjdG9yLm51bWVyYXRvci5uYXRpdmUKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNTkKICAgIC8vIGRlbm9taW5hdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvci5uYXRpdmUKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfYnVyeSAzCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzYxCiAgICAvLyB1bml0c192YWx1ZT1hcmM0LlVJbnQ2NChhY2NvdW50X3VuaXRzX25vbWluYWxfdmFsdWUpLAogICAgZnJhbWVfZGlnIDEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNjIKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3Q9YXJjNC5VSW50NjQoYWNjcnVlZF9pbnRlcmVzdCksCiAgICBmcmFtZV9kaWcgMgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM2NAogICAgLy8gbnVtZXJhdG9yPWFyYzQuVUludDY0KG51bWVyYXRvciksCiAgICBmcmFtZV9kaWcgNQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM2NQogICAgLy8gZGVub21pbmF0b3I9YXJjNC5VSW50NjQoZGVub21pbmF0b3IpLAogICAgZnJhbWVfZGlnIDMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNjMtMzY2CiAgICAvLyBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIC8vICAgICBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICAvLyApLAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzYwLTM2NwogICAgLy8gcmV0dXJuIHR5cC5DdXJyZW50VW5pdHNWYWx1ZSgKICAgIC8vICAgICB1bml0c192YWx1ZT1hcmM0LlVJbnQ2NChhY2NvdW50X3VuaXRzX25vbWluYWxfdmFsdWUpLAogICAgLy8gICAgIGFjY3J1ZWRfaW50ZXJlc3Q9YXJjNC5VSW50NjQoYWNjcnVlZF9pbnRlcmVzdCksCiAgICAvLyAgICAgZGF5X2NvdW50X2ZhY3Rvcj10eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgICAgIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChudW1lcmF0b3IpLAogICAgLy8gICAgICAgICBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VAOAoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgYiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5maXhlZF9jb3Vwb25fYm9uZC5jb250cmFjdC5GaXhlZENvdXBvbkJvbmQuaXNfYWNjcnVpbmdfaW50ZXJlc3QoZHVlX2NvdXBvbnM6IHVpbnQ2NCkgLT4gdWludDY0Ogppc19hY2NydWluZ19pbnRlcmVzdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjQtMTI1CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGlzX2FjY3J1aW5nX2ludGVyZXN0KHNlbGYsIGR1ZV9jb3Vwb25zOiBVSW50NjQpIC0+IGJvb2w6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjcKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEyNy0xMjkKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyBhbmQgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIGJ6IGlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEyOAogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTI3LTEyOQogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlICE9IDAKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vIGFuZCBkdWVfY291cG9ucyA8IHNlbGYudG90YWxfY291cG9ucwogICAgYnogaXNfYWNjcnVpbmdfaW50ZXJlc3RfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTI5CiAgICAvLyBhbmQgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgIT0gMAogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gYW5kIGR1ZV9jb3Vwb25zIDwgc2VsZi50b3RhbF9jb3Vwb25zCiAgICBieiBpc19hY2NydWluZ19pbnRlcmVzdF9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTI2LTEzMAogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmlzc3VhbmNlX2RhdGUgIT0gMAogICAgLy8gICAgIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vICAgICBhbmQgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIC8vICkKICAgIHJldHN1YgoKaXNfYWNjcnVpbmdfaW50ZXJlc3RfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjYtMTMwCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICAvLyAgICAgYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gICAgIGFuZCBkdWVfY291cG9ucyA8IHNlbGYudG90YWxfY291cG9ucwogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5nZXRfY291cG9uX3JhdGVzKCkgLT4gYnl0ZXM6CmdldF9jb3Vwb25fcmF0ZXM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzY5LTM3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2NvdXBvbl9yYXRlcyhzZWxmKSAtPiB0eXAuQ291cG9uUmF0ZXM6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNzcKICAgIC8vIGNvdXBvbl9yYXRlcyA9IHR5cC5Db3Vwb25SYXRlcygpCiAgICBieXRlYyAzMyAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMyAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6Mzc4CiAgICAvLyBpZiBzZWxmLnN0YXR1c19pc19hY3RpdmUoKToKICAgIGJ6IGdldF9jb3Vwb25fcmF0ZXNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6Mzc5CiAgICAvLyBjb3Vwb25fcmF0ZXMgPSBzZWxmLmNvdXBvbl9yYXRlcy52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDE3IC8vIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MwogICAgYm94X2dldAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb3Vwb25fcmF0ZXMgZXhpc3RzCgpnZXRfY291cG9uX3JhdGVzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozODAKICAgIC8vIHJldHVybiBjb3Vwb25fcmF0ZXMKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmdldF9wYXltZW50X2Ftb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X3BheW1lbnRfYW1vdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM4Mi0zODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9wYXltZW50X2Ftb3VudChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcykgLT4gdHlwLlBheW1lbnRBbW91bnRzOgogICAgcHJvdG8gMSAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3NAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6Mzk3CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozOTctMzk4CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBVSW50NjQoKQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IFVJbnQ2NCgpCiAgICBkdXBuIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18zIC8vIDEwMAogICAgPT0KICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozOTkKICAgIC8vIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpOgogICAgYnogZ2V0X3BheW1lbnRfYW1vdW50X2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQwMAogICAgLy8gcGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zLm5hdGl2ZQogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQwMQogICAgLy8gaWYgcGFpZF9jb3Vwb25zIDwgc2VsZi50b3RhbF9jb3Vwb25zOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIDwKICAgIGJ6IGdldF9wYXltZW50X2Ftb3VudF9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcyksCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWNjb3VudF90b3RhbF91bml0c192YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQwNQogICAgLy8gcGFpZF9jb3Vwb25zICsgMSwKICAgIGZyYW1lX2RpZyAwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQwMi00MDYKICAgIC8vICMgQ291cG9uIFBheW1lbnQKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IHNlbGYuY291cG9uX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnMgKyAxLAogICAgLy8gKQogICAgY2FsbHN1YiBjb3Vwb25faW50ZXJlc3RfYW1vdW50CiAgICBmcmFtZV9idXJ5IDIKCmdldF9wYXltZW50X2Ftb3VudF9hZnRlcl9pZl9lbHNlQDQ6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfYnVyeSA0CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSA1CgpnZXRfcGF5bWVudF9hbW91bnRfYWZ0ZXJfaWZfZWxzZUA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDExCiAgICAvLyBpbnRlcmVzdD1hcmM0LlVJbnQ2NChpbnRlcmVzdF9hbW91bnQpLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQxMgogICAgLy8gcHJpbmNpcGFsPWFyYzQuVUludDY0KHByaW5jaXBhbF9hbW91bnQpLAogICAgc3dhcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQxMC00MTMKICAgIC8vIHJldHVybiB0eXAuUGF5bWVudEFtb3VudHMoCiAgICAvLyAgICAgaW50ZXJlc3Q9YXJjNC5VSW50NjQoaW50ZXJlc3RfYW1vdW50KSwKICAgIC8vICAgICBwcmluY2lwYWw9YXJjNC5VSW50NjQocHJpbmNpcGFsX2Ftb3VudCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfcGF5bWVudF9hbW91bnRfZWxzZV9ib2R5QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDA4LTQwOQogICAgLy8gIyBQcmluY2lwYWwgUGF5bWVudAogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWNjb3VudF90b3RhbF91bml0c192YWx1ZQogICAgZnJhbWVfYnVyeSAzCiAgICBiIGdldF9wYXltZW50X2Ftb3VudF9hZnRlcl9pZl9lbHNlQDQKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmdldF9jb3Vwb25zX3N0YXR1cygpIC0+IGJ5dGVzOgpnZXRfY291cG9uc19zdGF0dXM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDE1LTQxNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2NvdXBvbnNfc3RhdHVzKHNlbGYpIC0+IHR5cC5Db3Vwb25zSW5mbzoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQyNAogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQyNQogICAgLy8gbmV4dF9jb3Vwb25fZHVlX2RhdGUgPSBzZWxmLm5leHRfY291cG9uX2R1ZV9kYXRlKGR1ZV9jb3Vwb25zKQogICAgY2FsbHN1YiBuZXh0X2NvdXBvbl9kdWVfZGF0ZQogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQyNgogICAgLy8gYWxsX2R1ZV9jb3Vwb25zX3BhaWQgPSBzZWxmLmFsbF9kdWVfY291cG9uc19wYWlkKGR1ZV9jb3Vwb25zKQogICAgZHVwCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDI3CiAgICAvLyBudW1lcmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MjgKICAgIC8vIGRlbm9taW5hdG9yID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDI5CiAgICAvLyBpZiBzZWxmLmlzX2FjY3J1aW5nX2ludGVyZXN0KGR1ZV9jb3Vwb25zKToKICAgIGNhbGxzdWIgaXNfYWNjcnVpbmdfaW50ZXJlc3QKICAgIGJ6IGdldF9jb3Vwb25zX3N0YXR1c19hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MzAKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgMAogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDMxCiAgICAvLyBudW1lcmF0b3IgPSBkYXlfY291bnRfZmFjdG9yLm51bWVyYXRvci5uYXRpdmUKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MzIKICAgIC8vIGRlbm9taW5hdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvci5uYXRpdmUKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfYnVyeSA0CgpnZXRfY291cG9uc19zdGF0dXNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQzNAogICAgLy8gdG90YWxfY291cG9ucz1hcmM0LlVJbnQ2NChzZWxmLnRvdGFsX2NvdXBvbnMpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MzUKICAgIC8vIGR1ZV9jb3Vwb25zPWFyYzQuVUludDY0KGR1ZV9jb3Vwb25zKSwKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDM2CiAgICAvLyBuZXh0X2NvdXBvbl9kdWVfZGF0ZT1hcmM0LlVJbnQ2NChuZXh0X2NvdXBvbl9kdWVfZGF0ZSksCiAgICBmcmFtZV9kaWcgMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQzOAogICAgLy8gbnVtZXJhdG9yPWFyYzQuVUludDY0KG51bWVyYXRvciksCiAgICBmcmFtZV9kaWcgMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQzOQogICAgLy8gZGVub21pbmF0b3I9YXJjNC5VSW50NjQoZGVub21pbmF0b3IpLAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MzctNDQwCiAgICAvLyBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIC8vICAgICBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICAvLyApLAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDQxCiAgICAvLyBhbGxfZHVlX2NvdXBvbnNfcGFpZD1hcmM0LkJvb2woYWxsX2R1ZV9jb3Vwb25zX3BhaWQpLAogICAgYnl0ZWMgMTAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MzMtNDQyCiAgICAvLyByZXR1cm4gdHlwLkNvdXBvbnNJbmZvKAogICAgLy8gICAgIHRvdGFsX2NvdXBvbnM9YXJjNC5VSW50NjQoc2VsZi50b3RhbF9jb3Vwb25zKSwKICAgIC8vICAgICBkdWVfY291cG9ucz1hcmM0LlVJbnQ2NChkdWVfY291cG9ucyksCiAgICAvLyAgICAgbmV4dF9jb3Vwb25fZHVlX2RhdGU9YXJjNC5VSW50NjQobmV4dF9jb3Vwb25fZHVlX2RhdGUpLAogICAgLy8gICAgIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIC8vICAgICAgICAgZGVub21pbmF0b3I9YXJjNC5VSW50NjQoZGVub21pbmF0b3IpLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYWxsX2R1ZV9jb3Vwb25zX3BhaWQ9YXJjNC5Cb29sKGFsbF9kdWVfY291cG9uc19wYWlkKSwKICAgIC8vICkKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2V0X2NyZWF0ZShhcnJhbmdlcjogYnl0ZXMsIG1ldGFkYXRhOiBieXRlcykgLT4gdm9pZDoKYXNzZXRfY3JlYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDYxLTQ2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICAvLyBkZWYgYXNzZXRfY3JlYXRlKHNlbGYsIGFycmFuZ2VyOiBhcmM0LkFkZHJlc3MsIG1ldGFkYXRhOiB0eXAuQXNzZXRNZXRhZGF0YSkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gYXJyYW5nZXIubmF0aXZlCiAgICBieXRlYyAxOCAvLyAweDUyMzIzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzEKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YS5ieXRlcwogICAgYnl0ZWMgMjAgLy8gIm1ldGFkYXRhIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXRfdXBkYXRlKG1ldGFkYXRhOiBieXRlcykgLT4gdm9pZDoKYXNzZXRfdXBkYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDczLTQ3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIGFzc2V0X3VwZGF0ZShzZWxmLCBtZXRhZGF0YTogdHlwLkFzc2V0TWV0YWRhdGEpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3OC00ODEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgZGlzYWJsZSBELUFTQSBhcHBsaWNhdGlvbiB1cGRhdGFiaWxpdHkgb3IgY2hhbmdlIGl0cyBhdXRob3JpemF0aW9ucy4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleSBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ4MgogICAgLy8gc2VsZi5tZXRhZGF0YSA9IG1ldGFkYXRhLmJ5dGVzCiAgICBieXRlYyAyMCAvLyAibWV0YWRhdGEiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExOC0xMTkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYuYXJyYW5nZXIudmFsdWUsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAweDUyMzIzMDIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NldF9jb25maWcoZGVub21pbmF0aW9uX2Fzc2V0X2lkOiBieXRlcywgc2V0dGxlbWVudF9hc3NldF9pZDogYnl0ZXMsIHByaW5jaXBhbDogYnl0ZXMsIHByaW5jaXBhbF9kaXNjb3VudDogYnl0ZXMsIG1pbmltdW1fZGVub21pbmF0aW9uOiBieXRlcywgZGF5X2NvdW50X2NvbnZlbnRpb246IGJ5dGVzLCBpbnRlcmVzdF9yYXRlOiBieXRlcywgY291cG9uX3JhdGVzOiBieXRlcywgdGltZV9ldmVudHM6IGJ5dGVzLCB0aW1lX3BlcmlvZHM6IGJ5dGVzKSAtPiB2b2lkOgphc3NldF9jb25maWc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0ODQtNDk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhc3NldF9jb25maWcoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHByaW5jaXBhbDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgcHJpbmNpcGFsX2Rpc2NvdW50OiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBtaW5pbXVtX2Rlbm9taW5hdGlvbjogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb246IGFyYzQuVUludDgsCiAgICAvLyAgICAgaW50ZXJlc3RfcmF0ZTogYXJjNC5VSW50MTYsCiAgICAvLyAgICAgY291cG9uX3JhdGVzOiB0eXAuQ291cG9uUmF0ZXMsCiAgICAvLyAgICAgdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzLAogICAgLy8gICAgIHRpbWVfcGVyaW9kczogdHlwLlRpbWVQZXJpb2RzLAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMTAgMAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MjcKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUyOAogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfRU1QVFksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTMwLTUzMQogICAgLy8gIyBTZXQgRGVub21pbmF0aW9uIEFzc2V0CiAgICAvLyBzZWxmLmFzc2VydF9kZW5vbWluYXRpb25fYXNzZXQoZGVub21pbmF0aW9uX2Fzc2V0X2lkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMTAKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTgwCiAgICAvLyBkZW5vbWluYXRpb25fYXNzZXRfaWQgIT0gVUludDY0KDApIGFuZCBBc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQpLmNyZWF0b3IKICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQKICAgIGZyYW1lX2RpZyA0CiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCmFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzgtMTgxCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQgIT0gVUludDY0KDApIGFuZCBBc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQpLmNyZWF0b3IKICAgIC8vICksIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODUKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZnJhbWVfZGlnIDQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzQtNTM1CiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuYXNzZXJ0X3NldHRsZW1lbnRfYXNzZXQoc2V0dGxlbWVudF9hc3NldF9pZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTkKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkIGV4aXN0cwogICAgZGlnIDEKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODktMTkyCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyA3IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5Ny0yMDMKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5OQogICAgLy8geGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjAwCiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk3LTE5OAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTctMjAzCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQwCiAgICAvLyBwcmluY2lwYWwubmF0aXZlICUgbWluaW11bV9kZW5vbWluYXRpb24ubmF0aXZlID09IDAKICAgIGZyYW1lX2RpZyAtOAogICAgYnRvaQogICAgZnJhbWVfZGlnIC02CiAgICBidG9pCiAgICBkdXAyCiAgICAlCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzgtNTQxCiAgICAvLyAjIFNldCBQcmluY2lwYWwgYW5kIE1pbmltdW0gRGVub21pbmF0aW9uCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByaW5jaXBhbC5uYXRpdmUgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUgPT0gMAogICAgLy8gKSwgZXJyLklOVkFMSURfTUlOSU1VTV9ERU5PTUlOQVRJT04KICAgIGFzc2VydCAvLyBNaW5pbXVtIGRlbm9taW5hdGlvbiBpcyBub3QgYSBkaXZpc29yIG9mIHByaW5jaXBhbAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQyCiAgICAvLyBzZWxmLnVuaXRfdmFsdWUgPSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUKICAgIGJ5dGVjIDEyIC8vICJ1bml0X3ZhbHVlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NDMKICAgIC8vIHNlbGYudG90YWxfdW5pdHMgPSBwcmluY2lwYWwubmF0aXZlIC8vIG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZQogICAgLwogICAgYnl0ZWMgMTQgLy8gInRvdGFsX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU0NAogICAgLy8gc2VsZi5wcmluY2lwYWxfZGlzY291bnQgPSBwcmluY2lwYWxfZGlzY291bnQubmF0aXZlCiAgICBmcmFtZV9kaWcgLTcKICAgIGJ0b2kKICAgIGJ5dGVjIDIxIC8vICJwcmluY2lwYWxfZGlzY291bnQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQ2LTU0NwogICAgLy8gIyBTZXQgRGF5LUNvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuYXNzZXJ0X2RheV9jb3VudF9jb252ZW50aW9uKGRheV9jb3VudF9jb252ZW50aW9uLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtNQogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNy0yMTEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGZyYW1lX2RpZyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTAKICAgIC8vIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgaW50YyA1IC8vIDI1NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjA3LTIxMQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgPT0KICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDE3Cgphc3NldF9jb25maWdfYm9vbF90cnVlQDE2OgogICAgaW50Y18xIC8vIDEKCmFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjA3LTIxMQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIxNQogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IGRheV9jb3VudF9jb252ZW50aW9uCiAgICBieXRlYyAxMyAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBmcmFtZV9kaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU1MC01NTEKICAgIC8vICMgU2V0IEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYuYXNzZXJ0X2ludGVyZXN0X3JhdGUoaW50ZXJlc3RfcmF0ZS5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTQKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjE5LTIyMAogICAgLy8gIyBUaGlzIHN1YnJvdXRpbmUgbXVzdCBiZSB1c2VkIGFmdGVyIHRoZSBwcmluY2lwYWwgZGlzY291bnQgaGFzIGJlZW4gc2V0CiAgICAvLyBpZiBub3Qgc2VsZi5wcmluY2lwYWxfZGlzY291bnQ6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gInByaW5jaXBhbF9kaXNjb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmluY2lwYWxfZGlzY291bnQgZXhpc3RzCiAgICBibnogYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyMQogICAgLy8gYXNzZXJ0IGludGVyZXN0X3JhdGUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0lOVEVSRVNUX1JBVEUKICAgIGZyYW1lX2RpZyAyCiAgICBhc3NlcnQgLy8gSW50ZXJlc3QgcmF0ZSBpcyBub3QgcHJvcGVybHkgZGVmaW5lZAoKYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMjUKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IGludGVyZXN0X3JhdGUKICAgIGJ5dGVjIDI3IC8vICJpbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDgKICAgIC8vIGFzc2VydCBjb3Vwb25fcmF0ZXMubGVuZ3RoLCBlcnIuSU5WQUxJRF9DT1VQT05fUkFURVMKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGFzc2VydCAvLyBDb3Vwb24gcmF0ZXMgYXJlIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMzMKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IGNvdXBvbl9yYXRlcy5sZW5ndGgKICAgIGJ5dGVjIDQgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjM0CiAgICAvLyBpZiBzZWxmLnRvdGFsX2NvdXBvbnM6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgYnogYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gc2VsZi5jb3Vwb25fcmF0ZXMudmFsdWUgPSBjb3Vwb25fcmF0ZXMuY29weSgpCiAgICBieXRlYyAxNyAvLyAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMTcgLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBmcmFtZV9kaWcgLTMKICAgIGJveF9wdXQKCmFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDMyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQwCiAgICAvLyB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIHB1c2hpbnQgNCAvLyA0CiAgICArCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjM5LTI0MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTCiAgICAvLyApLCBlcnIuSU5WQUxJRF9USU1FX0VWRU5UU19MRU5HVEgKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBsZW5ndGggaXMgaW52YWxpZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTYwCiAgICAvLyBzZWxmLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQodGltZV9ldmVudHMpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY1CiAgICAvLyBzZWxmLnRpbWVfZXZlbnRzLnZhbHVlID0gdGltZV9ldmVudHMuY29weSgpCiAgICBieXRlYyAxMSAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDExIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY2LTI2OAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY2CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgYnl0ZWMgOSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY2LTI2OAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjktMjcxCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgZHVwCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2OQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDIyIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjktMjcxCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlID0gdGltZV9ldmVudHNbY2ZnLklTU1VBTkNFX0RBVEVfSURYXS5uYXRpdmUKICAgIGV4dHJhY3QgMTYgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ5dGVjIDUgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjc0LTI3NQogICAgLy8gIyBTb21lIEQtQVNBIG1heSBub3QgaGF2ZSBhIG1hdHVyaXR5IGRhdGUgKGUuZy4sIHBlcnBldHVhbHMpCiAgICAvLyBpZiB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTOgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgcHVzaGludCA0IC8vIDQKICAgICsKICAgID09CiAgICBieiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzOAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjc2CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0aW1lX2V2ZW50c1tjZmcuTUFUVVJJVFlfREFURV9JRFhdLm5hdGl2ZQogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ5dGVjIDYgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODAKICAgIC8vIGFzc2VydCBub3QgdGltZV9wZXJpb2RzLmxlbmd0aCwgZXJyLklOVkFMSURfVElNRV9QRVJJT0RTCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgIQogICAgYXNzZXJ0IC8vIFRpbWUgcGVyaW9kcyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU2NwogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoY2ZnLlNUQVRVU19BQ1RJVkUpCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBpbnRjXzMgLy8gMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgphc3NldF9jb25maWdfYm9vbF9mYWxzZUAxNzoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDE4Cgphc3NldF9jb25maWdfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQodGltZV9ldmVudHM6IGJ5dGVzKSAtPiBieXRlczoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0My0yNDQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWxmLCB0aW1lX2V2ZW50czogdHlwLlRpbWVFdmVudHMpIC0+IE5vbmU6CiAgICBwcm90byAxIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDYKICAgIC8vIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDcKICAgIC8vID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0Ni0yNDcKICAgIC8vIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXS5uYXRpdmUKICAgIC8vID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0NS0yNDgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdLm5hdGl2ZQogICAgLy8gICAgID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5JTlZBTElEX1RJTUUKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDkKICAgIC8vIGZvciBfdCBpbiB1cmFuZ2UodGltZV9ldmVudHMubGVuZ3RoIC0gMSk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMCAvLyAwCgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gZm9yIF90IGluIHVyYW5nZSh0aW1lX2V2ZW50cy5sZW5ndGggLSAxKToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl9mb3JANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUxCiAgICAvLyByZXF1aXJlZF9idWRnZXQ9VUludDY0KGNmZy5PUF9VUF9USU1FX0VWRU5UX1NPUlRJTkcpLAogICAgcHVzaGludCA2NSAvLyA2NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUyCiAgICAvLyBmZWVfc291cmNlPU9wVXBGZWVTb3VyY2UuQXBwQWNjb3VudCwgICMgQXBwIGZ1bmRzIGFyZSBub3QgYXQgcmlzayBzaW5jZSBjYWxsZXIgaXMgdHJ1c3RlZAogICAgaW50Y18xIC8vIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1MC0yNTMKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PVVJbnQ2NChjZmcuT1BfVVBfVElNRV9FVkVOVF9TT1JUSU5HKSwKICAgIC8vICAgICBmZWVfc291cmNlPU9wVXBGZWVTb3VyY2UuQXBwQWNjb3VudCwgICMgQXBwIGZ1bmRzIGFyZSBub3QgYXQgcmlzayBzaW5jZSBjYWxsZXIgaXMgdHJ1c3RlZAogICAgLy8gKQogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTQKICAgIC8vIHRpbWVfaSA9IHRpbWVfZXZlbnRzW190XS5uYXRpdmUKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjU1CiAgICAvLyB0aW1lX2YgPSB0aW1lX2V2ZW50c1tfdCArIDFdLm5hdGl2ZQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gYXNzZXJ0IHRpbWVfZiA+IHRpbWVfaSwgZXJyLklOVkFMSURfU09SVElORwogICAgPAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjU3CiAgICAvLyBpZiBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uICE9IFVJbnQ2NChjc3QuRENDX0NPTlQpOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIGludGMgNSAvLyAyNTUKICAgICE9CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjU4LTI1OQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRpbWUgcGVyaW9kcyBleHByZXNzZWQgaW4gZGF5cyBmb3IgcmVndWxhciBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCAodGltZV9mIC0gdGltZV9pKSAlIFVJbnQ2NCgKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjU4LTI2MQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRpbWUgcGVyaW9kcyBleHByZXNzZWQgaW4gZGF5cyBmb3IgcmVndWxhciBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCAodGltZV9mIC0gdGltZV9pKSAlIFVJbnQ2NCgKICAgIC8vICAgICBjc3QuREFZXzJfU0VDCiAgICAvLyApID09IDAsIGVyci5JTlZBTElEX1RJTUVfUEVSSU9ECiAgICBpbnRjIDYgLy8gODY0MDAKICAgICUKICAgICEKICAgIGFzc2VydCAvLyBUaW1lIHBlcmlvZHMgaW4gQWN0dWFsL0FjdHVhbCBkYXkgY291bnQgY29udmVudGlvbiBtdXN0IGJlIG11bHRpcGxlcyBvZiBhIGRheSAoaW4gc2Vjb25kcykKICAgIGIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDEKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDY6CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cyhzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzOiBieXRlcykgLT4gYnl0ZXM6CnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NjktNTcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKAogICAgLy8gICAgIHNlbGYsIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzCiAgICAvLyApIC0+IHR5cC5TZWNvbmRhcnlNYXJrZXRTY2hlZHVsZToKICAgIHByb3RvIDEgMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5MAogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjIDcgLy8gMjAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTkxCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTkyCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5NAogICAgLy8gYXNzZXJ0IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID49IDEsIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTUKICAgIC8vIGlmIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID4gMToKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTYKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMQogICAgZnJhbWVfYnVyeSAxCgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTgKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5OS02MDEKICAgIC8vIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5OC02MDEKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gPD0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgZGlnIDEKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTctNjAyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gICAgIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vICAgICBdLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX09QRU5JTkdfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBvcGVuaW5nIGRhdGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwMwogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDMtNjA1CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwNgogICAgLy8gaWYgc2VsZi5tYXR1cml0eV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDgKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxMAogICAgLy8gY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwOS02MTEKICAgIC8vID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwOC02MTEKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgZGlnIDEKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDctNjEyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gICAgID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vICAgICBdLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX0NMT1NVUkVfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBjbG9zdXJlIGRhdGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxMwogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTMtNjE1CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjE4CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjE3LTYxOQogICAgLy8gc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyMQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyMC02MjIKICAgIC8vIHNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTYtNjIzCiAgICAvLyByZXR1cm4gdHlwLlNlY29uZGFyeU1hcmtldFNjaGVkdWxlKAogICAgLy8gICAgIHNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgICAgICBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gICAgICksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzaWduX3JvbGUocm9sZV9hZGRyZXNzOiBieXRlcywgcm9sZTogYnl0ZXMsIGNvbmZpZzogYnl0ZXMpIC0+IGJ5dGVzOgphc3NpZ25fcm9sZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyNS02MjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2lnbl9yb2xlKAogICAgLy8gICAgIHNlbGYsIHJvbGVfYWRkcmVzczogYXJjNC5BZGRyZXNzLCByb2xlOiBhcmM0LlVJbnQ4LCBjb25maWc6IGFyYzQuRHluYW1pY0J5dGVzCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDYKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0NwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ5CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgcHVzaGludCAyMCAvLyAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgtNjU1CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUxCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MCAvLyA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MgogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MCAvLyA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MwogICAgLy8gVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwIC8vIDcwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgtNjU1CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU0CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0OC02NTUKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBhc3NpZ25fcm9sZV9ib29sX2ZhbHNlQDcKCmFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18xIC8vIDEKCmFzc2lnbl9yb2xlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0OC02NTUKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU3CiAgICAvLyBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICBwdXNoaW50cyAyMCA0MCA1MCA2MCA3MCA4MCAvLyAyMCwgNDAsIDUwLCA2MCwgNzAsIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTYtNjg1CiAgICAvLyBtYXRjaCByb2xlLm5hdGl2ZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MubmF0aXZlCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICAgICAgICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoKQogICAgZnJhbWVfZGlnIDAKICAgIG1hdGNoIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzBAOSBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8xQDEwIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzJAMTEgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzVAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4NQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfNUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3OQogICAgLy8gcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgYnl0ZWMgMzQgLy8gMHg1MjM4MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzgtNjgwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4MgogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjgxLTY4MwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gKQogICAgYm94X3B1dAoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4NgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgc3dhcAogICAgcmV0c3ViCgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njc1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyOCAvLyAweDUyMzczMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzYKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzNAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyOSAvLyAweDUyMzYzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzMKICAgIC8vIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgYm94X3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8yQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDMwIC8vIDB4NTIzNTMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2OQogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY4LTY3MAogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICBjb25maWcubmF0aXZlCiAgICAvLyApCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzFAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjEKICAgIC8vIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDMxIC8vIDB4NTIzNDMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjYwLTY2MgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjQKICAgIC8vIGNvbmZpZy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2My02NjUKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICkKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMEA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU4CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzLm5hdGl2ZQogICAgYnl0ZWMgMTggLy8gMHg1MjMyMzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NpZ25fcm9sZV9ib29sX21lcmdlQDgKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5yZXZva2Vfcm9sZShyb2xlX2FkZHJlc3M6IGJ5dGVzLCByb2xlOiBieXRlcykgLT4gYnl0ZXM6CnJldm9rZV9yb2xlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njg4LTY4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcmV2b2tlX3JvbGUoc2VsZiwgcm9sZV9hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHJvbGU6IGFyYzQuVUludDgpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDYKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwNwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDgKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA5CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzEwCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MCAvLyA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4LTcxNAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTEKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIHB1c2hpbnQgNjAgLy8gNjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzEyCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAgLy8gNzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzEzCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogcmV2b2tlX3JvbGVfYm9vbF9mYWxzZUA2CgpyZXZva2Vfcm9sZV9ib29sX3RydWVANToKICAgIGludGNfMSAvLyAxCgpyZXZva2Vfcm9sZV9ib29sX21lcmdlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDgtNzE0CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTYtNzE3CiAgICAvLyAjIEFycmFuZ2VyIHJvbGUgY2FuIG5vdCBiZSByZXZva2VkIChqdXN0IHJvdGF0ZWQpCiAgICAvLyBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludHMgNDAgNTAgNjAgNzAgODAgLy8gNDAsIDUwLCA2MCwgNzAsIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTUtNzMzCiAgICAvLyBtYXRjaCByb2xlLm5hdGl2ZToKICAgIC8vICAgICAjIEFycmFuZ2VyIHJvbGUgY2FuIG5vdCBiZSByZXZva2VkIChqdXN0IHJvdGF0ZWQpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BQ0NPVU5UX01BTkFHRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfUFJJTUFSWV9ERUFMRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1RSVVNURUUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BVVRIT1JJVFkgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmludGVyZXN0X29yYWNsZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9JTlRFUkVTVF9PUkFDTEUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoKQogICAgZnJhbWVfZGlnIDAKICAgIG1hdGNoIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzBAOCByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8xQDkgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMCByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8zQDExIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzRAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczMwogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfNEAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczMAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmludGVyZXN0X29yYWNsZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzNCAvLyAweDUyMzgzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MzEKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9JTlRFUkVTVF9PUkFDTEUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MzQKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHN3YXAKICAgIHJldHN1YgoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyNwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyOCAvLyAweDUyMzczMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjgKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BVVRIT1JJVFkgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyNAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjkgLy8gMHg1MjM2MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzI1CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfVFJVU1RFRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8xQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMCAvLyAweDUyMzUzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjIKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9QUklNQVJZX0RFQUxFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8wQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTgKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzEgLy8gMHg1MjM0MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzE5CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQUNDT1VOVF9NQU5BR0VSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX2Jvb2xfZmFsc2VANjoKICAgIGludGNfMCAvLyAwCiAgICBiIHJldm9rZV9yb2xlX2Jvb2xfbWVyZ2VANwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLm9wZW5fYWNjb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBwYXltZW50X2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKb3Blbl9hY2NvdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzM2LTczOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgb3Blbl9hY2NvdW50KAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCBwYXltZW50X2FkZHJlc3M6IGFyYzQuQWRkcmVzcwogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU2CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50YyA3IC8vIDIwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLnN0YXR1c19pc19lbmRlZCgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICAhCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1OAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTkKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzYwCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY0CiAgICAvLyB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgYnl0ZWMgOCAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2Mi03NjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjUKICAgIC8vIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDggLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY2CiAgICAvLyBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDggLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY3CiAgICAvLyBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICBieXRlYyAxMCAvLyAweDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY5CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIyLTEyMwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDMxIC8vIDB4NTIzNDMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2LTEyOQogICAgLy8gY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjcKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyOAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNy0xMjgKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjkKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyOC0xMjkKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI1LTEzMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuY2xvc2VfYWNjb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKY2xvc2VfYWNjb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc3MS03NzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGNsb3NlX2FjY291bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MKICAgIC8vICkgLT4gYXJjNC5UdXBsZVthcmM0LlVJbnQ2NCwgYXJjNC5VSW50NjRdOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODkKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzkwCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3NAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3OTMKICAgIC8vIGNsb3NlZF91bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzk0CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQUNDT1VOVCArIGhvbGRpbmdfYWRkcmVzcy5ieXRlcykKICAgIHN3YXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzk1CiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIC09IGNsb3NlZF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZGlnIDEKICAgIC0KICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5NgogICAgLy8gc2VsZi5lbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoKQogICAgY2FsbHN1YiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5OAogICAgLy8gKGFyYzQuVUludDY0KGNsb3NlZF91bml0cyksIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSkKICAgIGl0b2IKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5Ny03OTkKICAgIC8vIHJldHVybiBhcmM0LlR1cGxlKAogICAgLy8gICAgIChhcmM0LlVJbnQ2NChjbG9zZWRfdW5pdHMpLCBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkpCiAgICAvLyApCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnByaW1hcnlfZGlzdHJpYnV0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiBieXRlcykgLT4gYnl0ZXM6CnByaW1hcnlfZGlzdHJpYnV0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODAxLTgwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcHJpbWFyeV9kaXN0cmlidXRpb24oCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHVuaXRzOiBhcmM0LlVJbnQ2NAogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDQKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjXzMgLy8gMTAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg5LTI5MgogICAgLy8gc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkwCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkxCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5MC0yOTEKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTAtMjkyCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5MgogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIyIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkxLTI5MgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGZyYW1lX2RpZyAyCiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTAtMjkyCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODgtMjkzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyAgICAgYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU0VECiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgY2xvc2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICBieXRlYyAzMCAvLyAweDUyMzUzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzQKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzYtMTM5CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzcKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGVhbGVyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzgKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzctMTM4CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzctMTM5CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kZWFsZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzOC0xMzkKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNy0xMzkKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMgogICAgaW50Y18xIC8vIDEKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzUtMTQwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICAvLyAgICAgYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyOQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzAKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMxCiAgICAvLyBhc3NlcnQgdW5pdHMubmF0aXZlID4gMCwgZXJyLlpFUk9fVU5JVFMKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICBhc3NlcnQgLy8gQ2FuIG5vdCBkaXN0cmlidXRlIHplcm8gdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMwogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyArIHVuaXRzLm5hdGl2ZSA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzItODM0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKyB1bml0cy5uYXRpdmUgPD0gc2VsZi50b3RhbF91bml0cwogICAgLy8gKSwgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHJlbWFpbmluZyBELUFTQSB1bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM2CiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICs9IHVuaXRzLm5hdGl2ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZGlnIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzOAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMubmF0aXZlCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzNy04MzkKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzNy04MzkKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBzd2FwCiAgICByZXBsYWNlMiAzMgogICAgZGlnIDEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0MAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZSA9IGFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgaXRvYgogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBzd2FwCiAgICByZXBsYWNlMiA0MAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoc2VsZi50b3RhbF91bml0cyAtIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgLQogICAgaXRvYgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTI6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDEzCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfYXNzZXRfc3VzcGVuc2lvbihzdXNwZW5kZWQ6IGJ5dGVzKSAtPiBieXRlczoKc2V0X2Fzc2V0X3N1c3BlbnNpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDMtODQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfYXNzZXRfc3VzcGVuc2lvbihzZWxmLCBzdXNwZW5kZWQ6IGFyYzQuQm9vbCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg1NwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NTgKICAgIC8vIHNlbGYuc3VzcGVuZGVkID0gVUludDY0KHN1c3BlbmRlZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ5dGVjIDIzIC8vICJzdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODU5CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUyLTE1MwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIGJ5dGVjIDI4IC8vIDB4NTIzNzMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU2LTE1OQogICAgLy8gY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTcKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdXRob3JpdHkgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1OAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1Ny0xNTgKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTctMTU5CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTkKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdXRob3JpdHkgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1OC0xNTkKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTctMTU5CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU1LTE2MAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIC8vICAgICBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X2FjY291bnRfc3VzcGVuc2lvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBzdXNwZW5kZWQ6IGJ5dGVzKSAtPiBieXRlczoKc2V0X2FjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2MS04NjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9hY2NvdW50X3N1c3BlbnNpb24oCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHN1c3BlbmRlZDogYXJjNC5Cb29sCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NzkKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4MQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGludGMgNCAvLyA0NDgKICAgIHN3YXAKICAgIHNldGJpdAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODgyCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfZGVmYXVsdF9zdGF0dXMoZGVmYXVsdGVkOiBieXRlcykgLT4gdm9pZDoKc2V0X2RlZmF1bHRfc3RhdHVzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODg0LTg4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgc2V0X2RlZmF1bHRfc3RhdHVzKHNlbGYsIGRlZmF1bHRlZDogYXJjNC5Cb29sKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICBieXRlYyAyOSAvLyAweDUyMzYzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDQKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDYtMTQ5CiAgICAvLyBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDcKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJ1c3RlZSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ4CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ3LTE0OAogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDctMTQ5CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDkKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJ1c3RlZSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ4LTE0OQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDctMTQ5CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1CiAgICBpbnRjXzEgLy8gMQoKc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NS0xNTAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgLy8gICAgIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTYKICAgIC8vIHNlbGYuZGVmYXVsdGVkID0gVUludDY0KGRlZmF1bHRlZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ5dGVjIDI0IC8vICJkZWZhdWx0ZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgpzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfbWVyZ2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hc3NldF9pbmZvKCkgLT4gYnl0ZXM6CmdldF9hc3NldF9pbmZvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODk4LTg5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2luZm8oc2VsZikgLT4gdHlwLkFzc2V0SW5mbzoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTA4CiAgICAvLyBwZXJmb3JtYW5jZSA9IFVJbnQ2NChjc3QuUFJGX1BFUkZPUk1BTlQpCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDkKICAgIC8vIGlmIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID4gc2VsZi5tYXR1cml0eV9kYXRlID4gMDoKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgY292ZXIgNAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgID4KICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VAMwogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIDEKICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTEwCiAgICAvLyBwZXJmb3JtYW5jZSA9IFVJbnQ2NChjc3QuUFJGX01BVFVSRUQpCiAgICBwdXNoaW50IDQgLy8gNAogICAgZnJhbWVfYnVyeSAyCgpnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDM6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTEtOTEyCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG5vIGdyYWNlIG9yIGRlbGlucXVlbmN5IHBlcmlvZHMKICAgIC8vIGlmIHNlbGYuZGVmYXVsdGVkOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI0IC8vICJkZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVmYXVsdGVkIGV4aXN0cwogICAgYnogZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTMKICAgIC8vIHBlcmZvcm1hbmNlID0gVUludDY0KGNzdC5QUkZfREVGQVVMVEVEKQogICAgcHVzaGludCAzIC8vIDMKICAgIGZyYW1lX2J1cnkgMAoKZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE2CiAgICAvLyBkZW5vbWluYXRpb25fYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE3CiAgICAvLyBzZXR0bGVtZW50X2Fzc2V0X2lkPWFyYzQuVUludDY0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzQwCiAgICAvLyByZXR1cm4gc2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTgKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCgpKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxOQogICAgLy8gdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NChzZWxmLnVuaXRfdmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjAKICAgIC8vIGRheV9jb3VudF9jb252ZW50aW9uPWFyYzQuVUludDgoc2VsZi5kYXlfY291bnRfY29udmVudGlvbiksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgaXRvYgogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyMQogICAgLy8gcHJpbmNpcGFsX2Rpc2NvdW50PWFyYzQuVUludDE2KHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50KSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMSAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjIKICAgIC8vIGludGVyZXN0X3JhdGU9YXJjNC5VSW50MTYoc2VsZi5pbnRlcmVzdF9yYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyMwogICAgLy8gdG90YWxfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyNAogICAgLy8gY2lyY3VsYXRpbmdfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTI2CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjUtOTI3CiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjkKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjIgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjgtOTMwCiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzEKICAgIC8vIGlzc3VhbmNlX2RhdGU9YXJjNC5VSW50NjQoc2VsZi5pc3N1YW5jZV9kYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzIKICAgIC8vIG1hdHVyaXR5X2RhdGU9YXJjNC5VSW50NjQoc2VsZi5tYXR1cml0eV9kYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzMKICAgIC8vIHN1c3BlbmRlZD1hcmM0LkJvb2woYm9vbChzZWxmLnN1c3BlbmRlZCkpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIzIC8vICJzdXNwZW5kZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3VzcGVuZGVkIGV4aXN0cwogICAgYnl0ZWMgMTAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzQKICAgIC8vIHBlcmZvcm1hbmNlPWFyYzQuVUludDgocGVyZm9ybWFuY2UpLAogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTUtOTM1CiAgICAvLyByZXR1cm4gdHlwLkFzc2V0SW5mbygKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKSwKICAgIC8vICAgICBvdXRzdGFuZGluZ19wcmluY2lwYWw9YXJjNC5VSW50NjQoc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwoKSksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NChzZWxmLnVuaXRfdmFsdWUpLAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uPWFyYzQuVUludDgoc2VsZi5kYXlfY291bnRfY29udmVudGlvbiksCiAgICAvLyAgICAgcHJpbmNpcGFsX2Rpc2NvdW50PWFyYzQuVUludDE2KHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50KSwKICAgIC8vICAgICBpbnRlcmVzdF9yYXRlPWFyYzQuVUludDE2KHNlbGYuaW50ZXJlc3RfcmF0ZSksCiAgICAvLyAgICAgdG90YWxfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMpLAogICAgLy8gICAgIGNpcmN1bGF0aW5nX3N1cHBseT1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBpc3N1YW5jZV9kYXRlPWFyYzQuVUludDY0KHNlbGYuaXNzdWFuY2VfZGF0ZSksCiAgICAvLyAgICAgbWF0dXJpdHlfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLm1hdHVyaXR5X2RhdGUpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woYm9vbChzZWxmLnN1c3BlbmRlZCkpLAogICAgLy8gICAgIHBlcmZvcm1hbmNlPWFyYzQuVUludDgocGVyZm9ybWFuY2UpLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgdW5jb3ZlciAxNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hY2NvdW50X2luZm8oaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hY2NvdW50X2luZm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzctOTM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYWNjb3VudF9pbmZvKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzKSAtPiB0eXAuQWNjb3VudEluZm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3NAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTIKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF90aW1lX2V2ZW50cygpIC0+IGJ5dGVzOgpnZXRfdGltZV9ldmVudHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTQtOTU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfdGltZV9ldmVudHMoc2VsZikgLT4gdHlwLlRpbWVFdmVudHM6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2MgogICAgLy8gdGltZV9ldmVudHMgPSB0eXAuVGltZUV2ZW50cygpCiAgICBieXRlYyAzMyAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMyAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NjMKICAgIC8vIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpOgogICAgYnogZ2V0X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTY0CiAgICAvLyB0aW1lX2V2ZW50cyA9IHNlbGYudGltZV9ldmVudHMudmFsdWUuY29weSgpCiAgICBieXRlYyAxMSAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRpbWVfZXZlbnRzIGV4aXN0cwoKZ2V0X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2NQogICAgLy8gcmV0dXJuIHRpbWVfZXZlbnRzCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUoKSAtPiBieXRlczoKZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NjctOTY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZShzZWxmKSAtPiB0eXAuVGltZUV2ZW50czoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTc2CiAgICAvLyBhcmM0LlVJbnQ2NChzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NzcKICAgIC8vIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk3NS05NzgKICAgIC8vIHJldHVybiB0eXAuVGltZUV2ZW50cygKICAgIC8vICAgICBhcmM0LlVJbnQ2NChzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NChzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfYXNzZXRfbWV0YWRhdGEoKSAtPiBieXRlczoKZ2V0X2Fzc2V0X21ldGFkYXRhOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTgwLTk4MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21ldGFkYXRhKHNlbGYpIC0+IHR5cC5Bc3NldE1ldGFkYXRhOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5ODkKICAgIC8vIHJldHVybiB0eXAuQXNzZXRNZXRhZGF0YS5mcm9tX2J5dGVzKHNlbGYubWV0YWRhdGEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gIm1ldGFkYXRhIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1ldGFkYXRhIGV4aXN0cwogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLnV0aWwuZW5zdXJlX2J1ZGdldChyZXF1aXJlZF9idWRnZXQ6IHVpbnQ2NCwgZmVlX3NvdXJjZTogdWludDY0KSAtPiB2b2lkOgplbnN1cmVfYnVkZ2V0OgogICAgcHJvdG8gMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgICsKCmVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDE6CiAgICBmcmFtZV9kaWcgMAogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA3CiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgMzUgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyAzNSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2l0Y2ggZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDMgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA2OgogICAgaXR4bl9zdWJtaXQKICAgIGIgZW5zdXJlX2J1ZGdldF93aGlsZV90b3BAMQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQ6CiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANgoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDM6CiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDYKCmVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANzoKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"}}""" +_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Sender Account Holding Address", "name": "sender_holding_address"}, {"type": "address", "desc": "Receiver Account Holding Address", "name": "receiver_holding_address"}, {"type": "uint64", "desc": "Amount of D-ASA units to transfer", "name": "units"}], "name": "asset_transfer", "returns": {"type": "uint64", "desc": "Transferred actualized value in denomination asset"}, "desc": "Transfer D-ASA units between accounts", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "byte[]", "desc": "Additional payment information (Optional)", "name": "payment_info"}], "name": "pay_coupon", "returns": {"type": "(uint64,uint64,byte[])", "desc": "Paid coupon amount in denomination asset, Payment timestamp, Payment context", "struct": "PaymentResult"}, "desc": "Pay due coupon to an account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "byte[]", "desc": "Additional payment information (Optional)", "name": "payment_info"}], "name": "pay_principal", "returns": {"type": "(uint64,uint64,byte[])", "desc": "Paid principal amount in denomination asset, Payment timestamp, Payment context", "struct": "PaymentResult"}, "desc": "Pay the outstanding principal to an account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "uint64", "desc": "Account's units for the current value calculation", "name": "units"}], "name": "get_account_units_current_value", "returns": {"type": "(uint64,uint64,(uint64,uint64))", "desc": "Units current value in denomination asset, Accrued interest in denomination asset", "struct": "CurrentUnitsValue"}, "desc": "Get account's units current value and accrued interest", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_coupon_rates", "returns": {"type": "uint16[]", "desc": "Coupon rates"}, "desc": "Get D-ASA coupon rates", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "get_payment_amount", "returns": {"type": "(uint64,uint64)", "desc": "Interest amount in denomination asset, Principal amount in denomination asset", "struct": "PaymentAmounts"}, "desc": "Get the next payment amount", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_coupons_status", "returns": {"type": "(uint64,uint64,uint64,(uint64,uint64),bool)", "desc": "Total coupons, Due coupons, Next coupon due date, (Day count factor numerator, Day count factor denominator), All due coupons paid", "struct": "CouponsInfo"}, "desc": "Get D-ASA coupons status", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA Arranger Address", "name": "arranger"}, {"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "desc": "D-ASA metadata", "name": "metadata", "struct": "AssetMetadata"}], "name": "asset_create", "returns": {"type": "void"}, "desc": "Create a new D-ASA", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [{"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "name": "metadata", "struct": "AssetMetadata"}], "name": "asset_update", "returns": {"type": "void"}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Denomination asset identifier", "name": "denomination_asset_id"}, {"type": "uint64", "desc": "Settlement asset identifier", "name": "settlement_asset_id"}, {"type": "uint64", "desc": "Principal, expressed in denomination asset", "name": "principal"}, {"type": "uint64", "desc": "Principal discount in bps", "name": "principal_discount"}, {"type": "uint64", "desc": "Minimum denomination, expressed in denomination asset", "name": "minimum_denomination"}, {"type": "uint8", "desc": "Day-count convention for interests calculation", "name": "day_count_convention"}, {"type": "uint16", "desc": "Interest rate in bps", "name": "interest_rate"}, {"type": "uint16[]", "desc": "Coupon interest rates in bps", "name": "coupon_rates"}, {"type": "uint64[]", "desc": "Time events (strictly ascending order)", "name": "time_events"}, {"type": "(uint64,uint64)[]", "desc": "Time periods of recurring time events", "name": "time_periods"}], "name": "asset_config", "returns": {"type": "void"}, "desc": "Configure the Debt Algorand Standard Application", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64[]", "desc": "Secondary market time events (strictly ascending order)", "name": "secondary_market_time_events"}], "name": "set_secondary_time_events", "returns": {"type": "(uint64,uint64)", "desc": "Secondary Market Opening Date, Secondary Market Closure Date", "struct": "SecondaryMarketSchedule"}, "desc": "Set secondary market time schedule", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "uint8", "desc": "Role identifier", "name": "role"}, {"type": "byte[]", "desc": "Role configuration (Optional)", "name": "config"}], "name": "assign_role", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Assign a role to an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "uint8", "desc": "Role identifier", "name": "role"}], "name": "revoke_role", "returns": {"type": "uint64", "desc": "Timestamp of the role revocation"}, "desc": "Revoke a role from an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "open_account", "returns": {"type": "uint64", "desc": "Timestamp of the account opening"}, "desc": "Open D-ASA account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "close_account", "returns": {"type": "(uint64,uint64)", "desc": "Closed units, Timestamp of the account closing"}, "desc": "Close D-ASA account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "uint64", "desc": "Amount of D-ASA units to distribute", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64", "desc": "Remaining D-ASA units to be distributed"}, "desc": "Distribute D-ASA units to accounts according the primary market", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "set_asset_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set asset suspension status"}, "desc": "Set asset suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "set_account_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set account suspension status"}, "desc": "Set account suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Default status", "name": "defaulted"}], "name": "set_default_status", "returns": {"type": "void"}, "desc": "Set D-ASA default status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_asset_info", "returns": {"type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Performance", "struct": "AssetInfo"}, "desc": "Get D-ASA info", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "get_account_info", "returns": {"type": "(address,uint64,uint64,uint64,bool)", "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended", "struct": "AccountInfo"}, "desc": "Get account info", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_time_events", "returns": {"type": "uint64[]", "desc": "Time events"}, "desc": "Get D-ASA time events", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_secondary_market_schedule", "returns": {"type": "uint64[]", "desc": "Secondary market schedule"}, "desc": "Get secondary market schedule", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_asset_metadata", "returns": {"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "desc": "Contract type, Calendar, Business day convention, End of month convention, Early repayment effect, Early repayment penalty type, Prospectus hash, Prospectus URL", "struct": "AssetMetadata"}, "desc": "Get D-ASA metadata", "events": [], "readonly": true, "recommendations": {}}], "name": "FixedCouponBond", "state": {"keys": {"box": {"coupon_rates": {"key": "Y291cG9uUmF0ZXM=", "keyType": "AVMBytes", "valueType": "uint16[]"}, "time_events": {"key": "dGltZUV2ZW50cw==", "keyType": "AVMBytes", "valueType": "uint64[]"}, "time_periods": {"key": "dGltZVBlcmlvZHM=", "keyType": "AVMBytes", "valueType": "(uint64,uint64)[]"}}, "global": {"arranger": {"key": "UjIwIw==", "keyType": "AVMBytes", "valueType": "AVMBytes"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "unit_value": {"key": "dW5pdF92YWx1ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "metadata": {"key": "bWV0YWRhdGE=", "keyType": "AVMString", "valueType": "AVMBytes"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "circulating_units": {"key": "Y2lyY3VsYXRpbmdfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "principal_discount": {"key": "cHJpbmNpcGFsX2Rpc2NvdW50", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_rate": {"key": "aW50ZXJlc3RfcmF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_coupons": {"key": "dG90YWxfY291cG9ucw==", "keyType": "AVMString", "valueType": "AVMUint64"}, "primary_distribution_opening_date": {"key": "cHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "primary_distribution_closure_date": {"key": "cHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "issuance_date": {"key": "aXNzdWFuY2VfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "secondary_market_opening_date": {"key": "c2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU=", "keyType": "AVMString", "valueType": "AVMUint64"}, "secondary_market_closure_date": {"key": "c2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU=", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "suspended": {"key": "c3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "defaulted": {"key": "ZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "due_coupons_watermark": {"key": "ZHVlX2NvdXBvbnNfd2F0ZXJtYXJr", "keyType": "AVMString", "valueType": "AVMUint64"}, "paid_coupon_units": {"key": "cGFpZF9jb3Vwb25fdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjQwIw=="}, "primary_dealer": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjUwIw=="}, "trustee": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjYwIw=="}, "authority": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjcwIw=="}, "interest_oracle": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjgwIw=="}, "account": {"keyType": "address", "valueType": "AccountInfo", "prefix": "UjMwIw=="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 2, "ints": 20}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AccountInfo": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "unit_value", "type": "uint64"}, {"name": "paid_coupons", "type": "uint64"}, {"name": "suspended", "type": "bool"}], "AssetInfo": [{"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "unit_value", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "principal_discount", "type": "uint16"}, {"name": "interest_rate", "type": "uint16"}, {"name": "total_supply", "type": "uint64"}, {"name": "circulating_supply", "type": "uint64"}, {"name": "primary_distribution_opening_date", "type": "uint64"}, {"name": "primary_distribution_closure_date", "type": "uint64"}, {"name": "issuance_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "performance", "type": "uint8"}], "AssetMetadata": [{"name": "contract_type", "type": "uint8"}, {"name": "calendar", "type": "uint8"}, {"name": "business_day_convention", "type": "uint8"}, {"name": "end_of_month_convention", "type": "uint8"}, {"name": "prepayment_effect", "type": "uint8"}, {"name": "penalty_type", "type": "uint8"}, {"name": "prospectus_hash", "type": "byte[32]"}, {"name": "prospectus_url", "type": "string"}], "CouponsInfo": [{"name": "total_coupons", "type": "uint64"}, {"name": "due_coupons", "type": "uint64"}, {"name": "next_coupon_due_date", "type": "uint64"}, {"name": "day_count_factor", "type": "DayCountFactor"}, {"name": "all_due_coupons_paid", "type": "bool"}], "CurrentUnitsValue": [{"name": "units_value", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "day_count_factor", "type": "DayCountFactor"}], "DayCountFactor": [{"name": "numerator", "type": "uint64"}, {"name": "denominator", "type": "uint64"}], "PaymentAmounts": [{"name": "interest", "type": "uint64"}, {"name": "principal", "type": "uint64"}], "PaymentResult": [{"name": "amount", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}, {"name": "context", "type": "byte[]"}], "RoleConfig": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}], "SecondaryMarketSchedule": [{"name": "secondary_market_opening_date", "type": "uint64"}, {"name": "secondary_market_closure_date", "type": "uint64"}]}, "byteCode": {"approval": "CiAIAAEIZMAD/wGAowXIASYkBBUffHUEUjMwIxFjaXJjdWxhdGluZ191bml0cwZzdGF0dXMNdG90YWxfY291cG9ucw1pc3N1YW5jZV9kYXRlDW1hdHVyaXR5X2RhdGUTc2V0dGxlbWVudF9hc3NldF9pZAgAAAAAAAAAACFwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUBAAp0aW1lRXZlbnRzCnVuaXRfdmFsdWUUZGF5X2NvdW50X2NvbnZlbnRpb24LdG90YWxfdW5pdHMdc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUdc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGULY291cG9uUmF0ZXMEUjIwIxVkZW5vbWluYXRpb25fYXNzZXRfaWQIbWV0YWRhdGEScHJpbmNpcGFsX2Rpc2NvdW50IXByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQlzdXNwZW5kZWQJZGVmYXVsdGVkFWR1ZV9jb3Vwb25zX3dhdGVybWFyaxFwYWlkX2NvdXBvbl91bml0cw1pbnRlcmVzdF9yYXRlBFI3MCMEUjYwIwRSNTAjBFI0MCMCABICAAAEUjgwIwMGgQExGEAAbCcSMgNnJxMiZycHImcnDCJnJw0iZycUgABnJw4iZyoiZycVImcnGyJnJwQiZycJImcnFiJnJwUiZycPImcnECJnJwYiZysiZycXImcnGCJnMTWBAhJEMTSBFBJEMTcURDE2FEQnGSJnJxoiZzEbQQCvghgET9ajzASM8UtRBJx2tqMERDY9SQRTvvBFBGfbTyAE9qlsjQQ/DvxsBCXbqVsEiUdBNAQdb8JVBP73RWcEuPwTkAQ9Q9HwBOvZay8EbIXj7gT2Os6NBLvMoYoEGnurtARALbpHBO0CdZ8E+tIXPgQI7+o1BOSlq1Q2GgCOGAHRAbsBpQGPAX8BbAFcAUkBOAEOAPsA4gDMALYAowCNAHoAZABVAEUAMgAiABIAAiJDMRkURDEYRIgOrihMULAjQzEZFEQxGESIDocoTFCwI0MxGRREMRhEiA5eKExQsCNDMRkURDEYRDYaAYgOPChMULAjQzEZFEQxGESIDV8oTFCwI0MxGRREMRhENhoBiA0PI0MxGRREMRhENhoBNhoCiAzeKExQsCNDMRkURDEYRDYaAYgMhChMULAjQzEZFEQxGEQ2GgE2GgKIC7AoTFCwI0MxGRREMRhENhoBiAtuKExQsCNDMRkURDEYRDYaATYaAogK8ShMULAjQzEZFEQxGEQ2GgE2GgKICj8oTFCwI0MxGRREMRhENhoBNhoCNhoDiAleKExQsCNDMRkURDEYRDYaAYgIzihMULAjQzEZFEQxGEQ2GgE2GgI2GgM2GgQ2GgU2GgY2Ggc2Ggg2Ggk2GgqIBw4jQzEZgQQSRDEYRDYaAYgG5CNDMRkURDEYFEQ2GgE2GgKIBsMjQzEZFEQxGESIBmEoTFCwI0MxGRREMRhENhoBiAXzKExQsCNDMRkURDEYRIgFyihMULAjQzEZFEQxGEQ2GgE2GgKIBOkoTFCwI0MxGRREMRhENhoBNhoCiARHKExQsCNDMRkURDEYRDYaATYaAogC/ShMULAjQzEZFEQxGEQ2GgE2GgI2GgOIAAYoTFCwI0OKAwEiRwKAAEmL/xciK2VEJRJBAUAiJw9lRDIHSYwEDkEBMiInEGVEiwQNQQEnI0QxAIv9EkSIASCIASgpi/1QSYwBSb1FAUQpi/5QSYwCSb1FAURLAb5EIQRTJwoiTwJUIlMUREm+RCEEUycKIk8CVCJTFERLAb5EVyAIF4sFD0RMvkRXKAiMAL5EVyAIF0EApIsBvkRXKAiLAr5EVygIqEEAjosBvkRXMAiLAr5EVzAIqEEAfCNEiAC0i/1LAYgBKYsBSU4CvkRXKAiMAIv9iwVJTgRPAogBI4wDSb5EVyAIF0sCCRZLAb5ETFwgSwFMv4sCSb5EVyAIF08DCBZLAb5ETFwgv75EVyAIF0AAFYsBSb5EJwhcKEsBTL9JvkQnCFwwv4sAF4sFC4sDCBaMAIkiQv+BiwJJvkSLAFwoSwFMv4sBvkRLAb5ETFcwCFwwv0L/YyJC/taKAAAiJxhlRBREiYoAACInF2VEFESJigABgAAyB0kiJxllTE4CRCInBmVED0EAEyInBGVMjAJEJxmLAklOAmeMAIkiJwVlRIsBDEH/6iInGWVEgQMISYwAJwu+RFcCAEwkCyRYF4sBDkEAHSEFIogLD4sAIwhJjAAnC75EVwIATCQLJFgXQv/diwCBAwmMAkL/pYoCACmL/lC+RFcwCIv/FqhEiYoDAYv9i/+I/+SL/4gALUlXAAgXTFcICBcnEb5EVwIAi/+BAguBAlgXi/2L/ogAoAtPAguBkE5PAgsKiYoBAYAARwSL/0AAQCInBWVEMgdLAQlJTgKMAIv/iABYTAlJjAMiJw1lREyMBEyMAUAADosAIQYKiwMhBgqMBIwBiwSLARZMFlCMAIkijAKL/0EAB4v/iAAHjAKLAkL/sYoBAYEDi/8IIwknC75EVwIATCQLJFgXiYoBASJJJwRlRIv/DUEACYv/IwiI/9KMAIsATImKAgEpi/5QvkRXKAgXi/8LiYoCASIrZUQlEkSI/m6I/nYpi/5QRwK9RQFESb5EVyAIF0lOAkSI/mlMvkRXMAgXSU8CSwENRIgAV0SL/ogAYkEASov+iACMiwIjCIgAmUcCiACyiwC+RFcAIEyIALmLAEm+RFcwCBcjCBZLAb5ETFwwvyInGmVEiwEIJxpMZxYyBxZQJyBQi/9QjACJIkL/zooBASInGmVEIiplRIv/Cw+JigEBKYv/UEm+RFcAICInB2VEcABFAUEAFYsAvkQhBFMnCiJPAlQiU0AAAyNMiSJC//qKAQEpi/9QvkRXIAgXi/9MiP8JiYoCAYv/IwknEb5EVwIATIECC4ECWBeL/guBkE4KiYoBADIKIicHZURwAESL/w9EiYoCALEyACInB2VEi/+yEov+shSyEYEEshCyAbOJigIBIitlRCUSRIj9Ooj9QimL/lBHAr1FAUS+RFcgCBdEMgciJwZlRA9EiP0wiP8sRIv+iP83QQBAi/6I/2FHAoj/josAvkRXACBMiP+VIiplRIsASU4CvkRXIAgXCSpMZ0m+RCcIXCC/iAARFjIHFlAnIFCL/1BMiSJC/9GKAAAiKmVEQAAEKyEHZ4mKAgEigABHBSInCWVEQQCSMgciJwllRA9BAIcjRCmL/lBJjAC9RQFEi/8nCKVBAG6LAL5EVyAIFxaL/6dBAF8jRIv/F0mMBov+TIj94owBIowCIowFIowDiPx2SYwEi/5LAYj86IgAPkEAHosESYj9Kov+iwZPA4j85YwCSVcACBeMBVcICBeMA4sBFosCFosFFosDFlBOAlBMUIwAiSJC/54iQv92igEBIicFZURBABgyByInBWVED0EADSInBGVEi/8NQQACI4kiiYoAASchIitlRCUSQQAHJxG+TIwARIsATImKAQGAACmL/1BJvUUBRCJHBCtlRCUSTE4CQQAqiwG+RFcwCBdJjAAiJwRlRAxBACGL/4j9+osAIwiI/geMAosDjASLAowFiwSLBRZMFlCMAImL/4j92YwDQv/jigABiPuMRwKI/MlMSYj9gUwiTCJMiP9PQQASiwCI/DxJVwAIF4wDVwgIF4wEIicEZUQWiwAWiwEWiwMWiwQWUCcKIosCVE8ETwRQTwNQTwJQTFCMAImKAgAnEov+ZycUi/9niYoBAIgABicUi/9niYoAADEAIicSZUQSRImKCgAigABHAoj/6CIrZUQURIv2F0lBAQ6LBHELRDIDE0EBAyNEJxOLBGeL9xciJxNlREsBEkQnB0xnsTIAIicHZUQyCiKyErIUshGBBLIQsgGzi/gXi/oXShgURCcMSwFnCicOTGeL+RcnFUxni/sXSYwBQQAIiwEhBRJBAKQjRCcNiwFni/wXjAIiJxVlREAAA4sCRCcbiwJni/0iWUlEJwRMZyInBGVEQQAJJxG8SCcRi/2/i/4iWSInBGVEgQQIEkSL/ogAYoz+Jwu8SCcLi/6/i/5XAgBJjABJVwAIFycJTGdJVwgIFycWTGdXEAgXJwVMZ4v+IllJjAMiJwRlRIEECBJBABCLAyMJJAuLAEwkWBcnBkxni/8iWRREKyVniSJC/1kiQv76igEBgABJi/9XAgBJVwAIFzIHDUSL/yJZIwkiiwSLAwxBAECBQSOIBSyLBEkkC4sCSU4DTCRYF0lOA4wBIwhJjAQkCyRYF0mMAAxEIicNZUQhBRNB/8WLAIsBCSEGGBREQv+4i/+MAImKAQEiiP5aIitlRCEHEhREiPlai/8iWUlEIw2L/0xBAAqL/4j/ckmM/4wBiwGM/yInBWVEi/9XAgBJjABXAAgXTEsBDkQnD0xnIicGZURBABwiJwZlRIv/IlkjCSQLiwBMJFgXTEsBD0QnEExnIicPZUQWIicQZUQWUIwAiYoDAYj93oj454v+F0mBFBJAACiLAIEoEkAAIIsAgTISQAAYiwCBPBJAABCLAIFGEkAACIsAgVASQQCJI0SDBhQoMjxGUIsAjgYAZwBTAD8AKwAXAAEAJyKL/VBJvUUBFESL/1cCAL8yBxZMiScci/1QSb1FARREi/9XAgC/Qv/nJx2L/VBJvUUBFESL/1cCAL9C/9MnHov9UEm9RQEURIv/VwIAv0L/vycfi/1QSb1FARREi/9XAgC/Qv+rJxKL/WdC/6MiQv90igIBiP0WiPgfi/8XSYEoEkAAIIsAgTISQAAYiwCBPBJAABCLAIFGEkAACIsAgVASQQBlI0SDBSgyPEZQiwCOBQA/ADAAIQASAAEAJyKL/lBJvUUBRLxIMgcWTIknHIv+UEm9RQFEvEhC/+wnHYv+UEm9RQFEvEhC/90nHov+UEm9RQFEvEhC/84nH4v+UEm9RQFEvEhC/78iQv+YigIBiAAsIitlRCEHEhREiPd6iPeCKYv+UEm9RQEURIv/JwhQJwhQJwhQJwpQvzIHFomKAAAiJx8xAFBJvUUBQQAhiwG+RFcACDIHFkmMAKZBABCLAb5EVwgIiwCnQQADI0SJIkL/+ooBAYj/xYj3HCmL/1BJvUUBREm+RFcgCBdMvEgiKmVESwEJKkxniPoyFjIHFlCJigIBIkmAACIrZUQlEkEAqiInCWVEMgdJjAIOQQCcIicWZUSLAg1BAJEjRCceMQBQSYwAvUUBQQB9iwC+RFcACDIHFkmMAaZBAGyLAL5EVwgIiwGnQQBfI0Qpi/5QSb1FAUSI9pGI9pmL/xdJRCIqZURLAQgiJw5lRA5EIiplREsBCCpMZ0sBvkRXIAgXCBZLAb5ETFwgSwFMvyInDGVEFksBvkRMXCi/IicOZUQiKmVECRaMAIkiQv+eIkL/bIoBAYgADIv/IlMnF0xnMgcWiYoAACInHDEAUEm9RQFBACGLAb5EVwAIMgcWSYwApkEAEIsBvkRXCAiLAKdBAAMjRIkiQv/6igIBiP/FKYv+UEm9RQFESb5Ei/8iUyEETFS/MgcWiYoBACInHTEAUEm9RQFBACmLAb5EVwAIMgcWSYwApkEAGIsBvkRXCAiLAKdBAAsjRIv/IlMnGExniSJC//KKAAEiSTIHIicGZUxJTgJOBEQNQQANiwCMAosBQQAEgQSMAosCjAAiJxhlREEABIEDjAAiJxNlRBYiJwdlRBYiKmVEIicMZUQLFiInDGVEFiInDWVEFlcHASInFWVEFlcGAiInG2VEFlcGAiInDmVEFiIqZUQWIicJZUQWIicWZUQWIicFZUQWIicGZUQWIicXZUQnCiJPAlSLABZXBwFPDk8OUE8NUE8MUE8LUE8KUE8JUE8IUE8HUE8GUE8FUE8EUE8DUE8CUExQjACJigEBKYv/UEm9RQFEvkSJigABJyEiK2VEJRJBAAcnC75MjABEiwBMiYoAASInD2VEFiInEGVEFlCAAgACTFCJigABIicUZUSJigIAi/6BCgiLADIMDUEAKrGBBrIQgQWyGScjsh4nI7Ifi/+NAgALAASzQv/bMgCyAUL/9SKyAUL/74k=", "clear": "CoEBQw=="}, "compilerInfo": {"compiler": "puya", "compilerVersion": {"major": 4, "minor": 2, "patch": 1}}, "desc": "\n Fixed Coupon Bond, placed at nominal value, fixed coupon rates and payment time schedule, principal at maturity.\n ", "events": [], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLl9fYWxnb3B5X2VudHJ5cG9pbnRfd2l0aF9pbml0KCkgLT4gdWludDY0OgptYWluOgogICAgaW50Y2Jsb2NrIDAgMSA4IDEwMCA0NDggMjU1IDg2NDAwIDIwMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4NTIzMzMwMjMgImNpcmN1bGF0aW5nX3VuaXRzIiAic3RhdHVzIiAidG90YWxfY291cG9ucyIgImlzc3VhbmNlX2RhdGUiICJtYXR1cml0eV9kYXRlIiAic2V0dGxlbWVudF9hc3NldF9pZCIgMHgwMDAwMDAwMDAwMDAwMDAwICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiIDB4MDAgMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MyAidW5pdF92YWx1ZSIgImRheV9jb3VudF9jb252ZW50aW9uIiAidG90YWxfdW5pdHMiICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIgInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIiAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMgMHg1MjMyMzAyMyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIiAibWV0YWRhdGEiICJwcmluY2lwYWxfZGlzY291bnQiICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiICJzdXNwZW5kZWQiICJkZWZhdWx0ZWQiICJkdWVfY291cG9uc193YXRlcm1hcmsiICJwYWlkX2NvdXBvbl91bml0cyIgImludGVyZXN0X3JhdGUiIDB4NTIzNzMwMjMgMHg1MjM2MzAyMyAweDUyMzUzMDIzIDB4NTIzNDMwMjMgMHgwMDEyIDB4MDAwMCAweDUyMzgzMDIzIDB4MDY4MTAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MS00MgogICAgLy8gIyBSb2xlIEJhc2VkIEFjY2VzcyBDb250cm9sCiAgICAvLyBzZWxmLmFycmFuZ2VyID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9BUlJBTkdFUikKICAgIGJ5dGVjIDE4IC8vIDB4NTIzMjMwMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5LTYwCiAgICAvLyAjIEFzc2V0IENvbmZpZ3VyYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gVUludDY0KCkKICAgIGJ5dGVjIDE5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBVSW50NjQoKQogICAgYnl0ZWMgNyAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjIKICAgIC8vIHNlbGYudW5pdF92YWx1ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMiAvLyAidW5pdF92YWx1ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjMKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgMTMgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NS02NgogICAgLy8gIyBNZXRhZGF0YQogICAgLy8gc2VsZi5tZXRhZGF0YSA9IEJ5dGVzKCkKICAgIGJ5dGVjIDIwIC8vICJtZXRhZGF0YSIKICAgIHB1c2hieXRlcyAweAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4LTY5CiAgICAvLyAjIFN1cHBseQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwCiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3Mi03MwogICAgLy8gIyBQcmluY2lwYWwKICAgIC8vIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50ID0gVUludDY0KCkKICAgIGJ5dGVjIDIxIC8vICJwcmluY2lwYWxfZGlzY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1LTc2CiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmludGVyZXN0X3JhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMjcgLy8gImludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgwCiAgICAvLyBzZWxmLnRvdGFsX2NvdXBvbnMgPSBVSW50NjQoKQogICAgYnl0ZWMgNCAvLyAidG90YWxfY291cG9ucyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODUKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDIyIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNSAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODgKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTItOTMKICAgIC8vICMgU3RhdHVzCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0VNUFRZKQogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NAogICAgLy8gc2VsZi5zdXNwZW5kZWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjMgLy8gInN1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTUKICAgIC8vIHNlbGYuZGVmYXVsdGVkID0gVUludDY0KCkKICAgIGJ5dGVjIDI0IC8vICJkZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNi0zNwogICAgLy8gIyBTdGF0ZSBzY2hlbWEgdmFsaWRhdGlvbgogICAgLy8gYXNzZXJ0IFR4bi5nbG9iYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkdMT0JBTF9CWVRFUywgZXJyLldST05HX0dMT0JBTF9CWVRFUwogICAgdHhuIEdsb2JhbE51bUJ5dGVTbGljZQogICAgcHVzaGludCAyIC8vIDIKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozOAogICAgLy8gYXNzZXJ0IFR4bi5nbG9iYWxfbnVtX3VpbnQgPT0gY2ZnLkdMT0JBTF9VSU5UUywgZXJyLldST05HX0dMT0JBTF9VSU5UUwogICAgdHhuIEdsb2JhbE51bVVpbnQKICAgIHB1c2hpbnQgMjAgLy8gMjAKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIFVJbnRzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozOQogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuTE9DQUxfQllURVMsIGVyci5XUk9OR19MT0NBTF9CWVRFUwogICAgdHhuIExvY2FsTnVtQnl0ZVNsaWNlCiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV91aW50ID09IGNmZy5MT0NBTF9VSU5UUywgZXJyLldST05HX0xPQ0FMX1VJTlRTCiAgICB0eG4gTG9jYWxOdW1VaW50CiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQyLTQzCiAgICAvLyAjIENvdXBvbnMKICAgIC8vIHNlbGYuZHVlX2NvdXBvbnNfd2F0ZXJtYXJrID0gVUludDY0KCkKICAgIGJ5dGVjIDI1IC8vICJkdWVfY291cG9uc193YXRlcm1hcmsiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0NAogICAgLy8gc2VsZi5wYWlkX2NvdXBvbl91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAyNiAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYWZ0ZXJfaWZfZWxzZUAyOQogICAgcHVzaGJ5dGVzcyAweDRmZDZhM2NjIDB4OGNmMTRiNTEgMHg5Yzc2YjZhMyAweDQ0MzYzZDQ5IDB4NTNiZWYwNDUgMHg2N2RiNGYyMCAweGY2YTk2YzhkIDB4M2YwZWZjNmMgMHgyNWRiYTk1YiAweDg5NDc0MTM0IDB4MWQ2ZmMyNTUgMHhmZWY3NDU2NyAweGI4ZmMxMzkwIDB4M2Q0M2QxZjAgMHhlYmQ5NmIyZiAweDZjODVlM2VlIDB4ZjYzYWNlOGQgMHhiYmNjYTE4YSAweDFhN2JhYmI0IDB4NDAyZGJhNDcgMHhlZDAyNzU5ZiAweGZhZDIxNzNlIDB4MDhlZmVhMzUgMHhlNGE1YWI1NCAvLyBtZXRob2QgImFzc2V0X3RyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwYXlfY291cG9uKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LGJ5dGVbXSkiLCBtZXRob2QgInBheV9wcmluY2lwYWwoYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAiZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZShhZGRyZXNzLHVpbnQ2NCkodWludDY0LHVpbnQ2NCwodWludDY0LHVpbnQ2NCkpIiwgbWV0aG9kICJnZXRfY291cG9uX3JhdGVzKCl1aW50MTZbXSIsIG1ldGhvZCAiZ2V0X3BheW1lbnRfYW1vdW50KGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJnZXRfY291cG9uc19zdGF0dXMoKSh1aW50NjQsdWludDY0LHVpbnQ2NCwodWludDY0LHVpbnQ2NCksYm9vbCkiLCBtZXRob2QgImFzc2V0X2NyZWF0ZShhZGRyZXNzLCh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCxieXRlWzMyXSxzdHJpbmcpKXZvaWQiLCBtZXRob2QgImFzc2V0X3VwZGF0ZSgodWludDgsdWludDgsdWludDgsdWludDgsdWludDgsdWludDgsYnl0ZVszMl0sc3RyaW5nKSl2b2lkIiwgbWV0aG9kICJhc3NldF9jb25maWcodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50MTYsdWludDE2W10sdWludDY0W10sKHVpbnQ2NCx1aW50NjQpW10pdm9pZCIsIG1ldGhvZCAic2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cyh1aW50NjRbXSkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImFzc2lnbl9yb2xlKGFkZHJlc3MsdWludDgsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAicmV2b2tlX3JvbGUoYWRkcmVzcyx1aW50OCl1aW50NjQiLCBtZXRob2QgIm9wZW5fYWNjb3VudChhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJjbG9zZV9hY2NvdW50KGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInNldF9hc3NldF9zdXNwZW5zaW9uKGJvb2wpdWludDY0IiwgbWV0aG9kICJzZXRfYWNjb3VudF9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgInNldF9kZWZhdWx0X3N0YXR1cyhib29sKXZvaWQiLCBtZXRob2QgImdldF9hc3NldF9pbmZvKCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQxNix1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYm9vbCx1aW50OCkiLCBtZXRob2QgImdldF9hY2NvdW50X2luZm8oYWRkcmVzcykoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sKSIsIG1ldGhvZCAiZ2V0X3RpbWVfZXZlbnRzKCl1aW50NjRbXSIsIG1ldGhvZCAiZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfYXNzZXRfbWV0YWRhdGEoKSh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCxieXRlWzMyXSxzdHJpbmcpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9hc3NldF90cmFuc2Zlcl9yb3V0ZUA1IG1haW5fcGF5X2NvdXBvbl9yb3V0ZUA2IG1haW5fcGF5X3ByaW5jaXBhbF9yb3V0ZUA3IG1haW5fZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9yb3V0ZUA4IG1haW5fZ2V0X2NvdXBvbl9yYXRlc19yb3V0ZUA5IG1haW5fZ2V0X3BheW1lbnRfYW1vdW50X3JvdXRlQDEwIG1haW5fZ2V0X2NvdXBvbnNfc3RhdHVzX3JvdXRlQDExIG1haW5fYXNzZXRfY3JlYXRlX3JvdXRlQDEyIG1haW5fYXNzZXRfdXBkYXRlX3JvdXRlQDEzIG1haW5fYXNzZXRfY29uZmlnX3JvdXRlQDE0IG1haW5fc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19yb3V0ZUAxNSBtYWluX2Fzc2lnbl9yb2xlX3JvdXRlQDE2IG1haW5fcmV2b2tlX3JvbGVfcm91dGVAMTcgbWFpbl9vcGVuX2FjY291bnRfcm91dGVAMTggbWFpbl9jbG9zZV9hY2NvdW50X3JvdXRlQDE5IG1haW5fcHJpbWFyeV9kaXN0cmlidXRpb25fcm91dGVAMjAgbWFpbl9zZXRfYXNzZXRfc3VzcGVuc2lvbl9yb3V0ZUAyMSBtYWluX3NldF9hY2NvdW50X3N1c3BlbnNpb25fcm91dGVAMjIgbWFpbl9zZXRfZGVmYXVsdF9zdGF0dXNfcm91dGVAMjMgbWFpbl9nZXRfYXNzZXRfaW5mb19yb3V0ZUAyNCBtYWluX2dldF9hY2NvdW50X2luZm9fcm91dGVAMjUgbWFpbl9nZXRfdGltZV9ldmVudHNfcm91dGVAMjYgbWFpbl9nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZV9yb3V0ZUAyNyBtYWluX2dldF9hc3NldF9tZXRhZGF0YV9yb3V0ZUAyOAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgaW50Y18wIC8vIDAKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbWV0YWRhdGFfcm91dGVAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5ODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hc3NldF9tZXRhZGF0YQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZV9yb3V0ZUAyNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X3RpbWVfZXZlbnRzX3JvdXRlQDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfdGltZV9ldmVudHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2FjY291bnRfaW5mb19yb3V0ZUAyNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hY2NvdW50X2luZm8KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2luZm9fcm91dGVAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hc3NldF9pbmZvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9kZWZhdWx0X3N0YXR1c19yb3V0ZUAyMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9kZWZhdWx0X3N0YXR1cwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfYWNjb3VudF9zdXNwZW5zaW9uX3JvdXRlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X2FjY291bnRfc3VzcGVuc2lvbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfYXNzZXRfc3VzcGVuc2lvbl9yb3V0ZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9hc3NldF9zdXNwZW5zaW9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3ByaW1hcnlfZGlzdHJpYnV0aW9uX3JvdXRlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODAxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODAxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcHJpbWFyeV9kaXN0cmlidXRpb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fY2xvc2VfYWNjb3VudF9yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGNsb3NlX2FjY291bnQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fb3Blbl9hY2NvdW50X3JvdXRlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgb3Blbl9hY2NvdW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3Jldm9rZV9yb2xlX3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcmV2b2tlX3JvbGUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzaWduX3JvbGVfcm91dGVAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NpZ25fcm9sZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX3JvdXRlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF9jb25maWdfcm91dGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0ODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYXNzZXRfY29uZmlnCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Fzc2V0X3VwZGF0ZV9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgVXBkYXRlQXBwbGljYXRpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICBjYWxsc3ViIGFzc2V0X3VwZGF0ZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF9jcmVhdGVfcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBjYWxsc3ViIGFzc2V0X2NyZWF0ZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfY291cG9uc19zdGF0dXNfcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfY291cG9uc19zdGF0dXMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X3BheW1lbnRfYW1vdW50X3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfcGF5bWVudF9hbW91bnQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2NvdXBvbl9yYXRlc19yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2NvdXBvbl9yYXRlcwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjMxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcGF5X3ByaW5jaXBhbF9yb3V0ZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBwYXlfcHJpbmNpcGFsCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3BheV9jb3Vwb25fcm91dGVANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcGF5X2NvdXBvbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF90cmFuc2Zlcl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NldF90cmFuc2ZlcgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5maXhlZF9jb3Vwb25fYm9uZC5jb250cmFjdC5GaXhlZENvdXBvbkJvbmQuYXNzZXRfdHJhbnNmZXIoc2VuZGVyX2hvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiBieXRlcykgLT4gYnl0ZXM6CmFzc2V0X3RyYW5zZmVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE1My0xNTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2V0X3RyYW5zZmVyKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgc2VuZGVyX2hvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLAogICAgLy8gICAgIHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLAogICAgLy8gICAgIHVuaXRzOiBhcmM0LlVJbnQ2NCwKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAzIDEKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDIKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTg0CiAgICAvLyB1bml0cy5uYXRpdmUsCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMyAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTgtMzAxCiAgICAvLyBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk5CiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwMAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTktMzAwCiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTktMzAxCiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDEKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwMC0zMDEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGZyYW1lX2RpZyA0CiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTktMzAxCiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA1CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk3LTMwMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gICAgIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5TRUNPTkRBUllfTUFSS0VUX0NMT1NFRAogICAgYXNzZXJ0IC8vIFNlY29uZGFyeSBtYXJrZXQgaXMgY2xvc2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNzYtMzc4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRyYW5zZmVyIHJpZ2h0IHRvIEQtQVNBIG93bmVycy4gT3RoZXIgaW1wbGVtZW50YXRpb25zIG1heSByZWxheSBvbiBvdGhlcgogICAgLy8gIyByb2xlcywgZXh0ZXJuYWwgQXBwcyB0aHJvdWdoIEMyQyBjYWxscyAoZS5nLiwgYW4gb3JkZXIgYm9vayksIG9yIG9mZi1jaGFpbiB0cmFuc2ZlciBhZ2VudHMuCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZW5kZXJfaG9sZGluZ19hZGRyZXNzLm5hdGl2ZSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0zCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNzkKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzgwCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3NAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzgzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQubmF0aXZlLCBlcnIuU1VTUEVOREVECiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGMgNCAvLyA0NDgKICAgIGdldGJpdAogICAgYnl0ZWMgMTAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM4NC0zODYKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hY2NvdW50WwogICAgLy8gICAgIHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcwogICAgLy8gXS5zdXNwZW5kZWQubmF0aXZlLCBlcnIuU1VTUEVOREVECiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjIDQgLy8gNDQ4CiAgICBnZXRiaXQKICAgIGJ5dGVjIDEwIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozODgKICAgIC8vIHVuaXRzIDw9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfZGlnIDUKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozODctMzg5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHVuaXRzIDw9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIC8vICksIGVyci5PVkVSX1RSQU5TRkVSCiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzk3CiAgICAvLyBzZW5kZXJfdW5pdF92YWx1ZSA9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlCiAgICBzd2FwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozOTgKICAgIC8vIGlmIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSA+IDA6CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnogYXNzZXRfdHJhbnNmZXJfZWxzZV9ib2R5QDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDkKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYj09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDktMzEwCiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzEwCiAgICAvLyBhbmQgc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYj09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDktMzEwCiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAxNAogICAgaW50Y18xIC8vIDEKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDgtMzExCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICAvLyAgICAgYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgLy8gKSwgZXJyLk5PTl9GVU5HSUJMRV9VTklUUwogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgdW5pdHMgYXJlIG5vdCBmdW5naWJsZQoKYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxODctMTg4CiAgICAvLyAjIFRyYW5zZmVyIGlzIGZvcmJpZGRlbiBpbiBjYXNlIG9mIHBlbmRpbmcgY291cG9uIHBheW1lbnRzCiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuY291bnRfZHVlX2NvdXBvbnMoKQogICAgY2FsbHN1YiBjb3VudF9kdWVfY291cG9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE4OQogICAgLy8gc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChzZW5kZXJfaG9sZGluZ19hZGRyZXNzLCBkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyAtMwogICAgZGlnIDEKICAgIGNhbGxzdWIgYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOTEtMTkyCiAgICAvLyAjIFRyYW5zZmVycmVkIHVuaXRzIHZhbHVlIChtdXN0IGJlIGNvbXB1dGVkIGJlZm9yZSB0aGUgdHJhbnNmZXIpCiAgICAvLyBzZW5kZXJfdW5pdF92YWx1ZSA9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTkzLTE5NQogICAgLy8gYWNjcnVlZF9pbnRlcmVzdCA9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoCiAgICAvLyAgICAgc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgdW5pdHMubmF0aXZlLCBkdWVfY291cG9ucwogICAgLy8gKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgNQogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDM0CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlIC0gdW5pdHMKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGRpZyAyCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzMtNDM1CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlIC0gdW5pdHMKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQzMwogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQzMy00MzUKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgLSB1bml0cwogICAgLy8gKQogICAgc3dhcAogICAgcmVwbGFjZTIgMzIKICAgIGRpZyAxCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzcKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgdW5jb3ZlciAzCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzYtNDM4CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzYKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQzNi00MzgKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMKICAgIC8vICkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDMyCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjAKICAgIC8vIGlmIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSA9PSAwOgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJueiBhc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDIxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjEKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUgPSBhcmM0LlVJbnQ2NCgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgOCAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIHJlcGxhY2UyIDQwCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzYyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBhcmM0LlVJbnQ2NCgpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBieXRlYyA4IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgcmVwbGFjZTIgNDgKICAgIGJveF9wdXQKCmFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAwCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQodW5pdHMubmF0aXZlICogc2VuZGVyX3VuaXRfdmFsdWUubmF0aXZlICsgYWNjcnVlZF9pbnRlcmVzdCkKICAgIGZyYW1lX2RpZyAwCiAgICBidG9pCiAgICBmcmFtZV9kaWcgNQogICAgKgogICAgZnJhbWVfZGlnIDMKICAgICsKICAgIGl0b2IKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgphc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUAxNQoKYXNzZXRfdHJhbnNmZXJfZWxzZV9ib2R5QDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDAzCiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gc2VuZGVyX3VuaXRfdmFsdWUKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBmcmFtZV9kaWcgMAogICAgcmVwbGFjZTIgNDAKICAgIGRpZyAxCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MDQtNDA2CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbCiAgICAvLyAgICAgc2VuZGVyX2hvbGRpbmdfYWRkcmVzcwogICAgLy8gXS5wYWlkX2NvdXBvbnMKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDA0CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQwNC00MDYKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IHNlbGYuYWNjb3VudFsKICAgIC8vICAgICBzZW5kZXJfaG9sZGluZ19hZGRyZXNzCiAgICAvLyBdLnBhaWRfY291cG9ucwogICAgc3dhcAogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcmVwbGFjZTIgNDgKICAgIGJveF9wdXQKICAgIGIgYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxNwoKYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUA2CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X2RlZmF1bHRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExMC0xMTEKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTEyCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjQgLy8gImRlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTE0LTExNQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTYKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMyAvLyAic3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN1c3BlbmRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5jb3VudF9kdWVfY291cG9ucygpIC0+IHVpbnQ2NDoKY291bnRfZHVlX2NvdXBvbnM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NTAtNTEKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgY291bnRfZHVlX2NvdXBvbnMoc2VsZikgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1MgogICAgLy8gY3VycmVudF90cyA9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1MwogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmR1ZV9jb3Vwb25zX3dhdGVybWFyawogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI1IC8vICJkdWVfY291cG9uc193YXRlcm1hcmsiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZHVlX2NvdXBvbnNfd2F0ZXJtYXJrIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBpZiBjdXJyZW50X3RzID49IHNlbGYubWF0dXJpdHlfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICA+PQogICAgYnogY291bnRfZHVlX2NvdXBvbnNfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1NQogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKCmNvdW50X2R1ZV9jb3Vwb25zX2FmdGVyX2lmX2Vsc2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2NwogICAgLy8gc2VsZi5kdWVfY291cG9uc193YXRlcm1hcmsgPSBkdWVfY291cG9ucwogICAgYnl0ZWMgMjUgLy8gImR1ZV9jb3Vwb25zX3dhdGVybWFyayIKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NjgKICAgIC8vIHJldHVybiBkdWVfY291cG9ucwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmNvdW50X2R1ZV9jb3Vwb25zX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBlbGlmIGN1cnJlbnRfdHMgPiBzZWxmLmlzc3VhbmNlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGNvdW50X2R1ZV9jb3Vwb25zX2FmdGVyX2lmX2Vsc2VAOAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU3CiAgICAvLyBjb3Vwb25faWR4ID0gVUludDY0KGNmZy5GSVJTVF9DT1VQT05fREFURV9JRFgpICsgc2VsZi5kdWVfY291cG9uc193YXRlcm1hcmsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNSAvLyAiZHVlX2NvdXBvbnNfd2F0ZXJtYXJrIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmR1ZV9jb3Vwb25zX3dhdGVybWFyayBleGlzdHMKICAgIHB1c2hpbnQgMyAvLyAzCiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU4CiAgICAvLyBjb3Vwb25fZHVlX2RhdGUgPSBzZWxmLnRpbWVfZXZlbnRzLnZhbHVlW2NvdXBvbl9pZHhdLm5hdGl2ZQogICAgYnl0ZWMgMTEgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9ldmVudHMgZXhpc3RzCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKCmNvdW50X2R1ZV9jb3Vwb25zX3doaWxlX3RvcEA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU5CiAgICAvLyB3aGlsZSBjdXJyZW50X3RzID49IGNvdXBvbl9kdWVfZGF0ZToKICAgIGZyYW1lX2RpZyAxCiAgICA8PQogICAgYnogY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfd2hpbGVANgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjYxCiAgICAvLyByZXF1aXJlZF9idWRnZXQ9VUludDY0KGNmZy5PUF9VUF9DT1VQT05fRFVFX0NPVU5USU5HKSwKICAgIGludGMgNSAvLyAyNTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2MgogICAgLy8gZmVlX3NvdXJjZT1PcFVwRmVlU291cmNlLkdyb3VwQ3JlZGl0LAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2MC02MwogICAgLy8gZW5zdXJlX2J1ZGdldCgKICAgIC8vICAgICByZXF1aXJlZF9idWRnZXQ9VUludDY0KGNmZy5PUF9VUF9DT1VQT05fRFVFX0NPVU5USU5HKSwKICAgIC8vICAgICBmZWVfc291cmNlPU9wVXBGZWVTb3VyY2UuR3JvdXBDcmVkaXQsCiAgICAvLyApCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2NAogICAgLy8gY291cG9uX2lkeCArPSAxCiAgICBmcmFtZV9kaWcgMAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NjUKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IHNlbGYudGltZV9ldmVudHMudmFsdWVbY291cG9uX2lkeF0ubmF0aXZlCiAgICBieXRlYyAxMSAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50aW1lX2V2ZW50cyBleGlzdHMKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYiBjb3VudF9kdWVfY291cG9uc193aGlsZV90b3BANAoKY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfd2hpbGVANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2NgogICAgLy8gZHVlX2NvdXBvbnMgPSBjb3Vwb25faWR4IC0gY2ZnLkZJUlNUX0NPVVBPTl9EQVRFX0lEWAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMyAvLyAzCiAgICAtCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfaWZfZWxzZUA4CgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBkdWVfY291cG9uczogdWludDY0KSAtPiB2b2lkOgphc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo5Mi05NQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgZHVlX2NvdXBvbnM6IFVJbnQ2NAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6OTcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9PSBkdWVfY291cG9ucwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgYj09CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6OTYtOTgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID09IGR1ZV9jb3Vwb25zCiAgICAvLyApLCBlcnIuUEVORElOR19DT1VQT05fUEFZTUVOVAogICAgYXNzZXJ0IC8vIFBlbmRpbmcgZHVlIGNvdXBvbiBwYXltZW50CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiB1aW50NjQsIGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IHVpbnQ2NDoKYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTMyLTEzNQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgdW5pdHM6IFVJbnQ2NCwgZHVlX2NvdXBvbnM6IFVJbnQ2NAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMzYtMTM3CiAgICAvLyAjIFRoZSBmb2xsb3dpbmcgYXNzZXJ0IHNhZmVndWFyZHMgdGhlIHN1YnJvdXRpbmUgZnJvbSBmb3JiaWRkZW4gaW52b2NhdGlvbnMKICAgIC8vIHNlbGYuYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoaG9sZGluZ19hZGRyZXNzLCBkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTM4CiAgICAvLyBkYXlfY291bnRfZmFjdG9yID0gc2VsZi5kYXlfY291bnRfZmFjdG9yKGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGRheV9jb3VudF9mYWN0b3IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMzkKICAgIC8vIGNvdXBvbl9hY2NydWVkX3BlcmlvZCA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yLm5hdGl2ZQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDAKICAgIC8vIGNvdXBvbl9wZXJpb2QgPSBkYXlfY291bnRfZmFjdG9yLmRlbm9taW5hdG9yLm5hdGl2ZQogICAgc3dhcAogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTQxCiAgICAvLyBuZXh0X2NvdXBvbl9yYXRlX2JwcyA9IHNlbGYuY291cG9uX3JhdGVzLnZhbHVlWwogICAgYnl0ZWMgMTcgLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb3Vwb25fcmF0ZXMgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTQxLTE0MwogICAgLy8gbmV4dF9jb3Vwb25fcmF0ZV9icHMgPSBzZWxmLmNvdXBvbl9yYXRlcy52YWx1ZVsKICAgIC8vICAgICBkdWVfY291cG9ucwogICAgLy8gXS5uYXRpdmUgICMgZHVlX2NvdXBvbnMgaXMgZXF1YWwgdG8gdGhlIDAtYmFzZSBpZHggb2YgbmV4dCBjb3Vwb24KICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAqCiAgICBwdXNoaW50IDIgLy8gMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTQ1CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDUtMTQ2CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogbmV4dF9jb3Vwb25fcmF0ZV9icHMKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDUtMTQ3CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogbmV4dF9jb3Vwb25fcmF0ZV9icHMKICAgIC8vICogY291cG9uX2FjY3J1ZWRfcGVyaW9kCiAgICB1bmNvdmVyIDIKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDkKICAgIC8vIGNzdC5CUFMgKiBjb3Vwb25fcGVyaW9kCiAgICBwdXNoaW50IDEwMDAwIC8vIDEwMDAwCiAgICB1bmNvdmVyIDIKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDUtMTUwCiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogbmV4dF9jb3Vwb25fcmF0ZV9icHMKICAgIC8vICogY291cG9uX2FjY3J1ZWRfcGVyaW9kCiAgICAvLyAvLyAoCiAgICAvLyAgICAgY3N0LkJQUyAqIGNvdXBvbl9wZXJpb2QKICAgIC8vICkgICMgZGl2LWJ5LXplcm86IGNvdXBvbl9wZXJpb2QgIT0gMCBkdWUgdG8gYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCBjaGVja3MKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDQtMTUxCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gICAgICogbmV4dF9jb3Vwb25fcmF0ZV9icHMKICAgIC8vICAgICAqIGNvdXBvbl9hY2NydWVkX3BlcmlvZAogICAgLy8gICAgIC8vICgKICAgIC8vICAgICAgICAgY3N0LkJQUyAqIGNvdXBvbl9wZXJpb2QKICAgIC8vICAgICApICAjIGRpdi1ieS16ZXJvOiBjb3Vwb25fcGVyaW9kICE9IDAgZHVlIHRvIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQgY2hlY2tzCiAgICAvLyApCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnM6IHVpbnQ2NCkgLT4gYnl0ZXM6CmRheV9jb3VudF9mYWN0b3I6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTA3LTEwOAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBkYXlfY291bnRfZmFjdG9yKHNlbGYsIGR1ZV9jb3Vwb25zOiBVSW50NjQpIC0+IHR5cC5EYXlDb3VudEZhY3RvcjoKICAgIHByb3RvIDEgMQogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMDktMTEwCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGlmIG5vdCBkdWVfY291cG9uczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IGRheV9jb3VudF9mYWN0b3JfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMTEKICAgIC8vIGFjY3J1aW5nX3N0YXJ0X3RpbWUgPSBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCgpkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMTQKICAgIC8vIGNvdXBvbl9hY2NydWVkX3BlcmlvZCA9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIC0gYWNjcnVpbmdfc3RhcnRfdGltZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZGlnIDEKICAgIC0KICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTE1CiAgICAvLyBjb3Vwb25fcGVyaW9kID0gc2VsZi5uZXh0X2NvdXBvbl9kdWVfZGF0ZShkdWVfY291cG9ucykgLSBhY2NydWluZ19zdGFydF90aW1lCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgbmV4dF9jb3Vwb25fZHVlX2RhdGUKICAgIHN3YXAKICAgIC0KICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTE2CiAgICAvLyBpZiBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID09IFVJbnQ2NChjc3QuRENDX0FfQSk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgc3dhcAogICAgZnJhbWVfYnVyeSA0CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDEKICAgIGJueiBkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzU2CiAgICAvLyByZXR1cm4gdGltZV9wZXJpb2QgLy8gVUludDY0KGNzdC5EQVlfMl9TRUMpCiAgICBmcmFtZV9kaWcgMAogICAgaW50YyA2IC8vIDg2NDAwCiAgICAvCiAgICBmcmFtZV9kaWcgMwogICAgaW50YyA2IC8vIDg2NDAwCiAgICAvCiAgICBmcmFtZV9idXJ5IDQKICAgIGZyYW1lX2J1cnkgMQoKZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjAKICAgIC8vIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChjb3Vwb25fYWNjcnVlZF9wZXJpb2QpLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gZGVub21pbmF0b3I9YXJjNC5VSW50NjQoY291cG9uX3BlcmlvZCksCiAgICBzd2FwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTE5LTEyMgogICAgLy8gcmV0dXJuIHR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQoY291cG9uX2FjY3J1ZWRfcGVyaW9kKSwKICAgIC8vICAgICBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChjb3Vwb25fcGVyaW9kKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmRheV9jb3VudF9mYWN0b3JfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NzYKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NzcKICAgIC8vIGlmIGR1ZV9jb3Vwb25zID49IFVJbnQ2NCgxKToKICAgIGZyYW1lX2RpZyAtMQogICAgYnogZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo3OAogICAgLy8gY291cG9uX2R1ZV9kYXRlID0gc2VsZi5jb3Vwb25fZHVlX2RhdGUoZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgY291cG9uX2R1ZV9kYXRlCiAgICBmcmFtZV9idXJ5IDIKCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUA4OgogICAgZnJhbWVfZGlnIDIKICAgIGIgZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDMKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmNvdXBvbl9kdWVfZGF0ZShjb3Vwb246IHVpbnQ2NCkgLT4gdWludDY0Ogpjb3Vwb25fZHVlX2RhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NzAtNzEKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgY291cG9uX2R1ZV9kYXRlKHNlbGYsIGNvdXBvbjogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo3MgogICAgLy8gcmV0dXJuIHNlbGYudGltZV9ldmVudHMudmFsdWVbY2ZnLkZJUlNUX0NPVVBPTl9EQVRFX0lEWCArIGNvdXBvbiAtIDFdLm5hdGl2ZQogICAgcHVzaGludCAzIC8vIDMKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGJ5dGVjIDExIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRpbWVfZXZlbnRzIGV4aXN0cwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLm5leHRfY291cG9uX2R1ZV9kYXRlKGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IHVpbnQ2NDoKbmV4dF9jb3Vwb25fZHVlX2RhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6ODEtODIKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgbmV4dF9jb3Vwb25fZHVlX2RhdGUoc2VsZiwgZHVlX2NvdXBvbnM6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6ODMKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBpZiBkdWVfY291cG9ucyA8IHNlbGYudG90YWxfY291cG9uczoKICAgIGR1cAogICAgYnl0ZWMgNCAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICA+CiAgICBieiBuZXh0X2NvdXBvbl9kdWVfZGF0ZV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo4NQogICAgLy8gY291cG9uX2R1ZV9kYXRlID0gc2VsZi5jb3Vwb25fZHVlX2RhdGUoZHVlX2NvdXBvbnMgKyAxKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgY2FsbHN1YiBjb3Vwb25fZHVlX2RhdGUKICAgIGZyYW1lX2J1cnkgMAoKbmV4dF9jb3Vwb25fZHVlX2RhdGVfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyByZXR1cm4gY291cG9uX2R1ZV9kYXRlCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogdWludDY0KSAtPiB1aW50NjQ6CmFjY291bnRfdW5pdHNfdmFsdWU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDItMzQ1CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFjY291bnRfdW5pdHNfdmFsdWUoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHVuaXRzOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDYKICAgIC8vIHJldHVybiB1bml0cyAqIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUubmF0aXZlCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLnBheV9jb3Vwb24oaG9sZGluZ19hZGRyZXNzOiBieXRlcywgcGF5bWVudF9pbmZvOiBieXRlcykgLT4gYnl0ZXM6CnBheV9jb3Vwb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAyLTIwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcGF5X2NvdXBvbigKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcGF5bWVudF9pbmZvOiBhcmM0LkR5bmFtaWNCeXRlcwogICAgLy8gKSAtPiB0eXAuUGF5bWVudFJlc3VsdDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA0CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18zIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMjUtMjI2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgcmVzdHJpY3QgY2FsbGVyIGF1dGhvcml6YXRpb24KICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1c19pc19hY3RpdmUoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjI3CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMjgKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXBuIDIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMzAKICAgIC8vIHVuaXRzID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMzEKICAgIC8vIGFzc2VydCB1bml0cyA+IDAsIGVyci5OT19VTklUUwogICAgYXNzZXJ0IC8vIE5vIEQtQVNBIHVuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjMyCiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuY291bnRfZHVlX2NvdXBvbnMoKQogICAgY2FsbHN1YiBjb3VudF9kdWVfY291cG9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gYWNjb3VudF9wYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMubmF0aXZlCiAgICBzd2FwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMzQKICAgIC8vIGFzc2VydCBkdWVfY291cG9ucyA+IGFjY291bnRfcGFpZF9jb3Vwb25zLCBlcnIuTk9fRFVFX0NPVVBPTgogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBObyBkdWUgY291cG9uIHRvIHBheQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIzNS0yMzgKICAgIC8vICMgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zIHZlcmlmeSBpZiBvdGhlciBhY2NvdW50cyBhcmUgc3RpbGwgd2FpdGluZyBmb3IgdGhlIHBheW1lbnQgb2YgcHJldmlvdXMgY291cG9ucwogICAgLy8gYXNzZXJ0IHNlbGYuYWxsX2R1ZV9jb3Vwb25zX3BhaWQoCiAgICAvLyAgICAgYWNjb3VudF9wYWlkX2NvdXBvbnMKICAgIC8vICksIGVyci5QRU5ESU5HX0NPVVBPTl9QQVlNRU5UCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNDEKICAgIC8vIGlmIHNlbGYuaXNfcGF5bWVudF9leGVjdXRhYmxlKGhvbGRpbmdfYWRkcmVzcyk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgaXNfcGF5bWVudF9leGVjdXRhYmxlCiAgICBieiBwYXlfY291cG9uX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjQzCiAgICAvLyBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKSwKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjQ0CiAgICAvLyBhY2NvdW50X3BhaWRfY291cG9ucyArIDEsCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNDItMjQ1CiAgICAvLyBwYXltZW50X2Ftb3VudCA9IHNlbGYuY291cG9uX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKSwKICAgIC8vICAgICBhY2NvdW50X3BhaWRfY291cG9ucyArIDEsCiAgICAvLyApCiAgICBjYWxsc3ViIGNvdXBvbl9pbnRlcmVzdF9hbW91bnQKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI0Ni0yNDcKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gcGF5bWVudCBhZ2VudAogICAgLy8gc2VsZi5hc3NlcnRfZW5vdWdoX2Z1bmRzKHBheW1lbnRfYW1vdW50KQogICAgY2FsbHN1YiBhc3NlcnRfZW5vdWdoX2Z1bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjQ4LTI0OQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyB0aGUgc2FtZSBhc3NldCBmb3IgZGVub21pbmF0aW9uIGFuZCBzZXR0bGVtZW50LCBubyBjb252ZXJzaW9uIG5lZWRlZAogICAgLy8gc2VsZi5wYXkoc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLCBwYXltZW50X2Ftb3VudCkKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgY2FsbHN1YiBwYXkKCnBheV9jb3Vwb25fYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zLm5hdGl2ZSArIDEKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1NC0yNTYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucy5uYXRpdmUgKyAxCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjU0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBhcmM0LlVJbnQ2NCgKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1NC0yNTYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucy5uYXRpdmUgKyAxCiAgICAvLyApCiAgICBzd2FwCiAgICByZXBsYWNlMiA0OAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1NwogICAgLy8gc2VsZi5wYWlkX2NvdXBvbl91bml0cyArPSB1bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI2IC8vICJwYWlkX2NvdXBvbl91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wYWlkX2NvdXBvbl91bml0cyBleGlzdHMKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBieXRlYyAyNiAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYW1vdW50PWFyYzQuVUludDY0KHBheW1lbnRfYW1vdW50KSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNjAKICAgIC8vIHRpbWVzdGFtcD1hcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCksCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjU4LTI2MgogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50UmVzdWx0KAogICAgLy8gICAgIGFtb3VudD1hcmM0LlVJbnQ2NChwYXltZW50X2Ftb3VudCksCiAgICAvLyAgICAgdGltZXN0YW1wPWFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSwKICAgIC8vICAgICBjb250ZXh0PXBheW1lbnRfaW5mby5jb3B5KCksICAjIFRPRE86IEFkZCBpbmZvIG9uIGZhaWxlZCBwYXltZW50CiAgICAvLyApCiAgICBjb25jYXQKICAgIGJ5dGVjIDMyIC8vIDB4MDAxMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnBheV9jb3Vwb25fZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjUxLTI1MgogICAgLy8gIyBBY2NvdW50cyBzdXNwZW5kZWQgb3Igbm90IG9wdGVkIGluIGF0IHRoZSB0aW1lIG9mIHBheW1lbnRzIG11c3Qgbm90IHN0YWxsIHRoZSBELUFTQQogICAgLy8gcGF5bWVudF9hbW91bnQgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGIgcGF5X2NvdXBvbl9hZnRlcl9pZl9lbHNlQDMKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmFsbF9kdWVfY291cG9uc19wYWlkKGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IHVpbnQ2NDoKYWxsX2R1ZV9jb3Vwb25zX3BhaWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6ODgtODkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYWxsX2R1ZV9jb3Vwb25zX3BhaWQoc2VsZiwgZHVlX2NvdXBvbnM6IFVJbnQ2NCkgLT4gYm9vbDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjkwCiAgICAvLyByZXR1cm4gc2VsZi5wYWlkX2NvdXBvbl91bml0cyA+PSBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogZHVlX2NvdXBvbnMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNiAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgID49CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5pc19wYXltZW50X2V4ZWN1dGFibGUoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gdWludDY0Ogppc19wYXltZW50X2V4ZWN1dGFibGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTMtMzE0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGlzX3BheW1lbnRfZXhlY3V0YWJsZShzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcykgLT4gYm9vbDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzE2CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MubmF0aXZlLmlzX29wdGVkX2luKAogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzE3CiAgICAvLyBBc3NldChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzE2LTMxOAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLm5hdGl2ZS5pc19vcHRlZF9pbigKICAgIC8vICAgICBBc3NldChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICAvLyApCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzE2LTMxOQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLm5hdGl2ZS5pc19vcHRlZF9pbigKICAgIC8vICAgICBBc3NldChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICAvLyApCiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZC5uYXRpdmUKICAgIGJ6IGlzX3BheW1lbnRfZXhlY3V0YWJsZV9ib29sX2ZhbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxOQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQubmF0aXZlCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGMgNCAvLyA0NDgKICAgIGdldGJpdAogICAgYnl0ZWMgMTAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBibnogaXNfcGF5bWVudF9leGVjdXRhYmxlX2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKCmlzX3BheW1lbnRfZXhlY3V0YWJsZV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTUtMzIwCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5uYXRpdmUuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgICAgIEFzc2V0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCkKICAgIC8vICAgICApCiAgICAvLyAgICAgYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQubmF0aXZlCiAgICAvLyApCiAgICBzd2FwCiAgICByZXRzdWIKCmlzX3BheW1lbnRfZXhlY3V0YWJsZV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgYiBpc19wYXltZW50X2V4ZWN1dGFibGVfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6CmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDgtMzQ5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzUxCiAgICAvLyBob2xkaW5nX2FkZHJlc3MsIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1MC0zNTIKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoCiAgICAvLyAgICAgaG9sZGluZ19hZGRyZXNzLCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgY2FsbHN1YiBhY2NvdW50X3VuaXRzX3ZhbHVlCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmNvdXBvbl9pbnRlcmVzdF9hbW91bnQocHJpbmNpcGFsX2Ftb3VudDogdWludDY0LCBjb3Vwb246IHVpbnQ2NCkgLT4gdWludDY0Ogpjb3Vwb25faW50ZXJlc3RfYW1vdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEwMC0xMDMKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgY291cG9uX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZWxmLCBwcmluY2lwYWxfYW1vdW50OiBVSW50NjQsIGNvdXBvbjogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gY291cG9uX3JhdGVfYnBzID0gc2VsZi5jb3Vwb25fcmF0ZXMudmFsdWVbY291cG9uIC0gMV0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBieXRlYyAxNyAvLyAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdXBvbl9yYXRlcyBleGlzdHMKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBwdXNoaW50IDIgLy8gMgogICAgKgogICAgcHVzaGludCAyIC8vIDIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEwNQogICAgLy8gcmV0dXJuIHByaW5jaXBhbF9hbW91bnQgKiBjb3Vwb25fcmF0ZV9icHMgLy8gY3N0LkJQUwogICAgZnJhbWVfZGlnIC0yCiAgICAqCiAgICBwdXNoaW50IDEwMDAwIC8vIDEwMDAwCiAgICAvCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfZW5vdWdoX2Z1bmRzKHBheW1lbnRfYW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6CmFzc2VydF9lbm91Z2hfZnVuZHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjItMzIzCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9lbm91Z2hfZnVuZHMoc2VsZiwgcGF5bWVudF9hbW91bnQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzI1CiAgICAvLyBBc3NldChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjUtMzI2CiAgICAvLyBBc3NldChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vID49IHBheW1lbnRfYW1vdW50CiAgICBmcmFtZV9kaWcgLTEKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjQtMzI3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIEFzc2V0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCkuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gICAgID49IHBheW1lbnRfYW1vdW50CiAgICAvLyApLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5wYXkocmVjZWl2ZXI6IGJ5dGVzLCBhbW91bnQ6IHVpbnQ2NCkgLT4gdm9pZDoKcGF5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzI5LTMzMAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBwYXkoc2VsZiwgcmVjZWl2ZXI6IGFyYzQuQWRkcmVzcywgYW1vdW50OiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMzMS0zMzYKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlci5uYXRpdmUsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzM1CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzMyCiAgICAvLyB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzMxCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMzEtMzM2CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIubmF0aXZlLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLnBheV9wcmluY2lwYWwoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgcGF5bWVudF9pbmZvOiBieXRlcykgLT4gYnl0ZXM6CnBheV9wcmluY2lwYWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjY0LTI2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcGF5X3ByaW5jaXBhbCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcGF5bWVudF9pbmZvOiBhcmM0LkR5bmFtaWNCeXRlcwogICAgLy8gKSAtPiB0eXAuUGF5bWVudFJlc3VsdDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA0CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18zIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ0My00NDQKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCByZXN0cmljdCBjYWxsZXIgYXV0aG9yaXphdGlvbgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ0NQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NDYKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXBuIDIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ0OAogICAgLy8gdW5pdHMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NDkKICAgIC8vIGFzc2VydCB1bml0cyA+IDAsIGVyci5OT19VTklUUwogICAgYXNzZXJ0IC8vIE5vIEQtQVNBIHVuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NTAKICAgIC8vIGFzc2VydCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLm1hdHVyaXR5X2RhdGUsIGVyci5OT1RfTUFUVVJFCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgbWF0dXJlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjkxCiAgICAvLyBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyODktMjkyCiAgICAvLyAjIFByaW5jaXBhbCBwYXltZW50IGlzIGZvcmJpZGRlbiBpbiBjYXNlIG9mIHBlbmRpbmcgY291cG9uIHBheW1lbnRzCiAgICAvLyBhc3NlcnQgc2VsZi5hbGxfZHVlX2NvdXBvbnNfcGFpZCgKICAgIC8vICAgICBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIC8vICksIGVyci5QRU5ESU5HX0NPVVBPTl9QQVlNRU5UCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyOTUKICAgIC8vIGlmIHNlbGYuaXNfcGF5bWVudF9leGVjdXRhYmxlKGhvbGRpbmdfYWRkcmVzcyk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgaXNfcGF5bWVudF9leGVjdXRhYmxlCiAgICBieiBwYXlfcHJpbmNpcGFsX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6Mjk2CiAgICAvLyBwYXltZW50X2Ftb3VudCA9IHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgYWNjb3VudF90b3RhbF91bml0c192YWx1ZQogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6Mjk3LTI5OAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBwYXltZW50IGFnZW50CiAgICAvLyBzZWxmLmFzc2VydF9lbm91Z2hfZnVuZHMocGF5bWVudF9hbW91bnQpCiAgICBjYWxsc3ViIGFzc2VydF9lbm91Z2hfZnVuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyOTktMzAwCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIHRoZSBzYW1lIGFzc2V0IGZvciBkZW5vbWluYXRpb24gYW5kIHNldHRsZW1lbnQsIG5vIGNvbnZlcnNpb24gbmVlZGVkCiAgICAvLyBzZWxmLnBheShzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MsIHBheW1lbnRfYW1vdW50KQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBzd2FwCiAgICBjYWxsc3ViIHBheQoKcGF5X3ByaW5jaXBhbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NTcKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgLT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLQogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDU4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KCkKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGJ5dGVjIDggLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICByZXBsYWNlMiAzMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDU5CiAgICAvLyBzZWxmLmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cygpCiAgICBjYWxsc3ViIGVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjMwNwogICAgLy8gYW1vdW50PWFyYzQuVUludDY0KHBheW1lbnRfYW1vdW50KSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMDgKICAgIC8vIHRpbWVzdGFtcD1hcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCksCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzA2LTMxMAogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50UmVzdWx0KAogICAgLy8gICAgIGFtb3VudD1hcmM0LlVJbnQ2NChwYXltZW50X2Ftb3VudCksCiAgICAvLyAgICAgdGltZXN0YW1wPWFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSwKICAgIC8vICAgICBjb250ZXh0PXBheW1lbnRfaW5mby5jb3B5KCksICAjIFRPRE86IEFkZCBpbmZvIG9uIGZhaWxlZCBwYXltZW50CiAgICAvLyApCiAgICBjb25jYXQKICAgIGJ5dGVjIDMyIC8vIDB4MDAxMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgc3dhcAogICAgcmV0c3ViCgpwYXlfcHJpbmNpcGFsX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjMwMi0zMDMKICAgIC8vICMgQWNjb3VudHMgc3VzcGVuZGVkIG9yIG5vdCBvcHRlZCBpbiBhdCB0aGUgdGltZSBvZiBwYXltZW50cyBtdXN0IG5vdCBzdGFsbCB0aGUgRC1BU0EKICAgIC8vIHBheW1lbnRfYW1vdW50ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBiIHBheV9wcmluY2lwYWxfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzKCkgLT4gdm9pZDoKZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzY0LTM2NQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzY2CiAgICAvLyBpZiBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzID09IDA6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBibnogZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzY3CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0VOREVEKQogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgaW50YyA3IC8vIDIwMAogICAgYXBwX2dsb2JhbF9wdXQKCmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0c19hZnRlcl9pZl9lbHNlQDI6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMTItMzE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCB1bml0czogYXJjNC5VSW50NjQKICAgIC8vICkgLT4gdHlwLkN1cnJlbnRVbml0c1ZhbHVlOgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMzMKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMzMtMzM0CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjMzNAogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzMzLTMzNAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMzItMzM1CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyApLCBlcnIuTk9fUFJJTUFSWV9ESVNUUklCVVRJT04KICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzM4CiAgICAvLyAwIDwgdW5pdHMgPD0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ5dGVjIDggLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPgogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDcKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgaXRvYgogICAgZnJhbWVfZGlnIC0xCiAgICBiPj0KICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA3CiAgICBpbnRjXzEgLy8gMQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzM3LTMzOQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICAwIDwgdW5pdHMgPD0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9VTklUUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYW1vdW50IG9mIHVuaXRzIGZvciB0aGUgYWNjb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM0MwogICAgLy8gaG9sZGluZ19hZGRyZXNzLCB1bml0cy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNDEtMzQ0CiAgICAvLyAjIFZhbHVlIGR1cmluZyBwcmltYXJ5IGRpc3RyaWJ1dGlvbiBhbmQgYXQgbWF0dXJpdHkKICAgIC8vIGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSA9IHNlbGYuYWNjb3VudF91bml0c192YWx1ZSgKICAgIC8vICAgICBob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZQogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM0NS0zNDYKICAgIC8vICMgQWNjcnVpbmcgaW50ZXJlc3QgZHVyaW5nIHByaW1hcnkgZGlzdHJpYnV0aW9uIGFuZCBhdCBtYXR1cml0eQogICAgLy8gYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzQ3CiAgICAvLyBudW1lcmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM0OAogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM1MC0zNTEKICAgIC8vICMgQWNjcnVpbmcgaW50ZXJlc3QKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM1MgogICAgLy8gc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChob2xkaW5nX2FkZHJlc3MsIGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0yCiAgICBkaWcgMQogICAgY2FsbHN1YiBhc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM1MwogICAgLy8gaWYgc2VsZi5pc19hY2NydWluZ19pbnRlcmVzdChkdWVfY291cG9ucyk6CiAgICBjYWxsc3ViIGlzX2FjY3J1aW5nX2ludGVyZXN0CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNTQKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjYWxsc3ViIGRheV9jb3VudF9mYWN0b3IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNTUtMzU3CiAgICAvLyBhY2NydWVkX2ludGVyZXN0ID0gc2VsZi5hY2NydWVkX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZSwgZHVlX2NvdXBvbnMKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIDYKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzU4CiAgICAvLyBudW1lcmF0b3IgPSBkYXlfY291bnRfZmFjdG9yLm51bWVyYXRvci5uYXRpdmUKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNTkKICAgIC8vIGRlbm9taW5hdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvci5uYXRpdmUKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfYnVyeSAzCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzYxCiAgICAvLyB1bml0c192YWx1ZT1hcmM0LlVJbnQ2NChhY2NvdW50X3VuaXRzX25vbWluYWxfdmFsdWUpLAogICAgZnJhbWVfZGlnIDEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNjIKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3Q9YXJjNC5VSW50NjQoYWNjcnVlZF9pbnRlcmVzdCksCiAgICBmcmFtZV9kaWcgMgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM2NAogICAgLy8gbnVtZXJhdG9yPWFyYzQuVUludDY0KG51bWVyYXRvciksCiAgICBmcmFtZV9kaWcgNQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM2NQogICAgLy8gZGVub21pbmF0b3I9YXJjNC5VSW50NjQoZGVub21pbmF0b3IpLAogICAgZnJhbWVfZGlnIDMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNjMtMzY2CiAgICAvLyBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIC8vICAgICBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICAvLyApLAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzYwLTM2NwogICAgLy8gcmV0dXJuIHR5cC5DdXJyZW50VW5pdHNWYWx1ZSgKICAgIC8vICAgICB1bml0c192YWx1ZT1hcmM0LlVJbnQ2NChhY2NvdW50X3VuaXRzX25vbWluYWxfdmFsdWUpLAogICAgLy8gICAgIGFjY3J1ZWRfaW50ZXJlc3Q9YXJjNC5VSW50NjQoYWNjcnVlZF9pbnRlcmVzdCksCiAgICAvLyAgICAgZGF5X2NvdW50X2ZhY3Rvcj10eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgICAgIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChudW1lcmF0b3IpLAogICAgLy8gICAgICAgICBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VAOAoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgYiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5maXhlZF9jb3Vwb25fYm9uZC5jb250cmFjdC5GaXhlZENvdXBvbkJvbmQuaXNfYWNjcnVpbmdfaW50ZXJlc3QoZHVlX2NvdXBvbnM6IHVpbnQ2NCkgLT4gdWludDY0Ogppc19hY2NydWluZ19pbnRlcmVzdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjQtMTI1CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGlzX2FjY3J1aW5nX2ludGVyZXN0KHNlbGYsIGR1ZV9jb3Vwb25zOiBVSW50NjQpIC0+IGJvb2w6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjcKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEyNy0xMjkKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyBhbmQgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIGJ6IGlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEyOAogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTI3LTEyOQogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlICE9IDAKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vIGFuZCBkdWVfY291cG9ucyA8IHNlbGYudG90YWxfY291cG9ucwogICAgYnogaXNfYWNjcnVpbmdfaW50ZXJlc3RfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTI5CiAgICAvLyBhbmQgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgIT0gMAogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gYW5kIGR1ZV9jb3Vwb25zIDwgc2VsZi50b3RhbF9jb3Vwb25zCiAgICBieiBpc19hY2NydWluZ19pbnRlcmVzdF9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTI2LTEzMAogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmlzc3VhbmNlX2RhdGUgIT0gMAogICAgLy8gICAgIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vICAgICBhbmQgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIC8vICkKICAgIHJldHN1YgoKaXNfYWNjcnVpbmdfaW50ZXJlc3RfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjYtMTMwCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICAvLyAgICAgYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gICAgIGFuZCBkdWVfY291cG9ucyA8IHNlbGYudG90YWxfY291cG9ucwogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5nZXRfY291cG9uX3JhdGVzKCkgLT4gYnl0ZXM6CmdldF9jb3Vwb25fcmF0ZXM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzY5LTM3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2NvdXBvbl9yYXRlcyhzZWxmKSAtPiB0eXAuQ291cG9uUmF0ZXM6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNzcKICAgIC8vIGNvdXBvbl9yYXRlcyA9IHR5cC5Db3Vwb25SYXRlcygpCiAgICBieXRlYyAzMyAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMyAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6Mzc4CiAgICAvLyBpZiBzZWxmLnN0YXR1c19pc19hY3RpdmUoKToKICAgIGJ6IGdldF9jb3Vwb25fcmF0ZXNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6Mzc5CiAgICAvLyBjb3Vwb25fcmF0ZXMgPSBzZWxmLmNvdXBvbl9yYXRlcy52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDE3IC8vIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MwogICAgYm94X2dldAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb3Vwb25fcmF0ZXMgZXhpc3RzCgpnZXRfY291cG9uX3JhdGVzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozODAKICAgIC8vIHJldHVybiBjb3Vwb25fcmF0ZXMKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmdldF9wYXltZW50X2Ftb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X3BheW1lbnRfYW1vdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM4Mi0zODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9wYXltZW50X2Ftb3VudChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcykgLT4gdHlwLlBheW1lbnRBbW91bnRzOgogICAgcHJvdG8gMSAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3NAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6Mzk3CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozOTctMzk4CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBVSW50NjQoKQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IFVJbnQ2NCgpCiAgICBkdXBuIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18zIC8vIDEwMAogICAgPT0KICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozOTkKICAgIC8vIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpOgogICAgYnogZ2V0X3BheW1lbnRfYW1vdW50X2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQwMAogICAgLy8gcGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zLm5hdGl2ZQogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQwMQogICAgLy8gaWYgcGFpZF9jb3Vwb25zIDwgc2VsZi50b3RhbF9jb3Vwb25zOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIDwKICAgIGJ6IGdldF9wYXltZW50X2Ftb3VudF9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcyksCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWNjb3VudF90b3RhbF91bml0c192YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQwNQogICAgLy8gcGFpZF9jb3Vwb25zICsgMSwKICAgIGZyYW1lX2RpZyAwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQwMi00MDYKICAgIC8vICMgQ291cG9uIFBheW1lbnQKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IHNlbGYuY291cG9uX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnMgKyAxLAogICAgLy8gKQogICAgY2FsbHN1YiBjb3Vwb25faW50ZXJlc3RfYW1vdW50CiAgICBmcmFtZV9idXJ5IDIKCmdldF9wYXltZW50X2Ftb3VudF9hZnRlcl9pZl9lbHNlQDQ6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfYnVyeSA0CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSA1CgpnZXRfcGF5bWVudF9hbW91bnRfYWZ0ZXJfaWZfZWxzZUA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDExCiAgICAvLyBpbnRlcmVzdD1hcmM0LlVJbnQ2NChpbnRlcmVzdF9hbW91bnQpLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQxMgogICAgLy8gcHJpbmNpcGFsPWFyYzQuVUludDY0KHByaW5jaXBhbF9hbW91bnQpLAogICAgc3dhcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQxMC00MTMKICAgIC8vIHJldHVybiB0eXAuUGF5bWVudEFtb3VudHMoCiAgICAvLyAgICAgaW50ZXJlc3Q9YXJjNC5VSW50NjQoaW50ZXJlc3RfYW1vdW50KSwKICAgIC8vICAgICBwcmluY2lwYWw9YXJjNC5VSW50NjQocHJpbmNpcGFsX2Ftb3VudCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfcGF5bWVudF9hbW91bnRfZWxzZV9ib2R5QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDA4LTQwOQogICAgLy8gIyBQcmluY2lwYWwgUGF5bWVudAogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWNjb3VudF90b3RhbF91bml0c192YWx1ZQogICAgZnJhbWVfYnVyeSAzCiAgICBiIGdldF9wYXltZW50X2Ftb3VudF9hZnRlcl9pZl9lbHNlQDQKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmdldF9jb3Vwb25zX3N0YXR1cygpIC0+IGJ5dGVzOgpnZXRfY291cG9uc19zdGF0dXM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDE1LTQxNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2NvdXBvbnNfc3RhdHVzKHNlbGYpIC0+IHR5cC5Db3Vwb25zSW5mbzoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQyNAogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQyNQogICAgLy8gbmV4dF9jb3Vwb25fZHVlX2RhdGUgPSBzZWxmLm5leHRfY291cG9uX2R1ZV9kYXRlKGR1ZV9jb3Vwb25zKQogICAgY2FsbHN1YiBuZXh0X2NvdXBvbl9kdWVfZGF0ZQogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQyNgogICAgLy8gYWxsX2R1ZV9jb3Vwb25zX3BhaWQgPSBzZWxmLmFsbF9kdWVfY291cG9uc19wYWlkKGR1ZV9jb3Vwb25zKQogICAgZHVwCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDI3CiAgICAvLyBudW1lcmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MjgKICAgIC8vIGRlbm9taW5hdG9yID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDI5CiAgICAvLyBpZiBzZWxmLmlzX2FjY3J1aW5nX2ludGVyZXN0KGR1ZV9jb3Vwb25zKToKICAgIGNhbGxzdWIgaXNfYWNjcnVpbmdfaW50ZXJlc3QKICAgIGJ6IGdldF9jb3Vwb25zX3N0YXR1c19hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MzAKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgMAogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDMxCiAgICAvLyBudW1lcmF0b3IgPSBkYXlfY291bnRfZmFjdG9yLm51bWVyYXRvci5uYXRpdmUKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MzIKICAgIC8vIGRlbm9taW5hdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvci5uYXRpdmUKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfYnVyeSA0CgpnZXRfY291cG9uc19zdGF0dXNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQzNAogICAgLy8gdG90YWxfY291cG9ucz1hcmM0LlVJbnQ2NChzZWxmLnRvdGFsX2NvdXBvbnMpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MzUKICAgIC8vIGR1ZV9jb3Vwb25zPWFyYzQuVUludDY0KGR1ZV9jb3Vwb25zKSwKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDM2CiAgICAvLyBuZXh0X2NvdXBvbl9kdWVfZGF0ZT1hcmM0LlVJbnQ2NChuZXh0X2NvdXBvbl9kdWVfZGF0ZSksCiAgICBmcmFtZV9kaWcgMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQzOAogICAgLy8gbnVtZXJhdG9yPWFyYzQuVUludDY0KG51bWVyYXRvciksCiAgICBmcmFtZV9kaWcgMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQzOQogICAgLy8gZGVub21pbmF0b3I9YXJjNC5VSW50NjQoZGVub21pbmF0b3IpLAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MzctNDQwCiAgICAvLyBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIC8vICAgICBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICAvLyApLAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDQxCiAgICAvLyBhbGxfZHVlX2NvdXBvbnNfcGFpZD1hcmM0LkJvb2woYWxsX2R1ZV9jb3Vwb25zX3BhaWQpLAogICAgYnl0ZWMgMTAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MzMtNDQyCiAgICAvLyByZXR1cm4gdHlwLkNvdXBvbnNJbmZvKAogICAgLy8gICAgIHRvdGFsX2NvdXBvbnM9YXJjNC5VSW50NjQoc2VsZi50b3RhbF9jb3Vwb25zKSwKICAgIC8vICAgICBkdWVfY291cG9ucz1hcmM0LlVJbnQ2NChkdWVfY291cG9ucyksCiAgICAvLyAgICAgbmV4dF9jb3Vwb25fZHVlX2RhdGU9YXJjNC5VSW50NjQobmV4dF9jb3Vwb25fZHVlX2RhdGUpLAogICAgLy8gICAgIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIC8vICAgICAgICAgZGVub21pbmF0b3I9YXJjNC5VSW50NjQoZGVub21pbmF0b3IpLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYWxsX2R1ZV9jb3Vwb25zX3BhaWQ9YXJjNC5Cb29sKGFsbF9kdWVfY291cG9uc19wYWlkKSwKICAgIC8vICkKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2V0X2NyZWF0ZShhcnJhbmdlcjogYnl0ZXMsIG1ldGFkYXRhOiBieXRlcykgLT4gdm9pZDoKYXNzZXRfY3JlYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDYxLTQ2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICAvLyBkZWYgYXNzZXRfY3JlYXRlKHNlbGYsIGFycmFuZ2VyOiBhcmM0LkFkZHJlc3MsIG1ldGFkYXRhOiB0eXAuQXNzZXRNZXRhZGF0YSkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gYXJyYW5nZXIubmF0aXZlCiAgICBieXRlYyAxOCAvLyAweDUyMzIzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzEKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YS5ieXRlcwogICAgYnl0ZWMgMjAgLy8gIm1ldGFkYXRhIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXRfdXBkYXRlKG1ldGFkYXRhOiBieXRlcykgLT4gdm9pZDoKYXNzZXRfdXBkYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDczLTQ3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIGFzc2V0X3VwZGF0ZShzZWxmLCBtZXRhZGF0YTogdHlwLkFzc2V0TWV0YWRhdGEpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3OC00ODEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgZGlzYWJsZSBELUFTQSBhcHBsaWNhdGlvbiB1cGRhdGFiaWxpdHkgb3IgY2hhbmdlIGl0cyBhdXRob3JpemF0aW9ucy4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleSBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ4MgogICAgLy8gc2VsZi5tZXRhZGF0YSA9IG1ldGFkYXRhLmJ5dGVzCiAgICBieXRlYyAyMCAvLyAibWV0YWRhdGEiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExOC0xMTkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYuYXJyYW5nZXIudmFsdWUsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAweDUyMzIzMDIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NldF9jb25maWcoZGVub21pbmF0aW9uX2Fzc2V0X2lkOiBieXRlcywgc2V0dGxlbWVudF9hc3NldF9pZDogYnl0ZXMsIHByaW5jaXBhbDogYnl0ZXMsIHByaW5jaXBhbF9kaXNjb3VudDogYnl0ZXMsIG1pbmltdW1fZGVub21pbmF0aW9uOiBieXRlcywgZGF5X2NvdW50X2NvbnZlbnRpb246IGJ5dGVzLCBpbnRlcmVzdF9yYXRlOiBieXRlcywgY291cG9uX3JhdGVzOiBieXRlcywgdGltZV9ldmVudHM6IGJ5dGVzLCB0aW1lX3BlcmlvZHM6IGJ5dGVzKSAtPiB2b2lkOgphc3NldF9jb25maWc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0ODQtNDk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhc3NldF9jb25maWcoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHByaW5jaXBhbDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgcHJpbmNpcGFsX2Rpc2NvdW50OiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBtaW5pbXVtX2Rlbm9taW5hdGlvbjogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb246IGFyYzQuVUludDgsCiAgICAvLyAgICAgaW50ZXJlc3RfcmF0ZTogYXJjNC5VSW50MTYsCiAgICAvLyAgICAgY291cG9uX3JhdGVzOiB0eXAuQ291cG9uUmF0ZXMsCiAgICAvLyAgICAgdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzLAogICAgLy8gICAgIHRpbWVfcGVyaW9kczogdHlwLlRpbWVQZXJpb2RzLAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMTAgMAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MjcKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUyOAogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfRU1QVFksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTMwLTUzMQogICAgLy8gIyBTZXQgRGVub21pbmF0aW9uIEFzc2V0CiAgICAvLyBzZWxmLmFzc2VydF9kZW5vbWluYXRpb25fYXNzZXQoZGVub21pbmF0aW9uX2Fzc2V0X2lkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMTAKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTgwCiAgICAvLyBkZW5vbWluYXRpb25fYXNzZXRfaWQgIT0gVUludDY0KDApIGFuZCBBc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQpLmNyZWF0b3IKICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQKICAgIGZyYW1lX2RpZyA0CiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCmFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzgtMTgxCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQgIT0gVUludDY0KDApIGFuZCBBc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQpLmNyZWF0b3IKICAgIC8vICksIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODUKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZnJhbWVfZGlnIDQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzQtNTM1CiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuYXNzZXJ0X3NldHRsZW1lbnRfYXNzZXQoc2V0dGxlbWVudF9hc3NldF9pZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTkKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkIGV4aXN0cwogICAgZGlnIDEKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODktMTkyCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyA3IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5Ny0yMDMKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5OQogICAgLy8geGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjAwCiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk3LTE5OAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTctMjAzCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQwCiAgICAvLyBwcmluY2lwYWwubmF0aXZlICUgbWluaW11bV9kZW5vbWluYXRpb24ubmF0aXZlID09IDAKICAgIGZyYW1lX2RpZyAtOAogICAgYnRvaQogICAgZnJhbWVfZGlnIC02CiAgICBidG9pCiAgICBkdXAyCiAgICAlCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzgtNTQxCiAgICAvLyAjIFNldCBQcmluY2lwYWwgYW5kIE1pbmltdW0gRGVub21pbmF0aW9uCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByaW5jaXBhbC5uYXRpdmUgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUgPT0gMAogICAgLy8gKSwgZXJyLklOVkFMSURfTUlOSU1VTV9ERU5PTUlOQVRJT04KICAgIGFzc2VydCAvLyBNaW5pbXVtIGRlbm9taW5hdGlvbiBpcyBub3QgYSBkaXZpc29yIG9mIHByaW5jaXBhbAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQyCiAgICAvLyBzZWxmLnVuaXRfdmFsdWUgPSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUKICAgIGJ5dGVjIDEyIC8vICJ1bml0X3ZhbHVlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NDMKICAgIC8vIHNlbGYudG90YWxfdW5pdHMgPSBwcmluY2lwYWwubmF0aXZlIC8vIG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZQogICAgLwogICAgYnl0ZWMgMTQgLy8gInRvdGFsX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU0NAogICAgLy8gc2VsZi5wcmluY2lwYWxfZGlzY291bnQgPSBwcmluY2lwYWxfZGlzY291bnQubmF0aXZlCiAgICBmcmFtZV9kaWcgLTcKICAgIGJ0b2kKICAgIGJ5dGVjIDIxIC8vICJwcmluY2lwYWxfZGlzY291bnQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQ2LTU0NwogICAgLy8gIyBTZXQgRGF5LUNvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuYXNzZXJ0X2RheV9jb3VudF9jb252ZW50aW9uKGRheV9jb3VudF9jb252ZW50aW9uLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtNQogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNy0yMTEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGZyYW1lX2RpZyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTAKICAgIC8vIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgaW50YyA1IC8vIDI1NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjA3LTIxMQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgPT0KICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDE3Cgphc3NldF9jb25maWdfYm9vbF90cnVlQDE2OgogICAgaW50Y18xIC8vIDEKCmFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjA3LTIxMQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIxNQogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IGRheV9jb3VudF9jb252ZW50aW9uCiAgICBieXRlYyAxMyAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBmcmFtZV9kaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU1MC01NTEKICAgIC8vICMgU2V0IEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYuYXNzZXJ0X2ludGVyZXN0X3JhdGUoaW50ZXJlc3RfcmF0ZS5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTQKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjE5LTIyMAogICAgLy8gIyBUaGlzIHN1YnJvdXRpbmUgbXVzdCBiZSB1c2VkIGFmdGVyIHRoZSBwcmluY2lwYWwgZGlzY291bnQgaGFzIGJlZW4gc2V0CiAgICAvLyBpZiBub3Qgc2VsZi5wcmluY2lwYWxfZGlzY291bnQ6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gInByaW5jaXBhbF9kaXNjb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmluY2lwYWxfZGlzY291bnQgZXhpc3RzCiAgICBibnogYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyMQogICAgLy8gYXNzZXJ0IGludGVyZXN0X3JhdGUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0lOVEVSRVNUX1JBVEUKICAgIGZyYW1lX2RpZyAyCiAgICBhc3NlcnQgLy8gSW50ZXJlc3QgcmF0ZSBpcyBub3QgcHJvcGVybHkgZGVmaW5lZAoKYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMjUKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IGludGVyZXN0X3JhdGUKICAgIGJ5dGVjIDI3IC8vICJpbnRlcmVzdF9yYXRlIgogICAgZnJhbWVfZGlnIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDgKICAgIC8vIGFzc2VydCBjb3Vwb25fcmF0ZXMubGVuZ3RoLCBlcnIuSU5WQUxJRF9DT1VQT05fUkFURVMKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGFzc2VydCAvLyBDb3Vwb24gcmF0ZXMgYXJlIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMzMKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IGNvdXBvbl9yYXRlcy5sZW5ndGgKICAgIGJ5dGVjIDQgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjM0CiAgICAvLyBpZiBzZWxmLnRvdGFsX2NvdXBvbnM6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgYnogYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gc2VsZi5jb3Vwb25fcmF0ZXMudmFsdWUgPSBjb3Vwb25fcmF0ZXMuY29weSgpCiAgICBieXRlYyAxNyAvLyAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMTcgLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBmcmFtZV9kaWcgLTMKICAgIGJveF9wdXQKCmFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDMyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQwCiAgICAvLyB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIHB1c2hpbnQgNCAvLyA0CiAgICArCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjM5LTI0MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTCiAgICAvLyApLCBlcnIuSU5WQUxJRF9USU1FX0VWRU5UU19MRU5HVEgKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBsZW5ndGggaXMgaW52YWxpZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTYwCiAgICAvLyBzZWxmLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQodGltZV9ldmVudHMpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY1CiAgICAvLyBzZWxmLnRpbWVfZXZlbnRzLnZhbHVlID0gdGltZV9ldmVudHMuY29weSgpCiAgICBieXRlYyAxMSAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDExIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY2LTI2OAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY2CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgYnl0ZWMgOSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY2LTI2OAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjktMjcxCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgZHVwCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2OQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDIyIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjktMjcxCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlID0gdGltZV9ldmVudHNbY2ZnLklTU1VBTkNFX0RBVEVfSURYXS5uYXRpdmUKICAgIGV4dHJhY3QgMTYgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ5dGVjIDUgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjc0LTI3NQogICAgLy8gIyBTb21lIEQtQVNBIG1heSBub3QgaGF2ZSBhIG1hdHVyaXR5IGRhdGUgKGUuZy4sIHBlcnBldHVhbHMpCiAgICAvLyBpZiB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTOgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgcHVzaGludCA0IC8vIDQKICAgICsKICAgID09CiAgICBieiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzOAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjc2CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0aW1lX2V2ZW50c1tjZmcuTUFUVVJJVFlfREFURV9JRFhdLm5hdGl2ZQogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ5dGVjIDYgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODAKICAgIC8vIGFzc2VydCBub3QgdGltZV9wZXJpb2RzLmxlbmd0aCwgZXJyLklOVkFMSURfVElNRV9QRVJJT0RTCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgIQogICAgYXNzZXJ0IC8vIFRpbWUgcGVyaW9kcyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU2NwogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoY2ZnLlNUQVRVU19BQ1RJVkUpCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBpbnRjXzMgLy8gMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgphc3NldF9jb25maWdfYm9vbF9mYWxzZUAxNzoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDE4Cgphc3NldF9jb25maWdfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQodGltZV9ldmVudHM6IGJ5dGVzKSAtPiBieXRlczoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0My0yNDQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWxmLCB0aW1lX2V2ZW50czogdHlwLlRpbWVFdmVudHMpIC0+IE5vbmU6CiAgICBwcm90byAxIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDYKICAgIC8vIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDcKICAgIC8vID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0Ni0yNDcKICAgIC8vIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXS5uYXRpdmUKICAgIC8vID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0NS0yNDgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdLm5hdGl2ZQogICAgLy8gICAgID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5JTlZBTElEX1RJTUUKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDkKICAgIC8vIGZvciBfdCBpbiB1cmFuZ2UodGltZV9ldmVudHMubGVuZ3RoIC0gMSk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMCAvLyAwCgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gZm9yIF90IGluIHVyYW5nZSh0aW1lX2V2ZW50cy5sZW5ndGggLSAxKToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl9mb3JANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUxCiAgICAvLyByZXF1aXJlZF9idWRnZXQ9VUludDY0KGNmZy5PUF9VUF9USU1FX0VWRU5UX1NPUlRJTkcpLAogICAgcHVzaGludCA2NSAvLyA2NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUyCiAgICAvLyBmZWVfc291cmNlPU9wVXBGZWVTb3VyY2UuQXBwQWNjb3VudCwgICMgQXBwIGZ1bmRzIGFyZSBub3QgYXQgcmlzayBzaW5jZSBjYWxsZXIgaXMgdHJ1c3RlZAogICAgaW50Y18xIC8vIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1MC0yNTMKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PVVJbnQ2NChjZmcuT1BfVVBfVElNRV9FVkVOVF9TT1JUSU5HKSwKICAgIC8vICAgICBmZWVfc291cmNlPU9wVXBGZWVTb3VyY2UuQXBwQWNjb3VudCwgICMgQXBwIGZ1bmRzIGFyZSBub3QgYXQgcmlzayBzaW5jZSBjYWxsZXIgaXMgdHJ1c3RlZAogICAgLy8gKQogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTQKICAgIC8vIHRpbWVfaSA9IHRpbWVfZXZlbnRzW190XS5uYXRpdmUKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjU1CiAgICAvLyB0aW1lX2YgPSB0aW1lX2V2ZW50c1tfdCArIDFdLm5hdGl2ZQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gYXNzZXJ0IHRpbWVfZiA+IHRpbWVfaSwgZXJyLklOVkFMSURfU09SVElORwogICAgPAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjU3CiAgICAvLyBpZiBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uICE9IFVJbnQ2NChjc3QuRENDX0NPTlQpOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIGludGMgNSAvLyAyNTUKICAgICE9CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjU4LTI1OQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRpbWUgcGVyaW9kcyBleHByZXNzZWQgaW4gZGF5cyBmb3IgcmVndWxhciBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCAodGltZV9mIC0gdGltZV9pKSAlIFVJbnQ2NCgKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjU4LTI2MQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRpbWUgcGVyaW9kcyBleHByZXNzZWQgaW4gZGF5cyBmb3IgcmVndWxhciBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCAodGltZV9mIC0gdGltZV9pKSAlIFVJbnQ2NCgKICAgIC8vICAgICBjc3QuREFZXzJfU0VDCiAgICAvLyApID09IDAsIGVyci5JTlZBTElEX1RJTUVfUEVSSU9ECiAgICBpbnRjIDYgLy8gODY0MDAKICAgICUKICAgICEKICAgIGFzc2VydCAvLyBUaW1lIHBlcmlvZHMgaW4gQWN0dWFsL0FjdHVhbCBkYXkgY291bnQgY29udmVudGlvbiBtdXN0IGJlIG11bHRpcGxlcyBvZiBhIGRheSAoaW4gc2Vjb25kcykKICAgIGIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDEKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDY6CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cyhzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzOiBieXRlcykgLT4gYnl0ZXM6CnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NjktNTcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKAogICAgLy8gICAgIHNlbGYsIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzCiAgICAvLyApIC0+IHR5cC5TZWNvbmRhcnlNYXJrZXRTY2hlZHVsZToKICAgIHByb3RvIDEgMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5MAogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjIDcgLy8gMjAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTkxCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTkyCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5NAogICAgLy8gYXNzZXJ0IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID49IDEsIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTUKICAgIC8vIGlmIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID4gMToKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTYKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMQogICAgZnJhbWVfYnVyeSAxCgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTgKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5OS02MDEKICAgIC8vIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5OC02MDEKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gPD0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgZGlnIDEKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTctNjAyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gICAgIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vICAgICBdLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX09QRU5JTkdfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBvcGVuaW5nIGRhdGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwMwogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDMtNjA1CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwNgogICAgLy8gaWYgc2VsZi5tYXR1cml0eV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDgKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxMAogICAgLy8gY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwOS02MTEKICAgIC8vID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwOC02MTEKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgZGlnIDEKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDctNjEyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gICAgID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vICAgICBdLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX0NMT1NVUkVfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBjbG9zdXJlIGRhdGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxMwogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTMtNjE1CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjE4CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjE3LTYxOQogICAgLy8gc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyMQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyMC02MjIKICAgIC8vIHNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTYtNjIzCiAgICAvLyByZXR1cm4gdHlwLlNlY29uZGFyeU1hcmtldFNjaGVkdWxlKAogICAgLy8gICAgIHNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgICAgICBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gICAgICksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzaWduX3JvbGUocm9sZV9hZGRyZXNzOiBieXRlcywgcm9sZTogYnl0ZXMsIGNvbmZpZzogYnl0ZXMpIC0+IGJ5dGVzOgphc3NpZ25fcm9sZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyNS02MjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2lnbl9yb2xlKAogICAgLy8gICAgIHNlbGYsIHJvbGVfYWRkcmVzczogYXJjNC5BZGRyZXNzLCByb2xlOiBhcmM0LlVJbnQ4LCBjb25maWc6IGFyYzQuRHluYW1pY0J5dGVzCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDYKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0NwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ5CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgcHVzaGludCAyMCAvLyAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgtNjU1CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUxCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MCAvLyA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MgogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MCAvLyA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MwogICAgLy8gVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwIC8vIDcwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgtNjU1CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU0CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0OC02NTUKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBhc3NpZ25fcm9sZV9ib29sX2ZhbHNlQDcKCmFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18xIC8vIDEKCmFzc2lnbl9yb2xlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0OC02NTUKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU3CiAgICAvLyBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICBwdXNoaW50cyAyMCA0MCA1MCA2MCA3MCA4MCAvLyAyMCwgNDAsIDUwLCA2MCwgNzAsIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTYtNjg1CiAgICAvLyBtYXRjaCByb2xlLm5hdGl2ZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MubmF0aXZlCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICAgICAgICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoKQogICAgZnJhbWVfZGlnIDAKICAgIG1hdGNoIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzBAOSBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8xQDEwIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzJAMTEgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzVAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4NQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfNUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3OQogICAgLy8gcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgYnl0ZWMgMzQgLy8gMHg1MjM4MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzgtNjgwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4MgogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjgxLTY4MwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gKQogICAgYm94X3B1dAoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4NgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgc3dhcAogICAgcmV0c3ViCgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njc1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyOCAvLyAweDUyMzczMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzYKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzNAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyOSAvLyAweDUyMzYzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzMKICAgIC8vIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgYm94X3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8yQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDMwIC8vIDB4NTIzNTMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2OQogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY4LTY3MAogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICBjb25maWcubmF0aXZlCiAgICAvLyApCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzFAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjEKICAgIC8vIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDMxIC8vIDB4NTIzNDMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjYwLTY2MgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjQKICAgIC8vIGNvbmZpZy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2My02NjUKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICkKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMEA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU4CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzLm5hdGl2ZQogICAgYnl0ZWMgMTggLy8gMHg1MjMyMzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NpZ25fcm9sZV9ib29sX21lcmdlQDgKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5yZXZva2Vfcm9sZShyb2xlX2FkZHJlc3M6IGJ5dGVzLCByb2xlOiBieXRlcykgLT4gYnl0ZXM6CnJldm9rZV9yb2xlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njg4LTY4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcmV2b2tlX3JvbGUoc2VsZiwgcm9sZV9hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHJvbGU6IGFyYzQuVUludDgpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDYKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwNwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDgKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA5CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzEwCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MCAvLyA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4LTcxNAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTEKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIHB1c2hpbnQgNjAgLy8gNjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzEyCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAgLy8gNzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzEzCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogcmV2b2tlX3JvbGVfYm9vbF9mYWxzZUA2CgpyZXZva2Vfcm9sZV9ib29sX3RydWVANToKICAgIGludGNfMSAvLyAxCgpyZXZva2Vfcm9sZV9ib29sX21lcmdlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDgtNzE0CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTYtNzE3CiAgICAvLyAjIEFycmFuZ2VyIHJvbGUgY2FuIG5vdCBiZSByZXZva2VkIChqdXN0IHJvdGF0ZWQpCiAgICAvLyBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludHMgNDAgNTAgNjAgNzAgODAgLy8gNDAsIDUwLCA2MCwgNzAsIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTUtNzMzCiAgICAvLyBtYXRjaCByb2xlLm5hdGl2ZToKICAgIC8vICAgICAjIEFycmFuZ2VyIHJvbGUgY2FuIG5vdCBiZSByZXZva2VkIChqdXN0IHJvdGF0ZWQpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BQ0NPVU5UX01BTkFHRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfUFJJTUFSWV9ERUFMRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1RSVVNURUUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BVVRIT1JJVFkgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmludGVyZXN0X29yYWNsZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9JTlRFUkVTVF9PUkFDTEUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoKQogICAgZnJhbWVfZGlnIDAKICAgIG1hdGNoIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzBAOCByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8xQDkgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMCByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8zQDExIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzRAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczMwogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfNEAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczMAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmludGVyZXN0X29yYWNsZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzNCAvLyAweDUyMzgzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MzEKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9JTlRFUkVTVF9PUkFDTEUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MzQKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHN3YXAKICAgIHJldHN1YgoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyNwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyOCAvLyAweDUyMzczMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjgKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BVVRIT1JJVFkgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyNAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjkgLy8gMHg1MjM2MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzI1CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfVFJVU1RFRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8xQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMCAvLyAweDUyMzUzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjIKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9QUklNQVJZX0RFQUxFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8wQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTgKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzEgLy8gMHg1MjM0MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzE5CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQUNDT1VOVF9NQU5BR0VSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX2Jvb2xfZmFsc2VANjoKICAgIGludGNfMCAvLyAwCiAgICBiIHJldm9rZV9yb2xlX2Jvb2xfbWVyZ2VANwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLm9wZW5fYWNjb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBwYXltZW50X2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKb3Blbl9hY2NvdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzM2LTczOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgb3Blbl9hY2NvdW50KAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCBwYXltZW50X2FkZHJlc3M6IGFyYzQuQWRkcmVzcwogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU2CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50YyA3IC8vIDIwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLnN0YXR1c19pc19lbmRlZCgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICAhCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1OAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTkKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzYwCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY0CiAgICAvLyB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgYnl0ZWMgOCAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2Mi03NjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjUKICAgIC8vIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDggLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY2CiAgICAvLyBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDggLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY3CiAgICAvLyBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICBieXRlYyAxMCAvLyAweDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY5CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIyLTEyMwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDMxIC8vIDB4NTIzNDMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2LTEyOQogICAgLy8gY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjcKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyOAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNy0xMjgKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjkKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyOC0xMjkKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI1LTEzMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuY2xvc2VfYWNjb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKY2xvc2VfYWNjb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc3MS03NzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGNsb3NlX2FjY291bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MKICAgIC8vICkgLT4gYXJjNC5UdXBsZVthcmM0LlVJbnQ2NCwgYXJjNC5VSW50NjRdOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODkKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzkwCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3NAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3OTMKICAgIC8vIGNsb3NlZF91bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzk0CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQUNDT1VOVCArIGhvbGRpbmdfYWRkcmVzcy5ieXRlcykKICAgIHN3YXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzk1CiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIC09IGNsb3NlZF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZGlnIDEKICAgIC0KICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5NgogICAgLy8gc2VsZi5lbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoKQogICAgY2FsbHN1YiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5OAogICAgLy8gKGFyYzQuVUludDY0KGNsb3NlZF91bml0cyksIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSkKICAgIGl0b2IKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5Ny03OTkKICAgIC8vIHJldHVybiBhcmM0LlR1cGxlKAogICAgLy8gICAgIChhcmM0LlVJbnQ2NChjbG9zZWRfdW5pdHMpLCBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkpCiAgICAvLyApCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnByaW1hcnlfZGlzdHJpYnV0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiBieXRlcykgLT4gYnl0ZXM6CnByaW1hcnlfZGlzdHJpYnV0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODAxLTgwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcHJpbWFyeV9kaXN0cmlidXRpb24oCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHVuaXRzOiBhcmM0LlVJbnQ2NAogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDQKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjXzMgLy8gMTAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg5LTI5MgogICAgLy8gc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkwCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkxCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5MC0yOTEKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTAtMjkyCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5MgogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIyIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkxLTI5MgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGZyYW1lX2RpZyAyCiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTAtMjkyCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODgtMjkzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyAgICAgYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU0VECiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgY2xvc2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICBieXRlYyAzMCAvLyAweDUyMzUzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzQKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzYtMTM5CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzcKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGVhbGVyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzgKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzctMTM4CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzctMTM5CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kZWFsZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzOC0xMzkKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNy0xMzkKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMgogICAgaW50Y18xIC8vIDEKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzUtMTQwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICAvLyAgICAgYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyOQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzAKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMxCiAgICAvLyBhc3NlcnQgdW5pdHMubmF0aXZlID4gMCwgZXJyLlpFUk9fVU5JVFMKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICBhc3NlcnQgLy8gQ2FuIG5vdCBkaXN0cmlidXRlIHplcm8gdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMwogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyArIHVuaXRzLm5hdGl2ZSA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzItODM0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKyB1bml0cy5uYXRpdmUgPD0gc2VsZi50b3RhbF91bml0cwogICAgLy8gKSwgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHJlbWFpbmluZyBELUFTQSB1bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM2CiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICs9IHVuaXRzLm5hdGl2ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZGlnIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzOAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMubmF0aXZlCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzNy04MzkKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzNy04MzkKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBzd2FwCiAgICByZXBsYWNlMiAzMgogICAgZGlnIDEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0MAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZSA9IGFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgaXRvYgogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBzd2FwCiAgICByZXBsYWNlMiA0MAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoc2VsZi50b3RhbF91bml0cyAtIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgLQogICAgaXRvYgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTI6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDEzCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfYXNzZXRfc3VzcGVuc2lvbihzdXNwZW5kZWQ6IGJ5dGVzKSAtPiBieXRlczoKc2V0X2Fzc2V0X3N1c3BlbnNpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDMtODQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfYXNzZXRfc3VzcGVuc2lvbihzZWxmLCBzdXNwZW5kZWQ6IGFyYzQuQm9vbCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg1NwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NTgKICAgIC8vIHNlbGYuc3VzcGVuZGVkID0gVUludDY0KHN1c3BlbmRlZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ5dGVjIDIzIC8vICJzdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODU5CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUyLTE1MwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIGJ5dGVjIDI4IC8vIDB4NTIzNzMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU2LTE1OQogICAgLy8gY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTcKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdXRob3JpdHkgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1OAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1Ny0xNTgKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTctMTU5CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTkKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdXRob3JpdHkgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1OC0xNTkKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTctMTU5CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU1LTE2MAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIC8vICAgICBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X2FjY291bnRfc3VzcGVuc2lvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBzdXNwZW5kZWQ6IGJ5dGVzKSAtPiBieXRlczoKc2V0X2FjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2MS04NjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9hY2NvdW50X3N1c3BlbnNpb24oCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHN1c3BlbmRlZDogYXJjNC5Cb29sCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NzkKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4MQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGludGMgNCAvLyA0NDgKICAgIHN3YXAKICAgIHNldGJpdAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODgyCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfZGVmYXVsdF9zdGF0dXMoZGVmYXVsdGVkOiBieXRlcykgLT4gdm9pZDoKc2V0X2RlZmF1bHRfc3RhdHVzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODg0LTg4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgc2V0X2RlZmF1bHRfc3RhdHVzKHNlbGYsIGRlZmF1bHRlZDogYXJjNC5Cb29sKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICBieXRlYyAyOSAvLyAweDUyMzYzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDQKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDYtMTQ5CiAgICAvLyBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDcKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJ1c3RlZSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ4CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ3LTE0OAogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDctMTQ5CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDkKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJ1c3RlZSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ4LTE0OQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDctMTQ5CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1CiAgICBpbnRjXzEgLy8gMQoKc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NS0xNTAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgLy8gICAgIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTYKICAgIC8vIHNlbGYuZGVmYXVsdGVkID0gVUludDY0KGRlZmF1bHRlZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ5dGVjIDI0IC8vICJkZWZhdWx0ZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgpzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfbWVyZ2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hc3NldF9pbmZvKCkgLT4gYnl0ZXM6CmdldF9hc3NldF9pbmZvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODk4LTg5OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2luZm8oc2VsZikgLT4gdHlwLkFzc2V0SW5mbzoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTA4CiAgICAvLyBwZXJmb3JtYW5jZSA9IFVJbnQ2NChjc3QuUFJGX1BFUkZPUk1BTlQpCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDkKICAgIC8vIGlmIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID4gc2VsZi5tYXR1cml0eV9kYXRlID4gMDoKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgY292ZXIgNAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgID4KICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VAMwogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIDEKICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTEwCiAgICAvLyBwZXJmb3JtYW5jZSA9IFVJbnQ2NChjc3QuUFJGX01BVFVSRUQpCiAgICBwdXNoaW50IDQgLy8gNAogICAgZnJhbWVfYnVyeSAyCgpnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDM6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTEtOTEyCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG5vIGdyYWNlIG9yIGRlbGlucXVlbmN5IHBlcmlvZHMKICAgIC8vIGlmIHNlbGYuZGVmYXVsdGVkOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI0IC8vICJkZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVmYXVsdGVkIGV4aXN0cwogICAgYnogZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTMKICAgIC8vIHBlcmZvcm1hbmNlID0gVUludDY0KGNzdC5QUkZfREVGQVVMVEVEKQogICAgcHVzaGludCAzIC8vIDMKICAgIGZyYW1lX2J1cnkgMAoKZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE2CiAgICAvLyBkZW5vbWluYXRpb25fYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE3CiAgICAvLyBzZXR0bGVtZW50X2Fzc2V0X2lkPWFyYzQuVUludDY0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzQwCiAgICAvLyByZXR1cm4gc2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTgKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCgpKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxOQogICAgLy8gdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NChzZWxmLnVuaXRfdmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjAKICAgIC8vIGRheV9jb3VudF9jb252ZW50aW9uPWFyYzQuVUludDgoc2VsZi5kYXlfY291bnRfY29udmVudGlvbiksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgaXRvYgogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyMQogICAgLy8gcHJpbmNpcGFsX2Rpc2NvdW50PWFyYzQuVUludDE2KHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50KSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMSAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjIKICAgIC8vIGludGVyZXN0X3JhdGU9YXJjNC5VSW50MTYoc2VsZi5pbnRlcmVzdF9yYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNyAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyMwogICAgLy8gdG90YWxfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyNAogICAgLy8gY2lyY3VsYXRpbmdfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTI2CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjUtOTI3CiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjkKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjIgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjgtOTMwCiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzEKICAgIC8vIGlzc3VhbmNlX2RhdGU9YXJjNC5VSW50NjQoc2VsZi5pc3N1YW5jZV9kYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzIKICAgIC8vIG1hdHVyaXR5X2RhdGU9YXJjNC5VSW50NjQoc2VsZi5tYXR1cml0eV9kYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzMKICAgIC8vIHN1c3BlbmRlZD1hcmM0LkJvb2woYm9vbChzZWxmLnN1c3BlbmRlZCkpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIzIC8vICJzdXNwZW5kZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3VzcGVuZGVkIGV4aXN0cwogICAgYnl0ZWMgMTAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzQKICAgIC8vIHBlcmZvcm1hbmNlPWFyYzQuVUludDgocGVyZm9ybWFuY2UpLAogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTUtOTM1CiAgICAvLyByZXR1cm4gdHlwLkFzc2V0SW5mbygKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKSwKICAgIC8vICAgICBvdXRzdGFuZGluZ19wcmluY2lwYWw9YXJjNC5VSW50NjQoc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwoKSksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NChzZWxmLnVuaXRfdmFsdWUpLAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uPWFyYzQuVUludDgoc2VsZi5kYXlfY291bnRfY29udmVudGlvbiksCiAgICAvLyAgICAgcHJpbmNpcGFsX2Rpc2NvdW50PWFyYzQuVUludDE2KHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50KSwKICAgIC8vICAgICBpbnRlcmVzdF9yYXRlPWFyYzQuVUludDE2KHNlbGYuaW50ZXJlc3RfcmF0ZSksCiAgICAvLyAgICAgdG90YWxfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMpLAogICAgLy8gICAgIGNpcmN1bGF0aW5nX3N1cHBseT1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBpc3N1YW5jZV9kYXRlPWFyYzQuVUludDY0KHNlbGYuaXNzdWFuY2VfZGF0ZSksCiAgICAvLyAgICAgbWF0dXJpdHlfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLm1hdHVyaXR5X2RhdGUpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woYm9vbChzZWxmLnN1c3BlbmRlZCkpLAogICAgLy8gICAgIHBlcmZvcm1hbmNlPWFyYzQuVUludDgocGVyZm9ybWFuY2UpLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgdW5jb3ZlciAxNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hY2NvdW50X2luZm8oaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hY2NvdW50X2luZm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzctOTM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYWNjb3VudF9pbmZvKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzKSAtPiB0eXAuQWNjb3VudEluZm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3NAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTIKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF90aW1lX2V2ZW50cygpIC0+IGJ5dGVzOgpnZXRfdGltZV9ldmVudHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTQtOTU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfdGltZV9ldmVudHMoc2VsZikgLT4gdHlwLlRpbWVFdmVudHM6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2MgogICAgLy8gdGltZV9ldmVudHMgPSB0eXAuVGltZUV2ZW50cygpCiAgICBieXRlYyAzMyAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMyAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NjMKICAgIC8vIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpOgogICAgYnogZ2V0X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTY0CiAgICAvLyB0aW1lX2V2ZW50cyA9IHNlbGYudGltZV9ldmVudHMudmFsdWUuY29weSgpCiAgICBieXRlYyAxMSAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRpbWVfZXZlbnRzIGV4aXN0cwoKZ2V0X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2NQogICAgLy8gcmV0dXJuIHRpbWVfZXZlbnRzCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUoKSAtPiBieXRlczoKZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NjctOTY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZShzZWxmKSAtPiB0eXAuVGltZUV2ZW50czoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTc2CiAgICAvLyBhcmM0LlVJbnQ2NChzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NzcKICAgIC8vIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk3NS05NzgKICAgIC8vIHJldHVybiB0eXAuVGltZUV2ZW50cygKICAgIC8vICAgICBhcmM0LlVJbnQ2NChzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NChzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfYXNzZXRfbWV0YWRhdGEoKSAtPiBieXRlczoKZ2V0X2Fzc2V0X21ldGFkYXRhOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTgwLTk4MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21ldGFkYXRhKHNlbGYpIC0+IHR5cC5Bc3NldE1ldGFkYXRhOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5ODkKICAgIC8vIHJldHVybiB0eXAuQXNzZXRNZXRhZGF0YS5mcm9tX2J5dGVzKHNlbGYubWV0YWRhdGEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gIm1ldGFkYXRhIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1ldGFkYXRhIGV4aXN0cwogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLnV0aWwuZW5zdXJlX2J1ZGdldChyZXF1aXJlZF9idWRnZXQ6IHVpbnQ2NCwgZmVlX3NvdXJjZTogdWludDY0KSAtPiB2b2lkOgplbnN1cmVfYnVkZ2V0OgogICAgcHJvdG8gMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgICsKCmVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDE6CiAgICBmcmFtZV9kaWcgMAogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA3CiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgMzUgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyAzNSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2l0Y2ggZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDMgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA2OgogICAgaXR4bl9zdWJtaXQKICAgIGIgZW5zdXJlX2J1ZGdldF93aGlsZV90b3BAMQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQ6CiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANgoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDM6CiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDYKCmVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANzoKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [4035], "errorMessage": "Can not distribute zero units"}, {"pc": [3053], "errorMessage": "Coupon rates are not properly defined"}, {"pc": [2910], "errorMessage": "D-ASA already configured"}, {"pc": [1622], "errorMessage": "Defaulted"}, {"pc": [2930], "errorMessage": "Denomination asset is not properly set"}, {"pc": [2947], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset"}, {"pc": [1389, 1400, 1407, 1418, 1425, 1436, 1443, 1469, 1491, 1515, 1533, 1600, 1712, 1744, 1768, 1793, 1798, 1816, 1954, 1994, 2031, 2045, 2089, 2101, 2173, 2222, 2253, 2338, 2381, 2399, 2502, 2575, 2581, 2710, 2802, 2808, 3114, 3123, 3131, 3168, 3204, 3245, 3260, 3356, 3394, 3847, 3864, 3901, 3988, 4005, 4064, 4155, 4172, 4239, 4256], "errorMessage": "Index access is out of bounds"}, {"pc": [4049], "errorMessage": "Insufficient remaining D-ASA units"}, {"pc": [1396], "errorMessage": "Insufficient sender units to transfer"}, {"pc": [3042], "errorMessage": "Interest rate is not properly defined"}, {"pc": [1339, 1351, 2027, 2335, 2489, 2691, 3807, 3897, 4024, 4202, 4496], "errorMessage": "Invalid account holding address"}, {"pc": [3517, 3539, 3559, 3579, 3599, 3705, 3722, 3737, 3752, 3767], "errorMessage": "Invalid account role address"}, {"pc": [2514], "errorMessage": "Invalid amount of units for the account"}, {"pc": [3021], "errorMessage": "Invalid day-count convention ID"}, {"pc": [3481, 3673], "errorMessage": "Invalid role identifier"}, {"pc": [3400], "errorMessage": "Invalid secondary market closure date"}, {"pc": [3364], "errorMessage": "Invalid secondary market opening date"}, {"pc": [2985], "errorMessage": "Minimum denomination is not a divisor of principal"}, {"pc": [2038, 2342], "errorMessage": "No D-ASA units"}, {"pc": [2055], "errorMessage": "No due coupon to pay"}, {"pc": [1321, 2011, 2319, 2892, 3311, 3791, 3874, 4015, 4182, 4266], "errorMessage": "Not authorized"}, {"pc": [2279], "errorMessage": "Not enough funds for the payment"}, {"pc": [2351], "errorMessage": "Not mature"}, {"pc": [783, 799, 815, 831, 850, 866, 881, 903, 922, 944, 963, 985, 1007, 1032, 1051, 1110, 1129, 1145, 1164, 1180, 1202, 1224, 1246], "errorMessage": "OnCompletion is not NoOp"}, {"pc": [1095], "errorMessage": "OnCompletion is not UpdateApplication"}, {"pc": [1775, 2059, 2358], "errorMessage": "Pending due coupon payment"}, {"pc": [3969], "errorMessage": "Primary distribution is closed"}, {"pc": [2478], "errorMessage": "Primary distribution not yet executed"}, {"pc": [1315], "errorMessage": "Secondary market is closed"}, {"pc": [1451], "errorMessage": "Sender and receiver units are not fungible"}, {"pc": [1368, 1384, 1633], "errorMessage": "Suspended operations"}, {"pc": [3088, 3320], "errorMessage": "Time events length is invalid"}, {"pc": [3211], "errorMessage": "Time events must be set in the future"}, {"pc": [3266], "errorMessage": "Time events must be sorted in strictly ascending order"}, {"pc": [3179], "errorMessage": "Time periods are not properly defined"}, {"pc": [3287], "errorMessage": "Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)"}, {"pc": [575], "errorMessage": "Wrong Global Bytes allocation"}, {"pc": [581], "errorMessage": "Wrong Global UInts allocation"}, {"pc": [585], "errorMessage": "Wrong Local Bytes allocation"}, {"pc": [589], "errorMessage": "Wrong Local UInts allocation"}, {"pc": [2275], "errorMessage": "account opted into asset"}, {"pc": [2922], "errorMessage": "asset exists"}, {"pc": [1114], "errorMessage": "can only call when creating"}, {"pc": [786, 802, 818, 834, 853, 869, 884, 906, 925, 947, 966, 988, 1010, 1035, 1054, 1098, 1132, 1148, 1167, 1183, 1205, 1227, 1249], "errorMessage": "can only call when not creating"}, {"pc": [1355, 1371, 1388, 1399, 1406, 1417, 1424, 1435, 1442, 1468, 1490, 1502, 1514, 1526, 1532, 1544, 1555, 1582, 1594, 1598, 1767, 1993, 2030, 2044, 2088, 2100, 2111, 2172, 2191, 2221, 2337, 2380, 2398, 2409, 2501, 2709, 3900, 4063, 4073, 4090, 4205, 4498], "errorMessage": "check self.account entry exists"}, {"pc": [3846, 3863], "errorMessage": "check self.account_manager entry exists"}, {"pc": [2890], "errorMessage": "check self.arranger exists"}, {"pc": [4154, 4171], "errorMessage": "check self.authority entry exists"}, {"pc": [2157, 2391, 2441, 3911, 4039, 4053, 4103, 4346, 4396], "errorMessage": "check self.circulating_units exists"}, {"pc": [1805, 2243, 2673], "errorMessage": "check self.coupon_rates exists"}, {"pc": [1878, 3271, 4364], "errorMessage": "check self.day_count_convention exists"}, {"pc": [1620, 4323], "errorMessage": "check self.defaulted exists"}, {"pc": [2943, 4335], "errorMessage": "check self.denomination_asset_id exists"}, {"pc": [1650, 1694], "errorMessage": "check self.due_coupons_watermark exists"}, {"pc": [4382], "errorMessage": "check self.interest_rate exists"}, {"pc": [1683, 1853, 2623, 2633, 3347, 4414], "errorMessage": "check self.issuance_date exists"}, {"pc": [1655, 2349, 3373, 3381, 4297, 4420], "errorMessage": "check self.maturity_date exists"}, {"pc": [4555], "errorMessage": "check self.metadata exists"}, {"pc": [2120, 2153], "errorMessage": "check self.paid_coupon_units exists"}, {"pc": [3987, 4004], "errorMessage": "check self.primary_dealer entry exists"}, {"pc": [3961, 4408], "errorMessage": "check self.primary_distribution_closure_date exists"}, {"pc": [2462, 2472, 3947, 4402], "errorMessage": "check self.primary_distribution_opening_date exists"}, {"pc": [3036, 4373], "errorMessage": "check self.principal_discount exists"}, {"pc": [1307, 3415, 4538], "errorMessage": "check self.secondary_market_closure_date exists"}, {"pc": [1293, 3409, 4532], "errorMessage": "check self.secondary_market_opening_date exists"}, {"pc": [2180, 2272, 2291, 2959, 4341], "errorMessage": "check self.settlement_asset_id exists"}, {"pc": [1283, 2008, 2316, 2661, 2697, 2908, 3306, 3786, 3937, 4508], "errorMessage": "check self.status exists"}, {"pc": [1631, 4426], "errorMessage": "check self.suspended exists"}, {"pc": [1704, 1736, 1946, 4520], "errorMessage": "check self.time_events exists"}, {"pc": [1667, 1965, 2642, 2721, 2818, 3062, 3083, 3150], "errorMessage": "check self.total_coupons exists"}, {"pc": [4047, 4099, 4391], "errorMessage": "check self.total_units exists"}, {"pc": [4238, 4255], "errorMessage": "check self.trustee entry exists"}, {"pc": [4085, 4351, 4358], "errorMessage": "check self.unit_value exists"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" APP_SPEC = algokit_utils.Arc56Contract.from_json(_APP_SPEC_JSON) def _parse_abi_args(args: typing.Any | None = None) -> list[typing.Any] | None: @@ -96,13 +96,19 @@ class AssetMetadata: prospectus_hash: bytes prospectus_url: str +@dataclasses.dataclass(frozen=True) +class DayCountFactor: + """Struct for DayCountFactor""" + numerator: int + denominator: int + @dataclasses.dataclass(frozen=True) class CouponsInfo: """Struct for CouponsInfo""" total_coupons: int due_coupons: int next_coupon_due_date: int - day_count_factor: tuple[int, int] + day_count_factor: DayCountFactor all_due_coupons_paid: bool @dataclasses.dataclass(frozen=True) @@ -110,7 +116,7 @@ class CurrentUnitsValue: """Struct for CurrentUnitsValue""" units_value: int accrued_interest: int - day_count_factor: tuple[int, int] + day_count_factor: DayCountFactor @dataclasses.dataclass(frozen=True) class PaymentAmounts: @@ -125,6 +131,12 @@ class PaymentResult: timestamp: int context: bytes +@dataclasses.dataclass(frozen=True) +class RoleConfig: + """Struct for RoleConfig""" + role_validity_start: int + role_validity_end: int + @dataclasses.dataclass(frozen=True) class SecondaryMarketSchedule: """Struct for SecondaryMarketSchedule""" @@ -1339,27 +1351,33 @@ def clear_state( class GlobalStateValue(typing.TypedDict): """Shape of global_state state key values""" arranger: bytes - circulating_units: int - day_count_convention: int - defaulted: int denomination_asset_id: int - due_coupons_watermark: int - interest_rate: int - issuance_date: int - maturity_date: int + settlement_asset_id: int + unit_value: int + day_count_convention: int metadata: bytes - paid_coupon_units: int - primary_distribution_closure_date: int - primary_distribution_opening_date: int + total_units: int + circulating_units: int principal_discount: int - secondary_market_closure_date: int + interest_rate: int + total_coupons: int + primary_distribution_opening_date: int + primary_distribution_closure_date: int + issuance_date: int secondary_market_opening_date: int - settlement_asset_id: int + secondary_market_closure_date: int + maturity_date: int status: int suspended: int - total_coupons: int - total_units: int - unit_value: int + defaulted: int + due_coupons_watermark: int + paid_coupon_units: int + +class BoxStateValue(typing.TypedDict): + """Shape of box state key values""" + coupon_rates: list[int] + time_events: list[int] + time_periods: list[tuple[int, int]] class FixedCouponBondState: """Methods to access state for the current FixedCouponBond app""" @@ -1374,6 +1392,13 @@ def global_state( """Methods to access global_state for the current app""" return _GlobalState(self.app_client) + @property + def box( + self + ) -> "_BoxState": + """Methods to access box for the current app""" + return _BoxState(self.app_client) + class _GlobalState: def __init__(self, app_client: algokit_utils.AppClient): self.app_client = app_client @@ -1406,89 +1431,81 @@ def arranger(self) -> bytes: return typing.cast(bytes, value) @property - def circulating_units(self) -> int: - """Get the current value of the circulating_units key in global_state state""" - value = self.app_client.state.global_state.get_value("circulating_units") + def denomination_asset_id(self) -> int: + """Get the current value of the denomination_asset_id key in global_state state""" + value = self.app_client.state.global_state.get_value("denomination_asset_id") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def day_count_convention(self) -> int: - """Get the current value of the day_count_convention key in global_state state""" - value = self.app_client.state.global_state.get_value("day_count_convention") + def settlement_asset_id(self) -> int: + """Get the current value of the settlement_asset_id key in global_state state""" + value = self.app_client.state.global_state.get_value("settlement_asset_id") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def defaulted(self) -> int: - """Get the current value of the defaulted key in global_state state""" - value = self.app_client.state.global_state.get_value("defaulted") + def unit_value(self) -> int: + """Get the current value of the unit_value key in global_state state""" + value = self.app_client.state.global_state.get_value("unit_value") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def denomination_asset_id(self) -> int: - """Get the current value of the denomination_asset_id key in global_state state""" - value = self.app_client.state.global_state.get_value("denomination_asset_id") + def day_count_convention(self) -> int: + """Get the current value of the day_count_convention key in global_state state""" + value = self.app_client.state.global_state.get_value("day_count_convention") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def due_coupons_watermark(self) -> int: - """Get the current value of the due_coupons_watermark key in global_state state""" - value = self.app_client.state.global_state.get_value("due_coupons_watermark") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + def metadata(self) -> bytes: + """Get the current value of the metadata key in global_state state""" + value = self.app_client.state.global_state.get_value("metadata") + if isinstance(value, dict) and "AVMBytes" in self._struct_classes: + return self._struct_classes["AVMBytes"](**value) # type: ignore + return typing.cast(bytes, value) @property - def interest_rate(self) -> int: - """Get the current value of the interest_rate key in global_state state""" - value = self.app_client.state.global_state.get_value("interest_rate") + def total_units(self) -> int: + """Get the current value of the total_units key in global_state state""" + value = self.app_client.state.global_state.get_value("total_units") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def issuance_date(self) -> int: - """Get the current value of the issuance_date key in global_state state""" - value = self.app_client.state.global_state.get_value("issuance_date") + def circulating_units(self) -> int: + """Get the current value of the circulating_units key in global_state state""" + value = self.app_client.state.global_state.get_value("circulating_units") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def maturity_date(self) -> int: - """Get the current value of the maturity_date key in global_state state""" - value = self.app_client.state.global_state.get_value("maturity_date") + def principal_discount(self) -> int: + """Get the current value of the principal_discount key in global_state state""" + value = self.app_client.state.global_state.get_value("principal_discount") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def metadata(self) -> bytes: - """Get the current value of the metadata key in global_state state""" - value = self.app_client.state.global_state.get_value("metadata") - if isinstance(value, dict) and "AVMBytes" in self._struct_classes: - return self._struct_classes["AVMBytes"](**value) # type: ignore - return typing.cast(bytes, value) - - @property - def paid_coupon_units(self) -> int: - """Get the current value of the paid_coupon_units key in global_state state""" - value = self.app_client.state.global_state.get_value("paid_coupon_units") + def interest_rate(self) -> int: + """Get the current value of the interest_rate key in global_state state""" + value = self.app_client.state.global_state.get_value("interest_rate") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def primary_distribution_closure_date(self) -> int: - """Get the current value of the primary_distribution_closure_date key in global_state state""" - value = self.app_client.state.global_state.get_value("primary_distribution_closure_date") + def total_coupons(self) -> int: + """Get the current value of the total_coupons key in global_state state""" + value = self.app_client.state.global_state.get_value("total_coupons") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @@ -1502,17 +1519,17 @@ def primary_distribution_opening_date(self) -> int: return typing.cast(int, value) @property - def principal_discount(self) -> int: - """Get the current value of the principal_discount key in global_state state""" - value = self.app_client.state.global_state.get_value("principal_discount") + def primary_distribution_closure_date(self) -> int: + """Get the current value of the primary_distribution_closure_date key in global_state state""" + value = self.app_client.state.global_state.get_value("primary_distribution_closure_date") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def secondary_market_closure_date(self) -> int: - """Get the current value of the secondary_market_closure_date key in global_state state""" - value = self.app_client.state.global_state.get_value("secondary_market_closure_date") + def issuance_date(self) -> int: + """Get the current value of the issuance_date key in global_state state""" + value = self.app_client.state.global_state.get_value("issuance_date") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @@ -1526,9 +1543,17 @@ def secondary_market_opening_date(self) -> int: return typing.cast(int, value) @property - def settlement_asset_id(self) -> int: - """Get the current value of the settlement_asset_id key in global_state state""" - value = self.app_client.state.global_state.get_value("settlement_asset_id") + def secondary_market_closure_date(self) -> int: + """Get the current value of the secondary_market_closure_date key in global_state state""" + value = self.app_client.state.global_state.get_value("secondary_market_closure_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + + @property + def maturity_date(self) -> int: + """Get the current value of the maturity_date key in global_state state""" + value = self.app_client.state.global_state.get_value("maturity_date") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @@ -1550,29 +1575,168 @@ def suspended(self) -> int: return typing.cast(int, value) @property - def total_coupons(self) -> int: - """Get the current value of the total_coupons key in global_state state""" - value = self.app_client.state.global_state.get_value("total_coupons") + def defaulted(self) -> int: + """Get the current value of the defaulted key in global_state state""" + value = self.app_client.state.global_state.get_value("defaulted") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def total_units(self) -> int: - """Get the current value of the total_units key in global_state state""" - value = self.app_client.state.global_state.get_value("total_units") + def due_coupons_watermark(self) -> int: + """Get the current value of the due_coupons_watermark key in global_state state""" + value = self.app_client.state.global_state.get_value("due_coupons_watermark") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def unit_value(self) -> int: - """Get the current value of the unit_value key in global_state state""" - value = self.app_client.state.global_state.get_value("unit_value") + def paid_coupon_units(self) -> int: + """Get the current value of the paid_coupon_units key in global_state state""" + value = self.app_client.state.global_state.get_value("paid_coupon_units") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) +class _BoxState: + def __init__(self, app_client: algokit_utils.AppClient): + self.app_client = app_client + + # Pre-generated mapping of value types to their struct classes + self._struct_classes: dict[str, typing.Type[typing.Any]] = { + "RoleConfig": RoleConfig, + "AccountInfo": AccountInfo + } + + def get_all(self) -> BoxStateValue: + """Get all current keyed values from box state""" + result = self.app_client.state.box.get_all() + if not result: + return typing.cast(BoxStateValue, {}) + + converted = {} + for key, value in result.items(): + key_info = self.app_client.app_spec.state.keys.box.get(key) + struct_class = self._struct_classes.get(key_info.value_type) if key_info else None + converted[key] = ( + struct_class(**value) if struct_class and isinstance(value, dict) + else value + ) + return typing.cast(BoxStateValue, converted) + + @property + def coupon_rates(self) -> list[int]: + """Get the current value of the coupon_rates key in box state""" + value = self.app_client.state.box.get_value("coupon_rates") + if isinstance(value, dict) and "uint16[]" in self._struct_classes: + return self._struct_classes["uint16[]"](**value) # type: ignore + return typing.cast(list[int], value) + + @property + def time_events(self) -> list[int]: + """Get the current value of the time_events key in box state""" + value = self.app_client.state.box.get_value("time_events") + if isinstance(value, dict) and "uint64[]" in self._struct_classes: + return self._struct_classes["uint64[]"](**value) # type: ignore + return typing.cast(list[int], value) + + @property + def time_periods(self) -> list[tuple[int, int]]: + """Get the current value of the time_periods key in box state""" + value = self.app_client.state.box.get_value("time_periods") + if isinstance(value, dict) and "(uint64,uint64)[]" in self._struct_classes: + return self._struct_classes["(uint64,uint64)[]"](**value) # type: ignore + return typing.cast(list[tuple[int, int]], value) + + @property + def account_manager(self) -> "_MapState[str, RoleConfig]": + """Get values from the account_manager map in box state""" + return _MapState( + self.app_client.state.box, + "account_manager", + self._struct_classes.get("RoleConfig") + ) + + @property + def primary_dealer(self) -> "_MapState[str, RoleConfig]": + """Get values from the primary_dealer map in box state""" + return _MapState( + self.app_client.state.box, + "primary_dealer", + self._struct_classes.get("RoleConfig") + ) + + @property + def trustee(self) -> "_MapState[str, RoleConfig]": + """Get values from the trustee map in box state""" + return _MapState( + self.app_client.state.box, + "trustee", + self._struct_classes.get("RoleConfig") + ) + + @property + def authority(self) -> "_MapState[str, RoleConfig]": + """Get values from the authority map in box state""" + return _MapState( + self.app_client.state.box, + "authority", + self._struct_classes.get("RoleConfig") + ) + + @property + def interest_oracle(self) -> "_MapState[str, RoleConfig]": + """Get values from the interest_oracle map in box state""" + return _MapState( + self.app_client.state.box, + "interest_oracle", + self._struct_classes.get("RoleConfig") + ) + + @property + def account(self) -> "_MapState[str, AccountInfo]": + """Get values from the account map in box state""" + return _MapState( + self.app_client.state.box, + "account", + self._struct_classes.get("AccountInfo") + ) + +_KeyType = typing.TypeVar("_KeyType") +_ValueType = typing.TypeVar("_ValueType") + +class _AppClientStateMethodsProtocol(typing.Protocol): + def get_map(self, map_name: str) -> dict[typing.Any, typing.Any]: + ... + def get_map_value(self, map_name: str, key: typing.Any) -> typing.Any | None: + ... + +class _MapState(typing.Generic[_KeyType, _ValueType]): + """Generic class for accessing state maps with strongly typed keys and values""" + + def __init__(self, state_accessor: _AppClientStateMethodsProtocol, map_name: str, + struct_class: typing.Type[_ValueType] | None = None): + self._state_accessor = state_accessor + self._map_name = map_name + self._struct_class = struct_class + + def get_map(self) -> dict[_KeyType, _ValueType]: + """Get all current values in the map""" + result = self._state_accessor.get_map(self._map_name) + if self._struct_class and result: + return {k: self._struct_class(**v) if isinstance(v, dict) else v + for k, v in result.items()} + return typing.cast(dict[_KeyType, _ValueType], result or {}) + + def get_value(self, key: _KeyType) -> _ValueType | None: + """Get a value from the map by key""" + key_value = dataclasses.asdict(key) if dataclasses.is_dataclass(key) else key # type: ignore + value = self._state_accessor.get_map_value(self._map_name, key_value) + if value is not None and self._struct_class and isinstance(value, dict): + return self._struct_class(**value) + return typing.cast(_ValueType | None, value) + + class FixedCouponBondClient: """Client for interacting with FixedCouponBond smart contract""" diff --git a/smart_contracts/artifacts/perpetual_bond/PerpetualBond.arc56.json b/smart_contracts/artifacts/perpetual_bond/PerpetualBond.arc56.json new file mode 100644 index 0000000..bc7fe27 --- /dev/null +++ b/smart_contracts/artifacts/perpetual_bond/PerpetualBond.arc56.json @@ -0,0 +1,1756 @@ +{ + "name": "PerpetualBond", + "structs": { + "AccountInfo": [ + { + "name": "payment_address", + "type": "address" + }, + { + "name": "units", + "type": "uint64" + }, + { + "name": "unit_value", + "type": "uint64" + }, + { + "name": "paid_coupons", + "type": "uint64" + }, + { + "name": "suspended", + "type": "bool" + } + ], + "AssetInfo": [ + { + "name": "denomination_asset_id", + "type": "uint64" + }, + { + "name": "settlement_asset_id", + "type": "uint64" + }, + { + "name": "outstanding_principal", + "type": "uint64" + }, + { + "name": "unit_value", + "type": "uint64" + }, + { + "name": "day_count_convention", + "type": "uint8" + }, + { + "name": "principal_discount", + "type": "uint16" + }, + { + "name": "interest_rate", + "type": "uint16" + }, + { + "name": "total_supply", + "type": "uint64" + }, + { + "name": "circulating_supply", + "type": "uint64" + }, + { + "name": "primary_distribution_opening_date", + "type": "uint64" + }, + { + "name": "primary_distribution_closure_date", + "type": "uint64" + }, + { + "name": "issuance_date", + "type": "uint64" + }, + { + "name": "maturity_date", + "type": "uint64" + }, + { + "name": "suspended", + "type": "bool" + }, + { + "name": "performance", + "type": "uint8" + } + ], + "AssetMetadata": [ + { + "name": "contract_type", + "type": "uint8" + }, + { + "name": "calendar", + "type": "uint8" + }, + { + "name": "business_day_convention", + "type": "uint8" + }, + { + "name": "end_of_month_convention", + "type": "uint8" + }, + { + "name": "prepayment_effect", + "type": "uint8" + }, + { + "name": "penalty_type", + "type": "uint8" + }, + { + "name": "prospectus_hash", + "type": "byte[32]" + }, + { + "name": "prospectus_url", + "type": "string" + } + ], + "CouponsInfo": [ + { + "name": "total_coupons", + "type": "uint64" + }, + { + "name": "due_coupons", + "type": "uint64" + }, + { + "name": "next_coupon_due_date", + "type": "uint64" + }, + { + "name": "day_count_factor", + "type": "DayCountFactor" + }, + { + "name": "all_due_coupons_paid", + "type": "bool" + } + ], + "CurrentUnitsValue": [ + { + "name": "units_value", + "type": "uint64" + }, + { + "name": "accrued_interest", + "type": "uint64" + }, + { + "name": "day_count_factor", + "type": "DayCountFactor" + } + ], + "DayCountFactor": [ + { + "name": "numerator", + "type": "uint64" + }, + { + "name": "denominator", + "type": "uint64" + } + ], + "PaymentAmounts": [ + { + "name": "interest", + "type": "uint64" + }, + { + "name": "principal", + "type": "uint64" + } + ], + "PaymentResult": [ + { + "name": "amount", + "type": "uint64" + }, + { + "name": "timestamp", + "type": "uint64" + }, + { + "name": "context", + "type": "byte[]" + } + ], + "RoleConfig": [ + { + "name": "role_validity_start", + "type": "uint64" + }, + { + "name": "role_validity_end", + "type": "uint64" + } + ], + "SecondaryMarketSchedule": [ + { + "name": "secondary_market_opening_date", + "type": "uint64" + }, + { + "name": "secondary_market_closure_date", + "type": "uint64" + } + ] + }, + "methods": [ + { + "name": "asset_transfer", + "args": [ + { + "type": "address", + "name": "sender_holding_address", + "desc": "Sender Account Holding Address" + }, + { + "type": "address", + "name": "receiver_holding_address", + "desc": "Receiver Account Holding Address" + }, + { + "type": "uint64", + "name": "units", + "desc": "Amount of D-ASA units to transfer" + } + ], + "returns": { + "type": "uint64", + "desc": "Transferred actualized value in denomination asset" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Transfer D-ASA units between accounts", + "events": [], + "recommendations": {} + }, + { + "name": "pay_coupon", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + }, + { + "type": "byte[]", + "name": "payment_info", + "desc": "Additional payment information (Optional)" + } + ], + "returns": { + "type": "(uint64,uint64,byte[])", + "struct": "PaymentResult", + "desc": "Paid coupon amount in denomination asset, Payment timestamp, Payment context" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Pay due coupon to an account", + "events": [], + "recommendations": {} + }, + { + "name": "update_interest_rate", + "args": [ + { + "type": "uint64", + "name": "interest_rate", + "desc": "Interest rate in bps" + } + ], + "returns": { + "type": "uint64", + "desc": "Timestamp of the update" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Update variable interest rates in bps", + "events": [], + "recommendations": {} + }, + { + "name": "get_account_units_current_value", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + }, + { + "type": "uint64", + "name": "units", + "desc": "Account's units for the current value calculation" + } + ], + "returns": { + "type": "(uint64,uint64,(uint64,uint64))", + "struct": "CurrentUnitsValue", + "desc": "Units current value in denomination asset, Accrued interest in denomination asset" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get account's units current value and accrued interest", + "events": [], + "recommendations": {} + }, + { + "name": "get_payment_amount", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + } + ], + "returns": { + "type": "(uint64,uint64)", + "struct": "PaymentAmounts", + "desc": "Interest amount in denomination asset, Principal amount in denomination asset" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get the next payment amount", + "events": [], + "recommendations": {} + }, + { + "name": "get_coupons_status", + "args": [], + "returns": { + "type": "(uint64,uint64,uint64,(uint64,uint64),bool)", + "struct": "CouponsInfo", + "desc": "Total coupons, Due coupons, Next coupon due date, (Day count factor numerator, Day count factor denominator), All due coupons paid" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get D-ASA coupons status", + "events": [], + "recommendations": {} + }, + { + "name": "get_time_periods", + "args": [], + "returns": { + "type": "(uint64,uint64)[]", + "desc": "Time periods" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get D-ASA time periods", + "events": [], + "recommendations": {} + }, + { + "name": "asset_create", + "args": [ + { + "type": "address", + "name": "arranger", + "desc": "D-ASA Arranger Address" + }, + { + "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", + "struct": "AssetMetadata", + "name": "metadata", + "desc": "D-ASA metadata" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "readonly": false, + "desc": "Create a new D-ASA", + "events": [], + "recommendations": {} + }, + { + "name": "asset_update", + "args": [ + { + "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", + "struct": "AssetMetadata", + "name": "metadata" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "UpdateApplication" + ] + }, + "readonly": false, + "desc": "Update D-ASA application.", + "events": [], + "recommendations": {} + }, + { + "name": "asset_config", + "args": [ + { + "type": "uint64", + "name": "denomination_asset_id", + "desc": "Denomination asset identifier" + }, + { + "type": "uint64", + "name": "settlement_asset_id", + "desc": "Settlement asset identifier" + }, + { + "type": "uint64", + "name": "principal", + "desc": "Principal, expressed in denomination asset" + }, + { + "type": "uint64", + "name": "principal_discount", + "desc": "Principal discount in bps" + }, + { + "type": "uint64", + "name": "minimum_denomination", + "desc": "Minimum denomination, expressed in denomination asset" + }, + { + "type": "uint8", + "name": "day_count_convention", + "desc": "Day-count convention for interests calculation" + }, + { + "type": "uint16", + "name": "interest_rate", + "desc": "Interest rate in bps" + }, + { + "type": "uint16[]", + "name": "coupon_rates", + "desc": "Coupon interest rates in bps" + }, + { + "type": "uint64[]", + "name": "time_events", + "desc": "Time events (strictly ascending order)" + }, + { + "type": "(uint64,uint64)[]", + "name": "time_periods", + "desc": "Time periods of recurring time events" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Configure the Debt Algorand Standard Application", + "events": [], + "recommendations": {} + }, + { + "name": "set_secondary_time_events", + "args": [ + { + "type": "uint64[]", + "name": "secondary_market_time_events", + "desc": "Secondary market time events (strictly ascending order)" + } + ], + "returns": { + "type": "(uint64,uint64)", + "struct": "SecondaryMarketSchedule", + "desc": "Secondary Market Opening Date, Secondary Market Closure Date" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Set secondary market time schedule", + "events": [], + "recommendations": {} + }, + { + "name": "assign_role", + "args": [ + { + "type": "address", + "name": "role_address", + "desc": "Account Role Address" + }, + { + "type": "uint8", + "name": "role", + "desc": "Role identifier" + }, + { + "type": "byte[]", + "name": "config", + "desc": "Role configuration (Optional)" + } + ], + "returns": { + "type": "uint64", + "desc": "Timestamp of the role assignment" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Assign a role to an address", + "events": [], + "recommendations": {} + }, + { + "name": "revoke_role", + "args": [ + { + "type": "address", + "name": "role_address", + "desc": "Account Role Address" + }, + { + "type": "uint8", + "name": "role", + "desc": "Role identifier" + } + ], + "returns": { + "type": "uint64", + "desc": "Timestamp of the role revocation" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Revoke a role from an address", + "events": [], + "recommendations": {} + }, + { + "name": "open_account", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + }, + { + "type": "address", + "name": "payment_address", + "desc": "Account Payment Address" + } + ], + "returns": { + "type": "uint64", + "desc": "Timestamp of the account opening" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Open D-ASA account", + "events": [], + "recommendations": {} + }, + { + "name": "close_account", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + } + ], + "returns": { + "type": "(uint64,uint64)", + "desc": "Closed units, Timestamp of the account closing" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Close D-ASA account", + "events": [], + "recommendations": {} + }, + { + "name": "primary_distribution", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + }, + { + "type": "uint64", + "name": "units", + "desc": "Amount of D-ASA units to distribute" + } + ], + "returns": { + "type": "uint64", + "desc": "Remaining D-ASA units to be distributed" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Distribute D-ASA units to accounts according the primary market", + "events": [], + "recommendations": {} + }, + { + "name": "set_asset_suspension", + "args": [ + { + "type": "bool", + "name": "suspended", + "desc": "Suspension status" + } + ], + "returns": { + "type": "uint64", + "desc": "Timestamp of the set asset suspension status" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Set asset suspension status", + "events": [], + "recommendations": {} + }, + { + "name": "set_account_suspension", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + }, + { + "type": "bool", + "name": "suspended", + "desc": "Suspension status" + } + ], + "returns": { + "type": "uint64", + "desc": "Timestamp of the set account suspension status" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Set account suspension status", + "events": [], + "recommendations": {} + }, + { + "name": "set_default_status", + "args": [ + { + "type": "bool", + "name": "defaulted", + "desc": "Default status" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Set D-ASA default status", + "events": [], + "recommendations": {} + }, + { + "name": "get_asset_info", + "args": [], + "returns": { + "type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", + "struct": "AssetInfo", + "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Performance" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get D-ASA info", + "events": [], + "recommendations": {} + }, + { + "name": "get_account_info", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + } + ], + "returns": { + "type": "(address,uint64,uint64,uint64,bool)", + "struct": "AccountInfo", + "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get account info", + "events": [], + "recommendations": {} + }, + { + "name": "get_time_events", + "args": [], + "returns": { + "type": "uint64[]", + "desc": "Time events" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get D-ASA time events", + "events": [], + "recommendations": {} + }, + { + "name": "get_secondary_market_schedule", + "args": [], + "returns": { + "type": "uint64[]", + "desc": "Secondary market schedule" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get secondary market schedule", + "events": [], + "recommendations": {} + }, + { + "name": "get_asset_metadata", + "args": [], + "returns": { + "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", + "struct": "AssetMetadata", + "desc": "Contract type, Calendar, Business day convention, End of month convention, Early repayment effect, Early repayment penalty type, Prospectus hash, Prospectus URL" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get D-ASA metadata", + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "desc": "\n Perpetual Bond, variable interest rate, not callable.\n ", + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 20, + "bytes": 2 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "arranger": { + "keyType": "AVMBytes", + "valueType": "AVMBytes", + "key": "UjIwIw==" + }, + "denomination_asset_id": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk" + }, + "settlement_asset_id": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "c2V0dGxlbWVudF9hc3NldF9pZA==" + }, + "unit_value": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "dW5pdF92YWx1ZQ==" + }, + "day_count_convention": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=" + }, + "metadata": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "bWV0YWRhdGE=" + }, + "total_units": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "dG90YWxfdW5pdHM=" + }, + "circulating_units": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "Y2lyY3VsYXRpbmdfdW5pdHM=" + }, + "principal_discount": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cHJpbmNpcGFsX2Rpc2NvdW50" + }, + "interest_rate": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "aW50ZXJlc3RfcmF0ZQ==" + }, + "total_coupons": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "dG90YWxfY291cG9ucw==" + }, + "primary_distribution_opening_date": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRl" + }, + "primary_distribution_closure_date": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRl" + }, + "issuance_date": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "aXNzdWFuY2VfZGF0ZQ==" + }, + "secondary_market_opening_date": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "c2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU=" + }, + "secondary_market_closure_date": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "c2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU=" + }, + "maturity_date": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "bWF0dXJpdHlfZGF0ZQ==" + }, + "status": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "c3RhdHVz" + }, + "suspended": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "c3VzcGVuZGVk" + }, + "defaulted": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "ZGVmYXVsdGVk" + }, + "coupon_period": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "Y291cG9uX3BlcmlvZA==" + }, + "paid_coupon_units": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cGFpZF9jb3Vwb25fdW5pdHM=" + } + }, + "local": {}, + "box": { + "coupon_rates": { + "keyType": "AVMBytes", + "valueType": "uint16[]", + "key": "Y291cG9uUmF0ZXM=" + }, + "time_events": { + "keyType": "AVMBytes", + "valueType": "uint64[]", + "key": "dGltZUV2ZW50cw==" + }, + "time_periods": { + "keyType": "AVMBytes", + "valueType": "(uint64,uint64)[]", + "key": "dGltZVBlcmlvZHM=" + } + } + }, + "maps": { + "global": {}, + "local": {}, + "box": { + "account_manager": { + "keyType": "address", + "valueType": "RoleConfig", + "prefix": "UjQwIw==" + }, + "primary_dealer": { + "keyType": "address", + "valueType": "RoleConfig", + "prefix": "UjUwIw==" + }, + "trustee": { + "keyType": "address", + "valueType": "RoleConfig", + "prefix": "UjYwIw==" + }, + "authority": { + "keyType": "address", + "valueType": "RoleConfig", + "prefix": "UjcwIw==" + }, + "interest_oracle": { + "keyType": "address", + "valueType": "RoleConfig", + "prefix": "UjgwIw==" + }, + "account": { + "keyType": "address", + "valueType": "AccountInfo", + "prefix": "UjMwIw==" + } + } + } + }, + "bareActions": { + "create": [], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 3821 + ], + "errorMessage": "Can not distribute zero units" + }, + { + "pc": [ + 2749 + ], + "errorMessage": "Coupon rates are not properly defined" + }, + { + "pc": [ + 2604 + ], + "errorMessage": "D-ASA already configured" + }, + { + "pc": [ + 1620 + ], + "errorMessage": "Defaulted" + }, + { + "pc": [ + 2624 + ], + "errorMessage": "Denomination asset is not properly set" + }, + { + "pc": [ + 2641 + ], + "errorMessage": "Different settlement asset not supported, must be equal to denomination asset" + }, + { + "pc": [ + 1387, + 1398, + 1405, + 1416, + 1423, + 1434, + 1441, + 1467, + 1489, + 1513, + 1531, + 1598, + 1676, + 1701, + 1706, + 1854, + 1891, + 1906, + 1921, + 1991, + 2024, + 2101, + 2132, + 2149, + 2242, + 2314, + 2320, + 2465, + 2471, + 2810, + 2819, + 2827, + 2864, + 2882, + 2886, + 2891, + 2915, + 2918, + 2950, + 3018, + 3033, + 3130, + 3168, + 3621, + 3638, + 3675, + 3774, + 3791, + 3850, + 3941, + 3958, + 4025, + 4042 + ], + "errorMessage": "Index access is out of bounds" + }, + { + "pc": [ + 3835 + ], + "errorMessage": "Insufficient remaining D-ASA units" + }, + { + "pc": [ + 1394 + ], + "errorMessage": "Insufficient sender units to transfer" + }, + { + "pc": [ + 2737 + ], + "errorMessage": "Interest rate is not properly defined" + }, + { + "pc": [ + 1337, + 1349, + 1887, + 2229, + 2391, + 3581, + 3671, + 3810, + 3988, + 4282 + ], + "errorMessage": "Invalid account holding address" + }, + { + "pc": [ + 3291, + 3313, + 3333, + 3353, + 3373, + 3479, + 3496, + 3511, + 3526, + 3541 + ], + "errorMessage": "Invalid account role address" + }, + { + "pc": [ + 2254 + ], + "errorMessage": "Invalid amount of units for the account" + }, + { + "pc": [ + 2716 + ], + "errorMessage": "Invalid day-count convention ID" + }, + { + "pc": [ + 3255, + 3447 + ], + "errorMessage": "Invalid role identifier" + }, + { + "pc": [ + 3174 + ], + "errorMessage": "Invalid secondary market closure date" + }, + { + "pc": [ + 3138 + ], + "errorMessage": "Invalid secondary market opening date" + }, + { + "pc": [ + 2679 + ], + "errorMessage": "Minimum denomination is not a divisor of principal" + }, + { + "pc": [ + 1898 + ], + "errorMessage": "No D-ASA units" + }, + { + "pc": [ + 1914 + ], + "errorMessage": "No due coupon to pay" + }, + { + "pc": [ + 1319, + 1871, + 2159, + 2586, + 3085, + 3565, + 3648, + 3801, + 3968, + 4052 + ], + "errorMessage": "Not authorized" + }, + { + "pc": [ + 1986 + ], + "errorMessage": "Not enough funds for the payment" + }, + { + "pc": [ + 784, + 800, + 816, + 832, + 851, + 867, + 882, + 904, + 923, + 945, + 964, + 986, + 1008, + 1033, + 1052, + 1111, + 1130, + 1146, + 1162, + 1181, + 1203, + 1222, + 1244 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 1096 + ], + "errorMessage": "OnCompletion is not UpdateApplication" + }, + { + "pc": [ + 1683, + 1918, + 2172 + ], + "errorMessage": "Pending due coupon payment" + }, + { + "pc": [ + 3755 + ], + "errorMessage": "Primary distribution is closed" + }, + { + "pc": [ + 2218 + ], + "errorMessage": "Primary distribution not yet executed" + }, + { + "pc": [ + 1313 + ], + "errorMessage": "Secondary market is closed" + }, + { + "pc": [ + 1449 + ], + "errorMessage": "Sender and receiver units are not fungible" + }, + { + "pc": [ + 1366, + 1382, + 1631 + ], + "errorMessage": "Suspended operations" + }, + { + "pc": [ + 2784, + 3094 + ], + "errorMessage": "Time events length is invalid" + }, + { + "pc": [ + 2957 + ], + "errorMessage": "Time events must be set in the future" + }, + { + "pc": [ + 3039 + ], + "errorMessage": "Time events must be sorted in strictly ascending order" + }, + { + "pc": [ + 2896 + ], + "errorMessage": "Time period durations must be strictly greater than zero" + }, + { + "pc": [ + 2898 + ], + "errorMessage": "Time period repetitions are not properly defined" + }, + { + "pc": [ + 2876 + ], + "errorMessage": "Time periods are not properly defined" + }, + { + "pc": [ + 3061 + ], + "errorMessage": "Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)" + }, + { + "pc": [ + 576 + ], + "errorMessage": "Wrong Global Bytes allocation" + }, + { + "pc": [ + 582 + ], + "errorMessage": "Wrong Global UInts allocation" + }, + { + "pc": [ + 586 + ], + "errorMessage": "Wrong Local Bytes allocation" + }, + { + "pc": [ + 590 + ], + "errorMessage": "Wrong Local UInts allocation" + }, + { + "pc": [ + 1982 + ], + "errorMessage": "account opted into asset" + }, + { + "pc": [ + 2616 + ], + "errorMessage": "asset exists" + }, + { + "pc": [ + 1115 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 787, + 803, + 819, + 835, + 854, + 870, + 885, + 907, + 926, + 948, + 967, + 989, + 1011, + 1036, + 1055, + 1099, + 1133, + 1149, + 1165, + 1184, + 1206, + 1225, + 1247 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 1353, + 1369, + 1386, + 1397, + 1404, + 1415, + 1422, + 1433, + 1440, + 1466, + 1488, + 1500, + 1512, + 1524, + 1530, + 1542, + 1553, + 1580, + 1592, + 1596, + 1675, + 1853, + 1890, + 1905, + 1920, + 1939, + 1990, + 2023, + 2034, + 2100, + 2241, + 3674, + 3849, + 3859, + 3876, + 3991, + 4284 + ], + "errorMessage": "check self.account entry exists" + }, + { + "pc": [ + 3620, + 3637 + ], + "errorMessage": "check self.account_manager entry exists" + }, + { + "pc": [ + 2584 + ], + "errorMessage": "check self.arranger exists" + }, + { + "pc": [ + 3940, + 3957 + ], + "errorMessage": "check self.authority entry exists" + }, + { + "pc": [ + 2086, + 3687, + 3696, + 3825, + 3839, + 3889, + 4132, + 4182 + ], + "errorMessage": "check self.circulating_units exists" + }, + { + "pc": [ + 1662, + 1767, + 1839 + ], + "errorMessage": "check self.coupon_period exists" + }, + { + "pc": [ + 1772, + 3044, + 4150 + ], + "errorMessage": "check self.day_count_convention exists" + }, + { + "pc": [ + 1618, + 4109 + ], + "errorMessage": "check self.defaulted exists" + }, + { + "pc": [ + 2637, + 4121 + ], + "errorMessage": "check self.denomination_asset_id exists" + }, + { + "pc": [ + 2131, + 2148 + ], + "errorMessage": "check self.interest_oracle entry exists" + }, + { + "pc": [ + 1721, + 1967, + 2401, + 4168 + ], + "errorMessage": "check self.interest_rate exists" + }, + { + "pc": [ + 1644, + 1653, + 1749, + 1834, + 2362, + 2372, + 3121, + 4200 + ], + "errorMessage": "check self.issuance_date exists" + }, + { + "pc": [ + 3147, + 3155, + 4083, + 4206 + ], + "errorMessage": "check self.maturity_date exists" + }, + { + "pc": [ + 4341 + ], + "errorMessage": "check self.metadata exists" + }, + { + "pc": [ + 2043, + 2082 + ], + "errorMessage": "check self.paid_coupon_units exists" + }, + { + "pc": [ + 3773, + 3790 + ], + "errorMessage": "check self.primary_dealer entry exists" + }, + { + "pc": [ + 3747, + 4194 + ], + "errorMessage": "check self.primary_distribution_closure_date exists" + }, + { + "pc": [ + 2202, + 2212, + 3733, + 4188 + ], + "errorMessage": "check self.primary_distribution_opening_date exists" + }, + { + "pc": [ + 2731, + 4159 + ], + "errorMessage": "check self.principal_discount exists" + }, + { + "pc": [ + 1305, + 3189, + 4324 + ], + "errorMessage": "check self.secondary_market_closure_date exists" + }, + { + "pc": [ + 1291, + 3183, + 4318 + ], + "errorMessage": "check self.secondary_market_opening_date exists" + }, + { + "pc": [ + 1928, + 1979, + 2001, + 2653, + 4127 + ], + "errorMessage": "check self.settlement_asset_id exists" + }, + { + "pc": [ + 1281, + 1868, + 2421, + 2532, + 2602, + 3080, + 3560, + 3723, + 4294 + ], + "errorMessage": "check self.status exists" + }, + { + "pc": [ + 1629, + 4212 + ], + "errorMessage": "check self.suspended exists" + }, + { + "pc": [ + 4306 + ], + "errorMessage": "check self.time_events exists" + }, + { + "pc": [ + 2544, + 2911 + ], + "errorMessage": "check self.time_periods exists" + }, + { + "pc": [ + 2481, + 2758, + 2779, + 2846 + ], + "errorMessage": "check self.total_coupons exists" + }, + { + "pc": [ + 3833, + 3885, + 4177 + ], + "errorMessage": "check self.total_units exists" + }, + { + "pc": [ + 4024, + 4041 + ], + "errorMessage": "check self.trustee entry exists" + }, + { + "pc": [ + 3871, + 4137, + 4144 + ], + "errorMessage": "check self.unit_value exists" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMucGVycGV0dWFsX2JvbmQuY29udHJhY3QuUGVycGV0dWFsQm9uZC5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAxMDAgNDQ4IDEwMDAwIDg2NDAwIDIwMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4NTIzMzMwMjMgInN0YXR1cyIgImNpcmN1bGF0aW5nX3VuaXRzIiAiaXNzdWFuY2VfZGF0ZSIgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbnRlcmVzdF9yYXRlIiAweDAwMDAwMDAwMDAwMDAwMDAgInRvdGFsX2NvdXBvbnMiICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiICJtYXR1cml0eV9kYXRlIiAweDAwICJ1bml0X3ZhbHVlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iICJ0b3RhbF91bml0cyIgInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIiAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiICJjb3Vwb25fcGVyaW9kIiAweDUyMzIzMDIzICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtZXRhZGF0YSIgInByaW5jaXBhbF9kaXNjb3VudCIgInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIgInN1c3BlbmRlZCIgImRlZmF1bHRlZCIgInBhaWRfY291cG9uX3VuaXRzIiAweDc0Njk2ZDY1NTA2NTcyNjk2ZjY0NzMgMHg1MjM4MzAyMyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczIDB4NTIzNzMwMjMgMHg1MjM2MzAyMyAweDUyMzUzMDIzIDB4NTIzNDMwMjMgMHgwMDAwIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MyAweDA2ODEwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDEtNDIKICAgIC8vICMgUm9sZSBCYXNlZCBBY2Nlc3MgQ29udHJvbAogICAgLy8gc2VsZi5hcnJhbmdlciA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfQVJSQU5HRVIpCiAgICBieXRlYyAxOCAvLyAweDUyMzIzMDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OS02MAogICAgLy8gIyBBc3NldCBDb25maWd1cmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxOSAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MQogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkID0gVUludDY0KCkKICAgIGJ5dGVjIDUgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBzZWxmLnVuaXRfdmFsdWUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTIgLy8gInVuaXRfdmFsdWUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUtNjYKICAgIC8vICMgTWV0YWRhdGEKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBCeXRlcygpCiAgICBieXRlYyAyMCAvLyAibWV0YWRhdGEiCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OC02OQogICAgLy8gIyBTdXBwbHkKICAgIC8vIHNlbGYudG90YWxfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWMgMTQgLy8gInRvdGFsX3VuaXRzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MAogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzItNzMKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCA9IFVJbnQ2NCgpCiAgICBieXRlYyAyMSAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NS03NgogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDYgLy8gImludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgwCiAgICAvLyBzZWxmLnRvdGFsX2NvdXBvbnMgPSBVSW50NjQoKQogICAgYnl0ZWMgOCAvLyAidG90YWxfY291cG9ucyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODUKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDIyIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODgKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyLTkzCiAgICAvLyAjIFN0YXR1cwogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoY2ZnLlNUQVRVU19FTVBUWSkKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQKICAgIC8vIHNlbGYuc3VzcGVuZGVkID0gVUludDY0KCkKICAgIGJ5dGVjIDIzIC8vICJzdXNwZW5kZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1CiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IFVJbnQ2NCgpCiAgICBieXRlYyAyNCAvLyAiZGVmYXVsdGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzUtMzYKICAgIC8vICMgU3RhdGUgc2NoZW1hIHZhbGlkYXRpb24KICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV9ieXRlX3NsaWNlID09IGNmZy5HTE9CQUxfQllURVMsIGVyci5XUk9OR19HTE9CQUxfQllURVMKICAgIHR4biBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzcKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV91aW50ID09IGNmZy5HTE9CQUxfVUlOVFMsIGVyci5XUk9OR19HTE9CQUxfVUlOVFMKICAgIHR4biBHbG9iYWxOdW1VaW50CiAgICBwdXNoaW50IDIwIC8vIDIwCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBVSW50cyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzgKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkxPQ0FMX0JZVEVTLCBlcnIuV1JPTkdfTE9DQUxfQllURVMKICAgIHR4biBMb2NhbE51bUJ5dGVTbGljZQogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozOQogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fdWludCA9PSBjZmcuTE9DQUxfVUlOVFMsIGVyci5XUk9OR19MT0NBTF9VSU5UUwogICAgdHhuIExvY2FsTnVtVWludAogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIFVJbnRzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo0MS00MgogICAgLy8gIyBDb3Vwb25zCiAgICAvLyBzZWxmLmNvdXBvbl9wZXJpb2QgPSBVSW50NjQoKQogICAgYnl0ZWMgMTcgLy8gImNvdXBvbl9wZXJpb2QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo0MwogICAgLy8gc2VsZi5wYWlkX2NvdXBvbl91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAyNSAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2FmdGVyX2lmX2Vsc2VAMjkKICAgIHB1c2hieXRlc3MgMHg0ZmQ2YTNjYyAweDhjZjE0YjUxIDB4ODBlNTFlOWYgMHg0NDM2M2Q0OSAweDY3ZGI0ZjIwIDB4ZjZhOTZjOGQgMHgyMjliNzA2ZiAweDNmMGVmYzZjIDB4MjVkYmE5NWIgMHg4OTQ3NDEzNCAweDFkNmZjMjU1IDB4ZmVmNzQ1NjcgMHhiOGZjMTM5MCAweDNkNDNkMWYwIDB4ZWJkOTZiMmYgMHg2Yzg1ZTNlZSAweGY2M2FjZThkIDB4YmJjY2ExOGEgMHgxYTdiYWJiNCAweDQwMmRiYTQ3IDB4ZWQwMjc1OWYgMHhmYWQyMTczZSAweDA4ZWZlYTM1IDB4ZTRhNWFiNTQgLy8gbWV0aG9kICJhc3NldF90cmFuc2ZlcihhZGRyZXNzLGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAicGF5X2NvdXBvbihhZGRyZXNzLGJ5dGVbXSkodWludDY0LHVpbnQ2NCxieXRlW10pIiwgbWV0aG9kICJ1cGRhdGVfaW50ZXJlc3RfcmF0ZSh1aW50NjQpdWludDY0IiwgbWV0aG9kICJnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlKGFkZHJlc3MsdWludDY0KSh1aW50NjQsdWludDY0LCh1aW50NjQsdWludDY0KSkiLCBtZXRob2QgImdldF9wYXltZW50X2Ftb3VudChhZGRyZXNzKSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiZ2V0X2NvdXBvbnNfc3RhdHVzKCkodWludDY0LHVpbnQ2NCx1aW50NjQsKHVpbnQ2NCx1aW50NjQpLGJvb2wpIiwgbWV0aG9kICJnZXRfdGltZV9wZXJpb2RzKCkodWludDY0LHVpbnQ2NClbXSIsIG1ldGhvZCAiYXNzZXRfY3JlYXRlKGFkZHJlc3MsKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LGJ5dGVbMzJdLHN0cmluZykpdm9pZCIsIG1ldGhvZCAiYXNzZXRfdXBkYXRlKCh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCxieXRlWzMyXSxzdHJpbmcpKXZvaWQiLCBtZXRob2QgImFzc2V0X2NvbmZpZyh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQxNix1aW50MTZbXSx1aW50NjRbXSwodWludDY0LHVpbnQ2NClbXSl2b2lkIiwgbWV0aG9kICJzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKHVpbnQ2NFtdKSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiYXNzaWduX3JvbGUoYWRkcmVzcyx1aW50OCxieXRlW10pdWludDY0IiwgbWV0aG9kICJyZXZva2Vfcm9sZShhZGRyZXNzLHVpbnQ4KXVpbnQ2NCIsIG1ldGhvZCAib3Blbl9hY2NvdW50KGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImNsb3NlX2FjY291bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAic2V0X2Fzc2V0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInNldF9hY2NvdW50X3N1c3BlbnNpb24oYWRkcmVzcyxib29sKXVpbnQ2NCIsIG1ldGhvZCAic2V0X2RlZmF1bHRfc3RhdHVzKGJvb2wpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2luZm8oKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQxNix1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X2FjY291bnRfaW5mbyhhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wpIiwgbWV0aG9kICJnZXRfdGltZV9ldmVudHMoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSgpdWludDY0W10iLCBtZXRob2QgImdldF9hc3NldF9tZXRhZGF0YSgpKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LGJ5dGVbMzJdLHN0cmluZykiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2Fzc2V0X3RyYW5zZmVyX3JvdXRlQDUgbWFpbl9wYXlfY291cG9uX3JvdXRlQDYgbWFpbl91cGRhdGVfaW50ZXJlc3RfcmF0ZV9yb3V0ZUA3IG1haW5fZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9yb3V0ZUA4IG1haW5fZ2V0X3BheW1lbnRfYW1vdW50X3JvdXRlQDkgbWFpbl9nZXRfY291cG9uc19zdGF0dXNfcm91dGVAMTAgbWFpbl9nZXRfdGltZV9wZXJpb2RzX3JvdXRlQDExIG1haW5fYXNzZXRfY3JlYXRlX3JvdXRlQDEyIG1haW5fYXNzZXRfdXBkYXRlX3JvdXRlQDEzIG1haW5fYXNzZXRfY29uZmlnX3JvdXRlQDE0IG1haW5fc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19yb3V0ZUAxNSBtYWluX2Fzc2lnbl9yb2xlX3JvdXRlQDE2IG1haW5fcmV2b2tlX3JvbGVfcm91dGVAMTcgbWFpbl9vcGVuX2FjY291bnRfcm91dGVAMTggbWFpbl9jbG9zZV9hY2NvdW50X3JvdXRlQDE5IG1haW5fcHJpbWFyeV9kaXN0cmlidXRpb25fcm91dGVAMjAgbWFpbl9zZXRfYXNzZXRfc3VzcGVuc2lvbl9yb3V0ZUAyMSBtYWluX3NldF9hY2NvdW50X3N1c3BlbnNpb25fcm91dGVAMjIgbWFpbl9zZXRfZGVmYXVsdF9zdGF0dXNfcm91dGVAMjMgbWFpbl9nZXRfYXNzZXRfaW5mb19yb3V0ZUAyNCBtYWluX2dldF9hY2NvdW50X2luZm9fcm91dGVAMjUgbWFpbl9nZXRfdGltZV9ldmVudHNfcm91dGVAMjYgbWFpbl9nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZV9yb3V0ZUAyNyBtYWluX2dldF9hc3NldF9tZXRhZGF0YV9yb3V0ZUAyOAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIGludGNfMCAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21ldGFkYXRhX3JvdXRlQDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYXNzZXRfbWV0YWRhdGEKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGVfcm91dGVAMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF90aW1lX2V2ZW50c19yb3V0ZUAyNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X3RpbWVfZXZlbnRzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hY2NvdW50X2luZm9fcm91dGVAMjU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2FjY291bnRfaW5mbwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfaW5mb19yb3V0ZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2luZm8KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0X2RlZmF1bHRfc3RhdHVzX3JvdXRlQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9kZWZhdWx0X3N0YXR1cwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfYWNjb3VudF9zdXNwZW5zaW9uX3JvdXRlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9hY2NvdW50X3N1c3BlbnNpb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0X2Fzc2V0X3N1c3BlbnNpb25fcm91dGVAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X2Fzc2V0X3N1c3BlbnNpb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcHJpbWFyeV9kaXN0cmlidXRpb25fcm91dGVAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODAxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcHJpbWFyeV9kaXN0cmlidXRpb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fY2xvc2VfYWNjb3VudF9yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBjbG9zZV9hY2NvdW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX29wZW5fYWNjb3VudF9yb3V0ZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBvcGVuX2FjY291bnQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcmV2b2tlX3JvbGVfcm91dGVAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2ODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcmV2b2tlX3JvbGUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzaWduX3JvbGVfcm91dGVAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYXNzaWduX3JvbGUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19yb3V0ZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Fzc2V0X2NvbmZpZ19yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYXNzZXRfY29uZmlnCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Fzc2V0X3VwZGF0ZV9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgVXBkYXRlQXBwbGljYXRpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgY2FsbHN1YiBhc3NldF91cGRhdGUKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzZXRfY3JlYXRlX3JvdXRlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGNhbGxzdWIgYXNzZXRfY3JlYXRlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF90aW1lX3BlcmlvZHNfcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzkzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfdGltZV9wZXJpb2RzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9jb3Vwb25zX3N0YXR1c19yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9jb3Vwb25zX3N0YXR1cwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfcGF5bWVudF9hbW91bnRfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9wYXltZW50X2Ftb3VudAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3VwZGF0ZV9pbnRlcmVzdF9yYXRlX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiB1cGRhdGVfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9wYXlfY291cG9uX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBwYXlfY291cG9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Fzc2V0X3RyYW5zZmVyX3JvdXRlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTQ1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxNDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NldF90cmFuc2ZlcgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5wZXJwZXR1YWxfYm9uZC5jb250cmFjdC5QZXJwZXR1YWxCb25kLmFzc2V0X3RyYW5zZmVyKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCByZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogYnl0ZXMpIC0+IGJ5dGVzOgphc3NldF90cmFuc2ZlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxNDUtMTUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhc3NldF90cmFuc2ZlcigKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIHNlbmRlcl9ob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywKICAgIC8vICAgICByZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywKICAgIC8vICAgICB1bml0czogYXJjNC5VSW50NjQsCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMyAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAyCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE3NgogICAgLy8gdW5pdHMubmF0aXZlLAogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDQKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjXzMgLy8gMTAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk4LTMwMQogICAgLy8gc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5OQogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk5LTMwMAogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk5LTMwMQogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzAxCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDAtMzAxCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBmcmFtZV9kaWcgNAogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk5LTMwMQogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANQogICAgaW50Y18xIC8vIDEKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5Ny0zMDIKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vICAgICBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuU0VDT05EQVJZX01BUktFVF9DTE9TRUQKICAgIGFzc2VydCAvLyBTZWNvbmRhcnkgbWFya2V0IGlzIGNsb3NlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzc2LTM3OAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0cmFuc2ZlciByaWdodCB0byBELUFTQSBvd25lcnMuIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgcmVsYXkgb24gb3RoZXIKICAgIC8vICMgcm9sZXMsIGV4dGVybmFsIEFwcHMgdGhyb3VnaCBDMkMgY2FsbHMgKGUuZy4sIGFuIG9yZGVyIGJvb2spLCBvciBvZmYtY2hhaW4gdHJhbnNmZXIgYWdlbnRzLgogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VuZGVyX2hvbGRpbmdfYWRkcmVzcy5uYXRpdmUsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMwogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzc5CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM4MAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkLm5hdGl2ZSwgZXJyLlNVU1BFTkRFRAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjIDQgLy8gNDQ4CiAgICBnZXRiaXQKICAgIGJ5dGVjIDExIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozODQtMzg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFsKICAgIC8vICAgICByZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MKICAgIC8vIF0uc3VzcGVuZGVkLm5hdGl2ZSwgZXJyLlNVU1BFTkRFRAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50YyA0IC8vIDQ0OAogICAgZ2V0Yml0CiAgICBieXRlYyAxMSAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzg4CiAgICAvLyB1bml0cyA8PSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyA1CiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzg3LTM4OQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB1bml0cyA8PSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICAvLyApLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM5NwogICAgLy8gc2VuZGVyX3VuaXRfdmFsdWUgPSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZQogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzk4CiAgICAvLyBpZiBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgPiAwOgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Vsc2VfYm9keUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA5CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA5LTMxMAogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxMAogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA5LTMxMAogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMTQKICAgIGludGNfMSAvLyAxCgphc3NldF90cmFuc2Zlcl9ib29sX21lcmdlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA4LTMxMQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgLy8gICAgIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIC8vICksIGVyci5OT05fRlVOR0lCTEVfVU5JVFMKICAgIGFzc2VydCAvLyBTZW5kZXIgYW5kIHJlY2VpdmVyIHVuaXRzIGFyZSBub3QgZnVuZ2libGUKCmFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTc5LTE4MAogICAgLy8gIyBUcmFuc2ZlciBpcyBmb3JiaWRkZW4gaW4gY2FzZSBvZiBwZW5kaW5nIGNvdXBvbiBwYXltZW50cwogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxODEKICAgIC8vIHNlbGYuYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgLTMKICAgIGRpZyAxCiAgICBjYWxsc3ViIGFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTgzLTE4NAogICAgLy8gIyBUcmFuc2ZlcnJlZCB1bml0cyB2YWx1ZSAobXVzdCBiZSBjb21wdXRlZCBiZWZvcmUgdGhlIHRyYW5zZmVyKQogICAgLy8gc2VuZGVyX3VuaXRfdmFsdWUgPSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE4NS0xODcKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZSwgZHVlX2NvdXBvbnMKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50CiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQzNAogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSAtIHVuaXRzCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkaWcgMgogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDMzLTQzNQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSAtIHVuaXRzCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzMKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzMtNDM1CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlIC0gdW5pdHMKICAgIC8vICkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDMyCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDM3CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cwogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHVuY292ZXIgMwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDM2LTQzOAogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cwogICAgLy8gKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDM2CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzYtNDM4CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzCiAgICAvLyApCiAgICBzd2FwCiAgICByZXBsYWNlMiAzMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzYwCiAgICAvLyBpZiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgPT0gMDoKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBibnogYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAyMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzYxCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gYXJjNC5VSW50NjQoKQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICByZXBsYWNlMiA0MAogICAgZGlnIDEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM2MgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gYXJjNC5VSW50NjQoKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgNyAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIHJlcGxhY2UyIDQ4CiAgICBib3hfcHV0Cgphc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5MgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KHVuaXRzLm5hdGl2ZSAqIHNlbmRlcl91bml0X3ZhbHVlLm5hdGl2ZSArIGFjY3J1ZWRfaW50ZXJlc3QpCiAgICBmcmFtZV9kaWcgMAogICAgYnRvaQogICAgZnJhbWVfZGlnIDUKICAgICoKICAgIGZyYW1lX2RpZyAzCiAgICArCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAxNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VAMTUKCmFzc2V0X3RyYW5zZmVyX2Vsc2VfYm9keUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQwMwogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZSA9IHNlbmRlcl91bml0X3ZhbHVlCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZnJhbWVfZGlnIDAKICAgIHJlcGxhY2UyIDQwCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDA0LTQwNgogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50WwogICAgLy8gICAgIHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MKICAgIC8vIF0ucGFpZF9jb3Vwb25zCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50WwogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MDQtNDA2CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbCiAgICAvLyAgICAgc2VuZGVyX2hvbGRpbmdfYWRkcmVzcwogICAgLy8gXS5wYWlkX2NvdXBvbnMKICAgIHN3YXAKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHJlcGxhY2UyIDQ4CiAgICBib3hfcHV0CiAgICBiIGFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTcKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkgLT4gdm9pZDoKYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTAtMTExCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExMgogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmRlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI0IC8vICJkZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X3N1c3BlbmRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExNC0xMTUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTE2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjMgLy8gInN1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5wZXJwZXR1YWxfYm9uZC5jb250cmFjdC5QZXJwZXR1YWxCb25kLmNvdW50X2R1ZV9jb3Vwb25zKCkgLT4gdWludDY0Ogpjb3VudF9kdWVfY291cG9uczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo2Ni02NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBjb3VudF9kdWVfY291cG9ucyhzZWxmKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo2OAogICAgLy8gZHVlX2NvdXBvbnMgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NjkKICAgIC8vIGN1cnJlbnRfdHMgPSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NzAKICAgIC8vIGlmIGN1cnJlbnRfdHMgPiBzZWxmLmlzc3VhbmNlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgPgogICAgYnogY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NzEKICAgIC8vIGR1ZV9jb3Vwb25zID0gKGN1cnJlbnRfdHMgLSBzZWxmLmlzc3VhbmNlX2RhdGUpIC8vIHNlbGYuY291cG9uX3BlcmlvZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICAtCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImNvdXBvbl9wZXJpb2QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY291cG9uX3BlcmlvZCBleGlzdHMKICAgIC8KICAgIGZyYW1lX2J1cnkgMAoKY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjcyLTczCiAgICAvLyAgICAgIyBkaXYtYnktemVybzogY291cG9uX3BlcmlvZCAhPSAwIGR1ZSB0byBhc3NlcnRfdGltZV9wZXJpb2RzIGNoZWNrcwogICAgLy8gcmV0dXJuIGR1ZV9jb3Vwb25zCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMucGVycGV0dWFsX2JvbmQuY29udHJhY3QuUGVycGV0dWFsQm9uZC5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBkdWVfY291cG9uczogdWludDY0KSAtPiB2b2lkOgphc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo5NC05NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgZHVlX2NvdXBvbnM6IFVJbnQ2NAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6OTkKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9PSBkdWVfY291cG9ucwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgYj09CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6OTgtMTAwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9PSBkdWVfY291cG9ucwogICAgLy8gKSwgZXJyLlBFTkRJTkdfQ09VUE9OX1BBWU1FTlQKICAgIGFzc2VydCAvLyBQZW5kaW5nIGR1ZSBjb3Vwb24gcGF5bWVudAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQuYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IHVpbnQ2NCwgZHVlX2NvdXBvbnM6IHVpbnQ2NCkgLT4gdWludDY0OgphY2NydWVkX2ludGVyZXN0X2Ftb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMjctMTMwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCB1bml0czogVUludDY0LCBkdWVfY291cG9uczogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEzMS0xMzIKICAgIC8vICMgVGhlIGZvbGxvd2luZyBhc3NlcnQgc2FmZWd1YXJkcyB0aGUgc3Vicm91dGluZSBmcm9tIGZvcmJpZGRlbiBpbnZvY2F0aW9ucwogICAgLy8gc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChob2xkaW5nX2FkZHJlc3MsIGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMzMKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZGF5X2NvdW50X2ZhY3RvcgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gY291cG9uX2FjY3J1ZWRfcGVyaW9kID0gZGF5X2NvdW50X2ZhY3Rvci5udW1lcmF0b3IubmF0aXZlCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEzNQogICAgLy8gY291cG9uX3BlcmlvZCA9IGRheV9jb3VudF9mYWN0b3IuZGVub21pbmF0b3IubmF0aXZlCiAgICBzd2FwCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMzcKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgYWNjb3VudF91bml0c192YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTM3LTEzOAogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICAvLyAqIHNlbGYuaW50ZXJlc3RfcmF0ZQogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEzNy0xMzkKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgIC8vICogY291cG9uX2FjY3J1ZWRfcGVyaW9kCiAgICB1bmNvdmVyIDIKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxNDEKICAgIC8vIGNzdC5CUFMgKiBjb3Vwb25fcGVyaW9kCiAgICBpbnRjIDUgLy8gMTAwMDAKICAgIHVuY292ZXIgMgogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEzNy0xNDIKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgIC8vICogY291cG9uX2FjY3J1ZWRfcGVyaW9kCiAgICAvLyAvLyAoCiAgICAvLyAgICAgY3N0LkJQUyAqIGNvdXBvbl9wZXJpb2QKICAgIC8vICkgICMgZGl2LWJ5LXplcm86IGNvdXBvbl9wZXJpb2QgIT0gMCBkdWUgdG8gYXNzZXJ0X3RpbWVfcGVyaW9kcyBjaGVja3MKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMzYtMTQzCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gICAgICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAvLyAgICAgKiBjb3Vwb25fYWNjcnVlZF9wZXJpb2QKICAgIC8vICAgICAvLyAoCiAgICAvLyAgICAgICAgIGNzdC5CUFMgKiBjb3Vwb25fcGVyaW9kCiAgICAvLyAgICAgKSAgIyBkaXYtYnktemVybzogY291cG9uX3BlcmlvZCAhPSAwIGR1ZSB0byBhc3NlcnRfdGltZV9wZXJpb2RzIGNoZWNrcwogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQuZGF5X2NvdW50X2ZhY3RvcihkdWVfY291cG9uczogdWludDY0KSAtPiBieXRlczoKZGF5X2NvdW50X2ZhY3RvcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMDYtMTA3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGRheV9jb3VudF9mYWN0b3Ioc2VsZiwgZHVlX2NvdXBvbnM6IFVJbnQ2NCkgLT4gdHlwLkRheUNvdW50RmFjdG9yOgogICAgcHJvdG8gMSAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gNAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEwOC0xMDkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gaWYgbm90IGR1ZV9jb3Vwb25zOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogZGF5X2NvdW50X2ZhY3Rvcl9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjExMAogICAgLy8gYWNjcnVpbmdfc3RhcnRfdGltZSA9IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjExMwogICAgLy8gY291cG9uX2FjY3J1ZWRfcGVyaW9kID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgLSBhY2NydWluZ19zdGFydF90aW1lCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBzd2FwCiAgICAtCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjExNAogICAgLy8gY291cG9uX3BlcmlvZCA9IHNlbGYuY291cG9uX3BlcmlvZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjb3Vwb25fcGVyaW9kIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAzCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb3Vwb25fcGVyaW9kIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjExNQogICAgLy8gaWYgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9PSBVSW50NjQoY3N0LkRDQ19BX0EpOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgNAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAxCiAgICBibnogZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1NgogICAgLy8gcmV0dXJuIHRpbWVfcGVyaW9kIC8vIFVJbnQ2NChjc3QuREFZXzJfU0VDKQogICAgZnJhbWVfZGlnIDAKICAgIGludGMgNiAvLyA4NjQwMAogICAgLwogICAgZnJhbWVfZGlnIDMKICAgIGludGMgNiAvLyA4NjQwMAogICAgLwogICAgZnJhbWVfYnVyeSA0CiAgICBmcmFtZV9idXJ5IDEKCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTE5CiAgICAvLyBudW1lcmF0b3I9YXJjNC5VSW50NjQoY291cG9uX2FjY3J1ZWRfcGVyaW9kKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMjAKICAgIC8vIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGNvdXBvbl9wZXJpb2QpLAogICAgc3dhcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjExOC0xMjEKICAgIC8vIHJldHVybiB0eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgbnVtZXJhdG9yPWFyYzQuVUludDY0KGNvdXBvbl9hY2NydWVkX3BlcmlvZCksCiAgICAvLyAgICAgZGVub21pbmF0b3I9YXJjNC5VSW50NjQoY291cG9uX3BlcmlvZCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpkYXlfY291bnRfZmFjdG9yX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjgxCiAgICAvLyBjb3Vwb25fZHVlX2RhdGUgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBpZiBkdWVfY291cG9ucyA+PSBVSW50NjQoMSk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJ6IGRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6ODMKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IHNlbGYuY291cG9uX2R1ZV9kYXRlKGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGNvdXBvbl9kdWVfZGF0ZQogICAgZnJhbWVfYnVyeSAyCgpkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAODoKICAgIGZyYW1lX2RpZyAyCiAgICBiIGRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQuY291cG9uX2R1ZV9kYXRlKGNvdXBvbjogdWludDY0KSAtPiB1aW50NjQ6CmNvdXBvbl9kdWVfZGF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo3NS03NgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBjb3Vwb25fZHVlX2RhdGUoc2VsZiwgY291cG9uOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyByZXR1cm4gc2VsZi5pc3N1YW5jZV9kYXRlICsgY291cG9uICogc2VsZi5jb3Vwb25fcGVyaW9kCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjb3Vwb25fcGVyaW9kIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdXBvbl9wZXJpb2QgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgICsKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IHVpbnQ2NCkgLT4gdWludDY0OgphY2NvdW50X3VuaXRzX3ZhbHVlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzQyLTM0NQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhY2NvdW50X3VuaXRzX3ZhbHVlKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCB1bml0czogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzQ2CiAgICAvLyByZXR1cm4gdW5pdHMgKiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlLm5hdGl2ZQogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQucGF5X2NvdXBvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBwYXltZW50X2luZm86IGJ5dGVzKSAtPiBieXRlczoKcGF5X2NvdXBvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOTQtMTk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBwYXlfY291cG9uKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCBwYXltZW50X2luZm86IGFyYzQuRHluYW1pY0J5dGVzCiAgICAvLyApIC0+IHR5cC5QYXltZW50UmVzdWx0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDQKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjXzMgLy8gMTAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIxNy0yMTgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCByZXN0cmljdCBjYWxsZXIgYXV0aG9yaXphdGlvbgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyMTkKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIyMAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cG4gMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gdW5pdHMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIyMwogICAgLy8gYXNzZXJ0IHVuaXRzID4gMCwgZXJyLk5PX1VOSVRTCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyMjQKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjI1CiAgICAvLyBhY2NvdW50X3BhaWRfY291cG9ucyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucy5uYXRpdmUKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIyNgogICAgLy8gYXNzZXJ0IGR1ZV9jb3Vwb25zID4gYWNjb3VudF9wYWlkX2NvdXBvbnMsIGVyci5OT19EVUVfQ09VUE9OCiAgICBzd2FwCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjb3Vwb24gdG8gcGF5CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjI3LTIzMAogICAgLy8gIyBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgdmVyaWZ5IGlmIG90aGVyIGFjY291bnRzIGFyZSBzdGlsbCB3YWl0aW5nIGZvciB0aGUgcGF5bWVudCBvZiBwcmV2aW91cyBjb3Vwb25zCiAgICAvLyBhc3NlcnQgc2VsZi5hbGxfZHVlX2NvdXBvbnNfcGFpZCgKICAgIC8vICAgICBhY2NvdW50X3BhaWRfY291cG9ucwogICAgLy8gKSwgZXJyLlBFTkRJTkdfQ09VUE9OX1BBWU1FTlQKICAgIGNhbGxzdWIgYWxsX2R1ZV9jb3Vwb25zX3BhaWQKICAgIGFzc2VydCAvLyBQZW5kaW5nIGR1ZSBjb3Vwb24gcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzE2CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MubmF0aXZlLmlzX29wdGVkX2luKAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMiAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxNwogICAgLy8gQXNzZXQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxNi0zMTgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5uYXRpdmUuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgQXNzZXQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgLy8gKQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxNi0zMTkKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5uYXRpdmUuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgQXNzZXQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgLy8gKQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQubmF0aXZlCiAgICBieiBwYXlfY291cG9uX2Jvb2xfZmFsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxOQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQubmF0aXZlCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGMgNCAvLyA0NDgKICAgIGdldGJpdAogICAgYnl0ZWMgMTEgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBibnogcGF5X2NvdXBvbl9ib29sX2ZhbHNlQDE0CiAgICBpbnRjXzEgLy8gMQoKcGF5X2NvdXBvbl9ib29sX21lcmdlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gaWYgc2VsZi5pc19wYXltZW50X2V4ZWN1dGFibGUoaG9sZGluZ19hZGRyZXNzKToKICAgIGJ6IHBheV9jb3Vwb25fZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyMzUKICAgIC8vIHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgYWNjb3VudF90b3RhbF91bml0c192YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHByaW5jaXBhbF9hbW91bnQgKiBzZWxmLmludGVyZXN0X3JhdGUgLy8gY3N0LkJQUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgICoKICAgIGludGMgNSAvLyAxMDAwMAogICAgLwogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjUKICAgIC8vIEFzc2V0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCkuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyNS0zMjYKICAgIC8vIEFzc2V0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCkuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gPj0gcGF5bWVudF9hbW91bnQKICAgIGRpZyAxCiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzI0LTMyNwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBBc3NldChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vICAgICA+PSBwYXltZW50X2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIzOS0yNDAKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgdGhlIHNhbWUgYXNzZXQgZm9yIGRlbm9taW5hdGlvbiBhbmQgc2V0dGxlbWVudCwgbm8gY29udmVyc2lvbiBuZWVkZWQKICAgIC8vIHNlbGYucGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgcGF5bWVudF9hbW91bnQpCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMiAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMzMS0zMzYKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlci5uYXRpdmUsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzM1CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzMyCiAgICAvLyB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzMxCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMzEtMzM2CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIubmF0aXZlLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CgpwYXlfY291cG9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNDYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucy5uYXRpdmUgKyAxCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNDUtMjQ3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMubmF0aXZlICsgMQogICAgLy8gKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gYXJjNC5VSW50NjQoCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNDUtMjQ3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMubmF0aXZlICsgMQogICAgLy8gKQogICAgc3dhcAogICAgcmVwbGFjZTIgNDgKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNDgKICAgIC8vIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNSAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgZXhpc3RzCiAgICBmcmFtZV9kaWcgMQogICAgKwogICAgYnl0ZWMgMjUgLy8gInBhaWRfY291cG9uX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNTAKICAgIC8vIGFtb3VudD1hcmM0LlVJbnQ2NChwYXltZW50X2Ftb3VudCksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjUxCiAgICAvLyB0aW1lc3RhbXA9YXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI0OS0yNTMKICAgIC8vIHJldHVybiB0eXAuUGF5bWVudFJlc3VsdCgKICAgIC8vICAgICBhbW91bnQ9YXJjNC5VSW50NjQocGF5bWVudF9hbW91bnQpLAogICAgLy8gICAgIHRpbWVzdGFtcD1hcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCksCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8uY29weSgpLCAgIyBUT0RPOiBBZGQgaW5mbyBvbiBmYWlsZWQgcGF5bWVudAogICAgLy8gKQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDEyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKcGF5X2NvdXBvbl9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNDItMjQzCiAgICAvLyAjIEFjY291bnRzIHN1c3BlbmRlZCBvciBub3Qgb3B0ZWQgaW4gYXQgdGhlIHRpbWUgb2YgcGF5bWVudHMgbXVzdCBub3Qgc3RhbGwgdGhlIEQtQVNBCiAgICAvLyBwYXltZW50X2Ftb3VudCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgYiBwYXlfY291cG9uX2FmdGVyX2lmX2Vsc2VAMwoKcGF5X2NvdXBvbl9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIGIgcGF5X2NvdXBvbl9ib29sX21lcmdlQDE1CgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQuYWxsX2R1ZV9jb3Vwb25zX3BhaWQoZHVlX2NvdXBvbnM6IHVpbnQ2NCkgLT4gdWludDY0OgphbGxfZHVlX2NvdXBvbnNfcGFpZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo5MC05MQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhbGxfZHVlX2NvdXBvbnNfcGFpZChzZWxmLCBkdWVfY291cG9uczogVUludDY0KSAtPiBib29sOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6OTIKICAgIC8vIHJldHVybiBzZWxmLnBhaWRfY291cG9uX3VuaXRzID49IHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBkdWVfY291cG9ucwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI1IC8vICJwYWlkX2NvdXBvbl91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wYWlkX2NvdXBvbl91bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgPj0KICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gdWludDY0OgphY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzQ4LTM0OQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzKSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1MQogICAgLy8gaG9sZGluZ19hZGRyZXNzLCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNTAtMzUyCiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKAogICAgLy8gICAgIGhvbGRpbmdfYWRkcmVzcywgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGNhbGxzdWIgYWNjb3VudF91bml0c192YWx1ZQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQudXBkYXRlX2ludGVyZXN0X3JhdGUoaW50ZXJlc3RfcmF0ZTogYnl0ZXMpIC0+IGJ5dGVzOgp1cGRhdGVfaW50ZXJlc3RfcmF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNTUtMjU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiB1cGRhdGVfaW50ZXJlc3RfcmF0ZShzZWxmLCBpbnRlcmVzdF9yYXRlOiBhcmM0LlVJbnQ2NCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNjYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgYnl0ZWMgMjcgLy8gMHg1MjM4MzAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTY0CiAgICAvLyBjYWxsZXIgPSBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gY2FsbGVyIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNjYtMTY5CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vIGFuZCBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiB1cGRhdGVfaW50ZXJlc3RfcmF0ZV9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE2NwogICAgLy8gYW5kIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X29yYWNsZSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTY4CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTY3LTE2OAogICAgLy8gYW5kIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE2Ny0xNjkKICAgIC8vIGFuZCBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiB1cGRhdGVfaW50ZXJlc3RfcmF0ZV9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE2OQogICAgLy8gPD0gc2VsZi5pbnRlcmVzdF9vcmFjbGVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X29yYWNsZSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTY4LTE2OQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuaW50ZXJlc3Rfb3JhY2xlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE2Ny0xNjkKICAgIC8vIGFuZCBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiB1cGRhdGVfaW50ZXJlc3RfcmF0ZV9ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgp1cGRhdGVfaW50ZXJlc3RfcmF0ZV9ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNjUtMTcwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgLy8gICAgIGFuZCBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYuaW50ZXJlc3Rfb3JhY2xlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6Mjc0CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNzUKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6Mjc2CiAgICAvLyBhc3NlcnQgc2VsZi5hbGxfZHVlX2NvdXBvbnNfcGFpZChkdWVfY291cG9ucyksIGVyci5QRU5ESU5HX0NPVVBPTl9QQVlNRU5UCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNzgtMjc5CiAgICAvLyAjIFVwZGF0ZSBpbnRlcmVzdCByYXRlCiAgICAvLyBzZWxmLmludGVyZXN0X3JhdGUgPSBpbnRlcmVzdF9yYXRlLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBieXRlYyA2IC8vICJpbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyODAKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgp1cGRhdGVfaW50ZXJlc3RfcmF0ZV9ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiB1cGRhdGVfaW50ZXJlc3RfcmF0ZV9ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMucGVycGV0dWFsX2JvbmQuY29udHJhY3QuUGVycGV0dWFsQm9uZC5nZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjgyLTI4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZSgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgdW5pdHM6IGFyYzQuVUludDY0CiAgICAvLyApIC0+IHR5cC5DdXJyZW50VW5pdHNWYWx1ZToKICAgIHByb3RvIDIgMQogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzAzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzAzLTMwNAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMDQKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMwMy0zMDQKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzEgLy8gMQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzAyLTMwNQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gICAgIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gKSwgZXJyLk5PX1BSSU1BUllfRElTVFJJQlVUSU9OCiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gbm90IHlldCBleGVjdXRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMwOAogICAgLy8gMCA8IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBieXRlYyA3IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYj4KICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA3CiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtMQogICAgYj49CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VANwogICAgaW50Y18xIC8vIDEKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMwNy0zMDkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgMCA8IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfVU5JVFMKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFtb3VudCBvZiB1bml0cyBmb3IgdGhlIGFjY291bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMTMKICAgIC8vIGhvbGRpbmdfYWRkcmVzcywgdW5pdHMubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzExLTMxNAogICAgLy8gIyBWYWx1ZSBkdXJpbmcgcHJpbWFyeSBkaXN0cmlidXRpb24KICAgIC8vIGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSA9IHNlbGYuYWNjb3VudF91bml0c192YWx1ZSgKICAgIC8vICAgICBob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZQogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMxNS0zMTYKICAgIC8vICMgQWNjcnVpbmcgaW50ZXJlc3QgZHVyaW5nIHByaW1hcnkgZGlzdHJpYnV0aW9uCiAgICAvLyBhY2NydWVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMTcKICAgIC8vIG51bWVyYXRvciA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzE4CiAgICAvLyBkZW5vbWluYXRvciA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzIwLTMyMQogICAgLy8gIyBBY2NydWluZyBpbnRlcmVzdAogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzIyCiAgICAvLyBzZWxmLmFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50KGhvbGRpbmdfYWRkcmVzcywgZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGNhbGxzdWIgYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMjMKICAgIC8vIGlmIHNlbGYuaXNfYWNjcnVpbmdfaW50ZXJlc3QoKToKICAgIGNhbGxzdWIgaXNfYWNjcnVpbmdfaW50ZXJlc3QKICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMyNAogICAgLy8gZGF5X2NvdW50X2ZhY3RvciA9IHNlbGYuZGF5X2NvdW50X2ZhY3RvcihkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNhbGxzdWIgZGF5X2NvdW50X2ZhY3RvcgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMyNS0zMjcKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIGhvbGRpbmdfYWRkcmVzcywgdW5pdHMubmF0aXZlLCBkdWVfY291cG9ucwogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgNgogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50CiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMjgKICAgIC8vIG51bWVyYXRvciA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yLm5hdGl2ZQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMyOQogICAgLy8gZGVub21pbmF0b3IgPSBkYXlfY291bnRfZmFjdG9yLmRlbm9taW5hdG9yLm5hdGl2ZQogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBmcmFtZV9idXJ5IDMKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMzEKICAgIC8vIHVuaXRzX3ZhbHVlPWFyYzQuVUludDY0KGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSksCiAgICBmcmFtZV9kaWcgMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMzMgogICAgLy8gYWNjcnVlZF9pbnRlcmVzdD1hcmM0LlVJbnQ2NChhY2NydWVkX2ludGVyZXN0KSwKICAgIGZyYW1lX2RpZyAyCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzM0CiAgICAvLyBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIGZyYW1lX2RpZyA1CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzM1CiAgICAvLyBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICBmcmFtZV9kaWcgMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMzMy0zMzYKICAgIC8vIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChudW1lcmF0b3IpLAogICAgLy8gICAgIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGRlbm9taW5hdG9yKSwKICAgIC8vICksCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMzAtMzM3CiAgICAvLyByZXR1cm4gdHlwLkN1cnJlbnRVbml0c1ZhbHVlKAogICAgLy8gICAgIHVuaXRzX3ZhbHVlPWFyYzQuVUludDY0KGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSksCiAgICAvLyAgICAgYWNjcnVlZF9pbnRlcmVzdD1hcmM0LlVJbnQ2NChhY2NydWVkX2ludGVyZXN0KSwKICAgIC8vICAgICBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICAgICAgbnVtZXJhdG9yPWFyYzQuVUludDY0KG51bWVyYXRvciksCiAgICAvLyAgICAgICAgIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGRlbm9taW5hdG9yKSwKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMCAvLyAwCiAgICBiIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA4CgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICBiIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQuaXNfYWNjcnVpbmdfaW50ZXJlc3QoKSAtPiB1aW50NjQ6CmlzX2FjY3J1aW5nX2ludGVyZXN0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEyMy0xMjQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgaXNfYWNjcnVpbmdfaW50ZXJlc3Qoc2VsZikgLT4gYm9vbDoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEyNQogICAgLy8gcmV0dXJuIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIGJ6IGlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VAMwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgID4KICAgIGJ6IGlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKaXNfYWNjcnVpbmdfaW50ZXJlc3RfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMjUKICAgIC8vIHJldHVybiBzZWxmLmlzc3VhbmNlX2RhdGUgIT0gMCBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5wZXJwZXR1YWxfYm9uZC5jb250cmFjdC5QZXJwZXR1YWxCb25kLmdldF9wYXltZW50X2Ftb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X3BheW1lbnRfYW1vdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMzOS0zNDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9wYXltZW50X2Ftb3VudChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcykgLT4gdHlwLlBheW1lbnRBbW91bnRzOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNTUKICAgIC8vIHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWNjb3VudF90b3RhbF91bml0c192YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM1NgogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzU1LTM1NgogICAgLy8gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcykKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzU3CiAgICAvLyAvLyBjc3QuQlBTCiAgICBpbnRjIDUgLy8gMTAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNTUtMzU3CiAgICAvLyBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKQogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgIC8vIC8vIGNzdC5CUFMKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNjAKICAgIC8vIGludGVyZXN0PWFyYzQuVUludDY0KGludGVyZXN0X2Ftb3VudCksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzYxCiAgICAvLyBwcmluY2lwYWw9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzU5LTM2MgogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50QW1vdW50cygKICAgIC8vICAgICBpbnRlcmVzdD1hcmM0LlVJbnQ2NChpbnRlcmVzdF9hbW91bnQpLAogICAgLy8gICAgIHByaW5jaXBhbD1hcmM0LlVJbnQ2NCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMucGVycGV0dWFsX2JvbmQuY29udHJhY3QuUGVycGV0dWFsQm9uZC5nZXRfY291cG9uc19zdGF0dXMoKSAtPiBieXRlczoKZ2V0X2NvdXBvbnNfc3RhdHVzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM2NC0zNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9jb3Vwb25zX3N0YXR1cyhzZWxmKSAtPiB0eXAuQ291cG9uc0luZm86CiAgICBwcm90byAwIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDQKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjXzMgLy8gMTAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM3MwogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkgaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkgZWxzZSBVSW50NjQoKQogICAgYnogZ2V0X2NvdXBvbnNfc3RhdHVzX3Rlcm5hcnlfZmFsc2VAMgogICAgY2FsbHN1YiBjb3VudF9kdWVfY291cG9ucwogICAgZnJhbWVfYnVyeSAyCgpnZXRfY291cG9uc19zdGF0dXNfdGVybmFyeV9tZXJnZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5Ojg4CiAgICAvLyByZXR1cm4gc2VsZi5jb3Vwb25fZHVlX2RhdGUoZHVlX2NvdXBvbnMgKyAxKQogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGNhbGxzdWIgY291cG9uX2R1ZV9kYXRlCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNzUKICAgIC8vIGFsbF9kdWVfY291cG9uc19wYWlkID0gc2VsZi5hbGxfZHVlX2NvdXBvbnNfcGFpZChkdWVfY291cG9ucykKICAgIGNhbGxzdWIgYWxsX2R1ZV9jb3Vwb25zX3BhaWQKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM3NgogICAgLy8gbnVtZXJhdG9yID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNzcKICAgIC8vIGRlbm9taW5hdG9yID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNzgKICAgIC8vIGlmIHNlbGYuaXNfYWNjcnVpbmdfaW50ZXJlc3QoKToKICAgIGNhbGxzdWIgaXNfYWNjcnVpbmdfaW50ZXJlc3QKICAgIGJ6IGdldF9jb3Vwb25zX3N0YXR1c19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNzkKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgMgogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzgwCiAgICAvLyBudW1lcmF0b3IgPSBkYXlfY291bnRfZmFjdG9yLm51bWVyYXRvci5uYXRpdmUKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozODEKICAgIC8vIGRlbm9taW5hdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvci5uYXRpdmUKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfYnVyeSAxCgpnZXRfY291cG9uc19zdGF0dXNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM4MwogICAgLy8gdG90YWxfY291cG9ucz1hcmM0LlVJbnQ2NChzZWxmLnRvdGFsX2NvdXBvbnMpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozODQKICAgIC8vIGR1ZV9jb3Vwb25zPWFyYzQuVUludDY0KGR1ZV9jb3Vwb25zKSwKICAgIGZyYW1lX2RpZyAyCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6Mzg1CiAgICAvLyBuZXh0X2NvdXBvbl9kdWVfZGF0ZT1hcmM0LlVJbnQ2NChuZXh0X2NvdXBvbl9kdWVfZGF0ZSksCiAgICBmcmFtZV9kaWcgMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM4NwogICAgLy8gbnVtZXJhdG9yPWFyYzQuVUludDY0KG51bWVyYXRvciksCiAgICBmcmFtZV9kaWcgNAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM4OAogICAgLy8gZGVub21pbmF0b3I9YXJjNC5VSW50NjQoZGVub21pbmF0b3IpLAogICAgZnJhbWVfZGlnIDEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozODYtMzg5CiAgICAvLyBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIC8vICAgICBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICAvLyApLAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzkwCiAgICAvLyBhbGxfZHVlX2NvdXBvbnNfcGFpZD1hcmM0LkJvb2woYWxsX2R1ZV9jb3Vwb25zX3BhaWQpLAogICAgYnl0ZWMgMTEgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAwCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozODItMzkxCiAgICAvLyByZXR1cm4gdHlwLkNvdXBvbnNJbmZvKAogICAgLy8gICAgIHRvdGFsX2NvdXBvbnM9YXJjNC5VSW50NjQoc2VsZi50b3RhbF9jb3Vwb25zKSwKICAgIC8vICAgICBkdWVfY291cG9ucz1hcmM0LlVJbnQ2NChkdWVfY291cG9ucyksCiAgICAvLyAgICAgbmV4dF9jb3Vwb25fZHVlX2RhdGU9YXJjNC5VSW50NjQobmV4dF9jb3Vwb25fZHVlX2RhdGUpLAogICAgLy8gICAgIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIC8vICAgICAgICAgZGVub21pbmF0b3I9YXJjNC5VSW50NjQoZGVub21pbmF0b3IpLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYWxsX2R1ZV9jb3Vwb25zX3BhaWQ9YXJjNC5Cb29sKGFsbF9kdWVfY291cG9uc19wYWlkKSwKICAgIC8vICkKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X2NvdXBvbnNfc3RhdHVzX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNzMKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpIGVsc2UgVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgZ2V0X2NvdXBvbnNfc3RhdHVzX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5wZXJwZXR1YWxfYm9uZC5jb250cmFjdC5QZXJwZXR1YWxCb25kLmdldF90aW1lX3BlcmlvZHMoKSAtPiBieXRlczoKZ2V0X3RpbWVfcGVyaW9kczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozOTMtMzk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfdGltZV9wZXJpb2RzKHNlbGYpIC0+IHR5cC5UaW1lUGVyaW9kczoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjQwMQogICAgLy8gdGltZV9wZXJpb2RzID0gdHlwLlRpbWVQZXJpb2RzKCkKICAgIGJ5dGVjIDMzIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA0CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18zIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo0MDIKICAgIC8vIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpOgogICAgYnogZ2V0X3RpbWVfcGVyaW9kc19hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo0MDMKICAgIC8vIHRpbWVfcGVyaW9kcyA9IHNlbGYudGltZV9wZXJpb2RzLnZhbHVlLmNvcHkoKQogICAgYnl0ZWMgMjYgLy8gMHg3NDY5NmQ2NTUwNjU3MjY5NmY2NDczCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRpbWVfcGVyaW9kcyBleGlzdHMKCmdldF90aW1lX3BlcmlvZHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gcmV0dXJuIHRpbWVfcGVyaW9kcwogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2V0X2NyZWF0ZShhcnJhbmdlcjogYnl0ZXMsIG1ldGFkYXRhOiBieXRlcykgLT4gdm9pZDoKYXNzZXRfY3JlYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDYxLTQ2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICAvLyBkZWYgYXNzZXRfY3JlYXRlKHNlbGYsIGFycmFuZ2VyOiBhcmM0LkFkZHJlc3MsIG1ldGFkYXRhOiB0eXAuQXNzZXRNZXRhZGF0YSkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gYXJyYW5nZXIubmF0aXZlCiAgICBieXRlYyAxOCAvLyAweDUyMzIzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzEKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YS5ieXRlcwogICAgYnl0ZWMgMjAgLy8gIm1ldGFkYXRhIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXRfdXBkYXRlKG1ldGFkYXRhOiBieXRlcykgLT4gdm9pZDoKYXNzZXRfdXBkYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDczLTQ3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIGFzc2V0X3VwZGF0ZShzZWxmLCBtZXRhZGF0YTogdHlwLkFzc2V0TWV0YWRhdGEpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3OC00ODEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgZGlzYWJsZSBELUFTQSBhcHBsaWNhdGlvbiB1cGRhdGFiaWxpdHkgb3IgY2hhbmdlIGl0cyBhdXRob3JpemF0aW9ucy4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleSBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ4MgogICAgLy8gc2VsZi5tZXRhZGF0YSA9IG1ldGFkYXRhLmJ5dGVzCiAgICBieXRlYyAyMCAvLyAibWV0YWRhdGEiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExOC0xMTkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYuYXJyYW5nZXIudmFsdWUsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAweDUyMzIzMDIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NldF9jb25maWcoZGVub21pbmF0aW9uX2Fzc2V0X2lkOiBieXRlcywgc2V0dGxlbWVudF9hc3NldF9pZDogYnl0ZXMsIHByaW5jaXBhbDogYnl0ZXMsIHByaW5jaXBhbF9kaXNjb3VudDogYnl0ZXMsIG1pbmltdW1fZGVub21pbmF0aW9uOiBieXRlcywgZGF5X2NvdW50X2NvbnZlbnRpb246IGJ5dGVzLCBpbnRlcmVzdF9yYXRlOiBieXRlcywgY291cG9uX3JhdGVzOiBieXRlcywgdGltZV9ldmVudHM6IGJ5dGVzLCB0aW1lX3BlcmlvZHM6IGJ5dGVzKSAtPiB2b2lkOgphc3NldF9jb25maWc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0ODQtNDk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhc3NldF9jb25maWcoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHByaW5jaXBhbDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgcHJpbmNpcGFsX2Rpc2NvdW50OiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBtaW5pbXVtX2Rlbm9taW5hdGlvbjogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb246IGFyYzQuVUludDgsCiAgICAvLyAgICAgaW50ZXJlc3RfcmF0ZTogYXJjNC5VSW50MTYsCiAgICAvLyAgICAgY291cG9uX3JhdGVzOiB0eXAuQ291cG9uUmF0ZXMsCiAgICAvLyAgICAgdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzLAogICAgLy8gICAgIHRpbWVfcGVyaW9kczogdHlwLlRpbWVQZXJpb2RzLAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMTAgMAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MjcKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUyOAogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfRU1QVFksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTMwLTUzMQogICAgLy8gIyBTZXQgRGVub21pbmF0aW9uIEFzc2V0CiAgICAvLyBzZWxmLmFzc2VydF9kZW5vbWluYXRpb25fYXNzZXQoZGVub21pbmF0aW9uX2Fzc2V0X2lkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMTAKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTgwCiAgICAvLyBkZW5vbWluYXRpb25fYXNzZXRfaWQgIT0gVUludDY0KDApIGFuZCBBc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQpLmNyZWF0b3IKICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQKICAgIGZyYW1lX2RpZyA0CiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCmFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzgtMTgxCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQgIT0gVUludDY0KDApIGFuZCBBc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQpLmNyZWF0b3IKICAgIC8vICksIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODUKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZnJhbWVfZGlnIDQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzQtNTM1CiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuYXNzZXJ0X3NldHRsZW1lbnRfYXNzZXQoc2V0dGxlbWVudF9hc3NldF9pZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTkKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkIGV4aXN0cwogICAgZGlnIDEKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODktMTkyCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyA1IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5Ny0yMDMKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5OQogICAgLy8geGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjAwCiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk3LTE5OAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTctMjAzCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQwCiAgICAvLyBwcmluY2lwYWwubmF0aXZlICUgbWluaW11bV9kZW5vbWluYXRpb24ubmF0aXZlID09IDAKICAgIGZyYW1lX2RpZyAtOAogICAgYnRvaQogICAgZnJhbWVfZGlnIC02CiAgICBidG9pCiAgICBkdXAyCiAgICAlCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzgtNTQxCiAgICAvLyAjIFNldCBQcmluY2lwYWwgYW5kIE1pbmltdW0gRGVub21pbmF0aW9uCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByaW5jaXBhbC5uYXRpdmUgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUgPT0gMAogICAgLy8gKSwgZXJyLklOVkFMSURfTUlOSU1VTV9ERU5PTUlOQVRJT04KICAgIGFzc2VydCAvLyBNaW5pbXVtIGRlbm9taW5hdGlvbiBpcyBub3QgYSBkaXZpc29yIG9mIHByaW5jaXBhbAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQyCiAgICAvLyBzZWxmLnVuaXRfdmFsdWUgPSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUKICAgIGJ5dGVjIDEyIC8vICJ1bml0X3ZhbHVlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NDMKICAgIC8vIHNlbGYudG90YWxfdW5pdHMgPSBwcmluY2lwYWwubmF0aXZlIC8vIG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZQogICAgLwogICAgYnl0ZWMgMTQgLy8gInRvdGFsX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU0NAogICAgLy8gc2VsZi5wcmluY2lwYWxfZGlzY291bnQgPSBwcmluY2lwYWxfZGlzY291bnQubmF0aXZlCiAgICBmcmFtZV9kaWcgLTcKICAgIGJ0b2kKICAgIGJ5dGVjIDIxIC8vICJwcmluY2lwYWxfZGlzY291bnQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQ2LTU0NwogICAgLy8gIyBTZXQgRGF5LUNvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuYXNzZXJ0X2RheV9jb3VudF9jb252ZW50aW9uKGRheV9jb3VudF9jb252ZW50aW9uLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtNQogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNy0yMTEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGZyYW1lX2RpZyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTAKICAgIC8vIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgcHVzaGludCAyNTUgLy8gMjU1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDctMjExCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICA9PQogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmFzc2V0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDctMjExCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICBhc3NlcnQgLy8gSW52YWxpZCBkYXktY291bnQgY29udmVudGlvbiBJRAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjE1CiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIGJ5dGVjIDEzIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGZyYW1lX2RpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTUwLTU1MQogICAgLy8gIyBTZXQgSW50ZXJlc3QgUmF0ZQogICAgLy8gc2VsZi5hc3NlcnRfaW50ZXJlc3RfcmF0ZShpbnRlcmVzdF9yYXRlLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtNAogICAgYnRvaQogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTktMjIwCiAgICAvLyAjIFRoaXMgc3Vicm91dGluZSBtdXN0IGJlIHVzZWQgYWZ0ZXIgdGhlIHByaW5jaXBhbCBkaXNjb3VudCBoYXMgYmVlbiBzZXQKICAgIC8vIGlmIG5vdCBzZWxmLnByaW5jaXBhbF9kaXNjb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMSAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIGJueiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjIxCiAgICAvLyBhc3NlcnQgaW50ZXJlc3RfcmF0ZSA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfSU5URVJFU1RfUkFURQogICAgZnJhbWVfZGlnIDIKICAgIGFzc2VydCAvLyBJbnRlcmVzdCByYXRlIGlzIG5vdCBwcm9wZXJseSBkZWZpbmVkCgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gc2VsZi5pbnRlcmVzdF9yYXRlID0gaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgNiAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIGZyYW1lX2RpZyAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjI5CiAgICAvLyBhc3NlcnQgbm90IGNvdXBvbl9yYXRlcy5sZW5ndGgsIGVyci5JTlZBTElEX0NPVVBPTl9SQVRFUwogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgIQogICAgYXNzZXJ0IC8vIENvdXBvbiByYXRlcyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gc2VsZi50b3RhbF9jb3Vwb25zID0gY291cG9uX3JhdGVzLmxlbmd0aAogICAgYnl0ZWMgOCAvLyAidG90YWxfY291cG9ucyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMzQKICAgIC8vIGlmIHNlbGYudG90YWxfY291cG9uczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBieiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjM1CiAgICAvLyBzZWxmLmNvdXBvbl9yYXRlcy52YWx1ZSA9IGNvdXBvbl9yYXRlcy5jb3B5KCkKICAgIGJ5dGVjIDM0IC8vIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MwogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyAzNCAvLyAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMKICAgIGZyYW1lX2RpZyAtMwogICAgYm94X3B1dAoKYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NDkKICAgIC8vIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFMKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgcHVzaGludCAzIC8vIDMKICAgICsKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NDctNTAKICAgIC8vICMgVGhlIHBlcnBldHVhbCBib25kIGhhcyB1bmRlZmluZWQgY291cG9ucyAodG90YWxfY291cG9ucyA9IDApIGFuZCBubyBtYXR1cml0eSBkYXRlCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFMKICAgIC8vICksIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NjAKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCh0aW1lX2V2ZW50cykKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjUKICAgIC8vIHNlbGYudGltZV9ldmVudHMudmFsdWUgPSB0aW1lX2V2ZW50cy5jb3B5KCkKICAgIGJ5dGVjIDI4IC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMjggLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjYtMjY4CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICBieXRlYyA5IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjYtMjY4CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2OS0yNzEKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBkdXAKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY5CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgYnl0ZWMgMjIgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2OS0yNzEKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjcyCiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgPSB0aW1lX2V2ZW50c1tjZmcuSVNTVUFOQ0VfREFURV9JRFhdLm5hdGl2ZQogICAgZXh0cmFjdCAxNiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzQtMjc1CiAgICAvLyAjIFNvbWUgRC1BU0EgbWF5IG5vdCBoYXZlIGEgbWF0dXJpdHkgZGF0ZSAoZS5nLiwgcGVycGV0dWFscykKICAgIC8vIGlmIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBwdXNoaW50IDQgLy8gNAogICAgKwogICAgPT0KICAgIGJ6IGFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDM4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzYKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRpbWVfZXZlbnRzW2NmZy5NQVRVUklUWV9EQVRFX0lEWF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnl0ZWMgMTAgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NTQtNTUKICAgIC8vICMgVGhlIHBlcnBldHVhbCBib25kIGRlZmluZXMgYSBzaW5nbGUgdGltZSBwZXJpb2QgZm9yIHRoZSBjb3Vwb24gZHVyYXRpb24gd2l0aCB1bmxpbWl0ZWQgcmVwZXRpdGlvbnMKICAgIC8vIGFzc2VydCB0aW1lX3BlcmlvZHMubGVuZ3RoID09IFVJbnQ2NCgxKSwgZXJyLklOVkFMSURfVElNRV9QRVJJT0RTCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGFyZSBub3QgcHJvcGVybHkgZGVmaW5lZAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBjb3Vwb25fcGVyaW9kX2R1cmF0aW9uID0gdGltZV9wZXJpb2RzWzBdWzBdLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZXh0cmFjdCAwIDE2IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo1NwogICAgLy8gcmVwZXRpdGlvbnMgPSB0aW1lX3BlcmlvZHNbMF1bMV0ubmF0aXZlCiAgICBzd2FwCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo1OAogICAgLy8gYXNzZXJ0IGNvdXBvbl9wZXJpb2RfZHVyYXRpb24gPiBVSW50NjQoMCksIGVyci5JTlZBTElEX1RJTUVfUEVSSU9EX0RVUkFUSU9OCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2QgZHVyYXRpb25zIG11c3QgYmUgc3RyaWN0bHkgZ3JlYXRlciB0aGFuIHplcm8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo1OQogICAgLy8gYXNzZXJ0IHJlcGV0aXRpb25zID09IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfVElNRV9QRVJJT0RfUkVQRVRJVElPTlMKICAgICEKICAgIGFzc2VydCAvLyBUaW1lIHBlcmlvZCByZXBldGl0aW9ucyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo2MwogICAgLy8gc2VsZi50aW1lX3BlcmlvZHMudmFsdWUgPSB0aW1lX3BlcmlvZHMuY29weSgpCiAgICBieXRlYyAyNiAvLyAweDc0Njk2ZDY1NTA2NTcyNjk2ZjY0NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMjYgLy8gMHg3NDY5NmQ2NTUwNjU3MjY5NmY2NDczCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo2NAogICAgLy8gc2VsZi5jb3Vwb25fcGVyaW9kID0gc2VsZi50aW1lX3BlcmlvZHMudmFsdWVbMF1bMF0ubmF0aXZlCiAgICBieXRlYyAyNiAvLyAweDc0Njk2ZDY1NTA2NTcyNjk2ZjY0NzMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRpbWVfcGVyaW9kcyBleGlzdHMKICAgIGV4dHJhY3QgMiAwCiAgICBleHRyYWN0IDAgMTYgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ5dGVjIDE3IC8vICJjb3Vwb25fcGVyaW9kIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU2NwogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoY2ZnLlNUQVRVU19BQ1RJVkUpCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBpbnRjXzMgLy8gMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgphc3NldF9jb25maWdfYm9vbF9mYWxzZUAxNzoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDE4Cgphc3NldF9jb25maWdfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQodGltZV9ldmVudHM6IGJ5dGVzKSAtPiBieXRlczoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0My0yNDQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWxmLCB0aW1lX2V2ZW50czogdHlwLlRpbWVFdmVudHMpIC0+IE5vbmU6CiAgICBwcm90byAxIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDYKICAgIC8vIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDcKICAgIC8vID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0Ni0yNDcKICAgIC8vIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXS5uYXRpdmUKICAgIC8vID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0NS0yNDgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdLm5hdGl2ZQogICAgLy8gICAgID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5JTlZBTElEX1RJTUUKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDkKICAgIC8vIGZvciBfdCBpbiB1cmFuZ2UodGltZV9ldmVudHMubGVuZ3RoIC0gMSk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMCAvLyAwCgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gZm9yIF90IGluIHVyYW5nZSh0aW1lX2V2ZW50cy5sZW5ndGggLSAxKToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl9mb3JANgoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF93aGlsZV90b3BAODoKICAgIHB1c2hpbnQgNzUgLy8gNzUKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfd2hpbGVAMTQKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyAzNSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDM1IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF93aGlsZV90b3BAOAoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl93aGlsZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gdGltZV9pID0gdGltZV9ldmVudHNbX3RdLm5hdGl2ZQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMwogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTUKICAgIC8vIHRpbWVfZiA9IHRpbWVfZXZlbnRzW190ICsgMV0ubmF0aXZlCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjU2CiAgICAvLyBhc3NlcnQgdGltZV9mID4gdGltZV9pLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTcKICAgIC8vIGlmIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gIT0gVUludDY0KGNzdC5EQ0NfQ09OVCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgcHVzaGludCAyNTUgLy8gMjU1CiAgICAhPQogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1OC0yNTkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aW1lIHBlcmlvZHMgZXhwcmVzc2VkIGluIGRheXMgZm9yIHJlZ3VsYXIgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgKHRpbWVfZiAtIHRpbWVfaSkgJSBVSW50NjQoCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1OC0yNjEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aW1lIHBlcmlvZHMgZXhwcmVzc2VkIGluIGRheXMgZm9yIHJlZ3VsYXIgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgKHRpbWVfZiAtIHRpbWVfaSkgJSBVSW50NjQoCiAgICAvLyAgICAgY3N0LkRBWV8yX1NFQwogICAgLy8gKSA9PSAwLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRAogICAgaW50YyA2IC8vIDg2NDAwCiAgICAlCiAgICAhCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGluIEFjdHVhbC9BY3R1YWwgZGF5IGNvdW50IGNvbnZlbnRpb24gbXVzdCBiZSBtdWx0aXBsZXMgb2YgYSBkYXkgKGluIHNlY29uZHMpCiAgICBiIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfZm9yX2hlYWRlckAxCgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX2ZvckA2OgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHMoc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50czogYnl0ZXMpIC0+IGJ5dGVzOgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTY5LTU3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cygKICAgIC8vICAgICBzZWxmLCBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzOiB0eXAuVGltZUV2ZW50cwogICAgLy8gKSAtPiB0eXAuU2Vjb25kYXJ5TWFya2V0U2NoZWR1bGU6CiAgICBwcm90byAxIDEKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTAKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50YyA3IC8vIDIwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5MQogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLnN0YXR1c19pc19lbmRlZCgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICAhCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5MgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTQKICAgIC8vIGFzc2VydCBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzLmxlbmd0aCA+PSAxLCBlcnIuSU5WQUxJRF9USU1FX0VWRU5UU19MRU5HVEgKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBsZW5ndGggaXMgaW52YWxpZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk1CiAgICAvLyBpZiBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzLmxlbmd0aCA+IDE6CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBieiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk2CiAgICAvLyBzZWxmLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQoc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50cykKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgLTEKICAgIGZyYW1lX2J1cnkgMQoKc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDI6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAtMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk4CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTktNjAxCiAgICAvLyA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTgtNjAxCiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGRpZyAxCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk3LTYwMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vICAgICA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyAgICAgXS5uYXRpdmUKICAgIC8vICksIGVyci5JTlZBTElEX1NFQ09OREFSWV9PUEVOSU5HX0RBVEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNlY29uZGFyeSBtYXJrZXQgb3BlbmluZyBkYXRlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDMKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjAzLTYwNQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDYKICAgIC8vIGlmIHNlbGYubWF0dXJpdHlfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgYnogc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwOAogICAgLy8gc2VsZi5tYXR1cml0eV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxMAogICAgLy8gY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwOS02MTEKICAgIC8vID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwOC02MTEKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgZGlnIDEKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDctNjEyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gICAgID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vICAgICBdLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX0NMT1NVUkVfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBjbG9zdXJlIGRhdGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxMwogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTMtNjE1CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjE4CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjE3LTYxOQogICAgLy8gc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyMQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyMC02MjIKICAgIC8vIHNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTYtNjIzCiAgICAvLyByZXR1cm4gdHlwLlNlY29uZGFyeU1hcmtldFNjaGVkdWxlKAogICAgLy8gICAgIHNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgICAgICBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gICAgICksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzaWduX3JvbGUocm9sZV9hZGRyZXNzOiBieXRlcywgcm9sZTogYnl0ZXMsIGNvbmZpZzogYnl0ZXMpIC0+IGJ5dGVzOgphc3NpZ25fcm9sZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyNS02MjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2lnbl9yb2xlKAogICAgLy8gICAgIHNlbGYsIHJvbGVfYWRkcmVzczogYXJjNC5BZGRyZXNzLCByb2xlOiBhcmM0LlVJbnQ4LCBjb25maWc6IGFyYzQuRHluYW1pY0J5dGVzCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDYKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0NwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ5CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgcHVzaGludCAyMCAvLyAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgtNjU1CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUxCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MCAvLyA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MgogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MCAvLyA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MwogICAgLy8gVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwIC8vIDcwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgtNjU1CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU0CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0OC02NTUKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBhc3NpZ25fcm9sZV9ib29sX2ZhbHNlQDcKCmFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18xIC8vIDEKCmFzc2lnbl9yb2xlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0OC02NTUKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU3CiAgICAvLyBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICBwdXNoaW50cyAyMCA0MCA1MCA2MCA3MCA4MCAvLyAyMCwgNDAsIDUwLCA2MCwgNzAsIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTYtNjg1CiAgICAvLyBtYXRjaCByb2xlLm5hdGl2ZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MubmF0aXZlCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICAgICAgICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoKQogICAgZnJhbWVfZGlnIDAKICAgIG1hdGNoIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzBAOSBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8xQDEwIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzJAMTEgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzVAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4NQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfNUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3OQogICAgLy8gcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgYnl0ZWMgMjcgLy8gMHg1MjM4MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzgtNjgwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4MgogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjgxLTY4MwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gKQogICAgYm94X3B1dAoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4NgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgc3dhcAogICAgcmV0c3ViCgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njc1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyOSAvLyAweDUyMzczMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzYKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzNAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMCAvLyAweDUyMzYzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzMKICAgIC8vIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgYm94X3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8yQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDMxIC8vIDB4NTIzNTMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2OQogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY4LTY3MAogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICBjb25maWcubmF0aXZlCiAgICAvLyApCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzFAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjEKICAgIC8vIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDMyIC8vIDB4NTIzNDMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjYwLTY2MgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjQKICAgIC8vIGNvbmZpZy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2My02NjUKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICkKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMEA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU4CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzLm5hdGl2ZQogICAgYnl0ZWMgMTggLy8gMHg1MjMyMzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NpZ25fcm9sZV9ib29sX21lcmdlQDgKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5yZXZva2Vfcm9sZShyb2xlX2FkZHJlc3M6IGJ5dGVzLCByb2xlOiBieXRlcykgLT4gYnl0ZXM6CnJldm9rZV9yb2xlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njg4LTY4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcmV2b2tlX3JvbGUoc2VsZiwgcm9sZV9hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHJvbGU6IGFyYzQuVUludDgpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDYKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwNwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDgKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA5CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzEwCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MCAvLyA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4LTcxNAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTEKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIHB1c2hpbnQgNjAgLy8gNjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzEyCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAgLy8gNzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzEzCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogcmV2b2tlX3JvbGVfYm9vbF9mYWxzZUA2CgpyZXZva2Vfcm9sZV9ib29sX3RydWVANToKICAgIGludGNfMSAvLyAxCgpyZXZva2Vfcm9sZV9ib29sX21lcmdlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDgtNzE0CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTYtNzE3CiAgICAvLyAjIEFycmFuZ2VyIHJvbGUgY2FuIG5vdCBiZSByZXZva2VkIChqdXN0IHJvdGF0ZWQpCiAgICAvLyBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludHMgNDAgNTAgNjAgNzAgODAgLy8gNDAsIDUwLCA2MCwgNzAsIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTUtNzMzCiAgICAvLyBtYXRjaCByb2xlLm5hdGl2ZToKICAgIC8vICAgICAjIEFycmFuZ2VyIHJvbGUgY2FuIG5vdCBiZSByZXZva2VkIChqdXN0IHJvdGF0ZWQpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BQ0NPVU5UX01BTkFHRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfUFJJTUFSWV9ERUFMRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1RSVVNURUUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BVVRIT1JJVFkgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmludGVyZXN0X29yYWNsZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9JTlRFUkVTVF9PUkFDTEUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoKQogICAgZnJhbWVfZGlnIDAKICAgIG1hdGNoIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzBAOCByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8xQDkgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMCByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8zQDExIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzRAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczMwogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfNEAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczMAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmludGVyZXN0X29yYWNsZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNyAvLyAweDUyMzgzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MzEKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9JTlRFUkVTVF9PUkFDTEUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MzQKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHN3YXAKICAgIHJldHN1YgoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyNwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyOSAvLyAweDUyMzczMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjgKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BVVRIT1JJVFkgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyNAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzAgLy8gMHg1MjM2MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzI1CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfVFJVU1RFRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8xQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMSAvLyAweDUyMzUzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjIKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9QUklNQVJZX0RFQUxFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8wQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTgKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzIgLy8gMHg1MjM0MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzE5CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQUNDT1VOVF9NQU5BR0VSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX2Jvb2xfZmFsc2VANjoKICAgIGludGNfMCAvLyAwCiAgICBiIHJldm9rZV9yb2xlX2Jvb2xfbWVyZ2VANwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLm9wZW5fYWNjb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBwYXltZW50X2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKb3Blbl9hY2NvdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzM2LTczOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgb3Blbl9hY2NvdW50KAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCBwYXltZW50X2FkZHJlc3M6IGFyYzQuQWRkcmVzcwogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU2CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50YyA3IC8vIDIwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLnN0YXR1c19pc19lbmRlZCgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICAhCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1OAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTkKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzYwCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY0CiAgICAvLyB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgYnl0ZWMgNyAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2Mi03NjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjUKICAgIC8vIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY2CiAgICAvLyBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY3CiAgICAvLyBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICBieXRlYyAxMSAvLyAweDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY5CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIyLTEyMwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDMyIC8vIDB4NTIzNDMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2LTEyOQogICAgLy8gY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjcKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyOAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNy0xMjgKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjkKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyOC0xMjkKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI1LTEzMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuY2xvc2VfYWNjb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKY2xvc2VfYWNjb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc3MS03NzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGNsb3NlX2FjY291bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MKICAgIC8vICkgLT4gYXJjNC5UdXBsZVthcmM0LlVJbnQ2NCwgYXJjNC5VSW50NjRdOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODkKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzkwCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3NAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3OTMKICAgIC8vIGNsb3NlZF91bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5NAogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FDQ09VTlQgKyBob2xkaW5nX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5NQogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyAtPSBjbG9zZWRfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM2NgogICAgLy8gaWYgc2VsZi5jaXJjdWxhdGluZ191bml0cyA9PSAwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgYm56IGNsb3NlX2FjY291bnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjcKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGNmZy5TVEFUVVNfRU5ERUQpCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBpbnRjIDcgLy8gMjAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKY2xvc2VfYWNjb3VudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3OTgKICAgIC8vIChhcmM0LlVJbnQ2NChjbG9zZWRfdW5pdHMpLCBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkpCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzk3LTc5OQogICAgLy8gcmV0dXJuIGFyYzQuVHVwbGUoCiAgICAvLyAgICAgKGFyYzQuVUludDY0KGNsb3NlZF91bml0cyksIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSkKICAgIC8vICkKICAgIGNvbmNhdAogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EucHJpbWFyeV9kaXN0cmlidXRpb24oaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IGJ5dGVzKSAtPiBieXRlczoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MDEtODA0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbigKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgdW5pdHM6IGFyYzQuVUludDY0CiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMyAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODktMjkyCiAgICAvLyBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTAKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkwLTI5MQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5MC0yOTIKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkyCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjIgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTEtMjkyCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgZnJhbWVfZGlnIDIKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5MC0yOTIKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgaW50Y18xIC8vIDEKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4OC0yOTMKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vICAgICBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNgogICAgLy8gY2FsbGVyIGluIHNlbGYucHJpbWFyeV9kZWFsZXIKICAgIGJ5dGVjIDMxIC8vIDB4NTIzNTMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNi0xMzkKICAgIC8vIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kZWFsZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNy0xMzgKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNy0xMzkKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM5CiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2RlYWxlciBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM4LTEzOQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM3LTEzOQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyCiAgICBpbnRjXzEgLy8gMQoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNS0xNDAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYucHJpbWFyeV9kZWFsZXIKICAgIC8vICAgICBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODI5CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzEKICAgIC8vIGFzc2VydCB1bml0cy5uYXRpdmUgPiAwLCBlcnIuWkVST19VTklUUwogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMzCiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICsgdW5pdHMubmF0aXZlIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMi04MzQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5jaXJjdWxhdGluZ191bml0cyArIHVuaXRzLm5hdGl2ZSA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICAvLyApLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzYKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKz0gdW5pdHMubmF0aXZlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM3LTgzOQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM3LTgzOQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIC8vICkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDMyCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gYXJjNC5VSW50NjQoc2VsZi51bml0X3ZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICBpdG9iCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHN3YXAKICAgIHJlcGxhY2UyIDQwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDEKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5jaXJjdWxhdGluZ191bml0cykKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICAtCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMjoKICAgIGludGNfMCAvLyAwCiAgICBiIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VAMTMKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnNldF9hc3NldF9zdXNwZW5zaW9uKHN1c3BlbmRlZDogYnl0ZXMpIC0+IGJ5dGVzOgpzZXRfYXNzZXRfc3VzcGVuc2lvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0My04NDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9hc3NldF9zdXNwZW5zaW9uKHNlbGYsIHN1c3BlbmRlZDogYXJjNC5Cb29sKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODU3CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5KCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg1OAogICAgLy8gc2VsZi5zdXNwZW5kZWQgPSBVSW50NjQoc3VzcGVuZGVkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgYnl0ZWMgMjMgLy8gInN1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NTkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5KCkgLT4gdm9pZDoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTItMTUzCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5KHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgYnl0ZWMgMjkgLy8gMHg1MjM3MzAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU0CiAgICAvLyBjYWxsZXIgPSBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTYtMTU5CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX2ZhbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NwogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmF1dGhvcml0eSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU4CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU3LTE1OAogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1Ny0xNTkKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX2ZhbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1OQogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmF1dGhvcml0eSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU4LTE1OQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1Ny0xNTkKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgphc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTUtMTYwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgLy8gICAgIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgphc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfYWNjb3VudF9zdXNwZW5zaW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHN1c3BlbmRlZDogYnl0ZXMpIC0+IGJ5dGVzOgpzZXRfYWNjb3VudF9zdXNwZW5zaW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODYxLTg2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgc2V0X2FjY291bnRfc3VzcGVuc2lvbigKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgc3VzcGVuZGVkOiBhcmM0LkJvb2wKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3OQogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODgxCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgaW50YyA0IC8vIDQ0OAogICAgc3dhcAogICAgc2V0Yml0CiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODIKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnNldF9kZWZhdWx0X3N0YXR1cyhkZWZhdWx0ZWQ6IGJ5dGVzKSAtPiB2b2lkOgpzZXRfZGVmYXVsdF9zdGF0dXM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODQtODg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfZGVmYXVsdF9zdGF0dXMoc2VsZiwgZGVmYXVsdGVkOiBhcmM0LkJvb2wpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIGJ5dGVjIDMwIC8vIDB4NTIzNjMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Ni0xNDkKICAgIC8vIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cnVzdGVlIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDgKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDctMTQ4CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Ny0xNDkKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0OQogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cnVzdGVlIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDgtMTQ5CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Ny0xNDkKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgpzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ1LTE1MAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICAvLyAgICAgYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5NgogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBVSW50NjQoZGVmYXVsdGVkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgYnl0ZWMgMjQgLy8gImRlZmF1bHRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCnNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9tZXJnZUA2CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X2Fzc2V0X2luZm8oKSAtPiBieXRlczoKZ2V0X2Fzc2V0X2luZm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTgtODk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfaW5mbyhzZWxmKSAtPiB0eXAuQXNzZXRJbmZvOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDgKICAgIC8vIHBlcmZvcm1hbmNlID0gVUludDY0KGNzdC5QUkZfUEVSRk9STUFOVCkKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwOQogICAgLy8gaWYgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBzZWxmLm1hdHVyaXR5X2RhdGUgPiAwOgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgY292ZXIgNAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgID4KICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VAMwogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIDEKICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTEwCiAgICAvLyBwZXJmb3JtYW5jZSA9IFVJbnQ2NChjc3QuUFJGX01BVFVSRUQpCiAgICBwdXNoaW50IDQgLy8gNAogICAgZnJhbWVfYnVyeSAyCgpnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDM6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTEtOTEyCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG5vIGdyYWNlIG9yIGRlbGlucXVlbmN5IHBlcmlvZHMKICAgIC8vIGlmIHNlbGYuZGVmYXVsdGVkOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI0IC8vICJkZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVmYXVsdGVkIGV4aXN0cwogICAgYnogZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTMKICAgIC8vIHBlcmZvcm1hbmNlID0gVUludDY0KGNzdC5QUkZfREVGQVVMVEVEKQogICAgcHVzaGludCAzIC8vIDMKICAgIGZyYW1lX2J1cnkgMAoKZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE2CiAgICAvLyBkZW5vbWluYXRpb25fYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE3CiAgICAvLyBzZXR0bGVtZW50X2Fzc2V0X2lkPWFyYzQuVUludDY0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzQwCiAgICAvLyByZXR1cm4gc2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTgKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCgpKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxOQogICAgLy8gdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NChzZWxmLnVuaXRfdmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjAKICAgIC8vIGRheV9jb3VudF9jb252ZW50aW9uPWFyYzQuVUludDgoc2VsZi5kYXlfY291bnRfY29udmVudGlvbiksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgaXRvYgogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyMQogICAgLy8gcHJpbmNpcGFsX2Rpc2NvdW50PWFyYzQuVUludDE2KHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50KSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMSAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjIKICAgIC8vIGludGVyZXN0X3JhdGU9YXJjNC5VSW50MTYoc2VsZi5pbnRlcmVzdF9yYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTIzCiAgICAvLyB0b3RhbF9zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi50b3RhbF91bml0cyksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTI0CiAgICAvLyBjaXJjdWxhdGluZ19zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi5jaXJjdWxhdGluZ191bml0cyksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyNS05MjcKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyOQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMiAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyOC05MzAKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzMQogICAgLy8gaXNzdWFuY2VfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLmlzc3VhbmNlX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzMgogICAgLy8gbWF0dXJpdHlfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLm1hdHVyaXR5X2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzMKICAgIC8vIHN1c3BlbmRlZD1hcmM0LkJvb2woYm9vbChzZWxmLnN1c3BlbmRlZCkpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIzIC8vICJzdXNwZW5kZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3VzcGVuZGVkIGV4aXN0cwogICAgYnl0ZWMgMTEgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzQKICAgIC8vIHBlcmZvcm1hbmNlPWFyYzQuVUludDgocGVyZm9ybWFuY2UpLAogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTUtOTM1CiAgICAvLyByZXR1cm4gdHlwLkFzc2V0SW5mbygKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKSwKICAgIC8vICAgICBvdXRzdGFuZGluZ19wcmluY2lwYWw9YXJjNC5VSW50NjQoc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwoKSksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NChzZWxmLnVuaXRfdmFsdWUpLAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uPWFyYzQuVUludDgoc2VsZi5kYXlfY291bnRfY29udmVudGlvbiksCiAgICAvLyAgICAgcHJpbmNpcGFsX2Rpc2NvdW50PWFyYzQuVUludDE2KHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50KSwKICAgIC8vICAgICBpbnRlcmVzdF9yYXRlPWFyYzQuVUludDE2KHNlbGYuaW50ZXJlc3RfcmF0ZSksCiAgICAvLyAgICAgdG90YWxfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMpLAogICAgLy8gICAgIGNpcmN1bGF0aW5nX3N1cHBseT1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBpc3N1YW5jZV9kYXRlPWFyYzQuVUludDY0KHNlbGYuaXNzdWFuY2VfZGF0ZSksCiAgICAvLyAgICAgbWF0dXJpdHlfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLm1hdHVyaXR5X2RhdGUpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woYm9vbChzZWxmLnN1c3BlbmRlZCkpLAogICAgLy8gICAgIHBlcmZvcm1hbmNlPWFyYzQuVUludDgocGVyZm9ybWFuY2UpLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgdW5jb3ZlciAxNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hY2NvdW50X2luZm8oaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hY2NvdW50X2luZm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzctOTM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYWNjb3VudF9pbmZvKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzKSAtPiB0eXAuQWNjb3VudEluZm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3NAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTIKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF90aW1lX2V2ZW50cygpIC0+IGJ5dGVzOgpnZXRfdGltZV9ldmVudHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTQtOTU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfdGltZV9ldmVudHMoc2VsZikgLT4gdHlwLlRpbWVFdmVudHM6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2MgogICAgLy8gdGltZV9ldmVudHMgPSB0eXAuVGltZUV2ZW50cygpCiAgICBieXRlYyAzMyAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMyAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NjMKICAgIC8vIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpOgogICAgYnogZ2V0X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTY0CiAgICAvLyB0aW1lX2V2ZW50cyA9IHNlbGYudGltZV9ldmVudHMudmFsdWUuY29weSgpCiAgICBieXRlYyAyOCAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRpbWVfZXZlbnRzIGV4aXN0cwoKZ2V0X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2NQogICAgLy8gcmV0dXJuIHRpbWVfZXZlbnRzCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUoKSAtPiBieXRlczoKZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NjctOTY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZShzZWxmKSAtPiB0eXAuVGltZUV2ZW50czoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTc2CiAgICAvLyBhcmM0LlVJbnQ2NChzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NzcKICAgIC8vIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk3NS05NzgKICAgIC8vIHJldHVybiB0eXAuVGltZUV2ZW50cygKICAgIC8vICAgICBhcmM0LlVJbnQ2NChzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NChzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfYXNzZXRfbWV0YWRhdGEoKSAtPiBieXRlczoKZ2V0X2Fzc2V0X21ldGFkYXRhOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTgwLTk4MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21ldGFkYXRhKHNlbGYpIC0+IHR5cC5Bc3NldE1ldGFkYXRhOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5ODkKICAgIC8vIHJldHVybiB0eXAuQXNzZXRNZXRhZGF0YS5mcm9tX2J5dGVzKHNlbGYubWV0YWRhdGEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gIm1ldGFkYXRhIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1ldGFkYXRhIGV4aXN0cwogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "byteCode": { + "approval": "CiAIAAEIZMADkE6AowXIASYkBBUffHUEUjMwIwZzdGF0dXMRY2lyY3VsYXRpbmdfdW5pdHMNaXNzdWFuY2VfZGF0ZRNzZXR0bGVtZW50X2Fzc2V0X2lkDWludGVyZXN0X3JhdGUIAAAAAAAAAAANdG90YWxfY291cG9ucyFwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUNbWF0dXJpdHlfZGF0ZQEACnVuaXRfdmFsdWUUZGF5X2NvdW50X2NvbnZlbnRpb24LdG90YWxfdW5pdHMdc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUdc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUNY291cG9uX3BlcmlvZARSMjAjFWRlbm9taW5hdGlvbl9hc3NldF9pZAhtZXRhZGF0YRJwcmluY2lwYWxfZGlzY291bnQhcHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCXN1c3BlbmRlZAlkZWZhdWx0ZWQRcGFpZF9jb3Vwb25fdW5pdHMLdGltZVBlcmlvZHMEUjgwIwp0aW1lRXZlbnRzBFI3MCMEUjYwIwRSNTAjBFI0MCMCAAALY291cG9uUmF0ZXMDBoEBMRhAAGwnEjIDZycTImcnBSJnJwwiZycNImcnFIAAZycOImcrImcnFSJnJwYiZycIImcnCSJnJxYiZycEImcnDyJnJxAiZycKImcqImcnFyJnJxgiZzE1gQISRDE0gRQSRDE3FEQxNhREJxEiZycZImcxG0EAr4IYBE/Wo8wEjPFLUQSA5R6fBEQ2PUkEZ9tPIAT2qWyNBCKbcG8EPw78bAQl26lbBIlHQTQEHW/CVQT+90VnBLj8E5AEPUPR8ATr2WsvBGyF4+4E9jrOjQS7zKGKBBp7q7QEQC26RwTtAnWfBPrSFz4ECO/qNQTkpatUNhoAjhgBzgG4AaUBjwF8AWwBXAFJATgBDgD7AOIAzAC2AKMAjQB6AGQAVQBFADIAIgASAAIiQzEZFEQxGESIDdcoTFCwI0MxGRREMRhEiA2wKExQsCNDMRkURDEYRIgNhyhMULAjQzEZFEQxGEQ2GgGIDWUoTFCwI0MxGRREMRhEiAyIKExQsCNDMRkURDEYRDYaAYgMOCNDMRkURDEYRDYaATYaAogMByhMULAjQzEZFEQxGEQ2GgGIC60oTFCwI0MxGRREMRhENhoBNhoCiArZKExQsCNDMRkURDEYRDYaAYgKiyhMULAjQzEZFEQxGEQ2GgE2GgKICg4oTFCwI0MxGRREMRhENhoBNhoCiAlcKExQsCNDMRkURDEYRDYaATYaAjYaA4gIeyhMULAjQzEZFEQxGEQ2GgGIB+soTFCwI0MxGRREMRhENhoBNhoCNhoDNhoENhoFNhoGNhoHNhoINhoJNhoKiAXbI0MxGYEEEkQxGEQ2GgGIBbEjQzEZFEQxGBRENhoBNhoCiAWQI0MxGRREMRhEiAVrKExQsCNDMRkURDEYRIgE6ihMULAjQzEZFEQxGEQ2GgGIBLkoTFCwI0MxGRREMRhENhoBNhoCiAPkKExQsCNDMRkURDEYRDYaAYgDgyhMULAjQzEZFEQxGEQ2GgE2GgKIAnMoTFCwI0MxGRREMRhENhoBNhoCNhoDiAAGKExQsCNDigMBIkcCgABJi/8XIiplRCUSQQFAIicPZUQyB0mMBA5BATIiJxBlRIsEDUEBJyNEMQCL/RJEiAEgiAEoKYv9UEmMAUm9RQFEKYv+UEmMAkm9RQFESwG+RCEEUycLIk8CVCJTFERJvkQhBFMnCyJPAlQiUxRESwG+RFcgCBeLBQ9ETL5EVygIjAC+RFcgCBdBAKSLAb5EVygIiwK+RFcoCKhBAI6LAb5EVzAIiwK+RFcwCKhBAHwjRIgAtIv9SwGIAM+LAUlOAr5EVygIjACL/YsFSU4ETwKIAMmMA0m+RFcgCBdLAgkWSwG+RExcIEsBTL+LAkm+RFcgCBdPAwgWSwG+RExcIL++RFcgCBdAABWLAUm+RCcHXChLAUy/Sb5EJwdcML+LABeLBQuLAwgWjACJIkL/gYsCSb5EiwBcKEsBTL+LAb5ESwG+RExXMAhcML9C/2MiQv7WigAAIicYZUQURImKAAAiJxdlRBREiYoAASIyB0kiJwRlRA1BABEiJwRlRIsBTAkiJxFlRAqMAImKAgApi/5QvkRXMAiL/xaoRImKAwGL/Yv/iP/ki/+IACFJVwAIF0xXCAgXi/2L/ogAgCInBmVEC08CCyEFTwILComKAQGAAEcEi/9AAD4iJwRlRDIHTAlJjAAiJxFlTElOAowDRCInDWVETIwETIwBQAAOiwAhBgqLAyEGCowEjAGLBIsBFkwWUIwAiSKMAov/QQAHi/+IAAeMAosCQv+zigEBIicEZUQiJxFlRIv/CwiJigIBKYv+UL5EVygIF4v/C4mKAgEiKmVEJRJEiP74iP8AKYv+UEcCvUUBREm+RFcgCBdJTgJEiP7zSwG+RFcwCBdMSwENRIgAnUS+RFcAICInBWVEcABFAUEAh4sAvkQhBFMnCyJPAlQiU0AAdSNBAG2L/ogAgSInBmVECyEFCkkyCiInBWVEcABESwEPRIsAvkRXACCxMgAiJwVlRE8DshJPArIUshGBBLIQsgGziwBJvkRXMAgXIwgWSwG+RExcML8iJxllRIsBCCcZTGcWMgcWUIACABJQi/9QjACJIkL/zCJC/4iKAQEiJxllRCIrZUSL/wsPiYoBASmL/1C+RFcgCBeL/0yI/vaJigEBIicbMQBQSb1FAUEAOosBvkRXAAgyBxZJjACmQQApiwG+RFcICIsAp0EAHCNEiP3YiP3giP3oiP+fRIv/FycGTGcyBxaMAIkiQv/higIBIoAARwUiJwllREEAkTIHIicJZUQPQQCGI0Qpi/5QSYwAvUUBRIv/JwelQQBtiwC+RFcgCBcWi/+nQQBeI0SL/xdJjAaL/kyI/lqMASKMAiKMBSKMA4j9eEmMBIv+TIj9kYgAPkEAHosESYj9x4v+iwZPA4j9jowCSVcACBeMBVcICBeMA4sBFosCFosFFosDFlBOAlBMUIwAiSJC/58iQv93igABIicEZURBAA0yByInBGVEDUEAAiOJIomKAQEpi/9QvUUBRIv/iP7PIicGZUQLIQUKFicHUImKAAGAAEcEIiplRCUSQQBbiPzjjAKLAkkjCIj9m4wDiP6OjAAijAQijAGI/5tBABKLAoj9JUlXAAgXjARXCAgXjAEiJwhlRBaLAhaLAxaLBBaLARZQJwsiiwBUTwRPBFBPA1BPAlBMUIwAiSKMAkL/pIoAASchIiplRCUSQQAHJxq+TIwARIsATImKAgAnEov+ZycUi/9niYoBAIgABicUi/9niYoAADEAIicSZUQSRImKCgAigABHAoj/6CIqZUQURIv2F0lBAUKLBHELRDIDE0EBNyNEJxOLBGeL9xciJxNlREsBEkQnBUxnsTIAIicFZUQyCiKyErIUshGBBLIQsgGzi/gXi/oXShgURCcMSwFnCicOTGeL+RcnFUxni/sXSYwBQQAJiwGB/wESQQDXI0QnDYsBZ4v8F4wCIicVZURAAAOLAkQnBosCZ4v9IllJFEQnCExnIicIZURBAAknIrxIJyKL/b+L/iJZIicIZUSBAwgSRIv+iACUjP4nHLxIJxyL/r+L/lcCAEmMAElXAAgXJwlMZ0lXCAgXJxZMZ1cQCBcnBExni/4iWUmMAyInCGVEgQQIEkEAEIsDIwkkC4sATCRYFycKTGeL/yJZIxJEi/9XAgBXABBJVwAIF0xXCAgXTEQURCcavEgnGov/vycavkRXAgBXABBXAAgXJxFMZyolZ4kiQv8mIkL+xooBAYAASYv/VwIASVcACBcyBw1Ei/8iWSMJIosEiwMMQQBcgUsyDA1BABmxgQayEIEFshknI7IeJyOyHzIAsgGzQv/fiwRJJAuLAklOA0wkWBdJTgOMASMISYwEJAskWBdJjAAMRCInDWVEgf8BE0H/qYsAiwEJIQYYFERC/5yL/4wAiYoBASKI/goiKmVEIQcSFESI+jqL/yJZSUQjDYv/TEEACov/iP9WSYz/jAGLAYz/IicEZUSL/1cCAEmMAFcACBdMSwEORCcPTGciJwplREEAHCInCmVEi/8iWSMJJAuLAEwkWBdMSwEPRCcQTGciJw9lRBYiJxBlRBZQjACJigMBiP2OiPnHi/4XSYEUEkAAKIsAgSgSQAAgiwCBMhJAABiLAIE8EkAAEIsAgUYSQAAIiwCBUBJBAIkjRIMGFCgyPEZQiwCOBgBnAFMAPwArABcAAQAnG4v9UEm9RQEURIv/VwIAvzIHFkyJJx2L/VBJvUUBFESL/1cCAL9C/+cnHov9UEm9RQEURIv/VwIAv0L/0ycfi/1QSb1FARREi/9XAgC/Qv+/JyCL/VBJvUUBFESL/1cCAL9C/6snEov9Z0L/oyJC/3SKAgGI/MaI+P+L/xdJgSgSQAAgiwCBMhJAABiLAIE8EkAAEIsAgUYSQAAIiwCBUBJBAGUjRIMFKDI8RlCLAI4FAD8AMAAhABIAAQAnG4v+UEm9RQFEvEgyBxZMiScdi/5QSb1FAUS8SEL/7Ccei/5QSb1FAUS8SEL/3Scfi/5QSb1FAUS8SEL/zicgi/5QSb1FAUS8SEL/vyJC/5iKAgGIACwiKmVEIQcSFESI+FqI+GIpi/5QSb1FARREi/8nB1AnB1AnB1AnC1C/MgcWiYoAACInIDEAUEm9RQFBACGLAb5EVwAIMgcWSYwApkEAEIsBvkRXCAiLAKdBAAMjRIkiQv/6igEBiP/FiPf8KYv/UEm9RQFESb5EVyAIF0lPArxIIitlREwJK0xnIitlREAABCohB2eLABYyBxZQTImKAgEiSYAAIiplRCUSQQCqIicJZUQyB0mMAg5BAJwiJxZlRIsCDUEAkSNEJx8xAFBJjAC9RQFBAH2LAL5EVwAIMgcWSYwBpkEAbIsAvkRXCAiLAadBAF8jRCmL/lBJvUUBRIj3ZYj3bYv/F0lEIitlREsBCCInDmVEDkQiK2VESwEIK0xnSwG+RFcgCBcIFksBvkRMXCBLAUy/IicMZUQWSwG+RExcKL8iJw5lRCIrZUQJFowAiSJC/54iQv9sigEBiAAMi/8iUycXTGcyBxaJigAAIicdMQBQSb1FAUEAIYsBvkRXAAgyBxZJjACmQQAQiwG+RFcICIsAp0EAAyNEiSJC//qKAgGI/8Upi/5QSb1FAURJvkSL/yJTIQRMVL8yBxaJigEAIiceMQBQSb1FAUEAKYsBvkRXAAgyBxZJjACmQQAYiwG+RFcICIsAp0EACyNEi/8iUycYTGeJIkL/8ooAASJJMgciJwplTElOAk4ERA1BAA2LAIwCiwFBAASBBIwCiwKMACInGGVEQQAEgQOMACInE2VEFiInBWVEFiIrZUQiJwxlRAsWIicMZUQWIicNZUQWVwcBIicVZUQWVwYCIicGZUQWVwYCIicOZUQWIitlRBYiJwllRBYiJxZlRBYiJwRlRBYiJwplRBYiJxdlRCcLIk8CVIsAFlcHAU8OTw5QTw1QTwxQTwtQTwpQTwlQTwhQTwdQTwZQTwVQTwRQTwNQTwJQTFCMAImKAQEpi/9QSb1FAUS+RImKAAEnISIqZUQlEkEAByccvkyMAESLAEyJigABIicPZUQWIicQZUQWUIACAAJMUImKAAEiJxRlRIk=", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 4, + "minor": 2, + "patch": 1 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/smart_contracts/artifacts/perpetual_bond/perpetual_bond_client.py b/smart_contracts/artifacts/perpetual_bond/perpetual_bond_client.py index c6b298c..438e026 100644 --- a/smart_contracts/artifacts/perpetual_bond/perpetual_bond_client.py +++ b/smart_contracts/artifacts/perpetual_bond/perpetual_bond_client.py @@ -19,7 +19,7 @@ import algokit_utils from algokit_utils import AlgorandClient as _AlgoKitAlgorandClient -_APP_SPEC_JSON = r"""{"arcs": [], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Sender Account Holding Address", "name": "sender_holding_address"}, {"type": "address", "desc": "Receiver Account Holding Address", "name": "receiver_holding_address"}, {"type": "uint64", "desc": "Amount of D-ASA units to transfer", "name": "units"}], "name": "asset_transfer", "returns": {"type": "uint64", "desc": "Transferred actualized value in denomination asset"}, "desc": "Transfer D-ASA units between accounts", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "byte[]", "desc": "Additional payment information (Optional)", "name": "payment_info"}], "name": "pay_coupon", "returns": {"type": "(uint64,uint64,byte[])", "desc": "Paid coupon amount in denomination asset, Payment timestamp, Payment context", "struct": "PaymentResult"}, "desc": "Pay due coupon to an account", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Interest rate in bps", "name": "interest_rate"}], "name": "update_interest_rate", "returns": {"type": "uint64", "desc": "Timestamp of the update"}, "desc": "Update variable interest rates in bps", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "uint64", "desc": "Account's units for the current value calculation", "name": "units"}], "name": "get_account_units_current_value", "returns": {"type": "(uint64,uint64,(uint64,uint64))", "desc": "Units current value in denomination asset, Accrued interest in denomination asset", "struct": "CurrentUnitsValue"}, "desc": "Get account's units current value and accrued interest", "events": [], "readonly": true}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "get_payment_amount", "returns": {"type": "(uint64,uint64)", "desc": "Interest amount in denomination asset, Principal amount in denomination asset", "struct": "PaymentAmounts"}, "desc": "Get the next payment amount", "events": [], "readonly": true}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_coupons_status", "returns": {"type": "(uint64,uint64,uint64,(uint64,uint64),bool)", "desc": "Total coupons, Due coupons, Next coupon due date, (Day count factor numerator, Day count factor denominator), All due coupons paid", "struct": "CouponsInfo"}, "desc": "Get D-ASA coupons status", "events": [], "readonly": true}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_time_periods", "returns": {"type": "(uint64,uint64)[]", "desc": "Time periods"}, "desc": "Get D-ASA time periods", "events": [], "readonly": true}, {"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA Arranger Address", "name": "arranger"}, {"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "desc": "D-ASA metadata", "name": "metadata", "struct": "AssetMetadata"}], "name": "asset_create", "returns": {"type": "void"}, "desc": "Create a new D-ASA", "events": []}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [{"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "name": "metadata", "struct": "AssetMetadata"}], "name": "asset_update", "returns": {"type": "void"}, "desc": "Update D-ASA application.", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Denomination asset identifier", "name": "denomination_asset_id"}, {"type": "uint64", "desc": "Settlement asset identifier", "name": "settlement_asset_id"}, {"type": "uint64", "desc": "Principal, expressed in denomination asset", "name": "principal"}, {"type": "uint64", "desc": "Principal discount in bps", "name": "principal_discount"}, {"type": "uint64", "desc": "Minimum denomination, expressed in denomination asset", "name": "minimum_denomination"}, {"type": "uint8", "desc": "Day-count convention for interests calculation", "name": "day_count_convention"}, {"type": "uint16", "desc": "Interest rate in bps", "name": "interest_rate"}, {"type": "uint16[]", "desc": "Coupon interest rates in bps", "name": "coupon_rates"}, {"type": "uint64[]", "desc": "Time events (strictly ascending order)", "name": "time_events"}, {"type": "(uint64,uint64)[]", "desc": "Time periods of recurring time events", "name": "time_periods"}], "name": "asset_config", "returns": {"type": "void"}, "desc": "Configure the Debt Algorand Standard Application", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64[]", "desc": "Secondary market time events (strictly ascending order)", "name": "secondary_market_time_events"}], "name": "set_secondary_time_events", "returns": {"type": "(uint64,uint64)", "desc": "Secondary Market Opening Date, Secondary Market Closure Date", "struct": "SecondaryMarketSchedule"}, "desc": "Set secondary market time schedule", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "uint8", "desc": "Role identifier", "name": "role"}, {"type": "byte[]", "desc": "Role configuration (Optional)", "name": "config"}], "name": "assign_role", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Assign a role to an address", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "uint8", "desc": "Role identifier", "name": "role"}], "name": "revoke_role", "returns": {"type": "uint64", "desc": "Timestamp of the role revocation"}, "desc": "Revoke a role from an address", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "open_account", "returns": {"type": "uint64", "desc": "Timestamp of the account opening"}, "desc": "Open D-ASA account", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "close_account", "returns": {"type": "(uint64,uint64)", "desc": "Closed units, Timestamp of the account closing"}, "desc": "Close D-ASA account", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "uint64", "desc": "Amount of D-ASA units to distribute", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64", "desc": "Remaining D-ASA units to be distributed"}, "desc": "Distribute D-ASA units to accounts according the primary market", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "set_asset_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set asset suspension status"}, "desc": "Set asset suspension status", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "set_account_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set account suspension status"}, "desc": "Set account suspension status", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Default status", "name": "defaulted"}], "name": "set_default_status", "returns": {"type": "void"}, "desc": "Set D-ASA default status", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_asset_info", "returns": {"type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Performance", "struct": "AssetInfo"}, "desc": "Get D-ASA info", "events": [], "readonly": true}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "get_account_info", "returns": {"type": "(address,uint64,uint64,uint64,bool)", "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended", "struct": "AccountInfo"}, "desc": "Get account info", "events": [], "readonly": true}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_time_events", "returns": {"type": "uint64[]", "desc": "Time events"}, "desc": "Get D-ASA time events", "events": [], "readonly": true}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_secondary_market_schedule", "returns": {"type": "uint64[]", "desc": "Secondary market schedule"}, "desc": "Get secondary market schedule", "events": [], "readonly": true}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_asset_metadata", "returns": {"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "desc": "Contract type, Calendar, Business day convention, End of month convention, Early repayment effect, Early repayment penalty type, Prospectus hash, Prospectus URL", "struct": "AssetMetadata"}, "desc": "Get D-ASA metadata", "events": [], "readonly": true}], "name": "PerpetualBond", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UjIwIw==", "keyType": "AVMString", "valueType": "AVMBytes"}, "circulating_units": {"key": "Y2lyY3VsYXRpbmdfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "coupon_period": {"key": "Y291cG9uX3BlcmlvZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "defaulted": {"key": "ZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_rate": {"key": "aW50ZXJlc3RfcmF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "issuance_date": {"key": "aXNzdWFuY2VfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "metadata": {"key": "bWV0YWRhdGE=", "keyType": "AVMString", "valueType": "AVMBytes"}, "paid_coupon_units": {"key": "cGFpZF9jb3Vwb25fdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "primary_distribution_closure_date": {"key": "cHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "primary_distribution_opening_date": {"key": "cHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "principal_discount": {"key": "cHJpbmNpcGFsX2Rpc2NvdW50", "keyType": "AVMString", "valueType": "AVMUint64"}, "secondary_market_closure_date": {"key": "c2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU=", "keyType": "AVMString", "valueType": "AVMUint64"}, "secondary_market_opening_date": {"key": "c2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU=", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "suspended": {"key": "c3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_coupons": {"key": "dG90YWxfY291cG9ucw==", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "unit_value": {"key": "dW5pdF92YWx1ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 2, "ints": 20}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"PaymentResult": [{"name": "amount", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}, {"name": "context", "type": "byte[]"}], "CurrentUnitsValue": [{"name": "units_value", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "day_count_factor", "type": "(uint64,uint64)"}], "PaymentAmounts": [{"name": "interest", "type": "uint64"}, {"name": "principal", "type": "uint64"}], "CouponsInfo": [{"name": "total_coupons", "type": "uint64"}, {"name": "due_coupons", "type": "uint64"}, {"name": "next_coupon_due_date", "type": "uint64"}, {"name": "day_count_factor", "type": "(uint64,uint64)"}, {"name": "all_due_coupons_paid", "type": "bool"}], "AssetMetadata": [{"name": "contract_type", "type": "uint8"}, {"name": "calendar", "type": "uint8"}, {"name": "business_day_convention", "type": "uint8"}, {"name": "end_of_month_convention", "type": "uint8"}, {"name": "prepayment_effect", "type": "uint8"}, {"name": "penalty_type", "type": "uint8"}, {"name": "prospectus_hash", "type": "byte[32]"}, {"name": "prospectus_url", "type": "string"}], "SecondaryMarketSchedule": [{"name": "secondary_market_opening_date", "type": "uint64"}, {"name": "secondary_market_closure_date", "type": "uint64"}], "AssetInfo": [{"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "unit_value", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "principal_discount", "type": "uint16"}, {"name": "interest_rate", "type": "uint16"}, {"name": "total_supply", "type": "uint64"}, {"name": "circulating_supply", "type": "uint64"}, {"name": "primary_distribution_opening_date", "type": "uint64"}, {"name": "primary_distribution_closure_date", "type": "uint64"}, {"name": "issuance_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "performance", "type": "uint8"}], "AccountInfo": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "unit_value", "type": "uint64"}, {"name": "paid_coupons", "type": "uint64"}, {"name": "suspended", "type": "bool"}]}, "desc": "\n Perpetual Bond, variable interest rate, not callable.\n ", "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMucGVycGV0dWFsX2JvbmQuY29udHJhY3QuUGVycGV0dWFsQm9uZC5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAxMDAgNDQ4IDEwMDAwIDg2NDAwIDIwMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4NTIzMzMwMjMgInN0YXR1cyIgImNpcmN1bGF0aW5nX3VuaXRzIiAiaXNzdWFuY2VfZGF0ZSIgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbnRlcmVzdF9yYXRlIiAweDAwMDAwMDAwMDAwMDAwMDAgInRvdGFsX2NvdXBvbnMiICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiICJtYXR1cml0eV9kYXRlIiAweDAwICJ1bml0X3ZhbHVlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iICJ0b3RhbF91bml0cyIgInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIiAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiICJjb3Vwb25fcGVyaW9kIiAweDUyMzIzMDIzICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtZXRhZGF0YSIgInByaW5jaXBhbF9kaXNjb3VudCIgInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIgInN1c3BlbmRlZCIgImRlZmF1bHRlZCIgInBhaWRfY291cG9uX3VuaXRzIiAweDc0Njk2ZDY1NTA2NTcyNjk2ZjY0NzMgMHg1MjM4MzAyMyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczIDB4NTIzNzMwMjMgMHg1MjM2MzAyMyAweDUyMzUzMDIzIDB4NTIzNDMwMjMgMHgwMDAwIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MyAweDA2ODEwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDEtNDIKICAgIC8vICMgUm9sZSBCYXNlZCBBY2Nlc3MgQ29udHJvbAogICAgLy8gc2VsZi5hcnJhbmdlciA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfQVJSQU5HRVIpCiAgICBieXRlYyAxOCAvLyAweDUyMzIzMDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OS02MAogICAgLy8gIyBBc3NldCBDb25maWd1cmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxOSAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MQogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkID0gVUludDY0KCkKICAgIGJ5dGVjIDUgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBzZWxmLnVuaXRfdmFsdWUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTIgLy8gInVuaXRfdmFsdWUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUtNjYKICAgIC8vICMgTWV0YWRhdGEKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBCeXRlcygpCiAgICBieXRlYyAyMCAvLyAibWV0YWRhdGEiCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OC02OQogICAgLy8gIyBTdXBwbHkKICAgIC8vIHNlbGYudG90YWxfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWMgMTQgLy8gInRvdGFsX3VuaXRzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MAogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzItNzMKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCA9IFVJbnQ2NCgpCiAgICBieXRlYyAyMSAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NS03NgogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDYgLy8gImludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgwCiAgICAvLyBzZWxmLnRvdGFsX2NvdXBvbnMgPSBVSW50NjQoKQogICAgYnl0ZWMgOCAvLyAidG90YWxfY291cG9ucyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODUKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDIyIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODgKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyLTkzCiAgICAvLyAjIFN0YXR1cwogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoY2ZnLlNUQVRVU19FTVBUWSkKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQKICAgIC8vIHNlbGYuc3VzcGVuZGVkID0gVUludDY0KCkKICAgIGJ5dGVjIDIzIC8vICJzdXNwZW5kZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1CiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IFVJbnQ2NCgpCiAgICBieXRlYyAyNCAvLyAiZGVmYXVsdGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzUtMzYKICAgIC8vICMgU3RhdGUgc2NoZW1hIHZhbGlkYXRpb24KICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV9ieXRlX3NsaWNlID09IGNmZy5HTE9CQUxfQllURVMsIGVyci5XUk9OR19HTE9CQUxfQllURVMKICAgIHR4biBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzcKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV91aW50ID09IGNmZy5HTE9CQUxfVUlOVFMsIGVyci5XUk9OR19HTE9CQUxfVUlOVFMKICAgIHR4biBHbG9iYWxOdW1VaW50CiAgICBwdXNoaW50IDIwIC8vIDIwCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBVSW50cyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzgKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkxPQ0FMX0JZVEVTLCBlcnIuV1JPTkdfTE9DQUxfQllURVMKICAgIHR4biBMb2NhbE51bUJ5dGVTbGljZQogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozOQogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fdWludCA9PSBjZmcuTE9DQUxfVUlOVFMsIGVyci5XUk9OR19MT0NBTF9VSU5UUwogICAgdHhuIExvY2FsTnVtVWludAogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIFVJbnRzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo0MS00MgogICAgLy8gIyBDb3Vwb25zCiAgICAvLyBzZWxmLmNvdXBvbl9wZXJpb2QgPSBVSW50NjQoKQogICAgYnl0ZWMgMTcgLy8gImNvdXBvbl9wZXJpb2QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo0MwogICAgLy8gc2VsZi5wYWlkX2NvdXBvbl91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAyNSAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2FmdGVyX2lmX2Vsc2VAMjkKICAgIHB1c2hieXRlc3MgMHg0ZmQ2YTNjYyAweDhjZjE0YjUxIDB4ODBlNTFlOWYgMHg0NDM2M2Q0OSAweDY3ZGI0ZjIwIDB4ZjZhOTZjOGQgMHgyMjliNzA2ZiAweDNmMGVmYzZjIDB4MjVkYmE5NWIgMHg4OTQ3NDEzNCAweDFkNmZjMjU1IDB4ZmVmNzQ1NjcgMHhiOGZjMTM5MCAweDNkNDNkMWYwIDB4ZWJkOTZiMmYgMHg2Yzg1ZTNlZSAweGY2M2FjZThkIDB4YmJjY2ExOGEgMHgxYTdiYWJiNCAweDQwMmRiYTQ3IDB4ZWQwMjc1OWYgMHhmYWQyMTczZSAweDA4ZWZlYTM1IDB4ZTRhNWFiNTQgLy8gbWV0aG9kICJhc3NldF90cmFuc2ZlcihhZGRyZXNzLGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAicGF5X2NvdXBvbihhZGRyZXNzLGJ5dGVbXSkodWludDY0LHVpbnQ2NCxieXRlW10pIiwgbWV0aG9kICJ1cGRhdGVfaW50ZXJlc3RfcmF0ZSh1aW50NjQpdWludDY0IiwgbWV0aG9kICJnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlKGFkZHJlc3MsdWludDY0KSh1aW50NjQsdWludDY0LCh1aW50NjQsdWludDY0KSkiLCBtZXRob2QgImdldF9wYXltZW50X2Ftb3VudChhZGRyZXNzKSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiZ2V0X2NvdXBvbnNfc3RhdHVzKCkodWludDY0LHVpbnQ2NCx1aW50NjQsKHVpbnQ2NCx1aW50NjQpLGJvb2wpIiwgbWV0aG9kICJnZXRfdGltZV9wZXJpb2RzKCkodWludDY0LHVpbnQ2NClbXSIsIG1ldGhvZCAiYXNzZXRfY3JlYXRlKGFkZHJlc3MsKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LGJ5dGVbMzJdLHN0cmluZykpdm9pZCIsIG1ldGhvZCAiYXNzZXRfdXBkYXRlKCh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCxieXRlWzMyXSxzdHJpbmcpKXZvaWQiLCBtZXRob2QgImFzc2V0X2NvbmZpZyh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQxNix1aW50MTZbXSx1aW50NjRbXSwodWludDY0LHVpbnQ2NClbXSl2b2lkIiwgbWV0aG9kICJzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKHVpbnQ2NFtdKSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiYXNzaWduX3JvbGUoYWRkcmVzcyx1aW50OCxieXRlW10pdWludDY0IiwgbWV0aG9kICJyZXZva2Vfcm9sZShhZGRyZXNzLHVpbnQ4KXVpbnQ2NCIsIG1ldGhvZCAib3Blbl9hY2NvdW50KGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImNsb3NlX2FjY291bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAic2V0X2Fzc2V0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInNldF9hY2NvdW50X3N1c3BlbnNpb24oYWRkcmVzcyxib29sKXVpbnQ2NCIsIG1ldGhvZCAic2V0X2RlZmF1bHRfc3RhdHVzKGJvb2wpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2luZm8oKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQxNix1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X2FjY291bnRfaW5mbyhhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wpIiwgbWV0aG9kICJnZXRfdGltZV9ldmVudHMoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSgpdWludDY0W10iLCBtZXRob2QgImdldF9hc3NldF9tZXRhZGF0YSgpKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LGJ5dGVbMzJdLHN0cmluZykiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2Fzc2V0X3RyYW5zZmVyX3JvdXRlQDUgbWFpbl9wYXlfY291cG9uX3JvdXRlQDYgbWFpbl91cGRhdGVfaW50ZXJlc3RfcmF0ZV9yb3V0ZUA3IG1haW5fZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9yb3V0ZUA4IG1haW5fZ2V0X3BheW1lbnRfYW1vdW50X3JvdXRlQDkgbWFpbl9nZXRfY291cG9uc19zdGF0dXNfcm91dGVAMTAgbWFpbl9nZXRfdGltZV9wZXJpb2RzX3JvdXRlQDExIG1haW5fYXNzZXRfY3JlYXRlX3JvdXRlQDEyIG1haW5fYXNzZXRfdXBkYXRlX3JvdXRlQDEzIG1haW5fYXNzZXRfY29uZmlnX3JvdXRlQDE0IG1haW5fc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19yb3V0ZUAxNSBtYWluX2Fzc2lnbl9yb2xlX3JvdXRlQDE2IG1haW5fcmV2b2tlX3JvbGVfcm91dGVAMTcgbWFpbl9vcGVuX2FjY291bnRfcm91dGVAMTggbWFpbl9jbG9zZV9hY2NvdW50X3JvdXRlQDE5IG1haW5fcHJpbWFyeV9kaXN0cmlidXRpb25fcm91dGVAMjAgbWFpbl9zZXRfYXNzZXRfc3VzcGVuc2lvbl9yb3V0ZUAyMSBtYWluX3NldF9hY2NvdW50X3N1c3BlbnNpb25fcm91dGVAMjIgbWFpbl9zZXRfZGVmYXVsdF9zdGF0dXNfcm91dGVAMjMgbWFpbl9nZXRfYXNzZXRfaW5mb19yb3V0ZUAyNCBtYWluX2dldF9hY2NvdW50X2luZm9fcm91dGVAMjUgbWFpbl9nZXRfdGltZV9ldmVudHNfcm91dGVAMjYgbWFpbl9nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZV9yb3V0ZUAyNyBtYWluX2dldF9hc3NldF9tZXRhZGF0YV9yb3V0ZUAyOAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIGludGNfMCAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21ldGFkYXRhX3JvdXRlQDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYXNzZXRfbWV0YWRhdGEKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGVfcm91dGVAMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF90aW1lX2V2ZW50c19yb3V0ZUAyNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X3RpbWVfZXZlbnRzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hY2NvdW50X2luZm9fcm91dGVAMjU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2FjY291bnRfaW5mbwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfaW5mb19yb3V0ZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2luZm8KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0X2RlZmF1bHRfc3RhdHVzX3JvdXRlQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9kZWZhdWx0X3N0YXR1cwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfYWNjb3VudF9zdXNwZW5zaW9uX3JvdXRlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9hY2NvdW50X3N1c3BlbnNpb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0X2Fzc2V0X3N1c3BlbnNpb25fcm91dGVAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X2Fzc2V0X3N1c3BlbnNpb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcHJpbWFyeV9kaXN0cmlidXRpb25fcm91dGVAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODAxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcHJpbWFyeV9kaXN0cmlidXRpb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fY2xvc2VfYWNjb3VudF9yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBjbG9zZV9hY2NvdW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX29wZW5fYWNjb3VudF9yb3V0ZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBvcGVuX2FjY291bnQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcmV2b2tlX3JvbGVfcm91dGVAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2ODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcmV2b2tlX3JvbGUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzaWduX3JvbGVfcm91dGVAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYXNzaWduX3JvbGUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19yb3V0ZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Fzc2V0X2NvbmZpZ19yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYXNzZXRfY29uZmlnCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Fzc2V0X3VwZGF0ZV9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgVXBkYXRlQXBwbGljYXRpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgY2FsbHN1YiBhc3NldF91cGRhdGUKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzZXRfY3JlYXRlX3JvdXRlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGNhbGxzdWIgYXNzZXRfY3JlYXRlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF90aW1lX3BlcmlvZHNfcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzkzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfdGltZV9wZXJpb2RzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9jb3Vwb25zX3N0YXR1c19yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9jb3Vwb25zX3N0YXR1cwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfcGF5bWVudF9hbW91bnRfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9wYXltZW50X2Ftb3VudAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3VwZGF0ZV9pbnRlcmVzdF9yYXRlX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiB1cGRhdGVfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9wYXlfY291cG9uX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBwYXlfY291cG9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Fzc2V0X3RyYW5zZmVyX3JvdXRlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTQ1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxNDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NldF90cmFuc2ZlcgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5wZXJwZXR1YWxfYm9uZC5jb250cmFjdC5QZXJwZXR1YWxCb25kLmFzc2V0X3RyYW5zZmVyKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCByZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogYnl0ZXMpIC0+IGJ5dGVzOgphc3NldF90cmFuc2ZlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxNDUtMTUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhc3NldF90cmFuc2ZlcigKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIHNlbmRlcl9ob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywKICAgIC8vICAgICByZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywKICAgIC8vICAgICB1bml0czogYXJjNC5VSW50NjQsCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMyAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAyCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE3NgogICAgLy8gdW5pdHMubmF0aXZlLAogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDQKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjXzMgLy8gMTAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk4LTMwMQogICAgLy8gc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5OQogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk5LTMwMAogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk5LTMwMQogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzAxCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDAtMzAxCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBmcmFtZV9kaWcgNAogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk5LTMwMQogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANQogICAgaW50Y18xIC8vIDEKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5Ny0zMDIKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vICAgICBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuU0VDT05EQVJZX01BUktFVF9DTE9TRUQKICAgIGFzc2VydCAvLyBTZWNvbmRhcnkgbWFya2V0IGlzIGNsb3NlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzc2LTM3OAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0cmFuc2ZlciByaWdodCB0byBELUFTQSBvd25lcnMuIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgcmVsYXkgb24gb3RoZXIKICAgIC8vICMgcm9sZXMsIGV4dGVybmFsIEFwcHMgdGhyb3VnaCBDMkMgY2FsbHMgKGUuZy4sIGFuIG9yZGVyIGJvb2spLCBvciBvZmYtY2hhaW4gdHJhbnNmZXIgYWdlbnRzLgogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VuZGVyX2hvbGRpbmdfYWRkcmVzcy5uYXRpdmUsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMwogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzc5CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM4MAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkLm5hdGl2ZSwgZXJyLlNVU1BFTkRFRAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjIDQgLy8gNDQ4CiAgICBnZXRiaXQKICAgIGJ5dGVjIDExIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozODQtMzg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFsKICAgIC8vICAgICByZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MKICAgIC8vIF0uc3VzcGVuZGVkLm5hdGl2ZSwgZXJyLlNVU1BFTkRFRAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50YyA0IC8vIDQ0OAogICAgZ2V0Yml0CiAgICBieXRlYyAxMSAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzg4CiAgICAvLyB1bml0cyA8PSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyA1CiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzg3LTM4OQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB1bml0cyA8PSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICAvLyApLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM5NwogICAgLy8gc2VuZGVyX3VuaXRfdmFsdWUgPSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZQogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzk4CiAgICAvLyBpZiBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgPiAwOgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Vsc2VfYm9keUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA5CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA5LTMxMAogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxMAogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA5LTMxMAogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMTQKICAgIGludGNfMSAvLyAxCgphc3NldF90cmFuc2Zlcl9ib29sX21lcmdlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA4LTMxMQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgLy8gICAgIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIC8vICksIGVyci5OT05fRlVOR0lCTEVfVU5JVFMKICAgIGFzc2VydCAvLyBTZW5kZXIgYW5kIHJlY2VpdmVyIHVuaXRzIGFyZSBub3QgZnVuZ2libGUKCmFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTc5LTE4MAogICAgLy8gIyBUcmFuc2ZlciBpcyBmb3JiaWRkZW4gaW4gY2FzZSBvZiBwZW5kaW5nIGNvdXBvbiBwYXltZW50cwogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxODEKICAgIC8vIHNlbGYuYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgLTMKICAgIGRpZyAxCiAgICBjYWxsc3ViIGFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTgzLTE4NAogICAgLy8gIyBUcmFuc2ZlcnJlZCB1bml0cyB2YWx1ZSAobXVzdCBiZSBjb21wdXRlZCBiZWZvcmUgdGhlIHRyYW5zZmVyKQogICAgLy8gc2VuZGVyX3VuaXRfdmFsdWUgPSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE4NS0xODcKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZSwgZHVlX2NvdXBvbnMKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50CiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQzNAogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSAtIHVuaXRzCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkaWcgMgogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDMzLTQzNQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSAtIHVuaXRzCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzMKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzMtNDM1CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlIC0gdW5pdHMKICAgIC8vICkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDMyCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDM3CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cwogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHVuY292ZXIgMwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDM2LTQzOAogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cwogICAgLy8gKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDM2CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzYtNDM4CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzCiAgICAvLyApCiAgICBzd2FwCiAgICByZXBsYWNlMiAzMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzYwCiAgICAvLyBpZiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgPT0gMDoKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBibnogYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAyMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzYxCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gYXJjNC5VSW50NjQoKQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICByZXBsYWNlMiA0MAogICAgZGlnIDEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM2MgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gYXJjNC5VSW50NjQoKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgNyAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIHJlcGxhY2UyIDQ4CiAgICBib3hfcHV0Cgphc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5MgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KHVuaXRzLm5hdGl2ZSAqIHNlbmRlcl91bml0X3ZhbHVlLm5hdGl2ZSArIGFjY3J1ZWRfaW50ZXJlc3QpCiAgICBmcmFtZV9kaWcgMAogICAgYnRvaQogICAgZnJhbWVfZGlnIDUKICAgICoKICAgIGZyYW1lX2RpZyAzCiAgICArCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAxNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VAMTUKCmFzc2V0X3RyYW5zZmVyX2Vsc2VfYm9keUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQwMwogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZSA9IHNlbmRlcl91bml0X3ZhbHVlCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZnJhbWVfZGlnIDAKICAgIHJlcGxhY2UyIDQwCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDA0LTQwNgogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50WwogICAgLy8gICAgIHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MKICAgIC8vIF0ucGFpZF9jb3Vwb25zCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50WwogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MDQtNDA2CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbCiAgICAvLyAgICAgc2VuZGVyX2hvbGRpbmdfYWRkcmVzcwogICAgLy8gXS5wYWlkX2NvdXBvbnMKICAgIHN3YXAKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHJlcGxhY2UyIDQ4CiAgICBib3hfcHV0CiAgICBiIGFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTcKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkgLT4gdm9pZDoKYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTAtMTExCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExMgogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmRlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI0IC8vICJkZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X3N1c3BlbmRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExNC0xMTUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTE2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjMgLy8gInN1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5wZXJwZXR1YWxfYm9uZC5jb250cmFjdC5QZXJwZXR1YWxCb25kLmNvdW50X2R1ZV9jb3Vwb25zKCkgLT4gdWludDY0Ogpjb3VudF9kdWVfY291cG9uczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo2Ni02NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBjb3VudF9kdWVfY291cG9ucyhzZWxmKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo2OAogICAgLy8gZHVlX2NvdXBvbnMgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NjkKICAgIC8vIGN1cnJlbnRfdHMgPSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NzAKICAgIC8vIGlmIGN1cnJlbnRfdHMgPiBzZWxmLmlzc3VhbmNlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgPgogICAgYnogY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NzEKICAgIC8vIGR1ZV9jb3Vwb25zID0gKGN1cnJlbnRfdHMgLSBzZWxmLmlzc3VhbmNlX2RhdGUpIC8vIHNlbGYuY291cG9uX3BlcmlvZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICAtCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImNvdXBvbl9wZXJpb2QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY291cG9uX3BlcmlvZCBleGlzdHMKICAgIC8KICAgIGZyYW1lX2J1cnkgMAoKY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjcyLTczCiAgICAvLyAgICAgIyBkaXYtYnktemVybzogY291cG9uX3BlcmlvZCAhPSAwIGR1ZSB0byBhc3NlcnRfdGltZV9wZXJpb2RzIGNoZWNrcwogICAgLy8gcmV0dXJuIGR1ZV9jb3Vwb25zCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMucGVycGV0dWFsX2JvbmQuY29udHJhY3QuUGVycGV0dWFsQm9uZC5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBkdWVfY291cG9uczogdWludDY0KSAtPiB2b2lkOgphc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo5NC05NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgZHVlX2NvdXBvbnM6IFVJbnQ2NAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6OTkKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9PSBkdWVfY291cG9ucwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgYj09CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6OTgtMTAwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9PSBkdWVfY291cG9ucwogICAgLy8gKSwgZXJyLlBFTkRJTkdfQ09VUE9OX1BBWU1FTlQKICAgIGFzc2VydCAvLyBQZW5kaW5nIGR1ZSBjb3Vwb24gcGF5bWVudAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQuYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IHVpbnQ2NCwgZHVlX2NvdXBvbnM6IHVpbnQ2NCkgLT4gdWludDY0OgphY2NydWVkX2ludGVyZXN0X2Ftb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMjctMTMwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCB1bml0czogVUludDY0LCBkdWVfY291cG9uczogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEzMS0xMzIKICAgIC8vICMgVGhlIGZvbGxvd2luZyBhc3NlcnQgc2FmZWd1YXJkcyB0aGUgc3Vicm91dGluZSBmcm9tIGZvcmJpZGRlbiBpbnZvY2F0aW9ucwogICAgLy8gc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChob2xkaW5nX2FkZHJlc3MsIGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMzMKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZGF5X2NvdW50X2ZhY3RvcgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gY291cG9uX2FjY3J1ZWRfcGVyaW9kID0gZGF5X2NvdW50X2ZhY3Rvci5udW1lcmF0b3IubmF0aXZlCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEzNQogICAgLy8gY291cG9uX3BlcmlvZCA9IGRheV9jb3VudF9mYWN0b3IuZGVub21pbmF0b3IubmF0aXZlCiAgICBzd2FwCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMzcKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgYWNjb3VudF91bml0c192YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTM3LTEzOAogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICAvLyAqIHNlbGYuaW50ZXJlc3RfcmF0ZQogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEzNy0xMzkKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgIC8vICogY291cG9uX2FjY3J1ZWRfcGVyaW9kCiAgICB1bmNvdmVyIDIKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxNDEKICAgIC8vIGNzdC5CUFMgKiBjb3Vwb25fcGVyaW9kCiAgICBpbnRjIDUgLy8gMTAwMDAKICAgIHVuY292ZXIgMgogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEzNy0xNDIKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgIC8vICogY291cG9uX2FjY3J1ZWRfcGVyaW9kCiAgICAvLyAvLyAoCiAgICAvLyAgICAgY3N0LkJQUyAqIGNvdXBvbl9wZXJpb2QKICAgIC8vICkgICMgZGl2LWJ5LXplcm86IGNvdXBvbl9wZXJpb2QgIT0gMCBkdWUgdG8gYXNzZXJ0X3RpbWVfcGVyaW9kcyBjaGVja3MKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMzYtMTQzCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gICAgICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAvLyAgICAgKiBjb3Vwb25fYWNjcnVlZF9wZXJpb2QKICAgIC8vICAgICAvLyAoCiAgICAvLyAgICAgICAgIGNzdC5CUFMgKiBjb3Vwb25fcGVyaW9kCiAgICAvLyAgICAgKSAgIyBkaXYtYnktemVybzogY291cG9uX3BlcmlvZCAhPSAwIGR1ZSB0byBhc3NlcnRfdGltZV9wZXJpb2RzIGNoZWNrcwogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQuZGF5X2NvdW50X2ZhY3RvcihkdWVfY291cG9uczogdWludDY0KSAtPiBieXRlczoKZGF5X2NvdW50X2ZhY3RvcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMDYtMTA3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGRheV9jb3VudF9mYWN0b3Ioc2VsZiwgZHVlX2NvdXBvbnM6IFVJbnQ2NCkgLT4gdHlwLkRheUNvdW50RmFjdG9yOgogICAgcHJvdG8gMSAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gNAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEwOC0xMDkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gaWYgbm90IGR1ZV9jb3Vwb25zOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogZGF5X2NvdW50X2ZhY3Rvcl9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjExMAogICAgLy8gYWNjcnVpbmdfc3RhcnRfdGltZSA9IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjExMwogICAgLy8gY291cG9uX2FjY3J1ZWRfcGVyaW9kID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgLSBhY2NydWluZ19zdGFydF90aW1lCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBzd2FwCiAgICAtCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjExNAogICAgLy8gY291cG9uX3BlcmlvZCA9IHNlbGYuY291cG9uX3BlcmlvZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjb3Vwb25fcGVyaW9kIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAzCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb3Vwb25fcGVyaW9kIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjExNQogICAgLy8gaWYgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9PSBVSW50NjQoY3N0LkRDQ19BX0EpOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgNAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAxCiAgICBibnogZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1NgogICAgLy8gcmV0dXJuIHRpbWVfcGVyaW9kIC8vIFVJbnQ2NChjc3QuREFZXzJfU0VDKQogICAgZnJhbWVfZGlnIDAKICAgIGludGMgNiAvLyA4NjQwMAogICAgLwogICAgZnJhbWVfZGlnIDMKICAgIGludGMgNiAvLyA4NjQwMAogICAgLwogICAgZnJhbWVfYnVyeSA0CiAgICBmcmFtZV9idXJ5IDEKCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTE5CiAgICAvLyBudW1lcmF0b3I9YXJjNC5VSW50NjQoY291cG9uX2FjY3J1ZWRfcGVyaW9kKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMjAKICAgIC8vIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGNvdXBvbl9wZXJpb2QpLAogICAgc3dhcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjExOC0xMjEKICAgIC8vIHJldHVybiB0eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgbnVtZXJhdG9yPWFyYzQuVUludDY0KGNvdXBvbl9hY2NydWVkX3BlcmlvZCksCiAgICAvLyAgICAgZGVub21pbmF0b3I9YXJjNC5VSW50NjQoY291cG9uX3BlcmlvZCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpkYXlfY291bnRfZmFjdG9yX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjgxCiAgICAvLyBjb3Vwb25fZHVlX2RhdGUgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBpZiBkdWVfY291cG9ucyA+PSBVSW50NjQoMSk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJ6IGRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6ODMKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IHNlbGYuY291cG9uX2R1ZV9kYXRlKGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGNvdXBvbl9kdWVfZGF0ZQogICAgZnJhbWVfYnVyeSAyCgpkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAODoKICAgIGZyYW1lX2RpZyAyCiAgICBiIGRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQuY291cG9uX2R1ZV9kYXRlKGNvdXBvbjogdWludDY0KSAtPiB1aW50NjQ6CmNvdXBvbl9kdWVfZGF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo3NS03NgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBjb3Vwb25fZHVlX2RhdGUoc2VsZiwgY291cG9uOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyByZXR1cm4gc2VsZi5pc3N1YW5jZV9kYXRlICsgY291cG9uICogc2VsZi5jb3Vwb25fcGVyaW9kCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjb3Vwb25fcGVyaW9kIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdXBvbl9wZXJpb2QgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgICsKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IHVpbnQ2NCkgLT4gdWludDY0OgphY2NvdW50X3VuaXRzX3ZhbHVlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzQyLTM0NQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhY2NvdW50X3VuaXRzX3ZhbHVlKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCB1bml0czogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzQ2CiAgICAvLyByZXR1cm4gdW5pdHMgKiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlLm5hdGl2ZQogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQucGF5X2NvdXBvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBwYXltZW50X2luZm86IGJ5dGVzKSAtPiBieXRlczoKcGF5X2NvdXBvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOTQtMTk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBwYXlfY291cG9uKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCBwYXltZW50X2luZm86IGFyYzQuRHluYW1pY0J5dGVzCiAgICAvLyApIC0+IHR5cC5QYXltZW50UmVzdWx0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDQKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjXzMgLy8gMTAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIxNy0yMTgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCByZXN0cmljdCBjYWxsZXIgYXV0aG9yaXphdGlvbgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyMTkKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIyMAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cG4gMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gdW5pdHMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIyMwogICAgLy8gYXNzZXJ0IHVuaXRzID4gMCwgZXJyLk5PX1VOSVRTCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyMjQKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjI1CiAgICAvLyBhY2NvdW50X3BhaWRfY291cG9ucyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucy5uYXRpdmUKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIyNgogICAgLy8gYXNzZXJ0IGR1ZV9jb3Vwb25zID4gYWNjb3VudF9wYWlkX2NvdXBvbnMsIGVyci5OT19EVUVfQ09VUE9OCiAgICBzd2FwCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjb3Vwb24gdG8gcGF5CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjI3LTIzMAogICAgLy8gIyBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgdmVyaWZ5IGlmIG90aGVyIGFjY291bnRzIGFyZSBzdGlsbCB3YWl0aW5nIGZvciB0aGUgcGF5bWVudCBvZiBwcmV2aW91cyBjb3Vwb25zCiAgICAvLyBhc3NlcnQgc2VsZi5hbGxfZHVlX2NvdXBvbnNfcGFpZCgKICAgIC8vICAgICBhY2NvdW50X3BhaWRfY291cG9ucwogICAgLy8gKSwgZXJyLlBFTkRJTkdfQ09VUE9OX1BBWU1FTlQKICAgIGNhbGxzdWIgYWxsX2R1ZV9jb3Vwb25zX3BhaWQKICAgIGFzc2VydCAvLyBQZW5kaW5nIGR1ZSBjb3Vwb24gcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzE2CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MubmF0aXZlLmlzX29wdGVkX2luKAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMiAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxNwogICAgLy8gQXNzZXQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxNi0zMTgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5uYXRpdmUuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgQXNzZXQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgLy8gKQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxNi0zMTkKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5uYXRpdmUuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgQXNzZXQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgLy8gKQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQubmF0aXZlCiAgICBieiBwYXlfY291cG9uX2Jvb2xfZmFsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxOQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQubmF0aXZlCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGMgNCAvLyA0NDgKICAgIGdldGJpdAogICAgYnl0ZWMgMTEgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBibnogcGF5X2NvdXBvbl9ib29sX2ZhbHNlQDE0CiAgICBpbnRjXzEgLy8gMQoKcGF5X2NvdXBvbl9ib29sX21lcmdlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gaWYgc2VsZi5pc19wYXltZW50X2V4ZWN1dGFibGUoaG9sZGluZ19hZGRyZXNzKToKICAgIGJ6IHBheV9jb3Vwb25fZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyMzUKICAgIC8vIHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgYWNjb3VudF90b3RhbF91bml0c192YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHByaW5jaXBhbF9hbW91bnQgKiBzZWxmLmludGVyZXN0X3JhdGUgLy8gY3N0LkJQUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgICoKICAgIGludGMgNSAvLyAxMDAwMAogICAgLwogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjUKICAgIC8vIEFzc2V0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCkuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyNS0zMjYKICAgIC8vIEFzc2V0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCkuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gPj0gcGF5bWVudF9hbW91bnQKICAgIGRpZyAxCiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzI0LTMyNwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBBc3NldChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vICAgICA+PSBwYXltZW50X2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIzOS0yNDAKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgdGhlIHNhbWUgYXNzZXQgZm9yIGRlbm9taW5hdGlvbiBhbmQgc2V0dGxlbWVudCwgbm8gY29udmVyc2lvbiBuZWVkZWQKICAgIC8vIHNlbGYucGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgcGF5bWVudF9hbW91bnQpCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMiAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMzMS0zMzYKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlci5uYXRpdmUsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzM1CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzMyCiAgICAvLyB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzMxCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMzEtMzM2CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIubmF0aXZlLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CgpwYXlfY291cG9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNDYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucy5uYXRpdmUgKyAxCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNDUtMjQ3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMubmF0aXZlICsgMQogICAgLy8gKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gYXJjNC5VSW50NjQoCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNDUtMjQ3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMubmF0aXZlICsgMQogICAgLy8gKQogICAgc3dhcAogICAgcmVwbGFjZTIgNDgKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNDgKICAgIC8vIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNSAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgZXhpc3RzCiAgICBmcmFtZV9kaWcgMQogICAgKwogICAgYnl0ZWMgMjUgLy8gInBhaWRfY291cG9uX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNTAKICAgIC8vIGFtb3VudD1hcmM0LlVJbnQ2NChwYXltZW50X2Ftb3VudCksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjUxCiAgICAvLyB0aW1lc3RhbXA9YXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI0OS0yNTMKICAgIC8vIHJldHVybiB0eXAuUGF5bWVudFJlc3VsdCgKICAgIC8vICAgICBhbW91bnQ9YXJjNC5VSW50NjQocGF5bWVudF9hbW91bnQpLAogICAgLy8gICAgIHRpbWVzdGFtcD1hcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCksCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8uY29weSgpLCAgIyBUT0RPOiBBZGQgaW5mbyBvbiBmYWlsZWQgcGF5bWVudAogICAgLy8gKQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDEyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKcGF5X2NvdXBvbl9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNDItMjQzCiAgICAvLyAjIEFjY291bnRzIHN1c3BlbmRlZCBvciBub3Qgb3B0ZWQgaW4gYXQgdGhlIHRpbWUgb2YgcGF5bWVudHMgbXVzdCBub3Qgc3RhbGwgdGhlIEQtQVNBCiAgICAvLyBwYXltZW50X2Ftb3VudCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgYiBwYXlfY291cG9uX2FmdGVyX2lmX2Vsc2VAMwoKcGF5X2NvdXBvbl9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIGIgcGF5X2NvdXBvbl9ib29sX21lcmdlQDE1CgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQuYWxsX2R1ZV9jb3Vwb25zX3BhaWQoZHVlX2NvdXBvbnM6IHVpbnQ2NCkgLT4gdWludDY0OgphbGxfZHVlX2NvdXBvbnNfcGFpZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo5MC05MQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhbGxfZHVlX2NvdXBvbnNfcGFpZChzZWxmLCBkdWVfY291cG9uczogVUludDY0KSAtPiBib29sOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6OTIKICAgIC8vIHJldHVybiBzZWxmLnBhaWRfY291cG9uX3VuaXRzID49IHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBkdWVfY291cG9ucwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI1IC8vICJwYWlkX2NvdXBvbl91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wYWlkX2NvdXBvbl91bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgPj0KICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gdWludDY0OgphY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzQ4LTM0OQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzKSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1MQogICAgLy8gaG9sZGluZ19hZGRyZXNzLCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNTAtMzUyCiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKAogICAgLy8gICAgIGhvbGRpbmdfYWRkcmVzcywgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGNhbGxzdWIgYWNjb3VudF91bml0c192YWx1ZQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQudXBkYXRlX2ludGVyZXN0X3JhdGUoaW50ZXJlc3RfcmF0ZTogYnl0ZXMpIC0+IGJ5dGVzOgp1cGRhdGVfaW50ZXJlc3RfcmF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNTUtMjU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiB1cGRhdGVfaW50ZXJlc3RfcmF0ZShzZWxmLCBpbnRlcmVzdF9yYXRlOiBhcmM0LlVJbnQ2NCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNjYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgYnl0ZWMgMjcgLy8gMHg1MjM4MzAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTY0CiAgICAvLyBjYWxsZXIgPSBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gY2FsbGVyIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNjYtMTY5CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vIGFuZCBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiB1cGRhdGVfaW50ZXJlc3RfcmF0ZV9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE2NwogICAgLy8gYW5kIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X29yYWNsZSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTY4CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTY3LTE2OAogICAgLy8gYW5kIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE2Ny0xNjkKICAgIC8vIGFuZCBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiB1cGRhdGVfaW50ZXJlc3RfcmF0ZV9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE2OQogICAgLy8gPD0gc2VsZi5pbnRlcmVzdF9vcmFjbGVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X29yYWNsZSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTY4LTE2OQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuaW50ZXJlc3Rfb3JhY2xlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE2Ny0xNjkKICAgIC8vIGFuZCBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiB1cGRhdGVfaW50ZXJlc3RfcmF0ZV9ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgp1cGRhdGVfaW50ZXJlc3RfcmF0ZV9ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNjUtMTcwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgLy8gICAgIGFuZCBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYuaW50ZXJlc3Rfb3JhY2xlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6Mjc0CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNzUKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6Mjc2CiAgICAvLyBhc3NlcnQgc2VsZi5hbGxfZHVlX2NvdXBvbnNfcGFpZChkdWVfY291cG9ucyksIGVyci5QRU5ESU5HX0NPVVBPTl9QQVlNRU5UCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNzgtMjc5CiAgICAvLyAjIFVwZGF0ZSBpbnRlcmVzdCByYXRlCiAgICAvLyBzZWxmLmludGVyZXN0X3JhdGUgPSBpbnRlcmVzdF9yYXRlLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBieXRlYyA2IC8vICJpbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyODAKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgp1cGRhdGVfaW50ZXJlc3RfcmF0ZV9ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiB1cGRhdGVfaW50ZXJlc3RfcmF0ZV9ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMucGVycGV0dWFsX2JvbmQuY29udHJhY3QuUGVycGV0dWFsQm9uZC5nZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjgyLTI4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZSgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgdW5pdHM6IGFyYzQuVUludDY0CiAgICAvLyApIC0+IHR5cC5DdXJyZW50VW5pdHNWYWx1ZToKICAgIHByb3RvIDIgMQogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzAzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzAzLTMwNAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMDQKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMwMy0zMDQKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzEgLy8gMQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzAyLTMwNQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gICAgIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gKSwgZXJyLk5PX1BSSU1BUllfRElTVFJJQlVUSU9OCiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gbm90IHlldCBleGVjdXRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMwOAogICAgLy8gMCA8IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBieXRlYyA3IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYj4KICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA3CiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtMQogICAgYj49CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VANwogICAgaW50Y18xIC8vIDEKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMwNy0zMDkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgMCA8IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfVU5JVFMKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFtb3VudCBvZiB1bml0cyBmb3IgdGhlIGFjY291bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMTMKICAgIC8vIGhvbGRpbmdfYWRkcmVzcywgdW5pdHMubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzExLTMxNAogICAgLy8gIyBWYWx1ZSBkdXJpbmcgcHJpbWFyeSBkaXN0cmlidXRpb24KICAgIC8vIGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSA9IHNlbGYuYWNjb3VudF91bml0c192YWx1ZSgKICAgIC8vICAgICBob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZQogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMxNS0zMTYKICAgIC8vICMgQWNjcnVpbmcgaW50ZXJlc3QgZHVyaW5nIHByaW1hcnkgZGlzdHJpYnV0aW9uCiAgICAvLyBhY2NydWVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMTcKICAgIC8vIG51bWVyYXRvciA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzE4CiAgICAvLyBkZW5vbWluYXRvciA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzIwLTMyMQogICAgLy8gIyBBY2NydWluZyBpbnRlcmVzdAogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzIyCiAgICAvLyBzZWxmLmFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50KGhvbGRpbmdfYWRkcmVzcywgZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGNhbGxzdWIgYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMjMKICAgIC8vIGlmIHNlbGYuaXNfYWNjcnVpbmdfaW50ZXJlc3QoKToKICAgIGNhbGxzdWIgaXNfYWNjcnVpbmdfaW50ZXJlc3QKICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMyNAogICAgLy8gZGF5X2NvdW50X2ZhY3RvciA9IHNlbGYuZGF5X2NvdW50X2ZhY3RvcihkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNhbGxzdWIgZGF5X2NvdW50X2ZhY3RvcgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMyNS0zMjcKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIGhvbGRpbmdfYWRkcmVzcywgdW5pdHMubmF0aXZlLCBkdWVfY291cG9ucwogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgNgogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50CiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMjgKICAgIC8vIG51bWVyYXRvciA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yLm5hdGl2ZQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMyOQogICAgLy8gZGVub21pbmF0b3IgPSBkYXlfY291bnRfZmFjdG9yLmRlbm9taW5hdG9yLm5hdGl2ZQogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBmcmFtZV9idXJ5IDMKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMzEKICAgIC8vIHVuaXRzX3ZhbHVlPWFyYzQuVUludDY0KGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSksCiAgICBmcmFtZV9kaWcgMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMzMgogICAgLy8gYWNjcnVlZF9pbnRlcmVzdD1hcmM0LlVJbnQ2NChhY2NydWVkX2ludGVyZXN0KSwKICAgIGZyYW1lX2RpZyAyCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzM0CiAgICAvLyBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIGZyYW1lX2RpZyA1CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzM1CiAgICAvLyBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICBmcmFtZV9kaWcgMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMzMy0zMzYKICAgIC8vIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChudW1lcmF0b3IpLAogICAgLy8gICAgIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGRlbm9taW5hdG9yKSwKICAgIC8vICksCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMzAtMzM3CiAgICAvLyByZXR1cm4gdHlwLkN1cnJlbnRVbml0c1ZhbHVlKAogICAgLy8gICAgIHVuaXRzX3ZhbHVlPWFyYzQuVUludDY0KGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSksCiAgICAvLyAgICAgYWNjcnVlZF9pbnRlcmVzdD1hcmM0LlVJbnQ2NChhY2NydWVkX2ludGVyZXN0KSwKICAgIC8vICAgICBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICAgICAgbnVtZXJhdG9yPWFyYzQuVUludDY0KG51bWVyYXRvciksCiAgICAvLyAgICAgICAgIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGRlbm9taW5hdG9yKSwKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMCAvLyAwCiAgICBiIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA4CgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICBiIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQuaXNfYWNjcnVpbmdfaW50ZXJlc3QoKSAtPiB1aW50NjQ6CmlzX2FjY3J1aW5nX2ludGVyZXN0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEyMy0xMjQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgaXNfYWNjcnVpbmdfaW50ZXJlc3Qoc2VsZikgLT4gYm9vbDoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEyNQogICAgLy8gcmV0dXJuIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIGJ6IGlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VAMwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgID4KICAgIGJ6IGlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKaXNfYWNjcnVpbmdfaW50ZXJlc3RfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMjUKICAgIC8vIHJldHVybiBzZWxmLmlzc3VhbmNlX2RhdGUgIT0gMCBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5wZXJwZXR1YWxfYm9uZC5jb250cmFjdC5QZXJwZXR1YWxCb25kLmdldF9wYXltZW50X2Ftb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X3BheW1lbnRfYW1vdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMzOS0zNDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9wYXltZW50X2Ftb3VudChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcykgLT4gdHlwLlBheW1lbnRBbW91bnRzOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNTUKICAgIC8vIHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWNjb3VudF90b3RhbF91bml0c192YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM1NgogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzU1LTM1NgogICAgLy8gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcykKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzU3CiAgICAvLyAvLyBjc3QuQlBTCiAgICBpbnRjIDUgLy8gMTAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNTUtMzU3CiAgICAvLyBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKQogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgIC8vIC8vIGNzdC5CUFMKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNjAKICAgIC8vIGludGVyZXN0PWFyYzQuVUludDY0KGludGVyZXN0X2Ftb3VudCksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzYxCiAgICAvLyBwcmluY2lwYWw9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzU5LTM2MgogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50QW1vdW50cygKICAgIC8vICAgICBpbnRlcmVzdD1hcmM0LlVJbnQ2NChpbnRlcmVzdF9hbW91bnQpLAogICAgLy8gICAgIHByaW5jaXBhbD1hcmM0LlVJbnQ2NCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMucGVycGV0dWFsX2JvbmQuY29udHJhY3QuUGVycGV0dWFsQm9uZC5nZXRfY291cG9uc19zdGF0dXMoKSAtPiBieXRlczoKZ2V0X2NvdXBvbnNfc3RhdHVzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM2NC0zNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9jb3Vwb25zX3N0YXR1cyhzZWxmKSAtPiB0eXAuQ291cG9uc0luZm86CiAgICBwcm90byAwIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDQKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjXzMgLy8gMTAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM3MwogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkgaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkgZWxzZSBVSW50NjQoKQogICAgYnogZ2V0X2NvdXBvbnNfc3RhdHVzX3Rlcm5hcnlfZmFsc2VAMgogICAgY2FsbHN1YiBjb3VudF9kdWVfY291cG9ucwogICAgZnJhbWVfYnVyeSAyCgpnZXRfY291cG9uc19zdGF0dXNfdGVybmFyeV9tZXJnZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5Ojg4CiAgICAvLyByZXR1cm4gc2VsZi5jb3Vwb25fZHVlX2RhdGUoZHVlX2NvdXBvbnMgKyAxKQogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGNhbGxzdWIgY291cG9uX2R1ZV9kYXRlCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNzUKICAgIC8vIGFsbF9kdWVfY291cG9uc19wYWlkID0gc2VsZi5hbGxfZHVlX2NvdXBvbnNfcGFpZChkdWVfY291cG9ucykKICAgIGNhbGxzdWIgYWxsX2R1ZV9jb3Vwb25zX3BhaWQKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM3NgogICAgLy8gbnVtZXJhdG9yID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNzcKICAgIC8vIGRlbm9taW5hdG9yID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNzgKICAgIC8vIGlmIHNlbGYuaXNfYWNjcnVpbmdfaW50ZXJlc3QoKToKICAgIGNhbGxzdWIgaXNfYWNjcnVpbmdfaW50ZXJlc3QKICAgIGJ6IGdldF9jb3Vwb25zX3N0YXR1c19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNzkKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgMgogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzgwCiAgICAvLyBudW1lcmF0b3IgPSBkYXlfY291bnRfZmFjdG9yLm51bWVyYXRvci5uYXRpdmUKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozODEKICAgIC8vIGRlbm9taW5hdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvci5uYXRpdmUKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfYnVyeSAxCgpnZXRfY291cG9uc19zdGF0dXNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM4MwogICAgLy8gdG90YWxfY291cG9ucz1hcmM0LlVJbnQ2NChzZWxmLnRvdGFsX2NvdXBvbnMpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozODQKICAgIC8vIGR1ZV9jb3Vwb25zPWFyYzQuVUludDY0KGR1ZV9jb3Vwb25zKSwKICAgIGZyYW1lX2RpZyAyCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6Mzg1CiAgICAvLyBuZXh0X2NvdXBvbl9kdWVfZGF0ZT1hcmM0LlVJbnQ2NChuZXh0X2NvdXBvbl9kdWVfZGF0ZSksCiAgICBmcmFtZV9kaWcgMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM4NwogICAgLy8gbnVtZXJhdG9yPWFyYzQuVUludDY0KG51bWVyYXRvciksCiAgICBmcmFtZV9kaWcgNAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM4OAogICAgLy8gZGVub21pbmF0b3I9YXJjNC5VSW50NjQoZGVub21pbmF0b3IpLAogICAgZnJhbWVfZGlnIDEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozODYtMzg5CiAgICAvLyBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIC8vICAgICBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICAvLyApLAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzkwCiAgICAvLyBhbGxfZHVlX2NvdXBvbnNfcGFpZD1hcmM0LkJvb2woYWxsX2R1ZV9jb3Vwb25zX3BhaWQpLAogICAgYnl0ZWMgMTEgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAwCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozODItMzkxCiAgICAvLyByZXR1cm4gdHlwLkNvdXBvbnNJbmZvKAogICAgLy8gICAgIHRvdGFsX2NvdXBvbnM9YXJjNC5VSW50NjQoc2VsZi50b3RhbF9jb3Vwb25zKSwKICAgIC8vICAgICBkdWVfY291cG9ucz1hcmM0LlVJbnQ2NChkdWVfY291cG9ucyksCiAgICAvLyAgICAgbmV4dF9jb3Vwb25fZHVlX2RhdGU9YXJjNC5VSW50NjQobmV4dF9jb3Vwb25fZHVlX2RhdGUpLAogICAgLy8gICAgIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIC8vICAgICAgICAgZGVub21pbmF0b3I9YXJjNC5VSW50NjQoZGVub21pbmF0b3IpLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYWxsX2R1ZV9jb3Vwb25zX3BhaWQ9YXJjNC5Cb29sKGFsbF9kdWVfY291cG9uc19wYWlkKSwKICAgIC8vICkKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X2NvdXBvbnNfc3RhdHVzX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNzMKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpIGVsc2UgVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgZ2V0X2NvdXBvbnNfc3RhdHVzX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5wZXJwZXR1YWxfYm9uZC5jb250cmFjdC5QZXJwZXR1YWxCb25kLmdldF90aW1lX3BlcmlvZHMoKSAtPiBieXRlczoKZ2V0X3RpbWVfcGVyaW9kczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozOTMtMzk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfdGltZV9wZXJpb2RzKHNlbGYpIC0+IHR5cC5UaW1lUGVyaW9kczoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjQwMQogICAgLy8gdGltZV9wZXJpb2RzID0gdHlwLlRpbWVQZXJpb2RzKCkKICAgIGJ5dGVjIDMzIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA0CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18zIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo0MDIKICAgIC8vIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpOgogICAgYnogZ2V0X3RpbWVfcGVyaW9kc19hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo0MDMKICAgIC8vIHRpbWVfcGVyaW9kcyA9IHNlbGYudGltZV9wZXJpb2RzLnZhbHVlLmNvcHkoKQogICAgYnl0ZWMgMjYgLy8gMHg3NDY5NmQ2NTUwNjU3MjY5NmY2NDczCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRpbWVfcGVyaW9kcyBleGlzdHMKCmdldF90aW1lX3BlcmlvZHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gcmV0dXJuIHRpbWVfcGVyaW9kcwogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2V0X2NyZWF0ZShhcnJhbmdlcjogYnl0ZXMsIG1ldGFkYXRhOiBieXRlcykgLT4gdm9pZDoKYXNzZXRfY3JlYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDYxLTQ2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICAvLyBkZWYgYXNzZXRfY3JlYXRlKHNlbGYsIGFycmFuZ2VyOiBhcmM0LkFkZHJlc3MsIG1ldGFkYXRhOiB0eXAuQXNzZXRNZXRhZGF0YSkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gYXJyYW5nZXIubmF0aXZlCiAgICBieXRlYyAxOCAvLyAweDUyMzIzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzEKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YS5ieXRlcwogICAgYnl0ZWMgMjAgLy8gIm1ldGFkYXRhIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXRfdXBkYXRlKG1ldGFkYXRhOiBieXRlcykgLT4gdm9pZDoKYXNzZXRfdXBkYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDczLTQ3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIGFzc2V0X3VwZGF0ZShzZWxmLCBtZXRhZGF0YTogdHlwLkFzc2V0TWV0YWRhdGEpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3OC00ODEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgZGlzYWJsZSBELUFTQSBhcHBsaWNhdGlvbiB1cGRhdGFiaWxpdHkgb3IgY2hhbmdlIGl0cyBhdXRob3JpemF0aW9ucy4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleSBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ4MgogICAgLy8gc2VsZi5tZXRhZGF0YSA9IG1ldGFkYXRhLmJ5dGVzCiAgICBieXRlYyAyMCAvLyAibWV0YWRhdGEiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExOC0xMTkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYuYXJyYW5nZXIudmFsdWUsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAweDUyMzIzMDIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NldF9jb25maWcoZGVub21pbmF0aW9uX2Fzc2V0X2lkOiBieXRlcywgc2V0dGxlbWVudF9hc3NldF9pZDogYnl0ZXMsIHByaW5jaXBhbDogYnl0ZXMsIHByaW5jaXBhbF9kaXNjb3VudDogYnl0ZXMsIG1pbmltdW1fZGVub21pbmF0aW9uOiBieXRlcywgZGF5X2NvdW50X2NvbnZlbnRpb246IGJ5dGVzLCBpbnRlcmVzdF9yYXRlOiBieXRlcywgY291cG9uX3JhdGVzOiBieXRlcywgdGltZV9ldmVudHM6IGJ5dGVzLCB0aW1lX3BlcmlvZHM6IGJ5dGVzKSAtPiB2b2lkOgphc3NldF9jb25maWc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0ODQtNDk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhc3NldF9jb25maWcoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHByaW5jaXBhbDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgcHJpbmNpcGFsX2Rpc2NvdW50OiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBtaW5pbXVtX2Rlbm9taW5hdGlvbjogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb246IGFyYzQuVUludDgsCiAgICAvLyAgICAgaW50ZXJlc3RfcmF0ZTogYXJjNC5VSW50MTYsCiAgICAvLyAgICAgY291cG9uX3JhdGVzOiB0eXAuQ291cG9uUmF0ZXMsCiAgICAvLyAgICAgdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzLAogICAgLy8gICAgIHRpbWVfcGVyaW9kczogdHlwLlRpbWVQZXJpb2RzLAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMTAgMAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MjcKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUyOAogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfRU1QVFksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTMwLTUzMQogICAgLy8gIyBTZXQgRGVub21pbmF0aW9uIEFzc2V0CiAgICAvLyBzZWxmLmFzc2VydF9kZW5vbWluYXRpb25fYXNzZXQoZGVub21pbmF0aW9uX2Fzc2V0X2lkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMTAKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTgwCiAgICAvLyBkZW5vbWluYXRpb25fYXNzZXRfaWQgIT0gVUludDY0KDApIGFuZCBBc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQpLmNyZWF0b3IKICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQKICAgIGZyYW1lX2RpZyA0CiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCmFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzgtMTgxCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQgIT0gVUludDY0KDApIGFuZCBBc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQpLmNyZWF0b3IKICAgIC8vICksIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODUKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZnJhbWVfZGlnIDQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzQtNTM1CiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuYXNzZXJ0X3NldHRsZW1lbnRfYXNzZXQoc2V0dGxlbWVudF9hc3NldF9pZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTkKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkIGV4aXN0cwogICAgZGlnIDEKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODktMTkyCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyA1IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5Ny0yMDMKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5OQogICAgLy8geGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjAwCiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk3LTE5OAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTctMjAzCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQwCiAgICAvLyBwcmluY2lwYWwubmF0aXZlICUgbWluaW11bV9kZW5vbWluYXRpb24ubmF0aXZlID09IDAKICAgIGZyYW1lX2RpZyAtOAogICAgYnRvaQogICAgZnJhbWVfZGlnIC02CiAgICBidG9pCiAgICBkdXAyCiAgICAlCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzgtNTQxCiAgICAvLyAjIFNldCBQcmluY2lwYWwgYW5kIE1pbmltdW0gRGVub21pbmF0aW9uCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByaW5jaXBhbC5uYXRpdmUgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUgPT0gMAogICAgLy8gKSwgZXJyLklOVkFMSURfTUlOSU1VTV9ERU5PTUlOQVRJT04KICAgIGFzc2VydCAvLyBNaW5pbXVtIGRlbm9taW5hdGlvbiBpcyBub3QgYSBkaXZpc29yIG9mIHByaW5jaXBhbAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQyCiAgICAvLyBzZWxmLnVuaXRfdmFsdWUgPSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUKICAgIGJ5dGVjIDEyIC8vICJ1bml0X3ZhbHVlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NDMKICAgIC8vIHNlbGYudG90YWxfdW5pdHMgPSBwcmluY2lwYWwubmF0aXZlIC8vIG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZQogICAgLwogICAgYnl0ZWMgMTQgLy8gInRvdGFsX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU0NAogICAgLy8gc2VsZi5wcmluY2lwYWxfZGlzY291bnQgPSBwcmluY2lwYWxfZGlzY291bnQubmF0aXZlCiAgICBmcmFtZV9kaWcgLTcKICAgIGJ0b2kKICAgIGJ5dGVjIDIxIC8vICJwcmluY2lwYWxfZGlzY291bnQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQ2LTU0NwogICAgLy8gIyBTZXQgRGF5LUNvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuYXNzZXJ0X2RheV9jb3VudF9jb252ZW50aW9uKGRheV9jb3VudF9jb252ZW50aW9uLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtNQogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNy0yMTEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGZyYW1lX2RpZyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTAKICAgIC8vIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgcHVzaGludCAyNTUgLy8gMjU1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDctMjExCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICA9PQogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmFzc2V0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDctMjExCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICBhc3NlcnQgLy8gSW52YWxpZCBkYXktY291bnQgY29udmVudGlvbiBJRAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjE1CiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIGJ5dGVjIDEzIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGZyYW1lX2RpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTUwLTU1MQogICAgLy8gIyBTZXQgSW50ZXJlc3QgUmF0ZQogICAgLy8gc2VsZi5hc3NlcnRfaW50ZXJlc3RfcmF0ZShpbnRlcmVzdF9yYXRlLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtNAogICAgYnRvaQogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTktMjIwCiAgICAvLyAjIFRoaXMgc3Vicm91dGluZSBtdXN0IGJlIHVzZWQgYWZ0ZXIgdGhlIHByaW5jaXBhbCBkaXNjb3VudCBoYXMgYmVlbiBzZXQKICAgIC8vIGlmIG5vdCBzZWxmLnByaW5jaXBhbF9kaXNjb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMSAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIGJueiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjIxCiAgICAvLyBhc3NlcnQgaW50ZXJlc3RfcmF0ZSA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfSU5URVJFU1RfUkFURQogICAgZnJhbWVfZGlnIDIKICAgIGFzc2VydCAvLyBJbnRlcmVzdCByYXRlIGlzIG5vdCBwcm9wZXJseSBkZWZpbmVkCgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gc2VsZi5pbnRlcmVzdF9yYXRlID0gaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgNiAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIGZyYW1lX2RpZyAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjI5CiAgICAvLyBhc3NlcnQgbm90IGNvdXBvbl9yYXRlcy5sZW5ndGgsIGVyci5JTlZBTElEX0NPVVBPTl9SQVRFUwogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgIQogICAgYXNzZXJ0IC8vIENvdXBvbiByYXRlcyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gc2VsZi50b3RhbF9jb3Vwb25zID0gY291cG9uX3JhdGVzLmxlbmd0aAogICAgYnl0ZWMgOCAvLyAidG90YWxfY291cG9ucyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMzQKICAgIC8vIGlmIHNlbGYudG90YWxfY291cG9uczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBieiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjM1CiAgICAvLyBzZWxmLmNvdXBvbl9yYXRlcy52YWx1ZSA9IGNvdXBvbl9yYXRlcy5jb3B5KCkKICAgIGJ5dGVjIDM0IC8vIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MwogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyAzNCAvLyAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMKICAgIGZyYW1lX2RpZyAtMwogICAgYm94X3B1dAoKYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NDkKICAgIC8vIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFMKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgcHVzaGludCAzIC8vIDMKICAgICsKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NDctNTAKICAgIC8vICMgVGhlIHBlcnBldHVhbCBib25kIGhhcyB1bmRlZmluZWQgY291cG9ucyAodG90YWxfY291cG9ucyA9IDApIGFuZCBubyBtYXR1cml0eSBkYXRlCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFMKICAgIC8vICksIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NjAKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCh0aW1lX2V2ZW50cykKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjUKICAgIC8vIHNlbGYudGltZV9ldmVudHMudmFsdWUgPSB0aW1lX2V2ZW50cy5jb3B5KCkKICAgIGJ5dGVjIDI4IC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMjggLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjYtMjY4CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICBieXRlYyA5IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjYtMjY4CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2OS0yNzEKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBkdXAKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY5CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgYnl0ZWMgMjIgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2OS0yNzEKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjcyCiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgPSB0aW1lX2V2ZW50c1tjZmcuSVNTVUFOQ0VfREFURV9JRFhdLm5hdGl2ZQogICAgZXh0cmFjdCAxNiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzQtMjc1CiAgICAvLyAjIFNvbWUgRC1BU0EgbWF5IG5vdCBoYXZlIGEgbWF0dXJpdHkgZGF0ZSAoZS5nLiwgcGVycGV0dWFscykKICAgIC8vIGlmIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBwdXNoaW50IDQgLy8gNAogICAgKwogICAgPT0KICAgIGJ6IGFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDM4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzYKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRpbWVfZXZlbnRzW2NmZy5NQVRVUklUWV9EQVRFX0lEWF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnl0ZWMgMTAgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NTQtNTUKICAgIC8vICMgVGhlIHBlcnBldHVhbCBib25kIGRlZmluZXMgYSBzaW5nbGUgdGltZSBwZXJpb2QgZm9yIHRoZSBjb3Vwb24gZHVyYXRpb24gd2l0aCB1bmxpbWl0ZWQgcmVwZXRpdGlvbnMKICAgIC8vIGFzc2VydCB0aW1lX3BlcmlvZHMubGVuZ3RoID09IFVJbnQ2NCgxKSwgZXJyLklOVkFMSURfVElNRV9QRVJJT0RTCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGFyZSBub3QgcHJvcGVybHkgZGVmaW5lZAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBjb3Vwb25fcGVyaW9kX2R1cmF0aW9uID0gdGltZV9wZXJpb2RzWzBdWzBdLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZXh0cmFjdCAwIDE2IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo1NwogICAgLy8gcmVwZXRpdGlvbnMgPSB0aW1lX3BlcmlvZHNbMF1bMV0ubmF0aXZlCiAgICBzd2FwCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo1OAogICAgLy8gYXNzZXJ0IGNvdXBvbl9wZXJpb2RfZHVyYXRpb24gPiBVSW50NjQoMCksIGVyci5JTlZBTElEX1RJTUVfUEVSSU9EX0RVUkFUSU9OCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2QgZHVyYXRpb25zIG11c3QgYmUgc3RyaWN0bHkgZ3JlYXRlciB0aGFuIHplcm8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo1OQogICAgLy8gYXNzZXJ0IHJlcGV0aXRpb25zID09IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfVElNRV9QRVJJT0RfUkVQRVRJVElPTlMKICAgICEKICAgIGFzc2VydCAvLyBUaW1lIHBlcmlvZCByZXBldGl0aW9ucyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo2MwogICAgLy8gc2VsZi50aW1lX3BlcmlvZHMudmFsdWUgPSB0aW1lX3BlcmlvZHMuY29weSgpCiAgICBieXRlYyAyNiAvLyAweDc0Njk2ZDY1NTA2NTcyNjk2ZjY0NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMjYgLy8gMHg3NDY5NmQ2NTUwNjU3MjY5NmY2NDczCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo2NAogICAgLy8gc2VsZi5jb3Vwb25fcGVyaW9kID0gc2VsZi50aW1lX3BlcmlvZHMudmFsdWVbMF1bMF0ubmF0aXZlCiAgICBieXRlYyAyNiAvLyAweDc0Njk2ZDY1NTA2NTcyNjk2ZjY0NzMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRpbWVfcGVyaW9kcyBleGlzdHMKICAgIGV4dHJhY3QgMiAwCiAgICBleHRyYWN0IDAgMTYgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ5dGVjIDE3IC8vICJjb3Vwb25fcGVyaW9kIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU2NwogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoY2ZnLlNUQVRVU19BQ1RJVkUpCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBpbnRjXzMgLy8gMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgphc3NldF9jb25maWdfYm9vbF9mYWxzZUAxNzoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDE4Cgphc3NldF9jb25maWdfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQodGltZV9ldmVudHM6IGJ5dGVzKSAtPiBieXRlczoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0My0yNDQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWxmLCB0aW1lX2V2ZW50czogdHlwLlRpbWVFdmVudHMpIC0+IE5vbmU6CiAgICBwcm90byAxIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDYKICAgIC8vIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDcKICAgIC8vID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0Ni0yNDcKICAgIC8vIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXS5uYXRpdmUKICAgIC8vID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0NS0yNDgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdLm5hdGl2ZQogICAgLy8gICAgID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5JTlZBTElEX1RJTUUKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDkKICAgIC8vIGZvciBfdCBpbiB1cmFuZ2UodGltZV9ldmVudHMubGVuZ3RoIC0gMSk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMCAvLyAwCgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gZm9yIF90IGluIHVyYW5nZSh0aW1lX2V2ZW50cy5sZW5ndGggLSAxKToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl9mb3JANgoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF93aGlsZV90b3BAODoKICAgIHB1c2hpbnQgNzUgLy8gNzUKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfd2hpbGVAMTQKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyAzNSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDM1IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF93aGlsZV90b3BAOAoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl93aGlsZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gdGltZV9pID0gdGltZV9ldmVudHNbX3RdLm5hdGl2ZQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMwogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTUKICAgIC8vIHRpbWVfZiA9IHRpbWVfZXZlbnRzW190ICsgMV0ubmF0aXZlCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjU2CiAgICAvLyBhc3NlcnQgdGltZV9mID4gdGltZV9pLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTcKICAgIC8vIGlmIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gIT0gVUludDY0KGNzdC5EQ0NfQ09OVCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgcHVzaGludCAyNTUgLy8gMjU1CiAgICAhPQogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1OC0yNTkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aW1lIHBlcmlvZHMgZXhwcmVzc2VkIGluIGRheXMgZm9yIHJlZ3VsYXIgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgKHRpbWVfZiAtIHRpbWVfaSkgJSBVSW50NjQoCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1OC0yNjEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aW1lIHBlcmlvZHMgZXhwcmVzc2VkIGluIGRheXMgZm9yIHJlZ3VsYXIgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgKHRpbWVfZiAtIHRpbWVfaSkgJSBVSW50NjQoCiAgICAvLyAgICAgY3N0LkRBWV8yX1NFQwogICAgLy8gKSA9PSAwLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRAogICAgaW50YyA2IC8vIDg2NDAwCiAgICAlCiAgICAhCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGluIEFjdHVhbC9BY3R1YWwgZGF5IGNvdW50IGNvbnZlbnRpb24gbXVzdCBiZSBtdWx0aXBsZXMgb2YgYSBkYXkgKGluIHNlY29uZHMpCiAgICBiIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfZm9yX2hlYWRlckAxCgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX2ZvckA2OgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHMoc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50czogYnl0ZXMpIC0+IGJ5dGVzOgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTY5LTU3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cygKICAgIC8vICAgICBzZWxmLCBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzOiB0eXAuVGltZUV2ZW50cwogICAgLy8gKSAtPiB0eXAuU2Vjb25kYXJ5TWFya2V0U2NoZWR1bGU6CiAgICBwcm90byAxIDEKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTAKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50YyA3IC8vIDIwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5MQogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLnN0YXR1c19pc19lbmRlZCgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICAhCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5MgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTQKICAgIC8vIGFzc2VydCBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzLmxlbmd0aCA+PSAxLCBlcnIuSU5WQUxJRF9USU1FX0VWRU5UU19MRU5HVEgKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBsZW5ndGggaXMgaW52YWxpZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk1CiAgICAvLyBpZiBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzLmxlbmd0aCA+IDE6CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBieiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk2CiAgICAvLyBzZWxmLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQoc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50cykKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgLTEKICAgIGZyYW1lX2J1cnkgMQoKc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDI6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAtMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk4CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTktNjAxCiAgICAvLyA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTgtNjAxCiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGRpZyAxCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk3LTYwMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vICAgICA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyAgICAgXS5uYXRpdmUKICAgIC8vICksIGVyci5JTlZBTElEX1NFQ09OREFSWV9PUEVOSU5HX0RBVEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNlY29uZGFyeSBtYXJrZXQgb3BlbmluZyBkYXRlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDMKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjAzLTYwNQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDYKICAgIC8vIGlmIHNlbGYubWF0dXJpdHlfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgYnogc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwOAogICAgLy8gc2VsZi5tYXR1cml0eV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxMAogICAgLy8gY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwOS02MTEKICAgIC8vID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwOC02MTEKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgZGlnIDEKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDctNjEyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gICAgID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vICAgICBdLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX0NMT1NVUkVfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBjbG9zdXJlIGRhdGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxMwogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTMtNjE1CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjE4CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjE3LTYxOQogICAgLy8gc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyMQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyMC02MjIKICAgIC8vIHNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTYtNjIzCiAgICAvLyByZXR1cm4gdHlwLlNlY29uZGFyeU1hcmtldFNjaGVkdWxlKAogICAgLy8gICAgIHNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgICAgICBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gICAgICksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzaWduX3JvbGUocm9sZV9hZGRyZXNzOiBieXRlcywgcm9sZTogYnl0ZXMsIGNvbmZpZzogYnl0ZXMpIC0+IGJ5dGVzOgphc3NpZ25fcm9sZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyNS02MjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2lnbl9yb2xlKAogICAgLy8gICAgIHNlbGYsIHJvbGVfYWRkcmVzczogYXJjNC5BZGRyZXNzLCByb2xlOiBhcmM0LlVJbnQ4LCBjb25maWc6IGFyYzQuRHluYW1pY0J5dGVzCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDYKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0NwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ5CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgcHVzaGludCAyMCAvLyAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgtNjU1CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUxCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MCAvLyA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MgogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MCAvLyA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MwogICAgLy8gVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwIC8vIDcwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgtNjU1CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU0CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0OC02NTUKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBhc3NpZ25fcm9sZV9ib29sX2ZhbHNlQDcKCmFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18xIC8vIDEKCmFzc2lnbl9yb2xlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0OC02NTUKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU3CiAgICAvLyBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICBwdXNoaW50cyAyMCA0MCA1MCA2MCA3MCA4MCAvLyAyMCwgNDAsIDUwLCA2MCwgNzAsIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTYtNjg1CiAgICAvLyBtYXRjaCByb2xlLm5hdGl2ZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MubmF0aXZlCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICAgICAgICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoKQogICAgZnJhbWVfZGlnIDAKICAgIG1hdGNoIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzBAOSBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8xQDEwIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzJAMTEgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzVAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4NQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfNUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3OQogICAgLy8gcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgYnl0ZWMgMjcgLy8gMHg1MjM4MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzgtNjgwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4MgogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjgxLTY4MwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gKQogICAgYm94X3B1dAoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4NgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgc3dhcAogICAgcmV0c3ViCgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njc1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyOSAvLyAweDUyMzczMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzYKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzNAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMCAvLyAweDUyMzYzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzMKICAgIC8vIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgYm94X3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8yQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDMxIC8vIDB4NTIzNTMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2OQogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY4LTY3MAogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICBjb25maWcubmF0aXZlCiAgICAvLyApCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzFAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjEKICAgIC8vIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDMyIC8vIDB4NTIzNDMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjYwLTY2MgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjQKICAgIC8vIGNvbmZpZy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2My02NjUKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICkKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMEA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU4CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzLm5hdGl2ZQogICAgYnl0ZWMgMTggLy8gMHg1MjMyMzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NpZ25fcm9sZV9ib29sX21lcmdlQDgKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5yZXZva2Vfcm9sZShyb2xlX2FkZHJlc3M6IGJ5dGVzLCByb2xlOiBieXRlcykgLT4gYnl0ZXM6CnJldm9rZV9yb2xlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njg4LTY4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcmV2b2tlX3JvbGUoc2VsZiwgcm9sZV9hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHJvbGU6IGFyYzQuVUludDgpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDYKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwNwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDgKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA5CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzEwCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MCAvLyA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4LTcxNAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTEKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIHB1c2hpbnQgNjAgLy8gNjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzEyCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAgLy8gNzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzEzCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogcmV2b2tlX3JvbGVfYm9vbF9mYWxzZUA2CgpyZXZva2Vfcm9sZV9ib29sX3RydWVANToKICAgIGludGNfMSAvLyAxCgpyZXZva2Vfcm9sZV9ib29sX21lcmdlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDgtNzE0CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTYtNzE3CiAgICAvLyAjIEFycmFuZ2VyIHJvbGUgY2FuIG5vdCBiZSByZXZva2VkIChqdXN0IHJvdGF0ZWQpCiAgICAvLyBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludHMgNDAgNTAgNjAgNzAgODAgLy8gNDAsIDUwLCA2MCwgNzAsIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTUtNzMzCiAgICAvLyBtYXRjaCByb2xlLm5hdGl2ZToKICAgIC8vICAgICAjIEFycmFuZ2VyIHJvbGUgY2FuIG5vdCBiZSByZXZva2VkIChqdXN0IHJvdGF0ZWQpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BQ0NPVU5UX01BTkFHRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfUFJJTUFSWV9ERUFMRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1RSVVNURUUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BVVRIT1JJVFkgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmludGVyZXN0X29yYWNsZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9JTlRFUkVTVF9PUkFDTEUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoKQogICAgZnJhbWVfZGlnIDAKICAgIG1hdGNoIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzBAOCByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8xQDkgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMCByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8zQDExIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzRAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczMwogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfNEAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczMAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmludGVyZXN0X29yYWNsZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNyAvLyAweDUyMzgzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MzEKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9JTlRFUkVTVF9PUkFDTEUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MzQKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHN3YXAKICAgIHJldHN1YgoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyNwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyOSAvLyAweDUyMzczMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjgKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BVVRIT1JJVFkgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyNAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzAgLy8gMHg1MjM2MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzI1CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfVFJVU1RFRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8xQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMSAvLyAweDUyMzUzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjIKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9QUklNQVJZX0RFQUxFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8wQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTgKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzIgLy8gMHg1MjM0MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzE5CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQUNDT1VOVF9NQU5BR0VSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX2Jvb2xfZmFsc2VANjoKICAgIGludGNfMCAvLyAwCiAgICBiIHJldm9rZV9yb2xlX2Jvb2xfbWVyZ2VANwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLm9wZW5fYWNjb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBwYXltZW50X2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKb3Blbl9hY2NvdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzM2LTczOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgb3Blbl9hY2NvdW50KAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCBwYXltZW50X2FkZHJlc3M6IGFyYzQuQWRkcmVzcwogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU2CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50YyA3IC8vIDIwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLnN0YXR1c19pc19lbmRlZCgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICAhCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1OAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTkKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzYwCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY0CiAgICAvLyB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgYnl0ZWMgNyAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2Mi03NjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjUKICAgIC8vIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY2CiAgICAvLyBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY3CiAgICAvLyBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICBieXRlYyAxMSAvLyAweDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY5CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIyLTEyMwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDMyIC8vIDB4NTIzNDMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2LTEyOQogICAgLy8gY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjcKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyOAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNy0xMjgKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjkKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyOC0xMjkKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI1LTEzMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuY2xvc2VfYWNjb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKY2xvc2VfYWNjb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc3MS03NzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGNsb3NlX2FjY291bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MKICAgIC8vICkgLT4gYXJjNC5UdXBsZVthcmM0LlVJbnQ2NCwgYXJjNC5VSW50NjRdOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODkKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzkwCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3NAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3OTMKICAgIC8vIGNsb3NlZF91bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5NAogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FDQ09VTlQgKyBob2xkaW5nX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5NQogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyAtPSBjbG9zZWRfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM2NgogICAgLy8gaWYgc2VsZi5jaXJjdWxhdGluZ191bml0cyA9PSAwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgYm56IGNsb3NlX2FjY291bnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjcKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGNmZy5TVEFUVVNfRU5ERUQpCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBpbnRjIDcgLy8gMjAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKY2xvc2VfYWNjb3VudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3OTgKICAgIC8vIChhcmM0LlVJbnQ2NChjbG9zZWRfdW5pdHMpLCBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkpCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzk3LTc5OQogICAgLy8gcmV0dXJuIGFyYzQuVHVwbGUoCiAgICAvLyAgICAgKGFyYzQuVUludDY0KGNsb3NlZF91bml0cyksIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSkKICAgIC8vICkKICAgIGNvbmNhdAogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EucHJpbWFyeV9kaXN0cmlidXRpb24oaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IGJ5dGVzKSAtPiBieXRlczoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MDEtODA0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbigKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgdW5pdHM6IGFyYzQuVUludDY0CiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMyAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODktMjkyCiAgICAvLyBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTAKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkwLTI5MQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5MC0yOTIKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkyCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjIgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTEtMjkyCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgZnJhbWVfZGlnIDIKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5MC0yOTIKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgaW50Y18xIC8vIDEKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4OC0yOTMKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vICAgICBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNgogICAgLy8gY2FsbGVyIGluIHNlbGYucHJpbWFyeV9kZWFsZXIKICAgIGJ5dGVjIDMxIC8vIDB4NTIzNTMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNi0xMzkKICAgIC8vIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kZWFsZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNy0xMzgKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNy0xMzkKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM5CiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2RlYWxlciBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM4LTEzOQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM3LTEzOQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyCiAgICBpbnRjXzEgLy8gMQoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNS0xNDAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYucHJpbWFyeV9kZWFsZXIKICAgIC8vICAgICBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODI5CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzEKICAgIC8vIGFzc2VydCB1bml0cy5uYXRpdmUgPiAwLCBlcnIuWkVST19VTklUUwogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMzCiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICsgdW5pdHMubmF0aXZlIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMi04MzQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5jaXJjdWxhdGluZ191bml0cyArIHVuaXRzLm5hdGl2ZSA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICAvLyApLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzYKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKz0gdW5pdHMubmF0aXZlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM3LTgzOQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM3LTgzOQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIC8vICkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDMyCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gYXJjNC5VSW50NjQoc2VsZi51bml0X3ZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICBpdG9iCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHN3YXAKICAgIHJlcGxhY2UyIDQwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDEKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5jaXJjdWxhdGluZ191bml0cykKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICAtCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMjoKICAgIGludGNfMCAvLyAwCiAgICBiIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VAMTMKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnNldF9hc3NldF9zdXNwZW5zaW9uKHN1c3BlbmRlZDogYnl0ZXMpIC0+IGJ5dGVzOgpzZXRfYXNzZXRfc3VzcGVuc2lvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0My04NDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9hc3NldF9zdXNwZW5zaW9uKHNlbGYsIHN1c3BlbmRlZDogYXJjNC5Cb29sKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODU3CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5KCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg1OAogICAgLy8gc2VsZi5zdXNwZW5kZWQgPSBVSW50NjQoc3VzcGVuZGVkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgYnl0ZWMgMjMgLy8gInN1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NTkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5KCkgLT4gdm9pZDoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTItMTUzCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5KHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgYnl0ZWMgMjkgLy8gMHg1MjM3MzAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU0CiAgICAvLyBjYWxsZXIgPSBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTYtMTU5CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX2ZhbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NwogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmF1dGhvcml0eSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU4CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU3LTE1OAogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1Ny0xNTkKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX2ZhbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1OQogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmF1dGhvcml0eSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU4LTE1OQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1Ny0xNTkKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgphc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTUtMTYwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgLy8gICAgIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgphc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfYWNjb3VudF9zdXNwZW5zaW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHN1c3BlbmRlZDogYnl0ZXMpIC0+IGJ5dGVzOgpzZXRfYWNjb3VudF9zdXNwZW5zaW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODYxLTg2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgc2V0X2FjY291bnRfc3VzcGVuc2lvbigKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgc3VzcGVuZGVkOiBhcmM0LkJvb2wKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3OQogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODgxCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgaW50YyA0IC8vIDQ0OAogICAgc3dhcAogICAgc2V0Yml0CiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODIKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnNldF9kZWZhdWx0X3N0YXR1cyhkZWZhdWx0ZWQ6IGJ5dGVzKSAtPiB2b2lkOgpzZXRfZGVmYXVsdF9zdGF0dXM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODQtODg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfZGVmYXVsdF9zdGF0dXMoc2VsZiwgZGVmYXVsdGVkOiBhcmM0LkJvb2wpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIGJ5dGVjIDMwIC8vIDB4NTIzNjMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Ni0xNDkKICAgIC8vIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cnVzdGVlIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDgKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDctMTQ4CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Ny0xNDkKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0OQogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cnVzdGVlIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDgtMTQ5CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Ny0xNDkKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgpzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ1LTE1MAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICAvLyAgICAgYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5NgogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBVSW50NjQoZGVmYXVsdGVkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgYnl0ZWMgMjQgLy8gImRlZmF1bHRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCnNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9tZXJnZUA2CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X2Fzc2V0X2luZm8oKSAtPiBieXRlczoKZ2V0X2Fzc2V0X2luZm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTgtODk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfaW5mbyhzZWxmKSAtPiB0eXAuQXNzZXRJbmZvOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDgKICAgIC8vIHBlcmZvcm1hbmNlID0gVUludDY0KGNzdC5QUkZfUEVSRk9STUFOVCkKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwOQogICAgLy8gaWYgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBzZWxmLm1hdHVyaXR5X2RhdGUgPiAwOgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgY292ZXIgNAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgID4KICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VAMwogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIDEKICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTEwCiAgICAvLyBwZXJmb3JtYW5jZSA9IFVJbnQ2NChjc3QuUFJGX01BVFVSRUQpCiAgICBwdXNoaW50IDQgLy8gNAogICAgZnJhbWVfYnVyeSAyCgpnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDM6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTEtOTEyCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG5vIGdyYWNlIG9yIGRlbGlucXVlbmN5IHBlcmlvZHMKICAgIC8vIGlmIHNlbGYuZGVmYXVsdGVkOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI0IC8vICJkZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVmYXVsdGVkIGV4aXN0cwogICAgYnogZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTMKICAgIC8vIHBlcmZvcm1hbmNlID0gVUludDY0KGNzdC5QUkZfREVGQVVMVEVEKQogICAgcHVzaGludCAzIC8vIDMKICAgIGZyYW1lX2J1cnkgMAoKZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE2CiAgICAvLyBkZW5vbWluYXRpb25fYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE3CiAgICAvLyBzZXR0bGVtZW50X2Fzc2V0X2lkPWFyYzQuVUludDY0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzQwCiAgICAvLyByZXR1cm4gc2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTgKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCgpKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxOQogICAgLy8gdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NChzZWxmLnVuaXRfdmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjAKICAgIC8vIGRheV9jb3VudF9jb252ZW50aW9uPWFyYzQuVUludDgoc2VsZi5kYXlfY291bnRfY29udmVudGlvbiksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgaXRvYgogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyMQogICAgLy8gcHJpbmNpcGFsX2Rpc2NvdW50PWFyYzQuVUludDE2KHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50KSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMSAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjIKICAgIC8vIGludGVyZXN0X3JhdGU9YXJjNC5VSW50MTYoc2VsZi5pbnRlcmVzdF9yYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTIzCiAgICAvLyB0b3RhbF9zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi50b3RhbF91bml0cyksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTI0CiAgICAvLyBjaXJjdWxhdGluZ19zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi5jaXJjdWxhdGluZ191bml0cyksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyNS05MjcKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyOQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMiAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyOC05MzAKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzMQogICAgLy8gaXNzdWFuY2VfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLmlzc3VhbmNlX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzMgogICAgLy8gbWF0dXJpdHlfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLm1hdHVyaXR5X2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzMKICAgIC8vIHN1c3BlbmRlZD1hcmM0LkJvb2woYm9vbChzZWxmLnN1c3BlbmRlZCkpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIzIC8vICJzdXNwZW5kZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3VzcGVuZGVkIGV4aXN0cwogICAgYnl0ZWMgMTEgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzQKICAgIC8vIHBlcmZvcm1hbmNlPWFyYzQuVUludDgocGVyZm9ybWFuY2UpLAogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTUtOTM1CiAgICAvLyByZXR1cm4gdHlwLkFzc2V0SW5mbygKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKSwKICAgIC8vICAgICBvdXRzdGFuZGluZ19wcmluY2lwYWw9YXJjNC5VSW50NjQoc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwoKSksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NChzZWxmLnVuaXRfdmFsdWUpLAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uPWFyYzQuVUludDgoc2VsZi5kYXlfY291bnRfY29udmVudGlvbiksCiAgICAvLyAgICAgcHJpbmNpcGFsX2Rpc2NvdW50PWFyYzQuVUludDE2KHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50KSwKICAgIC8vICAgICBpbnRlcmVzdF9yYXRlPWFyYzQuVUludDE2KHNlbGYuaW50ZXJlc3RfcmF0ZSksCiAgICAvLyAgICAgdG90YWxfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMpLAogICAgLy8gICAgIGNpcmN1bGF0aW5nX3N1cHBseT1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBpc3N1YW5jZV9kYXRlPWFyYzQuVUludDY0KHNlbGYuaXNzdWFuY2VfZGF0ZSksCiAgICAvLyAgICAgbWF0dXJpdHlfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLm1hdHVyaXR5X2RhdGUpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woYm9vbChzZWxmLnN1c3BlbmRlZCkpLAogICAgLy8gICAgIHBlcmZvcm1hbmNlPWFyYzQuVUludDgocGVyZm9ybWFuY2UpLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgdW5jb3ZlciAxNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hY2NvdW50X2luZm8oaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hY2NvdW50X2luZm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzctOTM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYWNjb3VudF9pbmZvKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzKSAtPiB0eXAuQWNjb3VudEluZm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3NAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTIKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF90aW1lX2V2ZW50cygpIC0+IGJ5dGVzOgpnZXRfdGltZV9ldmVudHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTQtOTU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfdGltZV9ldmVudHMoc2VsZikgLT4gdHlwLlRpbWVFdmVudHM6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2MgogICAgLy8gdGltZV9ldmVudHMgPSB0eXAuVGltZUV2ZW50cygpCiAgICBieXRlYyAzMyAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMyAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NjMKICAgIC8vIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpOgogICAgYnogZ2V0X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTY0CiAgICAvLyB0aW1lX2V2ZW50cyA9IHNlbGYudGltZV9ldmVudHMudmFsdWUuY29weSgpCiAgICBieXRlYyAyOCAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRpbWVfZXZlbnRzIGV4aXN0cwoKZ2V0X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2NQogICAgLy8gcmV0dXJuIHRpbWVfZXZlbnRzCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUoKSAtPiBieXRlczoKZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NjctOTY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZShzZWxmKSAtPiB0eXAuVGltZUV2ZW50czoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTc2CiAgICAvLyBhcmM0LlVJbnQ2NChzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NzcKICAgIC8vIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk3NS05NzgKICAgIC8vIHJldHVybiB0eXAuVGltZUV2ZW50cygKICAgIC8vICAgICBhcmM0LlVJbnQ2NChzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NChzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfYXNzZXRfbWV0YWRhdGEoKSAtPiBieXRlczoKZ2V0X2Fzc2V0X21ldGFkYXRhOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTgwLTk4MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21ldGFkYXRhKHNlbGYpIC0+IHR5cC5Bc3NldE1ldGFkYXRhOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5ODkKICAgIC8vIHJldHVybiB0eXAuQXNzZXRNZXRhZGF0YS5mcm9tX2J5dGVzKHNlbGYubWV0YWRhdGEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gIm1ldGFkYXRhIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1ldGFkYXRhIGV4aXN0cwogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"}}""" +_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Sender Account Holding Address", "name": "sender_holding_address"}, {"type": "address", "desc": "Receiver Account Holding Address", "name": "receiver_holding_address"}, {"type": "uint64", "desc": "Amount of D-ASA units to transfer", "name": "units"}], "name": "asset_transfer", "returns": {"type": "uint64", "desc": "Transferred actualized value in denomination asset"}, "desc": "Transfer D-ASA units between accounts", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "byte[]", "desc": "Additional payment information (Optional)", "name": "payment_info"}], "name": "pay_coupon", "returns": {"type": "(uint64,uint64,byte[])", "desc": "Paid coupon amount in denomination asset, Payment timestamp, Payment context", "struct": "PaymentResult"}, "desc": "Pay due coupon to an account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Interest rate in bps", "name": "interest_rate"}], "name": "update_interest_rate", "returns": {"type": "uint64", "desc": "Timestamp of the update"}, "desc": "Update variable interest rates in bps", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "uint64", "desc": "Account's units for the current value calculation", "name": "units"}], "name": "get_account_units_current_value", "returns": {"type": "(uint64,uint64,(uint64,uint64))", "desc": "Units current value in denomination asset, Accrued interest in denomination asset", "struct": "CurrentUnitsValue"}, "desc": "Get account's units current value and accrued interest", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "get_payment_amount", "returns": {"type": "(uint64,uint64)", "desc": "Interest amount in denomination asset, Principal amount in denomination asset", "struct": "PaymentAmounts"}, "desc": "Get the next payment amount", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_coupons_status", "returns": {"type": "(uint64,uint64,uint64,(uint64,uint64),bool)", "desc": "Total coupons, Due coupons, Next coupon due date, (Day count factor numerator, Day count factor denominator), All due coupons paid", "struct": "CouponsInfo"}, "desc": "Get D-ASA coupons status", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_time_periods", "returns": {"type": "(uint64,uint64)[]", "desc": "Time periods"}, "desc": "Get D-ASA time periods", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA Arranger Address", "name": "arranger"}, {"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "desc": "D-ASA metadata", "name": "metadata", "struct": "AssetMetadata"}], "name": "asset_create", "returns": {"type": "void"}, "desc": "Create a new D-ASA", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [{"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "name": "metadata", "struct": "AssetMetadata"}], "name": "asset_update", "returns": {"type": "void"}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Denomination asset identifier", "name": "denomination_asset_id"}, {"type": "uint64", "desc": "Settlement asset identifier", "name": "settlement_asset_id"}, {"type": "uint64", "desc": "Principal, expressed in denomination asset", "name": "principal"}, {"type": "uint64", "desc": "Principal discount in bps", "name": "principal_discount"}, {"type": "uint64", "desc": "Minimum denomination, expressed in denomination asset", "name": "minimum_denomination"}, {"type": "uint8", "desc": "Day-count convention for interests calculation", "name": "day_count_convention"}, {"type": "uint16", "desc": "Interest rate in bps", "name": "interest_rate"}, {"type": "uint16[]", "desc": "Coupon interest rates in bps", "name": "coupon_rates"}, {"type": "uint64[]", "desc": "Time events (strictly ascending order)", "name": "time_events"}, {"type": "(uint64,uint64)[]", "desc": "Time periods of recurring time events", "name": "time_periods"}], "name": "asset_config", "returns": {"type": "void"}, "desc": "Configure the Debt Algorand Standard Application", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64[]", "desc": "Secondary market time events (strictly ascending order)", "name": "secondary_market_time_events"}], "name": "set_secondary_time_events", "returns": {"type": "(uint64,uint64)", "desc": "Secondary Market Opening Date, Secondary Market Closure Date", "struct": "SecondaryMarketSchedule"}, "desc": "Set secondary market time schedule", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "uint8", "desc": "Role identifier", "name": "role"}, {"type": "byte[]", "desc": "Role configuration (Optional)", "name": "config"}], "name": "assign_role", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Assign a role to an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "uint8", "desc": "Role identifier", "name": "role"}], "name": "revoke_role", "returns": {"type": "uint64", "desc": "Timestamp of the role revocation"}, "desc": "Revoke a role from an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "open_account", "returns": {"type": "uint64", "desc": "Timestamp of the account opening"}, "desc": "Open D-ASA account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "close_account", "returns": {"type": "(uint64,uint64)", "desc": "Closed units, Timestamp of the account closing"}, "desc": "Close D-ASA account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "uint64", "desc": "Amount of D-ASA units to distribute", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64", "desc": "Remaining D-ASA units to be distributed"}, "desc": "Distribute D-ASA units to accounts according the primary market", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "set_asset_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set asset suspension status"}, "desc": "Set asset suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "set_account_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set account suspension status"}, "desc": "Set account suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Default status", "name": "defaulted"}], "name": "set_default_status", "returns": {"type": "void"}, "desc": "Set D-ASA default status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_asset_info", "returns": {"type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Performance", "struct": "AssetInfo"}, "desc": "Get D-ASA info", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "get_account_info", "returns": {"type": "(address,uint64,uint64,uint64,bool)", "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended", "struct": "AccountInfo"}, "desc": "Get account info", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_time_events", "returns": {"type": "uint64[]", "desc": "Time events"}, "desc": "Get D-ASA time events", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_secondary_market_schedule", "returns": {"type": "uint64[]", "desc": "Secondary market schedule"}, "desc": "Get secondary market schedule", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_asset_metadata", "returns": {"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "desc": "Contract type, Calendar, Business day convention, End of month convention, Early repayment effect, Early repayment penalty type, Prospectus hash, Prospectus URL", "struct": "AssetMetadata"}, "desc": "Get D-ASA metadata", "events": [], "readonly": true, "recommendations": {}}], "name": "PerpetualBond", "state": {"keys": {"box": {"coupon_rates": {"key": "Y291cG9uUmF0ZXM=", "keyType": "AVMBytes", "valueType": "uint16[]"}, "time_events": {"key": "dGltZUV2ZW50cw==", "keyType": "AVMBytes", "valueType": "uint64[]"}, "time_periods": {"key": "dGltZVBlcmlvZHM=", "keyType": "AVMBytes", "valueType": "(uint64,uint64)[]"}}, "global": {"arranger": {"key": "UjIwIw==", "keyType": "AVMBytes", "valueType": "AVMBytes"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "unit_value": {"key": "dW5pdF92YWx1ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "metadata": {"key": "bWV0YWRhdGE=", "keyType": "AVMString", "valueType": "AVMBytes"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "circulating_units": {"key": "Y2lyY3VsYXRpbmdfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "principal_discount": {"key": "cHJpbmNpcGFsX2Rpc2NvdW50", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_rate": {"key": "aW50ZXJlc3RfcmF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_coupons": {"key": "dG90YWxfY291cG9ucw==", "keyType": "AVMString", "valueType": "AVMUint64"}, "primary_distribution_opening_date": {"key": "cHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "primary_distribution_closure_date": {"key": "cHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "issuance_date": {"key": "aXNzdWFuY2VfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "secondary_market_opening_date": {"key": "c2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU=", "keyType": "AVMString", "valueType": "AVMUint64"}, "secondary_market_closure_date": {"key": "c2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU=", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "suspended": {"key": "c3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "defaulted": {"key": "ZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "coupon_period": {"key": "Y291cG9uX3BlcmlvZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "paid_coupon_units": {"key": "cGFpZF9jb3Vwb25fdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjQwIw=="}, "primary_dealer": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjUwIw=="}, "trustee": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjYwIw=="}, "authority": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjcwIw=="}, "interest_oracle": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjgwIw=="}, "account": {"keyType": "address", "valueType": "AccountInfo", "prefix": "UjMwIw=="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 2, "ints": 20}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AccountInfo": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "unit_value", "type": "uint64"}, {"name": "paid_coupons", "type": "uint64"}, {"name": "suspended", "type": "bool"}], "AssetInfo": [{"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "unit_value", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "principal_discount", "type": "uint16"}, {"name": "interest_rate", "type": "uint16"}, {"name": "total_supply", "type": "uint64"}, {"name": "circulating_supply", "type": "uint64"}, {"name": "primary_distribution_opening_date", "type": "uint64"}, {"name": "primary_distribution_closure_date", "type": "uint64"}, {"name": "issuance_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "performance", "type": "uint8"}], "AssetMetadata": [{"name": "contract_type", "type": "uint8"}, {"name": "calendar", "type": "uint8"}, {"name": "business_day_convention", "type": "uint8"}, {"name": "end_of_month_convention", "type": "uint8"}, {"name": "prepayment_effect", "type": "uint8"}, {"name": "penalty_type", "type": "uint8"}, {"name": "prospectus_hash", "type": "byte[32]"}, {"name": "prospectus_url", "type": "string"}], "CouponsInfo": [{"name": "total_coupons", "type": "uint64"}, {"name": "due_coupons", "type": "uint64"}, {"name": "next_coupon_due_date", "type": "uint64"}, {"name": "day_count_factor", "type": "DayCountFactor"}, {"name": "all_due_coupons_paid", "type": "bool"}], "CurrentUnitsValue": [{"name": "units_value", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "day_count_factor", "type": "DayCountFactor"}], "DayCountFactor": [{"name": "numerator", "type": "uint64"}, {"name": "denominator", "type": "uint64"}], "PaymentAmounts": [{"name": "interest", "type": "uint64"}, {"name": "principal", "type": "uint64"}], "PaymentResult": [{"name": "amount", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}, {"name": "context", "type": "byte[]"}], "RoleConfig": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}], "SecondaryMarketSchedule": [{"name": "secondary_market_opening_date", "type": "uint64"}, {"name": "secondary_market_closure_date", "type": "uint64"}]}, "byteCode": {"approval": "CiAIAAEIZMADkE6AowXIASYkBBUffHUEUjMwIwZzdGF0dXMRY2lyY3VsYXRpbmdfdW5pdHMNaXNzdWFuY2VfZGF0ZRNzZXR0bGVtZW50X2Fzc2V0X2lkDWludGVyZXN0X3JhdGUIAAAAAAAAAAANdG90YWxfY291cG9ucyFwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUNbWF0dXJpdHlfZGF0ZQEACnVuaXRfdmFsdWUUZGF5X2NvdW50X2NvbnZlbnRpb24LdG90YWxfdW5pdHMdc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUdc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUNY291cG9uX3BlcmlvZARSMjAjFWRlbm9taW5hdGlvbl9hc3NldF9pZAhtZXRhZGF0YRJwcmluY2lwYWxfZGlzY291bnQhcHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCXN1c3BlbmRlZAlkZWZhdWx0ZWQRcGFpZF9jb3Vwb25fdW5pdHMLdGltZVBlcmlvZHMEUjgwIwp0aW1lRXZlbnRzBFI3MCMEUjYwIwRSNTAjBFI0MCMCAAALY291cG9uUmF0ZXMDBoEBMRhAAGwnEjIDZycTImcnBSJnJwwiZycNImcnFIAAZycOImcrImcnFSJnJwYiZycIImcnCSJnJxYiZycEImcnDyJnJxAiZycKImcqImcnFyJnJxgiZzE1gQISRDE0gRQSRDE3FEQxNhREJxEiZycZImcxG0EAr4IYBE/Wo8wEjPFLUQSA5R6fBEQ2PUkEZ9tPIAT2qWyNBCKbcG8EPw78bAQl26lbBIlHQTQEHW/CVQT+90VnBLj8E5AEPUPR8ATr2WsvBGyF4+4E9jrOjQS7zKGKBBp7q7QEQC26RwTtAnWfBPrSFz4ECO/qNQTkpatUNhoAjhgBzgG4AaUBjwF8AWwBXAFJATgBDgD7AOIAzAC2AKMAjQB6AGQAVQBFADIAIgASAAIiQzEZFEQxGESIDdcoTFCwI0MxGRREMRhEiA2wKExQsCNDMRkURDEYRIgNhyhMULAjQzEZFEQxGEQ2GgGIDWUoTFCwI0MxGRREMRhEiAyIKExQsCNDMRkURDEYRDYaAYgMOCNDMRkURDEYRDYaATYaAogMByhMULAjQzEZFEQxGEQ2GgGIC60oTFCwI0MxGRREMRhENhoBNhoCiArZKExQsCNDMRkURDEYRDYaAYgKiyhMULAjQzEZFEQxGEQ2GgE2GgKICg4oTFCwI0MxGRREMRhENhoBNhoCiAlcKExQsCNDMRkURDEYRDYaATYaAjYaA4gIeyhMULAjQzEZFEQxGEQ2GgGIB+soTFCwI0MxGRREMRhENhoBNhoCNhoDNhoENhoFNhoGNhoHNhoINhoJNhoKiAXbI0MxGYEEEkQxGEQ2GgGIBbEjQzEZFEQxGBRENhoBNhoCiAWQI0MxGRREMRhEiAVrKExQsCNDMRkURDEYRIgE6ihMULAjQzEZFEQxGEQ2GgGIBLkoTFCwI0MxGRREMRhENhoBNhoCiAPkKExQsCNDMRkURDEYRDYaAYgDgyhMULAjQzEZFEQxGEQ2GgE2GgKIAnMoTFCwI0MxGRREMRhENhoBNhoCNhoDiAAGKExQsCNDigMBIkcCgABJi/8XIiplRCUSQQFAIicPZUQyB0mMBA5BATIiJxBlRIsEDUEBJyNEMQCL/RJEiAEgiAEoKYv9UEmMAUm9RQFEKYv+UEmMAkm9RQFESwG+RCEEUycLIk8CVCJTFERJvkQhBFMnCyJPAlQiUxRESwG+RFcgCBeLBQ9ETL5EVygIjAC+RFcgCBdBAKSLAb5EVygIiwK+RFcoCKhBAI6LAb5EVzAIiwK+RFcwCKhBAHwjRIgAtIv9SwGIAM+LAUlOAr5EVygIjACL/YsFSU4ETwKIAMmMA0m+RFcgCBdLAgkWSwG+RExcIEsBTL+LAkm+RFcgCBdPAwgWSwG+RExcIL++RFcgCBdAABWLAUm+RCcHXChLAUy/Sb5EJwdcML+LABeLBQuLAwgWjACJIkL/gYsCSb5EiwBcKEsBTL+LAb5ESwG+RExXMAhcML9C/2MiQv7WigAAIicYZUQURImKAAAiJxdlRBREiYoAASIyB0kiJwRlRA1BABEiJwRlRIsBTAkiJxFlRAqMAImKAgApi/5QvkRXMAiL/xaoRImKAwGL/Yv/iP/ki/+IACFJVwAIF0xXCAgXi/2L/ogAgCInBmVEC08CCyEFTwILComKAQGAAEcEi/9AAD4iJwRlRDIHTAlJjAAiJxFlTElOAowDRCInDWVETIwETIwBQAAOiwAhBgqLAyEGCowEjAGLBIsBFkwWUIwAiSKMAov/QQAHi/+IAAeMAosCQv+zigEBIicEZUQiJxFlRIv/CwiJigIBKYv+UL5EVygIF4v/C4mKAgEiKmVEJRJEiP74iP8AKYv+UEcCvUUBREm+RFcgCBdJTgJEiP7zSwG+RFcwCBdMSwENRIgAnUS+RFcAICInBWVEcABFAUEAh4sAvkQhBFMnCyJPAlQiU0AAdSNBAG2L/ogAgSInBmVECyEFCkkyCiInBWVEcABESwEPRIsAvkRXACCxMgAiJwVlRE8DshJPArIUshGBBLIQsgGziwBJvkRXMAgXIwgWSwG+RExcML8iJxllRIsBCCcZTGcWMgcWUIACABJQi/9QjACJIkL/zCJC/4iKAQEiJxllRCIrZUSL/wsPiYoBASmL/1C+RFcgCBeL/0yI/vaJigEBIicbMQBQSb1FAUEAOosBvkRXAAgyBxZJjACmQQApiwG+RFcICIsAp0EAHCNEiP3YiP3giP3oiP+fRIv/FycGTGcyBxaMAIkiQv/higIBIoAARwUiJwllREEAkTIHIicJZUQPQQCGI0Qpi/5QSYwAvUUBRIv/JwelQQBtiwC+RFcgCBcWi/+nQQBeI0SL/xdJjAaL/kyI/lqMASKMAiKMBSKMA4j9eEmMBIv+TIj9kYgAPkEAHosESYj9x4v+iwZPA4j9jowCSVcACBeMBVcICBeMA4sBFosCFosFFosDFlBOAlBMUIwAiSJC/58iQv93igABIicEZURBAA0yByInBGVEDUEAAiOJIomKAQEpi/9QvUUBRIv/iP7PIicGZUQLIQUKFicHUImKAAGAAEcEIiplRCUSQQBbiPzjjAKLAkkjCIj9m4wDiP6OjAAijAQijAGI/5tBABKLAoj9JUlXAAgXjARXCAgXjAEiJwhlRBaLAhaLAxaLBBaLARZQJwsiiwBUTwRPBFBPA1BPAlBMUIwAiSKMAkL/pIoAASchIiplRCUSQQAHJxq+TIwARIsATImKAgAnEov+ZycUi/9niYoBAIgABicUi/9niYoAADEAIicSZUQSRImKCgAigABHAoj/6CIqZUQURIv2F0lBAUKLBHELRDIDE0EBNyNEJxOLBGeL9xciJxNlREsBEkQnBUxnsTIAIicFZUQyCiKyErIUshGBBLIQsgGzi/gXi/oXShgURCcMSwFnCicOTGeL+RcnFUxni/sXSYwBQQAJiwGB/wESQQDXI0QnDYsBZ4v8F4wCIicVZURAAAOLAkQnBosCZ4v9IllJFEQnCExnIicIZURBAAknIrxIJyKL/b+L/iJZIicIZUSBAwgSRIv+iACUjP4nHLxIJxyL/r+L/lcCAEmMAElXAAgXJwlMZ0lXCAgXJxZMZ1cQCBcnBExni/4iWUmMAyInCGVEgQQIEkEAEIsDIwkkC4sATCRYFycKTGeL/yJZIxJEi/9XAgBXABBJVwAIF0xXCAgXTEQURCcavEgnGov/vycavkRXAgBXABBXAAgXJxFMZyolZ4kiQv8mIkL+xooBAYAASYv/VwIASVcACBcyBw1Ei/8iWSMJIosEiwMMQQBcgUsyDA1BABmxgQayEIEFshknI7IeJyOyHzIAsgGzQv/fiwRJJAuLAklOA0wkWBdJTgOMASMISYwEJAskWBdJjAAMRCInDWVEgf8BE0H/qYsAiwEJIQYYFERC/5yL/4wAiYoBASKI/goiKmVEIQcSFESI+jqL/yJZSUQjDYv/TEEACov/iP9WSYz/jAGLAYz/IicEZUSL/1cCAEmMAFcACBdMSwEORCcPTGciJwplREEAHCInCmVEi/8iWSMJJAuLAEwkWBdMSwEPRCcQTGciJw9lRBYiJxBlRBZQjACJigMBiP2OiPnHi/4XSYEUEkAAKIsAgSgSQAAgiwCBMhJAABiLAIE8EkAAEIsAgUYSQAAIiwCBUBJBAIkjRIMGFCgyPEZQiwCOBgBnAFMAPwArABcAAQAnG4v9UEm9RQEURIv/VwIAvzIHFkyJJx2L/VBJvUUBFESL/1cCAL9C/+cnHov9UEm9RQEURIv/VwIAv0L/0ycfi/1QSb1FARREi/9XAgC/Qv+/JyCL/VBJvUUBFESL/1cCAL9C/6snEov9Z0L/oyJC/3SKAgGI/MaI+P+L/xdJgSgSQAAgiwCBMhJAABiLAIE8EkAAEIsAgUYSQAAIiwCBUBJBAGUjRIMFKDI8RlCLAI4FAD8AMAAhABIAAQAnG4v+UEm9RQFEvEgyBxZMiScdi/5QSb1FAUS8SEL/7Ccei/5QSb1FAUS8SEL/3Scfi/5QSb1FAUS8SEL/zicgi/5QSb1FAUS8SEL/vyJC/5iKAgGIACwiKmVEIQcSFESI+FqI+GIpi/5QSb1FARREi/8nB1AnB1AnB1AnC1C/MgcWiYoAACInIDEAUEm9RQFBACGLAb5EVwAIMgcWSYwApkEAEIsBvkRXCAiLAKdBAAMjRIkiQv/6igEBiP/FiPf8KYv/UEm9RQFESb5EVyAIF0lPArxIIitlREwJK0xnIitlREAABCohB2eLABYyBxZQTImKAgEiSYAAIiplRCUSQQCqIicJZUQyB0mMAg5BAJwiJxZlRIsCDUEAkSNEJx8xAFBJjAC9RQFBAH2LAL5EVwAIMgcWSYwBpkEAbIsAvkRXCAiLAadBAF8jRCmL/lBJvUUBRIj3ZYj3bYv/F0lEIitlREsBCCInDmVEDkQiK2VESwEIK0xnSwG+RFcgCBcIFksBvkRMXCBLAUy/IicMZUQWSwG+RExcKL8iJw5lRCIrZUQJFowAiSJC/54iQv9sigEBiAAMi/8iUycXTGcyBxaJigAAIicdMQBQSb1FAUEAIYsBvkRXAAgyBxZJjACmQQAQiwG+RFcICIsAp0EAAyNEiSJC//qKAgGI/8Upi/5QSb1FAURJvkSL/yJTIQRMVL8yBxaJigEAIiceMQBQSb1FAUEAKYsBvkRXAAgyBxZJjACmQQAYiwG+RFcICIsAp0EACyNEi/8iUycYTGeJIkL/8ooAASJJMgciJwplTElOAk4ERA1BAA2LAIwCiwFBAASBBIwCiwKMACInGGVEQQAEgQOMACInE2VEFiInBWVEFiIrZUQiJwxlRAsWIicMZUQWIicNZUQWVwcBIicVZUQWVwYCIicGZUQWVwYCIicOZUQWIitlRBYiJwllRBYiJxZlRBYiJwRlRBYiJwplRBYiJxdlRCcLIk8CVIsAFlcHAU8OTw5QTw1QTwxQTwtQTwpQTwlQTwhQTwdQTwZQTwVQTwRQTwNQTwJQTFCMAImKAQEpi/9QSb1FAUS+RImKAAEnISIqZUQlEkEAByccvkyMAESLAEyJigABIicPZUQWIicQZUQWUIACAAJMUImKAAEiJxRlRIk=", "clear": "CoEBQw=="}, "compilerInfo": {"compiler": "puya", "compilerVersion": {"major": 4, "minor": 2, "patch": 1}}, "desc": "\n Perpetual Bond, variable interest rate, not callable.\n ", "events": [], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMucGVycGV0dWFsX2JvbmQuY29udHJhY3QuUGVycGV0dWFsQm9uZC5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAxMDAgNDQ4IDEwMDAwIDg2NDAwIDIwMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4NTIzMzMwMjMgInN0YXR1cyIgImNpcmN1bGF0aW5nX3VuaXRzIiAiaXNzdWFuY2VfZGF0ZSIgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbnRlcmVzdF9yYXRlIiAweDAwMDAwMDAwMDAwMDAwMDAgInRvdGFsX2NvdXBvbnMiICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiICJtYXR1cml0eV9kYXRlIiAweDAwICJ1bml0X3ZhbHVlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iICJ0b3RhbF91bml0cyIgInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIiAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiICJjb3Vwb25fcGVyaW9kIiAweDUyMzIzMDIzICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJtZXRhZGF0YSIgInByaW5jaXBhbF9kaXNjb3VudCIgInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIgInN1c3BlbmRlZCIgImRlZmF1bHRlZCIgInBhaWRfY291cG9uX3VuaXRzIiAweDc0Njk2ZDY1NTA2NTcyNjk2ZjY0NzMgMHg1MjM4MzAyMyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczIDB4NTIzNzMwMjMgMHg1MjM2MzAyMyAweDUyMzUzMDIzIDB4NTIzNDMwMjMgMHgwMDAwIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MyAweDA2ODEwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDEtNDIKICAgIC8vICMgUm9sZSBCYXNlZCBBY2Nlc3MgQ29udHJvbAogICAgLy8gc2VsZi5hcnJhbmdlciA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfQVJSQU5HRVIpCiAgICBieXRlYyAxOCAvLyAweDUyMzIzMDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OS02MAogICAgLy8gIyBBc3NldCBDb25maWd1cmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxOSAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MQogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkID0gVUludDY0KCkKICAgIGJ5dGVjIDUgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBzZWxmLnVuaXRfdmFsdWUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTIgLy8gInVuaXRfdmFsdWUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUtNjYKICAgIC8vICMgTWV0YWRhdGEKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBCeXRlcygpCiAgICBieXRlYyAyMCAvLyAibWV0YWRhdGEiCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OC02OQogICAgLy8gIyBTdXBwbHkKICAgIC8vIHNlbGYudG90YWxfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWMgMTQgLy8gInRvdGFsX3VuaXRzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MAogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzItNzMKICAgIC8vICMgUHJpbmNpcGFsCiAgICAvLyBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCA9IFVJbnQ2NCgpCiAgICBieXRlYyAyMSAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NS03NgogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDYgLy8gImludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgwCiAgICAvLyBzZWxmLnRvdGFsX2NvdXBvbnMgPSBVSW50NjQoKQogICAgYnl0ZWMgOCAvLyAidG90YWxfY291cG9ucyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODUKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDIyIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODgKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyLTkzCiAgICAvLyAjIFN0YXR1cwogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoY2ZnLlNUQVRVU19FTVBUWSkKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQKICAgIC8vIHNlbGYuc3VzcGVuZGVkID0gVUludDY0KCkKICAgIGJ5dGVjIDIzIC8vICJzdXNwZW5kZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1CiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IFVJbnQ2NCgpCiAgICBieXRlYyAyNCAvLyAiZGVmYXVsdGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzUtMzYKICAgIC8vICMgU3RhdGUgc2NoZW1hIHZhbGlkYXRpb24KICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV9ieXRlX3NsaWNlID09IGNmZy5HTE9CQUxfQllURVMsIGVyci5XUk9OR19HTE9CQUxfQllURVMKICAgIHR4biBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzcKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV91aW50ID09IGNmZy5HTE9CQUxfVUlOVFMsIGVyci5XUk9OR19HTE9CQUxfVUlOVFMKICAgIHR4biBHbG9iYWxOdW1VaW50CiAgICBwdXNoaW50IDIwIC8vIDIwCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBVSW50cyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzgKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkxPQ0FMX0JZVEVTLCBlcnIuV1JPTkdfTE9DQUxfQllURVMKICAgIHR4biBMb2NhbE51bUJ5dGVTbGljZQogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozOQogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fdWludCA9PSBjZmcuTE9DQUxfVUlOVFMsIGVyci5XUk9OR19MT0NBTF9VSU5UUwogICAgdHhuIExvY2FsTnVtVWludAogICAgIQogICAgYXNzZXJ0IC8vIFdyb25nIExvY2FsIFVJbnRzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo0MS00MgogICAgLy8gIyBDb3Vwb25zCiAgICAvLyBzZWxmLmNvdXBvbl9wZXJpb2QgPSBVSW50NjQoKQogICAgYnl0ZWMgMTcgLy8gImNvdXBvbl9wZXJpb2QiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo0MwogICAgLy8gc2VsZi5wYWlkX2NvdXBvbl91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAyNSAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2FmdGVyX2lmX2Vsc2VAMjkKICAgIHB1c2hieXRlc3MgMHg0ZmQ2YTNjYyAweDhjZjE0YjUxIDB4ODBlNTFlOWYgMHg0NDM2M2Q0OSAweDY3ZGI0ZjIwIDB4ZjZhOTZjOGQgMHgyMjliNzA2ZiAweDNmMGVmYzZjIDB4MjVkYmE5NWIgMHg4OTQ3NDEzNCAweDFkNmZjMjU1IDB4ZmVmNzQ1NjcgMHhiOGZjMTM5MCAweDNkNDNkMWYwIDB4ZWJkOTZiMmYgMHg2Yzg1ZTNlZSAweGY2M2FjZThkIDB4YmJjY2ExOGEgMHgxYTdiYWJiNCAweDQwMmRiYTQ3IDB4ZWQwMjc1OWYgMHhmYWQyMTczZSAweDA4ZWZlYTM1IDB4ZTRhNWFiNTQgLy8gbWV0aG9kICJhc3NldF90cmFuc2ZlcihhZGRyZXNzLGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAicGF5X2NvdXBvbihhZGRyZXNzLGJ5dGVbXSkodWludDY0LHVpbnQ2NCxieXRlW10pIiwgbWV0aG9kICJ1cGRhdGVfaW50ZXJlc3RfcmF0ZSh1aW50NjQpdWludDY0IiwgbWV0aG9kICJnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlKGFkZHJlc3MsdWludDY0KSh1aW50NjQsdWludDY0LCh1aW50NjQsdWludDY0KSkiLCBtZXRob2QgImdldF9wYXltZW50X2Ftb3VudChhZGRyZXNzKSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiZ2V0X2NvdXBvbnNfc3RhdHVzKCkodWludDY0LHVpbnQ2NCx1aW50NjQsKHVpbnQ2NCx1aW50NjQpLGJvb2wpIiwgbWV0aG9kICJnZXRfdGltZV9wZXJpb2RzKCkodWludDY0LHVpbnQ2NClbXSIsIG1ldGhvZCAiYXNzZXRfY3JlYXRlKGFkZHJlc3MsKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LGJ5dGVbMzJdLHN0cmluZykpdm9pZCIsIG1ldGhvZCAiYXNzZXRfdXBkYXRlKCh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCxieXRlWzMyXSxzdHJpbmcpKXZvaWQiLCBtZXRob2QgImFzc2V0X2NvbmZpZyh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQxNix1aW50MTZbXSx1aW50NjRbXSwodWludDY0LHVpbnQ2NClbXSl2b2lkIiwgbWV0aG9kICJzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKHVpbnQ2NFtdKSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiYXNzaWduX3JvbGUoYWRkcmVzcyx1aW50OCxieXRlW10pdWludDY0IiwgbWV0aG9kICJyZXZva2Vfcm9sZShhZGRyZXNzLHVpbnQ4KXVpbnQ2NCIsIG1ldGhvZCAib3Blbl9hY2NvdW50KGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImNsb3NlX2FjY291bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAic2V0X2Fzc2V0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInNldF9hY2NvdW50X3N1c3BlbnNpb24oYWRkcmVzcyxib29sKXVpbnQ2NCIsIG1ldGhvZCAic2V0X2RlZmF1bHRfc3RhdHVzKGJvb2wpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2luZm8oKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQxNix1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLHVpbnQ4KSIsIG1ldGhvZCAiZ2V0X2FjY291bnRfaW5mbyhhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wpIiwgbWV0aG9kICJnZXRfdGltZV9ldmVudHMoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSgpdWludDY0W10iLCBtZXRob2QgImdldF9hc3NldF9tZXRhZGF0YSgpKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4LGJ5dGVbMzJdLHN0cmluZykiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2Fzc2V0X3RyYW5zZmVyX3JvdXRlQDUgbWFpbl9wYXlfY291cG9uX3JvdXRlQDYgbWFpbl91cGRhdGVfaW50ZXJlc3RfcmF0ZV9yb3V0ZUA3IG1haW5fZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9yb3V0ZUA4IG1haW5fZ2V0X3BheW1lbnRfYW1vdW50X3JvdXRlQDkgbWFpbl9nZXRfY291cG9uc19zdGF0dXNfcm91dGVAMTAgbWFpbl9nZXRfdGltZV9wZXJpb2RzX3JvdXRlQDExIG1haW5fYXNzZXRfY3JlYXRlX3JvdXRlQDEyIG1haW5fYXNzZXRfdXBkYXRlX3JvdXRlQDEzIG1haW5fYXNzZXRfY29uZmlnX3JvdXRlQDE0IG1haW5fc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19yb3V0ZUAxNSBtYWluX2Fzc2lnbl9yb2xlX3JvdXRlQDE2IG1haW5fcmV2b2tlX3JvbGVfcm91dGVAMTcgbWFpbl9vcGVuX2FjY291bnRfcm91dGVAMTggbWFpbl9jbG9zZV9hY2NvdW50X3JvdXRlQDE5IG1haW5fcHJpbWFyeV9kaXN0cmlidXRpb25fcm91dGVAMjAgbWFpbl9zZXRfYXNzZXRfc3VzcGVuc2lvbl9yb3V0ZUAyMSBtYWluX3NldF9hY2NvdW50X3N1c3BlbnNpb25fcm91dGVAMjIgbWFpbl9zZXRfZGVmYXVsdF9zdGF0dXNfcm91dGVAMjMgbWFpbl9nZXRfYXNzZXRfaW5mb19yb3V0ZUAyNCBtYWluX2dldF9hY2NvdW50X2luZm9fcm91dGVAMjUgbWFpbl9nZXRfdGltZV9ldmVudHNfcm91dGVAMjYgbWFpbl9nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZV9yb3V0ZUAyNyBtYWluX2dldF9hc3NldF9tZXRhZGF0YV9yb3V0ZUAyOAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIGludGNfMCAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21ldGFkYXRhX3JvdXRlQDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYXNzZXRfbWV0YWRhdGEKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGVfcm91dGVAMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF90aW1lX2V2ZW50c19yb3V0ZUAyNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X3RpbWVfZXZlbnRzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hY2NvdW50X2luZm9fcm91dGVAMjU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2FjY291bnRfaW5mbwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfaW5mb19yb3V0ZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2luZm8KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0X2RlZmF1bHRfc3RhdHVzX3JvdXRlQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9kZWZhdWx0X3N0YXR1cwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfYWNjb3VudF9zdXNwZW5zaW9uX3JvdXRlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9hY2NvdW50X3N1c3BlbnNpb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0X2Fzc2V0X3N1c3BlbnNpb25fcm91dGVAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X2Fzc2V0X3N1c3BlbnNpb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcHJpbWFyeV9kaXN0cmlidXRpb25fcm91dGVAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODAxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcHJpbWFyeV9kaXN0cmlidXRpb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fY2xvc2VfYWNjb3VudF9yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBjbG9zZV9hY2NvdW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX29wZW5fYWNjb3VudF9yb3V0ZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBvcGVuX2FjY291bnQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcmV2b2tlX3JvbGVfcm91dGVAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2ODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcmV2b2tlX3JvbGUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzaWduX3JvbGVfcm91dGVAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYXNzaWduX3JvbGUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19yb3V0ZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Fzc2V0X2NvbmZpZ19yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYXNzZXRfY29uZmlnCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Fzc2V0X3VwZGF0ZV9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA0IC8vIFVwZGF0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgVXBkYXRlQXBwbGljYXRpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgY2FsbHN1YiBhc3NldF91cGRhdGUKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzZXRfY3JlYXRlX3JvdXRlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGNhbGxzdWIgYXNzZXRfY3JlYXRlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF90aW1lX3BlcmlvZHNfcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzkzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfdGltZV9wZXJpb2RzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9jb3Vwb25zX3N0YXR1c19yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9jb3Vwb25zX3N0YXR1cwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfcGF5bWVudF9hbW91bnRfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9wYXltZW50X2Ftb3VudAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3VwZGF0ZV9pbnRlcmVzdF9yYXRlX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiB1cGRhdGVfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9wYXlfY291cG9uX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBwYXlfY291cG9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Fzc2V0X3RyYW5zZmVyX3JvdXRlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTQ1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxNDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NldF90cmFuc2ZlcgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5wZXJwZXR1YWxfYm9uZC5jb250cmFjdC5QZXJwZXR1YWxCb25kLmFzc2V0X3RyYW5zZmVyKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCByZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogYnl0ZXMpIC0+IGJ5dGVzOgphc3NldF90cmFuc2ZlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxNDUtMTUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhc3NldF90cmFuc2ZlcigKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIHNlbmRlcl9ob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywKICAgIC8vICAgICByZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywKICAgIC8vICAgICB1bml0czogYXJjNC5VSW50NjQsCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMyAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAyCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE3NgogICAgLy8gdW5pdHMubmF0aXZlLAogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDQKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjXzMgLy8gMTAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk4LTMwMQogICAgLy8gc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5OQogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDAKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk5LTMwMAogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk5LTMwMQogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzAxCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDAtMzAxCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBmcmFtZV9kaWcgNAogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk5LTMwMQogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANQogICAgaW50Y18xIC8vIDEKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5Ny0zMDIKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vICAgICBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuU0VDT05EQVJZX01BUktFVF9DTE9TRUQKICAgIGFzc2VydCAvLyBTZWNvbmRhcnkgbWFya2V0IGlzIGNsb3NlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzc2LTM3OAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0cmFuc2ZlciByaWdodCB0byBELUFTQSBvd25lcnMuIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgcmVsYXkgb24gb3RoZXIKICAgIC8vICMgcm9sZXMsIGV4dGVybmFsIEFwcHMgdGhyb3VnaCBDMkMgY2FsbHMgKGUuZy4sIGFuIG9yZGVyIGJvb2spLCBvciBvZmYtY2hhaW4gdHJhbnNmZXIgYWdlbnRzLgogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VuZGVyX2hvbGRpbmdfYWRkcmVzcy5uYXRpdmUsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMwogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzc5CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM4MAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM4MwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkLm5hdGl2ZSwgZXJyLlNVU1BFTkRFRAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjIDQgLy8gNDQ4CiAgICBnZXRiaXQKICAgIGJ5dGVjIDExIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozODQtMzg2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFsKICAgIC8vICAgICByZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MKICAgIC8vIF0uc3VzcGVuZGVkLm5hdGl2ZSwgZXJyLlNVU1BFTkRFRAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50YyA0IC8vIDQ0OAogICAgZ2V0Yml0CiAgICBieXRlYyAxMSAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzg4CiAgICAvLyB1bml0cyA8PSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyA1CiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzg3LTM4OQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB1bml0cyA8PSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICAvLyApLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM5NwogICAgLy8gc2VuZGVyX3VuaXRfdmFsdWUgPSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZQogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzk4CiAgICAvLyBpZiBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgPiAwOgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Vsc2VfYm9keUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA5CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA5LTMxMAogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxMAogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA5LTMxMAogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMTQKICAgIGludGNfMSAvLyAxCgphc3NldF90cmFuc2Zlcl9ib29sX21lcmdlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA4LTMxMQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgLy8gICAgIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIC8vICksIGVyci5OT05fRlVOR0lCTEVfVU5JVFMKICAgIGFzc2VydCAvLyBTZW5kZXIgYW5kIHJlY2VpdmVyIHVuaXRzIGFyZSBub3QgZnVuZ2libGUKCmFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTc5LTE4MAogICAgLy8gIyBUcmFuc2ZlciBpcyBmb3JiaWRkZW4gaW4gY2FzZSBvZiBwZW5kaW5nIGNvdXBvbiBwYXltZW50cwogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxODEKICAgIC8vIHNlbGYuYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgLTMKICAgIGRpZyAxCiAgICBjYWxsc3ViIGFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTgzLTE4NAogICAgLy8gIyBUcmFuc2ZlcnJlZCB1bml0cyB2YWx1ZSAobXVzdCBiZSBjb21wdXRlZCBiZWZvcmUgdGhlIHRyYW5zZmVyKQogICAgLy8gc2VuZGVyX3VuaXRfdmFsdWUgPSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE4NS0xODcKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZSwgZHVlX2NvdXBvbnMKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50CiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQzNAogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSAtIHVuaXRzCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkaWcgMgogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDMzLTQzNQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSAtIHVuaXRzCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzMKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzMtNDM1CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlIC0gdW5pdHMKICAgIC8vICkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDMyCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDM3CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cwogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHVuY292ZXIgMwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDM2LTQzOAogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cwogICAgLy8gKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDM2CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzYtNDM4CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzCiAgICAvLyApCiAgICBzd2FwCiAgICByZXBsYWNlMiAzMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzYwCiAgICAvLyBpZiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgPT0gMDoKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBibnogYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAyMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzYxCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gYXJjNC5VSW50NjQoKQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICByZXBsYWNlMiA0MAogICAgZGlnIDEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM2MgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gYXJjNC5VSW50NjQoKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgNyAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIHJlcGxhY2UyIDQ4CiAgICBib3hfcHV0Cgphc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5MgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KHVuaXRzLm5hdGl2ZSAqIHNlbmRlcl91bml0X3ZhbHVlLm5hdGl2ZSArIGFjY3J1ZWRfaW50ZXJlc3QpCiAgICBmcmFtZV9kaWcgMAogICAgYnRvaQogICAgZnJhbWVfZGlnIDUKICAgICoKICAgIGZyYW1lX2RpZyAzCiAgICArCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAxNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VAMTUKCmFzc2V0X3RyYW5zZmVyX2Vsc2VfYm9keUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQwMwogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZSA9IHNlbmRlcl91bml0X3ZhbHVlCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZnJhbWVfZGlnIDAKICAgIHJlcGxhY2UyIDQwCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDA0LTQwNgogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50WwogICAgLy8gICAgIHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MKICAgIC8vIF0ucGFpZF9jb3Vwb25zCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50WwogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MDQtNDA2CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbCiAgICAvLyAgICAgc2VuZGVyX2hvbGRpbmdfYWRkcmVzcwogICAgLy8gXS5wYWlkX2NvdXBvbnMKICAgIHN3YXAKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHJlcGxhY2UyIDQ4CiAgICBib3hfcHV0CiAgICBiIGFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTcKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkgLT4gdm9pZDoKYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTAtMTExCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExMgogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmRlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI0IC8vICJkZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X3N1c3BlbmRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExNC0xMTUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTE2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjMgLy8gInN1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5wZXJwZXR1YWxfYm9uZC5jb250cmFjdC5QZXJwZXR1YWxCb25kLmNvdW50X2R1ZV9jb3Vwb25zKCkgLT4gdWludDY0Ogpjb3VudF9kdWVfY291cG9uczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo2Ni02NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBjb3VudF9kdWVfY291cG9ucyhzZWxmKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo2OAogICAgLy8gZHVlX2NvdXBvbnMgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NjkKICAgIC8vIGN1cnJlbnRfdHMgPSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NzAKICAgIC8vIGlmIGN1cnJlbnRfdHMgPiBzZWxmLmlzc3VhbmNlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgPgogICAgYnogY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NzEKICAgIC8vIGR1ZV9jb3Vwb25zID0gKGN1cnJlbnRfdHMgLSBzZWxmLmlzc3VhbmNlX2RhdGUpIC8vIHNlbGYuY291cG9uX3BlcmlvZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICAtCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImNvdXBvbl9wZXJpb2QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY291cG9uX3BlcmlvZCBleGlzdHMKICAgIC8KICAgIGZyYW1lX2J1cnkgMAoKY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjcyLTczCiAgICAvLyAgICAgIyBkaXYtYnktemVybzogY291cG9uX3BlcmlvZCAhPSAwIGR1ZSB0byBhc3NlcnRfdGltZV9wZXJpb2RzIGNoZWNrcwogICAgLy8gcmV0dXJuIGR1ZV9jb3Vwb25zCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMucGVycGV0dWFsX2JvbmQuY29udHJhY3QuUGVycGV0dWFsQm9uZC5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBkdWVfY291cG9uczogdWludDY0KSAtPiB2b2lkOgphc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo5NC05NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgZHVlX2NvdXBvbnM6IFVJbnQ2NAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6OTkKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9PSBkdWVfY291cG9ucwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgYj09CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6OTgtMTAwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9PSBkdWVfY291cG9ucwogICAgLy8gKSwgZXJyLlBFTkRJTkdfQ09VUE9OX1BBWU1FTlQKICAgIGFzc2VydCAvLyBQZW5kaW5nIGR1ZSBjb3Vwb24gcGF5bWVudAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQuYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IHVpbnQ2NCwgZHVlX2NvdXBvbnM6IHVpbnQ2NCkgLT4gdWludDY0OgphY2NydWVkX2ludGVyZXN0X2Ftb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMjctMTMwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCB1bml0czogVUludDY0LCBkdWVfY291cG9uczogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEzMS0xMzIKICAgIC8vICMgVGhlIGZvbGxvd2luZyBhc3NlcnQgc2FmZWd1YXJkcyB0aGUgc3Vicm91dGluZSBmcm9tIGZvcmJpZGRlbiBpbnZvY2F0aW9ucwogICAgLy8gc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChob2xkaW5nX2FkZHJlc3MsIGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMzMKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZGF5X2NvdW50X2ZhY3RvcgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gY291cG9uX2FjY3J1ZWRfcGVyaW9kID0gZGF5X2NvdW50X2ZhY3Rvci5udW1lcmF0b3IubmF0aXZlCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEzNQogICAgLy8gY291cG9uX3BlcmlvZCA9IGRheV9jb3VudF9mYWN0b3IuZGVub21pbmF0b3IubmF0aXZlCiAgICBzd2FwCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMzcKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgYWNjb3VudF91bml0c192YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTM3LTEzOAogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICAvLyAqIHNlbGYuaW50ZXJlc3RfcmF0ZQogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEzNy0xMzkKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgIC8vICogY291cG9uX2FjY3J1ZWRfcGVyaW9kCiAgICB1bmNvdmVyIDIKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxNDEKICAgIC8vIGNzdC5CUFMgKiBjb3Vwb25fcGVyaW9kCiAgICBpbnRjIDUgLy8gMTAwMDAKICAgIHVuY292ZXIgMgogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEzNy0xNDIKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgIC8vICogY291cG9uX2FjY3J1ZWRfcGVyaW9kCiAgICAvLyAvLyAoCiAgICAvLyAgICAgY3N0LkJQUyAqIGNvdXBvbl9wZXJpb2QKICAgIC8vICkgICMgZGl2LWJ5LXplcm86IGNvdXBvbl9wZXJpb2QgIT0gMCBkdWUgdG8gYXNzZXJ0X3RpbWVfcGVyaW9kcyBjaGVja3MKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMzYtMTQzCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gICAgICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAvLyAgICAgKiBjb3Vwb25fYWNjcnVlZF9wZXJpb2QKICAgIC8vICAgICAvLyAoCiAgICAvLyAgICAgICAgIGNzdC5CUFMgKiBjb3Vwb25fcGVyaW9kCiAgICAvLyAgICAgKSAgIyBkaXYtYnktemVybzogY291cG9uX3BlcmlvZCAhPSAwIGR1ZSB0byBhc3NlcnRfdGltZV9wZXJpb2RzIGNoZWNrcwogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQuZGF5X2NvdW50X2ZhY3RvcihkdWVfY291cG9uczogdWludDY0KSAtPiBieXRlczoKZGF5X2NvdW50X2ZhY3RvcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMDYtMTA3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGRheV9jb3VudF9mYWN0b3Ioc2VsZiwgZHVlX2NvdXBvbnM6IFVJbnQ2NCkgLT4gdHlwLkRheUNvdW50RmFjdG9yOgogICAgcHJvdG8gMSAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gNAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEwOC0xMDkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gaWYgbm90IGR1ZV9jb3Vwb25zOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogZGF5X2NvdW50X2ZhY3Rvcl9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjExMAogICAgLy8gYWNjcnVpbmdfc3RhcnRfdGltZSA9IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjExMwogICAgLy8gY291cG9uX2FjY3J1ZWRfcGVyaW9kID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgLSBhY2NydWluZ19zdGFydF90aW1lCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBzd2FwCiAgICAtCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjExNAogICAgLy8gY291cG9uX3BlcmlvZCA9IHNlbGYuY291cG9uX3BlcmlvZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjb3Vwb25fcGVyaW9kIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAzCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb3Vwb25fcGVyaW9kIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjExNQogICAgLy8gaWYgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9PSBVSW50NjQoY3N0LkRDQ19BX0EpOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgNAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAxCiAgICBibnogZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1NgogICAgLy8gcmV0dXJuIHRpbWVfcGVyaW9kIC8vIFVJbnQ2NChjc3QuREFZXzJfU0VDKQogICAgZnJhbWVfZGlnIDAKICAgIGludGMgNiAvLyA4NjQwMAogICAgLwogICAgZnJhbWVfZGlnIDMKICAgIGludGMgNiAvLyA4NjQwMAogICAgLwogICAgZnJhbWVfYnVyeSA0CiAgICBmcmFtZV9idXJ5IDEKCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTE5CiAgICAvLyBudW1lcmF0b3I9YXJjNC5VSW50NjQoY291cG9uX2FjY3J1ZWRfcGVyaW9kKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMjAKICAgIC8vIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGNvdXBvbl9wZXJpb2QpLAogICAgc3dhcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjExOC0xMjEKICAgIC8vIHJldHVybiB0eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgbnVtZXJhdG9yPWFyYzQuVUludDY0KGNvdXBvbl9hY2NydWVkX3BlcmlvZCksCiAgICAvLyAgICAgZGVub21pbmF0b3I9YXJjNC5VSW50NjQoY291cG9uX3BlcmlvZCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpkYXlfY291bnRfZmFjdG9yX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjgxCiAgICAvLyBjb3Vwb25fZHVlX2RhdGUgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBpZiBkdWVfY291cG9ucyA+PSBVSW50NjQoMSk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJ6IGRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6ODMKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IHNlbGYuY291cG9uX2R1ZV9kYXRlKGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGNvdXBvbl9kdWVfZGF0ZQogICAgZnJhbWVfYnVyeSAyCgpkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAODoKICAgIGZyYW1lX2RpZyAyCiAgICBiIGRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQuY291cG9uX2R1ZV9kYXRlKGNvdXBvbjogdWludDY0KSAtPiB1aW50NjQ6CmNvdXBvbl9kdWVfZGF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo3NS03NgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBjb3Vwb25fZHVlX2RhdGUoc2VsZiwgY291cG9uOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyByZXR1cm4gc2VsZi5pc3N1YW5jZV9kYXRlICsgY291cG9uICogc2VsZi5jb3Vwb25fcGVyaW9kCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjb3Vwb25fcGVyaW9kIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdXBvbl9wZXJpb2QgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgICsKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IHVpbnQ2NCkgLT4gdWludDY0OgphY2NvdW50X3VuaXRzX3ZhbHVlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzQyLTM0NQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhY2NvdW50X3VuaXRzX3ZhbHVlKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCB1bml0czogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzQ2CiAgICAvLyByZXR1cm4gdW5pdHMgKiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlLm5hdGl2ZQogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQucGF5X2NvdXBvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBwYXltZW50X2luZm86IGJ5dGVzKSAtPiBieXRlczoKcGF5X2NvdXBvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOTQtMTk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBwYXlfY291cG9uKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCBwYXltZW50X2luZm86IGFyYzQuRHluYW1pY0J5dGVzCiAgICAvLyApIC0+IHR5cC5QYXltZW50UmVzdWx0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDQKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjXzMgLy8gMTAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIxNy0yMTgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCByZXN0cmljdCBjYWxsZXIgYXV0aG9yaXphdGlvbgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyMTkKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIyMAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cG4gMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gdW5pdHMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIyMwogICAgLy8gYXNzZXJ0IHVuaXRzID4gMCwgZXJyLk5PX1VOSVRTCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyMjQKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjI1CiAgICAvLyBhY2NvdW50X3BhaWRfY291cG9ucyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucy5uYXRpdmUKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIyNgogICAgLy8gYXNzZXJ0IGR1ZV9jb3Vwb25zID4gYWNjb3VudF9wYWlkX2NvdXBvbnMsIGVyci5OT19EVUVfQ09VUE9OCiAgICBzd2FwCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjb3Vwb24gdG8gcGF5CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjI3LTIzMAogICAgLy8gIyBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgdmVyaWZ5IGlmIG90aGVyIGFjY291bnRzIGFyZSBzdGlsbCB3YWl0aW5nIGZvciB0aGUgcGF5bWVudCBvZiBwcmV2aW91cyBjb3Vwb25zCiAgICAvLyBhc3NlcnQgc2VsZi5hbGxfZHVlX2NvdXBvbnNfcGFpZCgKICAgIC8vICAgICBhY2NvdW50X3BhaWRfY291cG9ucwogICAgLy8gKSwgZXJyLlBFTkRJTkdfQ09VUE9OX1BBWU1FTlQKICAgIGNhbGxzdWIgYWxsX2R1ZV9jb3Vwb25zX3BhaWQKICAgIGFzc2VydCAvLyBQZW5kaW5nIGR1ZSBjb3Vwb24gcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzE2CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MubmF0aXZlLmlzX29wdGVkX2luKAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMiAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxNwogICAgLy8gQXNzZXQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxNi0zMTgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5uYXRpdmUuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgQXNzZXQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgLy8gKQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxNi0zMTkKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5uYXRpdmUuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgQXNzZXQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgLy8gKQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQubmF0aXZlCiAgICBieiBwYXlfY291cG9uX2Jvb2xfZmFsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxOQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQubmF0aXZlCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGMgNCAvLyA0NDgKICAgIGdldGJpdAogICAgYnl0ZWMgMTEgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBibnogcGF5X2NvdXBvbl9ib29sX2ZhbHNlQDE0CiAgICBpbnRjXzEgLy8gMQoKcGF5X2NvdXBvbl9ib29sX21lcmdlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gaWYgc2VsZi5pc19wYXltZW50X2V4ZWN1dGFibGUoaG9sZGluZ19hZGRyZXNzKToKICAgIGJ6IHBheV9jb3Vwb25fZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyMzUKICAgIC8vIHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgYWNjb3VudF90b3RhbF91bml0c192YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHByaW5jaXBhbF9hbW91bnQgKiBzZWxmLmludGVyZXN0X3JhdGUgLy8gY3N0LkJQUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgICoKICAgIGludGMgNSAvLyAxMDAwMAogICAgLwogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjUKICAgIC8vIEFzc2V0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCkuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyNS0zMjYKICAgIC8vIEFzc2V0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCkuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gPj0gcGF5bWVudF9hbW91bnQKICAgIGRpZyAxCiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzI0LTMyNwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBBc3NldChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vICAgICA+PSBwYXltZW50X2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIzOS0yNDAKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgdGhlIHNhbWUgYXNzZXQgZm9yIGRlbm9taW5hdGlvbiBhbmQgc2V0dGxlbWVudCwgbm8gY29udmVyc2lvbiBuZWVkZWQKICAgIC8vIHNlbGYucGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgcGF5bWVudF9hbW91bnQpCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMiAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMzMS0zMzYKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlci5uYXRpdmUsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzM1CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzMyCiAgICAvLyB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzMxCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMzEtMzM2CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIubmF0aXZlLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CgpwYXlfY291cG9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNDYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucy5uYXRpdmUgKyAxCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNDUtMjQ3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMubmF0aXZlICsgMQogICAgLy8gKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gYXJjNC5VSW50NjQoCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNDUtMjQ3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMubmF0aXZlICsgMQogICAgLy8gKQogICAgc3dhcAogICAgcmVwbGFjZTIgNDgKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNDgKICAgIC8vIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNSAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgZXhpc3RzCiAgICBmcmFtZV9kaWcgMQogICAgKwogICAgYnl0ZWMgMjUgLy8gInBhaWRfY291cG9uX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNTAKICAgIC8vIGFtb3VudD1hcmM0LlVJbnQ2NChwYXltZW50X2Ftb3VudCksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjUxCiAgICAvLyB0aW1lc3RhbXA9YXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI0OS0yNTMKICAgIC8vIHJldHVybiB0eXAuUGF5bWVudFJlc3VsdCgKICAgIC8vICAgICBhbW91bnQ9YXJjNC5VSW50NjQocGF5bWVudF9hbW91bnQpLAogICAgLy8gICAgIHRpbWVzdGFtcD1hcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCksCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8uY29weSgpLCAgIyBUT0RPOiBBZGQgaW5mbyBvbiBmYWlsZWQgcGF5bWVudAogICAgLy8gKQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDEyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKcGF5X2NvdXBvbl9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNDItMjQzCiAgICAvLyAjIEFjY291bnRzIHN1c3BlbmRlZCBvciBub3Qgb3B0ZWQgaW4gYXQgdGhlIHRpbWUgb2YgcGF5bWVudHMgbXVzdCBub3Qgc3RhbGwgdGhlIEQtQVNBCiAgICAvLyBwYXltZW50X2Ftb3VudCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgYiBwYXlfY291cG9uX2FmdGVyX2lmX2Vsc2VAMwoKcGF5X2NvdXBvbl9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIGIgcGF5X2NvdXBvbl9ib29sX21lcmdlQDE1CgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQuYWxsX2R1ZV9jb3Vwb25zX3BhaWQoZHVlX2NvdXBvbnM6IHVpbnQ2NCkgLT4gdWludDY0OgphbGxfZHVlX2NvdXBvbnNfcGFpZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo5MC05MQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhbGxfZHVlX2NvdXBvbnNfcGFpZChzZWxmLCBkdWVfY291cG9uczogVUludDY0KSAtPiBib29sOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6OTIKICAgIC8vIHJldHVybiBzZWxmLnBhaWRfY291cG9uX3VuaXRzID49IHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBkdWVfY291cG9ucwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI1IC8vICJwYWlkX2NvdXBvbl91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wYWlkX2NvdXBvbl91bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgPj0KICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gdWludDY0OgphY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzQ4LTM0OQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzKSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1MQogICAgLy8gaG9sZGluZ19hZGRyZXNzLCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNTAtMzUyCiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKAogICAgLy8gICAgIGhvbGRpbmdfYWRkcmVzcywgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGNhbGxzdWIgYWNjb3VudF91bml0c192YWx1ZQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQudXBkYXRlX2ludGVyZXN0X3JhdGUoaW50ZXJlc3RfcmF0ZTogYnl0ZXMpIC0+IGJ5dGVzOgp1cGRhdGVfaW50ZXJlc3RfcmF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNTUtMjU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiB1cGRhdGVfaW50ZXJlc3RfcmF0ZShzZWxmLCBpbnRlcmVzdF9yYXRlOiBhcmM0LlVJbnQ2NCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNjYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgYnl0ZWMgMjcgLy8gMHg1MjM4MzAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTY0CiAgICAvLyBjYWxsZXIgPSBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gY2FsbGVyIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNjYtMTY5CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vIGFuZCBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiB1cGRhdGVfaW50ZXJlc3RfcmF0ZV9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE2NwogICAgLy8gYW5kIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X29yYWNsZSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTY4CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTY3LTE2OAogICAgLy8gYW5kIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE2Ny0xNjkKICAgIC8vIGFuZCBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiB1cGRhdGVfaW50ZXJlc3RfcmF0ZV9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE2OQogICAgLy8gPD0gc2VsZi5pbnRlcmVzdF9vcmFjbGVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X29yYWNsZSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTY4LTE2OQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuaW50ZXJlc3Rfb3JhY2xlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE2Ny0xNjkKICAgIC8vIGFuZCBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiB1cGRhdGVfaW50ZXJlc3RfcmF0ZV9ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgp1cGRhdGVfaW50ZXJlc3RfcmF0ZV9ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNjUtMTcwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgLy8gICAgIGFuZCBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYuaW50ZXJlc3Rfb3JhY2xlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6Mjc0CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNzUKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6Mjc2CiAgICAvLyBhc3NlcnQgc2VsZi5hbGxfZHVlX2NvdXBvbnNfcGFpZChkdWVfY291cG9ucyksIGVyci5QRU5ESU5HX0NPVVBPTl9QQVlNRU5UCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNzgtMjc5CiAgICAvLyAjIFVwZGF0ZSBpbnRlcmVzdCByYXRlCiAgICAvLyBzZWxmLmludGVyZXN0X3JhdGUgPSBpbnRlcmVzdF9yYXRlLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBieXRlYyA2IC8vICJpbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyODAKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgp1cGRhdGVfaW50ZXJlc3RfcmF0ZV9ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiB1cGRhdGVfaW50ZXJlc3RfcmF0ZV9ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMucGVycGV0dWFsX2JvbmQuY29udHJhY3QuUGVycGV0dWFsQm9uZC5nZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjgyLTI4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZSgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgdW5pdHM6IGFyYzQuVUludDY0CiAgICAvLyApIC0+IHR5cC5DdXJyZW50VW5pdHNWYWx1ZToKICAgIHByb3RvIDIgMQogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzAzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzAzLTMwNAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMDQKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMwMy0zMDQKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzEgLy8gMQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzAyLTMwNQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gICAgIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gKSwgZXJyLk5PX1BSSU1BUllfRElTVFJJQlVUSU9OCiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gbm90IHlldCBleGVjdXRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMwOAogICAgLy8gMCA8IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBieXRlYyA3IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYj4KICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA3CiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtMQogICAgYj49CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VANwogICAgaW50Y18xIC8vIDEKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMwNy0zMDkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgMCA8IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfVU5JVFMKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFtb3VudCBvZiB1bml0cyBmb3IgdGhlIGFjY291bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMTMKICAgIC8vIGhvbGRpbmdfYWRkcmVzcywgdW5pdHMubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzExLTMxNAogICAgLy8gIyBWYWx1ZSBkdXJpbmcgcHJpbWFyeSBkaXN0cmlidXRpb24KICAgIC8vIGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSA9IHNlbGYuYWNjb3VudF91bml0c192YWx1ZSgKICAgIC8vICAgICBob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZQogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMxNS0zMTYKICAgIC8vICMgQWNjcnVpbmcgaW50ZXJlc3QgZHVyaW5nIHByaW1hcnkgZGlzdHJpYnV0aW9uCiAgICAvLyBhY2NydWVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMTcKICAgIC8vIG51bWVyYXRvciA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzE4CiAgICAvLyBkZW5vbWluYXRvciA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzIwLTMyMQogICAgLy8gIyBBY2NydWluZyBpbnRlcmVzdAogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzIyCiAgICAvLyBzZWxmLmFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50KGhvbGRpbmdfYWRkcmVzcywgZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGNhbGxzdWIgYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMjMKICAgIC8vIGlmIHNlbGYuaXNfYWNjcnVpbmdfaW50ZXJlc3QoKToKICAgIGNhbGxzdWIgaXNfYWNjcnVpbmdfaW50ZXJlc3QKICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMyNAogICAgLy8gZGF5X2NvdW50X2ZhY3RvciA9IHNlbGYuZGF5X2NvdW50X2ZhY3RvcihkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNhbGxzdWIgZGF5X2NvdW50X2ZhY3RvcgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMyNS0zMjcKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIGhvbGRpbmdfYWRkcmVzcywgdW5pdHMubmF0aXZlLCBkdWVfY291cG9ucwogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgNgogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50CiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMjgKICAgIC8vIG51bWVyYXRvciA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yLm5hdGl2ZQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMyOQogICAgLy8gZGVub21pbmF0b3IgPSBkYXlfY291bnRfZmFjdG9yLmRlbm9taW5hdG9yLm5hdGl2ZQogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBmcmFtZV9idXJ5IDMKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMzEKICAgIC8vIHVuaXRzX3ZhbHVlPWFyYzQuVUludDY0KGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSksCiAgICBmcmFtZV9kaWcgMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMzMgogICAgLy8gYWNjcnVlZF9pbnRlcmVzdD1hcmM0LlVJbnQ2NChhY2NydWVkX2ludGVyZXN0KSwKICAgIGZyYW1lX2RpZyAyCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzM0CiAgICAvLyBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIGZyYW1lX2RpZyA1CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzM1CiAgICAvLyBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICBmcmFtZV9kaWcgMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMzMy0zMzYKICAgIC8vIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChudW1lcmF0b3IpLAogICAgLy8gICAgIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGRlbm9taW5hdG9yKSwKICAgIC8vICksCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMzAtMzM3CiAgICAvLyByZXR1cm4gdHlwLkN1cnJlbnRVbml0c1ZhbHVlKAogICAgLy8gICAgIHVuaXRzX3ZhbHVlPWFyYzQuVUludDY0KGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSksCiAgICAvLyAgICAgYWNjcnVlZF9pbnRlcmVzdD1hcmM0LlVJbnQ2NChhY2NydWVkX2ludGVyZXN0KSwKICAgIC8vICAgICBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICAgICAgbnVtZXJhdG9yPWFyYzQuVUludDY0KG51bWVyYXRvciksCiAgICAvLyAgICAgICAgIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGRlbm9taW5hdG9yKSwKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMCAvLyAwCiAgICBiIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA4CgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICBiIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQuaXNfYWNjcnVpbmdfaW50ZXJlc3QoKSAtPiB1aW50NjQ6CmlzX2FjY3J1aW5nX2ludGVyZXN0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEyMy0xMjQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgaXNfYWNjcnVpbmdfaW50ZXJlc3Qoc2VsZikgLT4gYm9vbDoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEyNQogICAgLy8gcmV0dXJuIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIGJ6IGlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VAMwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgID4KICAgIGJ6IGlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKaXNfYWNjcnVpbmdfaW50ZXJlc3RfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMjUKICAgIC8vIHJldHVybiBzZWxmLmlzc3VhbmNlX2RhdGUgIT0gMCBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5wZXJwZXR1YWxfYm9uZC5jb250cmFjdC5QZXJwZXR1YWxCb25kLmdldF9wYXltZW50X2Ftb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X3BheW1lbnRfYW1vdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMzOS0zNDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9wYXltZW50X2Ftb3VudChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcykgLT4gdHlwLlBheW1lbnRBbW91bnRzOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNTUKICAgIC8vIHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWNjb3VudF90b3RhbF91bml0c192YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM1NgogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzU1LTM1NgogICAgLy8gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcykKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzU3CiAgICAvLyAvLyBjc3QuQlBTCiAgICBpbnRjIDUgLy8gMTAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNTUtMzU3CiAgICAvLyBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKQogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgIC8vIC8vIGNzdC5CUFMKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNjAKICAgIC8vIGludGVyZXN0PWFyYzQuVUludDY0KGludGVyZXN0X2Ftb3VudCksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzYxCiAgICAvLyBwcmluY2lwYWw9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzU5LTM2MgogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50QW1vdW50cygKICAgIC8vICAgICBpbnRlcmVzdD1hcmM0LlVJbnQ2NChpbnRlcmVzdF9hbW91bnQpLAogICAgLy8gICAgIHByaW5jaXBhbD1hcmM0LlVJbnQ2NCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMucGVycGV0dWFsX2JvbmQuY29udHJhY3QuUGVycGV0dWFsQm9uZC5nZXRfY291cG9uc19zdGF0dXMoKSAtPiBieXRlczoKZ2V0X2NvdXBvbnNfc3RhdHVzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM2NC0zNjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9jb3Vwb25zX3N0YXR1cyhzZWxmKSAtPiB0eXAuQ291cG9uc0luZm86CiAgICBwcm90byAwIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDQKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjXzMgLy8gMTAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM3MwogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkgaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkgZWxzZSBVSW50NjQoKQogICAgYnogZ2V0X2NvdXBvbnNfc3RhdHVzX3Rlcm5hcnlfZmFsc2VAMgogICAgY2FsbHN1YiBjb3VudF9kdWVfY291cG9ucwogICAgZnJhbWVfYnVyeSAyCgpnZXRfY291cG9uc19zdGF0dXNfdGVybmFyeV9tZXJnZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5Ojg4CiAgICAvLyByZXR1cm4gc2VsZi5jb3Vwb25fZHVlX2RhdGUoZHVlX2NvdXBvbnMgKyAxKQogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGNhbGxzdWIgY291cG9uX2R1ZV9kYXRlCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNzUKICAgIC8vIGFsbF9kdWVfY291cG9uc19wYWlkID0gc2VsZi5hbGxfZHVlX2NvdXBvbnNfcGFpZChkdWVfY291cG9ucykKICAgIGNhbGxzdWIgYWxsX2R1ZV9jb3Vwb25zX3BhaWQKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM3NgogICAgLy8gbnVtZXJhdG9yID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNzcKICAgIC8vIGRlbm9taW5hdG9yID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNzgKICAgIC8vIGlmIHNlbGYuaXNfYWNjcnVpbmdfaW50ZXJlc3QoKToKICAgIGNhbGxzdWIgaXNfYWNjcnVpbmdfaW50ZXJlc3QKICAgIGJ6IGdldF9jb3Vwb25zX3N0YXR1c19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNzkKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgMgogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzgwCiAgICAvLyBudW1lcmF0b3IgPSBkYXlfY291bnRfZmFjdG9yLm51bWVyYXRvci5uYXRpdmUKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozODEKICAgIC8vIGRlbm9taW5hdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvci5uYXRpdmUKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfYnVyeSAxCgpnZXRfY291cG9uc19zdGF0dXNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM4MwogICAgLy8gdG90YWxfY291cG9ucz1hcmM0LlVJbnQ2NChzZWxmLnRvdGFsX2NvdXBvbnMpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozODQKICAgIC8vIGR1ZV9jb3Vwb25zPWFyYzQuVUludDY0KGR1ZV9jb3Vwb25zKSwKICAgIGZyYW1lX2RpZyAyCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6Mzg1CiAgICAvLyBuZXh0X2NvdXBvbl9kdWVfZGF0ZT1hcmM0LlVJbnQ2NChuZXh0X2NvdXBvbl9kdWVfZGF0ZSksCiAgICBmcmFtZV9kaWcgMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM4NwogICAgLy8gbnVtZXJhdG9yPWFyYzQuVUludDY0KG51bWVyYXRvciksCiAgICBmcmFtZV9kaWcgNAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM4OAogICAgLy8gZGVub21pbmF0b3I9YXJjNC5VSW50NjQoZGVub21pbmF0b3IpLAogICAgZnJhbWVfZGlnIDEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozODYtMzg5CiAgICAvLyBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIC8vICAgICBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICAvLyApLAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzkwCiAgICAvLyBhbGxfZHVlX2NvdXBvbnNfcGFpZD1hcmM0LkJvb2woYWxsX2R1ZV9jb3Vwb25zX3BhaWQpLAogICAgYnl0ZWMgMTEgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAwCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozODItMzkxCiAgICAvLyByZXR1cm4gdHlwLkNvdXBvbnNJbmZvKAogICAgLy8gICAgIHRvdGFsX2NvdXBvbnM9YXJjNC5VSW50NjQoc2VsZi50b3RhbF9jb3Vwb25zKSwKICAgIC8vICAgICBkdWVfY291cG9ucz1hcmM0LlVJbnQ2NChkdWVfY291cG9ucyksCiAgICAvLyAgICAgbmV4dF9jb3Vwb25fZHVlX2RhdGU9YXJjNC5VSW50NjQobmV4dF9jb3Vwb25fZHVlX2RhdGUpLAogICAgLy8gICAgIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIC8vICAgICAgICAgZGVub21pbmF0b3I9YXJjNC5VSW50NjQoZGVub21pbmF0b3IpLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYWxsX2R1ZV9jb3Vwb25zX3BhaWQ9YXJjNC5Cb29sKGFsbF9kdWVfY291cG9uc19wYWlkKSwKICAgIC8vICkKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X2NvdXBvbnNfc3RhdHVzX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNzMKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpIGVsc2UgVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgZ2V0X2NvdXBvbnNfc3RhdHVzX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5wZXJwZXR1YWxfYm9uZC5jb250cmFjdC5QZXJwZXR1YWxCb25kLmdldF90aW1lX3BlcmlvZHMoKSAtPiBieXRlczoKZ2V0X3RpbWVfcGVyaW9kczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozOTMtMzk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfdGltZV9wZXJpb2RzKHNlbGYpIC0+IHR5cC5UaW1lUGVyaW9kczoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjQwMQogICAgLy8gdGltZV9wZXJpb2RzID0gdHlwLlRpbWVQZXJpb2RzKCkKICAgIGJ5dGVjIDMzIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA0CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18zIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo0MDIKICAgIC8vIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpOgogICAgYnogZ2V0X3RpbWVfcGVyaW9kc19hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo0MDMKICAgIC8vIHRpbWVfcGVyaW9kcyA9IHNlbGYudGltZV9wZXJpb2RzLnZhbHVlLmNvcHkoKQogICAgYnl0ZWMgMjYgLy8gMHg3NDY5NmQ2NTUwNjU3MjY5NmY2NDczCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRpbWVfcGVyaW9kcyBleGlzdHMKCmdldF90aW1lX3BlcmlvZHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gcmV0dXJuIHRpbWVfcGVyaW9kcwogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2V0X2NyZWF0ZShhcnJhbmdlcjogYnl0ZXMsIG1ldGFkYXRhOiBieXRlcykgLT4gdm9pZDoKYXNzZXRfY3JlYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDYxLTQ2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICAvLyBkZWYgYXNzZXRfY3JlYXRlKHNlbGYsIGFycmFuZ2VyOiBhcmM0LkFkZHJlc3MsIG1ldGFkYXRhOiB0eXAuQXNzZXRNZXRhZGF0YSkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gYXJyYW5nZXIubmF0aXZlCiAgICBieXRlYyAxOCAvLyAweDUyMzIzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzEKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YS5ieXRlcwogICAgYnl0ZWMgMjAgLy8gIm1ldGFkYXRhIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXRfdXBkYXRlKG1ldGFkYXRhOiBieXRlcykgLT4gdm9pZDoKYXNzZXRfdXBkYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDczLTQ3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIGFzc2V0X3VwZGF0ZShzZWxmLCBtZXRhZGF0YTogdHlwLkFzc2V0TWV0YWRhdGEpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3OC00ODEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgZGlzYWJsZSBELUFTQSBhcHBsaWNhdGlvbiB1cGRhdGFiaWxpdHkgb3IgY2hhbmdlIGl0cyBhdXRob3JpemF0aW9ucy4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleSBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ4MgogICAgLy8gc2VsZi5tZXRhZGF0YSA9IG1ldGFkYXRhLmJ5dGVzCiAgICBieXRlYyAyMCAvLyAibWV0YWRhdGEiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExOC0xMTkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYuYXJyYW5nZXIudmFsdWUsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAweDUyMzIzMDIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NldF9jb25maWcoZGVub21pbmF0aW9uX2Fzc2V0X2lkOiBieXRlcywgc2V0dGxlbWVudF9hc3NldF9pZDogYnl0ZXMsIHByaW5jaXBhbDogYnl0ZXMsIHByaW5jaXBhbF9kaXNjb3VudDogYnl0ZXMsIG1pbmltdW1fZGVub21pbmF0aW9uOiBieXRlcywgZGF5X2NvdW50X2NvbnZlbnRpb246IGJ5dGVzLCBpbnRlcmVzdF9yYXRlOiBieXRlcywgY291cG9uX3JhdGVzOiBieXRlcywgdGltZV9ldmVudHM6IGJ5dGVzLCB0aW1lX3BlcmlvZHM6IGJ5dGVzKSAtPiB2b2lkOgphc3NldF9jb25maWc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0ODQtNDk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhc3NldF9jb25maWcoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHByaW5jaXBhbDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgcHJpbmNpcGFsX2Rpc2NvdW50OiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBtaW5pbXVtX2Rlbm9taW5hdGlvbjogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb246IGFyYzQuVUludDgsCiAgICAvLyAgICAgaW50ZXJlc3RfcmF0ZTogYXJjNC5VSW50MTYsCiAgICAvLyAgICAgY291cG9uX3JhdGVzOiB0eXAuQ291cG9uUmF0ZXMsCiAgICAvLyAgICAgdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzLAogICAgLy8gICAgIHRpbWVfcGVyaW9kczogdHlwLlRpbWVQZXJpb2RzLAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMTAgMAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MjcKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUyOAogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfRU1QVFksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTMwLTUzMQogICAgLy8gIyBTZXQgRGVub21pbmF0aW9uIEFzc2V0CiAgICAvLyBzZWxmLmFzc2VydF9kZW5vbWluYXRpb25fYXNzZXQoZGVub21pbmF0aW9uX2Fzc2V0X2lkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMTAKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTgwCiAgICAvLyBkZW5vbWluYXRpb25fYXNzZXRfaWQgIT0gVUludDY0KDApIGFuZCBBc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQpLmNyZWF0b3IKICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQKICAgIGZyYW1lX2RpZyA0CiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCmFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzgtMTgxCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQgIT0gVUludDY0KDApIGFuZCBBc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQpLmNyZWF0b3IKICAgIC8vICksIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODUKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZnJhbWVfZGlnIDQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzQtNTM1CiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuYXNzZXJ0X3NldHRsZW1lbnRfYXNzZXQoc2V0dGxlbWVudF9hc3NldF9pZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTkKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkIGV4aXN0cwogICAgZGlnIDEKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODktMTkyCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyA1IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5Ny0yMDMKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5OQogICAgLy8geGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjAwCiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk3LTE5OAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTctMjAzCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQwCiAgICAvLyBwcmluY2lwYWwubmF0aXZlICUgbWluaW11bV9kZW5vbWluYXRpb24ubmF0aXZlID09IDAKICAgIGZyYW1lX2RpZyAtOAogICAgYnRvaQogICAgZnJhbWVfZGlnIC02CiAgICBidG9pCiAgICBkdXAyCiAgICAlCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzgtNTQxCiAgICAvLyAjIFNldCBQcmluY2lwYWwgYW5kIE1pbmltdW0gRGVub21pbmF0aW9uCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByaW5jaXBhbC5uYXRpdmUgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUgPT0gMAogICAgLy8gKSwgZXJyLklOVkFMSURfTUlOSU1VTV9ERU5PTUlOQVRJT04KICAgIGFzc2VydCAvLyBNaW5pbXVtIGRlbm9taW5hdGlvbiBpcyBub3QgYSBkaXZpc29yIG9mIHByaW5jaXBhbAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQyCiAgICAvLyBzZWxmLnVuaXRfdmFsdWUgPSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUKICAgIGJ5dGVjIDEyIC8vICJ1bml0X3ZhbHVlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NDMKICAgIC8vIHNlbGYudG90YWxfdW5pdHMgPSBwcmluY2lwYWwubmF0aXZlIC8vIG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZQogICAgLwogICAgYnl0ZWMgMTQgLy8gInRvdGFsX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU0NAogICAgLy8gc2VsZi5wcmluY2lwYWxfZGlzY291bnQgPSBwcmluY2lwYWxfZGlzY291bnQubmF0aXZlCiAgICBmcmFtZV9kaWcgLTcKICAgIGJ0b2kKICAgIGJ5dGVjIDIxIC8vICJwcmluY2lwYWxfZGlzY291bnQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQ2LTU0NwogICAgLy8gIyBTZXQgRGF5LUNvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuYXNzZXJ0X2RheV9jb3VudF9jb252ZW50aW9uKGRheV9jb3VudF9jb252ZW50aW9uLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtNQogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNy0yMTEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGZyYW1lX2RpZyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTAKICAgIC8vIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgcHVzaGludCAyNTUgLy8gMjU1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDctMjExCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICA9PQogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmFzc2V0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDctMjExCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICBhc3NlcnQgLy8gSW52YWxpZCBkYXktY291bnQgY29udmVudGlvbiBJRAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjE1CiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIGJ5dGVjIDEzIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGZyYW1lX2RpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTUwLTU1MQogICAgLy8gIyBTZXQgSW50ZXJlc3QgUmF0ZQogICAgLy8gc2VsZi5hc3NlcnRfaW50ZXJlc3RfcmF0ZShpbnRlcmVzdF9yYXRlLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtNAogICAgYnRvaQogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTktMjIwCiAgICAvLyAjIFRoaXMgc3Vicm91dGluZSBtdXN0IGJlIHVzZWQgYWZ0ZXIgdGhlIHByaW5jaXBhbCBkaXNjb3VudCBoYXMgYmVlbiBzZXQKICAgIC8vIGlmIG5vdCBzZWxmLnByaW5jaXBhbF9kaXNjb3VudDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMSAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIGJueiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjIxCiAgICAvLyBhc3NlcnQgaW50ZXJlc3RfcmF0ZSA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfSU5URVJFU1RfUkFURQogICAgZnJhbWVfZGlnIDIKICAgIGFzc2VydCAvLyBJbnRlcmVzdCByYXRlIGlzIG5vdCBwcm9wZXJseSBkZWZpbmVkCgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gc2VsZi5pbnRlcmVzdF9yYXRlID0gaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgNiAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIGZyYW1lX2RpZyAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjI5CiAgICAvLyBhc3NlcnQgbm90IGNvdXBvbl9yYXRlcy5sZW5ndGgsIGVyci5JTlZBTElEX0NPVVBPTl9SQVRFUwogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgIQogICAgYXNzZXJ0IC8vIENvdXBvbiByYXRlcyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gc2VsZi50b3RhbF9jb3Vwb25zID0gY291cG9uX3JhdGVzLmxlbmd0aAogICAgYnl0ZWMgOCAvLyAidG90YWxfY291cG9ucyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMzQKICAgIC8vIGlmIHNlbGYudG90YWxfY291cG9uczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBieiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjM1CiAgICAvLyBzZWxmLmNvdXBvbl9yYXRlcy52YWx1ZSA9IGNvdXBvbl9yYXRlcy5jb3B5KCkKICAgIGJ5dGVjIDM0IC8vIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MwogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyAzNCAvLyAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMKICAgIGZyYW1lX2RpZyAtMwogICAgYm94X3B1dAoKYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NDkKICAgIC8vIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFMKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgcHVzaGludCAzIC8vIDMKICAgICsKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NDctNTAKICAgIC8vICMgVGhlIHBlcnBldHVhbCBib25kIGhhcyB1bmRlZmluZWQgY291cG9ucyAodG90YWxfY291cG9ucyA9IDApIGFuZCBubyBtYXR1cml0eSBkYXRlCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFMKICAgIC8vICksIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NjAKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCh0aW1lX2V2ZW50cykKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjUKICAgIC8vIHNlbGYudGltZV9ldmVudHMudmFsdWUgPSB0aW1lX2V2ZW50cy5jb3B5KCkKICAgIGJ5dGVjIDI4IC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMjggLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjYtMjY4CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICBieXRlYyA5IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjYtMjY4CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2OS0yNzEKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBkdXAKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY5CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgYnl0ZWMgMjIgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2OS0yNzEKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjcyCiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgPSB0aW1lX2V2ZW50c1tjZmcuSVNTVUFOQ0VfREFURV9JRFhdLm5hdGl2ZQogICAgZXh0cmFjdCAxNiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzQtMjc1CiAgICAvLyAjIFNvbWUgRC1BU0EgbWF5IG5vdCBoYXZlIGEgbWF0dXJpdHkgZGF0ZSAoZS5nLiwgcGVycGV0dWFscykKICAgIC8vIGlmIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBwdXNoaW50IDQgLy8gNAogICAgKwogICAgPT0KICAgIGJ6IGFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDM4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzYKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRpbWVfZXZlbnRzW2NmZy5NQVRVUklUWV9EQVRFX0lEWF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnl0ZWMgMTAgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NTQtNTUKICAgIC8vICMgVGhlIHBlcnBldHVhbCBib25kIGRlZmluZXMgYSBzaW5nbGUgdGltZSBwZXJpb2QgZm9yIHRoZSBjb3Vwb24gZHVyYXRpb24gd2l0aCB1bmxpbWl0ZWQgcmVwZXRpdGlvbnMKICAgIC8vIGFzc2VydCB0aW1lX3BlcmlvZHMubGVuZ3RoID09IFVJbnQ2NCgxKSwgZXJyLklOVkFMSURfVElNRV9QRVJJT0RTCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGFyZSBub3QgcHJvcGVybHkgZGVmaW5lZAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBjb3Vwb25fcGVyaW9kX2R1cmF0aW9uID0gdGltZV9wZXJpb2RzWzBdWzBdLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZXh0cmFjdCAwIDE2IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo1NwogICAgLy8gcmVwZXRpdGlvbnMgPSB0aW1lX3BlcmlvZHNbMF1bMV0ubmF0aXZlCiAgICBzd2FwCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo1OAogICAgLy8gYXNzZXJ0IGNvdXBvbl9wZXJpb2RfZHVyYXRpb24gPiBVSW50NjQoMCksIGVyci5JTlZBTElEX1RJTUVfUEVSSU9EX0RVUkFUSU9OCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2QgZHVyYXRpb25zIG11c3QgYmUgc3RyaWN0bHkgZ3JlYXRlciB0aGFuIHplcm8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo1OQogICAgLy8gYXNzZXJ0IHJlcGV0aXRpb25zID09IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfVElNRV9QRVJJT0RfUkVQRVRJVElPTlMKICAgICEKICAgIGFzc2VydCAvLyBUaW1lIHBlcmlvZCByZXBldGl0aW9ucyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo2MwogICAgLy8gc2VsZi50aW1lX3BlcmlvZHMudmFsdWUgPSB0aW1lX3BlcmlvZHMuY29weSgpCiAgICBieXRlYyAyNiAvLyAweDc0Njk2ZDY1NTA2NTcyNjk2ZjY0NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMjYgLy8gMHg3NDY5NmQ2NTUwNjU3MjY5NmY2NDczCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo2NAogICAgLy8gc2VsZi5jb3Vwb25fcGVyaW9kID0gc2VsZi50aW1lX3BlcmlvZHMudmFsdWVbMF1bMF0ubmF0aXZlCiAgICBieXRlYyAyNiAvLyAweDc0Njk2ZDY1NTA2NTcyNjk2ZjY0NzMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRpbWVfcGVyaW9kcyBleGlzdHMKICAgIGV4dHJhY3QgMiAwCiAgICBleHRyYWN0IDAgMTYgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ5dGVjIDE3IC8vICJjb3Vwb25fcGVyaW9kIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU2NwogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoY2ZnLlNUQVRVU19BQ1RJVkUpCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBpbnRjXzMgLy8gMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgphc3NldF9jb25maWdfYm9vbF9mYWxzZUAxNzoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDE4Cgphc3NldF9jb25maWdfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQodGltZV9ldmVudHM6IGJ5dGVzKSAtPiBieXRlczoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0My0yNDQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWxmLCB0aW1lX2V2ZW50czogdHlwLlRpbWVFdmVudHMpIC0+IE5vbmU6CiAgICBwcm90byAxIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDYKICAgIC8vIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDcKICAgIC8vID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0Ni0yNDcKICAgIC8vIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXS5uYXRpdmUKICAgIC8vID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0NS0yNDgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdLm5hdGl2ZQogICAgLy8gICAgID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5JTlZBTElEX1RJTUUKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDkKICAgIC8vIGZvciBfdCBpbiB1cmFuZ2UodGltZV9ldmVudHMubGVuZ3RoIC0gMSk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMCAvLyAwCgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gZm9yIF90IGluIHVyYW5nZSh0aW1lX2V2ZW50cy5sZW5ndGggLSAxKToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl9mb3JANgoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF93aGlsZV90b3BAODoKICAgIHB1c2hpbnQgNzUgLy8gNzUKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfd2hpbGVAMTQKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyAzNSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDM1IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF93aGlsZV90b3BAOAoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl93aGlsZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gdGltZV9pID0gdGltZV9ldmVudHNbX3RdLm5hdGl2ZQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMwogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTUKICAgIC8vIHRpbWVfZiA9IHRpbWVfZXZlbnRzW190ICsgMV0ubmF0aXZlCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjU2CiAgICAvLyBhc3NlcnQgdGltZV9mID4gdGltZV9pLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTcKICAgIC8vIGlmIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gIT0gVUludDY0KGNzdC5EQ0NfQ09OVCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgcHVzaGludCAyNTUgLy8gMjU1CiAgICAhPQogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1OC0yNTkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aW1lIHBlcmlvZHMgZXhwcmVzc2VkIGluIGRheXMgZm9yIHJlZ3VsYXIgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgKHRpbWVfZiAtIHRpbWVfaSkgJSBVSW50NjQoCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1OC0yNjEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aW1lIHBlcmlvZHMgZXhwcmVzc2VkIGluIGRheXMgZm9yIHJlZ3VsYXIgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgKHRpbWVfZiAtIHRpbWVfaSkgJSBVSW50NjQoCiAgICAvLyAgICAgY3N0LkRBWV8yX1NFQwogICAgLy8gKSA9PSAwLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRAogICAgaW50YyA2IC8vIDg2NDAwCiAgICAlCiAgICAhCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGluIEFjdHVhbC9BY3R1YWwgZGF5IGNvdW50IGNvbnZlbnRpb24gbXVzdCBiZSBtdWx0aXBsZXMgb2YgYSBkYXkgKGluIHNlY29uZHMpCiAgICBiIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfZm9yX2hlYWRlckAxCgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX2ZvckA2OgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHMoc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50czogYnl0ZXMpIC0+IGJ5dGVzOgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTY5LTU3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cygKICAgIC8vICAgICBzZWxmLCBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzOiB0eXAuVGltZUV2ZW50cwogICAgLy8gKSAtPiB0eXAuU2Vjb25kYXJ5TWFya2V0U2NoZWR1bGU6CiAgICBwcm90byAxIDEKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTAKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50YyA3IC8vIDIwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5MQogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLnN0YXR1c19pc19lbmRlZCgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICAhCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5MgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTQKICAgIC8vIGFzc2VydCBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzLmxlbmd0aCA+PSAxLCBlcnIuSU5WQUxJRF9USU1FX0VWRU5UU19MRU5HVEgKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBsZW5ndGggaXMgaW52YWxpZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk1CiAgICAvLyBpZiBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzLmxlbmd0aCA+IDE6CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBieiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk2CiAgICAvLyBzZWxmLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQoc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50cykKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgLTEKICAgIGZyYW1lX2J1cnkgMQoKc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDI6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAtMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk4CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTktNjAxCiAgICAvLyA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTgtNjAxCiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGRpZyAxCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk3LTYwMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vICAgICA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyAgICAgXS5uYXRpdmUKICAgIC8vICksIGVyci5JTlZBTElEX1NFQ09OREFSWV9PUEVOSU5HX0RBVEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNlY29uZGFyeSBtYXJrZXQgb3BlbmluZyBkYXRlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDMKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjAzLTYwNQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDYKICAgIC8vIGlmIHNlbGYubWF0dXJpdHlfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgYnogc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwOAogICAgLy8gc2VsZi5tYXR1cml0eV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxMAogICAgLy8gY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwOS02MTEKICAgIC8vID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwOC02MTEKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgZGlnIDEKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDctNjEyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gICAgID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vICAgICBdLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX0NMT1NVUkVfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBjbG9zdXJlIGRhdGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxMwogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTMtNjE1CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjE4CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjE3LTYxOQogICAgLy8gc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyMQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyMC02MjIKICAgIC8vIHNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTYtNjIzCiAgICAvLyByZXR1cm4gdHlwLlNlY29uZGFyeU1hcmtldFNjaGVkdWxlKAogICAgLy8gICAgIHNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgICAgICBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gICAgICksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzaWduX3JvbGUocm9sZV9hZGRyZXNzOiBieXRlcywgcm9sZTogYnl0ZXMsIGNvbmZpZzogYnl0ZXMpIC0+IGJ5dGVzOgphc3NpZ25fcm9sZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyNS02MjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2lnbl9yb2xlKAogICAgLy8gICAgIHNlbGYsIHJvbGVfYWRkcmVzczogYXJjNC5BZGRyZXNzLCByb2xlOiBhcmM0LlVJbnQ4LCBjb25maWc6IGFyYzQuRHluYW1pY0J5dGVzCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDYKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0NwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ5CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgcHVzaGludCAyMCAvLyAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgtNjU1CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUxCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MCAvLyA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MgogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MCAvLyA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MwogICAgLy8gVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwIC8vIDcwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgtNjU1CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU0CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0OC02NTUKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBhc3NpZ25fcm9sZV9ib29sX2ZhbHNlQDcKCmFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18xIC8vIDEKCmFzc2lnbl9yb2xlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0OC02NTUKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU3CiAgICAvLyBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICBwdXNoaW50cyAyMCA0MCA1MCA2MCA3MCA4MCAvLyAyMCwgNDAsIDUwLCA2MCwgNzAsIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTYtNjg1CiAgICAvLyBtYXRjaCByb2xlLm5hdGl2ZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MubmF0aXZlCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICAgICAgICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoKQogICAgZnJhbWVfZGlnIDAKICAgIG1hdGNoIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzBAOSBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8xQDEwIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzJAMTEgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzVAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4NQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfNUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3OQogICAgLy8gcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgYnl0ZWMgMjcgLy8gMHg1MjM4MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzgtNjgwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4MgogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjgxLTY4MwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gKQogICAgYm94X3B1dAoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4NgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgc3dhcAogICAgcmV0c3ViCgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njc1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyOSAvLyAweDUyMzczMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzYKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzNAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMCAvLyAweDUyMzYzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzMKICAgIC8vIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgYm94X3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8yQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDMxIC8vIDB4NTIzNTMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2OQogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY4LTY3MAogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICBjb25maWcubmF0aXZlCiAgICAvLyApCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzFAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjEKICAgIC8vIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDMyIC8vIDB4NTIzNDMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjYwLTY2MgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjQKICAgIC8vIGNvbmZpZy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2My02NjUKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICkKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMEA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU4CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzLm5hdGl2ZQogICAgYnl0ZWMgMTggLy8gMHg1MjMyMzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NpZ25fcm9sZV9ib29sX21lcmdlQDgKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5yZXZva2Vfcm9sZShyb2xlX2FkZHJlc3M6IGJ5dGVzLCByb2xlOiBieXRlcykgLT4gYnl0ZXM6CnJldm9rZV9yb2xlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njg4LTY4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcmV2b2tlX3JvbGUoc2VsZiwgcm9sZV9hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHJvbGU6IGFyYzQuVUludDgpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDYKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwNwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDgKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA5CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzEwCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MCAvLyA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4LTcxNAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTEKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIHB1c2hpbnQgNjAgLy8gNjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzEyCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAgLy8gNzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzEzCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogcmV2b2tlX3JvbGVfYm9vbF9mYWxzZUA2CgpyZXZva2Vfcm9sZV9ib29sX3RydWVANToKICAgIGludGNfMSAvLyAxCgpyZXZva2Vfcm9sZV9ib29sX21lcmdlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDgtNzE0CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTYtNzE3CiAgICAvLyAjIEFycmFuZ2VyIHJvbGUgY2FuIG5vdCBiZSByZXZva2VkIChqdXN0IHJvdGF0ZWQpCiAgICAvLyBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludHMgNDAgNTAgNjAgNzAgODAgLy8gNDAsIDUwLCA2MCwgNzAsIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTUtNzMzCiAgICAvLyBtYXRjaCByb2xlLm5hdGl2ZToKICAgIC8vICAgICAjIEFycmFuZ2VyIHJvbGUgY2FuIG5vdCBiZSByZXZva2VkIChqdXN0IHJvdGF0ZWQpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BQ0NPVU5UX01BTkFHRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfUFJJTUFSWV9ERUFMRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1RSVVNURUUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BVVRIT1JJVFkgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmludGVyZXN0X29yYWNsZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9JTlRFUkVTVF9PUkFDTEUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoKQogICAgZnJhbWVfZGlnIDAKICAgIG1hdGNoIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzBAOCByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8xQDkgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMCByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8zQDExIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzRAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczMwogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfNEAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczMAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmludGVyZXN0X29yYWNsZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNyAvLyAweDUyMzgzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MzEKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9JTlRFUkVTVF9PUkFDTEUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MzQKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHN3YXAKICAgIHJldHN1YgoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyNwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyOSAvLyAweDUyMzczMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjgKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BVVRIT1JJVFkgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyNAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzAgLy8gMHg1MjM2MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzI1CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfVFJVU1RFRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8xQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMSAvLyAweDUyMzUzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjIKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9QUklNQVJZX0RFQUxFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8wQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTgKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzIgLy8gMHg1MjM0MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzE5CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQUNDT1VOVF9NQU5BR0VSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX2Jvb2xfZmFsc2VANjoKICAgIGludGNfMCAvLyAwCiAgICBiIHJldm9rZV9yb2xlX2Jvb2xfbWVyZ2VANwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLm9wZW5fYWNjb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBwYXltZW50X2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKb3Blbl9hY2NvdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzM2LTczOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgb3Blbl9hY2NvdW50KAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCBwYXltZW50X2FkZHJlc3M6IGFyYzQuQWRkcmVzcwogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU2CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50YyA3IC8vIDIwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLnN0YXR1c19pc19lbmRlZCgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICAhCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1OAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTkKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzYwCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY0CiAgICAvLyB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgYnl0ZWMgNyAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2Mi03NjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjUKICAgIC8vIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY2CiAgICAvLyBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY3CiAgICAvLyBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICBieXRlYyAxMSAvLyAweDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY5CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIyLTEyMwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDMyIC8vIDB4NTIzNDMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2LTEyOQogICAgLy8gY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjcKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyOAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNy0xMjgKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjkKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyOC0xMjkKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI1LTEzMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuY2xvc2VfYWNjb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKY2xvc2VfYWNjb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc3MS03NzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGNsb3NlX2FjY291bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MKICAgIC8vICkgLT4gYXJjNC5UdXBsZVthcmM0LlVJbnQ2NCwgYXJjNC5VSW50NjRdOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODkKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzkwCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3NAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3OTMKICAgIC8vIGNsb3NlZF91bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5NAogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FDQ09VTlQgKyBob2xkaW5nX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5NQogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyAtPSBjbG9zZWRfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM2NgogICAgLy8gaWYgc2VsZi5jaXJjdWxhdGluZ191bml0cyA9PSAwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgYm56IGNsb3NlX2FjY291bnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjcKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGNmZy5TVEFUVVNfRU5ERUQpCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBpbnRjIDcgLy8gMjAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKY2xvc2VfYWNjb3VudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3OTgKICAgIC8vIChhcmM0LlVJbnQ2NChjbG9zZWRfdW5pdHMpLCBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkpCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzk3LTc5OQogICAgLy8gcmV0dXJuIGFyYzQuVHVwbGUoCiAgICAvLyAgICAgKGFyYzQuVUludDY0KGNsb3NlZF91bml0cyksIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSkKICAgIC8vICkKICAgIGNvbmNhdAogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EucHJpbWFyeV9kaXN0cmlidXRpb24oaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IGJ5dGVzKSAtPiBieXRlczoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MDEtODA0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbigKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgdW5pdHM6IGFyYzQuVUludDY0CiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMyAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODktMjkyCiAgICAvLyBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTAKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkwLTI5MQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5MC0yOTIKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkyCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjIgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTEtMjkyCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgZnJhbWVfZGlnIDIKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5MC0yOTIKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgaW50Y18xIC8vIDEKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4OC0yOTMKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vICAgICBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNgogICAgLy8gY2FsbGVyIGluIHNlbGYucHJpbWFyeV9kZWFsZXIKICAgIGJ5dGVjIDMxIC8vIDB4NTIzNTMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNi0xMzkKICAgIC8vIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kZWFsZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNy0xMzgKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNy0xMzkKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM5CiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2RlYWxlciBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM4LTEzOQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM3LTEzOQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyCiAgICBpbnRjXzEgLy8gMQoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNS0xNDAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYucHJpbWFyeV9kZWFsZXIKICAgIC8vICAgICBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODI5CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzEKICAgIC8vIGFzc2VydCB1bml0cy5uYXRpdmUgPiAwLCBlcnIuWkVST19VTklUUwogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMzCiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICsgdW5pdHMubmF0aXZlIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMi04MzQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5jaXJjdWxhdGluZ191bml0cyArIHVuaXRzLm5hdGl2ZSA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICAvLyApLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzYKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKz0gdW5pdHMubmF0aXZlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM3LTgzOQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM3LTgzOQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIC8vICkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDMyCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gYXJjNC5VSW50NjQoc2VsZi51bml0X3ZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICBpdG9iCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHN3YXAKICAgIHJlcGxhY2UyIDQwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDEKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5jaXJjdWxhdGluZ191bml0cykKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICAtCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMjoKICAgIGludGNfMCAvLyAwCiAgICBiIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VAMTMKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnNldF9hc3NldF9zdXNwZW5zaW9uKHN1c3BlbmRlZDogYnl0ZXMpIC0+IGJ5dGVzOgpzZXRfYXNzZXRfc3VzcGVuc2lvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0My04NDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9hc3NldF9zdXNwZW5zaW9uKHNlbGYsIHN1c3BlbmRlZDogYXJjNC5Cb29sKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODU3CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5KCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg1OAogICAgLy8gc2VsZi5zdXNwZW5kZWQgPSBVSW50NjQoc3VzcGVuZGVkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgYnl0ZWMgMjMgLy8gInN1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NTkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5KCkgLT4gdm9pZDoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTItMTUzCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5KHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgYnl0ZWMgMjkgLy8gMHg1MjM3MzAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU0CiAgICAvLyBjYWxsZXIgPSBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTYtMTU5CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX2ZhbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NwogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmF1dGhvcml0eSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU4CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU3LTE1OAogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1Ny0xNTkKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX2ZhbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1OQogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmF1dGhvcml0eSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU4LTE1OQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1Ny0xNTkKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgphc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTUtMTYwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgLy8gICAgIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgphc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfYWNjb3VudF9zdXNwZW5zaW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHN1c3BlbmRlZDogYnl0ZXMpIC0+IGJ5dGVzOgpzZXRfYWNjb3VudF9zdXNwZW5zaW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODYxLTg2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgc2V0X2FjY291bnRfc3VzcGVuc2lvbigKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgc3VzcGVuZGVkOiBhcmM0LkJvb2wKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3OQogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODgxCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgaW50YyA0IC8vIDQ0OAogICAgc3dhcAogICAgc2V0Yml0CiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODIKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnNldF9kZWZhdWx0X3N0YXR1cyhkZWZhdWx0ZWQ6IGJ5dGVzKSAtPiB2b2lkOgpzZXRfZGVmYXVsdF9zdGF0dXM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODQtODg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfZGVmYXVsdF9zdGF0dXMoc2VsZiwgZGVmYXVsdGVkOiBhcmM0LkJvb2wpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIGJ5dGVjIDMwIC8vIDB4NTIzNjMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Ni0xNDkKICAgIC8vIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NwogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cnVzdGVlIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDgKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDctMTQ4CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Ny0xNDkKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0OQogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cnVzdGVlIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDgtMTQ5CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Ny0xNDkKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgpzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ1LTE1MAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICAvLyAgICAgYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5NgogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBVSW50NjQoZGVmYXVsdGVkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgYnl0ZWMgMjQgLy8gImRlZmF1bHRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCnNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9tZXJnZUA2CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X2Fzc2V0X2luZm8oKSAtPiBieXRlczoKZ2V0X2Fzc2V0X2luZm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTgtODk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfaW5mbyhzZWxmKSAtPiB0eXAuQXNzZXRJbmZvOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDgKICAgIC8vIHBlcmZvcm1hbmNlID0gVUludDY0KGNzdC5QUkZfUEVSRk9STUFOVCkKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwOQogICAgLy8gaWYgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBzZWxmLm1hdHVyaXR5X2RhdGUgPiAwOgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgY292ZXIgNAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgID4KICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VAMwogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIDEKICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTEwCiAgICAvLyBwZXJmb3JtYW5jZSA9IFVJbnQ2NChjc3QuUFJGX01BVFVSRUQpCiAgICBwdXNoaW50IDQgLy8gNAogICAgZnJhbWVfYnVyeSAyCgpnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDM6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTEtOTEyCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG5vIGdyYWNlIG9yIGRlbGlucXVlbmN5IHBlcmlvZHMKICAgIC8vIGlmIHNlbGYuZGVmYXVsdGVkOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI0IC8vICJkZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVmYXVsdGVkIGV4aXN0cwogICAgYnogZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTMKICAgIC8vIHBlcmZvcm1hbmNlID0gVUludDY0KGNzdC5QUkZfREVGQVVMVEVEKQogICAgcHVzaGludCAzIC8vIDMKICAgIGZyYW1lX2J1cnkgMAoKZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE2CiAgICAvLyBkZW5vbWluYXRpb25fYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE3CiAgICAvLyBzZXR0bGVtZW50X2Fzc2V0X2lkPWFyYzQuVUludDY0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzQwCiAgICAvLyByZXR1cm4gc2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTgKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCgpKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxOQogICAgLy8gdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NChzZWxmLnVuaXRfdmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjAKICAgIC8vIGRheV9jb3VudF9jb252ZW50aW9uPWFyYzQuVUludDgoc2VsZi5kYXlfY291bnRfY29udmVudGlvbiksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgaXRvYgogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyMQogICAgLy8gcHJpbmNpcGFsX2Rpc2NvdW50PWFyYzQuVUludDE2KHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50KSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMSAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjIKICAgIC8vIGludGVyZXN0X3JhdGU9YXJjNC5VSW50MTYoc2VsZi5pbnRlcmVzdF9yYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTIzCiAgICAvLyB0b3RhbF9zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi50b3RhbF91bml0cyksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTI0CiAgICAvLyBjaXJjdWxhdGluZ19zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi5jaXJjdWxhdGluZ191bml0cyksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyNS05MjcKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyOQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMiAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyOC05MzAKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzMQogICAgLy8gaXNzdWFuY2VfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLmlzc3VhbmNlX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzMgogICAgLy8gbWF0dXJpdHlfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLm1hdHVyaXR5X2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzMKICAgIC8vIHN1c3BlbmRlZD1hcmM0LkJvb2woYm9vbChzZWxmLnN1c3BlbmRlZCkpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIzIC8vICJzdXNwZW5kZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3VzcGVuZGVkIGV4aXN0cwogICAgYnl0ZWMgMTEgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzQKICAgIC8vIHBlcmZvcm1hbmNlPWFyYzQuVUludDgocGVyZm9ybWFuY2UpLAogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTUtOTM1CiAgICAvLyByZXR1cm4gdHlwLkFzc2V0SW5mbygKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKSwKICAgIC8vICAgICBvdXRzdGFuZGluZ19wcmluY2lwYWw9YXJjNC5VSW50NjQoc2VsZi5vdXRzdGFuZGluZ19wcmluY2lwYWwoKSksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NChzZWxmLnVuaXRfdmFsdWUpLAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uPWFyYzQuVUludDgoc2VsZi5kYXlfY291bnRfY29udmVudGlvbiksCiAgICAvLyAgICAgcHJpbmNpcGFsX2Rpc2NvdW50PWFyYzQuVUludDE2KHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50KSwKICAgIC8vICAgICBpbnRlcmVzdF9yYXRlPWFyYzQuVUludDE2KHNlbGYuaW50ZXJlc3RfcmF0ZSksCiAgICAvLyAgICAgdG90YWxfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMpLAogICAgLy8gICAgIGNpcmN1bGF0aW5nX3N1cHBseT1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBpc3N1YW5jZV9kYXRlPWFyYzQuVUludDY0KHNlbGYuaXNzdWFuY2VfZGF0ZSksCiAgICAvLyAgICAgbWF0dXJpdHlfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLm1hdHVyaXR5X2RhdGUpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woYm9vbChzZWxmLnN1c3BlbmRlZCkpLAogICAgLy8gICAgIHBlcmZvcm1hbmNlPWFyYzQuVUludDgocGVyZm9ybWFuY2UpLAogICAgLy8gKQogICAgdW5jb3ZlciAxNAogICAgdW5jb3ZlciAxNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDEzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hY2NvdW50X2luZm8oaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hY2NvdW50X2luZm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzctOTM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYWNjb3VudF9pbmZvKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzKSAtPiB0eXAuQWNjb3VudEluZm86CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3NAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTIKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF90aW1lX2V2ZW50cygpIC0+IGJ5dGVzOgpnZXRfdGltZV9ldmVudHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTQtOTU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfdGltZV9ldmVudHMoc2VsZikgLT4gdHlwLlRpbWVFdmVudHM6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2MgogICAgLy8gdGltZV9ldmVudHMgPSB0eXAuVGltZUV2ZW50cygpCiAgICBieXRlYyAzMyAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMyAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NjMKICAgIC8vIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpOgogICAgYnogZ2V0X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTY0CiAgICAvLyB0aW1lX2V2ZW50cyA9IHNlbGYudGltZV9ldmVudHMudmFsdWUuY29weSgpCiAgICBieXRlYyAyOCAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRpbWVfZXZlbnRzIGV4aXN0cwoKZ2V0X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2NQogICAgLy8gcmV0dXJuIHRpbWVfZXZlbnRzCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUoKSAtPiBieXRlczoKZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NjctOTY4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZShzZWxmKSAtPiB0eXAuVGltZUV2ZW50czoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTc2CiAgICAvLyBhcmM0LlVJbnQ2NChzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NzcKICAgIC8vIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk3NS05NzgKICAgIC8vIHJldHVybiB0eXAuVGltZUV2ZW50cygKICAgIC8vICAgICBhcmM0LlVJbnQ2NChzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NChzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfYXNzZXRfbWV0YWRhdGEoKSAtPiBieXRlczoKZ2V0X2Fzc2V0X21ldGFkYXRhOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTgwLTk4MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21ldGFkYXRhKHNlbGYpIC0+IHR5cC5Bc3NldE1ldGFkYXRhOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5ODkKICAgIC8vIHJldHVybiB0eXAuQXNzZXRNZXRhZGF0YS5mcm9tX2J5dGVzKHNlbGYubWV0YWRhdGEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gIm1ldGFkYXRhIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1ldGFkYXRhIGV4aXN0cwogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [3821], "errorMessage": "Can not distribute zero units"}, {"pc": [2749], "errorMessage": "Coupon rates are not properly defined"}, {"pc": [2604], "errorMessage": "D-ASA already configured"}, {"pc": [1620], "errorMessage": "Defaulted"}, {"pc": [2624], "errorMessage": "Denomination asset is not properly set"}, {"pc": [2641], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset"}, {"pc": [1387, 1398, 1405, 1416, 1423, 1434, 1441, 1467, 1489, 1513, 1531, 1598, 1676, 1701, 1706, 1854, 1891, 1906, 1921, 1991, 2024, 2101, 2132, 2149, 2242, 2314, 2320, 2465, 2471, 2810, 2819, 2827, 2864, 2882, 2886, 2891, 2915, 2918, 2950, 3018, 3033, 3130, 3168, 3621, 3638, 3675, 3774, 3791, 3850, 3941, 3958, 4025, 4042], "errorMessage": "Index access is out of bounds"}, {"pc": [3835], "errorMessage": "Insufficient remaining D-ASA units"}, {"pc": [1394], "errorMessage": "Insufficient sender units to transfer"}, {"pc": [2737], "errorMessage": "Interest rate is not properly defined"}, {"pc": [1337, 1349, 1887, 2229, 2391, 3581, 3671, 3810, 3988, 4282], "errorMessage": "Invalid account holding address"}, {"pc": [3291, 3313, 3333, 3353, 3373, 3479, 3496, 3511, 3526, 3541], "errorMessage": "Invalid account role address"}, {"pc": [2254], "errorMessage": "Invalid amount of units for the account"}, {"pc": [2716], "errorMessage": "Invalid day-count convention ID"}, {"pc": [3255, 3447], "errorMessage": "Invalid role identifier"}, {"pc": [3174], "errorMessage": "Invalid secondary market closure date"}, {"pc": [3138], "errorMessage": "Invalid secondary market opening date"}, {"pc": [2679], "errorMessage": "Minimum denomination is not a divisor of principal"}, {"pc": [1898], "errorMessage": "No D-ASA units"}, {"pc": [1914], "errorMessage": "No due coupon to pay"}, {"pc": [1319, 1871, 2159, 2586, 3085, 3565, 3648, 3801, 3968, 4052], "errorMessage": "Not authorized"}, {"pc": [1986], "errorMessage": "Not enough funds for the payment"}, {"pc": [784, 800, 816, 832, 851, 867, 882, 904, 923, 945, 964, 986, 1008, 1033, 1052, 1111, 1130, 1146, 1162, 1181, 1203, 1222, 1244], "errorMessage": "OnCompletion is not NoOp"}, {"pc": [1096], "errorMessage": "OnCompletion is not UpdateApplication"}, {"pc": [1683, 1918, 2172], "errorMessage": "Pending due coupon payment"}, {"pc": [3755], "errorMessage": "Primary distribution is closed"}, {"pc": [2218], "errorMessage": "Primary distribution not yet executed"}, {"pc": [1313], "errorMessage": "Secondary market is closed"}, {"pc": [1449], "errorMessage": "Sender and receiver units are not fungible"}, {"pc": [1366, 1382, 1631], "errorMessage": "Suspended operations"}, {"pc": [2784, 3094], "errorMessage": "Time events length is invalid"}, {"pc": [2957], "errorMessage": "Time events must be set in the future"}, {"pc": [3039], "errorMessage": "Time events must be sorted in strictly ascending order"}, {"pc": [2896], "errorMessage": "Time period durations must be strictly greater than zero"}, {"pc": [2898], "errorMessage": "Time period repetitions are not properly defined"}, {"pc": [2876], "errorMessage": "Time periods are not properly defined"}, {"pc": [3061], "errorMessage": "Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)"}, {"pc": [576], "errorMessage": "Wrong Global Bytes allocation"}, {"pc": [582], "errorMessage": "Wrong Global UInts allocation"}, {"pc": [586], "errorMessage": "Wrong Local Bytes allocation"}, {"pc": [590], "errorMessage": "Wrong Local UInts allocation"}, {"pc": [1982], "errorMessage": "account opted into asset"}, {"pc": [2616], "errorMessage": "asset exists"}, {"pc": [1115], "errorMessage": "can only call when creating"}, {"pc": [787, 803, 819, 835, 854, 870, 885, 907, 926, 948, 967, 989, 1011, 1036, 1055, 1099, 1133, 1149, 1165, 1184, 1206, 1225, 1247], "errorMessage": "can only call when not creating"}, {"pc": [1353, 1369, 1386, 1397, 1404, 1415, 1422, 1433, 1440, 1466, 1488, 1500, 1512, 1524, 1530, 1542, 1553, 1580, 1592, 1596, 1675, 1853, 1890, 1905, 1920, 1939, 1990, 2023, 2034, 2100, 2241, 3674, 3849, 3859, 3876, 3991, 4284], "errorMessage": "check self.account entry exists"}, {"pc": [3620, 3637], "errorMessage": "check self.account_manager entry exists"}, {"pc": [2584], "errorMessage": "check self.arranger exists"}, {"pc": [3940, 3957], "errorMessage": "check self.authority entry exists"}, {"pc": [2086, 3687, 3696, 3825, 3839, 3889, 4132, 4182], "errorMessage": "check self.circulating_units exists"}, {"pc": [1662, 1767, 1839], "errorMessage": "check self.coupon_period exists"}, {"pc": [1772, 3044, 4150], "errorMessage": "check self.day_count_convention exists"}, {"pc": [1618, 4109], "errorMessage": "check self.defaulted exists"}, {"pc": [2637, 4121], "errorMessage": "check self.denomination_asset_id exists"}, {"pc": [2131, 2148], "errorMessage": "check self.interest_oracle entry exists"}, {"pc": [1721, 1967, 2401, 4168], "errorMessage": "check self.interest_rate exists"}, {"pc": [1644, 1653, 1749, 1834, 2362, 2372, 3121, 4200], "errorMessage": "check self.issuance_date exists"}, {"pc": [3147, 3155, 4083, 4206], "errorMessage": "check self.maturity_date exists"}, {"pc": [4341], "errorMessage": "check self.metadata exists"}, {"pc": [2043, 2082], "errorMessage": "check self.paid_coupon_units exists"}, {"pc": [3773, 3790], "errorMessage": "check self.primary_dealer entry exists"}, {"pc": [3747, 4194], "errorMessage": "check self.primary_distribution_closure_date exists"}, {"pc": [2202, 2212, 3733, 4188], "errorMessage": "check self.primary_distribution_opening_date exists"}, {"pc": [2731, 4159], "errorMessage": "check self.principal_discount exists"}, {"pc": [1305, 3189, 4324], "errorMessage": "check self.secondary_market_closure_date exists"}, {"pc": [1291, 3183, 4318], "errorMessage": "check self.secondary_market_opening_date exists"}, {"pc": [1928, 1979, 2001, 2653, 4127], "errorMessage": "check self.settlement_asset_id exists"}, {"pc": [1281, 1868, 2421, 2532, 2602, 3080, 3560, 3723, 4294], "errorMessage": "check self.status exists"}, {"pc": [1629, 4212], "errorMessage": "check self.suspended exists"}, {"pc": [4306], "errorMessage": "check self.time_events exists"}, {"pc": [2544, 2911], "errorMessage": "check self.time_periods exists"}, {"pc": [2481, 2758, 2779, 2846], "errorMessage": "check self.total_coupons exists"}, {"pc": [3833, 3885, 4177], "errorMessage": "check self.total_units exists"}, {"pc": [4024, 4041], "errorMessage": "check self.trustee entry exists"}, {"pc": [3871, 4137, 4144], "errorMessage": "check self.unit_value exists"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" APP_SPEC = algokit_utils.Arc56Contract.from_json(_APP_SPEC_JSON) def _parse_abi_args(args: typing.Any | None = None) -> list[typing.Any] | None: @@ -96,13 +96,19 @@ class AssetMetadata: prospectus_hash: bytes prospectus_url: str +@dataclasses.dataclass(frozen=True) +class DayCountFactor: + """Struct for DayCountFactor""" + numerator: int + denominator: int + @dataclasses.dataclass(frozen=True) class CouponsInfo: """Struct for CouponsInfo""" total_coupons: int due_coupons: int next_coupon_due_date: int - day_count_factor: tuple[int, int] + day_count_factor: DayCountFactor all_due_coupons_paid: bool @dataclasses.dataclass(frozen=True) @@ -110,7 +116,7 @@ class CurrentUnitsValue: """Struct for CurrentUnitsValue""" units_value: int accrued_interest: int - day_count_factor: tuple[int, int] + day_count_factor: DayCountFactor @dataclasses.dataclass(frozen=True) class PaymentAmounts: @@ -125,6 +131,12 @@ class PaymentResult: timestamp: int context: bytes +@dataclasses.dataclass(frozen=True) +class RoleConfig: + """Struct for RoleConfig""" + role_validity_start: int + role_validity_end: int + @dataclasses.dataclass(frozen=True) class SecondaryMarketSchedule: """Struct for SecondaryMarketSchedule""" @@ -1338,27 +1350,33 @@ def clear_state( class GlobalStateValue(typing.TypedDict): """Shape of global_state state key values""" arranger: bytes - circulating_units: int - coupon_period: int - day_count_convention: int - defaulted: int denomination_asset_id: int - interest_rate: int - issuance_date: int - maturity_date: int + settlement_asset_id: int + unit_value: int + day_count_convention: int metadata: bytes - paid_coupon_units: int - primary_distribution_closure_date: int - primary_distribution_opening_date: int + total_units: int + circulating_units: int principal_discount: int - secondary_market_closure_date: int + interest_rate: int + total_coupons: int + primary_distribution_opening_date: int + primary_distribution_closure_date: int + issuance_date: int secondary_market_opening_date: int - settlement_asset_id: int + secondary_market_closure_date: int + maturity_date: int status: int suspended: int - total_coupons: int - total_units: int - unit_value: int + defaulted: int + coupon_period: int + paid_coupon_units: int + +class BoxStateValue(typing.TypedDict): + """Shape of box state key values""" + coupon_rates: list[int] + time_events: list[int] + time_periods: list[tuple[int, int]] class PerpetualBondState: """Methods to access state for the current PerpetualBond app""" @@ -1373,6 +1391,13 @@ def global_state( """Methods to access global_state for the current app""" return _GlobalState(self.app_client) + @property + def box( + self + ) -> "_BoxState": + """Methods to access box for the current app""" + return _BoxState(self.app_client) + class _GlobalState: def __init__(self, app_client: algokit_utils.AppClient): self.app_client = app_client @@ -1405,17 +1430,25 @@ def arranger(self) -> bytes: return typing.cast(bytes, value) @property - def circulating_units(self) -> int: - """Get the current value of the circulating_units key in global_state state""" - value = self.app_client.state.global_state.get_value("circulating_units") + def denomination_asset_id(self) -> int: + """Get the current value of the denomination_asset_id key in global_state state""" + value = self.app_client.state.global_state.get_value("denomination_asset_id") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def coupon_period(self) -> int: - """Get the current value of the coupon_period key in global_state state""" - value = self.app_client.state.global_state.get_value("coupon_period") + def settlement_asset_id(self) -> int: + """Get the current value of the settlement_asset_id key in global_state state""" + value = self.app_client.state.global_state.get_value("settlement_asset_id") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + + @property + def unit_value(self) -> int: + """Get the current value of the unit_value key in global_state state""" + value = self.app_client.state.global_state.get_value("unit_value") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @@ -1429,57 +1462,57 @@ def day_count_convention(self) -> int: return typing.cast(int, value) @property - def defaulted(self) -> int: - """Get the current value of the defaulted key in global_state state""" - value = self.app_client.state.global_state.get_value("defaulted") + def metadata(self) -> bytes: + """Get the current value of the metadata key in global_state state""" + value = self.app_client.state.global_state.get_value("metadata") + if isinstance(value, dict) and "AVMBytes" in self._struct_classes: + return self._struct_classes["AVMBytes"](**value) # type: ignore + return typing.cast(bytes, value) + + @property + def total_units(self) -> int: + """Get the current value of the total_units key in global_state state""" + value = self.app_client.state.global_state.get_value("total_units") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def denomination_asset_id(self) -> int: - """Get the current value of the denomination_asset_id key in global_state state""" - value = self.app_client.state.global_state.get_value("denomination_asset_id") + def circulating_units(self) -> int: + """Get the current value of the circulating_units key in global_state state""" + value = self.app_client.state.global_state.get_value("circulating_units") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def interest_rate(self) -> int: - """Get the current value of the interest_rate key in global_state state""" - value = self.app_client.state.global_state.get_value("interest_rate") + def principal_discount(self) -> int: + """Get the current value of the principal_discount key in global_state state""" + value = self.app_client.state.global_state.get_value("principal_discount") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def issuance_date(self) -> int: - """Get the current value of the issuance_date key in global_state state""" - value = self.app_client.state.global_state.get_value("issuance_date") + def interest_rate(self) -> int: + """Get the current value of the interest_rate key in global_state state""" + value = self.app_client.state.global_state.get_value("interest_rate") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def maturity_date(self) -> int: - """Get the current value of the maturity_date key in global_state state""" - value = self.app_client.state.global_state.get_value("maturity_date") + def total_coupons(self) -> int: + """Get the current value of the total_coupons key in global_state state""" + value = self.app_client.state.global_state.get_value("total_coupons") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def metadata(self) -> bytes: - """Get the current value of the metadata key in global_state state""" - value = self.app_client.state.global_state.get_value("metadata") - if isinstance(value, dict) and "AVMBytes" in self._struct_classes: - return self._struct_classes["AVMBytes"](**value) # type: ignore - return typing.cast(bytes, value) - - @property - def paid_coupon_units(self) -> int: - """Get the current value of the paid_coupon_units key in global_state state""" - value = self.app_client.state.global_state.get_value("paid_coupon_units") + def primary_distribution_opening_date(self) -> int: + """Get the current value of the primary_distribution_opening_date key in global_state state""" + value = self.app_client.state.global_state.get_value("primary_distribution_opening_date") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @@ -1493,17 +1526,17 @@ def primary_distribution_closure_date(self) -> int: return typing.cast(int, value) @property - def primary_distribution_opening_date(self) -> int: - """Get the current value of the primary_distribution_opening_date key in global_state state""" - value = self.app_client.state.global_state.get_value("primary_distribution_opening_date") + def issuance_date(self) -> int: + """Get the current value of the issuance_date key in global_state state""" + value = self.app_client.state.global_state.get_value("issuance_date") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def principal_discount(self) -> int: - """Get the current value of the principal_discount key in global_state state""" - value = self.app_client.state.global_state.get_value("principal_discount") + def secondary_market_opening_date(self) -> int: + """Get the current value of the secondary_market_opening_date key in global_state state""" + value = self.app_client.state.global_state.get_value("secondary_market_opening_date") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @@ -1517,17 +1550,9 @@ def secondary_market_closure_date(self) -> int: return typing.cast(int, value) @property - def secondary_market_opening_date(self) -> int: - """Get the current value of the secondary_market_opening_date key in global_state state""" - value = self.app_client.state.global_state.get_value("secondary_market_opening_date") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) - - @property - def settlement_asset_id(self) -> int: - """Get the current value of the settlement_asset_id key in global_state state""" - value = self.app_client.state.global_state.get_value("settlement_asset_id") + def maturity_date(self) -> int: + """Get the current value of the maturity_date key in global_state state""" + value = self.app_client.state.global_state.get_value("maturity_date") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @@ -1549,29 +1574,168 @@ def suspended(self) -> int: return typing.cast(int, value) @property - def total_coupons(self) -> int: - """Get the current value of the total_coupons key in global_state state""" - value = self.app_client.state.global_state.get_value("total_coupons") + def defaulted(self) -> int: + """Get the current value of the defaulted key in global_state state""" + value = self.app_client.state.global_state.get_value("defaulted") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def total_units(self) -> int: - """Get the current value of the total_units key in global_state state""" - value = self.app_client.state.global_state.get_value("total_units") + def coupon_period(self) -> int: + """Get the current value of the coupon_period key in global_state state""" + value = self.app_client.state.global_state.get_value("coupon_period") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def unit_value(self) -> int: - """Get the current value of the unit_value key in global_state state""" - value = self.app_client.state.global_state.get_value("unit_value") + def paid_coupon_units(self) -> int: + """Get the current value of the paid_coupon_units key in global_state state""" + value = self.app_client.state.global_state.get_value("paid_coupon_units") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) +class _BoxState: + def __init__(self, app_client: algokit_utils.AppClient): + self.app_client = app_client + + # Pre-generated mapping of value types to their struct classes + self._struct_classes: dict[str, typing.Type[typing.Any]] = { + "RoleConfig": RoleConfig, + "AccountInfo": AccountInfo + } + + def get_all(self) -> BoxStateValue: + """Get all current keyed values from box state""" + result = self.app_client.state.box.get_all() + if not result: + return typing.cast(BoxStateValue, {}) + + converted = {} + for key, value in result.items(): + key_info = self.app_client.app_spec.state.keys.box.get(key) + struct_class = self._struct_classes.get(key_info.value_type) if key_info else None + converted[key] = ( + struct_class(**value) if struct_class and isinstance(value, dict) + else value + ) + return typing.cast(BoxStateValue, converted) + + @property + def coupon_rates(self) -> list[int]: + """Get the current value of the coupon_rates key in box state""" + value = self.app_client.state.box.get_value("coupon_rates") + if isinstance(value, dict) and "uint16[]" in self._struct_classes: + return self._struct_classes["uint16[]"](**value) # type: ignore + return typing.cast(list[int], value) + + @property + def time_events(self) -> list[int]: + """Get the current value of the time_events key in box state""" + value = self.app_client.state.box.get_value("time_events") + if isinstance(value, dict) and "uint64[]" in self._struct_classes: + return self._struct_classes["uint64[]"](**value) # type: ignore + return typing.cast(list[int], value) + + @property + def time_periods(self) -> list[tuple[int, int]]: + """Get the current value of the time_periods key in box state""" + value = self.app_client.state.box.get_value("time_periods") + if isinstance(value, dict) and "(uint64,uint64)[]" in self._struct_classes: + return self._struct_classes["(uint64,uint64)[]"](**value) # type: ignore + return typing.cast(list[tuple[int, int]], value) + + @property + def account_manager(self) -> "_MapState[str, RoleConfig]": + """Get values from the account_manager map in box state""" + return _MapState( + self.app_client.state.box, + "account_manager", + self._struct_classes.get("RoleConfig") + ) + + @property + def primary_dealer(self) -> "_MapState[str, RoleConfig]": + """Get values from the primary_dealer map in box state""" + return _MapState( + self.app_client.state.box, + "primary_dealer", + self._struct_classes.get("RoleConfig") + ) + + @property + def trustee(self) -> "_MapState[str, RoleConfig]": + """Get values from the trustee map in box state""" + return _MapState( + self.app_client.state.box, + "trustee", + self._struct_classes.get("RoleConfig") + ) + + @property + def authority(self) -> "_MapState[str, RoleConfig]": + """Get values from the authority map in box state""" + return _MapState( + self.app_client.state.box, + "authority", + self._struct_classes.get("RoleConfig") + ) + + @property + def interest_oracle(self) -> "_MapState[str, RoleConfig]": + """Get values from the interest_oracle map in box state""" + return _MapState( + self.app_client.state.box, + "interest_oracle", + self._struct_classes.get("RoleConfig") + ) + + @property + def account(self) -> "_MapState[str, AccountInfo]": + """Get values from the account map in box state""" + return _MapState( + self.app_client.state.box, + "account", + self._struct_classes.get("AccountInfo") + ) + +_KeyType = typing.TypeVar("_KeyType") +_ValueType = typing.TypeVar("_ValueType") + +class _AppClientStateMethodsProtocol(typing.Protocol): + def get_map(self, map_name: str) -> dict[typing.Any, typing.Any]: + ... + def get_map_value(self, map_name: str, key: typing.Any) -> typing.Any | None: + ... + +class _MapState(typing.Generic[_KeyType, _ValueType]): + """Generic class for accessing state maps with strongly typed keys and values""" + + def __init__(self, state_accessor: _AppClientStateMethodsProtocol, map_name: str, + struct_class: typing.Type[_ValueType] | None = None): + self._state_accessor = state_accessor + self._map_name = map_name + self._struct_class = struct_class + + def get_map(self) -> dict[_KeyType, _ValueType]: + """Get all current values in the map""" + result = self._state_accessor.get_map(self._map_name) + if self._struct_class and result: + return {k: self._struct_class(**v) if isinstance(v, dict) else v + for k, v in result.items()} + return typing.cast(dict[_KeyType, _ValueType], result or {}) + + def get_value(self, key: _KeyType) -> _ValueType | None: + """Get a value from the map by key""" + key_value = dataclasses.asdict(key) if dataclasses.is_dataclass(key) else key # type: ignore + value = self._state_accessor.get_map_value(self._map_name, key_value) + if value is not None and self._struct_class and isinstance(value, dict): + return self._struct_class(**value) + return typing.cast(_ValueType | None, value) + + class PerpetualBondClient: """Client for interacting with PerpetualBond smart contract""" diff --git a/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.arc56.json b/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.arc56.json new file mode 100644 index 0000000..eaab266 --- /dev/null +++ b/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.arc56.json @@ -0,0 +1,1591 @@ +{ + "name": "ZeroCouponBond", + "structs": { + "AccountInfo": [ + { + "name": "payment_address", + "type": "address" + }, + { + "name": "units", + "type": "uint64" + }, + { + "name": "unit_value", + "type": "uint64" + }, + { + "name": "paid_coupons", + "type": "uint64" + }, + { + "name": "suspended", + "type": "bool" + } + ], + "AssetInfo": [ + { + "name": "denomination_asset_id", + "type": "uint64" + }, + { + "name": "settlement_asset_id", + "type": "uint64" + }, + { + "name": "outstanding_principal", + "type": "uint64" + }, + { + "name": "unit_value", + "type": "uint64" + }, + { + "name": "day_count_convention", + "type": "uint8" + }, + { + "name": "principal_discount", + "type": "uint16" + }, + { + "name": "interest_rate", + "type": "uint16" + }, + { + "name": "total_supply", + "type": "uint64" + }, + { + "name": "circulating_supply", + "type": "uint64" + }, + { + "name": "primary_distribution_opening_date", + "type": "uint64" + }, + { + "name": "primary_distribution_closure_date", + "type": "uint64" + }, + { + "name": "issuance_date", + "type": "uint64" + }, + { + "name": "maturity_date", + "type": "uint64" + }, + { + "name": "suspended", + "type": "bool" + }, + { + "name": "performance", + "type": "uint8" + } + ], + "AssetMetadata": [ + { + "name": "contract_type", + "type": "uint8" + }, + { + "name": "calendar", + "type": "uint8" + }, + { + "name": "business_day_convention", + "type": "uint8" + }, + { + "name": "end_of_month_convention", + "type": "uint8" + }, + { + "name": "prepayment_effect", + "type": "uint8" + }, + { + "name": "penalty_type", + "type": "uint8" + }, + { + "name": "prospectus_hash", + "type": "byte[32]" + }, + { + "name": "prospectus_url", + "type": "string" + } + ], + "CurrentUnitsValue": [ + { + "name": "units_value", + "type": "uint64" + }, + { + "name": "accrued_interest", + "type": "uint64" + }, + { + "name": "day_count_factor", + "type": "DayCountFactor" + } + ], + "DayCountFactor": [ + { + "name": "numerator", + "type": "uint64" + }, + { + "name": "denominator", + "type": "uint64" + } + ], + "PaymentAmounts": [ + { + "name": "interest", + "type": "uint64" + }, + { + "name": "principal", + "type": "uint64" + } + ], + "PaymentResult": [ + { + "name": "amount", + "type": "uint64" + }, + { + "name": "timestamp", + "type": "uint64" + }, + { + "name": "context", + "type": "byte[]" + } + ], + "RoleConfig": [ + { + "name": "role_validity_start", + "type": "uint64" + }, + { + "name": "role_validity_end", + "type": "uint64" + } + ], + "SecondaryMarketSchedule": [ + { + "name": "secondary_market_opening_date", + "type": "uint64" + }, + { + "name": "secondary_market_closure_date", + "type": "uint64" + } + ] + }, + "methods": [ + { + "name": "asset_transfer", + "args": [ + { + "type": "address", + "name": "sender_holding_address", + "desc": "Sender Account Holding Address" + }, + { + "type": "address", + "name": "receiver_holding_address", + "desc": "Receiver Account Holding Address" + }, + { + "type": "uint64", + "name": "units", + "desc": "Amount of D-ASA units to transfer" + } + ], + "returns": { + "type": "uint64", + "desc": "Transferred actualized value in denomination asset" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Transfer D-ASA units between accounts", + "events": [], + "recommendations": {} + }, + { + "name": "pay_principal", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + }, + { + "type": "byte[]", + "name": "payment_info", + "desc": "Additional payment information (Optional)" + } + ], + "returns": { + "type": "(uint64,uint64,byte[])", + "struct": "PaymentResult", + "desc": "Paid amount in denomination asset, Payment timestamp, Payment context" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Pay the outstanding principal and interest to an account", + "events": [], + "recommendations": {} + }, + { + "name": "get_account_units_current_value", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + }, + { + "type": "uint64", + "name": "units", + "desc": "Account's units for the current value calculation" + } + ], + "returns": { + "type": "(uint64,uint64,(uint64,uint64))", + "struct": "CurrentUnitsValue", + "desc": "Units current value in denomination asset, Accrued interest in denomination asset" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get account's units current value and accrued interest", + "events": [], + "recommendations": {} + }, + { + "name": "get_payment_amount", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + } + ], + "returns": { + "type": "(uint64,uint64)", + "struct": "PaymentAmounts", + "desc": "Interest amount in denomination asset, Principal amount in denomination asset" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get the next payment amount", + "events": [], + "recommendations": {} + }, + { + "name": "asset_create", + "args": [ + { + "type": "address", + "name": "arranger", + "desc": "D-ASA Arranger Address" + }, + { + "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", + "struct": "AssetMetadata", + "name": "metadata", + "desc": "D-ASA metadata" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "readonly": false, + "desc": "Create a new D-ASA", + "events": [], + "recommendations": {} + }, + { + "name": "asset_update", + "args": [ + { + "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", + "struct": "AssetMetadata", + "name": "metadata" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "UpdateApplication" + ] + }, + "readonly": false, + "desc": "Update D-ASA application.", + "events": [], + "recommendations": {} + }, + { + "name": "asset_config", + "args": [ + { + "type": "uint64", + "name": "denomination_asset_id", + "desc": "Denomination asset identifier" + }, + { + "type": "uint64", + "name": "settlement_asset_id", + "desc": "Settlement asset identifier" + }, + { + "type": "uint64", + "name": "principal", + "desc": "Principal, expressed in denomination asset" + }, + { + "type": "uint64", + "name": "principal_discount", + "desc": "Principal discount in bps" + }, + { + "type": "uint64", + "name": "minimum_denomination", + "desc": "Minimum denomination, expressed in denomination asset" + }, + { + "type": "uint8", + "name": "day_count_convention", + "desc": "Day-count convention for interests calculation" + }, + { + "type": "uint16", + "name": "interest_rate", + "desc": "Interest rate in bps" + }, + { + "type": "uint16[]", + "name": "coupon_rates", + "desc": "Coupon interest rates in bps" + }, + { + "type": "uint64[]", + "name": "time_events", + "desc": "Time events (strictly ascending order)" + }, + { + "type": "(uint64,uint64)[]", + "name": "time_periods", + "desc": "Time periods of recurring time events" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Configure the Debt Algorand Standard Application", + "events": [], + "recommendations": {} + }, + { + "name": "set_secondary_time_events", + "args": [ + { + "type": "uint64[]", + "name": "secondary_market_time_events", + "desc": "Secondary market time events (strictly ascending order)" + } + ], + "returns": { + "type": "(uint64,uint64)", + "struct": "SecondaryMarketSchedule", + "desc": "Secondary Market Opening Date, Secondary Market Closure Date" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Set secondary market time schedule", + "events": [], + "recommendations": {} + }, + { + "name": "assign_role", + "args": [ + { + "type": "address", + "name": "role_address", + "desc": "Account Role Address" + }, + { + "type": "uint8", + "name": "role", + "desc": "Role identifier" + }, + { + "type": "byte[]", + "name": "config", + "desc": "Role configuration (Optional)" + } + ], + "returns": { + "type": "uint64", + "desc": "Timestamp of the role assignment" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Assign a role to an address", + "events": [], + "recommendations": {} + }, + { + "name": "revoke_role", + "args": [ + { + "type": "address", + "name": "role_address", + "desc": "Account Role Address" + }, + { + "type": "uint8", + "name": "role", + "desc": "Role identifier" + } + ], + "returns": { + "type": "uint64", + "desc": "Timestamp of the role revocation" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Revoke a role from an address", + "events": [], + "recommendations": {} + }, + { + "name": "open_account", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + }, + { + "type": "address", + "name": "payment_address", + "desc": "Account Payment Address" + } + ], + "returns": { + "type": "uint64", + "desc": "Timestamp of the account opening" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Open D-ASA account", + "events": [], + "recommendations": {} + }, + { + "name": "close_account", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + } + ], + "returns": { + "type": "(uint64,uint64)", + "desc": "Closed units, Timestamp of the account closing" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Close D-ASA account", + "events": [], + "recommendations": {} + }, + { + "name": "primary_distribution", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + }, + { + "type": "uint64", + "name": "units", + "desc": "Amount of D-ASA units to distribute" + } + ], + "returns": { + "type": "uint64", + "desc": "Remaining D-ASA units to be distributed" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Distribute D-ASA units to accounts according the primary market", + "events": [], + "recommendations": {} + }, + { + "name": "set_asset_suspension", + "args": [ + { + "type": "bool", + "name": "suspended", + "desc": "Suspension status" + } + ], + "returns": { + "type": "uint64", + "desc": "Timestamp of the set asset suspension status" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Set asset suspension status", + "events": [], + "recommendations": {} + }, + { + "name": "set_account_suspension", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + }, + { + "type": "bool", + "name": "suspended", + "desc": "Suspension status" + } + ], + "returns": { + "type": "uint64", + "desc": "Timestamp of the set account suspension status" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Set account suspension status", + "events": [], + "recommendations": {} + }, + { + "name": "set_default_status", + "args": [ + { + "type": "bool", + "name": "defaulted", + "desc": "Default status" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "desc": "Set D-ASA default status", + "events": [], + "recommendations": {} + }, + { + "name": "get_asset_info", + "args": [], + "returns": { + "type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", + "struct": "AssetInfo", + "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Performance" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get D-ASA info", + "events": [], + "recommendations": {} + }, + { + "name": "get_account_info", + "args": [ + { + "type": "address", + "name": "holding_address", + "desc": "Account Holding Address" + } + ], + "returns": { + "type": "(address,uint64,uint64,uint64,bool)", + "struct": "AccountInfo", + "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get account info", + "events": [], + "recommendations": {} + }, + { + "name": "get_time_events", + "args": [], + "returns": { + "type": "uint64[]", + "desc": "Time events" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get D-ASA time events", + "events": [], + "recommendations": {} + }, + { + "name": "get_secondary_market_schedule", + "args": [], + "returns": { + "type": "uint64[]", + "desc": "Secondary market schedule" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get secondary market schedule", + "events": [], + "recommendations": {} + }, + { + "name": "get_asset_metadata", + "args": [], + "returns": { + "type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", + "struct": "AssetMetadata", + "desc": "Contract type, Calendar, Business day convention, End of month convention, Early repayment effect, Early repayment penalty type, Prospectus hash, Prospectus URL" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "desc": "Get D-ASA metadata", + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "desc": "\n Zero Coupon Bond, placed at discount, principal at maturity.\n ", + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 18, + "bytes": 2 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "arranger": { + "keyType": "AVMBytes", + "valueType": "AVMBytes", + "key": "UjIwIw==" + }, + "denomination_asset_id": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk" + }, + "settlement_asset_id": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "c2V0dGxlbWVudF9hc3NldF9pZA==" + }, + "unit_value": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "dW5pdF92YWx1ZQ==" + }, + "day_count_convention": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=" + }, + "metadata": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "bWV0YWRhdGE=" + }, + "total_units": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "dG90YWxfdW5pdHM=" + }, + "circulating_units": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "Y2lyY3VsYXRpbmdfdW5pdHM=" + }, + "principal_discount": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cHJpbmNpcGFsX2Rpc2NvdW50" + }, + "interest_rate": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "aW50ZXJlc3RfcmF0ZQ==" + }, + "total_coupons": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "dG90YWxfY291cG9ucw==" + }, + "primary_distribution_opening_date": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRl" + }, + "primary_distribution_closure_date": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRl" + }, + "issuance_date": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "aXNzdWFuY2VfZGF0ZQ==" + }, + "secondary_market_opening_date": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "c2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU=" + }, + "secondary_market_closure_date": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "c2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU=" + }, + "maturity_date": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "bWF0dXJpdHlfZGF0ZQ==" + }, + "status": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "c3RhdHVz" + }, + "suspended": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "c3VzcGVuZGVk" + }, + "defaulted": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "ZGVmYXVsdGVk" + } + }, + "local": {}, + "box": { + "coupon_rates": { + "keyType": "AVMBytes", + "valueType": "uint16[]", + "key": "Y291cG9uUmF0ZXM=" + }, + "time_events": { + "keyType": "AVMBytes", + "valueType": "uint64[]", + "key": "dGltZUV2ZW50cw==" + }, + "time_periods": { + "keyType": "AVMBytes", + "valueType": "(uint64,uint64)[]", + "key": "dGltZVBlcmlvZHM=" + } + } + }, + "maps": { + "global": {}, + "local": {}, + "box": { + "account_manager": { + "keyType": "address", + "valueType": "RoleConfig", + "prefix": "UjQwIw==" + }, + "primary_dealer": { + "keyType": "address", + "valueType": "RoleConfig", + "prefix": "UjUwIw==" + }, + "trustee": { + "keyType": "address", + "valueType": "RoleConfig", + "prefix": "UjYwIw==" + }, + "authority": { + "keyType": "address", + "valueType": "RoleConfig", + "prefix": "UjcwIw==" + }, + "interest_oracle": { + "keyType": "address", + "valueType": "RoleConfig", + "prefix": "UjgwIw==" + }, + "account": { + "keyType": "address", + "valueType": "AccountInfo", + "prefix": "UjMwIw==" + } + } + } + }, + "bareActions": { + "create": [], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 3272 + ], + "errorMessage": "Can not distribute zero units" + }, + { + "pc": [ + 2262 + ], + "errorMessage": "Coupon rates are not properly defined" + }, + { + "pc": [ + 2129 + ], + "errorMessage": "D-ASA already configured" + }, + { + "pc": [ + 1477 + ], + "errorMessage": "Defaulted" + }, + { + "pc": [ + 2149 + ], + "errorMessage": "Denomination asset is not properly set" + }, + { + "pc": [ + 2166 + ], + "errorMessage": "Different settlement asset not supported, must be equal to denomination asset" + }, + { + "pc": [ + 1258, + 1269, + 1276, + 1287, + 1294, + 1305, + 1312, + 1326, + 1346, + 1370, + 1388, + 1455, + 1497, + 1502, + 1601, + 1639, + 1655, + 1716, + 1754, + 1805, + 1883, + 1977, + 1983, + 2322, + 2331, + 2339, + 2375, + 2412, + 2480, + 2495, + 2592, + 2630, + 3083, + 3100, + 3137, + 3225, + 3242, + 3301, + 3392, + 3409, + 3476, + 3493 + ], + "errorMessage": "Index access is out of bounds" + }, + { + "pc": [ + 3286 + ], + "errorMessage": "Insufficient remaining D-ASA units" + }, + { + "pc": [ + 1265 + ], + "errorMessage": "Insufficient sender units to transfer" + }, + { + "pc": [ + 2251 + ], + "errorMessage": "Interest rate is not properly defined" + }, + { + "pc": [ + 1208, + 1220, + 1635, + 1870, + 2047, + 3043, + 3133, + 3261, + 3439, + 3732 + ], + "errorMessage": "Invalid account holding address" + }, + { + "pc": [ + 2753, + 2775, + 2795, + 2815, + 2835, + 2941, + 2958, + 2973, + 2988, + 3003 + ], + "errorMessage": "Invalid account role address" + }, + { + "pc": [ + 1895 + ], + "errorMessage": "Invalid amount of units for the account" + }, + { + "pc": [ + 2240 + ], + "errorMessage": "Invalid day-count convention ID" + }, + { + "pc": [ + 2717, + 2909 + ], + "errorMessage": "Invalid role identifier" + }, + { + "pc": [ + 2636 + ], + "errorMessage": "Invalid secondary market closure date" + }, + { + "pc": [ + 2600 + ], + "errorMessage": "Invalid secondary market opening date" + }, + { + "pc": [ + 2203 + ], + "errorMessage": "Minimum denomination is not a divisor of principal" + }, + { + "pc": [ + 1643 + ], + "errorMessage": "No D-ASA units" + }, + { + "pc": [ + 1190, + 1619, + 2112, + 2547, + 3027, + 3110, + 3252, + 3419, + 3503 + ], + "errorMessage": "Not authorized" + }, + { + "pc": [ + 1711 + ], + "errorMessage": "Not enough funds for the payment" + }, + { + "pc": [ + 1652 + ], + "errorMessage": "Not mature" + }, + { + "pc": [ + 706, + 722, + 738, + 754, + 773, + 789, + 804, + 826, + 845, + 867, + 886, + 908, + 930, + 955, + 974, + 1032, + 1051, + 1070, + 1092, + 1114 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 1017 + ], + "errorMessage": "OnCompletion is not UpdateApplication" + }, + { + "pc": [ + 3206 + ], + "errorMessage": "Primary distribution is closed" + }, + { + "pc": [ + 1859 + ], + "errorMessage": "Primary distribution not yet executed" + }, + { + "pc": [ + 1184 + ], + "errorMessage": "Secondary market is closed" + }, + { + "pc": [ + 1320 + ], + "errorMessage": "Sender and receiver units are not fungible" + }, + { + "pc": [ + 1237, + 1253, + 1488 + ], + "errorMessage": "Suspended operations" + }, + { + "pc": [ + 2296, + 2556 + ], + "errorMessage": "Time events length is invalid" + }, + { + "pc": [ + 2419 + ], + "errorMessage": "Time events must be set in the future" + }, + { + "pc": [ + 2501 + ], + "errorMessage": "Time events must be sorted in strictly ascending order" + }, + { + "pc": [ + 2386 + ], + "errorMessage": "Time periods are not properly defined" + }, + { + "pc": [ + 2523 + ], + "errorMessage": "Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)" + }, + { + "pc": [ + 527 + ], + "errorMessage": "Wrong Global Bytes allocation" + }, + { + "pc": [ + 533 + ], + "errorMessage": "Wrong Global UInts allocation" + }, + { + "pc": [ + 537 + ], + "errorMessage": "Wrong Local Bytes allocation" + }, + { + "pc": [ + 541 + ], + "errorMessage": "Wrong Local UInts allocation" + }, + { + "pc": [ + 1707 + ], + "errorMessage": "account opted into asset" + }, + { + "pc": [ + 2141 + ], + "errorMessage": "asset exists" + }, + { + "pc": [ + 1036 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 709, + 725, + 741, + 757, + 776, + 792, + 807, + 829, + 848, + 870, + 889, + 911, + 933, + 958, + 977, + 1020, + 1054, + 1073, + 1095, + 1117 + ], + "errorMessage": "can only call when not creating" + }, + { + "pc": [ + 1224, + 1240, + 1257, + 1268, + 1275, + 1286, + 1293, + 1304, + 1311, + 1325, + 1345, + 1357, + 1369, + 1381, + 1387, + 1399, + 1410, + 1437, + 1449, + 1453, + 1600, + 1638, + 1654, + 1673, + 1715, + 1753, + 1764, + 1804, + 1882, + 3136, + 3300, + 3310, + 3327, + 3442, + 3734 + ], + "errorMessage": "check self.account entry exists" + }, + { + "pc": [ + 3082, + 3099 + ], + "errorMessage": "check self.account_manager entry exists" + }, + { + "pc": [ + 2110 + ], + "errorMessage": "check self.arranger exists" + }, + { + "pc": [ + 3391, + 3408 + ], + "errorMessage": "check self.authority entry exists" + }, + { + "pc": [ + 1746, + 1822, + 3147, + 3276, + 3290, + 3340, + 3582, + 3632 + ], + "errorMessage": "check self.circulating_units exists" + }, + { + "pc": [ + 1560, + 2506, + 3600 + ], + "errorMessage": "check self.day_count_convention exists" + }, + { + "pc": [ + 1475, + 3559 + ], + "errorMessage": "check self.defaulted exists" + }, + { + "pc": [ + 2162, + 3571 + ], + "errorMessage": "check self.denomination_asset_id exists" + }, + { + "pc": [ + 3618 + ], + "errorMessage": "check self.interest_rate exists" + }, + { + "pc": [ + 1539, + 1551, + 1939, + 2583, + 3650 + ], + "errorMessage": "check self.issuance_date exists" + }, + { + "pc": [ + 1546, + 1650, + 1953, + 1995, + 2609, + 2617, + 3534, + 3656 + ], + "errorMessage": "check self.maturity_date exists" + }, + { + "pc": [ + 3794 + ], + "errorMessage": "check self.metadata exists" + }, + { + "pc": [ + 3224, + 3241 + ], + "errorMessage": "check self.primary_dealer entry exists" + }, + { + "pc": [ + 3198, + 3644 + ], + "errorMessage": "check self.primary_distribution_closure_date exists" + }, + { + "pc": [ + 1843, + 1853, + 3184, + 3638 + ], + "errorMessage": "check self.primary_distribution_opening_date exists" + }, + { + "pc": [ + 1517, + 1915, + 3609 + ], + "errorMessage": "check self.principal_discount exists" + }, + { + "pc": [ + 1176, + 2651, + 3777 + ], + "errorMessage": "check self.secondary_market_closure_date exists" + }, + { + "pc": [ + 1162, + 2645, + 3771 + ], + "errorMessage": "check self.secondary_market_opening_date exists" + }, + { + "pc": [ + 1662, + 1704, + 1726, + 2178, + 3577 + ], + "errorMessage": "check self.settlement_asset_id exists" + }, + { + "pc": [ + 1151, + 1615, + 2052, + 2127, + 2542, + 3022, + 3173, + 3746 + ], + "errorMessage": "check self.status exists" + }, + { + "pc": [ + 1486, + 3662 + ], + "errorMessage": "check self.suspended exists" + }, + { + "pc": [ + 3759 + ], + "errorMessage": "check self.time_events exists" + }, + { + "pc": [ + 2271, + 2292, + 2358 + ], + "errorMessage": "check self.total_coupons exists" + }, + { + "pc": [ + 3284, + 3336, + 3627 + ], + "errorMessage": "check self.total_units exists" + }, + { + "pc": [ + 3475, + 3492 + ], + "errorMessage": "check self.trustee entry exists" + }, + { + "pc": [ + 3322, + 3587, + 3594 + ], + "errorMessage": "check self.unit_value exists" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuemVyb19jb3Vwb25fYm9uZC5jb250cmFjdC5aZXJvQ291cG9uQm9uZC5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCA0IDQ0OCA4NjQwMCAyMDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAiY2lyY3VsYXRpbmdfdW5pdHMiIDB4NTIzMzMwMjMgInN0YXR1cyIgIm1hdHVyaXR5X2RhdGUiIDB4MDAwMDAwMDAwMDAwMDAwMCAic2V0dGxlbWVudF9hc3NldF9pZCIgImlzc3VhbmNlX2RhdGUiICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiICJ1bml0X3ZhbHVlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iICJ0b3RhbF91bml0cyIgInByaW5jaXBhbF9kaXNjb3VudCIgInRvdGFsX2NvdXBvbnMiICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIgInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIiAweDAwIDB4NTIzMjMwMjMgImRlbm9taW5hdGlvbl9hc3NldF9pZCIgIm1ldGFkYXRhIiAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIiAic3VzcGVuZGVkIiAiZGVmYXVsdGVkIiAiaW50ZXJlc3RfcmF0ZSIgMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MyAweDUyMzczMDIzIDB4NTIzNjMwMjMgMHg1MjM1MzAyMyAweDUyMzQzMDIzIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MyAweDA2ODEwMSAweDUyMzgzMDIzCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MS00MgogICAgLy8gIyBSb2xlIEJhc2VkIEFjY2VzcyBDb250cm9sCiAgICAvLyBzZWxmLmFycmFuZ2VyID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9BUlJBTkdFUikKICAgIGJ5dGVjIDE3IC8vIDB4NTIzMjMwMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5LTYwCiAgICAvLyAjIEFzc2V0IENvbmZpZ3VyYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gVUludDY0KCkKICAgIGJ5dGVjIDE4IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjIKICAgIC8vIHNlbGYudW5pdF92YWx1ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA5IC8vICJ1bml0X3ZhbHVlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MwogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMCAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1LTY2CiAgICAvLyAjIE1ldGFkYXRhCiAgICAvLyBzZWxmLm1ldGFkYXRhID0gQnl0ZXMoKQogICAgYnl0ZWMgMTkgLy8gIm1ldGFkYXRhIgogICAgcHVzaGJ5dGVzIDB4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjgtNjkKICAgIC8vICMgU3VwcGx5CiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDExIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzAKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyLTczCiAgICAvLyAjIFByaW5jaXBhbAogICAgLy8gc2VsZi5wcmluY2lwYWxfZGlzY291bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMTIgLy8gInByaW5jaXBhbF9kaXNjb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzUtNzYKICAgIC8vICMgSW50ZXJlc3QKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAyMyAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODAKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMyAvLyAidG90YWxfY291cG9ucyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODUKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDggLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDIwIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNyAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODgKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTQgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTItOTMKICAgIC8vICMgU3RhdHVzCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0VNUFRZKQogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NAogICAgLy8gc2VsZi5zdXNwZW5kZWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjEgLy8gInN1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTUKICAgIC8vIHNlbGYuZGVmYXVsdGVkID0gVUludDY0KCkKICAgIGJ5dGVjIDIyIC8vICJkZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM1LTM2CiAgICAvLyAjIFN0YXRlIHNjaGVtYSB2YWxpZGF0aW9uCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MzcKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV91aW50ID09IGNmZy5HTE9CQUxfVUlOVFMsIGVyci5XUk9OR19HTE9CQUxfVUlOVFMKICAgIHR4biBHbG9iYWxOdW1VaW50CiAgICBwdXNoaW50IDE4IC8vIDE4CiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBVSW50cyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTozOAogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuTE9DQUxfQllURVMsIGVyci5XUk9OR19MT0NBTF9CWVRFUwogICAgdHhuIExvY2FsTnVtQnl0ZVNsaWNlCiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MzkKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9hZnRlcl9pZl9lbHNlQDI2CiAgICBwdXNoYnl0ZXNzIDB4NGZkNmEzY2MgMHg5Yzc2YjZhMyAweDQ0MzYzZDQ5IDB4NjdkYjRmMjAgMHgzZjBlZmM2YyAweDI1ZGJhOTViIDB4ODk0NzQxMzQgMHgxZDZmYzI1NSAweGZlZjc0NTY3IDB4YjhmYzEzOTAgMHgzZDQzZDFmMCAweGViZDk2YjJmIDB4NmM4NWUzZWUgMHhmNjNhY2U4ZCAweGJiY2NhMThhIDB4MWE3YmFiYjQgMHg0MDJkYmE0NyAweGVkMDI3NTlmIDB4ZmFkMjE3M2UgMHgwOGVmZWEzNSAweGU0YTVhYjU0IC8vIG1ldGhvZCAiYXNzZXRfdHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInBheV9wcmluY2lwYWwoYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAiZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZShhZGRyZXNzLHVpbnQ2NCkodWludDY0LHVpbnQ2NCwodWludDY0LHVpbnQ2NCkpIiwgbWV0aG9kICJnZXRfcGF5bWVudF9hbW91bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImFzc2V0X2NyZWF0ZShhZGRyZXNzLCh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCxieXRlWzMyXSxzdHJpbmcpKXZvaWQiLCBtZXRob2QgImFzc2V0X3VwZGF0ZSgodWludDgsdWludDgsdWludDgsdWludDgsdWludDgsdWludDgsYnl0ZVszMl0sc3RyaW5nKSl2b2lkIiwgbWV0aG9kICJhc3NldF9jb25maWcodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50MTYsdWludDE2W10sdWludDY0W10sKHVpbnQ2NCx1aW50NjQpW10pdm9pZCIsIG1ldGhvZCAic2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cyh1aW50NjRbXSkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImFzc2lnbl9yb2xlKGFkZHJlc3MsdWludDgsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAicmV2b2tlX3JvbGUoYWRkcmVzcyx1aW50OCl1aW50NjQiLCBtZXRob2QgIm9wZW5fYWNjb3VudChhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJjbG9zZV9hY2NvdW50KGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInNldF9hc3NldF9zdXNwZW5zaW9uKGJvb2wpdWludDY0IiwgbWV0aG9kICJzZXRfYWNjb3VudF9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgInNldF9kZWZhdWx0X3N0YXR1cyhib29sKXZvaWQiLCBtZXRob2QgImdldF9hc3NldF9pbmZvKCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQxNix1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYm9vbCx1aW50OCkiLCBtZXRob2QgImdldF9hY2NvdW50X2luZm8oYWRkcmVzcykoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sKSIsIG1ldGhvZCAiZ2V0X3RpbWVfZXZlbnRzKCl1aW50NjRbXSIsIG1ldGhvZCAiZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfYXNzZXRfbWV0YWRhdGEoKSh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCxieXRlWzMyXSxzdHJpbmcpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9hc3NldF90cmFuc2Zlcl9yb3V0ZUA1IG1haW5fcGF5X3ByaW5jaXBhbF9yb3V0ZUA2IG1haW5fZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9yb3V0ZUA3IG1haW5fZ2V0X3BheW1lbnRfYW1vdW50X3JvdXRlQDggbWFpbl9hc3NldF9jcmVhdGVfcm91dGVAOSBtYWluX2Fzc2V0X3VwZGF0ZV9yb3V0ZUAxMCBtYWluX2Fzc2V0X2NvbmZpZ19yb3V0ZUAxMSBtYWluX3NldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfcm91dGVAMTIgbWFpbl9hc3NpZ25fcm9sZV9yb3V0ZUAxMyBtYWluX3Jldm9rZV9yb2xlX3JvdXRlQDE0IG1haW5fb3Blbl9hY2NvdW50X3JvdXRlQDE1IG1haW5fY2xvc2VfYWNjb3VudF9yb3V0ZUAxNiBtYWluX3ByaW1hcnlfZGlzdHJpYnV0aW9uX3JvdXRlQDE3IG1haW5fc2V0X2Fzc2V0X3N1c3BlbnNpb25fcm91dGVAMTggbWFpbl9zZXRfYWNjb3VudF9zdXNwZW5zaW9uX3JvdXRlQDE5IG1haW5fc2V0X2RlZmF1bHRfc3RhdHVzX3JvdXRlQDIwIG1haW5fZ2V0X2Fzc2V0X2luZm9fcm91dGVAMjEgbWFpbl9nZXRfYWNjb3VudF9pbmZvX3JvdXRlQDIyIG1haW5fZ2V0X3RpbWVfZXZlbnRzX3JvdXRlQDIzIG1haW5fZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGVfcm91dGVAMjQgbWFpbl9nZXRfYXNzZXRfbWV0YWRhdGFfcm91dGVAMjUKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9tZXRhZGF0YV9yb3V0ZUAyNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X21ldGFkYXRhCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlX3JvdXRlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfdGltZV9ldmVudHNfcm91dGVAMjM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF90aW1lX2V2ZW50cwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYWNjb3VudF9pbmZvX3JvdXRlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hY2NvdW50X2luZm8KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2luZm9fcm91dGVAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hc3NldF9pbmZvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9kZWZhdWx0X3N0YXR1c19yb3V0ZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBzZXRfZGVmYXVsdF9zdGF0dXMKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0X2FjY291bnRfc3VzcGVuc2lvbl9yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBzZXRfYWNjb3VudF9zdXNwZW5zaW9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9hc3NldF9zdXNwZW5zaW9uX3JvdXRlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9hc3NldF9zdXNwZW5zaW9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3ByaW1hcnlfZGlzdHJpYnV0aW9uX3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODAxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgwMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHByaW1hcnlfZGlzdHJpYnV0aW9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Nsb3NlX2FjY291bnRfcm91dGVAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgY2xvc2VfYWNjb3VudAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9vcGVuX2FjY291bnRfcm91dGVAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgb3Blbl9hY2NvdW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3Jldm9rZV9yb2xlX3JvdXRlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHJldm9rZV9yb2xlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Fzc2lnbl9yb2xlX3JvdXRlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGFzc2lnbl9yb2xlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF9jb25maWdfcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0ODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGFzc2V0X2NvbmZpZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF91cGRhdGVfcm91dGVAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMyAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IFVwZGF0ZUFwcGxpY2F0aW9uCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIGNhbGxzdWIgYXNzZXRfdXBkYXRlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Fzc2V0X2NyZWF0ZV9yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGNhbGxzdWIgYXNzZXRfY3JlYXRlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9wYXltZW50X2Ftb3VudF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9wYXltZW50X2Ftb3VudAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9wYXlfcHJpbmNpcGFsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTI0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcGF5X3ByaW5jaXBhbAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF90cmFuc2Zlcl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6ODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6ODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NldF90cmFuc2ZlcgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy56ZXJvX2NvdXBvbl9ib25kLmNvbnRyYWN0Llplcm9Db3Vwb25Cb25kLmFzc2V0X3RyYW5zZmVyKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCByZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogYnl0ZXMpIC0+IGJ5dGVzOgphc3NldF90cmFuc2ZlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjgwLTg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhc3NldF90cmFuc2ZlcigKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIHNlbmRlcl9ob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywKICAgIC8vICAgICByZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywKICAgIC8vICAgICB1bml0czogYXJjNC5VSW50NjQsCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMyAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAyCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTEwCiAgICAvLyB1bml0cy5uYXRpdmUsCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5OC0zMDEKICAgIC8vIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTkKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzAwCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5OS0zMDAKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5OS0zMDEKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwMQogICAgLy8gPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzAwLTMwMQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgZnJhbWVfZGlnIDQKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5OS0zMDEKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgphc3NldF90cmFuc2Zlcl9ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTctMzAyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyAgICAgYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLlNFQ09OREFSWV9NQVJLRVRfQ0xPU0VECiAgICBhc3NlcnQgLy8gU2Vjb25kYXJ5IG1hcmtldCBpcyBjbG9zZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM3Ni0zNzgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdHJhbnNmZXIgcmlnaHQgdG8gRC1BU0Egb3duZXJzLiBPdGhlciBpbXBsZW1lbnRhdGlvbnMgbWF5IHJlbGF5IG9uIG90aGVyCiAgICAvLyAjIHJvbGVzLCBleHRlcm5hbCBBcHBzIHRocm91Z2ggQzJDIGNhbGxzIChlLmcuLCBhbiBvcmRlciBib29rKSwgb3Igb2ZmLWNoYWluIHRyYW5zZmVyIGFnZW50cy4KICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MubmF0aXZlLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTMKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM3OQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozODAKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICBieXRlY18yIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozODMKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZC5uYXRpdmUsIGVyci5TVVNQRU5ERUQKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50YyA0IC8vIDQ0OAogICAgZ2V0Yml0CiAgICBieXRlYyAxNiAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzg0LTM4NgogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRbCiAgICAvLyAgICAgcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzCiAgICAvLyBdLnN1c3BlbmRlZC5uYXRpdmUsIGVyci5TVVNQRU5ERUQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGMgNCAvLyA0NDgKICAgIGdldGJpdAogICAgYnl0ZWMgMTYgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM4OAogICAgLy8gdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBmcmFtZV9kaWcgNQogICAgPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM4Ny0zODkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgLy8gKSwgZXJyLk9WRVJfVFJBTlNGRVIKICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozOTcKICAgIC8vIHNlbmRlcl91bml0X3ZhbHVlID0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUKICAgIHN3YXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM5OAogICAgLy8gaWYgc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlID4gMDoKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBieiBhc3NldF90cmFuc2Zlcl9lbHNlX2JvZHlAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwOQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwOS0zMTAKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICAvLyBhbmQgc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTAKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwOS0zMTAKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICAvLyBhbmQgc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDE0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwOC0zMTEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vICAgICBhbmQgc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zCiAgICAvLyApLCBlcnIuTk9OX0ZVTkdJQkxFX1VOSVRTCiAgICBhc3NlcnQgLy8gU2VuZGVyIGFuZCByZWNlaXZlciB1bml0cyBhcmUgbm90IGZ1bmdpYmxlCgphc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTEzLTExNAogICAgLy8gIyBUcmFuc2ZlcnJlZCB1bml0cyB2YWx1ZSAobXVzdCBiZSBjb21wdXRlZCBiZWZvcmUgdGhlIHRyYW5zZmVyKQogICAgLy8gc2VuZGVyX3VuaXRfdmFsdWUgPSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTE1LTExNwogICAgLy8gYWNjcnVlZF9pbnRlcmVzdCA9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoCiAgICAvLyAgICAgc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgdW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA1CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGNhbGxzdWIgYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDM0CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlIC0gdW5pdHMKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGRpZyAyCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzMtNDM1CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlIC0gdW5pdHMKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQzMwogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQzMy00MzUKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgLSB1bml0cwogICAgLy8gKQogICAgc3dhcAogICAgcmVwbGFjZTIgMzIKICAgIGRpZyAxCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzcKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgdW5jb3ZlciAzCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzYtNDM4CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzYKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQzNi00MzgKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMKICAgIC8vICkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDMyCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjAKICAgIC8vIGlmIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSA9PSAwOgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJueiBhc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDIxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjEKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUgPSBhcmM0LlVJbnQ2NCgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgNSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIHJlcGxhY2UyIDQwCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzYyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBhcmM0LlVJbnQ2NCgpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBieXRlYyA1IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgcmVwbGFjZTIgNDgKICAgIGJveF9wdXQKCmFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjIKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NCh1bml0cy5uYXRpdmUgKiBzZW5kZXJfdW5pdF92YWx1ZS5uYXRpdmUgKyBhY2NydWVkX2ludGVyZXN0KQogICAgZnJhbWVfZGlnIDAKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyA1CiAgICAqCiAgICBmcmFtZV9kaWcgMwogICAgKwogICAgaXRvYgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMTQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NldF90cmFuc2Zlcl9ib29sX21lcmdlQDE1Cgphc3NldF90cmFuc2Zlcl9lbHNlX2JvZHlAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MDMKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUgPSBzZW5kZXJfdW5pdF92YWx1ZQogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGZyYW1lX2RpZyAwCiAgICByZXBsYWNlMiA0MAogICAgZGlnIDEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQwNC00MDYKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IHNlbGYuYWNjb3VudFsKICAgIC8vICAgICBzZW5kZXJfaG9sZGluZ19hZGRyZXNzCiAgICAvLyBdLnBhaWRfY291cG9ucwogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MDQKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IHNlbGYuYWNjb3VudFsKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDA0LTQwNgogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50WwogICAgLy8gICAgIHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MKICAgIC8vIF0ucGFpZF9jb3Vwb25zCiAgICBzd2FwCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICByZXBsYWNlMiA0OAogICAgYm94X3B1dAogICAgYiBhc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDE3Cgphc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NldF90cmFuc2Zlcl9ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfZGVmYXVsdGVkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTEwLTExMQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTIKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5kZWZhdWx0ZWQsIGVyci5ERUZBVUxURUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMiAvLyAiZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlZmF1bHRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBEZWZhdWx0ZWQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkgLT4gdm9pZDoKYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTQtMTE1CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExNgogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIxIC8vICJzdXNwZW5kZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3VzcGVuZGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuemVyb19jb3Vwb25fYm9uZC5jb250cmFjdC5aZXJvQ291cG9uQm9uZC5hY2NydWVkX2ludGVyZXN0X2Ftb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogdWludDY0KSAtPiB1aW50NjQ6CmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NjQtNjcKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHVuaXRzOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2OAogICAgLy8gZGF5X2NvdW50X2ZhY3RvciA9IHNlbGYuZGF5X2NvdW50X2ZhY3RvcigpCiAgICBjYWxsc3ViIGRheV9jb3VudF9mYWN0b3IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjY5CiAgICAvLyBhY2NydWVkX3BlcmlvZCA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yLm5hdGl2ZQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjcwCiAgICAvLyBwcmluY2lwYWxfcGVyaW9kID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvci5uYXRpdmUKICAgIHN3YXAKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NzIKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWNjb3VudF91bml0c192YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NzMKICAgIC8vICogc2VsZi5wcmluY2lwYWxfZGlzY291bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjcyLTczCiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogc2VsZi5wcmluY2lwYWxfZGlzY291bnQKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjcyLTc0CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogc2VsZi5wcmluY2lwYWxfZGlzY291bnQKICAgIC8vICogYWNjcnVlZF9wZXJpb2QKICAgIHVuY292ZXIgMgogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NzYKICAgIC8vIGNzdC5CUFMgKiBwcmluY2lwYWxfcGVyaW9kCiAgICBwdXNoaW50IDEwMDAwIC8vIDEwMDAwCiAgICB1bmNvdmVyIDIKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjcyLTc3CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogc2VsZi5wcmluY2lwYWxfZGlzY291bnQKICAgIC8vICogYWNjcnVlZF9wZXJpb2QKICAgIC8vIC8vICgKICAgIC8vICAgICBjc3QuQlBTICogcHJpbmNpcGFsX3BlcmlvZAogICAgLy8gKSAgIyBkaXYtYnktemVybzogcHJpbmNpcGFsX3BlcmlvZCAhPSAwIGR1ZSB0byBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkIGNoZWNrcwogICAgLwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NzEtNzgKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICAvLyAgICAgKiBzZWxmLnByaW5jaXBhbF9kaXNjb3VudAogICAgLy8gICAgICogYWNjcnVlZF9wZXJpb2QKICAgIC8vICAgICAvLyAoCiAgICAvLyAgICAgICAgIGNzdC5CUFMgKiBwcmluY2lwYWxfcGVyaW9kCiAgICAvLyAgICAgKSAgIyBkaXYtYnktemVybzogcHJpbmNpcGFsX3BlcmlvZCAhPSAwIGR1ZSB0byBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkIGNoZWNrcwogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnplcm9fY291cG9uX2JvbmQuY29udHJhY3QuWmVyb0NvdXBvbkJvbmQuZGF5X2NvdW50X2ZhY3RvcigpIC0+IGJ5dGVzOgpkYXlfY291bnRfZmFjdG9yOgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NDYtNDcKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZGF5X2NvdW50X2ZhY3RvcihzZWxmKSAtPiB0eXAuRGF5Q291bnRGYWN0b3I6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQ4LTQ5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFjY3J1ZWRfcGVyaW9kID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgLSBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICAtCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjUwCiAgICAvLyBwcmluY2lwYWxfcGVyaW9kID0gc2VsZi5tYXR1cml0eV9kYXRlIC0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIC0KICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NTEKICAgIC8vIGlmIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPT0gVUludDY0KGNzdC5EQ0NfQV9BKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBzd2FwCiAgICBjb3ZlciAyCiAgICBibnogZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1NgogICAgLy8gcmV0dXJuIHRpbWVfcGVyaW9kIC8vIFVJbnQ2NChjc3QuREFZXzJfU0VDKQogICAgZnJhbWVfZGlnIDAKICAgIGludGMgNSAvLyA4NjQwMAogICAgLwogICAgZnJhbWVfZGlnIDEKICAgIGludGMgNSAvLyA4NjQwMAogICAgLwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9idXJ5IDMKCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1NQogICAgLy8gbnVtZXJhdG9yPWFyYzQuVUludDY0KGFjY3J1ZWRfcGVyaW9kKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChwcmluY2lwYWxfcGVyaW9kKSwKICAgIHN3YXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU0LTU3CiAgICAvLyByZXR1cm4gdHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChhY2NydWVkX3BlcmlvZCksCiAgICAvLyAgICAgZGVub21pbmF0b3I9YXJjNC5VSW50NjQocHJpbmNpcGFsX3BlcmlvZCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogdWludDY0KSAtPiB1aW50NjQ6CmFjY291bnRfdW5pdHNfdmFsdWU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDItMzQ1CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFjY291bnRfdW5pdHNfdmFsdWUoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHVuaXRzOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDYKICAgIC8vIHJldHVybiB1bml0cyAqIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUubmF0aXZlCiAgICBieXRlY18yIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuemVyb19jb3Vwb25fYm9uZC5jb250cmFjdC5aZXJvQ291cG9uQm9uZC5wYXlfcHJpbmNpcGFsKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHBheW1lbnRfaW5mbzogYnl0ZXMpIC0+IGJ5dGVzOgpwYXlfcHJpbmNpcGFsOgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTI0LTEyNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcGF5X3ByaW5jaXBhbCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcGF5bWVudF9pbmZvOiBhcmM0LkR5bmFtaWNCeXRlcwogICAgLy8gKSAtPiB0eXAuUGF5bWVudFJlc3VsdDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA0CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCAxMDAgLy8gMTAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDQzLTQ0NAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHJlc3RyaWN0IGNhbGxlciBhdXRob3JpemF0aW9uCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDQ1CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ0NgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cG4gMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDQ4CiAgICAvLyB1bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDQ5CiAgICAvLyBhc3NlcnQgdW5pdHMgPiAwLCBlcnIuTk9fVU5JVFMKICAgIGFzc2VydCAvLyBObyBELUFTQSB1bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDUwCiAgICAvLyBhc3NlcnQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5tYXR1cml0eV9kYXRlLCBlcnIuTk9UX01BVFVSRQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgID49CiAgICBhc3NlcnQgLy8gTm90IG1hdHVyZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzE2CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MubmF0aXZlLmlzX29wdGVkX2luKAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMiAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxNwogICAgLy8gQXNzZXQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxNi0zMTgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5uYXRpdmUuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgQXNzZXQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgLy8gKQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxNi0zMTkKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5uYXRpdmUuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgQXNzZXQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgLy8gKQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQubmF0aXZlCiAgICBieiBwYXlfcHJpbmNpcGFsX2Jvb2xfZmFsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxOQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQubmF0aXZlCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGMgNCAvLyA0NDgKICAgIGdldGJpdAogICAgYnl0ZWMgMTYgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBibnogcGF5X3ByaW5jaXBhbF9ib29sX2ZhbHNlQDE2CiAgICBpbnRjXzEgLy8gMQoKcGF5X3ByaW5jaXBhbF9ib29sX21lcmdlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTQ5CiAgICAvLyBpZiBzZWxmLmlzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgYnogcGF5X3ByaW5jaXBhbF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTUwCiAgICAvLyBwYXltZW50X2Ftb3VudCA9IHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgYWNjb3VudF90b3RhbF91bml0c192YWx1ZQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjUKICAgIC8vIEFzc2V0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCkuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyNS0zMjYKICAgIC8vIEFzc2V0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCkuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gPj0gcGF5bWVudF9hbW91bnQKICAgIGRpZyAxCiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzI0LTMyNwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBBc3NldChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vICAgICA+PSBwYXltZW50X2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTUzLTE1NAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyB0aGUgc2FtZSBhc3NldCBmb3IgZGVub21pbmF0aW9uIGFuZCBzZXR0bGVtZW50LCBubyBjb252ZXJzaW9uIG5lZWRlZAogICAgLy8gc2VsZi5wYXkoc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLCBwYXltZW50X2Ftb3VudCkKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzMxLTMzNgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLm5hdGl2ZSwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMzUKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMzIKICAgIC8vIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMzEKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIGludGNfMyAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMzMS0zMzYKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlci5uYXRpdmUsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKCnBheV9wcmluY2lwYWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDU3CiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIC09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC0KICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ1OAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBieXRlYyA1IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgcmVwbGFjZTIgMzIKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ1OQogICAgLy8gc2VsZi5lbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoKQogICAgY2FsbHN1YiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE2MQogICAgLy8gYW1vdW50PWFyYzQuVUludDY0KHBheW1lbnRfYW1vdW50KSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE2MgogICAgLy8gdGltZXN0YW1wPWFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE2MC0xNjQKICAgIC8vIHJldHVybiB0eXAuUGF5bWVudFJlc3VsdCgKICAgIC8vICAgICBhbW91bnQ9YXJjNC5VSW50NjQocGF5bWVudF9hbW91bnQpLAogICAgLy8gICAgIHRpbWVzdGFtcD1hcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCksCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8uY29weSgpLCAgIyBUT0RPOiBBZGQgaW5mbyBvbiBmYWlsZWQgcGF5bWVudAogICAgLy8gKQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDEyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBzd2FwCiAgICByZXRzdWIKCnBheV9wcmluY2lwYWxfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNTYtMTU3CiAgICAvLyAjIEFjY291bnRzIHN1c3BlbmRlZCBvciBub3Qgb3B0ZWQgaW4gYXQgdGhlIHRpbWUgb2YgcGF5bWVudHMgbXVzdCBub3Qgc3RhbGwgdGhlIEQtQVNBCiAgICAvLyBwYXltZW50X2Ftb3VudCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgYiBwYXlfcHJpbmNpcGFsX2FmdGVyX2lmX2Vsc2VAMwoKcGF5X3ByaW5jaXBhbF9ib29sX2ZhbHNlQDE2OgogICAgaW50Y18wIC8vIDAKICAgIGIgcGF5X3ByaW5jaXBhbF9ib29sX21lcmdlQDE3CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6CmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDgtMzQ5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzUxCiAgICAvLyBob2xkaW5nX2FkZHJlc3MsIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgYnl0ZWNfMiAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1MC0zNTIKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoCiAgICAvLyAgICAgaG9sZGluZ19hZGRyZXNzLCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgY2FsbHN1YiBhY2NvdW50X3VuaXRzX3ZhbHVlCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5lbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoKSAtPiB2b2lkOgplbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjQtMzY1CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjYKICAgIC8vIGlmIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgPT0gMDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGJueiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjcKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGNmZy5TVEFUVVNfRU5ERUQpCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBpbnRjIDYgLy8gMjAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy56ZXJvX2NvdXBvbl9ib25kLmNvbnRyYWN0Llplcm9Db3Vwb25Cb25kLmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE2Ni0xNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHVuaXRzOiBhcmM0LlVJbnQ2NAogICAgLy8gKSAtPiB0eXAuQ3VycmVudFVuaXRzVmFsdWU6CiAgICBwcm90byAyIDEKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gNgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTg2CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxODYtMTg3CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTg3CiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE4Ni0xODcKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzEgLy8gMQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxODUtMTg4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyApLCBlcnIuTk9fUFJJTUFSWV9ESVNUUklCVVRJT04KICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOTEKICAgIC8vIDAgPCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgYnl0ZWMgNSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI+CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VANwogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTEKICAgIGI+PQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDcKICAgIGludGNfMSAvLyAxCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5MC0xOTIKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgMCA8IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfVU5JVFMKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFtb3VudCBvZiB1bml0cyBmb3IgdGhlIGFjY291bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5NQogICAgLy8gaG9sZGluZ19hZGRyZXNzLCB1bml0cy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5NC0xOTYKICAgIC8vIGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSA9IHNlbGYuYWNjb3VudF91bml0c192YWx1ZSgKICAgIC8vICAgICBob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZQogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOTgKICAgIC8vIGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSAqIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50IC8vIGNzdC5CUFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIGRpZyAxCiAgICAqCiAgICBwdXNoaW50IDEwMDAwIC8vIDEwMDAwCiAgICAvCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMDMKICAgIC8vIGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSAtIGFjY291bnRfdW5pdHNfZGlzY291bnQKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwMS0yMDQKICAgIC8vICMgVmFsdWUgZHVyaW5nIHByaW1hcnkgZGlzdHJpYnV0aW9uCiAgICAvLyBhY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUgPSAoCiAgICAvLyAgICAgYWNjb3VudF91bml0c19ub21pbmFsX3ZhbHVlIC0gYWNjb3VudF91bml0c19kaXNjb3VudAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMDYtMjA3CiAgICAvLyAjIEFjY3J1aW5nIGludGVyZXN0IGR1cmluZyBwcmltYXJ5IGRpc3RyaWJ1dGlvbiBhbmQgYXQgbWF0dXJpdHkKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjA4CiAgICAvLyBudW1lcmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjA5CiAgICAvLyBkZW5vbWluYXRvciA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2MS02MgogICAgLy8gIyBUaGUgY2hlY2sgb24gbWF0dXJpdHkgZGF0ZSBlbnN1cmVzIEQtQVNBIGhhcyBiZWVuIGNvbmZpZ3VyZWQgYXMgYmxvY2sgdGltZXN0YW1wIGNhbm5vdCBiZSBsZXNzIHRoYW4gMCAoaW5pdCkuCiAgICAvLyByZXR1cm4gc2VsZi5pc3N1YW5jZV9kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi5tYXR1cml0eV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIDw9CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAMTYKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgNAogICAgPgogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDE2CiAgICBpbnRjXzEgLy8gMQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjExLTIxMgogICAgLy8gIyBBY2NydWluZyBpbnRlcmVzdAogICAgLy8gaWYgc2VsZi5pc19hY2NydWluZ19pbnRlcmVzdCgpOgogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMTMKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoKQogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMTQtMjE2CiAgICAvLyBhY2NydWVkX2ludGVyZXN0ID0gc2VsZi5hY2NydWVkX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZQogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgNwogICAgY2FsbHN1YiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMTcKICAgIC8vIG51bWVyYXRvciA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yLm5hdGl2ZQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjE4CiAgICAvLyBkZW5vbWluYXRvciA9IGRheV9jb3VudF9mYWN0b3IuZGVub21pbmF0b3IubmF0aXZlCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgNQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjIwLTIyMQogICAgLy8gIyBWYWx1ZSBhdCBtYXR1cml0eQogICAgLy8gaWYgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5tYXR1cml0eV9kYXRlOgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgID49CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2FmdGVyX2lmX2Vsc2VAMTIKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDEKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYWZ0ZXJfaWZfZWxzZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gdW5pdHNfdmFsdWU9YXJjNC5VSW50NjQoYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlKSwKICAgIGZyYW1lX2RpZyAxCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMjYKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3Q9YXJjNC5VSW50NjQoYWNjcnVlZF9pbnRlcmVzdCksCiAgICBmcmFtZV9kaWcgMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjI4CiAgICAvLyBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIGZyYW1lX2RpZyA2CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMjkKICAgIC8vIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGRlbm9taW5hdG9yKSwKICAgIGZyYW1lX2RpZyA1CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMjctMjMwCiAgICAvLyBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIC8vICAgICBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICAvLyApLAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMjQtMjMxCiAgICAvLyByZXR1cm4gdHlwLkN1cnJlbnRVbml0c1ZhbHVlKAogICAgLy8gICAgIHVuaXRzX3ZhbHVlPWFyYzQuVUludDY0KGFjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZSksCiAgICAvLyAgICAgYWNjcnVlZF9pbnRlcmVzdD1hcmM0LlVJbnQ2NChhY2NydWVkX2ludGVyZXN0KSwKICAgIC8vICAgICBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICAgICAgbnVtZXJhdG9yPWFyYzQuVUludDY0KG51bWVyYXRvciksCiAgICAvLyAgICAgICAgIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGRlbm9taW5hdG9yKSwKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAMTY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VAMTcKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA3OgogICAgaW50Y18wIC8vIDAKICAgIGIgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDgKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIGIgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuemVyb19jb3Vwb25fYm9uZC5jb250cmFjdC5aZXJvQ291cG9uQm9uZC5nZXRfcGF5bWVudF9hbW91bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9wYXltZW50X2Ftb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIzMy0yMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9wYXltZW50X2Ftb3VudChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcykgLT4gdHlwLlBheW1lbnRBbW91bnRzOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA0CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGR1cAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1MAogICAgLy8gaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCk6CiAgICBieiBnZXRfcGF5bWVudF9hbW91bnRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNTEKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUKICAgIGZyYW1lX2J1cnkgMAoKZ2V0X3BheW1lbnRfYW1vdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gcHJpbmNpcGFsPWFyYzQuVUludDY0KHByaW5jaXBhbF9hbW91bnQpLAogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1MwogICAgLy8gaW50ZXJlc3Q9YXJjNC5VSW50NjQoMCksCiAgICBieXRlYyA1IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjUyLTI1NQogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50QW1vdW50cygKICAgIC8vICAgICBpbnRlcmVzdD1hcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBwcmluY2lwYWw9YXJjNC5VSW50NjQocHJpbmNpcGFsX2Ftb3VudCksCiAgICAvLyApCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2V0X2NyZWF0ZShhcnJhbmdlcjogYnl0ZXMsIG1ldGFkYXRhOiBieXRlcykgLT4gdm9pZDoKYXNzZXRfY3JlYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDYxLTQ2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICAvLyBkZWYgYXNzZXRfY3JlYXRlKHNlbGYsIGFycmFuZ2VyOiBhcmM0LkFkZHJlc3MsIG1ldGFkYXRhOiB0eXAuQXNzZXRNZXRhZGF0YSkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gYXJyYW5nZXIubmF0aXZlCiAgICBieXRlYyAxNyAvLyAweDUyMzIzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzEKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YS5ieXRlcwogICAgYnl0ZWMgMTkgLy8gIm1ldGFkYXRhIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXRfdXBkYXRlKG1ldGFkYXRhOiBieXRlcykgLT4gdm9pZDoKYXNzZXRfdXBkYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDczLTQ3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIGFzc2V0X3VwZGF0ZShzZWxmLCBtZXRhZGF0YTogdHlwLkFzc2V0TWV0YWRhdGEpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3OC00ODEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgZGlzYWJsZSBELUFTQSBhcHBsaWNhdGlvbiB1cGRhdGFiaWxpdHkgb3IgY2hhbmdlIGl0cyBhdXRob3JpemF0aW9ucy4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleSBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ4MgogICAgLy8gc2VsZi5tZXRhZGF0YSA9IG1ldGFkYXRhLmJ5dGVzCiAgICBieXRlYyAxOSAvLyAibWV0YWRhdGEiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExOC0xMTkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYuYXJyYW5nZXIudmFsdWUsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAweDUyMzIzMDIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NldF9jb25maWcoZGVub21pbmF0aW9uX2Fzc2V0X2lkOiBieXRlcywgc2V0dGxlbWVudF9hc3NldF9pZDogYnl0ZXMsIHByaW5jaXBhbDogYnl0ZXMsIHByaW5jaXBhbF9kaXNjb3VudDogYnl0ZXMsIG1pbmltdW1fZGVub21pbmF0aW9uOiBieXRlcywgZGF5X2NvdW50X2NvbnZlbnRpb246IGJ5dGVzLCBpbnRlcmVzdF9yYXRlOiBieXRlcywgY291cG9uX3JhdGVzOiBieXRlcywgdGltZV9ldmVudHM6IGJ5dGVzLCB0aW1lX3BlcmlvZHM6IGJ5dGVzKSAtPiB2b2lkOgphc3NldF9jb25maWc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0ODQtNDk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhc3NldF9jb25maWcoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHByaW5jaXBhbDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgcHJpbmNpcGFsX2Rpc2NvdW50OiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBtaW5pbXVtX2Rlbm9taW5hdGlvbjogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb246IGFyYzQuVUludDgsCiAgICAvLyAgICAgaW50ZXJlc3RfcmF0ZTogYXJjNC5VSW50MTYsCiAgICAvLyAgICAgY291cG9uX3JhdGVzOiB0eXAuQ291cG9uUmF0ZXMsCiAgICAvLyAgICAgdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzLAogICAgLy8gICAgIHRpbWVfcGVyaW9kczogdHlwLlRpbWVQZXJpb2RzLAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMTAgMAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MjcKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUyOAogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfRU1QVFksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTMwLTUzMQogICAgLy8gIyBTZXQgRGVub21pbmF0aW9uIEFzc2V0CiAgICAvLyBzZWxmLmFzc2VydF9kZW5vbWluYXRpb25fYXNzZXQoZGVub21pbmF0aW9uX2Fzc2V0X2lkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMTAKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTgwCiAgICAvLyBkZW5vbWluYXRpb25fYXNzZXRfaWQgIT0gVUludDY0KDApIGFuZCBBc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQpLmNyZWF0b3IKICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQKICAgIGZyYW1lX2RpZyAzCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCmFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzgtMTgxCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQgIT0gVUludDY0KDApIGFuZCBBc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQpLmNyZWF0b3IKICAgIC8vICksIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODUKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyAxOCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZnJhbWVfZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzQtNTM1CiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuYXNzZXJ0X3NldHRsZW1lbnRfYXNzZXQoc2V0dGxlbWVudF9hc3NldF9pZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTkKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkIGV4aXN0cwogICAgZGlnIDEKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODktMTkyCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyA2IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5Ny0yMDMKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5OQogICAgLy8geGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjAwCiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk3LTE5OAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBpbnRjXzMgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTctMjAzCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQwCiAgICAvLyBwcmluY2lwYWwubmF0aXZlICUgbWluaW11bV9kZW5vbWluYXRpb24ubmF0aXZlID09IDAKICAgIGZyYW1lX2RpZyAtOAogICAgYnRvaQogICAgZnJhbWVfZGlnIC02CiAgICBidG9pCiAgICBkdXAyCiAgICAlCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzgtNTQxCiAgICAvLyAjIFNldCBQcmluY2lwYWwgYW5kIE1pbmltdW0gRGVub21pbmF0aW9uCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByaW5jaXBhbC5uYXRpdmUgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUgPT0gMAogICAgLy8gKSwgZXJyLklOVkFMSURfTUlOSU1VTV9ERU5PTUlOQVRJT04KICAgIGFzc2VydCAvLyBNaW5pbXVtIGRlbm9taW5hdGlvbiBpcyBub3QgYSBkaXZpc29yIG9mIHByaW5jaXBhbAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQyCiAgICAvLyBzZWxmLnVuaXRfdmFsdWUgPSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUKICAgIGJ5dGVjIDkgLy8gInVuaXRfdmFsdWUiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU0MwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHByaW5jaXBhbC5uYXRpdmUgLy8gbWluaW11bV9kZW5vbWluYXRpb24ubmF0aXZlCiAgICAvCiAgICBieXRlYyAxMSAvLyAidG90YWxfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQ0CiAgICAvLyBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCA9IHByaW5jaXBhbF9kaXNjb3VudC5uYXRpdmUKICAgIGZyYW1lX2RpZyAtNwogICAgYnRvaQogICAgYnl0ZWMgMTIgLy8gInByaW5jaXBhbF9kaXNjb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NDYtNTQ3CiAgICAvLyAjIFNldCBEYXktQ291bnQgQ29udmVudGlvbgogICAgLy8gc2VsZi5hc3NlcnRfZGF5X2NvdW50X2NvbnZlbnRpb24oZGF5X2NvdW50X2NvbnZlbnRpb24ubmF0aXZlKQogICAgZnJhbWVfZGlnIC01CiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjA3LTIxMQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZnJhbWVfZGlnIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIxMAogICAgLy8gVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICBwdXNoaW50IDI1NSAvLyAyNTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNy0yMTEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgID09CiAgICBieiBhc3NldF9jb25maWdfYm9vbF9mYWxzZUAxNwoKYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAxNjoKICAgIGludGNfMSAvLyAxCgphc3NldF9jb25maWdfYm9vbF9tZXJnZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNy0yMTEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgIGFzc2VydCAvLyBJbnZhbGlkIGRheS1jb3VudCBjb252ZW50aW9uIElECiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTUKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBkYXlfY291bnRfY29udmVudGlvbgogICAgYnl0ZWMgMTAgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgZnJhbWVfZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NTAtNTUxCiAgICAvLyAjIFNldCBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLmFzc2VydF9pbnRlcmVzdF9yYXRlKGludGVyZXN0X3JhdGUubmF0aXZlKQogICAgZnJhbWVfZGlnIC00CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0My00NAogICAgLy8gIyBUaGlzIHN1YnJvdXRpbmUgbXVzdCBiZSB1c2VkIGFmdGVyIHRoZSBwcmluY2lwYWwgZGlzY291bnQgaGFzIGJlZW4gc2V0CiAgICAvLyBhc3NlcnQgaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCksIGVyci5JTlZBTElEX0lOVEVSRVNUX1JBVEUKICAgIGR1cAogICAgIQogICAgYXNzZXJ0IC8vIEludGVyZXN0IHJhdGUgaXMgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gc2VsZi5pbnRlcmVzdF9yYXRlID0gaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgMjMgLy8gImludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjI5CiAgICAvLyBhc3NlcnQgbm90IGNvdXBvbl9yYXRlcy5sZW5ndGgsIGVyci5JTlZBTElEX0NPVVBPTl9SQVRFUwogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgIQogICAgYXNzZXJ0IC8vIENvdXBvbiByYXRlcyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gc2VsZi50b3RhbF9jb3Vwb25zID0gY291cG9uX3JhdGVzLmxlbmd0aAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjM0CiAgICAvLyBpZiBzZWxmLnRvdGFsX2NvdXBvbnM6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIGJ6IGFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDMwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMzUKICAgIC8vIHNlbGYuY291cG9uX3JhdGVzLnZhbHVlID0gY291cG9uX3JhdGVzLmNvcHkoKQogICAgYnl0ZWMgMjkgLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDI5IC8vIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MwogICAgZnJhbWVfZGlnIC0zCiAgICBib3hfcHV0Cgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0MAogICAgLy8gdGltZV9ldmVudHMubGVuZ3RoID09IHNlbGYudG90YWxfY291cG9ucyArIGNmZy5USU1FX1NDSEVEVUxFX0xJTUlUUwogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgaW50Y18zIC8vIDQKICAgICsKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMzktMjQxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFMKICAgIC8vICksIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NjAKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCh0aW1lX2V2ZW50cykKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjUKICAgIC8vIHNlbGYudGltZV9ldmVudHMudmFsdWUgPSB0aW1lX2V2ZW50cy5jb3B5KCkKICAgIGJ5dGVjIDI0IC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMjQgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjYtMjY4CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICBieXRlYyA4IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjYtMjY4CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2OS0yNzEKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBkdXAKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY5CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgYnl0ZWMgMjAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2OS0yNzEKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjcyCiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgPSB0aW1lX2V2ZW50c1tjZmcuSVNTVUFOQ0VfREFURV9JRFhdLm5hdGl2ZQogICAgZXh0cmFjdCAxNiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnl0ZWMgNyAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzQtMjc1CiAgICAvLyAjIFNvbWUgRC1BU0EgbWF5IG5vdCBoYXZlIGEgbWF0dXJpdHkgZGF0ZSAoZS5nLiwgcGVycGV0dWFscykKICAgIC8vIGlmIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgaW50Y18zIC8vIDQKICAgICsKICAgID09CiAgICBieiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjc2CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0aW1lX2V2ZW50c1tjZmcuTUFUVVJJVFlfREFURV9JRFhdLm5hdGl2ZQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODAKICAgIC8vIGFzc2VydCBub3QgdGltZV9wZXJpb2RzLmxlbmd0aCwgZXJyLklOVkFMSURfVElNRV9QRVJJT0RTCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgIQogICAgYXNzZXJ0IC8vIFRpbWUgcGVyaW9kcyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU2NwogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoY2ZnLlNUQVRVU19BQ1RJVkUpCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBwdXNoaW50IDEwMCAvLyAxMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCmFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDE3OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VAMTgKCmFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NldF9jb25maWdfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCh0aW1lX2V2ZW50czogYnl0ZXMpIC0+IGJ5dGVzOgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQzLTI0NAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHNlbGYsIHRpbWVfZXZlbnRzOiB0eXAuVGltZUV2ZW50cykgLT4gTm9uZToKICAgIHByb3RvIDEgMQogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0NgogICAgLy8gdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0NwogICAgLy8gPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ2LTI0NwogICAgLy8gdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdLm5hdGl2ZQogICAgLy8gPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ1LTI0OAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0ubmF0aXZlCiAgICAvLyAgICAgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLklOVkFMSURfVElNRQogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gZm9yIF90IGluIHVyYW5nZSh0aW1lX2V2ZW50cy5sZW5ndGggLSAxKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18wIC8vIDAKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ5CiAgICAvLyBmb3IgX3QgaW4gdXJhbmdlKHRpbWVfZXZlbnRzLmxlbmd0aCAtIDEpOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX2ZvckA2Cgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX3doaWxlX3RvcEA4OgogICAgcHVzaGludCA3NSAvLyA3NQogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl93aGlsZUAxNAogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDMwIC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgMzAgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgYiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX3doaWxlX3RvcEA4Cgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX3doaWxlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjU0CiAgICAvLyB0aW1lX2kgPSB0aW1lX2V2ZW50c1tfdF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMwogICAgc3dhcAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1NQogICAgLy8gdGltZV9mID0gdGltZV9ldmVudHNbX3QgKyAxXS5uYXRpdmUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTYKICAgIC8vIGFzc2VydCB0aW1lX2YgPiB0aW1lX2ksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIDwKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1NwogICAgLy8gaWYgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiAhPSBVSW50NjQoY3N0LkRDQ19DT05UKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBwdXNoaW50IDI1NSAvLyAyNTUKICAgICE9CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjU4LTI1OQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRpbWUgcGVyaW9kcyBleHByZXNzZWQgaW4gZGF5cyBmb3IgcmVndWxhciBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCAodGltZV9mIC0gdGltZV9pKSAlIFVJbnQ2NCgKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjU4LTI2MQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRpbWUgcGVyaW9kcyBleHByZXNzZWQgaW4gZGF5cyBmb3IgcmVndWxhciBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCAodGltZV9mIC0gdGltZV9pKSAlIFVJbnQ2NCgKICAgIC8vICAgICBjc3QuREFZXzJfU0VDCiAgICAvLyApID09IDAsIGVyci5JTlZBTElEX1RJTUVfUEVSSU9ECiAgICBpbnRjIDUgLy8gODY0MDAKICAgICUKICAgICEKICAgIGFzc2VydCAvLyBUaW1lIHBlcmlvZHMgaW4gQWN0dWFsL0FjdHVhbCBkYXkgY291bnQgY29udmVudGlvbiBtdXN0IGJlIG11bHRpcGxlcyBvZiBhIGRheSAoaW4gc2Vjb25kcykKICAgIGIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDEKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDY6CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cyhzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzOiBieXRlcykgLT4gYnl0ZXM6CnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NjktNTcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKAogICAgLy8gICAgIHNlbGYsIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzCiAgICAvLyApIC0+IHR5cC5TZWNvbmRhcnlNYXJrZXRTY2hlZHVsZToKICAgIHByb3RvIDEgMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5MAogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjIDYgLy8gMjAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTkxCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTkyCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5NAogICAgLy8gYXNzZXJ0IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID49IDEsIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTUKICAgIC8vIGlmIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID4gMToKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTYKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMQogICAgZnJhbWVfYnVyeSAxCgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTgKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5OS02MDEKICAgIC8vIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5OC02MDEKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gPD0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgZGlnIDEKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTctNjAyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gICAgIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vICAgICBdLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX09QRU5JTkdfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBvcGVuaW5nIGRhdGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwMwogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyAxNCAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDMtNjA1CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwNgogICAgLy8gaWYgc2VsZi5tYXR1cml0eV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDgKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxMAogICAgLy8gY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwOS02MTEKICAgIC8vID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwOC02MTEKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgZGlnIDEKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDctNjEyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gICAgID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vICAgICBdLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX0NMT1NVUkVfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBjbG9zdXJlIGRhdGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxMwogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTMtNjE1CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjE4CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjE3LTYxOQogICAgLy8gc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyMQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyMC02MjIKICAgIC8vIHNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTYtNjIzCiAgICAvLyByZXR1cm4gdHlwLlNlY29uZGFyeU1hcmtldFNjaGVkdWxlKAogICAgLy8gICAgIHNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgICAgICBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gICAgICksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzaWduX3JvbGUocm9sZV9hZGRyZXNzOiBieXRlcywgcm9sZTogYnl0ZXMsIGNvbmZpZzogYnl0ZXMpIC0+IGJ5dGVzOgphc3NpZ25fcm9sZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyNS02MjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2lnbl9yb2xlKAogICAgLy8gICAgIHNlbGYsIHJvbGVfYWRkcmVzczogYXJjNC5BZGRyZXNzLCByb2xlOiBhcmM0LlVJbnQ4LCBjb25maWc6IGFyYzQuRHluYW1pY0J5dGVzCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDYKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0NwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ5CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgcHVzaGludCAyMCAvLyAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgtNjU1CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUxCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MCAvLyA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MgogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MCAvLyA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MwogICAgLy8gVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwIC8vIDcwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgtNjU1CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU0CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0OC02NTUKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBhc3NpZ25fcm9sZV9ib29sX2ZhbHNlQDcKCmFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18xIC8vIDEKCmFzc2lnbl9yb2xlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0OC02NTUKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU3CiAgICAvLyBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICBwdXNoaW50cyAyMCA0MCA1MCA2MCA3MCA4MCAvLyAyMCwgNDAsIDUwLCA2MCwgNzAsIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTYtNjg1CiAgICAvLyBtYXRjaCByb2xlLm5hdGl2ZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MubmF0aXZlCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICAgICAgICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoKQogICAgZnJhbWVfZGlnIDAKICAgIG1hdGNoIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzBAOSBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8xQDEwIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzJAMTEgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzVAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4NQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfNUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3OQogICAgLy8gcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgYnl0ZWMgMzEgLy8gMHg1MjM4MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzgtNjgwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4MgogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjgxLTY4MwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gKQogICAgYm94X3B1dAoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4NgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgc3dhcAogICAgcmV0c3ViCgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njc1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNSAvLyAweDUyMzczMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzYKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzNAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNiAvLyAweDUyMzYzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzMKICAgIC8vIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgYm94X3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8yQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI3IC8vIDB4NTIzNTMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2OQogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY4LTY3MAogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICBjb25maWcubmF0aXZlCiAgICAvLyApCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzFAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjEKICAgIC8vIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDI4IC8vIDB4NTIzNDMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjYwLTY2MgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjQKICAgIC8vIGNvbmZpZy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2My02NjUKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICkKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMEA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU4CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzLm5hdGl2ZQogICAgYnl0ZWMgMTcgLy8gMHg1MjMyMzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NpZ25fcm9sZV9ib29sX21lcmdlQDgKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5yZXZva2Vfcm9sZShyb2xlX2FkZHJlc3M6IGJ5dGVzLCByb2xlOiBieXRlcykgLT4gYnl0ZXM6CnJldm9rZV9yb2xlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njg4LTY4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcmV2b2tlX3JvbGUoc2VsZiwgcm9sZV9hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHJvbGU6IGFyYzQuVUludDgpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDYKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwNwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDgKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA5CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzEwCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MCAvLyA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4LTcxNAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTEKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIHB1c2hpbnQgNjAgLy8gNjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzEyCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAgLy8gNzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzEzCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogcmV2b2tlX3JvbGVfYm9vbF9mYWxzZUA2CgpyZXZva2Vfcm9sZV9ib29sX3RydWVANToKICAgIGludGNfMSAvLyAxCgpyZXZva2Vfcm9sZV9ib29sX21lcmdlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDgtNzE0CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTYtNzE3CiAgICAvLyAjIEFycmFuZ2VyIHJvbGUgY2FuIG5vdCBiZSByZXZva2VkIChqdXN0IHJvdGF0ZWQpCiAgICAvLyBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludHMgNDAgNTAgNjAgNzAgODAgLy8gNDAsIDUwLCA2MCwgNzAsIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTUtNzMzCiAgICAvLyBtYXRjaCByb2xlLm5hdGl2ZToKICAgIC8vICAgICAjIEFycmFuZ2VyIHJvbGUgY2FuIG5vdCBiZSByZXZva2VkIChqdXN0IHJvdGF0ZWQpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BQ0NPVU5UX01BTkFHRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfUFJJTUFSWV9ERUFMRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1RSVVNURUUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BVVRIT1JJVFkgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmludGVyZXN0X29yYWNsZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9JTlRFUkVTVF9PUkFDTEUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoKQogICAgZnJhbWVfZGlnIDAKICAgIG1hdGNoIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzBAOCByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8xQDkgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMCByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8zQDExIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzRAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczMwogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfNEAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczMAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmludGVyZXN0X29yYWNsZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMSAvLyAweDUyMzgzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MzEKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9JTlRFUkVTVF9PUkFDTEUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MzQKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHN3YXAKICAgIHJldHN1YgoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyNwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNSAvLyAweDUyMzczMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjgKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BVVRIT1JJVFkgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyNAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjYgLy8gMHg1MjM2MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzI1CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfVFJVU1RFRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8xQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNyAvLyAweDUyMzUzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjIKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9QUklNQVJZX0RFQUxFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8wQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTgKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjggLy8gMHg1MjM0MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzE5CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQUNDT1VOVF9NQU5BR0VSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX2Jvb2xfZmFsc2VANjoKICAgIGludGNfMCAvLyAwCiAgICBiIHJldm9rZV9yb2xlX2Jvb2xfbWVyZ2VANwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLm9wZW5fYWNjb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBwYXltZW50X2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKb3Blbl9hY2NvdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzM2LTczOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgb3Blbl9hY2NvdW50KAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCBwYXltZW50X2FkZHJlc3M6IGFyYzQuQWRkcmVzcwogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU2CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50YyA2IC8vIDIwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLnN0YXR1c19pc19lbmRlZCgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICAhCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1OAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTkKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzYwCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY0CiAgICAvLyB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgYnl0ZWMgNSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2Mi03NjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjUKICAgIC8vIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDUgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY2CiAgICAvLyBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDUgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY3CiAgICAvLyBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICBieXRlYyAxNiAvLyAweDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY5CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIyLTEyMwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDI4IC8vIDB4NTIzNDMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2LTEyOQogICAgLy8gY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjcKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyOAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNy0xMjgKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjkKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyOC0xMjkKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI1LTEzMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuY2xvc2VfYWNjb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKY2xvc2VfYWNjb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc3MS03NzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGNsb3NlX2FjY291bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MKICAgIC8vICkgLT4gYXJjNC5UdXBsZVthcmM0LlVJbnQ2NCwgYXJjNC5VSW50NjRdOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODkKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzkwCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3NAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3OTMKICAgIC8vIGNsb3NlZF91bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzk0CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQUNDT1VOVCArIGhvbGRpbmdfYWRkcmVzcy5ieXRlcykKICAgIHN3YXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzk1CiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIC09IGNsb3NlZF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZGlnIDEKICAgIC0KICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5NgogICAgLy8gc2VsZi5lbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoKQogICAgY2FsbHN1YiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5OAogICAgLy8gKGFyYzQuVUludDY0KGNsb3NlZF91bml0cyksIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSkKICAgIGl0b2IKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5Ny03OTkKICAgIC8vIHJldHVybiBhcmM0LlR1cGxlKAogICAgLy8gICAgIChhcmM0LlVJbnQ2NChjbG9zZWRfdW5pdHMpLCBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkpCiAgICAvLyApCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnByaW1hcnlfZGlzdHJpYnV0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiBieXRlcykgLT4gYnl0ZXM6CnByaW1hcnlfZGlzdHJpYnV0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODAxLTgwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcHJpbWFyeV9kaXN0cmlidXRpb24oCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHVuaXRzOiBhcmM0LlVJbnQ2NAogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDQKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMCAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODktMjkyCiAgICAvLyBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTAKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkwLTI5MQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5MC0yOTIKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkyCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTEtMjkyCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgZnJhbWVfZGlnIDIKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5MC0yOTIKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgaW50Y18xIC8vIDEKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4OC0yOTMKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vICAgICBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNgogICAgLy8gY2FsbGVyIGluIHNlbGYucHJpbWFyeV9kZWFsZXIKICAgIGJ5dGVjIDI3IC8vIDB4NTIzNTMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNi0xMzkKICAgIC8vIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kZWFsZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNy0xMzgKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNy0xMzkKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM5CiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2RlYWxlciBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM4LTEzOQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM3LTEzOQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyCiAgICBpbnRjXzEgLy8gMQoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNS0xNDAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYucHJpbWFyeV9kZWFsZXIKICAgIC8vICAgICBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODI5CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzEKICAgIC8vIGFzc2VydCB1bml0cy5uYXRpdmUgPiAwLCBlcnIuWkVST19VTklUUwogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMzCiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICsgdW5pdHMubmF0aXZlIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMi04MzQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5jaXJjdWxhdGluZ191bml0cyArIHVuaXRzLm5hdGl2ZSA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICAvLyApLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzYKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKz0gdW5pdHMubmF0aXZlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM3LTgzOQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM3LTgzOQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIC8vICkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDMyCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gYXJjNC5VSW50NjQoc2VsZi51bml0X3ZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgIGl0b2IKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmVwbGFjZTIgNDAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0MQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMgLSBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIC0KICAgIGl0b2IKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyOgogICAgaW50Y18wIC8vIDAKICAgIGIgcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUAxMwoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUA2CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X2Fzc2V0X3N1c3BlbnNpb24oc3VzcGVuZGVkOiBieXRlcykgLT4gYnl0ZXM6CnNldF9hc3NldF9zdXNwZW5zaW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQzLTg0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgc2V0X2Fzc2V0X3N1c3BlbnNpb24oc2VsZiwgc3VzcGVuZGVkOiBhcmM0LkJvb2wpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NTcKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODU4CiAgICAvLyBzZWxmLnN1c3BlbmRlZCA9IFVJbnQ2NChzdXNwZW5kZWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBieXRlYyAyMSAvLyAic3VzcGVuZGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg1OQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoKSAtPiB2b2lkOgphc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1Mi0xNTMKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICBieXRlYyAyNSAvLyAweDUyMzczMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTQKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1Ni0xNTkKICAgIC8vIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU3CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXV0aG9yaXR5IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTgKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTctMTU4CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGI8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU3LTE1OQogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU5CiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXV0aG9yaXR5IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTgtMTU5CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU3LTE1OQogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NS0xNjAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICAvLyAgICAgYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnNldF9hY2NvdW50X3N1c3BlbnNpb24oaG9sZGluZ19hZGRyZXNzOiBieXRlcywgc3VzcGVuZGVkOiBieXRlcykgLT4gYnl0ZXM6CnNldF9hY2NvdW50X3N1c3BlbnNpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NjEtODY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfYWNjb3VudF9zdXNwZW5zaW9uKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCBzdXNwZW5kZWQ6IGFyYzQuQm9vbAogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODc5CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5KCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3NAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODEKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBpbnRjIDQgLy8gNDQ4CiAgICBzd2FwCiAgICBzZXRiaXQKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4MgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X2RlZmF1bHRfc3RhdHVzKGRlZmF1bHRlZDogYnl0ZXMpIC0+IHZvaWQ6CnNldF9kZWZhdWx0X3N0YXR1czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4NC04ODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9kZWZhdWx0X3N0YXR1cyhzZWxmLCBkZWZhdWx0ZWQ6IGFyYzQuQm9vbCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgYnl0ZWMgMjYgLy8gMHg1MjM2MzAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ0CiAgICAvLyBjYWxsZXIgPSBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ2LTE0OQogICAgLy8gY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ3CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRydXN0ZWUgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0OAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Ny0xNDgKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGI8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ3LTE0OQogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ5CiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRydXN0ZWUgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0OC0xNDkKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ3LTE0OQogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANQogICAgaW50Y18xIC8vIDEKCnNldF9kZWZhdWx0X3N0YXR1c19ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDUtMTUwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIC8vICAgICBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODk2CiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IFVJbnQ2NChkZWZhdWx0ZWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBieXRlYyAyMiAvLyAiZGVmYXVsdGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIHNldF9kZWZhdWx0X3N0YXR1c19ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfYXNzZXRfaW5mbygpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfaW5mbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5OC04OTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF9pbmZvKHNlbGYpIC0+IHR5cC5Bc3NldEluZm86CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwOAogICAgLy8gcGVyZm9ybWFuY2UgPSBVSW50NjQoY3N0LlBSRl9QRVJGT1JNQU5UKQogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTA5CiAgICAvLyBpZiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+IHNlbGYubWF0dXJpdHlfZGF0ZSA+IDA6CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvdmVyIDQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICA+CiAgICBieiBnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDMKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyAxCiAgICBieiBnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMAogICAgLy8gcGVyZm9ybWFuY2UgPSBVSW50NjQoY3N0LlBSRl9NQVRVUkVEKQogICAgaW50Y18zIC8vIDQKICAgIGZyYW1lX2J1cnkgMgoKZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUAzOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTExLTkxMgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBubyBncmFjZSBvciBkZWxpbnF1ZW5jeSBwZXJpb2RzCiAgICAvLyBpZiBzZWxmLmRlZmF1bHRlZDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMiAvLyAiZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlZmF1bHRlZCBleGlzdHMKICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTEzCiAgICAvLyBwZXJmb3JtYW5jZSA9IFVJbnQ2NChjc3QuUFJGX0RFRkFVTFRFRCkKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBmcmFtZV9idXJ5IDAKCmdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNgogICAgLy8gZGVub21pbmF0aW9uX2Fzc2V0X2lkPWFyYzQuVUludDY0KHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNwogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM0MAogICAgLy8gcmV0dXJuIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTgKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCgpKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxOQogICAgLy8gdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NChzZWxmLnVuaXRfdmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyMAogICAgLy8gZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBpdG9iCiAgICBleHRyYWN0IDcgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTIxCiAgICAvLyBwcmluY2lwYWxfZGlzY291bnQ9YXJjNC5VSW50MTYoc2VsZi5wcmluY2lwYWxfZGlzY291bnQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJwcmluY2lwYWxfZGlzY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50IGV4aXN0cwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyMgogICAgLy8gaW50ZXJlc3RfcmF0ZT1hcmM0LlVJbnQxNihzZWxmLmludGVyZXN0X3JhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIzIC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTIzCiAgICAvLyB0b3RhbF9zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi50b3RhbF91bml0cyksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTI0CiAgICAvLyBjaXJjdWxhdGluZ19zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi5jaXJjdWxhdGluZ191bml0cyksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyNS05MjcKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyOQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyOC05MzAKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzMQogICAgLy8gaXNzdWFuY2VfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLmlzc3VhbmNlX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzMgogICAgLy8gbWF0dXJpdHlfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLm1hdHVyaXR5X2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzMwogICAgLy8gc3VzcGVuZGVkPWFyYzQuQm9vbChib29sKHNlbGYuc3VzcGVuZGVkKSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gInN1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdXNwZW5kZWQgZXhpc3RzCiAgICBieXRlYyAxNiAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNAogICAgLy8gcGVyZm9ybWFuY2U9YXJjNC5VSW50OChwZXJmb3JtYW5jZSksCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNS05MzUKICAgIC8vIHJldHVybiB0eXAuQXNzZXRJbmZvKAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCksCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLAogICAgLy8gICAgIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCgpKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSksCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIC8vICAgICBwcmluY2lwYWxfZGlzY291bnQ9YXJjNC5VSW50MTYoc2VsZi5wcmluY2lwYWxfZGlzY291bnQpLAogICAgLy8gICAgIGludGVyZXN0X3JhdGU9YXJjNC5VSW50MTYoc2VsZi5pbnRlcmVzdF9yYXRlKSwKICAgIC8vICAgICB0b3RhbF9zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi50b3RhbF91bml0cyksCiAgICAvLyAgICAgY2lyY3VsYXRpbmdfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMpLAogICAgLy8gICAgIHByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICApLAogICAgLy8gICAgIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIC8vICAgICApLAogICAgLy8gICAgIGlzc3VhbmNlX2RhdGU9YXJjNC5VSW50NjQoc2VsZi5pc3N1YW5jZV9kYXRlKSwKICAgIC8vICAgICBtYXR1cml0eV9kYXRlPWFyYzQuVUludDY0KHNlbGYubWF0dXJpdHlfZGF0ZSksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbChib29sKHNlbGYuc3VzcGVuZGVkKSksCiAgICAvLyAgICAgcGVyZm9ybWFuY2U9YXJjNC5VSW50OChwZXJmb3JtYW5jZSksCiAgICAvLyApCiAgICB1bmNvdmVyIDE0CiAgICB1bmNvdmVyIDE0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X2FjY291bnRfaW5mbyhob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2FjY291bnRfaW5mbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNy05MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hY2NvdW50X2luZm8oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MpIC0+IHR5cC5BY2NvdW50SW5mbzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1MgogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X3RpbWVfZXZlbnRzKCkgLT4gYnl0ZXM6CmdldF90aW1lX2V2ZW50czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1NC05NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF90aW1lX2V2ZW50cyhzZWxmKSAtPiB0eXAuVGltZUV2ZW50czoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTYyCiAgICAvLyB0aW1lX2V2ZW50cyA9IHR5cC5UaW1lRXZlbnRzKCkKICAgIHB1c2hieXRlcyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2MwogICAgLy8gaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCk6CiAgICBieiBnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NjQKICAgIC8vIHRpbWVfZXZlbnRzID0gc2VsZi50aW1lX2V2ZW50cy52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDI0IC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9ldmVudHMgZXhpc3RzCgpnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTY1CiAgICAvLyByZXR1cm4gdGltZV9ldmVudHMKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSgpIC0+IGJ5dGVzOgpnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2Ny05NjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlKHNlbGYpIC0+IHR5cC5UaW1lRXZlbnRzOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NzYKICAgIC8vIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk3NwogICAgLy8gYXJjNC5VSW50NjQoc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTc1LTk3OAogICAgLy8gcmV0dXJuIHR5cC5UaW1lRXZlbnRzKAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUpLAogICAgLy8gKQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hc3NldF9tZXRhZGF0YSgpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbWV0YWRhdGE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5ODAtOTgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbWV0YWRhdGEoc2VsZikgLT4gdHlwLkFzc2V0TWV0YWRhdGE6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk4OQogICAgLy8gcmV0dXJuIHR5cC5Bc3NldE1ldGFkYXRhLmZyb21fYnl0ZXMoc2VsZi5tZXRhZGF0YSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAibWV0YWRhdGEiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWV0YWRhdGEgZXhpc3RzCiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "byteCode": { + "approval": "CiAHAAEIBMADgKMFyAEmIAQVH3x1EWNpcmN1bGF0aW5nX3VuaXRzBFIzMCMGc3RhdHVzDW1hdHVyaXR5X2RhdGUIAAAAAAAAAAATc2V0dGxlbWVudF9hc3NldF9pZA1pc3N1YW5jZV9kYXRlIXByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQp1bml0X3ZhbHVlFGRheV9jb3VudF9jb252ZW50aW9uC3RvdGFsX3VuaXRzEnByaW5jaXBhbF9kaXNjb3VudA10b3RhbF9jb3Vwb25zHXNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlHXNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlAQAEUjIwIxVkZW5vbWluYXRpb25fYXNzZXRfaWQIbWV0YWRhdGEhcHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCXN1c3BlbmRlZAlkZWZhdWx0ZWQNaW50ZXJlc3RfcmF0ZQp0aW1lRXZlbnRzBFI3MCMEUjYwIwRSNTAjBFI0MCMLY291cG9uUmF0ZXMDBoEBBFI4MCMxGEAAZCcRMgNnJxIiZycGImcnCSJnJwoiZycTgABnJwsiZykiZycMImcnFyJnJw0iZycIImcnFCJnJwciZycOImcnDyJnJwQiZysiZycVImcnFiJnMTWBAhJEMTSBEhJEMTcURDE2FEQxG0EAmoIVBE/Wo8wEnHa2owRENj1JBGfbTyAEPw78bAQl26lbBIlHQTQEHW/CVQT+90VnBLj8E5AEPUPR8ATr2WsvBGyF4+4E9jrOjQS7zKGKBBp7q7QEQC26RwTtAnWfBPrSFz4ECO/qNQTkpatUNhoAjhUBmgGEAW4BWwFIATgBDgD7AOIAzAC2AKMAjQB6AGQAVQBFADIAIgASAAIiQzEZFEQxGESIDAIoTFCwI0MxGRREMRhEiAvbKExQsCNDMRkURDEYRIgLryhMULAjQzEZFEQxGEQ2GgGIC40oTFCwI0MxGRREMRhEiAqxKExQsCNDMRkURDEYRDYaAYgKYSNDMRkURDEYRDYaATYaAogKMChMULAjQzEZFEQxGEQ2GgGICdYoTFCwI0MxGRREMRhENhoBNhoCiAkBKExQsCNDMRkURDEYRDYaAYgIvyhMULAjQzEZFEQxGEQ2GgE2GgKICEIoTFCwI0MxGRREMRhENhoBNhoCiAeQKExQsCNDMRkURDEYRDYaATYaAjYaA4gGryhMULAjQzEZFEQxGEQ2GgGIBh8oTFCwI0MxGRREMRhENhoBNhoCNhoDNhoENhoFNhoGNhoHNhoINhoJNhoKiARPI0MxGSUSRDEYRDYaAYgEJiNDMRkURDEYFEQ2GgE2GgKIBAUjQzEZFEQxGEQ2GgGIA9AoTFCwI0MxGRREMRhENhoBNhoCiALsKExQsCNDMRkURDEYRDYaATYaAogB+ChMULAjQzEZFEQxGEQ2GgE2GgI2GgOIAAYoTFCwI0OKAwEiRwKAAEmL/xciK2VEgWQSQQEyIicOZUQyB0mMBA5BASQiJw9lRIsEDUEBGSNEMQCL/RJEiAESiAEaKov9UEmMAUm9RQFEKov+UEmMAkm9RQFESwG+RCEEUycQIk8CVCJTFERJvkQhBFMnECJPAlQiUxRESwG+RFcgCBeLBQ9ETL5EVygIjAC+RFcgCBdBAJaLAb5EVygIiwK+RFcoCKhBAICLAb5EVzAIiwK+RFcwCKhBAG4jRIsBSb5EVygIjACL/YsFSU4DiACVjANJvkRXIAgXSwIJFksBvkRMXCBLAUy/iwJJvkRXIAgXTwMIFksBvkRMXCC/vkRXIAgXQAAViwFJvkQnBVwoSwFMv0m+RCcFXDC/iwAXiwULiwMIFowAiSJC/4+LAkm+RIsAXChLAUy/iwG+REsBvkRMVzAIXDC/Qv9xIkL+5IoAACInFmVEFESJigAAIicVZUQURImKAgGIACJJVwAIF0xXCAgXi/6L/4gATyInDGVEC08CC4GQTk8CCwqJigABMgciJwdlRAlJIicEZUQiJwdlRAlJTgIiJwplRExOAkAADosAIQUKiwEhBQqMAowDiwKLAxZMFlCMAImKAgEqi/5QvkRXKAgXi/8LiYoCASIrZUSBZBJEiP9liP9tKov+UEcCvUUBREm+RFcgCBdEMgciJwRlRA9EvkRXACAiJwZlRHAARQFBAHqLAL5EIQRTJxAiTwJUIlNAAGgjQQBgi/6IAGNJMgoiJwZlRHAAREsBD0SLAL5EVwAgsTIAIicGZURPA7ISTwKyFLIRJbIQsgGzIillRIsASU4CvkRXIAgXCSlMZ0m+RCcFXCC/iAArFjIHFlCAAgASUIv/UEyJIkL/zyJC/5WKAQEqi/9QvkRXIAgXi/9MiP8hiYoAACIpZURAAAQrIQZniYoCASKAAEcGIicIZURBALoyByInCGVED0EAryNEKov+UEmMAL1FAUSL/ycFpUEAlosAvkRXIAgXFov/p0EAhyNEi/8XSYwHi/5MiP7ESYwCIicMZURLAQuBkE4KCYwBIowDIowGIowFIicHZUQyB0mMBA5BAEwiJwRlRIsEDUEAQSNBABmI/kuL/osHiP4cjANJVwAIF4wGVwgIF4wFMgciJwRlRA9BAASLAowBiwEWiwMWiwYWiwUWUE4CUExQjACJIkL/vCJC/3YiQv9OigEBKov/UL1FAUQiSStlRIFkEkEAB4v/iP70jACLABYnBUxQTImKAgAnEYv+ZycTi/9niYoBAIgABicTi/9niYoAADEAIicRZUQSRImKCgAigABJiP/pIitlRBREi/YXSUEBA4sDcQtEMgMTQQD4I0QnEosDZ4v3FyInEmVESwESRCcGTGexMgAiJwZlRDIKIrISshSyESWyELIBs4v4F4v6F0oYFEQnCUsBZwonC0xni/kXJwxMZ4v7F0mMAUEACYsBgf8BEkEAmSNEJwqLAWeL/BdJFEQnF0xni/0iWUkURCcNTGciJw1lREEACScdvEgnHYv9v4v+IlkiJw1lRCUIEkSL/ogAYoz+Jxi8SCcYi/6/i/5XAgBJjABJVwAIFycITGdJVwgIFycUTGdXEAgXJwdMZ4v+IllJjAIiJw1lRCUIEkEAEIsCIwkkC4sATCRYFycETGeL/yJZFEQrgWRniSJC/2QiQv8FigEBgABJi/9XAgBJVwAIFzIHDUSL/yJZIwkiiwSLAwxBAFyBSzIMDUEAGbGBBrIQgQWyGScesh4nHrIfMgCyAbNC/9+LBEkkC4sCSU4DTCRYF0lOA4wBIwhJjAQkCyRYF0mMAAxEIicKZUSB/wETQf+piwCLAQkhBRgUREL/nIv/jACJigEBIoj+SiIrZUQhBhIURIj7xYv/IllJRCMNi/9MQQAKi/+I/1ZJjP+MAYsBjP8iJwdlRIv/VwIASYwAVwAIF0xLAQ5EJw5MZyInBGVEQQAcIicEZUSL/yJZIwkkC4sATCRYF0xLAQ9EJw9MZyInDmVEFiInD2VEFlCMAImKAwGI/c6I+1KL/hdJgRQSQAAoiwCBKBJAACCLAIEyEkAAGIsAgTwSQAAQiwCBRhJAAAiLAIFQEkEAiSNEgwYUKDI8RlCLAI4GAGcAUwA/ACsAFwABACcfi/1QSb1FARREi/9XAgC/MgcWTIknGYv9UEm9RQEURIv/VwIAv0L/5ycai/1QSb1FARREi/9XAgC/Qv/TJxuL/VBJvUUBFESL/1cCAL9C/78nHIv9UEm9RQEURIv/VwIAv0L/qycRi/1nQv+jIkL/dIoCAYj9Boj6iov/F0mBKBJAACCLAIEyEkAAGIsAgTwSQAAQiwCBRhJAAAiLAIFQEkEAZSNEgwUoMjxGUIsAjgUAPwAwACEAEgABACcfi/5QSb1FAUS8SDIHFkyJJxmL/lBJvUUBRLxIQv/sJxqL/lBJvUUBRLxIQv/dJxuL/lBJvUUBRLxIQv/OJxyL/lBJvUUBRLxIQv+/IkL/mIoCAYgALCIrZUQhBhIURIj55Yj57SqL/lBJvUUBFESL/ycFUCcFUCcFUCcQUL8yBxaJigAAIiccMQBQSb1FAUEAIYsBvkRXAAgyBxZJjACmQQAQiwG+RFcICIsAp0EAAyNEiSJC//qKAQGI/8WI+Ycqi/9QSb1FAURJvkRXIAgXTLxIIillREsBCSlMZ4j6wxYyBxZQiYoCASJJgAAiK2VEgWQSQQCqIicIZUQyB0mMAg5BAJwiJxRlRIsCDUEAkSNEJxsxAFBJjAC9RQFBAH2LAL5EVwAIMgcWSYwBpkEAbIsAvkRXCAiLAadBAF8jRCqL/lBJvUUBRIj4+4j5A4v/F0lEIillREsBCCInC2VEDkQiKWVESwEIKUxnSwG+RFcgCBcIFksBvkRMXCBLAUy/IicJZUQWSwG+RExcKL8iJwtlRCIpZUQJFowAiSJC/54iQv9sigEBiAAMi/8iUycVTGcyBxaJigAAIicZMQBQSb1FAUEAIYsBvkRXAAgyBxZJjACmQQAQiwG+RFcICIsAp0EAAyNEiSJC//qKAgGI/8Uqi/5QSb1FAURJvkSL/yJTIQRMVL8yBxaJigEAIicaMQBQSb1FAUEAKYsBvkRXAAgyBxZJjACmQQAYiwG+RFcICIsAp0EACyNEi/8iUycWTGeJIkL/8ooAASJJMgciJwRlTElOAk4ERA1BAAyLAIwCiwFBAAMljAKLAowAIicWZURBAASBA4wAIicSZUQWIicGZUQWIillRCInCWVECxYiJwllRBYiJwplRBZXBwEiJwxlRBZXBgIiJxdlRBZXBgIiJwtlRBYiKWVEFiInCGVEFiInFGVEFiInB2VEFiInBGVEFiInFWVEJxAiTwJUiwAWVwcBTw5PDlBPDVBPDFBPC1BPClBPCVBPCFBPB1BPBlBPBVBPBFBPA1BPAlBMUIwAiYoBASqL/1BJvUUBRL5EiYoAAYACAAAiK2VEgWQSQQAHJxi+TIwARIsATImKAAEiJw5lRBYiJw9lRBZQgAIAAkxQiYoAASInE2VEiQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 4, + "minor": 2, + "patch": 1 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/smart_contracts/artifacts/zero_coupon_bond/zero_coupon_bond_client.py b/smart_contracts/artifacts/zero_coupon_bond/zero_coupon_bond_client.py index 28e3dbc..7ae6939 100644 --- a/smart_contracts/artifacts/zero_coupon_bond/zero_coupon_bond_client.py +++ b/smart_contracts/artifacts/zero_coupon_bond/zero_coupon_bond_client.py @@ -19,7 +19,7 @@ import algokit_utils from algokit_utils import AlgorandClient as _AlgoKitAlgorandClient -_APP_SPEC_JSON = r"""{"arcs": [], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Sender Account Holding Address", "name": "sender_holding_address"}, {"type": "address", "desc": "Receiver Account Holding Address", "name": "receiver_holding_address"}, {"type": "uint64", "desc": "Amount of D-ASA units to transfer", "name": "units"}], "name": "asset_transfer", "returns": {"type": "uint64", "desc": "Transferred actualized value in denomination asset"}, "desc": "Transfer D-ASA units between accounts", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "byte[]", "desc": "Additional payment information (Optional)", "name": "payment_info"}], "name": "pay_principal", "returns": {"type": "(uint64,uint64,byte[])", "desc": "Paid amount in denomination asset, Payment timestamp, Payment context", "struct": "PaymentResult"}, "desc": "Pay the outstanding principal and interest to an account", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "uint64", "desc": "Account's units for the current value calculation", "name": "units"}], "name": "get_account_units_current_value", "returns": {"type": "(uint64,uint64,(uint64,uint64))", "desc": "Units current value in denomination asset, Accrued interest in denomination asset", "struct": "CurrentUnitsValue"}, "desc": "Get account's units current value and accrued interest", "events": [], "readonly": true}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "get_payment_amount", "returns": {"type": "(uint64,uint64)", "desc": "Interest amount in denomination asset, Principal amount in denomination asset", "struct": "PaymentAmounts"}, "desc": "Get the next payment amount", "events": [], "readonly": true}, {"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA Arranger Address", "name": "arranger"}, {"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "desc": "D-ASA metadata", "name": "metadata", "struct": "AssetMetadata"}], "name": "asset_create", "returns": {"type": "void"}, "desc": "Create a new D-ASA", "events": []}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [{"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "name": "metadata", "struct": "AssetMetadata"}], "name": "asset_update", "returns": {"type": "void"}, "desc": "Update D-ASA application.", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Denomination asset identifier", "name": "denomination_asset_id"}, {"type": "uint64", "desc": "Settlement asset identifier", "name": "settlement_asset_id"}, {"type": "uint64", "desc": "Principal, expressed in denomination asset", "name": "principal"}, {"type": "uint64", "desc": "Principal discount in bps", "name": "principal_discount"}, {"type": "uint64", "desc": "Minimum denomination, expressed in denomination asset", "name": "minimum_denomination"}, {"type": "uint8", "desc": "Day-count convention for interests calculation", "name": "day_count_convention"}, {"type": "uint16", "desc": "Interest rate in bps", "name": "interest_rate"}, {"type": "uint16[]", "desc": "Coupon interest rates in bps", "name": "coupon_rates"}, {"type": "uint64[]", "desc": "Time events (strictly ascending order)", "name": "time_events"}, {"type": "(uint64,uint64)[]", "desc": "Time periods of recurring time events", "name": "time_periods"}], "name": "asset_config", "returns": {"type": "void"}, "desc": "Configure the Debt Algorand Standard Application", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64[]", "desc": "Secondary market time events (strictly ascending order)", "name": "secondary_market_time_events"}], "name": "set_secondary_time_events", "returns": {"type": "(uint64,uint64)", "desc": "Secondary Market Opening Date, Secondary Market Closure Date", "struct": "SecondaryMarketSchedule"}, "desc": "Set secondary market time schedule", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "uint8", "desc": "Role identifier", "name": "role"}, {"type": "byte[]", "desc": "Role configuration (Optional)", "name": "config"}], "name": "assign_role", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Assign a role to an address", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "uint8", "desc": "Role identifier", "name": "role"}], "name": "revoke_role", "returns": {"type": "uint64", "desc": "Timestamp of the role revocation"}, "desc": "Revoke a role from an address", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "open_account", "returns": {"type": "uint64", "desc": "Timestamp of the account opening"}, "desc": "Open D-ASA account", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "close_account", "returns": {"type": "(uint64,uint64)", "desc": "Closed units, Timestamp of the account closing"}, "desc": "Close D-ASA account", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "uint64", "desc": "Amount of D-ASA units to distribute", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64", "desc": "Remaining D-ASA units to be distributed"}, "desc": "Distribute D-ASA units to accounts according the primary market", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "set_asset_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set asset suspension status"}, "desc": "Set asset suspension status", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "set_account_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set account suspension status"}, "desc": "Set account suspension status", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Default status", "name": "defaulted"}], "name": "set_default_status", "returns": {"type": "void"}, "desc": "Set D-ASA default status", "events": []}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_asset_info", "returns": {"type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Performance", "struct": "AssetInfo"}, "desc": "Get D-ASA info", "events": [], "readonly": true}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "get_account_info", "returns": {"type": "(address,uint64,uint64,uint64,bool)", "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended", "struct": "AccountInfo"}, "desc": "Get account info", "events": [], "readonly": true}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_time_events", "returns": {"type": "uint64[]", "desc": "Time events"}, "desc": "Get D-ASA time events", "events": [], "readonly": true}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_secondary_market_schedule", "returns": {"type": "uint64[]", "desc": "Secondary market schedule"}, "desc": "Get secondary market schedule", "events": [], "readonly": true}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_asset_metadata", "returns": {"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "desc": "Contract type, Calendar, Business day convention, End of month convention, Early repayment effect, Early repayment penalty type, Prospectus hash, Prospectus URL", "struct": "AssetMetadata"}, "desc": "Get D-ASA metadata", "events": [], "readonly": true}], "name": "ZeroCouponBond", "state": {"keys": {"box": {}, "global": {"arranger": {"key": "UjIwIw==", "keyType": "AVMString", "valueType": "AVMBytes"}, "circulating_units": {"key": "Y2lyY3VsYXRpbmdfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "defaulted": {"key": "ZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_rate": {"key": "aW50ZXJlc3RfcmF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "issuance_date": {"key": "aXNzdWFuY2VfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "metadata": {"key": "bWV0YWRhdGE=", "keyType": "AVMString", "valueType": "AVMBytes"}, "primary_distribution_closure_date": {"key": "cHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "primary_distribution_opening_date": {"key": "cHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "principal_discount": {"key": "cHJpbmNpcGFsX2Rpc2NvdW50", "keyType": "AVMString", "valueType": "AVMUint64"}, "secondary_market_closure_date": {"key": "c2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU=", "keyType": "AVMString", "valueType": "AVMUint64"}, "secondary_market_opening_date": {"key": "c2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU=", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "suspended": {"key": "c3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_coupons": {"key": "dG90YWxfY291cG9ucw==", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "unit_value": {"key": "dW5pdF92YWx1ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 2, "ints": 18}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"PaymentResult": [{"name": "amount", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}, {"name": "context", "type": "byte[]"}], "CurrentUnitsValue": [{"name": "units_value", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "day_count_factor", "type": "(uint64,uint64)"}], "PaymentAmounts": [{"name": "interest", "type": "uint64"}, {"name": "principal", "type": "uint64"}], "AssetMetadata": [{"name": "contract_type", "type": "uint8"}, {"name": "calendar", "type": "uint8"}, {"name": "business_day_convention", "type": "uint8"}, {"name": "end_of_month_convention", "type": "uint8"}, {"name": "prepayment_effect", "type": "uint8"}, {"name": "penalty_type", "type": "uint8"}, {"name": "prospectus_hash", "type": "byte[32]"}, {"name": "prospectus_url", "type": "string"}], "SecondaryMarketSchedule": [{"name": "secondary_market_opening_date", "type": "uint64"}, {"name": "secondary_market_closure_date", "type": "uint64"}], "AssetInfo": [{"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "unit_value", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "principal_discount", "type": "uint16"}, {"name": "interest_rate", "type": "uint16"}, {"name": "total_supply", "type": "uint64"}, {"name": "circulating_supply", "type": "uint64"}, {"name": "primary_distribution_opening_date", "type": "uint64"}, {"name": "primary_distribution_closure_date", "type": "uint64"}, {"name": "issuance_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "performance", "type": "uint8"}], "AccountInfo": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "unit_value", "type": "uint64"}, {"name": "paid_coupons", "type": "uint64"}, {"name": "suspended", "type": "bool"}]}, "desc": "\n Zero Coupon Bond, placed at discount, principal at maturity.\n ", "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuemVyb19jb3Vwb25fYm9uZC5jb250cmFjdC5aZXJvQ291cG9uQm9uZC5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCA0IDQ0OCA4NjQwMCAyMDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAiY2lyY3VsYXRpbmdfdW5pdHMiIDB4NTIzMzMwMjMgInN0YXR1cyIgIm1hdHVyaXR5X2RhdGUiIDB4MDAwMDAwMDAwMDAwMDAwMCAic2V0dGxlbWVudF9hc3NldF9pZCIgImlzc3VhbmNlX2RhdGUiICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiICJ1bml0X3ZhbHVlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iICJ0b3RhbF91bml0cyIgInByaW5jaXBhbF9kaXNjb3VudCIgInRvdGFsX2NvdXBvbnMiICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIgInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIiAweDAwIDB4NTIzMjMwMjMgImRlbm9taW5hdGlvbl9hc3NldF9pZCIgIm1ldGFkYXRhIiAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIiAic3VzcGVuZGVkIiAiZGVmYXVsdGVkIiAiaW50ZXJlc3RfcmF0ZSIgMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MyAweDUyMzczMDIzIDB4NTIzNjMwMjMgMHg1MjM1MzAyMyAweDUyMzQzMDIzIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MyAweDA2ODEwMSAweDUyMzgzMDIzCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MS00MgogICAgLy8gIyBSb2xlIEJhc2VkIEFjY2VzcyBDb250cm9sCiAgICAvLyBzZWxmLmFycmFuZ2VyID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9BUlJBTkdFUikKICAgIGJ5dGVjIDE3IC8vIDB4NTIzMjMwMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5LTYwCiAgICAvLyAjIEFzc2V0IENvbmZpZ3VyYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gVUludDY0KCkKICAgIGJ5dGVjIDE4IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjIKICAgIC8vIHNlbGYudW5pdF92YWx1ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA5IC8vICJ1bml0X3ZhbHVlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MwogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMCAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1LTY2CiAgICAvLyAjIE1ldGFkYXRhCiAgICAvLyBzZWxmLm1ldGFkYXRhID0gQnl0ZXMoKQogICAgYnl0ZWMgMTkgLy8gIm1ldGFkYXRhIgogICAgcHVzaGJ5dGVzIDB4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjgtNjkKICAgIC8vICMgU3VwcGx5CiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDExIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzAKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyLTczCiAgICAvLyAjIFByaW5jaXBhbAogICAgLy8gc2VsZi5wcmluY2lwYWxfZGlzY291bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMTIgLy8gInByaW5jaXBhbF9kaXNjb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzUtNzYKICAgIC8vICMgSW50ZXJlc3QKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAyMyAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODAKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMyAvLyAidG90YWxfY291cG9ucyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODUKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDggLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDIwIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNyAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODgKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTQgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTItOTMKICAgIC8vICMgU3RhdHVzCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0VNUFRZKQogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NAogICAgLy8gc2VsZi5zdXNwZW5kZWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjEgLy8gInN1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTUKICAgIC8vIHNlbGYuZGVmYXVsdGVkID0gVUludDY0KCkKICAgIGJ5dGVjIDIyIC8vICJkZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM1LTM2CiAgICAvLyAjIFN0YXRlIHNjaGVtYSB2YWxpZGF0aW9uCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MzcKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV91aW50ID09IGNmZy5HTE9CQUxfVUlOVFMsIGVyci5XUk9OR19HTE9CQUxfVUlOVFMKICAgIHR4biBHbG9iYWxOdW1VaW50CiAgICBwdXNoaW50IDE4IC8vIDE4CiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBVSW50cyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTozOAogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuTE9DQUxfQllURVMsIGVyci5XUk9OR19MT0NBTF9CWVRFUwogICAgdHhuIExvY2FsTnVtQnl0ZVNsaWNlCiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MzkKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9hZnRlcl9pZl9lbHNlQDI2CiAgICBwdXNoYnl0ZXNzIDB4NGZkNmEzY2MgMHg5Yzc2YjZhMyAweDQ0MzYzZDQ5IDB4NjdkYjRmMjAgMHgzZjBlZmM2YyAweDI1ZGJhOTViIDB4ODk0NzQxMzQgMHgxZDZmYzI1NSAweGZlZjc0NTY3IDB4YjhmYzEzOTAgMHgzZDQzZDFmMCAweGViZDk2YjJmIDB4NmM4NWUzZWUgMHhmNjNhY2U4ZCAweGJiY2NhMThhIDB4MWE3YmFiYjQgMHg0MDJkYmE0NyAweGVkMDI3NTlmIDB4ZmFkMjE3M2UgMHgwOGVmZWEzNSAweGU0YTVhYjU0IC8vIG1ldGhvZCAiYXNzZXRfdHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInBheV9wcmluY2lwYWwoYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAiZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZShhZGRyZXNzLHVpbnQ2NCkodWludDY0LHVpbnQ2NCwodWludDY0LHVpbnQ2NCkpIiwgbWV0aG9kICJnZXRfcGF5bWVudF9hbW91bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImFzc2V0X2NyZWF0ZShhZGRyZXNzLCh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCxieXRlWzMyXSxzdHJpbmcpKXZvaWQiLCBtZXRob2QgImFzc2V0X3VwZGF0ZSgodWludDgsdWludDgsdWludDgsdWludDgsdWludDgsdWludDgsYnl0ZVszMl0sc3RyaW5nKSl2b2lkIiwgbWV0aG9kICJhc3NldF9jb25maWcodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50MTYsdWludDE2W10sdWludDY0W10sKHVpbnQ2NCx1aW50NjQpW10pdm9pZCIsIG1ldGhvZCAic2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cyh1aW50NjRbXSkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImFzc2lnbl9yb2xlKGFkZHJlc3MsdWludDgsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAicmV2b2tlX3JvbGUoYWRkcmVzcyx1aW50OCl1aW50NjQiLCBtZXRob2QgIm9wZW5fYWNjb3VudChhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJjbG9zZV9hY2NvdW50KGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInNldF9hc3NldF9zdXNwZW5zaW9uKGJvb2wpdWludDY0IiwgbWV0aG9kICJzZXRfYWNjb3VudF9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgInNldF9kZWZhdWx0X3N0YXR1cyhib29sKXZvaWQiLCBtZXRob2QgImdldF9hc3NldF9pbmZvKCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQxNix1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYm9vbCx1aW50OCkiLCBtZXRob2QgImdldF9hY2NvdW50X2luZm8oYWRkcmVzcykoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sKSIsIG1ldGhvZCAiZ2V0X3RpbWVfZXZlbnRzKCl1aW50NjRbXSIsIG1ldGhvZCAiZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfYXNzZXRfbWV0YWRhdGEoKSh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCxieXRlWzMyXSxzdHJpbmcpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9hc3NldF90cmFuc2Zlcl9yb3V0ZUA1IG1haW5fcGF5X3ByaW5jaXBhbF9yb3V0ZUA2IG1haW5fZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9yb3V0ZUA3IG1haW5fZ2V0X3BheW1lbnRfYW1vdW50X3JvdXRlQDggbWFpbl9hc3NldF9jcmVhdGVfcm91dGVAOSBtYWluX2Fzc2V0X3VwZGF0ZV9yb3V0ZUAxMCBtYWluX2Fzc2V0X2NvbmZpZ19yb3V0ZUAxMSBtYWluX3NldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfcm91dGVAMTIgbWFpbl9hc3NpZ25fcm9sZV9yb3V0ZUAxMyBtYWluX3Jldm9rZV9yb2xlX3JvdXRlQDE0IG1haW5fb3Blbl9hY2NvdW50X3JvdXRlQDE1IG1haW5fY2xvc2VfYWNjb3VudF9yb3V0ZUAxNiBtYWluX3ByaW1hcnlfZGlzdHJpYnV0aW9uX3JvdXRlQDE3IG1haW5fc2V0X2Fzc2V0X3N1c3BlbnNpb25fcm91dGVAMTggbWFpbl9zZXRfYWNjb3VudF9zdXNwZW5zaW9uX3JvdXRlQDE5IG1haW5fc2V0X2RlZmF1bHRfc3RhdHVzX3JvdXRlQDIwIG1haW5fZ2V0X2Fzc2V0X2luZm9fcm91dGVAMjEgbWFpbl9nZXRfYWNjb3VudF9pbmZvX3JvdXRlQDIyIG1haW5fZ2V0X3RpbWVfZXZlbnRzX3JvdXRlQDIzIG1haW5fZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGVfcm91dGVAMjQgbWFpbl9nZXRfYXNzZXRfbWV0YWRhdGFfcm91dGVAMjUKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9tZXRhZGF0YV9yb3V0ZUAyNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X21ldGFkYXRhCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlX3JvdXRlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfdGltZV9ldmVudHNfcm91dGVAMjM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF90aW1lX2V2ZW50cwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYWNjb3VudF9pbmZvX3JvdXRlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hY2NvdW50X2luZm8KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2luZm9fcm91dGVAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hc3NldF9pbmZvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9kZWZhdWx0X3N0YXR1c19yb3V0ZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBzZXRfZGVmYXVsdF9zdGF0dXMKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0X2FjY291bnRfc3VzcGVuc2lvbl9yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBzZXRfYWNjb3VudF9zdXNwZW5zaW9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9hc3NldF9zdXNwZW5zaW9uX3JvdXRlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9hc3NldF9zdXNwZW5zaW9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3ByaW1hcnlfZGlzdHJpYnV0aW9uX3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODAxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgwMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHByaW1hcnlfZGlzdHJpYnV0aW9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Nsb3NlX2FjY291bnRfcm91dGVAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgY2xvc2VfYWNjb3VudAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9vcGVuX2FjY291bnRfcm91dGVAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgb3Blbl9hY2NvdW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3Jldm9rZV9yb2xlX3JvdXRlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHJldm9rZV9yb2xlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Fzc2lnbl9yb2xlX3JvdXRlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGFzc2lnbl9yb2xlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF9jb25maWdfcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0ODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGFzc2V0X2NvbmZpZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF91cGRhdGVfcm91dGVAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMyAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IFVwZGF0ZUFwcGxpY2F0aW9uCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIGNhbGxzdWIgYXNzZXRfdXBkYXRlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Fzc2V0X2NyZWF0ZV9yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGNhbGxzdWIgYXNzZXRfY3JlYXRlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9wYXltZW50X2Ftb3VudF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9wYXltZW50X2Ftb3VudAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9wYXlfcHJpbmNpcGFsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTI0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcGF5X3ByaW5jaXBhbAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF90cmFuc2Zlcl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6ODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6ODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NldF90cmFuc2ZlcgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy56ZXJvX2NvdXBvbl9ib25kLmNvbnRyYWN0Llplcm9Db3Vwb25Cb25kLmFzc2V0X3RyYW5zZmVyKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCByZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogYnl0ZXMpIC0+IGJ5dGVzOgphc3NldF90cmFuc2ZlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjgwLTg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhc3NldF90cmFuc2ZlcigKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIHNlbmRlcl9ob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywKICAgIC8vICAgICByZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywKICAgIC8vICAgICB1bml0czogYXJjNC5VSW50NjQsCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMyAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAyCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTEwCiAgICAvLyB1bml0cy5uYXRpdmUsCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5OC0zMDEKICAgIC8vIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTkKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzAwCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5OS0zMDAKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5OS0zMDEKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwMQogICAgLy8gPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzAwLTMwMQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgZnJhbWVfZGlnIDQKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5OS0zMDEKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgphc3NldF90cmFuc2Zlcl9ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTctMzAyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyAgICAgYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLlNFQ09OREFSWV9NQVJLRVRfQ0xPU0VECiAgICBhc3NlcnQgLy8gU2Vjb25kYXJ5IG1hcmtldCBpcyBjbG9zZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM3Ni0zNzgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdHJhbnNmZXIgcmlnaHQgdG8gRC1BU0Egb3duZXJzLiBPdGhlciBpbXBsZW1lbnRhdGlvbnMgbWF5IHJlbGF5IG9uIG90aGVyCiAgICAvLyAjIHJvbGVzLCBleHRlcm5hbCBBcHBzIHRocm91Z2ggQzJDIGNhbGxzIChlLmcuLCBhbiBvcmRlciBib29rKSwgb3Igb2ZmLWNoYWluIHRyYW5zZmVyIGFnZW50cy4KICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MubmF0aXZlLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTMKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM3OQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozODAKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICBieXRlY18yIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozODMKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZC5uYXRpdmUsIGVyci5TVVNQRU5ERUQKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50YyA0IC8vIDQ0OAogICAgZ2V0Yml0CiAgICBieXRlYyAxNiAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzg0LTM4NgogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRbCiAgICAvLyAgICAgcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzCiAgICAvLyBdLnN1c3BlbmRlZC5uYXRpdmUsIGVyci5TVVNQRU5ERUQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGMgNCAvLyA0NDgKICAgIGdldGJpdAogICAgYnl0ZWMgMTYgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM4OAogICAgLy8gdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBmcmFtZV9kaWcgNQogICAgPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM4Ny0zODkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgLy8gKSwgZXJyLk9WRVJfVFJBTlNGRVIKICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozOTcKICAgIC8vIHNlbmRlcl91bml0X3ZhbHVlID0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUKICAgIHN3YXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM5OAogICAgLy8gaWYgc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlID4gMDoKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBieiBhc3NldF90cmFuc2Zlcl9lbHNlX2JvZHlAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwOQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwOS0zMTAKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICAvLyBhbmQgc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTAKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwOS0zMTAKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICAvLyBhbmQgc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDE0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwOC0zMTEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vICAgICBhbmQgc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zCiAgICAvLyApLCBlcnIuTk9OX0ZVTkdJQkxFX1VOSVRTCiAgICBhc3NlcnQgLy8gU2VuZGVyIGFuZCByZWNlaXZlciB1bml0cyBhcmUgbm90IGZ1bmdpYmxlCgphc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTEzLTExNAogICAgLy8gIyBUcmFuc2ZlcnJlZCB1bml0cyB2YWx1ZSAobXVzdCBiZSBjb21wdXRlZCBiZWZvcmUgdGhlIHRyYW5zZmVyKQogICAgLy8gc2VuZGVyX3VuaXRfdmFsdWUgPSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTE1LTExNwogICAgLy8gYWNjcnVlZF9pbnRlcmVzdCA9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoCiAgICAvLyAgICAgc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgdW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA1CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGNhbGxzdWIgYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDM0CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlIC0gdW5pdHMKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGRpZyAyCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzMtNDM1CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlIC0gdW5pdHMKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQzMwogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQzMy00MzUKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgLSB1bml0cwogICAgLy8gKQogICAgc3dhcAogICAgcmVwbGFjZTIgMzIKICAgIGRpZyAxCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzcKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgdW5jb3ZlciAzCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzYtNDM4CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzYKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQzNi00MzgKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMKICAgIC8vICkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDMyCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjAKICAgIC8vIGlmIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSA9PSAwOgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJueiBhc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDIxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjEKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUgPSBhcmM0LlVJbnQ2NCgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgNSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIHJlcGxhY2UyIDQwCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzYyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBhcmM0LlVJbnQ2NCgpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBieXRlYyA1IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgcmVwbGFjZTIgNDgKICAgIGJveF9wdXQKCmFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjIKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NCh1bml0cy5uYXRpdmUgKiBzZW5kZXJfdW5pdF92YWx1ZS5uYXRpdmUgKyBhY2NydWVkX2ludGVyZXN0KQogICAgZnJhbWVfZGlnIDAKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyA1CiAgICAqCiAgICBmcmFtZV9kaWcgMwogICAgKwogICAgaXRvYgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMTQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NldF90cmFuc2Zlcl9ib29sX21lcmdlQDE1Cgphc3NldF90cmFuc2Zlcl9lbHNlX2JvZHlAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MDMKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUgPSBzZW5kZXJfdW5pdF92YWx1ZQogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGZyYW1lX2RpZyAwCiAgICByZXBsYWNlMiA0MAogICAgZGlnIDEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQwNC00MDYKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IHNlbGYuYWNjb3VudFsKICAgIC8vICAgICBzZW5kZXJfaG9sZGluZ19hZGRyZXNzCiAgICAvLyBdLnBhaWRfY291cG9ucwogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MDQKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IHNlbGYuYWNjb3VudFsKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDA0LTQwNgogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50WwogICAgLy8gICAgIHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MKICAgIC8vIF0ucGFpZF9jb3Vwb25zCiAgICBzd2FwCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICByZXBsYWNlMiA0OAogICAgYm94X3B1dAogICAgYiBhc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDE3Cgphc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NldF90cmFuc2Zlcl9ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfZGVmYXVsdGVkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTEwLTExMQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTIKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5kZWZhdWx0ZWQsIGVyci5ERUZBVUxURUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMiAvLyAiZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlZmF1bHRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBEZWZhdWx0ZWQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkgLT4gdm9pZDoKYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTQtMTE1CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExNgogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIxIC8vICJzdXNwZW5kZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3VzcGVuZGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuemVyb19jb3Vwb25fYm9uZC5jb250cmFjdC5aZXJvQ291cG9uQm9uZC5hY2NydWVkX2ludGVyZXN0X2Ftb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogdWludDY0KSAtPiB1aW50NjQ6CmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NjQtNjcKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHVuaXRzOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2OAogICAgLy8gZGF5X2NvdW50X2ZhY3RvciA9IHNlbGYuZGF5X2NvdW50X2ZhY3RvcigpCiAgICBjYWxsc3ViIGRheV9jb3VudF9mYWN0b3IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjY5CiAgICAvLyBhY2NydWVkX3BlcmlvZCA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yLm5hdGl2ZQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjcwCiAgICAvLyBwcmluY2lwYWxfcGVyaW9kID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvci5uYXRpdmUKICAgIHN3YXAKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NzIKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWNjb3VudF91bml0c192YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NzMKICAgIC8vICogc2VsZi5wcmluY2lwYWxfZGlzY291bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjcyLTczCiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogc2VsZi5wcmluY2lwYWxfZGlzY291bnQKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjcyLTc0CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogc2VsZi5wcmluY2lwYWxfZGlzY291bnQKICAgIC8vICogYWNjcnVlZF9wZXJpb2QKICAgIHVuY292ZXIgMgogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NzYKICAgIC8vIGNzdC5CUFMgKiBwcmluY2lwYWxfcGVyaW9kCiAgICBwdXNoaW50IDEwMDAwIC8vIDEwMDAwCiAgICB1bmNvdmVyIDIKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjcyLTc3CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogc2VsZi5wcmluY2lwYWxfZGlzY291bnQKICAgIC8vICogYWNjcnVlZF9wZXJpb2QKICAgIC8vIC8vICgKICAgIC8vICAgICBjc3QuQlBTICogcHJpbmNpcGFsX3BlcmlvZAogICAgLy8gKSAgIyBkaXYtYnktemVybzogcHJpbmNpcGFsX3BlcmlvZCAhPSAwIGR1ZSB0byBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkIGNoZWNrcwogICAgLwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NzEtNzgKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICAvLyAgICAgKiBzZWxmLnByaW5jaXBhbF9kaXNjb3VudAogICAgLy8gICAgICogYWNjcnVlZF9wZXJpb2QKICAgIC8vICAgICAvLyAoCiAgICAvLyAgICAgICAgIGNzdC5CUFMgKiBwcmluY2lwYWxfcGVyaW9kCiAgICAvLyAgICAgKSAgIyBkaXYtYnktemVybzogcHJpbmNpcGFsX3BlcmlvZCAhPSAwIGR1ZSB0byBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkIGNoZWNrcwogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnplcm9fY291cG9uX2JvbmQuY29udHJhY3QuWmVyb0NvdXBvbkJvbmQuZGF5X2NvdW50X2ZhY3RvcigpIC0+IGJ5dGVzOgpkYXlfY291bnRfZmFjdG9yOgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NDYtNDcKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZGF5X2NvdW50X2ZhY3RvcihzZWxmKSAtPiB0eXAuRGF5Q291bnRGYWN0b3I6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQ4LTQ5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFjY3J1ZWRfcGVyaW9kID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgLSBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICAtCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjUwCiAgICAvLyBwcmluY2lwYWxfcGVyaW9kID0gc2VsZi5tYXR1cml0eV9kYXRlIC0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIC0KICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NTEKICAgIC8vIGlmIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPT0gVUludDY0KGNzdC5EQ0NfQV9BKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBzd2FwCiAgICBjb3ZlciAyCiAgICBibnogZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1NgogICAgLy8gcmV0dXJuIHRpbWVfcGVyaW9kIC8vIFVJbnQ2NChjc3QuREFZXzJfU0VDKQogICAgZnJhbWVfZGlnIDAKICAgIGludGMgNSAvLyA4NjQwMAogICAgLwogICAgZnJhbWVfZGlnIDEKICAgIGludGMgNSAvLyA4NjQwMAogICAgLwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9idXJ5IDMKCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1NQogICAgLy8gbnVtZXJhdG9yPWFyYzQuVUludDY0KGFjY3J1ZWRfcGVyaW9kKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChwcmluY2lwYWxfcGVyaW9kKSwKICAgIHN3YXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU0LTU3CiAgICAvLyByZXR1cm4gdHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChhY2NydWVkX3BlcmlvZCksCiAgICAvLyAgICAgZGVub21pbmF0b3I9YXJjNC5VSW50NjQocHJpbmNpcGFsX3BlcmlvZCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogdWludDY0KSAtPiB1aW50NjQ6CmFjY291bnRfdW5pdHNfdmFsdWU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDItMzQ1CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFjY291bnRfdW5pdHNfdmFsdWUoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHVuaXRzOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDYKICAgIC8vIHJldHVybiB1bml0cyAqIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUubmF0aXZlCiAgICBieXRlY18yIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuemVyb19jb3Vwb25fYm9uZC5jb250cmFjdC5aZXJvQ291cG9uQm9uZC5wYXlfcHJpbmNpcGFsKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHBheW1lbnRfaW5mbzogYnl0ZXMpIC0+IGJ5dGVzOgpwYXlfcHJpbmNpcGFsOgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTI0LTEyNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcGF5X3ByaW5jaXBhbCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcGF5bWVudF9pbmZvOiBhcmM0LkR5bmFtaWNCeXRlcwogICAgLy8gKSAtPiB0eXAuUGF5bWVudFJlc3VsdDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA0CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCAxMDAgLy8gMTAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDQzLTQ0NAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHJlc3RyaWN0IGNhbGxlciBhdXRob3JpemF0aW9uCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDQ1CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ0NgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cG4gMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDQ4CiAgICAvLyB1bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDQ5CiAgICAvLyBhc3NlcnQgdW5pdHMgPiAwLCBlcnIuTk9fVU5JVFMKICAgIGFzc2VydCAvLyBObyBELUFTQSB1bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDUwCiAgICAvLyBhc3NlcnQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5tYXR1cml0eV9kYXRlLCBlcnIuTk9UX01BVFVSRQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgID49CiAgICBhc3NlcnQgLy8gTm90IG1hdHVyZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzE2CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MubmF0aXZlLmlzX29wdGVkX2luKAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMiAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxNwogICAgLy8gQXNzZXQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxNi0zMTgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5uYXRpdmUuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgQXNzZXQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgLy8gKQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxNi0zMTkKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5uYXRpdmUuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgQXNzZXQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgLy8gKQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQubmF0aXZlCiAgICBieiBwYXlfcHJpbmNpcGFsX2Jvb2xfZmFsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxOQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQubmF0aXZlCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGMgNCAvLyA0NDgKICAgIGdldGJpdAogICAgYnl0ZWMgMTYgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBibnogcGF5X3ByaW5jaXBhbF9ib29sX2ZhbHNlQDE2CiAgICBpbnRjXzEgLy8gMQoKcGF5X3ByaW5jaXBhbF9ib29sX21lcmdlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTQ5CiAgICAvLyBpZiBzZWxmLmlzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgYnogcGF5X3ByaW5jaXBhbF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTUwCiAgICAvLyBwYXltZW50X2Ftb3VudCA9IHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgYWNjb3VudF90b3RhbF91bml0c192YWx1ZQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjUKICAgIC8vIEFzc2V0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCkuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyNS0zMjYKICAgIC8vIEFzc2V0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCkuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gPj0gcGF5bWVudF9hbW91bnQKICAgIGRpZyAxCiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzI0LTMyNwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBBc3NldChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vICAgICA+PSBwYXltZW50X2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTUzLTE1NAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyB0aGUgc2FtZSBhc3NldCBmb3IgZGVub21pbmF0aW9uIGFuZCBzZXR0bGVtZW50LCBubyBjb252ZXJzaW9uIG5lZWRlZAogICAgLy8gc2VsZi5wYXkoc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLCBwYXltZW50X2Ftb3VudCkKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzMxLTMzNgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLm5hdGl2ZSwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMzUKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMzIKICAgIC8vIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMzEKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIGludGNfMyAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMzMS0zMzYKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlci5uYXRpdmUsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKCnBheV9wcmluY2lwYWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDU3CiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIC09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC0KICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ1OAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBieXRlYyA1IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgcmVwbGFjZTIgMzIKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ1OQogICAgLy8gc2VsZi5lbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoKQogICAgY2FsbHN1YiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE2MQogICAgLy8gYW1vdW50PWFyYzQuVUludDY0KHBheW1lbnRfYW1vdW50KSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE2MgogICAgLy8gdGltZXN0YW1wPWFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE2MC0xNjQKICAgIC8vIHJldHVybiB0eXAuUGF5bWVudFJlc3VsdCgKICAgIC8vICAgICBhbW91bnQ9YXJjNC5VSW50NjQocGF5bWVudF9hbW91bnQpLAogICAgLy8gICAgIHRpbWVzdGFtcD1hcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCksCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8uY29weSgpLCAgIyBUT0RPOiBBZGQgaW5mbyBvbiBmYWlsZWQgcGF5bWVudAogICAgLy8gKQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDEyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBzd2FwCiAgICByZXRzdWIKCnBheV9wcmluY2lwYWxfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNTYtMTU3CiAgICAvLyAjIEFjY291bnRzIHN1c3BlbmRlZCBvciBub3Qgb3B0ZWQgaW4gYXQgdGhlIHRpbWUgb2YgcGF5bWVudHMgbXVzdCBub3Qgc3RhbGwgdGhlIEQtQVNBCiAgICAvLyBwYXltZW50X2Ftb3VudCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgYiBwYXlfcHJpbmNpcGFsX2FmdGVyX2lmX2Vsc2VAMwoKcGF5X3ByaW5jaXBhbF9ib29sX2ZhbHNlQDE2OgogICAgaW50Y18wIC8vIDAKICAgIGIgcGF5X3ByaW5jaXBhbF9ib29sX21lcmdlQDE3CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6CmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDgtMzQ5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzUxCiAgICAvLyBob2xkaW5nX2FkZHJlc3MsIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgYnl0ZWNfMiAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1MC0zNTIKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoCiAgICAvLyAgICAgaG9sZGluZ19hZGRyZXNzLCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgY2FsbHN1YiBhY2NvdW50X3VuaXRzX3ZhbHVlCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5lbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoKSAtPiB2b2lkOgplbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjQtMzY1CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjYKICAgIC8vIGlmIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgPT0gMDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGJueiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjcKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGNmZy5TVEFUVVNfRU5ERUQpCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBpbnRjIDYgLy8gMjAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy56ZXJvX2NvdXBvbl9ib25kLmNvbnRyYWN0Llplcm9Db3Vwb25Cb25kLmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE2Ni0xNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHVuaXRzOiBhcmM0LlVJbnQ2NAogICAgLy8gKSAtPiB0eXAuQ3VycmVudFVuaXRzVmFsdWU6CiAgICBwcm90byAyIDEKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gNgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTg2CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxODYtMTg3CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTg3CiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE4Ni0xODcKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzEgLy8gMQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxODUtMTg4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyApLCBlcnIuTk9fUFJJTUFSWV9ESVNUUklCVVRJT04KICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOTEKICAgIC8vIDAgPCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgYnl0ZWMgNSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI+CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VANwogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTEKICAgIGI+PQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDcKICAgIGludGNfMSAvLyAxCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5MC0xOTIKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgMCA8IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfVU5JVFMKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFtb3VudCBvZiB1bml0cyBmb3IgdGhlIGFjY291bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5NQogICAgLy8gaG9sZGluZ19hZGRyZXNzLCB1bml0cy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5NC0xOTYKICAgIC8vIGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSA9IHNlbGYuYWNjb3VudF91bml0c192YWx1ZSgKICAgIC8vICAgICBob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZQogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOTgKICAgIC8vIGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSAqIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50IC8vIGNzdC5CUFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIGRpZyAxCiAgICAqCiAgICBwdXNoaW50IDEwMDAwIC8vIDEwMDAwCiAgICAvCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMDMKICAgIC8vIGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSAtIGFjY291bnRfdW5pdHNfZGlzY291bnQKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwMS0yMDQKICAgIC8vICMgVmFsdWUgZHVyaW5nIHByaW1hcnkgZGlzdHJpYnV0aW9uCiAgICAvLyBhY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUgPSAoCiAgICAvLyAgICAgYWNjb3VudF91bml0c19ub21pbmFsX3ZhbHVlIC0gYWNjb3VudF91bml0c19kaXNjb3VudAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMDYtMjA3CiAgICAvLyAjIEFjY3J1aW5nIGludGVyZXN0IGR1cmluZyBwcmltYXJ5IGRpc3RyaWJ1dGlvbiBhbmQgYXQgbWF0dXJpdHkKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjA4CiAgICAvLyBudW1lcmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjA5CiAgICAvLyBkZW5vbWluYXRvciA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2MS02MgogICAgLy8gIyBUaGUgY2hlY2sgb24gbWF0dXJpdHkgZGF0ZSBlbnN1cmVzIEQtQVNBIGhhcyBiZWVuIGNvbmZpZ3VyZWQgYXMgYmxvY2sgdGltZXN0YW1wIGNhbm5vdCBiZSBsZXNzIHRoYW4gMCAoaW5pdCkuCiAgICAvLyByZXR1cm4gc2VsZi5pc3N1YW5jZV9kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi5tYXR1cml0eV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIDw9CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAMTYKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgNAogICAgPgogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDE2CiAgICBpbnRjXzEgLy8gMQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjExLTIxMgogICAgLy8gIyBBY2NydWluZyBpbnRlcmVzdAogICAgLy8gaWYgc2VsZi5pc19hY2NydWluZ19pbnRlcmVzdCgpOgogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMTMKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoKQogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMTQtMjE2CiAgICAvLyBhY2NydWVkX2ludGVyZXN0ID0gc2VsZi5hY2NydWVkX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZQogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgNwogICAgY2FsbHN1YiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMTcKICAgIC8vIG51bWVyYXRvciA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yLm5hdGl2ZQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjE4CiAgICAvLyBkZW5vbWluYXRvciA9IGRheV9jb3VudF9mYWN0b3IuZGVub21pbmF0b3IubmF0aXZlCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgNQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjIwLTIyMQogICAgLy8gIyBWYWx1ZSBhdCBtYXR1cml0eQogICAgLy8gaWYgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5tYXR1cml0eV9kYXRlOgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgID49CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2FmdGVyX2lmX2Vsc2VAMTIKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDEKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYWZ0ZXJfaWZfZWxzZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gdW5pdHNfdmFsdWU9YXJjNC5VSW50NjQoYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlKSwKICAgIGZyYW1lX2RpZyAxCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMjYKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3Q9YXJjNC5VSW50NjQoYWNjcnVlZF9pbnRlcmVzdCksCiAgICBmcmFtZV9kaWcgMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjI4CiAgICAvLyBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIGZyYW1lX2RpZyA2CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMjkKICAgIC8vIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGRlbm9taW5hdG9yKSwKICAgIGZyYW1lX2RpZyA1CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMjctMjMwCiAgICAvLyBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIC8vICAgICBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICAvLyApLAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMjQtMjMxCiAgICAvLyByZXR1cm4gdHlwLkN1cnJlbnRVbml0c1ZhbHVlKAogICAgLy8gICAgIHVuaXRzX3ZhbHVlPWFyYzQuVUludDY0KGFjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZSksCiAgICAvLyAgICAgYWNjcnVlZF9pbnRlcmVzdD1hcmM0LlVJbnQ2NChhY2NydWVkX2ludGVyZXN0KSwKICAgIC8vICAgICBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICAgICAgbnVtZXJhdG9yPWFyYzQuVUludDY0KG51bWVyYXRvciksCiAgICAvLyAgICAgICAgIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGRlbm9taW5hdG9yKSwKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAMTY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VAMTcKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA3OgogICAgaW50Y18wIC8vIDAKICAgIGIgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDgKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIGIgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuemVyb19jb3Vwb25fYm9uZC5jb250cmFjdC5aZXJvQ291cG9uQm9uZC5nZXRfcGF5bWVudF9hbW91bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9wYXltZW50X2Ftb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIzMy0yMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9wYXltZW50X2Ftb3VudChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcykgLT4gdHlwLlBheW1lbnRBbW91bnRzOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA0CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGR1cAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1MAogICAgLy8gaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCk6CiAgICBieiBnZXRfcGF5bWVudF9hbW91bnRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNTEKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUKICAgIGZyYW1lX2J1cnkgMAoKZ2V0X3BheW1lbnRfYW1vdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gcHJpbmNpcGFsPWFyYzQuVUludDY0KHByaW5jaXBhbF9hbW91bnQpLAogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1MwogICAgLy8gaW50ZXJlc3Q9YXJjNC5VSW50NjQoMCksCiAgICBieXRlYyA1IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjUyLTI1NQogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50QW1vdW50cygKICAgIC8vICAgICBpbnRlcmVzdD1hcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBwcmluY2lwYWw9YXJjNC5VSW50NjQocHJpbmNpcGFsX2Ftb3VudCksCiAgICAvLyApCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2V0X2NyZWF0ZShhcnJhbmdlcjogYnl0ZXMsIG1ldGFkYXRhOiBieXRlcykgLT4gdm9pZDoKYXNzZXRfY3JlYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDYxLTQ2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICAvLyBkZWYgYXNzZXRfY3JlYXRlKHNlbGYsIGFycmFuZ2VyOiBhcmM0LkFkZHJlc3MsIG1ldGFkYXRhOiB0eXAuQXNzZXRNZXRhZGF0YSkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gYXJyYW5nZXIubmF0aXZlCiAgICBieXRlYyAxNyAvLyAweDUyMzIzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzEKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YS5ieXRlcwogICAgYnl0ZWMgMTkgLy8gIm1ldGFkYXRhIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXRfdXBkYXRlKG1ldGFkYXRhOiBieXRlcykgLT4gdm9pZDoKYXNzZXRfdXBkYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDczLTQ3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIGFzc2V0X3VwZGF0ZShzZWxmLCBtZXRhZGF0YTogdHlwLkFzc2V0TWV0YWRhdGEpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3OC00ODEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgZGlzYWJsZSBELUFTQSBhcHBsaWNhdGlvbiB1cGRhdGFiaWxpdHkgb3IgY2hhbmdlIGl0cyBhdXRob3JpemF0aW9ucy4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleSBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ4MgogICAgLy8gc2VsZi5tZXRhZGF0YSA9IG1ldGFkYXRhLmJ5dGVzCiAgICBieXRlYyAxOSAvLyAibWV0YWRhdGEiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExOC0xMTkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYuYXJyYW5nZXIudmFsdWUsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAweDUyMzIzMDIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NldF9jb25maWcoZGVub21pbmF0aW9uX2Fzc2V0X2lkOiBieXRlcywgc2V0dGxlbWVudF9hc3NldF9pZDogYnl0ZXMsIHByaW5jaXBhbDogYnl0ZXMsIHByaW5jaXBhbF9kaXNjb3VudDogYnl0ZXMsIG1pbmltdW1fZGVub21pbmF0aW9uOiBieXRlcywgZGF5X2NvdW50X2NvbnZlbnRpb246IGJ5dGVzLCBpbnRlcmVzdF9yYXRlOiBieXRlcywgY291cG9uX3JhdGVzOiBieXRlcywgdGltZV9ldmVudHM6IGJ5dGVzLCB0aW1lX3BlcmlvZHM6IGJ5dGVzKSAtPiB2b2lkOgphc3NldF9jb25maWc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0ODQtNDk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhc3NldF9jb25maWcoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHByaW5jaXBhbDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgcHJpbmNpcGFsX2Rpc2NvdW50OiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBtaW5pbXVtX2Rlbm9taW5hdGlvbjogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb246IGFyYzQuVUludDgsCiAgICAvLyAgICAgaW50ZXJlc3RfcmF0ZTogYXJjNC5VSW50MTYsCiAgICAvLyAgICAgY291cG9uX3JhdGVzOiB0eXAuQ291cG9uUmF0ZXMsCiAgICAvLyAgICAgdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzLAogICAgLy8gICAgIHRpbWVfcGVyaW9kczogdHlwLlRpbWVQZXJpb2RzLAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMTAgMAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MjcKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUyOAogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfRU1QVFksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTMwLTUzMQogICAgLy8gIyBTZXQgRGVub21pbmF0aW9uIEFzc2V0CiAgICAvLyBzZWxmLmFzc2VydF9kZW5vbWluYXRpb25fYXNzZXQoZGVub21pbmF0aW9uX2Fzc2V0X2lkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMTAKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTgwCiAgICAvLyBkZW5vbWluYXRpb25fYXNzZXRfaWQgIT0gVUludDY0KDApIGFuZCBBc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQpLmNyZWF0b3IKICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQKICAgIGZyYW1lX2RpZyAzCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCmFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzgtMTgxCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQgIT0gVUludDY0KDApIGFuZCBBc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQpLmNyZWF0b3IKICAgIC8vICksIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODUKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyAxOCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZnJhbWVfZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzQtNTM1CiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuYXNzZXJ0X3NldHRsZW1lbnRfYXNzZXQoc2V0dGxlbWVudF9hc3NldF9pZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTkKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkIGV4aXN0cwogICAgZGlnIDEKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODktMTkyCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyA2IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5Ny0yMDMKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5OQogICAgLy8geGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjAwCiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk3LTE5OAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBpbnRjXzMgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTctMjAzCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQwCiAgICAvLyBwcmluY2lwYWwubmF0aXZlICUgbWluaW11bV9kZW5vbWluYXRpb24ubmF0aXZlID09IDAKICAgIGZyYW1lX2RpZyAtOAogICAgYnRvaQogICAgZnJhbWVfZGlnIC02CiAgICBidG9pCiAgICBkdXAyCiAgICAlCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzgtNTQxCiAgICAvLyAjIFNldCBQcmluY2lwYWwgYW5kIE1pbmltdW0gRGVub21pbmF0aW9uCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByaW5jaXBhbC5uYXRpdmUgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUgPT0gMAogICAgLy8gKSwgZXJyLklOVkFMSURfTUlOSU1VTV9ERU5PTUlOQVRJT04KICAgIGFzc2VydCAvLyBNaW5pbXVtIGRlbm9taW5hdGlvbiBpcyBub3QgYSBkaXZpc29yIG9mIHByaW5jaXBhbAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQyCiAgICAvLyBzZWxmLnVuaXRfdmFsdWUgPSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUKICAgIGJ5dGVjIDkgLy8gInVuaXRfdmFsdWUiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU0MwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHByaW5jaXBhbC5uYXRpdmUgLy8gbWluaW11bV9kZW5vbWluYXRpb24ubmF0aXZlCiAgICAvCiAgICBieXRlYyAxMSAvLyAidG90YWxfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQ0CiAgICAvLyBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCA9IHByaW5jaXBhbF9kaXNjb3VudC5uYXRpdmUKICAgIGZyYW1lX2RpZyAtNwogICAgYnRvaQogICAgYnl0ZWMgMTIgLy8gInByaW5jaXBhbF9kaXNjb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NDYtNTQ3CiAgICAvLyAjIFNldCBEYXktQ291bnQgQ29udmVudGlvbgogICAgLy8gc2VsZi5hc3NlcnRfZGF5X2NvdW50X2NvbnZlbnRpb24oZGF5X2NvdW50X2NvbnZlbnRpb24ubmF0aXZlKQogICAgZnJhbWVfZGlnIC01CiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjA3LTIxMQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZnJhbWVfZGlnIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIxMAogICAgLy8gVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICBwdXNoaW50IDI1NSAvLyAyNTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNy0yMTEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgID09CiAgICBieiBhc3NldF9jb25maWdfYm9vbF9mYWxzZUAxNwoKYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAxNjoKICAgIGludGNfMSAvLyAxCgphc3NldF9jb25maWdfYm9vbF9tZXJnZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNy0yMTEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgIGFzc2VydCAvLyBJbnZhbGlkIGRheS1jb3VudCBjb252ZW50aW9uIElECiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTUKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBkYXlfY291bnRfY29udmVudGlvbgogICAgYnl0ZWMgMTAgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgZnJhbWVfZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NTAtNTUxCiAgICAvLyAjIFNldCBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLmFzc2VydF9pbnRlcmVzdF9yYXRlKGludGVyZXN0X3JhdGUubmF0aXZlKQogICAgZnJhbWVfZGlnIC00CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0My00NAogICAgLy8gIyBUaGlzIHN1YnJvdXRpbmUgbXVzdCBiZSB1c2VkIGFmdGVyIHRoZSBwcmluY2lwYWwgZGlzY291bnQgaGFzIGJlZW4gc2V0CiAgICAvLyBhc3NlcnQgaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCksIGVyci5JTlZBTElEX0lOVEVSRVNUX1JBVEUKICAgIGR1cAogICAgIQogICAgYXNzZXJ0IC8vIEludGVyZXN0IHJhdGUgaXMgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gc2VsZi5pbnRlcmVzdF9yYXRlID0gaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgMjMgLy8gImludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjI5CiAgICAvLyBhc3NlcnQgbm90IGNvdXBvbl9yYXRlcy5sZW5ndGgsIGVyci5JTlZBTElEX0NPVVBPTl9SQVRFUwogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgIQogICAgYXNzZXJ0IC8vIENvdXBvbiByYXRlcyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gc2VsZi50b3RhbF9jb3Vwb25zID0gY291cG9uX3JhdGVzLmxlbmd0aAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjM0CiAgICAvLyBpZiBzZWxmLnRvdGFsX2NvdXBvbnM6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIGJ6IGFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDMwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMzUKICAgIC8vIHNlbGYuY291cG9uX3JhdGVzLnZhbHVlID0gY291cG9uX3JhdGVzLmNvcHkoKQogICAgYnl0ZWMgMjkgLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDI5IC8vIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MwogICAgZnJhbWVfZGlnIC0zCiAgICBib3hfcHV0Cgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0MAogICAgLy8gdGltZV9ldmVudHMubGVuZ3RoID09IHNlbGYudG90YWxfY291cG9ucyArIGNmZy5USU1FX1NDSEVEVUxFX0xJTUlUUwogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgaW50Y18zIC8vIDQKICAgICsKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMzktMjQxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFMKICAgIC8vICksIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NjAKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCh0aW1lX2V2ZW50cykKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjUKICAgIC8vIHNlbGYudGltZV9ldmVudHMudmFsdWUgPSB0aW1lX2V2ZW50cy5jb3B5KCkKICAgIGJ5dGVjIDI0IC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMjQgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjYtMjY4CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICBieXRlYyA4IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjYtMjY4CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2OS0yNzEKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBkdXAKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY5CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgYnl0ZWMgMjAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2OS0yNzEKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjcyCiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgPSB0aW1lX2V2ZW50c1tjZmcuSVNTVUFOQ0VfREFURV9JRFhdLm5hdGl2ZQogICAgZXh0cmFjdCAxNiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnl0ZWMgNyAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzQtMjc1CiAgICAvLyAjIFNvbWUgRC1BU0EgbWF5IG5vdCBoYXZlIGEgbWF0dXJpdHkgZGF0ZSAoZS5nLiwgcGVycGV0dWFscykKICAgIC8vIGlmIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgaW50Y18zIC8vIDQKICAgICsKICAgID09CiAgICBieiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjc2CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0aW1lX2V2ZW50c1tjZmcuTUFUVVJJVFlfREFURV9JRFhdLm5hdGl2ZQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODAKICAgIC8vIGFzc2VydCBub3QgdGltZV9wZXJpb2RzLmxlbmd0aCwgZXJyLklOVkFMSURfVElNRV9QRVJJT0RTCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgIQogICAgYXNzZXJ0IC8vIFRpbWUgcGVyaW9kcyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU2NwogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoY2ZnLlNUQVRVU19BQ1RJVkUpCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBwdXNoaW50IDEwMCAvLyAxMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCmFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDE3OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VAMTgKCmFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NldF9jb25maWdfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCh0aW1lX2V2ZW50czogYnl0ZXMpIC0+IGJ5dGVzOgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQzLTI0NAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHNlbGYsIHRpbWVfZXZlbnRzOiB0eXAuVGltZUV2ZW50cykgLT4gTm9uZToKICAgIHByb3RvIDEgMQogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0NgogICAgLy8gdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0NwogICAgLy8gPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ2LTI0NwogICAgLy8gdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdLm5hdGl2ZQogICAgLy8gPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ1LTI0OAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0ubmF0aXZlCiAgICAvLyAgICAgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLklOVkFMSURfVElNRQogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gZm9yIF90IGluIHVyYW5nZSh0aW1lX2V2ZW50cy5sZW5ndGggLSAxKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18wIC8vIDAKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ5CiAgICAvLyBmb3IgX3QgaW4gdXJhbmdlKHRpbWVfZXZlbnRzLmxlbmd0aCAtIDEpOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX2ZvckA2Cgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX3doaWxlX3RvcEA4OgogICAgcHVzaGludCA3NSAvLyA3NQogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl93aGlsZUAxNAogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDMwIC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgMzAgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgYiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX3doaWxlX3RvcEA4Cgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX3doaWxlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjU0CiAgICAvLyB0aW1lX2kgPSB0aW1lX2V2ZW50c1tfdF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMwogICAgc3dhcAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1NQogICAgLy8gdGltZV9mID0gdGltZV9ldmVudHNbX3QgKyAxXS5uYXRpdmUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTYKICAgIC8vIGFzc2VydCB0aW1lX2YgPiB0aW1lX2ksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIDwKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1NwogICAgLy8gaWYgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiAhPSBVSW50NjQoY3N0LkRDQ19DT05UKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBwdXNoaW50IDI1NSAvLyAyNTUKICAgICE9CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjU4LTI1OQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRpbWUgcGVyaW9kcyBleHByZXNzZWQgaW4gZGF5cyBmb3IgcmVndWxhciBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCAodGltZV9mIC0gdGltZV9pKSAlIFVJbnQ2NCgKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjU4LTI2MQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRpbWUgcGVyaW9kcyBleHByZXNzZWQgaW4gZGF5cyBmb3IgcmVndWxhciBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCAodGltZV9mIC0gdGltZV9pKSAlIFVJbnQ2NCgKICAgIC8vICAgICBjc3QuREFZXzJfU0VDCiAgICAvLyApID09IDAsIGVyci5JTlZBTElEX1RJTUVfUEVSSU9ECiAgICBpbnRjIDUgLy8gODY0MDAKICAgICUKICAgICEKICAgIGFzc2VydCAvLyBUaW1lIHBlcmlvZHMgaW4gQWN0dWFsL0FjdHVhbCBkYXkgY291bnQgY29udmVudGlvbiBtdXN0IGJlIG11bHRpcGxlcyBvZiBhIGRheSAoaW4gc2Vjb25kcykKICAgIGIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDEKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDY6CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cyhzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzOiBieXRlcykgLT4gYnl0ZXM6CnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NjktNTcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKAogICAgLy8gICAgIHNlbGYsIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzCiAgICAvLyApIC0+IHR5cC5TZWNvbmRhcnlNYXJrZXRTY2hlZHVsZToKICAgIHByb3RvIDEgMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5MAogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjIDYgLy8gMjAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTkxCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTkyCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5NAogICAgLy8gYXNzZXJ0IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID49IDEsIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTUKICAgIC8vIGlmIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID4gMToKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTYKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMQogICAgZnJhbWVfYnVyeSAxCgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTgKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5OS02MDEKICAgIC8vIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5OC02MDEKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gPD0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgZGlnIDEKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTctNjAyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gICAgIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vICAgICBdLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX09QRU5JTkdfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBvcGVuaW5nIGRhdGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwMwogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyAxNCAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDMtNjA1CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwNgogICAgLy8gaWYgc2VsZi5tYXR1cml0eV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDgKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxMAogICAgLy8gY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwOS02MTEKICAgIC8vID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwOC02MTEKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgZGlnIDEKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDctNjEyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gICAgID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vICAgICBdLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX0NMT1NVUkVfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBjbG9zdXJlIGRhdGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxMwogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTMtNjE1CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjE4CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjE3LTYxOQogICAgLy8gc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyMQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyMC02MjIKICAgIC8vIHNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTYtNjIzCiAgICAvLyByZXR1cm4gdHlwLlNlY29uZGFyeU1hcmtldFNjaGVkdWxlKAogICAgLy8gICAgIHNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgICAgICBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gICAgICksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzaWduX3JvbGUocm9sZV9hZGRyZXNzOiBieXRlcywgcm9sZTogYnl0ZXMsIGNvbmZpZzogYnl0ZXMpIC0+IGJ5dGVzOgphc3NpZ25fcm9sZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyNS02MjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2lnbl9yb2xlKAogICAgLy8gICAgIHNlbGYsIHJvbGVfYWRkcmVzczogYXJjNC5BZGRyZXNzLCByb2xlOiBhcmM0LlVJbnQ4LCBjb25maWc6IGFyYzQuRHluYW1pY0J5dGVzCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDYKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0NwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ5CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgcHVzaGludCAyMCAvLyAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgtNjU1CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUxCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MCAvLyA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MgogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MCAvLyA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MwogICAgLy8gVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwIC8vIDcwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgtNjU1CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU0CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0OC02NTUKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBhc3NpZ25fcm9sZV9ib29sX2ZhbHNlQDcKCmFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18xIC8vIDEKCmFzc2lnbl9yb2xlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0OC02NTUKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU3CiAgICAvLyBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICBwdXNoaW50cyAyMCA0MCA1MCA2MCA3MCA4MCAvLyAyMCwgNDAsIDUwLCA2MCwgNzAsIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTYtNjg1CiAgICAvLyBtYXRjaCByb2xlLm5hdGl2ZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MubmF0aXZlCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICAgICAgICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoKQogICAgZnJhbWVfZGlnIDAKICAgIG1hdGNoIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzBAOSBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8xQDEwIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzJAMTEgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzVAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4NQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfNUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3OQogICAgLy8gcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgYnl0ZWMgMzEgLy8gMHg1MjM4MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzgtNjgwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4MgogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjgxLTY4MwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gKQogICAgYm94X3B1dAoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4NgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgc3dhcAogICAgcmV0c3ViCgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njc1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNSAvLyAweDUyMzczMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzYKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzNAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNiAvLyAweDUyMzYzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzMKICAgIC8vIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgYm94X3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8yQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI3IC8vIDB4NTIzNTMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2OQogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY4LTY3MAogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICBjb25maWcubmF0aXZlCiAgICAvLyApCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzFAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjEKICAgIC8vIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDI4IC8vIDB4NTIzNDMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjYwLTY2MgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjQKICAgIC8vIGNvbmZpZy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2My02NjUKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICkKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMEA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU4CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzLm5hdGl2ZQogICAgYnl0ZWMgMTcgLy8gMHg1MjMyMzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NpZ25fcm9sZV9ib29sX21lcmdlQDgKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5yZXZva2Vfcm9sZShyb2xlX2FkZHJlc3M6IGJ5dGVzLCByb2xlOiBieXRlcykgLT4gYnl0ZXM6CnJldm9rZV9yb2xlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njg4LTY4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcmV2b2tlX3JvbGUoc2VsZiwgcm9sZV9hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHJvbGU6IGFyYzQuVUludDgpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDYKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwNwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDgKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA5CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzEwCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MCAvLyA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4LTcxNAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTEKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIHB1c2hpbnQgNjAgLy8gNjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzEyCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAgLy8gNzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzEzCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogcmV2b2tlX3JvbGVfYm9vbF9mYWxzZUA2CgpyZXZva2Vfcm9sZV9ib29sX3RydWVANToKICAgIGludGNfMSAvLyAxCgpyZXZva2Vfcm9sZV9ib29sX21lcmdlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDgtNzE0CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTYtNzE3CiAgICAvLyAjIEFycmFuZ2VyIHJvbGUgY2FuIG5vdCBiZSByZXZva2VkIChqdXN0IHJvdGF0ZWQpCiAgICAvLyBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludHMgNDAgNTAgNjAgNzAgODAgLy8gNDAsIDUwLCA2MCwgNzAsIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTUtNzMzCiAgICAvLyBtYXRjaCByb2xlLm5hdGl2ZToKICAgIC8vICAgICAjIEFycmFuZ2VyIHJvbGUgY2FuIG5vdCBiZSByZXZva2VkIChqdXN0IHJvdGF0ZWQpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BQ0NPVU5UX01BTkFHRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfUFJJTUFSWV9ERUFMRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1RSVVNURUUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BVVRIT1JJVFkgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmludGVyZXN0X29yYWNsZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9JTlRFUkVTVF9PUkFDTEUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoKQogICAgZnJhbWVfZGlnIDAKICAgIG1hdGNoIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzBAOCByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8xQDkgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMCByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8zQDExIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzRAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczMwogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfNEAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczMAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmludGVyZXN0X29yYWNsZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMSAvLyAweDUyMzgzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MzEKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9JTlRFUkVTVF9PUkFDTEUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MzQKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHN3YXAKICAgIHJldHN1YgoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyNwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNSAvLyAweDUyMzczMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjgKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BVVRIT1JJVFkgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyNAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjYgLy8gMHg1MjM2MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzI1CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfVFJVU1RFRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8xQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNyAvLyAweDUyMzUzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjIKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9QUklNQVJZX0RFQUxFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8wQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTgKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjggLy8gMHg1MjM0MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzE5CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQUNDT1VOVF9NQU5BR0VSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX2Jvb2xfZmFsc2VANjoKICAgIGludGNfMCAvLyAwCiAgICBiIHJldm9rZV9yb2xlX2Jvb2xfbWVyZ2VANwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLm9wZW5fYWNjb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBwYXltZW50X2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKb3Blbl9hY2NvdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzM2LTczOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgb3Blbl9hY2NvdW50KAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCBwYXltZW50X2FkZHJlc3M6IGFyYzQuQWRkcmVzcwogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU2CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50YyA2IC8vIDIwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLnN0YXR1c19pc19lbmRlZCgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICAhCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1OAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTkKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzYwCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY0CiAgICAvLyB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgYnl0ZWMgNSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2Mi03NjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjUKICAgIC8vIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDUgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY2CiAgICAvLyBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDUgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY3CiAgICAvLyBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICBieXRlYyAxNiAvLyAweDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY5CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIyLTEyMwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDI4IC8vIDB4NTIzNDMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2LTEyOQogICAgLy8gY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjcKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyOAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNy0xMjgKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjkKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyOC0xMjkKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI1LTEzMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuY2xvc2VfYWNjb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKY2xvc2VfYWNjb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc3MS03NzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGNsb3NlX2FjY291bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MKICAgIC8vICkgLT4gYXJjNC5UdXBsZVthcmM0LlVJbnQ2NCwgYXJjNC5VSW50NjRdOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODkKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzkwCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3NAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3OTMKICAgIC8vIGNsb3NlZF91bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzk0CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQUNDT1VOVCArIGhvbGRpbmdfYWRkcmVzcy5ieXRlcykKICAgIHN3YXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzk1CiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIC09IGNsb3NlZF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZGlnIDEKICAgIC0KICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5NgogICAgLy8gc2VsZi5lbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoKQogICAgY2FsbHN1YiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5OAogICAgLy8gKGFyYzQuVUludDY0KGNsb3NlZF91bml0cyksIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSkKICAgIGl0b2IKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5Ny03OTkKICAgIC8vIHJldHVybiBhcmM0LlR1cGxlKAogICAgLy8gICAgIChhcmM0LlVJbnQ2NChjbG9zZWRfdW5pdHMpLCBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkpCiAgICAvLyApCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnByaW1hcnlfZGlzdHJpYnV0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiBieXRlcykgLT4gYnl0ZXM6CnByaW1hcnlfZGlzdHJpYnV0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODAxLTgwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcHJpbWFyeV9kaXN0cmlidXRpb24oCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHVuaXRzOiBhcmM0LlVJbnQ2NAogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDQKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMCAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODktMjkyCiAgICAvLyBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTAKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkwLTI5MQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5MC0yOTIKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkyCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTEtMjkyCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgZnJhbWVfZGlnIDIKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5MC0yOTIKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgaW50Y18xIC8vIDEKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4OC0yOTMKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vICAgICBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNgogICAgLy8gY2FsbGVyIGluIHNlbGYucHJpbWFyeV9kZWFsZXIKICAgIGJ5dGVjIDI3IC8vIDB4NTIzNTMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNi0xMzkKICAgIC8vIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kZWFsZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNy0xMzgKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNy0xMzkKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM5CiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2RlYWxlciBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM4LTEzOQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM3LTEzOQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyCiAgICBpbnRjXzEgLy8gMQoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNS0xNDAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYucHJpbWFyeV9kZWFsZXIKICAgIC8vICAgICBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODI5CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzEKICAgIC8vIGFzc2VydCB1bml0cy5uYXRpdmUgPiAwLCBlcnIuWkVST19VTklUUwogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMzCiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICsgdW5pdHMubmF0aXZlIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMi04MzQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5jaXJjdWxhdGluZ191bml0cyArIHVuaXRzLm5hdGl2ZSA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICAvLyApLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzYKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKz0gdW5pdHMubmF0aXZlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM3LTgzOQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM3LTgzOQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIC8vICkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDMyCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gYXJjNC5VSW50NjQoc2VsZi51bml0X3ZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgIGl0b2IKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmVwbGFjZTIgNDAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0MQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMgLSBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIC0KICAgIGl0b2IKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyOgogICAgaW50Y18wIC8vIDAKICAgIGIgcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUAxMwoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUA2CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X2Fzc2V0X3N1c3BlbnNpb24oc3VzcGVuZGVkOiBieXRlcykgLT4gYnl0ZXM6CnNldF9hc3NldF9zdXNwZW5zaW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQzLTg0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgc2V0X2Fzc2V0X3N1c3BlbnNpb24oc2VsZiwgc3VzcGVuZGVkOiBhcmM0LkJvb2wpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NTcKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODU4CiAgICAvLyBzZWxmLnN1c3BlbmRlZCA9IFVJbnQ2NChzdXNwZW5kZWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBieXRlYyAyMSAvLyAic3VzcGVuZGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg1OQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoKSAtPiB2b2lkOgphc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1Mi0xNTMKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICBieXRlYyAyNSAvLyAweDUyMzczMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTQKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1Ni0xNTkKICAgIC8vIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU3CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXV0aG9yaXR5IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTgKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTctMTU4CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGI8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU3LTE1OQogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU5CiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXV0aG9yaXR5IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTgtMTU5CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU3LTE1OQogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NS0xNjAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICAvLyAgICAgYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnNldF9hY2NvdW50X3N1c3BlbnNpb24oaG9sZGluZ19hZGRyZXNzOiBieXRlcywgc3VzcGVuZGVkOiBieXRlcykgLT4gYnl0ZXM6CnNldF9hY2NvdW50X3N1c3BlbnNpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NjEtODY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfYWNjb3VudF9zdXNwZW5zaW9uKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCBzdXNwZW5kZWQ6IGFyYzQuQm9vbAogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODc5CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5KCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3NAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODEKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBpbnRjIDQgLy8gNDQ4CiAgICBzd2FwCiAgICBzZXRiaXQKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4MgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X2RlZmF1bHRfc3RhdHVzKGRlZmF1bHRlZDogYnl0ZXMpIC0+IHZvaWQ6CnNldF9kZWZhdWx0X3N0YXR1czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4NC04ODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9kZWZhdWx0X3N0YXR1cyhzZWxmLCBkZWZhdWx0ZWQ6IGFyYzQuQm9vbCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgYnl0ZWMgMjYgLy8gMHg1MjM2MzAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ0CiAgICAvLyBjYWxsZXIgPSBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ2LTE0OQogICAgLy8gY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ3CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRydXN0ZWUgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0OAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Ny0xNDgKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGI8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ3LTE0OQogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ5CiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRydXN0ZWUgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0OC0xNDkKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ3LTE0OQogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANQogICAgaW50Y18xIC8vIDEKCnNldF9kZWZhdWx0X3N0YXR1c19ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDUtMTUwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIC8vICAgICBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODk2CiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IFVJbnQ2NChkZWZhdWx0ZWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBieXRlYyAyMiAvLyAiZGVmYXVsdGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIHNldF9kZWZhdWx0X3N0YXR1c19ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfYXNzZXRfaW5mbygpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfaW5mbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5OC04OTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF9pbmZvKHNlbGYpIC0+IHR5cC5Bc3NldEluZm86CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwOAogICAgLy8gcGVyZm9ybWFuY2UgPSBVSW50NjQoY3N0LlBSRl9QRVJGT1JNQU5UKQogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTA5CiAgICAvLyBpZiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+IHNlbGYubWF0dXJpdHlfZGF0ZSA+IDA6CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvdmVyIDQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICA+CiAgICBieiBnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDMKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyAxCiAgICBieiBnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMAogICAgLy8gcGVyZm9ybWFuY2UgPSBVSW50NjQoY3N0LlBSRl9NQVRVUkVEKQogICAgaW50Y18zIC8vIDQKICAgIGZyYW1lX2J1cnkgMgoKZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUAzOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTExLTkxMgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBubyBncmFjZSBvciBkZWxpbnF1ZW5jeSBwZXJpb2RzCiAgICAvLyBpZiBzZWxmLmRlZmF1bHRlZDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMiAvLyAiZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlZmF1bHRlZCBleGlzdHMKICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTEzCiAgICAvLyBwZXJmb3JtYW5jZSA9IFVJbnQ2NChjc3QuUFJGX0RFRkFVTFRFRCkKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBmcmFtZV9idXJ5IDAKCmdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNgogICAgLy8gZGVub21pbmF0aW9uX2Fzc2V0X2lkPWFyYzQuVUludDY0KHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNwogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM0MAogICAgLy8gcmV0dXJuIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTgKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCgpKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxOQogICAgLy8gdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NChzZWxmLnVuaXRfdmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyMAogICAgLy8gZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBpdG9iCiAgICBleHRyYWN0IDcgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTIxCiAgICAvLyBwcmluY2lwYWxfZGlzY291bnQ9YXJjNC5VSW50MTYoc2VsZi5wcmluY2lwYWxfZGlzY291bnQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJwcmluY2lwYWxfZGlzY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50IGV4aXN0cwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyMgogICAgLy8gaW50ZXJlc3RfcmF0ZT1hcmM0LlVJbnQxNihzZWxmLmludGVyZXN0X3JhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIzIC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTIzCiAgICAvLyB0b3RhbF9zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi50b3RhbF91bml0cyksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTI0CiAgICAvLyBjaXJjdWxhdGluZ19zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi5jaXJjdWxhdGluZ191bml0cyksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyNS05MjcKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyOQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyOC05MzAKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzMQogICAgLy8gaXNzdWFuY2VfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLmlzc3VhbmNlX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzMgogICAgLy8gbWF0dXJpdHlfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLm1hdHVyaXR5X2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzMwogICAgLy8gc3VzcGVuZGVkPWFyYzQuQm9vbChib29sKHNlbGYuc3VzcGVuZGVkKSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gInN1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdXNwZW5kZWQgZXhpc3RzCiAgICBieXRlYyAxNiAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNAogICAgLy8gcGVyZm9ybWFuY2U9YXJjNC5VSW50OChwZXJmb3JtYW5jZSksCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNS05MzUKICAgIC8vIHJldHVybiB0eXAuQXNzZXRJbmZvKAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCksCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLAogICAgLy8gICAgIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCgpKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSksCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIC8vICAgICBwcmluY2lwYWxfZGlzY291bnQ9YXJjNC5VSW50MTYoc2VsZi5wcmluY2lwYWxfZGlzY291bnQpLAogICAgLy8gICAgIGludGVyZXN0X3JhdGU9YXJjNC5VSW50MTYoc2VsZi5pbnRlcmVzdF9yYXRlKSwKICAgIC8vICAgICB0b3RhbF9zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi50b3RhbF91bml0cyksCiAgICAvLyAgICAgY2lyY3VsYXRpbmdfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMpLAogICAgLy8gICAgIHByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICApLAogICAgLy8gICAgIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIC8vICAgICApLAogICAgLy8gICAgIGlzc3VhbmNlX2RhdGU9YXJjNC5VSW50NjQoc2VsZi5pc3N1YW5jZV9kYXRlKSwKICAgIC8vICAgICBtYXR1cml0eV9kYXRlPWFyYzQuVUludDY0KHNlbGYubWF0dXJpdHlfZGF0ZSksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbChib29sKHNlbGYuc3VzcGVuZGVkKSksCiAgICAvLyAgICAgcGVyZm9ybWFuY2U9YXJjNC5VSW50OChwZXJmb3JtYW5jZSksCiAgICAvLyApCiAgICB1bmNvdmVyIDE0CiAgICB1bmNvdmVyIDE0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X2FjY291bnRfaW5mbyhob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2FjY291bnRfaW5mbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNy05MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hY2NvdW50X2luZm8oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MpIC0+IHR5cC5BY2NvdW50SW5mbzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1MgogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X3RpbWVfZXZlbnRzKCkgLT4gYnl0ZXM6CmdldF90aW1lX2V2ZW50czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1NC05NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF90aW1lX2V2ZW50cyhzZWxmKSAtPiB0eXAuVGltZUV2ZW50czoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTYyCiAgICAvLyB0aW1lX2V2ZW50cyA9IHR5cC5UaW1lRXZlbnRzKCkKICAgIHB1c2hieXRlcyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2MwogICAgLy8gaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCk6CiAgICBieiBnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NjQKICAgIC8vIHRpbWVfZXZlbnRzID0gc2VsZi50aW1lX2V2ZW50cy52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDI0IC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9ldmVudHMgZXhpc3RzCgpnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTY1CiAgICAvLyByZXR1cm4gdGltZV9ldmVudHMKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSgpIC0+IGJ5dGVzOgpnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2Ny05NjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlKHNlbGYpIC0+IHR5cC5UaW1lRXZlbnRzOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NzYKICAgIC8vIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk3NwogICAgLy8gYXJjNC5VSW50NjQoc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTc1LTk3OAogICAgLy8gcmV0dXJuIHR5cC5UaW1lRXZlbnRzKAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUpLAogICAgLy8gKQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hc3NldF9tZXRhZGF0YSgpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbWV0YWRhdGE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5ODAtOTgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbWV0YWRhdGEoc2VsZikgLT4gdHlwLkFzc2V0TWV0YWRhdGE6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk4OQogICAgLy8gcmV0dXJuIHR5cC5Bc3NldE1ldGFkYXRhLmZyb21fYnl0ZXMoc2VsZi5tZXRhZGF0YSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAibWV0YWRhdGEiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWV0YWRhdGEgZXhpc3RzCiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"}}""" +_APP_SPEC_JSON = r"""{"arcs": [22, 28], "bareActions": {"call": [], "create": []}, "methods": [{"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Sender Account Holding Address", "name": "sender_holding_address"}, {"type": "address", "desc": "Receiver Account Holding Address", "name": "receiver_holding_address"}, {"type": "uint64", "desc": "Amount of D-ASA units to transfer", "name": "units"}], "name": "asset_transfer", "returns": {"type": "uint64", "desc": "Transferred actualized value in denomination asset"}, "desc": "Transfer D-ASA units between accounts", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "byte[]", "desc": "Additional payment information (Optional)", "name": "payment_info"}], "name": "pay_principal", "returns": {"type": "(uint64,uint64,byte[])", "desc": "Paid amount in denomination asset, Payment timestamp, Payment context", "struct": "PaymentResult"}, "desc": "Pay the outstanding principal and interest to an account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "uint64", "desc": "Account's units for the current value calculation", "name": "units"}], "name": "get_account_units_current_value", "returns": {"type": "(uint64,uint64,(uint64,uint64))", "desc": "Units current value in denomination asset, Accrued interest in denomination asset", "struct": "CurrentUnitsValue"}, "desc": "Get account's units current value and accrued interest", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "get_payment_amount", "returns": {"type": "(uint64,uint64)", "desc": "Interest amount in denomination asset, Principal amount in denomination asset", "struct": "PaymentAmounts"}, "desc": "Get the next payment amount", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": [], "create": ["NoOp"]}, "args": [{"type": "address", "desc": "D-ASA Arranger Address", "name": "arranger"}, {"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "desc": "D-ASA metadata", "name": "metadata", "struct": "AssetMetadata"}], "name": "asset_create", "returns": {"type": "void"}, "desc": "Create a new D-ASA", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["UpdateApplication"], "create": []}, "args": [{"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "name": "metadata", "struct": "AssetMetadata"}], "name": "asset_update", "returns": {"type": "void"}, "desc": "Update D-ASA application.", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64", "desc": "Denomination asset identifier", "name": "denomination_asset_id"}, {"type": "uint64", "desc": "Settlement asset identifier", "name": "settlement_asset_id"}, {"type": "uint64", "desc": "Principal, expressed in denomination asset", "name": "principal"}, {"type": "uint64", "desc": "Principal discount in bps", "name": "principal_discount"}, {"type": "uint64", "desc": "Minimum denomination, expressed in denomination asset", "name": "minimum_denomination"}, {"type": "uint8", "desc": "Day-count convention for interests calculation", "name": "day_count_convention"}, {"type": "uint16", "desc": "Interest rate in bps", "name": "interest_rate"}, {"type": "uint16[]", "desc": "Coupon interest rates in bps", "name": "coupon_rates"}, {"type": "uint64[]", "desc": "Time events (strictly ascending order)", "name": "time_events"}, {"type": "(uint64,uint64)[]", "desc": "Time periods of recurring time events", "name": "time_periods"}], "name": "asset_config", "returns": {"type": "void"}, "desc": "Configure the Debt Algorand Standard Application", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "uint64[]", "desc": "Secondary market time events (strictly ascending order)", "name": "secondary_market_time_events"}], "name": "set_secondary_time_events", "returns": {"type": "(uint64,uint64)", "desc": "Secondary Market Opening Date, Secondary Market Closure Date", "struct": "SecondaryMarketSchedule"}, "desc": "Set secondary market time schedule", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "uint8", "desc": "Role identifier", "name": "role"}, {"type": "byte[]", "desc": "Role configuration (Optional)", "name": "config"}], "name": "assign_role", "returns": {"type": "uint64", "desc": "Timestamp of the role assignment"}, "desc": "Assign a role to an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Role Address", "name": "role_address"}, {"type": "uint8", "desc": "Role identifier", "name": "role"}], "name": "revoke_role", "returns": {"type": "uint64", "desc": "Timestamp of the role revocation"}, "desc": "Revoke a role from an address", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "address", "desc": "Account Payment Address", "name": "payment_address"}], "name": "open_account", "returns": {"type": "uint64", "desc": "Timestamp of the account opening"}, "desc": "Open D-ASA account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "close_account", "returns": {"type": "(uint64,uint64)", "desc": "Closed units, Timestamp of the account closing"}, "desc": "Close D-ASA account", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "uint64", "desc": "Amount of D-ASA units to distribute", "name": "units"}], "name": "primary_distribution", "returns": {"type": "uint64", "desc": "Remaining D-ASA units to be distributed"}, "desc": "Distribute D-ASA units to accounts according the primary market", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "set_asset_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set asset suspension status"}, "desc": "Set asset suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}, {"type": "bool", "desc": "Suspension status", "name": "suspended"}], "name": "set_account_suspension", "returns": {"type": "uint64", "desc": "Timestamp of the set account suspension status"}, "desc": "Set account suspension status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "bool", "desc": "Default status", "name": "defaulted"}], "name": "set_default_status", "returns": {"type": "void"}, "desc": "Set D-ASA default status", "events": [], "readonly": false, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_asset_info", "returns": {"type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,uint8)", "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Performance", "struct": "AssetInfo"}, "desc": "Get D-ASA info", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [{"type": "address", "desc": "Account Holding Address", "name": "holding_address"}], "name": "get_account_info", "returns": {"type": "(address,uint64,uint64,uint64,bool)", "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended", "struct": "AccountInfo"}, "desc": "Get account info", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_time_events", "returns": {"type": "uint64[]", "desc": "Time events"}, "desc": "Get D-ASA time events", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_secondary_market_schedule", "returns": {"type": "uint64[]", "desc": "Secondary market schedule"}, "desc": "Get secondary market schedule", "events": [], "readonly": true, "recommendations": {}}, {"actions": {"call": ["NoOp"], "create": []}, "args": [], "name": "get_asset_metadata", "returns": {"type": "(uint8,uint8,uint8,uint8,uint8,uint8,byte[32],string)", "desc": "Contract type, Calendar, Business day convention, End of month convention, Early repayment effect, Early repayment penalty type, Prospectus hash, Prospectus URL", "struct": "AssetMetadata"}, "desc": "Get D-ASA metadata", "events": [], "readonly": true, "recommendations": {}}], "name": "ZeroCouponBond", "state": {"keys": {"box": {"coupon_rates": {"key": "Y291cG9uUmF0ZXM=", "keyType": "AVMBytes", "valueType": "uint16[]"}, "time_events": {"key": "dGltZUV2ZW50cw==", "keyType": "AVMBytes", "valueType": "uint64[]"}, "time_periods": {"key": "dGltZVBlcmlvZHM=", "keyType": "AVMBytes", "valueType": "(uint64,uint64)[]"}}, "global": {"arranger": {"key": "UjIwIw==", "keyType": "AVMBytes", "valueType": "AVMBytes"}, "denomination_asset_id": {"key": "ZGVub21pbmF0aW9uX2Fzc2V0X2lk", "keyType": "AVMString", "valueType": "AVMUint64"}, "settlement_asset_id": {"key": "c2V0dGxlbWVudF9hc3NldF9pZA==", "keyType": "AVMString", "valueType": "AVMUint64"}, "unit_value": {"key": "dW5pdF92YWx1ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "day_count_convention": {"key": "ZGF5X2NvdW50X2NvbnZlbnRpb24=", "keyType": "AVMString", "valueType": "AVMUint64"}, "metadata": {"key": "bWV0YWRhdGE=", "keyType": "AVMString", "valueType": "AVMBytes"}, "total_units": {"key": "dG90YWxfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "circulating_units": {"key": "Y2lyY3VsYXRpbmdfdW5pdHM=", "keyType": "AVMString", "valueType": "AVMUint64"}, "principal_discount": {"key": "cHJpbmNpcGFsX2Rpc2NvdW50", "keyType": "AVMString", "valueType": "AVMUint64"}, "interest_rate": {"key": "aW50ZXJlc3RfcmF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "total_coupons": {"key": "dG90YWxfY291cG9ucw==", "keyType": "AVMString", "valueType": "AVMUint64"}, "primary_distribution_opening_date": {"key": "cHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "primary_distribution_closure_date": {"key": "cHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRl", "keyType": "AVMString", "valueType": "AVMUint64"}, "issuance_date": {"key": "aXNzdWFuY2VfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "secondary_market_opening_date": {"key": "c2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU=", "keyType": "AVMString", "valueType": "AVMUint64"}, "secondary_market_closure_date": {"key": "c2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU=", "keyType": "AVMString", "valueType": "AVMUint64"}, "maturity_date": {"key": "bWF0dXJpdHlfZGF0ZQ==", "keyType": "AVMString", "valueType": "AVMUint64"}, "status": {"key": "c3RhdHVz", "keyType": "AVMString", "valueType": "AVMUint64"}, "suspended": {"key": "c3VzcGVuZGVk", "keyType": "AVMString", "valueType": "AVMUint64"}, "defaulted": {"key": "ZGVmYXVsdGVk", "keyType": "AVMString", "valueType": "AVMUint64"}}, "local": {}}, "maps": {"box": {"account_manager": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjQwIw=="}, "primary_dealer": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjUwIw=="}, "trustee": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjYwIw=="}, "authority": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjcwIw=="}, "interest_oracle": {"keyType": "address", "valueType": "RoleConfig", "prefix": "UjgwIw=="}, "account": {"keyType": "address", "valueType": "AccountInfo", "prefix": "UjMwIw=="}}, "global": {}, "local": {}}, "schema": {"global": {"bytes": 2, "ints": 18}, "local": {"bytes": 0, "ints": 0}}}, "structs": {"AccountInfo": [{"name": "payment_address", "type": "address"}, {"name": "units", "type": "uint64"}, {"name": "unit_value", "type": "uint64"}, {"name": "paid_coupons", "type": "uint64"}, {"name": "suspended", "type": "bool"}], "AssetInfo": [{"name": "denomination_asset_id", "type": "uint64"}, {"name": "settlement_asset_id", "type": "uint64"}, {"name": "outstanding_principal", "type": "uint64"}, {"name": "unit_value", "type": "uint64"}, {"name": "day_count_convention", "type": "uint8"}, {"name": "principal_discount", "type": "uint16"}, {"name": "interest_rate", "type": "uint16"}, {"name": "total_supply", "type": "uint64"}, {"name": "circulating_supply", "type": "uint64"}, {"name": "primary_distribution_opening_date", "type": "uint64"}, {"name": "primary_distribution_closure_date", "type": "uint64"}, {"name": "issuance_date", "type": "uint64"}, {"name": "maturity_date", "type": "uint64"}, {"name": "suspended", "type": "bool"}, {"name": "performance", "type": "uint8"}], "AssetMetadata": [{"name": "contract_type", "type": "uint8"}, {"name": "calendar", "type": "uint8"}, {"name": "business_day_convention", "type": "uint8"}, {"name": "end_of_month_convention", "type": "uint8"}, {"name": "prepayment_effect", "type": "uint8"}, {"name": "penalty_type", "type": "uint8"}, {"name": "prospectus_hash", "type": "byte[32]"}, {"name": "prospectus_url", "type": "string"}], "CurrentUnitsValue": [{"name": "units_value", "type": "uint64"}, {"name": "accrued_interest", "type": "uint64"}, {"name": "day_count_factor", "type": "DayCountFactor"}], "DayCountFactor": [{"name": "numerator", "type": "uint64"}, {"name": "denominator", "type": "uint64"}], "PaymentAmounts": [{"name": "interest", "type": "uint64"}, {"name": "principal", "type": "uint64"}], "PaymentResult": [{"name": "amount", "type": "uint64"}, {"name": "timestamp", "type": "uint64"}, {"name": "context", "type": "byte[]"}], "RoleConfig": [{"name": "role_validity_start", "type": "uint64"}, {"name": "role_validity_end", "type": "uint64"}], "SecondaryMarketSchedule": [{"name": "secondary_market_opening_date", "type": "uint64"}, {"name": "secondary_market_closure_date", "type": "uint64"}]}, "byteCode": {"approval": "CiAHAAEIBMADgKMFyAEmIAQVH3x1EWNpcmN1bGF0aW5nX3VuaXRzBFIzMCMGc3RhdHVzDW1hdHVyaXR5X2RhdGUIAAAAAAAAAAATc2V0dGxlbWVudF9hc3NldF9pZA1pc3N1YW5jZV9kYXRlIXByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQp1bml0X3ZhbHVlFGRheV9jb3VudF9jb252ZW50aW9uC3RvdGFsX3VuaXRzEnByaW5jaXBhbF9kaXNjb3VudA10b3RhbF9jb3Vwb25zHXNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlHXNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlAQAEUjIwIxVkZW5vbWluYXRpb25fYXNzZXRfaWQIbWV0YWRhdGEhcHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCXN1c3BlbmRlZAlkZWZhdWx0ZWQNaW50ZXJlc3RfcmF0ZQp0aW1lRXZlbnRzBFI3MCMEUjYwIwRSNTAjBFI0MCMLY291cG9uUmF0ZXMDBoEBBFI4MCMxGEAAZCcRMgNnJxIiZycGImcnCSJnJwoiZycTgABnJwsiZykiZycMImcnFyJnJw0iZycIImcnFCJnJwciZycOImcnDyJnJwQiZysiZycVImcnFiJnMTWBAhJEMTSBEhJEMTcURDE2FEQxG0EAmoIVBE/Wo8wEnHa2owRENj1JBGfbTyAEPw78bAQl26lbBIlHQTQEHW/CVQT+90VnBLj8E5AEPUPR8ATr2WsvBGyF4+4E9jrOjQS7zKGKBBp7q7QEQC26RwTtAnWfBPrSFz4ECO/qNQTkpatUNhoAjhUBmgGEAW4BWwFIATgBDgD7AOIAzAC2AKMAjQB6AGQAVQBFADIAIgASAAIiQzEZFEQxGESIDAIoTFCwI0MxGRREMRhEiAvbKExQsCNDMRkURDEYRIgLryhMULAjQzEZFEQxGEQ2GgGIC40oTFCwI0MxGRREMRhEiAqxKExQsCNDMRkURDEYRDYaAYgKYSNDMRkURDEYRDYaATYaAogKMChMULAjQzEZFEQxGEQ2GgGICdYoTFCwI0MxGRREMRhENhoBNhoCiAkBKExQsCNDMRkURDEYRDYaAYgIvyhMULAjQzEZFEQxGEQ2GgE2GgKICEIoTFCwI0MxGRREMRhENhoBNhoCiAeQKExQsCNDMRkURDEYRDYaATYaAjYaA4gGryhMULAjQzEZFEQxGEQ2GgGIBh8oTFCwI0MxGRREMRhENhoBNhoCNhoDNhoENhoFNhoGNhoHNhoINhoJNhoKiARPI0MxGSUSRDEYRDYaAYgEJiNDMRkURDEYFEQ2GgE2GgKIBAUjQzEZFEQxGEQ2GgGIA9AoTFCwI0MxGRREMRhENhoBNhoCiALsKExQsCNDMRkURDEYRDYaATYaAogB+ChMULAjQzEZFEQxGEQ2GgE2GgI2GgOIAAYoTFCwI0OKAwEiRwKAAEmL/xciK2VEgWQSQQEyIicOZUQyB0mMBA5BASQiJw9lRIsEDUEBGSNEMQCL/RJEiAESiAEaKov9UEmMAUm9RQFEKov+UEmMAkm9RQFESwG+RCEEUycQIk8CVCJTFERJvkQhBFMnECJPAlQiUxRESwG+RFcgCBeLBQ9ETL5EVygIjAC+RFcgCBdBAJaLAb5EVygIiwK+RFcoCKhBAICLAb5EVzAIiwK+RFcwCKhBAG4jRIsBSb5EVygIjACL/YsFSU4DiACVjANJvkRXIAgXSwIJFksBvkRMXCBLAUy/iwJJvkRXIAgXTwMIFksBvkRMXCC/vkRXIAgXQAAViwFJvkQnBVwoSwFMv0m+RCcFXDC/iwAXiwULiwMIFowAiSJC/4+LAkm+RIsAXChLAUy/iwG+REsBvkRMVzAIXDC/Qv9xIkL+5IoAACInFmVEFESJigAAIicVZUQURImKAgGIACJJVwAIF0xXCAgXi/6L/4gATyInDGVEC08CC4GQTk8CCwqJigABMgciJwdlRAlJIicEZUQiJwdlRAlJTgIiJwplRExOAkAADosAIQUKiwEhBQqMAowDiwKLAxZMFlCMAImKAgEqi/5QvkRXKAgXi/8LiYoCASIrZUSBZBJEiP9liP9tKov+UEcCvUUBREm+RFcgCBdEMgciJwRlRA9EvkRXACAiJwZlRHAARQFBAHqLAL5EIQRTJxAiTwJUIlNAAGgjQQBgi/6IAGNJMgoiJwZlRHAAREsBD0SLAL5EVwAgsTIAIicGZURPA7ISTwKyFLIRJbIQsgGzIillRIsASU4CvkRXIAgXCSlMZ0m+RCcFXCC/iAArFjIHFlCAAgASUIv/UEyJIkL/zyJC/5WKAQEqi/9QvkRXIAgXi/9MiP8hiYoAACIpZURAAAQrIQZniYoCASKAAEcGIicIZURBALoyByInCGVED0EAryNEKov+UEmMAL1FAUSL/ycFpUEAlosAvkRXIAgXFov/p0EAhyNEi/8XSYwHi/5MiP7ESYwCIicMZURLAQuBkE4KCYwBIowDIowGIowFIicHZUQyB0mMBA5BAEwiJwRlRIsEDUEAQSNBABmI/kuL/osHiP4cjANJVwAIF4wGVwgIF4wFMgciJwRlRA9BAASLAowBiwEWiwMWiwYWiwUWUE4CUExQjACJIkL/vCJC/3YiQv9OigEBKov/UL1FAUQiSStlRIFkEkEAB4v/iP70jACLABYnBUxQTImKAgAnEYv+ZycTi/9niYoBAIgABicTi/9niYoAADEAIicRZUQSRImKCgAigABJiP/pIitlRBREi/YXSUEBA4sDcQtEMgMTQQD4I0QnEosDZ4v3FyInEmVESwESRCcGTGexMgAiJwZlRDIKIrISshSyESWyELIBs4v4F4v6F0oYFEQnCUsBZwonC0xni/kXJwxMZ4v7F0mMAUEACYsBgf8BEkEAmSNEJwqLAWeL/BdJFEQnF0xni/0iWUkURCcNTGciJw1lREEACScdvEgnHYv9v4v+IlkiJw1lRCUIEkSL/ogAYoz+Jxi8SCcYi/6/i/5XAgBJjABJVwAIFycITGdJVwgIFycUTGdXEAgXJwdMZ4v+IllJjAIiJw1lRCUIEkEAEIsCIwkkC4sATCRYFycETGeL/yJZFEQrgWRniSJC/2QiQv8FigEBgABJi/9XAgBJVwAIFzIHDUSL/yJZIwkiiwSLAwxBAFyBSzIMDUEAGbGBBrIQgQWyGScesh4nHrIfMgCyAbNC/9+LBEkkC4sCSU4DTCRYF0lOA4wBIwhJjAQkCyRYF0mMAAxEIicKZUSB/wETQf+piwCLAQkhBRgUREL/nIv/jACJigEBIoj+SiIrZUQhBhIURIj7xYv/IllJRCMNi/9MQQAKi/+I/1ZJjP+MAYsBjP8iJwdlRIv/VwIASYwAVwAIF0xLAQ5EJw5MZyInBGVEQQAcIicEZUSL/yJZIwkkC4sATCRYF0xLAQ9EJw9MZyInDmVEFiInD2VEFlCMAImKAwGI/c6I+1KL/hdJgRQSQAAoiwCBKBJAACCLAIEyEkAAGIsAgTwSQAAQiwCBRhJAAAiLAIFQEkEAiSNEgwYUKDI8RlCLAI4GAGcAUwA/ACsAFwABACcfi/1QSb1FARREi/9XAgC/MgcWTIknGYv9UEm9RQEURIv/VwIAv0L/5ycai/1QSb1FARREi/9XAgC/Qv/TJxuL/VBJvUUBFESL/1cCAL9C/78nHIv9UEm9RQEURIv/VwIAv0L/qycRi/1nQv+jIkL/dIoCAYj9Boj6iov/F0mBKBJAACCLAIEyEkAAGIsAgTwSQAAQiwCBRhJAAAiLAIFQEkEAZSNEgwUoMjxGUIsAjgUAPwAwACEAEgABACcfi/5QSb1FAUS8SDIHFkyJJxmL/lBJvUUBRLxIQv/sJxqL/lBJvUUBRLxIQv/dJxuL/lBJvUUBRLxIQv/OJxyL/lBJvUUBRLxIQv+/IkL/mIoCAYgALCIrZUQhBhIURIj55Yj57SqL/lBJvUUBFESL/ycFUCcFUCcFUCcQUL8yBxaJigAAIiccMQBQSb1FAUEAIYsBvkRXAAgyBxZJjACmQQAQiwG+RFcICIsAp0EAAyNEiSJC//qKAQGI/8WI+Ycqi/9QSb1FAURJvkRXIAgXTLxIIillREsBCSlMZ4j6wxYyBxZQiYoCASJJgAAiK2VEgWQSQQCqIicIZUQyB0mMAg5BAJwiJxRlRIsCDUEAkSNEJxsxAFBJjAC9RQFBAH2LAL5EVwAIMgcWSYwBpkEAbIsAvkRXCAiLAadBAF8jRCqL/lBJvUUBRIj4+4j5A4v/F0lEIillREsBCCInC2VEDkQiKWVESwEIKUxnSwG+RFcgCBcIFksBvkRMXCBLAUy/IicJZUQWSwG+RExcKL8iJwtlRCIpZUQJFowAiSJC/54iQv9sigEBiAAMi/8iUycVTGcyBxaJigAAIicZMQBQSb1FAUEAIYsBvkRXAAgyBxZJjACmQQAQiwG+RFcICIsAp0EAAyNEiSJC//qKAgGI/8Uqi/5QSb1FAURJvkSL/yJTIQRMVL8yBxaJigEAIicaMQBQSb1FAUEAKYsBvkRXAAgyBxZJjACmQQAYiwG+RFcICIsAp0EACyNEi/8iUycWTGeJIkL/8ooAASJJMgciJwRlTElOAk4ERA1BAAyLAIwCiwFBAAMljAKLAowAIicWZURBAASBA4wAIicSZUQWIicGZUQWIillRCInCWVECxYiJwllRBYiJwplRBZXBwEiJwxlRBZXBgIiJxdlRBZXBgIiJwtlRBYiKWVEFiInCGVEFiInFGVEFiInB2VEFiInBGVEFiInFWVEJxAiTwJUiwAWVwcBTw5PDlBPDVBPDFBPC1BPClBPCVBPCFBPB1BPBlBPBVBPBFBPA1BPAlBMUIwAiYoBASqL/1BJvUUBRL5EiYoAAYACAAAiK2VEgWQSQQAHJxi+TIwARIsATImKAAEiJw5lRBYiJw9lRBZQgAIAAkxQiYoAASInE2VEiQ==", "clear": "CoEBQw=="}, "compilerInfo": {"compiler": "puya", "compilerVersion": {"major": 4, "minor": 2, "patch": 1}}, "desc": "\n Zero Coupon Bond, placed at discount, principal at maturity.\n ", "events": [], "networks": {}, "source": {"approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuemVyb19jb3Vwb25fYm9uZC5jb250cmFjdC5aZXJvQ291cG9uQm9uZC5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCA0IDQ0OCA4NjQwMCAyMDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAiY2lyY3VsYXRpbmdfdW5pdHMiIDB4NTIzMzMwMjMgInN0YXR1cyIgIm1hdHVyaXR5X2RhdGUiIDB4MDAwMDAwMDAwMDAwMDAwMCAic2V0dGxlbWVudF9hc3NldF9pZCIgImlzc3VhbmNlX2RhdGUiICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiICJ1bml0X3ZhbHVlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iICJ0b3RhbF91bml0cyIgInByaW5jaXBhbF9kaXNjb3VudCIgInRvdGFsX2NvdXBvbnMiICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIgInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIiAweDAwIDB4NTIzMjMwMjMgImRlbm9taW5hdGlvbl9hc3NldF9pZCIgIm1ldGFkYXRhIiAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIiAic3VzcGVuZGVkIiAiZGVmYXVsdGVkIiAiaW50ZXJlc3RfcmF0ZSIgMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MyAweDUyMzczMDIzIDB4NTIzNjMwMjMgMHg1MjM1MzAyMyAweDUyMzQzMDIzIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MyAweDA2ODEwMSAweDUyMzgzMDIzCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MS00MgogICAgLy8gIyBSb2xlIEJhc2VkIEFjY2VzcyBDb250cm9sCiAgICAvLyBzZWxmLmFycmFuZ2VyID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9BUlJBTkdFUikKICAgIGJ5dGVjIDE3IC8vIDB4NTIzMjMwMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5LTYwCiAgICAvLyAjIEFzc2V0IENvbmZpZ3VyYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gVUludDY0KCkKICAgIGJ5dGVjIDE4IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjIKICAgIC8vIHNlbGYudW5pdF92YWx1ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA5IC8vICJ1bml0X3ZhbHVlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MwogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMCAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1LTY2CiAgICAvLyAjIE1ldGFkYXRhCiAgICAvLyBzZWxmLm1ldGFkYXRhID0gQnl0ZXMoKQogICAgYnl0ZWMgMTkgLy8gIm1ldGFkYXRhIgogICAgcHVzaGJ5dGVzIDB4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjgtNjkKICAgIC8vICMgU3VwcGx5CiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDExIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzAKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyLTczCiAgICAvLyAjIFByaW5jaXBhbAogICAgLy8gc2VsZi5wcmluY2lwYWxfZGlzY291bnQgPSBVSW50NjQoKQogICAgYnl0ZWMgMTIgLy8gInByaW5jaXBhbF9kaXNjb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzUtNzYKICAgIC8vICMgSW50ZXJlc3QKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAyMyAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODAKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMyAvLyAidG90YWxfY291cG9ucyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODUKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDggLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDIwIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNyAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODgKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTQgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTItOTMKICAgIC8vICMgU3RhdHVzCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0VNUFRZKQogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NAogICAgLy8gc2VsZi5zdXNwZW5kZWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjEgLy8gInN1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTUKICAgIC8vIHNlbGYuZGVmYXVsdGVkID0gVUludDY0KCkKICAgIGJ5dGVjIDIyIC8vICJkZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM1LTM2CiAgICAvLyAjIFN0YXRlIHNjaGVtYSB2YWxpZGF0aW9uCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MzcKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV91aW50ID09IGNmZy5HTE9CQUxfVUlOVFMsIGVyci5XUk9OR19HTE9CQUxfVUlOVFMKICAgIHR4biBHbG9iYWxOdW1VaW50CiAgICBwdXNoaW50IDE4IC8vIDE4CiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBVSW50cyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTozOAogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuTE9DQUxfQllURVMsIGVyci5XUk9OR19MT0NBTF9CWVRFUwogICAgdHhuIExvY2FsTnVtQnl0ZVNsaWNlCiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MzkKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9hZnRlcl9pZl9lbHNlQDI2CiAgICBwdXNoYnl0ZXNzIDB4NGZkNmEzY2MgMHg5Yzc2YjZhMyAweDQ0MzYzZDQ5IDB4NjdkYjRmMjAgMHgzZjBlZmM2YyAweDI1ZGJhOTViIDB4ODk0NzQxMzQgMHgxZDZmYzI1NSAweGZlZjc0NTY3IDB4YjhmYzEzOTAgMHgzZDQzZDFmMCAweGViZDk2YjJmIDB4NmM4NWUzZWUgMHhmNjNhY2U4ZCAweGJiY2NhMThhIDB4MWE3YmFiYjQgMHg0MDJkYmE0NyAweGVkMDI3NTlmIDB4ZmFkMjE3M2UgMHgwOGVmZWEzNSAweGU0YTVhYjU0IC8vIG1ldGhvZCAiYXNzZXRfdHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInBheV9wcmluY2lwYWwoYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAiZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZShhZGRyZXNzLHVpbnQ2NCkodWludDY0LHVpbnQ2NCwodWludDY0LHVpbnQ2NCkpIiwgbWV0aG9kICJnZXRfcGF5bWVudF9hbW91bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImFzc2V0X2NyZWF0ZShhZGRyZXNzLCh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCxieXRlWzMyXSxzdHJpbmcpKXZvaWQiLCBtZXRob2QgImFzc2V0X3VwZGF0ZSgodWludDgsdWludDgsdWludDgsdWludDgsdWludDgsdWludDgsYnl0ZVszMl0sc3RyaW5nKSl2b2lkIiwgbWV0aG9kICJhc3NldF9jb25maWcodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50MTYsdWludDE2W10sdWludDY0W10sKHVpbnQ2NCx1aW50NjQpW10pdm9pZCIsIG1ldGhvZCAic2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cyh1aW50NjRbXSkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImFzc2lnbl9yb2xlKGFkZHJlc3MsdWludDgsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAicmV2b2tlX3JvbGUoYWRkcmVzcyx1aW50OCl1aW50NjQiLCBtZXRob2QgIm9wZW5fYWNjb3VudChhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJjbG9zZV9hY2NvdW50KGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInNldF9hc3NldF9zdXNwZW5zaW9uKGJvb2wpdWludDY0IiwgbWV0aG9kICJzZXRfYWNjb3VudF9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgInNldF9kZWZhdWx0X3N0YXR1cyhib29sKXZvaWQiLCBtZXRob2QgImdldF9hc3NldF9pbmZvKCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQxNix1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYm9vbCx1aW50OCkiLCBtZXRob2QgImdldF9hY2NvdW50X2luZm8oYWRkcmVzcykoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sKSIsIG1ldGhvZCAiZ2V0X3RpbWVfZXZlbnRzKCl1aW50NjRbXSIsIG1ldGhvZCAiZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfYXNzZXRfbWV0YWRhdGEoKSh1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCx1aW50OCxieXRlWzMyXSxzdHJpbmcpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9hc3NldF90cmFuc2Zlcl9yb3V0ZUA1IG1haW5fcGF5X3ByaW5jaXBhbF9yb3V0ZUA2IG1haW5fZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9yb3V0ZUA3IG1haW5fZ2V0X3BheW1lbnRfYW1vdW50X3JvdXRlQDggbWFpbl9hc3NldF9jcmVhdGVfcm91dGVAOSBtYWluX2Fzc2V0X3VwZGF0ZV9yb3V0ZUAxMCBtYWluX2Fzc2V0X2NvbmZpZ19yb3V0ZUAxMSBtYWluX3NldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfcm91dGVAMTIgbWFpbl9hc3NpZ25fcm9sZV9yb3V0ZUAxMyBtYWluX3Jldm9rZV9yb2xlX3JvdXRlQDE0IG1haW5fb3Blbl9hY2NvdW50X3JvdXRlQDE1IG1haW5fY2xvc2VfYWNjb3VudF9yb3V0ZUAxNiBtYWluX3ByaW1hcnlfZGlzdHJpYnV0aW9uX3JvdXRlQDE3IG1haW5fc2V0X2Fzc2V0X3N1c3BlbnNpb25fcm91dGVAMTggbWFpbl9zZXRfYWNjb3VudF9zdXNwZW5zaW9uX3JvdXRlQDE5IG1haW5fc2V0X2RlZmF1bHRfc3RhdHVzX3JvdXRlQDIwIG1haW5fZ2V0X2Fzc2V0X2luZm9fcm91dGVAMjEgbWFpbl9nZXRfYWNjb3VudF9pbmZvX3JvdXRlQDIyIG1haW5fZ2V0X3RpbWVfZXZlbnRzX3JvdXRlQDIzIG1haW5fZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGVfcm91dGVAMjQgbWFpbl9nZXRfYXNzZXRfbWV0YWRhdGFfcm91dGVAMjUKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9tZXRhZGF0YV9yb3V0ZUAyNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X21ldGFkYXRhCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlX3JvdXRlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfdGltZV9ldmVudHNfcm91dGVAMjM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF90aW1lX2V2ZW50cwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYWNjb3VudF9pbmZvX3JvdXRlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hY2NvdW50X2luZm8KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2luZm9fcm91dGVAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hc3NldF9pbmZvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9kZWZhdWx0X3N0YXR1c19yb3V0ZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBzZXRfZGVmYXVsdF9zdGF0dXMKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0X2FjY291bnRfc3VzcGVuc2lvbl9yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBzZXRfYWNjb3VudF9zdXNwZW5zaW9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9hc3NldF9zdXNwZW5zaW9uX3JvdXRlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9hc3NldF9zdXNwZW5zaW9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3ByaW1hcnlfZGlzdHJpYnV0aW9uX3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODAxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgwMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHByaW1hcnlfZGlzdHJpYnV0aW9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Nsb3NlX2FjY291bnRfcm91dGVAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgY2xvc2VfYWNjb3VudAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9vcGVuX2FjY291bnRfcm91dGVAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgb3Blbl9hY2NvdW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3Jldm9rZV9yb2xlX3JvdXRlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHJldm9rZV9yb2xlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Fzc2lnbl9yb2xlX3JvdXRlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGFzc2lnbl9yb2xlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF9jb25maWdfcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0ODQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGFzc2V0X2NvbmZpZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF91cGRhdGVfcm91dGVAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMyAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IFVwZGF0ZUFwcGxpY2F0aW9uCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIGNhbGxzdWIgYXNzZXRfdXBkYXRlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Fzc2V0X2NyZWF0ZV9yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGNhbGxzdWIgYXNzZXRfY3JlYXRlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9wYXltZW50X2Ftb3VudF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9wYXltZW50X2Ftb3VudAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9wYXlfcHJpbmNpcGFsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTI0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcGF5X3ByaW5jaXBhbAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF90cmFuc2Zlcl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6ODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6ODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NldF90cmFuc2ZlcgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy56ZXJvX2NvdXBvbl9ib25kLmNvbnRyYWN0Llplcm9Db3Vwb25Cb25kLmFzc2V0X3RyYW5zZmVyKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCByZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogYnl0ZXMpIC0+IGJ5dGVzOgphc3NldF90cmFuc2ZlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjgwLTg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhc3NldF90cmFuc2ZlcigKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIHNlbmRlcl9ob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywKICAgIC8vICAgICByZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywKICAgIC8vICAgICB1bml0czogYXJjNC5VSW50NjQsCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMyAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAyCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTEwCiAgICAvLyB1bml0cy5uYXRpdmUsCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5OC0zMDEKICAgIC8vIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTkKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzAwCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5OS0zMDAKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5OS0zMDEKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwMQogICAgLy8gPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzAwLTMwMQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgZnJhbWVfZGlnIDQKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5OS0zMDEKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgphc3NldF90cmFuc2Zlcl9ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTctMzAyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyAgICAgYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLlNFQ09OREFSWV9NQVJLRVRfQ0xPU0VECiAgICBhc3NlcnQgLy8gU2Vjb25kYXJ5IG1hcmtldCBpcyBjbG9zZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM3Ni0zNzgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdHJhbnNmZXIgcmlnaHQgdG8gRC1BU0Egb3duZXJzLiBPdGhlciBpbXBsZW1lbnRhdGlvbnMgbWF5IHJlbGF5IG9uIG90aGVyCiAgICAvLyAjIHJvbGVzLCBleHRlcm5hbCBBcHBzIHRocm91Z2ggQzJDIGNhbGxzIChlLmcuLCBhbiBvcmRlciBib29rKSwgb3Igb2ZmLWNoYWluIHRyYW5zZmVyIGFnZW50cy4KICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MubmF0aXZlLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTMKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM3OQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozODAKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICBieXRlY18yIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozODMKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZC5uYXRpdmUsIGVyci5TVVNQRU5ERUQKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50YyA0IC8vIDQ0OAogICAgZ2V0Yml0CiAgICBieXRlYyAxNiAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzg0LTM4NgogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRbCiAgICAvLyAgICAgcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzCiAgICAvLyBdLnN1c3BlbmRlZC5uYXRpdmUsIGVyci5TVVNQRU5ERUQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGMgNCAvLyA0NDgKICAgIGdldGJpdAogICAgYnl0ZWMgMTYgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM4OAogICAgLy8gdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBmcmFtZV9kaWcgNQogICAgPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM4Ny0zODkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgLy8gKSwgZXJyLk9WRVJfVFJBTlNGRVIKICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozOTcKICAgIC8vIHNlbmRlcl91bml0X3ZhbHVlID0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUKICAgIHN3YXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM5OAogICAgLy8gaWYgc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlID4gMDoKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBieiBhc3NldF90cmFuc2Zlcl9lbHNlX2JvZHlAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwOQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwOS0zMTAKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICAvLyBhbmQgc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTAKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwOS0zMTAKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICAvLyBhbmQgc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDE0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwOC0zMTEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vICAgICBhbmQgc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zCiAgICAvLyApLCBlcnIuTk9OX0ZVTkdJQkxFX1VOSVRTCiAgICBhc3NlcnQgLy8gU2VuZGVyIGFuZCByZWNlaXZlciB1bml0cyBhcmUgbm90IGZ1bmdpYmxlCgphc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTEzLTExNAogICAgLy8gIyBUcmFuc2ZlcnJlZCB1bml0cyB2YWx1ZSAobXVzdCBiZSBjb21wdXRlZCBiZWZvcmUgdGhlIHRyYW5zZmVyKQogICAgLy8gc2VuZGVyX3VuaXRfdmFsdWUgPSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTE1LTExNwogICAgLy8gYWNjcnVlZF9pbnRlcmVzdCA9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoCiAgICAvLyAgICAgc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgdW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA1CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGNhbGxzdWIgYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDM0CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlIC0gdW5pdHMKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGRpZyAyCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzMtNDM1CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlIC0gdW5pdHMKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQzMwogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQzMy00MzUKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgLSB1bml0cwogICAgLy8gKQogICAgc3dhcAogICAgcmVwbGFjZTIgMzIKICAgIGRpZyAxCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzcKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgdW5jb3ZlciAzCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzYtNDM4CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzYKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQzNi00MzgKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMKICAgIC8vICkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDMyCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjAKICAgIC8vIGlmIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSA9PSAwOgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJueiBhc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDIxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjEKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUgPSBhcmM0LlVJbnQ2NCgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgNSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIHJlcGxhY2UyIDQwCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzYyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBhcmM0LlVJbnQ2NCgpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBieXRlYyA1IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgcmVwbGFjZTIgNDgKICAgIGJveF9wdXQKCmFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjIKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NCh1bml0cy5uYXRpdmUgKiBzZW5kZXJfdW5pdF92YWx1ZS5uYXRpdmUgKyBhY2NydWVkX2ludGVyZXN0KQogICAgZnJhbWVfZGlnIDAKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyA1CiAgICAqCiAgICBmcmFtZV9kaWcgMwogICAgKwogICAgaXRvYgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMTQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NldF90cmFuc2Zlcl9ib29sX21lcmdlQDE1Cgphc3NldF90cmFuc2Zlcl9lbHNlX2JvZHlAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MDMKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUgPSBzZW5kZXJfdW5pdF92YWx1ZQogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGZyYW1lX2RpZyAwCiAgICByZXBsYWNlMiA0MAogICAgZGlnIDEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQwNC00MDYKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IHNlbGYuYWNjb3VudFsKICAgIC8vICAgICBzZW5kZXJfaG9sZGluZ19hZGRyZXNzCiAgICAvLyBdLnBhaWRfY291cG9ucwogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MDQKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IHNlbGYuYWNjb3VudFsKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDA0LTQwNgogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50WwogICAgLy8gICAgIHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MKICAgIC8vIF0ucGFpZF9jb3Vwb25zCiAgICBzd2FwCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICByZXBsYWNlMiA0OAogICAgYm94X3B1dAogICAgYiBhc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDE3Cgphc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NldF90cmFuc2Zlcl9ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfZGVmYXVsdGVkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTEwLTExMQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTIKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5kZWZhdWx0ZWQsIGVyci5ERUZBVUxURUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMiAvLyAiZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlZmF1bHRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBEZWZhdWx0ZWQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkgLT4gdm9pZDoKYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTQtMTE1CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExNgogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIxIC8vICJzdXNwZW5kZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3VzcGVuZGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuemVyb19jb3Vwb25fYm9uZC5jb250cmFjdC5aZXJvQ291cG9uQm9uZC5hY2NydWVkX2ludGVyZXN0X2Ftb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogdWludDY0KSAtPiB1aW50NjQ6CmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NjQtNjcKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHVuaXRzOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2OAogICAgLy8gZGF5X2NvdW50X2ZhY3RvciA9IHNlbGYuZGF5X2NvdW50X2ZhY3RvcigpCiAgICBjYWxsc3ViIGRheV9jb3VudF9mYWN0b3IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjY5CiAgICAvLyBhY2NydWVkX3BlcmlvZCA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yLm5hdGl2ZQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjcwCiAgICAvLyBwcmluY2lwYWxfcGVyaW9kID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvci5uYXRpdmUKICAgIHN3YXAKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NzIKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWNjb3VudF91bml0c192YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NzMKICAgIC8vICogc2VsZi5wcmluY2lwYWxfZGlzY291bnQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjcyLTczCiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogc2VsZi5wcmluY2lwYWxfZGlzY291bnQKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjcyLTc0CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogc2VsZi5wcmluY2lwYWxfZGlzY291bnQKICAgIC8vICogYWNjcnVlZF9wZXJpb2QKICAgIHVuY292ZXIgMgogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NzYKICAgIC8vIGNzdC5CUFMgKiBwcmluY2lwYWxfcGVyaW9kCiAgICBwdXNoaW50IDEwMDAwIC8vIDEwMDAwCiAgICB1bmNvdmVyIDIKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjcyLTc3CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogc2VsZi5wcmluY2lwYWxfZGlzY291bnQKICAgIC8vICogYWNjcnVlZF9wZXJpb2QKICAgIC8vIC8vICgKICAgIC8vICAgICBjc3QuQlBTICogcHJpbmNpcGFsX3BlcmlvZAogICAgLy8gKSAgIyBkaXYtYnktemVybzogcHJpbmNpcGFsX3BlcmlvZCAhPSAwIGR1ZSB0byBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkIGNoZWNrcwogICAgLwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NzEtNzgKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICAvLyAgICAgKiBzZWxmLnByaW5jaXBhbF9kaXNjb3VudAogICAgLy8gICAgICogYWNjcnVlZF9wZXJpb2QKICAgIC8vICAgICAvLyAoCiAgICAvLyAgICAgICAgIGNzdC5CUFMgKiBwcmluY2lwYWxfcGVyaW9kCiAgICAvLyAgICAgKSAgIyBkaXYtYnktemVybzogcHJpbmNpcGFsX3BlcmlvZCAhPSAwIGR1ZSB0byBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkIGNoZWNrcwogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnplcm9fY291cG9uX2JvbmQuY29udHJhY3QuWmVyb0NvdXBvbkJvbmQuZGF5X2NvdW50X2ZhY3RvcigpIC0+IGJ5dGVzOgpkYXlfY291bnRfZmFjdG9yOgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NDYtNDcKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZGF5X2NvdW50X2ZhY3RvcihzZWxmKSAtPiB0eXAuRGF5Q291bnRGYWN0b3I6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQ4LTQ5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFjY3J1ZWRfcGVyaW9kID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgLSBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICAtCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjUwCiAgICAvLyBwcmluY2lwYWxfcGVyaW9kID0gc2VsZi5tYXR1cml0eV9kYXRlIC0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIC0KICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NTEKICAgIC8vIGlmIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPT0gVUludDY0KGNzdC5EQ0NfQV9BKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBzd2FwCiAgICBjb3ZlciAyCiAgICBibnogZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1NgogICAgLy8gcmV0dXJuIHRpbWVfcGVyaW9kIC8vIFVJbnQ2NChjc3QuREFZXzJfU0VDKQogICAgZnJhbWVfZGlnIDAKICAgIGludGMgNSAvLyA4NjQwMAogICAgLwogICAgZnJhbWVfZGlnIDEKICAgIGludGMgNSAvLyA4NjQwMAogICAgLwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9idXJ5IDMKCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1NQogICAgLy8gbnVtZXJhdG9yPWFyYzQuVUludDY0KGFjY3J1ZWRfcGVyaW9kKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChwcmluY2lwYWxfcGVyaW9kKSwKICAgIHN3YXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU0LTU3CiAgICAvLyByZXR1cm4gdHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChhY2NydWVkX3BlcmlvZCksCiAgICAvLyAgICAgZGVub21pbmF0b3I9YXJjNC5VSW50NjQocHJpbmNpcGFsX3BlcmlvZCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogdWludDY0KSAtPiB1aW50NjQ6CmFjY291bnRfdW5pdHNfdmFsdWU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDItMzQ1CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFjY291bnRfdW5pdHNfdmFsdWUoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHVuaXRzOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDYKICAgIC8vIHJldHVybiB1bml0cyAqIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUubmF0aXZlCiAgICBieXRlY18yIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuemVyb19jb3Vwb25fYm9uZC5jb250cmFjdC5aZXJvQ291cG9uQm9uZC5wYXlfcHJpbmNpcGFsKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHBheW1lbnRfaW5mbzogYnl0ZXMpIC0+IGJ5dGVzOgpwYXlfcHJpbmNpcGFsOgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTI0LTEyNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcGF5X3ByaW5jaXBhbCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcGF5bWVudF9pbmZvOiBhcmM0LkR5bmFtaWNCeXRlcwogICAgLy8gKSAtPiB0eXAuUGF5bWVudFJlc3VsdDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA0CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCAxMDAgLy8gMTAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDQzLTQ0NAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHJlc3RyaWN0IGNhbGxlciBhdXRob3JpemF0aW9uCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDQ1CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ0NgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cG4gMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDQ4CiAgICAvLyB1bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDQ5CiAgICAvLyBhc3NlcnQgdW5pdHMgPiAwLCBlcnIuTk9fVU5JVFMKICAgIGFzc2VydCAvLyBObyBELUFTQSB1bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDUwCiAgICAvLyBhc3NlcnQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5tYXR1cml0eV9kYXRlLCBlcnIuTk9UX01BVFVSRQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgID49CiAgICBhc3NlcnQgLy8gTm90IG1hdHVyZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzE2CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MubmF0aXZlLmlzX29wdGVkX2luKAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMiAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxNwogICAgLy8gQXNzZXQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxNi0zMTgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5uYXRpdmUuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgQXNzZXQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgLy8gKQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxNi0zMTkKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5uYXRpdmUuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgQXNzZXQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgLy8gKQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQubmF0aXZlCiAgICBieiBwYXlfcHJpbmNpcGFsX2Jvb2xfZmFsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxOQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQubmF0aXZlCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGMgNCAvLyA0NDgKICAgIGdldGJpdAogICAgYnl0ZWMgMTYgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBibnogcGF5X3ByaW5jaXBhbF9ib29sX2ZhbHNlQDE2CiAgICBpbnRjXzEgLy8gMQoKcGF5X3ByaW5jaXBhbF9ib29sX21lcmdlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTQ5CiAgICAvLyBpZiBzZWxmLmlzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgYnogcGF5X3ByaW5jaXBhbF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTUwCiAgICAvLyBwYXltZW50X2Ftb3VudCA9IHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgYWNjb3VudF90b3RhbF91bml0c192YWx1ZQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjUKICAgIC8vIEFzc2V0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCkuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyNS0zMjYKICAgIC8vIEFzc2V0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCkuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gPj0gcGF5bWVudF9hbW91bnQKICAgIGRpZyAxCiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzI0LTMyNwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBBc3NldChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vICAgICA+PSBwYXltZW50X2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTUzLTE1NAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyB0aGUgc2FtZSBhc3NldCBmb3IgZGVub21pbmF0aW9uIGFuZCBzZXR0bGVtZW50LCBubyBjb252ZXJzaW9uIG5lZWRlZAogICAgLy8gc2VsZi5wYXkoc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLCBwYXltZW50X2Ftb3VudCkKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzMxLTMzNgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLm5hdGl2ZSwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMzUKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMzIKICAgIC8vIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMzEKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIGludGNfMyAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMzMS0zMzYKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlci5uYXRpdmUsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKCnBheV9wcmluY2lwYWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDU3CiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIC09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC0KICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ1OAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBieXRlYyA1IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgcmVwbGFjZTIgMzIKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ1OQogICAgLy8gc2VsZi5lbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoKQogICAgY2FsbHN1YiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE2MQogICAgLy8gYW1vdW50PWFyYzQuVUludDY0KHBheW1lbnRfYW1vdW50KSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE2MgogICAgLy8gdGltZXN0YW1wPWFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE2MC0xNjQKICAgIC8vIHJldHVybiB0eXAuUGF5bWVudFJlc3VsdCgKICAgIC8vICAgICBhbW91bnQ9YXJjNC5VSW50NjQocGF5bWVudF9hbW91bnQpLAogICAgLy8gICAgIHRpbWVzdGFtcD1hcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCksCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8uY29weSgpLCAgIyBUT0RPOiBBZGQgaW5mbyBvbiBmYWlsZWQgcGF5bWVudAogICAgLy8gKQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDEyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBzd2FwCiAgICByZXRzdWIKCnBheV9wcmluY2lwYWxfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNTYtMTU3CiAgICAvLyAjIEFjY291bnRzIHN1c3BlbmRlZCBvciBub3Qgb3B0ZWQgaW4gYXQgdGhlIHRpbWUgb2YgcGF5bWVudHMgbXVzdCBub3Qgc3RhbGwgdGhlIEQtQVNBCiAgICAvLyBwYXltZW50X2Ftb3VudCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgYiBwYXlfcHJpbmNpcGFsX2FmdGVyX2lmX2Vsc2VAMwoKcGF5X3ByaW5jaXBhbF9ib29sX2ZhbHNlQDE2OgogICAgaW50Y18wIC8vIDAKICAgIGIgcGF5X3ByaW5jaXBhbF9ib29sX21lcmdlQDE3CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6CmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDgtMzQ5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzUxCiAgICAvLyBob2xkaW5nX2FkZHJlc3MsIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgYnl0ZWNfMiAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1MC0zNTIKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoCiAgICAvLyAgICAgaG9sZGluZ19hZGRyZXNzLCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgY2FsbHN1YiBhY2NvdW50X3VuaXRzX3ZhbHVlCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5lbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoKSAtPiB2b2lkOgplbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjQtMzY1CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjYKICAgIC8vIGlmIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgPT0gMDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGJueiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjcKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGNmZy5TVEFUVVNfRU5ERUQpCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBpbnRjIDYgLy8gMjAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy56ZXJvX2NvdXBvbl9ib25kLmNvbnRyYWN0Llplcm9Db3Vwb25Cb25kLmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE2Ni0xNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHVuaXRzOiBhcmM0LlVJbnQ2NAogICAgLy8gKSAtPiB0eXAuQ3VycmVudFVuaXRzVmFsdWU6CiAgICBwcm90byAyIDEKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gNgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTg2CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxODYtMTg3CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTg3CiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE4Ni0xODcKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzEgLy8gMQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxODUtMTg4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyApLCBlcnIuTk9fUFJJTUFSWV9ESVNUUklCVVRJT04KICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOTEKICAgIC8vIDAgPCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgYnl0ZWMgNSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI+CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VANwogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTEKICAgIGI+PQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDcKICAgIGludGNfMSAvLyAxCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5MC0xOTIKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgMCA8IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfVU5JVFMKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFtb3VudCBvZiB1bml0cyBmb3IgdGhlIGFjY291bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5NQogICAgLy8gaG9sZGluZ19hZGRyZXNzLCB1bml0cy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5NC0xOTYKICAgIC8vIGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSA9IHNlbGYuYWNjb3VudF91bml0c192YWx1ZSgKICAgIC8vICAgICBob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZQogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOTgKICAgIC8vIGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSAqIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50IC8vIGNzdC5CUFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicHJpbmNpcGFsX2Rpc2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCBleGlzdHMKICAgIGRpZyAxCiAgICAqCiAgICBwdXNoaW50IDEwMDAwIC8vIDEwMDAwCiAgICAvCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMDMKICAgIC8vIGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSAtIGFjY291bnRfdW5pdHNfZGlzY291bnQKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwMS0yMDQKICAgIC8vICMgVmFsdWUgZHVyaW5nIHByaW1hcnkgZGlzdHJpYnV0aW9uCiAgICAvLyBhY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUgPSAoCiAgICAvLyAgICAgYWNjb3VudF91bml0c19ub21pbmFsX3ZhbHVlIC0gYWNjb3VudF91bml0c19kaXNjb3VudAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMDYtMjA3CiAgICAvLyAjIEFjY3J1aW5nIGludGVyZXN0IGR1cmluZyBwcmltYXJ5IGRpc3RyaWJ1dGlvbiBhbmQgYXQgbWF0dXJpdHkKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjA4CiAgICAvLyBudW1lcmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjA5CiAgICAvLyBkZW5vbWluYXRvciA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2MS02MgogICAgLy8gIyBUaGUgY2hlY2sgb24gbWF0dXJpdHkgZGF0ZSBlbnN1cmVzIEQtQVNBIGhhcyBiZWVuIGNvbmZpZ3VyZWQgYXMgYmxvY2sgdGltZXN0YW1wIGNhbm5vdCBiZSBsZXNzIHRoYW4gMCAoaW5pdCkuCiAgICAvLyByZXR1cm4gc2VsZi5pc3N1YW5jZV9kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi5tYXR1cml0eV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIDw9CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAMTYKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgNAogICAgPgogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDE2CiAgICBpbnRjXzEgLy8gMQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjExLTIxMgogICAgLy8gIyBBY2NydWluZyBpbnRlcmVzdAogICAgLy8gaWYgc2VsZi5pc19hY2NydWluZ19pbnRlcmVzdCgpOgogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMTMKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoKQogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMTQtMjE2CiAgICAvLyBhY2NydWVkX2ludGVyZXN0ID0gc2VsZi5hY2NydWVkX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZQogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgNwogICAgY2FsbHN1YiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMTcKICAgIC8vIG51bWVyYXRvciA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yLm5hdGl2ZQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjE4CiAgICAvLyBkZW5vbWluYXRvciA9IGRheV9jb3VudF9mYWN0b3IuZGVub21pbmF0b3IubmF0aXZlCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgNQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjIwLTIyMQogICAgLy8gIyBWYWx1ZSBhdCBtYXR1cml0eQogICAgLy8gaWYgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5tYXR1cml0eV9kYXRlOgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgID49CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2FmdGVyX2lmX2Vsc2VAMTIKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDEKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYWZ0ZXJfaWZfZWxzZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gdW5pdHNfdmFsdWU9YXJjNC5VSW50NjQoYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlKSwKICAgIGZyYW1lX2RpZyAxCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMjYKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3Q9YXJjNC5VSW50NjQoYWNjcnVlZF9pbnRlcmVzdCksCiAgICBmcmFtZV9kaWcgMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjI4CiAgICAvLyBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIGZyYW1lX2RpZyA2CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMjkKICAgIC8vIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGRlbm9taW5hdG9yKSwKICAgIGZyYW1lX2RpZyA1CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMjctMjMwCiAgICAvLyBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIC8vICAgICBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICAvLyApLAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMjQtMjMxCiAgICAvLyByZXR1cm4gdHlwLkN1cnJlbnRVbml0c1ZhbHVlKAogICAgLy8gICAgIHVuaXRzX3ZhbHVlPWFyYzQuVUludDY0KGFjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZSksCiAgICAvLyAgICAgYWNjcnVlZF9pbnRlcmVzdD1hcmM0LlVJbnQ2NChhY2NydWVkX2ludGVyZXN0KSwKICAgIC8vICAgICBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICAgICAgbnVtZXJhdG9yPWFyYzQuVUludDY0KG51bWVyYXRvciksCiAgICAvLyAgICAgICAgIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGRlbm9taW5hdG9yKSwKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAMTY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VAMTcKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA3OgogICAgaW50Y18wIC8vIDAKICAgIGIgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDgKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIGIgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuemVyb19jb3Vwb25fYm9uZC5jb250cmFjdC5aZXJvQ291cG9uQm9uZC5nZXRfcGF5bWVudF9hbW91bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9wYXltZW50X2Ftb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIzMy0yMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9wYXltZW50X2Ftb3VudChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcykgLT4gdHlwLlBheW1lbnRBbW91bnRzOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA0CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGR1cAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1MAogICAgLy8gaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCk6CiAgICBieiBnZXRfcGF5bWVudF9hbW91bnRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNTEKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUKICAgIGZyYW1lX2J1cnkgMAoKZ2V0X3BheW1lbnRfYW1vdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gcHJpbmNpcGFsPWFyYzQuVUludDY0KHByaW5jaXBhbF9hbW91bnQpLAogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1MwogICAgLy8gaW50ZXJlc3Q9YXJjNC5VSW50NjQoMCksCiAgICBieXRlYyA1IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjUyLTI1NQogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50QW1vdW50cygKICAgIC8vICAgICBpbnRlcmVzdD1hcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBwcmluY2lwYWw9YXJjNC5VSW50NjQocHJpbmNpcGFsX2Ftb3VudCksCiAgICAvLyApCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2V0X2NyZWF0ZShhcnJhbmdlcjogYnl0ZXMsIG1ldGFkYXRhOiBieXRlcykgLT4gdm9pZDoKYXNzZXRfY3JlYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDYxLTQ2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICAvLyBkZWYgYXNzZXRfY3JlYXRlKHNlbGYsIGFycmFuZ2VyOiBhcmM0LkFkZHJlc3MsIG1ldGFkYXRhOiB0eXAuQXNzZXRNZXRhZGF0YSkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDcwCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gYXJyYW5nZXIubmF0aXZlCiAgICBieXRlYyAxNyAvLyAweDUyMzIzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzEKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YS5ieXRlcwogICAgYnl0ZWMgMTkgLy8gIm1ldGFkYXRhIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXRfdXBkYXRlKG1ldGFkYXRhOiBieXRlcykgLT4gdm9pZDoKYXNzZXRfdXBkYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDczLTQ3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIGFzc2V0X3VwZGF0ZShzZWxmLCBtZXRhZGF0YTogdHlwLkFzc2V0TWV0YWRhdGEpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3OC00ODEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgZGlzYWJsZSBELUFTQSBhcHBsaWNhdGlvbiB1cGRhdGFiaWxpdHkgb3IgY2hhbmdlIGl0cyBhdXRob3JpemF0aW9ucy4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleSBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ4MgogICAgLy8gc2VsZi5tZXRhZGF0YSA9IG1ldGFkYXRhLmJ5dGVzCiAgICBieXRlYyAxOSAvLyAibWV0YWRhdGEiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExOC0xMTkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjAKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYuYXJyYW5nZXIudmFsdWUsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAweDUyMzIzMDIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NldF9jb25maWcoZGVub21pbmF0aW9uX2Fzc2V0X2lkOiBieXRlcywgc2V0dGxlbWVudF9hc3NldF9pZDogYnl0ZXMsIHByaW5jaXBhbDogYnl0ZXMsIHByaW5jaXBhbF9kaXNjb3VudDogYnl0ZXMsIG1pbmltdW1fZGVub21pbmF0aW9uOiBieXRlcywgZGF5X2NvdW50X2NvbnZlbnRpb246IGJ5dGVzLCBpbnRlcmVzdF9yYXRlOiBieXRlcywgY291cG9uX3JhdGVzOiBieXRlcywgdGltZV9ldmVudHM6IGJ5dGVzLCB0aW1lX3BlcmlvZHM6IGJ5dGVzKSAtPiB2b2lkOgphc3NldF9jb25maWc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0ODQtNDk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhc3NldF9jb25maWcoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHByaW5jaXBhbDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgcHJpbmNpcGFsX2Rpc2NvdW50OiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBtaW5pbXVtX2Rlbm9taW5hdGlvbjogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb246IGFyYzQuVUludDgsCiAgICAvLyAgICAgaW50ZXJlc3RfcmF0ZTogYXJjNC5VSW50MTYsCiAgICAvLyAgICAgY291cG9uX3JhdGVzOiB0eXAuQ291cG9uUmF0ZXMsCiAgICAvLyAgICAgdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzLAogICAgLy8gICAgIHRpbWVfcGVyaW9kczogdHlwLlRpbWVQZXJpb2RzLAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMTAgMAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MjcKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUyOAogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfRU1QVFksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTMwLTUzMQogICAgLy8gIyBTZXQgRGVub21pbmF0aW9uIEFzc2V0CiAgICAvLyBzZWxmLmFzc2VydF9kZW5vbWluYXRpb25fYXNzZXQoZGVub21pbmF0aW9uX2Fzc2V0X2lkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMTAKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTgwCiAgICAvLyBkZW5vbWluYXRpb25fYXNzZXRfaWQgIT0gVUludDY0KDApIGFuZCBBc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQpLmNyZWF0b3IKICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQKICAgIGZyYW1lX2RpZyAzCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCmFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzgtMTgxCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQgIT0gVUludDY0KDApIGFuZCBBc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQpLmNyZWF0b3IKICAgIC8vICksIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODUKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyAxOCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZnJhbWVfZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzQtNTM1CiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuYXNzZXJ0X3NldHRsZW1lbnRfYXNzZXQoc2V0dGxlbWVudF9hc3NldF9pZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTkKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5MQogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkIGV4aXN0cwogICAgZGlnIDEKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODktMTkyCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk2CiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyA2IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5Ny0yMDMKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5OQogICAgLy8geGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjAwCiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwMQogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk3LTE5OAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBpbnRjXzMgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTctMjAzCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQwCiAgICAvLyBwcmluY2lwYWwubmF0aXZlICUgbWluaW11bV9kZW5vbWluYXRpb24ubmF0aXZlID09IDAKICAgIGZyYW1lX2RpZyAtOAogICAgYnRvaQogICAgZnJhbWVfZGlnIC02CiAgICBidG9pCiAgICBkdXAyCiAgICAlCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzgtNTQxCiAgICAvLyAjIFNldCBQcmluY2lwYWwgYW5kIE1pbmltdW0gRGVub21pbmF0aW9uCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByaW5jaXBhbC5uYXRpdmUgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUgPT0gMAogICAgLy8gKSwgZXJyLklOVkFMSURfTUlOSU1VTV9ERU5PTUlOQVRJT04KICAgIGFzc2VydCAvLyBNaW5pbXVtIGRlbm9taW5hdGlvbiBpcyBub3QgYSBkaXZpc29yIG9mIHByaW5jaXBhbAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQyCiAgICAvLyBzZWxmLnVuaXRfdmFsdWUgPSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUKICAgIGJ5dGVjIDkgLy8gInVuaXRfdmFsdWUiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU0MwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHByaW5jaXBhbC5uYXRpdmUgLy8gbWluaW11bV9kZW5vbWluYXRpb24ubmF0aXZlCiAgICAvCiAgICBieXRlYyAxMSAvLyAidG90YWxfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQ0CiAgICAvLyBzZWxmLnByaW5jaXBhbF9kaXNjb3VudCA9IHByaW5jaXBhbF9kaXNjb3VudC5uYXRpdmUKICAgIGZyYW1lX2RpZyAtNwogICAgYnRvaQogICAgYnl0ZWMgMTIgLy8gInByaW5jaXBhbF9kaXNjb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NDYtNTQ3CiAgICAvLyAjIFNldCBEYXktQ291bnQgQ29udmVudGlvbgogICAgLy8gc2VsZi5hc3NlcnRfZGF5X2NvdW50X2NvbnZlbnRpb24oZGF5X2NvdW50X2NvbnZlbnRpb24ubmF0aXZlKQogICAgZnJhbWVfZGlnIC01CiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjA3LTIxMQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZnJhbWVfZGlnIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIxMAogICAgLy8gVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICBwdXNoaW50IDI1NSAvLyAyNTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNy0yMTEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgID09CiAgICBieiBhc3NldF9jb25maWdfYm9vbF9mYWxzZUAxNwoKYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAxNjoKICAgIGludGNfMSAvLyAxCgphc3NldF9jb25maWdfYm9vbF9tZXJnZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNy0yMTEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgIGFzc2VydCAvLyBJbnZhbGlkIGRheS1jb3VudCBjb252ZW50aW9uIElECiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTUKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBkYXlfY291bnRfY29udmVudGlvbgogICAgYnl0ZWMgMTAgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgZnJhbWVfZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NTAtNTUxCiAgICAvLyAjIFNldCBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLmFzc2VydF9pbnRlcmVzdF9yYXRlKGludGVyZXN0X3JhdGUubmF0aXZlKQogICAgZnJhbWVfZGlnIC00CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0My00NAogICAgLy8gIyBUaGlzIHN1YnJvdXRpbmUgbXVzdCBiZSB1c2VkIGFmdGVyIHRoZSBwcmluY2lwYWwgZGlzY291bnQgaGFzIGJlZW4gc2V0CiAgICAvLyBhc3NlcnQgaW50ZXJlc3RfcmF0ZSA9PSBVSW50NjQoMCksIGVyci5JTlZBTElEX0lOVEVSRVNUX1JBVEUKICAgIGR1cAogICAgIQogICAgYXNzZXJ0IC8vIEludGVyZXN0IHJhdGUgaXMgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gc2VsZi5pbnRlcmVzdF9yYXRlID0gaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgMjMgLy8gImludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjI5CiAgICAvLyBhc3NlcnQgbm90IGNvdXBvbl9yYXRlcy5sZW5ndGgsIGVyci5JTlZBTElEX0NPVVBPTl9SQVRFUwogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgIQogICAgYXNzZXJ0IC8vIENvdXBvbiByYXRlcyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gc2VsZi50b3RhbF9jb3Vwb25zID0gY291cG9uX3JhdGVzLmxlbmd0aAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjM0CiAgICAvLyBpZiBzZWxmLnRvdGFsX2NvdXBvbnM6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIGJ6IGFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDMwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMzUKICAgIC8vIHNlbGYuY291cG9uX3JhdGVzLnZhbHVlID0gY291cG9uX3JhdGVzLmNvcHkoKQogICAgYnl0ZWMgMjkgLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDI5IC8vIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MwogICAgZnJhbWVfZGlnIC0zCiAgICBib3hfcHV0Cgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0MAogICAgLy8gdGltZV9ldmVudHMubGVuZ3RoID09IHNlbGYudG90YWxfY291cG9ucyArIGNmZy5USU1FX1NDSEVEVUxFX0xJTUlUUwogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgaW50Y18zIC8vIDQKICAgICsKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMzktMjQxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFMKICAgIC8vICksIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NjAKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCh0aW1lX2V2ZW50cykKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjUKICAgIC8vIHNlbGYudGltZV9ldmVudHMudmFsdWUgPSB0aW1lX2V2ZW50cy5jb3B5KCkKICAgIGJ5dGVjIDI0IC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMjQgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjYtMjY4CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICBieXRlYyA4IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjYtMjY4CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2OS0yNzEKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBkdXAKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY5CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgYnl0ZWMgMjAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2OS0yNzEKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjcyCiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgPSB0aW1lX2V2ZW50c1tjZmcuSVNTVUFOQ0VfREFURV9JRFhdLm5hdGl2ZQogICAgZXh0cmFjdCAxNiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnl0ZWMgNyAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzQtMjc1CiAgICAvLyAjIFNvbWUgRC1BU0EgbWF5IG5vdCBoYXZlIGEgbWF0dXJpdHkgZGF0ZSAoZS5nLiwgcGVycGV0dWFscykKICAgIC8vIGlmIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgaW50Y18zIC8vIDQKICAgICsKICAgID09CiAgICBieiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjc2CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0aW1lX2V2ZW50c1tjZmcuTUFUVVJJVFlfREFURV9JRFhdLm5hdGl2ZQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODAKICAgIC8vIGFzc2VydCBub3QgdGltZV9wZXJpb2RzLmxlbmd0aCwgZXJyLklOVkFMSURfVElNRV9QRVJJT0RTCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgIQogICAgYXNzZXJ0IC8vIFRpbWUgcGVyaW9kcyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU2NwogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoY2ZnLlNUQVRVU19BQ1RJVkUpCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBwdXNoaW50IDEwMCAvLyAxMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCmFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDE3OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VAMTgKCmFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NldF9jb25maWdfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCh0aW1lX2V2ZW50czogYnl0ZXMpIC0+IGJ5dGVzOgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQzLTI0NAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHNlbGYsIHRpbWVfZXZlbnRzOiB0eXAuVGltZUV2ZW50cykgLT4gTm9uZToKICAgIHByb3RvIDEgMQogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0NgogICAgLy8gdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0NwogICAgLy8gPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ2LTI0NwogICAgLy8gdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdLm5hdGl2ZQogICAgLy8gPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ1LTI0OAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0ubmF0aXZlCiAgICAvLyAgICAgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLklOVkFMSURfVElNRQogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gZm9yIF90IGluIHVyYW5nZSh0aW1lX2V2ZW50cy5sZW5ndGggLSAxKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18wIC8vIDAKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ5CiAgICAvLyBmb3IgX3QgaW4gdXJhbmdlKHRpbWVfZXZlbnRzLmxlbmd0aCAtIDEpOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX2ZvckA2Cgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX3doaWxlX3RvcEA4OgogICAgcHVzaGludCA3NSAvLyA3NQogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl93aGlsZUAxNAogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDMwIC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgMzAgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgYiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX3doaWxlX3RvcEA4Cgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX3doaWxlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjU0CiAgICAvLyB0aW1lX2kgPSB0aW1lX2V2ZW50c1tfdF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMwogICAgc3dhcAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1NQogICAgLy8gdGltZV9mID0gdGltZV9ldmVudHNbX3QgKyAxXS5uYXRpdmUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTYKICAgIC8vIGFzc2VydCB0aW1lX2YgPiB0aW1lX2ksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIDwKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1NwogICAgLy8gaWYgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiAhPSBVSW50NjQoY3N0LkRDQ19DT05UKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBwdXNoaW50IDI1NSAvLyAyNTUKICAgICE9CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjU4LTI1OQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRpbWUgcGVyaW9kcyBleHByZXNzZWQgaW4gZGF5cyBmb3IgcmVndWxhciBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCAodGltZV9mIC0gdGltZV9pKSAlIFVJbnQ2NCgKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjU4LTI2MQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRpbWUgcGVyaW9kcyBleHByZXNzZWQgaW4gZGF5cyBmb3IgcmVndWxhciBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCAodGltZV9mIC0gdGltZV9pKSAlIFVJbnQ2NCgKICAgIC8vICAgICBjc3QuREFZXzJfU0VDCiAgICAvLyApID09IDAsIGVyci5JTlZBTElEX1RJTUVfUEVSSU9ECiAgICBpbnRjIDUgLy8gODY0MDAKICAgICUKICAgICEKICAgIGFzc2VydCAvLyBUaW1lIHBlcmlvZHMgaW4gQWN0dWFsL0FjdHVhbCBkYXkgY291bnQgY29udmVudGlvbiBtdXN0IGJlIG11bHRpcGxlcyBvZiBhIGRheSAoaW4gc2Vjb25kcykKICAgIGIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDEKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDY6CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cyhzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzOiBieXRlcykgLT4gYnl0ZXM6CnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NjktNTcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKAogICAgLy8gICAgIHNlbGYsIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzCiAgICAvLyApIC0+IHR5cC5TZWNvbmRhcnlNYXJrZXRTY2hlZHVsZToKICAgIHByb3RvIDEgMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5MAogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA4CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjIDYgLy8gMjAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTkxCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTkyCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5NAogICAgLy8gYXNzZXJ0IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID49IDEsIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTUKICAgIC8vIGlmIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID4gMToKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTYKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMQogICAgZnJhbWVfYnVyeSAxCgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTgKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5OS02MDEKICAgIC8vIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5OC02MDEKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gPD0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgZGlnIDEKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTctNjAyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gICAgIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vICAgICBdLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX09QRU5JTkdfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBvcGVuaW5nIGRhdGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwMwogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyAxNCAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDMtNjA1CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwNgogICAgLy8gaWYgc2VsZi5tYXR1cml0eV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDgKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxMAogICAgLy8gY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwOS02MTEKICAgIC8vID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwOC02MTEKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgZGlnIDEKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDctNjEyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gICAgID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vICAgICBdLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX0NMT1NVUkVfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBjbG9zdXJlIGRhdGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxMwogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTMtNjE1CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjE4CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjE3LTYxOQogICAgLy8gc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyMQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyMC02MjIKICAgIC8vIHNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTYtNjIzCiAgICAvLyByZXR1cm4gdHlwLlNlY29uZGFyeU1hcmtldFNjaGVkdWxlKAogICAgLy8gICAgIHNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgICAgICBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gICAgICksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzaWduX3JvbGUocm9sZV9hZGRyZXNzOiBieXRlcywgcm9sZTogYnl0ZXMsIGNvbmZpZzogYnl0ZXMpIC0+IGJ5dGVzOgphc3NpZ25fcm9sZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyNS02MjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2lnbl9yb2xlKAogICAgLy8gICAgIHNlbGYsIHJvbGVfYWRkcmVzczogYXJjNC5BZGRyZXNzLCByb2xlOiBhcmM0LlVJbnQ4LCBjb25maWc6IGFyYzQuRHluYW1pY0J5dGVzCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDYKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0NwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ5CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgcHVzaGludCAyMCAvLyAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgtNjU1CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUxCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MCAvLyA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MgogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MCAvLyA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4LTY1NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MwogICAgLy8gVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwIC8vIDcwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgtNjU1CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU0CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0OC02NTUKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBhc3NpZ25fcm9sZV9ib29sX2ZhbHNlQDcKCmFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18xIC8vIDEKCmFzc2lnbl9yb2xlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0OC02NTUKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU3CiAgICAvLyBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICBwdXNoaW50cyAyMCA0MCA1MCA2MCA3MCA4MCAvLyAyMCwgNDAsIDUwLCA2MCwgNzAsIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTYtNjg1CiAgICAvLyBtYXRjaCByb2xlLm5hdGl2ZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MubmF0aXZlCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICAgICAgICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoKQogICAgZnJhbWVfZGlnIDAKICAgIG1hdGNoIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzBAOSBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8xQDEwIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzJAMTEgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzVAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4NQogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfNUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3OQogICAgLy8gcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgYnl0ZWMgMzEgLy8gMHg1MjM4MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzgtNjgwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4MgogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjgxLTY4MwogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gKQogICAgYm94X3B1dAoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4NgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgc3dhcAogICAgcmV0c3ViCgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njc1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNSAvLyAweDUyMzczMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzYKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzNAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNiAvLyAweDUyMzYzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzMKICAgIC8vIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgYm94X3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8yQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI3IC8vIDB4NTIzNTMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2OQogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY4LTY3MAogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICBjb25maWcubmF0aXZlCiAgICAvLyApCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzFAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjEKICAgIC8vIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDI4IC8vIDB4NTIzNDMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjYwLTY2MgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjQKICAgIC8vIGNvbmZpZy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2My02NjUKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICkKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMEA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU4CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzLm5hdGl2ZQogICAgYnl0ZWMgMTcgLy8gMHg1MjMyMzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NpZ25fcm9sZV9ib29sX21lcmdlQDgKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5yZXZva2Vfcm9sZShyb2xlX2FkZHJlc3M6IGJ5dGVzLCByb2xlOiBieXRlcykgLT4gYnl0ZXM6CnJldm9rZV9yb2xlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njg4LTY4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcmV2b2tlX3JvbGUoc2VsZiwgcm9sZV9hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHJvbGU6IGFyYzQuVUludDgpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDYKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwNwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDgKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA5CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzEwCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MCAvLyA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4LTcxNAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTEKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIHB1c2hpbnQgNjAgLy8gNjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzEyCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAgLy8gNzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzEzCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOC03MTQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogcmV2b2tlX3JvbGVfYm9vbF9mYWxzZUA2CgpyZXZva2Vfcm9sZV9ib29sX3RydWVANToKICAgIGludGNfMSAvLyAxCgpyZXZva2Vfcm9sZV9ib29sX21lcmdlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDgtNzE0CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTYtNzE3CiAgICAvLyAjIEFycmFuZ2VyIHJvbGUgY2FuIG5vdCBiZSByZXZva2VkIChqdXN0IHJvdGF0ZWQpCiAgICAvLyBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludHMgNDAgNTAgNjAgNzAgODAgLy8gNDAsIDUwLCA2MCwgNzAsIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTUtNzMzCiAgICAvLyBtYXRjaCByb2xlLm5hdGl2ZToKICAgIC8vICAgICAjIEFycmFuZ2VyIHJvbGUgY2FuIG5vdCBiZSByZXZva2VkIChqdXN0IHJvdGF0ZWQpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BQ0NPVU5UX01BTkFHRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfUFJJTUFSWV9ERUFMRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1RSVVNURUUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BVVRIT1JJVFkgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmludGVyZXN0X29yYWNsZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9JTlRFUkVTVF9PUkFDTEUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoKQogICAgZnJhbWVfZGlnIDAKICAgIG1hdGNoIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzBAOCByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8xQDkgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMCByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8zQDExIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzRAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczMwogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfNEAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjczMAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmludGVyZXN0X29yYWNsZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMSAvLyAweDUyMzgzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MzEKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9JTlRFUkVTVF9PUkFDTEUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MzQKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHN3YXAKICAgIHJldHN1YgoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyNwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNSAvLyAweDUyMzczMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjgKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BVVRIT1JJVFkgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyNAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjYgLy8gMHg1MjM2MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzI1CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfVFJVU1RFRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8xQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNyAvLyAweDUyMzUzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjIKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9QUklNQVJZX0RFQUxFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8wQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTgKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjggLy8gMHg1MjM0MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzE5CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQUNDT1VOVF9NQU5BR0VSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX2Jvb2xfZmFsc2VANjoKICAgIGludGNfMCAvLyAwCiAgICBiIHJldm9rZV9yb2xlX2Jvb2xfbWVyZ2VANwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLm9wZW5fYWNjb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBwYXltZW50X2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKb3Blbl9hY2NvdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzM2LTczOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgb3Blbl9hY2NvdW50KAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCBwYXltZW50X2FkZHJlc3M6IGFyYzQuQWRkcmVzcwogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU2CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwOAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50YyA2IC8vIDIwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLnN0YXR1c19pc19lbmRlZCgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICAhCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1OAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTkKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzYwCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY0CiAgICAvLyB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgYnl0ZWMgNSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2Mi03NjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjUKICAgIC8vIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDUgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY2CiAgICAvLyBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDUgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY3CiAgICAvLyBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICBieXRlYyAxNiAvLyAweDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjItNzY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzY5CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIyLTEyMwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDI4IC8vIDB4NTIzNDMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2LTEyOQogICAgLy8gY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjcKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyOAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNy0xMjgKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjkKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyOC0xMjkKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI1LTEzMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuY2xvc2VfYWNjb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKY2xvc2VfYWNjb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc3MS03NzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGNsb3NlX2FjY291bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MKICAgIC8vICkgLT4gYXJjNC5UdXBsZVthcmM0LlVJbnQ2NCwgYXJjNC5VSW50NjRdOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODkKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzkwCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3NAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3OTMKICAgIC8vIGNsb3NlZF91bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzk0CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQUNDT1VOVCArIGhvbGRpbmdfYWRkcmVzcy5ieXRlcykKICAgIHN3YXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzk1CiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIC09IGNsb3NlZF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZGlnIDEKICAgIC0KICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5NgogICAgLy8gc2VsZi5lbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoKQogICAgY2FsbHN1YiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5OAogICAgLy8gKGFyYzQuVUludDY0KGNsb3NlZF91bml0cyksIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSkKICAgIGl0b2IKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5Ny03OTkKICAgIC8vIHJldHVybiBhcmM0LlR1cGxlKAogICAgLy8gICAgIChhcmM0LlVJbnQ2NChjbG9zZWRfdW5pdHMpLCBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkpCiAgICAvLyApCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnByaW1hcnlfZGlzdHJpYnV0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiBieXRlcykgLT4gYnl0ZXM6CnByaW1hcnlfZGlzdHJpYnV0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODAxLTgwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcHJpbWFyeV9kaXN0cmlidXRpb24oCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHVuaXRzOiBhcmM0LlVJbnQ2NAogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDQKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBwdXNoaW50IDEwMCAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODktMjkyCiAgICAvLyBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTAKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTEKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkwLTI5MQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5MC0yOTIKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkyCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTEtMjkyCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgZnJhbWVfZGlnIDIKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5MC0yOTIKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgaW50Y18xIC8vIDEKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4OC0yOTMKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vICAgICBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNgogICAgLy8gY2FsbGVyIGluIHNlbGYucHJpbWFyeV9kZWFsZXIKICAgIGJ5dGVjIDI3IC8vIDB4NTIzNTMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNi0xMzkKICAgIC8vIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNwogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kZWFsZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNy0xMzgKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNy0xMzkKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM5CiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2RlYWxlciBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM4LTEzOQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM3LTEzOQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyCiAgICBpbnRjXzEgLy8gMQoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNS0xNDAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYucHJpbWFyeV9kZWFsZXIKICAgIC8vICAgICBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODI5CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzEKICAgIC8vIGFzc2VydCB1bml0cy5uYXRpdmUgPiAwLCBlcnIuWkVST19VTklUUwogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMzCiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICsgdW5pdHMubmF0aXZlIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMi04MzQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5jaXJjdWxhdGluZ191bml0cyArIHVuaXRzLm5hdGl2ZSA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICAvLyApLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzYKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKz0gdW5pdHMubmF0aXZlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM3LTgzOQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODM3LTgzOQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIC8vICkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDMyCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQwCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gYXJjNC5VSW50NjQoc2VsZi51bml0X3ZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgIGl0b2IKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmVwbGFjZTIgNDAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0MQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMgLSBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIC0KICAgIGl0b2IKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyOgogICAgaW50Y18wIC8vIDAKICAgIGIgcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUAxMwoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUA2CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X2Fzc2V0X3N1c3BlbnNpb24oc3VzcGVuZGVkOiBieXRlcykgLT4gYnl0ZXM6CnNldF9hc3NldF9zdXNwZW5zaW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQzLTg0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgc2V0X2Fzc2V0X3N1c3BlbnNpb24oc2VsZiwgc3VzcGVuZGVkOiBhcmM0LkJvb2wpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NTcKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODU4CiAgICAvLyBzZWxmLnN1c3BlbmRlZCA9IFVJbnQ2NChzdXNwZW5kZWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBieXRlYyAyMSAvLyAic3VzcGVuZGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg1OQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoKSAtPiB2b2lkOgphc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1Mi0xNTMKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICBieXRlYyAyNSAvLyAweDUyMzczMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTQKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1Ni0xNTkKICAgIC8vIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU3CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXV0aG9yaXR5IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTgKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTctMTU4CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGI8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU3LTE1OQogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU5CiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXV0aG9yaXR5IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTgtMTU5CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU3LTE1OQogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NS0xNjAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICAvLyAgICAgYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnNldF9hY2NvdW50X3N1c3BlbnNpb24oaG9sZGluZ19hZGRyZXNzOiBieXRlcywgc3VzcGVuZGVkOiBieXRlcykgLT4gYnl0ZXM6CnNldF9hY2NvdW50X3N1c3BlbnNpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NjEtODY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfYWNjb3VudF9zdXNwZW5zaW9uKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCBzdXNwZW5kZWQ6IGFyYzQuQm9vbAogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODc5CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5KCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3NAogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODEKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBpbnRjIDQgLy8gNDQ4CiAgICBzd2FwCiAgICBzZXRiaXQKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4MgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X2RlZmF1bHRfc3RhdHVzKGRlZmF1bHRlZDogYnl0ZXMpIC0+IHZvaWQ6CnNldF9kZWZhdWx0X3N0YXR1czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4NC04ODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9kZWZhdWx0X3N0YXR1cyhzZWxmLCBkZWZhdWx0ZWQ6IGFyYzQuQm9vbCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgYnl0ZWMgMjYgLy8gMHg1MjM2MzAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ0CiAgICAvLyBjYWxsZXIgPSBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ2LTE0OQogICAgLy8gY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ3CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRydXN0ZWUgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0OAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Ny0xNDgKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGI8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ3LTE0OQogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ5CiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRydXN0ZWUgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0OC0xNDkKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ3LTE0OQogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANQogICAgaW50Y18xIC8vIDEKCnNldF9kZWZhdWx0X3N0YXR1c19ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDUtMTUwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIC8vICAgICBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODk2CiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IFVJbnQ2NChkZWZhdWx0ZWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBieXRlYyAyMiAvLyAiZGVmYXVsdGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIHNldF9kZWZhdWx0X3N0YXR1c19ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfYXNzZXRfaW5mbygpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfaW5mbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5OC04OTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF9pbmZvKHNlbGYpIC0+IHR5cC5Bc3NldEluZm86CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwOAogICAgLy8gcGVyZm9ybWFuY2UgPSBVSW50NjQoY3N0LlBSRl9QRVJGT1JNQU5UKQogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTA5CiAgICAvLyBpZiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+IHNlbGYubWF0dXJpdHlfZGF0ZSA+IDA6CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvdmVyIDQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICA+CiAgICBieiBnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDMKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9idXJ5IDIKICAgIGZyYW1lX2RpZyAxCiAgICBieiBnZXRfYXNzZXRfaW5mb19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMAogICAgLy8gcGVyZm9ybWFuY2UgPSBVSW50NjQoY3N0LlBSRl9NQVRVUkVEKQogICAgaW50Y18zIC8vIDQKICAgIGZyYW1lX2J1cnkgMgoKZ2V0X2Fzc2V0X2luZm9fYWZ0ZXJfaWZfZWxzZUAzOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTExLTkxMgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBubyBncmFjZSBvciBkZWxpbnF1ZW5jeSBwZXJpb2RzCiAgICAvLyBpZiBzZWxmLmRlZmF1bHRlZDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMiAvLyAiZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlZmF1bHRlZCBleGlzdHMKICAgIGJ6IGdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTEzCiAgICAvLyBwZXJmb3JtYW5jZSA9IFVJbnQ2NChjc3QuUFJGX0RFRkFVTFRFRCkKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBmcmFtZV9idXJ5IDAKCmdldF9hc3NldF9pbmZvX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNgogICAgLy8gZGVub21pbmF0aW9uX2Fzc2V0X2lkPWFyYzQuVUludDY0KHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNwogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM0MAogICAgLy8gcmV0dXJuIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTgKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCgpKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxOQogICAgLy8gdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NChzZWxmLnVuaXRfdmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyMAogICAgLy8gZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBpdG9iCiAgICBleHRyYWN0IDcgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTIxCiAgICAvLyBwcmluY2lwYWxfZGlzY291bnQ9YXJjNC5VSW50MTYoc2VsZi5wcmluY2lwYWxfZGlzY291bnQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJwcmluY2lwYWxfZGlzY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbmNpcGFsX2Rpc2NvdW50IGV4aXN0cwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyMgogICAgLy8gaW50ZXJlc3RfcmF0ZT1hcmM0LlVJbnQxNihzZWxmLmludGVyZXN0X3JhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIzIC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTIzCiAgICAvLyB0b3RhbF9zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi50b3RhbF91bml0cyksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTI0CiAgICAvLyBjaXJjdWxhdGluZ19zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi5jaXJjdWxhdGluZ191bml0cyksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MjYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyNS05MjcKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyOQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkyOC05MzAKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzMQogICAgLy8gaXNzdWFuY2VfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLmlzc3VhbmNlX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzMgogICAgLy8gbWF0dXJpdHlfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLm1hdHVyaXR5X2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzMwogICAgLy8gc3VzcGVuZGVkPWFyYzQuQm9vbChib29sKHNlbGYuc3VzcGVuZGVkKSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gInN1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdXNwZW5kZWQgZXhpc3RzCiAgICBieXRlYyAxNiAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNAogICAgLy8gcGVyZm9ybWFuY2U9YXJjNC5VSW50OChwZXJmb3JtYW5jZSksCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNS05MzUKICAgIC8vIHJldHVybiB0eXAuQXNzZXRJbmZvKAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCksCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLAogICAgLy8gICAgIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLm91dHN0YW5kaW5nX3ByaW5jaXBhbCgpKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSksCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIC8vICAgICBwcmluY2lwYWxfZGlzY291bnQ9YXJjNC5VSW50MTYoc2VsZi5wcmluY2lwYWxfZGlzY291bnQpLAogICAgLy8gICAgIGludGVyZXN0X3JhdGU9YXJjNC5VSW50MTYoc2VsZi5pbnRlcmVzdF9yYXRlKSwKICAgIC8vICAgICB0b3RhbF9zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi50b3RhbF91bml0cyksCiAgICAvLyAgICAgY2lyY3VsYXRpbmdfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMpLAogICAgLy8gICAgIHByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICApLAogICAgLy8gICAgIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIC8vICAgICApLAogICAgLy8gICAgIGlzc3VhbmNlX2RhdGU9YXJjNC5VSW50NjQoc2VsZi5pc3N1YW5jZV9kYXRlKSwKICAgIC8vICAgICBtYXR1cml0eV9kYXRlPWFyYzQuVUludDY0KHNlbGYubWF0dXJpdHlfZGF0ZSksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbChib29sKHNlbGYuc3VzcGVuZGVkKSksCiAgICAvLyAgICAgcGVyZm9ybWFuY2U9YXJjNC5VSW50OChwZXJmb3JtYW5jZSksCiAgICAvLyApCiAgICB1bmNvdmVyIDE0CiAgICB1bmNvdmVyIDE0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMTMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X2FjY291bnRfaW5mbyhob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2FjY291bnRfaW5mbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNy05MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hY2NvdW50X2luZm8oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MpIC0+IHR5cC5BY2NvdW50SW5mbzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1MgogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X3RpbWVfZXZlbnRzKCkgLT4gYnl0ZXM6CmdldF90aW1lX2V2ZW50czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1NC05NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF90aW1lX2V2ZW50cyhzZWxmKSAtPiB0eXAuVGltZUV2ZW50czoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTYyCiAgICAvLyB0aW1lX2V2ZW50cyA9IHR5cC5UaW1lRXZlbnRzKCkKICAgIHB1c2hieXRlcyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2MwogICAgLy8gaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCk6CiAgICBieiBnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NjQKICAgIC8vIHRpbWVfZXZlbnRzID0gc2VsZi50aW1lX2V2ZW50cy52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDI0IC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9ldmVudHMgZXhpc3RzCgpnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTY1CiAgICAvLyByZXR1cm4gdGltZV9ldmVudHMKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSgpIC0+IGJ5dGVzOgpnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2Ny05NjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlKHNlbGYpIC0+IHR5cC5UaW1lRXZlbnRzOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NzYKICAgIC8vIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk3NwogICAgLy8gYXJjNC5VSW50NjQoc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTc1LTk3OAogICAgLy8gcmV0dXJuIHR5cC5UaW1lRXZlbnRzKAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUpLAogICAgLy8gKQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hc3NldF9tZXRhZGF0YSgpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbWV0YWRhdGE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5ODAtOTgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbWV0YWRhdGEoc2VsZikgLT4gdHlwLkFzc2V0TWV0YWRhdGE6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk4OQogICAgLy8gcmV0dXJuIHR5cC5Bc3NldE1ldGFkYXRhLmZyb21fYnl0ZXMoc2VsZi5tZXRhZGF0YSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAibWV0YWRhdGEiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWV0YWRhdGEgZXhpc3RzCiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"}, "sourceInfo": {"approval": {"pcOffsetMethod": "none", "sourceInfo": [{"pc": [3272], "errorMessage": "Can not distribute zero units"}, {"pc": [2262], "errorMessage": "Coupon rates are not properly defined"}, {"pc": [2129], "errorMessage": "D-ASA already configured"}, {"pc": [1477], "errorMessage": "Defaulted"}, {"pc": [2149], "errorMessage": "Denomination asset is not properly set"}, {"pc": [2166], "errorMessage": "Different settlement asset not supported, must be equal to denomination asset"}, {"pc": [1258, 1269, 1276, 1287, 1294, 1305, 1312, 1326, 1346, 1370, 1388, 1455, 1497, 1502, 1601, 1639, 1655, 1716, 1754, 1805, 1883, 1977, 1983, 2322, 2331, 2339, 2375, 2412, 2480, 2495, 2592, 2630, 3083, 3100, 3137, 3225, 3242, 3301, 3392, 3409, 3476, 3493], "errorMessage": "Index access is out of bounds"}, {"pc": [3286], "errorMessage": "Insufficient remaining D-ASA units"}, {"pc": [1265], "errorMessage": "Insufficient sender units to transfer"}, {"pc": [2251], "errorMessage": "Interest rate is not properly defined"}, {"pc": [1208, 1220, 1635, 1870, 2047, 3043, 3133, 3261, 3439, 3732], "errorMessage": "Invalid account holding address"}, {"pc": [2753, 2775, 2795, 2815, 2835, 2941, 2958, 2973, 2988, 3003], "errorMessage": "Invalid account role address"}, {"pc": [1895], "errorMessage": "Invalid amount of units for the account"}, {"pc": [2240], "errorMessage": "Invalid day-count convention ID"}, {"pc": [2717, 2909], "errorMessage": "Invalid role identifier"}, {"pc": [2636], "errorMessage": "Invalid secondary market closure date"}, {"pc": [2600], "errorMessage": "Invalid secondary market opening date"}, {"pc": [2203], "errorMessage": "Minimum denomination is not a divisor of principal"}, {"pc": [1643], "errorMessage": "No D-ASA units"}, {"pc": [1190, 1619, 2112, 2547, 3027, 3110, 3252, 3419, 3503], "errorMessage": "Not authorized"}, {"pc": [1711], "errorMessage": "Not enough funds for the payment"}, {"pc": [1652], "errorMessage": "Not mature"}, {"pc": [706, 722, 738, 754, 773, 789, 804, 826, 845, 867, 886, 908, 930, 955, 974, 1032, 1051, 1070, 1092, 1114], "errorMessage": "OnCompletion is not NoOp"}, {"pc": [1017], "errorMessage": "OnCompletion is not UpdateApplication"}, {"pc": [3206], "errorMessage": "Primary distribution is closed"}, {"pc": [1859], "errorMessage": "Primary distribution not yet executed"}, {"pc": [1184], "errorMessage": "Secondary market is closed"}, {"pc": [1320], "errorMessage": "Sender and receiver units are not fungible"}, {"pc": [1237, 1253, 1488], "errorMessage": "Suspended operations"}, {"pc": [2296, 2556], "errorMessage": "Time events length is invalid"}, {"pc": [2419], "errorMessage": "Time events must be set in the future"}, {"pc": [2501], "errorMessage": "Time events must be sorted in strictly ascending order"}, {"pc": [2386], "errorMessage": "Time periods are not properly defined"}, {"pc": [2523], "errorMessage": "Time periods in Actual/Actual day count convention must be multiples of a day (in seconds)"}, {"pc": [527], "errorMessage": "Wrong Global Bytes allocation"}, {"pc": [533], "errorMessage": "Wrong Global UInts allocation"}, {"pc": [537], "errorMessage": "Wrong Local Bytes allocation"}, {"pc": [541], "errorMessage": "Wrong Local UInts allocation"}, {"pc": [1707], "errorMessage": "account opted into asset"}, {"pc": [2141], "errorMessage": "asset exists"}, {"pc": [1036], "errorMessage": "can only call when creating"}, {"pc": [709, 725, 741, 757, 776, 792, 807, 829, 848, 870, 889, 911, 933, 958, 977, 1020, 1054, 1073, 1095, 1117], "errorMessage": "can only call when not creating"}, {"pc": [1224, 1240, 1257, 1268, 1275, 1286, 1293, 1304, 1311, 1325, 1345, 1357, 1369, 1381, 1387, 1399, 1410, 1437, 1449, 1453, 1600, 1638, 1654, 1673, 1715, 1753, 1764, 1804, 1882, 3136, 3300, 3310, 3327, 3442, 3734], "errorMessage": "check self.account entry exists"}, {"pc": [3082, 3099], "errorMessage": "check self.account_manager entry exists"}, {"pc": [2110], "errorMessage": "check self.arranger exists"}, {"pc": [3391, 3408], "errorMessage": "check self.authority entry exists"}, {"pc": [1746, 1822, 3147, 3276, 3290, 3340, 3582, 3632], "errorMessage": "check self.circulating_units exists"}, {"pc": [1560, 2506, 3600], "errorMessage": "check self.day_count_convention exists"}, {"pc": [1475, 3559], "errorMessage": "check self.defaulted exists"}, {"pc": [2162, 3571], "errorMessage": "check self.denomination_asset_id exists"}, {"pc": [3618], "errorMessage": "check self.interest_rate exists"}, {"pc": [1539, 1551, 1939, 2583, 3650], "errorMessage": "check self.issuance_date exists"}, {"pc": [1546, 1650, 1953, 1995, 2609, 2617, 3534, 3656], "errorMessage": "check self.maturity_date exists"}, {"pc": [3794], "errorMessage": "check self.metadata exists"}, {"pc": [3224, 3241], "errorMessage": "check self.primary_dealer entry exists"}, {"pc": [3198, 3644], "errorMessage": "check self.primary_distribution_closure_date exists"}, {"pc": [1843, 1853, 3184, 3638], "errorMessage": "check self.primary_distribution_opening_date exists"}, {"pc": [1517, 1915, 3609], "errorMessage": "check self.principal_discount exists"}, {"pc": [1176, 2651, 3777], "errorMessage": "check self.secondary_market_closure_date exists"}, {"pc": [1162, 2645, 3771], "errorMessage": "check self.secondary_market_opening_date exists"}, {"pc": [1662, 1704, 1726, 2178, 3577], "errorMessage": "check self.settlement_asset_id exists"}, {"pc": [1151, 1615, 2052, 2127, 2542, 3022, 3173, 3746], "errorMessage": "check self.status exists"}, {"pc": [1486, 3662], "errorMessage": "check self.suspended exists"}, {"pc": [3759], "errorMessage": "check self.time_events exists"}, {"pc": [2271, 2292, 2358], "errorMessage": "check self.total_coupons exists"}, {"pc": [3284, 3336, 3627], "errorMessage": "check self.total_units exists"}, {"pc": [3475, 3492], "errorMessage": "check self.trustee entry exists"}, {"pc": [3322, 3587, 3594], "errorMessage": "check self.unit_value exists"}]}, "clear": {"pcOffsetMethod": "none", "sourceInfo": []}}, "templateVariables": {}}""" APP_SPEC = algokit_utils.Arc56Contract.from_json(_APP_SPEC_JSON) def _parse_abi_args(args: typing.Any | None = None) -> list[typing.Any] | None: @@ -96,12 +96,18 @@ class AssetMetadata: prospectus_hash: bytes prospectus_url: str +@dataclasses.dataclass(frozen=True) +class DayCountFactor: + """Struct for DayCountFactor""" + numerator: int + denominator: int + @dataclasses.dataclass(frozen=True) class CurrentUnitsValue: """Struct for CurrentUnitsValue""" units_value: int accrued_interest: int - day_count_factor: tuple[int, int] + day_count_factor: DayCountFactor @dataclasses.dataclass(frozen=True) class PaymentAmounts: @@ -116,6 +122,12 @@ class PaymentResult: timestamp: int context: bytes +@dataclasses.dataclass(frozen=True) +class RoleConfig: + """Struct for RoleConfig""" + role_validity_start: int + role_validity_end: int + @dataclasses.dataclass(frozen=True) class SecondaryMarketSchedule: """Struct for SecondaryMarketSchedule""" @@ -1210,25 +1222,31 @@ def clear_state( class GlobalStateValue(typing.TypedDict): """Shape of global_state state key values""" arranger: bytes - circulating_units: int - day_count_convention: int - defaulted: int denomination_asset_id: int - interest_rate: int - issuance_date: int - maturity_date: int + settlement_asset_id: int + unit_value: int + day_count_convention: int metadata: bytes - primary_distribution_closure_date: int - primary_distribution_opening_date: int + total_units: int + circulating_units: int principal_discount: int - secondary_market_closure_date: int + interest_rate: int + total_coupons: int + primary_distribution_opening_date: int + primary_distribution_closure_date: int + issuance_date: int secondary_market_opening_date: int - settlement_asset_id: int + secondary_market_closure_date: int + maturity_date: int status: int suspended: int - total_coupons: int - total_units: int - unit_value: int + defaulted: int + +class BoxStateValue(typing.TypedDict): + """Shape of box state key values""" + coupon_rates: list[int] + time_events: list[int] + time_periods: list[tuple[int, int]] class ZeroCouponBondState: """Methods to access state for the current ZeroCouponBond app""" @@ -1243,6 +1261,13 @@ def global_state( """Methods to access global_state for the current app""" return _GlobalState(self.app_client) + @property + def box( + self + ) -> "_BoxState": + """Methods to access box for the current app""" + return _BoxState(self.app_client) + class _GlobalState: def __init__(self, app_client: algokit_utils.AppClient): self.app_client = app_client @@ -1275,73 +1300,81 @@ def arranger(self) -> bytes: return typing.cast(bytes, value) @property - def circulating_units(self) -> int: - """Get the current value of the circulating_units key in global_state state""" - value = self.app_client.state.global_state.get_value("circulating_units") + def denomination_asset_id(self) -> int: + """Get the current value of the denomination_asset_id key in global_state state""" + value = self.app_client.state.global_state.get_value("denomination_asset_id") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def day_count_convention(self) -> int: - """Get the current value of the day_count_convention key in global_state state""" - value = self.app_client.state.global_state.get_value("day_count_convention") + def settlement_asset_id(self) -> int: + """Get the current value of the settlement_asset_id key in global_state state""" + value = self.app_client.state.global_state.get_value("settlement_asset_id") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def defaulted(self) -> int: - """Get the current value of the defaulted key in global_state state""" - value = self.app_client.state.global_state.get_value("defaulted") + def unit_value(self) -> int: + """Get the current value of the unit_value key in global_state state""" + value = self.app_client.state.global_state.get_value("unit_value") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def denomination_asset_id(self) -> int: - """Get the current value of the denomination_asset_id key in global_state state""" - value = self.app_client.state.global_state.get_value("denomination_asset_id") + def day_count_convention(self) -> int: + """Get the current value of the day_count_convention key in global_state state""" + value = self.app_client.state.global_state.get_value("day_count_convention") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def interest_rate(self) -> int: - """Get the current value of the interest_rate key in global_state state""" - value = self.app_client.state.global_state.get_value("interest_rate") + def metadata(self) -> bytes: + """Get the current value of the metadata key in global_state state""" + value = self.app_client.state.global_state.get_value("metadata") + if isinstance(value, dict) and "AVMBytes" in self._struct_classes: + return self._struct_classes["AVMBytes"](**value) # type: ignore + return typing.cast(bytes, value) + + @property + def total_units(self) -> int: + """Get the current value of the total_units key in global_state state""" + value = self.app_client.state.global_state.get_value("total_units") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def issuance_date(self) -> int: - """Get the current value of the issuance_date key in global_state state""" - value = self.app_client.state.global_state.get_value("issuance_date") + def circulating_units(self) -> int: + """Get the current value of the circulating_units key in global_state state""" + value = self.app_client.state.global_state.get_value("circulating_units") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def maturity_date(self) -> int: - """Get the current value of the maturity_date key in global_state state""" - value = self.app_client.state.global_state.get_value("maturity_date") + def principal_discount(self) -> int: + """Get the current value of the principal_discount key in global_state state""" + value = self.app_client.state.global_state.get_value("principal_discount") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def metadata(self) -> bytes: - """Get the current value of the metadata key in global_state state""" - value = self.app_client.state.global_state.get_value("metadata") - if isinstance(value, dict) and "AVMBytes" in self._struct_classes: - return self._struct_classes["AVMBytes"](**value) # type: ignore - return typing.cast(bytes, value) + def interest_rate(self) -> int: + """Get the current value of the interest_rate key in global_state state""" + value = self.app_client.state.global_state.get_value("interest_rate") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) @property - def primary_distribution_closure_date(self) -> int: - """Get the current value of the primary_distribution_closure_date key in global_state state""" - value = self.app_client.state.global_state.get_value("primary_distribution_closure_date") + def total_coupons(self) -> int: + """Get the current value of the total_coupons key in global_state state""" + value = self.app_client.state.global_state.get_value("total_coupons") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @@ -1355,17 +1388,17 @@ def primary_distribution_opening_date(self) -> int: return typing.cast(int, value) @property - def principal_discount(self) -> int: - """Get the current value of the principal_discount key in global_state state""" - value = self.app_client.state.global_state.get_value("principal_discount") + def primary_distribution_closure_date(self) -> int: + """Get the current value of the primary_distribution_closure_date key in global_state state""" + value = self.app_client.state.global_state.get_value("primary_distribution_closure_date") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @property - def secondary_market_closure_date(self) -> int: - """Get the current value of the secondary_market_closure_date key in global_state state""" - value = self.app_client.state.global_state.get_value("secondary_market_closure_date") + def issuance_date(self) -> int: + """Get the current value of the issuance_date key in global_state state""" + value = self.app_client.state.global_state.get_value("issuance_date") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @@ -1379,9 +1412,17 @@ def secondary_market_opening_date(self) -> int: return typing.cast(int, value) @property - def settlement_asset_id(self) -> int: - """Get the current value of the settlement_asset_id key in global_state state""" - value = self.app_client.state.global_state.get_value("settlement_asset_id") + def secondary_market_closure_date(self) -> int: + """Get the current value of the secondary_market_closure_date key in global_state state""" + value = self.app_client.state.global_state.get_value("secondary_market_closure_date") + if isinstance(value, dict) and "AVMUint64" in self._struct_classes: + return self._struct_classes["AVMUint64"](**value) # type: ignore + return typing.cast(int, value) + + @property + def maturity_date(self) -> int: + """Get the current value of the maturity_date key in global_state state""" + value = self.app_client.state.global_state.get_value("maturity_date") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) @@ -1403,28 +1444,151 @@ def suspended(self) -> int: return typing.cast(int, value) @property - def total_coupons(self) -> int: - """Get the current value of the total_coupons key in global_state state""" - value = self.app_client.state.global_state.get_value("total_coupons") + def defaulted(self) -> int: + """Get the current value of the defaulted key in global_state state""" + value = self.app_client.state.global_state.get_value("defaulted") if isinstance(value, dict) and "AVMUint64" in self._struct_classes: return self._struct_classes["AVMUint64"](**value) # type: ignore return typing.cast(int, value) +class _BoxState: + def __init__(self, app_client: algokit_utils.AppClient): + self.app_client = app_client + + # Pre-generated mapping of value types to their struct classes + self._struct_classes: dict[str, typing.Type[typing.Any]] = { + "RoleConfig": RoleConfig, + "AccountInfo": AccountInfo + } + + def get_all(self) -> BoxStateValue: + """Get all current keyed values from box state""" + result = self.app_client.state.box.get_all() + if not result: + return typing.cast(BoxStateValue, {}) + + converted = {} + for key, value in result.items(): + key_info = self.app_client.app_spec.state.keys.box.get(key) + struct_class = self._struct_classes.get(key_info.value_type) if key_info else None + converted[key] = ( + struct_class(**value) if struct_class and isinstance(value, dict) + else value + ) + return typing.cast(BoxStateValue, converted) + @property - def total_units(self) -> int: - """Get the current value of the total_units key in global_state state""" - value = self.app_client.state.global_state.get_value("total_units") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + def coupon_rates(self) -> list[int]: + """Get the current value of the coupon_rates key in box state""" + value = self.app_client.state.box.get_value("coupon_rates") + if isinstance(value, dict) and "uint16[]" in self._struct_classes: + return self._struct_classes["uint16[]"](**value) # type: ignore + return typing.cast(list[int], value) @property - def unit_value(self) -> int: - """Get the current value of the unit_value key in global_state state""" - value = self.app_client.state.global_state.get_value("unit_value") - if isinstance(value, dict) and "AVMUint64" in self._struct_classes: - return self._struct_classes["AVMUint64"](**value) # type: ignore - return typing.cast(int, value) + def time_events(self) -> list[int]: + """Get the current value of the time_events key in box state""" + value = self.app_client.state.box.get_value("time_events") + if isinstance(value, dict) and "uint64[]" in self._struct_classes: + return self._struct_classes["uint64[]"](**value) # type: ignore + return typing.cast(list[int], value) + + @property + def time_periods(self) -> list[tuple[int, int]]: + """Get the current value of the time_periods key in box state""" + value = self.app_client.state.box.get_value("time_periods") + if isinstance(value, dict) and "(uint64,uint64)[]" in self._struct_classes: + return self._struct_classes["(uint64,uint64)[]"](**value) # type: ignore + return typing.cast(list[tuple[int, int]], value) + + @property + def account_manager(self) -> "_MapState[str, RoleConfig]": + """Get values from the account_manager map in box state""" + return _MapState( + self.app_client.state.box, + "account_manager", + self._struct_classes.get("RoleConfig") + ) + + @property + def primary_dealer(self) -> "_MapState[str, RoleConfig]": + """Get values from the primary_dealer map in box state""" + return _MapState( + self.app_client.state.box, + "primary_dealer", + self._struct_classes.get("RoleConfig") + ) + + @property + def trustee(self) -> "_MapState[str, RoleConfig]": + """Get values from the trustee map in box state""" + return _MapState( + self.app_client.state.box, + "trustee", + self._struct_classes.get("RoleConfig") + ) + + @property + def authority(self) -> "_MapState[str, RoleConfig]": + """Get values from the authority map in box state""" + return _MapState( + self.app_client.state.box, + "authority", + self._struct_classes.get("RoleConfig") + ) + + @property + def interest_oracle(self) -> "_MapState[str, RoleConfig]": + """Get values from the interest_oracle map in box state""" + return _MapState( + self.app_client.state.box, + "interest_oracle", + self._struct_classes.get("RoleConfig") + ) + + @property + def account(self) -> "_MapState[str, AccountInfo]": + """Get values from the account map in box state""" + return _MapState( + self.app_client.state.box, + "account", + self._struct_classes.get("AccountInfo") + ) + +_KeyType = typing.TypeVar("_KeyType") +_ValueType = typing.TypeVar("_ValueType") + +class _AppClientStateMethodsProtocol(typing.Protocol): + def get_map(self, map_name: str) -> dict[typing.Any, typing.Any]: + ... + def get_map_value(self, map_name: str, key: typing.Any) -> typing.Any | None: + ... + +class _MapState(typing.Generic[_KeyType, _ValueType]): + """Generic class for accessing state maps with strongly typed keys and values""" + + def __init__(self, state_accessor: _AppClientStateMethodsProtocol, map_name: str, + struct_class: typing.Type[_ValueType] | None = None): + self._state_accessor = state_accessor + self._map_name = map_name + self._struct_class = struct_class + + def get_map(self) -> dict[_KeyType, _ValueType]: + """Get all current values in the map""" + result = self._state_accessor.get_map(self._map_name) + if self._struct_class and result: + return {k: self._struct_class(**v) if isinstance(v, dict) else v + for k, v in result.items()} + return typing.cast(dict[_KeyType, _ValueType], result or {}) + + def get_value(self, key: _KeyType) -> _ValueType | None: + """Get a value from the map by key""" + key_value = dataclasses.asdict(key) if dataclasses.is_dataclass(key) else key # type: ignore + value = self._state_accessor.get_map_value(self._map_name, key_value) + if value is not None and self._struct_class and isinstance(value, dict): + return self._struct_class(**value) + return typing.cast(_ValueType | None, value) + class ZeroCouponBondClient: """Client for interacting with ZeroCouponBond smart contract""" diff --git a/tests/base_d_asa/conftest.py b/tests/base_d_asa/conftest.py index 1ac74a1..4866aee 100644 --- a/tests/base_d_asa/conftest.py +++ b/tests/base_d_asa/conftest.py @@ -255,16 +255,16 @@ def _factory(base_d_asa_client: BaseDAsaClient) -> utils.DAsaAccount: def base_d_asa_client_primary( base_d_asa_client_active: BaseDAsaClient, ) -> BaseDAsaClient: - state = base_d_asa_client_active.state.global_state.get_all() + state = base_d_asa_client_active.state.global_state base_d_asa_client_active.send.set_secondary_time_events( args=SetSecondaryTimeEventsArgs( secondary_market_time_events=[ - state["issuance_date"], - state["maturity_date"], + state.issuance_date, + state.maturity_date, ] ) ) - utils.time_warp(state["primary_distribution_opening_date"]) + utils.time_warp(state.primary_distribution_opening_date) return base_d_asa_client_active @@ -298,8 +298,8 @@ def account_a( def base_d_asa_client_ongoing( base_d_asa_client_primary: BaseDAsaClient, ) -> BaseDAsaClient: - state = base_d_asa_client_primary.state.global_state.get_all() - utils.time_warp(state["issuance_date"]) + state = base_d_asa_client_primary.state.global_state + utils.time_warp(state.issuance_date) return base_d_asa_client_primary diff --git a/tests/base_d_asa/test_asset_config.py b/tests/base_d_asa/test_asset_config.py index e8be090..de82513 100644 --- a/tests/base_d_asa/test_asset_config.py +++ b/tests/base_d_asa/test_asset_config.py @@ -1,7 +1,7 @@ from copy import deepcopy import pytest -from algokit_utils import LogicError, SigningAccount +from algokit_utils import SigningAccount from smart_contracts import constants as sc_cst from smart_contracts import errors as err @@ -84,7 +84,7 @@ def test_fail_unauthorized( base_d_asa_cfg: DAsaConfig, base_d_asa_client_empty: BaseDAsaClient, ) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): + with pytest.raises(Exception, match=err.UNAUTHORIZED): base_d_asa_client_empty.send.asset_config( AssetConfigArgs(**base_d_asa_cfg.dictify()), params=CommonAppCallParams(sender=oscar.address, signer=oscar.signer), @@ -94,7 +94,7 @@ def test_fail_unauthorized( def test_fail_already_configured( base_d_asa_cfg: DAsaConfig, base_d_asa_client_active: BaseDAsaClient ) -> None: - with pytest.raises(LogicError, match=err.ALREADY_CONFIGURED): + with pytest.raises(Exception, match=err.ALREADY_CONFIGURED): base_d_asa_client_active.send.asset_config( AssetConfigArgs(**base_d_asa_cfg.dictify()) ) @@ -106,7 +106,7 @@ def test_fail_invalid_minimum_denomination( ) -> None: wrong_d_asa_cfg = deepcopy(base_d_asa_cfg) wrong_d_asa_cfg.minimum_denomination = wrong_d_asa_cfg.minimum_denomination - 1 - with pytest.raises(LogicError, match=err.INVALID_MINIMUM_DENOMINATION): + with pytest.raises(Exception, match=err.INVALID_MINIMUM_DENOMINATION): base_d_asa_client_empty.send.asset_config( AssetConfigArgs(**wrong_d_asa_cfg.dictify()) ) @@ -122,7 +122,7 @@ def test_fail_invalid_day_count_convention( ) -> None: wrong_d_asa_cfg = deepcopy(base_d_asa_cfg) wrong_d_asa_cfg.day_count_convention = sc_cst.DCC_CONT - 1 - with pytest.raises(LogicError, match=err.INVALID_DAY_COUNT_CONVENTION): + with pytest.raises(Exception, match=err.INVALID_DAY_COUNT_CONVENTION): base_d_asa_client_empty.send.asset_config( AssetConfigArgs(**wrong_d_asa_cfg.dictify()) ) @@ -142,7 +142,7 @@ def test_fail_invalid_time_events_length( ) -> None: wrong_d_asa_cfg = deepcopy(base_d_asa_cfg) wrong_d_asa_cfg.time_events = [*base_d_asa_cfg.time_events, 0] - with pytest.raises(LogicError, match=err.INVALID_TIME_EVENTS_LENGTH): + with pytest.raises(Exception, match=err.INVALID_TIME_EVENTS_LENGTH): base_d_asa_client_empty.send.asset_config( AssetConfigArgs(**wrong_d_asa_cfg.dictify()) ) @@ -154,7 +154,7 @@ def test_fail_invalid_time( ) -> None: wrong_d_asa_cfg = deepcopy(base_d_asa_cfg) wrong_d_asa_cfg.time_events[0] = 0 - with pytest.raises(LogicError, match=err.INVALID_TIME): + with pytest.raises(Exception, match=err.INVALID_TIME): base_d_asa_client_empty.send.asset_config( AssetConfigArgs(**wrong_d_asa_cfg.dictify()) ) @@ -166,14 +166,14 @@ def test_fail_invalid_sorting( ) -> None: wrong_d_asa_cfg = deepcopy(base_d_asa_cfg) wrong_d_asa_cfg.time_events[-1] = base_d_asa_cfg.time_events[-2] - with pytest.raises(LogicError, match=err.INVALID_SORTING): + with pytest.raises(Exception, match=err.INVALID_SORTING): base_d_asa_client_empty.send.asset_config( AssetConfigArgs(**wrong_d_asa_cfg.dictify()) ) wrong_d_asa_cfg = deepcopy(base_d_asa_cfg) wrong_d_asa_cfg.time_events[0] = base_d_asa_cfg.time_events[-1] - with pytest.raises(LogicError, match=err.INVALID_SORTING): + with pytest.raises(Exception, match=err.INVALID_SORTING): base_d_asa_client_empty.send.asset_config( AssetConfigArgs(**wrong_d_asa_cfg.dictify()) ) @@ -189,7 +189,7 @@ def test_fail_invalid_settlement_asset( ) -> None: wrong_d_asa_cfg = deepcopy(base_d_asa_cfg) wrong_d_asa_cfg.settlement_asset_id = wrong_d_asa_cfg.denomination_asset_id + 1 - with pytest.raises(LogicError, match=err.INVALID_SETTLEMENT_ASSET): + with pytest.raises(Exception, match=err.INVALID_SETTLEMENT_ASSET): base_d_asa_client_empty.send.asset_config( AssetConfigArgs(**wrong_d_asa_cfg.dictify()) ) diff --git a/tests/base_d_asa/test_asset_update.py b/tests/base_d_asa/test_asset_update.py index 614041a..89f018a 100644 --- a/tests/base_d_asa/test_asset_update.py +++ b/tests/base_d_asa/test_asset_update.py @@ -1,5 +1,5 @@ import pytest -from algokit_utils import LogicError, SigningAccount +from algokit_utils import SigningAccount from smart_contracts import constants as sc_cst from smart_contracts import errors as err @@ -38,9 +38,12 @@ def test_fail_unauthorized( oscar: SigningAccount, base_d_asa_client_active: BaseDAsaClient, ) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): + # NOTE: This is now identified as a runtime error not a LogicError, because the error messages comes + # directly from the ARC56 source. + # see contets of the arc56 file for more details. This is also consistent with the behaviour on the utils-ts + # https://github.com/algorandfoundation/algokit-utils-ts/blob/b1392427938594404b70148f6309363ca77b1b55/src/types/app-client.ts#L956 + with pytest.raises(Exception, match=err.UNAUTHORIZED): base_d_asa_client_active.send.update.asset_update( args=AssetUpdateArgs(metadata=asset_metadata), params=CommonAppCallParams(sender=oscar.address, signer=oscar.signer), - compilation_params={}, ) diff --git a/tests/base_d_asa/test_open_account.py b/tests/base_d_asa/test_open_account.py index e2555a4..0283214 100644 --- a/tests/base_d_asa/test_open_account.py +++ b/tests/base_d_asa/test_open_account.py @@ -4,7 +4,6 @@ from algokit_utils import ( AlgoAmount, AlgorandClient, - LogicError, SigningAccount, ) @@ -36,7 +35,7 @@ def test_pass_open_account( params=CommonAppCallParams( sender=account_manager.address, signer=account_manager.signer, - static_fee=AlgoAmount.from_algo(1), + max_fee=AlgoAmount.from_algo(1), ), ) @@ -64,9 +63,12 @@ def test_fail_unauthorized_caller( holding = algorand.account.random() payment = algorand.account.random() - with pytest.raises(LogicError, match=err.UNAUTHORIZED): + with pytest.raises(Exception, match=err.UNAUTHORIZED): base_d_asa_client_empty.send.open_account( - args=(holding.address, payment.address), + OpenAccountArgs( + holding_address=holding.address, + payment_address=payment.address, + ), params=CommonAppCallParams( sender=oscar.address, ), @@ -89,9 +91,12 @@ def test_fail_suspended( holding = algorand.account.random() payment = algorand.account.random() - with pytest.raises(LogicError, match=err.SUSPENDED): + with pytest.raises(Exception, match=err.SUSPENDED): base_d_asa_client_suspended.send.open_account( - args=(holding.address, payment.address), + args=OpenAccountArgs( + holding_address=holding.address, + payment_address=payment.address, + ), params=CommonAppCallParams( sender=account_manager.address, ), @@ -103,10 +108,14 @@ def test_fail_invalid_holding_address( account_manager: DAsaAccountManager, account_a: DAsaAccount, ) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): + with pytest.raises(Exception) as exc_info: base_d_asa_client_empty.send.open_account( - args=(account_a.holding_address, account_a.payment_address), + args=OpenAccountArgs( + holding_address=account_a.holding_address, + payment_address=account_a.payment_address, + ), params=CommonAppCallParams( sender=account_manager.address, ), ) + print(exc_info) diff --git a/tests/base_d_asa/test_primary_distribution.py b/tests/base_d_asa/test_primary_distribution.py index da578a0..f5f0063 100644 --- a/tests/base_d_asa/test_primary_distribution.py +++ b/tests/base_d_asa/test_primary_distribution.py @@ -3,8 +3,6 @@ import pytest from algokit_utils import ( AlgorandClient, - LogicError, - OnCompleteCallParameters, SigningAccount, ) @@ -84,7 +82,7 @@ def test_fail_primary_distribution_closed( >= state.primary_distribution_closure_date ) - with pytest.raises(LogicError, match=err.PRIMARY_DISTRIBUTION_CLOSED): + with pytest.raises(Exception, match=err.PRIMARY_DISTRIBUTION_CLOSED): base_d_asa_client_primary.primary_distribution( holding_address=account.holding_address, units=ACCOUNT_TEST_UNITS, @@ -100,7 +98,7 @@ def test_fail_unauthorized( account_factory: Callable[..., DAsaAccount], ) -> None: account = account_factory(base_d_asa_client_primary) - with pytest.raises(LogicError, match=err.UNAUTHORIZED): + with pytest.raises(Exception, match=err.UNAUTHORIZED): base_d_asa_client_primary.primary_distribution( holding_address=account.holding_address, units=ACCOUNT_TEST_UNITS, @@ -139,7 +137,7 @@ def test_fail_suspended( boxes=[(base_d_asa_client_primary.app_id, authority.box_id)], ), ) - with pytest.raises(LogicError, match=err.SUSPENDED): + with pytest.raises(Exception, match=err.SUSPENDED): base_d_asa_client_primary.primary_distribution( holding_address=account.holding_address, units=ACCOUNT_TEST_UNITS, @@ -159,7 +157,7 @@ def test_fail_zero_units( account_factory: Callable[..., DAsaAccount], ) -> None: account = account_factory(base_d_asa_client_primary) - with pytest.raises(LogicError, match=err.ZERO_UNITS): + with pytest.raises(Exception, match=err.ZERO_UNITS): base_d_asa_client_primary.primary_distribution( holding_address=account.holding_address, units=0, @@ -181,7 +179,7 @@ def test_fail_over_distribution( account = account_factory(base_d_asa_client_primary) state = base_d_asa_client_primary.get_global_state() - with pytest.raises(LogicError, match=err.OVER_DISTRIBUTION): + with pytest.raises(Exception, match=err.OVER_DISTRIBUTION): base_d_asa_client_primary.primary_distribution( holding_address=account.holding_address, units=state.total_units + 1, diff --git a/tests/base_d_asa/test_set_asset_suspension.py b/tests/base_d_asa/test_set_asset_suspension.py index 6e40167..404cf1d 100644 --- a/tests/base_d_asa/test_set_asset_suspension.py +++ b/tests/base_d_asa/test_set_asset_suspension.py @@ -1,5 +1,5 @@ import pytest -from algokit_utils import LogicError, OnCompleteCallParameters, SigningAccount +from algokit_utils import OnCompleteCallParameters, SigningAccount from smart_contracts import errors as err from smart_contracts.artifacts.base_d_asa.base_d_asa_client import BaseDAsaClient @@ -27,7 +27,7 @@ def test_pass_set_asset_suspension( def test_fail_unauthorized( oscar: SigningAccount, base_d_asa_client_active: BaseDAsaClient ) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): + with pytest.raises(Exception, match=err.UNAUTHORIZED): base_d_asa_client_active.set_asset_suspension( suspended=True, transaction_parameters=OnCompleteCallParameters( diff --git a/tests/base_d_asa/test_set_secondary_time_schedule.py b/tests/base_d_asa/test_set_secondary_time_schedule.py index 8711368..d28d20d 100644 --- a/tests/base_d_asa/test_set_secondary_time_schedule.py +++ b/tests/base_d_asa/test_set_secondary_time_schedule.py @@ -1,5 +1,5 @@ import pytest -from algokit_utils import LogicError, OnCompleteCallParameters, SigningAccount +from algokit_utils import OnCompleteCallParameters, SigningAccount from smart_contracts import constants as sc_cst from smart_contracts import errors as err @@ -31,7 +31,7 @@ def test_fail_unauthorized_caller( oscar: SigningAccount, base_d_asa_client_active: BaseDAsaClient ) -> None: state = base_d_asa_client_active.get_global_state() - with pytest.raises(LogicError, match=err.UNAUTHORIZED): + with pytest.raises(Exception, match=err.UNAUTHORIZED): base_d_asa_client_active.set_secondary_time_events( secondary_market_time_events=[state.issuance_date, state.maturity_date], transaction_parameters=OnCompleteCallParameters(signer=oscar.signer), @@ -49,7 +49,7 @@ def test_fail_defaulted_status() -> None: def test_fail_invalid_time_events_length( base_d_asa_client_active: BaseDAsaClient, ) -> None: - with pytest.raises(LogicError, match=err.INVALID_TIME_EVENTS_LENGTH): + with pytest.raises(Exception, match=err.INVALID_TIME_EVENTS_LENGTH): base_d_asa_client_active.set_secondary_time_events( secondary_market_time_events=[], ) @@ -57,7 +57,7 @@ def test_fail_invalid_time_events_length( def test_fail_invalid_sorting(base_d_asa_client_active: BaseDAsaClient) -> None: state = base_d_asa_client_active.get_global_state() - with pytest.raises(LogicError, match=err.INVALID_SORTING): + with pytest.raises(Exception, match=err.INVALID_SORTING): base_d_asa_client_active.set_secondary_time_events( secondary_market_time_events=[state.maturity_date, state.issuance_date], ) @@ -70,7 +70,7 @@ def test_invalid_secondary_opening_date( base_d_asa_client_active: BaseDAsaClient, ) -> None: state = base_d_asa_client_active.get_global_state() - with pytest.raises(LogicError, match=err.INVALID_SECONDARY_OPENING_DATE): + with pytest.raises(Exception, match=err.INVALID_SECONDARY_OPENING_DATE): base_d_asa_client_active.set_secondary_time_events( secondary_market_time_events=[ state.issuance_date - 1 * sc_cst.DAY_2_SEC, @@ -83,7 +83,7 @@ def test_invalid_secondary_closure_date( base_d_asa_client_active: BaseDAsaClient, ) -> None: state = base_d_asa_client_active.get_global_state() - with pytest.raises(LogicError, match=err.INVALID_SECONDARY_CLOSURE_DATE): + with pytest.raises(Exception, match=err.INVALID_SECONDARY_CLOSURE_DATE): base_d_asa_client_active.set_secondary_time_events( secondary_market_time_events=[ state.issuance_date, diff --git a/tests/fixed_coupon_bond/test_asset_config.py b/tests/fixed_coupon_bond/test_asset_config.py index 2d358f5..0d41bb1 100644 --- a/tests/fixed_coupon_bond/test_asset_config.py +++ b/tests/fixed_coupon_bond/test_asset_config.py @@ -1,7 +1,7 @@ from copy import deepcopy import pytest -from algokit_utils import LogicError, OnCompleteCallParameters +from algokit_utils import OnCompleteCallParameters from smart_contracts import constants as sc_cst from smart_contracts import errors as err @@ -110,7 +110,7 @@ def test_fail_invalid_time_events_length( ) -> None: wrong_d_asa_cfg = deepcopy(fixed_coupon_bond_cfg) wrong_d_asa_cfg.time_events = [*fixed_coupon_bond_cfg.time_events, 0] - with pytest.raises(LogicError, match=err.INVALID_TIME_EVENTS_LENGTH): + with pytest.raises(Exception, match=err.INVALID_TIME_EVENTS_LENGTH): fixed_coupon_bond_client_empty.asset_config( **wrong_d_asa_cfg.dictify(), transaction_parameters=OnCompleteCallParameters( @@ -129,7 +129,7 @@ def test_fail_invalid_time( ) -> None: wrong_d_asa_cfg = deepcopy(fixed_coupon_bond_cfg) wrong_d_asa_cfg.time_events[0] = 0 - with pytest.raises(LogicError, match=err.INVALID_TIME): + with pytest.raises(Exception, match=err.INVALID_TIME): fixed_coupon_bond_client_empty.asset_config( **wrong_d_asa_cfg.dictify(), transaction_parameters=OnCompleteCallParameters( @@ -148,7 +148,7 @@ def test_fail_invalid_sorting( ) -> None: wrong_d_asa_cfg = deepcopy(fixed_coupon_bond_cfg) wrong_d_asa_cfg.time_events[-1] = fixed_coupon_bond_cfg.time_events[-2] - with pytest.raises(LogicError, match=err.INVALID_SORTING): + with pytest.raises(Exception, match=err.INVALID_SORTING): fixed_coupon_bond_client_empty.asset_config( **wrong_d_asa_cfg.dictify(), transaction_parameters=OnCompleteCallParameters( @@ -162,7 +162,7 @@ def test_fail_invalid_sorting( wrong_d_asa_cfg = deepcopy(fixed_coupon_bond_cfg) wrong_d_asa_cfg.time_events[0] = fixed_coupon_bond_cfg.time_events[-1] - with pytest.raises(LogicError, match=err.INVALID_SORTING): + with pytest.raises(Exception, match=err.INVALID_SORTING): fixed_coupon_bond_client_empty.asset_config( **wrong_d_asa_cfg.dictify(), transaction_parameters=OnCompleteCallParameters( diff --git a/tests/fixed_coupon_bond/test_asset_transfer.py b/tests/fixed_coupon_bond/test_asset_transfer.py index d8d2728..fe0b594 100644 --- a/tests/fixed_coupon_bond/test_asset_transfer.py +++ b/tests/fixed_coupon_bond/test_asset_transfer.py @@ -3,8 +3,6 @@ import pytest from algokit_utils import ( AlgorandClient, - LogicError, - OnCompleteCallParameters, SigningAccount, ) @@ -208,7 +206,7 @@ def test_fail_secondary_market_not_open_yet( account_a: DAsaAccount, account_b: DAsaAccount, ) -> None: - with pytest.raises(LogicError, match=err.SECONDARY_MARKET_CLOSED): + with pytest.raises(Exception, match=err.SECONDARY_MARKET_CLOSED): fixed_coupon_bond_client_primary.asset_transfer( sender_holding_address=account_a.holding_address, receiver_holding_address=account_b.holding_address, @@ -240,7 +238,7 @@ def test_fail_unauthorized( account_b: DAsaAccount, fixed_coupon_bond_client_ongoing: FixedCouponBondClient, ) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): + with pytest.raises(Exception, match=err.UNAUTHORIZED): fixed_coupon_bond_client_ongoing.asset_transfer( sender_holding_address=account_a.holding_address, receiver_holding_address=account_b.holding_address, @@ -268,7 +266,7 @@ def test_fail_suspended( account_b: DAsaAccount, fixed_coupon_bond_client_suspended: FixedCouponBondClient, ) -> None: - with pytest.raises(LogicError, match=err.SUSPENDED): + with pytest.raises(Exception, match=err.SUSPENDED): fixed_coupon_bond_client_suspended.asset_transfer( sender_holding_address=account_a.holding_address, receiver_holding_address=account_b.holding_address, @@ -296,7 +294,7 @@ def test_fail_invalid_sender( account_a: DAsaAccount, fixed_coupon_bond_client_ongoing: FixedCouponBondClient, ) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): + with pytest.raises(Exception, match=err.INVALID_HOLDING_ADDRESS): fixed_coupon_bond_client_ongoing.asset_transfer( sender_holding_address=oscar.address, receiver_holding_address=account_a.holding_address, @@ -327,7 +325,7 @@ def test_fail_invalid_receiver( account_a: DAsaAccount, fixed_coupon_bond_client_ongoing: FixedCouponBondClient, ) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): + with pytest.raises(Exception, match=err.INVALID_HOLDING_ADDRESS): fixed_coupon_bond_client_ongoing.asset_transfer( sender_holding_address=account_a.holding_address, receiver_holding_address=oscar.address, @@ -370,7 +368,7 @@ def test_fail_over_transfer( account_b: DAsaAccount, fixed_coupon_bond_client_ongoing: FixedCouponBondClient, ) -> None: - with pytest.raises(LogicError, match=err.OVER_TRANSFER): + with pytest.raises(Exception, match=err.OVER_TRANSFER): fixed_coupon_bond_client_ongoing.asset_transfer( sender_holding_address=account_a.holding_address, receiver_holding_address=account_b.holding_address, @@ -423,7 +421,7 @@ def test_fail_not_fungible( ), ) - with pytest.raises(LogicError, match=err.NON_FUNGIBLE_UNITS): + with pytest.raises(Exception, match=err.NON_FUNGIBLE_UNITS): fixed_coupon_bond_client_primary.asset_transfer( sender_holding_address=account_a.holding_address, receiver_holding_address=account_b.holding_address, diff --git a/tests/fixed_coupon_bond/test_get_payment_amount.py b/tests/fixed_coupon_bond/test_get_payment_amount.py index 27c3ded..bf7dddd 100644 --- a/tests/fixed_coupon_bond/test_get_payment_amount.py +++ b/tests/fixed_coupon_bond/test_get_payment_amount.py @@ -1,7 +1,7 @@ from typing import Callable, Final import pytest -from algokit_utils import LogicError, OnCompleteCallParameters, SigningAccount +from algokit_utils import OnCompleteCallParameters, SigningAccount from smart_contracts import constants as sc_cst from smart_contracts import errors as err @@ -131,7 +131,7 @@ def test_pass_not_configured( def test_fail_invalid_holding_address( oscar: SigningAccount, fixed_coupon_bond_client_at_maturity: FixedCouponBondClient ) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): + with pytest.raises(Exception, match=err.INVALID_HOLDING_ADDRESS): fixed_coupon_bond_client_at_maturity.get_payment_amount( holding_address=oscar.address, transaction_parameters=OnCompleteCallParameters( diff --git a/tests/fixed_coupon_bond/test_pay_coupon.py b/tests/fixed_coupon_bond/test_pay_coupon.py index 3afb3b2..8ea2f33 100644 --- a/tests/fixed_coupon_bond/test_pay_coupon.py +++ b/tests/fixed_coupon_bond/test_pay_coupon.py @@ -3,8 +3,6 @@ import pytest from algokit_utils import ( AlgorandClient, - LogicError, - OnCompleteCallParameters, SigningAccount, ) @@ -279,7 +277,7 @@ def test_fail_suspended() -> None: def test_fail_invalid_holding_address( oscar: SigningAccount, fixed_coupon_bond_client_at_maturity: FixedCouponBondClient ) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): + with pytest.raises(Exception, match=err.INVALID_HOLDING_ADDRESS): fixed_coupon_bond_client_at_maturity.pay_coupon( holding_address=oscar.address, payment_info=b"", @@ -308,7 +306,7 @@ def test_fail_no_units( ) -> None: account = account_factory(fixed_coupon_bond_client_primary) - with pytest.raises(LogicError, match=err.NO_UNITS): + with pytest.raises(Exception, match=err.NO_UNITS): fixed_coupon_bond_client_primary.pay_coupon( holding_address=account.holding_address, payment_info=b"", @@ -341,7 +339,7 @@ def test_fail_no_due_coupon( ).return_value for coupon in range(1, fixed_coupon_bond_cfg.total_coupons + 1): - with pytest.raises(LogicError, match=err.NO_DUE_COUPON): + with pytest.raises(Exception, match=err.NO_DUE_COUPON): fixed_coupon_bond_client_ongoing.pay_coupon( holding_address=account_a.holding_address, payment_info=b"", @@ -418,7 +416,7 @@ def test_fail_pending_coupon_payment( ), ) - with pytest.raises(LogicError, match=err.PENDING_COUPON_PAYMENT): + with pytest.raises(Exception, match=err.PENDING_COUPON_PAYMENT): fixed_coupon_bond_client_at_maturity.pay_coupon( holding_address=first_payee.holding_address, payment_info=b"", diff --git a/tests/fixed_coupon_bond/test_pay_principal.py b/tests/fixed_coupon_bond/test_pay_principal.py index 31cc788..d2ac4c8 100644 --- a/tests/fixed_coupon_bond/test_pay_principal.py +++ b/tests/fixed_coupon_bond/test_pay_principal.py @@ -3,8 +3,6 @@ import pytest from algokit_utils import ( AlgorandClient, - LogicError, - OnCompleteCallParameters, SigningAccount, ) @@ -116,7 +114,7 @@ def test_fail_suspended() -> None: def test_fail_invalid_holding_address( oscar: SigningAccount, fixed_coupon_bond_client_at_maturity: FixedCouponBondClient ) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): + with pytest.raises(Exception, match=err.INVALID_HOLDING_ADDRESS): fixed_coupon_bond_client_at_maturity.pay_principal( holding_address=oscar.address, payment_info=b"", @@ -137,7 +135,7 @@ def test_fail_no_units( ) -> None: account = account_factory(fixed_coupon_bond_client_primary) - with pytest.raises(LogicError, match=err.NO_UNITS): + with pytest.raises(Exception, match=err.NO_UNITS): fixed_coupon_bond_client_primary.pay_principal( holding_address=account.holding_address, payment_info=b"", @@ -152,7 +150,7 @@ def test_fail_not_mature( fixed_coupon_bond_client_primary: FixedCouponBondClient, ) -> None: account_all_coupons = account_with_coupons_factory() - with pytest.raises(LogicError, match=err.NOT_MATURE): + with pytest.raises(Exception, match=err.NOT_MATURE): fixed_coupon_bond_client_primary.pay_principal( holding_address=account_all_coupons.holding_address, payment_info=b"", @@ -178,7 +176,7 @@ def test_fail_pending_coupon_payment( ) state = fixed_coupon_bond_client_primary.get_global_state() time_warp(state.maturity_date) - with pytest.raises(LogicError, match=err.PENDING_COUPON_PAYMENT): + with pytest.raises(Exception, match=err.PENDING_COUPON_PAYMENT): fixed_coupon_bond_client_primary.pay_principal( holding_address=account.holding_address, payment_info=b"", diff --git a/tests/perpetual_bond/test_asset_config.py b/tests/perpetual_bond/test_asset_config.py index c121a20..65960f4 100644 --- a/tests/perpetual_bond/test_asset_config.py +++ b/tests/perpetual_bond/test_asset_config.py @@ -1,7 +1,7 @@ from copy import deepcopy import pytest -from algokit_utils import LogicError, OnCompleteCallParameters +from algokit_utils import OnCompleteCallParameters from smart_contracts import constants as sc_cst from smart_contracts import errors as err @@ -98,7 +98,7 @@ def test_fail_invalid_time_events_length( ) -> None: wrong_d_asa_cfg = deepcopy(perpetual_bond_cfg) wrong_d_asa_cfg.time_events = [*perpetual_bond_cfg.time_events, 0] - with pytest.raises(LogicError, match=err.INVALID_TIME_EVENTS_LENGTH): + with pytest.raises(Exception, match=err.INVALID_TIME_EVENTS_LENGTH): perpetual_bond_client_empty.asset_config( **wrong_d_asa_cfg.dictify(), transaction_parameters=OnCompleteCallParameters( @@ -118,7 +118,7 @@ def test_fail_invalid_time_periods( ) -> None: wrong_d_asa_cfg = deepcopy(perpetual_bond_cfg) wrong_d_asa_cfg.time_periods = [*perpetual_bond_cfg.time_periods, (1, 1)] - with pytest.raises(LogicError, match=err.INVALID_TIME_PERIODS): + with pytest.raises(Exception, match=err.INVALID_TIME_PERIODS): perpetual_bond_client_empty.asset_config( **wrong_d_asa_cfg.dictify(), transaction_parameters=OnCompleteCallParameters( @@ -138,7 +138,7 @@ def test_fail_invalid_time_period_durations( ) -> None: wrong_d_asa_cfg = deepcopy(perpetual_bond_cfg) wrong_d_asa_cfg.time_periods[0] = (0, 1) - with pytest.raises(LogicError, match=err.INVALID_TIME_PERIOD_DURATION): + with pytest.raises(Exception, match=err.INVALID_TIME_PERIOD_DURATION): perpetual_bond_client_empty.asset_config( **wrong_d_asa_cfg.dictify(), transaction_parameters=OnCompleteCallParameters( @@ -158,7 +158,7 @@ def test_fail_invalid_time_period_repetitions( ) -> None: wrong_d_asa_cfg = deepcopy(perpetual_bond_cfg) wrong_d_asa_cfg.time_periods[0] = (1, 1) - with pytest.raises(LogicError, match=err.INVALID_TIME_PERIOD_REPETITIONS): + with pytest.raises(Exception, match=err.INVALID_TIME_PERIOD_REPETITIONS): perpetual_bond_client_empty.asset_config( **wrong_d_asa_cfg.dictify(), transaction_parameters=OnCompleteCallParameters( diff --git a/tests/perpetual_bond/test_get_payment_amount.py b/tests/perpetual_bond/test_get_payment_amount.py index ef2a555..65b1862 100644 --- a/tests/perpetual_bond/test_get_payment_amount.py +++ b/tests/perpetual_bond/test_get_payment_amount.py @@ -1,7 +1,7 @@ from typing import Callable, Final import pytest -from algokit_utils import LogicError, OnCompleteCallParameters, SigningAccount +from algokit_utils import OnCompleteCallParameters, SigningAccount from smart_contracts import constants as sc_cst from smart_contracts import errors as err @@ -74,7 +74,7 @@ def test_pass_not_configured( def test_fail_invalid_holding_address( oscar: SigningAccount, perpetual_bond_client_ongoing: PerpetualBondClient ) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): + with pytest.raises(Exception, match=err.INVALID_HOLDING_ADDRESS): perpetual_bond_client_ongoing.get_payment_amount( holding_address=oscar.address, transaction_parameters=OnCompleteCallParameters( diff --git a/tests/perpetual_bond/test_pay_coupon.py b/tests/perpetual_bond/test_pay_coupon.py index 4b85f73..80e595b 100644 --- a/tests/perpetual_bond/test_pay_coupon.py +++ b/tests/perpetual_bond/test_pay_coupon.py @@ -3,8 +3,6 @@ import pytest from algokit_utils import ( AlgorandClient, - LogicError, - OnCompleteCallParameters, SigningAccount, ) @@ -213,7 +211,7 @@ def test_fail_suspended() -> None: def test_fail_invalid_holding_address( oscar: SigningAccount, perpetual_bond_client_ongoing: PerpetualBondClient ) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): + with pytest.raises(Exception, match=err.INVALID_HOLDING_ADDRESS): perpetual_bond_client_ongoing.pay_coupon( holding_address=oscar.address, payment_info=b"", @@ -234,7 +232,7 @@ def test_fail_no_units( ) -> None: account = account_factory(perpetual_bond_client_primary) - with pytest.raises(LogicError, match=err.NO_UNITS): + with pytest.raises(Exception, match=err.NO_UNITS): perpetual_bond_client_primary.pay_coupon( holding_address=account.holding_address, payment_info=b"", @@ -253,7 +251,7 @@ def test_fail_no_due_coupon( state = perpetual_bond_client_ongoing.get_global_state() for coupon in range(1, DUE_COUPONS + 1): - with pytest.raises(LogicError, match=err.NO_DUE_COUPON): + with pytest.raises(Exception, match=err.NO_DUE_COUPON): perpetual_bond_client_ongoing.pay_coupon( holding_address=account_a.holding_address, payment_info=b"", @@ -308,7 +306,7 @@ def test_fail_pending_coupon_payment( coupon_due_date = issuance_date + coupon_period * (coupon + 1) time_warp(coupon_due_date) - with pytest.raises(LogicError, match=err.PENDING_COUPON_PAYMENT): + with pytest.raises(Exception, match=err.PENDING_COUPON_PAYMENT): perpetual_bond_client_ongoing.pay_coupon( holding_address=first_payee.holding_address, payment_info=b"", diff --git a/tests/perpetual_bond/test_update_interest_rate.py b/tests/perpetual_bond/test_update_interest_rate.py index 22caeb6..03d3963 100644 --- a/tests/perpetual_bond/test_update_interest_rate.py +++ b/tests/perpetual_bond/test_update_interest_rate.py @@ -3,8 +3,6 @@ import pytest from algokit_utils import ( AlgorandClient, - LogicError, - OnCompleteCallParameters, SigningAccount, ) from algosdk.encoding import decode_address @@ -91,7 +89,7 @@ def test_fail_unauthorized( perpetual_bond_client_primary: PerpetualBondClient, ) -> None: interest_rate = perpetual_bond_client_primary.get_global_state().interest_rate - with pytest.raises(LogicError, match=err.UNAUTHORIZED): + with pytest.raises(Exception, match=err.UNAUTHORIZED): perpetual_bond_client_primary.update_interest_rate( interest_rate=interest_rate + INTEREST_RATE_INCREASE, transaction_parameters=OnCompleteCallParameters( @@ -147,7 +145,7 @@ def test_fail_pending_coupon_payment( ), ) - with pytest.raises(LogicError, match=err.PENDING_COUPON_PAYMENT): + with pytest.raises(Exception, match=err.PENDING_COUPON_PAYMENT): perpetual_bond_client_ongoing.update_interest_rate( interest_rate=interest_rate + INTEREST_RATE_INCREASE, transaction_parameters=OnCompleteCallParameters( diff --git a/tests/zero_coupon_bond/test_asset_config.py b/tests/zero_coupon_bond/test_asset_config.py index 0497a49..cd21bc7 100644 --- a/tests/zero_coupon_bond/test_asset_config.py +++ b/tests/zero_coupon_bond/test_asset_config.py @@ -1,7 +1,7 @@ from copy import deepcopy import pytest -from algokit_utils import LogicError, OnCompleteCallParameters +from algokit_utils import OnCompleteCallParameters from smart_contracts import constants as sc_cst from smart_contracts import errors as err @@ -105,7 +105,7 @@ def test_fail_invalid_time_events_length( ) -> None: wrong_d_asa_cfg = deepcopy(zero_coupon_bond_cfg) wrong_d_asa_cfg.time_events = [*zero_coupon_bond_cfg.time_events, 0] - with pytest.raises(LogicError, match=err.INVALID_TIME_EVENTS_LENGTH): + with pytest.raises(Exception, match=err.INVALID_TIME_EVENTS_LENGTH): zero_coupon_bond_client_empty.asset_config( **wrong_d_asa_cfg.dictify(), transaction_parameters=OnCompleteCallParameters( @@ -124,7 +124,7 @@ def test_fail_invalid_time( ) -> None: wrong_d_asa_cfg = deepcopy(zero_coupon_bond_cfg) wrong_d_asa_cfg.time_events[0] = 0 - with pytest.raises(LogicError, match=err.INVALID_TIME): + with pytest.raises(Exception, match=err.INVALID_TIME): zero_coupon_bond_client_empty.asset_config( **wrong_d_asa_cfg.dictify(), transaction_parameters=OnCompleteCallParameters( @@ -143,7 +143,7 @@ def test_fail_invalid_sorting( ) -> None: wrong_d_asa_cfg = deepcopy(zero_coupon_bond_cfg) wrong_d_asa_cfg.time_events[-1] = zero_coupon_bond_cfg.time_events[-2] - with pytest.raises(LogicError, match=err.INVALID_SORTING): + with pytest.raises(Exception, match=err.INVALID_SORTING): zero_coupon_bond_client_empty.asset_config( **wrong_d_asa_cfg.dictify(), transaction_parameters=OnCompleteCallParameters( @@ -157,7 +157,7 @@ def test_fail_invalid_sorting( wrong_d_asa_cfg = deepcopy(zero_coupon_bond_cfg) wrong_d_asa_cfg.time_events[0] = zero_coupon_bond_cfg.time_events[-1] - with pytest.raises(LogicError, match=err.INVALID_SORTING): + with pytest.raises(Exception, match=err.INVALID_SORTING): zero_coupon_bond_client_empty.asset_config( **wrong_d_asa_cfg.dictify(), transaction_parameters=OnCompleteCallParameters( diff --git a/tests/zero_coupon_bond/test_asset_transfer.py b/tests/zero_coupon_bond/test_asset_transfer.py index cb791d6..2186b23 100644 --- a/tests/zero_coupon_bond/test_asset_transfer.py +++ b/tests/zero_coupon_bond/test_asset_transfer.py @@ -1,7 +1,7 @@ from typing import Callable import pytest -from algokit_utils import LogicError, OnCompleteCallParameters, SigningAccount +from algokit_utils import OnCompleteCallParameters, SigningAccount from smart_contracts import constants as sc_cst from smart_contracts import errors as err @@ -186,7 +186,7 @@ def test_fail_secondary_market_not_open_yet( account_a: DAsaAccount, account_b: DAsaAccount, ) -> None: - with pytest.raises(LogicError, match=err.SECONDARY_MARKET_CLOSED): + with pytest.raises(Exception, match=err.SECONDARY_MARKET_CLOSED): zero_coupon_bond_client_primary.asset_transfer( sender_holding_address=account_a.holding_address, receiver_holding_address=account_b.holding_address, @@ -215,7 +215,7 @@ def test_fail_unauthorized( account_b: DAsaAccount, zero_coupon_bond_client_ongoing: ZeroCouponBondClient, ) -> None: - with pytest.raises(LogicError, match=err.UNAUTHORIZED): + with pytest.raises(Exception, match=err.UNAUTHORIZED): zero_coupon_bond_client_ongoing.asset_transfer( sender_holding_address=account_a.holding_address, receiver_holding_address=account_b.holding_address, @@ -240,7 +240,7 @@ def test_fail_suspended( account_b: DAsaAccount, zero_coupon_bond_client_suspended: ZeroCouponBondClient, ) -> None: - with pytest.raises(LogicError, match=err.SUSPENDED): + with pytest.raises(Exception, match=err.SUSPENDED): zero_coupon_bond_client_suspended.asset_transfer( sender_holding_address=account_a.holding_address, receiver_holding_address=account_b.holding_address, @@ -268,7 +268,7 @@ def test_fail_invalid_sender( account_a: DAsaAccount, zero_coupon_bond_client_ongoing: ZeroCouponBondClient, ) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): + with pytest.raises(Exception, match=err.INVALID_HOLDING_ADDRESS): zero_coupon_bond_client_ongoing.asset_transfer( sender_holding_address=oscar.address, receiver_holding_address=account_a.holding_address, @@ -296,7 +296,7 @@ def test_fail_invalid_receiver( account_a: DAsaAccount, zero_coupon_bond_client_ongoing: ZeroCouponBondClient, ) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): + with pytest.raises(Exception, match=err.INVALID_HOLDING_ADDRESS): zero_coupon_bond_client_ongoing.asset_transfer( sender_holding_address=account_a.holding_address, receiver_holding_address=oscar.address, @@ -336,7 +336,7 @@ def test_fail_over_transfer( account_b: DAsaAccount, zero_coupon_bond_client_ongoing: ZeroCouponBondClient, ) -> None: - with pytest.raises(LogicError, match=err.OVER_TRANSFER): + with pytest.raises(Exception, match=err.OVER_TRANSFER): zero_coupon_bond_client_ongoing.asset_transfer( sender_holding_address=account_a.holding_address, receiver_holding_address=account_b.holding_address, diff --git a/tests/zero_coupon_bond/test_get_payment_amount.py b/tests/zero_coupon_bond/test_get_payment_amount.py index a5be1f0..295652a 100644 --- a/tests/zero_coupon_bond/test_get_payment_amount.py +++ b/tests/zero_coupon_bond/test_get_payment_amount.py @@ -1,7 +1,7 @@ from typing import Callable, Final import pytest -from algokit_utils import LogicError, OnCompleteCallParameters, SigningAccount +from algokit_utils import OnCompleteCallParameters, SigningAccount from smart_contracts import constants as sc_cst from smart_contracts import errors as err @@ -62,7 +62,7 @@ def test_pass_not_configured( def test_fail_invalid_holding_address( oscar: SigningAccount, zero_coupon_bond_client_primary: FixedCouponBondClient ) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): + with pytest.raises(Exception, match=err.INVALID_HOLDING_ADDRESS): zero_coupon_bond_client_primary.get_payment_amount( holding_address=oscar.address, transaction_parameters=OnCompleteCallParameters( diff --git a/tests/zero_coupon_bond/test_pay_principal.py b/tests/zero_coupon_bond/test_pay_principal.py index be61aaa..f37c110 100644 --- a/tests/zero_coupon_bond/test_pay_principal.py +++ b/tests/zero_coupon_bond/test_pay_principal.py @@ -3,8 +3,6 @@ import pytest from algokit_utils import ( AlgorandClient, - LogicError, - OnCompleteCallParameters, SigningAccount, ) @@ -104,7 +102,7 @@ def test_fail_suspended() -> None: def test_fail_invalid_holding_address( oscar: SigningAccount, zero_coupon_bond_client_at_maturity: ZeroCouponBondClient ) -> None: - with pytest.raises(LogicError, match=err.INVALID_HOLDING_ADDRESS): + with pytest.raises(Exception, match=err.INVALID_HOLDING_ADDRESS): zero_coupon_bond_client_at_maturity.pay_principal( holding_address=oscar.address, payment_info=b"", @@ -125,7 +123,7 @@ def test_fail_no_units( ) -> None: account = account_factory(zero_coupon_bond_client_primary) - with pytest.raises(LogicError, match=err.NO_UNITS): + with pytest.raises(Exception, match=err.NO_UNITS): zero_coupon_bond_client_primary.pay_principal( holding_address=account.holding_address, payment_info=b"", @@ -139,7 +137,7 @@ def test_fail_not_mature( zero_coupon_bond_client_primary: ZeroCouponBondClient, account_a: DAsaAccount, ) -> None: - with pytest.raises(LogicError, match=err.NOT_MATURE): + with pytest.raises(Exception, match=err.NOT_MATURE): zero_coupon_bond_client_primary.pay_principal( holding_address=account_a.holding_address, payment_info=b"",